From d14148e6cb7cb25e9d0f4fb9cb1c3293c359ac64 Mon Sep 17 00:00:00 2001 From: rdrew Date: Wed, 20 Sep 2023 12:47:28 -0300 Subject: [PATCH] 1st --- README.md | 1 + config.yml | 44 +++++++ css/components/action-links.css | 43 +++++++ css/components/breadcrumb.css | 29 +++++ css/components/button.css | 15 +++ css/components/container-inline.css | 22 ++++ css/components/details.css | 23 ++++ css/components/dialog.css | 72 +++++++++++ css/components/dropbutton.css | 33 +++++ css/components/exposed-filters.css | 46 +++++++ css/components/field.css | 25 ++++ css/components/file.css | 62 +++++++++ css/components/form.css | 104 +++++++++++++++ css/components/icons.css | 21 +++ css/components/image-widget.css | 22 ++++ css/components/indented.css | 15 +++ css/components/inline-form.css | 33 +++++ css/components/item-list.css | 32 +++++ css/components/link.css | 16 +++ css/components/links.css | 23 ++++ css/components/menu.css | 34 +++++ css/components/messages.css | 69 ++++++++++ css/components/more-link.css | 12 ++ css/components/node.css | 8 ++ css/components/pager.css | 16 +++ css/components/progress.css | 55 ++++++++ css/components/search-results.css | 8 ++ css/components/tabledrag.css | 14 ++ css/components/tableselect.css | 19 +++ css/components/tablesort.css | 11 ++ css/components/tabs.css | 33 +++++ css/components/textarea.css | 11 ++ css/components/ui-dialog.css | 15 +++ css/components/user.css | 67 ++++++++++ gulpfile.js | 110 ++++++++++++++++ images/icons/application-octet-stream.png | Bin 0 -> 189 bytes images/icons/application-pdf.png | Bin 0 -> 346 bytes images/icons/application-x-executable.png | Bin 0 -> 189 bytes images/icons/audio-x-generic.png | Bin 0 -> 314 bytes images/icons/check.svg | 1 + images/icons/error.svg | 1 + images/icons/feed.svg | 8 ++ images/icons/help.png | Bin 0 -> 294 bytes images/icons/image-x-generic.png | Bin 0 -> 385 bytes images/icons/loading-small.gif | Bin 0 -> 2112 bytes images/icons/menu-collapsed-rtl.png | Bin 0 -> 107 bytes images/icons/menu-collapsed.png | Bin 0 -> 105 bytes images/icons/menu-expanded.png | Bin 0 -> 106 bytes images/icons/package-x-generic.png | Bin 0 -> 260 bytes images/icons/required.svg | 1 + images/icons/text-html.png | Bin 0 -> 265 bytes images/icons/text-plain.png | Bin 0 -> 220 bytes images/icons/text-x-generic.png | Bin 0 -> 220 bytes images/icons/text-x-script.png | Bin 0 -> 276 bytes images/icons/video-x-generic.png | Bin 0 -> 214 bytes images/icons/warning.svg | 1 + images/icons/x-office-document.png | Bin 0 -> 196 bytes images/icons/x-office-presentation.png | Bin 0 -> 181 bytes images/icons/x-office-spreadsheet.png | Bin 0 -> 183 bytes islandscholar.info.yml | 22 ++++ islandscholar.libraries.yml | 105 +++++++++++++++ islandscholar.theme | 21 +++ logo.svg | 1 + package.json | 38 ++++++ screenshot.png | Bin 0 -> 33645 bytes src/StarterKit.php | 20 +++ .../block--local-actions-block.html.twig | 12 ++ .../block/block--local-tasks-block.html.twig | 14 ++ .../block/block--search-form-block.html.twig | 46 +++++++ .../block--system-branding-block.html.twig | 30 +++++ .../block/block--system-menu-block.html.twig | 57 +++++++++ templates/block/block.html.twig | 45 +++++++ .../content-edit/file-managed-file.html.twig | 22 ++++ .../content-edit/file-upload-help.html.twig | 12 ++ .../file-widget-multiple.html.twig | 14 ++ .../content-edit/filter-caption.html.twig | 18 +++ .../content-edit/filter-guidelines.html.twig | 29 +++++ templates/content-edit/filter-tips.html.twig | 61 +++++++++ templates/content-edit/image-widget.html.twig | 23 ++++ .../content-edit/node-add-list.html.twig | 30 +++++ .../content-edit/node-edit-form.html.twig | 26 ++++ .../text-format-wrapper.html.twig | 26 ++++ templates/content/comment.html.twig | 111 ++++++++++++++++ templates/content/links--node.html.twig | 40 ++++++ templates/content/mark.html.twig | 20 +++ templates/content/media.html.twig | 28 ++++ templates/content/node.html.twig | 105 +++++++++++++++ templates/content/page-title.html.twig | 19 +++ templates/content/search-result.html.twig | 72 +++++++++++ templates/content/taxonomy-term.html.twig | 41 ++++++ .../item-list--search-results.html.twig | 29 +++++ templates/dataset/item-list.html.twig | 41 ++++++ templates/dataset/table.html.twig | 113 +++++++++++++++++ templates/field/field--comment.html.twig | 57 +++++++++ .../field/field--node--created.html.twig | 44 +++++++ templates/field/field--node--title.html.twig | 44 +++++++ templates/field/field--node--uid.html.twig | 44 +++++++ templates/field/field--text-long.html.twig | 1 + .../field/field--text-with-summary.html.twig | 1 + templates/field/field--text.html.twig | 28 ++++ templates/field/field.html.twig | 81 ++++++++++++ templates/field/file-audio.html.twig | 23 ++++ templates/field/file-link.html.twig | 16 +++ templates/field/file-video.html.twig | 23 ++++ templates/field/image-formatter.html.twig | 18 +++ templates/field/image-style.html.twig | 18 +++ templates/field/image.html.twig | 18 +++ .../link-formatter-link-separate.html.twig | 22 ++++ templates/field/time.html.twig | 22 ++++ templates/form/checkboxes.html.twig | 15 +++ templates/form/confirm-form.html.twig | 13 ++ templates/form/container.html.twig | 28 ++++ templates/form/datetime-form.html.twig | 15 +++ templates/form/datetime-wrapper.html.twig | 36 ++++++ templates/form/details.html.twig | 44 +++++++ templates/form/dropbutton-wrapper.html.twig | 20 +++ .../form/field-multiple-value-form.html.twig | 42 ++++++ templates/form/fieldset.html.twig | 60 +++++++++ templates/form/form-element-label.html.twig | 25 ++++ templates/form/form-element.html.twig | 95 ++++++++++++++ templates/form/form.html.twig | 15 +++ templates/form/input.html.twig | 13 ++ templates/form/radios.html.twig | 13 ++ templates/form/select.html.twig | 27 ++++ templates/form/textarea.html.twig | 25 ++++ templates/layout/html.html.twig | 55 ++++++++ templates/layout/maintenance-page.html.twig | 65 ++++++++++ templates/layout/page.html.twig | 87 +++++++++++++ templates/layout/region.html.twig | 25 ++++ templates/misc/progress-bar.html.twig | 22 ++++ templates/misc/status-messages.html.twig | 55 ++++++++ templates/navigation/breadcrumb.html.twig | 25 ++++ templates/navigation/links.html.twig | 55 ++++++++ .../navigation/menu-local-action.html.twig | 13 ++ .../navigation/menu-local-task.html.twig | 17 +++ .../navigation/menu-local-tasks.html.twig | 21 +++ templates/navigation/menu.html.twig | 55 ++++++++ templates/navigation/pager.html.twig | 99 +++++++++++++++ templates/navigation/vertical-tabs.html.twig | 13 ++ templates/user/user.html.twig | 23 ++++ templates/user/username.html.twig | 29 +++++ templates/views/views-exposed-form.html.twig | 21 +++ templates/views/views-mini-pager.html.twig | 42 ++++++ templates/views/views-view-grid.html.twig | 76 +++++++++++ templates/views/views-view-grouping.html.twig | 20 +++ templates/views/views-view-list.html.twig | 38 ++++++ .../views-view-summary-unformatted.html.twig | 31 +++++ templates/views/views-view-summary.html.twig | 31 +++++ templates/views/views-view-table.html.twig | 120 ++++++++++++++++++ .../views/views-view-unformatted.html.twig | 30 +++++ templates/views/views-view.html.twig | 95 ++++++++++++++ 151 files changed, 4575 insertions(+) create mode 100644 README.md create mode 100755 config.yml create mode 100644 css/components/action-links.css create mode 100644 css/components/breadcrumb.css create mode 100644 css/components/button.css create mode 100644 css/components/container-inline.css create mode 100644 css/components/details.css create mode 100644 css/components/dialog.css create mode 100644 css/components/dropbutton.css create mode 100644 css/components/exposed-filters.css create mode 100644 css/components/field.css create mode 100644 css/components/file.css create mode 100644 css/components/form.css create mode 100644 css/components/icons.css create mode 100644 css/components/image-widget.css create mode 100644 css/components/indented.css create mode 100644 css/components/inline-form.css create mode 100644 css/components/item-list.css create mode 100644 css/components/link.css create mode 100644 css/components/links.css create mode 100644 css/components/menu.css create mode 100644 css/components/messages.css create mode 100644 css/components/more-link.css create mode 100644 css/components/node.css create mode 100644 css/components/pager.css create mode 100644 css/components/progress.css create mode 100644 css/components/search-results.css create mode 100644 css/components/tabledrag.css create mode 100644 css/components/tableselect.css create mode 100644 css/components/tablesort.css create mode 100644 css/components/tabs.css create mode 100644 css/components/textarea.css create mode 100644 css/components/ui-dialog.css create mode 100644 css/components/user.css create mode 100755 gulpfile.js create mode 100644 images/icons/application-octet-stream.png create mode 100644 images/icons/application-pdf.png create mode 100644 images/icons/application-x-executable.png create mode 100644 images/icons/audio-x-generic.png create mode 100644 images/icons/check.svg create mode 100644 images/icons/error.svg create mode 100644 images/icons/feed.svg create mode 100644 images/icons/help.png create mode 100644 images/icons/image-x-generic.png create mode 100644 images/icons/loading-small.gif create mode 100644 images/icons/menu-collapsed-rtl.png create mode 100644 images/icons/menu-collapsed.png create mode 100644 images/icons/menu-expanded.png create mode 100644 images/icons/package-x-generic.png create mode 100644 images/icons/required.svg create mode 100644 images/icons/text-html.png create mode 100644 images/icons/text-plain.png create mode 100644 images/icons/text-x-generic.png create mode 100644 images/icons/text-x-script.png create mode 100644 images/icons/video-x-generic.png create mode 100644 images/icons/warning.svg create mode 100644 images/icons/x-office-document.png create mode 100644 images/icons/x-office-presentation.png create mode 100644 images/icons/x-office-spreadsheet.png create mode 100644 islandscholar.info.yml create mode 100644 islandscholar.libraries.yml create mode 100644 islandscholar.theme create mode 100644 logo.svg create mode 100755 package.json create mode 100644 screenshot.png create mode 100644 src/StarterKit.php create mode 100644 templates/block/block--local-actions-block.html.twig create mode 100644 templates/block/block--local-tasks-block.html.twig create mode 100644 templates/block/block--search-form-block.html.twig create mode 100644 templates/block/block--system-branding-block.html.twig create mode 100644 templates/block/block--system-menu-block.html.twig create mode 100644 templates/block/block.html.twig create mode 100644 templates/content-edit/file-managed-file.html.twig create mode 100644 templates/content-edit/file-upload-help.html.twig create mode 100644 templates/content-edit/file-widget-multiple.html.twig create mode 100644 templates/content-edit/filter-caption.html.twig create mode 100644 templates/content-edit/filter-guidelines.html.twig create mode 100644 templates/content-edit/filter-tips.html.twig create mode 100644 templates/content-edit/image-widget.html.twig create mode 100644 templates/content-edit/node-add-list.html.twig create mode 100644 templates/content-edit/node-edit-form.html.twig create mode 100644 templates/content-edit/text-format-wrapper.html.twig create mode 100644 templates/content/comment.html.twig create mode 100644 templates/content/links--node.html.twig create mode 100644 templates/content/mark.html.twig create mode 100644 templates/content/media.html.twig create mode 100644 templates/content/node.html.twig create mode 100644 templates/content/page-title.html.twig create mode 100644 templates/content/search-result.html.twig create mode 100644 templates/content/taxonomy-term.html.twig create mode 100644 templates/dataset/item-list--search-results.html.twig create mode 100644 templates/dataset/item-list.html.twig create mode 100644 templates/dataset/table.html.twig create mode 100644 templates/field/field--comment.html.twig create mode 100644 templates/field/field--node--created.html.twig create mode 100644 templates/field/field--node--title.html.twig create mode 100644 templates/field/field--node--uid.html.twig create mode 100644 templates/field/field--text-long.html.twig create mode 100644 templates/field/field--text-with-summary.html.twig create mode 100644 templates/field/field--text.html.twig create mode 100644 templates/field/field.html.twig create mode 100644 templates/field/file-audio.html.twig create mode 100644 templates/field/file-link.html.twig create mode 100644 templates/field/file-video.html.twig create mode 100644 templates/field/image-formatter.html.twig create mode 100644 templates/field/image-style.html.twig create mode 100644 templates/field/image.html.twig create mode 100644 templates/field/link-formatter-link-separate.html.twig create mode 100644 templates/field/time.html.twig create mode 100644 templates/form/checkboxes.html.twig create mode 100644 templates/form/confirm-form.html.twig create mode 100644 templates/form/container.html.twig create mode 100644 templates/form/datetime-form.html.twig create mode 100644 templates/form/datetime-wrapper.html.twig create mode 100644 templates/form/details.html.twig create mode 100644 templates/form/dropbutton-wrapper.html.twig create mode 100644 templates/form/field-multiple-value-form.html.twig create mode 100644 templates/form/fieldset.html.twig create mode 100644 templates/form/form-element-label.html.twig create mode 100644 templates/form/form-element.html.twig create mode 100644 templates/form/form.html.twig create mode 100644 templates/form/input.html.twig create mode 100644 templates/form/radios.html.twig create mode 100644 templates/form/select.html.twig create mode 100644 templates/form/textarea.html.twig create mode 100644 templates/layout/html.html.twig create mode 100644 templates/layout/maintenance-page.html.twig create mode 100644 templates/layout/page.html.twig create mode 100644 templates/layout/region.html.twig create mode 100644 templates/misc/progress-bar.html.twig create mode 100644 templates/misc/status-messages.html.twig create mode 100644 templates/navigation/breadcrumb.html.twig create mode 100644 templates/navigation/links.html.twig create mode 100644 templates/navigation/menu-local-action.html.twig create mode 100644 templates/navigation/menu-local-task.html.twig create mode 100644 templates/navigation/menu-local-tasks.html.twig create mode 100644 templates/navigation/menu.html.twig create mode 100644 templates/navigation/pager.html.twig create mode 100644 templates/navigation/vertical-tabs.html.twig create mode 100644 templates/user/user.html.twig create mode 100644 templates/user/username.html.twig create mode 100644 templates/views/views-exposed-form.html.twig create mode 100644 templates/views/views-mini-pager.html.twig create mode 100644 templates/views/views-view-grid.html.twig create mode 100644 templates/views/views-view-grouping.html.twig create mode 100644 templates/views/views-view-list.html.twig create mode 100644 templates/views/views-view-summary-unformatted.html.twig create mode 100644 templates/views/views-view-summary.html.twig create mode 100644 templates/views/views-view-table.html.twig create mode 100644 templates/views/views-view-unformatted.html.twig create mode 100644 templates/views/views-view.html.twig diff --git a/README.md b/README.md new file mode 100644 index 0000000..7024d8b --- /dev/null +++ b/README.md @@ -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). \ No newline at end of file diff --git a/config.yml b/config.yml new file mode 100755 index 0000000..6d3ee50 --- /dev/null +++ b/config.yml @@ -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 + diff --git a/css/components/action-links.css b/css/components/action-links.css new file mode 100644 index 0000000..274d798 --- /dev/null +++ b/css/components/action-links.css @@ -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; +} diff --git a/css/components/breadcrumb.css b/css/components/breadcrumb.css new file mode 100644 index 0000000..1e6a7fa --- /dev/null +++ b/css/components/breadcrumb.css @@ -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; +} diff --git a/css/components/button.css b/css/components/button.css new file mode 100644 index 0000000..5eb4f1a --- /dev/null +++ b/css/components/button.css @@ -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; +} diff --git a/css/components/container-inline.css b/css/components/container-inline.css new file mode 100644 index 0000000..64b78f6 --- /dev/null +++ b/css/components/container-inline.css @@ -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; +} diff --git a/css/components/details.css b/css/components/details.css new file mode 100644 index 0000000..a546363 --- /dev/null +++ b/css/components/details.css @@ -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; +} diff --git a/css/components/dialog.css b/css/components/dialog.css new file mode 100644 index 0000000..16e1770 --- /dev/null +++ b/css/components/dialog.css @@ -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; +} diff --git a/css/components/dropbutton.css b/css/components/dropbutton.css new file mode 100644 index 0000000..5e971ba --- /dev/null +++ b/css/components/dropbutton.css @@ -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; +} diff --git a/css/components/exposed-filters.css b/css/components/exposed-filters.css new file mode 100644 index 0000000..b686902 --- /dev/null +++ b/css/components/exposed-filters.css @@ -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; +} diff --git a/css/components/field.css b/css/components/field.css new file mode 100644 index 0000000..ff7e9ab --- /dev/null +++ b/css/components/field.css @@ -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: ":"; +} diff --git a/css/components/file.css b/css/components/file.css new file mode 100644 index 0000000..9aa90eb --- /dev/null +++ b/css/components/file.css @@ -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); +} diff --git a/css/components/form.css b/css/components/form.css new file mode 100644 index 0000000..b840022 --- /dev/null +++ b/css/components/form.css @@ -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; +} diff --git a/css/components/icons.css b/css/components/icons.css new file mode 100644 index 0000000..2733758 --- /dev/null +++ b/css/components/icons.css @@ -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; +} diff --git a/css/components/image-widget.css b/css/components/image-widget.css new file mode 100644 index 0000000..72e52a2 --- /dev/null +++ b/css/components/image-widget.css @@ -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; +} diff --git a/css/components/indented.css b/css/components/indented.css new file mode 100644 index 0000000..65ae061 --- /dev/null +++ b/css/components/indented.css @@ -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; +} diff --git a/css/components/inline-form.css b/css/components/inline-form.css new file mode 100644 index 0000000..b5201a7 --- /dev/null +++ b/css/components/inline-form.css @@ -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; +} diff --git a/css/components/item-list.css b/css/components/item-list.css new file mode 100644 index 0000000..a8ce5d2 --- /dev/null +++ b/css/components/item-list.css @@ -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; +} diff --git a/css/components/link.css b/css/components/link.css new file mode 100644 index 0000000..fa83f2b --- /dev/null +++ b/css/components/link.css @@ -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; +} diff --git a/css/components/links.css b/css/components/links.css new file mode 100644 index 0000000..e483253 --- /dev/null +++ b/css/components/links.css @@ -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; +} diff --git a/css/components/menu.css b/css/components/menu.css new file mode 100644 index 0000000..df73324 --- /dev/null +++ b/css/components/menu.css @@ -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; +} diff --git a/css/components/messages.css b/css/components/messages.css new file mode 100644 index 0000000..be25930 --- /dev/null +++ b/css/components/messages.css @@ -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; +} diff --git a/css/components/more-link.css b/css/components/more-link.css new file mode 100644 index 0000000..c604061 --- /dev/null +++ b/css/components/more-link.css @@ -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; +} diff --git a/css/components/node.css b/css/components/node.css new file mode 100644 index 0000000..6b7cd52 --- /dev/null +++ b/css/components/node.css @@ -0,0 +1,8 @@ +/** + * @file + * Visual styles for nodes. + */ + +.node--unpublished { + background-color: #fff4f4; +} diff --git a/css/components/pager.css b/css/components/pager.css new file mode 100644 index 0000000..a9471fc --- /dev/null +++ b/css/components/pager.css @@ -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; +} diff --git a/css/components/progress.css b/css/components/progress.css new file mode 100644 index 0000000..91d793b --- /dev/null +++ b/css/components/progress.css @@ -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; } +} diff --git a/css/components/search-results.css b/css/components/search-results.css new file mode 100644 index 0000000..343ea8b --- /dev/null +++ b/css/components/search-results.css @@ -0,0 +1,8 @@ +/** + * @file + * Stylesheet for results generated by the Search module. + */ + +.search-results { + list-style: none; +} diff --git a/css/components/tabledrag.css b/css/components/tabledrag.css new file mode 100644 index 0000000..a197b24 --- /dev/null +++ b/css/components/tabledrag.css @@ -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; +} diff --git a/css/components/tableselect.css b/css/components/tableselect.css new file mode 100644 index 0000000..fcfb2a5 --- /dev/null +++ b/css/components/tableselect.css @@ -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; +} diff --git a/css/components/tablesort.css b/css/components/tablesort.css new file mode 100644 index 0000000..44e5349 --- /dev/null +++ b/css/components/tablesort.css @@ -0,0 +1,11 @@ +/** + * @file + * Table sort indicator. + */ + +th.is-active img { + display: inline; +} +td.is-active { + background-color: #ddd; +} diff --git a/css/components/tabs.css b/css/components/tabs.css new file mode 100644 index 0000000..16fb122 --- /dev/null +++ b/css/components/tabs.css @@ -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; +} diff --git a/css/components/textarea.css b/css/components/textarea.css new file mode 100644 index 0000000..2661bae --- /dev/null +++ b/css/components/textarea.css @@ -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; +} diff --git a/css/components/ui-dialog.css b/css/components/ui-dialog.css new file mode 100644 index 0000000..164ca86 --- /dev/null +++ b/css/components/ui-dialog.css @@ -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%; + } +} diff --git a/css/components/user.css b/css/components/user.css new file mode 100644 index 0000000..7892fd6 --- /dev/null +++ b/css/components/user.css @@ -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; +} diff --git a/gulpfile.js b/gulpfile.js new file mode 100755 index 0000000..2670961 --- /dev/null +++ b/gulpfile.js @@ -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; diff --git a/images/icons/application-octet-stream.png b/images/icons/application-octet-stream.png new file mode 100644 index 0000000000000000000000000000000000000000..d5453217dc5cc30e805d3d0da8fa91e5a0684b86 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%#e2FqhG+zzJ-d;!!9l>~;>xRRItLPdn;40odGgNTFWaMo z@1hz$UuIWs>A8|(q_~9L#B04>N(sX=If;bjynH&g_hvsjaH~4qVneIY4QI|P0Zi^1 ljW)lfGh!A#J6O(fSJQPye(j97H9)HvJYD@<);T3K0RUpoL@EFP literal 0 HcmV?d00001 diff --git a/images/icons/application-pdf.png b/images/icons/application-pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..36107d6e804015e13d122c53cb035d33632678d2 GIT binary patch literal 346 zcmV-g0j2(lP)La-N5`rLZPA(1#E-uBP;35>7mbRp6V}6(B zxT4lv`iCzikbIyi{Q#h{EDII-mgRekb58(c43yGRNs>GwUs@m^+qO%|$q)WL@3K!V z;5g1}1@I8n0(zm5zgL_2`K;FIZug6JyK<450fiioh$j<32(aZc2h>-%U#~`>7&@PWUoHyp sTP;<(-4=lMXA(mEo7|%ZD)t2Y023%F88v7N^Z)<=07*qoM6N<$f}Na{Gynhq literal 0 HcmV?d00001 diff --git a/images/icons/application-x-executable.png b/images/icons/application-x-executable.png new file mode 100644 index 0000000000000000000000000000000000000000..d5453217dc5cc30e805d3d0da8fa91e5a0684b86 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%#e2FqhG+zzJ-d;!!9l>~;>xRRItLPdn;40odGgNTFWaMo z@1hz$UuIWs>A8|(q_~9L#B04>N(sX=If;bjynH&g_hvsjaH~4qVneIY4QI|P0Zi^1 ljW)lfGh!A#J6O(fSJQPye(j97H9)HvJYD@<);T3K0RUpoL@EFP literal 0 HcmV?d00001 diff --git a/images/icons/audio-x-generic.png b/images/icons/audio-x-generic.png new file mode 100644 index 0000000000000000000000000000000000000000..28d7f50862b5dbb153c0809e9119fd879d499788 GIT binary patch literal 314 zcmV-A0mc4_P)5%T71{KX7x!|A(({5NE)j zKYzd&q!`9V79(f?48Rm)6QjQYVbB1LUL;A_0Q3+Cf#UU6|05QN{GWC>hp+*`b9w(~ ztkn8{>(wc^0e}Af`v3jc=l}oy{l#wpC^P;0_YW@ysljOgDHx^?00QtBn;M+ki2wiq M07*qoM6N<$f-Y{2(f|Me literal 0 HcmV?d00001 diff --git a/images/icons/check.svg b/images/icons/check.svg new file mode 100644 index 0000000..566cbc4 --- /dev/null +++ b/images/icons/check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/icons/error.svg b/images/icons/error.svg new file mode 100644 index 0000000..151a1e6 --- /dev/null +++ b/images/icons/error.svg @@ -0,0 +1 @@ + diff --git a/images/icons/feed.svg b/images/icons/feed.svg new file mode 100644 index 0000000..595a9d9 --- /dev/null +++ b/images/icons/feed.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/images/icons/help.png b/images/icons/help.png new file mode 100644 index 0000000000000000000000000000000000000000..dcc5cac7956f6e1d0733695af8db4cffcef90d84 GIT binary patch literal 294 zcmV+>0oneEP)k6=i+$|ut04+82eJ`lGt}WoX0r-buA*6B835sHf1qg}b;EwlWfVOP~ zHP16TISjx~Q0s9(wYQ+_IzVFayai-?i<+iEj2Pg;2dRie*fWnoX9gq`1=)2w*_`rG s=6M(+ZRhxMY?v5y1?;Pv4iHb{8>d3#gQ^L1<^TWy07*qoM6N<$g2Q@xc>n+a literal 0 HcmV?d00001 diff --git a/images/icons/image-x-generic.png b/images/icons/image-x-generic.png new file mode 100644 index 0000000000000000000000000000000000000000..c1b814f7cb6f4a21e165e88db557ffe4692babad GIT binary patch literal 385 zcmV-{0e=38P)FC&>@3L6hucw#aRRw7eSoFNmQtbU{mn3 zG)bWvQA}=a@|t^w&{~q{frt0-Cij6$A^;#HNx~n<`Uo5VM1z1a2HUoqa2%&zG8-!3 zQ$Fi&f{(mN&$+<$nGO|v-Y>&tI*0bR>mlk_mKv^NhYGy!3Xfp_$dBUJkR)7CBSEm+ z&tvt(3u@Myf6#wou4^f%sv0f8 z*HjeoSE!n4RLf~FV*++@oRT_|x_E(p+6OB)jCW;(vT`wi(n&A<53g5)@q(wrBp&v= zpzVk#>~-StpqsjvqZDPVASbuub|ZoOwg_!k#NB2GZdR#-x}Jy^TxQ#%h!!x$=sQP1 f?}Q5eK_K`6dFPSxL!-G(ZEN0l@R;&!0VeHaj~zGc$Ad?%k=Wsfme+k&%(}=g*%$eY&@| zx2LD4y}iA;x!Ldcd%a$d$5U2T=61V_i;MH~^YilZa&mIg)6;D>o5f-=8jVp=Q5uZ~ z!!Z72005$%Bg->au2`Iwn`xaFF9cs~eJ2u20Tzhk*Zd`D01*H8UQFYI`ODUyXk3ED zxvyN++QFpM(*8|9Q7p5Egbv#wpF!Ux5mbup#Y36|oiD>$7)tUFrKS#Tvj!a-b{=%Z z8772J&V66bNmu_e`wf){qRI^#lGs)nsiW6e7{)}AjSKZOtyhRdNHEM07)EI+NGui+ zUb9-!rKEp-T=+q_ufOfkdxsZxcJ**g2g2EH`k!tb*&XcV7zK=|u5mObCoU|)p$MpB z$0UZz(BUx!B#D6C3`MPBBu$R5agCnmrcH5o&i(HLQaHl}knE%xex4MY>rlFzvPfK(S z@GGvUvjuF%+)B&HZgm=nIoN;2re=#DX=V| zZP6;q8ttuRv51J=088P7M3Vgqy=L1@}L!tBxRo?z2~Kr8Oye8=_lexufMj=f+| zqH^_+0aqR|5HKQ@>xZn<6n@vq@f+=+DlZ_OI7&d1^8+g55BK3#T~aQ!-*Xm&tdJie%4_B zXF=}#6E(=pS`3vWS@k&g+La39Wi(|%p&%S8d`x3f6Unp!o24DQ|7t0x zXP=xjP_rH1b7$Z7z7%x&1?a}LJSbM3>K+VE70%g|lCLzZg1o)MPcsMYVbF*3>>WF_Eg)56Gk0FXPQVQ?ma__1u$b&@uA`) z21W!-$_Mr2C>GGtv{pxhlYsOlM~^9rDICw%!S{$iKOkeZ8k`_5WXh2zX3xK$e1~7^ zEa*kPop*~1-e2v1sn~ybfxY839{a|Co-_Ev+B@0;!!>KYsrg_@o34U` zKtY~SHB2nkX_T0T6A6SYYSdiDGZ@|*XzRt_4c=8HN8%43;*oji;{`hMDL{^%(IW!U zxBuEVapFflgM6{6`D*(U&l~+Pi9G({q2JHn)^+A&oikiMa@DXr_@z|%Zc1KU)8VXzT^_4ucOtb;jpNj> z-j+o~U=>6Vr>i*<3P@C%AklPyZD~v1v$r7;4eaBpSltoMYtrdxrf+xE*=Pm^MdYU@ z7_$CG4vdMIL|7yimgsfTF#v4lN;Hso^0zmMDY#FMfHS)(j>y@NS?0*oMOveo zqU|h+GrAi6B0a(f;t43E(h33$0a&$_k|Nz|vORRT=4dzK;OncVrA=S&3vm1NRi8xH zafk?tH>nUC86*uRsr2GX-VWEDdOh? z>Bkkz8Q18?eXV`UC!>)|otN(Yzq8>VO|c(3yJbC(eLG<-KgEh-KEWB^m#31LMp?_9 z@;K7JMX)I*siPqyPw8Y8dqbZ&6F?B%SaXR^R7xJC8B2AqSI6`OOXhsEGClW5stZ?= zSynpD;x!QqqO;V|G7yxM`B|k*_9n@HX;4{VQK4;e?!CjE{_gj4cx->`!DwGN&TKP# z>kTppe%GK?%TT3BDHID~vs{Y6Z(bZ1LwfQSiz0}0%s^cg%D5ruFD>v5)dh}{VXTgd gkVHhdSYkS?`sR^#23&_qB-rHTo?$`S3&$7y4~a^U-v9sr literal 0 HcmV?d00001 diff --git a/images/icons/menu-collapsed-rtl.png b/images/icons/menu-collapsed-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..dc8d0b8823a90704b3743f980108b8a7d914193c GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^>>$j@3?%=}IXVGIu?6^qxc>kDAIJlF_r}R z1v5B2yO9Ru2z$CXhH%IxKS&Tt2udhQ_{ZGD!0W_Z)5_!D1C(a)boFyt=akR{086bK A?EnA( literal 0 HcmV?d00001 diff --git a/images/icons/menu-collapsed.png b/images/icons/menu-collapsed.png new file mode 100644 index 0000000000000000000000000000000000000000..91f3fd40ede024798b6de5ea2675bb692a3cfa95 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^>>$j@3?%=}IXVGIu?6^qxc>kDAIJlF_r}R y1v5B2yO9Ru2zt6WhH%Ixhb6Q*Xr>9K@iDN~Fr3*g^XWQJlEKr}&t;ucLK6T5e;aZD literal 0 HcmV?d00001 diff --git a/images/icons/menu-expanded.png b/images/icons/menu-expanded.png new file mode 100644 index 0000000000000000000000000000000000000000..46f39ecb351cff65243fa9a614a69d039e1302a5 GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^>>$j@3?%=}IXVGIu?6^qxc>kDAIJlF_r}R z1v5B2yO9Ru2zk0VhE&W+{&76uaKb@_0}N~oA{!VF-#vS9IZ&3t)78&qol`;+0EMF; ATL1t6 literal 0 HcmV?d00001 diff --git a/images/icons/package-x-generic.png b/images/icons/package-x-generic.png new file mode 100644 index 0000000000000000000000000000000000000000..21fc382cba23efb9d7cfaefb6a98b86324d531e3 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%E%S774ABVg?Kk8*WFWxuer-(yd%zv$fH&S%}%zr56N`Hooj};y7~CyD5-EIZ$Ti#TlGiAKrWr zUu>K2@!d{$zmi_R^=IcFiyv;gVvwM;GSR3l=7-;%YNpF=9hs+p|Ck1JF@vY8pUXO@ GgeCy8++)N5 literal 0 HcmV?d00001 diff --git a/images/icons/required.svg b/images/icons/required.svg new file mode 100644 index 0000000..f7882d6 --- /dev/null +++ b/images/icons/required.svg @@ -0,0 +1 @@ + diff --git a/images/icons/text-html.png b/images/icons/text-html.png new file mode 100644 index 0000000000000000000000000000000000000000..9c7c7932c25ad93adc9c9e6962d984d1703cd17f GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`7d%}YLn?0dPCn1oYpr_l6|v$g!-?M+tzwem(bxqx`p9mQA+2tMA_+XME>nQ%bo@!}(>I4c6S;asB4{>%yglS|#6Y z5Uy)3sXwGNKj!eva0TWHDFLV02B&~;yBsuQ8|JUfy)AI#BlodKT>FxH4HmB4HXGzc N22WQ%mvv4FO#pgZX`cW9 literal 0 HcmV?d00001 diff --git a/images/icons/text-plain.png b/images/icons/text-plain.png new file mode 100644 index 0000000000000000000000000000000000000000..06804849b8331ed8be3d1ae089311ae58ea79c83 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%)p@!&hG+y&?K{ZXV8G*Qyqephp*`o3)VoI~yA?RN7G071 zlASBP=H*eFjEv7eG#edwT#p`klJw&vJA1DcCF&6fEwgh&R?%&s{ zX3)B>#qoyRCeH3BDMHWqy{( zJaZG%Q-e|yQz{EjrrH1%)p@!&hG+y&?K{ZXV8G*Qyqephp*`o3)VoI~yA?RN7G071 zlASBP=H*eFjEv7eG#edwT#p`klJw&vJA1DcCF&6fEwgh&R?%&s{ zX3)B>#qoyRCeH3BDMHWqy{( zJaZG%Q-e|yQz{EjrrH1%Rd~8MhG?9hI>C^S$&iQTZ$24Q_1|1vj(@wU*2iN@EyC7x_*Z;E$EtTTO(#;cD9cA8~Z#ce1>0B1j4Gf;H KelF{r5}E*g{z{zy literal 0 HcmV?d00001 diff --git a/images/icons/warning.svg b/images/icons/warning.svg new file mode 100644 index 0000000..1498a41 --- /dev/null +++ b/images/icons/warning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/icons/x-office-document.png b/images/icons/x-office-document.png new file mode 100644 index 0000000000000000000000000000000000000000..40db538fcb71e1f46147a717cdf7134c4e74a239 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-f-PIlyCR^)ND&DOv0 zRA<)*E4jtr1@CkUUb(^(64aDzym=OXf6k=i_m3z%>f0*z|H0LTcMHEOpRi2!@?>C$ z`80=1Bdwad>ct1^?B|7U2RwrtzsDUgN(pW(&J%E2aPlH&QV-Kq28MN}8cR7snxaU19foyFkk>gTe~DWM4f@k31# literal 0 HcmV?d00001 diff --git a/images/icons/x-office-presentation.png b/images/icons/x-office-presentation.png new file mode 100644 index 0000000000000000000000000000000000000000..fb119e5ba91dd5141e07aad5229754cd06401c99 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-ftPCm%hpup2sdo6B3 zamj~9)_g=N=}tt*d2P=kD~`cESoNx@a=l5_Qo_IANDkK;`k3KG}0GMXI`*i$b2WRBvo8xw*i zO$rqacvhQr;DXY8_Dwc|9*eX-+%rG1!AI2Mc~uXm6NkyC*mL@(8cS>LFnm7E_Gf0+ hTH6=BdJ?W&er*c!pDfOvX9v23!PC{xWt~$(696`_L`MJs literal 0 HcmV?d00001 diff --git a/islandscholar.info.yml b/islandscholar.info.yml new file mode 100644 index 0000000..bd8048f --- /dev/null +++ b/islandscholar.info.yml @@ -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' diff --git a/islandscholar.libraries.yml b/islandscholar.libraries.yml new file mode 100644 index 0000000..de8638e --- /dev/null +++ b/islandscholar.libraries.yml @@ -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 diff --git a/islandscholar.theme b/islandscholar.theme new file mode 100644 index 0000000..1343610 --- /dev/null +++ b/islandscholar.theme @@ -0,0 +1,21 @@ + diff --git a/package.json b/package.json new file mode 100755 index 0000000..2607641 --- /dev/null +++ b/package.json @@ -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" + } +} diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..4d8e3956f94422f938f035186192273883fc3b0a GIT binary patch literal 33645 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

T`W8-hqmfMcUo$$qUsvp#@ zme*sL8WW- zs*U|q5KP=xqbcLAXJ(B6%1)-~d5=RA-EFy;$|iFJCHj=CpYvz%G-^frO%~MxavmhD zlKV~XdMbj<+4FPdJAaSl$~d#OrH2z6;sWOg11l;kAjC_LMMA-d({+A!Z6gYaN8S(_ zlC(2jl^*8AEkBnRLo%yKmB5BXv(e8e&TFvIqzI=ynm#v5c9|f|91nS|&n#qxAPHb$ z$tIVeRA@YJueX$f0-?l+Q{`>xv~?e)FfaorteWgM<&g8IM^(sx!x*94+Mb)De5H+| zILELp8_gtg3S~=dnL;~dd&=k4Rvr0TWGD!nNNFVpOF2I52THqHbtMlSFO+%P_`J~4 zcV&t``eIDqwX`I-XG1hLLfcJ(HYUEBa)Kk)2J6QN-Tli{X}I}Xf8v%{j2NP&oehG} z)Fh7N&x>0rx&3u$D(|E_$>5{GD3;ZKBcb%VZCNWq62#%s@l_Xo)8(2*m!Y7|58k1W za^$#UsyUfsjA#0x6@Ow!bKp>@WceeG#KdCmMaqj^l|!3PsDwsC2ez+QSa*kyF0mp{ zE?VIdUa91D%Urkv7{B4g%l=dC*V?BUy7T)z#hT z+QI~(Ru-1&ge^eRbsjNrO*rF+8t|!$xvPx#P2gZq6G9A2#0%mF48lWOfTFl6Bz8sT zGF}oc2e6_c@-it?o686!EuQX-ZCv|l4r^e&3VmyFFr6wLTO{?W&rq_I40^#$c+kI8 z=rGP^#1%Wh0|jzs%-F?ecZ3JUObpYp4H9J#_REz?ie=PLVjf2~)(My$Ocisk7s5;P z4N&A#_%AbdrX8&LJ6h6q=6YPYo3iA3eYu!)yX%$0W#dnPu1OHFjuQD3Cyo7m_%F6e zQzqRF?U&HhgRny)1;1L8jTP0XM!=Lg)DJU$57FQwb>&h1%(>40Sv3`kTUmCKDkuM8 zT=~H_ktPVOms*neb|rSN#zfCZ*l*IJS#TuLqZc*-VK`yb$lLGKn1(hL7f({nR9!Ag z69Ot-sTxs2jwW#n+z$RKUpl-#-*2E+mHXu^I^^)ks^DqH_qFQM^5;O?o#_{MLl%OF z!8@zG94>Te6hwNzkqFazzkXx;RYLeogHaPepM1neQtHP~z*1-O&^eX~D>+(Z^2}>= z>>v()>0@fbhJ;Lsghnk!is;++>9aZ3!_D-@0n+{Su^34fA)~vjUu6aZooKEo6R|yD zJq57~VH!lrjn=GbJ$CwT5d(z+6wUy)Mj|ZM?L~!3r!t<@HJ4C7Gg;YF28tI-6I3+I zqOz*1%0uHcWdVG~-fpJn-+-2{8)aS;>Ep+ol?XQCfU3o;CJ~#aQX=a>xX!Tqh=rtt z@KMDiX)!ddDl7UjVr;ZaIMhbFZ4A%p+qsgDz4j$Nf6QODpAe$kJ8Jsd47?|nX1`#l z96uMUCQO|C2!9WeZQ_XFw~G-kdx$9 zm1(FAlrCo5L)YOIR4GX%oY>CLd+y5h;4M{%f7s0H< z&r4TuMJ*;AQ8?s$o00ARJcu=F_-NMwp(E3iHf8V#DXYeFJA6M&z}#k=uP>s~fO8=} zv)o(@sigml0bRrUdC^WFFO$KpbEUf$;@KU91e48EDQ^`~E;;4;8Wd>OwO~V91405f zQJ} z2MYYuz6`&?>XIA8t)lSNnw) zQ;UrTkg7>DRhWSZa-J(`2%f2c53|!qUvrHJw?_=4Ulm+F>9?ZrKAcxYbaOuA^yR!0 z&Ih5Ti|4-YpW$g6ru};}76LwGB)glN+c|;_RmburI1fabl0ienU&?#xQ1y|E*>8~x zhFi7Yfxof8nGUulEZNX3t2m9=q#itFBi4eaGUQ~k+IN9}|HELRC*xu7UTAUYa>C@5 zvkJDhpZ#%*r4bB|N}!;^9v5dL1P>~;WZm6#z@|BV$T1irv_@3WlpQA~bTinypim)S zu{NxwS_UHOI8Qe!?rmiSVxs^iWv|?h25mPMy$K%(62A~G z?|k{Hr3W7tq_$(vda%>Kws~ zNZB#ORIr&=t|fw+>N;*;?{})63ZQyt zY~GJ$B&fP2HYjFcxCR~Gko05UL`-lRu4?6g=D*3MymOVJUz3NCX;?5VHj~(Zb>Rd0ZwHOa z;y;dBkZzudAL~G(6uFpx^s*rk!MGuzu>H+31|oFC8JH__M;K^>a6>KLBSyn7^0W#$ktHJ(G~u$KX;@*+*m4)Qc%p zd!s3)zYR@IXg8DTx5#8hFZgSHVIKWA8JP$!X!MpG@079)N+vT}p%l{7eCB{gC=JsY zd^(HTD;A2f4Y5ROFHr|H93b;If^kce4Z(y!f;T$S-S-rHjofKTcwyMdqQODvrbNR~ zdkd)yu7t^_Ybgr8mP%*P6_xFxoH`ZT!x0Za(?6=J>D0aGiqkgAZ^&s{FyDs0N-jtx zzA&t4sED_|TJV~bOrelT(eT9-0mZ=VrFGYfrqolhl)7x|Admf%5H+Wkt%WVS#v-V{ z?eixJpOcY^_yU+3LkBEr8A=XELJ@N{y=@G-KvrH|9Rt8<*e4?UT#8>Jdwj;xe}tR^|RX9pu8M6DNNE zP8A8$bs-D`mR8r-SJ#JHi#Uc}zL3h-(CIW88!!@&R6reVXbf(7t&%gVdD z%G;Z#svF8`YHEgSVk0+}mi&jRIYNrC!Z7RzDN-a%r2bzbVfuxgJNa$ny5j&|d>@Cy znc=>Z=DzPcDegPPofJt?BB_0`rHcW>Kp_DEa_}LB0RuVZY8yci_|jtlBNyMAV{*&C z)1fTYaT|AU(H8z7poVYWd%yP{zcB+%;7>k<>68CHpThLXr!al;-{(`9KKT@;PyYLS z3ezW_!t}|1pHE@>1w+m?fvdS_3CY6tDNYVr#F5+VZIsC0;>VTHQEqe!lVsh*}!!PLvRy%S} z@J9!6&+&cyscn`u_q_NE3Od}_D&RwXnT)$ihv6c{1Kwl{YtV;0G z1^_!nzz^O9?v$y!4H31vDS=~jGzO@fR_ZRk?=Stp_!Phac<(n`_F`?B0J1{d5F)J{ z`ffT2ZwCKj(@_?{*d@?gEl;vH3a7&cF(h&O}7ZBqBSR@BPF%JlD1_|H2Sd_!# zfdw~whq#pm=o5hQ-1a>9V;OJucFnleRRDos{&DD`u+|F!V9d9t(H{I0_-(LH5z z>hJ=o+fV53rU18^4j@|w97`beeti&ZaK1yL9$nsj)*b-V!MiXi^Bf=|Vzi8jLoAs2 z+!9S33oAk(EQT|rawz~L8m3S%_5@3t<*G12ZWn{#>^7VR20R6EHxx)R<~p1aMr5Bw z)&&+d#=W$u5Do>Sshka_5Isk(#?=mV85FhHrMV`;mYSmlH%Fg=w>4v3IZfC@o9Tu( z9y2~{C+YxXb_h51)ARd)o_>-M7>x`IzMjp5d1!KEV``q;^K}DK3F?gP5F>}m^$395 zVGj9CAuNpMITUO#F+$xKOYe_5>_!1=qe6cdi2Hp(#&CQ-g*-Id1mJDem>`8DJsTop z3AMnxW^6vh1DIE<1*#nl9q*}Xbc+e)pf%dW$XQ~pBmhyXY&O$+WD>?XG!X_)#-@aI zM#tg4r^MQQH*4F3y@PtOTw+67m=d-U1z6kbH%lLM3Rz4#6Ao91#FXcdZ)lwP($d%??yfZc(qb3V;B8S^Hn8qFQyMu`PLh6hH5 z5v)rm;o)er04DRbHuT*&D4k%g|u;YMD-GNtSwIgjGKBRk~CLGAxOu)T8Ksg1@_e#+NKwsN4`p@nA8{*8V z$9e82!Q-_1C|$#i?&Xx*<`?Df?3kunS^gmaCb4gfcJm!$kH^pvLWf%OqB|Gt(I<@615C!bvz0}vJ@HhHekV`xQwk6tP%m- z&|dWFl17!60W3gB3Md%BR&MPA&QPb@%|N^cP)rJLagQ%k zYX<=w0Q79~(6$}zBe?CHr;J>a(y7+#S10XBKoyDrx(EPK67?iwcbWnFuFj5CTBkKO z9dm81wRc-oV+Lp+t3dqWRS<|wZ0|}O(g5RQ3s~u@G3gAZ-QKwZfO%NfCM|U>3t&Mb z8}iqDle3&HTBLwL-mX<$AG)v1VC1-A8}R#>VLpf4zMAgYMB1M17hy81f&v`bBoTmC zgjQPjNz@KNh$9z;!{j^;M70wwC&fV`L*pIB4M1SZ%%E7d&kw}w^RlN!9o&RzH)V6= zwkkb4;L@}epvBlv$fD~o**A?qr~<%Ppm&eyOs@xTw^zc*y~BNMkMGku5cs znp_%jK1p@ZIsm~8j1`yjHabiFVFKXVz=3%W zqQSb1QfmPe$H0usb=2Vm;21gM_xl>#uEdQ=5L!dh4H#83U_CiX3vH-6S!NPI#L(

MFXH_VuRLp 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 content }} + {% endif %} +{% endblock %} diff --git a/templates/block/block--local-tasks-block.html.twig b/templates/block/block--local-tasks-block.html.twig new file mode 100644 index 0000000..0f25f59 --- /dev/null +++ b/templates/block/block--local-tasks-block.html.twig @@ -0,0 +1,14 @@ +{% extends "block.html.twig" %} +{# +/** + * @file + * Theme override for tabs. + */ +#} +{% block content %} + {% if content %} +

+ {% endif %} +{% endblock %} diff --git a/templates/block/block--search-form-block.html.twig b/templates/block/block--search-form-block.html.twig new file mode 100644 index 0000000..d1cda72 --- /dev/null +++ b/templates/block/block--search-form-block.html.twig @@ -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', + ] +%} + + {{ title_prefix }} + {% if label %} + {{ label }} + {% endif %} + {{ title_suffix }} + {% block content %} + {{ content }} + {% endblock %} + diff --git a/templates/block/block--system-branding-block.html.twig b/templates/block/block--system-branding-block.html.twig new file mode 100644 index 0000000..baa015b --- /dev/null +++ b/templates/block/block--system-branding-block.html.twig @@ -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 %} + + {% endif %} + {% if site_name %} + + {% endif %} + {% if site_slogan %} +
{{ site_slogan }}
+ {% endif %} +{% endblock %} diff --git a/templates/block/block--system-menu-block.html.twig b/templates/block/block--system-menu-block.html.twig new file mode 100644 index 0000000..db3f9f8 --- /dev/null +++ b/templates/block/block--system-menu-block.html.twig @@ -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 %} + diff --git a/templates/block/block.html.twig b/templates/block/block.html.twig new file mode 100644 index 0000000..114d7c4 --- /dev/null +++ b/templates/block/block.html.twig @@ -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, + ] +%} + + {{ title_prefix }} + {% if label %} + {{ label }} + {% endif %} + {{ title_suffix }} + {% block content %} + {{ content }} + {% endblock %} + diff --git a/templates/content-edit/file-managed-file.html.twig b/templates/content-edit/file-managed-file.html.twig new file mode 100644 index 0000000..5cd5238 --- /dev/null +++ b/templates/content-edit/file-managed-file.html.twig @@ -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', + ] +%} + + {{ element }} + diff --git a/templates/content-edit/file-upload-help.html.twig b/templates/content-edit/file-upload-help.html.twig new file mode 100644 index 0000000..d05822e --- /dev/null +++ b/templates/content-edit/file-upload-help.html.twig @@ -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('
') }} diff --git a/templates/content-edit/file-widget-multiple.html.twig b/templates/content-edit/file-widget-multiple.html.twig new file mode 100644 index 0000000..34646fe --- /dev/null +++ b/templates/content-edit/file-widget-multiple.html.twig @@ -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 }} diff --git a/templates/content-edit/filter-caption.html.twig b/templates/content-edit/filter-caption.html.twig new file mode 100644 index 0000000..1e35795 --- /dev/null +++ b/templates/content-edit/filter-caption.html.twig @@ -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. + */ +#} +
+{{ node }} +
{{ caption }}
+
diff --git a/templates/content-edit/filter-guidelines.html.twig b/templates/content-edit/filter-guidelines.html.twig new file mode 100644 index 0000000..afef2d2 --- /dev/null +++ b/templates/content-edit/filter-guidelines.html.twig @@ -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, + ] +%} + +

