Version 1
[yaffs-website] / web / core / modules / toolbar / src / Element / ToolbarItem.php
diff --git a/web/core/modules/toolbar/src/Element/ToolbarItem.php b/web/core/modules/toolbar/src/Element/ToolbarItem.php
new file mode 100644 (file)
index 0000000..79cbed2
--- /dev/null
@@ -0,0 +1,87 @@
+<?php
+
+namespace Drupal\toolbar\Element;
+
+use Drupal\Core\Render\Element\RenderElement;
+use Drupal\Core\Url;
+
+/**
+ * Provides a toolbar item that is wrapped in markup for common styling.
+ *
+ * The 'tray' property contains a renderable array.
+ *
+ * @RenderElement("toolbar_item")
+ */
+class ToolbarItem extends RenderElement {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getInfo() {
+    $class = get_class($this);
+    return [
+      '#pre_render' => [
+        [$class, 'preRenderToolbarItem'],
+      ],
+      'tab' => [
+        '#type' => 'link',
+        '#title' => NULL,
+        '#url' => Url::fromRoute('<front>'),
+      ],
+    ];
+  }
+
+  /**
+   * Provides markup for associating a tray trigger with a tray element.
+   *
+   * A tray is a responsive container that wraps renderable content. Trays
+   * present content well on small and large screens alike.
+   *
+   * @param array $element
+   *   A renderable array.
+   *
+   * @return array
+   *   A renderable array.
+   */
+  public static function preRenderToolbarItem($element) {
+    $id = $element['#id'];
+
+    // Provide attributes for a toolbar item.
+    $attributes = [
+      'id' => $id,
+    ];
+
+    // If tray content is present, markup the tray and its associated trigger.
+    if (!empty($element['tray'])) {
+      // Provide attributes necessary for trays.
+      $attributes += [
+        'data-toolbar-tray' => $id . '-tray',
+        'aria-owns' => $id . '-tray',
+        'role' => 'button',
+        'aria-pressed' => 'false',
+      ];
+
+      // Merge in module-provided attributes.
+      $element['tab'] += ['#attributes' => []];
+      $element['tab']['#attributes'] += $attributes;
+      $element['tab']['#attributes']['class'][] = 'trigger';
+
+      // Provide attributes for the tray theme wrapper.
+      $attributes = [
+        'id' => $id . '-tray',
+        'data-toolbar-tray' => $id . '-tray',
+      ];
+      // Merge in module-provided attributes.
+      if (!isset($element['tray']['#wrapper_attributes'])) {
+        $element['tray']['#wrapper_attributes'] = [];
+      }
+      $element['tray']['#wrapper_attributes'] += $attributes;
+      $element['tray']['#wrapper_attributes']['class'][] = 'toolbar-tray';
+    }
+
+    $element['tab']['#attributes']['class'][] = 'toolbar-item';
+
+    return $element;
+  }
+
+}