@ -0,0 +1 @@
|
||||
islandscholar theme, generated from starterkit_theme. Additional information on generating themes can be found in the [Starterkit documentation](https://www.drupal.org/docs/core-modules-and-themes/core-themes/starterkit-theme). |
@ -0,0 +1,44 @@
|
||||
SITE: |
||||
Local: |
||||
Url: 'https://d10_dev.lndo.site/' |
||||
Remote: |
||||
Url: 'https://library.upei.ca/' |
||||
Path: user |
||||
PORT: 8000 |
||||
BSREWRITE: |
||||
Css: |
||||
|
||||
Match: '/themes/custom/roblib_2023/css/global-style.css' |
||||
Replace: '/css/global-style.css' |
||||
Js: |
||||
Match: "/themes/custom/roblib_2023/js/custom_js.js" |
||||
Replace: "/js/custom_js.js" |
||||
PATHS: |
||||
Watch: |
||||
#changes in these compiled files trigged reload |
||||
- ./css/*.css |
||||
- ./js/*.js |
||||
Scss: |
||||
Dir: ./css/sass |
||||
Libraries: |
||||
#- libraries/guff |
||||
#- bower_components/foundation-sites/scss |
||||
#- bower_components/motion-ui/src |
||||
- node_modules/modularscale-sass/stylesheets |
||||
#- node_modules/vanilla-framework/scss |
||||
- node_modules/foundation-sites/scss |
||||
- node_modules/foundation-sites/scss/util |
||||
- node_modules/motion-ui/src |
||||
- icons/fontawesome/scss |
||||
- node_modules |
||||
Css: |
||||
Dir: css |
||||
#FileName: app.css |
||||
Js: |
||||
Src: ./js/src/*.js |
||||
Dest: js |
||||
FileName: 'ia-islandimagined.behaviors.js' |
||||
Img: |
||||
Src: img/src |
||||
Dest: img |
||||
|
@ -0,0 +1,43 @@
|
||||
/** |
||||
* @file |
||||
* Styles for link buttons and action links. |
||||
*/ |
||||
|
||||
.action-links { |
||||
margin: 1em 0; |
||||
padding: 0; |
||||
list-style: none; |
||||
} |
||||
[dir="rtl"] .action-links { |
||||
/* This is required to win over specificity of [dir="rtl"] ul */ |
||||
margin-right: 0; |
||||
} |
||||
.action-links li { |
||||
display: inline-block; |
||||
margin: 0 0.3em; |
||||
} |
||||
.action-links li:first-child { |
||||
margin-left: 0; /* LTR */ |
||||
} |
||||
[dir="rtl"] .action-links li:first-child { |
||||
margin-right: 0; |
||||
margin-left: 0.3em; |
||||
} |
||||
.button-action { |
||||
display: inline-block; |
||||
padding: 0.2em 0.5em 0.3em; |
||||
text-decoration: none; |
||||
line-height: 160%; |
||||
} |
||||
.button-action:before { |
||||
margin-left: -0.1em; /* LTR */ |
||||
padding-right: 0.2em; /* LTR */ |
||||
content: "+"; |
||||
font-weight: 900; |
||||
} |
||||
[dir="rtl"] .button-action:before { |
||||
margin-right: -0.1em; |
||||
margin-left: 0; |
||||
padding-right: 0; |
||||
padding-left: 0.2em; |
||||
} |
@ -0,0 +1,29 @@
|
||||
/** |
||||
* @file |
||||
* Styles for breadcrumbs. |
||||
*/ |
||||
|
||||
.breadcrumb { |
||||
padding-bottom: 0.5em; |
||||
} |
||||
.breadcrumb ol { |
||||
margin: 0; |
||||
padding: 0; |
||||
} |
||||
[dir="rtl"] .breadcrumb ol { |
||||
/* This is required to win over specificity of [dir="rtl"] ol */ |
||||
margin-right: 0; |
||||
} |
||||
.breadcrumb li { |
||||
display: inline; |
||||
margin: 0; |
||||
padding: 0; |
||||
list-style-type: none; |
||||
} |
||||
/* IE8 does not support :not() and :last-child. */ |
||||
.breadcrumb li:before { |
||||
content: " \BB "; |
||||
} |
||||
.breadcrumb li:first-child:before { |
||||
content: none; |
||||
} |
@ -0,0 +1,15 @@
|
||||
/** |
||||
* @file |
||||
* Visual styles for buttons. |
||||
*/ |
||||
|
||||
.button, |
||||
.image-button { |
||||
margin-right: 1em; |
||||
margin-left: 1em; |
||||
} |
||||
.button:first-child, |
||||
.image-button:first-child { |
||||
margin-right: 0; |
||||
margin-left: 0; |
||||
} |
@ -0,0 +1,22 @@
|
||||
/** |
||||
* @file |
||||
* Inline items. |
||||
*/ |
||||
|
||||
.container-inline label:after, |
||||
.container-inline .label:after { |
||||
content: ":"; |
||||
} |
||||
.form-type-radios .container-inline label:after, |
||||
.form-type-checkboxes .container-inline label:after { |
||||
content: ""; |
||||
} |
||||
.form-type-radios .container-inline .form-type-radio, |
||||
.form-type-checkboxes .container-inline .form-type-checkbox { |
||||
margin: 0 1em; |
||||
} |
||||
.container-inline .form-actions, |
||||
.container-inline.form-actions { |
||||
margin-top: 0; |
||||
margin-bottom: 0; |
||||
} |
@ -0,0 +1,23 @@
|
||||
/** |
||||
* @file |
||||
* Collapsible details. |
||||
* |
||||
* @see collapse.js |
||||
* @see http://nicolasgallagher.com/css-background-image-hacks/ |
||||
*/ |
||||
|
||||
details { |
||||
margin-top: 1em; |
||||
margin-bottom: 1em; |
||||
border: 1px solid #ccc; |
||||
} |
||||
details > .details-wrapper { |
||||
padding: 0.5em 1.5em; |
||||
} |
||||
/* @todo Regression: The summary of uncollapsible details are no longer |
||||
vertically aligned with the .details-wrapper in browsers without native |
||||
details support. */ |
||||
summary { |
||||
padding: 0.2em 0.5em; |
||||
cursor: pointer; |
||||
} |
@ -0,0 +1,72 @@
|
||||
/** |
||||
* @file |
||||
* Presentational styles for Drupal dialogs. |
||||
*/ |
||||
|
||||
.ui-dialog { |
||||
position: absolute; |
||||
z-index: 1260; |
||||
overflow: visible; |
||||
padding: 0; |
||||
color: #000; |
||||
border: solid 1px #ccc; |
||||
background: #fff; |
||||
} |
||||
|
||||
@media all and (max-width: 48em) { /* 768px */ |
||||
.ui-dialog { |
||||
width: 92% !important; |
||||
} |
||||
} |
||||
.ui-dialog .ui-dialog-titlebar { |
||||
border-width: 0 0 1px 0; |
||||
border-style: solid; |
||||
border-color: #ccc; |
||||
border-radius: 0; |
||||
background: #f3f4ee; |
||||
font-weight: bold; |
||||
} |
||||
.ui-dialog .ui-dialog-titlebar-close { |
||||
border: 0; |
||||
background: none; |
||||
} |
||||
.ui-dialog .ui-dialog-buttonpane { |
||||
margin-top: 0; |
||||
padding: 0.3em 1em; |
||||
border-width: 1px 0 0 0; |
||||
border-color: #ccc; |
||||
background: #f3f4ee; |
||||
} |
||||
.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { |
||||
margin: 0; |
||||
padding: 0; |
||||
} |
||||
.ui-dialog .ui-dialog-buttonpane .ui-button-text-only .ui-button-text { |
||||
padding: 0; |
||||
} |
||||
|
||||
/* Form action buttons are moved in dialogs. Remove empty space. */ |
||||
.ui-dialog .ui-dialog-content .form-actions { |
||||
margin: 0; |
||||
padding: 0; |
||||
} |
||||
.ui-dialog .ajax-progress-throbber { |
||||
position: fixed; |
||||
z-index: 1000; |
||||
top: 48.5%; |
||||
/* Can't do center:50% middle: 50%, so approximate it for a typical window size. */ |
||||
left: 49%; |
||||
width: 24px; |
||||
height: 24px; |
||||
padding: 4px; |
||||
opacity: 0.9; |
||||
border-radius: 7px; |
||||
background-color: #232323; |
||||
background-image: url(../../images/icons/loading-small.gif); |
||||
background-repeat: no-repeat; |
||||
background-position: center center; |
||||
} |
||||
.ui-dialog .ajax-progress-throbber .throbber, |
||||
.ui-dialog .ajax-progress-throbber .message { |
||||
display: none; |
||||
} |
@ -0,0 +1,33 @@
|
||||
/** |
||||
* @file |
||||
* General styles for dropbuttons. |
||||
*/ |
||||
|
||||
.js .dropbutton-widget { |
||||
border: 1px solid #ccc; |
||||
background-color: white; |
||||
} |
||||
.js .dropbutton-widget:hover { |
||||
border-color: #b8b8b8; |
||||
} |
||||
.dropbutton .dropbutton-action > * { |
||||
padding: 0.1em 0.5em; |
||||
white-space: nowrap; |
||||
} |
||||
.dropbutton .secondary-action { |
||||
border-top: 1px solid #e8e8e8; |
||||
} |
||||
.dropbutton-multiple .dropbutton { |
||||
border-right: 1px solid #e8e8e8; /* LTR */ |
||||
} |
||||
[dir="rtl"] .dropbutton-multiple .dropbutton { |
||||
border-right: 0 none; |
||||
border-left: 1px solid #e8e8e8; |
||||
} |
||||
.dropbutton-multiple .dropbutton .dropbutton-action > * { |
||||
margin-right: 0.25em; /* LTR */ |
||||
} |
||||
[dir="rtl"] .dropbutton-multiple .dropbutton .dropbutton-action > * { |
||||
margin-right: 0; |
||||
margin-left: 0.25em; |
||||
} |
@ -0,0 +1,46 @@
|
||||
/** |
||||
* @file |
||||
* Visual styles for exposed filters. |
||||
*/ |
||||
|
||||
.exposed-filters .filters { |
||||
float: left; /* LTR */ |
||||
margin-right: 1em; /* LTR */ |
||||
} |
||||
[dir="rtl"] .exposed-filters .filters { |
||||
float: right; |
||||
margin-right: 0; |
||||
margin-left: 1em; |
||||
} |
||||
.exposed-filters .form-item { |
||||
margin: 0 0 0.1em 0; |
||||
padding: 0; |
||||
} |
||||
.exposed-filters .form-item label { |
||||
float: left; /* LTR */ |
||||
width: 10em; |
||||
font-weight: normal; |
||||
} |
||||
[dir="rtl"] .exposed-filters .form-item label { |
||||
float: right; |
||||
} |
||||
.exposed-filters .form-select { |
||||
width: 14em; |
||||
} |
||||
/* Current filters */ |
||||
.exposed-filters .current-filters { |
||||
margin-bottom: 1em; |
||||
} |
||||
.exposed-filters .current-filters .placeholder { |
||||
font-weight: bold; |
||||
font-style: normal; |
||||
} |
||||
.exposed-filters .additional-filters { |
||||
float: left; /* LTR */ |
||||
margin-right: 1em; /* LTR */ |
||||
} |
||||
[dir="rtl"] .exposed-filters .additional-filters { |
||||
float: right; |
||||
margin-right: 0; |
||||
margin-left: 1em; |
||||
} |
@ -0,0 +1,25 @@
|
||||
/** |
||||
* @file |
||||
* Visual styles for fields. |
||||
*/ |
||||
|
||||
.field__label { |
||||
font-weight: bold; |
||||
} |
||||
.field--label-inline .field__label, |
||||
.field--label-inline .field__items { |
||||
float: left; /* LTR */ |
||||
} |
||||
.field--label-inline .field__label, |
||||
.field--label-inline > .field__item, |
||||
.field--label-inline .field__items { |
||||
padding-right: 0.5em; |
||||
} |
||||
[dir="rtl"] .field--label-inline .field__label, |
||||
[dir="rtl"] .field--label-inline .field__items { |
||||
padding-right: 0; |
||||
padding-left: 0.5em; |
||||
} |
||||
.field--label-inline .field__label::after { |
||||
content: ":"; |
||||
} |
@ -0,0 +1,62 @@
|
||||
/** |
||||
* @file |
||||
* Default style for file module. |
||||
*/ |
||||
|
||||
/* File icons. */ |
||||
|
||||
.file { |
||||
display: inline-block; |
||||
min-height: 16px; |
||||
padding-left: 20px; /* LTR */ |
||||
background-repeat: no-repeat; |
||||
background-position: left center; /* LTR */ |
||||
} |
||||
[dir="rtl"] .file { |
||||
padding-right: 20px; |
||||
padding-left: inherit; |
||||
background-position: right center; |
||||
} |
||||
.file--general, |
||||
.file--application-octet-stream { |
||||
background-image: url(../../images/icons/application-octet-stream.png); |
||||
} |
||||
.file--package-x-generic { |
||||
background-image: url(../../images/icons/package-x-generic.png); |
||||
} |
||||
.file--x-office-spreadsheet { |
||||
background-image: url(../../images/icons/x-office-spreadsheet.png); |
||||
} |
||||
.file--x-office-document { |
||||
background-image: url(../../images/icons/x-office-document.png); |
||||
} |
||||
.file--x-office-presentation { |
||||
background-image: url(../../images/icons/x-office-presentation.png); |
||||
} |
||||
.file--text-x-script { |
||||
background-image: url(../../images/icons/text-x-script.png); |
||||
} |
||||
.file--text-html { |
||||
background-image: url(../../images/icons/text-html.png); |
||||
} |
||||
.file--text-plain { |
||||
background-image: url(../../images/icons/text-plain.png); |
||||
} |
||||
.file--application-pdf { |
||||
background-image: url(../../images/icons/application-pdf.png); |
||||
} |
||||
.file--application-x-executable { |
||||
background-image: url(../../images/icons/application-x-executable.png); |
||||
} |
||||
.file--audio { |
||||
background-image: url(../../images/icons/audio-x-generic.png); |
||||
} |
||||
.file--video { |
||||
background-image: url(../../images/icons/video-x-generic.png); |
||||
} |
||||
.file--text { |
||||
background-image: url(../../images/icons/text-x-generic.png); |
||||
} |
||||
.file--image { |
||||
background-image: url(../../images/icons/image-x-generic.png); |
||||
} |
@ -0,0 +1,104 @@
|
||||
/** |
||||
* @file |
||||
* Visual styles for form components. |
||||
*/ |
||||
|
||||
form .field-multiple-table { |
||||
margin: 0; |
||||
} |
||||
form .field-multiple-table .field-multiple-drag { |
||||
width: 30px; |
||||
padding-right: 0; /* LTR */ |
||||
} |
||||
[dir="rtl"] form .field-multiple-table .field-multiple-drag { |
||||
padding-left: 0; |
||||
} |
||||
form .field-multiple-table .field-multiple-drag .tabledrag-handle { |
||||
padding-right: 0.5em; /* LTR */ |
||||
} |
||||
[dir="rtl"] form .field-multiple-table .field-multiple-drag .tabledrag-handle { |
||||
padding-right: 0; |
||||
padding-left: 0.5em; |
||||
} |
||||
form .field-add-more-submit { |
||||
margin: 0.5em 0 0; |
||||
} |
||||
|
||||
/** |
||||
* Markup generated by Form API. |
||||
*/ |
||||
.form-item, |
||||
.form-actions { |
||||
margin-top: 1em; |
||||
margin-bottom: 1em; |
||||
} |
||||
tr.odd .form-item, |
||||
tr.even .form-item { |
||||
margin-top: 0; |
||||
margin-bottom: 0; |
||||
} |
||||
.form-composite > .fieldset-wrapper > .description, |
||||
.form-item .description { |
||||
font-size: 0.85em; |
||||
} |
||||
label.option { |
||||
display: inline; |
||||
font-weight: normal; |
||||
} |
||||
.form-composite > legend, |
||||
.label { |
||||
display: inline; |
||||
margin: 0; |
||||
padding: 0; |
||||
font-size: inherit; |
||||
font-weight: bold; |
||||
} |
||||
.form-checkboxes .form-item, |
||||
.form-radios .form-item { |
||||
margin-top: 0.4em; |
||||
margin-bottom: 0.4em; |
||||
} |
||||
.form-type-radio .description, |
||||
.form-type-checkbox .description { |
||||
margin-left: 2.4em; /* LTR */ |
||||
} |
||||
[dir="rtl"] .form-type-radio .description, |
||||
[dir="rtl"] .form-type-checkbox .description { |
||||
margin-right: 2.4em; |
||||
margin-left: 0; |
||||
} |
||||
.marker { |
||||
color: #e00; |
||||
} |
||||
.form-required:after { |
||||
display: inline-block; |
||||
width: 6px; |
||||
height: 6px; |
||||
margin: 0 0.3em; |
||||
content: ""; |
||||
vertical-align: super; |
||||
/* Use a background image to prevent screen readers from announcing the text. */ |
||||
background-image: url(../../images/icons/required.svg); |
||||
background-repeat: no-repeat; |
||||
background-size: 6px 6px; |
||||
} |
||||
abbr.tabledrag-changed, |
||||
abbr.ajax-changed { |
||||
border-bottom: none; |
||||
} |
||||
.form-item input.error, |
||||
.form-item textarea.error, |
||||
.form-item select.error { |
||||
border: 2px solid red; |
||||
} |
||||
|
||||
/* Inline error messages. */ |
||||
.form-item--error-message:before { |
||||
display: inline-block; |
||||
width: 14px; |
||||
height: 14px; |
||||
content: ""; |
||||
vertical-align: sub; |
||||
background: url(../../images/icons/error.svg) no-repeat; |
||||
background-size: contain; |
||||
} |
@ -0,0 +1,21 @@
|
||||
/** |
||||
* @file |
||||
* Visual styles for icons. |
||||
*/ |
||||
|
||||
.icon-help { |
||||
padding: 1px 0 1px 20px; /* LTR */ |
||||
background: url(../../images/icons/help.png) 0 50% no-repeat; /* LTR */ |
||||
} |
||||
[dir="rtl"] .icon-help { |
||||
padding: 1px 20px 1px 0; |
||||
background-position: 100% 50%; |
||||
} |
||||
.feed-icon { |
||||
display: block; |
||||
overflow: hidden; |
||||
width: 16px; |
||||
height: 16px; |
||||
text-indent: -9999px; |
||||
background: url(../../images/icons/feed.svg) no-repeat; |
||||
} |
@ -0,0 +1,22 @@
|
||||
/** |
||||
* @file |
||||
* Image upload widget. |
||||
*/ |
||||
|
||||
.image-preview { |
||||
float: left; /* LTR */ |
||||
padding: 0 10px 10px 0; /* LTR */ |
||||
} |
||||
[dir="rtl"] .image-preview { |
||||
float: right; |
||||
padding: 0 0 10px 10px; |
||||
} |
||||
.image-widget-data { |
||||
float: left; /* LTR */ |
||||
} |
||||
[dir="rtl"] .image-widget-data { |
||||
float: right; |
||||
} |
||||
.image-widget-data .text-field { |
||||
width: auto; |
||||
} |
@ -0,0 +1,15 @@
|
||||
/** |
||||
* @file |
||||
* Basic styling for comment module. |
||||
*/ |
||||
|
||||
/** |
||||
* Indent threaded comments. |
||||
*/ |
||||
.indented { |
||||
margin-left: 25px; /* LTR */ |
||||
} |
||||
[dir="rtl"] .indented { |
||||
margin-right: 25px; |
||||
margin-left: 0; |
||||
} |
@ -0,0 +1,33 @@
|
||||
/** |
||||
* @file |
||||
* Visual styles for inline forms. |
||||
*/ |
||||
|
||||
.form--inline .form-item { |
||||
float: left; /* LTR */ |
||||
margin-right: 0.5em; /* LTR */ |
||||
} |
||||
[dir="rtl"] .form--inline .form-item { |
||||
float: right; |
||||
margin-right: 0; |
||||
margin-left: 0.5em; |
||||
} |
||||
/* This is required to win over specificity of [dir="rtl"] .form--inline .form-item */ |
||||
[dir="rtl"] .views-filterable-options-controls .form-item { |
||||
margin-right: 2%; |
||||
} |
||||
.form--inline .form-item-separator { |
||||
margin-top: 2.3em; |
||||
margin-right: 1em; /* LTR */ |
||||
margin-left: 0.5em; /* LTR */ |
||||
} |
||||
[dir="rtl"] .form--inline .form-item-separator { |
||||
margin-right: 0.5em; |
||||
margin-left: 1em; |
||||
} |
||||
.form--inline .form-actions { |
||||
clear: left; /* LTR */ |
||||
} |
||||
[dir="rtl"] .form--inline .form-actions { |
||||
clear: right; |
||||
} |
@ -0,0 +1,32 @@
|
||||
/** |
||||
* @file |
||||
* Visual styles for item list. |
||||
*/ |
||||
|
||||
.item-list .title { |
||||
font-weight: bold; |
||||
} |
||||
.item-list ul { |
||||
margin: 0 0 0.75em 0; |
||||
padding: 0; |
||||
} |
||||
.item-list li { |
||||
margin: 0 0 0.25em 1.5em; /* LTR */ |
||||
padding: 0; |
||||
} |
||||
[dir="rtl"] .item-list li { |
||||
margin: 0 1.5em 0.25em 0; |
||||
} |
||||
|
||||
/** |
||||
* Comma separated lists. |
||||
*/ |
||||
.item-list--comma-list { |
||||
display: inline; |
||||
} |
||||
.item-list--comma-list .item-list__comma-list, |
||||
.item-list__comma-list li, |
||||
[dir="rtl"] .item-list--comma-list .item-list__comma-list, |
||||
[dir="rtl"] .item-list__comma-list li { |
||||
margin: 0; |
||||
} |
@ -0,0 +1,16 @@
|
||||
/** |
||||
* @file |
||||
* Style another element as a link. |
||||
*/ |
||||
|
||||
button.link { |
||||
margin: 0; |
||||
padding: 0; |
||||
cursor: pointer; |
||||
border: 0; |
||||
background: transparent; |
||||
font-size: 1em; |
||||
} |
||||
label button.link { |
||||
font-weight: bold; |
||||
} |
@ -0,0 +1,23 @@
|
||||
/** |
||||
* @file |
||||
* Visual styles for links. |
||||
*/ |
||||
|
||||
ul.inline, |
||||
ul.links.inline { |
||||
display: inline; |
||||
padding-left: 0; /* LTR */ |
||||
} |
||||
[dir="rtl"] ul.inline, |
||||
[dir="rtl"] ul.links.inline { |
||||
padding-right: 0; |
||||
padding-left: 15px; |
||||
} |
||||
ul.inline li { |
||||
display: inline; |
||||
padding: 0 0.5em; |
||||
list-style-type: none; |
||||
} |
||||
ul.links a.is-active { |
||||
color: #000; |
||||
} |
@ -0,0 +1,34 @@
|
||||
/** |
||||
* @file |
||||
* Visual styles for menu. |
||||
*/ |
||||
|
||||
ul.menu { |
||||
margin-left: 1em; /* LTR */ |
||||
padding: 0; |
||||
list-style: none outside; |
||||
text-align: left; /* LTR */ |
||||
} |
||||
[dir="rtl"] ul.menu { |
||||
margin-right: 1em; |
||||
margin-left: 0; |
||||
text-align: right; |
||||
} |
||||
.menu-item--expanded { |
||||
list-style-type: circle; |
||||
list-style-image: url(../../images/icons/menu-expanded.png); |
||||
} |
||||
.menu-item--collapsed { |
||||
list-style-type: disc; |
||||
list-style-image: url(../../images/icons/menu-collapsed.png); /* LTR */ |
||||
} |
||||
[dir="rtl"] .menu-item--collapsed { |
||||
list-style-image: url(../../images/icons/menu-collapsed-rtl.png); |
||||
} |
||||
.menu-item { |
||||
margin: 0; |
||||
padding-top: 0.2em; |
||||
} |
||||
ul.menu a.is-active { |
||||
color: #000; |
||||
} |
@ -0,0 +1,69 @@
|
||||
/** |
||||
* @file |
||||
* Styles for system messages. |
||||
*/ |
||||
|
||||
.messages { |
||||
padding: 15px 20px 15px 35px; /* LTR */ |
||||
word-wrap: break-word; |
||||
border: 1px solid; |
||||
border-width: 1px 1px 1px 0; /* LTR */ |
||||
border-radius: 2px; |
||||
background: no-repeat 10px 17px; /* LTR */ |
||||
overflow-wrap: break-word; |
||||
} |
||||
[dir="rtl"] .messages { |
||||
padding-right: 35px; |
||||
padding-left: 20px; |
||||
text-align: right; |
||||
border-width: 1px 0 1px 1px; |
||||
background-position: right 10px top 17px; |
||||
} |
||||
.messages + .messages { |
||||
margin-top: 1.538em; |
||||
} |
||||
.messages__list { |
||||
margin: 0; |
||||
padding: 0; |
||||
list-style: none; |
||||
} |
||||
.messages__item + .messages__item { |
||||
margin-top: 0.769em; |
||||
} |
||||
.messages--status { |
||||
color: #325e1c; |
||||
border-color: #c9e1bd #c9e1bd #c9e1bd transparent; /* LTR */ |
||||
background-color: #f3faef; |
||||
background-image: url(../../images/icons/check.svg); |
||||
box-shadow: -8px 0 0 #77b259; /* LTR */ |
||||
} |
||||
[dir="rtl"] .messages--status { |
||||
margin-left: 0; |
||||
border-color: #c9e1bd transparent #c9e1bd #c9e1bd; |
||||
box-shadow: 8px 0 0 #77b259; |
||||
} |
||||
.messages--warning { |
||||
color: #734c00; |
||||
border-color: #f4daa6 #f4daa6 #f4daa6 transparent; /* LTR */ |
||||
background-color: #fdf8ed; |
||||
background-image: url(../../images/icons/warning.svg); |
||||
box-shadow: -8px 0 0 #e09600; /* LTR */ |
||||
} |
||||
[dir="rtl"] .messages--warning { |
||||
border-color: #f4daa6 transparent #f4daa6 #f4daa6; |
||||
box-shadow: 8px 0 0 #e09600; |
||||
} |
||||
.messages--error { |
||||
color: #a51b00; |
||||
border-color: #f9c9bf #f9c9bf #f9c9bf transparent; /* LTR */ |
||||
background-color: #fcf4f2; |
||||
background-image: url(../../images/icons/error.svg); |
||||
box-shadow: -8px 0 0 #e62600; /* LTR */ |
||||
} |
||||
[dir="rtl"] .messages--error { |
||||
border-color: #f9c9bf transparent #f9c9bf #f9c9bf; |
||||
box-shadow: 8px 0 0 #e62600; |
||||
} |
||||
.messages--error p.error { |
||||
color: #a51b00; |
||||
} |
@ -0,0 +1,12 @@
|
||||
/** |
||||
* @file |
||||
* Markup generated by #type 'more_link'. |
||||
*/ |
||||
|
||||
.more-link { |
||||
display: block; |
||||
text-align: right; /* LTR */ |
||||
} |
||||
[dir="rtl"] .more-link { |
||||
text-align: left; |
||||
} |
@ -0,0 +1,8 @@
|
||||
/** |
||||
* @file |
||||
* Visual styles for nodes. |
||||
*/ |
||||
|
||||
.node--unpublished { |
||||
background-color: #fff4f4; |
||||
} |
@ -0,0 +1,16 @@
|
||||
/** |
||||
* @file |
||||
* Visual styles for pager. |
||||
*/ |
||||
|
||||
.pager__items { |
||||
clear: both; |
||||
text-align: center; |
||||
} |
||||
.pager__item { |
||||
display: inline; |
||||
padding: 0.5em; |
||||
} |
||||
.pager__item.is-active { |
||||
font-weight: bold; |
||||
} |
@ -0,0 +1,55 @@
|
||||
/** |
||||
* @file |
||||
* Visual styles for progress bar. |
||||
* |
||||
* @see progress.js |
||||
*/ |
||||
|
||||
.progress__track { |
||||
border-color: #b3b3b3; |
||||
border-radius: 10em; |
||||
background-color: #f2f1eb; |
||||
background-image: linear-gradient(#e7e7df, #f0f0f0); |
||||
box-shadow: inset 0 1px 3px hsla(0, 0%, 0%, 0.16); |
||||
} |
||||
.progress__bar { |
||||
height: 16px; |
||||
margin-top: -1px; |
||||
margin-left: -1px; /* LTR */ |
||||
padding: 0 1px; |
||||
-webkit-transition: width 0.5s ease-out; |
||||
transition: width 0.5s ease-out; |
||||
-webkit-animation: animate-stripes 3s linear infinite; |
||||
-moz-animation: animate-stripes 3s linear infinite; |
||||
border: 1px #07629a solid; |
||||
border-radius: 10em; |
||||
background: #057ec9; |
||||
background-image: |
||||
linear-gradient(to bottom, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15)), |
||||
linear-gradient(to right bottom, #0094f0 0%, #0094f0 25%, #007ecc 25%, #007ecc 50%, #0094f0 50%, #0094f0 75%, #0094f0 100%); |
||||
background-size: 40px 40px; |
||||
} |
||||
[dir="rtl"] .progress__bar { |
||||
margin-right: -1px; |
||||
margin-left: 0; |
||||
-webkit-animation-direction: reverse; |
||||
-moz-animation-direction: reverse; |
||||
animation-direction: reverse; |
||||
} |
||||
|
||||
@media screen and (prefers-reduced-motion: reduce) { |
||||
.progress__bar { |
||||
-webkit-transition: none; |
||||
transition: none; |
||||
-webkit-animation: none; |
||||
-moz-animation: none; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Progress bar animations. |
||||
*/ |
||||
@keyframes animate-stripes { |
||||
0% { background-position: 0 0, 0 0; } |
||||
100% { background-position: 0 0, -80px 0; } |
||||
} |
@ -0,0 +1,8 @@
|
||||
/** |
||||
* @file |
||||
* Stylesheet for results generated by the Search module. |
||||
*/ |
||||
|
||||
.search-results { |
||||
list-style: none; |
||||
} |
@ -0,0 +1,14 @@
|
||||
/** |
||||
* @file |
||||
* Visual styles for table drag. |
||||
*/ |
||||
|
||||
tr.drag { |
||||
background-color: #fffff0; |
||||
} |
||||
tr.drag-previous { |
||||
background-color: #ffd; |
||||
} |
||||
body div.tabledrag-changed-warning { |
||||
margin-bottom: 0.5em; |
||||
} |
@ -0,0 +1,19 @@
|
||||
/** |
||||
* @file |
||||
* Table select behavior. |
||||
* |
||||
* @see tableselect.js |
||||
*/ |
||||
|
||||
tr.selected td { |
||||
background: #ffc; |
||||
} |
||||
td.checkbox, |
||||
th.checkbox { |
||||
text-align: center; |
||||
} |
||||
[dir="rtl"] td.checkbox, |
||||
[dir="rtl"] th.checkbox { |
||||
/* This is required to win over specificity of [dir="rtl"] td */ |
||||
text-align: center; |
||||
} |
@ -0,0 +1,11 @@
|
||||
/** |
||||
* @file |
||||
* Table sort indicator. |
||||
*/ |
||||
|
||||
th.is-active img { |
||||
display: inline; |
||||
} |
||||
td.is-active { |
||||
background-color: #ddd; |
||||
} |
@ -0,0 +1,33 @@
|
||||
/** |
||||
* @file |
||||
* Visual styles for tabs. |
||||
*/ |
||||
|
||||
div.tabs { |
||||
margin: 1em 0; |
||||
} |
||||
ul.tabs { |
||||
margin: 0 0 0.5em; |
||||
padding: 0; |
||||
list-style: none; |
||||
} |
||||
.tabs > li { |
||||
display: inline-block; |
||||
margin-right: 0.3em; /* LTR */ |
||||
} |
||||
[dir="rtl"] .tabs > li { |
||||
margin-right: 0; |
||||
margin-left: 0.3em; |
||||
} |
||||
.tabs a { |
||||
display: block; |
||||
padding: 0.2em 1em; |
||||
text-decoration: none; |
||||
} |
||||
.tabs a.is-active { |
||||
background-color: #eee; |
||||
} |
||||
.tabs a:focus, |
||||
.tabs a:hover { |
||||
background-color: #f5f5f5; |
||||
} |
@ -0,0 +1,11 @@
|
||||
/** |
||||
* @file |
||||
* Visual styles for a resizable textarea. |
||||
*/ |
||||
|
||||
.form-textarea-wrapper textarea { |
||||
display: block; |
||||
box-sizing: border-box; |
||||
width: 100%; |
||||
margin: 0; |
||||
} |
@ -0,0 +1,15 @@
|
||||
/** |
||||
* @file |
||||
* Styles for modal windows. |
||||
*/ |
||||
|
||||
.ui-dialog--narrow { |
||||
max-width: 500px; |
||||
} |
||||
|
||||
@media screen and (max-width: 600px) { |
||||
.ui-dialog--narrow { |
||||
min-width: 95%; |
||||
max-width: 95%; |
||||
} |
||||
} |
@ -0,0 +1,67 @@
|
||||
/** |
||||
* @file |
||||
* Theme styling for user module. |
||||
*/ |
||||
|
||||
/* Visual styling for the Password strength indicator */ |
||||
.password-strength__meter { |
||||
margin-top: 0.5em; |
||||
background-color: #ebeae4; |
||||
} |
||||
.password-strength__indicator { |
||||
-webkit-transition: width 0.5s ease-out; |
||||
transition: width 0.5s ease-out; |
||||
background-color: #77b259; |
||||
} |
||||
.password-strength__indicator.is-weak { |
||||
background-color: #e62600; |
||||
} |
||||
.password-strength__indicator.is-fair { |
||||
background-color: #e09600; |
||||
} |
||||
.password-strength__indicator.is-good { |
||||
background-color: #0074bd; |
||||
} |
||||
.password-strength__indicator.is-strong { |
||||
background-color: #77b259; |
||||
} |
||||
|
||||
.password-confirm, |
||||
.password-field, |
||||
.password-strength, |
||||
.password-confirm-match, |
||||
.password-confirm-message { |
||||
width: 55%; |
||||
} |
||||
|
||||
.password-suggestions { |
||||
max-width: 34.7em; |
||||
margin: 0.7em 0; |
||||
padding: 0.2em 0.5em; |
||||
border: 1px solid #b4b4b4; |
||||
} |
||||
.password-suggestions ul { |
||||
margin-bottom: 0; |
||||
} |
||||
|
||||
.confirm-parent, |
||||
.password-parent { |
||||
clear: left; /* LTR */ |
||||
overflow: hidden; |
||||
max-width: 33em; |
||||
margin: 0; |
||||
} |
||||
[dir="rtl"] .confirm-parent, |
||||
[dir="rtl"] .password-parent { |
||||
clear: right; |
||||
} |
||||
|
||||
/* Styling for the status indicator of the passwords match test. */ |
||||
.password-confirm .ok { |
||||
color: #325e1c; |
||||
font-weight: bold; |
||||
} |
||||
.password-confirm .error { |
||||
color: #a51b00; |
||||
font-weight: bold; |
||||
} |
@ -0,0 +1,110 @@
|
||||
//@format
|
||||
const yaml = require('js-yaml'); |
||||
const fs = require('fs'); |
||||
const { SITE, PORT, BSREWRITE, PATHS } = loadConfig(); |
||||
//var server = require('browser-sync').create();
|
||||
//global.server = server;
|
||||
const gulp = require('gulp'); |
||||
const plumber = require('gulp-plumber'); |
||||
const autoprefixer = require('gulp-autoprefixer'); |
||||
const sass = require('gulp-sass')(require('sass')); |
||||
const browsersync = require('browser-sync').create(); |
||||
const sourcemaps = require('gulp-sourcemaps'); |
||||
const cleanCSS = require('gulp-clean-css'); |
||||
|
||||
function loadConfig() { |
||||
var ymlFile = fs.readFileSync('config.yml', 'utf8'); |
||||
return yaml.load(ymlFile); |
||||
} |
||||
|
||||
// BrowserSync
|
||||
function bsInit__local(done) { |
||||
browsersync.init({ |
||||
logLevel: 'debug', |
||||
proxy: SITE.Local.Url, |
||||
//proxy: 'https://d10_dev.lndo.site/',
|
||||
}); |
||||
done(); |
||||
} |
||||
|
||||
function bsInit__remote(done) { |
||||
browsersync.init({ |
||||
//logLevel: 'debug',
|
||||
proxy: SITE.Remote.Url, |
||||
serveStatic: ['.'], |
||||
files: PATHS.Watch, |
||||
plugins: ['bs-rewrite-rules'], |
||||
rewriteRules: [ |
||||
{ |
||||
match: BSREWRITE.Css.Match, |
||||
replace: BSREWRITE.Css.Replace |
||||
}, |
||||
{ |
||||
match: BSREWRITE.Js.Match, |
||||
replace: BSREWRITE.Js.Replace |
||||
} |
||||
] |
||||
}); |
||||
done(); |
||||
} |
||||
|
||||
// BrowserSync Reload
|
||||
function bsReload(done) { |
||||
browsersync.reload(); |
||||
done(); |
||||
} |
||||
|
||||
var cp = require('child_process'); |
||||
function drush() { |
||||
return cp.exec('lando drush cr'); |
||||
} |
||||
|
||||
// Compile CSS
|
||||
function styles() { |
||||
'use strict'; |
||||
return gulp |
||||
//.src(PATHS.Scss.Dir + '/**/*.scss')
|
||||
.src('./css/sass/**/*.scss') |
||||
.pipe(plumber()) |
||||
.pipe(sourcemaps.init()) |
||||
.pipe( |
||||
sass |
||||
.sync({ |
||||
includePaths: PATHS.Scss.Libraries |
||||
}) |
||||
.on('error', sass.logError) |
||||
) |
||||
//.pipe(cleanCSS())
|
||||
.pipe(sourcemaps.write('.')) |
||||
//.pipe(gulp.dest(PATHS.Css.Dir))
|
||||
.pipe(gulp.dest('./css')) |
||||
.pipe(browsersync.stream()); |
||||
} |
||||
|
||||
// Watch Files
|
||||
function watchFiles() { |
||||
'use strict'; |
||||
//gulp.watch(PATHS.Scss.Dir + '/**/*.scss', styles);
|
||||
gulp.watch('css/sass/**/*.scss', styles); |
||||
gulp.watch('./templates/**/*.twig', drush); |
||||
} |
||||
|
||||
// Group complex tasks
|
||||
const build = gulp.parallel(styles); |
||||
const watch_remote = gulp.series( |
||||
styles, |
||||
gulp.parallel(watchFiles, bsInit__remote) |
||||
); |
||||
const watch_local = gulp.series( |
||||
styles, |
||||
gulp.parallel(watchFiles, bsInit__local) |
||||
); |
||||
|
||||
// Export tasks
|
||||
exports.build = build; |
||||
exports.styles = styles; |
||||
exports.drush = drush; |
||||
exports.watch = watch_remote; |
||||
exports.remote = watch_remote; |
||||
exports.local = watch_local; |
||||
exports.default = watch_remote; |
After Width: | Height: | Size: 189 B |
After Width: | Height: | Size: 346 B |
After Width: | Height: | Size: 189 B |
After Width: | Height: | Size: 314 B |
After Width: | Height: | Size: 294 B |
After Width: | Height: | Size: 385 B |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 107 B |
After Width: | Height: | Size: 105 B |
After Width: | Height: | Size: 106 B |
After Width: | Height: | Size: 260 B |
After Width: | Height: | Size: 265 B |
After Width: | Height: | Size: 220 B |
After Width: | Height: | Size: 220 B |
After Width: | Height: | Size: 276 B |
After Width: | Height: | Size: 214 B |
After Width: | Height: | Size: 196 B |
After Width: | Height: | Size: 181 B |
After Width: | Height: | Size: 183 B |
@ -0,0 +1,22 @@
|
||||
name: islandscholar |
||||
type: theme |
||||
'base theme': stable9 |
||||
starterkit: true |
||||
version: VERSION |
||||
libraries: |
||||
- islandscholar/base |
||||
- islandscholar/messages |
||||
- core/normalize |
||||
libraries-extend: |
||||
user/drupal.user: |
||||
- islandscholar/user |
||||
core/drupal.dropbutton: |
||||
- islandscholar/dropbutton |
||||
core/drupal.dialog: |
||||
- islandscholar/dialog |
||||
file/drupal.file: |
||||
- islandscholar/file |
||||
core/drupal.progress: |
||||
- islandscholar/progress |
||||
core_version_requirement: ^10 |
||||
generator: 'starterkit_theme:10.0.9' |
@ -0,0 +1,105 @@
|
||||
base: |
||||
version: VERSION |
||||
css: |
||||
component: |
||||
css/components/action-links.css: |
||||
weight: -10 |
||||
css/components/breadcrumb.css: |
||||
weight: -10 |
||||
css/components/button.css: |
||||
weight: -10 |
||||
css/components/container-inline.css: |
||||
weight: -10 |
||||
css/components/details.css: |
||||
weight: -10 |
||||
css/components/exposed-filters.css: |
||||
weight: -10 |
||||
css/components/field.css: |
||||
weight: -10 |
||||
css/components/form.css: |
||||
weight: -10 |
||||
css/components/icons.css: |
||||
weight: -10 |
||||
css/components/inline-form.css: |
||||
weight: -10 |
||||
css/components/item-list.css: |
||||
weight: -10 |
||||
css/components/link.css: |
||||
weight: -10 |
||||
css/components/links.css: |
||||
weight: -10 |
||||
css/components/menu.css: |
||||
weight: -10 |
||||
css/components/more-link.css: |
||||
weight: -10 |
||||
css/components/pager.css: |
||||
weight: -10 |
||||
css/components/tabledrag.css: |
||||
weight: -10 |
||||
css/components/tableselect.css: |
||||
weight: -10 |
||||
css/components/tablesort.css: |
||||
weight: -10 |
||||
css/components/tabs.css: |
||||
weight: -10 |
||||
css/components/textarea.css: |
||||
weight: -10 |
||||
css/components/ui-dialog.css: |
||||
weight: -10 |
||||
dialog: |
||||
version: VERSION |
||||
css: |
||||
component: |
||||
css/components/dialog.css: |
||||
weight: -10 |
||||
dropbutton: |
||||
version: VERSION |
||||
css: |
||||
component: |
||||
css/components/dropbutton.css: |
||||
weight: -10 |
||||
file: |
||||
version: VERSION |
||||
css: |
||||
component: |
||||
css/components/file.css: |
||||
weight: -10 |
||||
image-widget: |
||||
version: VERSION |
||||
css: |
||||
component: |
||||
css/components/image-widget.css: { } |
||||
indented: |
||||
version: VERSION |
||||
css: |
||||
component: |
||||
css/components/indented.css: { } |
||||
messages: |
||||
version: VERSION |
||||
css: |
||||
component: |
||||
css/components/messages.css: |
||||
weight: -10 |
||||
node: |
||||
version: VERSION |
||||
css: |
||||
component: |
||||
css/components/node.css: |
||||
weight: -10 |
||||
progress: |
||||
version: VERSION |
||||
css: |
||||
component: |
||||
css/components/progress.css: |
||||
weight: -10 |
||||
search-results: |
||||
version: VERSION |
||||
css: |
||||
component: |
||||
css/components/search-results.css: { } |
||||
user: |
||||
version: VERSION |
||||
css: |
||||
component: |
||||
css/components/user.css: |
||||
weight: -10 |
@ -0,0 +1,21 @@
|
||||
<?php |
||||
|
||||
/** |
||||
* @file |
||||
* Functions to support theming. |
||||
*/ |
||||
|
||||
/** |
||||
* Implements hook_preprocess_image_widget(). |
||||
*/ |
||||
function islandscholar_preprocess_image_widget(array &$variables) { |
||||
$data = &$variables['data']; |
||||
|
||||
// This prevents image widget templates from rendering preview container HTML |
||||
// to users that do not have permission to access these previews. |
||||
// @todo revisit in https://drupal.org/node/953034 |
||||
// @todo revisit in https://drupal.org/node/3114318 |
||||
if (isset($data['preview']['#access']) && $data['preview']['#access'] === FALSE) { |
||||
unset($data['preview']); |
||||
} |
||||
} |
@ -0,0 +1,38 @@
|
||||
{ |
||||
"name": "vanilla_vre", |
||||
"version": "1.0.0", |
||||
"description": "vanilla_vre theme, generated from starterkit_theme. Additional information on generating themes can be found in the [Starterkit documentation](https://www.drupal.org/docs/core-modules-and-themes/core-themes/starterkit-theme).", |
||||
"main": "index.js", |
||||
"scripts": { |
||||
"test": "echo \"Error: no test specified\" && exit 1" |
||||
}, |
||||
"author": "", |
||||
"license": "ISC", |
||||
"devDependencies": { |
||||
"breakpoint-sass": "^2.7.1", |
||||
"browser-sync": "latest", |
||||
"bs-rewrite-rules": "^2.1.2", |
||||
"foundation-sites": "^6.7.5", |
||||
"fs": "^0.0.1-security", |
||||
"gulp": "latest", |
||||
"gulp-autoprefixer": "latest", |
||||
"gulp-cache": "^1.1.3", |
||||
"gulp-clean-css": "^4.3.0", |
||||
"gulp-concat": "^2.6.1", |
||||
"gulp-plumber": "latest", |
||||
"gulp-rename": "latest", |
||||
"gulp-sass": "latest", |
||||
"gulp-sourcemaps": "^3.0.0", |
||||
"gulp4-run-sequence": "^1.0.0", |
||||
"js-yaml": "^4.1.0", |
||||
"modularscale-sass": "^3.0.10", |
||||
"natives": "^1.1.6", |
||||
"require-dir": "^1.2.0", |
||||
"run-sequence": "^2.2.1", |
||||
"sass": "^1.44.0", |
||||
"vanilla-framework": "^3.10.0" |
||||
}, |
||||
"dependencies": { |
||||
"superfish": "^1.7.10" |
||||
} |
||||
} |
After Width: | Height: | Size: 33 KiB |
@ -0,0 +1,20 @@
|
||||
<?php |
||||
|
||||
namespace Drupal\starterkit_theme; |
||||
|
||||
use Drupal\Component\Serialization\Yaml; |
||||
use Drupal\Core\Theme\StarterKitInterface; |
||||
|
||||
final class StarterKit implements StarterKitInterface { |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public static function postProcess(string $working_dir, string $machine_name, string $theme_name): void { |
||||
$info_file = "$working_dir/$machine_name.info.yml"; |
||||
$info = Yaml::decode(file_get_contents($info_file)); |
||||
unset($info['hidden']); |
||||
file_put_contents($info_file, Yaml::encode($info)); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,12 @@
|
||||
{% extends "block.html.twig" %} |
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override for local actions (primary admin actions.) |
||||
*/ |
||||
#} |
||||
{% block content %} |
||||
{% if content %} |
||||
<nav class="action-links">{{ content }}</nav> |
||||
{% endif %} |
||||
{% endblock %} |
@ -0,0 +1,14 @@
|
||||
{% extends "block.html.twig" %} |
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override for tabs. |
||||
*/ |
||||
#} |
||||
{% block content %} |
||||
{% if content %} |
||||
<nav class="tabs" role="navigation" aria-label="{{ 'Tabs'|t }}"> |
||||
{{ content }} |
||||
</nav> |
||||
{% endif %} |
||||
{% endblock %} |
@ -0,0 +1,46 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override for the search form 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, including: |
||||
* - 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. |
||||
* - in_preview: Whether the plugin is being rendered in preview mode. |
||||
* - content: The content of this block. |
||||
* - attributes: A list HTML attributes populated by modules, intended to |
||||
* be added to the main container tag of this template. Includes: |
||||
* - 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() |
||||
* @see search_preprocess_block() |
||||
*/ |
||||
#} |
||||
{% |
||||
set classes = [ |
||||
'block', |
||||
'block-search', |
||||
'container-inline', |
||||
] |
||||
%} |
||||
<div{{ attributes.addClass(classes) }}> |
||||
{{ title_prefix }} |
||||
{% if label %} |
||||
<h2{{ title_attributes }}>{{ label }}</h2> |
||||
{% endif %} |
||||
{{ title_suffix }} |
||||
{% block content %} |
||||
{{ content }} |
||||
{% endblock %} |
||||
</div> |
@ -0,0 +1,30 @@
|
||||
{% extends "block.html.twig" %} |
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override for a branding block. |
||||
* |
||||
* Each branding element variable (logo, name, slogan) is only available if |
||||
* enabled in the block configuration. |
||||
* |
||||
* Available variables: |
||||
* - site_logo: Logo for site as defined in Appearance or theme settings. |
||||
* - site_name: Name for site as defined in Site information settings. |
||||
* - site_slogan: Slogan for site as defined in Site information settings. |
||||
*/ |
||||
#} |
||||
{% block content %} |
||||
{% if site_logo %} |
||||
<a href="{{ path('<front>') }}" rel="home" class="site-logo"> |
||||
<img src="{{ site_logo }}" alt="{{ 'Home'|t }}" /> |
||||
</a> |
||||
{% endif %} |
||||
{% if site_name %} |
||||
<div class="site-name"> |
||||
<a href="{{ path('<front>') }}" rel="home">{{ site_name }}</a> |
||||
</div> |
||||
{% endif %} |
||||
{% if site_slogan %} |
||||
<div class="site-slogan">{{ site_slogan }}</div> |
||||
{% endif %} |
||||
{% endblock %} |
@ -0,0 +1,57 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override for a menu 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. |
||||
* - in_preview: Whether the plugin is being rendered in preview mode. |
||||
* - content: The content of this block. |
||||
* - attributes: HTML attributes for the containing element. |
||||
* - id: A valid HTML ID and guaranteed unique. |
||||
* - title_attributes: HTML attributes for the title element. |
||||
* - content_attributes: HTML attributes for the content element. |
||||
* - 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. |
||||
* |
||||
* Headings should be used on navigation menus that consistently appear on |
||||
* multiple pages. When this menu block's label is configured to not be |
||||
* displayed, it is automatically made invisible using the 'visually-hidden' CSS |
||||
* class, which still keeps it visible for screen-readers and assistive |
||||
* technology. Headings allow screen-reader and keyboard only users to navigate |
||||
* to or skip the links. |
||||
* See http://juicystudio.com/article/screen-readers-display-none.php and |
||||
* http://www.w3.org/TR/WCAG-TECHS/H42.html for more information. |
||||
*/ |
||||
#} |
||||
{% |
||||
set classes = [ |
||||
'block', |
||||
'block-menu', |
||||
'navigation', |
||||
'menu--' ~ derivative_plugin_id|clean_class, |
||||
] |
||||
%} |
||||
{% set heading_id = attributes.id ~ '-menu'|clean_id %} |
||||
<nav role="navigation" aria-labelledby="{{ heading_id }}"{{ attributes.addClass(classes)|without('role', 'aria-labelledby') }}> |
||||
{# Label. If not displayed, we still provide it for screen readers. #} |
||||
{% if not configuration.label_display %} |
||||
{% set title_attributes = title_attributes.addClass('visually-hidden') %} |
||||
{% endif %} |
||||
{{ title_prefix }} |
||||
<h2{{ title_attributes.setAttribute('id', heading_id) }}>{{ configuration.label }}</h2> |
||||
{{ title_suffix }} |
||||
|
||||
{# Menu. #} |
||||
{% block content %} |
||||
{{ content }} |
||||
{% endblock %} |
||||
</nav> |
@ -0,0 +1,45 @@
|
||||
{# |
||||
/** |
||||
* @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. |
||||
* - in_preview: Whether the plugin is being rendered in preview mode. |
||||
* - 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 }} |
||||
{% block content %} |
||||
{{ content }} |
||||
{% endblock %} |
||||
</div> |
@ -0,0 +1,22 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override to display a file form widget. |
||||
* |
||||
* Available variables: |
||||
* - element: Form element for the file upload. |
||||
* - attributes: HTML attributes for the containing element. |
||||
* |
||||
* @see template_preprocess_file_managed_file() |
||||
*/ |
||||
#} |
||||
{{ attach_library('islandscholar/file') }} |
||||
{% |
||||
set classes = [ |
||||
'js-form-managed-file', |
||||
'form-managed-file', |
||||
] |
||||
%} |
||||
<div{{ attributes.addClass(classes) }}> |
||||
{{ element }} |
||||
</div> |
@ -0,0 +1,12 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override to display help text for file fields. |
||||
* |
||||
* Available variables: |
||||
* - descriptions: Lines of help text for uploading a file. |
||||
* |
||||
* @see template_preprocess_file_upload_help() |
||||
*/ |
||||
#} |
||||
{{ descriptions|safe_join('<br />') }} |
@ -0,0 +1,14 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override to display a multi file form widget. |
||||
* |
||||
* Available variables: |
||||
* - table: Table of previously uploaded files. |
||||
* - element: The form element for uploading another file. |
||||
* |
||||
* @see template_preprocess_file_widget_multiple() |
||||
*/ |
||||
#} |
||||
{{ table }} |
||||
{{ element }} |
@ -0,0 +1,18 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override for a filter caption. |
||||
* |
||||
* Returns HTML for a captioned image, audio, video or other tag. |
||||
* |
||||
* Available variables |
||||
* - string node: The complete HTML tag whose contents are being captioned. |
||||
* - string tag: The name of the HTML tag whose contents are being captioned. |
||||
* - string caption: The caption text. |
||||
* - string classes: The classes of the captioned HTML tag. |
||||
*/ |
||||
#} |
||||
<figure role="group" class="caption caption-{{ tag }}{%- if classes %} {{ classes }}{%- endif %}"> |
||||
{{ node }} |
||||
<figcaption>{{ caption }}</figcaption> |
||||
</figure> |
@ -0,0 +1,29 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override for guidelines for a text format. |
||||
* |
||||
* Available variables: |
||||
* - format: Contains information about the current text format, including the |
||||
* following: |
||||
* - name: The name of the text format, potentially unsafe and needs to be |
||||
* escaped. |
||||
* - format: The machine name of the text format, e.g. 'basic_html'. |
||||
* - attributes: HTML attributes for the containing element. |
||||
* - tips: Descriptions and a CSS ID in the form of 'module-name/filter-id' |
||||
* (only used when 'long' is TRUE) for each filter in one or more text |
||||
* formats. |
||||
* |
||||
* @see template_preprocess_filter_tips() |
||||
*/ |
||||
#} |
||||
{% |
||||
set classes = [ |
||||
'filter-guidelines-item', |
||||
'filter-guidelines-' ~ format.id, |
||||
] |
||||
%} |
||||
<div{{ attributes.addClass(classes) }}> |
||||
<h4 class="label">{{ format.label }}</h4> |
||||
{{ tips }} |
||||
</div> |
@ -0,0 +1,61 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override for a set of filter tips. |
||||
* |
||||
* Available variables: |
||||
* - tips: Descriptions and a CSS ID in the form of 'module-name/filter-id' |
||||
* (only used when 'long' is TRUE) for each filter in one or more text |
||||
* formats. |
||||
* - long: A flag indicating whether the passed-in filter tips contain extended |
||||
* explanations, i.e. intended to be output on the path 'filter/tips' |
||||
* (TRUE), or are in a short format, i.e. suitable to be displayed below a |
||||
* form element. Defaults to FALSE. |
||||
* - multiple: A flag indicating there is more than one filter tip. |
||||
* |
||||
* @see template_preprocess_filter_tips() |
||||
*/ |
||||
#} |
||||
{% if multiple %} |
||||
<h2>{{ 'Text Formats'|t }}</h2> |
||||
{% endif %} |
||||
|
||||
{% if tips|length %} |
||||
{% if multiple %} |
||||
<div class="compose-tips"> |
||||
{% endif %} |
||||
|
||||
{% for name, tip in tips %} |
||||
{% if multiple %} |
||||
{% |
||||
set tip_classes = [ |
||||
'filter-type', |
||||
'filter-' ~ name|clean_class, |
||||
] |
||||
%} |
||||
<div{{ tip.attributes.addClass(tip_classes) }}> |
||||
<h3>{{ tip.name }}</h3> |
||||
{% endif %} |
||||
|
||||
{% if tip.list|length %} |
||||
<ul class="tips"> |
||||
{% for item in tip.list %} |
||||
{% |
||||
set item_classes = [ |
||||
long ? 'filter-' ~ item.id|replace({'/': '-'}), |
||||
] |
||||
%} |
||||
<li{{ item.attributes.addClass(item_classes) }}>{{ item.tip }}</li> |
||||
{% endfor %} |
||||
</ul> |
||||
{% endif %} |
||||
|
||||
{% if multiple %} |
||||
</div> |
||||
{% endif %} |
||||
{% endfor %} |
||||
|
||||
{% if multiple %} |
||||
</div> |
||||
{% endif %} |
||||
{% endif %} |
@ -0,0 +1,23 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override for an image field widget. |
||||
* |
||||
* Available variables: |
||||
* - attributes: HTML attributes for the containing element. |
||||
* - data: Render elements of the image widget. |
||||
* |
||||
* @see template_preprocess_image_widget() |
||||
*/ |
||||
#} |
||||
<div{{ attributes }}> |
||||
{% if data.preview %} |
||||
<div class="image-preview"> |
||||
{{ data.preview }} |
||||
</div> |
||||
{% endif %} |
||||
<div class="image-widget-data"> |
||||
{# Render widget data without the image preview that was output already. #} |
||||
{{ data|without('preview') }} |
||||
</div> |
||||
</div> |
@ -0,0 +1,30 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override to list node types available for adding content. |
||||
* |
||||
* This list is displayed on the Add content admin page. |
||||
* |
||||
* Available variables: |
||||
* - types: A list of content types, each with the following properties: |
||||
* - add_link: Link to create a piece of content of this type. |
||||
* - description: Description of this type of content. |
||||
* |
||||
* @see template_preprocess_node_add_list() |
||||
*/ |
||||
#} |
||||
{% if types is not empty %} |
||||
<dl class="node-type-list"> |
||||
{% for type in types %} |
||||
<dt>{{ type.add_link }}</dt> |
||||
<dd>{{ type.description }}</dd> |
||||
{% endfor %} |
||||
</dl> |
||||
{% else %} |
||||
<p> |
||||
{% set create_content = path('node.type_add') %} |
||||
{% trans %} |
||||
You have not created any content types yet. Go to the <a href="{{ create_content }}">content type creation page</a> to add a new content type. |
||||
{% endtrans %} |
||||
</p> |
||||
{% endif %} |
@ -0,0 +1,26 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override for a node edit form. |
||||
* |
||||
* Two column template for the node add/edit form. |
||||
* |
||||
* This template will be used when a node edit form specifies 'node_edit_form' |
||||
* as its #theme callback. Otherwise, by default, node add/edit forms will be |
||||
* themed by form.html.twig. |
||||
* |
||||
* Available variables: |
||||
* - form: The node add/edit form. |
||||
*/ |
||||
#} |
||||
<div class="layout-node-form clearfix"> |
||||
<div class="layout-region layout-region-node-main"> |
||||
{{ form|without('advanced', 'actions') }} |
||||
</div> |
||||
<div class="layout-region layout-region-node-secondary"> |
||||
{{ form.advanced }} |
||||
</div> |
||||
<div class="layout-region layout-region-node-footer"> |
||||
{{ form.actions }} |
||||
</div> |
||||
</div> |
@ -0,0 +1,26 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override for a text format-enabled form element. |
||||
* |
||||
* Available variables: |
||||
* - children: Text format element children. |
||||
* - description: Text format element description. |
||||
* - attributes: HTML attributes for the containing element. |
||||
* - aria_description: Flag for whether or not an ARIA description has been |
||||
* added to the description container. |
||||
* |
||||
* @see template_preprocess_text_format_wrapper() |
||||
*/ |
||||
#} |
||||
<div class="js-text-format-wrapper text-format-wrapper js-form-item form-item"> |
||||
{{ children }} |
||||
{% if description %} |
||||
{% |
||||
set classes = [ |
||||
aria_description ? 'description', |
||||
] |
||||
%} |
||||
<div{{ attributes.addClass(classes) }}>{{ description }}</div> |
||||
{% endif %} |
||||
</div> |
@ -0,0 +1,111 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override for comments. |
||||
* |
||||
* Available variables: |
||||
* - author: Comment author. Can be a link or plain text. |
||||
* - content: The content-related items for the comment display. Use |
||||
* {{ content }} to print them all, or print a subset such as |
||||
* {{ content.field_example }}. Use the following code to temporarily suppress |
||||
* the printing of a given child element: |
||||
* @code |
||||
* {{ content|without('field_example') }} |
||||
* @endcode |
||||
* - created: Formatted date and time for when the comment was created. |
||||
* Preprocess functions can reformat it by calling DateFormatter::format() |
||||
* with the desired parameters on the 'comment.created' variable. |
||||
* - changed: Formatted date and time for when the comment was last changed. |
||||
* Preprocess functions can reformat it by calling DateFormatter::format() |
||||
* with the desired parameters on the 'comment.changed' variable. |
||||
* - permalink: Comment permalink. |
||||
* - submitted: Submission information created from author and created |
||||
* during template_preprocess_comment(). |
||||
* - user_picture: The comment author's profile picture. |
||||
* - status: Comment status. Possible values are: |
||||
* unpublished, published, or preview. |
||||
* - title: Comment title, linked to the comment. |
||||
* - attributes: HTML attributes for the containing element. |
||||
* The attributes.class may contain one or more of the following classes: |
||||
* - comment: The current template type; e.g., 'theming hook'. |
||||
* - by-anonymous: Comment by an unregistered user. |
||||
* - by-{entity-type}-author: Comment by the author of the parent entity, |
||||
* eg. by-node-author. |
||||
* - preview: When previewing a new or edited comment. |
||||
* The following applies only to viewers who are registered users: |
||||
* - unpublished: An unpublished comment visible only to administrators. |
||||
* - 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. |
||||
* - content_attributes: List of classes for the styling of the comment content. |
||||
* - title_attributes: Same as attributes, except applied to the main title |
||||
* tag that appears in the template. |
||||
* - threaded: A flag indicating whether the comments are threaded or not. |
||||
* |
||||
* These variables are provided to give context about the parent comment (if |
||||
* any): |
||||
* - parent_comment: Full parent comment entity (if any). |
||||
* - parent_author: Equivalent to author for the parent comment. |
||||
* - parent_created: Equivalent to created for the parent comment. |
||||
* - parent_changed: Equivalent to changed for the parent comment. |
||||
* - parent_title: Equivalent to title for the parent comment. |
||||
* - parent_permalink: Equivalent to permalink for the parent comment. |
||||
* - parent: A text string of parent comment submission information created from |
||||
* 'parent_author' and 'parent_created' during template_preprocess_comment(). |
||||
* This information is presented to help screen readers follow lengthy |
||||
* discussion threads. You can hide this from sighted users using the class |
||||
* visually-hidden. |
||||
* |
||||
* These two variables are provided for context: |
||||
* - comment: Full comment object. |
||||
* - commented_entity: Entity the comments are attached to. |
||||
* |
||||
* @see template_preprocess_comment() |
||||
*/ |
||||
#} |
||||
{% if threaded %} |
||||
{{ attach_library('islandscholar/indented') }} |
||||
{% endif %} |
||||
{% |
||||
set classes = [ |
||||
'comment', |
||||
'js-comment', |
||||
status != 'published' ? status, |
||||
comment.owner.anonymous ? 'by-anonymous', |
||||
author_id and author_id == commented_entity.getOwnerId() ? 'by-' ~ commented_entity.getEntityTypeId() ~ '-author', |
||||
] |
||||
%} |
||||
<article{{ attributes.addClass(classes) }}> |
||||
{# |
||||
Hide the "new" indicator by default, let a piece of JavaScript ask the |
||||
server which comments are new for the user. Rendering the final "new" |
||||
indicator here would break the render cache. |
||||
#} |
||||
<mark class="hidden" data-comment-timestamp="{{ new_indicator_timestamp }}"></mark> |
||||
|
||||
<footer class="comment__meta"> |
||||
{{ user_picture }} |
||||
<p class="comment__submitted">{{ submitted }}</p> |
||||
|
||||
{# |
||||
Indicate the semantic relationship between parent and child comments for |
||||
accessibility. The list is difficult to navigate in a screen reader |
||||
without this information. |
||||
#} |
||||
{% if parent %} |
||||
<p class="parent visually-hidden">{{ parent }}</p> |
||||
{% endif %} |
||||
|
||||
{{ permalink }} |
||||
</footer> |
||||
|
||||
<div{{ content_attributes.addClass('content') }}> |
||||
{% if title %} |
||||
{{ title_prefix }} |
||||
<h3{{ title_attributes }}>{{ title }}</h3> |
||||
{{ title_suffix }} |
||||
{% endif %} |
||||
{{ content }} |
||||
</div> |
||||
</article> |
@ -0,0 +1,40 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override to display node links. |
||||
* |
||||
* Available variables: |
||||
* - attributes: Attributes for the UL containing the list of links. |
||||
* - links: Links to be output. |
||||
* Each link will have the following elements: |
||||
* - link: (optional) A render array that returns a link. See |
||||
* template_preprocess_links() for details how it is generated. |
||||
* - text: The link text. |
||||
* - attributes: HTML attributes for the list item element. |
||||
* - text_attributes: (optional) HTML attributes for the span element if no |
||||
* 'url' was supplied. |
||||
* - heading: (optional) A heading to precede the links. |
||||
* - text: The heading text. |
||||
* - level: The heading level (e.g. 'h2', 'h3'). |
||||
* - attributes: (optional) A keyed list of attributes for the heading. |
||||
* If the heading is a string, it will be used as the text of the heading and |
||||
* the level will default to 'h2'. |
||||
* |
||||
* Headings should be used on navigation menus and any list of links that |
||||
* consistently appears on multiple pages. To make the heading invisible use |
||||
* the 'visually-hidden' CSS class. Do not use 'display:none', which |
||||
* removes it from screen readers and assistive technology. Headings allow |
||||
* screen reader and keyboard only users to navigate to or skip the links. |
||||
* See http://juicystudio.com/article/screen-readers-display-none.php and |
||||
* http://www.w3.org/TR/WCAG-TECHS/H42.html for more information. |
||||
* |
||||
* @see template_preprocess_links() |
||||
* |
||||
* @ingroup themeable |
||||
*/ |
||||
#} |
||||
{% if links %} |
||||
<div class="node__links"> |
||||
{% include "links.html.twig" %} |
||||
</div> |
||||
{% endif %} |
@ -0,0 +1,20 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override for a marker for new or updated content. |
||||
* |
||||
* Available variables: |
||||
* - status: Number representing the marker status to display. Use the constants |
||||
* below for comparison: |
||||
* - MARK_NEW |
||||
* - MARK_UPDATED |
||||
* - MARK_READ |
||||
*/ |
||||
#} |
||||
{% if logged_in %} |
||||
{% if status is constant('MARK_NEW') %} |
||||
<span class="marker">{{ 'New'|t }}</span> |
||||
{% elseif status is constant('MARK_UPDATED') %} |
||||
<span class="marker">{{ 'Updated'|t }}</span> |
||||
{% endif %} |
||||
{% endif %} |
@ -0,0 +1,28 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override to display a media item. |
||||
* |
||||
* Available variables: |
||||
* - name: Name of the media. |
||||
* - content: Media content. |
||||
* |
||||
* @see template_preprocess_media() |
||||
* |
||||
* @ingroup themeable |
||||
*/ |
||||
#} |
||||
{% |
||||
set classes = [ |
||||
'media', |
||||
'media--type-' ~ media.bundle()|clean_class, |
||||
not media.isPublished() ? 'media--unpublished', |
||||
view_mode ? 'media--view-mode-' ~ view_mode|clean_class, |
||||
] |
||||
%} |
||||
<article{{ attributes.addClass(classes) }}> |
||||
{{ title_suffix.contextual_links }} |
||||
{% if content %} |
||||
{{ content }} |
||||
{% endif %} |
||||
</article> |
@ -0,0 +1,105 @@
|
||||
{# |
||||
/** |
||||
* @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: (optional) 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: (optional) Themed creation date field. |
||||
* - author_name: (optional) 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() |
||||
* |
||||
*/ |
||||
#} |
||||
{% |
||||
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('islandscholar/node') }} |
||||
<article{{ attributes.addClass(classes) }}> |
||||
|
||||
{{ title_prefix }} |
||||
{% if label and not page %} |
||||
<h2{{ title_attributes }}> |
||||
<a href="{{ url }}" rel="bookmark">{{ label }}</a> |
||||
</h2> |
||||
{% endif %} |
||||
{{ title_suffix }} |
||||
|
||||
{% if display_submitted %} |
||||
<footer class="node__meta"> |
||||
{{ author_picture }} |
||||
<div{{ author_attributes.addClass('node__submitted') }}> |
||||
{% trans %}Submitted by {{ author_name }} on {{ date }}{% endtrans %} |
||||
{{ metadata }} |
||||
</div> |
||||
</footer> |
||||
{% endif %} |
||||
|
||||
<div{{ content_attributes.addClass('node__content') }}> |
||||
{{ content }} |
||||
</div> |
||||
|
||||
</article> |
@ -0,0 +1,19 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override for page titles. |
||||
* |
||||
* Available variables: |
||||
* - title_attributes: HTML attributes for the page title element. |
||||
* - title_prefix: Additional output populated by modules, intended to be |
||||
* displayed in front of the main title tag that appears in the template. |
||||
* - title: The page title, for use in the actual content. |
||||
* - title_suffix: Additional output populated by modules, intended to be |
||||
* displayed after the main title tag that appears in the template. |
||||
*/ |
||||
#} |
||||
{{ title_prefix }} |
||||
{% if title %} |
||||
<h1{{ title_attributes.addClass('page-title') }}>{{ title }}</h1> |
||||
{% endif %} |
||||
{{ title_suffix }} |
@ -0,0 +1,72 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override for displaying a single search result. |
||||
* |
||||
* This template renders a single search result. The list of results is |
||||
* rendered using '#theme' => 'item_list', with suggestions of: |
||||
* - item_list__search_results__(plugin_id) |
||||
* - item_list__search_results |
||||
* |
||||
* Available variables: |
||||
* - url: URL of the result. |
||||
* - title: Title of the result. |
||||
* - snippet: A small preview of the result. Does not apply to user searches. |
||||
* - info: String of all the meta information ready for print. Does not apply |
||||
* to user searches. |
||||
* - plugin_id: The machine-readable name of the plugin being executed,such |
||||
* as "node_search" or "user_search". |
||||
* - 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. |
||||
* - info_split: Contains same data as info, but split into separate parts. |
||||
* - info_split.type: Node type (or item type string supplied by module). |
||||
* - info_split.user: Author of the node linked to users profile. Depends |
||||
* on permission. |
||||
* - info_split.date: Last update of the node. Short formatted. |
||||
* - info_split.comment: Number of comments output as "% comments", % |
||||
* being the count. (Depends on comment.module). |
||||
* @todo The info variable needs to be made drillable and each of these sub |
||||
* items should instead be within info and renamed info.foo, info.bar, etc. |
||||
* |
||||
* Other variables: |
||||
* - title_attributes: HTML attributes for the title. |
||||
* - content_attributes: HTML attributes for the content. |
||||
* |
||||
* Since info_split is keyed, a direct print of the item is possible. |
||||
* This array does not apply to user searches so it is recommended to check |
||||
* for its existence before printing. The default keys of 'type', 'user' and |
||||
* 'date' always exist for node searches. Modules may provide other data. |
||||
* @code |
||||
* {% if (info_split.comment) %} |
||||
* <span class="info-comment"> |
||||
* {{ info_split.comment }} |
||||
* </span> |
||||
* {% endif %} |
||||
* @endcode |
||||
* |
||||
* To check for all available data within info_split, use the code below. |
||||
* @code |
||||
* <pre> |
||||
* {{ dump(info_split) }} |
||||
* </pre> |
||||
* @endcode |
||||
* |
||||
* @see template_preprocess_search_result() |
||||
*/ |
||||
#} |
||||
{{ attach_library('islandscholar/search-results') }} |
||||
{{ title_prefix }} |
||||
<h3{{ title_attributes.addClass('search-result__title') }}> |
||||
<a href="{{ url }}">{{ title }}</a> |
||||
</h3> |
||||
{{ title_suffix }} |
||||
<div class="search-result__snippet-info"> |
||||
{% if snippet %} |
||||
<p{{ content_attributes.addClass('search-result__snippet') }}>{{ snippet }}</p> |
||||
{% endif %} |
||||
{% if info %} |
||||
<p class="search-result__info">{{ info }}</p> |
||||
{% endif %} |
||||
</div> |
@ -0,0 +1,41 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override to display a taxonomy term. |
||||
* |
||||
* Available variables: |
||||
* - url: URL of the current term. |
||||
* - name: (optional) Name of the current term. |
||||
* - content: Items for the content of the term (fields and description). |
||||
* Use 'content' to print them all, or print a subset such as |
||||
* 'content.description'. Use the following code to exclude the |
||||
* printing of a given child element: |
||||
* @code |
||||
* {{ content|without('description') }} |
||||
* @endcode |
||||
* - attributes: HTML attributes for the wrapper. |
||||
* - page: Flag for the full page state. |
||||
* - term: The taxonomy term entity, including: |
||||
* - id: The ID of the taxonomy term. |
||||
* - bundle: Machine name of the current vocabulary. |
||||
* - view_mode: View mode, e.g. 'full', 'teaser', etc. |
||||
* |
||||
* @see template_preprocess_taxonomy_term() |
||||
*/ |
||||
#} |
||||
{% |
||||
set classes = [ |
||||
'taxonomy-term', |
||||
'vocabulary-' ~ term.bundle|clean_class, |
||||
] |
||||
%} |
||||
<div{{ attributes.setAttribute('id', 'taxonomy-term-' ~ term.id).addClass(classes) }}> |
||||
{{ title_prefix }} |
||||
{% if name and not page %} |
||||
<h2><a href="{{ url }}">{{ name }}</a></h2> |
||||
{% endif %} |
||||
{{ title_suffix }} |
||||
<div class="content"> |
||||
{{ content }} |
||||
</div> |
||||
</div> |
@ -0,0 +1,29 @@
|
||||
{% extends "item-list.html.twig" %} |
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override for an item list of search results. |
||||
* |
||||
* Available variables: |
||||
* - items: A list of items. Each item contains: |
||||
* - attributes: HTML attributes to be applied to each list item. |
||||
* - value: The content of the list element. |
||||
* - title: The title of the list. |
||||
* - list_type: The tag for list element ("ul" or "ol"). |
||||
* - attributes: HTML attributes to be applied to the list. |
||||
* - empty: A message to display when there are no items. Allowed value is a |
||||
* string or render array. |
||||
* - context: An list of contextual data associated with the list. For search |
||||
* results, the following data is set: |
||||
* - plugin: The search plugin ID, for example "node_search". |
||||
* |
||||
* @see template_preprocess_item_list() |
||||
*/ |
||||
#} |
||||
{% |
||||
set classes = [ |
||||
'search-results', |
||||
context.plugin ~ '-results', |
||||
] |
||||
%} |
||||
{% set attributes = attributes.addClass(classes) %} |
@ -0,0 +1,41 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override for an item list. |
||||
* |
||||
* Available variables: |
||||
* - items: A list of items. Each item contains: |
||||
* - attributes: HTML attributes to be applied to each list item. |
||||
* - value: The content of the list element. |
||||
* - title: The title of the list. |
||||
* - list_type: The tag for list element ("ul" or "ol"). |
||||
* - wrapper_attributes: HTML attributes to be applied to the list wrapper. |
||||
* - attributes: HTML attributes to be applied to the list. |
||||
* - empty: A message to display when there are no items. Allowed value is a |
||||
* string or render array. |
||||
* - context: A list of contextual data associated with the list. May contain: |
||||
* - list_style: The custom list style. |
||||
* |
||||
* @see template_preprocess_item_list() |
||||
*/ |
||||
#} |
||||
{% if context.list_style %} |
||||
{%- set wrapper_attributes = wrapper_attributes.addClass('item-list--' ~ context.list_style) %} |
||||
{%- set attributes = attributes.addClass('item-list__' ~ context.list_style) %} |
||||
{% endif %} |
||||
{% if items or empty -%} |
||||
<div{{ wrapper_attributes.addClass('item-list') }}> |
||||
{%- if title is not empty -%} |
||||
<h3>{{ title }}</h3> |
||||
{%- endif -%} |
||||
{%- if items -%} |
||||
<{{ list_type }}{{ attributes }}> |
||||
{%- for item in items -%} |
||||
<li{{ item.attributes }}>{{ item.value }}</li> |
||||
{%- endfor -%} |
||||
</{{ list_type }}> |
||||
{%- else -%} |
||||
{{- empty -}} |
||||
{%- endif -%} |
||||
</div> |
||||
{%- endif %} |
@ -0,0 +1,113 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override to display a table. |
||||
* |
||||
* Available variables: |
||||
* - attributes: HTML attributes to apply to the <table> tag. |
||||
* - caption: A localized string for the <caption> tag. |
||||
* - colgroups: Column groups. Each group contains the following properties: |
||||
* - attributes: HTML attributes to apply to the <col> tag. |
||||
* Note: Drupal currently supports only one table header row, see |
||||
* https://www.drupal.org/node/893530 and |
||||
* http://api.drupal.org/api/drupal/includes!theme.inc/function/theme_table/7#comment-5109. |
||||
* - header: Table header cells. Each cell contains the following properties: |
||||
* - tag: The HTML tag name to use; either 'th' or 'td'. |
||||
* - attributes: HTML attributes to apply to the tag. |
||||
* - content: A localized string for the title of the column. |
||||
* - field: Field name (required for column sorting). |
||||
* - sort: Default sort order for this column ("asc" or "desc"). |
||||
* - sticky: A flag indicating whether to use a "sticky" table header. |
||||
* - rows: Table rows. Each row contains the following properties: |
||||
* - attributes: HTML attributes to apply to the <tr> tag. |
||||
* - data: Table cells. |
||||
* - no_striping: A flag indicating that the row should receive no |
||||
* 'even / odd' styling. Defaults to FALSE. |
||||
* - cells: Table cells of the row. Each cell contains the following keys: |
||||
* - tag: The HTML tag name to use; either 'th' or 'td'. |
||||
* - attributes: Any HTML attributes, such as "colspan", to apply to the |
||||
* table cell. |
||||
* - content: The string to display in the table cell. |
||||
* - active_table_sort: A boolean indicating whether the cell is the active |
||||
table sort. |
||||
* - footer: Table footer rows, in the same format as the rows variable. |
||||
* - empty: The message to display in an extra row if table does not have |
||||
* any rows. |
||||
* - no_striping: A boolean indicating that the row should receive no striping. |
||||
* - header_columns: The number of columns in the header. |
||||
* |
||||
* @see template_preprocess_table() |
||||
*/ |
||||
#} |
||||
<table{{ attributes }}> |
||||
{% if caption %} |
||||
<caption>{{ caption }}</caption> |
||||
{% endif %} |
||||
|
||||
{% for colgroup in colgroups %} |
||||
{% if colgroup.cols %} |
||||
<colgroup{{ colgroup.attributes }}> |
||||
{% for col in colgroup.cols %} |
||||
<col{{ col.attributes }} /> |
||||
{% endfor %} |
||||
</colgroup> |
||||
{% else %} |
||||
<colgroup{{ colgroup.attributes }} /> |
||||
{% endif %} |
||||
{% endfor %} |
||||
|
||||
{% if header %} |
||||
<thead> |
||||
<tr> |
||||
{% for cell in header %} |
||||
{% |
||||
set cell_classes = [ |
||||
cell.active_table_sort ? 'is-active', |
||||
] |
||||
%} |
||||
<{{ cell.tag }}{{ cell.attributes.addClass(cell_classes) }}> |
||||
{{- cell.content -}} |
||||
</{{ cell.tag }}> |
||||
{% endfor %} |
||||
</tr> |
||||
</thead> |
||||
{% endif %} |
||||
|
||||
{% if rows %} |
||||
<tbody> |
||||
{% for row in rows %} |
||||
{% |
||||
set row_classes = [ |
||||
not no_striping ? cycle(['odd', 'even'], loop.index0), |
||||
] |
||||
%} |
||||
<tr{{ row.attributes.addClass(row_classes) }}> |
||||
{% for cell in row.cells %} |
||||
<{{ cell.tag }}{{ cell.attributes }}> |
||||
{{- cell.content -}} |
||||
</{{ cell.tag }}> |
||||
{% endfor %} |
||||
</tr> |
||||
{% endfor %} |
||||
</tbody> |
||||
{% elseif empty %} |
||||
<tbody> |
||||
<tr class="odd"> |
||||
<td colspan="{{ header_columns }}" class="empty message">{{ empty }}</td> |
||||
</tr> |
||||
</tbody> |
||||
{% endif %} |
||||
{% if footer %} |
||||
<tfoot> |
||||
{% for row in footer %} |
||||
<tr{{ row.attributes }}> |
||||
{% for cell in row.cells %} |
||||
<{{ cell.tag }}{{ cell.attributes }}> |
||||
{{- cell.content -}} |
||||
</{{ cell.tag }}> |
||||
{% endfor %} |
||||
</tr> |
||||
{% endfor %} |
||||
</tfoot> |
||||
{% endif %} |
||||
</table> |
@ -0,0 +1,57 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override for comment fields. |
||||
* |
||||
* Available variables: |
||||
* - attributes: HTML attributes for the containing element. |
||||
* - label_hidden: Whether to show the field label or not. |
||||
* - title_attributes: HTML attributes for the title. |
||||
* - label: The label for the field. |
||||
* - 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 title output populated by modules, intended to |
||||
* be displayed after the main title tag that appears in the template. |
||||
* - comments: List of comments rendered through comment.html.twig. |
||||
* - comment_form: The 'Add new comment' form. |
||||
* - comment_display_mode: Is the comments are threaded. |
||||
* - comment_type: The comment type bundle ID for the comment field. |
||||
* - entity_type: The entity type to which the field belongs. |
||||
* - field_name: The name of the field. |
||||
* - field_type: The type of the field. |
||||
* - label_display: The display settings for the label. |
||||
* |
||||
* @see template_preprocess_field() |
||||
* @see comment_preprocess_field() |
||||
*/ |
||||
#} |
||||
{% |
||||
set classes = [ |
||||
'field', |
||||
'field--name-' ~ field_name|clean_class, |
||||
'field--type-' ~ field_type|clean_class, |
||||
'field--label-' ~ label_display, |
||||
'comment-wrapper', |
||||
] |
||||
%} |
||||
{% |
||||
set title_classes = [ |
||||
'title', |
||||
label_display == 'visually_hidden' ? 'visually-hidden', |
||||
] |
||||
%} |
||||
<section{{ attributes.addClass(classes) }}> |
||||
{% if comments and not label_hidden %} |
||||
{{ title_prefix }} |
||||
<h2{{ title_attributes.addClass(title_classes) }}>{{ label }}</h2> |
||||
{{ title_suffix }} |
||||
{% endif %} |
||||
|
||||
{{ comments }} |
||||
|
||||
{% if comment_form %} |
||||
<h2 class="title comment-form__title">{{ 'Add new comment'|t }}</h2> |
||||
{{ comment_form }} |
||||
{% endif %} |
||||
|
||||
</section> |
@ -0,0 +1,44 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override for the node created field. |
||||
* |
||||
* This is an override of field.html.twig for the node created field. See that |
||||
* template for documentation about its details and overrides. |
||||
* |
||||
* Available variables: |
||||
* - attributes: HTML attributes for the containing span element. |
||||
* - items: List of all the field items. Each item contains: |
||||
* - attributes: List of HTML attributes for each item. |
||||
* - content: The field item content. |
||||
* - entity_type: The entity type to which the field belongs. |
||||
* - field_name: The name of the field. |
||||
* - field_type: The type of the field. |
||||
* - label_display: The display settings for the label. |
||||
* - is_inline: If false, display an ordinary field. |
||||
* If true, display an inline format, suitable for inside elements such as |
||||
* <span>, <h2> and so on. |
||||
* |
||||
* @see field.html.twig |
||||
* @see node_preprocess_field__node() |
||||
* |
||||
* @todo Delete as part of https://www.drupal.org/node/3015623 |
||||
*/ |
||||
#} |
||||
{% if not is_inline %} |
||||
{% include "field.html.twig" %} |
||||
{% else %} |
||||
{% |
||||
set classes = [ |
||||
'field', |
||||
'field--name-' ~ field_name|clean_class, |
||||
'field--type-' ~ field_type|clean_class, |
||||
'field--label-' ~ label_display, |
||||
] |
||||
%} |
||||
<span{{ attributes.addClass(classes) }}> |
||||
{%- for item in items -%} |
||||
{{ item.content }} |
||||
{%- endfor -%} |
||||
</span> |
||||
{% endif %} |
@ -0,0 +1,44 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override for the node title field. |
||||
* |
||||
* This is an override of field.html.twig for the node title field. See that |
||||
* template for documentation about its details and overrides. |
||||
* |
||||
* Available variables: |
||||
* - attributes: HTML attributes for the containing span element. |
||||
* - items: List of all the field items. Each item contains: |
||||
* - attributes: List of HTML attributes for each item. |
||||
* - content: The field item content. |
||||
* - entity_type: The entity type to which the field belongs. |
||||
* - field_name: The name of the field. |
||||
* - field_type: The type of the field. |
||||
* - label_display: The display settings for the label. |
||||
* - is_inline: If false, display an ordinary field. |
||||
* If true, display an inline format, suitable for inside elements such as |
||||
* <span>, <h2> and so on. |
||||
* |
||||
* @see field.html.twig |
||||
* @see node_preprocess_field__node() |
||||
* |
||||
* @todo Delete as part of https://www.drupal.org/node/3015623 |
||||
*/ |
||||
#} |
||||
{% if not is_inline %} |
||||
{% include "field.html.twig" %} |
||||
{% else %} |
||||
{% |
||||
set classes = [ |
||||
'field', |
||||
'field--name-' ~ field_name|clean_class, |
||||
'field--type-' ~ field_type|clean_class, |
||||
'field--label-' ~ label_display, |
||||
] |
||||
%} |
||||
<span{{ attributes.addClass(classes) }}> |
||||
{%- for item in items -%} |
||||
{{ item.content }} |
||||
{%- endfor -%} |
||||
</span> |
||||
{% endif %} |
@ -0,0 +1,44 @@
|
||||
{# |
||||
/** |
||||
* @file |
||||
* Theme override for the node user field. |
||||
* |
||||
* This is an override of field.html.twig for the node user field. See that |
||||
* template for documentation about its details and overrides. |
||||
* |
||||
* Available variables: |
||||
* - attributes: HTML attributes for the containing span element. |
||||
* - items: List of all the field items. Each item contains: |
||||
* - attributes: List of HTML attributes for each item. |
||||
* - content: The field item content. |
||||
* - entity_type: The entity type to which the field belongs. |
||||
* - field_name: The name of the field. |
||||
* - field_type: The type of the field. |
||||
* - label_display: The display settings for the label. |
||||
* - is_inline: If false, display an ordinary field. |
||||
* If true, display an inline format, suitable for inside elements such as |
||||
* <span>, <h2> and so on. |
||||
* |
||||
* @see field.html.twig |
||||
* @see node_preprocess_field__node() |
||||
* |
||||
* @todo Delete as part of https://www.drupal.org/node/3015623 |
||||
*/ |
||||
#} |
||||
{% if not is_inline %} |
||||
{% include "field.html.twig" %} |
||||
{% else %} |
||||
{% |
||||
set classes = [ |
||||
'field', |
||||
'field--name-' ~ field_name|clean_class, |
||||
'field--type-' ~ field_type|clean_class, |
||||
'field--label-' ~ label_display, |
||||
] |
||||
%} |
||||
<span{{ attributes.addClass(classes) }}> |
||||
{%- for item in items -%} |
||||
{{ item.content }} |
||||
{%- endfor -%} |
||||
</span> |
||||
{% endif %} |
@ -0,0 +1 @@
|
||||
{% extends "field--text.html.twig" %} |
@ -0,0 +1 @@
|
||||
{% extends "field--text.html.twig" %} |
@ -0,0 +1,28 @@
|
||||
{% extends "field.html.twig" %} |
||||
{# |
||||
/** |
||||
* @file |
||||
* Default theme implementation for a text field. |
||||
* |
||||
* A 'clearfix' class is added, because 'text' fields have a 'format' property |
||||
* that allows a Text Format to be associated with the entered text, which then |
||||
* applies filtering on output. A common use case is to align images to the left |
||||
* or right, and without this 'clearfix' class, such aligned images may be |
||||
* rendered outside of the 'text' field formatter's boundaries, and hence |
||||
* overlap with other fields. By setting the 'clearfix' class on all 'text' |
||||
* fields, we prevent that. |
||||
* |
||||
* @see https://www.drupal.org/node/2358529 |
||||
* |
||||
* A 'text-formatted' class is added to assist with default styling of base |
||||
* elements such as paragraphs and lists that may not have classes assigned to |
||||
* them. This allows user entered content to have default styling without |
||||
* interfering with the styles of other UI components such as system generated |
||||
* lists or other dynamic content. |
||||
* |
||||
* @see https://www.drupal.org/node/2539860 |
||||
* |
||||
* @ingroup themeable |
||||
*/ |
||||
#} |
||||
{% set attributes = attributes.addClass('clearfix', 'text-formatted') %} |