{{ format.label }}

+ {{ tips }} + diff --git a/templates/content-edit/filter-tips.html.twig b/templates/content-edit/filter-tips.html.twig new file mode 100644 index 0000000..25ed49d --- /dev/null +++ b/templates/content-edit/filter-tips.html.twig @@ -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 %} +

{{ 'Text Formats'|t }}

+{% endif %} + +{% if tips|length %} + {% if multiple %} +
+ {% endif %} + + {% for name, tip in tips %} + {% if multiple %} + {% + set tip_classes = [ + 'filter-type', + 'filter-' ~ name|clean_class, + ] + %} + +

{{ tip.name }}

+ {% endif %} + + {% if tip.list|length %} +
    + {% for item in tip.list %} + {% + set item_classes = [ + long ? 'filter-' ~ item.id|replace({'/': '-'}), + ] + %} + {{ item.tip }} + {% endfor %} +
+ {% endif %} + + {% if multiple %} +
+ {% endif %} + {% endfor %} + + {% if multiple %} + + {% endif %} +{% endif %} diff --git a/templates/content-edit/image-widget.html.twig b/templates/content-edit/image-widget.html.twig new file mode 100644 index 0000000..dac3a22 --- /dev/null +++ b/templates/content-edit/image-widget.html.twig @@ -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() + */ +#} + + {% if data.preview %} +
+ {{ data.preview }} +
+ {% endif %} +
+ {# Render widget data without the image preview that was output already. #} + {{ data|without('preview') }} +
+ diff --git a/templates/content-edit/node-add-list.html.twig b/templates/content-edit/node-add-list.html.twig new file mode 100644 index 0000000..f38fe3a --- /dev/null +++ b/templates/content-edit/node-add-list.html.twig @@ -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 %} +
+ {% for type in types %} +
{{ type.add_link }}
+
{{ type.description }}
+ {% endfor %} +
+{% else %} +

