Initial Drupal 11 with DDEV setup

This commit is contained in:
gluebox
2025-10-08 11:39:17 -04:00
commit 89ef74b305
25344 changed files with 2599172 additions and 0 deletions

View File

@ -0,0 +1,8 @@
WHAT IS THIS DIRECTORY FOR?
--------------------------------
This directory is for templates previously inherited from the Classy theme.
WHY WERE CLASSY TEMPLATES COPIED HERE?
-------------------------------------------
Classy was removed in Drupal 10. To prepare for Classy's removal, templates that
would otherwise be inherited from Classy are copied here.

View File

@ -0,0 +1,46 @@
{#
/**
* @file
* Theme override for the search form block.
*
* Available variables:
* - plugin_id: The ID of the block implementation.
* - label: The configured label of the block if visible.
* - configuration: A list of the block's configuration values, including:
* - label: The configured label for the block.
* - label_display: The display settings for the label.
* - provider: The module or other provider that provided this block plugin.
* - Block plugin specific settings will also be stored here.
* - in_preview: Whether the plugin is being rendered in preview mode.
* - content: The content of this block.
* - attributes: A list HTML attributes populated by modules, intended to
* be added to the main container tag of this template. Includes:
* - id: A valid HTML ID and guaranteed unique.
* - title_attributes: Same as attributes, except applied to the main title
* tag that appears in the template.
* - title_prefix: Additional output populated by modules, intended to be
* displayed in front of the main title tag that appears in the template.
* - title_suffix: Additional output populated by modules, intended to be
* displayed after the main title tag that appears in the template.
*
* @see template_preprocess_block()
* @see search_preprocess_block()
*/
#}
{%
set classes = [
'block',
'block-search',
'container-inline',
]
%}
<div{{ attributes.addClass(classes) }}>
{{ title_prefix }}
{% if label %}
<h2{{ title_attributes }}>{{ label }}</h2>
{% endif %}
{{ title_suffix }}
{% block content %}
{{ content }}
{% endblock %}
</div>

View File

@ -0,0 +1,30 @@
{% extends "block.html.twig" %}
{#
/**
* @file
* Theme override for a branding block.
*
* Each branding element variable (logo, name, slogan) is only available if
* enabled in the block configuration.
*
* Available variables:
* - site_logo: Logo for site as defined in Appearance or theme settings.
* - site_name: Name for site as defined in Site information settings.
* - site_slogan: Slogan for site as defined in Site information settings.
*/
#}
{% block content %}
{% if site_logo %}
<a href="{{ path('<front>') }}" rel="home" class="site-logo">
<img src="{{ site_logo }}" alt="{{ 'Home'|t }}" fetchpriority="high" />
</a>
{% endif %}
{% if site_name %}
<div class="site-name">
<a href="{{ path('<front>') }}" rel="home">{{ site_name }}</a>
</div>
{% endif %}
{% if site_slogan %}
<div class="site-slogan">{{ site_slogan }}</div>
{% endif %}
{% endblock %}

View File

@ -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
* https://www.w3.org/TR/WCAG-TECHS/H42.html for more information.
*/
#}
{%
set classes = [
'block',
'block-menu',
'navigation',
'menu--' ~ derivative_plugin_id|clean_class,
]
%}
{% set heading_id = attributes.id ~ '-menu'|clean_id %}
<nav role="navigation" aria-labelledby="{{ heading_id }}"{{ attributes.addClass(classes)|without('role', 'aria-labelledby') }}>
{# Label. If not displayed, we still provide it for screen readers. #}
{% if not configuration.label_display %}
{% set title_attributes = title_attributes.addClass('visually-hidden') %}
{% endif %}
{{ title_prefix }}
<h2{{ title_attributes.setAttribute('id', heading_id) }}>{{ configuration.label }}</h2>
{{ title_suffix }}
{# Menu. #}
{% block content %}
{{ content }}
{% endblock %}
</nav>

View File

@ -0,0 +1,45 @@
{#
/**
* @file
* Theme override to display a block.
*
* Available variables:
* - plugin_id: The ID of the block implementation.
* - label: The configured label of the block if visible.
* - configuration: A list of the block's configuration values.
* - label: The configured label for the block.
* - label_display: The display settings for the label.
* - provider: The module or other provider that provided this block plugin.
* - Block plugin specific settings will also be stored here.
* - in_preview: Whether the plugin is being rendered in preview mode.
* - content: The content of this block.
* - attributes: array of HTML attributes populated by modules, intended to
* be added to the main container tag of this template.
* - id: A valid HTML ID and guaranteed unique.
* - title_attributes: Same as attributes, except applied to the main title
* tag that appears in the template.
* - title_prefix: Additional output populated by modules, intended to be
* displayed in front of the main title tag that appears in the template.
* - title_suffix: Additional output populated by modules, intended to be
* displayed after the main title tag that appears in the template.
*
* @see template_preprocess_block()
*/
#}
{%
set classes = [
'block',
'block-' ~ configuration.provider|clean_class,
'block-' ~ plugin_id|clean_class,
]
%}
<div{{ attributes.addClass(classes) }}>
{{ title_prefix }}
{% if label %}
<h2{{ title_attributes }}>{{ label }}</h2>
{% endif %}
{{ title_suffix }}
{% block content %}
{{ content }}
{% endblock %}
</div>

View File

@ -0,0 +1,18 @@
{#
/**
* @file
* Theme override for a filter caption.
*
* Returns HTML for a captioned image, audio, video or other tag.
*
* Available variables
* - string node: The complete HTML tag whose contents are being captioned.
* - string tag: The name of the HTML tag whose contents are being captioned.
* - string caption: The caption text.
* - string classes: The classes of the captioned HTML tag.
*/
#}
<figure role="group" class="caption caption-{{ tag }}{%- if classes %} {{ classes }}{%- endif %}">
{{ node }}
<figcaption>{{ caption }}</figcaption>
</figure>

View File

@ -0,0 +1,115 @@
{#
/**
* @file
* Theme override for comments.
*
* Available variables:
* - author: (optional) 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: (optional) 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: (optional) 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: (optional) Submission information created from author and
* created during template_preprocess_comment().
* - user_picture: (optional) The comment author's profile picture.
* - status: Comment status. Possible values are:
* unpublished, published, or preview.
* - title: (optional) 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, optional):
* - 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('claro/classy.indented') }}
{% endif %}
{%
set classes = [
'comment',
'js-comment',
status != 'published' ? status,
comment.owner.anonymous ? 'by-anonymous',
author_id and author_id == commented_entity.getOwnerId() ? 'by-' ~ commented_entity.getEntityTypeId() ~ '-author',
]
%}
<article{{ attributes.addClass(classes) }}>
{#
Hide the "new" indicator by default, let a piece of JavaScript ask the
server which comments are new for the user. Rendering the final "new"
indicator here would break the render cache.
#}
<mark class="hidden" data-comment-timestamp="{{ new_indicator_timestamp }}"></mark>
{% if submitted %}
<footer class="comment__meta">
{{ user_picture }}
<p class="comment__submitted">{{ submitted }}</p>
{#
Indicate the semantic relationship between parent and child comments for
accessibility. The list is difficult to navigate in a screen reader
without this information.
#}
{% if parent %}
<p class="parent visually-hidden">{{ parent }}</p>
{% endif %}
{{ permalink }}
</footer>
{% endif %}
<div{{ content_attributes.addClass('content') }}>
{% if title %}
{{ title_prefix }}
<h3{{ title_attributes }}>{{ title }}</h3>
{{ title_suffix }}
{% endif %}
{{ content }}
</div>
</article>

View File

@ -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
* https://www.w3.org/TR/WCAG-TECHS/H42.html for more information.
*
* @see \Drupal\Core\Theme\ThemePreprocess::preprocessLinks()
*
* @ingroup themeable
*/
#}
{% if links %}
<div class="node__links">
{% include "links.html.twig" %}
</div>
{% endif %}

View File

@ -0,0 +1,20 @@
{#
/**
* @file
* Theme override for a marker for new or updated content.
*
* Available variables:
* - status: Number representing the marker status to display. Use the constants
* below for comparison:
* - MARK_NEW
* - MARK_UPDATED
* - MARK_READ
*/
#}
{% if logged_in %}
{% if status is constant('MARK_NEW') %}
<span class="marker">{{ 'New'|t }}</span>
{% elseif status is constant('MARK_UPDATED') %}
<span class="marker">{{ 'Updated'|t }}</span>
{% endif %}
{% endif %}

View File

@ -0,0 +1,21 @@
{#
/**
* @file
* Theme override for a missing media error.
*
* Available variables
* - message: The message text.
* - attributes: HTML attributes for the containing element.
*
* When a response from the back end can't be returned, a related error message
* is displayed from JavaScript.
*
* @see Drupal.theme.mediaEmbedPreviewError
*
* @ingroup themeable
*/
#}
{{ attach_library('claro/classy.media_embed_error') }}
<div{{ attributes.addClass('media-embed-error', 'media-embed-error--missing-source') }}>
{{ message }}
</div>

View File

@ -0,0 +1,28 @@
{#
/**
* @file
* Theme override to display a media item.
*
* Available variables:
* - name: Name of the media.
* - content: Media content.
*
* @see template_preprocess_media()
*
* @ingroup themeable
*/
#}
{%
set classes = [
'media',
'media--type-' ~ media.bundle()|clean_class,
not media.isPublished() ? 'media--unpublished',
view_mode ? 'media--view-mode-' ~ view_mode|clean_class,
]
%}
<article{{ attributes.addClass(classes) }}>
{{ title_suffix.contextual_links }}
{% if content %}
{{ content }}
{% endif %}
</article>

View File

@ -0,0 +1,98 @@
{#
/**
* @file
* Theme override to display a node.
*
* Available variables:
* - node: The node entity with limited access to object properties and methods.
* Only method names starting with "get", "has", or "is" and a few common
* methods such as "id", "label", and "bundle" are available. For example:
* - node.getCreatedTime() will return the node creation timestamp.
* - node.hasField('field_example') returns TRUE if the node bundle includes
* field_example. (This does not indicate the presence of a value in this
* field.)
* - node.isPublished() will return whether the node is published or not.
* Calling other methods, such as node.delete(), will result in an exception.
* See \Drupal\node\Entity\Node for a full list of public properties and
* methods for the node object.
* - label: (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.
* - 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'.
*
* @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('claro/classy.node') }}
<article{{ attributes.addClass(classes) }}>
{{ title_prefix }}
{% if label and not page %}
<h2{{ title_attributes }}>
<a href="{{ url }}" rel="bookmark">{{ label }}</a>
</h2>
{% endif %}
{{ title_suffix }}
{% if display_submitted %}
<footer class="node__meta">
{{ author_picture }}
<div{{ author_attributes.addClass('node__submitted') }}>
{% trans %}Submitted by {{ author_name }} on {{ date }}{% endtrans %}
{{ metadata }}
</div>
</footer>
{% endif %}
<div{{ content_attributes.addClass('node__content') }}>
{{ content }}
</div>
</article>

View File

@ -0,0 +1,19 @@
{#
/**
* @file
* Theme override for page titles.
*
* Available variables:
* - title_attributes: HTML attributes for the page title element.
* - title_prefix: Additional output populated by modules, intended to be
* displayed in front of the main title tag that appears in the template.
* - title: The page title, for use in the actual content.
* - title_suffix: Additional output populated by modules, intended to be
* displayed after the main title tag that appears in the template.
*/
#}
{{ title_prefix }}
{% if title %}
<h1{{ title_attributes.addClass('page-title') }}>{{ title }}</h1>
{% endif %}
{{ title_suffix }}

View File

@ -0,0 +1,72 @@
{#
/**
* @file
* Theme override for displaying a single search result.
*
* This template renders a single search result. The list of results is
* rendered using '#theme' => 'item_list', with suggestions of:
* - item_list__search_results__(plugin_id)
* - item_list__search_results
*
* Available variables:
* - url: URL of the result.
* - title: Title of the result.
* - snippet: A small preview of the result. Does not apply to user searches.
* - info: String of all the meta information ready for print. Does not apply
* to user searches.
* - plugin_id: The machine-readable name of the plugin being executed,such
* as "node_search" or "user_search".
* - title_prefix: Additional output populated by modules, intended to be
* displayed in front of the main title tag that appears in the template.
* - title_suffix: Additional output populated by modules, intended to be
* displayed after the main title tag that appears in the template.
* - info_split: Contains same data as info, but split into separate parts.
* - info_split.type: Node type (or item type string supplied by module).
* - info_split.user: Author of the node linked to users profile. Depends
* on permission.
* - info_split.date: Last update of the node. Short formatted.
* - info_split.comment: Number of comments output as "% comments", %
* being the count. (Depends on comment.module).
* @todo The info variable needs to be made drillable and each of these sub
* items should instead be within info and renamed info.foo, info.bar, etc.
*
* Other variables:
* - title_attributes: HTML attributes for the title.
* - content_attributes: HTML attributes for the content.
*
* Since info_split is keyed, a direct print of the item is possible.
* This array does not apply to user searches so it is recommended to check
* for its existence before printing. The default keys of 'type', 'user' and
* 'date' always exist for node searches. Modules may provide other data.
* @code
* {% if (info_split.comment) %}
* <span class="info-comment">
* {{ info_split.comment }}
* </span>
* {% endif %}
* @endcode
*
* To check for all available data within info_split, use the code below.
* @code
* <pre>
* {{ dump(info_split) }}
* </pre>
* @endcode
*
* @see template_preprocess_search_result()
*/
#}
{{ attach_library('claro/classy.search-results') }}
{{ title_prefix }}
<h3{{ title_attributes.addClass('search-result__title') }}>
<a href="{{ url }}">{{ title }}</a>
</h3>
{{ title_suffix }}
<div class="search-result__snippet-info">
{% if snippet %}
<p{{ content_attributes.addClass('search-result__snippet') }}>{{ snippet }}</p>
{% endif %}
{% if info %}
<p class="search-result__info">{{ info }}</p>
{% endif %}
</div>

View File

@ -0,0 +1,41 @@
{#
/**
* @file
* Theme override to display a taxonomy term.
*
* Available variables:
* - url: URL of the current term.
* - name: (optional) Name of the current term.
* - content: Items for the content of the term (fields and description).
* Use 'content' to print them all, or print a subset such as
* 'content.description'. Use the following code to exclude the
* printing of a given child element:
* @code
* {{ content|without('description') }}
* @endcode
* - attributes: HTML attributes for the wrapper.
* - page: Flag for the full page state.
* - term: The taxonomy term entity, including:
* - id: The ID of the taxonomy term.
* - bundle: Machine name of the current vocabulary.
* - view_mode: View mode, e.g. 'full', 'teaser', etc.
*
* @see template_preprocess_taxonomy_term()
*/
#}
{%
set classes = [
'taxonomy-term',
'vocabulary-' ~ term.bundle|clean_class,
]
%}
<div{{ attributes.setAttribute('id', 'taxonomy-term-' ~ term.id).addClass(classes) }}>
{{ title_prefix }}
{% if name and not page %}
<h2><a href="{{ url }}">{{ name }}</a></h2>
{% endif %}
{{ title_suffix }}
<div class="content">
{{ content }}
</div>
</div>

View File

@ -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) %}

View File

@ -0,0 +1,41 @@
{#
/**
* @file
* Theme override for an item list.
*
* Available variables:
* - items: A list of items. Each item contains:
* - attributes: HTML attributes to be applied to each list item.
* - value: The content of the list element.
* - title: The title of the list.
* - list_type: The tag for list element ("ul" or "ol").
* - wrapper_attributes: HTML attributes to be applied to the list wrapper.
* - attributes: HTML attributes to be applied to the list.
* - empty: A message to display when there are no items. Allowed value is a
* string or render array.
* - context: A list of contextual data associated with the list. May contain:
* - list_style: The custom list style.
*
* @see template_preprocess_item_list()
*/
#}
{% if context.list_style %}
{%- set wrapper_attributes = wrapper_attributes.addClass('item-list--' ~ context.list_style) %}
{%- set attributes = attributes.addClass('item-list__' ~ context.list_style) %}
{% endif %}
{% if items or empty -%}
<div{{ wrapper_attributes.addClass('item-list') }}>
{%- if title is not empty -%}
<h3>{{ title }}</h3>
{%- endif -%}
{%- if items -%}
<{{ list_type }}{{ attributes }}>
{%- for item in items -%}
<li{{ item.attributes }}>{{ item.value }}</li>
{%- endfor -%}
</{{ list_type }}>
{%- else -%}
{{- empty -}}
{%- endif -%}
</div>
{%- endif %}

View File

@ -0,0 +1,115 @@
{#
/**
* @file
* Theme override to display a table.
*
* Available variables:
* - attributes: HTML attributes to apply to the <table> tag.
* - caption: A localized string for the <caption> tag.
* - colgroups: Column groups. Each group contains the following properties:
* - attributes: HTML attributes to apply to the <col> tag.
* Note: Drupal currently supports only one table header row, see
* https://www.drupal.org/node/893530 and
* http://api.drupal.org/api/drupal/includes!theme.inc/function/theme_table/7#comment-5109.
* - header: Table header cells. Each cell contains the following properties:
* - tag: The HTML tag name to use; either 'th' or 'td'.
* - attributes: HTML attributes to apply to the tag.
* - content: A localized string for the title of the column.
* - field: Field name (required for column sorting).
* - sort: Default sort order for this column ("asc" or "desc").
* - sticky: A flag indicating whether to use a "sticky" table header.
* - rows: Table rows. Each row contains the following properties:
* - attributes: HTML attributes to apply to the <tr> tag.
* - data: Table cells.
* - no_striping: A flag indicating that the row should receive no
* 'even / odd' styling. Defaults to FALSE.
* - cells: Table cells of the row. Each cell contains the following keys:
* - tag: The HTML tag name to use; either 'th' or 'td'.
* - attributes: Any HTML attributes, such as "colspan", to apply to the
* table cell.
* - content: The string to display in the table cell.
* - active_table_sort: A boolean indicating whether the cell is the active
table sort.
* - header: Boolean indicating whether the cell should be rendered as a
* header (<th>) or not (<td>).
* - footer: Table footer rows, in the same format as the rows variable.
* - empty: The message to display in an extra row if table does not have
* any rows.
* - no_striping: A boolean indicating that the row should receive no striping.
* - header_columns: The number of columns in the header.
*
* @see template_preprocess_table()
*/
#}
<table{{ attributes }}>
{% if caption %}
<caption>{{ caption }}</caption>
{% endif %}
{% for colgroup in colgroups %}
{% if colgroup.cols %}
<colgroup{{ colgroup.attributes }}>
{% for col in colgroup.cols %}
<col{{ col.attributes }} />
{% endfor %}
</colgroup>
{% else %}
<colgroup{{ colgroup.attributes }} />
{% endif %}
{% endfor %}
{% if header %}
<thead>
<tr>
{% for cell in header %}
{%
set cell_classes = [
cell.active_table_sort ? 'is-active',
]
%}
<{{ cell.tag }}{{ cell.attributes.addClass(cell_classes) }}>
{{- cell.content -}}
</{{ cell.tag }}>
{% endfor %}
</tr>
</thead>
{% endif %}
{% if rows %}
<tbody>
{% for row in rows %}
{%
set row_classes = [
not no_striping ? cycle(['odd', 'even'], loop.index0),
]
%}
<tr{{ row.attributes.addClass(row_classes) }}>
{% for cell in row.cells %}
<{{ cell.tag }}{{ cell.attributes }}>
{{- cell.content -}}
</{{ cell.tag }}>
{% endfor %}
</tr>
{% endfor %}
</tbody>
{% elseif empty %}
<tbody>
<tr class="odd">
<td colspan="{{ header_columns }}" class="empty message">{{ empty }}</td>
</tr>
</tbody>
{% endif %}
{% if footer %}
<tfoot>
{% for row in footer %}
<tr{{ row.attributes }}>
{% for cell in row.cells %}
<{{ cell.tag }}{{ cell.attributes }}>
{{- cell.content -}}
</{{ cell.tag }}>
{% endfor %}
</tr>
{% endfor %}
</tfoot>
{% endif %}
</table>

View File

@ -0,0 +1,57 @@
{#
/**
* @file
* Theme override for comment fields.
*
* Available variables:
* - attributes: HTML attributes for the containing element.
* - label_hidden: Whether to show the field label or not.
* - title_attributes: HTML attributes for the title.
* - label: The label for the field.
* - title_prefix: Additional output populated by modules, intended to be
* displayed in front of the main title tag that appears in the template.
* - title_suffix: Additional title output populated by modules, intended to
* be displayed after the main title tag that appears in the template.
* - comments: List of comments rendered through comment.html.twig.
* - comment_form: The 'Add new comment' form.
* - comment_display_mode: Is the comments are threaded.
* - comment_type: The comment type bundle ID for the comment field.
* - entity_type: The entity type to which the field belongs.
* - field_name: The name of the field.
* - field_type: The type of the field.
* - label_display: The display settings for the label.
*
* @see template_preprocess_field()
* @see comment_preprocess_field()
*/
#}
{%
set classes = [
'field',
'field--name-' ~ field_name|clean_class,
'field--type-' ~ field_type|clean_class,
'field--label-' ~ label_display,
'comment-wrapper',
]
%}
{%
set title_classes = [
'title',
label_display == 'visually_hidden' ? 'visually-hidden',
]
%}
<section{{ attributes.addClass(classes) }}>
{% if comments and not label_hidden %}
{{ title_prefix }}
<h2{{ title_attributes.addClass(title_classes) }}>{{ label }}</h2>
{{ title_suffix }}
{% endif %}
{{ comments }}
{% if comment_form %}
<h2 class="title comment-form__title">{{ 'Add new comment'|t }}</h2>
{{ comment_form }}
{% endif %}
</section>

View File

@ -0,0 +1,44 @@
{#
/**
* @file
* Theme override for the node created field.
*
* This is an override of field.html.twig for the node created field. See that
* template for documentation about its details and overrides.
*
* Available variables:
* - attributes: HTML attributes for the containing span element.
* - items: List of all the field items. Each item contains:
* - attributes: List of HTML attributes for each item.
* - content: The field item content.
* - entity_type: The entity type to which the field belongs.
* - field_name: The name of the field.
* - field_type: The type of the field.
* - label_display: The display settings for the label.
* - is_inline: If false, display an ordinary field.
* If true, display an inline format, suitable for inside elements such as
* <span>, <h2> and so on.
*
* @see field.html.twig
* @see node_preprocess_field__node()
*
* @todo Delete as part of https://www.drupal.org/node/3015623
*/
#}
{% if not is_inline %}
{% include "field.html.twig" %}
{% else %}
{%
set classes = [
'field',
'field--name-' ~ field_name|clean_class,
'field--type-' ~ field_type|clean_class,
'field--label-' ~ label_display,
]
%}
<span{{ attributes.addClass(classes) }}>
{%- for item in items -%}
{{ item.content }}
{%- endfor -%}
</span>
{% endif %}

View File

@ -0,0 +1,44 @@
{#
/**
* @file
* Theme override for the node title field.
*
* This is an override of field.html.twig for the node title field. See that
* template for documentation about its details and overrides.
*
* Available variables:
* - attributes: HTML attributes for the containing span element.
* - items: List of all the field items. Each item contains:
* - attributes: List of HTML attributes for each item.
* - content: The field item content.
* - entity_type: The entity type to which the field belongs.
* - field_name: The name of the field.
* - field_type: The type of the field.
* - label_display: The display settings for the label.
* - is_inline: If false, display an ordinary field.
* If true, display an inline format, suitable for inside elements such as
* <span>, <h2> and so on.
*
* @see field.html.twig
* @see node_preprocess_field__node()
*
* @todo Delete as part of https://www.drupal.org/node/3015623
*/
#}
{% if not is_inline %}
{% include "field.html.twig" %}
{% else %}
{%
set classes = [
'field',
'field--name-' ~ field_name|clean_class,
'field--type-' ~ field_type|clean_class,
'field--label-' ~ label_display,
]
%}
<span{{ attributes.addClass(classes) }}>
{%- for item in items -%}
{{ item.content }}
{%- endfor -%}
</span>
{% endif %}

View File

@ -0,0 +1,44 @@
{#
/**
* @file
* Theme override for the node user field.
*
* This is an override of field.html.twig for the node user field. See that
* template for documentation about its details and overrides.
*
* Available variables:
* - attributes: HTML attributes for the containing span element.
* - items: List of all the field items. Each item contains:
* - attributes: List of HTML attributes for each item.
* - content: The field item content.
* - entity_type: The entity type to which the field belongs.
* - field_name: The name of the field.
* - field_type: The type of the field.
* - label_display: The display settings for the label.
* - is_inline: If false, display an ordinary field.
* If true, display an inline format, suitable for inside elements such as
* <span>, <h2> and so on.
*
* @see field.html.twig
* @see node_preprocess_field__node()
*
* @todo Delete as part of https://www.drupal.org/node/3015623
*/
#}
{% if not is_inline %}
{% include "field.html.twig" %}
{% else %}
{%
set classes = [
'field',
'field--name-' ~ field_name|clean_class,
'field--type-' ~ field_type|clean_class,
'field--label-' ~ label_display,
]
%}
<span{{ attributes.addClass(classes) }}>
{%- for item in items -%}
{{ item.content }}
{%- endfor -%}
</span>
{% endif %}

View File

@ -0,0 +1 @@
{% extends "field--text.html.twig" %}

View File

@ -0,0 +1 @@
{% extends "field--text.html.twig" %}

View File

@ -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') %}

View File

@ -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 %}
<div{{ attributes.addClass(classes, 'field__items') }}>
{% for item in items %}
<div{{ item.attributes.addClass('field__item') }}>{{ item.content }}</div>
{% endfor %}
</div>
{% else %}
{% for item in items %}
<div{{ attributes.addClass(classes, 'field__item') }}>{{ item.content }}</div>
{% endfor %}
{% endif %}
{% else %}
<div{{ attributes.addClass(classes) }}>
<div{{ title_attributes.addClass(title_classes) }}>{{ label }}</div>
{% if multiple %}
<div class="field__items">
{% endif %}
{% for item in items %}
<div{{ item.attributes.addClass('field__item') }}>{{ item.content }}</div>
{% endfor %}
{% if multiple %}
</div>
{% endif %}
</div>
{% endif %}

View File

@ -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('claro/classy.file') }}
<audio {{ attributes }}>
{% for file in files %}
<source {{ file.source_attributes }} />
{% endfor %}
</audio>

View File

@ -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('claro/classy.file') }}
<video {{ attributes }}>
{% for file in files %}
<source {{ file.source_attributes }} />
{% endfor %}
</video>

View File

@ -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,
]
%}
<img{{ attributes.addClass(classes) }} />

View File

@ -0,0 +1,19 @@
{#
/**
* @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_link_formatter_link_separate()
*/
#}
<div class="link-item">
{%- if title -%}
<div class="link-title">{{- title -}}</div>
{%- endif -%}
<div class="link-url">{{- link -}}</div>
</div>

View File

@ -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 <time> element.
* Defaults to a human-readable representation of the timestamp value or the
* datetime attribute value using DateFormatter::format().
* - attributes: (optional) HTML attributes to apply to the <time> element.
* A datetime attribute in 'attributes' overrides the 'timestamp'. To
* create a valid datetime attribute value from a UNIX timestamp, use
* DateFormatter::format() with one of the predefined 'html_*' formats.
*
* @see \Drupal\Core\Datetime\DatePreprocess::preprocessTime()
* @see https://www.w3.org/TR/html5-author/the-time-element.html#attr-time-datetime
*/
#}
<time{{ attributes.addClass('datetime') }}>{{ text }}</time>

View File

@ -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 \Drupal\Core\Theme\ThemePreprocess::preprocessHtml()
*/
#}
{%
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',
]
%}
<!DOCTYPE html>
<html{{ html_attributes }}>
<head>
<head-placeholder token="{{ placeholder_token }}">
<title>{{ head_title|safe_join(' | ') }}</title>
<css-placeholder token="{{ placeholder_token }}">
<js-placeholder token="{{ placeholder_token }}">
</head>
<body{{ attributes.addClass(body_classes) }}>
{#
Keyboard navigation/accessibility link to main content section in
page.html.twig.
#}
<a href="#main-content" class="visually-hidden focusable skip-link">
{{ 'Skip to main content'|t }}
</a>
{{ page_top }}
{{ page }}
{{ page_bottom }}
<js-bottom-placeholder token="{{ placeholder_token }}">
</body>
</html>

View File

@ -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 <div>.
* - region: The name of the region variable as defined in the theme's
* .info.yml file.
*
* @see template_preprocess_region()
*/
#}
{%
set classes = [
'region',
'region-' ~ region|clean_class,
]
%}
{% if content %}
<div{{ attributes.addClass(classes) }}>
{{ content }}
</div>
{% endif %}

View File

@ -0,0 +1,28 @@
{#
/**
* @file
* Theme implementation the content area of the modal media library dialog.
*
* The content area is everything that is not the menu of available media
* types. This includes the form to add new media items, if available, and
* the view of available media to select.
*
* Available variables:
* - attributes: HTML attributes for the containing element.
* - children: The rendered child elements of the container.
* - has_parent: A flag to indicate that the container has one or more parent
containers.
*
* @see \Drupal\Core\Theme\ThemePreprocess::preprocessContainer()
*
* @ingroup themeable
*/
#}
{%
set classes = [
has_parent ? 'js-form-wrapper',
has_parent ? 'form-wrapper',
'media-library-content',
]
%}
<div{{ attributes.addClass(classes) }}>{{ children }}</div>

View File

@ -0,0 +1,28 @@
{#
/**
* @file
* Theme implementation of a wrapper for selected media items.
*
* This is used to wrap around the set of media items that are currently
* selected in the media library widget (not the modal dialog), which may
* be used for entity reference fields that target media.
*
* Available variables:
* - attributes: HTML attributes for the containing element.
* - children: The rendered child elements of the container.
* - has_parent: A flag to indicate that the container has one or more parent
containers.
*
* @see \Drupal\Core\Theme\ThemePreprocess::preprocessContainer()
*
* @ingroup themeable
*/
#}
{%
set classes = [
has_parent ? 'js-form-wrapper',
has_parent ? 'form-wrapper',
'media-library-selection',
]
%}
<div{{ attributes.addClass(classes) }}>{{ children }}</div>

View File

@ -0,0 +1,35 @@
{% extends "links.html.twig" %}
{#
/**
* @file
* Theme implementation of the media type menu in the media library dialog.
*
* 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
* https://www.w3.org/TR/WCAG-TECHS/H42.html for more information.
*
* @see \Drupal\Core\Theme\ThemePreprocess::preprocessLinks()
*/
#}
{% set attributes = attributes.addClass('media-library-menu') %}

View File

@ -0,0 +1,29 @@
{#
/**
* @file
* Default theme implementation of a media library item.
*
* This is used when displaying selected media items, either in the field
* widget or in the "Additional selected media" area when adding new
* media items in the media library modal dialog.
*
* Available variables:
* - attributes: HTML attributes for the containing element.
* - content: The content of the media library item, plus any additional
* fields or elements surrounding it.
*
* @see template_preprocess_media_library_item()
*
* @ingroup themeable
*/
#}
{%
set classes = [
'media-library-item',
'media-library-item--grid',
'media-library-item--small',
]
%}
<div{{ attributes.addClass(classes) }}>
{{ content }}
</div>

View File

@ -0,0 +1,28 @@
{#
/**
* @file
* Default theme implementation of a media library item.
*
* This is used when displaying selected media items, either in the field
* widget or in the "Additional selected media" area when adding new
* media items in the media library modal dialog.
*
* Available variables:
* - attributes: HTML attributes for the containing element.
* - content: The content of the media library item, plus any additional
* fields or elements surrounding it.
*
* @see template_preprocess_media_library_item()
*
* @ingroup themeable
*/
#}
{%
set classes = [
'media-library-item',
'media-library-item--grid',
]
%}
<div{{ attributes.addClass(classes) }}>
{{ content }}
</div>

View File

@ -0,0 +1,21 @@
{#
/**
* @file
* Theme override of a container used to wrap the media library's modal dialog
* interface.
*
* Available variables:
* - attributes: HTML attributes for the containing element.
* - menu: The menu of available media types to choose from.
* - content: The form to add new media items, followed by the grid or table of
* existing media items to choose from.
*
* @see template_preprocess_media_library_wrapper()
*
* @ingroup themeable
*/
#}
<div{{ attributes.addClass('media-library-wrapper') }}>
{{ menu }}
{{ content }}
</div>

View File

@ -0,0 +1,48 @@
{#
/**
* @file
* Theme override for a section of the help page.
*
* This implementation divides the links into 4 columns.
*
* Available variables:
* - title: The section title.
* - description: The description text for the section.
* - links: Links to display in the section.
* - empty: Text to display if there are no links.
*/
#}
<div class="clearfix">
<h2>{{ title }}</h2>
<p>{{ description }}</p>
{% if links %}
{# Calculate the column length, to divide links into 4 columns. #}
{% set size = links|length // 4 %}
{% if size * 4 < links|length %}
{% set size = size + 1 %}
{% endif %}
{# Output the links in 4 columns. #}
{% set count = 0 %}
{% for link in links %}
{% if count == 0 %}
{# Start a new column. #}
<div class="layout-column layout-column--quarter"><ul>
{% endif %}
<li>{{ link }}</li>
{% set count = count + 1 %}
{% if count >= size %}
{# End the current column. #}
{% set count = 0 %}
</ul></div>
{% endif %}
{% endfor %}
{# End the last column, if one is open. #}
{% if count > 0 %}
</ul></div>
{% endif %}
{% else %}
<p>{{ empty }}</p>
{% endif %}
</div>

View File

@ -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('claro/classy.progress') }}
<div class="progress" data-drupal-progress>
{% if label %}
<div class="progress__label">{{ label }}</div>
{% endif %}
<div class="progress__track"><div class="progress__bar" style="width: {{ percent }}%"></div></div>
<div class="progress__percentage">{{ percent }}%</div>
<div class="progress__description">{{ message }}</div>
</div>

View File

@ -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 %}
<ul{{ attributes.addClass('menu') }}>
{% else %}
<ul class="menu">
{% endif %}
{% for item in items %}
{%
set classes = [
'menu-item',
item.is_expanded ? 'menu-item--expanded',
item.is_collapsed ? 'menu-item--collapsed',
item.in_active_trail ? 'menu-item--active-trail',
]
%}
<li{{ item.attributes.addClass(classes) }}>
{{ link(item.title, item.url) }}
{% if item.below %}
{{ menus.menu_links(item.below, attributes, menu_level + 1) }}
{% endif %}
</li>
{% endfor %}
</ul>
{% endif %}
{% endmacro %}

View File

@ -0,0 +1,44 @@
{#
/**
* @file
* Theme override for the administrative toolbar.
*
* Available variables:
* - attributes: HTML attributes for the wrapper.
* - toolbar_attributes: HTML attributes to apply to the toolbar.
* - toolbar_heading: The heading or label for the toolbar.
* - tabs: List of tabs for the toolbar.
* - attributes: HTML attributes for the tab container.
* - link: Link or button for the menu tab.
* - trays: Toolbar tray list, each associated with a tab. Each tray in trays
* contains:
* - attributes: HTML attributes to apply to the tray.
* - label: The tray's label.
* - links: The tray menu links.
* - remainder: Any non-tray, non-tab elements left to be rendered.
*
* @see template_preprocess_toolbar()
*/
#}
<div{{ attributes.addClass('toolbar') }}>
<nav{{ toolbar_attributes.addClass('toolbar-bar', 'clearfix') }}>
<h2 class="visually-hidden">{{ toolbar_heading }}</h2>
{% for key, tab in tabs %}
{% set tray = trays[key] %}
<div{{ tab.attributes.addClass('toolbar-tab') }}>
{{ tab.link }}
<div{{ tray.attributes }}>
{% if tray.label %}
<nav class="toolbar-lining clearfix" role="navigation" aria-label="{{ tray.label }}">
<h3 class="toolbar-tray-name visually-hidden">{{ tray.label }}</h3>
{% else %}
<nav class="toolbar-lining clearfix" role="navigation">
{% endif %}
{{- tray.links -}}
</nav>
</div>
</div>
{% endfor %}
</nav>
{{ remainder }}
</div>

View File

@ -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()
*/
#}
<article{{ attributes.addClass('profile') }}>
{% if content %}
{{- content -}}
{% endif %}
</article>

View File

@ -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 -%}
<a{{ attributes.addClass('username') }}>{{ name }}{{ extra }}</a>
{%- else -%}
<span{{ attributes }}>{{ name }}{{ extra }}</span>
{%- endif -%}

View File

@ -0,0 +1,20 @@
{#
/**
* @file
* Theme override to display a single views grouping.
*
* Available variables:
* - view: The view object.
* - grouping: The grouping instruction.
* - grouping_level: A number indicating the hierarchical level of the grouping.
* - title: The group heading.
* - content: The content to be grouped.
* - rows: The rows returned from the view.
*
* @see template_preprocess_views_view_grouping()
*/
#}
<div class="view-grouping">
<div class="view-grouping-header">{{ title }}</div>
<div class="view-grouping-content">{{ content }}</div>
</div>

View File

@ -0,0 +1,30 @@
{#
/**
* @file
* Theme override to display an item in a views RSS feed.
*
* Available variables:
* - title: RSS item title.
* - link: RSS item link.
* - description: RSS body text.
* - item_elements: RSS item elements to be rendered as XML (pubDate, creator,
* guid).
*
* @see template_preprocess_views_view_row_rss()
*
* @ingroup themeable
*/
#}
<item>
<title>{{ title }}</title>
<link>{{ link }}</link>
<description>{{ description }}</description>
{% for item in item_elements -%}
<{{ item.key }}{{ item.attributes -}}
{% if item.value -%}
>{{ item.value }}</{{ item.key }}>
{% else -%}
{{ ' />' }}
{% endif %}
{%- endfor %}
</item>

View File

@ -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 ? '<span' : '<div' }} class="views-summary views-summary-unformatted">
{% if row.separator -%}
{{ row.separator }}
{%- endif %}
<a href="{{ row.url }}"{{ row.attributes.addClass(row.active ? 'is-active')|without('href') }}>{{ row.link }}</a>
{% if options.count %}
({{ row.count }})
{% endif %}
{{ options.inline ? '</span>' : '</div>' }}
{% endfor %}

View File

@ -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()
*/
#}
<div class="item-list">
<ul class="views-summary">
{% for row in rows %}
<li><a href="{{ row.url }}"{{ row.attributes.addClass(row.active ? 'is-active')|without('href') }}>{{ row.link }}</a>
{% if options.count %}
({{ row.count }})
{% endif %}
</li>
{% endfor %}
</ul>
</div>

View File

@ -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,
]
%}
<div{{ attributes.addClass(classes) }}>
{{ title_prefix }}
{% if title %}
{{ title }}
{% endif %}
{{ title_suffix }}
{% if header %}
<div class="view-header">
{{ header }}
</div>
{% endif %}
{% if exposed %}
<div class="view-filters">
{{ exposed }}
</div>
{% endif %}
{% if attachment_before %}
<div class="attachment attachment-before">
{{ attachment_before }}
</div>
{% endif %}
{% if rows %}
<div class="view-content">
{{ rows }}
</div>
{% elseif empty %}
<div class="view-empty">
{{ empty }}
</div>
{% endif %}
{% if pager %}
{{ pager }}
{% endif %}
{% if attachment_after %}
<div class="attachment attachment-after">
{{ attachment_after }}
</div>
{% endif %}
{% if more %}
{{ more }}
{% endif %}
{% if footer %}
<div class="view-footer">
{{ footer }}
</div>
{% endif %}
{% if feed_icons %}
<div class="feed-icons">
{{ feed_icons }}
</div>
{% endif %}
</div>