diff --git a/composer.json b/composer.json
index d808ac57db02d0d8a6f22557cceaa9cff746c2e4..a4fc7ef1596c52b7289b64557521dc44dc7375b9 100644
--- a/composer.json
+++ b/composer.json
@@ -89,7 +89,7 @@
         "dimsemenov/magnific-popup": "1.1",
         "drupal/addtocalendar": "3.4",
         "drupal/admin_toolbar": "3.4",
-        "drupal/adminimal_theme": "^1.6",
+        "drupal/adminimal_theme": "^1.7",
         "drupal/administerusersbyrole": "3.3",
         "drupal/allowed_formats": "2.0",
         "drupal/anchor_link": "1.10",
diff --git a/composer.lock b/composer.lock
index 288713b5040575b8e87e02df8043c82cc09ddefe..9ba073d9d5982396818233ed17b66215e105beec 100644
--- a/composer.lock
+++ b/composer.lock
@@ -1766,26 +1766,27 @@
         },
         {
             "name": "drupal/adminimal_theme",
-            "version": "1.6.0",
+            "version": "1.7.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/adminimal_theme.git",
-                "reference": "8.x-1.6"
+                "reference": "8.x-1.7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/adminimal_theme-8.x-1.6.zip",
-                "reference": "8.x-1.6",
-                "shasum": "89132d0853388afe8dfd11fb83c69a48d8c13413"
+                "url": "https://ftp.drupal.org/files/projects/adminimal_theme-8.x-1.7.zip",
+                "reference": "8.x-1.7",
+                "shasum": "0fe020fecab6a1f6d877f2e622fb9f916ada52bb"
             },
             "require": {
-                "drupal/core": "^8.8 || ^9"
+                "drupal/core": "^9.3 || ^10",
+                "drupal/seven": "~1.0"
             },
             "type": "drupal-theme",
             "extra": {
                 "drupal": {
-                    "version": "8.x-1.6",
-                    "datestamp": "1602006937",
+                    "version": "8.x-1.7",
+                    "datestamp": "1691504486",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -1808,6 +1809,10 @@
                 {
                     "name": "realityloop",
                     "homepage": "https://www.drupal.org/user/139189"
+                },
+                {
+                    "name": "rjjakes",
+                    "homepage": "https://www.drupal.org/user/3457245"
                 }
             ],
             "description": "Drupal administration theme with modern minimalist design.",
@@ -6669,6 +6674,66 @@
                 "issues": "https://www.drupal.org/project/issues/scheduler"
             }
         },
+        {
+            "name": "drupal/seven",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://git.drupalcode.org/project/seven.git",
+                "reference": "1.0.0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://ftp.drupal.org/files/projects/seven-1.0.0.zip",
+                "reference": "1.0.0",
+                "shasum": "88e86926388c7e6cf66b0502d13a0470ce2399cd"
+            },
+            "require": {
+                "drupal/core": "^9 || ^10"
+            },
+            "type": "drupal-theme",
+            "extra": {
+                "drupal": {
+                    "version": "1.0.0",
+                    "datestamp": "1683652106",
+                    "security-coverage": {
+                        "status": "covered",
+                        "message": "Covered by Drupal's security advisory policy"
+                    }
+                }
+            },
+            "notification-url": "https://packages.drupal.org/8/downloads",
+            "license": [
+                "GPL-2.0-or-later"
+            ],
+            "authors": [
+                {
+                    "name": "bnjmnm",
+                    "homepage": "https://www.drupal.org/user/2369194"
+                },
+                {
+                    "name": "lauriii",
+                    "homepage": "https://www.drupal.org/user/1078742"
+                },
+                {
+                    "name": "mcrittenden",
+                    "homepage": "https://www.drupal.org/user/420631"
+                },
+                {
+                    "name": "mrfelton",
+                    "homepage": "https://www.drupal.org/user/305669"
+                },
+                {
+                    "name": "TravisCarden",
+                    "homepage": "https://www.drupal.org/user/236758"
+                }
+            ],
+            "description": "The Seven theme from Drupal 8/9 moved to contrib",
+            "homepage": "https://www.drupal.org/project/seven",
+            "support": {
+                "source": "https://git.drupalcode.org/project/seven"
+            }
+        },
         {
             "name": "drupal/simple_gmap",
             "version": "3.0.1",
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index b80f056ba9ee8021fce3e90fee791ca34e51c583..15cd863cf942792d0a3c5280df4fc80528041333 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -1829,27 +1829,28 @@
         },
         {
             "name": "drupal/adminimal_theme",
-            "version": "1.6.0",
-            "version_normalized": "1.6.0.0",
+            "version": "1.7.0",
+            "version_normalized": "1.7.0.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/adminimal_theme.git",
-                "reference": "8.x-1.6"
+                "reference": "8.x-1.7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/adminimal_theme-8.x-1.6.zip",
-                "reference": "8.x-1.6",
-                "shasum": "89132d0853388afe8dfd11fb83c69a48d8c13413"
+                "url": "https://ftp.drupal.org/files/projects/adminimal_theme-8.x-1.7.zip",
+                "reference": "8.x-1.7",
+                "shasum": "0fe020fecab6a1f6d877f2e622fb9f916ada52bb"
             },
             "require": {
-                "drupal/core": "^8.8 || ^9"
+                "drupal/core": "^9.3 || ^10",
+                "drupal/seven": "~1.0"
             },
             "type": "drupal-theme",
             "extra": {
                 "drupal": {
-                    "version": "8.x-1.6",
-                    "datestamp": "1602006937",
+                    "version": "8.x-1.7",
+                    "datestamp": "1691504486",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -1873,6 +1874,10 @@
                 {
                     "name": "realityloop",
                     "homepage": "https://www.drupal.org/user/139189"
+                },
+                {
+                    "name": "rjjakes",
+                    "homepage": "https://www.drupal.org/user/3457245"
                 }
             ],
             "description": "Drupal administration theme with modern minimalist design.",
@@ -6937,6 +6942,69 @@
             },
             "install-path": "../../web/modules/scheduler"
         },
+        {
+            "name": "drupal/seven",
+            "version": "1.0.0",
+            "version_normalized": "1.0.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://git.drupalcode.org/project/seven.git",
+                "reference": "1.0.0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://ftp.drupal.org/files/projects/seven-1.0.0.zip",
+                "reference": "1.0.0",
+                "shasum": "88e86926388c7e6cf66b0502d13a0470ce2399cd"
+            },
+            "require": {
+                "drupal/core": "^9 || ^10"
+            },
+            "type": "drupal-theme",
+            "extra": {
+                "drupal": {
+                    "version": "1.0.0",
+                    "datestamp": "1683652106",
+                    "security-coverage": {
+                        "status": "covered",
+                        "message": "Covered by Drupal's security advisory policy"
+                    }
+                }
+            },
+            "installation-source": "dist",
+            "notification-url": "https://packages.drupal.org/8/downloads",
+            "license": [
+                "GPL-2.0-or-later"
+            ],
+            "authors": [
+                {
+                    "name": "bnjmnm",
+                    "homepage": "https://www.drupal.org/user/2369194"
+                },
+                {
+                    "name": "lauriii",
+                    "homepage": "https://www.drupal.org/user/1078742"
+                },
+                {
+                    "name": "mcrittenden",
+                    "homepage": "https://www.drupal.org/user/420631"
+                },
+                {
+                    "name": "mrfelton",
+                    "homepage": "https://www.drupal.org/user/305669"
+                },
+                {
+                    "name": "TravisCarden",
+                    "homepage": "https://www.drupal.org/user/236758"
+                }
+            ],
+            "description": "The Seven theme from Drupal 8/9 moved to contrib",
+            "homepage": "https://www.drupal.org/project/seven",
+            "support": {
+                "source": "https://git.drupalcode.org/project/seven"
+            },
+            "install-path": "../../web/themes/seven"
+        },
         {
             "name": "drupal/simple_gmap",
             "version": "3.0.1",
diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php
index 505406715533582df3000e490014d5f4136286d5..63158197fba072cfdfe011e0f7721d9e57927af4 100644
--- a/vendor/composer/installed.php
+++ b/vendor/composer/installed.php
@@ -287,9 +287,9 @@
             'dev_requirement' => false,
         ),
         'drupal/adminimal_theme' => array(
-            'pretty_version' => '1.6.0',
-            'version' => '1.6.0.0',
-            'reference' => '8.x-1.6',
+            'pretty_version' => '1.7.0',
+            'version' => '1.7.0.0',
+            'reference' => '8.x-1.7',
             'type' => 'drupal-theme',
             'install_path' => __DIR__ . '/../../web/themes/adminimal_theme',
             'aliases' => array(),
@@ -1117,6 +1117,15 @@
             'aliases' => array(),
             'dev_requirement' => false,
         ),
+        'drupal/seven' => array(
+            'pretty_version' => '1.0.0',
+            'version' => '1.0.0.0',
+            'reference' => '1.0.0',
+            'type' => 'drupal-theme',
+            'install_path' => __DIR__ . '/../../web/themes/seven',
+            'aliases' => array(),
+            'dev_requirement' => false,
+        ),
         'drupal/simple_gmap' => array(
             'pretty_version' => '3.0.1',
             'version' => '3.0.1.0',
diff --git a/web/themes/adminimal_theme/adminimal_theme.info.yml b/web/themes/adminimal_theme/adminimal_theme.info.yml
index 02aa2ae97a87d8269bb11cc44631d69696dc4050..5ee6b212f61c7e2514694520c630ea88eb3732db 100644
--- a/web/themes/adminimal_theme/adminimal_theme.info.yml
+++ b/web/themes/adminimal_theme/adminimal_theme.info.yml
@@ -1,7 +1,7 @@
 name: Adminimal
 type: theme
 description: 'Drupal administration theme with modern minimalist design.'
-core_version_requirement: ^8.8 || ^9
+core_version_requirement: ^9.3 || ^10
 base theme: seven
 
 libraries:
@@ -27,7 +27,7 @@ regions:
 regions_hidden:
   - sidebar_first
 
-# Information added by Drupal.org packaging script on 2020-10-06
-version: '8.x-1.6'
+# Information added by Drupal.org packaging script on 2023-08-08
+version: '8.x-1.7'
 project: 'adminimal_theme'
-datestamp: 1602006939
+datestamp: 1691504488
diff --git a/web/themes/adminimal_theme/adminimal_theme.theme b/web/themes/adminimal_theme/adminimal_theme.theme
index 99781357f53b0fc03ead1a3ddc61093077ef0f69..79fba26e658ec769d6af4d4b6a50b2ed04288b1f 100644
--- a/web/themes/adminimal_theme/adminimal_theme.theme
+++ b/web/themes/adminimal_theme/adminimal_theme.theme
@@ -42,11 +42,10 @@ function adminimal_theme_form_system_theme_settings_alter(&$form, FormStateInter
 
   // Get adminimal theme path.
   global $base_url;
-  $adminimal_path = drupal_get_path('theme', 'adminimal_theme');
+  $adminimal_path = \Drupal::service('extension.list.theme')->getPath('adminimal_theme');
   $old_css_path = $adminimal_path . '/css/custom.css';
   $custom_css_path = 'public://adminimal-custom.css';
-  $custom_css_dir = str_replace($base_url . '/', "", file_create_url($custom_css_path));
-  $custom_css_url = file_create_url($custom_css_path);
+  $custom_css_dir = str_replace($base_url . '/', "", \Drupal::service('file_url_generator')->generateAbsoluteString($custom_css_path));
 
   // Try to create the adminimal-custom.css file automatically.
   if (!file_exists($custom_css_path)) {
diff --git a/web/themes/adminimal_theme/composer.json b/web/themes/adminimal_theme/composer.json
index e5c2b65157935a70869b2de8f8cb31c279060619..2cd17237a77eacdff9887b7cdf92ed90f17ba2d0 100644
--- a/web/themes/adminimal_theme/composer.json
+++ b/web/themes/adminimal_theme/composer.json
@@ -6,5 +6,8 @@
   "support": {
     "issues": "https://www.drupal.org/project/issues/adminimal_theme"
   },
-  "license": "GPL-2.0+"
+  "license": "GPL-2.0+",
+  "require": {
+      "drupal/seven": "~1.0"
+  }
 }
diff --git a/web/themes/seven/LICENSE.txt b/web/themes/seven/LICENSE.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d159169d1050894d3ea3b98e1c965c4058208fe1
--- /dev/null
+++ b/web/themes/seven/LICENSE.txt
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/web/themes/seven/README.txt b/web/themes/seven/README.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0aa9d237eb16fb3cfc1d23da579a4d7bdc9fdda4
--- /dev/null
+++ b/web/themes/seven/README.txt
@@ -0,0 +1,8 @@
+ABOUT SEVEN
+-----------
+
+Seven was the default administration theme for Drupal 8 and 9. It has been
+removed from Drupal 10 and replaced with a modern equivalent, Olivero.
+
+This theme is available for existing sites that may need it, but we do not
+recommend using it on a new site.
diff --git a/web/themes/seven/config/schema/seven.schema.yml b/web/themes/seven/config/schema/seven.schema.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8e40d45b75fc7ac1873613c82b379ec0e54c085f
--- /dev/null
+++ b/web/themes/seven/config/schema/seven.schema.yml
@@ -0,0 +1,5 @@
+# Schema for the configuration files of the Seven theme.
+
+seven.settings:
+  type: theme_settings
+  label: 'Seven settings'
diff --git a/web/themes/seven/css/base/elements.css b/web/themes/seven/css/base/elements.css
new file mode 100644
index 0000000000000000000000000000000000000000..2599a0f5866054510b1c4c814cb57d272072a67d
--- /dev/null
+++ b/web/themes/seven/css/base/elements.css
@@ -0,0 +1,179 @@
+/**
+ * Generic elements.
+ */
+body {
+  color: #333;
+  background: #fff;
+  font: normal 81.3%/1.538em "Lucida Grande", "Lucida Sans Unicode", "DejaVu Sans", "Lucida Sans", sans-serif;
+}
+a,
+.link {
+  text-decoration: none;
+  color: #0074bd;
+}
+a:hover,
+.link:hover,
+a:focus,
+.link:focus {
+  text-decoration: underline;
+  outline: 0;
+}
+hr {
+  height: 1px;
+  margin: 0;
+  padding: 0;
+  border: none;
+  background: #ccc;
+}
+summary,
+.fieldgroup:not(.form-composite) > legend {
+  text-transform: uppercase;
+  font-weight: bold;
+}
+
+/**
+ * Reusable heading classes are included to help modules change the styling of
+ * headings on a page without affecting accessibility.
+ */
+h1,
+.heading-a {
+  margin: 0;
+  font-size: 1.625em;
+  font-weight: bold;
+  line-height: 1.875em;
+}
+h2,
+.heading-b {
+  margin: 10px 0;
+  font-size: 1.385em;
+  font-weight: bold;
+}
+h3,
+.heading-c {
+  margin: 10px 0;
+  font-size: 1.231em;
+  font-weight: bold;
+}
+h4,
+.heading-d {
+  margin: 10px 0;
+  font-size: 1.154em;
+  font-weight: bold;
+}
+h5,
+.heading-e {
+  margin: 10px 0;
+  font-size: 1.077em;
+  font-weight: bold;
+}
+h6,
+.heading-f {
+  margin: 10px 0;
+  font-size: 1.077em;
+  font-weight: bold;
+}
+p {
+  margin: 1em 0;
+}
+dl {
+  margin: 0 0 20px;
+}
+dl dd,
+dl dl {
+  margin-bottom: 10px;
+  margin-left: 20px; /* LTR */
+}
+[dir="rtl"] dl dd,
+[dir="rtl"] dl dl {
+  margin-right: 20px;
+}
+blockquote {
+  margin: 1em 40px;
+}
+address {
+  font-style: italic;
+}
+u,
+ins {
+  text-decoration: underline;
+}
+s,
+strike,
+del {
+  text-decoration: line-through;
+}
+big {
+  font-size: larger;
+}
+small {
+  font-size: smaller;
+}
+sub {
+  vertical-align: sub;
+  font-size: smaller;
+  line-height: normal;
+}
+sup {
+  vertical-align: super;
+  font-size: smaller;
+  line-height: normal;
+}
+abbr,
+acronym {
+  border-bottom: dotted 1px;
+}
+ul {
+  margin: 0.25em 0 0.25em 1.5em; /* LTR */
+  list-style-type: disc;
+  list-style-image: none;
+}
+[dir="rtl"] ul {
+  margin-right: 1.5em;
+  margin-left: 0;
+}
+/* This is required to win over specificity of [dir="rtl"] ul */
+[dir="rtl"] .messages__list {
+  margin-right: 0;
+}
+ol {
+  margin: 0.25em 0 0.25em 2em; /* LTR */
+  padding: 0;
+  list-style-type: decimal;
+}
+[dir="rtl"] ol {
+  margin-right: 2em;
+  margin-left: 0;
+}
+code {
+  margin: 0.5em 0;
+}
+pre {
+  margin: 0.5em 0;
+  white-space: pre-wrap;
+}
+details {
+  line-height: 1.295em;
+}
+details summary {
+  padding: 0.95em 1.45em;
+}
+details summary:focus {
+  outline: none;
+}
+/**
+ * Unfortunately, text-decoration for details summary is not supported on all
+ * browsers. So we add a span (which can handle text-decoration) in Seven's
+ * templates/details.html.twig. In case there are other details templates that
+ * don't have the span, we provide text-decoration in the parent selector.
+ * This provides maximum compatibility and coverage with minimal disruption.
+ */
+details summary:not(.seven-details__summary):focus {
+  text-decoration: underline;
+}
+details summary:focus span {
+  text-decoration: underline;
+}
+img {
+  max-width: 100%;
+  height: auto;
+}
diff --git a/web/themes/seven/css/base/print.css b/web/themes/seven/css/base/print.css
new file mode 100644
index 0000000000000000000000000000000000000000..98c128a474c37f18e703167bd2d1e73dc1fee132
--- /dev/null
+++ b/web/themes/seven/css/base/print.css
@@ -0,0 +1,89 @@
+@media print {
+  * {
+    /* Black prints faster */
+    /* https://github.com/h5bp/main.css/blob/main/dist/_print.css#L14 */
+    color: #000 !important;
+    background-color: transparent !important;
+    box-shadow: none !important;
+    text-shadow: none !important;
+  }
+  body {
+    padding-top: 0;
+  }
+  a,
+  a:visited {
+    text-decoration: underline;
+  }
+  pre,
+  blockquote {
+    border: 1px solid #999;
+    page-break-inside: avoid;
+  }
+  thead {
+    display: table-header-group;
+  }
+  tr,
+  img {
+    page-break-inside: avoid;
+  }
+  img {
+    max-width: 100% !important;
+  }
+  p,
+  h2,
+  h3 {
+    orphans: 3;
+    widows: 3;
+  }
+  h2,
+  h3 {
+    page-break-after: avoid;
+  }
+  a,
+  .link {
+    text-decoration: underline;
+    color: #000;
+  }
+  .button,
+  .button--primary {
+    background: none !important;
+  }
+  .messages {
+    border-width: 1px;
+    border-color: #999;
+  }
+  .is-collapse-enabled .tabs {
+    max-height: 999em;
+  }
+  .is-horizontal .tabs__tab {
+    margin: 0 4px !important;
+    border-radius: 4px 4px 0 0 !important;
+  }
+  .dropbutton-multiple .dropbutton .secondary-action {
+    display: block;
+  }
+  .js .dropbutton-widget,
+  .js td .dropbutton-widget /* Splitbuttons */ {
+    position: relative;
+  }
+  .js .dropbutton .dropbutton-toggle {
+    display: none;
+  }
+  .js .dropbutton-multiple .dropbutton-widget {
+    border-radius: 4px;
+    background: none;
+  }
+  input.form-autocomplete,
+  input.form-text,
+  input.form-tel,
+  input.form-email,
+  input.form-url,
+  input.form-search,
+  input.form-number,
+  input.form-color,
+  input.form-file,
+  textarea.form-textarea,
+  select.form-select {
+    border-width: 1px;
+  }
+}
diff --git a/web/themes/seven/css/base/typography.css b/web/themes/seven/css/base/typography.css
new file mode 100644
index 0000000000000000000000000000000000000000..fd8e8ebe81d9af546d1c0697233fa524713fe064
--- /dev/null
+++ b/web/themes/seven/css/base/typography.css
@@ -0,0 +1,36 @@
+/**
+* Reusable utility classes that apply vertical spacing consistency and in line
+* with the base line height of Seven.
+*/
+.leader {
+  margin-top: 20px;
+  margin-top: 1.538rem;
+}
+.leader-double {
+  margin-top: 40px;
+  margin-top: 3.076rem;
+}
+.leader-triple {
+  margin-top: 60px;
+  margin-top: 4.614rem;
+}
+.leader-quadruple {
+  margin-top: 80px;
+  margin-top: 6.152rem;
+}
+.trailer {
+  margin-bottom: 20px;
+  margin-bottom: 1.538rem;
+}
+.trailer-double {
+  margin-bottom: 40px;
+  margin-bottom: 3.076rem;
+}
+.trailer-triple {
+  margin-bottom: 60px;
+  margin-bottom: 4.614rem;
+}
+.trailer-quadruple {
+  margin-bottom: 80px;
+  margin-bottom: 6.152rem;
+}
diff --git a/web/themes/seven/css/classy/README.txt b/web/themes/seven/css/classy/README.txt
new file mode 100644
index 0000000000000000000000000000000000000000..42514f5f0c72fe4245e6be2387e6ca8abb646715
--- /dev/null
+++ b/web/themes/seven/css/classy/README.txt
@@ -0,0 +1,12 @@
+WHAT IS THIS DIRECTORY FOR?
+--------------------------------
+This directory is for CSS files previously inherited from the Classy theme.
+
+WHY ARE CLASSY CSS FILES BEING COPIED HERE?
+-------------------------------------------
+Classy will be deprecated during the Drupal 9 lifecycle. To prepare for Classy's
+removal, CSS files that would otherwise be inherited from Classy are copied
+here.
+
+CSS files that differ from the Classy versions should not be placed in this
+directory or any subdirectory.
diff --git a/web/themes/seven/css/classy/components/action-links.css b/web/themes/seven/css/classy/components/action-links.css
new file mode 100644
index 0000000000000000000000000000000000000000..274d798e18e7ea39766ef871dd511b22c3a3803c
--- /dev/null
+++ b/web/themes/seven/css/classy/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/web/themes/seven/css/classy/components/book-navigation.css b/web/themes/seven/css/classy/components/book-navigation.css
new file mode 100644
index 0000000000000000000000000000000000000000..08728e27b531cf85c374cc542b2aad34643b967f
--- /dev/null
+++ b/web/themes/seven/css/classy/components/book-navigation.css
@@ -0,0 +1,40 @@
+/**
+ * @file
+ * Styling for the Book module.
+ */
+
+.book-navigation .menu {
+  padding-top: 1em;
+  padding-bottom: 0;
+}
+.book-navigation .book-pager {
+  overflow: auto;
+  margin: 0;
+  padding: 0.5em 0;
+}
+.book-pager__item {
+  display: inline-block;
+  list-style-type: none;
+  vertical-align: top;
+}
+.book-pager__item--previous {
+  width: 45%;
+  text-align: left; /* LTR */
+}
+[dir="rtl"] .book-pager__item--previous {
+  float: right;
+  text-align: right;
+}
+.book-pager__item--center {
+  width: 8%;
+  text-align: center;
+}
+.book-pager__item--next {
+  float: right; /* LTR */
+  width: 45%;
+  text-align: right; /* LTR */
+}
+[dir="rtl"] .book-pager__item--next {
+  float: left;
+  text-align: left;
+}
diff --git a/web/themes/seven/css/classy/components/breadcrumb.css b/web/themes/seven/css/classy/components/breadcrumb.css
new file mode 100644
index 0000000000000000000000000000000000000000..1e6a7fac71a177eefc9da2312f8739e84ef16b89
--- /dev/null
+++ b/web/themes/seven/css/classy/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/web/themes/seven/css/classy/components/button.css b/web/themes/seven/css/classy/components/button.css
new file mode 100644
index 0000000000000000000000000000000000000000..5eb4f1ac13ca0b853aca842ff796b636f7edfdc6
--- /dev/null
+++ b/web/themes/seven/css/classy/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/web/themes/seven/css/classy/components/collapse-processed.css b/web/themes/seven/css/classy/components/collapse-processed.css
new file mode 100644
index 0000000000000000000000000000000000000000..ef10aa341e156bdbc1d0a7d3602fa9002483bf29
--- /dev/null
+++ b/web/themes/seven/css/classy/components/collapse-processed.css
@@ -0,0 +1,32 @@
+/**
+ * @file
+ * Visual styles for collapsible fieldsets.
+ */
+
+.collapse-processed > summary {
+  padding-right: 0.5em;
+  padding-left: 0.5em;
+}
+.collapse-processed > summary:before {
+  float: left; /* LTR */
+  width: 1em;
+  height: 1em;
+  content: "";
+  background: url(../../../images/menu-expanded.png) 0 100% no-repeat; /* LTR */
+}
+[dir="rtl"] .collapse-processed > summary:before {
+  float: right;
+  background-position: 100% 100%;
+}
+.collapse-processed:not([open]) > summary:before {
+  -ms-transform: rotate(-90deg);
+  -webkit-transform: rotate(-90deg);
+  transform: rotate(-90deg);
+  background-position: 25% 35%; /* LTR */
+}
+[dir="rtl"] .collapse-processed:not([open]) > summary:before {
+  -ms-transform: rotate(90deg);
+  -webkit-transform: rotate(90deg);
+  transform: rotate(90deg);
+  background-position: 75% 35%;
+}
diff --git a/web/themes/seven/css/classy/components/container-inline.css b/web/themes/seven/css/classy/components/container-inline.css
new file mode 100644
index 0000000000000000000000000000000000000000..64b78f683bf159533eb9d5661a209767782e7cc3
--- /dev/null
+++ b/web/themes/seven/css/classy/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/web/themes/seven/css/classy/components/dropbutton.css b/web/themes/seven/css/classy/components/dropbutton.css
new file mode 100644
index 0000000000000000000000000000000000000000..5e971ba622dc2e4734d2a6c4beeef7029e9d790f
--- /dev/null
+++ b/web/themes/seven/css/classy/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/web/themes/seven/css/classy/components/exposed-filters.css b/web/themes/seven/css/classy/components/exposed-filters.css
new file mode 100644
index 0000000000000000000000000000000000000000..b686902ef111f07def492f6e39636f4449fdf130
--- /dev/null
+++ b/web/themes/seven/css/classy/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/web/themes/seven/css/classy/components/field.css b/web/themes/seven/css/classy/components/field.css
new file mode 100644
index 0000000000000000000000000000000000000000..ff7e9ab1fc765b99f3ca09d6e8b9a6db7867229c
--- /dev/null
+++ b/web/themes/seven/css/classy/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/web/themes/seven/css/classy/components/file.css b/web/themes/seven/css/classy/components/file.css
new file mode 100644
index 0000000000000000000000000000000000000000..8637242a546a504e47999984174f0fd6ba20f186
--- /dev/null
+++ b/web/themes/seven/css/classy/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/classy/icons/application-octet-stream.png);
+}
+.file--package-x-generic {
+  background-image: url(../../../images/classy/icons/package-x-generic.png);
+}
+.file--x-office-spreadsheet {
+  background-image: url(../../../images/classy/icons/x-office-spreadsheet.png);
+}
+.file--x-office-document {
+  background-image: url(../../../images/classy/icons/x-office-document.png);
+}
+.file--x-office-presentation {
+  background-image: url(../../../images/classy/icons/x-office-presentation.png);
+}
+.file--text-x-script {
+  background-image: url(../../../images/classy/icons/text-x-script.png);
+}
+.file--text-html {
+  background-image: url(../../../images/classy/icons/text-html.png);
+}
+.file--text-plain {
+  background-image: url(../../../images/classy/icons/text-plain.png);
+}
+.file--application-pdf {
+  background-image: url(../../../images/classy/icons/application-pdf.png);
+}
+.file--application-x-executable {
+  background-image: url(../../../images/classy/icons/application-x-executable.png);
+}
+.file--audio {
+  background-image: url(../../../images/classy/icons/audio-x-generic.png);
+}
+.file--video {
+  background-image: url(../../../images/classy/icons/video-x-generic.png);
+}
+.file--text {
+  background-image: url(../../../images/classy/icons/text-x-generic.png);
+}
+.file--image {
+  background-image: url(../../../images/classy/icons/image-x-generic.png);
+}
diff --git a/web/themes/seven/css/classy/components/form.css b/web/themes/seven/css/classy/components/form.css
new file mode 100644
index 0000000000000000000000000000000000000000..0822f34683d85eb287ab951eb967c6669150d85d
--- /dev/null
+++ b/web/themes/seven/css/classy/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/ee0000/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/e32700/error.svg) no-repeat;
+  background-size: contain;
+}
diff --git a/web/themes/seven/css/classy/components/forum.css b/web/themes/seven/css/classy/components/forum.css
new file mode 100644
index 0000000000000000000000000000000000000000..c35e3f4411e6b986dd7050ab722bd648ea401d7a
--- /dev/null
+++ b/web/themes/seven/css/classy/components/forum.css
@@ -0,0 +1,46 @@
+/**
+ * @file
+ * Styling for the Forum module.
+ */
+
+.forum__description {
+  margin: 0.5em;
+  font-size: 0.9em;
+}
+.forum__icon {
+  float: left; /* LTR */
+  width: 24px;
+  height: 24px;
+  margin: 0 9px 0 0; /* LTR */
+  background-image: url(../../../images/classy/icons/forum-icons.png);
+  background-repeat: no-repeat;
+}
+[dir="rtl"] .forum__icon {
+  float: right;
+  margin: 0 0 0 9px;
+}
+.forum__title {
+  overflow: hidden;
+}
+.forum .indented {
+  margin-left: 20px; /* LTR */
+}
+[dir="rtl"] .forum .indented {
+  margin-right: 20px;
+  margin-left: 0;
+}
+.forum__topic-status--new {
+  background-position: -24px 0;
+}
+.forum__topic-status--hot {
+  background-position: -48px 0;
+}
+.forum__topic-status--hot-new {
+  background-position: -72px 0;
+}
+.forum__topic-status--sticky {
+  background-position: -96px 0;
+}
+.forum__topic-status--closed {
+  background-position: -120px 0;
+}
diff --git a/web/themes/seven/css/classy/components/icons.css b/web/themes/seven/css/classy/components/icons.css
new file mode 100644
index 0000000000000000000000000000000000000000..744eba8c1abcf4680774c69ac0fe5c885083e812
--- /dev/null
+++ b/web/themes/seven/css/classy/components/icons.css
@@ -0,0 +1,21 @@
+/**
+ * @file
+ * Visual styles for icons.
+ */
+
+.icon-help {
+  padding: 1px 0 1px 20px; /* LTR */
+  background: url(../../../images/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/feed.svg) no-repeat;
+}
diff --git a/web/themes/seven/css/classy/components/image-widget.css b/web/themes/seven/css/classy/components/image-widget.css
new file mode 100644
index 0000000000000000000000000000000000000000..56777c41ea43d0fdd279c1ce5f1f024b949a3e58
--- /dev/null
+++ b/web/themes/seven/css/classy/components/image-widget.css
@@ -0,0 +1,33 @@
+/**
+ * @file
+ * Image upload widget.
+ *
+ * This CSS file is not used in this theme (Classy). It was intended to be used,
+ * but due to a bug, Drupal 8 shipped with it not being used. To not break
+ * backwards compatibility, we continue to not load it in Classy. Every
+ * subtheme of Classy is encouraged to use it, by attaching the
+ * classy/image-widget asset library in their image-widget.html.twig file.
+ *
+ * @see core/themes/seven/templates/content-edit/image-widget.html.twig.
+ *
+ * @todo In Drupal 9, let core/themes/classy/templates/content-edit/image-widget.html.twig
+ * attach the classy/image-widget asset library.
+ */
+
+.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/web/themes/seven/css/classy/components/indented.css b/web/themes/seven/css/classy/components/indented.css
new file mode 100644
index 0000000000000000000000000000000000000000..65ae0612f64fe1de3d43e96edb26361e109affac
--- /dev/null
+++ b/web/themes/seven/css/classy/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/web/themes/seven/css/classy/components/inline-form.css b/web/themes/seven/css/classy/components/inline-form.css
new file mode 100644
index 0000000000000000000000000000000000000000..b5201a78c9db0c2a8f09c700f3374badbca79d31
--- /dev/null
+++ b/web/themes/seven/css/classy/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/web/themes/seven/css/classy/components/item-list.css b/web/themes/seven/css/classy/components/item-list.css
new file mode 100644
index 0000000000000000000000000000000000000000..a8ce5d28a53ddd7de538b7f83983dcbaa359b817
--- /dev/null
+++ b/web/themes/seven/css/classy/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/web/themes/seven/css/classy/components/link.css b/web/themes/seven/css/classy/components/link.css
new file mode 100644
index 0000000000000000000000000000000000000000..fa83f2bb2c371b95ff87270ef93e4c72b86815ac
--- /dev/null
+++ b/web/themes/seven/css/classy/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/web/themes/seven/css/classy/components/links.css b/web/themes/seven/css/classy/components/links.css
new file mode 100644
index 0000000000000000000000000000000000000000..e4832539337a9b555f293e47ca2f0d8dc1358d5d
--- /dev/null
+++ b/web/themes/seven/css/classy/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/web/themes/seven/css/classy/components/media-embed-error.css b/web/themes/seven/css/classy/components/media-embed-error.css
new file mode 100644
index 0000000000000000000000000000000000000000..699b82f7ab01228fa0050744470dec7eaf1cdd8a
--- /dev/null
+++ b/web/themes/seven/css/classy/components/media-embed-error.css
@@ -0,0 +1,20 @@
+/**
+ * @file
+ * Media Embed filter: default styling for media embed errors.
+ */
+
+/**
+ * The caption filter's styling overrides ours, so add a more specific selector
+ * to account for that.
+ */
+.media-embed-error,
+.caption > .media-embed-error {
+  max-width: 200px;
+  padding: 100px 20px 20px;
+  text-align: center;
+  background-color: #ebebeb;
+  background-image: url(../../../images/no-thumbnail.png);
+  background-repeat: no-repeat;
+  background-position: center top;
+  background-size: 100px 100px;
+}
diff --git a/web/themes/seven/css/classy/components/menu.css b/web/themes/seven/css/classy/components/menu.css
new file mode 100644
index 0000000000000000000000000000000000000000..c226639a162986559867e67609a4e9a340a41a26
--- /dev/null
+++ b/web/themes/seven/css/classy/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/menu-expanded.png);
+}
+.menu-item--collapsed {
+  list-style-type: disc;
+  list-style-image: url(../../../images/menu-collapsed.png); /* LTR */
+}
+[dir="rtl"] .menu-item--collapsed {
+  list-style-image: url(../../../images/menu-collapsed-rtl.png);
+}
+.menu-item {
+  margin: 0;
+  padding-top: 0.2em;
+}
+ul.menu a.is-active {
+  color: #000;
+}
diff --git a/web/themes/seven/css/classy/components/messages.css b/web/themes/seven/css/classy/components/messages.css
new file mode 100644
index 0000000000000000000000000000000000000000..1435327eec4dad666698fc854de4511abe3aa940
--- /dev/null
+++ b/web/themes/seven/css/classy/components/messages.css
@@ -0,0 +1,72 @@
+/**
+ * @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;
+}
+/* See .color-success in Seven's colors.css */
+.messages--status {
+  color: #325e1c;
+  border-color: #c9e1bd #c9e1bd #c9e1bd transparent;  /* LTR */
+  background-color: #f3faef;
+  background-image: url(../../../images/icons/73b355/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;
+}
+/* See .color-warning in Seven's colors.css */
+.messages--warning {
+  color: #734c00;
+  border-color: #f4daa6 #f4daa6 #f4daa6 transparent;  /* LTR */
+  background-color: #fdf8ed;
+  background-image: url(../../../images/icons/e29700/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;
+}
+/* See .color-error in Seven's colors.css */
+.messages--error {
+  color: #a51b00;
+  border-color: #f9c9bf #f9c9bf #f9c9bf transparent;  /* LTR */
+  background-color: #fcf4f2;
+  background-image: url(../../../images/icons/e32700/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/web/themes/seven/css/classy/components/more-link.css b/web/themes/seven/css/classy/components/more-link.css
new file mode 100644
index 0000000000000000000000000000000000000000..c604061317d013d634660816cca3fd606091ed40
--- /dev/null
+++ b/web/themes/seven/css/classy/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/web/themes/seven/css/classy/components/node.css b/web/themes/seven/css/classy/components/node.css
new file mode 100644
index 0000000000000000000000000000000000000000..6b7cd5257d6d167426d11e2b6adb5eda3fecbfdf
--- /dev/null
+++ b/web/themes/seven/css/classy/components/node.css
@@ -0,0 +1,8 @@
+/**
+ * @file
+ * Visual styles for nodes.
+ */
+
+.node--unpublished {
+  background-color: #fff4f4;
+}
diff --git a/web/themes/seven/css/classy/components/pager.css b/web/themes/seven/css/classy/components/pager.css
new file mode 100644
index 0000000000000000000000000000000000000000..a9471fc037cab28544a3c89cf7040f26434cf1a5
--- /dev/null
+++ b/web/themes/seven/css/classy/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/web/themes/seven/css/classy/components/progress.css b/web/themes/seven/css/classy/components/progress.css
new file mode 100644
index 0000000000000000000000000000000000000000..47da889350040c07f3137184192d19a66d0c6334
--- /dev/null
+++ b/web/themes/seven/css/classy/components/progress.css
@@ -0,0 +1,69 @@
+/**
+ * @file
+ * Visual styles for progress bar.
+ *
+ * @see progress.js
+ */
+
+.progress__track {
+  border-color: #b3b3b3;
+  border-radius: 10em;
+  background-color: #f2f1eb;
+  background-image: -webkit-linear-gradient(#e7e7df, #f0f0f0);
+  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:
+    -webkit-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15)),
+    -webkit-linear-gradient(left top, #0094f0 0%, #0094f0 25%, #007ecc 25%, #007ecc 50%, #0094f0 50%, #0094f0 75%, #0094f0 100%);
+  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.
+ */
+@-webkit-keyframes animate-stripes {
+  0% { background-position: 0 0, 0 0; }
+  100% { background-position: 0 0, -80px 0; }
+}
+
+@-ms-keyframes animate-stripes {
+  0% { background-position: 0 0, 0 0; }
+  100% { background-position: 0 0, -80px 0; }
+}
+
+@keyframes animate-stripes {
+  0% { background-position: 0 0, 0 0; }
+  100% { background-position: 0 0, -80px 0; }
+}
diff --git a/web/themes/seven/css/classy/components/search-results.css b/web/themes/seven/css/classy/components/search-results.css
new file mode 100644
index 0000000000000000000000000000000000000000..343ea8b5fb1b22d6e3684832eeded759ab058ca1
--- /dev/null
+++ b/web/themes/seven/css/classy/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/web/themes/seven/css/classy/components/tabledrag.css b/web/themes/seven/css/classy/components/tabledrag.css
new file mode 100644
index 0000000000000000000000000000000000000000..a197b24979cff8f741691b1d25e2d2ca6063174a
--- /dev/null
+++ b/web/themes/seven/css/classy/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/web/themes/seven/css/classy/components/tableselect.css b/web/themes/seven/css/classy/components/tableselect.css
new file mode 100644
index 0000000000000000000000000000000000000000..fcfb2a5aa4aec34886cfe3c193e1cbcb20cb08fb
--- /dev/null
+++ b/web/themes/seven/css/classy/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/web/themes/seven/css/classy/components/tablesort.css b/web/themes/seven/css/classy/components/tablesort.css
new file mode 100644
index 0000000000000000000000000000000000000000..44e5349404d0356ab1b601951ff0d141b85ac4a4
--- /dev/null
+++ b/web/themes/seven/css/classy/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/web/themes/seven/css/classy/components/tabs.css b/web/themes/seven/css/classy/components/tabs.css
new file mode 100644
index 0000000000000000000000000000000000000000..16fb1223f08abe7f7366148eb089531b917b1996
--- /dev/null
+++ b/web/themes/seven/css/classy/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/web/themes/seven/css/classy/components/textarea.css b/web/themes/seven/css/classy/components/textarea.css
new file mode 100644
index 0000000000000000000000000000000000000000..2661bae9c4a3f2f9ea0aff1df132962ae656241b
--- /dev/null
+++ b/web/themes/seven/css/classy/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/web/themes/seven/css/classy/components/ui-dialog.css b/web/themes/seven/css/classy/components/ui-dialog.css
new file mode 100644
index 0000000000000000000000000000000000000000..476c21ffdb771ed189d7a6e7f76cfe170dbe340b
--- /dev/null
+++ b/web/themes/seven/css/classy/components/ui-dialog.css
@@ -0,0 +1,15 @@
+/**
+ * @file
+ * Styles for Classy's 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/web/themes/seven/css/classy/layout/media-library.css b/web/themes/seven/css/classy/layout/media-library.css
new file mode 100644
index 0000000000000000000000000000000000000000..84dee10daa5407063fa77cae7cdbae9ca37ea2e5
--- /dev/null
+++ b/web/themes/seven/css/classy/layout/media-library.css
@@ -0,0 +1,28 @@
+/**
+ * @file
+ * Contains minimal layout styling for the media library.
+ */
+
+.media-library-wrapper {
+  display: flex;
+}
+
+.media-library-menu {
+  flex-basis: 20%;
+  flex-shrink: 0;
+}
+
+.media-library-content {
+  flex-grow: 1;
+}
+
+.media-library-views-form {
+  display: flex;
+  flex-wrap: wrap;
+}
+
+.media-library-views-form .media-library-item {
+  justify-content: space-between;
+  max-width: 23%;
+  margin: 1%;
+}
diff --git a/web/themes/seven/css/components/admin-list.css b/web/themes/seven/css/components/admin-list.css
new file mode 100644
index 0000000000000000000000000000000000000000..090f3fd377cf3fc5f594fc87b8c90a050aa37496
--- /dev/null
+++ b/web/themes/seven/css/components/admin-list.css
@@ -0,0 +1,46 @@
+/**
+ * Admin lists.
+ */
+ul.admin-list {
+  margin: 0;
+  padding: 0;
+}
+.admin-list li {
+  position: relative;
+  margin: 0;
+  padding: 0;
+  list-style-type: none;
+  list-style-image: none;
+  border-top: 1px solid #bfbfbf;
+}
+.admin-list.compact li {
+  border: none;
+}
+.admin-list li a {
+  display: block;
+  min-height: 0;
+  padding: 14px 15px 14px 25px; /* LTR */
+  background: url(../../images/icons/bebebe/chevron-disc-right.svg) no-repeat 1px 16px; /* LTR */
+}
+[dir="rtl"] .admin-list li a {
+  padding-right: 25px;
+  padding-left: 15px;
+  background: url(../../images/icons/bebebe/chevron-disc-left.svg) no-repeat right 16px;
+}
+.admin-list.compact li a {
+  padding: 2px 0;
+  background-image: none;
+}
+.admin-list li a:hover,
+.admin-list li a:focus,
+.admin-list li a:active {
+  text-decoration: none;
+}
+.admin-list li a .label {
+  font-size: 1.0769em;
+}
+.admin-list li a:hover .label,
+.admin-list li a:focus .label,
+.admin-list li a:active .label {
+  text-decoration: underline;
+}
diff --git a/web/themes/seven/css/components/breadcrumb.css b/web/themes/seven/css/components/breadcrumb.css
new file mode 100644
index 0000000000000000000000000000000000000000..d5512048b999a5179987c8f60cfa14b4af481a41
--- /dev/null
+++ b/web/themes/seven/css/components/breadcrumb.css
@@ -0,0 +1,9 @@
+/**
+ * @file
+ * Breadcrumbs.
+ */
+
+.breadcrumb {
+  padding: 20px 0 10px;
+  line-height: 1em;
+}
diff --git a/web/themes/seven/css/components/buttons.css b/web/themes/seven/css/components/buttons.css
new file mode 100644
index 0000000000000000000000000000000000000000..c747f65274f1451929bd08b754b6eef31205feae
--- /dev/null
+++ b/web/themes/seven/css/components/buttons.css
@@ -0,0 +1,213 @@
+/**
+ * @file
+ * Structural styles for Seven’s UI buttons
+ *
+ * Apply these classes to any element (<link>, <button>, <input>, etc.) that
+ * should appear as a button.
+ */
+
+/**
+ * Buttons.
+ *
+ * 1. Enable z-index on buttons.
+ * 2. Normalize 'line-height'; can’t be changed from 'normal' in Firefox 4+.
+ * 3. Allows full range of styling in Webkit and Gecko.
+ * 4. Use px units to ensure button text is centered vertically.
+ * 5. Use rems to avoid the font size cascade of ems, with a px fallback for
+ *    older browsers.
+ * 6. Prevent fat text in WebKit.
+ *
+ * @todo Consider moving box-sizing into base.css under a universal selector.
+ * See https://www.drupal.org/node/2124251
+ *
+ */
+.button {
+  position: relative;  /* 1 */
+  display: inline-block;
+  box-sizing: border-box;
+  padding: 4px 1.5em;  /* 4 */
+  cursor: pointer;
+  -webkit-transition: all 0.1s;
+  transition: all 0.1s;
+  text-align: center;
+  text-decoration: none;
+  color: #333;
+  border: 1px solid #a6a6a6;
+  border-radius: 20em;
+  background-color: #f2f1eb;
+  background-image: -webkit-linear-gradient(top, #f6f6f3, #e7e7df);
+  background-image: linear-gradient(to bottom, #f6f6f3, #e7e7df);
+  text-shadow: 0 1px hsla(0, 0%, 100%, 0.6);
+  font-size: 14px;
+  font-size: 0.875rem;  /* 5 */
+  font-weight: 600;
+  line-height: normal;  /* 2 */
+  -webkit-appearance: none;  /* 3 */
+  -moz-appearance: none;  /* 3 */
+  -webkit-font-smoothing: antialiased;  /* 6 */
+}
+.button:hover,
+.button:focus {
+  text-decoration: none;
+  color: #1a1a1a;
+  outline: none;
+  background-color: #f9f8f6;
+  background-image: -webkit-linear-gradient(top, #fcfcfa, #e9e9dd);
+  background-image: linear-gradient(to bottom, #fcfcfa, #e9e9dd);
+}
+.button:hover {
+  box-shadow: 0 1px 2px hsla(0, 0%, 0%, 0.125);
+}
+
+/* Prevent focus ring being covered by next siblings. */
+.button:focus {
+  z-index: 10;
+  border: 1px solid #3ab2ff;
+  box-shadow: 0 0 0.5em 0.1em hsla(203, 100%, 60%, 0.7);
+}
+.button:active {
+  -webkit-transition: none;
+  transition: none;
+  border: 1px solid #a6a6a6;
+  background-color: #dfdfd9;
+  background-image: -webkit-linear-gradient(top, #f6f6f3, #e7e7df);
+  background-image: linear-gradient(to bottom, #f6f6f3, #e7e7df);
+  box-shadow: inset 0 1px 3px hsla(0, 0%, 0%, 0.2);
+}
+
+.button--primary {
+  color: #fff;
+  border-color: #1e5c90;
+  background-color: #0071b8;
+  background-image: -webkit-linear-gradient(top, #007bc6, #0071b8);
+  background-image: linear-gradient(to bottom, #007bc6, #0071b8);
+  text-shadow: 0 1px hsla(0, 0%, 0%, 0.5);
+  font-weight: 700;
+  -webkit-font-smoothing: antialiased;
+}
+.button--primary:hover,
+.button--primary:focus {
+  color: #fff;
+  border-color: #1e5c90;
+  background-color: #2369a6;
+  background-image: -webkit-linear-gradient(top, #0c97ed, #1f86c7);
+  background-image: linear-gradient(to bottom, #0c97ed, #1f86c7);
+}
+.button--primary:focus {
+  border: 1px solid #1280df;
+}
+.button--primary:hover {
+  box-shadow: 0 1px 2px hsla(203, 10%, 10%, 0.25);
+}
+.button--primary:active {
+  border-color: #144b78;
+  background-image: -webkit-linear-gradient(top, #08639b, #0071b8);
+  background-image: linear-gradient(to bottom, #08639b, #0071b8);
+  box-shadow: inset 0 1px 3px hsla(0, 0%, 0%, 0.2);
+}
+
+/**
+ * Overrides styling from system.theme.
+ */
+.button-action:before {
+  margin-left: -0.2em; /* LTR */
+  padding-right: 0.2em; /* LTR */
+  font-size: 14px;
+  font-size: 0.875rem;
+  line-height: 16px;
+  -webkit-font-smoothing: auto;
+}
+[dir="rtl"] .button-action:before {
+  margin-right: -0.2em;
+  margin-left: 0;
+  padding-right: 0;
+  padding-left: 0.2em;
+}
+
+/**
+ * 1. Use px units to ensure button text is centered vertically.
+ */
+.no-touchevents .button--small {
+  padding: 2px 1em;  /* 1 */
+  font-size: 13px;
+  font-size: 0.813rem;
+}
+
+.button:disabled,
+.button:disabled:active,
+.button.is-disabled,
+.button.is-disabled:active {
+  cursor: default;
+  color: #5c5c5c;
+  border-color: #d4d4d4;
+  background: #ededed;
+  box-shadow: none;
+  text-shadow: 0 1px hsla(0, 0%, 100%, 0.6);
+  font-weight: normal;
+}
+
+/* Link actions. */
+
+/**
+ * Style a clickable/tappable element as a link. Duplicates the base style for
+ * the <a> tag, plus a reset for padding, borders and background.
+ */
+.link {
+  display: inline;
+  padding: 0;
+  cursor: pointer;
+  text-decoration: none;
+  color: #0074bd;
+  border: 0;
+  background: none;
+  -webkit-appearance: none;
+  -moz-appearance: none;
+}
+.link:hover,
+.link:focus {
+  text-decoration: underline;
+  color: #008ee6;
+}
+
+/**
+ * We've temporarily added the danger button here, bit of a harsh reset but we
+ * need it.
+ * @todo replace with link--danger.
+ * See https://www.drupal.org/node/2123731
+ */
+.button--danger {
+  display: inline;
+  padding: 0;
+  cursor: pointer;
+  text-decoration: underline;
+  color: #c72100;
+  border: 0;
+  border-radius: 0;
+  background: none;
+  box-shadow: none;
+  font-weight: 400;
+  -webkit-appearance: none;
+  -moz-appearance: none;
+}
+.button--danger:hover,
+.button--danger:focus,
+.button--danger:active {
+  padding: 0;
+  text-decoration: underline;
+  color: #ff2a00;
+  border: 0;
+  background: none;
+  box-shadow: none;
+  text-shadow: none;
+}
+.button--danger:disabled,
+.button--danger.is-disabled {
+  padding: 0;
+  cursor: default;
+  text-decoration: none;
+  color: #737373;
+  border: 0;
+  background: none;
+  box-shadow: none;
+  -webkit-font-smoothing: antialiased;
+}
diff --git a/web/themes/seven/css/components/container-inline.css b/web/themes/seven/css/components/container-inline.css
new file mode 100644
index 0000000000000000000000000000000000000000..301b3fb17ec01741b889ae235df17b74abfc8069
--- /dev/null
+++ b/web/themes/seven/css/components/container-inline.css
@@ -0,0 +1,18 @@
+/**
+ * @file
+ * Inline items.
+ */
+
+.container-inline .form-radios label:after,
+.container-inline .form-checkboxes label:after {
+  content: "";
+}
+.container-inline .form-radios .form-type-radio,
+.container-inline .form-checkboxes .form-type-checkbox {
+  margin-right: 1em;
+}
+[dir="rtl"] .container-inline .form-radios .form-type-radio,
+[dir="rtl"] .container-inline .form-checkboxes .form-type-checkbox {
+  margin-right: 0;
+  margin-left: 1em;
+}
diff --git a/web/themes/seven/css/components/container-inline.module.css b/web/themes/seven/css/components/container-inline.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..d3844257b82c2b74a4697edfc6fc07419b6ff3ea
--- /dev/null
+++ b/web/themes/seven/css/components/container-inline.module.css
@@ -0,0 +1,9 @@
+/**
+ * @file
+ * Inline items.
+ */
+
+.container-inline div,
+.container-inline label {
+  display: inline-block;
+}
diff --git a/web/themes/seven/css/components/content-header.css b/web/themes/seven/css/components/content-header.css
new file mode 100644
index 0000000000000000000000000000000000000000..635dff4d0262311d08f97b364ca2555d2a0b6b3e
--- /dev/null
+++ b/web/themes/seven/css/components/content-header.css
@@ -0,0 +1,8 @@
+/**
+ * Content header.
+ */
+.content-header {
+  overflow: hidden;
+  padding: 24px 0 0;
+  background-color: #e0e0d8;
+}
diff --git a/web/themes/seven/css/components/details.css b/web/themes/seven/css/components/details.css
new file mode 100644
index 0000000000000000000000000000000000000000..bd4d98cbdb98dd06714a323ab047e36a88c47001
--- /dev/null
+++ b/web/themes/seven/css/components/details.css
@@ -0,0 +1,26 @@
+/**
+ * @file
+ * Collapsible details.
+ *
+ * @see collapse.js
+ */
+.seven-details {
+  margin-top: 1em;
+  margin-bottom: 1em;
+  border: 1px solid #bfbfbf;
+  border-radius: 3px;
+  background-color: #fcfcfa;
+}
+.seven-details__summary {
+  cursor: pointer;
+  color: #0074bd;
+  text-shadow: 0 1px 0 white;
+}
+.seven-details__summary:hover,
+.seven-details__summary:focus,
+.seven-details[open] > .seven-details__summary {
+  color: #004f80;
+}
+.seven-details__wrapper {
+  padding: 0 1.5em 1em 1.5em;
+}
diff --git a/web/themes/seven/css/components/dialog.css b/web/themes/seven/css/components/dialog.css
new file mode 100644
index 0000000000000000000000000000000000000000..354f3222aa682937b2408d467074e109cb5cb555
--- /dev/null
+++ b/web/themes/seven/css/components/dialog.css
@@ -0,0 +1,127 @@
+/**
+ * Presentational styles for Drupal dialogs.
+ */
+
+.ui-dialog {
+  position: absolute;
+  z-index: 1260;
+  padding: 0;
+  border: 0;
+  background: transparent;
+}
+
+@media all and (max-width: 48em) { /* 768px */
+  .ui-dialog {
+    min-width: 92%;
+    max-width: 92%;
+  }
+}
+.ui-dialog .ui-dialog-titlebar {
+  padding: 15px 49px 15px 15px; /* LTR */
+  border-top-left-radius: 5px;
+  border-top-right-radius: 5px;
+  background: #6b6b6b;
+}
+[dir="rtl"] .ui-dialog .ui-dialog-titlebar {
+  padding-right: 15px;
+  padding-left: 49px;
+}
+.ui-dialog .ui-dialog-title {
+  margin: 0;
+  color: #fff;
+  font-size: 1.231em;
+  font-weight: 600;
+  -webkit-font-smoothing: antialiased;
+}
+.ui-dialog .ui-dialog-titlebar-close {
+  position: absolute;
+  top: 10px;
+  right: 12px; /* LTR */
+  width: 30px;
+  height: 30px;
+  margin: 0;
+  padding: 0;
+  -webkit-transition: all 0.1s;
+  transition: all 0.1s;
+  border: 3px solid #6b6b6b;
+  border-radius: 5px;
+  background: none;
+}
+.ui-dialog .ui-dialog-titlebar-close:hover,
+.ui-dialog .ui-dialog-titlebar-close:focus {
+  border-color: #fff;
+}
+[dir="rtl"] .ui-dialog .ui-dialog-titlebar-close {
+  right: auto;
+  left: 20px;
+}
+.ui-dialog .ui-icon.ui-icon-closethick {
+  margin-top: -8px;
+  background: url(../../images/icons/ffffff/ex.svg) 0 0 no-repeat;
+}
+.ui-dialog .ui-widget-content.ui-dialog-content {
+  overflow: auto;
+  padding: 1em;
+  background: #fff;
+}
+.views-ui-dialog .ui-widget-content.ui-dialog-content {
+  padding: 0;
+}
+.ui-dialog .ui-widget-content.ui-dialog-buttonpane {
+  /* border-top: 1px solid #bfbfbf; */
+  margin: 0;
+  padding: 15px 20px;
+  border-bottom-right-radius: 5px;
+  border-bottom-left-radius: 5px;
+  background: #f5f5f2;
+}
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
+  float: none;
+  margin: 0;
+  padding: 0;
+}
+.ui-dialog .ui-dialog-buttonpane .ui-button-text-only .ui-button-text {
+  padding: 0;
+}
+.ui-dialog .ui-dialog-content {
+  position: static;
+}
+
+/* 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%; /* LTR */
+  width: 24px;
+  height: 24px;
+  padding: 4px;
+  opacity: 0.9;
+  border-radius: 7px;
+  background-color: #232323;
+  background-image: url(../../images/loading-small.gif);
+  background-repeat: no-repeat;
+  background-position: center center;
+}
+[dir="rtl"] .ui-dialog .ajax-progress-throbber {
+  right: 49%;
+  left: auto;
+}
+.ui-dialog .ajax-progress-throbber .throbber,
+.ui-dialog .ajax-progress-throbber .message {
+  display: none;
+}
+.ui-dialog.ui-dialog-off-canvas .ui-dialog-titlebar {
+  position: relative;
+}
+.ui-dialog.ui-dialog-off-canvas .ui-dialog-titlebar-close {
+  top: 10px;
+}
+.ui-dialog.ui-dialog-off-canvas .ui-widget-content.ui-dialog-content {
+  background: none;
+}
diff --git a/web/themes/seven/css/components/dropbutton.component.css b/web/themes/seven/css/components/dropbutton.component.css
new file mode 100644
index 0000000000000000000000000000000000000000..83c333d64d87c0559726579a8ceba7bfeb7b530b
--- /dev/null
+++ b/web/themes/seven/css/components/dropbutton.component.css
@@ -0,0 +1,338 @@
+/**
+ * @file
+ * Styling dropbuttons.
+ */
+
+/**
+ * Reset styling for all elements.
+ */
+.js .dropbutton .dropbutton-action > input,
+.js .dropbutton .dropbutton-action > a,
+.js .dropbutton .dropbutton-action > button {
+  margin: 0;
+  padding: 0;
+  text-align: left; /* LTR */
+  text-decoration: none;
+  color: #333;
+  font-weight: 600;
+  line-height: normal;
+  -webkit-font-smoothing: antialiased;
+}
+[dir="rtl"].js .dropbutton .dropbutton-action > input,
+[dir="rtl"].js .dropbutton .dropbutton-action > a,
+[dir="rtl"].js .dropbutton .dropbutton-action > button {
+  margin-left: 0; /* This is required to win over specificity of [dir="rtl"] .dropbutton-multiple .dropbutton .dropbutton-action > * */
+  text-align: right;
+}
+.js .dropbutton-action.last {
+  border-radius: 0 0 0 1em; /* LTR */
+}
+[dir="rtl"] .js .dropbutton-action.last {
+  border-radius: 0 0 1em 0;
+}
+
+/**
+ * Overwrite Sevens button styling.
+ */
+.js .dropbutton-widget .button {
+  border: 0;
+  border-radius: 0;
+  background: transparent;
+  box-shadow: none;
+}
+.js .dropbutton-multiple .dropbutton {
+  border-right: 0; /* LTR */
+}
+[dir="rtl"].js .dropbutton-multiple .dropbutton {
+  border-left: 0;
+}
+
+/**
+ * Show dropbutton elements as buttons when javascript is disabled
+ */
+.dropbutton {
+  margin: 0;
+  padding: 0;
+  list-style-type: none;
+}
+.dropbutton li + li {
+  margin-top: 10px;
+}
+.js .dropbutton li {
+  margin-right: 0;
+  margin-bottom: 0;
+}
+.js .dropbutton li + li {
+  margin-top: 0;
+}
+
+@media screen and (min-width: 37.5625em) { /* 601px */
+  .dropbutton li {
+    display: inline-block;
+  }
+  .dropbutton li + li {
+    margin-top: 0;
+    margin-left: 1em;
+  }
+  .js .dropbutton li + li {
+    margin-left: 0;
+  }
+}
+
+/**
+ * Copied styling for .button.
+ */
+.js .dropbutton-multiple .dropbutton-widget {
+  border: 1px solid #a6a6a6;
+  border-radius: 20em;
+  background-color: #f2f1eb;
+  background-image: -webkit-linear-gradient(top, #f6f6f3, #e7e7df);
+  background-image: linear-gradient(to bottom, #f6f6f3, #e7e7df);
+  text-shadow: 0 1px hsla(0, 0%, 100%, 0.6);
+}
+.dropbutton-multiple.open .dropbutton-widget {
+  border-radius: 1em;
+}
+.js .dropbutton-widget .dropbutton-action a,
+.js .dropbutton-widget .dropbutton-action input,
+.js .dropbutton-widget .dropbutton-action button {
+  display: block;
+  width: 100%;
+  padding: 4px 1.5em;
+  border-radius: 20em 0 0 20em; /* LTR */
+}
+[dir="rtl"].js .dropbutton-widget .dropbutton-action a,
+[dir="rtl"].js .dropbutton-widget .dropbutton-action input,
+[dir="rtl"].js .dropbutton-widget .dropbutton-action button {
+  border-radius: 0 20em 20em 0;
+}
+.js .dropbutton-widget .dropbutton-action a:focus,
+.js .dropbutton-widget .dropbutton-action input:focus,
+.js .dropbutton-widget .dropbutton-action button:focus {
+  text-decoration: underline;
+}
+.js .dropbutton-multiple.open .dropbutton-action a,
+.js .dropbutton-multiple.open .dropbutton-action .button {
+  border-radius: 0;
+}
+.js .dropbutton-multiple.open .dropbutton-action:first-child a,
+.js .dropbutton-multiple.open .dropbutton-action:first-child .button {
+  border-radius: 0.9em 0 0 0; /* LTR */
+}
+[dir="rtl"].js .dropbutton-multiple.open .dropbutton-action:first-child a,
+[dir="rtl"].js .dropbutton-multiple.open .dropbutton-action:first-child .button {
+  border-radius: 0 0.9em 0 0;
+}
+.js .dropbutton-multiple.open .dropbutton-action:last-child a,
+.js .dropbutton-multiple.open .dropbutton-action:last-child .button {
+  border-radius: 0 0 0 0.9em; /* LTR */
+}
+[dir="rtl"].js .dropbutton-multiple.open .dropbutton-action:last-child a,
+[dir="rtl"].js .dropbutton-multiple.open .dropbutton-action:last-child .button {
+  border-radius: 0 0 0.9em 0;
+}
+.js .dropbutton-wrapper .dropbutton-widget .dropbutton-action a:hover,
+.js .dropbutton-wrapper .dropbutton-widget .dropbutton-action button:hover,
+.js .dropbutton-wrapper .dropbutton-widget .dropbutton-action input:hover,
+.js .dropbutton-wrapper .dropbutton-widget .dropbutton-action a:focus,
+.js .dropbutton-wrapper .dropbutton-widget .dropbutton-action button:focus,
+.js .dropbutton-wrapper .dropbutton-widget .dropbutton-action input:focus {
+  z-index: 3;
+  color: #1a1a1a;
+  background-color: #f9f8f6;
+  background-image: -webkit-linear-gradient(top, #fcfcfa, #e9e9dd);
+  background-image: linear-gradient(to bottom, #fcfcfa, #e9e9dd);
+  box-shadow: 0 1px 2px hsla(0, 0%, 0%, 0.125);
+}
+.js .dropbutton-wrapper .dropbutton-widget .dropbutton-action a:active,
+.js .dropbutton-wrapper .dropbutton-widget .dropbutton-action input:active,
+.js .dropbutton-wrapper .dropbutton-widget .dropbutton-action button:active {
+  text-decoration: none;
+  background-color: #dfdfd9;
+  background-image: -webkit-linear-gradient(top, #f6f6f3, #e7e7df);
+  background-image: linear-gradient(to bottom, #f6f6f3, #e7e7df);
+  box-shadow: inset 0 1px 3px hsla(0, 0%, 0%, 0.2);
+}
+.dropbutton .secondary-action {
+  border-top: 1px solid #bfbfba;
+}
+
+/**
+ * Rare instances when a dropbutton is actually just a button.
+ * Copied from Seven's buttons.css.
+ */
+.dropbutton-single .dropbutton-widget {
+  position: static;
+  display: inline-block;
+  border: 0;
+  background: transparent;
+}
+.dropbutton-single .dropbutton-action a {
+  width: auto !important;
+  padding: 4px 1.5em;
+  -webkit-transition: all 0.1s;
+  transition: all 0.1s;
+  text-decoration: none;
+  color: #333;
+  border: 1px solid #a6a6a6;
+  border-radius: 20em !important;
+  background-color: #f2f1eb;
+  background-image: -webkit-linear-gradient(top, #f6f6f3, #e7e7df);
+  background-image: linear-gradient(to bottom, #f6f6f3, #e7e7df);
+  text-shadow: 0 1px hsla(0, 0%, 100%, 0.6);
+  font-weight: 600;
+  -webkit-font-smoothing: antialiased;
+}
+.dropbutton-single .dropbutton-action a:hover,
+.dropbutton-single .dropbutton-action a:focus {
+  text-decoration: none;
+  color: #1a1a1a;
+  outline: none;
+  background-color: #f9f8f6;
+  background-image: -webkit-linear-gradient(top, #fcfcfa, #e9e9dd);
+  background-image: linear-gradient(to bottom, #fcfcfa, #e9e9dd);
+}
+.dropbutton-single .dropbutton-action a:hover,
+.dropbutton-single .dropbutton-action a:focus {
+  box-shadow: 0 1px 2px hsla(0, 0%, 0%, 0.125);
+}
+.dropbutton-single .dropbutton-action a:active {
+  -webkit-transition: none;
+  transition: none;
+  background-color: #dfdfd9;
+  background-image: -webkit-linear-gradient(top, #f6f6f3, #e7e7df);
+  background-image: linear-gradient(to bottom, #f6f6f3, #e7e7df);
+  box-shadow: inset 0 1px 3px hsla(0, 0%, 0%, 0.2);
+}
+.dropbutton .dropbutton-action .ajax-progress {
+  position: absolute;
+  z-index: 2;
+  top: 0.2em;
+  right: 0.2em;
+  padding: 0 0 0 0.1em;
+}
+.dropbutton-multiple .dropbutton-action .ajax-progress {
+  top: 0.15em;
+  right: 2.2em;
+  margin-right: 0;
+}
+.dropbutton-multiple .secondary-action .ajax-progress {
+  top: auto;
+  bottom: 0.3em;
+}
+
+/**
+ * The dropdown trigger.
+ */
+.js .dropbutton-wrapper .dropbutton-widget .dropbutton-toggle button {
+  border-left: 1px solid #a6a6a6; /* LTR */
+  outline: none;
+}
+[dir="rtl"].js .dropbutton-wrapper .dropbutton-widget .dropbutton-toggle button {
+  border-right: 1px solid #a6a6a6;
+  border-left: 0;
+}
+.js .dropbutton-wrapper .dropbutton-widget .dropbutton-toggle button {
+  border-radius: 0 20em 20em 0; /* LTR */
+}
+[dir="rtl"].js .dropbutton-wrapper .dropbutton-widget .dropbutton-toggle button {
+  border-radius: 20em 0 0 20em;
+}
+.dropbutton-multiple.open .dropbutton-widget .dropbutton-toggle button {
+  border-radius: 0 1em 1em 0; /* LTR */
+}
+[dir="rtl"] .dropbutton-multiple.open .dropbutton-widget .dropbutton-toggle button {
+  border-radius: 1em 0 0 1em;
+}
+.js .dropbutton-wrapper .dropbutton-widget .dropbutton-toggle button:hover,
+.js .dropbutton-wrapper .dropbutton-widget .dropbutton-toggle button:focus {
+  z-index: 3;
+  text-decoration: none;
+  color: #1a1a1a;
+  background-color: #f9f8f6;
+  background-image: -webkit-linear-gradient(top, #fcfcfa, #e9e9dd);
+  background-image: linear-gradient(to bottom, #fcfcfa, #e9e9dd);
+  box-shadow: 0 1px 2px hsla(0, 0%, 0%, 0.125);
+}
+.js .dropbutton-wrapper .dropbutton-widget .dropbutton-toggle button:active {
+  background-color: #dfdfd9;
+  background-image: -webkit-linear-gradient(top, #f6f6f3, #e7e7df);
+  background-image: linear-gradient(to bottom, #f6f6f3, #e7e7df);
+  box-shadow: inset 0 1px 3px hsla(0, 0%, 0%, 0.2);
+}
+.dropbutton-arrow {
+  top: 54%;
+  right: 35%; /* LTR */
+  border-top-color: #333;
+}
+[dir="rtl"] .dropbutton-arrow {
+  right: auto;
+  left: 35%;
+}
+.dropbutton-multiple.open .dropbutton-arrow {
+  top: 0.6667em;
+  border-top-color: transparent;
+  border-bottom: 0.3333em solid #333;
+}
+
+/**
+ * Form edit action theming.
+ * Copied styling from .button--primary.
+ */
+.js .form-actions .dropbutton .dropbutton-action > * {
+  color: #fff;
+  text-shadow: 0 1px hsla(0, 0%, 0%, 0.5);
+  font-weight: 700;
+}
+.js .form-actions .dropbutton-widget {
+  position: relative;
+  border-color: #1e5c90;
+  background-color: #0071b8;
+  background-image: -webkit-linear-gradient(top, #007bc6, #0071b8);
+  background-image: linear-gradient(to bottom, #007bc6, #0071b8);
+  text-shadow: 0 1px hsla(0, 0%, 0%, 0.5);
+}
+.form-actions .dropbutton-multiple.open .dropbutton-widget {
+  background-image: -webkit-linear-gradient(top, #007bc6, #0071b8);
+  background-image: linear-gradient(to bottom, #007bc6, #0071b8);
+}
+.js .form-actions .dropbutton-wrapper .dropbutton-widget .dropbutton-action .button:hover,
+.js .form-actions .dropbutton-wrapper .dropbutton-widget .dropbutton-action .button:focus {
+  color: #fff;
+  background-color: #2369a6;
+  background-image: -webkit-linear-gradient(top, #0c97ed, #1f86c7);
+  background-image: linear-gradient(to bottom, #0c97ed, #1f86c7);
+  box-shadow: 0 1px 2px hsla(203, 10%, 10%, 0.25);
+}
+.js .form-actions .dropbutton-wrapper .dropbutton-widget .dropbutton-action .button:active {
+  border-color: #144b78;
+  background-image: -webkit-linear-gradient(top, #08639b, #0071b8);
+  background-image: linear-gradient(to bottom, #08639b, #0071b8);
+  box-shadow: inset 0 1px 3px hsla(0, 0%, 0%, 0.2);
+}
+.js .form-actions .dropbutton-wrapper .dropbutton-widget .dropbutton-toggle button,
+.form-actions .dropbutton .secondary-action {
+  border-color: #1e5c90;
+}
+.js .form-actions .dropbutton-wrapper .dropbutton-widget .dropbutton-toggle button {
+  background-image: -webkit-linear-gradient(top, #007bc6, #0071b8);
+  background-image: linear-gradient(to bottom, #007bc6, #0071b8);
+}
+.js .form-actions .dropbutton-wrapper .dropbutton-widget .dropbutton-toggle button:hover,
+.js .form-actions .dropbutton-wrapper .dropbutton-widget .dropbutton-toggle button:focus {
+  background-color: #2369a6;
+  background-image: -webkit-linear-gradient(top, #0c97ed, #1f86c7);
+  background-image: linear-gradient(to bottom, #0c97ed, #1f86c7);
+}
+.js .form-actions .dropbutton-wrapper .dropbutton-widget .dropbutton-toggle button:active {
+  border-color: #144b78;
+  background-image: -webkit-linear-gradient(top, #08639b, #0071b8);
+  background-image: linear-gradient(to bottom, #08639b, #0071b8);
+  box-shadow: inset 0 1px 3px hsla(0, 0%, 0%, 0.2);
+}
+.form-actions .dropbutton-arrow {
+  border-top-color: #fff;
+}
+.form-actions .dropbutton-multiple.open .dropbutton-arrow {
+  border-bottom: 0.3333em solid white;
+}
diff --git a/web/themes/seven/css/components/entity-meta.css b/web/themes/seven/css/components/entity-meta.css
new file mode 100644
index 0000000000000000000000000000000000000000..11be99177bcdd4a7250ec6e2040c8be198ed8a7f
--- /dev/null
+++ b/web/themes/seven/css/components/entity-meta.css
@@ -0,0 +1,70 @@
+/**
+ * Entity meta settings.
+ */
+.entity-meta {
+  border-right: 1px solid #bfbfbf;
+  border-left: 1px solid #bfbfbf;
+  border-radius: 3px;
+  background-color: #edede8;
+  box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.15);
+}
+.entity-meta__header,
+.entity-meta .seven-details {
+  border-top: 1px solid #bfbfbf;
+  border-bottom: 1px solid #bfbfbf;
+  background-color: #fcfcfa;
+}
+.entity-meta__header {
+  padding: 1em 1.5em;
+  border-radius: 3px 3px 0 0;
+}
+.entity-meta__title {
+  margin: 0.25em 0;
+  text-shadow: 0 1px 0 #fff;
+  font-size: 1.231em;
+  font-weight: bold;
+}
+.entity-meta__header .form-item {
+  margin: 0.25em 0;
+}
+.entity-meta__last-saved {
+  font-style: italic; /* As-designed, but really: why is this italic? */
+}
+.entity-meta .seven-details {
+  margin: 0;
+  border-top: 1px solid #fff;
+  border-right: 0;
+  border-left: 0;
+  border-radius: 0;
+}
+.entity-meta .seven-details:last-child {
+  border-radius: 0 0 3px 3px;
+}
+.entity-meta .seven-details[open] {
+  padding-top: 1px;
+  border-top-width: 0;
+  background-color: transparent;
+  background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.125), transparent 4px);
+  background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.125), transparent 4px);
+}
+.entity-meta .seven-details[open] + .seven-details[open] {
+  padding-top: 0;
+  border-top-width: 1px;
+  background-image: none;
+}
+.entity-meta .seven-details > .seven-details__wrapper {
+  padding-top: 0;
+}
+.entity-meta .seven-details > summary {
+  padding: 0.85em 1.25em;
+  text-shadow: 0 1px 0 white;
+}
+.seven-details__summary > .summary {
+  text-transform: none;
+  color: #595959;
+  font-size: 0.95em;
+  font-weight: normal;
+}
+.seven-details__summary:focus > .summary {
+  text-decoration: none;
+}
diff --git a/web/themes/seven/css/components/field-ui.css b/web/themes/seven/css/components/field-ui.css
new file mode 100644
index 0000000000000000000000000000000000000000..d099c51992b9f61336ffd2e04953d59886be5bb0
--- /dev/null
+++ b/web/themes/seven/css/components/field-ui.css
@@ -0,0 +1,28 @@
+/* Field UI */
+#field-display-overview input.field-plugin-settings-edit {
+  margin: 0;
+  padding: 1px 8px;
+}
+#field-display-overview tr.field-plugin-settings-changed {
+  background: #ffb;
+}
+#field-display-overview tr.drag {
+  background: #fe7;
+}
+#field-display-overview tr.field-plugin-settings-editing {
+  background: #d5e9f2;
+}
+#field-display-overview .field-plugin-settings-edit-form .form-item {
+  margin: 10px 0;
+}
+#field-display-overview .field-plugin-settings-edit-form .form-submit {
+  margin-bottom: 0;
+}
+#field-display-overview .form-item-fields-field-image-settings-edit-form-settings-image-style .description {
+  display: inline-block;
+  margin-left: 1em; /* LTR */
+}
+[dir="rtl"] #field-display-overview .form-item-fields-field-image-settings-edit-form-settings-image-style .description {
+  margin-right: 1em;
+  margin-left: 0;
+}
diff --git a/web/themes/seven/css/components/form.css b/web/themes/seven/css/components/form.css
new file mode 100644
index 0000000000000000000000000000000000000000..a414994977d6ab4a4f6e59af0f83a9e2f7976221
--- /dev/null
+++ b/web/themes/seven/css/components/form.css
@@ -0,0 +1,376 @@
+/**
+ * Form elements.
+ */
+form {
+  margin: 0;
+  padding: 0;
+}
+
+/**
+ * Prevent regression due to explicit line-height and font-size applied to these
+ * elements in normalize.css 7.0.0.
+ */
+button:not(.button),
+input:not([type="file"],.form-text, .form-textarea) {
+  line-height: 1.25em;
+}
+textarea,
+input[type="search"],
+input[type="number"],
+input[type="email"] {
+  line-height: normal;
+}
+select {
+  font-size: 0.8125rem;
+  line-height: 1.42902em;
+}
+details select {
+  line-height: 1.20324em;
+}
+
+/**
+ * Prevent regression due to fieldset styling that was removed in normalize.css
+ * 6.0.0.
+ */
+fieldset {
+  margin: 0 2px;
+  padding: 0.35em 0.625em 0.75em;
+  border: 1px solid #c0c0c0;
+}
+fieldset:not(.fieldgroup) {
+  position: relative;
+  min-width: 0;
+  margin: 1em 0;
+  padding: 30px 18px 18px;
+  border-radius: 2px;
+  background-color: #fcfcfa;
+}
+fieldset:not(.fieldgroup) > legend {
+  position: absolute;
+  top: 10px;
+  letter-spacing: 0.08em;
+  text-transform: uppercase;
+  font-size: 1em;
+  font-weight: bold;
+}
+.fieldgroup {
+  min-width: 0;
+}
+.form-item {
+  margin: 0.75em 0;
+}
+/**
+ * When a table row has a single form item, prevent it from adding unnecessary
+ * extra spacing. If it has multiple form items, allow spacing between them,
+ * overriding Classy.
+ */
+tr.odd .form-item,
+tr.even .form-item {
+  margin-top: 0.75em;
+  margin-bottom: 0.75em;
+}
+td > .form-item:only-child {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+.form-type-checkbox {
+  padding: 0;
+}
+label {
+  display: table;
+  margin: 0 0 0.1em;
+  padding: 0;
+  font-weight: bold;
+}
+label.error {
+  color: #a51b00;
+}
+label[for] {
+  cursor: pointer;
+}
+.form-item label.option {
+  text-transform: none;
+}
+.form-item label.option input {
+  vertical-align: middle;
+}
+.form-disabled label {
+  color: #686868;
+}
+.form-disabled input.form-date,
+.form-disabled input.form-text,
+.form-disabled input.form-tel,
+.form-disabled input.form-time,
+.form-disabled input.form-email,
+.form-disabled input.form-url,
+.form-disabled input.form-search,
+.form-disabled input.form-number,
+.form-disabled input.form-color,
+.form-disabled input.form-file,
+.form-disabled textarea.form-textarea,
+.form-disabled select.form-select {
+  border-color: #d4d4d4;
+  background-color: hsla(0, 0%, 0%, 0.08);
+  box-shadow: none;
+}
+.form-item input.error,
+.form-item textarea.error,
+.form-item select.error {
+  color: #a51b00;
+  border-width: 1px;
+  border-color: #e62600;
+  background-color: hsla(15, 75%, 97%, 1);
+  box-shadow: inset 0 5px 5px -5px #b8b8b8;
+}
+.form-item textarea.error + .cke {
+  border-width: 1px;
+  border-color: #e62600;
+}
+.form-item textarea.error + .ck-editor > .ck-editor__main {
+  border: 1px solid #e62600;
+}
+.form-item input.error:focus,
+.form-item textarea.error:focus,
+.form-item select.error:focus {
+  border-color: #e62600;
+  outline: 0;
+  background-color: #fcf4f2;
+  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 0 8px 1px #e62600;
+}
+.form-required:after {
+  width: 7px;
+  height: 7px;
+  background-size: 7px 7px;
+}
+.form-item--error-message {
+  margin-top: 0.15em;
+  color: #e32700;
+}
+.fieldset-wrapper > .form-item--error-message {
+  margin-top: 0;
+}
+.text-format-wrapper .form-item--error-message {
+  margin: 0;
+  padding: 0.25em 0.666em 0;
+  border: solid #ccc;
+  border-width: 0 1px;
+}
+
+/* Filter */
+ul.tips,
+div.description,
+.form-item .description {
+  margin: 0.2em 0 0 0;
+  color: #595959;
+  font-size: 0.95em;
+}
+.form-item .description.error {
+  margin-top: 0;
+  color: #a51b00;
+}
+
+ul.tips li {
+  margin: 0.25em 0 0.25em 1.5em; /* LTR */
+}
+[dir="rtl"] ul.tips li {
+  margin: 0.25em 1.5em 0.25em 0;
+}
+.form-type-radio .description,
+.form-type-checkbox .description {
+  margin-left: 1.5em; /* LTR */
+}
+[dir="rtl"] .form-type-radio .description,
+[dir="rtl"] .form-type-checkbox .description {
+  margin-right: 1.5em;
+  margin-left: 0;
+}
+.form-text,
+.form-textarea {
+  border-radius: 2px;
+  font-size: 1em;
+  line-height: normal;
+}
+
+input.form-autocomplete,
+input.form-text,
+input.form-tel,
+input.form-email,
+input.form-url,
+input.form-search,
+input.form-number,
+input.form-color,
+input.form-file,
+input.form-date,
+input.form-time,
+textarea.form-textarea {
+  box-sizing: border-box;
+  max-width: 100%;
+  padding: 0.3em 0.4em 0.3em 0.5em; /* LTR */
+  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
+  transition: border linear 0.2s, box-shadow linear 0.2s;
+  color: #595959;
+  border: 1px solid #b8b8b8;
+  border-top-color: #999;
+  border-radius: 2px;
+  background: #fcfcfa;
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.125);
+  font-size: 1em;
+}
+[dir="rtl"] textarea.form-textarea {
+  padding: 0.3em 0.5em 0.3em 0.4em;
+}
+.form-text:focus,
+.form-tel:focus,
+.form-email:focus,
+.form-url:focus,
+.form-search:focus,
+.form-number:focus,
+.form-color:focus,
+.form-file:focus,
+.form-textarea:focus,
+.form-date:focus,
+.form-time:focus {
+  border-color: #40b6ff;
+  outline: 0;
+  background-color: #fff;
+  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 0 8px #40b6ff;
+}
+
+.confirm-parent,
+.password-parent {
+  overflow: visible;
+  width: auto;
+}
+
+.form-item-options-group-info-identifier,
+.form-item-pass .description {
+  clear: both;
+}
+
+/**
+ * Limits extra long instances of select elements to the max width allowed
+ * to avoid breaking layouts.
+ */
+select {
+  max-width: 100%;
+}
+
+/**
+ * Select elements - Webkit only
+ */
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+  select {
+    padding: 1px 1.571em 1px 0.5em; /* LTR */
+    cursor: pointer;
+    -webkit-transition: all 0.1s;
+    transition: all 0.1s;
+    border: 1px solid #a6a6a6;
+    border-radius: 0.143em;
+    background:
+      url(../../images/icons/333333/caret-down.svg) no-repeat 99% 63%,
+      -webkit-linear-gradient(top, #f6f6f3, #e7e7df); /* LTR */
+
+    text-shadow: 0 1px hsla(0, 0%, 100%, 0.6);
+    font-size: 0.875rem;
+    -webkit-appearance: none;
+    -webkit-font-smoothing: antialiased;
+  }
+  [dir="rtl"] select {
+    padding: 1px 0.714em 1px 1.571em;
+    background-position: 1% 63%, 0 0;
+  }
+  select:focus,
+  select:hover {
+    color: #1a1a1a;
+    background-image:
+      url(../../images/icons/333333/caret-down.svg),
+      -webkit-linear-gradient(top, #fcfcfa, #e9e9dd);
+  }
+  select:hover {
+    box-shadow: 0 1px 2px hsla(0, 0%, 0%, 0.125);
+  }
+}
+
+/**
+ * Improve spacing of cancel link.
+ */
+#edit-cancel {
+  margin-left: 10px; /* LTR */
+}
+[dir="rtl"] #edit-cancel {
+  margin-right: 10px;
+  margin-left: 0;
+}
+
+/**
+ * Improve form element usability on narrow devices.
+ */
+@media screen and (max-width: 600px) {
+  input.form-autocomplete,
+  input.form-text,
+  input.form-tel,
+  input.form-email,
+  input.form-url,
+  input.form-search,
+  input.form-number,
+  input.form-color,
+  input.form-file,
+  textarea.form-textarea {
+    width: 100%;
+    font-size: 1.2em;
+    line-height: 1.2em;
+  }
+  input.form-number {
+    width: auto;
+  }
+  .form-actions input,
+  .form-wrapper input[type="submit"] {
+    float: none;
+    width: 100%;
+    margin-top: 10px;
+    margin-right: 0;
+    margin-left: 0;
+    padding-bottom: 6px;
+  }
+  .form-actions input:first-child,
+  .form-wrapper input[type="submit"]:first-child {
+    margin-top: 0;
+  }
+  details summary {
+    overflow: hidden;
+    box-sizing: border-box;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+  }
+  .password-strength {
+    width: 100%;
+  }
+  div.form-item div.password-suggestions {
+    float: none;
+  }
+  #dblog-filter-form .form-actions {
+    float: none;
+    padding: 0;
+  }
+  #edit-cancel {
+    display: block;
+    margin: 10px 0 0 0;
+  }
+  select {
+    width: 100%;
+  }
+}
+
+/* Exceptions */
+#diff-inline-form select,
+div.filter-options select {
+  padding: 0;
+}
+
+/**
+ * Prevent regression due to -webkit-appearance being set to button in
+ * normalize.css 4.1.0.
+ */
+::-webkit-file-upload-button {
+  -webkit-appearance: push-button;
+}
diff --git a/web/themes/seven/css/components/help.css b/web/themes/seven/css/components/help.css
new file mode 100644
index 0000000000000000000000000000000000000000..1cbcbd49fe516fc905b02dd1b4c6cd2b25cacdae
--- /dev/null
+++ b/web/themes/seven/css/components/help.css
@@ -0,0 +1,8 @@
+/**
+ * @file
+ * Seven styles for the help component.
+ */
+
+.help p {
+  margin: 0 0 10px;
+}
diff --git a/web/themes/seven/css/components/jquery.ui/theme.css b/web/themes/seven/css/components/jquery.ui/theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..6c4dc4152b2306322535c382ddd90ce93cc69e4c
--- /dev/null
+++ b/web/themes/seven/css/components/jquery.ui/theme.css
@@ -0,0 +1,391 @@
+/**
+ * @file
+ * Seven styles for jQuery UI.
+ * Overrides /core/assets/vendor/jquery.ui/themes/base/theme.css.
+ */
+
+/**
+ * Component containers
+ */
+.ui-widget {
+  background: none;
+}
+.ui-widget-content {
+  border: none;
+}
+
+/**
+ * Interaction states
+ */
+.ui-state-default,
+.ui-state-hover,
+.ui-state-focus,
+.ui-state-active {
+  outline: 0;
+}
+.ui-state-highlight {
+  font-weight: bold;
+}
+
+/**
+ * Interaction cues
+ */
+.ui-state-active,
+.ui-widget-content .ui-state-active {
+  color: #840;
+}
+.ui-state-error,
+.ui-widget-content .ui-state-error {
+  color: #fff;
+  border-color: #d52;
+  background: #e63;
+}
+.ui-state-disabled,
+.ui-widget-content .ui-state-disabled {
+  opacity: 0.35;
+  filter: alpha(opacity=35);
+}
+.ui-priority-secondary,
+.ui-widget-content .ui-priority-secondary {
+  opacity: 0.7;
+  filter: alpha(opacity=70);
+}
+
+/**
+ * Icons
+ */
+/* states and images */
+.ui-icon {
+  display: block;
+  overflow: hidden;
+  width: 16px;
+  height: 16px;
+  text-indent: -99999px;
+  background-image: url(../../../images/ui-icons-222222-256x240.png);
+  background-repeat: no-repeat;
+}
+.ui-widget-content .ui-icon,
+.ui-widget-header .ui-icon {
+  background-image: url(../../../images/ui-icons-222222-256x240.png);
+}
+.ui-state-default .ui-icon {
+  background-image: url(../../../images/ui-icons-888888-256x240.png);
+}
+.ui-state-hover .ui-icon,
+.ui-state-focus .ui-icon,
+.ui-state-highlight .ui-icon {
+  background-image: url(../../../images/ui-icons-454545-256x240.png);
+}
+.ui-state-active .ui-icon {
+  background-image: url(../../../images/ui-icons-800000-256x240.png);
+}
+.ui-state-error .ui-icon,
+.ui-state-error-text .ui-icon {
+  background-image: url(../../../images/ui-icons-ffffff-256x240.png);
+}
+.ui-widget p .ui-icon {
+  margin: 2px 3px 0 0; /* LTR */
+}
+
+[dir="rtl"] .ui-widget p .ui-icon {
+  margin: 2px 0 0 3px;
+}
+/* positioning */
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+.ui-icon-carat-1-n { background-position: 0 0; }
+
+/**
+ * Accordion
+ */
+.ui-accordion {
+  border: none;
+}
+.ui-accordion .ui-accordion-header {
+  text-transform: uppercase;
+  border: solid 1px #ccc;
+}
+.ui-accordion h3.ui-accordion-header,
+#block-system-main h3.ui-accordion-header {
+  margin: 10px 0;
+  font-size: 1.1em;
+}
+#block-system-main .ui-accordion h3.ui-state-active,
+.ui-accordion h3.ui-state-active {
+  margin-bottom: 0;
+}
+.ui-accordion .ui-accordion-header a {
+  display: block;
+}
+.ui-accordion .ui-accordion-content {
+  padding: 1em 2.2em;
+  border: solid 1px #ccc;
+  border-top: 0;
+}
+
+/**
+ * Tabs
+ */
+.ui-tabs {
+  padding: 0;
+}
+.ui-tabs .ui-tabs-nav {
+  margin: 0;
+  padding: 5px 10px 4px;
+  border-bottom: solid 1px #ccc;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+  line-height: 20px;
+}
+.ui-tabs .ui-tabs-nav li {
+  margin: 0;
+  padding: 0 1em 0 10px; /* LTR */
+  list-style: none;
+}
+[dir="rtl"] .ui-tabs .ui-tabs-nav li {
+  padding: 0 10px 0 1em;
+}
+.ui-tabs .ui-tabs-nav li a {
+  float: none;
+  padding: 0 10px;
+  border-radius: 10px;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a {
+  color: #fff;
+  background: #666;
+  font-weight: normal;
+}
+
+/**
+ * Overlays
+ */
+.ui-widget-overlay {
+  opacity: 0.7;
+  filter: alpha(opacity=70);
+  background: #000;
+}
+
+/**
+ * Slider
+ */
+.ui-slider {
+  border: solid 1px #ccc;
+}
+.ui-slider .ui-slider-range {
+  background: #e4e4e4;
+}
+.ui-slider .ui-slider-handle {
+  border: 1px solid #e4e4e4;
+  border-right-color: #d2d2d2;
+  border-bottom: 1px solid #b4b4b4;
+  border-left-color: #d2d2d2;
+  border-radius: 4px;
+  background-color: #e4e4e4;
+}
+.ui-slider a.ui-state-active,
+.ui-slider .ui-slider-handle:active {
+  color: #fff;
+  border: solid 1px #555;
+  background: #666;
+}
+
+/**
+ * Progress Bar
+ */
+.ui-progressbar {
+  height: 1.4em;
+  background: #e4e4e4;
+}
+.ui-progressbar .ui-progressbar-value {
+  height: 1.5em;
+  background: #0072b9 url(../../../../../misc/progress.gif);
+}
+
+/**
+ * Autocomplete
+ */
+.ui-autocomplete {
+  border: 1px solid #ccc;
+  background: #fff;
+}
+
+/* Suggestion list */
+.ui-autocomplete .ui-menu-item.ui-state-focus,
+.autocomplete .ui-menu-item.ui-state-hover {
+  margin: 0;
+  background: #0072b9;
+}
+.ui-autocomplete .ui-state-focus a,
+.autocomplete .ui-state-hover a {
+  color: #fff;
+}
diff --git a/web/themes/seven/css/components/layout-builder-content-translation.css b/web/themes/seven/css/components/layout-builder-content-translation.css
new file mode 100644
index 0000000000000000000000000000000000000000..44ebd2a13a88db875c123e80f7cdde109ab06ab2
--- /dev/null
+++ b/web/themes/seven/css/components/layout-builder-content-translation.css
@@ -0,0 +1,4 @@
+.layout-builder-translation-warning {
+  padding-left: 20px;
+  background: left 2px url(../../images/icons/e29700/warning.svg) no-repeat;
+}
diff --git a/web/themes/seven/css/components/media.css b/web/themes/seven/css/components/media.css
new file mode 100644
index 0000000000000000000000000000000000000000..34b1599497e49e23753520b1f5f59fd1dfef40e3
--- /dev/null
+++ b/web/themes/seven/css/components/media.css
@@ -0,0 +1,3 @@
+.media-form .field--name-status {
+  margin-top: 1.5em;
+}
diff --git a/web/themes/seven/css/components/menus-and-lists.css b/web/themes/seven/css/components/menus-and-lists.css
new file mode 100644
index 0000000000000000000000000000000000000000..43e374571f129335971ff8ef394a8a506445135e
--- /dev/null
+++ b/web/themes/seven/css/components/menus-and-lists.css
@@ -0,0 +1,41 @@
+/**
+ * Menus and lists.
+ */
+.item-list ul {
+  margin: 0.25em 0 0.25em 1.5em; /* LTR */
+  list-style-type: disc;
+  list-style-image: none;
+}
+[dir="rtl"] .item-list ul {
+  margin: 0.25em 1.5em 0.25em 0;
+}
+.item-list ul li,
+.menu-item {
+  list-style-type: disc;
+  list-style-image: none;
+}
+.menu-item {
+  margin: 0;
+}
+.item-list ul li.collapsed,
+.menu-item--collapsed {
+  list-style-type: disc;
+  list-style-image: url(../../images/menu-collapsed.png);
+}
+.item-list ul li.expanded,
+.menu-item--expanded {
+  list-style-type: circle;
+  list-style-image: url(../../images/menu-expanded.png);
+}
+ul.links li,
+ul.inline li {
+  padding-right: 1em; /* LTR */
+}
+[dir="rtl"] ul.links li,
+[dir="rtl"] ul.inline li {
+  padding-right: 0;
+  padding-left: 1em;
+}
+ul.inline li {
+  display: inline;
+}
diff --git a/web/themes/seven/css/components/messages.css b/web/themes/seven/css/components/messages.css
new file mode 100644
index 0000000000000000000000000000000000000000..242dead7493231c39f142bae1a4a967efa07a7c6
--- /dev/null
+++ b/web/themes/seven/css/components/messages.css
@@ -0,0 +1,26 @@
+/**
+ * Messages.
+ */
+.messages {
+  margin: 9px 0 10px 8px; /* LTR */
+}
+[dir="rtl"] .messages {
+  margin: 9px 8px 10px 0;
+}
+.messages pre {
+  margin: 0;
+}
+.messages h1,
+.messages .heading-a,
+.messages h2,
+.messages .heading-b,
+.messages h3,
+.messages .heading-c,
+.messages h4,
+.messages .heading-d,
+.messages h5,
+.messages .heading-e,
+.messages h6,
+.messages .heading-f {
+  margin-top: 0;
+}
diff --git a/web/themes/seven/css/components/modules-page.css b/web/themes/seven/css/components/modules-page.css
new file mode 100644
index 0000000000000000000000000000000000000000..2478065cb7fa96e62d72071729c7c21489b27074
--- /dev/null
+++ b/web/themes/seven/css/components/modules-page.css
@@ -0,0 +1,49 @@
+/* Modules page */
+.system-modules fieldset {
+  border: 0;
+  border-top: 1px solid #ccc;
+}
+.system-modules .seven-details {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  background: none;
+}
+.system-modules .seven-details__summary {
+  padding: 0.95em 0.5em;
+  border-bottom: 1px solid #ccc;
+}
+.system-modules [open] .seven-details__summary {
+  border-bottom: none;
+}
+.system-modules .seven-details__wrapper {
+  padding: 0 0 0.5em 0;
+}
+.system-modules .fieldset-wrapper {
+  padding: 0;
+}
+.system-modules table,
+.locale-translation-status-form table {
+  border: 0;
+}
+.system-modules tr.even,
+.system-modules tr.odd,
+.locale-translation-status-form tr.even,
+.locale-translation-status-form tr.odd {
+  border: 0;
+  border-bottom: 10px solid #fff;
+  background: #f3f4ee;
+}
+.system-modules tr td:last-child,
+.locale-translation-status-form tr td:last-child {
+  border: 0;
+}
+.system-modules table th,
+.locale-translation-status-form table th {
+  border: 0;
+  border-bottom: 10px solid #fff;
+}
+.system-modules .sticky-header th,
+.locale-translation-status-form .sticky-header th {
+  border: 0;
+}
diff --git a/web/themes/seven/css/components/node.css b/web/themes/seven/css/components/node.css
new file mode 100644
index 0000000000000000000000000000000000000000..037d0e06263f65385c6a6964405eacaf66a375b9
--- /dev/null
+++ b/web/themes/seven/css/components/node.css
@@ -0,0 +1,3 @@
+.node__submitted {
+  margin: 1em 0;
+}
diff --git a/web/themes/seven/css/components/page-title.css b/web/themes/seven/css/components/page-title.css
new file mode 100644
index 0000000000000000000000000000000000000000..df18051f21079c308dc68ed2a3f93c99824f874a
--- /dev/null
+++ b/web/themes/seven/css/components/page-title.css
@@ -0,0 +1,8 @@
+/**
+ * @file
+ * Page title.
+ */
+.page-title {
+  display: inline-block;
+  -webkit-font-smoothing: antialiased;
+}
diff --git a/web/themes/seven/css/components/pager.css b/web/themes/seven/css/components/pager.css
new file mode 100644
index 0000000000000000000000000000000000000000..4cefa59b91daf6c865e01159f612037d0e782c1c
--- /dev/null
+++ b/web/themes/seven/css/components/pager.css
@@ -0,0 +1,45 @@
+/**
+ * @file
+ * Styles for Seven's Pagination.
+ */
+.pager__items {
+  margin: 0.25em 0 0.25em 1.5em; /* LTR */
+  padding: 0;
+}
+[dir="rtl"] .pager__items {
+  margin: 0.25em 1.5em 0.25em 0;
+}
+.pager__item {
+  display: inline-block;
+  margin: 0;
+  padding: 0 0.4em;
+  color: #757575;
+  font-size: 1.08em;
+}
+.pager__item a {
+  padding: 0 5px 2px;
+  transition: border-bottom-color 0.2s;
+  text-decoration: none;
+  border-bottom: 2px solid transparent;
+  font-weight: 600;
+  line-height: 1.55em;
+  -webkit-font-smoothing: antialiased;
+}
+.pager__item.is-active a {
+  color: #2a678c;
+  border-bottom-width: 3px;
+  border-bottom-color: #2a678c;
+  font-weight: 700;
+}
+.pager__item a:hover,
+.pager__item a:focus {
+  color: #3395d2;
+  border-bottom-color: #3395d2;
+}
+.pager__item--next a,
+.pager__item--last a,
+.pager__item--first a,
+.pager__item--previous a {
+  color: #2a678c;
+  border-bottom-width: 0;
+}
diff --git a/web/themes/seven/css/components/panel.css b/web/themes/seven/css/components/panel.css
new file mode 100644
index 0000000000000000000000000000000000000000..45aac2b62e0c518a141e52dc4879a3f9cce90381
--- /dev/null
+++ b/web/themes/seven/css/components/panel.css
@@ -0,0 +1,17 @@
+/**
+ * @file
+ * Panel styling. Panels are used to visually group items together.
+ */
+
+.panel {
+  margin: 0 0 20px;
+  padding: 9px;
+  border: 1px solid #ccc;
+  background: #f8f8f8;
+}
+.panel__title {
+  margin: 0;
+  padding-bottom: 9px;
+  text-transform: uppercase;
+  font-size: 1em;
+}
diff --git a/web/themes/seven/css/components/quickedit.css b/web/themes/seven/css/components/quickedit.css
new file mode 100644
index 0000000000000000000000000000000000000000..f9409086eac02690601f359aab9b5f64e6230a7e
--- /dev/null
+++ b/web/themes/seven/css/components/quickedit.css
@@ -0,0 +1,63 @@
+/**
+ * @file
+ * Override Quick Edit's entity toolbar style on the Drupal front-end.
+ *
+ * I.e. loaded by Quick Edit on the front-end, despite this being a back-end theme.
+ */
+
+/**
+ * The Seven style guide prescribes softer corners.
+ */
+.quickedit-toolbar-container > .quickedit-toolbar-content,
+.quickedit-toolbar-container > .quickedit-toolbar-lining {
+  border-radius: 4px;
+}
+.quickedit-button {
+  border-radius: 3px;
+}
+
+/**
+ * Entity toolbar's "save" button must be styled like a Seven primary button.
+ */
+.quickedit-button.action-save,
+.quickedit-button.action-saving {
+  margin-top: 2px;
+  color: #fff;
+  border-color: #1e5c90;
+  background-image: -webkit-linear-gradient(top, #007bc6, #0071b8);
+  background-image: linear-gradient(to bottom, #007bc6, #0071b8);
+  text-shadow: 0 1px hsla(0, 0%, 0%, 0.5);
+  font-weight: 700;
+  -webkit-font-smoothing: antialiased;
+}
+.quickedit-button.action-save:hover,
+.quickedit-button.action-save:focus,
+.quickedit-button.action-saving:hover,
+.quickedit-button.action-saving:focus {
+  color: #fff;
+  border-color: #1e5c90;
+  background-color: #2369a6;
+  background-image: -webkit-linear-gradient(top, #0c97ed, #1f86c7);
+  background-image: linear-gradient(to bottom, #0c97ed, #1f86c7);
+}
+.quickedit-button.action-save:hover,
+.quickedit-button.action-save:focus,
+.quickedit-button.action-saving:hover,
+.quickedit-button.action-saving:focus {
+  box-shadow: 0 1px 2px hsla(203, 10%, 10%, 0.25);
+}
+.quickedit-button.action-save:active,
+.quickedit-button.action-saving:active {
+  border-color: #144b78;
+  background-image: -webkit-linear-gradient(top, #08639b, #0071b8);
+  background-image: linear-gradient(to bottom, #08639b, #0071b8);
+  box-shadow: inset 0 1px 3px hsla(0, 0%, 0%, 0.2);
+}
+
+/**
+ * The entity toolbar's "save" button's top margin shifts both buttons 2px down,
+ * so we must compensate for that to achieve vertically centered positioning.
+ */
+.quickedit .icon-close:before {
+  top: 8px;
+}
diff --git a/web/themes/seven/css/components/search-admin-settings.css b/web/themes/seven/css/components/search-admin-settings.css
new file mode 100644
index 0000000000000000000000000000000000000000..cc117e38f4835886fc41001e550b291678f8935c
--- /dev/null
+++ b/web/themes/seven/css/components/search-admin-settings.css
@@ -0,0 +1,14 @@
+/**
+ * @file
+ * Styles for administration pages.
+ */
+
+/**
+ * Add search page select/submit.
+ */
+.search-admin-settings .container-inline {
+  margin-bottom: 1em;
+}
+.search-admin-settings label[for="edit-search-type"] {
+  display: block;
+}
diff --git a/web/themes/seven/css/components/skip-link.css b/web/themes/seven/css/components/skip-link.css
new file mode 100644
index 0000000000000000000000000000000000000000..1e6b8c73b0caf3659e4e25c60e5b27cffb1e17b1
--- /dev/null
+++ b/web/themes/seven/css/components/skip-link.css
@@ -0,0 +1,25 @@
+/**
+ * @file
+ * Skip link
+ *
+ * Allows keyboard users to quickly skip to the main content of the page.
+ */
+
+.skip-link {
+  z-index: 50;
+  left: 50%;
+  padding: 1px 10px 2px;
+  -webkit-transform: translateX(-50%);
+  -ms-transform: translateX(-50%);
+  transform: translateX(-50%);
+  color: #fff;
+  border-radius: 0 0 10px 10px;
+  background: #444;
+  font-size: 0.94em;
+}
+.skip-link:focus {
+  text-decoration: none;
+}
+.skip-link.visually-hidden.focusable:focus {
+  position: absolute !important;
+}
diff --git a/web/themes/seven/css/components/system-status-counter.css b/web/themes/seven/css/components/system-status-counter.css
new file mode 100644
index 0000000000000000000000000000000000000000..1166d379f15d1f2ae2c10f7319ef6c17bc20c4d8
--- /dev/null
+++ b/web/themes/seven/css/components/system-status-counter.css
@@ -0,0 +1,86 @@
+/**
+ * @file
+ * Styles for the system status counter component.
+ */
+
+.system-status-counter {
+  display: inline-block;
+  overflow-y: hidden;
+  box-sizing: border-box;
+  width: 100%;
+  white-space: nowrap;
+  border: 1px solid #e6e4df;
+  border-radius: 3px;
+  background: #fcfcfa;
+}
+.system-status-counter__status-icon {
+  display: inline-block;
+  width: 60px;
+  height: 60px;
+  vertical-align: middle;
+  border-right: 1px solid #e6e4df; /* LTR */
+  border-left: 0; /* LTR */
+  background-color: #faf9f5;
+  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1) inset;
+}
+[dir="rtl"] .system-status-counter__status-icon {
+  border-right: 0;
+  border-left: 1px solid #e6e4df;
+  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1) inset;
+}
+.system-status-counter__status-icon:before {
+  display: block;
+  width: 100%;
+  height: 100%;
+  content: "";
+  background-repeat: no-repeat;
+  background-position: 50% center;
+  background-size: 25px;
+}
+
+.system-status-counter__status-icon--error:before {
+  background-image: url(../../images/icons/e32700/error.svg);
+}
+.system-status-counter__status-icon--warning:before {
+  background-image: url(../../images/icons/e29700/warning.svg);
+}
+.system-status-counter__status-icon--checked:before {
+  background-image: url(../../images/icons/73b355/check.svg);
+}
+.system-status-counter__status-title {
+  display: inline-block;
+  padding: 0 6px;
+  vertical-align: middle;
+  text-transform: uppercase;
+  font-size: 1rem;
+  font-weight: bold;
+  line-height: 1em;
+}
+.system-status-counter__title-count {
+  display: block;
+  margin-bottom: 2px;
+}
+.system-status-counter__details {
+  display: block;
+  text-transform: none;
+  font-size: 12px;
+  font-weight: normal;
+  line-height: 1.5;
+}
+
+@media screen and (min-width: 61em) {
+  .system-status-counter__status-icon,
+  .system-status-counter {
+    height: 65px;
+  }
+  .system-status-counter__status-icon {
+    width: 65px;
+  }
+  .system-status-counter__status-title {
+    padding: 10px 3%;
+    font-size: 16px;
+  }
+  .system-status-counter__status-icon:before {
+    background-size: 35px;
+  }
+}
diff --git a/web/themes/seven/css/components/system-status-report-counters.css b/web/themes/seven/css/components/system-status-report-counters.css
new file mode 100644
index 0000000000000000000000000000000000000000..855eadf925a1e4eccb7759e2e407bc4b0af9156d
--- /dev/null
+++ b/web/themes/seven/css/components/system-status-report-counters.css
@@ -0,0 +1,26 @@
+/**
+ * @file
+ * Styles for the system status report counters.
+ */
+
+.system-status-report-counters__item {
+  width: 100%;
+  margin: 10px 0;
+}
+
+@media screen and (min-width: 60em) {
+  .system-status-report-counters__item {
+    margin-bottom: 20px;
+  }
+  .system-status-report-counters {
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: space-between;
+  }
+  .system-status-report-counters__item--half-width {
+    width: 49%;
+  }
+  .system-status-report-counters__item--third-width {
+    width: 32%;
+  }
+}
diff --git a/web/themes/seven/css/components/system-status-report-general-info.css b/web/themes/seven/css/components/system-status-report-general-info.css
new file mode 100644
index 0000000000000000000000000000000000000000..e666d6c4ac93a61fa01e97fcad120ead67f22492
--- /dev/null
+++ b/web/themes/seven/css/components/system-status-report-general-info.css
@@ -0,0 +1,161 @@
+/**
+ * @file
+ * Seven styles for the System Status general info.
+ */
+
+.system-status-general-info {
+  border: 1px solid #ccc;
+  border-radius: 3px;
+}
+
+.system-status-general-info__header {
+  overflow: hidden;
+  margin: 0;
+  padding: 10px;
+  text-transform: uppercase;
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+  background-color: #f5f5f2;
+  font-size: 14px;
+}
+
+.system-status-general-info__item {
+  overflow-x: auto;
+  box-sizing: border-box;
+  padding: 10px 10px 20px;
+  border-top: 1px solid #ccc;
+  background: #fcfcfa;
+}
+
+.system-status-general-info__item-icon {
+  display: inline-block;
+  width: 45px;
+  height: 45px;
+  vertical-align: top;
+}
+.system-status-general-info__item-icon:before {
+  display: block;
+  width: 100%;
+  height: 100%;
+  content: "";
+  background-repeat: no-repeat;
+  background-position: 50% center;
+  background-size: 35px;
+}
+.system-status-general-info__item-icon--drupal:before {
+  background-image: url(../../images/logo/drupal-logo.svg);
+}
+.system-status-general-info__item-icon--clock:before {
+  background-image: url(../../images/icons/cccccc/clock.svg);
+}
+.system-status-general-info__item-icon--server:before {
+  background-image: url(../../images/icons/cccccc/server.svg);
+}
+.system-status-general-info__item-icon--php:before {
+  background-image: url(../../images/icons/cccccc/php-logo.svg);
+  background-size: 45px;
+}
+.system-status-general-info__item-icon--database:before {
+  background-image: url(../../images/icons/cccccc/database.svg);
+  background-size: 30px;
+}
+
+.system-status-general-info__item-details {
+  position: relative;
+  display: inline-block;
+  box-sizing: border-box;
+  width: calc(100% - 60px);
+  padding-left: 10px; /* LTR */
+}
+[dir="rtl"] .system-status-general-info__item-details {
+  padding-right: 10px;
+  padding-left: 0;
+}
+
+.system-status-general-info__item-title {
+  margin-bottom: 0;
+}
+
+.system-status-general-info__sub-item-title {
+  margin: 0;
+}
+
+.system-status-general-info__sub-item__title {
+  font-weight: bold;
+}
+.system-status-general-info__sub-item__value {
+  display: block;
+}
+
+.system-status-general-info__run-cron {
+  margin: 1em 0 0;
+}
+
+@media screen and (min-width: 48em) {
+  .system-status-general-info__items {
+    display: flex;
+    overflow-x: hidden;
+    flex-wrap: wrap;
+  }
+
+  .system-status-general-info__item {
+    flex: 1;
+    flex-basis: 33%;
+    width: 33%;
+  }
+  .system-status-general-info__item:nth-child(2) {
+    flex: 2;
+    flex-basis: 66%;
+  }
+  .system-status-general-info__item:nth-child(2),
+  .system-status-general-info__item:nth-child(4),
+  .system-status-general-info__item:nth-child(5) {
+    border-left: 1px solid #ccc; /* LTR */
+  }
+  [dir="rtl"] .system-status-general-info__item:nth-child(1),
+  [dir="rtl"] .system-status-general-info__item:nth-child(3) {
+    border-left: 1px solid #ccc;
+  }
+  [dir="rtl"] .system-status-general-info__item:nth-child(2),
+  [dir="rtl"] .system-status-general-info__item:nth-child(5) {
+    border-left: 0;
+  }
+
+  .system-status-general-info__run-cron {
+    margin: 15px 0 5px;
+  }
+}
+
+@media screen and (min-width: 60em) {
+  .system-status-general-info__item-icon {
+    width: 55px;
+    height: 55px;
+  }
+  .system-status-general-info__item-icon:before {
+    background-size: 35px;
+  }
+  .system-status-general-info__item-icon--php:before {
+    background-size: 55px;
+  }
+
+  .system-status-general-info__run-cron {
+    position: absolute;
+    top: 1em;
+    right: 1em; /* LTR */
+    margin-top: 0;
+  }
+  [dir="rtl"] .system-status-general-info__run-cron {
+    right: auto;
+    left: 1em;
+  }
+}
+
+@media screen and (max-width: 48em) {
+  .system-status-general-info__header {
+    display: none;
+  }
+  .system-status-general-info {
+    margin-top: 25px;
+    border-top: 0;
+  }
+}
diff --git a/web/themes/seven/css/components/system-status-report.css b/web/themes/seven/css/components/system-status-report.css
new file mode 100644
index 0000000000000000000000000000000000000000..1e9d159ec42c69959f87e1b3ae862d7f74b9b128
--- /dev/null
+++ b/web/themes/seven/css/components/system-status-report.css
@@ -0,0 +1,153 @@
+/**
+ * @file
+ * Seven styles for the System Status Report.
+ */
+
+.system-status-report__requirements-group {
+  padding-top: 20px;
+}
+.system-status-report__entry {
+  overflow: auto;
+  width: 100%;
+  margin: 0;
+  border: 0;
+  border-top: 1px solid #ccc;
+  border-radius: 0;
+  background-color: transparent;
+}
+.system-status-report__entry:last-of-type {
+  border-bottom: 1px solid #bebfb9;
+}
+.system-status-report__entry--error {
+  background-color: transparent;
+}
+.system-status-report__entry--warning {
+  background-color: transparent;
+}
+/* Account for native and poly-filled details element */
+.system-status-report__status-title {
+  position: relative;
+  box-sizing: border-box;
+  width: 100%;
+  padding: 1em 1em 1em 3em; /* LTR */
+  font-weight: bold;
+}
+.system-status-report__status-title .details-title {
+  text-transform: none;
+  color: inherit;
+}
+.system-status-report__status-title .details-title {
+  padding-left: 3em; /* LTR */
+}
+[dir="rtl"] .system-status-report__status-title .details-title {
+  padding-right: 3em;
+  padding-left: 0;
+}
+[dir="rtl"].details .system-status-report__status-title {
+  padding: 1em 3em 1em 1em;
+}
+.collapse-processed > .system-status-report__status-title:before {
+  float: right; /* LTR */
+}
+.system-status-report__status-title::-webkit-details-marker {
+  float: right; /* LTR */
+}
+[dir="rtl"] .collapse-processed > .system-status-report__status-title:before {
+  float: left;
+}
+[dir="rtl"] .system-status-report__status-title::-webkit-details-marker {
+  float: left;
+}
+
+/* Make poly-filled details and summary elements behave correctly. */
+.system-status-report summary:first-child ~ * {
+  display: none;
+}
+.system-status-report details[open] > *,
+.system-status-report details > summary:first-child {
+  display: block;
+  color: inherit;
+}
+
+.system-status-report__status-title .details-title:before,
+.details .system-status-report__status-icon:before {
+  position: absolute;
+  top: 1em;
+  left: 10px; /* LTR */
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  margin-right: 10px; /* LTR */
+  content: "";
+  vertical-align: top;
+  background-repeat: no-repeat;
+  background-position: top center;
+  background-size: contain;
+}
+[dir="rtl"] .system-status-report__status-title .details-title:before,
+[dir="rtl"].details .system-status-report__status-title:before {
+  right: 10px;
+  left: auto;
+  margin-right: 0;
+}
+.system-status-report__status-icon--error .details-title:before,
+.details .system-status-report__status-icon--error:before {
+  background-image: url(../../images/icons/e32700/error.svg);
+}
+.system-status-report__status-icon--warning .details-title:before,
+.details .system-status-report__status-icon--warning:before {
+  background-image: url(../../images/icons/e29700/warning.svg);
+}
+
+.system-status-report__entry__value {
+  box-sizing: border-box;
+  padding: 0 1em 1em 3em; /* LTR */
+}
+[dir="rtl"] .system-status-report__entry__value {
+  padding-right: 3em;
+  padding-left: 1em;
+}
+
+@media screen and (max-width: 48em) {
+  .system-status-report {
+    word-wrap: break-word;
+  }
+}
+
+@media screen and (min-width: 48em) {
+  .system-status-report__entry::after {
+    display: table;
+    clear: both;
+    content: "";
+  }
+  .system-status-report__status-title {
+    float: left; /* LTR */
+    width: 18rem;
+    cursor: default;
+  }
+  .system-status-report__status-title:hover,
+  .system-status-report__status-title:focus {
+    text-decoration: none;
+  }
+  [dir="rtl"] .system-status-report__status-title {
+    float: right;
+  }
+  html.js .system-status-report__status-title::-webkit-details-marker {
+    display: none;
+  }
+  .collapse-processed > .system-status-report__status-title:before {
+    position: relative;
+    top: 3px;
+  }
+  .system-status-report__entry__value {
+    display: block;
+    float: right;
+    width: calc(100% - 23em);
+    padding-top: 1em;
+    padding-left: 0; /* LTR */
+  }
+  [dir="rtl"] .system-status-report__entry__value {
+    padding-right: 3em;
+    padding-left: 0;
+  }
+}
diff --git a/web/themes/seven/css/components/tables.css b/web/themes/seven/css/components/tables.css
new file mode 100644
index 0000000000000000000000000000000000000000..727e0658e60174eae24225b2159e64f721ed5567
--- /dev/null
+++ b/web/themes/seven/css/components/tables.css
@@ -0,0 +1,162 @@
+/**
+ * @file
+ * Seven styles for Tables.
+ */
+
+table {
+  width: 100%;
+  margin: 0 0 10px;
+  border-collapse: collapse;
+}
+caption {
+  text-align: left; /* LTR */
+}
+[dir="rtl"] caption {
+  text-align: right;
+}
+th {
+  padding: 10px 12px;
+  text-align: left; /* LTR */
+}
+[dir="rtl"] th {
+  text-align: right;
+}
+thead th {
+  text-transform: uppercase;
+  color: #333;
+  border: solid #bfbfba;
+  border-width: 1px 0;
+  background: #f5f5f2;
+}
+tr {
+  padding: 0.1em 0.6em;
+  border-bottom: 1px solid #e6e4df;
+}
+thead > tr {
+  border-bottom: 1px solid #000;
+}
+tbody tr:hover,
+tbody tr:focus {
+  background: #f7fcff;
+}
+/* See colors.css */
+tbody tr.color-warning:hover,
+tbody tr.color-warning:focus {
+  background: #fdf8ed;
+}
+tbody tr.color-error:hover,
+tbody tr.color-error:focus {
+  background: #fcf4f2;
+}
+
+table.no-highlight tr.selected td {
+  background: transparent;
+}
+
+td,
+th {
+  vertical-align: middle;
+}
+td {
+  padding: 10px 12px;
+  text-align: left; /* LTR */
+}
+[dir="rtl"] td {
+  text-align: right;
+}
+th > a {
+  position: relative;
+  display: block;
+}
+
+/* 1. Must match negative bottom padding of the parent <th> */
+th > a:after {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: -10px; /* 1. */
+  left: 0;
+  display: block;
+  content: "";
+  -webkit-transition: all 0.1s;
+  transition: all 0.1s;
+  border-bottom: 2px solid transparent;
+}
+th.is-active > a {
+  color: #004875;
+}
+th.is-active img {
+  position: absolute;
+  top: 50%;
+  right: 0; /* LTR */
+}
+[dir="rtl"] th.is-active img {
+  right: auto;
+  left: 0;
+}
+th.is-active > a:after {
+  border-bottom-color: #004875;
+}
+th > a:hover,
+th > a:focus,
+th.is-active > a:hover,
+th.is-active > a:focus {
+  text-decoration: none;
+  color: #008ee6;
+}
+th > a:hover:after,
+th > a:focus:after,
+th.is-active > a:hover:after,
+th.is-active > a:focus:after {
+  border-bottom-color: #008ee6;
+}
+td .item-list ul {
+  margin: 0;
+}
+/* This is required to win over specificity of [dir="rtl"] .item-list ul */
+[dir="rtl"] td .item-list ul {
+  margin: 0;
+}
+td.is-active {
+  background: none;
+}
+
+/* Force browsers to calculate the width of a 'select all' <th> element. */
+th.select-all {
+  width: 1px;
+}
+
+/**
+ * Captions.
+ */
+.caption {
+  margin-bottom: 1.2em;
+}
+
+/**
+ * Responsive tables.
+ */
+@media screen and (max-width: 37.5em) { /* 600px */
+  th.priority-low,
+  td.priority-low,
+  th.priority-medium,
+  td.priority-medium {
+    display: none;
+  }
+}
+
+@media screen and (max-width: 60em) { /* 920px */
+  th.priority-low,
+  td.priority-low {
+    display: none;
+  }
+}
+
+/**
+ * Target every .form-text input where its parent is a form-item inside a table
+ * cell.
+ */
+td > .form-item > .form-text,
+td > .ajax-new-content > .form-item > .form-text {
+  width: 100%;
+}
diff --git a/web/themes/seven/css/components/tablesort-indicator.css b/web/themes/seven/css/components/tablesort-indicator.css
new file mode 100644
index 0000000000000000000000000000000000000000..07274b1ef2087a211ca87b0e7d1ac8869508df00
--- /dev/null
+++ b/web/themes/seven/css/components/tablesort-indicator.css
@@ -0,0 +1,26 @@
+/**
+ * @file
+ * Tablesort indicator styles.
+ */
+
+.tablesort {
+  float: right; /* LTR */
+  width: 10px;
+  height: 10px;
+  margin-top: 5px;
+}
+[dir="rtl"] .tablesort {
+  float: left;
+}
+.tablesort--asc {
+  background-image: url(../../images/icons/004875/twistie-down.svg);
+}
+a:hover .tablesort--asc {
+  background-image: url(../../images/icons/008ee6/twistie-down.svg);
+}
+.tablesort--desc {
+  background-image: url(../../images/icons/004875/twistie-up.svg);
+}
+a:hover .tablesort--desc {
+  background-image: url(../../images/icons/008ee6/twistie-up.svg);
+}
diff --git a/web/themes/seven/css/components/tabs.css b/web/themes/seven/css/components/tabs.css
new file mode 100644
index 0000000000000000000000000000000000000000..156a29501a67cf4a2b4825b7e08e556d19c594fe
--- /dev/null
+++ b/web/themes/seven/css/components/tabs.css
@@ -0,0 +1,355 @@
+/**
+ * Tabs.
+ */
+.is-collapse-enabled .tabs,
+.is-horizontal .tabs {
+  position: relative;
+}
+.is-collapse-enabled .tabs:before,
+.is-horizontal .tabs:before {
+  position: absolute;
+  z-index: 10;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  display: block;
+  height: 1px;
+  content: "";
+  background-color: #a6a6a6;
+}
+
+/* Span the full width of the viewport */
+.content-header .is-horizontal .tabs:before,
+.content-header .is-collapse-enabled .tabs:before {
+  right: -2.5em;
+  left: -2.5em;
+}
+
+/**
+ * Tab
+ *
+ * 1. Required by some elements such as <button>
+ * 2. Fixed height needed to ensure alignment with absolutely-positioned
+ *    active tab.
+ */
+.tabs__tab {
+  position: relative;
+  display: block;
+  overflow: hidden;
+  box-sizing: border-box;
+  width: 100%;  /* 1 */
+  margin: -1px 0 0;
+  padding: 9px 2em 7px 1em; /* LTR */
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  color: #0074bd;
+  border: 1px solid #bfbfbf;
+  background-color: rgba(242, 242, 240, 0.7);
+}
+[dir="rtl"] .tabs__tab {
+  padding-right: 1em;
+  padding-left: 2em;
+}
+.tabs__tab:hover,
+.tabs__tab:focus {
+  color: #008ee6;
+  background-color: #fafaf7;
+}
+li.tabs__tab {
+  display: block;
+  padding: 0;
+}
+/* This is required to win over specificity of [dir="rtl"] .tabs__tab */
+[dir="rtl"] li.tabs__tab {
+  padding-right: 0;
+  padding-left: 0;
+}
+li.tabs__tab a {
+  padding: 9px 2em 7px 1em; /* LTR */
+}
+[dir="rtl"] li.tabs__tab a {
+  padding-right: 1em;
+  padding-left: 2em;
+}
+.tabs a:hover,
+.tabs a:focus {
+  text-decoration: none;
+}
+
+/* Primary tabs */
+.tabs.primary {
+  clear: both;
+  margin: 16px 0 0;
+  margin: 1rem 0 0;
+}
+.tabs.primary .tabs__tab.is-active {
+  z-index: 15;
+  color: #004f80;
+  border-color: #a6a6a6;
+  border-radius: 4px 0 0 0; /* LTR */
+  background-color: #fff;
+}
+[dir="rtl"] .tabs.primary .tabs__tab.is-active {
+  border-top-left-radius: 0;
+  border-top-right-radius: 4px;
+}
+.tabs.primary a {
+  background: none;
+}
+.tabs.primary a:focus {
+  text-decoration: underline;
+  color: #008ee6;
+  background-color: #fafaf7;
+}
+.tabs.primary .is-active a:focus {
+  text-decoration: underline;
+  background: none;
+}
+
+/* Only add the arrow if there's space */
+@media screen and (min-width: 18.75em) { /* 300px */
+  .tabs.primary a {
+    background: url(../../images/icons/0074bd/chevron-right.svg) 99% center no-repeat;
+  }
+  [dir="rtl"] .tabs.primary a {
+    background: url(../../images/icons/0074bd/chevron-left.svg) 1% center no-repeat;
+  }
+  .tabs.primary .tabs__tab.is-active a {
+    background-image: none;
+  }
+}
+.tabs__trigger {
+  display: none;
+}
+
+/* JS dependent styling */
+.is-collapse-enabled .tabs__trigger {
+  position: absolute;
+  z-index: 10;
+  top: 2px;
+  right: 0; /* LTR */
+  left: auto; /* LTR */
+  display: block;
+  box-sizing: content-box;
+  width: 25%;
+  padding-right: 4px;
+  padding-left: 4px;
+  text-align: center;
+  letter-spacing: 0.1em;
+  border-left: 0; /* LTR */
+  border-radius: 0 4px 0 0; /* LTR */
+  outline: 0;
+  font-family: Arial, sans-serif;
+  font-size: 1.25em;
+}
+[dir="rtl"] .is-collapse-enabled .tabs__trigger {
+  right: auto;
+  left: 0;
+  border-right: 0;
+  border-left: 1px solid #bfbfbf;
+  border-radius: 4px 0 0 0;
+}
+.is-collapse-enabled .tabs {
+  max-height: 0;
+  padding-top: 38px;
+}
+.tabs.is-open {
+  max-height: 999em;
+  padding-bottom: 16px;
+  padding-bottom: 1rem;
+}
+.is-collapse-enabled .tabs__tab.is-active {
+  position: absolute;
+  top: 2px;
+  left: 0; /* LTR */
+  width: 75%;
+  border-bottom: 0;
+}
+[dir="rtl"] .is-collapse-enabled .tabs__tab.is-active {
+  right: 0;
+  left: auto;
+}
+.is-collapse-enabled .tabs.primary a.is-active:before {
+  content: none;
+}
+.is-open .tabs__tab.is-active {
+  color: #004f80;
+  border-color: #a6a6a6;
+  border-bottom: 1px solid #a6a6a6;
+  background-color: #fff;
+}
+
+/* Styles for the horizontal state always take priority */
+.is-horizontal .tabs {
+  overflow: visible;
+  max-height: none !important;
+  padding-top: 0 !important;
+}
+.is-horizontal .tabs__tab {
+  float: left; /* LTR */
+  width: auto;
+  height: auto;
+  margin: 0 0 -1px;
+  text-align: center;
+  border-bottom-color: #a6a6a6;
+}
+[dir="rtl"] .is-horizontal .tabs__tab {
+  float: right;
+  /* This is required to win over specificity of [dir="rtl"] .tabs > li */
+  margin-left: 0;
+}
+.is-horizontal .tabs__tab + .tabs__tab {
+  margin-left: -1px; /* LTR */
+}
+[dir="rtl"] .is-horizontal .tabs__tab + .tabs__tab {
+  margin-right: -1px;
+  margin-left: 0;
+}
+.is-horizontal .tabs.primary .tabs__tab:first-child {
+  border-radius: 4px 0 0 0; /* LTR */
+}
+[dir="rtl"] .is-horizontal .tabs.primary .tabs__tab:first-child {
+  border-radius: 0 4px 0 0;
+}
+.is-horizontal .tabs.primary .tabs__tab:last-child {
+  border-radius: 0 4px 0 0; /* LTR */
+}
+[dir="rtl"] .is-horizontal .tabs.primary .tabs__tab:last-child {
+  border-radius: 4px 0 0 0;
+}
+
+/* Override the states above */
+.is-horizontal .tabs__tab.is-active,
+.is-horizontal .tabs.primary .tabs__tab.is-active,
+[dir="rtl"] .is-horizontal .tabs.primary .tabs__tab.is-active {
+  position: relative;
+  top: 0;
+  width: auto;
+  margin: 0 -4px;
+  border-bottom: 0;
+  border-radius: 4px 4px 0 0;
+}
+.is-horizontal .tabs.primary a {
+  padding: 7px 2em 7px 2em;
+  background-image: none;
+}
+.is-horizontal .tabs__trigger {
+  display: none;
+}
+
+/* Secondary tabs */
+.tabs.secondary {
+  display: block;
+  margin-top: 16px;
+  margin-top: 1rem;
+}
+.tabs.secondary .tabs__tab {
+  display: block;
+  margin-left: -1px; /* LTR */
+  padding: 5px 15px 5px 16px; /* LTR */
+  -webkit-transition: border-color 0.2s, background-color 0.2s;
+  transition: border-color 0.2s, background-color 0.2s;
+  color: #0074bd;
+}
+[dir="rtl"] .tabs.secondary .tabs__tab {
+  margin-right: -1px;
+  margin-left: 0;
+  padding-right: 16px;
+  padding-left: 15px;
+}
+/* This is required to win over specificity of [dir="rtl"] .tabs.secondary .tabs__tab */
+[dir="rtl"] .views-displays .tabs.secondary li,
+[dir="rtl"] .views-displays .tabs.secondary li.is-active {
+  padding-right: 0;
+  padding-left: 0;
+}
+.tabs.secondary .tabs__tab + .tabs__tab {
+  border-top: 1px solid #d9d8d4;
+}
+.tabs.secondary .tabs__tab.is-active {
+  padding-left: 15px; /* LTR */
+  color: #004f80;
+  border-left: 2px solid #004f80; /* LTR */
+}
+[dir="rtl"] .tabs.secondary .tabs__tab.is-active {
+  padding-right: 15px;
+  border-right: 2px solid #004f80;
+  border-left: 1px solid #bfbfbf;
+}
+/* This is required to win over specificity of [dir="rtl"] .tabs.secondary .tabs__tab.is-active */
+[dir="rtl"] .views-displays .tabs.secondary li.is-active {
+  padding-right: 0;
+  border: 0 none;
+}
+.tabs.secondary .tabs__tab:hover,
+.tabs.secondary .tabs__tab:focus {
+  padding-left: 15px; /* LTR */
+  color: #008ee6;
+  border-left: 2px solid #008ee6; /* LTR */
+}
+[dir="rtl"] .tabs.secondary .tabs__tab:hover,
+[dir="rtl"] .tabs.secondary .tabs__tab:focus {
+  padding-right: 15px;
+  border-right: 2px solid #008ee6;
+  border-left: 1px solid #bfbfbf;
+}
+/* This is required to win over specificity of [dir="rtl"] .tabs.secondary .tabs__tab:hover */
+[dir="rtl"] .views-displays .tabs li.tabs__tab:hover {
+  padding-right: 0;
+  border: 0 none;
+}
+.tabs.secondary a {
+  padding: 7px 13px 5px;
+  text-decoration: none;
+  background-color: transparent;
+}
+/* This is required to win over specificity of [dir="rtl"] li.tabs__tab a */
+[dir="rtl"] .tabs.secondary a {
+  padding-right: 13px;
+  padding-left: 13px;
+}
+/* This is required to win over specificity of [dir="rtl"] .tabs.secondary a */
+[dir="rtl"] .views-displays .tabs.secondary a {
+  padding-right: 7px;
+  padding-left: 7px;
+}
+.tabs.secondary .is-active a {
+  color: #004f80;
+}
+.tabs.secondary a:focus {
+  text-decoration: underline;
+}
+
+/* Styles for the horizontal state */
+.is-horizontal .tabs.secondary .tabs__tab {
+  position: relative;
+  z-index: 15;
+  top: 0;
+  float: left; /* LTR */
+  margin-right: 1em;
+  margin-left: 1em;
+  padding: 0;
+  border-top: 0;
+  border-right-color: transparent; /* LTR */
+  border-bottom: 2px solid transparent;
+  border-left: 1px solid transparent; /* LTR */
+  background: none;
+}
+/**
+ * 1. This is required to win over specificity of
+ *      [dir="rtl"] .tabs.secondary .tabs__tab:hover,
+ *      [dir="rtl"] .tabs.secondary .tabs__tab:focus
+ */
+[dir="rtl"] .is-horizontal .tabs.secondary .tabs__tab {
+  float: right;
+  padding-right: 0; /* 1 */
+  border-right: 1px solid transparent;
+  border-left-color: transparent;
+}
+.is-horizontal .tabs.secondary .tabs__tab.is-active {
+  border-bottom-color: #004f80;
+}
+.is-horizontal .tabs.secondary .tabs__tab:hover,
+.is-horizontal .tabs.secondary .tabs__tab:focus {
+  border-bottom-color: #008ee6;
+}
diff --git a/web/themes/seven/css/components/tour.theme.css b/web/themes/seven/css/components/tour.theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..e77d9ff58b2d9e704127d8d84946f191e5aedb3d
--- /dev/null
+++ b/web/themes/seven/css/components/tour.theme.css
@@ -0,0 +1,79 @@
+/**
+ * @file
+ * Styles for Tour theme.
+ */
+
+/* Default styles for the container */
+.shepherd-element {
+  color: #fff;
+  border-radius: 5px;
+  background-color: #000;
+  background-color: rgba(0, 0, 0, 0.8);
+}
+
+.shepherd-element:focus {
+  outline: none;
+  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 0 8px #40b6ff;
+}
+
+/* Mobile */
+@media only screen and (max-width: 767px) {
+  .shepherd-element {
+    border-radius: 0;
+  }
+}
+
+.shepherd-arrow:before {
+  background: none;
+}
+
+/* Add a little css triangle pip, older browser just miss out on the fanciness of it. */
+.shepherd-arrow {
+  border: solid 14px rgba(0, 0, 0, 0.8);
+}
+
+.shepherd-element[data-popper-placement^=top] > .shepherd-arrow {
+  bottom: -28px;
+  border-right-color: transparent;
+  border-bottom-color: transparent;
+  border-left-color: transparent;
+}
+
+.shepherd-element[data-popper-placement^=bottom] > .shepherd-arrow {
+  top: -28px;
+  border-top-color: transparent;
+  border-right-color: transparent;
+  border-left-color: transparent;
+}
+
+.shepherd-element[data-popper-placement^=left] > .shepherd-arrow {
+  right: -28px;
+  border-top-color: transparent;
+  border-right-color: transparent; /* LTR */
+  border-bottom-color: transparent;
+}
+
+.shepherd-element[data-popper-placement^=right] > .shepherd-arrow {
+  left: -28px;
+  border-top-color: transparent;
+  border-bottom-color: transparent;
+  border-left-color: transparent; /* LTR */
+}
+
+.shepherd-text p {
+  line-height: 1.385em;
+}
+.shepherd-text a {
+  color: #fff;
+}
+
+.shepherd-cancel-icon {
+  color: #fff;
+  font-family: "Open Sans", Verdana, sans-serif;
+  font-size: 1.4em;
+  font-weight: bold;
+}
+
+.shepherd-cancel-icon:hover {
+  color: rgba(255, 255, 255, 0.8);
+}
diff --git a/web/themes/seven/css/components/user.css b/web/themes/seven/css/components/user.css
new file mode 100644
index 0000000000000000000000000000000000000000..0008a93b626253f26db160aa1f247fc149f4ad86
--- /dev/null
+++ b/web/themes/seven/css/components/user.css
@@ -0,0 +1,66 @@
+/**
+ * @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 {
+  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-message .ok {
+  color: #325e1c;
+  font-weight: bold;
+}
+.password-confirm-message .error {
+  color: #a51b00;
+  font-weight: bold;
+}
diff --git a/web/themes/seven/css/components/vertical-tabs.css b/web/themes/seven/css/components/vertical-tabs.css
new file mode 100644
index 0000000000000000000000000000000000000000..07c2ca0d10f3a65a5db12dc870ed241646115bf0
--- /dev/null
+++ b/web/themes/seven/css/components/vertical-tabs.css
@@ -0,0 +1,130 @@
+/**
+ * @file
+ * Override of misc/vertical-tabs.css.
+ */
+
+.vertical-tabs {
+  position: relative;
+  margin: 10px 0;
+  border: 1px solid #bdbdbd;
+  border-radius: 4px;
+  background: #e6e5e1;
+}
+.vertical-tabs__menu {
+  float: left; /* LTR */
+  width: 240px;
+  margin: 0 -100% -1px 0; /* LTR */
+  padding: 0;
+  list-style-type: none;
+  border-bottom: 1px solid #ccc;
+  line-height: 1;
+}
+[dir="rtl"] .vertical-tabs__menu {
+  float: right;
+  margin: 0 0 -1px -100%;
+}
+.vertical-tabs__menu-item {
+  position: relative;
+}
+.vertical-tabs__menu-item.is-selected {
+  z-index: 1;
+  overflow-x: hidden;
+  width: 100%;
+  border-right: 1px solid #fcfcfa; /* LTR */
+  border-bottom: 1px solid #b3b2ad;
+  box-shadow: 0 5px 5px -5px hsla(0, 0%, 0%, 0.3);
+}
+.vertical-tabs__menu-item.last {
+  border-bottom: none;
+}
+.vertical-tabs__menu-item.first a {
+  border-top-left-radius: 4px; /* LTR */
+}
+[dir="rtl"] .vertical-tabs__menu-item.first a {
+  border-top-left-radius: 0;
+  border-top-right-radius: 4px;
+}
+[dir="rtl"] .vertical-tabs__menu-item.is-selected {
+  border-right: none;
+  border-left: 1px solid #fcfcfa;
+}
+.vertical-tabs__menu-item:focus,
+.vertical-tabs__menu-item:active {
+  z-index: 2;
+}
+.vertical-tabs__menu-item a {
+  display: block;
+  padding: 10px 15px 15px;
+  text-decoration: none;
+  border-bottom: 1px solid #b3b2ad;
+  background-color: #f2f2f0;
+  text-shadow: 0 1px hsla(0, 0%, 100%, 0.6);
+}
+.vertical-tabs__menu-item:last-child a {
+  border-bottom: 0;
+}
+.vertical-tabs__menu-item.is-selected a,
+.vertical-tabs__menu-item a:hover,
+.vertical-tabs__menu-item a:focus {
+  background: #fcfcfa;
+  text-shadow: none;
+}
+.vertical-tabs__menu-item a:focus {
+  outline: none;
+}
+.vertical-tabs__menu-item a:focus .vertical-tabs__menu-item-title {
+  text-decoration: underline;
+}
+.vertical-tabs__menu-item a:active .vertical-tabs__menu-item-title,
+.vertical-tabs__menu-item.is-selected a:focus .vertical-tabs__menu-item-title {
+  text-decoration: none;
+}
+.vertical-tabs__menu-item.is-selected a {
+  padding-left: 11px; /* LTR */
+  text-decoration: none;
+  color: #004f80;
+  border-bottom: none;
+}
+[dir=rtl] .vertical-tabs__menu-item.is-selected a {
+  padding-right: 11px;
+  padding-left: 15px;
+}
+.vertical-tabs__menu-item.is-selected a:hover,
+.vertical-tabs__menu-item.is-selected a:focus {
+  color: #007ecc;
+}
+[data-vertical-tabs-panes] {
+  background-color: #fcfcfa;
+}
+.vertical-tabs__panes {
+  margin: 0 0 0 240px; /* LTR */
+  padding: 10px 15px 10px 15px;
+  border-left: 1px solid #a6a5a1; /* LTR */
+  border-top-right-radius: 4px; /* LTR */
+  border-bottom-right-radius: 4px; /* LTR */
+}
+[dir="rtl"] .vertical-tabs__panes {
+  margin: 0 240px 0 0;
+  border-right: 1px solid #a6a5a1;
+  border-left: none;
+  border-radius: 4px 0 0 4px;
+}
+.vertical-tabs__panes:after {
+  display: table;
+  clear: both;
+  content: "";
+}
+.vertical-tabs__pane {
+  margin: 0;
+  padding: 0;
+  color: #595959;
+  border: 0;
+}
+.vertical-tabs__menu-item-summary {
+  display: block;
+  padding-top: 0.4em;
+  color: #666;
+}
+.vertical-tabs__pane > summary {
+  display: none;
+}
diff --git a/web/themes/seven/css/components/views-ui.css b/web/themes/seven/css/components/views-ui.css
new file mode 100644
index 0000000000000000000000000000000000000000..912c8257b4cdf3cb16ba3248deb471f67d92b3c4
--- /dev/null
+++ b/web/themes/seven/css/components/views-ui.css
@@ -0,0 +1,334 @@
+/**
+ * Views styling
+ */
+
+/* @group Forms */
+
+/**
+ * Seven positions the summary absolutely, but does not have a way to ignore
+ * details without a summary so we make one up.
+ *
+ * @todo Neither a fieldset without legend nor a details without summary is
+ *   valid HTML markup in any way. Refactor Views UI to not produce such invalid
+ *   markup.
+ */
+details.fieldset-no-legend {
+  padding-top: 0;
+}
+
+/**
+ * Being extra safe here and scoping this to the add view wizard form (where
+ * a layout problem occurs for the Display format details if we don't fix its
+ * padding), but it's probably safe to just let it apply everywhere.
+ */
+#views-ui-add-form details details .seven-details__wrapper {
+  padding-right: 0;
+  padding-left: 0;
+}
+
+.views-display-tab details.box-padding .seven-details__wrapper {
+  padding: 0;
+}
+
+.views-admin input.form-submit,
+.views-ui-dialog input.form-submit,
+.views-admin a.button,
+.views-ui-dialog a.button {
+  margin-top: 0;
+  margin-right: 0; /* LTR */
+  margin-bottom: 0;
+}
+[dir="rtl"] .views-admin input.form-submit,
+[dir="rtl"] .views-ui-dialog input.form-submit,
+[dir="rtl"] .views-admin a.button,
+[dir="rtl"] .views-ui-dialog a.button {
+  margin-right: 1em;
+  margin-left: 0;
+}
+[dir="rtl"] .views-admin input.form-submit:first-child,
+[dir="rtl"] .views-ui-dialog input.form-submit:first-child,
+[dir="rtl"] .views-admin a.button:first-child,
+[dir="rtl"] .views-ui-dialog a.button:first-child {
+  margin-right: 0;
+}
+
+.form-radios > .form-item {
+  margin-top: 3px;
+}
+
+/* @group Dependent options
+ */
+
+/* This is necessary to supersede the Seven .form-item
+ * reset declaration that sets the margin to zero.
+ */
+.form-item-options-expose-required,
+.form-item-options-expose-label,
+.form-item-options-expose-field-identifier,
+.form-item-options-expose-description {
+  margin-left: 1.5em; /* LTR */
+}
+[dir="rtl"] .form-item-options-expose-required,
+[dir="rtl"] .form-item-options-expose-label,
+[dir="rtl"] .form-item-options-expose-field-identifier,
+[dir="rtl"] .form-item-options-expose-description {
+  margin-right: 1.5em;
+  margin-left: 0;
+}
+
+.views-admin-dependent .form-item .form-item,
+.views-admin-dependent .form-type-checkboxes,
+.views-admin-dependent .form-type-radios,
+.views-admin-dependent .form-item .form-item,
+.form-item-options-expose-required,
+.form-item-options-expose-label,
+.form-item-options-expose-field-identifier,
+.form-item-options-expose-description {
+  margin-top: 6px;
+  margin-bottom: 6px;
+}
+
+.views-admin-dependent .form-type-radio,
+.views-admin-dependent .form-radios .form-item {
+  margin-top: 2px;
+  margin-bottom: 2px;
+}
+
+/* @end */
+
+/* @group Lists */
+
+.views-admin ul.secondary,
+.views-admin .item-list ul {
+  margin: 0;
+  padding: 0;
+}
+
+.views-displays ul.secondary li a,
+.views-displays ul.secondary li.is-active a,
+.views-displays ul.secondary li.is-active a.is-active {
+  padding: 2px 7px 3px;
+}
+
+.views-displays ul.secondary li a {
+  color: #0074bd;
+}
+
+.views-displays ul.secondary li.is-active a,
+.views-displays ul.secondary li.is-active a.is-active {
+  border: 1px solid transparent;
+}
+
+.views-admin .links li {
+  padding-right: 0; /* LTR */
+}
+[dir="rtl"] .views-admin .links li {
+  padding-left: 0;
+}
+
+.views-admin .button .links li {
+  padding-right: 12px; /* LTR */
+}
+[dir="rtl"] .views-admin .button .links li {
+  padding-left: 12px;
+}
+
+.views-display-top ul.secondary {
+  float: left; /* LTR */
+  background-color: transparent;
+}
+[dir="rtl"] .views-display-top ul.secondary {
+  float: right;
+}
+
+.views-display-top .secondary .action-list li {
+  float: none;
+  margin: 0;
+}
+
+/* @end */
+
+/* @group Tables */
+
+.views-ui-rearrange-filter-form table td,
+.views-ui-rearrange-filter-form table th {
+  vertical-align: top;
+}
+
+/* @end */
+
+/* @group Attachment details */
+
+#edit-display-settings-title {
+  color: #008bcb;
+}
+
+/* @end */
+
+/* @group Attachment details tabs
+ *
+ * The tabs that switch between sections
+ */
+
+.views-displays .secondary {
+  text-align: left; /* LTR */
+}
+[dir="rtl"] .views-displays .secondary {
+  text-align: right;
+}
+
+.views-admin .icon.add {
+  background-position: center 3px;
+}
+
+.views-displays .secondary a:hover > .icon.add {
+  background-position: center -25px;
+}
+
+.views-displays .secondary .open > a {
+  border-radius: 7px 7px 0 0;
+}
+
+.views-displays .secondary .open > a:hover,
+.views-displays .secondary .open > a:focus {
+  color: #008bcb;
+  background-color: #f1f1f1;
+}
+
+.views-displays .secondary .action-list li:first-child {
+  border-radius: 0 7px 0 0; /* LTR */
+}
+[dir="rtl"] .views-displays .secondary .action-list li:first-child {
+  border-radius: 7px 0 0 0;
+}
+
+.views-displays .secondary .action-list li:last-child {
+  border-radius: 0 0 7px 7px;
+}
+
+.views-displays .secondary .action-list input.form-submit {
+  color: #008bcb;
+}
+
+/* @end */
+
+/* @group Attachment buckets
+ *
+ * These are the individual "buckets," or boxes, inside the display settings area
+ */
+
+.views-ui-display-tab-bucket h3 {
+  text-transform: uppercase;
+}
+
+.views-ui-display-tab-bucket .links {
+  padding: 2px 6px 4px;
+}
+
+.views-ui-display-tab-bucket .links li + li {
+  margin-left: 3px; /* LTR */
+}
+[dir="rtl"] .views-ui-display-tab-bucket .links li + li {
+  margin-right: 3px;
+  margin-left: 0;
+}
+
+/* @end */
+
+/* @group Rearrange filter criteria */
+
+.views-ui-rearrange-filter-form .action-links {
+  float: left;
+  margin: 0 0 1em;
+  padding: 0;
+}
+.views-ui-rearrange-filter-form .tabledrag-toggle-weight-wrapper {
+  float: right;
+  margin-bottom: 1em;
+}
+
+.views-ui-rearrange-filter-form table {
+  border: medium none;
+}
+
+.views-ui-rearrange-filter-form [id^="views-row"] {
+  border: medium none;
+}
+
+.views-ui-rearrange-filter-form tr td:last-child {
+  border-right: medium none; /* LTR */
+}
+[dir="rtl"] .views-ui-rearrange-filter-form tr td:last-child {
+  border-right: initial;
+  border-left: medium none;
+}
+
+.views-ui-rearrange-filter-form .filter-group-operator-row {
+  border-right: 1px solid transparent !important;
+  border-left: 1px solid transparent !important;
+}
+
+.views-ui-rearrange-filter-form tr.drag td {
+  background-color: #fe7 !important;
+}
+
+.views-ui-rearrange-filter-form tr.drag-previous td {
+  background-color: #ffb !important;
+}
+
+/* @end */
+
+/* @group Live preview elements */
+
+.views-query-info pre {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+/* @group Query info table */
+
+.views-query-info table {
+  border-radius: 7px;
+  -webkit-border-horizontal-spacing: 1px;
+  -webkit-border-vertical-spacing: 1px;
+}
+
+.views-query-info table tr td:last-child {
+  /* Fixes a Seven style that bleeds down into this table unnecessarily */
+  border-right: 0 none; /* LTR */
+}
+[dir="rtl"] .views-query-info table tr td:last-child {
+  border-right: initial;
+  border-left: 0 none;
+}
+
+/* @end */
+
+/* @end */
+
+/* @group Add view */
+
+.form-item-page-create,
+.form-item-block-create {
+  margin-top: 13px;
+}
+
+/* @end */
+
+/* @group Modal dialog box
+ *
+ * The contents of the popup dialog on the views edit form.
+ */
+
+.filterable-option .form-item.form-type-checkbox {
+  padding-top: 4px;
+  /* This selector is aggressive because Seven's reset for .form-items is aggressive. */
+  padding-bottom: 4px;
+  padding-left: 4px; /* LTR */
+}
+[dir="rtl"] .filterable-option .form-item.form-type-checkbox {
+  padding-right: 4px;
+  padding-left: 8px;
+}
+
+/* @end */
diff --git a/web/themes/seven/css/layout/layout.css b/web/themes/seven/css/layout/layout.css
new file mode 100644
index 0000000000000000000000000000000000000000..39649e43c1785fe127ceede9d431a4bbfb1178f1
--- /dev/null
+++ b/web/themes/seven/css/layout/layout.css
@@ -0,0 +1,14 @@
+/**
+ * Add spacing to bottom of pages
+ */
+.page-content {
+  margin-bottom: 80px;
+}
+
+/**
+ * Add color to layout icons.
+ */
+.layout-icon__region {
+  fill: #f5f5f2;
+  stroke: #666;
+}
diff --git a/web/themes/seven/css/layout/node-add.css b/web/themes/seven/css/layout/node-add.css
new file mode 100644
index 0000000000000000000000000000000000000000..977cb2305f83e03a49c546960a85828d54558d89
--- /dev/null
+++ b/web/themes/seven/css/layout/node-add.css
@@ -0,0 +1,26 @@
+.layout-region-node-footer__content {
+  margin-top: 1.5em;
+  padding-top: 0.5em;
+  border-top: 1px solid #bebfb9;
+}
+
+/**
+ * Widescreen
+ *
+ * Both of the following media queries must *exactly* match what is in
+ * node.module.css. This is rather crazy.
+ *
+ * @todo Figure out how to reduce media query duplication across files
+ *       and modules. Layout styles only allowed in themes?
+ */
+@media
+  screen and (min-width: 780px),
+  (orientation: landscape) and (min-device-height: 780px) {
+  .node-form-layout .messages {
+    margin-top: 1em;
+    margin-bottom: 1em;
+  }
+  .layout-region-node-footer__content {
+    margin-top: 0.5em;
+  }
+}
diff --git a/web/themes/seven/css/theme/ckeditor-admin.css b/web/themes/seven/css/theme/ckeditor-admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..7214a24bcdefc0dc725031f13fd5e62b8cce5b8e
--- /dev/null
+++ b/web/themes/seven/css/theme/ckeditor-admin.css
@@ -0,0 +1,15 @@
+/**
+ * @file
+ * Seven specific styling for CKEditor admin.
+ */
+
+/*
+ * This rule is needed to provide Seven's blue focus outline.
+ */
+.ckeditor-toolbar-disabled .ckeditor-buttons li a:focus {
+  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 0 8px #40b6ff;
+}
+
+.ckeditor-toolbar-active .ckeditor-buttons li a:focus {
+  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 0 8px #40b6ff;
+}
diff --git a/web/themes/seven/css/theme/ckeditor-dialog.css b/web/themes/seven/css/theme/ckeditor-dialog.css
new file mode 100644
index 0000000000000000000000000000000000000000..87ac1214d76614c24da2b54cc3bb46224b01da02
--- /dev/null
+++ b/web/themes/seven/css/theme/ckeditor-dialog.css
@@ -0,0 +1,254 @@
+/**
+ * @file
+ * CKEditor-native dialogs theming.
+ */
+
+.cke_dialog_background_cover {
+  display: none;
+}
+.cke_dialog:before {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  content: "";
+  opacity: 0.7;
+  background: #000;
+}
+[dir="rtl"] .cke_reset_all * {
+  text-align: right;
+  direction: rtl;
+}
+.cke_reset_all .cke_dialog_body {
+  position: relative;
+  border: 0;
+  border-radius: 0;
+  background: none;
+}
+.cke_reset_all .cke_dialog_body * {
+  font: 13px/1.538em "Lucida Grande", "Lucida Sans Unicode", "DejaVu Sans", "Lucida Sans", sans-serif;
+}
+
+/* Dialog's header. */
+.cke_reset_all .cke_dialog_title {
+  padding: 15px 49px 15px 15px;
+  color: #fff;
+  border: 0;
+  border-top-left-radius: 5px;
+  border-top-right-radius: 5px;
+  background: #6b6b6b;
+  box-shadow: none;
+  text-shadow: none;
+  font-size: 1.3344em;
+  font-weight: 600;
+  line-height: 1.315em;
+  -webkit-font-smoothing: antialiased;
+}
+[dir="rtl"] .cke_reset_all .cke_dialog_title {
+  padding: 15px 15px 15px 49px;
+}
+
+/* More specificity to prevent overriding in high density screens. */
+.cke_reset_all .cke_dialog .cke_dialog_close_button {
+  top: 16px;
+  right: 20px;
+  width: 16px;
+  height: 16px;
+  opacity: 1;
+  background: url(../../images/icons/ffffff/ex.svg) 0 0 no-repeat;
+}
+[dir="rtl"] .cke_reset_all .cke_dialog .cke_dialog_close_button {
+  right: auto;
+  left: 20px;
+}
+.cke_reset_all .cke_dialog .cke_label {
+  display: none;
+}
+
+/* Dialog's body. */
+.cke_reset_all .cke_dialog_contents {
+  border-bottom-right-radius: 5px;
+  border-bottom-left-radius: 5px;
+}
+.cke_reset_all .cke_dialog_contents_body {
+  padding: 1em;
+}
+.cke_reset_all tr:hover,
+.cke_reset_all tr:focus {
+  background: none;
+}
+[dir="rtl"] .cke_reset_all .cke_dialog_ui_hbox_first,
+[dir="rtl"] .cke_reset_all .cke_dialog_ui_hbox_child {
+  padding-right: 0;
+  padding-left: 10px;
+}
+.cke_reset_all .cke_dialog_body label {
+  display: table;
+  margin: 0 0 0.1em;
+  padding: 0;
+  font-weight: bold;
+}
+.cke_reset_all .cke_dialog_body .cke_dialog_ui_input_text,
+.cke_reset_all .cke_dialog_body .cke_dialog_ui_input_textarea,
+.cke_reset_all .cke_dialog_body div.cke_dialog_ui_input_select {
+  border: 0;
+}
+.cke_reset_all .cke_dialog_body textarea,
+.cke_reset_all .cke_dialog_body input[type="text"],
+.cke_reset_all select.cke_dialog_ui_input_select {
+  box-sizing: border-box;
+  max-width: 100%;
+  margin: 0 0 3px;
+  padding: 0.3em 0.4em 0.3em 0.5em;
+  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
+  transition: border linear 0.2s, box-shadow linear 0.2s;
+  color: #595959;
+  border: 1px solid #b8b8b8;
+  border-top-color: #999;
+  border-radius: 2px;
+  background: #fcfcfa;
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.125);
+  font-size: 1em;
+  line-height: normal;
+}
+.cke_reset_all select.cke_dialog_ui_input_select {
+  padding-right: 1.5em;
+  background: #fcfcfa url(../../images/icons/333333/caret-down.svg) no-repeat 99% 63%;
+}
+.cke_reset_all .cke_dialog_body textarea:focus,
+.cke_reset_all .cke_dialog_body input[type="text"]:focus,
+.cke_reset_all select.cke_dialog_ui_input_select:focus {
+  border-color: #40b6ff;
+  outline: 0;
+  background-color: #fff;
+  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 0 8px #40b6ff;
+}
+
+/* Dialog's footer. */
+.cke_reset_all .cke_dialog .cke_dialog_footer {
+  margin: 0;
+  padding: 15px 20px;
+  text-align: left;
+  border: 0;
+  border-bottom-right-radius: 5px;
+  border-bottom-left-radius: 5px;
+  outline: none;
+  background: #f5f5f2;
+}
+[dir="rtl"] .cke_reset_all .cke_dialog .cke_dialog_footer {
+  text-align: right;
+}
+.cke_reset_all .cke_dialog .cke_resizer {
+  display: none;
+}
+.cke_reset_all .cke_dialog_footer_buttons {
+  margin: 0;
+}
+.cke_dialog_footer_buttons td {
+  float: right;
+}
+[dir="rtl"] .cke_dialog_footer_buttons td {
+  float: left;
+}
+.cke_reset_all a.cke_dialog_ui_button {
+  position: relative;
+  display: inline-block;
+  box-sizing: border-box;
+  margin-right: 1em;
+  padding: 4px 1.5em;
+  cursor: pointer;
+  -webkit-transition: all 0.1s;
+  transition: all 0.1s;
+  text-align: center;
+  text-decoration: none;
+  color: #333;
+  border: 1px solid #a6a6a6;
+  border-radius: 20em;
+  background-color: #f2f1eb;
+  background-image: -webkit-linear-gradient(top, #f6f6f3, #e7e7df);
+  background-image: linear-gradient(to bottom, #f6f6f3, #e7e7df);
+  text-shadow: 0 1px hsla(0, 0%, 100%, 0.6);
+  font-size: 14px;
+  font-size: 0.875rem;
+  font-weight: 600;
+  line-height: normal;
+  -webkit-appearance: none;
+  -moz-appearance: none;
+  -webkit-font-smoothing: antialiased;
+}
+[dir="rtl"] .cke_reset_all a.cke_dialog_ui_button {
+  margin-right: 0;
+  margin-left: 1em;
+}
+
+/* More specificity to prevent overriding in high contrast mode. */
+.cke_reset_all .cke_dialog_footer_buttons a.cke_dialog_ui_button:hover,
+.cke_reset_all .cke_dialog_footer_buttons a.cke_dialog_ui_button:focus {
+  padding: 4px 1.5em;
+  text-decoration: none;
+  color: #1a1a1a;
+  border: 1px solid #a6a6a6;
+  background-color: #f9f8f6;
+  background-image: -webkit-linear-gradient(top, #fcfcfa, #e9e9dd);
+  background-image: linear-gradient(to bottom, #fcfcfa, #e9e9dd);
+  box-shadow: 0 1px 2px hsla(0, 0%, 0%, 0.125);
+}
+.cke_reset_all .cke_dialog_footer_buttons a.cke_dialog_ui_button:focus {
+  z-index: 10;
+  border: 1px solid #3ab2ff;
+  box-shadow: 0 0 0.5em 0.1em hsla(203, 100%, 60%, 0.7);
+}
+.cke_reset_all .cke_dialog_footer_buttons a.cke_dialog_ui_button:active {
+  padding: 4px 1.5em;
+  -webkit-transition: none;
+  transition: none;
+  border: 1px solid #a6a6a6;
+  background-color: #dfdfd9;
+  background-image: -webkit-linear-gradient(top, #f6f6f3, #e7e7df);
+  background-image: linear-gradient(to bottom, #f6f6f3, #e7e7df);
+  box-shadow: inset 0 1px 3px hsla(0, 0%, 0%, 0.2);
+}
+.cke_reset_all .cke_dialog_footer_buttons a.cke_dialog_ui_button span {
+  padding: 0;
+  text-shadow: 0 1px hsla(0, 0%, 100%, 0.6);
+  font-size: 0.875rem;
+  line-height: normal;
+}
+.cke_reset_all .cke_dialog_footer_buttons a.cke_dialog_ui_button:hover span,
+.cke_reset_all .cke_dialog_footer_buttons a.cke_dialog_ui_button:focus span,
+.cke_reset_all .cke_dialog_footer_buttons a.cke_dialog_ui_button:active span {
+  padding: 0;
+}
+.cke_reset_all .cke_dialog_footer_buttons a.cke_dialog_ui_button_ok {
+  color: #fff;
+  border-color: #1e5c90;
+  background-color: #0071b8;
+  background-image: -webkit-linear-gradient(top, #007bc6, #0071b8);
+  background-image: linear-gradient(to bottom, #007bc6, #0071b8);
+  text-shadow: 0 1px hsla(0, 0%, 0%, 0.5);
+  font-weight: 700;
+  -webkit-font-smoothing: antialiased;
+}
+.cke_reset_all .cke_dialog_footer_buttons a.cke_dialog_ui_button_ok:hover,
+.cke_reset_all .cke_dialog_footer_buttons a.cke_dialog_ui_button_ok:focus {
+  color: #fff;
+  border-color: #1e5c90;
+  background-color: #2369a6;
+  background-image: -webkit-linear-gradient(top, #0c97ed, #1f86c7);
+  background-image: linear-gradient(to bottom, #0c97ed, #1f86c7);
+  box-shadow: 0 1px 2px hsla(203, 10%, 10%, 0.25);
+}
+.cke_reset_all .cke_dialog_footer_buttons a.cke_dialog_ui_button_ok:focus {
+  border: 1px solid #1280df;
+  box-shadow: 0 0 0.5em 0.1em hsla(203, 100%, 60%, 0.7);
+}
+.cke_reset_all .cke_dialog_footer_buttons a.cke_dialog_ui_button_ok:active {
+  border-color: #144b78;
+  background-image: -webkit-linear-gradient(top, #08639b, #0071b8);
+  background-image: linear-gradient(to bottom, #08639b, #0071b8);
+  box-shadow: inset 0 1px 3px hsla(0, 0%, 0%, 0.2);
+}
+.cke_reset_all .cke_dialog_footer_buttons a.cke_dialog_ui_button_ok span {
+  text-shadow: 0 1px hsla(0, 0%, 0%, 0.5);
+}
diff --git a/web/themes/seven/css/theme/colors.css b/web/themes/seven/css/theme/colors.css
new file mode 100644
index 0000000000000000000000000000000000000000..ac8823996fa6bcde322188d46ebcc30f638b8500
--- /dev/null
+++ b/web/themes/seven/css/theme/colors.css
@@ -0,0 +1,15 @@
+/**
+ * Reusable colors.
+ */
+.color-success {
+  color: #325e1c;
+  background-color: #f3faef;
+}
+.color-warning {
+  color: #734c00;
+  background-color: #fdf8ed;
+}
+.color-error {
+  color: #a51b00;
+  background-color: #fcf4f2;
+}
diff --git a/web/themes/seven/css/theme/filter.admin.css b/web/themes/seven/css/theme/filter.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..db42f12f4da79c9edbce14df2a7e487c6a9404ba
--- /dev/null
+++ b/web/themes/seven/css/theme/filter.admin.css
@@ -0,0 +1,80 @@
+/**
+ * @file
+ * Admin styling for the Filter module.
+ */
+
+/**
+ * Filter information under field.
+ */
+.text-format-wrapper > .form-item {
+  margin-bottom: 0;
+}
+
+.filter-wrapper {
+  overflow: hidden;
+  margin: 0;
+  padding: 0.5em 0.666em;
+  border: 1px solid #ccc;
+  border-top: 0;
+}
+.filter-wrapper .form-item {
+  margin: 0;
+}
+.filter-wrapper .form-item label {
+  display: inline;
+}
+
+.filter-help {
+  float: right; /* LTR */
+}
+[dir="rtl"] .filter-help {
+  float: left;
+}
+.filter-guidelines .filter-guidelines-item {
+  margin-top: 1em;
+}
+.filter-help p {
+  margin: 0;
+}
+.filter-help a {
+  position: relative;
+  margin: 0 20px 0 0; /* LTR */
+}
+[dir="rtl"] .filter-help a {
+  margin: 0 0 0 20px;
+}
+.filter-help a:after {
+  position: absolute;
+  top: 0;
+  right: -20px; /* LTR */
+  display: block;
+  width: 16px;
+  height: 16px;
+  content: "";
+  background: transparent url(../../images/help.png);
+}
+[dir="rtl"] .filter-help a:after {
+  right: auto;
+  left: -20px;
+}
+
+.text-format-wrapper .description {
+  margin-top: 0.5em;
+}
+.tips {
+  margin-top: 0;
+  margin-bottom: 0;
+  padding-top: 0;
+  padding-bottom: 0;
+  font-size: 0.9em;
+}
+
+/**
+ * Improve filter tips position.
+ */
+.tips {
+  padding-left: 0; /* LTR */
+}
+[dir="rtl"] .tips {
+  padding-right: 0;
+}
diff --git a/web/themes/seven/css/theme/install-page.css b/web/themes/seven/css/theme/install-page.css
new file mode 100644
index 0000000000000000000000000000000000000000..b616b418d96fae4421dcbabfe81bf268b4461aec
--- /dev/null
+++ b/web/themes/seven/css/theme/install-page.css
@@ -0,0 +1,62 @@
+/**
+ * @file
+ * Installation styling.
+ *
+ * Unfortunately we have to make our styling quite strong, to override the
+ * .maintenance-page styling.
+ */
+.install-page {
+  min-height: 100%;
+  background-color: #1275b2;
+  background-image:
+    url(../../images/noise-low.png),
+    -webkit-radial-gradient(hsl(203, 80%, 45%), hsl(203, 80%, 32%));
+  background-image:
+    url(../../images/noise-low.png),
+    radial-gradient(hsl(203, 80%, 45%), hsl(203, 80%, 32%));
+  background-repeat: repeat;
+  background-position: left top, 50% 50%; /* LTR */
+}
+[dir="rtl"] .install-page {
+  background-position: right top, 50% 50%;
+}
+
+/**
+ * Password widget
+ */
+.install-page .password-parent,
+.install-page .confirm-parent {
+  width: auto;
+}
+.install-page .form-item .password-suggestions {
+  float: none;
+  width: auto;
+}
+.install-page table td {
+  word-break: break-all;
+}
+
+.install-page .site-version {
+  vertical-align: super;
+  color: #595959;
+  font-size: 0.5em;
+}
+
+@media all and (max-width: 1010px) and (min-width: 48em) {
+  .install-page .password-strength,
+  .install-page .confirm-parent {
+    width: 100%;
+  }
+  .install-configure-form .form-type-password {
+    width: 100%;
+  }
+  .password-confirm,
+  .password-field {
+    float: none;
+  }
+  .password-confirm-match {
+    float: none;
+    width: auto;
+    max-width: 100%;
+  }
+}
diff --git a/web/themes/seven/css/theme/maintenance-page.css b/web/themes/seven/css/theme/maintenance-page.css
new file mode 100644
index 0000000000000000000000000000000000000000..047b88ff1c18056ac57c01d025759a159c03f8e7
--- /dev/null
+++ b/web/themes/seven/css/theme/maintenance-page.css
@@ -0,0 +1,204 @@
+/**
+ * @file
+ * Maintenance theming.
+ */
+
+.maintenance-page {
+  min-height: 100%;
+  background-color: #e0e0d8;
+  background-image: -webkit-radial-gradient(hsl(203, 2%, 90%), hsl(203, 2%, 95%));
+  background-image: radial-gradient(hsl(203, 2%, 90%), hsl(203, 2%, 95%));
+  background-repeat: repeat;
+  background-position: left top, 50% 50%; /* LTR */
+}
+[dir="rtl"] .maintenance-page {
+  background-position: right top, 50% 50%;
+}
+
+.page-title {
+  word-wrap: break-word;
+  color: #0074bd;
+  font-size: 2em;
+  line-height: 1.2em;
+}
+
+/**
+ * Task list & step indicator
+ */
+@media all and (max-width: 48em) { /* 768px */
+  header[role="banner"] {
+    position: relative;
+  }
+  .step-indicator {
+    position: absolute;
+    top: 0.2em;
+    right: 0.5em; /* LTR */
+    display: block;
+    font-size: 1.385em;
+  }
+  [dir="rtl"] .step-indicator {
+    right: auto;
+    left: 0.5em;
+  }
+  .task-list {
+    display: none;
+  }
+}
+
+@media all and (min-width: 48em) { /* 768px */
+  .step-indicator {
+    display: none;
+  }
+  .task-list {
+    margin-left: 0; /* LTR */
+    padding-bottom: 1em;
+    padding-left: 0; /* LTR */
+    list-style-type: none;
+  }
+  [dir="rtl"] .task-list {
+    margin-right: 0;
+    padding-right: 0;
+  }
+  .task-list li {
+    padding: 0.5em 1em 0.5em 3.85em; /* LTR */
+    color: #1a1a1a;
+  }
+  [dir="rtl"] .task-list li {
+    padding: 0.5em 3.85em 0.5em 1em;
+  }
+  .task-list .is-active {
+    position: relative;
+    background: #ebeae4;
+    font-weight: normal;
+  }
+  .task-list .is-active:after {
+    position: absolute;
+    top: 50%;
+    left: 100%; /* LTR */
+    width: 0;
+    height: 0;
+    margin-top: -1.269em;
+    content: " ";
+    pointer-events: none;
+    border: solid transparent;
+    border-width: 1.269em;
+    border-color: rgba(235, 234, 228, 0);
+    border-left-color: #ebeae4; /* LTR */
+  }
+  [dir="rtl"] .task-list .is-active:after {
+    right: 100%;
+    left: auto;
+    border-right-color: #ebeae4;
+    border-left-color: transparent;
+  }
+  .task-list .done {
+    color: #adadad;
+  }
+}
+
+/**
+ * Layout
+ */
+.layout-container {
+  width: auto;
+  margin-right: 1.25em;
+  margin-left: 1.25em;
+  background: #fff;
+}
+.layout-container:after { /* no reason for a clearfix in the markup */
+  display: table;
+  clear: both;
+  content: "";
+}
+
+@media all and (max-width: 48em) { /* 768px */
+  .layout-container {
+    margin: 1.25em;
+    padding: 10px 20px;
+  }
+  .page-title {
+    margin-right: 2em; /* LTR */
+    margin-bottom: 0.725em;
+  }
+  [dir="rtl"] .page-title {
+    margin-right: 0;
+    margin-left: 2em;
+  }
+}
+
+@media all and (min-width: 48em) { /* 768px */
+  html {
+    display: table;
+  }
+  .install-page,
+  .maintenance-page {
+    display: table-cell;
+    padding: 1em 0;
+    vertical-align: middle;
+  }
+  html,
+  .install-page,
+  .maintenance-page {
+    width: 100%;
+    height: 100%;
+    margin: 0;
+  }
+  .layout-container {
+    width: 75%;
+    max-width: 770px;
+    margin: 0 auto;
+    padding: 20px 0 40px 0;
+    border-radius: 5px;
+    box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15);
+  }
+
+  /* Positioning sidebar & content */
+  main {
+    float: left; /* LTR */
+    clear: none;
+    box-sizing: border-box;
+    width: 65%;
+    padding-right: 3.85em;
+    padding-left: 3.85em;
+  }
+  [dir="rtl"] main {
+    float: right;
+  }
+  ul {
+    margin: 0.25em 0;
+    padding: 15px;
+  }
+  [dir="rtl"] ul {
+    margin-right: 0; /* Overrides default [dir="rtl"] ul margin */
+  }
+  .layout-sidebar-first {
+    float: left; /* LTR */
+    width: 35%;
+  }
+  [dir="rtl"] .layout-sidebar-first {
+    float: right;
+  }
+
+  /* Margins for sitename */
+  .page-title {
+    margin: 0.75em 1.9em;
+  }
+}
+
+/**
+ * Status report customization for install and update page.
+ */
+.system-status-report__status-title {
+  float: none;
+  width: 100%;
+}
+.system-status-report__entry__value {
+  float: none;
+  width: 100%;
+  padding-top: 0;
+  padding-left: 3em; /* LTR */
+}
+[dir="rtl"] .system-status-report__entry__value {
+  padding-right: 3em;
+  padding-left: 1em;
+}
diff --git a/web/themes/seven/css/theme/media-library.css b/web/themes/seven/css/theme/media-library.css
new file mode 100644
index 0000000000000000000000000000000000000000..fef1a7a2530881ee0b8b853db99feca23111c365
--- /dev/null
+++ b/web/themes/seven/css/theme/media-library.css
@@ -0,0 +1,737 @@
+/**
+ * @file media-library.css
+
+ * Styling for Media Library.
+ */
+
+.media-library-wrapper {
+  display: flex;
+  margin: -1em;
+}
+
+/**
+ * @todo Reuse or build on vertical tabs styling for the media library menu.
+ *   https://www.drupal.org/project/drupal/issues/3023767
+ */
+.media-library-menu {
+  display: block;
+  width: 600px;
+  max-width: 20%;
+  margin: 0; /* LTR */
+  padding: 0;
+  border-bottom: 1px solid #ccc;
+  background-color: #e6e5e1;
+  line-height: 1;
+}
+[dir="rtl"] .media-library-menu {
+  margin: 0;
+}
+
+/**
+ * @todo Use a class instead of the li element.
+ *   https://www.drupal.org/project/drupal/issues/3029227
+ */
+.media-library-menu li {
+  display: block;
+  padding: 0;
+  list-style: none;
+}
+
+.media-library-menu__link {
+  position: relative;
+  display: block;
+  box-sizing: border-box;
+  padding: 15px;
+  text-decoration: none;
+  border-bottom: 1px solid #b3b2ad;
+  background-color: #f2f2f0;
+  text-shadow: 0 1px hsla(0, 0%, 100%, 0.6);
+}
+
+.media-library-menu__link:active,
+.media-library-menu__link:hover,
+.media-library-menu__link:focus {
+  background: #fcfcfa;
+  text-shadow: none;
+}
+
+.media-library-menu__link:focus,
+.media-library-menu__link:active {
+  outline: none;
+}
+
+.media-library-menu__link.active {
+  z-index: 1;
+  margin-right: -1px; /* LTR */
+  color: #000;
+  border-right: 1px solid #fcfcfa; /* LTR */
+  border-bottom: 1px solid #b3b2ad;
+  background-color: #fff;
+  box-shadow: 0 5px 5px -5px hsla(0, 0%, 0%, 0.3);
+}
+[dir="rtl"] .media-library-menu__link.active {
+  margin-right: 0;
+  margin-left: -1px;
+  border-right: 0;
+  border-left: 1px solid #fcfcfa;
+}
+
+.media-library-content {
+  width: 100%;
+  padding: 1em;
+  border-left: 1px solid #b3b2ad; /* LTR */
+  outline: none;
+}
+[dir="rtl"] .media-library-content {
+  border-right: 1px solid #b3b2ad;
+  border-left: 0;
+}
+
+/* Generic media add form styles. */
+.media-library-add-form--without-input .form-item {
+  margin: 0 0 1em;
+}
+
+/**
+ * Remove outline from added media list.
+ *
+ * The added media list receives focus after adding new media, but since it is
+ * not an interactive element, it does not need an outline.
+ */
+.media-library-add-form__added-media {
+  margin: 0;
+  padding: 0;
+  outline: none;
+}
+
+.media-library-add-form__input-wrapper {
+  padding: 16px;
+  border: 1px solid #bfbfbf;
+  border-radius: 2px;
+  background: #fcfcfa;
+}
+
+/* Style the media add upload form. */
+.media-library-add-form--upload.media-library-add-form--without-input .form-item-upload {
+  margin-bottom: 0;
+}
+
+.media-library-add-form .file-upload-help {
+  margin: 8px 0 0;
+}
+
+/* Style the media add oEmbed form. */
+.media-library-add-form--oembed .media-library-add-form__input-wrapper {
+  display: flex;
+}
+
+@media screen and (max-width: 37.5em) {
+  .media-library-add-form--oembed .media-library-add-form__input-wrapper {
+    display: block;
+  }
+}
+
+.media-library-add-form--oembed.media-library-add-form--without-input .form-item-url {
+  margin-bottom: 0;
+}
+
+.media-library-add-form-oembed-url {
+  width: 100%;
+}
+
+/**
+ * @todo Remove .button when styles are moved to the seven theme in
+ *   https://www.drupal.org/project/drupal/issues/2980769
+ */
+.button.media-library-add-form-oembed-submit {
+  align-self: center;
+}
+
+/* Media add form selection styles. */
+.media-library-add-form__selected-media {
+  margin-top: 1em;
+}
+
+/* Change to padding to account for the negative margin for flex grid. */
+.media-library-add-form__selected-media .details-wrapper {
+  padding: 0 10px 1em 10px;
+}
+
+.media-library-add-form__selected-media .media-library-item .field--name-thumbnail img {
+  height: 100px;
+}
+
+/* Generic media library view styles. */
+.media-library-select-all {
+  flex-basis: 100%;
+  width: 100%;
+  margin: 10px 8px;
+}
+.media-library-select-all input {
+  margin-right: 10px;
+}
+[dir="rtl"] .media-library-select-all input {
+  margin-left: 10px;
+}
+
+.media-library-views-form,
+.media-library-selection,
+.media-library-add-form__selected-media .details-wrapper,
+.media-library-views-form__bulk_form,
+.media-library-view .form--inline {
+  display: flex;
+  flex-wrap: wrap;
+}
+
+.media-library-views-form > .form-actions {
+  flex-basis: 100%;
+}
+
+.media-library-views-form__header {
+  flex-basis: 100%;
+}
+
+.media-library-views-form__header .form-item {
+  margin-right: 8px;
+}
+
+.media-library-views-form__rows {
+  display: flex;
+  flex-wrap: wrap;
+  flex-basis: 100%;
+  margin: 0 -8px;
+}
+
+.media-library-view .form-actions {
+  align-self: flex-end;
+  margin: 0.75em 0;
+}
+
+@media screen and (max-width: 600px) {
+  .media-library-view .form-actions {
+    flex-basis: 100%;
+  }
+}
+
+.media-library-view .media-library-view--form-actions {
+  clear: left;
+  align-self: flex-end;
+  margin: 0.75em 0;
+}
+
+/**
+ * Override the table display of the visually hidden labels.
+ *
+ * The width, height and overflow properties in the styles for the
+ * .visually-hidden class do not work correctly if the element has a table
+ * display.
+ */
+.media-library-item label {
+  display: inline-block;
+}
+
+/* Media library widget view styles. */
+.media-library-wrapper .media-library-view {
+  position: relative;
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: space-between;
+}
+
+.media-library-wrapper .view-header {
+  align-self: flex-end;
+  margin: 1em 0;
+  text-align: right; /* LTR */
+}
+[dir="rtl"] .media-library-wrapper .view-header {
+  text-align: left;
+}
+
+.media-library-wrapper .media-library-view .view-content {
+  flex: 0 0 100%;
+}
+
+.media-library-wrapper .views-display-link {
+  margin: 0;
+  padding-left: 22px; /* LTR */
+  color: #333;
+  font-size: 15px;
+  line-height: 16px;
+}
+[dir="rtl"] .media-library-wrapper .views-display-link {
+  padding-right: 22px;
+  padding-left: 0;
+}
+
+.media-library-wrapper .views-display-link.is-active {
+  font-weight: bold;
+}
+
+.media-library-wrapper .views-display-link-widget {
+  margin-right: 15px;
+  background: url(../../images/icons/333333/grid.svg) left 0 no-repeat; /* LTR */
+}
+[dir="rtl"] .media-library-wrapper .views-display-link-widget {
+  background-position: right 0;
+}
+
+.media-library-wrapper .views-display-link-widget_table {
+  background: url(../../images/icons/333333/table.svg) left 0 no-repeat; /* LTR */
+}
+[dir="rtl"] .media-library-wrapper .views-display-link-widget_table {
+  background-position: right 0;
+}
+
+/**
+ * Style the media library grid items.
+ */
+.media-library-item {
+  position: relative;
+}
+
+/**
+* The media library item container receives screen reader focus when items are
+* removed. Since it is not an interactive element, it does not need an
+* outline.
+*/
+.media-library-item--grid {
+  justify-content: center;
+  box-sizing: border-box;
+  width: 50%;
+  padding: 8px;
+  vertical-align: top;
+  outline: none;
+  background: #fff;
+}
+
+.media-library-item--grid:before {
+  position: absolute;
+  top: 7px;
+  left: 7px;
+  width: calc(100% - 16px);
+  height: calc(100% - 16px);
+  content: "";
+  transition: border-color 0.2s, color 0.2s, background 0.2s;
+  pointer-events: none;
+  border: 1px solid #dbdbdb;
+}
+
+/* Media library widget weight field styles. */
+.media-library-item--grid .form-item {
+  margin: 0.75em;
+}
+
+/* The selected items in the add form should be shown a bit smaller. */
+.media-library-add-form__selected-media .media-library-item--small {
+  width: 33.3%;
+}
+
+.media-library-widget-modal .ui-dialog-buttonpane {
+  display: flex;
+  align-items: center;
+}
+
+.media-library-widget-modal .ui-dialog-buttonpane .form-actions {
+  flex: 1;
+}
+
+/**
+ * By default, the dialog is too narrow to be usable.
+ * @see Drupal.ckeditor.openDialog()
+ */
+.ui-dialog--narrow.media-library-widget-modal {
+  max-width: 75%;
+}
+
+@media screen and (min-width: 45em) {
+  .media-library-item--grid {
+    width: 33.3%;
+  }
+
+  /* Change the width for the modal and widget since there is less space. */
+  .media-library-widget-modal .media-library-item--grid,
+  .media-library-selection .media-library-item--grid {
+    width: 50%;
+  }
+
+  /* The selected items in the add form should be shown a bit smaller. */
+  .media-library-add-form__selected-media .media-library-item--small {
+    width: 25%;
+  }
+}
+
+@media screen and (min-width: 60em) {
+  .media-library-item--grid {
+    width: 25%;
+  }
+
+  /* Change the width for the modal and widget since there is less space. */
+  .media-library-widget-modal .media-library-item--grid,
+  .media-library-selection .media-library-item--grid {
+    width: 33.3%;
+  }
+
+  /* The selected items in the add form should be shown a bit smaller. */
+  .media-library-add-form__selected-media .media-library-item--small {
+    width: 16.6%;
+  }
+}
+
+@media screen and (min-width: 77em) {
+  .media-library-item--grid {
+    width: 16.6%;
+  }
+
+  /* Change the width for the modal and widget since there is less space. */
+  .media-library-widget-modal .media-library-item--grid,
+  .media-library-selection .media-library-item--grid {
+    width: 25%;
+  }
+
+  /* The selected items in the add form should be shown a bit smaller. */
+  .media-library-add-form__selected-media .media-library-item--small {
+    width: 16.6%;
+  }
+}
+
+.media-library-item--grid .field--name-thumbnail {
+  overflow: hidden;
+  text-align: center;
+  background-color: #ebebeb;
+}
+
+.media-library-item--grid .field--name-thumbnail img {
+  height: 180px;
+  object-fit: contain;
+  object-position: center center;
+}
+
+.media-library-item--grid.is-hover:before,
+.media-library-item--grid.checked:before,
+.media-library-item--grid.is-focus:before {
+  top: 5px;
+  left: 5px;
+  border-width: 3px;
+  border-color: #40b6ff;
+  border-radius: 3px;
+}
+
+.media-library-item--grid.checked:before {
+  border-color: #0076c0;
+}
+
+.media-library-item__click-to-select-checkbox {
+  position: absolute;
+  z-index: 1;
+  top: 16px;
+  left: 16px; /* LTR */
+  display: block;
+}
+[dir="rtl"] .media-library-item__click-to-select-checkbox {
+  right: 16px;
+  left: auto;
+}
+
+.media-library-item__click-to-select-checkbox input {
+  width: 20px;
+  height: 20px;
+}
+
+.media-library-item__click-to-select-checkbox .form-item {
+  margin: 0;
+}
+
+.media-library-item__click-to-select-trigger {
+  overflow: hidden;
+  height: 100%;
+  cursor: pointer;
+}
+
+/* Media library item table styles. */
+.media-library-item--table img {
+  max-width: 100px;
+  height: auto;
+}
+
+/* Media library entity view display styles. */
+.media-library-item__preview {
+  padding-bottom: 34px;
+}
+
+.field--widget-media-library-widget .media-library-item__preview {
+  cursor: move;
+}
+
+.field--widget-media-library-widget .js-media-library-item:only-child .media-library-item__preview {
+  cursor: inherit;
+}
+
+.media-library-item__status {
+  position: absolute;
+  top: 40px;
+  left: 5px; /* LTR */
+  padding: 5px 10px;
+  pointer-events: none;
+  color: #e4e4e4;
+  background: #666;
+  font-size: 12px;
+  font-style: italic;
+}
+[dir="rtl"] .media-library-item__status {
+  right: 5px;
+  left: auto;
+}
+
+.media-library-item__attributes {
+  position: absolute;
+  bottom: 0;
+  display: block;
+  overflow: hidden;
+  max-width: calc(100% - 10px);
+  max-height: calc(100% - 50px);
+  padding: 5px;
+  background: white;
+}
+
+.media-library-item__name {
+  font-size: 14px;
+}
+
+.media-library-item__name {
+  display: block;
+  overflow: hidden;
+  margin: 2px;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+.media-library-item__attributes:hover .media-library-item__name,
+.media-library-item--grid.is-focus .media-library-item__name,
+.media-library-item--grid.checked .media-library-item__name {
+  white-space: normal;
+}
+
+.media-library-item__type {
+  color: #696969;
+  font-size: 12px;
+}
+
+.media-library-item--disabled {
+  pointer-events: none;
+  opacity: 0.5;
+}
+
+/* Media library widget styles. */
+.media-library-widget {
+  position: relative;
+}
+
+/**
+ * @todo Change to .media-library-open-button when styles are moved to the
+ *   seven theme in https://www.drupal.org/project/drupal/issues/2980769
+ */
+.button.media-library-open-button {
+  margin-bottom: 1em;
+  margin-left: 0; /* LTR */
+}
+[dir="rtl"] .button.media-library-open-button {
+  margin-right: 0;
+  margin-left: 1em;
+}
+
+.media-library-widget__toggle-weight {
+  position: absolute;
+  top: 5px;
+  right: 5px; /* LTR */
+}
+[dir="rtl"] .media-library-widget__toggle-weight {
+  right: auto;
+  left: 5px;
+}
+
+/* Add negative margin for flex grid. */
+.media-library-selection {
+  margin: 1em -8px;
+}
+
+/**
+ * Media library widget edit and delete button styles.
+ *
+ * We have to override the .button styles since buttons make heavy use of
+ * background and border property changes.
+ */
+.media-library-item__edit,
+.media-library-item__edit:hover,
+.media-library-item__edit:focus,
+.media-library-item__remove,
+.media-library-item__remove:hover,
+.media-library-item__remove:focus,
+.media-library-item__remove.button,
+.media-library-item__remove.button:first-child,
+.media-library-item__remove.button:disabled,
+.media-library-item__remove.button:disabled:active,
+.media-library-item__remove.button:hover,
+.media-library-item__remove.button:focus {
+  position: absolute;
+  z-index: 1;
+  top: 10px;
+  overflow: hidden;
+  width: 21px;
+  height: 21px;
+  margin: 5px;
+  padding: 0;
+  transition: 0.2s border-color;
+  color: transparent;
+  border: 2px solid #ccc;
+  border-radius: 20px;
+  background-size: 13px;
+  text-shadow: none;
+  font-size: 0;
+}
+
+.media-library-item__edit {
+  right: 40px; /* LTR */
+}
+[dir="rtl"] .media-library-item__edit {
+  right: auto;
+  left: 40px;
+}
+
+.media-library-item__remove {
+  right: 10px; /* LTR */
+}
+[dir="rtl"] .media-library-item__remove {
+  right: auto;
+  left: 10px;
+}
+
+.media-library-item__edit {
+  background: url("../../images/icons/787878/pencil.svg") #fff center no-repeat;
+  background-size: 13px;
+}
+.media-library-item__remove,
+.media-library-item__remove.button,
+.media-library-item__remove.button:first-child,
+.media-library-item__remove.button:disabled,
+.media-library-item__remove.button:disabled:active,
+.media-library-item__remove.button:hover,
+.media-library-item__remove.button:focus {
+  background: url("../../images/icons/787878/ex.svg") #fff center no-repeat;
+  background-size: 13px;
+}
+.media-library-item__edit:hover,
+.media-library-item__edit:focus,
+.media-library-item__remove:hover,
+.media-library-item__remove:focus,
+.media-library-item__remove.button:hover,
+.media-library-item__remove.button:focus,
+.media-library-item__remove.button:disabled:active {
+  border-color: #40b6ff;
+}
+
+/**
+ * Style the added media item container.
+ *
+ * The added media container receives screen reader focus since it has the role
+ * 'listitem'. Since it is not an interactive element, it does not need an
+ * outline.
+ */
+.media-library-add-form__media {
+  position: relative;
+  display: flex;
+  padding: 1em 0;
+  border-bottom: 1px solid #c0c0c0;
+  outline: none;
+}
+
+/* Do not show the top padding for the first item. */
+.media-library-add-form__media:first-child {
+  padding-top: 0;
+}
+
+/**
+ * Change the position of the remove button for the first item.
+ *
+ * The first item doesn't have a top padding, change the location of the remove
+ * button as well.
+ */
+.media-library-add-form__media:first-child .media-library-add-form__remove-button[type="submit"] {
+  top: 5px;
+}
+
+/* Do not show the bottom border and padding for the last item. */
+.media-library-add-form__media:last-child {
+  padding-bottom: 0;
+  border-bottom: 0;
+}
+
+.media-library-add-form__preview {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 220px;
+  margin-right: 20px; /* LTR */
+  background: #ebebeb;
+}
+[dir="rtl"] .media-library-add-form__preview {
+  margin-right: 0;
+  margin-left: 20px;
+}
+
+/**
+ * @todo Remove [type="submit"] when styles are moved to the seven theme in
+ *   https://www.drupal.org/project/drupal/issues/2980769
+ */
+.media-library-add-form__remove-button[type="submit"] {
+  position: absolute;
+  top: 25px;
+  right: 6px; /* LTR */
+  width: auto;
+  margin: 0;
+  padding: 2px 20px 2px 2px; /* LTR */
+  text-transform: lowercase;
+  color: transparent;
+  border: 0;
+  border-radius: 0;
+  background: transparent url(../../images/icons/787878/ex.svg) right 2px no-repeat; /* LTR */
+  font-weight: normal;
+  line-height: 16px;
+}
+[dir="rtl"] .media-library-add-form__remove-button[type="submit"] {
+  right: auto;
+  left: 13px;
+  padding: 2px 2px 2px 20px;
+  background-position: left 2px;
+}
+
+.media-library-add-form__remove-button:focus,
+.media-library-add-form__remove-button.button:disabled,
+.media-library-add-form__remove-button.button:disabled:active,
+.media-library-add-form__remove-button.button:focus {
+  color: #787878;
+  border: 0;
+  background: transparent url(../../images/icons/787878/ex.svg) right 2px no-repeat; /* LTR */
+}
+[dir="rtl"] .media-library-add-form__remove-button:focus,
+[dir="rtl"] .media-library-add-form__remove-button.button:disabled,
+[dir="rtl"] .media-library-add-form__remove-button.button:disabled:active,
+[dir="rtl"] .media-library-add-form__remove-button.button:focus {
+  background-position: left 2px;
+}
+
+.media-library-add-form__remove-button:hover,
+.media-library-add-form__remove-button.button:hover {
+  color: #e00;
+  border: 0;
+  background: transparent url(../../images/icons/ee0000/ex.svg) right 2px no-repeat; /* LTR */
+  box-shadow: none;
+}
+[dir="rtl"] .media-library-add-form__remove-button:hover,
+[dir="rtl"] .media-library-add-form__remove-button.button:hover {
+  background-position: left 2px;
+}
+
+/* @todo Remove in https://www.drupal.org/project/drupal/issues/3064914 */
+.views-live-preview .media-library-view div.views-row + div.views-row {
+  margin-top: 0;
+}
diff --git a/web/themes/seven/css/theme/update-report.css b/web/themes/seven/css/theme/update-report.css
new file mode 100644
index 0000000000000000000000000000000000000000..ac83a83ad3f12c38fc7484cb4a714961362edb68
--- /dev/null
+++ b/web/themes/seven/css/theme/update-report.css
@@ -0,0 +1,28 @@
+/**
+ * @file update-report.css
+ *
+ * Styling for the Available updates report at admin/reports/updates
+ */
+
+.project-update__compatibility-details details {
+  height: 20px;
+  margin: 2px 0;
+  border: 0;
+  background-color: inherit;
+}
+.project-update__compatibility-details details[open] {
+  overflow: visible;
+  height: auto;
+  white-space: normal;
+}
+.project-update__compatibility-details summary {
+  margin: 0;
+  padding: 0;
+  text-transform: none;
+  border: 0;
+  font-weight: normal;
+}
+.project-update__compatibility-details .details-wrapper {
+  margin: 0;
+  padding: 5px 0;
+}
diff --git a/web/themes/seven/images/classy/README.txt b/web/themes/seven/images/classy/README.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9df44f55ec0a5d8b73c19d54049faf18e73ab931
--- /dev/null
+++ b/web/themes/seven/images/classy/README.txt
@@ -0,0 +1,12 @@
+WHAT IS THIS DIRECTORY FOR?
+--------------------------------
+This directory is for image files previously inherited from the Classy theme.
+
+WHY ARE CLASSY IMAGE FILES BEING COPIED HERE?
+-------------------------------------------
+Classy will be deprecated during the Drupal 9 lifecycle. To prepare for Classy's
+removal, image files that would otherwise be inherited from Classy are copied
+here.
+
+Image files that differ from the Classy versions should not be placed in this
+directory or any subdirectory.
diff --git a/web/themes/seven/images/classy/icons/application-octet-stream.png b/web/themes/seven/images/classy/icons/application-octet-stream.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5453217dc5cc30e805d3d0da8fa91e5a0684b86
--- /dev/null
+++ b/web/themes/seven/images/classy/icons/application-octet-stream.png
@@ -0,0 +1,3 @@
+�PNG
+
+���
IHDR�����������7����tEXtSoftware�Adobe ImageReadyq�e<���_IDAT(S�ͱ	�@Dѩ�,�`�42���@����Z���#���d2!�4J�>dt��`�
,=ޛ���{g8���C	�PG(�<�h\���w�)E�o}�^�����IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/classy/icons/application-pdf.png b/web/themes/seven/images/classy/icons/application-pdf.png
new file mode 100644
index 0000000000000000000000000000000000000000..36107d6e804015e13d122c53cb035d33632678d2
--- /dev/null
+++ b/web/themes/seven/images/classy/icons/application-pdf.png
@@ -0,0 +1,5 @@
+�PNG
+
+���
IHDR�����������a��!IDATxڍӱ��0��{Aqs�]��M9p�I��#��� nN.
+..š�"����ic~�渢�\��/%�|�)����,���{�sO�c��RI�<"_Z ۶K���=�O-�8�k����z�h���Ff3����q\*:�@
���7���#��A�M���p΋2y8�N��z=p���[� Av8 A����Ѩ�%�Z
A��h<F��(���Ձl�W������n��v�r�����'@��2�W�_�F�:��_.
+�[-U����gB��ܣ*���()5h�����IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/classy/icons/application-x-executable.png b/web/themes/seven/images/classy/icons/application-x-executable.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5453217dc5cc30e805d3d0da8fa91e5a0684b86
--- /dev/null
+++ b/web/themes/seven/images/classy/icons/application-x-executable.png
@@ -0,0 +1,3 @@
+�PNG
+
+���
IHDR�����������7����tEXtSoftware�Adobe ImageReadyq�e<���_IDAT(S�ͱ	�@Dѩ�,�`�42���@����Z���#���d2!�4J�>dt��`�
,=ޛ���{g8���C	�PG(�<�h\���w�)E�o}�^�����IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/classy/icons/audio-x-generic.png b/web/themes/seven/images/classy/icons/audio-x-generic.png
new file mode 100644
index 0000000000000000000000000000000000000000..28d7f50862b5dbb153c0809e9119fd879d499788
--- /dev/null
+++ b/web/themes/seven/images/classy/icons/audio-x-generic.png
@@ -0,0 +1,3 @@
+�PNG
+
+���
IHDR�����������a��IDAT8Oc���?����'W1H-L�?�����w���dC�q��n��� ����8	�<��0��w��~���Z��{���=�������ל��?y_�������W6��ׯ`>_��,6L��P��0Hq�����N7�?ps����og��?���F#h��c��a���^$I������V�#���v8���sy�g�����)�������������o�(3���/��i�)�����ۉ����IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/classy/icons/forum-icons.png b/web/themes/seven/images/classy/icons/forum-icons.png
new file mode 100644
index 0000000000000000000000000000000000000000..e291de672522d40458ed4b6fc15f58372c778afa
--- /dev/null
+++ b/web/themes/seven/images/classy/icons/forum-icons.png
@@ -0,0 +1,10 @@
+�PNG
+
+���
IHDR����������"{�?��PLTE������������www�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������߯����������������������������������������������������������������������������������ۯ�������������������������������������������ד��������������������������������������tP[�����tRNS�	
+
+    %***+,..001479=HKMX\ddhiimsvxxxxxxyy{}������������������������������������������������������������������������甐��IDATx^����E�JiS
+-�����/R܊hq�W�P|d�]b������&�����圼���o��*
�mۨt���w?8����e��O�ձ����]���e���y���E�Y�?�s��8~@������t�8�A~������?s�$�$����s�c�=z�9s�v+O��mKP�l&��w{���O�<�3I�}tj���̠"�p훼��gM>��0��y�F�?����{�;~��mnxcKۏ
+��f9�w�=�uy޶�y&(�aa ��g�e��f3���)`0h^v���Z��䙠�r�5H�$?.`�q�c�W^(g�!�>3��D�4�����;x��bIv��� ���<�x��Tܻ�Ш=K��M�k�,�q��F������!�#��90&�V��$��ӀP�=�y$hO��>|~Q�qDn�Qd&��cV�W��-�����¥�z�U�q��-�E!�(�Vl�|0b�v�=�8��x0�}�@�x$>�G/L���"��W�Ϋ~�aE���(���4�E|s��<~rC�&�=7ݧl�s@!)<ɿ-�ԓ|=�Ŋ�8��sn���a�u�r��Ql�	Ls��� A�$��ʅ��7�h���t{4�0O���]��j\��E9���մ���0�;�
��߭9y����a0OH���x��Y������4����қ�g��g�懕g��x�#(�9yƣH�sA���9��Ȍ�΍q
+�Þ�B��ѫ�/��U����k�������p(�)C��H.}
+�P-XUO[��O�,f���@x5�LU�H@)��{�nz��/TU��"��Kf��'��Bc�<
+�q������~Z��˟ߠɷ9遟u]�<��%�>m�En�i�/�{TI?�<'*��K�ޣ�Y�{��ԏT�\�D�:�ˮ��-�U� �}"�u��߄�{��ӿb�4(Hd2�f���I�Kua�*�[�Aɫu����\�k���}�d��/ݲį���	W����=8�V��w�R����q�
>��{���I�F�E�2gz��L����IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/classy/icons/image-x-generic.png b/web/themes/seven/images/classy/icons/image-x-generic.png
new file mode 100644
index 0000000000000000000000000000000000000000..c1b814f7cb6f4a21e165e88db557ffe4692babad
--- /dev/null
+++ b/web/themes/seven/images/classy/icons/image-x-generic.png
@@ -0,0 +1,6 @@
+�PNG
+
+���
IHDR�����������a��HIDATxڕ�=K�P���'�.��Z*����q�N��!�JDGE�YA��IT��`S�4I�QLnm�{��Z�聇��&��K"� $I����D��1۶�p�^2*�S>�o���HϹ���|�/�e:����!�W��b�
+��
+�`�ȏ�א$\P#A���c��j֚ЄQR0�i�܌����ܒx�-p�I���F��r!#Юk)��-��T�W��iT�i0cvq��:��x�~�+7�we��r1��I/��W���$����(�u�񠛺��e� '��v#���mW��fnV�����\fۢ�0��;G@�
+�A �|	�@F����IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/classy/icons/package-x-generic.png b/web/themes/seven/images/classy/icons/package-x-generic.png
new file mode 100644
index 0000000000000000000000000000000000000000..21fc382cba23efb9d7cfaefb6a98b86324d531e3
--- /dev/null
+++ b/web/themes/seven/images/classy/icons/package-x-generic.png
@@ -0,0 +1,4 @@
+�PNG
+
+���
IHDR�����������7����tEXtSoftware�Adobe ImageReadyq�e<����IDAT(S��1�0�|�P�P�D�4��T�H�qPȲ>��c��h��<Y��(
+6**qO�0�'�_���u&�
Q�g�CW�p&[\���3�B{�;-N�BK*6T6���Ł�B��K�Q#Q�ј	����_s=oH�>-�".�;�C����0`"�a2�\�N�{ӆ�i��������IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/classy/icons/text-html.png b/web/themes/seven/images/classy/icons/text-html.png
new file mode 100644
index 0000000000000000000000000000000000000000..9c7c7932c25ad93adc9c9e6962d984d1703cd17f
--- /dev/null
+++ b/web/themes/seven/images/classy/icons/text-html.png
@@ -0,0 +1,7 @@
+�PNG
+
+���
IHDR�����������a����IDATxڍ��
+�@�}�ަS��=@��7:G��� ��	�w�۲
+��o@��vǁ�f��)�1q���s?����Z;��*W��
+PY�I0F�??3� �sIt�^AQD��+(�2�.0�0���_���ۄ��9�/O�3��dwD�Ϧi�;^�7/�W��~�t�"�\ÙW xB]�BP��@)]���m�����
+�c�0��������IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/classy/icons/text-plain.png b/web/themes/seven/images/classy/icons/text-plain.png
new file mode 100644
index 0000000000000000000000000000000000000000..06804849b8331ed8be3d1ae089311ae58ea79c83
--- /dev/null
+++ b/web/themes/seven/images/classy/icons/text-plain.png
@@ -0,0 +1,4 @@
+�PNG
+
+���
IHDR�����������7����tEXtSoftware�Adobe ImageReadyq�e<���~IDAT(S���	�0E3�8��l���ɋ 
+���km���<hh��)�@E���f�#�^)h����"jq�I�Q�u���&0���A��	��d�J�6t%�����1r*A�?��?�T��f;�����������IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/classy/icons/text-x-generic.png b/web/themes/seven/images/classy/icons/text-x-generic.png
new file mode 100644
index 0000000000000000000000000000000000000000..06804849b8331ed8be3d1ae089311ae58ea79c83
--- /dev/null
+++ b/web/themes/seven/images/classy/icons/text-x-generic.png
@@ -0,0 +1,4 @@
+�PNG
+
+���
IHDR�����������7����tEXtSoftware�Adobe ImageReadyq�e<���~IDAT(S���	�0E3�8��l���ɋ 
+���km���<hh��)�@E���f�#�^)h����"jq�I�Q�u���&0���A��	��d�J�6t%�����1r*A�?��?�T��f;�����������IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/classy/icons/text-x-script.png b/web/themes/seven/images/classy/icons/text-x-script.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9ecca813882ad9d8f3509464e2d8ac017910b81
--- /dev/null
+++ b/web/themes/seven/images/classy/icons/text-x-script.png
@@ -0,0 +1,5 @@
+�PNG
+
+���
IHDR�����������a����IDATxڝ��
+�@E����U��}@?���E!D �� YRM�̗w���
�zpxsa�a��q��E�p�MP�5�e9��*S2�
+0Q
�E�ώ�U�$I.��V�R�B?қ1�eV���d<��ʣ<��Ȃ�(h�����&��_��d`#>˂�i�޴��fƖ<륫K*{ �|���p	"΢�_�F���ڶ��Eaw�_���>2���Z����IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/classy/icons/video-x-generic.png b/web/themes/seven/images/classy/icons/video-x-generic.png
new file mode 100644
index 0000000000000000000000000000000000000000..a2b71f95d9e1a5bf86d90a1272bf4f9ae44fcb71
--- /dev/null
+++ b/web/themes/seven/images/classy/icons/video-x-generic.png
@@ -0,0 +1,5 @@
+�PNG
+
+���
IHDR�����������7����tEXtSoftware�Adobe ImageReadyq�e<���xIDAT(ϕ�11�V>�(v�IEO��
+`��Av�2]4��	�F��BA10[���c�	�K��pK�<�}c�=7S�b��Q0����,<�B=S�����\�
+�� �y�g7aA�πǴ"�j����IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/classy/icons/x-office-document.png b/web/themes/seven/images/classy/icons/x-office-document.png
new file mode 100644
index 0000000000000000000000000000000000000000..40db538fcb71e1f46147a717cdf7134c4e74a239
--- /dev/null
+++ b/web/themes/seven/images/classy/icons/x-office-document.png
@@ -0,0 +1,5 @@
+�PNG
+
+���
IHDR�����������a����IDATx�ՓA
+!E=k/��,��:��܉��TR�c3���l���� ⎵��ա�q�#�9cJI��\�
+(f{z��;k�qF�IS��^�2dS�snB���	b�����5(�T�Z���:�����3�֎���@�|���~-�����IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/classy/icons/x-office-presentation.png b/web/themes/seven/images/classy/icons/x-office-presentation.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb119e5ba91dd5141e07aad5229754cd06401c99
--- /dev/null
+++ b/web/themes/seven/images/classy/icons/x-office-presentation.png
@@ -0,0 +1,5 @@
+�PNG
+
+���
IHDR�����������a���|IDATx���
+� �}�^�st��o1=�r�`1�������
"�����	�=�V�E)EJVS@9���F^���F S�RRȰ���&����+�F~ �~�z��}�GB�3��F�[�E
+. 4��;�����IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/classy/icons/x-office-spreadsheet.png b/web/themes/seven/images/classy/icons/x-office-spreadsheet.png
new file mode 100644
index 0000000000000000000000000000000000000000..9af7b61ea11fb8bd71c0b5c6506a2101d5c1f714
--- /dev/null
+++ b/web/themes/seven/images/classy/icons/x-office-spreadsheet.png
@@ -0,0 +1,4 @@
+�PNG
+
+���
IHDR�����������a���~IDATx���	� E=u��:@��eȳ�`M�B E"�C{臇��_4�pa��6��w�!�ؐR��UP�}j��"��<H�*��7ȰL8�z�	B4�]�/5(�|������j�=�.E
+N� �8������IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/feed.svg b/web/themes/seven/images/feed.svg
new file mode 100644
index 0000000000000000000000000000000000000000..595a9d9ab0d19202db8788f4de2e5858ed2b2404
--- /dev/null
+++ b/web/themes/seven/images/feed.svg
@@ -0,0 +1,8 @@
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
+  <rect fill="#ff9900" width="16" height="16" x="0" y="0" rx="3" ry="3"/>
+  <g fill="#ffffff">
+    <circle cx="4.25" cy="11.812" r="1.5"/>
+    <path d="M10,13.312H7.875c0-2.83-2.295-5.125-5.125-5.125l0,0V6.062C6.754,6.062,10,9.308,10,13.312z"/>
+    <path d="M11.5,13.312c0-4.833-3.917-8.75-8.75-8.75V2.375c6.041,0,10.937,4.896,10.937,10.937H11.5z"/>
+  </g>
+</svg>
diff --git a/web/themes/seven/images/help.png b/web/themes/seven/images/help.png
new file mode 100644
index 0000000000000000000000000000000000000000..dcc5cac7956f6e1d0733695af8db4cffcef90d84
--- /dev/null
+++ b/web/themes/seven/images/help.png
@@ -0,0 +1,5 @@
+�PNG
+
+���
IHDR�����������a����IDATxڥ�=
+�@�s��#HN�#��"mnb�2G����-��,�B���^�B2���}��ܝ������VY�iP4��+(�k���b*��1;�d�&�Z�E��RY��-�aԸ=��
+���- ��-5�}/���-���a!�q�	�b������c��m5�3:9�NP�q@����:@b�d{���A�����D�3�Ag$�u;ٜ�Q�y#m��rl�t쫛O��B䃪	t�����IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/icons/004875/twistie-down.svg b/web/themes/seven/images/icons/004875/twistie-down.svg
new file mode 100644
index 0000000000000000000000000000000000000000..6cd6a786bbbec522474409f47f7e0d444b0f3b01
--- /dev/null
+++ b/web/themes/seven/images/icons/004875/twistie-down.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#004875" d="M2.611 5.393c-.17-.216-.084-.393.191-.393h10.397c.275 0 .361.177.191.393l-5.08 6.464c-.17.216-.452.216-.622 0l-5.077-6.464z"/></svg>
diff --git a/web/themes/seven/images/icons/004875/twistie-up.svg b/web/themes/seven/images/icons/004875/twistie-up.svg
new file mode 100644
index 0000000000000000000000000000000000000000..bf3b80ed01ebb6926d1c2622310ac01b995179d6
--- /dev/null
+++ b/web/themes/seven/images/icons/004875/twistie-up.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#004875" d="M13.391 10.607c.17.216.084.393-.191.393h-10.398c-.275 0-.361-.177-.191-.393l5.08-6.464c.17-.216.45-.216.62 0l5.08 6.464z"/></svg>
diff --git a/web/themes/seven/images/icons/0074bd/chevron-left.svg b/web/themes/seven/images/icons/0074bd/chevron-left.svg
new file mode 100644
index 0000000000000000000000000000000000000000..122e1c09991a6c4ad3a0fb511a018107ff18aa32
--- /dev/null
+++ b/web/themes/seven/images/icons/0074bd/chevron-left.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#0074bd" d="M7.951 7.645c-.193.196-.193.516 0 .71l3.258 3.29c.193.193.191.519-.002.709l-1.371 1.371c-.193.192-.512.191-.707 0l-5.335-5.371c-.194-.194-.194-.514 0-.708l5.335-5.369c.195-.195.514-.195.707-.001l1.371 1.371c.193.194.195.513.002.709l-3.258 3.289z"/></svg>
diff --git a/web/themes/seven/images/icons/0074bd/chevron-right.svg b/web/themes/seven/images/icons/0074bd/chevron-right.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b16a8ce89d581648b8e560315a2c05100f159084
--- /dev/null
+++ b/web/themes/seven/images/icons/0074bd/chevron-right.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#0074bd" d="M8.053 8.355c.193-.195.193-.517 0-.711l-3.26-3.289c-.193-.195-.192-.514.002-.709l1.371-1.371c.194-.194.512-.193.706.001l5.335 5.369c.195.195.195.515 0 .708l-5.335 5.37c-.194.192-.512.193-.706.002l-1.371-1.371c-.194-.195-.195-.514-.002-.709l3.26-3.29z"/></svg>
diff --git a/web/themes/seven/images/icons/008ee6/twistie-down.svg b/web/themes/seven/images/icons/008ee6/twistie-down.svg
new file mode 100644
index 0000000000000000000000000000000000000000..23f6d9ac1b8bfe487bad1a5384bcdb5593e0a41f
--- /dev/null
+++ b/web/themes/seven/images/icons/008ee6/twistie-down.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#008ee6" d="M2.611 5.393c-.17-.216-.084-.393.191-.393h10.397c.275 0 .361.177.191.393l-5.08 6.464c-.17.216-.452.216-.622 0l-5.077-6.464z"/></svg>
diff --git a/web/themes/seven/images/icons/008ee6/twistie-up.svg b/web/themes/seven/images/icons/008ee6/twistie-up.svg
new file mode 100644
index 0000000000000000000000000000000000000000..dc9dd8e9f7d84f6d0cedd1aded9433517d0fb8c1
--- /dev/null
+++ b/web/themes/seven/images/icons/008ee6/twistie-up.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#008ee6" d="M13.391 10.607c.17.216.084.393-.191.393h-10.398c-.275 0-.361-.177-.191-.393l5.08-6.464c.17-.216.45-.216.62 0l5.08 6.464z"/></svg>
diff --git a/web/themes/seven/images/icons/333333/caret-down.svg b/web/themes/seven/images/icons/333333/caret-down.svg
new file mode 100644
index 0000000000000000000000000000000000000000..4e48c8c9830036db493e5fb6ea15c568cc67ccef
--- /dev/null
+++ b/web/themes/seven/images/icons/333333/caret-down.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#333333" d="M3.8 5.4c-.165-.22-.075-.4.2-.4h8.002c.275 0 .365.18.199.4l-3.898 5.2c-.166.221-.436.221-.6 0l-3.903-5.2z"/></svg>
diff --git a/web/themes/seven/images/icons/333333/grid.svg b/web/themes/seven/images/icons/333333/grid.svg
new file mode 100644
index 0000000000000000000000000000000000000000..98ada644c6fd764f8dd6ae276766de080f86d509
--- /dev/null
+++ b/web/themes/seven/images/icons/333333/grid.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#333333" d="M10.5 9h3a1.5 1.5 0 0 1 1.5 1.5v3a1.5 1.5 0 0 1-1.5 1.5h-3A1.5 1.5 0 0 1 9 13.5v-3A1.5 1.5 0 0 1 10.5 9zm-8 0h3A1.5 1.5 0 0 1 7 10.5v3A1.5 1.5 0 0 1 5.5 15h-3A1.5 1.5 0 0 1 1 13.5v-3A1.5 1.5 0 0 1 2.5 9zm8-8h3A1.5 1.5 0 0 1 15 2.5v3A1.5 1.5 0 0 1 13.5 7h-3A1.5 1.5 0 0 1 9 5.5v-3A1.5 1.5 0 0 1 10.5 1zm-8 0h3A1.5 1.5 0 0 1 7 2.5v3A1.5 1.5 0 0 1 5.5 7h-3A1.5 1.5 0 0 1 1 5.5v-3A1.5 1.5 0 0 1 2.5 1z"/></svg>
diff --git a/web/themes/seven/images/icons/333333/table.svg b/web/themes/seven/images/icons/333333/table.svg
new file mode 100644
index 0000000000000000000000000000000000000000..502bf1c142dd7ba41b6f0b4f14c78eaac3422d17
--- /dev/null
+++ b/web/themes/seven/images/icons/333333/table.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#333333" d="M7 15a1.5 1.5 0 0 1 0-3h7a1.5 1.5 0 0 1 0 3H7zm-4.5 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zM7 9.5a1.5 1.5 0 0 1 0-3h7a1.5 1.5 0 0 1 0 3H7zm-4.5 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zM7 4a1.5 1.5 0 0 1 0-3h7a1.5 1.5 0 0 1 0 3H7zM2.5 4a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z"/></svg>
diff --git a/web/themes/seven/images/icons/73b355/check.svg b/web/themes/seven/images/icons/73b355/check.svg
new file mode 100644
index 0000000000000000000000000000000000000000..566cbc4c8e861890f47ea648f843511c68e38305
--- /dev/null
+++ b/web/themes/seven/images/icons/73b355/check.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#73b355"><path d="M6.464 13.676c-.194.194-.513.194-.707 0l-4.96-4.955c-.194-.193-.194-.513 0-.707l1.405-1.407c.194-.195.512-.195.707 0l2.849 2.848c.194.193.513.193.707 0l6.629-6.626c.195-.194.514-.194.707 0l1.404 1.404c.193.194.193.513 0 .707l-8.741 8.736z"/></svg>
\ No newline at end of file
diff --git a/web/themes/seven/images/icons/787878/ex.svg b/web/themes/seven/images/icons/787878/ex.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ca0d409dc5972dd461904a87ad39dd22f17a0b3e
--- /dev/null
+++ b/web/themes/seven/images/icons/787878/ex.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#787878" d="M3.51 13.925c.194.194.512.195.706.001l3.432-3.431c.194-.194.514-.194.708 0l3.432 3.431c.192.194.514.193.707-.001l1.405-1.417c.191-.195.189-.514-.002-.709l-3.397-3.4c-.192-.193-.192-.514-.002-.708l3.401-3.43c.189-.195.189-.515 0-.709l-1.407-1.418c-.195-.195-.513-.195-.707-.001l-3.43 3.431c-.195.194-.516.194-.708 0l-3.432-3.431c-.195-.195-.512-.194-.706.001l-1.407 1.417c-.194.195-.194.515 0 .71l3.403 3.429c.193.195.193.514-.001.708l-3.4 3.399c-.194.195-.195.516-.001.709l1.406 1.419z"/></svg>
diff --git a/web/themes/seven/images/icons/787878/pencil.svg b/web/themes/seven/images/icons/787878/pencil.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ca821f305df714264bf02c301a437fd0df01582e
--- /dev/null
+++ b/web/themes/seven/images/icons/787878/pencil.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><g><path fill="#787878" d="M14.545 3.042l-1.586-1.585c-.389-.389-1.025-.389-1.414 0l-1.293 1.293 3 3 1.293-1.293c.389-.389.389-1.026 0-1.415z"/><rect fill="#787878" x="5.129" y="3.8" transform="matrix(-.707 -.707 .707 -.707 6.189 20.064)" width="4.243" height="9.899"/><path fill="#787878" d="M.908 14.775c-.087.262.055.397.316.312l2.001-.667-1.65-1.646-.667 2.001z"/></g></svg>
diff --git a/web/themes/seven/images/icons/bebebe/chevron-disc-left.svg b/web/themes/seven/images/icons/bebebe/chevron-disc-left.svg
new file mode 100644
index 0000000000000000000000000000000000000000..70cf58c40f75fdb6b84a66bdea025ea62f739a9d
--- /dev/null
+++ b/web/themes/seven/images/icons/bebebe/chevron-disc-left.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#bebebe" d="M8.002 1c-3.868 0-7.002 3.133-7.002 7 0 3.865 3.134 7 7.002 7 3.865 0 7-3.135 7-7 0-3.867-3.135-7-7-7zm2.348 10.482l-.977.977c-.195.193-.514.193-.707 0l-4.108-4.105c-.194-.195-.194-.514 0-.708l4.108-4.105c.193-.194.512-.194.707 0l.979.977c.191.194.191.513 0 .707l-2.422 2.421c-.195.194-.195.515 0 .708l2.419 2.421c.196.19.196.512.001.707z"/></svg>
diff --git a/web/themes/seven/images/icons/bebebe/chevron-disc-right.svg b/web/themes/seven/images/icons/bebebe/chevron-disc-right.svg
new file mode 100644
index 0000000000000000000000000000000000000000..d026581793bd72e1b9799e04b7938aa1de6eb04a
--- /dev/null
+++ b/web/themes/seven/images/icons/bebebe/chevron-disc-right.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#bebebe" d="M8.002 1c-3.868 0-7.002 3.135-7.002 7 0 3.867 3.134 7 7.002 7 3.865 0 7-3.133 7-7 0-3.865-3.135-7-7-7zm3.441 7.357l-4.106 4.104c-.194.191-.514.191-.708 0l-.978-.979c-.194-.193-.194-.518 0-.707l2.423-2.421c.195-.195.195-.514 0-.708l-2.422-2.421c-.194-.194-.194-.513 0-.707l.977-.977c.194-.194.514-.194.708 0l4.106 4.108c.191.194.191.515 0 .708z"/></svg>
diff --git a/web/themes/seven/images/icons/cccccc/clock.svg b/web/themes/seven/images/icons/cccccc/clock.svg
new file mode 100644
index 0000000000000000000000000000000000000000..e51d3e01fea5a40990a4381605812e0bc11fa944
--- /dev/null
+++ b/web/themes/seven/images/icons/cccccc/clock.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="42.659" height="46.603" viewBox="0 0 42.659 46.603">
+  <path fill="#CCC" d="M24.15 3.73V0h-8v3.915C6.15 6.13 0 14.717 0 24.978 0 36.92 9.975 46.603 21.918 46.603s20.74-9.682 20.74-21.625c0-10.576-8.507-19.372-18.507-21.25zm7 24.072H17.83V11h5v12.802h8.32v4z"/>
+</svg>
diff --git a/web/themes/seven/images/icons/cccccc/database.svg b/web/themes/seven/images/icons/cccccc/database.svg
new file mode 100644
index 0000000000000000000000000000000000000000..3351212de7192e4d9ddc380a87af0404d4364b96
--- /dev/null
+++ b/web/themes/seven/images/icons/cccccc/database.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="38.847" height="44.262" viewBox="0 0 38.847 44.262">
+  <path fill="#CCC" d="M19.745 0c5.74.123 12.272.953 16.9 4.668 1.865 1.498 2.786 3.91 1.597 6.126-1.255 2.34-4.13 3.733-6.518 4.6-5.63 2.04-12.113 2.38-18.014 1.573-2.92-.4-5.91-1.103-8.58-2.374C2.94 13.553.39 11.788.037 9.19c-.532-3.925 4.23-6.23 7.264-7.3C11.287.482 15.54.037 19.745 0c4.302.092-3.334.03 0 0z"/>
+  <path fill="#CCC" d="M6.76 17.5c3.702 1.427 7.65 1.972 11.6 2.09 4.058.12 8.107-.424 12.023-1.523 4.227-1.186 7.227-3.624 8.463-6.145v5.965c-.076.524-.197 1.028-.384 1.5-.718 1.81-2.594 2.974-4.235 3.848-4.293 2.286-9.5 3.04-14.31 3.083-4.803.043-9.902-.542-14.3-2.575-1.906-.88-3.9-2.02-4.988-3.887-.66-1.135-.626-2.21-.626-3.486v-4.38c1.232 2.64 3.94 4.422 6.757 5.51z"/>
+  <path fill="#CCC" d="M6.76 26.436c3.702 1.428 7.65 1.973 11.6 2.09 4.058.12 8.107-.423 12.023-1.522 4.227-1.186 7.227-3.624 8.463-6.145v5.964c-.076.524-.197 1.028-.384 1.5-.718 1.81-2.594 2.974-4.235 3.848-4.293 2.286-9.5 3.04-14.31 3.083-4.803.043-9.902-.542-14.3-2.575-1.906-.88-3.9-2.02-4.988-3.887-.66-1.135-.626-2.21-.626-3.486v-4.38c1.232 2.64 3.94 4.422 6.757 5.51z"/>
+  <path fill="#CCC" d="M6.76 35.374c3.702 1.428 7.65 1.973 11.6 2.09 4.058.12 8.107-.423 12.023-1.522 4.227-1.186 7.227-3.624 8.463-6.145v5.965c-.076.524-.197 1.028-.384 1.5-.718 1.81-2.594 2.974-4.235 3.848-4.293 2.286-9.5 3.04-14.31 3.083-4.803.043-9.902-.542-14.3-2.575-1.906-.88-3.9-2.02-4.988-3.887-.66-1.134-.626-2.21-.626-3.485v-4.38c1.232 2.64 3.94 4.422 6.757 5.51z"/>
+</svg>
diff --git a/web/themes/seven/images/icons/cccccc/php-logo.svg b/web/themes/seven/images/icons/cccccc/php-logo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b039d24288f78a471ca52e98cabd15261f742aef
--- /dev/null
+++ b/web/themes/seven/images/icons/cccccc/php-logo.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="66" height="33.447" viewBox="0 0 66 33.447">
+  <g fill="#CCC">
+    <path d="M49.5 12.255h-2.7l-1.473 7h2.4c1.59 0 2.773-.342 3.55-.94.78-.6 1.304-1.62 1.577-3.023.26-1.345.142-1.975-.357-2.528-.5-.553-1.498-.51-2.996-.51z"/>
+    <path d="M33 0C14.775 0 0 7.488 0 16.724s14.775 16.724 33 16.724 33-7.488 33-16.724S51.225 0 33 0zm-9.328 19.982c-.787.737-1.662 1.376-2.625 1.69-.963.313-2.19.583-3.68.583H13.99l-.935 5H9.11l3.52-18h7.584c2.28 0 3.946.34 4.992 1.537 1.046 1.197 1.36 2.74.944 4.885-.172.884-.462 1.628-.87 2.36-.413.732-.947 1.338-1.608 1.945zm11.51 2.273l1.558-8.124c.177-.91.112-1.29-.196-1.62-.308-.33-.962-.255-1.963-.255h-3.126l-2.016 10h-3.913l3.52-18h3.912l-.935 5h3.486c2.193 0 3.706.124 4.54.888.832.765 1.08 1.99.748 3.703l-1.637 8.41h-3.977zm21.747-6.708c-.173.884-.463 1.692-.872 2.424-.41.734-.944 1.404-1.605 2.01-.787.738-1.662 1.377-2.625 1.69-.963.314-2.19.584-3.68.584h-3.377l-.934 5h-3.944l3.518-18h7.584c2.282 0 3.946.34 4.992 1.537 1.046 1.2 1.36 2.61.943 4.757z"/>
+    <path d="M18.72 12.255h-2.703l-1.473 7h2.4c1.59 0 2.773-.342 3.552-.94.778-.6 1.303-1.62 1.576-3.023.26-1.345.142-1.975-.357-2.528-.5-.553-1.497-.51-2.996-.51z"/>
+  </g>
+</svg>
diff --git a/web/themes/seven/images/icons/cccccc/server.svg b/web/themes/seven/images/icons/cccccc/server.svg
new file mode 100644
index 0000000000000000000000000000000000000000..1576b390d873e22ec9e5933145f4198babf1f94a
--- /dev/null
+++ b/web/themes/seven/images/icons/cccccc/server.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="44" height="34" viewBox="0 0 44 34">
+  <path fill="#CCC" d="M29.98 7.018H7.17c-1.208 0-2.197-.748-2.197-2s.99-2 2.2-2h22.81c1.208 0 2.198.748 2.198 2s-.99 2-2.2 2zM37.61 7c-1.104 0-2-.895-2-2s.896-2 2-2 2 .895 2 2-.894 2-2 2zM0 0v10h44V0H0zM29.98 31.018H7.17c-1.208 0-2.197-.748-2.197-2s.99-2 2.2-2h22.81c1.208 0 2.198.748 2.198 2s-.99 2-2.2 2zM37.61 31c-1.104 0-2-.895-2-2s.896-2 2-2 2 .895 2 2-.894 2-2 2zM0 24v10h44V24H0zM29.98 19.018H7.17c-1.208 0-2.197-.748-2.197-2s.99-2 2.2-2h22.81c1.208 0 2.198.748 2.198 2s-.99 2-2.2 2zM37.61 19c-1.104 0-2-.895-2-2s.896-2 2-2 2 .895 2 2-.894 2-2 2zM0 12v10h44V12H0z"/>
+</svg>
diff --git a/web/themes/seven/images/icons/e29700/warning.svg b/web/themes/seven/images/icons/e29700/warning.svg
new file mode 100644
index 0000000000000000000000000000000000000000..1498a41f4d7ec3466a0409f225eb5e9097ef9fd8
--- /dev/null
+++ b/web/themes/seven/images/icons/e29700/warning.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#e29700"><path d="M14.66 12.316l-5.316-10.633c-.738-1.476-1.946-1.476-2.685 0l-5.317 10.633c-.738 1.477.008 2.684 1.658 2.684h10.002c1.65 0 2.396-1.207 1.658-2.684zm-7.66-8.316h2.002v5h-2.002v-5zm2.252 8.615c0 .344-.281.625-.625.625h-1.25c-.345 0-.626-.281-.626-.625v-1.239c0-.344.281-.625.626-.625h1.25c.344 0 .625.281.625.625v1.239z"/></svg>
\ No newline at end of file
diff --git a/web/themes/seven/images/icons/e32700/error.svg b/web/themes/seven/images/icons/e32700/error.svg
new file mode 100644
index 0000000000000000000000000000000000000000..151a1e67c929d1d8b01950224811c0a658e1aea9
--- /dev/null
+++ b/web/themes/seven/images/icons/e32700/error.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#e32700"><path d="M8.002 1c-3.868 0-7.002 3.134-7.002 7s3.134 7 7.002 7c3.865 0 7-3.134 7-7s-3.135-7-7-7zm4.025 9.284c.062.063.1.149.1.239 0 .091-.037.177-.1.24l-1.262 1.262c-.064.062-.15.1-.24.1s-.176-.036-.24-.1l-2.283-2.283-2.286 2.283c-.064.062-.15.1-.24.1s-.176-.036-.24-.1l-1.261-1.262c-.063-.062-.1-.148-.1-.24 0-.088.036-.176.1-.238l2.283-2.285-2.283-2.284c-.063-.064-.1-.15-.1-.24s.036-.176.1-.24l1.262-1.262c.063-.063.149-.1.24-.1.089 0 .176.036.24.1l2.285 2.284 2.283-2.284c.064-.063.15-.1.24-.1s.176.036.24.1l1.262 1.262c.062.063.1.149.1.24 0 .089-.037.176-.1.24l-2.283 2.284 2.283 2.284z"/></svg>
diff --git a/web/themes/seven/images/icons/ee0000/ex.svg b/web/themes/seven/images/icons/ee0000/ex.svg
new file mode 100644
index 0000000000000000000000000000000000000000..6b45a1d5726e5a305022173b9dd062b4bb375153
--- /dev/null
+++ b/web/themes/seven/images/icons/ee0000/ex.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#ee0000" d="M3.51 13.925c.194.194.512.195.706.001l3.432-3.431c.194-.194.514-.194.708 0l3.432 3.431c.192.194.514.193.707-.001l1.405-1.417c.191-.195.189-.514-.002-.709l-3.397-3.4c-.192-.193-.192-.514-.002-.708l3.401-3.43c.189-.195.189-.515 0-.709l-1.407-1.418c-.195-.195-.513-.195-.707-.001l-3.43 3.431c-.195.194-.516.194-.708 0l-3.432-3.431c-.195-.195-.512-.194-.706.001l-1.407 1.417c-.194.195-.194.515 0 .71l3.403 3.429c.193.195.193.514-.001.708l-3.4 3.399c-.194.195-.195.516-.001.709l1.406 1.419z"/></svg>
diff --git a/web/themes/seven/images/icons/ee0000/required.svg b/web/themes/seven/images/icons/ee0000/required.svg
new file mode 100644
index 0000000000000000000000000000000000000000..f7882d6df9b941fe722f3e6921f122e39b11f20d
--- /dev/null
+++ b/web/themes/seven/images/icons/ee0000/required.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#EE0000"  d="M0,7.562l1.114-3.438c2.565,0.906,4.43,1.688,5.59,2.35C6.398,3.553,6.237,1.544,6.22,0.447h3.511 c-0.05,1.597-0.234,3.6-0.558,6.003c1.664-0.838,3.566-1.613,5.714-2.325L16,7.562c-2.05,0.678-4.06,1.131-6.028,1.356 c0.984,0.856,2.372,2.381,4.166,4.575l-2.906,2.059c-0.935-1.274-2.041-3.009-3.316-5.206c-1.194,2.275-2.244,4.013-3.147,5.206 l-2.856-2.059c1.872-2.307,3.211-3.832,4.017-4.575C3.849,8.516,1.872,8.062,0,7.562"/></svg>
diff --git a/web/themes/seven/images/icons/ffffff/ex.svg b/web/themes/seven/images/icons/ffffff/ex.svg
new file mode 100644
index 0000000000000000000000000000000000000000..24c13610d9d56709524fd9fab8c1beea28b5148f
--- /dev/null
+++ b/web/themes/seven/images/icons/ffffff/ex.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#ffffff" d="M3.51 13.925c.194.194.512.195.706.001l3.432-3.431c.194-.194.514-.194.708 0l3.432 3.431c.192.194.514.193.707-.001l1.405-1.417c.191-.195.189-.514-.002-.709l-3.397-3.4c-.192-.193-.192-.514-.002-.708l3.401-3.43c.189-.195.189-.515 0-.709l-1.407-1.418c-.195-.195-.513-.195-.707-.001l-3.43 3.431c-.195.194-.516.194-.708 0l-3.432-3.431c-.195-.195-.512-.194-.706.001l-1.407 1.417c-.194.195-.194.515 0 .71l3.403 3.429c.193.195.193.514-.001.708l-3.4 3.399c-.194.195-.195.516-.001.709l1.406 1.419z"/></svg>
diff --git a/web/themes/seven/images/loading-small.gif b/web/themes/seven/images/loading-small.gif
new file mode 100644
index 0000000000000000000000000000000000000000..5cbf6e7b75523144e46e36aba2d58263b767b93b
--- /dev/null
+++ b/web/themes/seven/images/loading-small.gif
@@ -0,0 +1,25 @@
+GIF89a���������������������������������������������������{{{ssskkkcccZZZRRRJJJBBB:::111)))!!!������!�NETSCAPE2.0���!�
+��,���������&��6Me��K,k��G8@q�h/MG�H:��%#��Gc�4�D2a�8��@@�p2�Hfz�H,%���x"
+WrIix%pqX1*�=##���+�����������=���"���I�#3g�~��"	�"�>�w�
��	kX
(_�S(�As}RTx �(�oBB4��x�Z	%�q���!�
+��,��������'��GQe���04k<��\�nU����6�d�	'U!�`D �%�Xe�U(2�H�	`�%)2(*
��P���Eš	b%K`1K:$2$��P�{�(�������������{"��#�)1��%�%�%	
+#��k
+�{���"�	�?&�*E
���vl�� ��[8�w+��!��!�
+��,�������Ԡ'��WUe���a<k,VDQ��JG�7�G�`P6���YQ4 �Z�Cb4���A����Q���a^iU��M!��Q�C�X�#V
+
+n2��Q�
+91�����+������1��q~�=��wx:{e+�"
��%
��"]�)�<�H�*9�H~�1x��%��"�t���!�
+��,��������'��gYe���@k���ah<Z%V����D�e�HDf��!j�d)�X,�"�ϓ1
+�Fj�`:f�QE��dI�:{*+:k$

u�"��91>�
�����>���	��"��:�)E*��	)�%���#����
+�"�cI	���(�E�+{�����`��.�"��W��!�
+��,�������۠'��w]e��ҲH뺉��*��S%Z���"�<b
c"z$G��`8�6F����*>Q�0DG���ѨU,5q@0�E��sJ:}aL�G�9}����+��������#��}�%��W1*:"R)�L")�D��n�˺�9��R�;��ȶ#���Ϊ!��!�
+��,������ߠ'�$�8����6p����Q�x��%N��
+y<R���l"	��BQHddz��b��`�*�!MLj�����옵�F=�{2~5^|t
��"������9���5��"��"�*�~��$	�*	2���5	d#
+���"d����	��
+
+�oI
�5����Uc��pK ��!�
+��,��������'���ae��Uk,bP
�ަ��u�G큫L.��D"��&��D4a0ȒE2�.ȍ��h0&b҅+��v9ȕQI�,JfEsHR2$bv�#>#��{�
+
+���2
+�������H������#���"�#��$�"0*	*�+%{\"	�%����*��NUȷ�����LQ����!�	
+��,��������'���ee���4Yk��b&��ܴ8�
��x,�lh&8��DRQ���Q4g��5�A)q_�&��d�TBP�@UF2A1�*;$F$
s�

m1�"������J������$��,+:+��%
	y%
*	+
+	m��#�
+�%�
"��	��"
U����^�å�A!��;
\ No newline at end of file
diff --git a/web/themes/seven/images/logo/LICENSE.txt b/web/themes/seven/images/logo/LICENSE.txt
new file mode 100644
index 0000000000000000000000000000000000000000..414da578e863c6b58308adc5c91c73d554420924
--- /dev/null
+++ b/web/themes/seven/images/logo/LICENSE.txt
@@ -0,0 +1,3 @@
+The files in this directory are not covered by the GNU General Public License.
+See https://www.drupal.org/about/media-kit/copyright-and-trademark for the
+license terms of these Drupal brand materials.
diff --git a/web/themes/seven/images/logo/drupal-logo.svg b/web/themes/seven/images/logo/drupal-logo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..bd2d4921a5662c720500bb425d436ba5c3477b0a
--- /dev/null
+++ b/web/themes/seven/images/logo/drupal-logo.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" class="drupal-logo" width="42.2" height="55.5" viewBox="0 0 42.2 55.5">
+  <path fill="#cccccc" d="M29.8,11.7C25.9,7.9,22.2,4.2,21.1,0c-1.1,4.2-4.8,7.9-8.7,11.7C6.6,17.5,0,24.1,0,34c-0.3,11.6,9,21.3,20.6,21.5 s21.3-9,21.5-20.6c0-0.3,0-0.6,0-0.9C42.2,24.1,35.6,17.5,29.8,11.7z M10.8,35.9c-0.6,0.8-1.2,1.7-1.6,2.6 c-0.1,0.1-0.2,0.3-0.4,0.3H8.7c-0.5,0-1-0.9-1-0.9l0,0c-0.1-0.2-0.3-0.5-0.4-0.7L7.2,37C5.9,34.2,7,30.3,7,30.3l0,0 c0.5-1.9,1.4-3.8,2.5-5.4c0.7-1,1.5-2,2.3-3l1,1l4.7,4.8c0.2,0.2,0.2,0.5,0,0.7l-4.9,5.5l0,0L10.8,35.9z M21.3,49.7 c-4,0-7.3-3.3-7.2-7.3c0-1.8,0.7-3.5,1.8-4.8c1.5-1.8,3.4-3.6,5.5-6c2.4,2.6,4,4.3,5.5,6.3c0.1,0.1,0.2,0.3,0.3,0.5 c0.8,1.2,1.3,2.6,1.3,4.1C28.6,46.5,25.3,49.7,21.3,49.7C21.3,49.7,21.3,49.7,21.3,49.7z M35,38.1L35,38.1 c-0.1,0.3-0.4,0.5-0.7,0.6h-0.1c-0.3-0.1-0.5-0.3-0.7-0.5l0,0c-1.3-1.9-2.7-3.7-4.3-5.3l-1.9-2l-6.4-6.6c-1.3-1.2-2.6-2.6-3.8-3.9 c0-0.1-0.1-0.1-0.1-0.1c-0.2-0.3-0.4-0.6-0.5-1c0-0.1,0-0.1,0-0.2c-0.2-1.1,0.2-2.2,1-3c1.2-1.2,2.5-2.5,3.7-3.8 c1.3,1.4,2.7,2.8,4.1,4.2l0,0c2.8,2.6,5.3,5.5,7.6,8.6c1.9,2.7,2.9,5.8,2.9,9.1C35.6,35.4,35.4,36.8,35,38.1z"/>
+</svg>
diff --git a/web/themes/seven/images/menu-collapsed-rtl.png b/web/themes/seven/images/menu-collapsed-rtl.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc8d0b8823a90704b3743f980108b8a7d914193c
--- /dev/null
+++ b/web/themes/seven/images/menu-collapsed-rtl.png
@@ -0,0 +1,3 @@
+�PNG
+
+���
IHDR��������������PLTE������U��~���tRNS�@��f���IDATc�``R`r`���
B|�O�����IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/menu-collapsed.png b/web/themes/seven/images/menu-collapsed.png
new file mode 100644
index 0000000000000000000000000000000000000000..91f3fd40ede024798b6de5ea2675bb692a3cfa95
--- /dev/null
+++ b/web/themes/seven/images/menu-collapsed.png
@@ -0,0 +1,3 @@
+�PNG
+
+���
IHDR�����������Ő���PLTE������U��~���tRNS�@��f���IDATcV`�@)ff�|�̷������IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/menu-expanded.png b/web/themes/seven/images/menu-expanded.png
new file mode 100644
index 0000000000000000000000000000000000000000..46f39ecb351cff65243fa9a614a69d039e1302a5
--- /dev/null
+++ b/web/themes/seven/images/menu-expanded.png
@@ -0,0 +1,3 @@
+�PNG
+
+���
IHDR��������������PLTE������U��~���tRNS�@��f���IDATx�c��P�`� �������������IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/no-thumbnail.png b/web/themes/seven/images/no-thumbnail.png
new file mode 100644
index 0000000000000000000000000000000000000000..926c5314eccfeb16e76a3594b927cb5e6af3be4f
--- /dev/null
+++ b/web/themes/seven/images/no-thumbnail.png
@@ -0,0 +1,26 @@
+�PNG
+
+���
IHDR����������J�6����sRGB������PIDATx��Eu��&�����G��	�q8TBB`	�ZEz|�R[Km߈�(J������5$�65��=�P�lР��ӐI?��Ο���og�7���?�{Ξ��s��;߹3;;3;;l�{��r3cƌQ���;�|Ç_s�=��8O��[
+?��w�#޼z��/�	Mܽ����(Kl�E�O��(Z%B�f;�Vdd��)\0(lF�9s��0֚��/��,���8Mx��K��!x���\�`��:�o�K��$����)\*�h�>�&�e��&���e"��p�Jx�8c����V���2i��(MA�rU/��-��#/��Agqc\(9�la��===��J�E
��B�N�"�¢e˖m�'��,~M��T�S�0���J B���n�����.&���YPذ��kA���
B��[[�]	F衤*T�{o�нۂ�|�W<�y�}�R:�#��$LGr�)(��C�(��a����Q_d1�c��F��ZajY�����}��jr2ŦiXP�F"P���XM�x1�i6���:�Hm�k�C,9r�ܾ���Bx�<�����Ι��Wf���B�=��e��L����d^���Ӄ��O?��L\���F�
+c�Q��0���$n&��%.Tn���`����!���q��j��fZ�V8((�Z��*��$4crvGc�y'O�|��ݻ�`譌5<��P�7 ��2�,��[�����2�v|�{`@�Id�!
t�-�a1gB>�]�
+m��&�e�@M����K��];���\O�صkW��ƼKD-�1|;��6G,���"#6}���P��q���Ph	��5.`DDkV6�0W�u�q����AW�"�(��"�(�@J����(zz빸^�.�w��Iq�m4o/����Pc�� ��P~_e��L�2�"{��%�K�}[�U27�~���M��d+�jx���7�XŤ߆�s۱�%�AC�{������ă��<��[��F���l��\p�*짌-2�j±�m�5X�[�v����!�e�Xƶ
ͬa4����F[Bα�AA_���x��S�� �sJ��	s���̳O���q���� ��OX�� ���1��"��^����x�}���ba��%Th���2�R��d�E_`���(��RrӦM;�����J�5i]�Z�޾}�������F����m��uQHc�w��6X��P�7���2��1fQBK�}[��а�ea2�[�#�F�'�����k�c��.!#��d4��;���(�5ؤ�+.�ƾo2:���9	��b���\<i����F#tp��H�
+nj�|��N/�(||.z�o.�4(��%�G�
�ǻJח>�h�S<KE��$��6��[U2�exf�e!�=�\e`E��w�u�l�h�}���a���-�-�� ��O��ͽ�ڮ�>�JWE@PE@PE@PE@P�^�᥂����"kp��M��2��Mɒw��Ur��O�ei:4^++�@�0P�|��,L'�� W��?�9�1��ǢU�z�dD;4@<�߼s�5jy�_�31�,LF��tjF�v��laU��,묦�lip���S^i�~���Y%2��/K��k�	�L@ﱈ�h�M�:���;w>`t�\��'�L~�~� ;^r.�Ń;�4S.�y ~V��)��6KX���yz����������ݫh&
+���ip=;d�L�z���H��=���W\7��<E�s�<v���p�h�m��K�������Av�������%'����5�ڋ��L�9hIH��qyaT�������{�u����'��
H[ʒ̣���z3g������&L�t��m6-&\g�ytL���
+�\H��/��� ��ׁY��'��!�܎��%5h���ƒoqA2iҤQ.؍��4Z#��{5�.;����L܄'7
˖���G_��D��E�Q��V@�'���t��|\�{�����-2��:D�<��j����g���x�l�	��.�6��^i�
+�&�L)�ve����.������H�Wu~�N!��B�w#��+�:�RS�,v�l:p���܎�F�����Eax� g6�����Ƀ#[��mT{<[2�?'����}M�I�l���𔹷�u�
h1�C��d��W��wڙNn0�j�ުh�ϻ��~��9����4<h�_����v^:�Q��i-��K1��������Q����vhc1@x��O]W
+rMԢ����vh��jd�����`�MO���f���'��IR��th_hf.&�C�G�xr�
��:����z�(��"�(��"�(��"�(��"�(��"�(��"�(��"�(��"�(��"��D��k�Xw�B'^���7�f���k�M�I���}ꩧ�f&�����菌5꜕+W��]Y��w�l��Trȹ�	+L�4�V���:�n\e��~I�����c�:�
+�x����Nf4ӵ	�>�z�~9[���N;�m۶�/����g��3�ҝ��T�x���^"{����]�bņ�T<�h������K�9{ �~�]w���y��O�޳u�֟�p��������o��I��i*>����]��d���Y�|s|��(6�'��LQ��q^��^�b��E�y���+3�,R=�Z=�:�r�7���I�d����Wȿ��e&���N[j�h���-@�^� h! ��)�J���6�1X��u7rP���8�Fm����������by{�k���Z��YN?�m���B�r���}9 ?M!?��������GJ�?�A�y�Ì�|������M������R��wif�+y[��@/Z��!�Edn?=%
�O��E����}B�ض�g�����HBR�3o���@�}O���^���䟺��e|�d>�cWo^��{����\�'��<`rO�����:���+�/��fƵ=�OL)=�G��:%�����R�S��m{��߭@;\���Ѯ��<�aϗ3�Yت�no��I ��{��^ �jêg1��抄d
�78l(Dr$	'��= ˞uA g�
+vz�n\�3��=*'{�����Ӗ�ㅧ���=�,�ﱳ�;Ml8%��um��)�e���1�A��x�1-u�i�L4��[h������$�����U�VU��`�'_��h����ou��&�.�p	����9_V\�Z�^O�I�II�F�K�xj�������a�.��b�ȧ�ʳ�=��e��	��0����$@�^͋\h�{\�H��^W�"�>Þh��`иq�6V�ȑ��bdߨ�G�h��^W��g	��M[Vx�ݱcG���3�8� 2�ؓ�c�fg�����]����P�ht<�׃��iU�lٲɕ�����_���<��UE��I���8��Q&��.�]�`��or!�|�ו�`�6c*���B%�+��˗g���o�,4?T�?���xV��ػ���B�$@ӆ�6U}UA[ ��
럻��ƽ�EO@sٛ���h<�>GF+B�"d]��7l�ܹ#]�D����s"���$@�ˏ|q.:��Bj��]qЎ`���f{���c���'WJ�s��(��=����
��Sk�ĵM��Y�O;���+�_;y���$1)��3bذ����rO�hr�NO~�������r��^\�%�O[��B��{���;t�/ OtГ��=���DoRl�y�
+����Lؙ�p�Ȼ�Y�p��ʇms�pR��̙���=^�	a��b�L�လ�6��]�|�d�ҒVQ�����+a��WE�^L��)x&,_��1;}aWS���ё��%���ι625������t�L���!���A��o�T	':��~�a���qF���yp.��%#gv�q�\]}��M�1���˅K�k�G�����'��Ǯ/"����M�xF�kZ�ĵ{�E�.�-�Ls�O�d~ߥ��[9%��v�V�x��t�(���y�v�y�d�S�mWG��Qc���6nܸv�ĉO��s]���G}�0�߂?*�5 9�Y��<WB&�EA���V�G#��W��ͽ��K��~�m��e
�#-���k��&���J#9'�L��9Lj���D�V���">Q��_b�^���
�]�}����h`�	0Ð���N\E���.�����.�Bc`��=��/�]:�ϛh~�+���]�d@��1Ht�J��m^�A�T�"�(��"�(��"�(��"�(��"�(��"�(��"�(��"�(��"�(��"�(��"�(��"�(��"�(��"�(��"�(��"�(��"�(��"�(�h̦`�2�I93g�<����ݗ��N�=����a�����
+m����ߜ]����S~X�F�<��;����Qu��ɿ��,Y2��/�	ς���uE=D%��m�5k֬eum�_�񝖫�!.λx����Wpvt��*�����n����Q'�}֡Ł��ٛ��j��g!���X~-���i_v�}ʡg̘�g����R�o���6����!���BOO��˖-{�
+��c�wh6C�����1��YG~ϣ�tS^��c}
��r�?z�����?�ö�Sy1��O�/���?�^&�?���/��Z���M�S�W��W�v
M���NaW�2����8ɷ���M��-��������p�…���F���˟�ׯ_6/�o�땜R!�=���\ȟ|~خ�������0�'��+�B�#���la���r�U�T���o.��&<�
;vS9/��ߓڰ3:i�B��Ts�Eŕ�l�q?<~����s�(���x'�y���q�����̧+rUŴ�K6�:����@66/�q����/�+���E�^�S�O�c7X�,�QU@S��:AS���.��G^���������yYFlRO����\�bņT;-gH:4݋���"��qҤIo��]�]�����őo��8,�'�\��,�!���8��M��G���<��W�
�LE~��Ñ��?|�p:i������%nO�c�ړl�8��)S&3n�
+�&D(�u��d��˳��3/�r��#��hi?c����}b��S����12�~�#�m��
+&-һ��!)���〷��ಢ2���|�o�&ڌy~��P���R������n5jԱ�V��M��M��|�2T�^*G~��ɩw�}����L�:u�Ν;	��2�,���+��]ck�CS���e�پ҃�|�V�$_�T*�A���đ/�4)��Ʊ���Ct�仐'߷Cx���X�������!���}��N
�m2�B*�7#m\�
+�y�����8v��#O��V�\)-{#�F:�,������>n�3��S7f�:��q��ɫt/�H��1�))ƌ�;���O,�Ώ̙3���
+T������vTI�3˄AH�q�رcO��,���ŭ���83��7П=8�3K�~�#�-e�%�"�S�׭�Ƶ��cC �y��~��4�)Cpb���n!��U�yR�K�Zh�T��y;�ָ�º&0��Egf<�H��1� 0�¶q̘1�Z��.g%�2DXzD�S����j�y��%�5t�A�|�@)cCd}�u�d����d��kq��D�i��V�xZ��C�0��è�|�И�Q-4��d�o�A!�x(93-��׮]�3ҙ��#}D'�Y�\��B�!��Bd���JP"9�B�����6݋���_�1+7d���e�������Q
�/
+�q���B���C�<ݷ��/��A�M�Ϻ��"���*�2�X*;��J%dh�C���B��C����3�Ǹ����#�Kt-���N�|�ʫN[�Շ�`'�
tݳ��k�c�=Bcb��?�q�h�_�$g����Z^"�SG�Zha�#㥵�,q�G;R+=�w�~�=�؝�>���#��|��ȯ��r�`�^_8+/_tW�rh'-uh�x��u��E�jӦM�Ɣ�����4���qh�ή�A��F94�� ��休�{����<�S���_����:.B�,虆3�1"MWX3|KuKy�2u��QM�e8�2�R��b��e"��M��?+��#OJ��&�^��n��n���X_�"_ʫQG�^
+�yQ:�}��h���A�5۷o�=������#c��3��on��"+O�Z6��	n�ӳ	�k��/;N�����!��2-L��=i����S7go�Z)Q���Xm��+��N�4
+y+�p/�0�r����K]j�$Ǹ!D.��-ӧO�	��R}"[$����0-��CՙG�3')�&.���0`�Eĥ����oq�u�֟��K򤡅:gގ�+Z��#
+;�ai�8
+�{D��Op���Q))��f/�#ԑ�N~S�?�<��ylD^��3p��"�4��w���%C�Y�W��gi�����b�b~L�&��W�](���}9p����9x,��튃:��K�.��(���}9��'�.�[I���T8�张9wb���-łц<���4d�jC�����"_ac�����6���e���(�)ȷ�e��oU9Z�kb]�KZ��kJ�H�0���(�߄#�ǟ1�:�	�9���hJ��ڑ}�x�!Cw���-V� U�����#���H�ބf���#����K�-��$9x�2FpݼC�ˑ������K)Hq�!}dO2Y8tFdFt�H����/��G��\�r�O����ꛢ3"$��8X��Z��	X��tC��`��C��͗��+�H��VJ���i��H��)lR��R���w�M&N����1{b��in������Z�6�MX����YG~���f��e���.>Ň��3���J}�*����R�k�м�����k�
g̘tZCꗶ�Fe�jo�iR(d��C۠Ȧ�/~�WA��hx=v_�n�75u3�N��:t���_CW�
+�S��M��۲��ٳgg_v�|��C����ɗ,Y2�V�B��,��4Yb�
>���ɒ�o͚5k�:ok8ա[��2�>��g}4w��߱�?�<L��C{�p?�~�W��)kS�@[C�������mz(��"�(��"�(��"�(��"�(��"�(��"�(��"�(��"�(��"�(��"�(��"�(��"�(�0����>K�9����IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/noise-low.png b/web/themes/seven/images/noise-low.png
new file mode 100644
index 0000000000000000000000000000000000000000..105bee165dac3e8bdfd39138fe2121078bee65d8
--- /dev/null
+++ b/web/themes/seven/images/noise-low.png
@@ -0,0 +1,30 @@
+�PNG
+
+���
IHDR�����������1|����PLTE����������������������������Q� ���	tRNS
	
+Lw����IDATx^�7Wc����Sܥl0L)�K�RƄ)f��"S�<��I?��[?���{�2G���E�.��a���G��S�.ے)*1����kD���b=������:W�͑9��S0pv 3u({�9��ugd����
��m�%�wT}$���Z�t\(����������/!�5eG�c~q3��k]�h�����91U!��0�ߣ�F�8�+��o�n�����Fʸ��M��H,'�ׇ>�
����ϔ�~/�h�\z�^�Q�+Z�Ā���
+l�P�oh��Ka-�c�R1��B�����k؊l�Ck��$R�K�Q�	f����9<iy��T�r��Q5M1�z��3Tp��J�+�j�=cR�N���ۣ�7�i%��ox@c�ޯ�b�e��W�H\JC[����=����#�~�at:�&��|ڵ?�&lT��Uj���ǹ�	i��]y���zchQ�L�W��q��m��M���Q�1����]�0q�R�p���E�f8YO���h�S�P���/��z�4�J?����14-	@Q�#>?Kc~%M��u]T��`�W�&E�����y�va��=�Ӥ,��K��¼2�����J�q�;�G�d,�
+u�Hj����Vu��fPp��n�f����X‰4����p�:k���$�5[�U�@j����<K=Ow:+���ct�K5[\���<6oج��|�j�����A��-#���?��"v�t�y�մ|�
+ׅ7B�ӌ��XB�}�g���+����d�v��a�$�������A���R��P�KN���\@I���@�i��C*(h�)-Ԩ�ڥĻ��`2˪5o�)��U�c�$��>�,��vpPʁ�R?钕�����
+-sS���.��K��t��������_�q�/+v�2�m�Z���N!ʪ���*�F@ה�n��:9����J1
j%��ɪ2�؊y\����U��XBڹ%�6{�h��J�X��J-�=l�cH�9�;�g7���b����U���ӌ2�����X77���4��@Z\C��+z�"�U��#���#ďi�����GǗ��.h��j�DV��\�	?�6�S	��Q���U"�J
+tG�9kMZ�1����m�H���Gwޡ�;%%�C�ԢqfV>�������6UC��`��C:��l�æ`Ilr�hu3��F9�r��a�KI���U��f����r���`io5�I���W͒�Bj3����+^����9뱄��Ak��:c��6K�瞥��I"U�����E�P֖�\�z(�)=����C�!��s��_��|:ѐ'Us���8��м�\����=&.a�g0x���mGGH�
+Ph�(u�K�;R�[!�fn�M��JU��b�����u)2nQ��Va����4{�n��<o��F�6m�������y�Lݴl�G!-K�Wl��7o.��\YQ�̕�����Wb�V|O7@�����N��r�8�5��6Ձn�V#�t��s��߳���!OC,��hgR2���3F���RV�c��l19���T�@�"/O{���k�)����i���q�=*^�S����T��aOˍЕ/�W�`�Z�Z���젩~i
+�e�;`W��bB�0@G��XYi%�_V�"����<W��/s;eB�!G�\��@�㲣?5r��1A��K���k�e�N�o�����ס��1���~�Y�)p�oBN\
+}�H����H.��
D��Vȥv�M��W
��#_��Ƌ�b�$��_�����1��B	�ʞ+� �R�>�<6�ɶ�����0�f0
��%�UP55A�O|b���e,��k��j�U՟#Pкjj¹=Ξ�n�{3e.�����J|���R���[���z2�$˜�E�!���6���ę�Չ�p���X�Gt��7�օ��I��\��ߩ��T�E�j�s��m=���k��!R8Uċ�@M#��`ᱜ;gZ��r�X������܀�Po�:p�x��+\�BJ�8Z
���G�K�	���=�f1�9��I�$��h-}%���LJ ���b~!��4@C��/��l��—�͈W�Af����Pm�k�"������MZ��X
+:�YP��׹��B��y~?Z)�yC�Z-�a����G��C=��UO�
NÜ]�?�-F��f��o!�d�湻#��¶dž��_��,1ݼ��Q-����>9=!YEH�Qّ0e�8MzE��f'�p�5;�
3�
+������8�oSxO<
e��}�)x]T�	N�`Ѱ
+
N��@%f���;��� �"���t@3b�h�q��ޤ�+��9ϴ?�5��d�4O9�$�Pݡ$�t�QÈ��&�[�b��Q:6��M�ʌ�)t+\
�_˔gJ�&k��~~^9L ]~��ڰ�T��s����Z��S�$�OG�C��nym����h��u��}0��ԥP$�v����(_���=r���aa��;.���mH�E��7�M�Z�<H8��x��0��d�I����F�H
+�*Py��	:�.�?�H�b%G>ʗ���{�;o�#fc'8�$3ؤ�{z=�9�vj
+̣m�B̺�4�����`Mv8���)�}�TlS[2�|3K�|>��5��N�BC�2j����ƿ!�j �����#1--4����Fv]oi(���&�Qـc��c��e�C����9�u�L��3⫯�_8/��C� RbcG�
�OY�����D~+'�B1ly3�⎦�v=�A��G�/@��{{��ڙ�E'�Bk���|�蹢Th�GK/��ג/��N��f*W��<k�b���=�Ƿ
+S���%�+�T>랜-�M�j��6�+6�טx�i,M�	e�r;�טw�.5�8NJ��ﵲ�����5��m9�c��Q�H���p���v��yt��FW߱h�L�-���Bሌ�"G	��ӊ4I�+���C��-�.��X�����-"@���7�NI����!p�Zu�} bC�^8�(LQw�N��	�q,w\�*gc^y���@/
�2��e�r���(��/�bKh��<X����|�L9�����%Y��4�P�@g�踴�K�??���%�
89v��.x������:B����A݊T�&�Q�|]Z�������P�:E���ޒ�]p�Rs�K�
+BDp�����C��90��y��X.%/�K�a��a�Q&3�͝=Z��,�(�/��,jb޹������1����X�؛�V`�!t�ܠ��͜�n��54��o����v�j):��n�'���7zQإ4^v��6Bc���&�v2ކPTf-ҙ0F0I2H5�
+�Y��)�#.L��AK=��=��3�P]�W�u���&�$�<`�Y��o���
V{
~��t�++?�%��@���l�q,�Ō�Ê�9m;��Uu�� !��|�A��a�g"�"h��wq�Ƀ��rJ}t�%ř:�+*�}
+�8B��6�B��s��İ��c�|��2���Zg�*Yx�u���*,�a�wW�"0l�/Пq�R��$���'�vT�F����soc�[�'����M���kPǜ/`w��hf���@G�/�:�k�PҮ�.���k�44��3����]�)
�)(+4�;ww���H	%�f�o��sk�<CLA�l�h���O�K���P�D3m�(�U@�l̂g�Γ�	�8�.�Τi
���6C���z�5E�P{ldvqVɫ�W,:�����s�
+	W�tE}�x�����t��%�,�e�T���>��>��;�^�����q��U\ �P���zW* ����U��!얘����O@	ǝ�&�$@ԋ�)���|��$$:!D�<��N�@����*�u)zy������`���������m^�eG?�D�Yƣ��W3�M����Z��U6��s�n�3��^]��L�#�9�^{�k�g�bo����OT��\��"\�p�XK?�[O�O�_�h��v����^8<)��T�
+骒��"G�z�.��Ui��_+���Wyl�=����a�	y��f԰t;��}���V_㫶���|"wL���Wt���M��vB�={*��&뱘BZ"L�_a9��b��Q������-8'[|�ln�G��U��Xe}��L�T�}��a����jZ\4SVS\�=�D�Yx�Y2y��0��P�1�ߺ/�h�{'1�r�m����	��
+����U��7?#�NrZ���Z��*
+�����mM	`�����sBX�m��A��Y.�c`1�mm.-P��"�{{��71��޹�� �r�|EY�Mq+b=`�^_�!P�o�k�	�G���h�X?�'3��V�y[��e�s�J-d�����8@��g�f����u���=�7d-�K1�Ml��`�<�����V.h�΋�ib(U�����t��ЮUo��s���[v�@s�lvq�{��Da���mP}��v.<�[��D���fF���
+J�%+�{����^�Rv��Th4`�Μi
+(@�tz�u�d���R���)��ԗr���\$kw7�Ă���Fg-��}x���K!�cы��[k�����C�B�r0�)���8{���}����b_��M>��t��+ҁ+A���V��r	h��}$SV0=�M���^._-d��I7���*G���fQz�X�X����7��J�s����2<�ܧ�!V����Q��X�X7dc�%�t���䣚D���Z�f�
+��i8��';P[�(t1��4�k���w6��2��3�
+��@9���N������ ���?Mbx���vz�8"��&؆n��v��yRg��} ��޲Z��|�V���_�5�� 0�"`��_+8�Na+�i�˜�1I'T�J�\�DkL�w����@B�<���w�{��
�Q�����yZ�� ��|�)����\��n)��?)B�
+'?[s�����jh���-0���F����IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/ui-icons-222222-256x240.png b/web/themes/seven/images/ui-icons-222222-256x240.png
new file mode 100644
index 0000000000000000000000000000000000000000..9a9606f7614c8bd5d0b9b147e47f719c90598070
--- /dev/null
+++ b/web/themes/seven/images/ui-icons-222222-256x240.png
@@ -0,0 +1,28 @@
+�PNG
+
+���
IHDR�����������IJ�����PLTE"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""]�����NtRNS�2P���."Tp@f`� <BHJZ&0R,�4���j���8D��|�������(��$�
+��b���lߝF>n~�hh�H����IDATx^���0E����8av��߄44�z�,͗lKV���'�4MQ_?��u9�(RP�1��
+`2��/�@�A�:��d��
+@s�x����X.�����^@�к�R����]�B<ñ��To�CT|",��5�;���vc�_���i��i��M��"��T����}@�B�P��(6��'��7�j�<�<� P!_1���ݍ+��҈���R>e*�Mw~�;�k@?���i��i�y\j��0�x��I8׿�>X��}6�ݱ�:������� Y����㗈�XAr�b�?n�q��N� ��8@vffsv�����U~1��8�É���t!�C`�\СC˾�U�Ex�~L6M�4M�\�Y*\@�/f���j���d#�����I�Pi���!n0���]H����&-VTL@��u��@���bw�)E�PA�;��
+c=����P���o50B�J��N� {�e���aw����n��:s���?a�O�$-�i��"(в$�!�<GY�x�D���·��4M�4Mø�"?��0^Ⱥ9d�:
+|*�?e��SF:������N��ˬ�
+HLN�F��$��0e�!�Ҥ��}>N�1��/r�+�Iߑ���ΰ5�0���#�v<���f{h��w��=
+��������`���*!X1�h���^q��$1f��sK�4M�l�ƛO�����O���`���4�m�|۫�V���֑��c���8�����s��9��m0�������8�xV�KH�Q�J��wE�r�n��W��w���{�����)k����l�Mk��u�?�)�������Z�ǽ�a�p������i��O;g�ܶqE�����AE�����S)um7M��	�֮�q��{�ǩ��-$%,�|��s��s��ba/��.�G�)iK��8W�$܃>�>��J�W�,~L�H��Ș`��)˜�6�@�Ĕ�d���T�_���Y�
+��"K�_aCxB�0`z�+6(��} 
+d`	�����@�S�&�T���Ȳ����|>J�X���N��	d�b~����HU�9�$��4���{��b� ��5Im�����n�@��ET�xpF�f9��
@�,�8g�
+=��ʲL�V��Ǖ0����E�h4��F���b���f9�n�R7�x����zWڍ�@O��P�'2ɴ����B-1�A
<~��d�Y�ϼ�A�x�T3*XŒb�e��~t�fq�Y�AL�:��IMTrY���?��$49��'���
+�)`\�@�z�������8=��e��g
+2�L��M����
q��@���}U�����f�8��	��O��Ni@�����O��{�)5L�۳Ʌ���KY��=�SHUU&�[�8,rl�3��=zWmz��#,��=��EQ\AK �J8��SM1G:���?P-�?XīÉ�����A�W�7�����L��*�P�e{��
+�*u��S�S�+N9��
�I�jL�������Z<��.�����w
E��tu���羭vԸ��H��SQ9�����{��$�0��)]�x]:�}�/�׬�z�V�i:���`�_P��W�|���"�w��A� ��O&������q�s��|�����#�`ڛ�q�_�2I�+B��;�ty�\�L�Y��^/
+�4_>?��7k=c��Bm�e�[�t,��LWT�q_��@rNB	���U>� �z�D��Z�?q����۩4��E�N���{1%n����p��g�X�H�ź2��e��u��%�~�����y�O�s�ߊ������o������IP�@��J�
+��C����}�7v:���r����_&�[��#o�SkU�y�*H�~M��
+*K��V�l|�j�q�?)V9��6!λ;E
�݆��W���vG
+n�K+^����
+��߰�,�ׯ�ׯ�H.�
+*��� �X�ڡ�1�O�`�rvJ�W��d�4�����{j�w��{�H���_d5�:�{2�v�A���:���b�,��t�b���Q*��)1�^E�=��5�Sxә��^���.�6�9����y�r�rɡ����4�\�q���п,V5�VG�s{{{A��{~q���a>�dX.g�Y�_���b�=���,<�N�������K�I����	x�d�@��~�\�$y��U�HG@+K���ӯLQ��Yؓm�D�dѐ��g�Di`��#IG8ՀW@�1^99hG���D@w�J���������ɮ�j�IrrqωWNn�����<���=����;������5?����Z�H�Vs�2�o�TD�M1`��p�-�-����*��L�ن�f�%�c��Z�R[�g�b�P�/�4ͻ���RЭv���m�~��i�l��j�n�*0�N�;ӂ�o@ɚ2@[�<s�1��%C&)��Fx��9^[������
T���`	����$���l|=��6����/�M���
+Hhk̩��;n�zz��ު/��
������%��&���OHl�{�b��r��E`����I�0�i��vJ�ޖP*��R��`DX<�9�P�w��8�ӡ2m����d�0�����@�C@0.�t���[[����`���[{��z\�y���������0�?���Sp����}�Y.�7P(������)+�+ދU�ʘ8�ge}-q<�ޗzf%����8Œd{��O�|��f=�iB��Q����x�)*X8v���F�����l�83Nuw����������+B���௬�'c*Ic5�ry��m�<;|�m� Q����m�x�-t�����"�+j;�Vt����u����ڎ�
}1���_�ㅔW�����?�j��c����@����X+1�?z=Ś�񹤮&րj}	���4����%����ԯ���%"?#u��?�l�FZ�eh�Hh���Ȑ��_������e�G@�^��7@%U��R�iCW� q�
+X���{TU�	�k��ETH�f�%�
+����M͚�I�Ik%�MR�&=ި����^�}����˶'2�����T֎����������5l\����}��?�2�����
+�Ȉu: $ѧ�PC`�
+�YF覀P/x����tSi�����+����fV������/
+����!�?��3�`�I�����W�	�wn`�od�����30�?��ss������IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/ui-icons-454545-256x240.png b/web/themes/seven/images/ui-icons-454545-256x240.png
new file mode 100644
index 0000000000000000000000000000000000000000..80cb644a58f9bb4d638d0d44b060caa8895ea48a
--- /dev/null
+++ b/web/themes/seven/images/ui-icons-454545-256x240.png
@@ -0,0 +1,28 @@
+�PNG
+
+���
IHDR�����������IJ�����PLTEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE�ڲ����NtRNS�2P���."Tp@f`� <BHJZ&0R,�4���j���8D��|�������(��$�
+��b���lߝF>n~�hh�H����IDATx^���0E����8av��߄44�z�,͗lKV���'�4MQ_?��u9�(RP�1��
+`2��/�@�A�:��d��
+@s�x����X.�����^@�к�R����]�B<ñ��To�CT|",��5�;���vc�_���i��i��M��"��T����}@�B�P��(6��'��7�j�<�<� P!_1���ݍ+��҈���R>e*�Mw~�;�k@?���i��i�y\j��0�x��I8׿�>X��}6�ݱ�:������� Y����㗈�XAr�b�?n�q��N� ��8@vffsv�����U~1��8�É���t!�C`�\СC˾�U�Ex�~L6M�4M�\�Y*\@�/f���j���d#�����I�Pi���!n0���]H����&-VTL@��u��@���bw�)E�PA�;��
+c=����P���o50B�J��N� {�e���aw����n��:s���?a�O�$-�i��"(в$�!�<GY�x�D���·��4M�4Mø�"?��0^Ⱥ9d�:
+|*�?e��SF:������N��ˬ�
+HLN�F��$��0e�!�Ҥ��}>N�1��/r�+�Iߑ���ΰ5�0���#�v<���f{h��w��=
+��������`���*!X1�h���^q��$1f��sK�4M�l�ƛO�����O���`���4�m�|۫�V���֑��c���8�����s��9��m0�������8�xV�KH�Q�J��wE�r�n��W��w���{�����)k����l�Mk��u�?�)�������Z�ǽ�a�p������i��O;g�ܶqE�����AE�����S)um7M��	�֮�q��{�ǩ��-$%,�|��s��s��ba/��.�G�)iK��8W�$܃>�>��J�W�,~L�H��Ș`��)˜�6�@�Ĕ�d���T�_���Y�
+��"K�_aCxB�0`z�+6(��} 
+d`	�����@�S�&�T���Ȳ����|>J�X���N��	d�b~����HU�9�$��4���{��b� ��5Im�����n�@��ET�xpF�f9��
@�,�8g�
+=��ʲL�V��Ǖ0����E�h4��F���b���f9�n�R7�x����zWڍ�@O��P�'2ɴ����B-1�A
<~��d�Y�ϼ�A�x�T3*XŒb�e��~t�fq�Y�AL�:��IMTrY���?��$49��'���
+�)`\�@�z�������8=��e��g
+2�L��M����
q��@���}U�����f�8��	��O��Ni@�����O��{�)5L�۳Ʌ���KY��=�SHUU&�[�8,rl�3��=zWmz��#,��=��EQ\AK �J8��SM1G:���?P-�?XīÉ�����A�W�7�����L��*�P�e{��
+�*u��S�S�+N9��
�I�jL�������Z<��.�����w
E��tu���羭vԸ��H��SQ9�����{��$�0��)]�x]:�}�/�׬�z�V�i:���`�_P��W�|���"�w��A� ��O&������q�s��|�����#�`ڛ�q�_�2I�+B��;�ty�\�L�Y��^/
+�4_>?��7k=c��Bm�e�[�t,��LWT�q_��@rNB	���U>� �z�D��Z�?q����۩4��E�N���{1%n����p��g�X�H�ź2��e��u��%�~�����y�O�s�ߊ������o������IP�@��J�
+��C����}�7v:���r����_&�[��#o�SkU�y�*H�~M��
+*K��V�l|�j�q�?)V9��6!λ;E
�݆��W���vG
+n�K+^����
+��߰�,�ׯ�ׯ�H.�
+*��� �X�ڡ�1�O�`�rvJ�W��d�4�����{j�w��{�H���_d5�:�{2�v�A���:���b�,��t�b���Q*��)1�^E�=��5�Sxә��^���.�6�9����y�r�rɡ����4�\�q���п,V5�VG�s{{{A��{~q���a>�dX.g�Y�_���b�=���,<�N�������K�I����	x�d�@��~�\�$y��U�HG@+K���ӯLQ��Yؓm�D�dѐ��g�Di`��#IG8ՀW@�1^99hG���D@w�J���������ɮ�j�IrrqωWNn�����<���=����;������5?����Z�H�Vs�2�o�TD�M1`��p�-�-����*��L�ن�f�%�c��Z�R[�g�b�P�/�4ͻ���RЭv���m�~��i�l��j�n�*0�N�;ӂ�o@ɚ2@[�<s�1��%C&)��Fx��9^[������
T���`	����$���l|=��6����/�M���
+Hhk̩��;n�zz��ު/��
������%��&���OHl�{�b��r��E`����I�0�i��vJ�ޖP*��R��`DX<�9�P�w��8�ӡ2m����d�0�����@�C@0.�t���[[����`���[{��z\�y���������0�?���Sp����}�Y.�7P(������)+�+ދU�ʘ8�ge}-q<�ޗzf%����8Œd{��O�|��f=�iB��Q����x�)*X8v���F�����l�83Nuw����������+B���௬�'c*Ic5�ry��m�<;|�m� Q����m�x�-t�����"�+j;�Vt����u����ڎ�
}1���_�ㅔW�����?�j��c����@����X+1�?z=Ś�񹤮&րj}	���4����%����ԯ���%"?#u��?�l�FZ�eh�Hh���Ȑ��_������e�G@�^��7@%U��R�iCW� q�
+X���{TU�	�k��ETH�f�%�
+����M͚�I�Ik%�MR�&=ި����^�}����˶'2�����T֎����������5l\����}��?�2�����
+�Ȉu: $ѧ�PC`�
+�YF覀P/x����tSi�����+����fV������/
+����!�?��3�`�I�����W�	�wn`�od�����30�?��ss������IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/ui-icons-800000-256x240.png b/web/themes/seven/images/ui-icons-800000-256x240.png
new file mode 100644
index 0000000000000000000000000000000000000000..7bf106b2b4d07cc47d45f96fa3fb473c85e8ee17
--- /dev/null
+++ b/web/themes/seven/images/ui-icons-800000-256x240.png
@@ -0,0 +1,28 @@
+�PNG
+
+���
IHDR�����������IJ�����PLTE���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������j>����NtRNS�2P���."Tp@f`� <BHJZ&0R,�4���j���8D��|�������(��$�
+��b���lߝF>n~�hh�H����IDATx^���0E����8av��߄44�z�,͗lKV���'�4MQ_?��u9�(RP�1��
+`2��/�@�A�:��d��
+@s�x����X.�����^@�к�R����]�B<ñ��To�CT|",��5�;���vc�_���i��i��M��"��T����}@�B�P��(6��'��7�j�<�<� P!_1���ݍ+��҈���R>e*�Mw~�;�k@?���i��i�y\j��0�x��I8׿�>X��}6�ݱ�:������� Y����㗈�XAr�b�?n�q��N� ��8@vffsv�����U~1��8�É���t!�C`�\СC˾�U�Ex�~L6M�4M�\�Y*\@�/f���j���d#�����I�Pi���!n0���]H����&-VTL@��u��@���bw�)E�PA�;��
+c=����P���o50B�J��N� {�e���aw����n��:s���?a�O�$-�i��"(в$�!�<GY�x�D���·��4M�4Mø�"?��0^Ⱥ9d�:
+|*�?e��SF:������N��ˬ�
+HLN�F��$��0e�!�Ҥ��}>N�1��/r�+�Iߑ���ΰ5�0���#�v<���f{h��w��=
+��������`���*!X1�h���^q��$1f��sK�4M�l�ƛO�����O���`���4�m�|۫�V���֑��c���8�����s��9��m0�������8�xV�KH�Q�J��wE�r�n��W��w���{�����)k����l�Mk��u�?�)�������Z�ǽ�a�p������i��O;g�ܶqE�����AE�����S)um7M��	�֮�q��{�ǩ��-$%,�|��s��s��ba/��.�G�)iK��8W�$܃>�>��J�W�,~L�H��Ș`��)˜�6�@�Ĕ�d���T�_���Y�
+��"K�_aCxB�0`z�+6(��} 
+d`	�����@�S�&�T���Ȳ����|>J�X���N��	d�b~����HU�9�$��4���{��b� ��5Im�����n�@��ET�xpF�f9��
@�,�8g�
+=��ʲL�V��Ǖ0����E�h4��F���b���f9�n�R7�x����zWڍ�@O��P�'2ɴ����B-1�A
<~��d�Y�ϼ�A�x�T3*XŒb�e��~t�fq�Y�AL�:��IMTrY���?��$49��'���
+�)`\�@�z�������8=��e��g
+2�L��M����
q��@���}U�����f�8��	��O��Ni@�����O��{�)5L�۳Ʌ���KY��=�SHUU&�[�8,rl�3��=zWmz��#,��=��EQ\AK �J8��SM1G:���?P-�?XīÉ�����A�W�7�����L��*�P�e{��
+�*u��S�S�+N9��
�I�jL�������Z<��.�����w
E��tu���羭vԸ��H��SQ9�����{��$�0��)]�x]:�}�/�׬�z�V�i:���`�_P��W�|���"�w��A� ��O&������q�s��|�����#�`ڛ�q�_�2I�+B��;�ty�\�L�Y��^/
+�4_>?��7k=c��Bm�e�[�t,��LWT�q_��@rNB	���U>� �z�D��Z�?q����۩4��E�N���{1%n����p��g�X�H�ź2��e��u��%�~�����y�O�s�ߊ������o������IP�@��J�
+��C����}�7v:���r����_&�[��#o�SkU�y�*H�~M��
+*K��V�l|�j�q�?)V9��6!λ;E
�݆��W���vG
+n�K+^����
+��߰�,�ׯ�ׯ�H.�
+*��� �X�ڡ�1�O�`�rvJ�W��d�4�����{j�w��{�H���_d5�:�{2�v�A���:���b�,��t�b���Q*��)1�^E�=��5�Sxә��^���.�6�9����y�r�rɡ����4�\�q���п,V5�VG�s{{{A��{~q���a>�dX.g�Y�_���b�=���,<�N�������K�I����	x�d�@��~�\�$y��U�HG@+K���ӯLQ��Yؓm�D�dѐ��g�Di`��#IG8ՀW@�1^99hG���D@w�J���������ɮ�j�IrrqωWNn�����<���=����;������5?����Z�H�Vs�2�o�TD�M1`��p�-�-����*��L�ن�f�%�c��Z�R[�g�b�P�/�4ͻ���RЭv���m�~��i�l��j�n�*0�N�;ӂ�o@ɚ2@[�<s�1��%C&)��Fx��9^[������
T���`	����$���l|=��6����/�M���
+Hhk̩��;n�zz��ު/��
������%��&���OHl�{�b��r��E`����I�0�i��vJ�ޖP*��R��`DX<�9�P�w��8�ӡ2m����d�0�����@�C@0.�t���[[����`���[{��z\�y���������0�?���Sp����}�Y.�7P(������)+�+ދU�ʘ8�ge}-q<�ޗzf%����8Œd{��O�|��f=�iB��Q����x�)*X8v���F�����l�83Nuw����������+B���௬�'c*Ic5�ry��m�<;|�m� Q����m�x�-t�����"�+j;�Vt����u����ڎ�
}1���_�ㅔW�����?�j��c����@����X+1�?z=Ś�񹤮&րj}	���4����%����ԯ���%"?#u��?�l�FZ�eh�Hh���Ȑ��_������e�G@�^��7@%U��R�iCW� q�
+X���{TU�	�k��ETH�f�%�
+����M͚�I�Ik%�MR�&=ި����^�}����˶'2�����T֎����������5l\����}��?�2�����
+�Ȉu: $ѧ�PC`�
+�YF覀P/x����tSi�����+����fV������/
+����!�?��3�`�I�����W�	�wn`�od�����30�?��ss������IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/ui-icons-888888-256x240.png b/web/themes/seven/images/ui-icons-888888-256x240.png
new file mode 100644
index 0000000000000000000000000000000000000000..8373712d13cf55efd105966a905ccd64cb4c5f59
--- /dev/null
+++ b/web/themes/seven/images/ui-icons-888888-256x240.png
@@ -0,0 +1,28 @@
+�PNG
+
+���
IHDR�����������IJ�����PLTE������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{���NtRNS�2P���."Tp@f`� <BHJZ&0R,�4���j���8D��|�������(��$�
+��b���lߝF>n~�hh�H����IDATx^���0E����8av��߄44�z�,͗lKV���'�4MQ_?��u9�(RP�1��
+`2��/�@�A�:��d��
+@s�x����X.�����^@�к�R����]�B<ñ��To�CT|",��5�;���vc�_���i��i��M��"��T����}@�B�P��(6��'��7�j�<�<� P!_1���ݍ+��҈���R>e*�Mw~�;�k@?���i��i�y\j��0�x��I8׿�>X��}6�ݱ�:������� Y����㗈�XAr�b�?n�q��N� ��8@vffsv�����U~1��8�É���t!�C`�\СC˾�U�Ex�~L6M�4M�\�Y*\@�/f���j���d#�����I�Pi���!n0���]H����&-VTL@��u��@���bw�)E�PA�;��
+c=����P���o50B�J��N� {�e���aw����n��:s���?a�O�$-�i��"(в$�!�<GY�x�D���·��4M�4Mø�"?��0^Ⱥ9d�:
+|*�?e��SF:������N��ˬ�
+HLN�F��$��0e�!�Ҥ��}>N�1��/r�+�Iߑ���ΰ5�0���#�v<���f{h��w��=
+��������`���*!X1�h���^q��$1f��sK�4M�l�ƛO�����O���`���4�m�|۫�V���֑��c���8�����s��9��m0�������8�xV�KH�Q�J��wE�r�n��W��w���{�����)k����l�Mk��u�?�)�������Z�ǽ�a�p������i��O;g�ܶqE�����AE�����S)um7M��	�֮�q��{�ǩ��-$%,�|��s��s��ba/��.�G�)iK��8W�$܃>�>��J�W�,~L�H��Ș`��)˜�6�@�Ĕ�d���T�_���Y�
+��"K�_aCxB�0`z�+6(��} 
+d`	�����@�S�&�T���Ȳ����|>J�X���N��	d�b~����HU�9�$��4���{��b� ��5Im�����n�@��ET�xpF�f9��
@�,�8g�
+=��ʲL�V��Ǖ0����E�h4��F���b���f9�n�R7�x����zWڍ�@O��P�'2ɴ����B-1�A
<~��d�Y�ϼ�A�x�T3*XŒb�e��~t�fq�Y�AL�:��IMTrY���?��$49��'���
+�)`\�@�z�������8=��e��g
+2�L��M����
q��@���}U�����f�8��	��O��Ni@�����O��{�)5L�۳Ʌ���KY��=�SHUU&�[�8,rl�3��=zWmz��#,��=��EQ\AK �J8��SM1G:���?P-�?XīÉ�����A�W�7�����L��*�P�e{��
+�*u��S�S�+N9��
�I�jL�������Z<��.�����w
E��tu���羭vԸ��H��SQ9�����{��$�0��)]�x]:�}�/�׬�z�V�i:���`�_P��W�|���"�w��A� ��O&������q�s��|�����#�`ڛ�q�_�2I�+B��;�ty�\�L�Y��^/
+�4_>?��7k=c��Bm�e�[�t,��LWT�q_��@rNB	���U>� �z�D��Z�?q����۩4��E�N���{1%n����p��g�X�H�ź2��e��u��%�~�����y�O�s�ߊ������o������IP�@��J�
+��C����}�7v:���r����_&�[��#o�SkU�y�*H�~M��
+*K��V�l|�j�q�?)V9��6!λ;E
�݆��W���vG
+n�K+^����
+��߰�,�ׯ�ׯ�H.�
+*��� �X�ڡ�1�O�`�rvJ�W��d�4�����{j�w��{�H���_d5�:�{2�v�A���:���b�,��t�b���Q*��)1�^E�=��5�Sxә��^���.�6�9����y�r�rɡ����4�\�q���п,V5�VG�s{{{A��{~q���a>�dX.g�Y�_���b�=���,<�N�������K�I����	x�d�@��~�\�$y��U�HG@+K���ӯLQ��Yؓm�D�dѐ��g�Di`��#IG8ՀW@�1^99hG���D@w�J���������ɮ�j�IrrqωWNn�����<���=����;������5?����Z�H�Vs�2�o�TD�M1`��p�-�-����*��L�ن�f�%�c��Z�R[�g�b�P�/�4ͻ���RЭv���m�~��i�l��j�n�*0�N�;ӂ�o@ɚ2@[�<s�1��%C&)��Fx��9^[������
T���`	����$���l|=��6����/�M���
+Hhk̩��;n�zz��ު/��
������%��&���OHl�{�b��r��E`����I�0�i��vJ�ޖP*��R��`DX<�9�P�w��8�ӡ2m����d�0�����@�C@0.�t���[[����`���[{��z\�y���������0�?���Sp����}�Y.�7P(������)+�+ދU�ʘ8�ge}-q<�ޗzf%����8Œd{��O�|��f=�iB��Q����x�)*X8v���F�����l�83Nuw����������+B���௬�'c*Ic5�ry��m�<;|�m� Q����m�x�-t�����"�+j;�Vt����u����ڎ�
}1���_�ㅔW�����?�j��c����@����X+1�?z=Ś�񹤮&րj}	���4����%����ԯ���%"?#u��?�l�FZ�eh�Hh���Ȑ��_������e�G@�^��7@%U��R�iCW� q�
+X���{TU�	�k��ETH�f�%�
+����M͚�I�Ik%�MR�&=ި����^�}����˶'2�����T֎����������5l\����}��?�2�����
+�Ȉu: $ѧ�PC`�
+�YF覀P/x����tSi�����+����fV������/
+����!�?��3�`�I�����W�	�wn`�od�����30�?��ss������IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/images/ui-icons-ffffff-256x240.png b/web/themes/seven/images/ui-icons-ffffff-256x240.png
new file mode 100644
index 0000000000000000000000000000000000000000..3086869dad620762d287816748955140410fe815
--- /dev/null
+++ b/web/themes/seven/images/ui-icons-ffffff-256x240.png
@@ -0,0 +1,28 @@
+�PNG
+
+���
IHDR�����������IJ�����PLTE����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NtRNS�2P���."Tp@f`� <BHJZ&0R,�4���j���8D��|�������(��$�
+��b���lߝF>n~�hh�H����IDATx^���0E����8av��߄44�z�,͗lKV���'�4MQ_?��u9�(RP�1��
+`2��/�@�A�:��d��
+@s�x����X.�����^@�к�R����]�B<ñ��To�CT|",��5�;���vc�_���i��i��M��"��T����}@�B�P��(6��'��7�j�<�<� P!_1���ݍ+��҈���R>e*�Mw~�;�k@?���i��i�y\j��0�x��I8׿�>X��}6�ݱ�:������� Y����㗈�XAr�b�?n�q��N� ��8@vffsv�����U~1��8�É���t!�C`�\СC˾�U�Ex�~L6M�4M�\�Y*\@�/f���j���d#�����I�Pi���!n0���]H����&-VTL@��u��@���bw�)E�PA�;��
+c=����P���o50B�J��N� {�e���aw����n��:s���?a�O�$-�i��"(в$�!�<GY�x�D���·��4M�4Mø�"?��0^Ⱥ9d�:
+|*�?e��SF:������N��ˬ�
+HLN�F��$��0e�!�Ҥ��}>N�1��/r�+�Iߑ���ΰ5�0���#�v<���f{h��w��=
+��������`���*!X1�h���^q��$1f��sK�4M�l�ƛO�����O���`���4�m�|۫�V���֑��c���8�����s��9��m0�������8�xV�KH�Q�J��wE�r�n��W��w���{�����)k����l�Mk��u�?�)�������Z�ǽ�a�p������i��O;g�ܶqE�����AE�����S)um7M��	�֮�q��{�ǩ��-$%,�|��s��s��ba/��.�G�)iK��8W�$܃>�>��J�W�,~L�H��Ș`��)˜�6�@�Ĕ�d���T�_���Y�
+��"K�_aCxB�0`z�+6(��} 
+d`	�����@�S�&�T���Ȳ����|>J�X���N��	d�b~����HU�9�$��4���{��b� ��5Im�����n�@��ET�xpF�f9��
@�,�8g�
+=��ʲL�V��Ǖ0����E�h4��F���b���f9�n�R7�x����zWڍ�@O��P�'2ɴ����B-1�A
<~��d�Y�ϼ�A�x�T3*XŒb�e��~t�fq�Y�AL�:��IMTrY���?��$49��'���
+�)`\�@�z�������8=��e��g
+2�L��M����
q��@���}U�����f�8��	��O��Ni@�����O��{�)5L�۳Ʌ���KY��=�SHUU&�[�8,rl�3��=zWmz��#,��=��EQ\AK �J8��SM1G:���?P-�?XīÉ�����A�W�7�����L��*�P�e{��
+�*u��S�S�+N9��
�I�jL�������Z<��.�����w
E��tu���羭vԸ��H��SQ9�����{��$�0��)]�x]:�}�/�׬�z�V�i:���`�_P��W�|���"�w��A� ��O&������q�s��|�����#�`ڛ�q�_�2I�+B��;�ty�\�L�Y��^/
+�4_>?��7k=c��Bm�e�[�t,��LWT�q_��@rNB	���U>� �z�D��Z�?q����۩4��E�N���{1%n����p��g�X�H�ź2��e��u��%�~�����y�O�s�ߊ������o������IP�@��J�
+��C����}�7v:���r����_&�[��#o�SkU�y�*H�~M��
+*K��V�l|�j�q�?)V9��6!λ;E
�݆��W���vG
+n�K+^����
+��߰�,�ׯ�ׯ�H.�
+*��� �X�ڡ�1�O�`�rvJ�W��d�4�����{j�w��{�H���_d5�:�{2�v�A���:���b�,��t�b���Q*��)1�^E�=��5�Sxә��^���.�6�9����y�r�rɡ����4�\�q���п,V5�VG�s{{{A��{~q���a>�dX.g�Y�_���b�=���,<�N�������K�I����	x�d�@��~�\�$y��U�HG@+K���ӯLQ��Yؓm�D�dѐ��g�Di`��#IG8ՀW@�1^99hG���D@w�J���������ɮ�j�IrrqωWNn�����<���=����;������5?����Z�H�Vs�2�o�TD�M1`��p�-�-����*��L�ن�f�%�c��Z�R[�g�b�P�/�4ͻ���RЭv���m�~��i�l��j�n�*0�N�;ӂ�o@ɚ2@[�<s�1��%C&)��Fx��9^[������
T���`	����$���l|=��6����/�M���
+Hhk̩��;n�zz��ު/��
������%��&���OHl�{�b��r��E`����I�0�i��vJ�ޖP*��R��`DX<�9�P�w��8�ӡ2m����d�0�����@�C@0.�t���[[����`���[{��z\�y���������0�?���Sp����}�Y.�7P(������)+�+ދU�ʘ8�ge}-q<�ޗzf%����8Œd{��O�|��f=�iB��Q����x�)*X8v���F�����l�83Nuw����������+B���௬�'c*Ic5�ry��m�<;|�m� Q����m�x�-t�����"�+j;�Vt����u����ڎ�
}1���_�ㅔW�����?�j��c����@����X+1�?z=Ś�񹤮&րj}	���4����%����ԯ���%"?#u��?�l�FZ�eh�Hh���Ȑ��_������e�G@�^��7@%U��R�iCW� q�
+X���{TU�	�k��ETH�f�%�
+����M͚�I�Ik%�MR�&=ި����^�}����˶'2�����T֎����������5l\����}��?�2�����
+�Ȉu: $ѧ�PC`�
+�YF覀P/x����tSi�����+����fV������/
+����!�?��3�`�I�����W�	�wn`�od�����30�?��ss������IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/js/classy/README.txt b/web/themes/seven/js/classy/README.txt
new file mode 100644
index 0000000000000000000000000000000000000000..efa01cfd103552923d092d7a8866ca13d056368b
--- /dev/null
+++ b/web/themes/seven/js/classy/README.txt
@@ -0,0 +1,12 @@
+WHAT IS THIS DIRECTORY FOR?
+--------------------------------
+This directory is for JS files previously inherited from the Classy theme.
+
+WHY ARE CLASSY JS FILES BEING COPIED HERE?
+-------------------------------------------
+Classy will be deprecated during the Drupal 9 lifecycle. To prepare for Classy's
+removal, JS files that would otherwise be inherited from Classy are copied
+here.
+
+JS files that differ from the Classy versions should not be placed in this
+directory or any subdirectory.
diff --git a/web/themes/seven/js/classy/media_embed_ckeditor.theme.es6.js b/web/themes/seven/js/classy/media_embed_ckeditor.theme.es6.js
new file mode 100644
index 0000000000000000000000000000000000000000..a33d18ffcd3d531624b028b65ef8d4940369138e
--- /dev/null
+++ b/web/themes/seven/js/classy/media_embed_ckeditor.theme.es6.js
@@ -0,0 +1,22 @@
+/**
+ * @file
+ * Classy theme overrides for the Media Embed CKEditor plugin.
+ */
+
+((Drupal) => {
+  /**
+   * Themes the error displayed when the media embed preview fails.
+   *
+   * @param {string} error
+   *   The error message to display
+   *
+   * @return {string}
+   *   A string representing a DOM fragment.
+   *
+   * @see media-embed-error.html.twig
+   */
+  Drupal.theme.mediaEmbedPreviewError = () =>
+    `<div class="media-embed-error media-embed-error--preview-error">${Drupal.t(
+      'An error occurred while trying to preview the media. Please save your work and reload this page.',
+    )}</div>`;
+})(Drupal);
diff --git a/web/themes/seven/js/classy/media_embed_ckeditor.theme.js b/web/themes/seven/js/classy/media_embed_ckeditor.theme.js
new file mode 100644
index 0000000000000000000000000000000000000000..19cc4ff77763ccdea8407959894cab4a7aa27c73
--- /dev/null
+++ b/web/themes/seven/js/classy/media_embed_ckeditor.theme.js
@@ -0,0 +1,10 @@
+/**
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
+
+(Drupal => {
+  Drupal.theme.mediaEmbedPreviewError = () => `<div class="media-embed-error media-embed-error--preview-error">${Drupal.t('An error occurred while trying to preview the media. Please save your work and reload this page.')}</div>`;
+})(Drupal);
\ No newline at end of file
diff --git a/web/themes/seven/js/mobile.install.es6.js b/web/themes/seven/js/mobile.install.es6.js
new file mode 100644
index 0000000000000000000000000000000000000000..bfe40a42f3ad1520a32390fe4a9fa07727e66855
--- /dev/null
+++ b/web/themes/seven/js/mobile.install.es6.js
@@ -0,0 +1,29 @@
+(function () {
+  function findActiveStep(steps) {
+    for (let i = 0; i < steps.length; i++) {
+      if (steps[i].className === 'is-active') {
+        return i + 1;
+      }
+    }
+    // The final "Finished" step is never "active".
+    if (steps[steps.length - 1].className === 'done') {
+      return steps.length;
+    }
+    return 0;
+  }
+
+  function installStepsSetup() {
+    const steps = document.querySelectorAll('.task-list li');
+    if (steps.length) {
+      const header = document.querySelector('header[role="banner"]');
+      const stepIndicator = document.createElement('div');
+      stepIndicator.className = 'step-indicator';
+      stepIndicator.innerHTML = `${findActiveStep(steps)}/${steps.length}`;
+      header.appendChild(stepIndicator);
+    }
+  }
+
+  if (document.addEventListener) {
+    document.addEventListener('DOMContentLoaded', installStepsSetup);
+  }
+})();
diff --git a/web/themes/seven/js/mobile.install.js b/web/themes/seven/js/mobile.install.js
new file mode 100644
index 0000000000000000000000000000000000000000..5f5a9758dce30ea23621464ee54c81c9a8758bdd
--- /dev/null
+++ b/web/themes/seven/js/mobile.install.js
@@ -0,0 +1,38 @@
+/**
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
+
+(function () {
+  function findActiveStep(steps) {
+    for (let i = 0; i < steps.length; i++) {
+      if (steps[i].className === 'is-active') {
+        return i + 1;
+      }
+    }
+
+    if (steps[steps.length - 1].className === 'done') {
+      return steps.length;
+    }
+
+    return 0;
+  }
+
+  function installStepsSetup() {
+    const steps = document.querySelectorAll('.task-list li');
+
+    if (steps.length) {
+      const header = document.querySelector('header[role="banner"]');
+      const stepIndicator = document.createElement('div');
+      stepIndicator.className = 'step-indicator';
+      stepIndicator.innerHTML = `${findActiveStep(steps)}/${steps.length}`;
+      header.appendChild(stepIndicator);
+    }
+  }
+
+  if (document.addEventListener) {
+    document.addEventListener('DOMContentLoaded', installStepsSetup);
+  }
+})();
\ No newline at end of file
diff --git a/web/themes/seven/js/nav-tabs.es6.js b/web/themes/seven/js/nav-tabs.es6.js
new file mode 100644
index 0000000000000000000000000000000000000000..7393f35f2a9ea1263a1632bd6266ecd933318b1f
--- /dev/null
+++ b/web/themes/seven/js/nav-tabs.es6.js
@@ -0,0 +1,51 @@
+/**
+ * @file
+ * Responsive navigation tabs.
+ *
+ * This also supports collapsible navigable is the 'is-collapsible' class is
+ * added to the main element, and a target element is included.
+ */
+(function ($, Drupal) {
+  function init(tab) {
+    const $tab = $(tab);
+    const $target = $tab.find('[data-drupal-nav-tabs-target]');
+    const isCollapsible = $tab.hasClass('is-collapsible');
+
+    function openMenu(e) {
+      $target.toggleClass('is-open');
+    }
+
+    function handleResize(e) {
+      $tab.addClass('is-horizontal');
+      const $tabs = $tab.find('.tabs');
+      const isHorizontal =
+        $tabs.outerHeight() <= $tabs.find('.tabs__tab').outerHeight();
+      $tab.toggleClass('is-horizontal', isHorizontal);
+      if (isCollapsible) {
+        $tab.toggleClass('is-collapse-enabled', !isHorizontal);
+      }
+      if (isHorizontal) {
+        $target.removeClass('is-open');
+      }
+    }
+
+    $tab.addClass('position-container is-horizontal-enabled');
+
+    $tab.on('click.tabs', '[data-drupal-nav-tabs-trigger]', openMenu);
+    $(window)
+      .on('resize.tabs', Drupal.debounce(handleResize, 150))
+      .trigger('resize.tabs');
+  }
+
+  /**
+   * Initialize the tabs JS.
+   */
+  Drupal.behaviors.navTabs = {
+    attach(context, settings) {
+      const notSmartPhone = window.matchMedia('(min-width: 300px)');
+      if (notSmartPhone.matches) {
+        once('nav-tabs', '[data-drupal-nav-tabs]', context).forEach(init);
+      }
+    },
+  };
+})(jQuery, Drupal);
diff --git a/web/themes/seven/js/nav-tabs.js b/web/themes/seven/js/nav-tabs.js
new file mode 100644
index 0000000000000000000000000000000000000000..d5f8cb9ecc1a168a95382ef5a3f4ccc4470101d7
--- /dev/null
+++ b/web/themes/seven/js/nav-tabs.js
@@ -0,0 +1,48 @@
+/**
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
+
+(function ($, Drupal) {
+  function init(tab) {
+    const $tab = $(tab);
+    const $target = $tab.find('[data-drupal-nav-tabs-target]');
+    const isCollapsible = $tab.hasClass('is-collapsible');
+
+    function openMenu(e) {
+      $target.toggleClass('is-open');
+    }
+
+    function handleResize(e) {
+      $tab.addClass('is-horizontal');
+      const $tabs = $tab.find('.tabs');
+      const isHorizontal = $tabs.outerHeight() <= $tabs.find('.tabs__tab').outerHeight();
+      $tab.toggleClass('is-horizontal', isHorizontal);
+
+      if (isCollapsible) {
+        $tab.toggleClass('is-collapse-enabled', !isHorizontal);
+      }
+
+      if (isHorizontal) {
+        $target.removeClass('is-open');
+      }
+    }
+
+    $tab.addClass('position-container is-horizontal-enabled');
+    $tab.on('click.tabs', '[data-drupal-nav-tabs-trigger]', openMenu);
+    $(window).on('resize.tabs', Drupal.debounce(handleResize, 150)).trigger('resize.tabs');
+  }
+
+  Drupal.behaviors.navTabs = {
+    attach(context, settings) {
+      const notSmartPhone = window.matchMedia('(min-width: 300px)');
+
+      if (notSmartPhone.matches) {
+        once('nav-tabs', '[data-drupal-nav-tabs]', context).forEach(init);
+      }
+    }
+
+  };
+})(jQuery, Drupal);
\ No newline at end of file
diff --git a/web/themes/seven/js/responsive-details.es6.js b/web/themes/seven/js/responsive-details.es6.js
new file mode 100644
index 0000000000000000000000000000000000000000..38140fb86bd9d6cb2ea162ed141ff69d70c2cf13
--- /dev/null
+++ b/web/themes/seven/js/responsive-details.es6.js
@@ -0,0 +1,51 @@
+/**
+ * @file
+ * Provides responsive behaviors to HTML details elements.
+ */
+
+(function ($, Drupal) {
+  /**
+   * Initializes the responsive behaviors for details elements.
+   *
+   * @type {Drupal~behavior}
+   *
+   * @prop {Drupal~behaviorAttach} attach
+   *   Attaches the responsive behavior to status report specific details elements.
+   */
+  Drupal.behaviors.responsiveDetails = {
+    attach(context) {
+      const details = once('responsive-details', 'details', context);
+
+      if (!details.length) {
+        return;
+      }
+
+      const $details = $(details);
+      const $summaries = $details.find('> summary');
+
+      function detailsToggle(matches) {
+        if (matches) {
+          $details.attr('open', true);
+          $summaries.attr('aria-expanded', true);
+          $summaries.on('click.details-open', false);
+        } else {
+          // If user explicitly opened one, leave it alone.
+          const $notPressed = $details
+            .find('> summary[aria-pressed!=true]')
+            .attr('aria-expanded', false);
+          $notPressed.parent('details').attr('open', false);
+          // After resize, allow user to close previously opened details.
+          $summaries.off('.details-open');
+        }
+      }
+
+      function handleDetailsMQ(event) {
+        detailsToggle(event.matches);
+      }
+
+      const mql = window.matchMedia('(min-width:48em)');
+      mql.addListener(handleDetailsMQ);
+      detailsToggle(mql.matches);
+    },
+  };
+})(jQuery, Drupal);
diff --git a/web/themes/seven/js/responsive-details.js b/web/themes/seven/js/responsive-details.js
new file mode 100644
index 0000000000000000000000000000000000000000..40d427b0a51b371c1ea0a9d3d8209716fbf96e5d
--- /dev/null
+++ b/web/themes/seven/js/responsive-details.js
@@ -0,0 +1,42 @@
+/**
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
+
+(function ($, Drupal) {
+  Drupal.behaviors.responsiveDetails = {
+    attach(context) {
+      const details = once('responsive-details', 'details', context);
+
+      if (!details.length) {
+        return;
+      }
+
+      const $details = $(details);
+      const $summaries = $details.find('> summary');
+
+      function detailsToggle(matches) {
+        if (matches) {
+          $details.attr('open', true);
+          $summaries.attr('aria-expanded', true);
+          $summaries.on('click.details-open', false);
+        } else {
+          const $notPressed = $details.find('> summary[aria-pressed!=true]').attr('aria-expanded', false);
+          $notPressed.parent('details').attr('open', false);
+          $summaries.off('.details-open');
+        }
+      }
+
+      function handleDetailsMQ(event) {
+        detailsToggle(event.matches);
+      }
+
+      const mql = window.matchMedia('(min-width:48em)');
+      mql.addListener(handleDetailsMQ);
+      detailsToggle(mql.matches);
+    }
+
+  };
+})(jQuery, Drupal);
\ No newline at end of file
diff --git a/web/themes/seven/logo.svg b/web/themes/seven/logo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ea5e76edb5774a411822d6a9a4b4e1c13033a741
--- /dev/null
+++ b/web/themes/seven/logo.svg
@@ -0,0 +1 @@
+<svg width="57" height="66" viewBox="471.5 467 57 66" xmlns="http://www.w3.org/2000/svg"><path opacity=".2" fill="#303030" d="M528.5 504.965c0 16.634-13.123 27.615-28.24 27.615-10.29 0-19.894-5.523-24.978-14.167l.605-.027c1.313 1.192 3.39 2.58 7.404 2.515 4.77-.064 5.645-.875 9.855-2.756 22.716-10.17 26.925-19.457 27.736-21.59s2.013-5.587.756-9.415a27.955 27.955 0 0 1-.54-1.808c-3.018-3.372-6.017-5.225-6.92-5.784-.14-.093-.29-.177-.43-.26l.44.26c2.01 1.247 14.314 8.782 14.314 25.417z"/><path fill="#fff" d="M509.09 518.507c1.006 0 2.077.065 2.83.568.756.503 1.193 1.63 1.445 2.263.25.634 0 1.006-.503 1.258-.438.25-.503.12-.94-.69-.44-.81-.82-1.63-3.01-1.63s-2.887.755-3.948 1.63c-1.062.876-1.443 1.193-1.825.69s-.253-1.006.437-1.63 1.825-1.63 2.888-2.077c1.06-.45 1.62-.383 2.625-.383zm-10.413 7.152c1.257 1.005 3.14 1.825 7.153 1.825 4.015 0 6.836-1.137 8.094-2.077.568-.438.82-.065.875.187.056.25.186.624-.252 1.07-.316.317-3.194 2.33-6.594 2.636-3.4.31-7.964.504-10.73-2.01-.438-.44-.316-1.07 0-1.323.317-.25.568-.438.94-.438.374.008.317.008.513.13z"/><path opacity=".2" fill="#aaa" d="M520.89 496.545c-.81 2.133-5.02 11.42-27.735 21.59-4.21 1.88-5.085 2.69-9.854 2.756-4.013.066-6.09-1.32-7.403-2.514l-.605.028h-.01c-2.393-4.042-3.78-8.783-3.78-13.952 0-7.852 2.97-13.654 6.287-17.687.11-.13.213-.26.325-.382a31.303 31.303 0 0 1 7.218-6.203.687.687 0 0 1 .112-.065c.42-.25.754-.447.987-.568 2.757-1.51 4.77-2.263 7.963-4.77.12-.092.242-.186.354-.288l.008-.01c.875-.754 1.64-1.76 2.18-3.4v-.008c.325-.97.567-2.16.716-3.65l.02.018c2.253 2.69 4.954 5.886 6.89 7.144.69.447 1.38.848 2.068 1.202l.3.15c2.243 1.126 4.507 1.945 6.807 3.333l.428.26c.903.56 3.902 2.412 6.92 5.784.12.475.298 1.07.54 1.807 1.274 3.837.073 7.292-.737 9.425z"/><path opacity=".5" fill="#333" d="M514.176 479.538c-3.26-2.077-6.464-2.887-9.603-4.955-1.938-1.267-4.64-4.47-6.893-7.162-.438 4.332-1.686 6.148-3.26 7.35-3.195 2.515-5.207 3.26-7.963 4.77-2.338 1.256-14.958 8.726-14.958 24.913 0 5.17 1.387 9.91 3.77 13.96 5.077 8.635 14.68 14.158 24.97 14.158 15.126 0 28.24-10.98 28.24-27.614 0-9.127-3.707-15.526-7.386-19.633-3.016-3.382-6.015-5.217-6.918-5.785zm7.627 7.34c4.117 5.15 6.213 11.23 6.213 18.077 0 3.968-.755 7.712-2.245 11.148a25.554 25.554 0 0 1-6.053 8.56c-5.15 4.806-12.062 7.45-19.475 7.45-3.67 0-7.265-.698-10.692-2.086a28.613 28.613 0 0 1-9.016-5.774c-5.532-5.225-8.57-12.257-8.57-19.8 0-6.716 2.18-12.695 6.483-17.753 3.288-3.865 6.836-6.007 8.196-6.743.67-.363 1.285-.69 1.89-.997 1.892-.97 3.68-1.89 6.14-3.818 1.312-.997 2.71-2.58 3.305-6.585 2.077 2.468 4.48 5.234 6.314 6.426 1.63 1.08 3.307 1.835 4.918 2.562 1.527.69 3.11 1.406 4.676 2.403l.056.037c4.62 2.84 7.06 5.896 7.86 6.892z"/><path opacity=".5" fill="#fff" d="M497.98 468.678c.874 2.58.753 3.893.753 4.452 0 .56-.307 2.077-1.313 2.832-.438.317-.568.568-.568.624 0 .25.568.438.568 1.006 0 .69-.317 2.077-3.642 5.393-3.325 3.316-8.103 6.278-11.8 8.103-3.698 1.826-5.468 1.686-5.97.81s.185-2.83 2.514-5.392l9.667-6.278 9.164-6.398.503-2.44"/><path fill="#fff" d="M497.98 468.613c-.57 4.145-1.826 5.393-3.512 6.715-2.83 2.133-5.588 3.446-6.212 3.763-1.63.82-7.535 4.08-10.608 8.784-.94 1.444 0 2.012.186 2.133.187.12 2.33.372 6.9-2.385 4.574-2.757 6.595-4.387 9.175-7.078 1.377-1.444 1.573-2.263 1.573-2.636 0-.438-.316-.624-.82-.754-.25-.065-.316-.187 0-.373.317-.186 1.622-.82 1.938-1.07.318-.25 1.827-1.257 1.882-2.887.065-1.63-.056-2.766-.503-4.21zm-14.112 45.628c.065-4.898 4.648-9.472 10.422-9.536 7.348-.065 12.424 7.283 16.13 7.208 3.14-.064 9.166-6.212 12.118-6.212 3.14 0 4.014 3.26 4.014 5.206 0 1.938-.623 5.458-2.133 7.656-1.51 2.198-2.44 3.008-4.2 2.888-2.264-.187-6.78-7.21-9.67-7.35-3.64-.12-11.547 7.6-17.75 7.6-3.763 0-4.9-.567-6.147-1.378-1.92-1.312-2.85-3.315-2.785-6.08z"/><text style="white-space:pre" x="477.531" y="481.527" fill="#333" font-family="Arial,sans-serif" font-size="11.5">&nbsp;SEVEN</text><text style="white-space:pre" x="473.88" y="526.911" fill="#333" font-family="Arial,sans-serif" font-size="11.5">CONTRIB</text></svg>
diff --git a/web/themes/seven/screenshot.png b/web/themes/seven/screenshot.png
new file mode 100644
index 0000000000000000000000000000000000000000..50b79ffd5966d96a261453fcf45b02b2bdc881f6
--- /dev/null
+++ b/web/themes/seven/screenshot.png
@@ -0,0 +1,156 @@
+�PNG
+
+���
IHDR��L�������[)���PLTE������������������������������������������������������������������������������������������������������������������������������������������������|yx���da`������������wtsYWW�����������䄁~lig��ޮ���������������um�����������茉�beivnh�����ҫ��������~}~ikq����������}uqop�����������~�������������Ѩ�������ܘ��uz������˙��lqx��ۍ�������ӛ�����svz�����z�����޻�������������w~�TPN��׾�ݮ��������a�����[^d��������ǭ����������푕��������������������������R����������������LGD)'(�������_������秷�B�������������︽�(v��b������ˠ��ú�v�����p�d\V���6��I����N��j�DKS���o��rg^���lw�����X�p�������\fs�;��傦б������瞯�@@A125��|���eo~����Ʒ"���Q�ч��QXa���a�������恲� ~�s��-�Ƶ��������������˸�E6)���|��ȵ:�����O��:��s��"�������iUC��ɓo)9L���CTh'����qZ����;�s��$�q���tRNS��Ũ�
����IDATx���?��@�q������]�@�+E��ױTE�RAjp9p(�H$�FA1�589t��� 8�;���?�V-X��
�ܓ{�/�{��ڐ;-�6b'Ƅ0&�u0&�1��1!�	m�	aLh�`LcB�cB�>˜����Ƅ�Ͽ�ɶ-�$?��Bh���q���������Bͱ>&��d�e~�
�{g"�m��
����S��&Y�Y�/˲(�;jVU�b$�O�_P���D?�O�7.E�Bͱ>����Ψ�����������l }9&"蟥fj)�P��#|�0��Z97���e,�Gt�d@O�^:,l�v]{�?͘�G]S�������P�L{��b"^h8�R6/�ssv2�5��"Wۮk�(��|�Ao4�,J�(�>��Ao�����^��X�?�n�gQ��Q�kcz�S�!B��iU��h��'2_�IU��-﷠�eXT�)�c�>1�J����*���ʪG&2h�n^�ߚ�aG�>�O��^��x�؃��K�Z���䜑W0��<"}y���Ӂ+Û���ivL����~�P]��j��E����Y  �SV�&r`��@��(���"�x�w��}@샧�����)ȾӊdH<�U%l���a֖NQ�b:S�$�%��ݯ�J��Ie��ee
+-*8Y���g똀��欎�R����?{�u�@���TEyrȓ�I\�Tu�7�L$~��b*,ru�hi�yү:��՘�1�8
�~�\�n�3��Z0z��il�1��O����,�E��D<�}Ӡ�~�O�9E������2$*�x�[���]�|\u��6��w�{�Z�)��� ��љtBڲs��b��\%�,i�ȹ��2/�2Y(�05�<�P��zݼ���d�:a�sey91m�e�T�ڪ�k��g�5|߲9�Ǥ�y'M�ĽIGeٍ�
+��ָ�f�Ɣ{Ɍ.�N�dY0��b��n�ɂ[�-�`��v��j��K�\�I����]����S ^\:%0�����)��l�K�!�S���2���"�Y�:��d	�3e&@,�(J3NE}��vƵ2�t��X5}o΄�bm��X��1�-C��[������O� OӼ@�zb�2�ۼ@׃ՔY��V���&Y`���Q��Gly���{��1�ͳ����i�6 �&&��ع��>�6����M8�cB��1!�	m�	aLh�`LcB�cB�>ڒ���!�]8Jj�����C�a}L�ߑ���<yO��/��xEjW���#������k��ٵ{V��8���|D���]||�Z��R����.�א��B�I)�*N�Д� $�%�	��@KZsuVL}�N*\�����O;}	��1�9�j3(���4�5������c������Hc�a����&�d�0-�c�j��I<�j�-���©�GN S�v�jFoPxx��`��NZ����4
+Hp�Hm��D���cy�۩ ����ƣ�	+캷�B�մ��S�>��Tό�N��|�c��������Y��>	��a�4�R���?���u���H\w�.D�)���|f�-���q6��m�������\E�ō������\��}O/PE#�(�XIO���.F��5�q��s.�a1�����19>�ћaD�9���xgs$�p��S�����Z�'N*ҤIa�=�!�au^5�����W�~~� �,���
+[S���,�<��2��
%�Tk���;l�ݟ[�vZ��o��o��[�+�H{�'��!���0vhɰ�����İ�����İ�����İ���������$4b���_�i�C�>
f�-�ɤ�k��
$��o����#�;��7\�Х"J�F�?��
�}�N]�v����#G�1���!q1���
+I�w��uZ�t����&�V&x�U5�i����`���x�'S���=P]n:z9�|�(A�U�>��t�m��'�3'-���Dz5kN+}��pb�=���te����xωWT�뤊����
+��	̬J�9�t>4S�!A#�g�j�,�����ߐ��ܶט
+Bp�n���\���;�+j�oZ�1��Ǎi��:ۧ��{QM2�s`��Ҙ�m���&
gPH��Ś'^�1�
2�c�q�"�{����y�j"�f���9��a�ML�`vΰ�����oHq�q���6�?ž�LWN�T��4�N�t��
+Y�Ё�(��EI4v�I�PB=Z�B.���6!�'���r8|�o3���G���
��v���k��(�0Q�����c�Q;Jh.�%�{Ť=rⰆ��A,�q��f�O��S�I�VOm�!�xM�%�Vw2n��4x��N�9
+��h.���D�S������0&´վc�E�g^dK���0�촸y%�SQ�0�6�8#[�����9,�g��-rL�
+� 	�XV&2,����L�z$``�;�����E�I;p�t�l ?�ڇ�}�*���Bv�^o3���j
+�T��aw6�����1��|Q����և��Ϙz�F��jS�X/bLXV.�'��hZٚ�{]��(�^ߠ���Wrj9��	sR�9ϫ�;a�n7�?��Ƌo��;H>�JNp�^��3�y��hޒ���-z&�|ofks^��B1٤y`D�ur�����&�z��ei����ӊ<����*m���s��L�_��&��!�o��1aS\S�,
���/�����J��g�'a
+wg���pʿx�s=C���7�e��U��$'ߪs�������tJ�c�)ܞI��%���b�v=]�70L��^���=j݀�m���� ���Q-�Wy�����b�� La0���5�x���q#���{�ts�(澬��?��u窎SM!�t�*�!������)��l.7��׍��P�*��?Mc�A@ !x�D� ��	���+�
"#��s1"�`�������&�D��"LQa"L�i���$�A�c�l^��8�a�&�M��_���ѪmA7P��zQ�0���A���PP�B�&��9���S�w��b��:�b��@>��Zu↨��]�=���������ɓ�)��09��m&�Ȯ�;^���w0Q;ۗ]G���D��F��x���&�ٽ�}s�[�hp0<�9����p�ܙ��r`r`r`�"��FLLL_����ȁɁɁ�������k�0a_~�����r0!
+�C�i�ӄX�o,�
��4��
l��6y�fDp��¦�l&
+�}��q�w�;s��oD��޷/����r+��e���C�^��/�__�	1p��e/ +Z㣕ZX(��H�|!H��^��lT���ɾ+�W�D�7�L1�+6�d0���w���i�
+�%��!G�?��)�/8��.`w{��z����x,���Ύ�LJa"a���Q��^�WDIi͵�{������2��*�-���,��ց� ���6�Hm&�hȷ0M3t/�h�
+뎘�2�)Z��	�9��LV�J�(9/3n*�3��R-�%I_��I#��.?g��j��ќV���Y�a��C!�`����z"$^�'ln��y��0"H��u�H��|��sBUY���ޜ�[;���I����R�*����i�0�	߽�~�
+p[#�|s¨�bTK�b��������鯢���ʡ|j�큸.,��eS=�VQ�yyq�ͨi�~_�j���v�0�0L�C'�d��37.���;V�ܔ��x�4j��_�U�)b��	%UK��3���f�x+v��$��ɋ�95�\��ŏ�bRͲ�}�y��i�����P�8m�@))Ao����T���!5�i�T_ͫ �@��"許�z,7M9+-ê\��.�i�Zʥ���&��a3}�(��.
�b����qy<�a�:'w��u�L��K��렬�-�Tl(].�Æd�CneR���=i��(7�9LC��p,�{�PV����Q�`�
��]��>ʵ���d��|��O�ә�'G>`z.��Le^.��l<��.'
[uŸ�4
+�‘�o�e�GƯCt}Z���{ȤZ�.{>�����\Z����ѲH�-�֎��|���8��tN�/b�&��yx�h��D�_X�K11�>�e�ڴ���p^ͫ��
03`�e�aʹ�
+̫MevZo�ь�����N?K./.�1�&v�4
�D�g�|98��ɥ�ҳ|���zLm�4c
sr�K�z����N�5T��+ٙ��fR��^73��j��}13�9L�M��]��V�I�^��D��%��B.�&�.'���\$5!H�XnN(�b���ғ���I4�UJZ��M����4q�&D�3�/c�C+R0�56Ѣ�H	�)�����읅,�N�pc��٥'-v�0Q��7���/։��D�N���<����~�#���X��z[��<ћ��, �.�?�#�C���ǡ��IEY�����˗���
|!>7��5xlB����c�0��R�A�<cqc�e��c'W6
��(7�G����~�>�~9Q=_v���B��'�)g����ɾr`��0�g�� 6P��f��4c����~�x��ֆ�=�P?u�!��wa"
+�#���7/�D.�ҍO�+����3��W0!�oo���#���{�ܞ"u���K��_l+������GSp
N��A���宅�A岲�L,}b��cڪ�8�ܯ�R�n
+
+u]a-�QJ[胮<���@KyϖG�
+(�e@xO`�/c�0 ̌d��	�Ő��l���c�����xnq>���C�	����w��w>=��q�޿NM�����32��?��e�/W��QF�O������!矄	{
+�:����K��d�;�B�4a�}
���8�&@3?�r�2bXGb�(Z�7��t4�Ѯ\�8<fJ��3r�`��'h�@q�>�u0�[%�׏A�X9�Z@!�_L���`p��r%y}� �Qa���z���
p��4����~Hh
+y/t�̍)��P��`J��{&�y�.I%�����������L�o�������m`�������
+(�����/F���i�p���M����]m� �K3j���#��g��jG��!vR'��Т?�#�����ռ�!m��z�kh�`�Kjϗ��^�ى�&Z;S�ƛ��J	Rŧd��
ᅖc��?�/��AA�>��[!�����ڃ��e$ς�^!��N��Q�Lj�j�eF����טf�+�|s� ��¿e>oǜ�K>��Di[^f��U��K*�V(�tb)~4�o/f�M?"L	��[�)ӕ��'J�e��=R����,��ivQ��ztp|)�0dGX�a9���~RE�k��RrpH��9+�M�X_����X!�}�ڨ�GXLb��3�U��)X�1��K��K�I>V_!f
�$�Ks��	(����ތ�.
�����Ƹ�9@�~��.�A7�ԉ�2��3 {!��y���-��o`�-0�#�c�z�Ն+z�|���eƠ����xWw�ʍ�j�5��I��]͔�Вy��b�).���:0מx��U�"5nU���)��MϮ,�Q�f���L���;��܃ȻV����iԲ�Vg�`M~��5g�m�Y9}X��I��I�9v"�����(�T��4Җ�f3��8�|�ј�w�HNܪsS��3^��]�9�d�O`v����y+��
�&,w��G'���3�LH�.��=�B�vLQ�������ߢ-��c��>U~���ڲ�Ф�n��5�">�<���h��T�! �$���O�[w}]~��P�p:Q����%5ժ�q��2�f�Ơ)&��3��V��6B�#Ǒh�r�dO������KKl�i�{�ù��;r/��5K�m�&�H)���!��ieQ���D�ޚ��%maXL+��f*��3�z��$?G����M]��I��g��Y��iI��˹�TZ>J�Z��p���eXs��i�3�H쉝L5[o6���"mqe4�Hl�\��r㾾1z��5[�a�J���!2��S_�4�aN�ᶎy��3g7o�
+I�6H�r�3�������Y��R'2��n�B�V��>�6��u��&:�0�D�h�_��U
��z�vU�
-Ik���~p��d�Dy����W���(����!��{6��>�k1L�vne�z:M�2� �^�-O�C��}q:?ۆ���|Lo���������E��6�h�P,�5��jK��׊�������\v��iWIc���o߫��1��}W�[s~b4f�`����P.?�d#�'���6�J��N>jϼ1�*B�7�4s�m�(�ٍ95��>Q��ذl�K|�
U+vϔ?X��Y�,��G�Sj��]�s��`+z�Ac�ŕƍ���q(��>���7.�xq�i�髠\0m
��87�t�ǘ�eK�GX5[ ׿���"0�~o|2���	Lum��H#0펠pQrq�Vā5	i�/{��*{�Ʊw���q����G����L�U��07��׳x�Cu�$�ֿ��W��b�Zס���y'�N�s��3�O������͚�?��Ə���I)��Z���C�cz�8oW�I�˂=�g”�E�m����|�fF�r�Б���n �E�1y-n:��$i���h�������{}��J 0���/_����3���v�F)�[��I!��X?e���u݅2n(�_�oRO'e��2S�xP���2�>����/��z���-���ڢ;Q�����U�qd(�R��檾I�[�5�%�)#o|�홑ZH^��,}F���Ck��T.��<�[�&E��x���(�F'�A�UF�4ù�~��v��Y����F
�8�����MՍUu��S�Q5]���9���Bc��8ӭuFV�GhK�R�;�J"o.K-�\cU��ޕ�%�>_�{v���abaUZi�l��*C���8����T+�#"+c�B�s���Luŵ�'���[����qc�
+��S�0E�bX�E�/�+�K
+�l]�0�L�(az&�&R�+�Q��B�k��rAQ�|yBѮ��o-��焖�e��1��J4����Y��n��������1Ect��)ef�H�S��)[9��t����ցU�~�S�Δ.k]�s�����A���*�A,(WI�㯇��Fv�h4�۟��}ؗ�/ދ/.��W�yΟ�s�Y,���(������
+�s�~���+F�܃�}$G,�����x��
+ޡ�Þ,
ފqy�Y���Q���#�N�.����s���
c<�&_��y��I�9��
+M������&:�^�7��,_?T�)����Y��@��\@��
+�ϛ�}������y6GAZ�H����}��աxe5����ҘQO4$�Т���&����9J����!+���D���L��|�������@�_�����gdܜ�@���{�����Y9ff�	�[1� ^���>)G��g�=L�m���`al�14���0b;i��_����"���"�������p4fe�rğX�@lr�J�v�߱�$|0�M�
��40�[%��\!��ߟ]�)��������GM�3(�����-Q��&��4��KD��λ� �1����Aj�L��������2���@U���$�� ���9q�W<A����L���۷��T�'��4͘���)�M3��D�����۾�B��/�L������D���G8���x����^�K�oc*$��a��Hbߡ��Ԇi#�j��b��A	Mh�E���8��v
+
��721���
+1�����B�y����?��?�3�>�f��2R.
+]���O��'{s?mo�	�_^�p����c�L�M��a��x0`�3)>@��2 =>�����O`��߽����
+�<X^T^�u#I�$��,p)��A�\��H�+@�
+�s���^����s#�<�HNۼ��1I�]�/��rw\:)����T�/�l��n�qv��
>� ��163�`pX�7��'C?2L��N��|4�܈���� �+�#�<�g�y���I;�\ ��F�K �����Y�n�;�&����((A����Iy�oϊ Y@�XZ���q�0�g�,
+I�O��J>(!�$O���$��<'�4���I���0
��J��0�q��f�%���3�Ȥؒ�z�^[��yU_�))+Ilv�T�gL���7n��TS�E��T%����Qm�	}��I��|N�K'������-�T:�Q�pW]��b(gU1�gݺ ���-��o�
����D��J�jR�V�;hU10�*u�E���JH�����B�� [��_��,,�,i�qc�����G�	μ����t��3Ӫ��
���/��IO^KIܞ�z��b]w�y��S6M�ن7�|"�b�ފ�"�zc����
+��V���Łͦ��Vf�����N��ulN�lC�W���<�hݎ�^�1�u�'�C{&��t�]���R��nKugNݷ��W\�e��������fE��5S��#����`�9�?Ӳ��q��$�J��#s{s#B�O��kޞY�:&����1{�5��{iU��5�
+�=5V޿=�]21�le-�f��Z����k�+'���!�O}82te��pI��SD�}��L�pp�a0y�������2[X�����a:��g5�5���L凶+���W$ntʱ�Z������0�Sލ�L��3�&6g���\�m�H�!i���L]�I>]��78��!���ӝu��Uo{aՖlٔ��꽪�Ԗ;zY�bi��2�pnj4Tj)��U��QUg ��l���jg����:;R�s�>~�?&ܓ�KoV7DI��rnYu9�V�1l �>۠0դ�5�GJM%]q�[c���F]���=��a�b�v$�y���LP�T�f��#����t���=z�����<��MD�+�I�����0W�<��.��=<����4�����h�˱��f`�r�%6�Έ;m�Ԥ���N�[X��)��͏�a��)s�9�WR���Ts�M�&t������1Y���6��ԓN��rrē]Q? �+qb���m{,0�����^������*@�
x���B��D�F�l�U����¡���h_��h�p0pD5@8K7����
+y?Xp�+.|`��fҾ9X*!�^��H���|��E�h���h|K�7��};%�˼���b�A�)�_�9?F�~t�{��� ��w��F�����CxӁ	O`z�w��1ka�qx�x�=M.��1���� \J3H:]ڥcӡo"n�C�%�Lu�^h}�pH�@m�{�g�x�`����"���[���(`�M�L�4
+�b0S$a�����}q�S
+\��0��:�y���ns*�u*nsx���8�i�f��֘r��((���m1Qa=�B�0��	�0S(`�L�Y��@Q�����o`�|�������$%�dM��0M4S0�h�.���~�=i��r�-
+ΤM.6�lL�`��f5۴�CM}�����(���S��L��L�t_��!l�V��g5͘\��ڎ�;Վz���60ݹ��i��U��K甒����z���k�s��S���)~]aʙ��L��O�Ƚ��Ͻ��6]v�f������Ȼ\,8��n�j�?��~����T
��/&I_B�t�$��v�hV-]�w�x�m_7w2�{��Zǭw�?d6�����\�$P��H!LI.���^'uP���"*ƨ�/�?�6���7��BA�X
+a�4т�HZ�/I���~
+*'�`\��$�k��)�;א��0������Vv�d�}���u�\�����jZ�ݴ�l]ռ��,���J�\1�+�Z�������#[ ԗ$\��ZZP��Eat]��s�x����w���3��^_�ҒKF��WI,LNb��,��F,L,L&.��֓�GD3N���o��X��F��P�o�������p�K~�_�蛈8���~��do���	l��U1�C��"2a��c�O_��c��+01��i�K�(
ۡ���Br�k�̖4��Q��P�As1{&�v�.j.���� ��x�T4C9E�n	�x3���9j�p<P�|�;
��(�p�PNr-L���#
+D�����'c�� k$czh��P��c"
�-�~x��S&)�����:��4)��~�� �/����<ʋ���!H��S�5�sUk��\Y
+�,�T>Χ�A]�¼��2=�F,���rU�"<��ܳ�f��BS�Bʁ���|����.H�DHy��'n7\��
//��䖉�{6,���p~˺&1�5j��jj.#o�fT����6����lF^bA�����kywCB�*�5U�$;URX�u�W^��Fcw�I�_��_[�����g�ꚜE�p0E�)7�>�)N*�oPGHڎ�Jt�$�d-gR.�;;9m}��y���q�*����-2�$��[r�Z�V�S'Sm��zO䵊dYq������Q-!ޒ���+��ʒ�C�V��WƟ�x�$�1�є譥OBW���ek��%���znQbyN�Z��s1L�*mK�5)J��=�
++L�e��*�d(�^ڨ8��Y�)ZѰo�&�V)������k4��1��e`�Ś�o��c^dh����.jB�ʋGԅnX��7eE\)ߕ���s����M=z(����R��J:u.�����*d'^�q�r�nN0zt>)�;���S���ᆤF^[Gbz�s���t����I�n�+���M�������� x�M="��R��p'WS�����Q�5
�W+rڥ�&��
���xg��Wt�v�F��Y�U
+�t�I�Ҽ�'�	���?���{���}��}���
+���1��4C��ڠ�֔�c�ji��\{�6��Z~}��
+��toŪ=�)�S�,1���S���7��=�;=�M����K��u}+�ˋM�������'�Vow�w{;����~U��6�$����
+�)�u������ݒ�I���S<�4&F�߄��+����Jx�t,�O9�Z��Ps1�2����+5�G@����%UH��1��h6��SŖ;LO�9�US⯩��H�{��`�3���U��R��C���'ӆ}/��'/O�H��+:v>ue��3�$�B������3����������3�y*��ݹ��.�D�DŽ�.
�Un���J\(�Q�ʗ
+x7mQ�Zn��%���xE;|�2��fe����*w�ד̲�ڰ¥��e���|�uq�丝�*�/;�Y����rȵ0���pE3�X�j��w�`zm��Tt. 0=��d�ī��wV��	L�{К_��n�B�Jť;�g�'=5;zK`Qdj'1x���3Q4ĀX�w��#&��\v-�6��5�J愾�"�ܸ_&�8�K��D�������S��V(�4)���S����Q,i
l&�'�Ӄ	i!���@O�8��JqdI@��Y���'ƹ��Q�r�)0�b���j(Q��vi^���V��(1��n �E���$��lœ����%��R���p� �hs<��u'���z�x�h&v���߁��I�������+�#�H�/Bύ���P�4>E,>��*Ѝ�:���Ob(1���E��
�^�ȍ��˧Ho=�d�@��B���f�(��z�zN�.����,�|TfED��X$6f2̲c�o�Bҳ(�`)�3/�,��T��z\
M��1OR�?2j���rlL�^�4��|?2q8#EY珨�}�{;��ˆ�
��a"4y�i)b�A;N@H`1=4e��]6�͘M���\G��R�M�7�^j��{;���X���0�0�0}�_#&&&'�&�/��0�
+��)�g������0�<L�c'��;���ab�|{�c7���3�0�5ba��ޙ�Eq�q��_��#,���I�e�e�oXN�O�OD@AA0⅊�x �(�U�x����5��Xm��5��i�75�6�M3���μ�{�fd��y���������D<Lj�n��|7�[Ҿb<#��I�9�m^*
є�0�&�����E���<L?&^���aCD3�sE˩�]<L=�����UBN~ϠŰ����'	1�$�P<L=�I���L8w{����;Ox
+�.�L�
+"q��]'d4�����ùQS%���^�oI�-���6��G�+�(HYEwQZͮ�<L=�	�F�kv;�e�M��65U��3�°�30�T�r60�XT�X��Yu�"�C���
+1���]{�N���}a��}u�ʖ�2uE���c�D��n}AhJ�$�ay�y��,e����koM���)�6���������N?�R��)�?�9����������w�()Y�bun�~|I��=��̃Fʮ���B���A�To���~}ƕ�{!|���"uj�x�z��Ч�y:#Ais-R:N��\c�ǻ����a�T����W�;��9x��;�w�i��]U������W������uJ�\W������M��Ɏ���������������R;�7_�����N���;�:�:%�����0�E�:�C��n��"i�p��������}��1� v��:��>d�?G��k�$�No�������5�l�8�n�L;���c6)2��̏Ttkח�:��!�YV��`�����>�zS��sa"gB�ggR.>��t�Nس{�]�5����`Pe��ݝ��æ?���q��]�ܮY�GN��x��wt��c��]���𗊦���HEuU|��N|��d3��=i����Iq�5�K���?S�a�Ba
`gb2TL���kǻ�R�;���������,�մ��ǒ]��:��a��T���~����w����ϐ����_��ڪ��U��>\�%<���w���^S�UwR�����14}h<}����K/uj�x�z#�I�>7�> )"�S��~u�*f߁�����N1ޡ�TZ�7��B(��-�Tt�&��I9!�/�����)aҸ��':m�;���N̮Ҍ̰�V'�UT���eS�°�4��}G(N)=!���S�a"4A�-✿{��A��)Y�m��pF�͐� R�B�x�,��%�,��@!H����2�~�J���jՉ�'0i�y��J}t^���wH��Ϥ���ËHOK����C��
+�^DRa_&~���̴��O���V�Hrwg��y��gM����2f��<k�����a��ab�����T`��0�����/�~ޓ]�'���-,�<E��{���FyBC��D���)�<L�0L������`���/@Ca3@j
0���1g�x���1��� ��t��=�B��
���
�2�l$�����Y�rR�4��.
+`l�mn�h��A
+-�u��^�x`���N()�RƝ��,\��Y+�a�ea��VG�9`�Q��0����h]J�v����BO?�`�P������؆kCGO���
��P\��b���b��1j�'
+�/*;�~�9�h}�Bg�P�;�X�xB6c�#3,#�Wt.Nt†l0�_6��S,Za�_O��i��lZ�609�(�$X��I���E�����y�i���̵�a�ea�'�����{�[#"��\��Z9!��Ļ�ml=��r��R�mJ�\۝��veS\C@
+�#ڷ��,�%/���T�L�/ε'���Ug�ռ3i����@���nf�)9d:y�{ph��vH��*A�+���}6�0 ��f�E�ցc�gq�Q�>����#}�fi�l7/��w��`Q@��{�"�!mm�UD`�Ȁc�=�����y*~	
n�bH���)�UY^��fJU
���0�|��A�へqh�+ƌ{0.����V���a�Ǖ�ʩ��)�`g=?-cr�7�c�"��z}��2[.�^��ڞT�1���������׹�gfTc�b�nX��U��Ϝ��5��f�@�믦�f�TR���Ȑ�KBs64����
�	V��(OA��&�q�v�D���J��q��y�t¢BE�w��@�-vc� "�G0��,�3-1�Ѝ�+�g]n�24=�A�-�����
5)U?��N�qF�ـ�Ѿ�bKM[9
ӑ��~7�7^L�f����}@�+�����q�����6g�z�rd��W2���!nW#��)����s�`�o�v[}v�Ի�2wc��&-�=���)��Y��>��s<[|��\ʴ���Wmc�n�Z�w��T0���*o�b(ԯx1b�Ͽ�����%��2����0t��w�����מV�v�rӵ8?L9�d��=��=�����xx�����K]���}x��7�Rk�=?i�<��Vr�\I���V3����z�W����A}�w0X�����潶��=�S�F`�̑�}��6O@���,L��i�*�*�<q��1YnNR|R��ʃi�98А�V	/��L�3��]��-2
+Z\��i�Ub|q�ź�D��[�<�М�V1�������nY�4����en�U��\����eyK�cgXL�/$0�^9s�e>�ϰ�#�q��\d�h��炬9��c�3��ie�Ed-� m���H����XeazL`j�t"��W��*�L~���?!�m���5
:������~m���1@t�q
+�iN�/�c�(�l�0�th��Yz�Np_�䴹~��t�d��BZ[�֙�c!����E3^��Ŋl��$��:]���b��
+�!;`T|?]Z{���h'X.t֠ѵX=W�O�[��
+'��z��+�N��t1�����x�I����&E/9m}3D��De�k�4��o���䌹�<�g0��Z�Y��r����ؚ���s�֨��f�k/��V]�I.�_+�-���Z��K״V���Z3l^ݖV)�z�z>�d�ݏ���@������,5�d��h����ܘۄ,��8|,�2�����E�f��}R��q���j�e������ښ=U����p������㈽`����"H����rHrn��\Z���2�^<jYbXS��(�K3��ۺ����=I�x;�>�a}{���C�Au����٠W9��Y|
0����'����b���ec7�}�uH�9	
+4F��=�u}�1��a=ښ�y�KA�
+���{����=����Vlm$�z� ��%�d�m5g��ٚC֟Ԕ\��݃��DR�w���vxI�[I��j�mGW5��������Jֱ�gk��Vr�H�A�b�&Z�3{��i��/��%�'Q=B�
+ab(@�����^\�0c�tP1@�2L,k�q �eae_~��Ͽ�������EC�?���eX�ٝ�g�<�k1�$�܇��d����@�Q#��R����L�.��JL�HB�ZH�H�®(����@ ���L=����G9%I��m@Q�C,�MAFR�G;I�F$�8�K(�g��\��i�w����w��$E�,Y(c)�!�9��'�
+����rk��U)uU9B���893�BYǩ��Rh��S���I�c��)x��`��sM$9xh�o
L5�n�`�M*˚cki(4�a���*a2�l�� xX����A�>�oc���
+;
��K3Uc���!��M�I ��[�7gZ{�}�X8ӂQ���/	�l�̧9!I�l��s4h�1�1�����_���Aۖ2Q
+�}8zB�
MR=l�FVoC���4�������oJMG�V���0`��f$W���r�~�
�J"QHcX������6M��
=����DF�sL�3�
V*}�[�D:,�I�_u����yԄ,ϡ.�� �R��K�٢�9^X���S��B�<��$XK�+&$xnp	�����V	����$E����ı����6m9[ 8N�x�VgnFϸ��`����Z�����"��-��^���i�'��ة��u]����E��G{Қ���	�+"�l%mȟ�]�p��1�=�_���Ԃ���Y�01Ѣ��E�~��
+�Q�Y+�����az�-Sn�"
ׂ-��V]\Z��#�a��D�UՂ�[}�3gCH�a����le����'eL�ߚS���acZ�\���i�[d�n=��چs
�	��	4v�,;=\AΥ�7,�^d��)>�)ƃ�Xp���Zx'x�Y�/�b�S�l��1��rr��w�Fr�ѕ1��c���5{��<�O��G�W"��W�O]�d �^#b�u�u{��1�3�*޻:�o�^)L7�<:��>;Oa���	(˛4�e��8�ʆ�+�Pҥ1niK���zJQ�6z�ŷ�5F;�Z&�Ƒ�S�3r��E�Y���9у�X:珥�#���5������;�����l9���&9�� r�-0;�����,(�X���q7l#�(��'�ŘSW����M p�dS���9Xuv���JO��h�	�s�ޙe�r�N��-\$늍�/18�Z�M#ׂ�az�-S����W��9Hn���<t}�2e��k�e	���c��.��r��T�r�pcu��o���mܜ�M�;Pb��lV�-ގa�E��G��
�v�W��
;u��LJ�f��*ɹ�6�@β���Aa�kV͞+��Nէ�����`�N�r&?��{�P�i���{��L7�sr�Ϡ�rV&��9�3A}&LG����u6���q8Mʛ�-R]X6��Eh��Co�s:�B��W,��%�d��Y�,�t��r2�7��ˏ�x�3������06(���p~���O�n	�$�|�c�1m4jrtz��t�fض�xaT-Ɍ�|�,��9Z
+P\�7�F�AK��Ӭ(�eah�9�Q�B�Ɔ���#7�0+�4�X�Q����gK�f�59��a��l�;gvyؒ��0'��$����%�S=�������8���҃��'!G�,�(��RBL��t��D���h�����8S<➌�āy2�K��ddI�`c�.1c�*nCr΀.)�V���ʠ�e�Y����ř��S]n�����q����w�r�]U�6]xYR�\�kn����%�p�D4T��p�o���j/�z��q
+����zrZ��DR�e�6ǿ7�6�_�x�^!L�����7�n�L�5��`ʅ��m�ȽՕ�)����ט&���pV8� ��1��M`YD�:���a���&l;��E�s`:�vA��Q���i�Ŧ�.s0������a�a�`�(�ܵ|ˑm�C�k���k[����Ł����Q��6��ˆis�� �%�sFz���&�a�Zl��1�����������f�����d���?�f0-m=���L�e��?����ʢ�3]s����ن�>->"�Z���oEi�@���
��(O�e,�f�U��0?��Y
2K	�cS�,Y���72##{��dy�إ����K01x3����W�{Y�s�X��9@1@��X��X����~��R���Ѐ`@"�[u�%`���_㷞�y�BG��F��I�U_v^����C��԰�b�p����i�Nt*t�i=�4}����]���9N�y:Pݝ����^�Y�З����6)�U0�o�߮��?�[x���w���q�D���i��٦Swﭬ#��
^������`�T���k���$e)kva��~Ś��jSwϞ�|�vחX��h�����AҚ/ئ�N�k�r�0�4�H�";��Dk(JC���ٻ���WO����~	�D����p/1��q����ٸ�������a��i��!\J���U$$�a�λ���ph�������o� �@���ê/��T4U��r�'<L�`h�o�E�������u��/�ӿ��{�M��?�J�6}�~t���M�O� �k�۵����3�z&z�v�B0� �lZ胆!�l�ŏ�+��=X�C�}&^���P�
ӝ�J(J��>�ă�$F����BI�
+�$��S�+|6G�vo<L/"�A���aR�0�0��0����\���I����O�������`bT��)/�m�0����Hb
+�����>�쉙�����o!�+���i�&8 ?��&�Awl�72l���ȉ�0���"����a��KK��r	�A���>�X���b�����+��ߞ����J�v�,�ZH|U��!���a ��f��wN2�φp��w�U����jk���R���G[��}�}�ђ�O#n�xY���2RD;!�7c
+��&x�^LX���m�-ҌB�\C.Y��Yo5��`g�"x 4�b�Kf�{��}� �x�w믜o1U�2��&
�
Lq��MX�r�w��6+������֟��D���#��,n	�ʖRj��i%��^��σiU��cV���O@�����s�ƴ�a�$y �᫙�ɛb+N���
�-0����
�F��E�7�Bs>Y�-G�*�P�����?
�O�ki��ڈO��)�c�.-�3�G���I4hP^Oi�&��0�$'���c��ݣs�r
+D�&�;���A�)y�W�H������lܜ�����Ƃ���n��м�
��z
+��X�]�g⓰KS`����ަ��[	�EP�K����y��W?!~&��$Gzgj�Ni-]��-o8��=1��x`���MY��rD{X�2��,��|$RG����i�e
K#�3����5����!cҔ9IV
FRs��"�ذM��E�M\�����ԃ����֏�$4�R<k�lR�@8�e�.��P_͐�:�AF�n�:ƴ���>�>�X1g.�ݲ�,��6�*V̱�b�取��'���bs��[m�Qvq��B_[8��d�h�U�	��mա���j`�v�4@w�n�J1�i֋�,ͺݐ˸�Ov�RElq�>"#����N2f��;O���P��������z!�0��^*L�zt�y�~��
��,&&&�S�x�x��H<L<L��a��`���x�~��޷�����0��)(�����)i�ſP��'�QB������a�gZR��N]�aR�0�0�t����^DRa_�¤���K%-M����>o�R��^&�qP��>�%ӕŪ�Uo�V�
0F�e����a���^&����T�fL����
+F��nrL�na��ARr`�G���w�-��Z&��.L����Y�SX��„O�2�[�>n���p�J�L��Rd��;�8�����1<<gu��à
+<��h�K�m�e�ξ�]�50�RM^�a�^&L����~��A7�^�������A��^P����9�`�x�.���y�.���_�~�z>Lwqp��ó�����k��c9��W�;���sBMdFMI�������N�Y�OW�~�\��0���oI�t���gϠ���k�m5�栣�_����}�VӮj�j�~�����+���L	�ΰ�����.��í#ݯ��zB�oV�e<nýc�Ṃo�i����֑	Z�{[�q0���ר��͵ĺ�Ex���"/,ȁ�p�k䐕ír�煮b-+���Ovv�6u��`�z�y�X�e	��e��z�34�֋�3Q b���[*T62�
+�*��,~�S�����0=_�:���c�a�9�?N�a�Q�0��z�<=m]^D�z�x�z�@s��}y�=HS���/��.�+����.3[d1Yr8Wݥ�t�"�����T�.R�&( Hѳ����,(Q�b�b9{�&�3͋���.��,��L��0����{���F�~޼y�7���@�܎� ~]��`�+_lI~J�叡���Ǝ���ؑJ�~�h�뾪?{�O�J��p�߲�&ZiĔ0){��3)6.�*��<�����9��*iK�0}c/&=�2|,{�"I��j�H*aR��I`��BH\��c'�i
+p��t�.�2l�r�U�*+a�
+���75�~�������ٚ��D��
+n��W���˘�0
�����?�~ƽ��c�2�Y�^�/S���D���x�vW�4`/����v�D	hs�ק1�o3����~��4�Z�&���.=L^~u�����_�~9���?�k��,��U	�3`�<𘁌1�J�	Lj�����	��p������s�M�Ù��_�?�����e�[.=��`¸����B��4���_����^-��s�DW�n��A���mA���e�Gk�����}~&���������{�>����]�.�=z���s˕J��@��
+t_߁�1�6���(E�a�������'�I�b��}{_��h�,������	���ڶ��]��	��/��X~j��X����y�J��$�Y��<�~ y����!Ä��-B4�n!*<���{�ͽ���W�۶�w���ǡۇ>�YӶ�Ԛ��6�^ѻl��5�t���j{`�f��˫z+z�J�aoJ����~��0n��`:������ώ�X��֌�Qq��Y��#���bV\�����3*6F,?�����=w����|mj����������^��(z����!׺�O-T��9�5�{��9��bz/��~��Ɔ5�����m��yIۧ���g��aoJ����W�}{Ձ1�?�A�f��c}�kJ�.um�z"���ɞ��h[�{����$�t�V+i�6w9O�3�r�C���Z�Y�����$'����1s?��Ҹcg��嗅��ݗ��s�
+�o~�}��Ms���7���)<uU{לE����x���ݻ9~�&`~�<���;b�C+,C1,�����4��KPܗ�W������KQ�$����w`����3�7ԅ?&Fb|��-K����w����-�LZ�'��m��镡�G����mF�P����|_S��������X���A�at��,���U����j��H�����
๣)a��`b��	�I��ȱO��j�A2�TԠǪ=ߟ��H(�2���=���,�������%�$�\�n
@J�m
+t����S`.��6k30�WAG;��C�a�>$��T�Qp
����W(�i��bS�)�G1��<��.ɳz���9:�#x����`h$�����X�KV���`�u��#Fi̫���W��$�X�/��}����%#�2�4�{,>���zS
+�Q��?���.MK��ָ�v����|
����=��鷩Ӂ���u�N3�}4���b|�X�nˤL�FBc�E�0`���P}^u3��z\�Ք	b#U����m��Q����9I���E|�	$��U;�(�!΋�|x���e>|
.D���	ЈK� '"k�+�)azy0�x�F���6�	��^�cer�B�om���E��e�}%Y�n�i^>~G��68�u��?:ɳ��/q��f�K�wa��B5��}����t�bIe�Ǜ�^{�U:L��n��Y��e���.}{d�'��d�d�w��L<y��V�w��j�p� ��+.��Ґ蟛m��R��n�<gm1bȱ}x�B�*����A�j�j?�
N<���&p!Z즙$G+]�[���㖮oV��Ra�K~;���BvQX��IؼuvY�W����% �4k>"`���Kv]0ɇQ�wBw�u-��m������>k�W�ԝ�{e�A��pc�B����U]va�oDk�.;u������Y����B,�۱چ��K���>�/j’���b+�E��|ٽ&8��cV�}:ꏬ�L�>LK讜��I����&tW��h=���(6���~�˜���K���MI���u��G
~�SrC��Y����p�ۚ�t2��^����Iӵ��X���|�U0�e�L�-��[j�J`*FX�߆w�O��3swYx>� ����ntXi�U�ZݷMV���,�#w=�a����>Y��奍�΁�I��}I�u��
+
+}AE�E�}��I����7��I�^��dq����IyQU&��z�H�4٤G��w9�VĒ:�6-�����\��B�}'@M��}=9�Q-A
x�8��Hu
!(E�1�3�Z_9ʆ
+���%�!8�jg�����Y�6GSb�|IJ��r��*%�`g�염6���<�%38�3�d[�7|�ˆe[��Y�,N߷>�3�k��.j^}�wN�]RFG��:�P�i�7��&9p>�pf���gG����%MSR��P�J�v�:k駤�j�<�PS�m�<�%:�zmhV�@�bid�84�jm`�M��lvh�Vf����^g��uD ���u��Hu@�Vs�����Īn�nF)h��63�ε�{���]1�(U4��o)M�HJ�(�+!.Gm�q��(�>��;Z���ך�cGi�⬡6N���|��Q�#�"�	b�Z~U�F���W��HƩ�*Ŋ�=靣��P�X�v�
�� �9f��k��G�P��**U���AQ�j2��f���b����2�T���9��ۙ���U�Ԝ�L�]���D<@ON1�R|��TU��;ŪJ]����oLU�h�4�eMЍQ5�?/L4|�U_w���WƮ9�fg���1=��vp5ܘ���D��YY�M��Gq�`_���!�Ds%�'���d��c�"�2�r��к©�S"@��D�2z�!N�½(�T�O�*�#��P 4
+ҩ������^������d�%� ���2���(C(�ˤ�\\.)�y\��$�"I����)��6�Ɲ,��c&h��O�7�M�t��ǏŬ�#�v]2RS���yi��X~S�b�̀ޞ���]���ܻ��囇�
+�}���/�0���yf]=p�E�3$Gȋ�'a"rf}Uh�Y��9�vo��G��문[rp���0��7֮x��^��sl���m�:�|�g_�|������0���alO���a���~�Ίc�{�v}m�G׶�صq�-$l�u{?B�ƹ]�&�8���صM���Y&�v}��oCᓅ�a�&u7��A.sb���\L/����c��hZE��?����\�ʸ5=�{��x�ٱ�"W|xd#�+a���P�7���.7��1D���ߺ&�d
BC*=���7��z�s��C��
&>��G��黍����!XE�t9f綝�	�X~{��OIoT��kv~")i{��{�Λ�	L��J���e����]M7��9��mC@J�T�T�� wm	���ŀWH=���X~�a�ݤ�$&�����F���@�l�A�/aq!<���B���pqC��8IH0zO2�Bab�<_7{�
(
+i������
{$:%���v�X�n��ՌS�!�q
+�d�v��Z��0�g7�
+o澭n���,Z���Ŵ0.���ݐ�%�g/�q��<j�9&�8�措�S�_�O(5�l�j����q�o���s�U��1m��f� ��=�CCuL-g��iV���Y�5ɘ40H�H����l*3�"+��L�� .����@�M�|K��@!#a���B15 Xɑ5N"���]J8�
m��a%̰�*L���2gYY�6�Oĸd{5��A������I%`U�=I��64�i��]vd{��\B�k�81��D��WZ��ě���~Av���~��������ﰞ��}�A����߭^[���s�˻�Yd�jiَ%A&9�g�ŕ�[f�o��'�,�WG8RO���@�?�`�Wj���-�������Ms�9�����oL�Z�S���U�l�Kk�ر��3�d������W?^�����삐���x?ss��պ$�a�a��e��]J臛��}	}�,5¸U�{��e�{��rJ�����!qɄ]r��A�<�~\8/}�G+����w��ك�������]�K��ޕ�Xz�����fވFyu�X&�����@�z$N+ח�㴎�bK|\X��pٙ���hSk!��#���\
��X.p�9_\�{��Ub��;��I��{�>�{�Mx�=��:l��l(��y��^��������Qi
����ӫlC3��ǧ�M+(^P��/AlR�V[$�^i�ye�_&e�d���ʴ$_�}9�NZ:�&�ۊ������o5�s�s�`R2�;�
+��Y�[ȸn-Vs9p����F��߯��&'�7ط�3��;4�c�z�3�3<4�<6)�I�{݅��0���˟Wd���7�2a���8?!X��7?���e`���-<ٔ?N02��ԧ�f�A)�O����)��t�W���W`���HP������#�oYc��DsI����FRH�G-���/�}}�ԵG�Ό_����}�W�1�,c�.�x���8>��'�E�5㢾�f��������F�-���g��oڠ1S
+"��
�`m�2XF��`���T$�h"�Z9.Y��K�I�b"��5UƎ�����M�p$=�R�|2
+#��T�ԓ���$��M�1
�p��'BGe=�?T��j�D�Lf��(�]�1y�pqYĠ��V�>�E�j�vE:\q�͠H��6��Cb������p� ���M Jb�CXYL�EYӦ9L����4x3�CmK�0������XV����`f�b���"E3FP��9M�$����+q�hO` Z
+g���~�欫�~e�B�<X}V���H�8��P�!�x8Xm��I�L[�qq������{C�<�q^&L|�`����)�Ny’L�W��9���"�I�9*�t���+�=
�겪��(��K�JQ��V�ɿY45 ,���2_L��3S��`�Z]k��t���ש��2	D�lo�V��D��8� B��9%�ɛ-e�S�1�#*-�R�͋�ɐ��'-#0��@�(���b��Y�w�f�j]�+cU�0�C("gj��8�;;z���}�C
aF�E�����)���択	-�W�W�viYAr����Y��ׯ�f�{�}Z�I��uw������<�
+M1s߹Q�Q��0��.�1�s�H�>}噲y��M�����1&Q&�7�kX:�%�۝���
+�W_��V�\��Zߵ���ӳxL�����(.ޮd�,/�ٱ�kXM
+�_��8��3����l�sx�w�I��,���L�n�D��>���3��9�0
{������2�K}� L{p��;
+;
+�hM�-����>L}�E���Z��!�p���bl�/
+Z&���Y^�K;����:�W��'!�	��:�j�6�|�A6�,^�Z�;Iz�,K��D�������́�
O����SgWZ�X�H�a)��<�]׳��f{�$w�[rQ!��8m�߹i���x����%[�4�uh��T�fc�U"���Vm%L�^6L[��='C=&0a�:�˴�W�s�_��v'�uy���ݲD��䥇�z���L�-�`޸K����O���W?��j�H޿b���~�r�?�w+G����x'��:3��^!�g&�m�-��`���skc)�}֝ey��p�âI�Zj�{�����>΂�E�����X$��I
+�>�9����}�7��ϒcI�_��1��ps�������������8{�0	�\��#���X-̒G���Y'���V���n�j�!���.�gU�m�&l����.0��7��ҺS�}Bb6�óNo�~�ry�u�z����vyg��EY��\G�ʋ���c�F�u���N�8�@��y�{�Q��/�U��!�Gl\�~q� qU������#S'��3۲޻�{]�[��M�Xm`�;W L	L�˷������0q��a�dú���p)�_�j
G�Z
+FZ0�-|MUTFD0c��s�	k���S2;	U(���)
+�8�1EM��+��j샑�X'EKQl��i%NPS�I��a<�V]�j"O
)�<�L�;�|��8U3�]cƐ}CEcC�F��Vb�R�!�4_O�Q�vkS*#�be�	�8Sr��)c���|8���IW�x2�H�D��e�L�%�E�1 &V�AM�pjd@ėP���#�B��ZD|	ǘ���{FLAE�Q�o�O@>��A[�(BC,�dRC@�����Yq
10�#��3#�,	��L�J��e��)?��c
+��a(������7���Pab�PC���U|_�h���?{S�H�C���*n��{&�-���ii�/�ɀ�(=�V�10T6Ħ�)������� P��^��)�0Z��73����tfy�I�K���5��f�����O�yF9_�J�n4)�i[7vGRi@b�ۺ��4�(�&�=����<�W����d9�lN�~���M7O�����u�)���\	��3���������>焯�x5���N��5_�k����MJ�^
+L�l�=�����<��%u#敧��KLҌ�s���]�����)azQ��8__�s�B^u3��|Z]�$�˜c_ݬc�@C{�ի�u��$��@��9%�3$���f�*�LJS.���01|��g���*6��hP�����Z��5������ĝz�i���)a�Q`bT�����xp9^��S<��%���X֘�,lv~��X���hVb�Y��d ��D�H1B	KѤ���(2+bݿ�H��c0��i�0��)�Y��5�G�g`��U����C�������OuܭX�{tH3�1Yc5w⒨8������aUbt4��ݭ$$:@g����?��!�Ľ!����B�� �9~��5h����o��u7f���;o�#f��MP��5;o7O�y{�%������Sc�v���]�$�9�ImšCg%;{O-�����Q�4t�F�ا@��b�`&��܍�9�{[C�GUm�<z��E����?Vl�Z����(��Us{>�Gϵ�պ>j���X�s���m?�������{��s�1͞��3�cA]	��a�oa1�^�/H�����׺>�އ6m����/Vܟы�Mh��C@�J��������c���\�p��ͽ����L?�)=�V��5�S]������]	Ӑa���U}�`�Lm��:5��rIϩ��7{?�Z��{mgIϴ� �o��}�^�5�C�f�������c�>:������G����8�s{�VlT;�9F�_س
�bE]	�Ч0�>ŗ�Ω	8���}�֭���͊K]���b���_rK����fM�G���O�|��ֲ�[����v^H�:s�u]s����A@š[w%��	�Xs��15�1LJ93�������`50
+Yc��
+�j@I�{+>�ܽ����#�.��{�O���8)K	�ĸKH��0�ؑ����H4�Mf
+�G���w`��o�����w��A��4�cվyXǘ���j�VU��~�|��Xژ�0�E3v�>&�9����k�h<�!��X���#d��؝�D��M��aRʙ�����_ ~�ڦ����f���z"��^�x����y���>&{�)�JՀ�o��
&�~�XO�]���oOE
+����L���8+���.(�[^��!?����(sɑ�0���],��*�pT�|2>��Y�3·T���Χ+XT��
+8|���z<�_�k�'�
T#�o�W��I+Ҕf���؆���GR����d������h�)F�|Y3�	@*��y�G"C܉1JwЁ)���+^��M�9`���/�#�X)���+��gy�����;@	s(�B�<:��A̐K;��"���H�.%@n%F�2�C��֙��(az90��+p���z{��y��]��XT��d������ĸ3g:�#1�a�;0/�oקo����Un��V\ukor�C$o��K���ԙEQ����g&����s"'׻F�xS�B-��������I>�]��9	�l��Y�#�$Vzɾ̶�p��K	903���d�52���JL���V6/p:Zm]uَ�p�V��)3�
�=KaT��#�C�<Y�>�gr^���T	�ˁIl���,�РH�u�&'����;�ۤU[�DF�9izy�}�����<��o���+�ѯ�⟻�F�Ͼ�.�kI�՘Z�۷Z�k��7ɇ0 8��s�G��I~���z/�+6S�X�N��&o���.c���U��;<���f�2r�~�6E�X������e�d������m*��f�/�~'�\��s���N��w)�Lӷ3w���Y6��&G޿2]q�e��fo?}~i��(az90����Ev���?�ɒ}U+��8��4��j�t5�cs:�"�����vF�K��[d�K�,
۫G]�e�>|��tV~��?�/!�ɳ�
+�rX����\�E��2'���&�~�h��p�Z�W�������dy
��	Ð�Є��u:IW٨�)���Y6�lc&��bԗ�j�������z,)9�>2�®���]��,�J7G!����4(g��6l�i_0L�8��&�����>��]���j���-&]K�ȵgv�#�)�+#�(����k�KْB���ޮaM�,�]>�;L�W�[�;�,?�k�<�;�p�Jc�(yd��	��[��_;�™�o?����w���+���Ts9�r��x��#ƌ�;�g���?���~�����O�MwY}!M5<e�k�/����!l���q^o���.�㳥�N�4;�{��cƶ�Y
�U�j��>��煉�x�����r��y��H�*����`�<�݁������U�]�F^�I�Z[W'�xs�W��Rt�?�xq5:�u�3;�kZ�]
+ߎUt`m�^y�M����֖��Fgو�SH>E�@�m�͢j��<yq���P��L�gm)[.�Gk��?�ó�
\�8�N�1���,Pz(/e[��x{N��dx~I�lS=D�M�b��W4�ӛg�m�k6Yf����6�:x��v�
+c��7�=������#PY�ooO�9\�.��cE,KKX�/�8>5S��,� e$�n�b��z�F�����‘/KA�
+�2\�/(�,��@s�8\���{��,����|����$k1b�\^ �yhn�I�e �����u\\
+��L04����l/e�����R�g���3�|
�@%7W#�LƵgt!偘3qK��nN�[?��3k���9�
D����Q�n=��@D�|X7ؘ�X��ZsL%�,X��/1���特!E�(C!MS��*��	�?����Q���h\�Tx�~��cp|H��Qu���|���*�@�<�&_<��r��`�k�#ΩR.$�qi��G�3����\JH��$�E�<�'�'�n>��&R���@BZH+j>L���3�{��������t]�'j�����Pq{���=�8ts/=�ܮ[g%�
��K\Na��#�43��0���܊�>��,F�0}���ѱ�s~�Pq�vͶ=]��n�>������Abs�2��s͍
����\�1�m�|��XV�ͽ`�� r�0�-��7�3�^�Yq���
�?��H��*>/9x��5s���q�<LAt_s{w~���|�k�U]��
+�����(��OߪOя�1���/�`�^C��*����ܳ:O�{�$�t�W����V��ꬸv���7ڴ=X�f]���m�4$8	�V��� ��eU+�'�Qm���.���#0�7���[�ՎR����_ayf0�o��4�S�!}����4��Џ��Ɛ��=r,�}��0^!g�se��:�/�����m��]��.�(D�3u}��B}�O>e���;Bt����dLŰQ,������k�=*V�KF�Bm�0��p�!#7�KS����$\f�L�˜�p4���0�#���:lV����y�Տ��S�NX�{۶apO?:�6�)��j+�c
+���|�3PgG�(��X�.�9`���n!�*���:�N��4+bk%:�%lj��c�I�#r�dYC6@V�vܤ%�7v�����!��W��o�S����Z���N�8*3��9�,Z0A]:�������o����jr�t�(J~�-�ш������/���09�C�И]*m�Ѧ���Zy���m����"�ؿ�!�u�Y��,��_63��3P��7�mD.d�[�˳�#�y����y�c}�D�
+�fZ�3�_&)*E���R���|D�%�6�<u|��k��:��6�h~Uc�9�Rmx�'g�� x����X�h�����(D�Bn�I!vf�FȲ3nQ+�#�8̧‡
+�o�?>�!<�3�.�V�%��(����gJ��cm��T��rll��g���]z$OO�ٙ�D��(�֥�q�YM�I��.I�b4fٺy��j�9sR����߉�MK��!�#�i���Dh
+�o.O��	�q�g�O�;�do�#��&i��o-����4��!;�W��sZ�{�\!�͋���^x��gK�<s��h�U��|,�d����5}�&��k'��%<�<���	�ӓr構����*�����p|��������c��I��2��Ѧ�k�C�:����B���~I�3�K���K�"OZ�e��[l}#
+w��F�k:����.Ll�no,+���Mo��z�z,�P��ǾS�w��)d�-9ڎ�S_N�0��-��L���[�Q~�1v���ڻ�W2�!�^rZ'��͎la���Q�q#-�wr֚���ƙ�h=+[����V���3�'k͇
��#�?�B�+/<d��[�~셾¢:�e��:�2G���B�nˤ�;�]�b✸+&� �(��v"D�4u���9��׮m�^so��1F�5��N��\�M�|{�_��������
+�[�
+��{�Ĥ���z�ײؒ�[{���d������ש��p�;S�}%_��[?b�.�y7���g�ه뺜:Y�aw��s��زqgN�j�)n���>a9�����+dN��o����A+U/am��L�S/�^u>�6��B������b��pKW���.�ɋeK��r~+/�[PP"0H��7�9�:,��t![�ٮ[H�F�F�E�oG����[��sh�
͏���02ɟ�`%l29�*���
+e���ה'm����g����/#�s6y��{:�=IJF/y����ԉ�B����G�[w��U�X`7��ܛӸ���g���C���
+a��I.~iv'���7�
+b�ИT_��/+G0䞉/�_�h��?lKbZ�N���jj@�V��V�-��V�m���G�ZA�۪�u
�׿i�j2����5�g���$S�o}���%l�j)n�>�b03E�
+)��Xk)52��R�2l`�G���a�R˨���{�4�BJS|���ZF[�~�%����s	�kHIxf$��ԡ:�R��@��U���_O���+	xùV�
V�Ά�^�;�M|=Ӏ��y�S!���6�k!e~�f�.��%�����z�����1ż����`@����=��+�'�o{[-�u���:m��[�WK��hCy�WK( o�M�(�ˑL�h$$.�	H��-hHf�?[�m�mٲ��{��m��t_��{�w�wOo��s��w�qgH�kk�!�$ ��@�-BZE�Y׀�{�\Į�'e#���!rm�z�B> d�Mq���j8��]1!�[荐]�Oʚ�XD�On>����a�x$O�Rw�cR��`��)��Hl]d̆>��G�a��/&���N%���聬kn\�$A|	���2�€>�<ʓ�ɐ����:p�L���n�]%.���� 7�.fa�Hp��V�鏐>@�{�7�^�:�z�f��SQ��������XӞ\Ɩ��x^I'��	��o�S���=�����	�1
��Nu��pk���1pG�A,M��E�60`�s���@�	��զ8HRTg��MH���#i���諸v��=�4'��B��z��Њt��������vSئ��d�#�j̈́oq� I�D�$>�����,"t��2Dp߈�98@��;$�����X�p�v��Q;/ qd�e�L�Uy���5�Ѡ�fث���_+K�Vi���&d��T��	iW�������Q
�P�u�;�4_(��?�N�J���I���(�Po���N����u<�ؖ^�ߔ������5%��kT�ڇ�A�Xd��
+�U
+y��`��J��θ�k�f�a_w�P:��s5�(�Lz��Z㼒'�QE*�����1L5�['�/���A���l��*����D���%������6G���`zX�ɲ�fk
o���,x��-Wf�Hc�p�ݬ���hy©1���u��̕�T�gV���.ցR<��{,�w- en��@㏥�����W��3Vpź{�U^�y�m*��+�sO��>���Gwcb�����<O|?���M��_D�<������������֑[S}�J��K�i����j��Q�VuM�~��!�~�L�?�
+�����=9�L�)f�?��t�,�X~驮���Z��
+�e޵���jpE�k�>����?]��3����&�W@v���cf��l͵Y�Ɨw��ȁ�}	�(��vʋ�4b���v��1ez���XV�G?�&��+<��J���2���|��'{߈�~!�<��@���b|7?h�1�o�����m��=��nUG���̪x��ĭ��1�.�3�h��ρw;yR��A'#��R����'`�����4�O��H�{Gvj\S!���G	���ꋿ�3}�4�8�Ygt�g���jzik�Pr�AЇ���ԝ\�q��ʍSu�vG���3_��5��k�R����l���2���OLI_ܲ"@lt�zv�9�B��1ĶjN�bl	��l:��M�e�j���$���Tu��ޚ�暱O�KЫu!���{�"�Wԩ;�$;��`�t]|q���jj�+;�c}��G�����Ϯ'��q��܀]2�"ٰ�m�j�� i���M����T
+该*�~&%��Ex�d-x�#������(Gv���X�I���8���6�*#��i1��B�D�r��z#��&�%����;L!Z�&:�g�mh�@M]�q��N�9���(N�j¾��;c�RSG��B[�3������n��x}a|[����~�<���������>$��DeDud�J��a
+�9��-װ���j?�x<�L�(%�}�s��m�H���r�@{���D4��9W�&=��}�.Sƪ�d��P�uuZ��:��%9��#��TA���*Lj� ,�6�|9�ůp飓�����������Z���cmf�&ϱ.g�����
+�U�t �:s7�u�]T�M�ܑ�!���3Y��(���}�1GeH���0�c0��!�S\�v�M2�X�:�!#�kɵ�� �&eXS3��3 am�\�����9$kQ6`.�p=$2���'�<�5��\�
+���m1'h��	&��j���Þ����o�Bډʒ��]�Z�k)����b��'49��<R���h��VH���\���D1V]+H�4|��Q��5WD�%8'܈�m�p8E���_L6����S����;#9�g��=t�׵�_��]�'�/�p���둕����)~
+��������)�_�u�t��[����wLog�I�wLo~�{Ƀ�ӑYP)��\a
+t�=�>�#�ⱹ�1��V���/N��i[��<=|<¯���\c�P���(�0ȶh/��Wy�n�������*^9�^4�9L^�{�U�E��K�
r�O�v������O�l��K�g��&����î�
��
+�����^���1�s�>�Ն�z��-�� 0Q��U^�{��)7^�(D�W�i[w��
���] �c������9���r�ݻ�e��Т>*5�t4)7`��`z��|9k��oȡ�+��j�LG��)u����E�[��`R"������
+�Q���k@=���1`g�5-��)�8����~䀄�R�$���l�Ū�]�ٰk�i�)ZA�X���>�܌�����}@�������8
+Ƌ���v�LTtD&X��=m�͈������W���ŵk���7�%X8�{���8�Z�W崌�
+�3[��ƀ>U�H��2��ז�U�:5BJ�����f��%ԬJ��W���?����=��F���;���n���V�w����0���N��������wf��U�N7��Tr)��u�M�#bئ�'gT�]���Wj{c���[�»>��f��[`Z0i=�b�KWbx9Eo-�΃��XѰ�hk�3��Jsg��D���r}�Lli�=i��K�z����ʳ��A����3�]�~�A2�ڍ�Ɗ���[�i����/����+�
��J��vy�鋗>�)�ۭm����_M��}C:����&���$�
+��s�cR"�=k�����2���|
+5I'1�x�=����5;=�FU�ד#��L��h�qMN!��dL��eǴZp�J_�������h�2 ye�[��-K֎���ӳd�=�$A�9]���{D�FM��v=ݥ�m2$m�镀���Xz&:G���J/��E�ք��{	`"��M{���v�$����`��ܳ3
+=����IEND�B`�
\ No newline at end of file
diff --git a/web/themes/seven/seven.breakpoints.yml b/web/themes/seven/seven.breakpoints.yml
new file mode 100644
index 0000000000000000000000000000000000000000..1b6bd2fb43ea8253ebd54827c7f528d0825963e0
--- /dev/null
+++ b/web/themes/seven/seven.breakpoints.yml
@@ -0,0 +1,12 @@
+seven.mobile:
+  label: mobile
+  mediaQuery: '(min-width: 0em)'
+  weight: 0
+  multipliers:
+    - 1x
+seven.wide:
+  label: wide
+  mediaQuery: 'screen and (min-width: 40em)'
+  weight: 1
+  multipliers:
+    - 1x
diff --git a/web/themes/seven/seven.info.yml b/web/themes/seven/seven.info.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a88525b455ac58e8a47de3de85f9f172b18a3098
--- /dev/null
+++ b/web/themes/seven/seven.info.yml
@@ -0,0 +1,94 @@
+name: Seven
+type: theme
+base theme: false
+description: 'The Seven theme from Drupal 8/9 moved to contrib'
+core_version_requirement: ^9 || ^10
+
+# version: VERSION
+libraries:
+  - seven/classy.messages
+  - core/normalize
+  - seven/global-styling
+libraries-override:
+  system/base:
+    css:
+      component:
+        css/components/system-status-counter.css: css/components/system-status-counter.css
+        css/components/system-status-report-counters.css: css/components/system-status-report-counters.css
+        css/components/system-status-report-general-info.css: css/components/system-status-report-general-info.css
+
+  core/drupal.vertical-tabs:
+    css:
+      component:
+        misc/vertical-tabs.css: false
+  core/drupal.autocomplete:
+    css:
+      theme:
+        assets/vendor/jquery.ui/themes/base/theme.css: false
+  core/drupal.tabbingmanager:
+    css:
+      theme:
+        assets/vendor/jquery.ui/themes/base/theme.css: false
+  core/drupal.dialog:
+    css:
+      component:
+        assets/vendor/jquery.ui/themes/base/dialog.css: false
+      theme:
+        assets/vendor/jquery.ui/themes/base/theme.css: false
+
+libraries-extend:
+  core/ckeditor:
+    - seven/ckeditor-dialog
+    - seven/ckeditor-admin
+  core/drupal.autocomplete:
+    - seven/seven.jquery.ui
+  core/drupal.dialog:
+    - seven/seven.drupal.dialog
+    - seven/seven.jquery.ui
+  core/drupal.dropbutton:
+    - seven/classy.dropbutton
+  core/drupal.progress:
+    - seven/classy.progress
+  core/drupal.tabbingmanager:
+    - seven/seven.jquery.ui
+  core/drupal.vertical-tabs:
+    - seven/vertical-tabs
+  file/drupal.file:
+    - seven/classy.file
+  filter/drupal.filter.admin:
+    - seven/filter
+  filter/drupal.filter:
+    - seven/filter
+  media/media_embed_ckeditor_theme:
+    - seven/classy.media_embed_ckeditor_theme
+  media_library/view:
+    - seven/media_library
+  media_library/widget:
+    - seven/media_library
+  tour/tour-styling:
+    - seven/tour-styling
+  user/drupal.user:
+    - seven/user
+
+quickedit_stylesheets:
+  - css/components/quickedit.css
+regions:
+  header: 'Header'
+  pre_content: 'Pre-content'
+  breadcrumb: Breadcrumb
+  highlighted: Highlighted
+  help: Help
+  content: Content
+  page_top: 'Page top'
+  page_bottom: 'Page bottom'
+  sidebar_first: 'First sidebar'
+regions_hidden:
+  - sidebar_first
+
+ckeditor_stylesheets:
+  - css/classy/components/media-embed-error.css
+
+# Information added by Drupal.org packaging script on 2023-05-09
+version: '1.0.0'
+project: 'seven'
+datestamp: 1683652108
diff --git a/web/themes/seven/seven.libraries.yml b/web/themes/seven/seven.libraries.yml
new file mode 100644
index 0000000000000000000000000000000000000000..72a214dfccb340329f104210db7413655e63b0e0
--- /dev/null
+++ b/web/themes/seven/seven.libraries.yml
@@ -0,0 +1,259 @@
+global-styling:
+  version: VERSION
+  css:
+    base:
+      css/base/elements.css: {}
+      css/base/typography.css: {}
+      css/base/print.css: {}
+    component:
+      css/classy/components/action-links.css: {}
+      css/classy/components/breadcrumb.css: {}
+      css/classy/components/button.css: {}
+      css/classy/components/collapse-processed.css: {}
+      css/classy/components/container-inline.css: {}
+      css/classy/components/exposed-filters.css: {}
+      css/classy/components/field.css: {}
+      css/classy/components/form.css: {}
+      css/classy/components/icons.css: {}
+      css/classy/components/inline-form.css: {}
+      css/classy/components/item-list.css: {}
+      css/classy/components/link.css: {}
+      css/classy/components/links.css: {}
+      css/classy/components/menu.css: {}
+      css/classy/components/more-link.css: {}
+      css/classy/components/pager.css: {}
+      css/classy/components/tabledrag.css: {}
+      css/classy/components/tableselect.css: {}
+      css/classy/components/tablesort.css: {}
+      css/classy/components/tabs.css: {}
+      css/classy/components/textarea.css: {}
+      css/classy/components/ui-dialog.css: {}
+      css/components/admin-list.css: {}
+      css/components/content-header.css: {}
+      css/components/container-inline.css: {}
+      css/components/container-inline.module.css: {}
+      css/components/breadcrumb.css: {}
+      css/components/buttons.css: {}
+      css/components/details.css: {}
+      css/components/messages.css: {}
+      css/components/dropbutton.component.css: {}
+      css/components/entity-meta.css: {}
+      css/components/field-ui.css: {}
+      css/components/form.css: {}
+      css/components/help.css: {}
+      css/components/menus-and-lists.css: {}
+      css/components/modules-page.css: {}
+      css/components/node.css: {}
+      css/components/page-title.css: {}
+      css/components/pager.css: {}
+      css/components/panel.css: {}
+      css/components/skip-link.css: {}
+      css/components/tables.css: {}
+      css/components/search-admin-settings.css: {}
+      css/components/tablesort-indicator.css: {}
+      css/components/system-status-report-general-info.css: {}
+      css/components/system-status-report.css: {}
+      css/components/system-status-report-counters.css: {}
+      css/components/system-status-counter.css: {}
+      css/components/tabs.css: {}
+      css/components/views-ui.css: {}
+    theme:
+      css/theme/colors.css: {}
+    layout:
+      css/layout/layout.css: {}
+  dependencies:
+    - system/admin
+
+node-form:
+  version: VERSION
+  css:
+    layout:
+      css/layout/node-add.css: {}
+  dependencies:
+    - node/form
+
+maintenance-page:
+  version: VERSION
+  js:
+    js/mobile.install.js: {}
+  css:
+    theme:
+      css/theme/maintenance-page.css: {}
+  dependencies:
+    - system/maintenance
+    - seven/global-styling
+
+update-report:
+  version: VERSION
+  css:
+    theme:
+      css/theme/update-report.css: {}
+
+install-page:
+  version: VERSION
+  js:
+    js/mobile.install.js: {}
+  css:
+    theme:
+      css/theme/install-page.css: {}
+  dependencies:
+    - seven/maintenance-page
+
+drupal.nav-tabs:
+  version: VERSION
+  js:
+    js/nav-tabs.js: {}
+  dependencies:
+    - core/jquery
+    - core/drupal
+    - core/once
+    - core/drupal.debounce
+    - core/collapse
+
+drupal.responsive-detail:
+  version: VERSION
+  js:
+    js/responsive-details.js: {}
+  dependencies:
+    - core/jquery
+    - core/once
+    - core/collapse
+
+vertical-tabs:
+  version: VERSION
+  css:
+    component:
+      css/components/vertical-tabs.css: {}
+
+seven.jquery.ui:
+  version: VERSION
+  css:
+    component:
+      css/components/jquery.ui/theme.css: { weight: -1 }
+
+seven.drupal.dialog:
+  version: VERSION
+  css:
+    theme:
+      css/components/dialog.css: {}
+
+ckeditor-admin:
+  version: VERSION
+  css:
+    theme:
+      css/theme/ckeditor-admin.css: {}
+
+ckeditor-dialog:
+  version: VERSION
+  css:
+    theme:
+      css/theme/ckeditor-dialog.css: {}
+
+tour-styling:
+  version: VERSION
+  css:
+    theme:
+      css/components/tour.theme.css: {}
+
+media-form:
+  version: VERSION
+  css:
+    layout:
+      css/components/media.css: {}
+  dependencies:
+    - media/form
+
+media_library:
+  version: VERSION
+  css:
+    theme:
+      css/theme/media-library.css: {}
+
+layout_builder_content_translation_admin:
+  version: VERSION
+  css:
+    component:
+      css/components/layout-builder-content-translation.css: {}
+
+user:
+  version: VERSION
+  css:
+    component:
+      css/components/user.css: { weight: -10 }
+
+filter:
+  version: VERSION
+  css:
+    component:
+      css/theme/filter.admin.css: {}
+
+classy.book-navigation:
+  version: VERSION
+  css:
+    component:
+      css/classy/components/book-navigation.css: {}
+
+classy.dropbutton:
+  version: VERSION
+  css:
+    component:
+      css/classy/components/dropbutton.css: { weight: -10 }
+
+classy.file:
+  version: VERSION
+  css:
+    component:
+      css/classy/components/file.css: { weight: -10 }
+
+classy.forum:
+  version: VERSION
+  css:
+    component:
+      css/classy/components/forum.css: { weight: -10 }
+
+classy.image-widget:
+  version: VERSION
+  css:
+    component:
+      css/classy/components/image-widget.css: {}
+
+classy.indented:
+  version: VERSION
+  css:
+    component:
+      css/classy/components/indented.css: {}
+
+classy.media_embed_ckeditor_theme:
+  version: VERSION
+  js:
+    js/classy/media_embed_ckeditor.theme.js: {}
+
+classy.media_embed_error:
+  version: VERSION
+  css:
+    component:
+      css/classy/components/media-embed-error.css: {}
+
+classy.messages:
+  version: VERSION
+  css:
+    component:
+      css/classy/components/messages.css: { weight: -10 }
+
+classy.node:
+  version: VERSION
+  css:
+    component:
+      css/classy/components/node.css: { weight: -10 }
+
+classy.progress:
+  version: VERSION
+  css:
+    component:
+      css/classy/components/progress.css: { weight: -10 }
+
+classy.search-results:
+  version: VERSION
+  css:
+    component:
+      css/classy/components/search-results.css: {}
diff --git a/web/themes/seven/seven.theme b/web/themes/seven/seven.theme
new file mode 100644
index 0000000000000000000000000000000000000000..144f7c53be0dfafd90abdf392f337129099aaf80
--- /dev/null
+++ b/web/themes/seven/seven.theme
@@ -0,0 +1,467 @@
+<?php
+
+/**
+ * @file
+ * Functions to support theming in the Seven theme.
+ */
+
+use Drupal\Component\Utility\Html;
+use Drupal\Core\Url;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\media\MediaForm;
+use Drupal\views\Form\ViewsForm;
+use Drupal\views\ViewExecutable;
+
+/**
+ * Implements hook_preprocess_HOOK() for HTML document templates.
+ */
+function seven_preprocess_html(&$variables) {
+  // If on a node add or edit page, add a node-layout class.
+  $path_args = explode('/', \Drupal::request()->getPathInfo());
+  if ($suggestions = theme_get_suggestions($path_args, 'page', '-')) {
+    foreach ($suggestions as $suggestion) {
+      if ($suggestion === 'page-node-edit' || strpos($suggestion, 'page-node-add') !== FALSE) {
+        $variables['attributes']['class'][] = 'node-form-layout';
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_preprocess_HOOK() for menu-local-tasks templates.
+ *
+ * Use preprocess hook to set #attached to child elements because they will be
+ * processed by Twig and \Drupal::service('renderer')->render() will be invoked.
+ */
+function seven_preprocess_menu_local_tasks(&$variables) {
+  if (!empty($variables['primary'])) {
+    $variables['primary']['#attached'] = [
+      'library' => [
+        'seven/drupal.nav-tabs',
+      ],
+    ];
+  }
+  elseif (!empty($variables['secondary'])) {
+    $variables['secondary']['#attached'] = [
+      'library' => [
+        'seven/drupal.nav-tabs',
+      ],
+    ];
+  }
+}
+
+/**
+ * Implements hook_preprocess_HOOK() for menu-local-task templates.
+ */
+function seven_preprocess_menu_local_task(&$variables) {
+  $variables['attributes']['class'][] = 'tabs__tab';
+}
+
+/**
+ * Implements hook_preprocess_HOOK() for list of available node type templates.
+ */
+function seven_preprocess_node_add_list(&$variables) {
+  if (!empty($variables['content'])) {
+    /** @var \Drupal\node\NodeTypeInterface $type */
+    foreach ($variables['content'] as $type) {
+      $variables['types'][$type->id()]['label'] = $type->label();
+      $variables['types'][$type->id()]['url'] = Url::fromRoute('node.add', ['node_type' => $type->id()])->toString();
+    }
+  }
+}
+
+/**
+ * Implements hook_preprocess_HOOK() for block content add list templates.
+ *
+ * Displays the list of available custom block types for creation, adding
+ * separate variables for the label and url.
+ */
+function seven_preprocess_block_content_add_list(&$variables) {
+  if (!empty($variables['content'])) {
+    foreach ($variables['content'] as $type) {
+      $variables['types'][$type->id()]['label'] = $type->label();
+      $options = ['query' => \Drupal::request()->query->all()];
+      $variables['types'][$type->id()]['url'] = Url::fromRoute('block_content.add_form', ['block_content_type' => $type->id()], $options)->toString();
+    }
+  }
+}
+
+/**
+ * Implements hook_preprocess_block() for block content.
+ *
+ * Disables contextual links for all blocks except for layout builder blocks.
+ */
+function seven_preprocess_block(&$variables) {
+  if (isset($variables['title_suffix']['contextual_links']) && !isset($variables['elements']['#contextual_links']['layout_builder_block'])) {
+    unset($variables['title_suffix']['contextual_links']);
+    unset($variables['elements']['#contextual_links']);
+
+    $variables['attributes']['class'] = array_diff($variables['attributes']['class'], ['contextual-region']);
+  }
+}
+
+/**
+ * Implements hook_preprocess_HOOK() for block admin page templates.
+ */
+function seven_preprocess_admin_block_content(&$variables) {
+  if (!empty($variables['content'])) {
+    foreach ($variables['content'] as $key => $item) {
+      $variables['content'][$key]['url'] = $item['url']->toString();
+    }
+  }
+}
+
+/**
+ * Implements hook_preprocess_HOOK() for menu-local-action templates.
+ */
+function seven_preprocess_menu_local_action(array &$variables) {
+  $variables['link']['#options']['attributes']['class'][] = 'button--primary';
+  $variables['link']['#options']['attributes']['class'][] = 'button--small';
+
+  // We require the touchevents test for button styling.
+  $variables['#attached']['library'][] = 'core/drupal.touchevents-test';
+}
+
+/**
+ * Implements hook_element_info_alter().
+ */
+function seven_element_info_alter(&$type) {
+  // We require the touchevents test for button styling.
+  if (isset($type['button'])) {
+    $type['button']['#attached']['library'][] = 'core/drupal.touchevents-test';
+  }
+}
+
+/**
+ * Implements hook_preprocess_install_page().
+ */
+function seven_preprocess_install_page(&$variables) {
+  // Seven has custom styling for the install page.
+  $variables['#attached']['library'][] = 'seven/install-page';
+}
+
+/**
+ * Implements hook_preprocess_maintenance_page().
+ */
+function seven_preprocess_maintenance_page(&$variables) {
+  // Seven has custom styling for the maintenance page.
+  $variables['#attached']['library'][] = 'seven/maintenance-page';
+}
+
+/**
+ * Implements hook_form_BASE_FORM_ID_alter() for \Drupal\node\NodeForm.
+ *
+ * Changes vertical tabs to container.
+ */
+function seven_form_node_form_alter(&$form, FormStateInterface $form_state) {
+  $form['#theme'] = ['node_edit_form'];
+  $form['#attached']['library'][] = 'seven/node-form';
+
+  $form['advanced']['#type'] = 'container';
+  $form['meta']['#type'] = 'container';
+  $form['meta']['#access'] = TRUE;
+  $form['meta']['changed']['#wrapper_attributes']['class'][] = 'container-inline';
+  $form['meta']['author']['#wrapper_attributes']['class'][] = 'container-inline';
+
+  $form['revision_information']['#type'] = 'container';
+  $form['revision_information']['#group'] = 'meta';
+}
+
+/**
+ * Implements hook_form_BASE_FORM_ID_alter() for \Drupal\media\MediaForm.
+ */
+function seven_form_media_form_alter(&$form, FormStateInterface $form_state) {
+  // Only attach CSS from core if this form comes from Media core, and not from
+  // the contrib Media Entity 1.x branch.
+  if (\Drupal::moduleHandler()->moduleExists('media') && $form_state->getFormObject() instanceof MediaForm) {
+    // @todo Revisit after https://www.drupal.org/node/2892304 is in. It
+    // introduces a footer region to these forms which will allow for us to
+    // display a top border over the published checkbox by defining a
+    // media-edit-form.html.twig template the same way node does.
+    $form['#attached']['library'][] = 'seven/media-form';
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter() for language_content_settings_form().
+ */
+function seven_form_language_content_settings_form_alter(array &$form, FormStateInterface $form_state) {
+  $form['#attached']['library'][] = 'seven/layout_builder_content_translation_admin';
+}
+
+/**
+ * Implements hook_preprocess_views_view_fields().
+ *
+ * This targets each rendered media item in the grid display of the media
+ * library's modal dialog.
+ */
+function seven_preprocess_views_view_fields__media_library(array &$variables) {
+  // Add classes to media rendered entity field so it can be targeted for
+  // styling. Adding this class in a template is very difficult to do.
+  if (isset($variables['fields']['rendered_entity']->wrapper_attributes)) {
+    $variables['fields']['rendered_entity']->wrapper_attributes->addClass('media-library-item__click-to-select-trigger');
+  }
+}
+
+/**
+ * Implements hook_form_alter().
+ */
+function seven_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
+  $form_object = $form_state->getFormObject();
+  if ($form_object instanceof ViewsForm && strpos($form_object->getBaseFormId(), 'views_form_media_library') === 0) {
+    if (isset($form['header'])) {
+      $form['header']['#attributes']['class'][] = 'media-library-views-form__header';
+      $form['header']['media_bulk_form']['#attributes']['class'][] = 'media-library-views-form__bulk_form';
+    }
+    $form['actions']['submit']['#attributes']['class'] = ['media-library-select'];
+
+    // This conditional exists because the media-library-views-form class is
+    // currently added by Classy, but Seven will eventually not use Classy as a
+    // base theme.
+    // @todo remove conditional, keep class addition in
+    //   https://drupal.org/node/3110137
+    // @see https://www.drupal.org/node/3109287
+    // @see classy_form_alter()
+    if (!isset($form['#attributes']['class']) || !in_array('media-library-views-form', $form['#attributes']['class'])) {
+      $form['#attributes']['class'][] = 'media-library-views-form';
+    }
+  }
+  // Add after build to add a CSS class to the form actions.
+  if ($form_id === 'views_exposed_form' && strpos($form['#id'], 'views-exposed-form-media-library-widget') === 0) {
+    $form['actions']['#attributes']['class'][] = 'media-library-view--form-actions';
+  }
+}
+
+/**
+ * Implements hook_form_BASE_FORM_ID_alter().
+ */
+function seven_form_media_library_add_form_alter(array &$form, FormStateInterface $form_state) {
+  $form['#attributes']['class'][] = 'media-library-add-form';
+  $form['#attached']['library'][] = 'seven/media_library';
+
+  // If there are unsaved media items, apply styling classes to various parts
+  // of the form.
+  if (isset($form['media'])) {
+    $form['#attributes']['class'][] = 'media-library-add-form--with-input';
+
+    // Put a wrapper around the informational message above the unsaved media
+    // items.
+    $form['description']['#template'] = '<p class="media-library-add-form__description">{{ text }}</p>';
+  }
+  else {
+    $form['#attributes']['class'][] = 'media-library-add-form--without-input';
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function seven_form_media_library_add_form_upload_alter(array &$form, FormStateInterface $form_state) {
+  $form['#attributes']['class'][] = 'media-library-add-form--upload';
+
+  if (isset($form['container'])) {
+    $form['container']['#attributes']['class'][] = 'media-library-add-form__input-wrapper';
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function seven_form_media_library_add_form_oembed_alter(array &$form, FormStateInterface $form_state) {
+  $form['#attributes']['class'][] = 'media-library-add-form--oembed';
+
+  // If no media items have been added yet, add a couple of styling classes
+  // to the initial URL form.
+  if (isset($form['container'])) {
+    $form['container']['#attributes']['class'][] = 'media-library-add-form__input-wrapper';
+    $form['container']['url']['#attributes']['class'][] = 'media-library-add-form-oembed-url';
+    $form['container']['submit']['#attributes']['class'][] = 'media-library-add-form-oembed-submit';
+  }
+}
+
+/**
+ * Implements hook_preprocess_item_list__media_library_add_form_media_list().
+ *
+ * This targets each new, unsaved media item added to the media library, before
+ * they are saved.
+ */
+function seven_preprocess_item_list__media_library_add_form_media_list(array &$variables) {
+  foreach ($variables['items'] as &$item) {
+    $item['value']['preview']['#attributes']['class'][] = 'media-library-add-form__preview';
+    $item['value']['fields']['#attributes']['class'][] = 'media-library-add-form__fields';
+    $item['value']['remove_button']['#attributes']['class'][] = 'media-library-add-form__remove-button';
+
+    // #source_field_name is set by AddFormBase::buildEntityFormElement()
+    // to help themes and form_alter hooks identify the source field.
+    $fields = &$item['value']['fields'];
+    $source_field_name = $fields['#source_field_name'];
+    if (isset($fields[$source_field_name])) {
+      $fields[$source_field_name]['#attributes']['class'][] = 'media-library-add-form__source-field';
+    }
+  }
+}
+
+/**
+ * Implements hook_preprocess_media_library_item__widget().
+ *
+ * This targets each media item selected in an entity reference field.
+ */
+function seven_preprocess_media_library_item__widget(array &$variables) {
+  $variables['content']['remove_button']['#attributes']['class'][] = 'media-library-item__remove';
+}
+
+/**
+ * Implements hook_preprocess_media_library_item__small().
+ *
+ * This targets each pre-selected media item selected when adding new media in
+ * the modal media library dialog.
+ */
+function seven_preprocess_media_library_item__small(array &$variables) {
+  $variables['content']['select']['#attributes']['class'][] = 'media-library-item__click-to-select-checkbox';
+}
+
+/**
+ * @todo Remove this when https://www.drupal.org/project/drupal/issues/2999549
+ * lands.
+ *
+ * @see \Drupal\media_library\Plugin\Field\FieldWidget\MediaLibraryWidget::formElement()
+ */
+function seven_preprocess_fieldset__media_library_widget(array &$variables) {
+  if (isset($variables['prefix']['weight_toggle'])) {
+    $variables['prefix']['weight_toggle']['#attributes']['class'][] = 'media-library-widget__toggle-weight';
+  }
+  if (isset($variables['suffix']['open_button'])) {
+    $variables['suffix']['open_button']['#attributes']['class'][] = 'media-library-open-button';
+  }
+}
+
+/**
+ * Implements hook_views_pre_render().
+ */
+function seven_views_pre_render(ViewExecutable $view) {
+  $add_classes = function (&$option, array $classes_to_add) {
+    $classes = preg_split('/\s+/', $option);
+    $classes = array_filter($classes);
+    $classes = array_merge($classes, $classes_to_add);
+    $option = implode(' ', array_unique($classes));
+  };
+
+  if ($view->id() === 'media_library') {
+    if ($view->display_handler->options['defaults']['css_class']) {
+      $add_classes($view->displayHandlers->get('default')->options['css_class'], ['media-library-view']);
+    }
+    else {
+      $add_classes($view->display_handler->options['css_class'], ['media-library-view']);
+    }
+
+    if ($view->current_display === 'page') {
+      if (array_key_exists('media_bulk_form', $view->field)) {
+        $add_classes($view->field['media_bulk_form']->options['element_class'], ['media-library-item__click-to-select-checkbox']);
+      }
+      if (array_key_exists('rendered_entity', $view->field)) {
+        $add_classes($view->field['rendered_entity']->options['element_class'], ['media-library-item__content']);
+      }
+      if (array_key_exists('edit_media', $view->field)) {
+        $add_classes($view->field['edit_media']->options['alter']['link_class'], ['media-library-item__edit']);
+      }
+      if (array_key_exists('delete_media', $view->field)) {
+        $add_classes($view->field['delete_media']->options['alter']['link_class'], ['media-library-item__remove']);
+      }
+    }
+    elseif (strpos($view->current_display, 'widget') === 0) {
+      if (array_key_exists('rendered_entity', $view->field)) {
+        $add_classes($view->field['rendered_entity']->options['element_class'], ['media-library-item__content']);
+      }
+      if (array_key_exists('media_library_select_form', $view->field)) {
+        $add_classes($view->field['media_library_select_form']->options['element_wrapper_class'], ['media-library-item__click-to-select-checkbox']);
+      }
+
+      if ($view->display_handler->options['defaults']['css_class']) {
+        $add_classes($view->displayHandlers->get('default')->options['css_class'], ['media-library-view--widget']);
+      }
+      else {
+        $add_classes($view->display_handler->options['css_class'], ['media-library-view--widget']);
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_preprocess_links__media_library_menu().
+ *
+ * This targets the menu of available media types in the media library's modal
+ * dialog.
+ *
+ * @todo Do this in the relevant template once
+ *   https://www.drupal.org/project/drupal/issues/3088856 is resolved.
+ * @todo revisit in https://drupal.org/node/3110132
+ */
+function seven_preprocess_links__media_library_menu(array &$variables) {
+  foreach ($variables['links'] as &$link) {
+    // This conditional exists because the media-library-menu__link class is
+    // currently added by Classy, but Seven will eventually not use Classy as a
+    // base theme.
+    // @todo remove conditional, keep class addition in
+    //   https://drupal.org/node/3110137
+    // @see https://www.drupal.org/node/3109287
+    // @see classy_preprocess_links__media_library_menu()
+    if (!isset($link['link']['#options']['attributes']['class']) || !in_array('media-library-menu__link', $link['link']['#options']['attributes']['class'])) {
+      $link['link']['#options']['attributes']['class'][] = 'media-library-menu__link';
+    }
+  }
+}
+
+/**
+ * Implements hook_preprocess_image_widget().
+ */
+function seven_preprocess_image_widget(array &$variables) {
+  $data = &$variables['data'];
+
+  // This prevents image widget templates from rendering preview container HTML
+  // to users that do not have permission to access these previews.
+  // @todo revisit in https://drupal.org/node/953034
+  // @todo revisit in https://drupal.org/node/3114318
+  if (isset($data['preview']['#access']) && $data['preview']['#access'] === FALSE) {
+    unset($data['preview']);
+  }
+
+  // @todo Revisit everything in this conditional in
+  //   https://drupal.org/node/3117430
+  if (!empty($variables['element']['fids']['#value'])) {
+    $file = reset($variables['element']['#files']);
+    $data["file_{$file->id()}"]['filename']['#suffix'] = ' <span class="file-size">(' . format_size($file->getSize()) . ')</span> ';
+  }
+}
+
+/**
+ * Prepares variables for update version templates.
+ *
+ * Default template: update-version.html.twig.
+ *
+ * @param array $variables
+ *   An associative array containing:
+ *   - version: An array of information about the release version.
+ */
+function seven_preprocess_update_version(array &$variables) {
+  $variables['#attached']['library'][] = 'seven/update-report';
+}
+
+/**
+ * Implements template_preprocess_links().
+ *
+ * This makes it so array keys of #links items are added as a class. This
+ * functionality was removed in Drupal 8.1, but still necessary in some
+ * instances.
+ *
+ * @todo remove in https://drupal.org/node/3120962
+ */
+function seven_preprocess_links(&$variables) {
+  if (!empty($variables['links'])) {
+    foreach ($variables['links'] as $key => $value) {
+      if (!is_numeric($key)) {
+        $class = Html::getClass($key);
+        $variables['links'][$key]['attributes']->addClass($class);
+      }
+    }
+  }
+}
diff --git a/web/themes/seven/templates/admin-block-content.html.twig b/web/themes/seven/templates/admin-block-content.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..ae111e2d35337f97eb0ce82f2b9ba0a6cc542547
--- /dev/null
+++ b/web/themes/seven/templates/admin-block-content.html.twig
@@ -0,0 +1,34 @@
+{#
+/**
+ * @file
+ * Seven's theme implementation for the content of an administrative block.
+ *
+ * Uses unordered list markup in both compact and extended modes.
+ *
+ * Available variables:
+ * - content: List of administrative menu items. Each menu item contains:
+ *   - link: Link to the admin section.
+ *   - title: Short name of the section.
+ *   - description: Description of the administrative menu item.
+ *   - url: URI to the admin section.
+ *   - options: URL options. See \Drupal\Core\Url::fromUri() for details.
+ * - attributes: HTML attributes to be added to the element.
+ * - compact: Boolean indicating whether compact mode is turned on or not.
+ *
+ * @see template_preprocess_admin_block_content()
+ * @see seven_preprocess_admin_block_content()
+ */
+#}
+{%
+  set classes = [
+    'admin-list',
+    compact ? 'compact',
+  ]
+%}
+{% if content %}
+  <ul{{ attributes.addClass(classes) }}>
+    {% for item in content %}
+      <li><a href="{{ item.url }}"><span class="label">{{ item.title }}</span><div class="description">{{ item.description }}</div></a></li>
+    {% endfor %}
+  </ul>
+{% endif %}
diff --git a/web/themes/seven/templates/block--local-actions-block.html.twig b/web/themes/seven/templates/block--local-actions-block.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..65397588fed3589096f0d105f0979e820e4413dc
--- /dev/null
+++ b/web/themes/seven/templates/block--local-actions-block.html.twig
@@ -0,0 +1,14 @@
+{% extends "@block/block.html.twig" %}
+{#
+/**
+ * @file
+ * Theme override for local actions (primary admin actions.)
+ */
+#}
+{% block content %}
+  {% if content %}
+    <ul class="action-links">
+      {{ content }}
+    </ul>
+  {% endif %}
+{% endblock %}
diff --git a/web/themes/seven/templates/block-content-add-list.html.twig b/web/themes/seven/templates/block-content-add-list.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..0c0c49664a1c9efa5b12467c9c2fd49c39253fa6
--- /dev/null
+++ b/web/themes/seven/templates/block-content-add-list.html.twig
@@ -0,0 +1,26 @@
+{#
+/**
+ * @file
+ * Seven's theme implementation to display a list of custom block types.
+ *
+ * Displays the list of available custom block types for creation.
+ *
+ * Available variables:
+ * - types: A collection of all the available custom block types.
+ *   Each type contains:
+ *   - url: A link to add a block of this type.
+ *   - description: A description of this custom block type.
+ *   - label: The title of the custom block type.
+ *   - path: A path for the link to add a block of this type.
+ *
+ * @see template_preprocess_block_content_add_list()
+ * @see seven_preprocess_block_content_add_list()
+ */
+ #}
+<ul class="admin-list">
+  {% for type in types %}
+    <li class="clearfix">
+      <a href="{{ type.url }}"><span class="label">{{ type.label }}</span><div class="description">{{ type.description }}</div></a>
+    </li>
+  {% endfor %}
+</ul>
diff --git a/web/themes/seven/templates/classy/README.txt b/web/themes/seven/templates/classy/README.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8708a82e744212c695aa6054c37aa30d9d3d9a34
--- /dev/null
+++ b/web/themes/seven/templates/classy/README.txt
@@ -0,0 +1,12 @@
+WHAT IS THIS DIRECTORY FOR?
+--------------------------------
+This directory is for templates previously inherited from the Classy theme.
+
+WHY ARE CLASSY TEMPLATES BEING COPIED HERE?
+-------------------------------------------
+Classy will be deprecated during the Drupal 9 lifecycle. To prepare for Classy's
+removal, templates that would otherwise be inherited from Classy are copied
+here.
+
+Templates that differ from the Classy versions should not be placed in this
+directory or any subdirectory.
diff --git a/web/themes/seven/templates/classy/block/block--local-tasks-block.html.twig b/web/themes/seven/templates/classy/block/block--local-tasks-block.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..0f25f59d83131f120371ed25943903c48c3abe63
--- /dev/null
+++ b/web/themes/seven/templates/classy/block/block--local-tasks-block.html.twig
@@ -0,0 +1,14 @@
+{% extends "block.html.twig" %}
+{#
+/**
+ * @file
+ * Theme override for tabs.
+ */
+#}
+{% block content %}
+  {% if content %}
+    <nav class="tabs" role="navigation" aria-label="{{ 'Tabs'|t }}">
+      {{ content }}
+    </nav>
+  {% endif %}
+{% endblock %}
diff --git a/web/themes/seven/templates/classy/block/block--search-form-block.html.twig b/web/themes/seven/templates/classy/block/block--search-form-block.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..667202fb6b658bf3b0aae080d6687913074ef6d1
--- /dev/null
+++ b/web/themes/seven/templates/classy/block/block--search-form-block.html.twig
@@ -0,0 +1,45 @@
+{#
+/**
+ * @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.
+ * - 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>
diff --git a/web/themes/seven/templates/classy/block/block--system-branding-block.html.twig b/web/themes/seven/templates/classy/block/block--system-branding-block.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..baa015b17729687d9d9d078d573e8212ae7dd409
--- /dev/null
+++ b/web/themes/seven/templates/classy/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 %}
+    <a href="{{ path('<front>') }}" rel="home" class="site-logo">
+      <img src="{{ site_logo }}" alt="{{ 'Home'|t }}" />
+    </a>
+  {% endif %}
+  {% if site_name %}
+    <div class="site-name">
+      <a href="{{ path('<front>') }}" rel="home">{{ site_name }}</a>
+    </div>
+  {% endif %}
+  {% if site_slogan %}
+    <div class="site-slogan">{{ site_slogan }}</div>
+  {% endif %}
+{% endblock %}
diff --git a/web/themes/seven/templates/classy/block/block--system-menu-block.html.twig b/web/themes/seven/templates/classy/block/block--system-menu-block.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..407f8403fd28c7db920f68ccbd4927bc2bbccb21
--- /dev/null
+++ b/web/themes/seven/templates/classy/block/block--system-menu-block.html.twig
@@ -0,0 +1,56 @@
+{#
+/**
+ * @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.
+ * - content: The content of this block.
+ * - attributes: HTML attributes for the containing element.
+ *   - id: A valid HTML ID and guaranteed unique.
+ * - title_attributes: HTML attributes for the title element.
+ * - content_attributes: HTML attributes for the content element.
+ * - title_prefix: Additional output populated by modules, intended to be
+ *   displayed in front of the main title tag that appears in the template.
+ * - title_suffix: Additional output populated by modules, intended to be
+ *   displayed after the main title tag that appears in the template.
+ *
+ * Headings should be used on navigation menus that consistently appear on
+ * multiple pages. When this menu block's label is configured to not be
+ * displayed, it is automatically made invisible using the 'visually-hidden' CSS
+ * class, which still keeps it visible for screen-readers and assistive
+ * technology. Headings allow screen-reader and keyboard only users to navigate
+ * to or skip the links.
+ * See http://juicystudio.com/article/screen-readers-display-none.php and
+ * http://www.w3.org/TR/WCAG-TECHS/H42.html for more information.
+ */
+#}
+{%
+  set classes = [
+    'block',
+    'block-menu',
+    'navigation',
+    'menu--' ~ derivative_plugin_id|clean_class,
+  ]
+%}
+{% set heading_id = attributes.id ~ '-menu'|clean_id %}
+<nav role="navigation" aria-labelledby="{{ heading_id }}"{{ attributes.addClass(classes)|without('role', 'aria-labelledby') }}>
+  {# Label. If not displayed, we still provide it for screen readers. #}
+  {% if not configuration.label_display %}
+    {% set title_attributes = title_attributes.addClass('visually-hidden') %}
+  {% endif %}
+  {{ title_prefix }}
+  <h2{{ title_attributes.setAttribute('id', heading_id) }}>{{ configuration.label }}</h2>
+  {{ title_suffix }}
+
+  {# Menu. #}
+  {% block content %}
+    {{ content }}
+  {% endblock %}
+</nav>
diff --git a/web/themes/seven/templates/classy/block/block.html.twig b/web/themes/seven/templates/classy/block/block.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..fd3311be958b9de2fcd17108309c854fdc807217
--- /dev/null
+++ b/web/themes/seven/templates/classy/block/block.html.twig
@@ -0,0 +1,44 @@
+{#
+/**
+ * @file
+ * Theme override to display a block.
+ *
+ * Available variables:
+ * - plugin_id: The ID of the block implementation.
+ * - label: The configured label of the block if visible.
+ * - configuration: A list of the block's configuration values.
+ *   - label: The configured label for the block.
+ *   - label_display: The display settings for the label.
+ *   - provider: The module or other provider that provided this block plugin.
+ *   - Block plugin specific settings will also be stored here.
+ * - content: The content of this block.
+ * - attributes: array of HTML attributes populated by modules, intended to
+ *   be added to the main container tag of this template.
+ *   - id: A valid HTML ID and guaranteed unique.
+ * - title_attributes: Same as attributes, except applied to the main title
+ *   tag that appears in the template.
+ * - title_prefix: Additional output populated by modules, intended to be
+ *   displayed in front of the main title tag that appears in the template.
+ * - title_suffix: Additional output populated by modules, intended to be
+ *   displayed after the main title tag that appears in the template.
+ *
+ * @see template_preprocess_block()
+ */
+#}
+{%
+  set classes = [
+    'block',
+    'block-' ~ configuration.provider|clean_class,
+    'block-' ~ plugin_id|clean_class,
+  ]
+%}
+<div{{ attributes.addClass(classes) }}>
+  {{ title_prefix }}
+  {% if label %}
+    <h2{{ title_attributes }}>{{ label }}</h2>
+  {% endif %}
+  {{ title_suffix }}
+  {% block content %}
+    {{ content }}
+  {% endblock %}
+</div>
diff --git a/web/themes/seven/templates/classy/content-edit/file-managed-file.html.twig b/web/themes/seven/templates/classy/content-edit/file-managed-file.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..629335a839b0f03a151fbe7bae977e1c218712ab
--- /dev/null
+++ b/web/themes/seven/templates/classy/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('seven/classy.file') }}
+{%
+  set classes = [
+    'js-form-managed-file',
+    'form-managed-file',
+  ]
+%}
+<div{{ attributes.addClass(classes) }}>
+  {{ element }}
+</div>
diff --git a/web/themes/seven/templates/classy/content-edit/filter-caption.html.twig b/web/themes/seven/templates/classy/content-edit/filter-caption.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..1e35795fc153cc516987f5157e7edac1e728437f
--- /dev/null
+++ b/web/themes/seven/templates/classy/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.
+ */
+#}
+<figure role="group" class="caption caption-{{ tag }}{%- if classes %} {{ classes }}{%- endif %}">
+{{ node }}
+<figcaption>{{ caption }}</figcaption>
+</figure>
diff --git a/web/themes/seven/templates/classy/content-edit/filter-guidelines.html.twig b/web/themes/seven/templates/classy/content-edit/filter-guidelines.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..afef2d2cfb37a41943a26e9c98cee45d81a36eb7
--- /dev/null
+++ b/web/themes/seven/templates/classy/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,
+  ]
+%}
+<div{{ attributes.addClass(classes) }}>
+  <h4 class="label">{{ format.label }}</h4>
+  {{ tips }}
+</div>
diff --git a/web/themes/seven/templates/classy/content-edit/filter-tips.html.twig b/web/themes/seven/templates/classy/content-edit/filter-tips.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..25ed49d6ae18a9ef97a71308518f9fb998a5bce3
--- /dev/null
+++ b/web/themes/seven/templates/classy/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 %}
+  <h2>{{ 'Text Formats'|t }}</h2>
+{% endif %}
+
+{% if tips|length %}
+  {% if multiple %}
+    <div class="compose-tips">
+  {% endif %}
+
+  {% for name, tip in tips %}
+    {% if multiple %}
+      {%
+        set tip_classes = [
+          'filter-type',
+          'filter-' ~ name|clean_class,
+        ]
+      %}
+      <div{{ tip.attributes.addClass(tip_classes) }}>
+      <h3>{{ tip.name }}</h3>
+    {% endif %}
+
+    {% if tip.list|length %}
+      <ul class="tips">
+      {% for item in tip.list %}
+        {%
+          set item_classes = [
+            long ? 'filter-' ~ item.id|replace({'/': '-'}),
+          ]
+        %}
+        <li{{ item.attributes.addClass(item_classes) }}>{{ item.tip }}</li>
+      {% endfor %}
+      </ul>
+    {% endif %}
+
+    {% if multiple %}
+      </div>
+    {% endif %}
+  {% endfor %}
+
+  {% if multiple %}
+    </div>
+  {% endif %}
+{% endif %}
diff --git a/web/themes/seven/templates/classy/content-edit/text-format-wrapper.html.twig b/web/themes/seven/templates/classy/content-edit/text-format-wrapper.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..08a88ca1ce1d95fba8fe44a30f3fdaca95210143
--- /dev/null
+++ b/web/themes/seven/templates/classy/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()
+ */
+#}
+<div class="js-text-format-wrapper text-format-wrapper js-form-item form-item">
+  {{ children }}
+  {% if description %}
+    {%
+      set classes = [
+        aria_description ? 'description',
+      ]
+    %}
+    <div{{ attributes.addClass(classes) }}>{{ description }}</div>
+  {% endif %}
+</div>
diff --git a/web/themes/seven/templates/classy/content/aggregator-item.html.twig b/web/themes/seven/templates/classy/content/aggregator-item.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..16f4428a03d81e039afd2f2129e37bc24709d47d
--- /dev/null
+++ b/web/themes/seven/templates/classy/content/aggregator-item.html.twig
@@ -0,0 +1,31 @@
+{#
+/**
+ * @file
+ * Theme override to present a feed item in an aggregator page.
+ *
+ * Available variables:
+ * - url: URL to the originating feed item.
+ * - title: (optional) Title of the feed item.
+ * - content: All field 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 element.
+ * - attributes: HTML attributes for the wrapper.
+ * - 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_aggregator_item()
+ */
+#}
+<article{{ attributes.addClass('aggregator-item') }}>
+  {{ title_prefix }}
+  {% if title %}
+    <h3 class="feed-item-title">
+      <a href="{{ url }}">{{ title }}</a>
+    </h3>
+  {% endif %}
+  {{ title_suffix }}
+  {{ content }}
+</article>
diff --git a/web/themes/seven/templates/classy/content/book-node-export-html.html.twig b/web/themes/seven/templates/classy/content/book-node-export-html.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..94a4c24dc714d510299c202402d6e575b739a126
--- /dev/null
+++ b/web/themes/seven/templates/classy/content/book-node-export-html.html.twig
@@ -0,0 +1,20 @@
+{#
+/**
+ * @file
+ * Theme override for a single node in a printer-friendly outline.
+ *
+ * Available variables:
+ * - node: Fully loaded node.
+ * - depth: Depth of the current node inside the outline.
+ * - title: Node title.
+ * - content: Node content.
+ * - children: All the child nodes recursively rendered through this file.
+ *
+ * @see template_preprocess_book_node_export_html()
+ */
+#}
+<article id="node-{{ node.id }}" class="section-{{ depth }}">
+  <h1 class="book-heading">{{ title }}</h1>
+  {{ content }}
+  {{ children }}
+</article>
diff --git a/web/themes/seven/templates/classy/content/comment.html.twig b/web/themes/seven/templates/classy/content/comment.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..f4c9e2a8fcf5a7ce76ce81ac9c2f76b2e18e557b
--- /dev/null
+++ b/web/themes/seven/templates/classy/content/comment.html.twig
@@ -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('seven/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>
diff --git a/web/themes/seven/templates/classy/content/links--node.html.twig b/web/themes/seven/templates/classy/content/links--node.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e6cda0d7bb557e1be0c732d456ffcbb353f81269
--- /dev/null
+++ b/web/themes/seven/templates/classy/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 %}
+  <div class="node__links">
+    {% include "links.html.twig" %}
+  </div>
+{% endif %}
diff --git a/web/themes/seven/templates/classy/content/mark.html.twig b/web/themes/seven/templates/classy/content/mark.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..9219915ce5d567258169d4b58cdf44a32263e0b4
--- /dev/null
+++ b/web/themes/seven/templates/classy/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') %}
+    <span class="marker">{{ 'New'|t }}</span>
+  {% elseif status is constant('MARK_UPDATED') %}
+    <span class="marker">{{ 'Updated'|t }}</span>
+  {% endif %}
+{% endif %}
diff --git a/web/themes/seven/templates/classy/content/media-embed-error.html.twig b/web/themes/seven/templates/classy/content/media-embed-error.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4b1dc926b6f0ea1f7a8060b1141aa122b7480f91
--- /dev/null
+++ b/web/themes/seven/templates/classy/content/media-embed-error.html.twig
@@ -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('seven/classy.media_embed_error') }}
+<div{{ attributes.addClass('media-embed-error', 'media-embed-error--missing-source') }}>
+  {{ message }}
+</div>
diff --git a/web/themes/seven/templates/classy/content/media.html.twig b/web/themes/seven/templates/classy/content/media.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..422030e9d027b79f2b77d252f09bad1fb7821bdd
--- /dev/null
+++ b/web/themes/seven/templates/classy/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,
+  ]
+%}
+<article{{ attributes.addClass(classes) }}>
+  {{ title_suffix.contextual_links }}
+  {% if content %}
+    {{ content }}
+  {% endif %}
+</article>
diff --git a/web/themes/seven/templates/classy/content/node.html.twig b/web/themes/seven/templates/classy/content/node.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..eedfd86d379073add25be3d1014c487a86dff7d8
--- /dev/null
+++ b/web/themes/seven/templates/classy/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('seven/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>
diff --git a/web/themes/seven/templates/classy/content/page-title.html.twig b/web/themes/seven/templates/classy/content/page-title.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e1de7266074e092d5d5d99d1c0c12bc36955989b
--- /dev/null
+++ b/web/themes/seven/templates/classy/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 %}
+  <h1{{ title_attributes.addClass('page-title') }}>{{ title }}</h1>
+{% endif %}
+{{ title_suffix }}
diff --git a/web/themes/seven/templates/classy/content/search-result.html.twig b/web/themes/seven/templates/classy/content/search-result.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..150b8d903e9d920df52e439afe3255c638b11fc5
--- /dev/null
+++ b/web/themes/seven/templates/classy/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) %}
+ *     <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('seven/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>
diff --git a/web/themes/seven/templates/classy/content/taxonomy-term.html.twig b/web/themes/seven/templates/classy/content/taxonomy-term.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..6478b507d006fdd2386ab35f7eef09eb89be16b3
--- /dev/null
+++ b/web/themes/seven/templates/classy/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,
+  ]
+%}
+<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>
diff --git a/web/themes/seven/templates/classy/dataset/aggregator-feed.html.twig b/web/themes/seven/templates/classy/dataset/aggregator-feed.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..9eacccb60481cf07f94c7427af4c4f193f1ca939
--- /dev/null
+++ b/web/themes/seven/templates/classy/dataset/aggregator-feed.html.twig
@@ -0,0 +1,36 @@
+{#
+/**
+ * @file
+ * Theme override to present an aggregator feed.
+ *
+ * The contents are rendered above feed listings when browsing source feeds.
+ * For example, "example.com/aggregator/sources/1".
+ *
+ * Available variables:
+ * - title: (optional) Title of the feed item.
+ * - content: All field 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 element.
+ * - attributes: HTML attributes for the wrapper.
+ * - 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_aggregator_feed()
+ */
+#}
+<div{{ attributes.addClass('aggregator-feed') }}>
+
+  {{ title_prefix }}
+  {% if title and not full %}
+    <h2{{ title_attributes }}>{{ title }}</h2>
+  {% endif %}
+  {{ title_suffix }}
+
+  {{ content }}
+
+</div>
diff --git a/web/themes/seven/templates/classy/dataset/forum-icon.html.twig b/web/themes/seven/templates/classy/dataset/forum-icon.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..d6be503bb2af344d3f149ce285f0980c0878fc28
--- /dev/null
+++ b/web/themes/seven/templates/classy/dataset/forum-icon.html.twig
@@ -0,0 +1,30 @@
+{#
+/**
+ * @file
+ * Theme override to display a status icon for a forum post.
+ *
+ * Available variables:
+ * - attributes: HTML attributes to be applied to the wrapper element.
+ *   - class: HTML classes that determine which icon to display. May be one of
+ *     'hot', 'hot-new', 'new', 'default', 'closed', or 'sticky'.
+ *   - title: Text alternative for the forum icon.
+ * - icon_title: Text alternative for the forum icon, same as above.
+ * - new_posts: '1' when this topic contains new posts, otherwise '0'.
+ * - first_new: '1' when this is the first topic with new posts, otherwise '0'.
+ * - icon_status: Indicates which status icon should be used.
+ *
+ * @see template_preprocess_forum_icon()
+ */
+#}
+{%
+  set classes = [
+    'forum__icon',
+    'forum__topic-status--' ~ icon_status,
+  ]
+%}
+<div{{ attributes.addClass(classes) }}>
+  {% if first_new -%}
+    <a id="new"></a>
+  {%- endif %}
+  <span class="visually-hidden">{{ icon_title }}</span>
+</div>
diff --git a/web/themes/seven/templates/classy/dataset/forum-list.html.twig b/web/themes/seven/templates/classy/dataset/forum-list.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..d8523f1598276ca42a5d759fd45852f871158774
--- /dev/null
+++ b/web/themes/seven/templates/classy/dataset/forum-list.html.twig
@@ -0,0 +1,79 @@
+{#
+/**
+ * @file
+ * Theme override to display a list of forums and containers.
+ *
+ * Available variables:
+ * - forums: A collection of forums and containers to display. It is keyed to
+ *   the numeric IDs of all child forums and containers. Each forum in forums
+ *   contains:
+ *   - is_container: A flag indicating if the forum can contain other
+ *     forums. Otherwise, the forum can only contain topics.
+ *   - depth: How deep the forum is in the current hierarchy.
+ *   - zebra: 'even' or 'odd', used for row class.
+ *   - icon_class: 'default' or 'new', used for forum icon class.
+ *   - icon_title: Text alternative for the forum icon.
+ *   - name: The name of the forum.
+ *   - link: The URL to link to this forum.
+ *   - description: The description field for the forum, containing:
+ *     - value: The descriptive text for the forum.
+ *   - new_topics: A flag indicating if the forum contains unread posts.
+ *   - new_url: A URL to the forum's unread posts.
+ *   - new_text: Text for the above URL, which tells how many new posts.
+ *   - old_topics: A count of posts that have already been read.
+ *   - num_posts: The total number of posts in the forum.
+ *   - last_reply: Text representing the last time a forum was posted or
+ *     commented in.
+ * - forum_id: Forum ID for the current forum. Parent to all items within the
+ *   forums array.
+ *
+ * @see template_preprocess_forum_list()
+ */
+#}
+<table id="forum-{{ forum_id }}">
+  <thead>
+    <tr>
+      <th>{{ 'Forum'|t }}</th>
+      <th>{{ 'Topics'|t }}</th>
+      <th>{{ 'Posts'|t }}</th>
+      <th>{{ 'Last post'|t }}</th>
+    </tr>
+  </thead>
+  <tbody>
+  {% for child_id, forum in forums %}
+    <tr id="forum-list-{{ child_id }}" class="{{ forum.zebra }}">
+      <td {% if forum.is_container == true -%}
+        colspan="4" class="container"
+      {%- else -%}
+        class="forum-list__forum"
+      {%- endif -%}>
+        {#
+          Enclose the contents of this cell with X divs, where X is the
+          depth this forum resides at. This will allow us to use CSS
+          left-margin for indenting.
+        #}
+        {% if forum.depth > 0 %}{% for i in 1..forum.depth %}<div class="indented">{% endfor %}{% endif %}
+          <div class="forum__icon forum-status-{{ forum.icon_class }}" title="{{ forum.icon_title }}">
+            <span class="visually-hidden">{{ forum.icon_title }}</span>
+          </div>
+          <div class="forum__name"><a href="{{ forum.link }}">{{ forum.label }}</a></div>
+          {% if forum.description.value %}
+            <div class="forum__description">{{ forum.description.value }}</div>
+          {% endif %}
+          {% if forum.depth > 0 %}{% for i in 1..forum.depth %}</div>{% endfor %}{% endif %}
+      </td>
+      {% if forum.is_container == false %}
+        <td class="forum__topics">
+          {{ forum.num_topics }}
+          {% if forum.new_topics == true %}
+            <br />
+            <a href="{{ forum.new_url }}">{{ forum.new_text }}</a>
+          {% endif %}
+        </td>
+        <td class="forum__posts">{{ forum.num_posts }}</td>
+        <td class="forum__last-reply">{{ forum.last_reply }}</td>
+      {% endif %}
+    </tr>
+  {% endfor %}
+  </tbody>
+</table>
diff --git a/web/themes/seven/templates/classy/dataset/forums.html.twig b/web/themes/seven/templates/classy/dataset/forums.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..a1bf63c249672d80f0d8b0f3bf12c046ac459c68
--- /dev/null
+++ b/web/themes/seven/templates/classy/dataset/forums.html.twig
@@ -0,0 +1,24 @@
+{#
+/**
+ * @file
+ * Theme override to display a forum.
+ *
+ * May contain forum containers as well as forum topics.
+ *
+ * Available variables:
+ * - forums: The forums to display (as processed by forum-list.html.twig).
+ * - topics: The topics to display.
+ * - topics_pager: The topics pager.
+ * - forums_defined: A flag to indicate that the forums are configured.
+ *
+ * @see template_preprocess_forums()
+ */
+#}
+{{ attach_library('seven/classy.forum') }}
+{% if forums_defined %}
+  <div class="forum">
+    {{ forums }}
+    {{ topics }}
+    {{ topics_pager }}
+  </div>
+{% endif %}
diff --git a/web/themes/seven/templates/classy/dataset/item-list--search-results.html.twig b/web/themes/seven/templates/classy/dataset/item-list--search-results.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e9928fd776600c762b9f096370e9978ff1c6495a
--- /dev/null
+++ b/web/themes/seven/templates/classy/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/web/themes/seven/templates/classy/dataset/item-list.html.twig b/web/themes/seven/templates/classy/dataset/item-list.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..20541b0b7e6652761504f747ad9972a2759fe27b
--- /dev/null
+++ b/web/themes/seven/templates/classy/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 -%}
+  <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 %}
diff --git a/web/themes/seven/templates/classy/dataset/table.html.twig b/web/themes/seven/templates/classy/dataset/table.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..2afa9c155642349eea89066b17ad245044558b80
--- /dev/null
+++ b/web/themes/seven/templates/classy/dataset/table.html.twig
@@ -0,0 +1,113 @@
+{#
+/**
+ * @file
+ * Theme override to display a table.
+ *
+ * Available variables:
+ * - attributes: HTML attributes to apply to the <table> tag.
+ * - caption: A localized string for the <caption> tag.
+ * - colgroups: Column groups. Each group contains the following properties:
+ *   - attributes: HTML attributes to apply to the <col> tag.
+ *     Note: Drupal currently supports only one table header row, see
+ *     https://www.drupal.org/node/893530 and
+ *     http://api.drupal.org/api/drupal/includes!theme.inc/function/theme_table/7#comment-5109.
+ * - header: Table header cells. Each cell contains the following properties:
+ *   - tag: The HTML tag name to use; either 'th' or 'td'.
+ *   - attributes: HTML attributes to apply to the tag.
+ *   - content: A localized string for the title of the column.
+ *   - field: Field name (required for column sorting).
+ *   - sort: Default sort order for this column ("asc" or "desc").
+ * - sticky: A flag indicating whether to use a "sticky" table header.
+ * - rows: Table rows. Each row contains the following properties:
+ *   - attributes: HTML attributes to apply to the <tr> tag.
+ *   - data: Table cells.
+ *   - no_striping: A flag indicating that the row should receive no
+ *     'even / odd' styling. Defaults to FALSE.
+ *   - cells: Table cells of the row. Each cell contains the following keys:
+ *     - tag: The HTML tag name to use; either 'th' or 'td'.
+ *     - attributes: Any HTML attributes, such as "colspan", to apply to the
+ *       table cell.
+ *     - content: The string to display in the table cell.
+ *     - active_table_sort: A boolean indicating whether the cell is the active
+         table sort.
+ * - footer: Table footer rows, in the same format as the rows variable.
+ * - empty: The message to display in an extra row if table does not have
+ *   any rows.
+ * - no_striping: A boolean indicating that the row should receive no striping.
+ * - header_columns: The number of columns in the header.
+ *
+ * @see template_preprocess_table()
+ */
+#}
+<table{{ attributes }}>
+  {% if caption %}
+    <caption>{{ caption }}</caption>
+  {% endif %}
+
+  {% for colgroup in colgroups %}
+    {% if colgroup.cols %}
+      <colgroup{{ colgroup.attributes }}>
+        {% for col in colgroup.cols %}
+          <col{{ col.attributes }} />
+        {% endfor %}
+      </colgroup>
+    {% else %}
+      <colgroup{{ colgroup.attributes }} />
+    {% endif %}
+  {% endfor %}
+
+  {% if header %}
+    <thead>
+      <tr>
+        {% for cell in header %}
+          {%
+            set cell_classes = [
+              cell.active_table_sort ? 'is-active',
+            ]
+          %}
+          <{{ cell.tag }}{{ cell.attributes.addClass(cell_classes) }}>
+            {{- cell.content -}}
+          </{{ cell.tag }}>
+        {% endfor %}
+      </tr>
+    </thead>
+  {% endif %}
+
+  {% if rows %}
+    <tbody>
+      {% for row in rows %}
+        {%
+          set row_classes = [
+            not no_striping ? cycle(['odd', 'even'], loop.index0),
+          ]
+        %}
+        <tr{{ row.attributes.addClass(row_classes) }}>
+          {% for cell in row.cells %}
+            <{{ cell.tag }}{{ cell.attributes }}>
+              {{- cell.content -}}
+            </{{ cell.tag }}>
+          {% endfor %}
+        </tr>
+      {% endfor %}
+    </tbody>
+  {% elseif empty %}
+    <tbody>
+      <tr class="odd">
+        <td colspan="{{ header_columns }}" class="empty message">{{ empty }}</td>
+      </tr>
+    </tbody>
+  {% endif %}
+  {% if footer %}
+    <tfoot>
+      {% for row in footer %}
+        <tr{{ row.attributes }}>
+          {% for cell in row.cells %}
+            <{{ cell.tag }}{{ cell.attributes }}>
+              {{- cell.content -}}
+            </{{ cell.tag }}>
+          {% endfor %}
+        </tr>
+      {% endfor %}
+    </tfoot>
+  {% endif %}
+</table>
diff --git a/web/themes/seven/templates/classy/field/field--comment.html.twig b/web/themes/seven/templates/classy/field/field--comment.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..1ec3ee64b104b032ae9486871d7565890ff580a0
--- /dev/null
+++ b/web/themes/seven/templates/classy/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',
+  ]
+%}
+<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>
diff --git a/web/themes/seven/templates/classy/field/field--node--created.html.twig b/web/themes/seven/templates/classy/field/field--node--created.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..f4d1acd439b412ede7b49fb0ff16e069962a6dd8
--- /dev/null
+++ b/web/themes/seven/templates/classy/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
+ *   <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 %}
diff --git a/web/themes/seven/templates/classy/field/field--node--title.html.twig b/web/themes/seven/templates/classy/field/field--node--title.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e79c39eb52cc9ad55449993e583026731d4806c5
--- /dev/null
+++ b/web/themes/seven/templates/classy/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
+ *   <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 %}
diff --git a/web/themes/seven/templates/classy/field/field--node--uid.html.twig b/web/themes/seven/templates/classy/field/field--node--uid.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..0a381083246a5fd8a4ad4f9738f088fc31760bc5
--- /dev/null
+++ b/web/themes/seven/templates/classy/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
+ *   <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 %}
diff --git a/web/themes/seven/templates/classy/field/field--text-long.html.twig b/web/themes/seven/templates/classy/field/field--text-long.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..07ce721d2d70e767cb74b466243e590f97dfe5ef
--- /dev/null
+++ b/web/themes/seven/templates/classy/field/field--text-long.html.twig
@@ -0,0 +1 @@
+{% extends "field--text.html.twig" %}
diff --git a/web/themes/seven/templates/classy/field/field--text-with-summary.html.twig b/web/themes/seven/templates/classy/field/field--text-with-summary.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..07ce721d2d70e767cb74b466243e590f97dfe5ef
--- /dev/null
+++ b/web/themes/seven/templates/classy/field/field--text-with-summary.html.twig
@@ -0,0 +1 @@
+{% extends "field--text.html.twig" %}
diff --git a/web/themes/seven/templates/classy/field/field--text.html.twig b/web/themes/seven/templates/classy/field/field--text.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..5d1690c3ec98fe51e2ae2d7c4f5cbb2b72102b3c
--- /dev/null
+++ b/web/themes/seven/templates/classy/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/web/themes/seven/templates/classy/field/field.html.twig b/web/themes/seven/templates/classy/field/field.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..1cfbd651ce16042e853f73c243590019058c4573
--- /dev/null
+++ b/web/themes/seven/templates/classy/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 %}
+    <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 %}
diff --git a/web/themes/seven/templates/classy/field/file-audio.html.twig b/web/themes/seven/templates/classy/field/file-audio.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..60ac095f9938423051df76fc4f1df66512851c52
--- /dev/null
+++ b/web/themes/seven/templates/classy/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('seven/classy.file') }}
+<audio {{ attributes }}>
+  {% for file in files %}
+    <source {{ file.source_attributes }} />
+  {% endfor %}
+</audio>
diff --git a/web/themes/seven/templates/classy/field/file-video.html.twig b/web/themes/seven/templates/classy/field/file-video.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4ed6794a095ba07115bfd360d0e6bba89e152803
--- /dev/null
+++ b/web/themes/seven/templates/classy/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('seven/classy.file') }}
+<video {{ attributes }}>
+  {% for file in files %}
+    <source {{ file.source_attributes }} />
+  {% endfor %}
+</video>
diff --git a/web/themes/seven/templates/classy/field/image.html.twig b/web/themes/seven/templates/classy/field/image.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..31f782bb60a899f1682037f4c3f2b2707c543874
--- /dev/null
+++ b/web/themes/seven/templates/classy/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,
+]
+%}
+<img{{ attributes.addClass(classes) }} />
diff --git a/web/themes/seven/templates/classy/field/link-formatter-link-separate.html.twig b/web/themes/seven/templates/classy/field/link-formatter-link-separate.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..52c8d29a77fc11c037ee2811e4f2eb30f67368aa
--- /dev/null
+++ b/web/themes/seven/templates/classy/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 %}
+  <div class="link-item">
+    {% if title %}
+      <div class="link-title">{{ title }}</div>
+    {% endif %}
+    <div class="link-url">{{ link }}</div>
+  </div>
+{% endapply %}
diff --git a/web/themes/seven/templates/classy/field/time.html.twig b/web/themes/seven/templates/classy/field/time.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..f2912b7f9872f9d2343b2ebf04064f76c4b85c77
--- /dev/null
+++ b/web/themes/seven/templates/classy/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 <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 template_preprocess_time()
+ * @see http://www.w3.org/TR/html5-author/the-time-element.html#attr-time-datetime
+ */
+#}
+<time{{ attributes.addClass('datetime') }}>{{ text }}</time>
diff --git a/web/themes/seven/templates/classy/form/datetime-form.html.twig b/web/themes/seven/templates/classy/form/datetime-form.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..f56182fdf2aa5c031a1966110a974d14a215b356
--- /dev/null
+++ b/web/themes/seven/templates/classy/form/datetime-form.html.twig
@@ -0,0 +1,15 @@
+{#
+/**
+ * @file
+ * Theme override of a datetime form element.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the datetime form element.
+ * - content: The datelist form element to be output.
+ *
+ * @see template_preprocess_datetime_form()
+ */
+#}
+<div{{ attributes.addClass('container-inline') }}>
+  {{ content }}
+</div>
diff --git a/web/themes/seven/templates/classy/form/datetime-wrapper.html.twig b/web/themes/seven/templates/classy/form/datetime-wrapper.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..5b52f2daa380f2ef7bb1a0cc15f433c47b2713ff
--- /dev/null
+++ b/web/themes/seven/templates/classy/form/datetime-wrapper.html.twig
@@ -0,0 +1,36 @@
+{#
+/**
+ * @file
+ * Theme override of a datetime form wrapper.
+ *
+ * Available variables:
+ * - content: The form element to be output, usually a datelist, or datetime.
+ * - title: The title of the form element.
+ * - title_attributes: HTML attributes for the title wrapper.
+ * - description: Description text for the form element.
+ * - required: An indicator for whether the associated form element is required.
+ *
+ * @see template_preprocess_datetime_wrapper()
+ */
+#}
+{%
+  set title_classes = [
+    'label',
+    required ? 'js-form-required',
+    required ? 'form-required',
+  ]
+%}
+{% if title %}
+  <h4{{ title_attributes.addClass(title_classes) }}>{{ title }}</h4>
+{% endif %}
+{{ content }}
+{% if errors %}
+  <div class="form-item--error-message">
+    <strong>{{ errors }}</strong>
+  </div>
+{% endif %}
+{% if description %}
+  <div{{ description_attributes.addClass('description') }}>
+    {{ description }}
+  </div>
+{% endif %}
diff --git a/web/themes/seven/templates/classy/form/fieldset.html.twig b/web/themes/seven/templates/classy/form/fieldset.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..93b5f54d8964c748ddce16a004bb78f2b21abc5f
--- /dev/null
+++ b/web/themes/seven/templates/classy/form/fieldset.html.twig
@@ -0,0 +1,68 @@
+{#
+/**
+ * @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.
+ * - 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 (default).
+ *   - invisible: The description is output after the element, hidden visually
+ *     but available to screen readers.
+ * - 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',
+  ]
+%}
+<fieldset{{ attributes.addClass(classes) }}>
+  {%
+    set legend_span_classes = [
+      'fieldset-legend',
+      required ? 'js-form-required',
+      required ? 'form-required',
+    ]
+  %}
+  {#  Always wrap fieldset legends in a <span> for CSS positioning. #}
+  <legend{{ legend.attributes }}>
+    <span{{ legend_span.attributes.addClass(legend_span_classes) }}>{{ legend.title }}</span>
+  </legend>
+  <div class="fieldset-wrapper">
+    {% if description_display == 'before' and description.content %}
+      <div{{ description.attributes.addClass('description') }}>{{ description.content }}</div>
+    {% endif %}
+    {% if errors %}
+      <div class="form-item--error-message">
+        <strong>{{ errors }}</strong>
+      </div>
+    {% endif %}
+    {% if prefix %}
+      <span class="field-prefix">{{ prefix }}</span>
+    {% endif %}
+    {{ children }}
+    {% if suffix %}
+      <span class="field-suffix">{{ suffix }}</span>
+    {% endif %}
+    {% if description_display in ['after', 'invisible'] and description.content %}
+      <div{{ description.attributes.addClass('description') }}>{{ description.content }}</div>
+    {% endif %}
+  </div>
+</fieldset>
diff --git a/web/themes/seven/templates/classy/form/form-element-label.html.twig b/web/themes/seven/templates/classy/form/form-element-label.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..7c2f8f222340cda34c7a3f5d66b469730e8cad60
--- /dev/null
+++ b/web/themes/seven/templates/classy/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 -%}
+  <label{{ attributes.addClass(classes) }}>{{ title }}</label>
+{%- endif %}
diff --git a/web/themes/seven/templates/classy/form/form-element.html.twig b/web/themes/seven/templates/classy/form/form-element.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..3bde4f711545eb771de7e4df4815bd726b818153
--- /dev/null
+++ b/web/themes/seven/templates/classy/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',
+  ]
+%}
+<div{{ attributes.addClass(classes) }}>
+  {% if label_display in ['before', 'invisible'] %}
+    {{ label }}
+  {% endif %}
+  {% if prefix is not empty %}
+    <span class="field-prefix">{{ prefix }}</span>
+  {% endif %}
+  {% if description_display == 'before' and description.content %}
+    <div{{ description.attributes }}>
+      {{ description.content }}
+    </div>
+  {% endif %}
+  {{ children }}
+  {% if suffix is not empty %}
+    <span class="field-suffix">{{ suffix }}</span>
+  {% endif %}
+  {% if label_display == 'after' %}
+    {{ label }}
+  {% endif %}
+  {% if errors %}
+    <div class="form-item--error-message">
+      <strong>{{ errors }}</strong>
+    </div>
+  {% endif %}
+  {% if description_display in ['after', 'invisible'] and description.content %}
+    <div{{ description.attributes.addClass(description_classes) }}>
+      {{ description.content }}
+    </div>
+  {% endif %}
+</div>
diff --git a/web/themes/seven/templates/classy/form/radios.html.twig b/web/themes/seven/templates/classy/form/radios.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..2e4bafd41c68f038e322cc643cc3c595dd0b9df6
--- /dev/null
+++ b/web/themes/seven/templates/classy/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()
+ */
+#}
+<div{{ attributes.addClass('form-radios') }}>{{ children }}</div>
diff --git a/web/themes/seven/templates/classy/form/textarea.html.twig b/web/themes/seven/templates/classy/form/textarea.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..99e1bde09059aa3424260dcc53cefb2113288ecb
--- /dev/null
+++ b/web/themes/seven/templates/classy/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 <textarea> element.
+ * - resizable: An indicator for whether the textarea is resizable.
+ * - required: An indicator for whether the textarea is required.
+ * - value: The textarea content.
+ *
+ * @see template_preprocess_textarea()
+ */
+#}
+{%
+  set classes = [
+    'form-textarea',
+    resizable ? 'resize-' ~ resizable,
+    required ? 'required',
+  ]
+%}
+<div{{ wrapper_attributes.addClass('form-textarea-wrapper') }}>
+  <textarea{{ attributes.addClass(classes) }}>{{ value }}</textarea>
+</div>
diff --git a/web/themes/seven/templates/classy/layout/book-export-html.html.twig b/web/themes/seven/templates/classy/layout/book-export-html.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..b7525f7efa88263beed101cbe8e0dcd4377ab5a8
--- /dev/null
+++ b/web/themes/seven/templates/classy/layout/book-export-html.html.twig
@@ -0,0 +1,45 @@
+{#
+/**
+ * @file
+ * Theme override for printed version of book outline.
+ *
+ * Available variables:
+ * - title: Top level node title.
+ * - head: Header tags.
+ * - language: Language object.
+ * - language_rtl: A flag indicating whether the current display language is a
+ *   right to left language.
+ * - base_url: URL to the home page.
+ * - contents: Nodes within the current outline rendered through
+ *   book-node-export-html.html.twig.
+ *
+ * @see template_preprocess_book_export_html()
+ */
+#}
+<!DOCTYPE html>
+<html{{ html_attributes }}>
+  <head>
+    <title>{{ title }}</title>
+    {{ page.head }}
+    <base href="{{ base_url }}" />
+    <link type="text/css" rel="stylesheet" href="misc/print.css" />
+  </head>
+  <body>
+    {#
+      The given node is embedded to its absolute depth in a top level section.
+      For example, a child node with depth 2 in the hierarchy is contained in
+      (otherwise empty) div elements corresponding to depth 0 and depth 1. This
+      is intended to support WYSIWYG output - e.g., level 3 sections always look
+      like level 3 sections, no matter their depth relative to the node selected
+      to be exported as printer-friendly HTML.
+    #}
+
+  {% if depth > 1 %}{% for i in 1..depth-1 %}
+    <div class="section-{{ i }}">
+  {% endfor %}{% endif %}
+  {{ contents }}
+  {% if depth > 1 %}{% for i in 1..depth-1 %}
+    </div>
+  {% endfor %}{% endif %}
+  </body>
+</html>
diff --git a/web/themes/seven/templates/classy/layout/html.html.twig b/web/themes/seven/templates/classy/layout/html.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4fe57a01cfdd5995db836693c453751d8ee11551
--- /dev/null
+++ b/web/themes/seven/templates/classy/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',
+  ]
+%}
+<!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>
diff --git a/web/themes/seven/templates/classy/layout/region.html.twig b/web/themes/seven/templates/classy/layout/region.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..95e71cec37e409bdfab1d8d90e0a192bede54e9c
--- /dev/null
+++ b/web/themes/seven/templates/classy/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 <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 %}
diff --git a/web/themes/seven/templates/classy/media-library/container--media-library-content.html.twig b/web/themes/seven/templates/classy/media-library/container--media-library-content.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..7c930e2c7b64980f3b1ea8413d143f2791f888b7
--- /dev/null
+++ b/web/themes/seven/templates/classy/media-library/container--media-library-content.html.twig
@@ -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 template_preprocess_container()
+ *
+ * @ingroup themeable
+ */
+#}
+{%
+  set classes = [
+    has_parent ? 'js-form-wrapper',
+    has_parent ? 'form-wrapper',
+    'media-library-content',
+  ]
+%}
+<div{{ attributes.addClass(classes) }}>{{ children }}</div>
diff --git a/web/themes/seven/templates/classy/media-library/container--media-library-widget-selection.html.twig b/web/themes/seven/templates/classy/media-library/container--media-library-widget-selection.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..7c0af44307f6ac054143fd886c80bdff1c84fbc1
--- /dev/null
+++ b/web/themes/seven/templates/classy/media-library/container--media-library-widget-selection.html.twig
@@ -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 template_preprocess_container()
+ *
+ * @ingroup themeable
+ */
+#}
+{%
+  set classes = [
+    has_parent ? 'js-form-wrapper',
+    has_parent ? 'form-wrapper',
+    'media-library-selection',
+  ]
+%}
+<div{{ attributes.addClass(classes) }}>{{ children }}</div>
diff --git a/web/themes/seven/templates/classy/media-library/links--media-library-menu.html.twig b/web/themes/seven/templates/classy/media-library/links--media-library-menu.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..b2361574a83ea94242507b1943ee7da8487c10eb
--- /dev/null
+++ b/web/themes/seven/templates/classy/media-library/links--media-library-menu.html.twig
@@ -0,0 +1,36 @@
+{% 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
+ *   http://www.w3.org/TR/WCAG-TECHS/H42.html for more information.
+ *
+ * @see classy_preprocess_links__media_library_menu()
+ * @see template_preprocess_links()
+ */
+#}
+{% set attributes = attributes.addClass('media-library-menu') %}
diff --git a/web/themes/seven/templates/classy/media-library/media--media-library.html.twig b/web/themes/seven/templates/classy/media-library/media--media-library.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e88635424fc07f47e181e5e894427f9e931c7bc8
--- /dev/null
+++ b/web/themes/seven/templates/classy/media-library/media--media-library.html.twig
@@ -0,0 +1,55 @@
+{#
+/**
+ * @file
+ * Theme override of a media item in the media library.
+ *
+ * This is used for media that the user can select from the grid of media
+ * items. It is not used for items that have already been selected in the
+ * corresponding field widget, or for items that have been previously selected
+ * before adding new media to the library.
+ *
+ * Available variables:
+ * - media: The 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:
+ *   - entity.getEntityTypeId() will return the entity type ID.
+ *   - entity.hasField('field_example') returns TRUE if the entity includes
+ *     field_example. (This does not indicate the presence of a value in this
+ *     field.)
+ *   Calling other methods, such as entity.delete(), will result in an exception.
+ *   See \Drupal\Core\Entity\EntityInterface for a full list of methods.
+ * - name: Name of the media.
+ * - content: Media content.
+ * - 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".
+ * - attributes: HTML attributes for the containing element.
+ * - title_attributes: Same as attributes, except applied to the main title
+ *   tag that appears in the template.
+ * - url: Direct URL of the media.
+ * - preview_attributes: HTML attributes for the preview wrapper.
+ * - metadata_attributes: HTML attributes for the expandable metadata area.
+ * - status: Whether or not the Media is published.
+ *
+ * @see template_preprocess_media()
+ *
+ * @ingroup themeable
+ */
+#}
+<article{{ attributes }}>
+  {% if content %}
+    <div{{ preview_attributes.addClass('media-library-item__preview js-media-library-item-preview') }}>
+      {{ content|without('name') }}
+    </div>
+    {% if not status %}
+      <div class="media-library-item__status">{{ "unpublished" | t }}</div>
+    {% endif %}
+    <div{{ metadata_attributes.addClass('media-library-item__attributes') }}>
+      <div class="media-library-item__name">
+        {{ name }}
+      </div>
+    </div>
+  {% endif %}
+</article>
diff --git a/web/themes/seven/templates/classy/media-library/media-library-item--small.html.twig b/web/themes/seven/templates/classy/media-library/media-library-item--small.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..ba03858b7f82cd64b985264cc9f120bd80db6038
--- /dev/null
+++ b/web/themes/seven/templates/classy/media-library/media-library-item--small.html.twig
@@ -0,0 +1,31 @@
+{#
+/**
+ * @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 seven_preprocess_media_library_item__small()
+ * @see seven_preprocess_media_library_item__widget()
+ * @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>
diff --git a/web/themes/seven/templates/classy/media-library/media-library-item.html.twig b/web/themes/seven/templates/classy/media-library/media-library-item.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..297780e0f736548762e4bef93aa85e98c84b9142
--- /dev/null
+++ b/web/themes/seven/templates/classy/media-library/media-library-item.html.twig
@@ -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>
diff --git a/web/themes/seven/templates/classy/media-library/media-library-wrapper.html.twig b/web/themes/seven/templates/classy/media-library/media-library-wrapper.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4d5458ac795566fe697dd8031d4f8cb1449054ca
--- /dev/null
+++ b/web/themes/seven/templates/classy/media-library/media-library-wrapper.html.twig
@@ -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>
diff --git a/web/themes/seven/templates/classy/misc/help-section.html.twig b/web/themes/seven/templates/classy/misc/help-section.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..6cfaa38da26655da2c5e1915b603563fc877accc
--- /dev/null
+++ b/web/themes/seven/templates/classy/misc/help-section.html.twig
@@ -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>
diff --git a/web/themes/seven/templates/classy/misc/progress-bar.html.twig b/web/themes/seven/templates/classy/misc/progress-bar.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..5c25bd7d3fa24db42617a9581f2f4212d13d91be
--- /dev/null
+++ b/web/themes/seven/templates/classy/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('seven/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>
diff --git a/web/themes/seven/templates/classy/misc/rdf-metadata.html.twig b/web/themes/seven/templates/classy/misc/rdf-metadata.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..acc62df16d41b5e10442c5ef92e61ae01a511c28
--- /dev/null
+++ b/web/themes/seven/templates/classy/misc/rdf-metadata.html.twig
@@ -0,0 +1,20 @@
+{#
+/**
+ * @file
+ * Theme override for empty spans with RDF attributes.
+ *
+ * The XHTML+RDFa doctype allows either <span></span> or <span /> syntax to
+ * be used, but for maximum browser compatibility, W3C recommends the
+ * former when serving pages using the text/html media type, see
+ * http://www.w3.org/TR/xhtml1/#C_3.
+ *
+ * Available variables:
+ * - metadata: Each item within corresponds to its own set of attributes,
+ *   and therefore, needs its own 'attributes' element.
+ *
+ * @see template_preprocess_rdf_metadata()
+ */
+#}
+{% for attributes in metadata %}
+  <span{{ attributes.addClass('rdf-meta', 'hidden') }}></span>
+{% endfor %}
diff --git a/web/themes/seven/templates/classy/misc/status-messages.html.twig b/web/themes/seven/templates/classy/misc/status-messages.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..7dda6c040c49d7fc9bde68e76182fc5487183c4f
--- /dev/null
+++ b/web/themes/seven/templates/classy/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.
+ */
+#}
+<div data-drupal-messages>
+{% block messages %}
+{% for type, messages in message_list %}
+  {%
+    set classes = [
+      'messages',
+      'messages--' ~ type,
+    ]
+  %}
+  <div role="contentinfo" aria-label="{{ status_headings[type] }}"{{ attributes.addClass(classes)|without('role', 'aria-label') }}>
+    {% if type == 'error' %}
+      <div role="alert">
+    {% endif %}
+      {% if status_headings[type] %}
+        <h2 class="visually-hidden">{{ status_headings[type] }}</h2>
+      {% endif %}
+      {% if messages|length > 1 %}
+        <ul class="messages__list">
+          {% for message in messages %}
+            <li class="messages__item">{{ message }}</li>
+          {% endfor %}
+        </ul>
+      {% else %}
+        {{ messages|first }}
+      {% endif %}
+    {% if type == 'error' %}
+      </div>
+    {% endif %}
+  </div>
+  {# Remove type specific classes. #}
+  {% set attributes = attributes.removeClass(classes) %}
+{% endfor %}
+{% endblock messages %}
+</div>
diff --git a/web/themes/seven/templates/classy/navigation/book-all-books-block.html.twig b/web/themes/seven/templates/classy/navigation/book-all-books-block.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..b4cb64de3d5bfdb2bbbfdf2a32793f53d825a9c6
--- /dev/null
+++ b/web/themes/seven/templates/classy/navigation/book-all-books-block.html.twig
@@ -0,0 +1,22 @@
+{#
+/**
+ * @file
+ * Theme override for rendering book outlines within a block.
+ *
+ * This template is used only when the block is configured to "show block on all
+ * pages", which presents multiple independent books on all pages.
+ *
+ * Available variables:
+ * - book_menus: Book outlines.
+ *   - id: The parent book ID.
+ *   - title: The parent book title.
+ *   - menu: The top-level book links.
+ *
+ * @see template_preprocess_book_all_books_block()
+ */
+#}
+{% for book in book_menus %}
+  <nav id="book-block-menu-{{ book.id }}" class="book-block-menu" role="navigation" aria-label="{% trans %}Book outline for {{ book.title }}{% endtrans %}">
+    {{ book.menu }}
+  </nav>
+{% endfor %}
diff --git a/web/themes/seven/templates/classy/navigation/book-navigation.html.twig b/web/themes/seven/templates/classy/navigation/book-navigation.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..eac98b40022c4cd6bf72b805a0da00a42d01cc61
--- /dev/null
+++ b/web/themes/seven/templates/classy/navigation/book-navigation.html.twig
@@ -0,0 +1,56 @@
+{#
+/**
+ * @file
+ * Theme override to navigate books.
+ *
+ * Presented under nodes that are a part of book outlines.
+ *
+ * Available variables:
+ * - tree: The immediate children of the current node rendered as an unordered
+ *   list.
+ * - current_depth: Depth of the current node within the book outline. Provided
+ *   for context.
+ * - prev_url: URL to the previous node.
+ * - prev_title: Title of the previous node.
+ * - parent_url: URL to the parent node.
+ * - parent_title: Title of the parent node. Not printed by default. Provided
+ *   as an option.
+ * - next_url: URL to the next node.
+ * - next_title: Title of the next node.
+ * - has_links: Flags TRUE whenever the previous, parent or next data has a
+ *   value.
+ * - book_id: The book ID of the current outline being viewed. Same as the node
+ *   ID containing the entire outline. Provided for context.
+ * - book_url: The book/node URL of the current outline being viewed. Provided
+ *   as an option. Not used by default.
+ * - book_title: The book/node title of the current outline being viewed.
+ *
+ * @see template_preprocess_book_navigation()
+ */
+#}
+{{ attach_library('seven/classy.book-navigation') }}
+{% if tree or has_links %}
+  <nav id="book-navigation-{{ book_id }}" class="book-navigation" role="navigation" aria-labelledby="book-label-{{ book_id }}">
+    {{ tree }}
+    {% if has_links %}
+      <h2 class="visually-hidden" id="book-label-{{ book_id }}">{{ 'Book traversal links for'|t }} {{ book_title }}</h2>
+      <ul class="book-pager">
+      {% if prev_url %}
+        <li class="book-pager__item book-pager__item--previous">
+          <a href="{{ prev_url }}" rel="prev" title="{{ 'Go to previous page'|t }}"><b>{{ '‹'|t }}</b> {{ prev_title }}</a>
+        </li>
+      {% endif %}
+      {% if parent_url %}
+        <li class="book-pager__item book-pager__item--center">
+          <a href="{{ parent_url }}" title="{{ 'Go to parent page'|t }}">{{ 'Up'|t }}</a>
+        </li>
+      {% endif %}
+      {% if next_url %}
+        <li class="book-pager__item book-pager__item--next">
+          <a href="{{ next_url }}" rel="next" title="{{ 'Go to next page'|t }}">{{ next_title }} <b>{{ '›'|t }}</b></a>
+        </li>
+      {% endif %}
+    </ul>
+    {% endif %}
+  </nav>
+{% endif %}
diff --git a/web/themes/seven/templates/classy/navigation/book-tree.html.twig b/web/themes/seven/templates/classy/navigation/book-tree.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..fba921921e8ce419e46d6a7a704d1645f71d01d6
--- /dev/null
+++ b/web/themes/seven/templates/classy/navigation/book-tree.html.twig
@@ -0,0 +1,55 @@
+{#
+/**
+ * @file
+ * Theme override to display a book tree.
+ *
+ * Returns HTML for a wrapper for a book sub-tree.
+ *
+ * Available variables:
+ * - items: A nested list of book items. Each book item contains:
+ *   - attributes: HTML attributes for the book item.
+ *   - below: The book item child items.
+ *   - title: The book link title.
+ *   - url: The book link URL, instance of \Drupal\Core\Url.
+ *   - is_expanded: TRUE if the link has visible children within the current
+ *     book tree.
+ *   - is_collapsed: TRUE if the link has children within the current book tree
+ *     that are not currently visible.
+ *   - in_active_trail: TRUE if the link is in the active trail.
+ */
+#}
+{% import _self as book_tree %}
+
+{#
+  We call a macro which calls itself to render the full tree.
+  @see https://twig.symfony.com/doc/3.x/tags/macro.html
+#}
+{{ book_tree.book_links(items, attributes, 0) }}
+
+{% macro book_links(items, attributes, menu_level) %}
+  {% import _self as book_tree %}
+  {% 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 %}
+          {{ book_tree.book_links(item.below, attributes, menu_level + 1) }}
+        {% endif %}
+      </li>
+    {% endfor %}
+    </ul>
+  {% endif %}
+{% endmacro %}
diff --git a/web/themes/seven/templates/classy/navigation/breadcrumb.html.twig b/web/themes/seven/templates/classy/navigation/breadcrumb.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..7dc08c5207eff25b57e6cbdcefbc95db1ef4a951
--- /dev/null
+++ b/web/themes/seven/templates/classy/navigation/breadcrumb.html.twig
@@ -0,0 +1,25 @@
+{#
+/**
+ * @file
+ * Theme override for a breadcrumb trail.
+ *
+ * Available variables:
+ * - breadcrumb: Breadcrumb trail items.
+ */
+#}
+{% if breadcrumb %}
+  <nav class="breadcrumb" role="navigation" aria-labelledby="system-breadcrumb">
+    <h2 id="system-breadcrumb" class="visually-hidden">{{ 'Breadcrumb'|t }}</h2>
+    <ol>
+    {% for item in breadcrumb %}
+      <li>
+        {% if item.url %}
+          <a href="{{ item.url }}">{{ item.text }}</a>
+        {% else %}
+          {{ item.text }}
+        {% endif %}
+      </li>
+    {% endfor %}
+    </ol>
+  </nav>
+{% endif %}
diff --git a/web/themes/seven/templates/classy/navigation/menu-local-task.html.twig b/web/themes/seven/templates/classy/navigation/menu-local-task.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..b8559815b9e937120f8fd4f87bcfe27e7a30c0b0
--- /dev/null
+++ b/web/themes/seven/templates/classy/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()
+ */
+#}
+<li{{ attributes.addClass(is_active ? 'is-active') }}>{{ link }}</li>
diff --git a/web/themes/seven/templates/classy/navigation/menu.html.twig b/web/themes/seven/templates/classy/navigation/menu.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..ef04cedd1756737f3fb60e8c1890f24242dcdc45
--- /dev/null
+++ b/web/themes/seven/templates/classy/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 %}
+      <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 %}
diff --git a/web/themes/seven/templates/classy/navigation/toolbar.html.twig b/web/themes/seven/templates/classy/navigation/toolbar.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..5ef3ffad3a3283c4ed4f21b8551271f600cbfe06
--- /dev/null
+++ b/web/themes/seven/templates/classy/navigation/toolbar.html.twig
@@ -0,0 +1,46 @@
+{#
+/**
+ * @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 }}
+        {% apply spaceless %}
+          <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>
+        {% endapply %}
+      </div>
+    {% endfor %}
+  </nav>
+  {{ remainder }}
+</div>
diff --git a/web/themes/seven/templates/classy/user/forum-submitted.html.twig b/web/themes/seven/templates/classy/user/forum-submitted.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..57311e96b59b19efc03430cb193a4606d9cbe782
--- /dev/null
+++ b/web/themes/seven/templates/classy/user/forum-submitted.html.twig
@@ -0,0 +1,21 @@
+{#
+/**
+ * @file
+ * Theme override for a forum post submission string.
+ *
+ * The submission string indicates when and by whom a topic was submitted.
+ *
+ * Available variables:
+ * - author: The author of the post.
+ * - time: How long ago the post was created.
+ * - topic: An object with the raw data of the post. Potentially unsafe. Be
+ *   sure to clean this data before printing.
+ *
+ * @see template_preprocess_forum_submitted()
+ */
+#}
+{% if time %}
+  <span class="submitted">{% trans %}By {{ author }} {{ time }} ago{% endtrans %}</span>
+{% else %}
+  {{ 'n/a'|t }}
+{% endif %}
diff --git a/web/themes/seven/templates/classy/user/user.html.twig b/web/themes/seven/templates/classy/user/user.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..9a824effd35f59462e2bc14b740fde5f437f50a3
--- /dev/null
+++ b/web/themes/seven/templates/classy/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()
+ */
+#}
+<article{{ attributes.addClass('profile') }}>
+  {% if content %}
+    {{- content -}}
+  {% endif %}
+</article>
diff --git a/web/themes/seven/templates/classy/user/username.html.twig b/web/themes/seven/templates/classy/user/username.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..df694dff698073f72e1addd165d4891db8aa67a6
--- /dev/null
+++ b/web/themes/seven/templates/classy/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 -%}
+  <a{{ attributes.addClass('username') }}>{{ name }}{{ extra }}</a>
+{%- else -%}
+  <span{{ attributes }}>{{ name }}{{ extra }}</span>
+{%- endif -%}
diff --git a/web/themes/seven/templates/classy/views/views-exposed-form.html.twig b/web/themes/seven/templates/classy/views/views-exposed-form.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..3c679ae58326b5df55b78698003767192e72d4dc
--- /dev/null
+++ b/web/themes/seven/templates/classy/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 %}
+<div class="form--inline clearfix">
+  {{ form }}
+</div>
diff --git a/web/themes/seven/templates/classy/views/views-mini-pager.html.twig b/web/themes/seven/templates/classy/views/views-mini-pager.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4b46f2bb1f698633968b8e0290d2730cd1ef52aa
--- /dev/null
+++ b/web/themes/seven/templates/classy/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 %}
+  <nav class="pager" role="navigation" aria-labelledby="{{ heading_id }}">
+    <h4 id="{{ heading_id }}" class="pager__heading visually-hidden">{{ 'Pagination'|t }}</h4>
+    <ul class="pager__items js-pager__items">
+      {% if items.previous %}
+        <li class="pager__item pager__item--previous">
+          <a href="{{ items.previous.href }}" title="{{ 'Go to previous page'|t }}" rel="prev"{{ items.previous.attributes|without('href', 'title', 'rel') }}>
+            <span class="visually-hidden">{{ 'Previous page'|t }}</span>
+            <span aria-hidden="true">{{ items.previous.text|default('‹‹'|t) }}</span>
+          </a>
+        </li>
+      {% endif %}
+      {% if items.current %}
+        <li class="pager__item is-active">
+          {% trans %}
+            Page {{ items.current }}
+          {% endtrans %}
+        </li>
+      {% endif %}
+      {% if items.next %}
+        <li class="pager__item pager__item--next">
+          <a href="{{ items.next.href }}" title="{{ 'Go to next page'|t }}" rel="next"{{ items.next.attributes|without('href', 'title', 'rel') }}>
+            <span class="visually-hidden">{{ 'Next page'|t }}</span>
+            <span aria-hidden="true">{{ items.next.text|default('››'|t) }}</span>
+          </a>
+        </li>
+      {% endif %}
+    </ul>
+  </nav>
+{% endif %}
diff --git a/web/themes/seven/templates/classy/views/views-view-grouping.html.twig b/web/themes/seven/templates/classy/views/views-view-grouping.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..44905e56b7942e64446eba7fef095974f48ec64b
--- /dev/null
+++ b/web/themes/seven/templates/classy/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()
+ */
+#}
+<div class="view-grouping">
+  <div class="view-grouping-header">{{ title }}</div>
+  <div class="view-grouping-content">{{ content }}</div>
+</div>
diff --git a/web/themes/seven/templates/classy/views/views-view-row-rss.html.twig b/web/themes/seven/templates/classy/views/views-view-row-rss.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..aee08aee6e27407c9187efe69ec02b92ee8a3b05
--- /dev/null
+++ b/web/themes/seven/templates/classy/views/views-view-row-rss.html.twig
@@ -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>
diff --git a/web/themes/seven/templates/classy/views/views-view-summary-unformatted.html.twig b/web/themes/seven/templates/classy/views/views-view-summary-unformatted.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..151734e948eea2fbb1c29261a0c169c1cd49581e
--- /dev/null
+++ b/web/themes/seven/templates/classy/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 ? '<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 %}
diff --git a/web/themes/seven/templates/classy/views/views-view-summary.html.twig b/web/themes/seven/templates/classy/views/views-view-summary.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..3190a45ada4fb066a2fbae94e0b39ae8f326e186
--- /dev/null
+++ b/web/themes/seven/templates/classy/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()
+ */
+#}
+<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>
diff --git a/web/themes/seven/templates/classy/views/views-view-table.html.twig b/web/themes/seven/templates/classy/views/views-view-table.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..edc14983da77f19519d5e5fcba6230c281cc634a
--- /dev/null
+++ b/web/themes/seven/templates/classy/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',
+  ]
+%}
+<table{{ attributes.addClass(classes) }}>
+  {% if caption_needed %}
+    <caption>
+    {% if caption %}
+      {{ caption }}
+    {% else %}
+      {{ title }}
+    {% endif %}
+    {% if (summary_element is not empty) %}
+      {{ summary_element }}
+    {% endif %}
+    </caption>
+  {% endif %}
+  {% if header %}
+    <thead>
+      <tr>
+        {% for key, column in header %}
+          {% if column.default_classes %}
+            {%
+              set column_classes = [
+                'views-field',
+                'views-field-' ~ fields[key],
+              ]
+            %}
+          {% endif %}
+          <th{{ column.attributes.addClass(column_classes).setAttribute('scope', 'col') }}>
+            {%- if column.wrapper_element -%}
+              <{{ column.wrapper_element }}>
+                {%- if column.url -%}
+                  <a href="{{ column.url }}" title="{{ column.title }}" rel="nofollow">{{ column.content }}{{ column.sort_indicator }}</a>
+                {%- else -%}
+                  {{ column.content }}{{ column.sort_indicator }}
+                {%- endif -%}
+              </{{ column.wrapper_element }}>
+            {%- else -%}
+              {%- if column.url -%}
+                <a href="{{ column.url }}" title="{{ column.title }}" rel="nofollow">{{ column.content }}{{ column.sort_indicator }}</a>
+              {%- else -%}
+                {{- column.content }}{{ column.sort_indicator }}
+              {%- endif -%}
+            {%- endif -%}
+          </th>
+        {% endfor %}
+      </tr>
+    </thead>
+  {% endif %}
+  <tbody>
+    {% for row in rows %}
+      <tr{{ row.attributes }}>
+        {% 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 %}
+          <td{{ column.attributes.addClass(column_classes) }}>
+            {%- if column.wrapper_element -%}
+              <{{ column.wrapper_element }}>
+              {% for content in column.content %}
+                {{ content.separator }}{{ content.field_output }}
+              {% endfor %}
+              </{{ column.wrapper_element }}>
+            {%- else -%}
+              {% for content in column.content %}
+                {{- content.separator }}{{ content.field_output -}}
+              {% endfor %}
+            {%- endif %}
+          </td>
+        {% endfor %}
+      </tr>
+    {% endfor %}
+  </tbody>
+</table>
diff --git a/web/themes/seven/templates/classy/views/views-view.html.twig b/web/themes/seven/templates/classy/views/views-view.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..251b0611dda6860b969faadcdbc08c9a84dfe8d8
--- /dev/null
+++ b/web/themes/seven/templates/classy/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,
+  ]
+%}
+<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>
diff --git a/web/themes/seven/templates/details.html.twig b/web/themes/seven/templates/details.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..316dee2f63c52be21df4298e4cbd16bde76a321a
--- /dev/null
+++ b/web/themes/seven/templates/details.html.twig
@@ -0,0 +1,52 @@
+{#
+/**
+ * @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()
+ */
+#}
+{#
+  Prefix 'details' class to avoid collision with Modernizr.
+
+  @todo Remove prefix after https://www.drupal.org/node/2981732 has been solved.
+#}
+<details{{ attributes.addClass('seven-details') }}>
+  {%- if title -%}
+    {%
+      set summary_classes = [
+        'seven-details__summary',
+        required ? 'js-form-required',
+        required ? 'form-required',
+      ]
+    %}
+    <summary{{ summary_attributes.addClass(summary_classes) }}>
+      <span>{{ title }}</span>
+    </summary>
+  {%- endif -%}
+  <div class="seven-details__wrapper details-wrapper">
+    {% if errors %}
+      <div class="form-item form-item--error-message">
+        <strong>{{ errors }}</strong>
+      </div>
+    {% endif %}
+    {%- if description -%}
+      <div class="seven-details__description">{{ description }}</div>
+    {%- endif -%}
+    {%- if children -%}
+      {{ children }}
+    {%- endif -%}
+    {%- if value -%}
+      {{ value }}
+    {%- endif -%}
+  </div>
+</details>
diff --git a/web/themes/seven/templates/entity-add-list.html.twig b/web/themes/seven/templates/entity-add-list.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..04d493f44e62a1465d63d2d892a966977fa76619
--- /dev/null
+++ b/web/themes/seven/templates/entity-add-list.html.twig
@@ -0,0 +1,27 @@
+{#
+/**
+ * @file
+ * Theme override to present a list of available bundles.
+ *
+ * Available variables:
+ *   - bundles: A list of bundles, each with the following properties:
+ *     - label: Bundle label.
+ *     - description: Bundle description.
+ *     - add_link: Link to create an entity of this bundle.
+ *   - add_bundle_message: The message shown when there are no bundles. Only
+ *                         available if the entity type uses bundle entities.
+ *
+ * @see template_preprocess_entity_add_list()
+ */
+#}
+{% if bundles is not empty %}
+  <ul class="admin-list">
+    {% for bundle in bundles %}
+      <li class="clearfix"><a href="{{ bundle.add_link.url }}"><span class="label">{{ bundle.label }}</span><div class="description">{{ bundle.description }}</div></a></li>
+    {% endfor %}
+  </ul>
+{% elseif add_bundle_message is not empty %}
+  <p>
+    {{ add_bundle_message }}
+  </p>
+{% endif %}
diff --git a/web/themes/seven/templates/field/file-link.html.twig b/web/themes/seven/templates/field/file-link.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..739fc0f7e6adbe29a718c99348ff1d4759cdeea9
--- /dev/null
+++ b/web/themes/seven/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('seven/classy.file') }}
+<span{{ attributes }}>{{ icon }} {{ link }}</span>
diff --git a/web/themes/seven/templates/image-widget.html.twig b/web/themes/seven/templates/image-widget.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..2d6f4014ed5557791a4a9f79ba7984ad1fe3ff1b
--- /dev/null
+++ b/web/themes/seven/templates/image-widget.html.twig
@@ -0,0 +1,25 @@
+{#
+/**
+ * @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()
+ */
+#}
+{{ attach_library('seven/classy.image-widget') }}
+
+<div{{ attributes }}>
+  {% if data.preview %}
+    <div class="image-preview">
+      {{ data.preview }}
+    </div>
+  {% endif %}
+  <div class="image-widget-data">
+    {# Render widget data without the image preview that was output already. #}
+    {{ data|without('preview') }}
+  </div>
+</div>
diff --git a/web/themes/seven/templates/install-page.html.twig b/web/themes/seven/templates/install-page.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..f1335a8a4e1fd17401f531167bc0fd67ca8f1094
--- /dev/null
+++ b/web/themes/seven/templates/install-page.html.twig
@@ -0,0 +1,51 @@
+{#
+/**
+ * @file
+ * Seven theme implementation to display a Drupal installation page.
+ *
+ * All available variables are mirrored in page.html.twig.
+ * Some may be blank but they are provided for consistency.
+ *
+ * @see template_preprocess_install_page()
+ */
+#}
+<div class="layout-container">
+
+  <header role="banner">
+    {% if site_name %}
+      <h1 class="page-title">
+        {{ site_name }}
+        {% if site_version %}
+          <span class="site-version">{{ site_version }}</span>
+        {% endif %}
+      </h1>
+    {% endif %}
+  </header>
+
+  {% if page.sidebar_first %}
+    <aside class="layout-sidebar-first" role="complementary">
+      {{ page.sidebar_first }}
+    </aside>{# /.layout-sidebar-first #}
+  {% endif %}
+
+  <main role="main">
+    {% if title %}
+      <h2 class="heading-a">{{ title }}</h2>
+    {% endif %}
+    {{ page.highlighted }}
+    {{ page.content }}
+  </main>
+
+  {% if page.sidebar_second %}
+    <aside class="layout-sidebar-second" role="complementary">
+      {{ page.sidebar_second }}
+    </aside>{# /.layout-sidebar-second #}
+  {% endif %}
+
+  {% if page.page_bottom %}
+    <footer role="contentinfo">
+      {{ page.page_bottom }}
+    </footer>
+  {% endif %}
+
+</div>{# /.layout-container #}
diff --git a/web/themes/seven/templates/maintenance-page.html.twig b/web/themes/seven/templates/maintenance-page.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..2286e8829e065d03d1a832d190c5fe11f066a88f
--- /dev/null
+++ b/web/themes/seven/templates/maintenance-page.html.twig
@@ -0,0 +1,40 @@
+{#
+/**
+ * @file
+ * Seven's theme implementation 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()
+ */
+#}
+<div class="layout-container">
+
+  <header role="banner">
+    {% if site_name %}
+      <h1 class="page-title">{{ site_name }}</h1>
+    {% endif %}
+  </header>
+
+  {% if page.sidebar_first %}
+    <aside class="layout-sidebar-first" role="complementary">
+      {{ page.sidebar_first }}
+    </aside>{# /.layout-sidebar-first #}
+  {% endif %}
+
+  <main role="main">
+    {% if title %}
+      <h1>{{ title }}</h1>
+    {% endif %}
+    {{ page.highlighted }}
+    {{ page.content }}
+  </main>
+
+  {% if page.page_bottom %}
+    <footer role="contentinfo">
+      {{ page.page_bottom }}
+    </footer>
+  {% endif %}
+
+</div>{# /.layout-container #}
diff --git a/web/themes/seven/templates/media-library/details--media-library-add-form-selected-media.html.twig b/web/themes/seven/templates/media-library/details--media-library-add-form-selected-media.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..6d62c3fced7f6288381cb1b977173ad05bfdf28c
--- /dev/null
+++ b/web/themes/seven/templates/media-library/details--media-library-add-form-selected-media.html.twig
@@ -0,0 +1,20 @@
+{% extends "details.html.twig" %}
+{#
+/**
+ * @file
+ * Theme override for the "Additional selected media" area of the modal media
+ * library dialog.
+ *
+ * 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()
+ */
+#}
+{% set attributes = attributes.addClass('media-library-add-form__selected-media seven-details') %}
diff --git a/web/themes/seven/templates/media-library/fieldset--media-library-widget.html.twig b/web/themes/seven/templates/media-library/fieldset--media-library-widget.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..93d7267cc5321632a4e30b2cafe23f597f4f9aa1
--- /dev/null
+++ b/web/themes/seven/templates/media-library/fieldset--media-library-widget.html.twig
@@ -0,0 +1,64 @@
+{#
+/**
+ * @file
+ * Theme override for the media library widget.
+ *
+ * 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 seven_preprocess_fieldset__media_library_widget()
+ * @see template_preprocess_fieldset()
+ */
+#}
+{%
+  set classes = [
+    'js-form-item',
+    'form-item',
+    'js-form-wrapper',
+    'form-wrapper',
+    'media-library-widget',
+  ]
+%}
+<fieldset{{ attributes.addClass(classes) }}>
+  {%
+    set legend_span_classes = [
+      'fieldset-legend',
+      required ? 'js-form-required',
+      required ? 'form-required',
+    ]
+  %}
+  {#  Always wrap fieldset legends in a <span> for CSS positioning. #}
+  <legend{{ legend.attributes }}>
+    <span{{ legend_span.attributes.addClass(legend_span_classes) }}>{{ legend.title }}</span>
+  </legend>
+  <div class="fieldset-wrapper">
+    {% if errors %}
+      <div class="form-item--error-message">
+        <strong>{{ errors }}</strong>
+      </div>
+    {% endif %}
+    {% if prefix.empty_selection %}
+      <p class="media-library-widget-empty-text">{{ prefix.empty_selection }}</p>
+    {% elseif prefix.weight_toggle %}
+      {{ prefix.weight_toggle }}
+    {% endif %}
+    {{ children }}
+    {% if suffix %}
+      <span class="field-suffix">{{ suffix }}</span>
+    {% endif %}
+    {% if description.content %}
+      <div{{ description.attributes.addClass('description') }}>{{ description.content }}</div>
+    {% endif %}
+  </div>
+</fieldset>
diff --git a/web/themes/seven/templates/media-library/item-list--media-library-add-form-media-list.html.twig b/web/themes/seven/templates/media-library/item-list--media-library-add-form-media-list.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..27cfe2bd26ae634980ce5bd5d4aed6784dfd956e
--- /dev/null
+++ b/web/themes/seven/templates/media-library/item-list--media-library-add-form-media-list.html.twig
@@ -0,0 +1,33 @@
+{#
+/**
+ * @file
+ * Theme override for a list of new, unsaved media items being added in the
+ * modal media library dialog.
+ *
+ * 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 seven_preprocess_item_list__media_library_add_form_media_list()
+ * @see template_preprocess_item_list()
+ */
+#}
+{% if items -%}
+  {%- if title is not empty -%}
+    <h3>{{ title }}</h3>
+  {%- endif -%}
+  <{{ list_type }}{{ attributes.addClass('media-library-add-form__added-media') }}>
+  {%- for item in items -%}
+    <li{{ item.attributes.addClass('media-library-add-form__media') }}>{{ item.value }}</li>
+  {%- endfor -%}
+  </{{ list_type }}>
+{%- endif %}
diff --git a/web/themes/seven/templates/media-library/views-view--media_library.html.twig b/web/themes/seven/templates/media-library/views-view--media_library.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4321cc3d53c22eff97dd7551d51535af92b916da
--- /dev/null
+++ b/web/themes/seven/templates/media-library/views-view--media_library.html.twig
@@ -0,0 +1,95 @@
+{#
+/**
+ * @file
+ * Theme override for the media_library 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 exposed %}
+    <div class="view-filters">
+      {{ exposed }}
+    </div>
+  {% endif %}
+  {% if header %}
+    <div class="view-header">
+      {{ header }}
+    </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>
diff --git a/web/themes/seven/templates/media-library/views-view-unformatted--media-library.html.twig b/web/themes/seven/templates/media-library/views-view-unformatted--media-library.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4bc33e0e869e5f9f17df02da1355434f06357964
--- /dev/null
+++ b/web/themes/seven/templates/media-library/views-view-unformatted--media-library.html.twig
@@ -0,0 +1,34 @@
+{#
+/**
+ * @file
+ * Theme override for the media_library display 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 %}
+  <h3>{{ title }}</h3>
+{% endif %}
+<div class="media-library-views-form__rows">
+  {% for row in rows %}
+    {%
+      set row_classes = [
+        default_row_class ? 'views-row',
+        'media-library-item',
+        'media-library-item--grid',
+      ]
+    %}
+    <div{{ row.attributes.addClass(row_classes) }}>
+      {{- row.content -}}
+    </div>
+  {% endfor %}
+</div>
diff --git a/web/themes/seven/templates/menu-local-tasks.html.twig b/web/themes/seven/templates/menu-local-tasks.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..b749127bc6479fce20c2b7c156e3993fd5a87a0e
--- /dev/null
+++ b/web/themes/seven/templates/menu-local-tasks.html.twig
@@ -0,0 +1,28 @@
+{#
+/**
+ * @file
+ * Seven theme implementation 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.
+ *
+ * @ingroup themeable
+ */
+#}
+{% if primary %}
+  <h2 id="primary-tabs-title" class="visually-hidden">{{ 'Primary tabs'|t }}</h2>
+  <nav role="navigation" class="is-horizontal is-collapsible" aria-labelledby="primary-tabs-title" data-drupal-nav-tabs>
+    <button class="reset-appearance tabs__tab tabs__trigger" aria-label="{{ 'Primary tabs display toggle'|t }}" data-drupal-nav-tabs-trigger>&bull;&bull;&bull;</button>
+    <ul class="tabs primary clearfix" data-drupal-nav-tabs-target>{{ primary }}</ul>
+  </nav>
+{% endif %}
+{% if secondary %}
+  <h2 id="secondary-tabs-title" class="visually-hidden">{{ 'Secondary tabs'|t }}</h2>
+  <nav role="navigation" class="is-horizontal" aria-labelledby="secondary-tabs-title" data-drupal-nav-tabs>
+    <ul class="tabs secondary clearfix">{{ secondary }}</ul>
+  </nav>
+{% endif %}
diff --git a/web/themes/seven/templates/node-add-list.html.twig b/web/themes/seven/templates/node-add-list.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..897dd1ea13c3425a1bde7c52445b0d559e19fc76
--- /dev/null
+++ b/web/themes/seven/templates/node-add-list.html.twig
@@ -0,0 +1,29 @@
+{#
+/**
+ * @file
+ * Seven's theme implementation to list node types available for adding content.
+ *
+ * Available variables:
+ * - types: List of content types. Each content type contains:
+ *   - url: Path to the add content of this type page.
+ *   - label: The title of this type of content.
+ *   - description: Description of this type of content.
+ *
+ * @see template_preprocess_node_add_list()
+ * @see seven_preprocess_node_add_list()
+ */
+#}
+{% if content %}
+  <ul class="admin-list">
+    {% for type in types %}
+      <li class="clearfix"><a href="{{ type.url }}"><span class="label">{{ type.label }}</span><div class="description">{{ type.description }}</div></a></li>
+    {% endfor %}
+  </ul>
+{% else %}
+  <p>
+    {% set create_content = path('node.type_add') %}
+    {% trans %}
+      You have not created any content types yet. Go to the <a href="{{ create_content }}">content type creation page</a> to add a new content type.
+    {% endtrans %}
+  </p>
+{% endif %}
diff --git a/web/themes/seven/templates/node-edit-form.html.twig b/web/themes/seven/templates/node-edit-form.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..cf747f92920b54c61e359565763c6a15c5aaa13e
--- /dev/null
+++ b/web/themes/seven/templates/node-edit-form.html.twig
@@ -0,0 +1,31 @@
+{#
+/**
+ * @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.
+ *
+ * @see seven_form_node_form_alter()
+ */
+#}
+<div class="layout-node-form clearfix">
+  <div class="layout-region layout-region-node-main">
+    {{ form|without('advanced', 'footer', 'actions') }}
+  </div>
+  <div class="layout-region layout-region-node-secondary">
+    {{ form.advanced }}
+  </div>
+  <div class="layout-region layout-region-node-footer">
+    <div class="layout-region-node-footer__content">
+      {{ form.footer }}
+      {{ form.actions }}
+    </div>
+  </div>
+</div>
diff --git a/web/themes/seven/templates/page.html.twig b/web/themes/seven/templates/page.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..1a1a89b0c31e822478dea33dc35ffa7a7213e720
--- /dev/null
+++ b/web/themes/seven/templates/page.html.twig
@@ -0,0 +1,62 @@
+{#
+/**
+ * @file
+ * Seven's theme implementation to display a single Drupal page.
+ *
+ * The doctype, html, head, and body tags are not in this template. Instead
+ * they can be found in the html.html.twig template normally located in the
+ * core/modules/system 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.pre_content: Items for the pre-content region.
+ * - page.breadcrumb: Items for the breadcrumb region.
+ * - page.highlighted: Items for the highlighted region.
+ * - page.help: Dynamic help text, mostly for admin pages.
+ * - page.content: The main content of the current page.
+ *
+ * @see template_preprocess_page()
+ * @see html.html.twig
+ */
+#}
+  <header class="content-header clearfix">
+    <div class="layout-container">
+      {{ page.header }}
+    </div>
+  </header>
+
+  <div class="layout-container">
+    {{ page.pre_content }}
+    {{ page.breadcrumb }}
+    <main class="page-content clearfix" role="main">
+      <div class="visually-hidden"><a id="main-content" tabindex="-1"></a></div>
+      {{ page.highlighted }}
+      {% if page.help %}
+        <div class="help">
+          {{ page.help }}
+        </div>
+      {% endif %}
+      {{ page.content }}
+    </main>
+
+  </div>
diff --git a/web/themes/seven/templates/status-report-counter.html.twig b/web/themes/seven/templates/status-report-counter.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..fe237b982e3464e57b8afa66b6928c58d56ae773
--- /dev/null
+++ b/web/themes/seven/templates/status-report-counter.html.twig
@@ -0,0 +1,26 @@
+{#
+/**
+ * @file
+ * Theme override for status report counter.
+ *
+ * Available variables:
+ * - amount: The number shown on counter.
+ * - text: The text shown on counter.
+ * - severity: The severity of the counter.
+ *
+ * @ingroup themeable
+ */
+#}
+{%
+  set classes = [
+    'system-status-counter',
+    'system-status-counter--' ~ severity,
+  ]
+%}
+<span{{ attributes.addClass(classes) }}>
+  <span class="system-status-counter__status-icon system-status-counter__status-icon--{{ severity }}"></span>
+  <span class="system-status-counter__status-title">
+    <span class="system-status-counter__title-count">{{ amount }} {{ text }}</span>
+    <span class="system-status-counter__details"><a href="#{{ severity }}" ><span class="visually-hidden">{{ text }} </span>Details</a></span>
+  </span>
+</span>
diff --git a/web/themes/seven/templates/status-report-general-info.html.twig b/web/themes/seven/templates/status-report-general-info.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..92717dd10c00935263c092fc2b17fcb673468ce2
--- /dev/null
+++ b/web/themes/seven/templates/status-report-general-info.html.twig
@@ -0,0 +1,99 @@
+{#
+/**
+ * @file
+ * Theme override for status report general info.
+ *
+ * Available variables:
+ * - drupal: The status of Drupal installation:
+ *   - value: The current status of Drupal installation.
+ *   - description: The description for current status of Drupal installation.
+ * - cron: The status of cron:
+ *   - value: The current status of cron.
+ *   - description: The description for current status of cron.
+ *   - cron.run_cron: An array to render a button for running cron.
+ * - database_system: The status of database system:
+ *   - value: The current status of database system.
+ *   - description: The description for current status of cron.
+ * - database_system_version: The info about current database version:
+ *   - value: The current version of database.
+ *   - description: The description for current version of database.
+ * - php: The current version of PHP:
+ *   - value: The status of currently installed PHP version.
+ *   - description: The description for current installed PHP version.
+ * - php_memory_limit: The info about current PHP memory limit:
+ *   - value: The status of currently set PHP memory limit.
+ *   - description: The description for currently set PHP memory limit.
+ * - webserver: The info about currently installed web server:
+ *   - value: The status of currently installed web server.
+ *   - description: The description for the status of currently installed web
+ *     server.
+ */
+#}
+<div class="system-status-general-info">
+  <h2 class="system-status-general-info__header">{{ 'General System Information'|t }}</h2>
+  <div class="system-status-general-info__items">
+    <div class="system-status-general-info__item">
+      <span class="system-status-general-info__item-icon system-status-general-info__item-icon--drupal"></span>
+      <div class="system-status-general-info__item-details">
+        <h3 class="system-status-general-info__item-title">{{ 'Drupal Version'|t }}</h3>
+        {{ drupal.value }}
+        {% if drupal.description %}
+          <div class="description">{{ drupal.description }}</div>
+        {% endif %}
+      </div>
+    </div>
+    <div class="system-status-general-info__item">
+      <span class="system-status-general-info__item-icon system-status-general-info__item-icon--clock"></span>
+      <div class="system-status-general-info__item-details">
+        <h3 class="system-status-general-info__item-title">{{ 'Last Cron Run'|t }}</h3>
+        {{ cron.value }}
+        {% if cron.run_cron %}
+          <div class="system-status-general-info__run-cron">{{ cron.run_cron }}</div>
+        {% endif %}
+        {% if cron.description %}
+          <div class="system-status-general-info__description">{{ cron.description }}</div>
+        {% endif %}
+      </div>
+    </div>
+    <div class="system-status-general-info__item">
+      <span class="system-status-general-info__item-icon system-status-general-info__item-icon--server"></span>
+      <div class="system-status-general-info__item-details">
+        <h3 class="system-status-general-info__item-title">{{ 'Web Server'|t }}</h3>
+        {{ webserver.value }}
+        {% if webserver.description %}
+          <div class="description">{{ webserver.description }}</div>
+        {% endif %}
+      </div>
+    </div>
+    <div class="system-status-general-info__item">
+      <span class="system-status-general-info__item-icon system-status-general-info__item-icon--php"></span>
+      <div class="system-status-general-info__item-details">
+        <h3 class="system-status-general-info__item-title">{{ 'PHP'|t }}</h3>
+        <h4 class="system-status-general-info__sub-item-title">{{ 'Version'|t }}</h4>{{ php.value }}
+        {% if php.description %}
+          <div class="description">{{ php.description }}</div>
+        {% endif %}
+
+        <h4 class="system-status-general-info__sub-item-title">{{ 'Memory limit'|t }}</h4>{{ php_memory_limit.value }}
+        {% if php_memory_limit.description %}
+          <div class="description">{{ php_memory_limit.description }}</div>
+        {% endif %}
+      </div>
+    </div>
+    <div class="system-status-general-info__item">
+      <span class="system-status-general-info__item-icon system-status-general-info__item-icon--database"></span>
+      <div class="system-status-general-info__item-details">
+        <h3 class="system-status-general-info__item-title">{{ 'Database'|t }}</h3>
+        <h4 class="system-status-general-info__sub-item-title">{{ 'Version'|t }}</h4>{{ database_system_version.value }}
+        {% if database_system_version.description %}
+          <div class="description">{{ database_system_version.description }}</div>
+        {% endif %}
+
+        <h4 class="system-status-general-info__sub-item-title">{{ 'System'|t }}</h4>{{ database_system.value }}
+        {% if database_system.description %}
+          <div class="description">{{ database_system.description }}</div>
+        {% endif %}
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/web/themes/seven/templates/status-report-grouped.html.twig b/web/themes/seven/templates/status-report-grouped.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..91aa2981143baef0ae54fe6809af668f3b3c19e0
--- /dev/null
+++ b/web/themes/seven/templates/status-report-grouped.html.twig
@@ -0,0 +1,50 @@
+{#
+/**
+ * @file
+ * Theme override to display status report.
+ *
+ * - grouped_requirements: Contains grouped requirements.
+ *   Each group contains:
+ *   - title: The title of the group.
+ *   - type: The severity of the group.
+ *   - items: The requirement instances.
+ *     Each requirement item contains:
+ *     - title: The title of the requirement.
+ *     - value: (optional) The requirement's status.
+ *     - description: (optional) The requirement's description.
+ *     - severity_title: The title of the severity.
+ *     - severity_status: Indicates the severity status.
+ */
+#}
+{{ attach_library('core/drupal.collapse') }}
+{{ attach_library('seven/drupal.responsive-detail') }}
+
+<div class="system-status-report">
+  {% for group in grouped_requirements %}
+    <div class="system-status-report__requirements-group">
+      <h3 id="{{ group.type }}">{{ group.title }}</h3>
+      {% for requirement in group.items %}
+        <details class="system-status-report__entry system-status-report__entry--{{ group.type }} color-{{ group.type }}" open>
+          {%
+            set summary_classes = [
+              'system-status-report__status-title',
+              group.type in ['warning', 'error'] ? 'system-status-report__status-icon system-status-report__status-icon--' ~ group.type
+            ]
+          %}
+          <summary{{ create_attribute({'class': summary_classes}) }} role="button">
+            {% if requirement.severity_title  %}
+              <span class="visually-hidden">{{ requirement.severity_title }}</span>
+            {% endif %}
+            {{ requirement.title }}
+          </summary>
+          <div class="system-status-report__entry__value">
+            {{ requirement.value }}
+            {% if requirement.description %}
+              <div class="description">{{ requirement.description }}</div>
+            {% endif %}
+          </div>
+        </details>
+      {% endfor %}
+    </div>
+  {% endfor %}
+</div>
diff --git a/web/themes/seven/templates/status-report-page.html.twig b/web/themes/seven/templates/status-report-page.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..27e0d1576e24f37191e88926a806dd449bf30750
--- /dev/null
+++ b/web/themes/seven/templates/status-report-page.html.twig
@@ -0,0 +1,28 @@
+{#
+/**
+ * @file
+ * Theme override for the status report page.
+ *
+ * Available variables:
+ * - counters: The list of counter elements.
+ * - general_info: A render array to create general info element.
+ * - requirements: A render array to create requirements table.
+ *
+ * @see template_preprocess_status_report()
+ */
+#}
+{% if counters|length == 3 %}
+  {% set element_width_class = ' system-status-report-counters__item--third-width' %}
+{% elseif counters|length == 2 %}
+  {% set element_width_class = ' system-status-report-counters__item--half-width' %}
+{% endif %}
+<div class="system-status-report-counters">
+  {% for counter in counters %}
+    <div class="system-status-report-counters__item{{ element_width_class }}">
+      {{ counter }}
+    </div>
+  {% endfor %}
+</div>
+
+{{ general_info }}
+{{ requirements }}
diff --git a/web/themes/seven/templates/text_format/container--text-format-filter-guidelines.html.twig b/web/themes/seven/templates/text_format/container--text-format-filter-guidelines.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e10d0951a44560f62ba67a730e126edda4f56516
--- /dev/null
+++ b/web/themes/seven/templates/text_format/container--text-format-filter-guidelines.html.twig
@@ -0,0 +1,24 @@
+{#
+/**
+ * @file
+ * Theme implementation for text filter guidelines.
+ *
+ * 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 template_preprocess_container()
+ *
+ * @ingroup themeable
+ */
+#}
+{%
+  set classes = [
+    has_parent ? 'js-form-wrapper',
+    has_parent ? 'form-wrapper',
+    'filter-guidelines',
+  ]
+%}
+<div{{ attributes.addClass(classes) }}>{{ children }}</div>
diff --git a/web/themes/seven/templates/text_format/container--text-format-filter-help.html.twig b/web/themes/seven/templates/text_format/container--text-format-filter-help.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..5935ee33deab4f5218461274227e1b2fab4437a1
--- /dev/null
+++ b/web/themes/seven/templates/text_format/container--text-format-filter-help.html.twig
@@ -0,0 +1,22 @@
+{#
+/**
+ * @file
+ * Theme implementation for text filter help.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the containing element.
+ * - children: The rendered child elements of the container.
+ *
+ * @see template_preprocess_container()
+ *
+ * @ingroup themeable
+ */
+#}
+{%
+  set classes = [
+    has_parent ? 'js-form-wrapper',
+    has_parent ? 'form-wrapper',
+    'filter-help',
+  ]
+%}
+<div{{ attributes.addClass(classes) }}>{{ children }}</div>
diff --git a/web/themes/seven/templates/text_format/container--text-format-filter-wrapper.html.twig b/web/themes/seven/templates/text_format/container--text-format-filter-wrapper.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..211ab2be0b3d0d29cb4cc9b0359628390d3415a5
--- /dev/null
+++ b/web/themes/seven/templates/text_format/container--text-format-filter-wrapper.html.twig
@@ -0,0 +1,24 @@
+{#
+/**
+ * @file
+ * Theme implementation for the text filter wrapper.
+ *
+ * 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 template_preprocess_container()
+ *
+ * @ingroup themeable
+ */
+#}
+{%
+  set classes = [
+    has_parent ? 'js-form-wrapper',
+    has_parent ? 'form-wrapper',
+    'filter-wrapper',
+  ]
+%}
+<div{{ attributes.addClass(classes) }}>{{ children }}</div>
diff --git a/web/themes/seven/tests/src/Functional/SevenLayoutBuilderTest.php b/web/themes/seven/tests/src/Functional/SevenLayoutBuilderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..e39bfaa3b3c8198f484be20325def4b32616a1ca
--- /dev/null
+++ b/web/themes/seven/tests/src/Functional/SevenLayoutBuilderTest.php
@@ -0,0 +1,113 @@
+<?php
+
+namespace Drupal\Tests\seven\Functional;
+
+use Drupal\Tests\BrowserTestBase;
+
+/**
+ * Tests the Seven theme.
+ *
+ * @group seven
+ */
+class SevenLayoutBuilderTest extends BrowserTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'seven';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'views',
+    'layout_builder',
+    'layout_builder_views_test',
+    'layout_test',
+    'field_ui',
+    'block',
+    'block_test',
+    'node',
+    'layout_builder_test',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+
+    $this->drupalPlaceBlock('page_title_block', ['region' => 'header']);
+    $this->drupalPlaceBlock('local_tasks_block', ['region' => 'header']);
+
+    // Create two nodes.
+    $this->createContentType([
+      'type' => 'bundle_with_section_field',
+      'name' => 'Bundle with section field',
+    ]);
+    $this->createNode([
+      'type' => 'bundle_with_section_field',
+      'title' => 'The first node title',
+      'body' => [
+        [
+          'value' => 'The first node body',
+        ],
+      ],
+    ]);
+    $this->createNode([
+      'type' => 'bundle_with_section_field',
+      'title' => 'The second node title',
+      'body' => [
+        [
+          'value' => 'The second node body',
+        ],
+      ],
+    ]);
+  }
+
+  /**
+   * Tests the layout builder has expected contextual links with Seven.
+   *
+   * @see seven.theme
+   */
+  public function testContextualLinks() {
+    $assert_session = $this->assertSession();
+    $page = $this->getSession()->getPage();
+
+    $this->drupalLogin($this->drupalCreateUser([
+      'configure any layout',
+      'administer node display',
+      'administer node fields',
+      'access contextual links',
+    ]));
+
+    $field_ui_prefix = 'admin/structure/types/manage/bundle_with_section_field';
+
+    // From the manage display page, go to manage the layout.
+    $this->drupalGet("$field_ui_prefix/display/default");
+    $assert_session->linkNotExists('Manage layout');
+    $assert_session->fieldDisabled('layout[allow_custom]');
+
+    $this->submitForm(['layout[enabled]' => TRUE], 'Save');
+    $assert_session->linkExists('Manage layout');
+    $this->clickLink('Manage layout');
+
+    // Add a new block.
+    $assert_session->linkExists('Add block');
+    $this->clickLink('Add block');
+    $assert_session->linkExists('Powered by Drupal');
+    $this->clickLink('Powered by Drupal');
+    $page->fillField('settings[label]', 'This is the label');
+    $page->checkField('settings[label_display]');
+    $page->pressButton('Add block');
+
+    // Test that the block has the contextual class applied and the container
+    // for contextual links.
+    $assert_session->elementExists('css', 'div.block-system-powered-by-block.contextual-region div[data-contextual-id]');
+
+    // Ensure other blocks do not have contextual links.
+    $assert_session->elementExists('css', 'div.block-page-title-block');
+    $assert_session->elementNotExists('css', 'div.block-page-title-block.contextual-region div[data-contextual-id]');
+  }
+
+}