+ {% set create_content = path('node.type_add') %} + {% trans %} + You have not created any content types yet. Go to the content type creation page to add a new content type. + {% endtrans %} +

+{% endif %} diff --git a/templates/content-edit/node-edit-form.html.twig b/templates/content-edit/node-edit-form.html.twig new file mode 100644 index 0000000..9e1ffbb --- /dev/null +++ b/templates/content-edit/node-edit-form.html.twig @@ -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. + */ +#} +
+
+ {{ form|without('advanced', 'actions') }} +
+
+ {{ form.advanced }} +
+ +
diff --git a/templates/content-edit/text-format-wrapper.html.twig b/templates/content-edit/text-format-wrapper.html.twig new file mode 100644 index 0000000..08a88ca --- /dev/null +++ b/templates/content-edit/text-format-wrapper.html.twig @@ -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() + */ +#} +
+ {{ children }} + {% if description %} + {% + set classes = [ + aria_description ? 'description', + ] + %} + {{ description }}
+ {% endif %} + diff --git a/templates/content/comment.html.twig b/templates/content/comment.html.twig new file mode 100644 index 0000000..a086751 --- /dev/null +++ b/templates/content/comment.html.twig @@ -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', + ] +%} + + {# + 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. + #} + + +
+ {{ user_picture }} + + + {# + 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 %} +

{{ parent }}

+ {% endif %} + + {{ permalink }} +
+ + + {% if title %} + {{ title_prefix }} + {{ title }} + {{ title_suffix }} + {% endif %} + {{ content }} + + diff --git a/templates/content/links--node.html.twig b/templates/content/links--node.html.twig new file mode 100644 index 0000000..e6cda0d --- /dev/null +++ b/templates/content/links--node.html.twig @@ -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 %} + +{% endif %} diff --git a/templates/content/mark.html.twig b/templates/content/mark.html.twig new file mode 100644 index 0000000..9219915 --- /dev/null +++ b/templates/content/mark.html.twig @@ -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') %} + {{ 'New'|t }} + {% elseif status is constant('MARK_UPDATED') %} + {{ 'Updated'|t }} + {% endif %} +{% endif %} diff --git a/templates/content/media.html.twig b/templates/content/media.html.twig new file mode 100644 index 0000000..422030e --- /dev/null +++ b/templates/content/media.html.twig @@ -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, + ] +%} + + {{ title_suffix.contextual_links }} + {% if content %} + {{ content }} + {% endif %} + diff --git a/templates/content/node.html.twig b/templates/content/node.html.twig new file mode 100644 index 0000000..0183792 --- /dev/null +++ b/templates/content/node.html.twig @@ -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') }} + + + {{ title_prefix }} + {% if label and not page %} + + {{ label }} + + {% endif %} + {{ title_suffix }} + + {% if display_submitted %} +
+ {{ author_picture }} + + {% trans %}Submitted by {{ author_name }} on {{ date }}{% endtrans %} + {{ metadata }} + +
+ {% endif %} + + + {{ content }} + + + diff --git a/templates/content/page-title.html.twig b/templates/content/page-title.html.twig new file mode 100644 index 0000000..e1de726 --- /dev/null +++ b/templates/content/page-title.html.twig @@ -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 %} + {{ title }} +{% endif %} +{{ title_suffix }} diff --git a/templates/content/search-result.html.twig b/templates/content/search-result.html.twig new file mode 100644 index 0000000..b1a99b9 --- /dev/null +++ b/templates/content/search-result.html.twig @@ -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) %} + * + * {{ info_split.comment }} + * + * {% endif %} + * @endcode + * + * To check for all available data within info_split, use the code below. + * @code + *
+ *     {{ dump(info_split) }}
+ *   
+ * @endcode + * + * @see template_preprocess_search_result() + */ +#} +{{ attach_library('islandscholar/search-results') }} +{{ title_prefix }} + + {{ title }} + +{{ title_suffix }} +
+ {% if snippet %} + {{ snippet }}

+ {% endif %} + {% if info %} +

{{ info }}

+ {% endif %} +
diff --git a/templates/content/taxonomy-term.html.twig b/templates/content/taxonomy-term.html.twig new file mode 100644 index 0000000..6478b50 --- /dev/null +++ b/templates/content/taxonomy-term.html.twig @@ -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, + ] +%} + + {{ title_prefix }} + {% if name and not page %} +

{{ name }}

+ {% endif %} + {{ title_suffix }} +
+ {{ content }} +
+ diff --git a/templates/dataset/item-list--search-results.html.twig b/templates/dataset/item-list--search-results.html.twig new file mode 100644 index 0000000..e9928fd --- /dev/null +++ b/templates/dataset/item-list--search-results.html.twig @@ -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) %} diff --git a/templates/dataset/item-list.html.twig b/templates/dataset/item-list.html.twig new file mode 100644 index 0000000..20541b0 --- /dev/null +++ b/templates/dataset/item-list.html.twig @@ -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 -%} + + {%- if title is not empty -%} +

{{ title }}

+ {%- endif -%} + {%- if items -%} + <{{ list_type }}{{ attributes }}> + {%- for item in items -%} + {{ item.value }} + {%- endfor -%} + + {%- else -%} + {{- empty -}} + {%- endif -%} + +{%- endif %} diff --git a/templates/dataset/table.html.twig b/templates/dataset/table.html.twig new file mode 100644 index 0000000..2afa9c1 --- /dev/null +++ b/templates/dataset/table.html.twig @@ -0,0 +1,113 @@ +{# +/** + * @file + * Theme override to display a table. + * + * Available variables: + * - attributes: HTML attributes to apply to the tag. + * - caption: A localized string for the 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 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() + */ +#} + + {% if caption %} + + {% endif %} + + {% for colgroup in colgroups %} + {% if colgroup.cols %} + + {% for col in colgroup.cols %} + + {% endfor %} + + {% else %} + + {% endif %} + {% endfor %} + + {% if header %} + + + {% for cell in header %} + {% + set cell_classes = [ + cell.active_table_sort ? 'is-active', + ] + %} + <{{ cell.tag }}{{ cell.attributes.addClass(cell_classes) }}> + {{- cell.content -}} + + {% endfor %} + + + {% endif %} + + {% if rows %} + + {% for row in rows %} + {% + set row_classes = [ + not no_striping ? cycle(['odd', 'even'], loop.index0), + ] + %} + + {% for cell in row.cells %} + <{{ cell.tag }}{{ cell.attributes }}> + {{- cell.content -}} + + {% endfor %} + + {% endfor %} + + {% elseif empty %} + + + + + + {% endif %} + {% if footer %} + + {% for row in footer %} + + {% for cell in row.cells %} + <{{ cell.tag }}{{ cell.attributes }}> + {{- cell.content -}} + + {% endfor %} + + {% endfor %} + + {% endif %} +
tag. + * - colgroups: Column groups. Each group contains the following properties: + * - attributes: HTML attributes to apply to the
{{ caption }}
{{ empty }}
diff --git a/templates/field/field--comment.html.twig b/templates/field/field--comment.html.twig new file mode 100644 index 0000000..1ec3ee6 --- /dev/null +++ b/templates/field/field--comment.html.twig @@ -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', + ] +%} + + {% if comments and not label_hidden %} + {{ title_prefix }} + {{ label }} + {{ title_suffix }} + {% endif %} + + {{ comments }} + + {% if comment_form %} +

{{ 'Add new comment'|t }}

+ {{ comment_form }} + {% endif %} + + diff --git a/templates/field/field--node--created.html.twig b/templates/field/field--node--created.html.twig new file mode 100644 index 0000000..f4d1acd --- /dev/null +++ b/templates/field/field--node--created.html.twig @@ -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 + * ,

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, + ] +%} + + {%- for item in items -%} + {{ item.content }} + {%- endfor -%} + +{% endif %} diff --git a/templates/field/field--node--title.html.twig b/templates/field/field--node--title.html.twig new file mode 100644 index 0000000..e79c39e --- /dev/null +++ b/templates/field/field--node--title.html.twig @@ -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 + * ,

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, + ] +%} + + {%- for item in items -%} + {{ item.content }} + {%- endfor -%} + +{% endif %} diff --git a/templates/field/field--node--uid.html.twig b/templates/field/field--node--uid.html.twig new file mode 100644 index 0000000..0a38108 --- /dev/null +++ b/templates/field/field--node--uid.html.twig @@ -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 + * ,

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, + ] +%} + + {%- for item in items -%} + {{ item.content }} + {%- endfor -%} + +{% endif %} diff --git a/templates/field/field--text-long.html.twig b/templates/field/field--text-long.html.twig new file mode 100644 index 0000000..07ce721 --- /dev/null +++ b/templates/field/field--text-long.html.twig @@ -0,0 +1 @@ +{% extends "field--text.html.twig" %} diff --git a/templates/field/field--text-with-summary.html.twig b/templates/field/field--text-with-summary.html.twig new file mode 100644 index 0000000..07ce721 --- /dev/null +++ b/templates/field/field--text-with-summary.html.twig @@ -0,0 +1 @@ +{% extends "field--text.html.twig" %} diff --git a/templates/field/field--text.html.twig b/templates/field/field--text.html.twig new file mode 100644 index 0000000..5d1690c --- /dev/null +++ b/templates/field/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') %} diff --git a/templates/field/field.html.twig b/templates/field/field.html.twig new file mode 100644 index 0000000..1cfbd65 --- /dev/null +++ b/templates/field/field.html.twig @@ -0,0 +1,81 @@ +{# +/** + * @file + * Theme override for a field. + * + * To override output, copy the "field.html.twig" from the templates directory + * to your theme's directory and customize it, just like customizing other + * Drupal templates such as page.html.twig or node.html.twig. + * + * Instead of overriding the theming for all fields, you can also just override + * theming for a subset of fields using + * @link themeable Theme hook suggestions. @endlink For example, + * here are some theme hook suggestions that can be used for a field_foo field + * on an article node type: + * - field--node--field-foo--article.html.twig + * - field--node--field-foo.html.twig + * - field--node--article.html.twig + * - field--field-foo.html.twig + * - field--text-with-summary.html.twig + * - field.html.twig + * + * 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. + * - multiple: TRUE if a field can contain multiple items. + * - items: List of all the field items. Each item contains: + * - attributes: List of HTML attributes for each item. + * - content: The field item's 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. + * + * + * @see template_preprocess_field() + */ +#} +{% + set classes = [ + 'field', + 'field--name-' ~ field_name|clean_class, + 'field--type-' ~ field_type|clean_class, + 'field--label-' ~ label_display, + label_display == 'inline' ? 'clearfix', + ] +%} +{% + set title_classes = [ + 'field__label', + label_display == 'visually_hidden' ? 'visually-hidden', + ] +%} + +{% if label_hidden %} + {% if multiple %} + + {% for item in items %} + {{ item.content }} + {% endfor %} + + {% else %} + {% for item in items %} + {{ item.content }} + {% endfor %} + {% endif %} +{% else %} + + {{ label }} + {% if multiple %} +
+ {% endif %} + {% for item in items %} + {{ item.content }}
+ {% endfor %} + {% if multiple %} + + {% endif %} + +{% endif %} diff --git a/templates/field/file-audio.html.twig b/templates/field/file-audio.html.twig new file mode 100644 index 0000000..e1ab43c --- /dev/null +++ b/templates/field/file-audio.html.twig @@ -0,0 +1,23 @@ +{# +/** +* @file +* Default theme implementation to display the file entity as an audio tag. +* +* Available variables: +* - attributes: An array of HTML attributes, intended to be added to the +* audio tag. +* - files: And array of files to be added as sources for the audio tag. Each +* element is an array with the following elements: +* - file: The full file object. +* - source_attributes: An array of HTML attributes for to be added to the +* source tag. +* +* @ingroup themeable +*/ +#} +{{ attach_library('islandscholar/file') }} + diff --git a/templates/field/file-link.html.twig b/templates/field/file-link.html.twig new file mode 100644 index 0000000..44808e8 --- /dev/null +++ b/templates/field/file-link.html.twig @@ -0,0 +1,16 @@ +{# +/** + * @file + * Theme override for a link to a file. + * + * Available variables: + * - attributes: The HTML attributes for the containing element. + * - link: A link to the file. + * - icon: The icon image representing the file type. + * - file_size: The size of the file. + * + * @see template_preprocess_file_link() + */ +#} +{{ attach_library('islandscholar/file') }} +{{ icon }} {{ link }} diff --git a/templates/field/file-video.html.twig b/templates/field/file-video.html.twig new file mode 100644 index 0000000..ef4535b --- /dev/null +++ b/templates/field/file-video.html.twig @@ -0,0 +1,23 @@ +{# +/** +* @file +* Default theme implementation to display the file entity as a video tag. +* +* Available variables: +* - attributes: An array of HTML attributes, intended to be added to the +* video tag. +* - files: And array of files to be added as sources for the video tag. Each +* element is an array with the following elements: +* - file: The full file object. +* - source_attributes: An array of HTML attributes for to be added to the +* source tag. +* +* @ingroup themeable +*/ +#} +{{ attach_library('islandscholar/file') }} + diff --git a/templates/field/image-formatter.html.twig b/templates/field/image-formatter.html.twig new file mode 100644 index 0000000..512d758 --- /dev/null +++ b/templates/field/image-formatter.html.twig @@ -0,0 +1,18 @@ +{# +/** + * @file + * Theme override to display a formatted image field. + * + * Available variables: + * - image: A collection of image data. + * - image_style: An optional image style. + * - url: An optional URL the image can be linked to. + * + * @see template_preprocess_image_formatter() + */ +#} +{% if url %} + {{ link(image, url) }} +{% else %} + {{ image }} +{% endif %} diff --git a/templates/field/image-style.html.twig b/templates/field/image-style.html.twig new file mode 100644 index 0000000..039089a --- /dev/null +++ b/templates/field/image-style.html.twig @@ -0,0 +1,18 @@ +{# +/** + * @file + * Theme override for an image using a specific image style. + * + * Available variables: + * - attributes: HTML attributes for the image, including the following: + * - src: Full URL or relative path to the image file. + * - class: One or more classes to be applied to the image. + * - width: The width of the image (if known). + * - height: The height of the image (if known). + * - title: The title of the image. + * - alt: The alternative text for the image. + * + * @see template_preprocess_image_style() + */ +#} +{{ image }} diff --git a/templates/field/image.html.twig b/templates/field/image.html.twig new file mode 100644 index 0000000..31f782b --- /dev/null +++ b/templates/field/image.html.twig @@ -0,0 +1,18 @@ +{# +/** + * @file + * Theme override of an image. + * + * Available variables: + * - attributes: HTML attributes for the img tag. + * - style_name: (optional) The name of the image style applied. + * + * @see template_preprocess_image() + */ +#} +{% +set classes = [ + style_name ? 'image-style-' ~ style_name|clean_class, +] +%} + diff --git a/templates/field/link-formatter-link-separate.html.twig b/templates/field/link-formatter-link-separate.html.twig new file mode 100644 index 0000000..52c8d29 --- /dev/null +++ b/templates/field/link-formatter-link-separate.html.twig @@ -0,0 +1,22 @@ +{# +/** + * @file + * Theme override of a link with separate title and URL elements. + * + * Available variables: + * - link: The link that has already been formatted by l(). + * - title: (optional) A descriptive or alternate title for the link, which may + * be different than the actual link text. + * + * @see template_preprocess() + * @see template_preprocess_link_formatter_link_separate() + */ +#} +{% apply spaceless %} + +{% endapply %} diff --git a/templates/field/time.html.twig b/templates/field/time.html.twig new file mode 100644 index 0000000..f2912b7 --- /dev/null +++ b/templates/field/time.html.twig @@ -0,0 +1,22 @@ +{# +/** + * @file + * Theme override for a date / time element. + * + * Available variables + * - timestamp: (optional) A UNIX timestamp for the datetime attribute. If the + * datetime cannot be represented as a UNIX timestamp, use a valid datetime + * attribute value in attributes.datetime. + * - text: (optional) The content to display within the

+{% endif %} +{{ content }} +{% if errors %} +
+ {{ errors }} +
+{% endif %} +{% if description %} + + {{ description }} + +{% endif %} diff --git a/templates/form/details.html.twig b/templates/form/details.html.twig new file mode 100644 index 0000000..c554096 --- /dev/null +++ b/templates/form/details.html.twig @@ -0,0 +1,44 @@ +{# +/** + * @file + * Theme override for a details element. + * + * Available variables + * - attributes: A list of HTML attributes for the details element. + * - errors: (optional) Any errors for this details element, may not be set. + * - title: (optional) The title of the element, may not be set. + * - summary_attributes: A list of HTML attributes for the summary element. + * - description: (optional) The description of the element, may not be set. + * - children: (optional) The children of the element, may not be set. + * - value: (optional) The value of the element, may not be set. + * + * @see template_preprocess_details() + */ +#} + + {%- if title -%} + {% + set summary_classes = [ + required ? 'js-form-required', + required ? 'form-required', + ] + %} + {{ title }} + {%- endif -%} +
+ {% if errors %} +
+ {{ errors }} +
+ {% endif %} + {%- if description -%} +
{{ description }}
+ {%- endif -%} + {%- if children -%} + {{ children }} + {%- endif -%} + {%- if value -%} + {{ value }} + {%- endif -%} +
+ diff --git a/templates/form/dropbutton-wrapper.html.twig b/templates/form/dropbutton-wrapper.html.twig new file mode 100644 index 0000000..a2bdc21 --- /dev/null +++ b/templates/form/dropbutton-wrapper.html.twig @@ -0,0 +1,20 @@ +{# +/** + * @file + * Theme override for a dropbutton wrapper. + * + * Available variables: + * - children: Contains the child elements of the dropbutton menu. + * + * @see template_preprocess() + */ +#} +{% if children %} + {% apply spaceless %} +
+
+ {{ children }} +
+
+ {% endapply %} +{% endif %} diff --git a/templates/form/field-multiple-value-form.html.twig b/templates/form/field-multiple-value-form.html.twig new file mode 100644 index 0000000..246ac41 --- /dev/null +++ b/templates/form/field-multiple-value-form.html.twig @@ -0,0 +1,42 @@ +{# +/** + * @file + * Theme override for an individual form element. + * + * Available variables for all fields: + * - multiple: Whether there are multiple instances of the field. + * + * Available variables for single cardinality fields: + * - elements: Form elements to be rendered. + * + * Available variables when there are multiple fields. + * - table: Table of field items. + * - description: The description element containing the following properties: + * - content: The description content of the form element. + * - attributes: HTML attributes to apply to the description container. + * - button: "Add another item" button. + * + * @see template_preprocess_field_multiple_value_form() + */ +#} +{% if multiple %} + {% + set classes = [ + 'js-form-item', + 'form-item' + ] + %} + + {{ table }} + {% if description.content %} + {{ description.content }} + {% endif %} + {% if button %} +
{{ button }}
+ {% endif %} + +{% else %} + {% for element in elements %} + {{ element }} + {% endfor %} +{% endif %} diff --git a/templates/form/fieldset.html.twig b/templates/form/fieldset.html.twig new file mode 100644 index 0000000..db63082 --- /dev/null +++ b/templates/form/fieldset.html.twig @@ -0,0 +1,60 @@ +{# +/** + * @file + * Theme override for a fieldset element and its children. + * + * Available variables: + * - attributes: HTML attributes for the fieldset element. + * - errors: (optional) Any errors for this fieldset element, may not be set. + * - required: Boolean indicating whether the fieldset element is required. + * - legend: The legend element containing the following properties: + * - title: Title of the fieldset, intended for use as the text of the legend. + * - attributes: HTML attributes to apply to the legend. + * - description: The description element containing the following properties: + * - content: The description content of the fieldset. + * - attributes: HTML attributes to apply to the description container. + * - children: The rendered child elements of the fieldset. + * - prefix: The content to add before the fieldset children. + * - suffix: The content to add after the fieldset children. + * + * @see template_preprocess_fieldset() + */ +#} +{% + set classes = [ + 'js-form-item', + 'form-item', + 'js-form-wrapper', + 'form-wrapper', + ] +%} + + {% + set legend_span_classes = [ + 'fieldset-legend', + required ? 'js-form-required', + required ? 'form-required', + ] + %} + {# Always wrap fieldset legends in a for CSS positioning. #} + + {{ legend.title }} + +
+ {% if errors %} +
+ {{ errors }} +
+ {% endif %} + {% if prefix %} + {{ prefix }} + {% endif %} + {{ children }} + {% if suffix %} + {{ suffix }} + {% endif %} + {% if description.content %} + {{ description.content }}
+ {% endif %} + + diff --git a/templates/form/form-element-label.html.twig b/templates/form/form-element-label.html.twig new file mode 100644 index 0000000..7c2f8f2 --- /dev/null +++ b/templates/form/form-element-label.html.twig @@ -0,0 +1,25 @@ +{# +/** + * @file + * Theme override for a form element label. + * + * Available variables: + * - title: The label's text. + * - title_display: Elements title_display setting. + * - required: An indicator for whether the associated form element is required. + * - attributes: A list of HTML attributes for the label. + * + * @see template_preprocess_form_element_label() + */ +#} +{% + set classes = [ + title_display == 'after' ? 'option', + title_display == 'invisible' ? 'visually-hidden', + required ? 'js-form-required', + required ? 'form-required', + ] +%} +{% if title is not empty or required -%} + {{ title }} +{%- endif %} diff --git a/templates/form/form-element.html.twig b/templates/form/form-element.html.twig new file mode 100644 index 0000000..3bde4f7 --- /dev/null +++ b/templates/form/form-element.html.twig @@ -0,0 +1,95 @@ +{# +/** + * @file + * Theme override for a form element. + * + * Available variables: + * - attributes: HTML attributes for the containing element. + * - errors: (optional) Any errors for this form element, may not be set. + * - prefix: (optional) The form element prefix, may not be set. + * - suffix: (optional) The form element suffix, may not be set. + * - required: The required marker, or empty if the associated form element is + * not required. + * - type: The type of the element. + * - name: The name of the element. + * - label: A rendered label element. + * - label_display: Label display setting. It can have these values: + * - before: The label is output before the element. This is the default. + * The label includes the #title and the required marker, if #required. + * - after: The label is output after the element. For example, this is used + * for radio and checkbox #type elements. If the #title is empty but the + * field is #required, the label will contain only the required marker. + * - invisible: Labels are critical for screen readers to enable them to + * properly navigate through forms but can be visually distracting. This + * property hides the label for everyone except screen readers. + * - attribute: Set the title attribute on the element to create a tooltip but + * output no label element. This is supported only for checkboxes and radios + * in \Drupal\Core\Render\Element\CompositeFormElementTrait::preRenderCompositeFormElement(). + * It is used where a visual label is not needed, such as a table of + * checkboxes where the row and column provide the context. The tooltip will + * include the title and required marker. + * - description: (optional) A list of description properties containing: + * - content: A description of the form element, may not be set. + * - attributes: (optional) A list of HTML attributes to apply to the + * description content wrapper. Will only be set when description is set. + * - description_display: Description display setting. It can have these values: + * - before: The description is output before the element. + * - after: The description is output after the element. This is the default + * value. + * - invisible: The description is output after the element, hidden visually + * but available to screen readers. + * - disabled: True if the element is disabled. + * - title_display: Title display setting. + * + * @see template_preprocess_form_element() + */ +#} +{% + set classes = [ + 'js-form-item', + 'form-item', + 'js-form-type-' ~ type|clean_class, + 'form-type-' ~ type|clean_class, + 'js-form-item-' ~ name|clean_class, + 'form-item-' ~ name|clean_class, + title_display not in ['after', 'before'] ? 'form-no-label', + disabled == 'disabled' ? 'form-disabled', + errors ? 'form-item--error', + ] +%} +{% + set description_classes = [ + 'description', + description_display == 'invisible' ? 'visually-hidden', + ] +%} + + {% if label_display in ['before', 'invisible'] %} + {{ label }} + {% endif %} + {% if prefix is not empty %} + {{ prefix }} + {% endif %} + {% if description_display == 'before' and description.content %} + + {{ description.content }} + + {% endif %} + {{ children }} + {% if suffix is not empty %} + {{ suffix }} + {% endif %} + {% if label_display == 'after' %} + {{ label }} + {% endif %} + {% if errors %} +
+ {{ errors }} +
+ {% endif %} + {% if description_display in ['after', 'invisible'] and description.content %} + + {{ description.content }} + + {% endif %} + diff --git a/templates/form/form.html.twig b/templates/form/form.html.twig new file mode 100644 index 0000000..97b4b7a --- /dev/null +++ b/templates/form/form.html.twig @@ -0,0 +1,15 @@ +{# +/** + * @file + * Theme override for a 'form' element. + * + * Available variables + * - attributes: A list of HTML attributes for the wrapper element. + * - children: The child elements of the form. + * + * @see template_preprocess_form() + */ +#} + + {{ children }} + diff --git a/templates/form/input.html.twig b/templates/form/input.html.twig new file mode 100644 index 0000000..d5cac38 --- /dev/null +++ b/templates/form/input.html.twig @@ -0,0 +1,13 @@ +{# +/** + * @file + * Theme override for an 'input' #type form element. + * + * Available variables: + * - attributes: A list of HTML attributes for the input element. + * - children: Optional additional rendered elements. + * + * @see template_preprocess_input() + */ +#} +{{ children }} diff --git a/templates/form/radios.html.twig b/templates/form/radios.html.twig new file mode 100644 index 0000000..2e4bafd --- /dev/null +++ b/templates/form/radios.html.twig @@ -0,0 +1,13 @@ +{# +/** + * @file + * Theme override for a 'radios' #type form element. + * + * Available variables + * - attributes: A list of HTML attributes for the wrapper element. + * - children: The rendered radios. + * + * @see template_preprocess_radios() + */ +#} +{{ children }} diff --git a/templates/form/select.html.twig b/templates/form/select.html.twig new file mode 100644 index 0000000..9c8a97c --- /dev/null +++ b/templates/form/select.html.twig @@ -0,0 +1,27 @@ +{# +/** + * @file + * Theme override for a select element. + * + * Available variables: + * - attributes: HTML attributes for the +{% endapply %} diff --git a/templates/form/textarea.html.twig b/templates/form/textarea.html.twig new file mode 100644 index 0000000..99e1bde --- /dev/null +++ b/templates/form/textarea.html.twig @@ -0,0 +1,25 @@ +{# +/** + * @file + * Theme override for a 'textarea' #type form element. + * + * Available variables + * - wrapper_attributes: A list of HTML attributes for the wrapper element. + * - attributes: A list of HTML attributes for the + diff --git a/templates/layout/html.html.twig b/templates/layout/html.html.twig new file mode 100644 index 0000000..4fe57a0 --- /dev/null +++ b/templates/layout/html.html.twig @@ -0,0 +1,55 @@ +{# +/** + * @file + * Theme override for the basic structure of a single Drupal page. + * + * Variables: + * - logged_in: A flag indicating if user is logged in. + * - root_path: The root path of the current page (e.g., node, admin, user). + * - node_type: The content type for the current node, if the page is a node. + * - head_title: List of text elements that make up the head_title variable. + * May contain one or more of the following: + * - title: The title of the page. + * - name: The name of the site. + * - slogan: The slogan of the site. + * - page_top: Initial rendered markup. This should be printed before 'page'. + * - page: The rendered page markup. + * - page_bottom: Closing rendered markup. This variable should be printed after + * 'page'. + * - db_offline: A flag indicating if the database is offline. + * - placeholder_token: The token for generating head, css, js and js-bottom + * placeholders. + * + * @see template_preprocess_html() + */ +#} +{% + set body_classes = [ + logged_in ? 'user-logged-in', + not root_path ? 'path-frontpage' : 'path-' ~ root_path|clean_class, + node_type ? 'page-node-type-' ~ node_type|clean_class, + db_offline ? 'db-offline', + ] +%} + + + + + {{ head_title|safe_join(' | ') }} + + + + + {# + Keyboard navigation/accessibility link to main content section in + page.html.twig. + #} + + {{ page_top }} + {{ page }} + {{ page_bottom }} + + + diff --git a/templates/layout/maintenance-page.html.twig b/templates/layout/maintenance-page.html.twig new file mode 100644 index 0000000..7463b02 --- /dev/null +++ b/templates/layout/maintenance-page.html.twig @@ -0,0 +1,65 @@ +{# +/** + * @file + * Theme override to display a single Drupal page while offline. + * + * All available variables are mirrored in page.html.twig. + * Some may be blank but they are provided for consistency. + * + * @see template_preprocess_maintenance_page() + */ +#} +
+ +
+ {% if logo %} + + {{ 'Home'|t }} + + {% endif %} + + {% if site_name or site_slogan %} +
+ {% if site_name %} +

+ {{ site_name }} +

+ {% endif %} + + {% if site_slogan %} +
{{ site_slogan }}
+ {% endif %} +
{# /.name-and-slogan #} + {% endif %} + +
+ +
+ {% if title %} +

{{ title }}

+ {% endif %} + + {{ page.highlighted }} + + {{ page.content }} +
+ + {% if page.sidebar_first %} + {# /.layout-sidebar-first #} + {% endif %} + + {% if page.sidebar_second %} + {# /.layout-sidebar-second #} + {% endif %} + + {% if page.footer %} +
+ {{ page.footer }} +
+ {% endif %} + +
{# /.layout-container #} diff --git a/templates/layout/page.html.twig b/templates/layout/page.html.twig new file mode 100644 index 0000000..0f5ba83 --- /dev/null +++ b/templates/layout/page.html.twig @@ -0,0 +1,87 @@ +{# +/** + * @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 + */ +#} +
+ +
+ {{ page.header }} +
+ + {{ page.primary_menu }} + {{ page.secondary_menu }} + + {{ page.breadcrumb }} + + {{ page.highlighted }} + + {{ page.help }} + +
+ {# link is in html.html.twig #} + +
+ {{ page.content }} +
{# /.layout-content #} + + {% if page.sidebar_first %} + + {% endif %} + + {% if page.sidebar_second %} + + {% endif %} + +
+ + {% if page.footer %} +
+ {{ page.footer }} +
+ {% endif %} + +
{# /.layout-container #} diff --git a/templates/layout/region.html.twig b/templates/layout/region.html.twig new file mode 100644 index 0000000..95e71ce --- /dev/null +++ b/templates/layout/region.html.twig @@ -0,0 +1,25 @@ +{# +/** + * @file + * Theme override to display a region. + * + * Available variables: + * - content: The content for this region, typically blocks. + * - attributes: HTML attributes for the region
. + * - 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 %} + + {{ content }} +
+{% endif %} diff --git a/templates/misc/progress-bar.html.twig b/templates/misc/progress-bar.html.twig new file mode 100644 index 0000000..6bb7517 --- /dev/null +++ b/templates/misc/progress-bar.html.twig @@ -0,0 +1,22 @@ +{# +/** + * @file + * Theme override for a progress bar. + * + * Note that the core Batch API uses this only for non-JavaScript batch jobs. + * + * Available variables: + * - label: The label of the working task. + * - percent: The percentage of the progress. + * - message: A string containing information to be displayed. + */ +#} +{{ attach_library('islandscholar/progress') }} +
+ {% if label %} +
{{ label }}
+ {% endif %} +
+
{{ percent }}%
+
{{ message }}
+
diff --git a/templates/misc/status-messages.html.twig b/templates/misc/status-messages.html.twig new file mode 100644 index 0000000..7dda6c0 --- /dev/null +++ b/templates/misc/status-messages.html.twig @@ -0,0 +1,55 @@ +{# +/** + * @file + * Theme override for status messages. + * + * Displays status, error, and warning messages, grouped by type. + * + * An invisible heading identifies the messages for assistive technology. + * Sighted users see a colored box. See http://www.w3.org/TR/WCAG-TECHS/H69.html + * for info. + * + * Add an ARIA label to the contentinfo area so that assistive technology + * user agents will better describe this landmark. + * + * Available variables: + * - message_list: List of messages to be displayed, grouped by type. + * - status_headings: List of all status types. + * - attributes: HTML attributes for the element, including: + * - class: HTML classes. + */ +#} +
+{% block messages %} +{% for type, messages in message_list %} + {% + set classes = [ + 'messages', + 'messages--' ~ type, + ] + %} +
+ {% if type == 'error' %} +
+ {% endif %} + {% if status_headings[type] %} +

{{ status_headings[type] }}

+ {% endif %} + {% if messages|length > 1 %} +
    + {% for message in messages %} +
  • {{ message }}
  • + {% endfor %} +
+ {% else %} + {{ messages|first }} + {% endif %} + {% if type == 'error' %} +
+ {% endif %} +
+ {# Remove type specific classes. #} + {% set attributes = attributes.removeClass(classes) %} +{% endfor %} +{% endblock messages %} +
diff --git a/templates/navigation/breadcrumb.html.twig b/templates/navigation/breadcrumb.html.twig new file mode 100644 index 0000000..7dc08c5 --- /dev/null +++ b/templates/navigation/breadcrumb.html.twig @@ -0,0 +1,25 @@ +{# +/** + * @file + * Theme override for a breadcrumb trail. + * + * Available variables: + * - breadcrumb: Breadcrumb trail items. + */ +#} +{% if breadcrumb %} + +{% endif %} diff --git a/templates/navigation/links.html.twig b/templates/navigation/links.html.twig new file mode 100644 index 0000000..8eb0033 --- /dev/null +++ b/templates/navigation/links.html.twig @@ -0,0 +1,55 @@ +{# +/** + * @file + * Theme override for a set of 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() + */ +#} +{% if links -%} + {%- if heading -%} + {%- if heading.level -%} + <{{ heading.level }}{{ heading.attributes }}>{{ heading.text }} + {%- else -%} + {{ heading.text }}

+ {%- endif -%} + {%- endif -%} + + {%- for item in links -%} + + {%- if item.link -%} + {{ item.link }} + {%- elseif item.text_attributes -%} + {{ item.text }}
+ {%- else -%} + {{ item.text }} + {%- endif -%} + + {%- endfor -%} + +{%- endif %} diff --git a/templates/navigation/menu-local-action.html.twig b/templates/navigation/menu-local-action.html.twig new file mode 100644 index 0000000..2787283 --- /dev/null +++ b/templates/navigation/menu-local-action.html.twig @@ -0,0 +1,13 @@ +{# +/** + * @file + * Theme override for a single local action link. + * + * Available variables: + * - attributes: HTML attributes for the wrapper element. + * - link: A rendered link element. + * + * @see template_preprocess_menu_local_action() + */ +#} +{{ link }} diff --git a/templates/navigation/menu-local-task.html.twig b/templates/navigation/menu-local-task.html.twig new file mode 100644 index 0000000..b855981 --- /dev/null +++ b/templates/navigation/menu-local-task.html.twig @@ -0,0 +1,17 @@ +{# +/** + * @file + * Theme override for a local task link. + * + * Available variables: + * - attributes: HTML attributes for the wrapper element. + * - is_active: Whether the task item is an active tab. + * - link: A rendered link element. + * + * Note: This template renders the content for each task item in + * menu-local-tasks.html.twig. + * + * @see template_preprocess_menu_local_task() + */ +#} +{{ link }} diff --git a/templates/navigation/menu-local-tasks.html.twig b/templates/navigation/menu-local-tasks.html.twig new file mode 100644 index 0000000..8eb20ab --- /dev/null +++ b/templates/navigation/menu-local-tasks.html.twig @@ -0,0 +1,21 @@ +{# +/** + * @file + * Theme override to display primary and secondary local tasks. + * + * Available variables: + * - primary: HTML list items representing primary tasks. + * - secondary: HTML list items representing secondary tasks. + * + * Each item in these variables (primary and secondary) can be individually + * themed in menu-local-task.html.twig. + */ +#} +{% if primary %} +

{{ 'Primary tabs'|t }}

+
    {{ primary }}
+{% endif %} +{% if secondary %} +

{{ 'Secondary tabs'|t }}

+
    {{ secondary }}
+{% endif %} diff --git a/templates/navigation/menu.html.twig b/templates/navigation/menu.html.twig new file mode 100644 index 0000000..ef04ced --- /dev/null +++ b/templates/navigation/menu.html.twig @@ -0,0 +1,55 @@ +{# +/** + * @file + * Theme override to display a menu. + * + * Available variables: + * - menu_name: The machine name of the menu. + * - items: A nested list of menu items. Each menu item contains: + * - attributes: HTML attributes for the menu item. + * - below: The menu item child items. + * - title: The menu link title. + * - url: The menu link url, instance of \Drupal\Core\Url + * - localized_options: Menu link localized options. + * - is_expanded: TRUE if the link has visible children within the current + * menu tree. + * - is_collapsed: TRUE if the link has children within the current menu tree + * that are not currently visible. + * - in_active_trail: TRUE if the link is in the active trail. + */ +#} +{% import _self as menus %} + +{# + We call a macro which calls itself to render the full tree. + @see https://twig.symfony.com/doc/3.x/tags/macro.html +#} +{{ menus.menu_links(items, attributes, 0) }} + +{% macro menu_links(items, attributes, menu_level) %} + {% import _self as menus %} + {% if items %} + {% if menu_level == 0 %} + + {% else %} + + {% endif %} +{% endmacro %} diff --git a/templates/navigation/pager.html.twig b/templates/navigation/pager.html.twig new file mode 100644 index 0000000..6f863fa --- /dev/null +++ b/templates/navigation/pager.html.twig @@ -0,0 +1,99 @@ +{# +/** + * @file + * Theme override to display a pager. + * + * Available variables: + * - heading_id: Pagination heading ID. + * - items: List of pager items. + * The list is keyed by the following elements: + * - first: Item for the first page; not present on the first page of results. + * - previous: Item for the previous page; not present on the first page + * of results. + * - next: Item for the next page; not present on the last page of results. + * - last: Item for the last page; not present on the last page of results. + * - pages: List of pages, keyed by page number. + * Sub-sub elements: + * items.first, items.previous, items.next, items.last, and each item inside + * items.pages contain the following elements: + * - href: URL with appropriate query parameters for the item. + * - attributes: A keyed list of HTML attributes for the item. + * - text: The visible text used for the item link, such as "‹ Previous" + * or "Next ›". + * - current: The page number of the current page. + * - ellipses: If there are more pages than the quantity allows, then an + * ellipsis before or after the listed pages may be present. + * - previous: Present if the currently visible list of pages does not start + * at the first page. + * - next: Present if the visible list of pages ends before the last page. + * + * @see template_preprocess_pager() + */ +#} +{% if items %} + +{% endif %} diff --git a/templates/navigation/vertical-tabs.html.twig b/templates/navigation/vertical-tabs.html.twig new file mode 100644 index 0000000..5872220 --- /dev/null +++ b/templates/navigation/vertical-tabs.html.twig @@ -0,0 +1,13 @@ +{# +/** + * @file + * Theme override for vertical tabs. + * + * Available variables + * - attributes: A list of HTML attributes for the wrapper element. + * - children: The rendered tabs. + * + * @see template_preprocess_vertical_tabs() + */ +#} +{{ children }} diff --git a/templates/user/user.html.twig b/templates/user/user.html.twig new file mode 100644 index 0000000..9a824ef --- /dev/null +++ b/templates/user/user.html.twig @@ -0,0 +1,23 @@ +{# +/** + * @file + * Theme override to present all user data. + * + * This template is used when viewing a registered user's page, + * e.g., example.com/user/123. 123 being the user's ID. + * + * Available variables: + * - content: A list of content items. Use 'content' to print all content, or + * print a subset such as 'content.field_example'. Fields attached to a user + * such as 'user_picture' are available as 'content.user_picture'. + * - attributes: HTML attributes for the container element. + * - user: A Drupal User entity. + * + * @see template_preprocess_user() + */ +#} + + {% if content %} + {{- content -}} + {% endif %} + diff --git a/templates/user/username.html.twig b/templates/user/username.html.twig new file mode 100644 index 0000000..df694df --- /dev/null +++ b/templates/user/username.html.twig @@ -0,0 +1,29 @@ +{# +/** + * @file + * Theme override for displaying a username. + * + * Available variables: + * - account: The full account information for the user. + * - uid: The user ID, or zero if not a user. As used in anonymous comments. + * - name: The user's name, sanitized, and optionally truncated. + * - name_raw: The user's name, un-truncated. + * - truncated: Whether the user's name was truncated. + * - extra: Additional text to append to the user's name, sanitized. + * - profile_access: Whether the current user has permission to access this + users profile page. + * - link_path: The path or URL of the user's profile page, home page, + * or other desired page to link to for more information about the user. + * - homepage: (optional) The home page of the account, only set for non users. + * - link_options: Options to set on the \Drupal\Core\Url object if linking the + * user's name to the user's page. + * - attributes: HTML attributes for the containing element. + * + * @see template_preprocess_username() + */ +#} +{% if link_path -%} + {{ name }}{{ extra }} +{%- else -%} + {{ name }}{{ extra }} +{%- endif -%} diff --git a/templates/views/views-exposed-form.html.twig b/templates/views/views-exposed-form.html.twig new file mode 100644 index 0000000..3c679ae --- /dev/null +++ b/templates/views/views-exposed-form.html.twig @@ -0,0 +1,21 @@ +{# +/** + * @file + * Theme override for a views exposed form. + * + * Available variables: + * - form: A render element representing the form. + * + * @see template_preprocess_views_exposed_form() + */ +#} +{% if q is not empty %} + {# + This ensures that, if clean URLs are off, the 'q' is added first, + as a hidden form element, so that it shows up first in the POST URL. + #} +{{ q }} +{% endif %} +
+ {{ form }} +
diff --git a/templates/views/views-mini-pager.html.twig b/templates/views/views-mini-pager.html.twig new file mode 100644 index 0000000..4b46f2b --- /dev/null +++ b/templates/views/views-mini-pager.html.twig @@ -0,0 +1,42 @@ +{# +/** + * @file + * Theme override for a views mini-pager. + * + * Available variables: + * - heading_id: Pagination heading ID. + * - items: List of pager items. + * + * @see template_preprocess_views_mini_pager() + */ +#} +{% if items.previous or items.next %} + +{% endif %} diff --git a/templates/views/views-view-grid.html.twig b/templates/views/views-view-grid.html.twig new file mode 100644 index 0000000..8a3a20b --- /dev/null +++ b/templates/views/views-view-grid.html.twig @@ -0,0 +1,76 @@ +{# +/** + * @file + * Theme override for views to display rows in a grid. + * + * Available variables: + * - attributes: HTML attributes for the wrapping element. + * - title: The title of this group of rows. + * - view: The view object. + * - rows: The rendered view results. + * - options: The view plugin style options. + * - row_class_default: A flag indicating whether default classes should be + * used on rows. + * - col_class_default: A flag indicating whether default classes should be + * used on columns. + * - items: A list of grid items. Each item contains a list of rows or columns. + * The order in what comes first (row or column) depends on which alignment + * type is chosen (horizontal or vertical). + * - attributes: HTML attributes for each row or column. + * - content: A list of columns or rows. Each row or column contains: + * - attributes: HTML attributes for each row or column. + * - content: The row or column contents. + * + * @see template_preprocess_views_view_grid() + */ +#} +{% + set classes = [ + 'views-view-grid', + options.alignment, + 'cols-' ~ options.columns, + 'clearfix', + ] +%} +{% if options.row_class_default %} + {% + set row_classes = [ + 'views-row', + options.alignment == 'horizontal' ? 'clearfix', + ] + %} +{% endif %} +{% if options.col_class_default %} + {% + set col_classes = [ + 'views-col', + options.alignment == 'vertical' ? 'clearfix', + ] + %} +{% endif %} +{% if title %} +

{{ title }}

+{% endif %} + + {% if options.alignment == 'horizontal' %} + {% for row in items %} + + {% for column in row.content %} + + {{- column.content -}} + + {% endfor %} + + {% endfor %} + {% else %} + {% for column in items %} + + {% for row in column.content %} + + {{- row.content -}} + + {% endfor %} + + {% endfor %} + {% endif %} + diff --git a/templates/views/views-view-grouping.html.twig b/templates/views/views-view-grouping.html.twig new file mode 100644 index 0000000..44905e5 --- /dev/null +++ b/templates/views/views-view-grouping.html.twig @@ -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() + */ +#} +
+
{{ title }}
+
{{ content }}
+
diff --git a/templates/views/views-view-list.html.twig b/templates/views/views-view-list.html.twig new file mode 100644 index 0000000..50cc74b --- /dev/null +++ b/templates/views/views-view-list.html.twig @@ -0,0 +1,38 @@ +{# +/** + * @file + * Theme override for a view template to display a list of rows. + * + * Available variables: + * - attributes: HTML attributes for the container. + * - rows: A list of rows for this list. + * - attributes: The row's HTML attributes. + * - content: The row's contents. + * - title: The title of this group of rows. May be empty. + * - list: @todo. + * - type: Starting tag will be either a ul or ol. + * - attributes: HTML attributes for the list element. + * + * @see template_preprocess_views_view_list() + */ +#} +{% if attributes -%} + +{% endif %} + {% if title %} +

{{ title }}

+ {% endif %} + + <{{ list.type }}{{ list.attributes }}> + + {% for row in rows %} + + {{- row.content -}} + + {% endfor %} + + + +{% if attributes -%} + +{% endif %} diff --git a/templates/views/views-view-summary-unformatted.html.twig b/templates/views/views-view-summary-unformatted.html.twig new file mode 100644 index 0000000..151734e --- /dev/null +++ b/templates/views/views-view-summary-unformatted.html.twig @@ -0,0 +1,31 @@ +{# +/** + * @file + * Theme override for unformatted summary links. + * + * Available variables: + * - rows: The rows contained in this view. + * - url: The URL to this row's content. + * - count: The number of items this summary item represents. + * - separator: A separator between each row. + * - attributes: HTML attributes for a row. + * - active: A flag indicating whether the row is active. + * - options: Flags indicating how each row should be displayed. This contains: + * - count: A flag indicating whether the row's 'count' should be displayed. + * - inline: A flag indicating whether the item should be wrapped in an inline + * or block level HTML element. + * + * @see template_preprocess_views_view_summary_unformatted() + */ +#} +{% for row in rows %} + {{ options.inline ? ' + {% if row.separator -%} + {{ row.separator }} + {%- endif %} + {{ row.link }} + {% if options.count %} + ({{ row.count }}) + {% endif %} + {{ options.inline ? '' : '' }} +{% endfor %} diff --git a/templates/views/views-view-summary.html.twig b/templates/views/views-view-summary.html.twig new file mode 100644 index 0000000..3190a45 --- /dev/null +++ b/templates/views/views-view-summary.html.twig @@ -0,0 +1,31 @@ +{# +/** + * @file + * Theme override to display a list of summary lines. + * + * Available variables: + * - rows: The rows contained in this view. + * Each row contains: + * - url: The summary link URL. + * - link: The summary link text. + * - count: The number of items under this grouping. + * - attributes: HTML attributes to apply to each row. + * - active: A flag indicating whether the row is active. + * - options: Flags indicating how the summary should be displayed. + * This contains: + * - count: A flag indicating whether the count should be displayed. + * + * @see template_preprocess_views_view_summary() + */ +#} +
+
    + {% for row in rows %} +
  • {{ row.link }} + {% if options.count %} + ({{ row.count }}) + {% endif %} +
  • + {% endfor %} +
+
diff --git a/templates/views/views-view-table.html.twig b/templates/views/views-view-table.html.twig new file mode 100644 index 0000000..edc1498 --- /dev/null +++ b/templates/views/views-view-table.html.twig @@ -0,0 +1,120 @@ +{# +/** + * @file + * Theme override for displaying a view as a table. + * + * Available variables: + * - attributes: Remaining HTML attributes for the element. + * - class: HTML classes that can be used to style contextually through CSS. + * - title : The title of this group of rows. + * - header: The table header columns. + * - attributes: Remaining HTML attributes for the element. + * - content: HTML classes to apply to each header cell, indexed by + * the header's key. + * - default_classes: A flag indicating whether default classes should be + * used. + * - caption_needed: Is the caption tag needed. + * - caption: The caption for this table. + * - accessibility_description: Extended description for the table details. + * - accessibility_summary: Summary for the table details. + * - rows: Table row items. Rows are keyed by row number. + * - attributes: HTML classes to apply to each row. + * - columns: Row column items. Columns are keyed by column number. + * - attributes: HTML classes to apply to each column. + * - content: The column content. + * - default_classes: A flag indicating whether default classes should be + * used. + * - responsive: A flag indicating whether table is responsive. + * - sticky: A flag indicating whether table header is sticky. + * - summary_element: A render array with table summary information (if any). + * + * @see template_preprocess_views_view_table() + */ +#} +{% + set classes = [ + 'views-table', + 'views-view-table', + 'cols-' ~ header|length, + responsive ? 'responsive-enabled', + sticky ? 'sticky-enabled', + ] +%} + + {% if caption_needed %} + + {% if caption %} + {{ caption }} + {% else %} + {{ title }} + {% endif %} + {% if (summary_element is not empty) %} + {{ summary_element }} + {% endif %} + + {% endif %} + {% if header %} + + + {% for key, column in header %} + {% if column.default_classes %} + {% + set column_classes = [ + 'views-field', + 'views-field-' ~ fields[key], + ] + %} + {% endif %} + + {%- if column.wrapper_element -%} + <{{ column.wrapper_element }}> + {%- if column.url -%} + {{ column.content }}{{ column.sort_indicator }} + {%- else -%} + {{ column.content }}{{ column.sort_indicator }} + {%- endif -%} + + {%- else -%} + {%- if column.url -%} + {{ column.content }}{{ column.sort_indicator }} + {%- else -%} + {{- column.content }}{{ column.sort_indicator }} + {%- endif -%} + {%- endif -%} + + {% endfor %} + + + {% endif %} + + {% for row in rows %} + + {% for key, column in row.columns %} + {% if column.default_classes %} + {% + set column_classes = [ + 'views-field' + ] + %} + {% for field in column.fields %} + {% set column_classes = column_classes|merge(['views-field-' ~ field]) %} + {% endfor %} + {% endif %} + + {%- if column.wrapper_element -%} + <{{ column.wrapper_element }}> + {% for content in column.content %} + {{ content.separator }}{{ content.field_output }} + {% endfor %} + + {%- else -%} + {% for content in column.content %} + {{- content.separator }}{{ content.field_output -}} + {% endfor %} + {%- endif %} + + {% endfor %} + + {% endfor %} + + diff --git a/templates/views/views-view-unformatted.html.twig b/templates/views/views-view-unformatted.html.twig new file mode 100644 index 0000000..534ac9a --- /dev/null +++ b/templates/views/views-view-unformatted.html.twig @@ -0,0 +1,30 @@ +{# +/** + * @file + * Theme override 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() + */ +#} +{% if title %} +

{{ title }}

+{% endif %} +{% for row in rows %} + {% + set row_classes = [ + default_row_class ? 'views-row', + ] + %} + + {{- row.content -}} + +{% endfor %} diff --git a/templates/views/views-view.html.twig b/templates/views/views-view.html.twig new file mode 100644 index 0000000..251b061 --- /dev/null +++ b/templates/views/views-view.html.twig @@ -0,0 +1,95 @@ +{# +/** + * @file + * Theme override for a main view template. + * + * Available variables: + * - attributes: Remaining HTML attributes for the element. + * - css_name: A CSS-safe version of the view name. + * - css_class: The user-specified classes names, if any. + * - header: The optional header. + * - footer: The optional footer. + * - rows: The results of the view query, if any. + * - empty: The content to display if there are no rows. + * - pager: The optional pager next/prev links to display. + * - exposed: Exposed widget form/info to display. + * - feed_icons: Optional feed icons to display. + * - more: An optional link to the next page of results. + * - title: Title of the view, only used when displaying in the admin preview. + * - title_prefix: Additional output populated by modules, intended to be + * displayed in front of the view title. + * - title_suffix: Additional output populated by modules, intended to be + * displayed after the view title. + * - attachment_before: An optional attachment view to be displayed before the + * view content. + * - attachment_after: An optional attachment view to be displayed after the + * view content. + * - dom_id: Unique id for every view being printed to give unique class for + * JavaScript. + * + * @see template_preprocess_views_view() + */ +#} +{% + set classes = [ + 'view', + 'view-' ~ id|clean_class, + 'view-id-' ~ id, + 'view-display-id-' ~ display_id, + dom_id ? 'js-view-dom-id-' ~ dom_id, + ] +%} + + {{ title_prefix }} + {% if title %} + {{ title }} + {% endif %} + {{ title_suffix }} + {% if header %} +
+ {{ header }} +
+ {% endif %} + {% if exposed %} +
+ {{ exposed }} +
+ {% endif %} + {% if attachment_before %} +
+ {{ attachment_before }} +
+ {% endif %} + + {% if rows %} +
+ {{ rows }} +
+ {% elseif empty %} +
+ {{ empty }} +
+ {% endif %} + + {% if pager %} + {{ pager }} + {% endif %} + {% if attachment_after %} +
+ {{ attachment_after }} +
+ {% endif %} + {% if more %} + {{ more }} + {% endif %} + {% if footer %} + + {% endif %} + {% if feed_icons %} +
+ {{ feed_icons }} +
+ {% endif %} +