Browse Source

added contrib theme basic

Bachir Soussi Chiadmi 6 năm trước cách đây
mục cha
commit
9c6a1ce9a9
83 tập tin đã thay đổi với 3868 bổ sung0 xóa
  1. 6 0
      sites/all/themes/contrib/basic/.gitignore
  2. 154 0
      sites/all/themes/contrib/basic/Gruntfile.js
  3. 339 0
      sites/all/themes/contrib/basic/LICENSE.txt
  4. 242 0
      sites/all/themes/contrib/basic/README.txt
  5. 28 0
      sites/all/themes/contrib/basic/basic.info.yml
  6. 40 0
      sites/all/themes/contrib/basic/basic.libraries.yml
  7. 55 0
      sites/all/themes/contrib/basic/basic.theme
  8. 46 0
      sites/all/themes/contrib/basic/composer.json
  9. 9 0
      sites/all/themes/contrib/basic/config/install/basic.settings.yml
  10. 23 0
      sites/all/themes/contrib/basic/config/optional/block.block.basic_account_menu.yml
  11. 22 0
      sites/all/themes/contrib/basic/config/optional/block.block.basic_branding.yml
  12. 19 0
      sites/all/themes/contrib/basic/config/optional/block.block.basic_breadcrumbs.yml
  13. 19 0
      sites/all/themes/contrib/basic/config/optional/block.block.basic_content.yml
  14. 23 0
      sites/all/themes/contrib/basic/config/optional/block.block.basic_footer.yml
  15. 19 0
      sites/all/themes/contrib/basic/config/optional/block.block.basic_help.yml
  16. 17 0
      sites/all/themes/contrib/basic/config/optional/block.block.basic_local_actions.yml
  17. 19 0
      sites/all/themes/contrib/basic/config/optional/block.block.basic_local_tasks.yml
  18. 23 0
      sites/all/themes/contrib/basic/config/optional/block.block.basic_main_menu.yml
  19. 19 0
      sites/all/themes/contrib/basic/config/optional/block.block.basic_messages.yml
  20. 17 0
      sites/all/themes/contrib/basic/config/optional/block.block.basic_page_title.yml
  21. 19 0
      sites/all/themes/contrib/basic/config/optional/block.block.basic_search.yml
  22. 23 0
      sites/all/themes/contrib/basic/config/optional/block.block.basic_tools.yml
  23. 33 0
      sites/all/themes/contrib/basic/config/schema/basic.schema.yml
  24. 107 0
      sites/all/themes/contrib/basic/css/base/base.css
  25. 33 0
      sites/all/themes/contrib/basic/css/components/components.css
  26. 50 0
      sites/all/themes/contrib/basic/css/components/messages.css
  27. 24 0
      sites/all/themes/contrib/basic/css/components/tabs.css
  28. 174 0
      sites/all/themes/contrib/basic/css/layout/layout.css
  29. 34 0
      sites/all/themes/contrib/basic/css/theme/print.css
  30. 7 0
      sites/all/themes/contrib/basic/css/theme/theme.css
  31. 26 0
      sites/all/themes/contrib/basic/images/optimized/README.txt
  32. 26 0
      sites/all/themes/contrib/basic/images/source/README.txt
  33. 442 0
      sites/all/themes/contrib/basic/includes/basic.drush.inc
  34. 2 0
      sites/all/themes/contrib/basic/js/build/scripts.js
  35. 1 0
      sites/all/themes/contrib/basic/js/modernizr.js
  36. 4 0
      sites/all/themes/contrib/basic/js/selectivizr-min.js
  37. 37 0
      sites/all/themes/contrib/basic/js/source/scripts.js
  38. BIN
      sites/all/themes/contrib/basic/logo.png
  39. 50 0
      sites/all/themes/contrib/basic/logo.svg
  40. 26 0
      sites/all/themes/contrib/basic/package.json
  41. 32 0
      sites/all/themes/contrib/basic/sass/base/_buttons.sass
  42. 71 0
      sites/all/themes/contrib/basic/sass/base/_forms.sass
  43. 16 0
      sites/all/themes/contrib/basic/sass/base/_lists.sass
  44. 9 0
      sites/all/themes/contrib/basic/sass/base/_media.sass
  45. 21 0
      sites/all/themes/contrib/basic/sass/base/_tables.sass
  46. 71 0
      sites/all/themes/contrib/basic/sass/base/_typography.sass
  47. 13 0
      sites/all/themes/contrib/basic/sass/base/base.sass
  48. 5 0
      sites/all/themes/contrib/basic/sass/components/_breadcrumb.sass
  49. 5 0
      sites/all/themes/contrib/basic/sass/components/_navigation.sass
  50. 5 0
      sites/all/themes/contrib/basic/sass/components/_pager.sass
  51. 7 0
      sites/all/themes/contrib/basic/sass/components/_site-name.sass
  52. 11 0
      sites/all/themes/contrib/basic/sass/components/components.sass
  53. 33 0
      sites/all/themes/contrib/basic/sass/components/messages.sass
  54. 16 0
      sites/all/themes/contrib/basic/sass/components/tabs.sass
  55. 36 0
      sites/all/themes/contrib/basic/sass/config/_config.sass
  56. 27 0
      sites/all/themes/contrib/basic/sass/config/_grid-settings.sass
  57. 19 0
      sites/all/themes/contrib/basic/sass/config/_mixins.sass
  58. 65 0
      sites/all/themes/contrib/basic/sass/config/_variables.sass
  59. 101 0
      sites/all/themes/contrib/basic/sass/layout/_layout--grid.sass
  60. 8 0
      sites/all/themes/contrib/basic/sass/layout/layout.sass
  61. 36 0
      sites/all/themes/contrib/basic/sass/theme/print.sass
  62. 9 0
      sites/all/themes/contrib/basic/sass/theme/theme.sass
  63. BIN
      sites/all/themes/contrib/basic/screenshot.png
  64. 12 0
      sites/all/themes/contrib/basic/templates/block/block--local-actions-block.html.twig
  65. 14 0
      sites/all/themes/contrib/basic/templates/block/block--local-tasks-block.html.twig
  66. 45 0
      sites/all/themes/contrib/basic/templates/block/block--search-form-block.html.twig
  67. 30 0
      sites/all/themes/contrib/basic/templates/block/block--system-branding-block.html.twig
  68. 56 0
      sites/all/themes/contrib/basic/templates/block/block--system-menu-block.html.twig
  69. 32 0
      sites/all/themes/contrib/basic/templates/block/block.html.twig
  70. 25 0
      sites/all/themes/contrib/basic/templates/breadcrumb.html.twig
  71. 109 0
      sites/all/themes/contrib/basic/templates/comment.html.twig
  72. 42 0
      sites/all/themes/contrib/basic/templates/field--comment.html.twig
  73. 20 0
      sites/all/themes/contrib/basic/templates/field.html.twig
  74. 81 0
      sites/all/themes/contrib/basic/templates/html.html.twig
  75. 19 0
      sites/all/themes/contrib/basic/templates/menu-local-task.html.twig
  76. 29 0
      sites/all/themes/contrib/basic/templates/menu-local-tasks.html.twig
  77. 55 0
      sites/all/themes/contrib/basic/templates/menu.html.twig
  78. 53 0
      sites/all/themes/contrib/basic/templates/node.html.twig
  79. 93 0
      sites/all/themes/contrib/basic/templates/page.html.twig
  80. 98 0
      sites/all/themes/contrib/basic/templates/pager.html.twig
  81. 58 0
      sites/all/themes/contrib/basic/templates/status-messages.html.twig
  82. 41 0
      sites/all/themes/contrib/basic/templates/views-mini-pager.html.twig
  83. 83 0
      sites/all/themes/contrib/basic/theme-settings.php

+ 6 - 0
sites/all/themes/contrib/basic/.gitignore

@@ -0,0 +1,6 @@
+*.scssc
+*.sassc
+.sass-cache
+*.map
+node_modules
+.DS_Store

+ 154 - 0
sites/all/themes/contrib/basic/Gruntfile.js

@@ -0,0 +1,154 @@
+/**
+ * @file
+ */
+module.exports = function(grunt) {
+
+  // This is where we configure each task that we'd like to run.
+  grunt.initConfig({
+    pkg: grunt.file.readJSON('package.json'),
+    watch: {
+      // This is where we set up all the tasks we'd like grunt to watch for changes.
+      scripts: {
+        files: ['js/source/**/*.js'],
+        tasks: ['uglify'],
+        options: {
+          spawn: false,
+        },
+      },
+      images: {
+        files: ['images/source/**/*.{png,jpg,gif}'],
+        tasks: ['imagemin'],
+        options: {
+          spawn: false,
+        }
+      },
+      vector: {
+        files: ['images/source/**/*.svg'],
+        tasks: ['svgmin'],
+        options: {
+          spawn: false,
+        }
+      },
+      css: {
+        files: ['sass/**/*.{scss,sass}'],
+        tasks: ['sass', 'postcss']
+      }
+    },
+    uglify: {
+      // This is for minifying all of our scripts.
+      options: {
+        sourceMap: true,
+        mangle: false
+      },
+      my_target: {
+        files: [{
+          expand: true,
+          cwd: 'js/source',
+          src: '**/*.js',
+          dest: 'js/build'
+        }]
+      }
+    },
+    imagemin: {
+      // This will optimize all of our images for the web.
+      dynamic: {
+        files: [{
+          expand: true,
+          cwd: 'images/source/',
+          src: ['**/*.{png,jpg,gif}'],
+          dest: 'images/optimized/'
+        }]
+      }
+    },
+    svgmin: {
+      options: {
+        plugins: [{
+          removeViewBox: false
+        }, {
+          removeUselessStrokeAndFill: false
+        }]
+      },
+      dist: {
+        files: [{
+          expand: true,
+          cwd: 'images/source/',
+          src: ['**/*.svg'],
+          dest: 'images/optimized/'
+        }]
+      }
+    },
+    sass: {
+      // This will compile all of our sass files
+      // Additional configuration options can be found at https://github.com/sindresorhus/grunt-sass
+      options: {
+        sourceMap: true,
+        // This controls the compiled css and can be changed to nested, compact or compressed.
+        outputStyle: 'expanded',
+        precision: 5
+      },
+      dist: {
+        files: {
+          'css/base/base.css': 'sass/base/base.sass',
+          'css/components/components.css': 'sass/components/components.sass',
+          'css/components/tabs.css': 'sass/components/tabs.sass',
+          'css/components/messages.css': 'sass/components/messages.sass',
+          'css/layout/layout.css': 'sass/layout/layout.sass',
+          'css/theme/theme.css': 'sass/theme/theme.sass',
+          'css/theme/print.css': 'sass/theme/print.sass'
+        }
+      }
+    },
+    postcss:{
+      options: {
+        processors: [
+          require('pixrem')(),
+          require('autoprefixer')({browsers: 'last 5 versions'})
+        ]
+      },
+      dist:{
+        files:{
+          'css/base/base.css': 'css/base/base.css',
+          'css/components/components.css': 'css/components/components.css',
+          'css/components/tabs.css': 'css/components/tabs.css',
+          'css/components/messages.css': 'css/components/messages.css',
+          'css/layout/layout.css': 'css/layout/layout.css',
+          'css/theme/theme.css': 'css/theme/theme.css',
+          'css/theme/print.css': 'css/theme/print.css'
+        }
+      }
+    },
+    browserSync: {
+      dev: {
+        bsFiles: {
+          src : [
+            'css/**/*.css',
+            'templates/**/*.twig',
+            'images/optimized/**/*.{png,jpg,gif,svg}',
+            'js/build/**/*.js',
+            '*.theme'
+          ]
+        },
+        options: {
+          watchTask: true,
+          // Change this to "true" if you'd like the css to be injected rather than a browser refresh. In order for this to work with Drupal you will need to install https://drupal.org/project/link_css keep in mind though that this should not be run on a production site.
+          injectChanges: false
+        }
+      }
+    },
+  });
+  // This is where we tell Grunt we plan to use this plug-in.
+  grunt.loadNpmTasks('grunt-contrib-uglify');
+  grunt.loadNpmTasks('grunt-contrib-imagemin');
+  grunt.loadNpmTasks('grunt-svgmin');
+  grunt.loadNpmTasks('grunt-sass');
+  grunt.loadNpmTasks('grunt-postcss');
+  grunt.loadNpmTasks('grunt-contrib-watch');
+  grunt.loadNpmTasks('grunt-browser-sync');
+  // Now that we've loaded the package.json and the node_modules we set the base path
+  // for the actual execution of the tasks
+  // grunt.file.setBase('/')
+  // This is where we tell Grunt what to do when we type "grunt" into the terminal.
+  // Note: if you'd like to run and of the tasks individually you can do so by typing 'grunt mytaskname' alternatively
+  // you can type 'grunt watch' to automatically track your files for changes.
+  grunt.registerTask('default', ['browserSync','watch']);
+};

+ 339 - 0
sites/all/themes/contrib/basic/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.

+ 242 - 0
sites/all/themes/contrib/basic/README.txt

@@ -0,0 +1,242 @@
+
+=====================
+Introduction to Basic
+=====================
+
+Basic boasts a clean HTML5 structure with extensible CSS classes and IDs for
+unlimited theming possibilities as well as a top-down load order for improved
+SEO. It is fully responsive out-of-the-box and provides an adaptive, elegant,
+SASS-based grid system (Bourbon Neat).
+
+Basic's goal is to provide themers the building blocks needed to get their
+designs up and running quickly and simply.
+
+Basic is perfect if you want a simple, smart, and flexible theme starter.
+
+Less code spam, more ham.
+
+
+============
+Installation
+============
+
+Basic utilizes SASS for adaptive grids and layouts and general structure of the
+site. It's recommended to use SASS for building out your theme. The following
+packages are included via 'npm install'
+  - SASS (http://sass-lang.com/)
+  - Bourbon (http://bourbon.io/)
+  - Bourbon Neat (http://neat.bourbon.io/)
+
+Basic is meant to be YOUR theme. Follow one of the two methods below and you can
+rename 'basic' to another name like 'mytheme'. You're also welcome to keep
+'basic'.
+
+1. DRUSH: The provided drush install script will duplicate the basic theme
+   folder and rename all appropriate files and content to the new theme name you
+   provide.
+
+  - Download and enable the basic theme: $ drush en basic
+  - Set the theme as default $ drush config-set system.theme default basic
+    or copy the includes/basic.drush.inc into your .drush folder.
+  - Run the provided drush install script: $ drush basic-install
+  - The script will first ask you to enter your theme name (eg. My Theme).
+    Second, it will ask you to enter a machine name (eg. my_theme).
+  - After complete, you can enable your new theme: $drush en my_theme
+  - At this time, you can uninstall basic: $drush pmu basic
+  - Commence work on your theme!
+
+2. MANUAL: To manually change the name of the theme follow these steps BEFORE
+   enabling the theme:
+
+  - Rename the theme folder to 'mytheme'
+  - Rename basic.info.yml to mytheme.info.yml
+  - edit basic.info.yml and change the name, description, project (can be
+    deleted), and change all other instances of 'basic' to 'mytheme'
+  - Rename basic.libraries.yml to mytheme.libraries.yml
+  - Rename basic.theme to mytheme.theme
+  - in basic.theme, change each instance of 'basic' to 'mytheme'
+  - Rename config/schema/basic.schema.yml to mytheme.schema.yml
+  - Rename each file in config/install from block.block.basic_tools.yml (for
+    example) to block.block.mytheme_tools.yml
+  - Every file in config/install, change each instance of 'basic' to
+    'mytheme'
+  - In js/source/scripts.js, change each instance of 'basic' to 'mytheme'
+  - In theme-settings.php, change each instance of 'basic' to 'mytheme'
+  - In templates/html.html.twig, change each instance of 'basic' to 'mytheme'
+  - In templates/menu-local-tasks.html.twig, change each instance of 'basic' to
+    'mytheme'
+  - In templates/status-messages.html.twig, change each instance of 'basic' to
+    'mytheme'
+
+  When renaming, remember the following:
+  - Do not simply replace every instance of 'basic' in every file in the theme.
+    Most of Basic's dependencies use the word 'basic' somewhere and renaming
+    these instances will cause Basic to break in unpredictable ways.
+  - If you don't rename all these files, you may get a vague and unhelpful error
+    message when attempting to enable your theme: "The website encountered an
+    unexpected error. Please try again later." Turn on a higher level of error
+    logging in your server's php.ini to help determine what you've missed.
+  - If you don't bother renaming Basic in the above locations, be advised that
+    you will run into conflicts with other versions of Basic on your site. If
+    your site uses more than one theme based on Basic, make sure at least one of
+    the themes has been renamed properly!
+
+
+============================
+How to compile SASS in Basic
+============================
+
+To use SASS and automatically compile it within your theme, please refer to "How
+to Use Grunt with Basic" in the documentation below.
+
+Install node-sass:
+
+  npm install node-sass -g
+
+If you don't like Grunt, or would just prefer to use SASS' internal watch
+functionality, simply cd into your theme directory and run:
+
+  node-sass sass -o css --output-style expanded --source-map true --watch
+
+Or simply compile the latest:
+
+  node-sass sass -o css --output-style expanded --source-map true
+
+
+=======================
+What are the files for?
+=======================
+
+- basic.info.yml
+  Provide informations about the theme, like regions and libraries.
+- block.html.twig
+  Template to edit the blocks.
+- comment.html.twig
+  Template to edit the comments.
+- node.html.twig
+  Template to edit the nodes (in content).
+- page.html.twig
+  Template to edit the page.
+- basic.theme
+  Used to modify Drupal's default behavior before outputting HTML through the
+  templates.
+- theme-settings.php
+  Provides additional settings in the theme settings page.
+
+
+============
+In /sass
+============
+
+- layout/layout.sass
+  Defines the layout of the theme (compiles to css/layout/layout.css)
+- theme/print.sass
+  Defines the way the theme looks when printed (compiles to css/theme/print.css)
+- components/tabs.sass
+  Styles for the admin tabs (compiles to css/components/tabs.css)
+
+
+============
+In /js
+============
+
+- modernizr.js
+  Modernizr detects HTML and CSS features and applies classes to
+  the <html> object you can then reference in your stylesheets. Use the URL at
+  the top of the modernizr.js file to customize the features you wish to detect.
+- selectivizr-min.js
+  This script will only be loaded for Internet Explorer 8
+  through the ie8 theme library. It will provide a JS fallback for CSS :nth-
+  child, an important part of the Bourbon Neat grid system, as it is not
+  supported in Internet Explorer 8.
+- build/scripts.js & source/scripts.js
+  When using Grunt, save files to the
+  source folder and a minified version will automatically be saved to the build
+  folder. See comments in basic.libraries.yml file to enable the starter
+  scripts.js file.
+
+
+===================
+Changing the Layout
+===================
+
+The layout used in Basic is fairly similar to the Holy Grail method. It has been
+tested on all major browsers including IE (5 to >10), Opera, Firefox, Safari,
+and Chrome. The purpose of this method is to have a minimal markup for an ideal
+display. For accessibility and search engine optimization, the best order to
+display a page is the following:
+
+1. Header
+2. Content
+3. Sidebars
+4. Footer
+
+This is how the page template is buit in Basic, and it works in fluid and fixed
+layout. Refer to the notes in layout.sass to see how to modify the layout.
+
+
+===========================
+How to Use Grunt with Basic
+===========================
+
+Grunt (http://gruntjs.com/) requires Node.JS to be installed on your machine.
+There are various package managers that can handle this for you.
+
+https://nodejs.org/download/
+
+Once Node.JS is installed, go to the root folder of Basic and install your Grunt
+packages:
+
+  npm install
+
+This will install the neccessary node_modules to run Grunt. In order for Grunt
+to work from the command line we are going to need the Grunt CLI. Open a new
+Terminal window and type:
+
+  npm install -g grunt-cli
+
+This will install the CLI globally. Restart terminal when that is complete and
+you will now be able to use Grunt commands.
+
+Once installed, cd to the root folder of Basic and run Grunt via the command
+line:
+
+  grunt
+
+This will initialize Grunt and start watching changes to your SASS files. Voilà!
+
+
+==============
+Updating Basic
+==============
+
+Once you start using Basic, you will massively change it until you reach the
+point where it has nothing to do with Basic anymore. Unlike Zen, Basic is not
+intended to be use as a base theme for a sub-theme (even though it is possible
+to do so). Because of this, it is not necessary to update your theme when a new
+version of Basic comes out. Always see Basic as a STARTER, and as soon as you
+start using it, it is not Basic anymore, but your own theme.
+
+If you didn't rename your theme, but you don't want to be notified when Basic
+has a new version by the update module, simply delete "project = "basic" in
+basic.info.yml.
+
+
+================
+Bugs & Questions
+================
+
+Thanks for using Basic, and remember to use the issue queue in drupal.org for
+any questions or bug reports:
+
+http://drupal.org/project/issues/basic
+
+
+====================
+Current maintainers:
+====================
+* Steve Krueger (SteveK)              - https://www.drupal.org/u/stevek
+* Leah Marsh (leahtard)               - https://www.drupal.org/u/leahtard
+* Joël Pittet (joelpittet)            - https://www.drupal.org/u/joelpittet
+* Catherine Winters (CatherineOmega)  - https://www.drupal.org/u/catherineomega
+* Johannes Schmidt (johannez)         - https://www.drupal.org/u/johannez

+ 28 - 0
sites/all/themes/contrib/basic/basic.info.yml

@@ -0,0 +1,28 @@
+name: Basic
+type: theme
+description: 'HTML5, SASS, Responsive grid starter theme.'
+package: Core
+# version: VERSION
+# core: 8.x
+
+libraries:
+  - core/normalize
+  - basic/global
+
+
+regions:
+  header: Header
+  help: Help
+  page_top: 'Page top'
+  page_bottom: 'Page bottom'
+  highlighted: Highlighted
+  content: Content
+  sidebar_first: 'Sidebar first'
+  sidebar_second: 'Sidebar second'
+  footer: Footer
+
+# Information added by Drupal.org packaging script on 2017-10-15
+version: '8.x-1.3'
+core: '8.x'
+project: 'basic'
+datestamp: 1508096954

+ 40 - 0
sites/all/themes/contrib/basic/basic.libraries.yml

@@ -0,0 +1,40 @@
+global:
+  version: VERSION
+  css:
+    base:
+      css/base/base.css: {}
+    layout:
+      css/layout/layout.css: {}
+    component:
+      css/components/components.css: {}
+    theme:
+      css/theme/theme.css: {}
+      css/theme/print.css: { media: print }
+  js:
+    js/modernizr.js: {}
+  #   js/build/scripts.js: {}
+  # dependencies:
+  #   - core/drupal
+  #   - core/jquery
+
+  # Uncomment the code above to load scripts.js file on all pages. This file also requires JQuery to be
+  # loaded on all pages. Consider implimenting your scripts through theme libraries if you wish to
+  # avoid this. https://www.drupal.org/developing/api/8/assets
+
+tabs:
+  version: VERSION
+  css:
+    component:
+      css/components/tabs.css: {}
+
+messages:
+  version: VERSION
+  css:
+    component:
+      css/components/messages.css: {}
+
+ie8:
+  version: VERSION
+  header: true
+  js:
+    js/selectivizr-min.js: { browsers: { IE: 'lte IE 8', '!IE': false }, minified: true, preprocess: false }

+ 55 - 0
sites/all/themes/contrib/basic/basic.theme

@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * @file
+ * Preprocess functions for Basic.
+ */
+
+use Drupal\Core\Cache\CacheableMetadata;
+
+/**
+ * Prepares variables for the html.html.twig template.
+ */
+function basic_preprocess_html(&$variables) {
+  try {
+    $variables['is_front'] = \Drupal::service('path.matcher')->isFrontPage();
+  }
+  catch (Exception $e) {
+    // If the database is not yet available, set default values for these
+    // variables.
+    $variables['is_front'] = FALSE;
+  }
+
+  // If we're on the front page.
+  if (!$variables['is_front']) {
+    // Add unique classes for each page and website section.
+    $path = \Drupal::service('path.current')->getPath();
+    $alias = \Drupal::service('path.alias_manager')->getAliasByPath($path);
+    $alias = trim($alias, '/');
+    if (!empty($alias)) {
+      $name = str_replace('/', '-', $alias);
+      $variables['attributes']['class'][] = 'page-' . $name;
+      list($section,) = explode('/', $alias, 2);
+      if (!empty($section)) {
+        $variables['attributes']['class'][] = 'section-' . $section;
+      }
+    }
+  }
+
+  // Add cachability metadata.
+  $theme_name = \Drupal::theme()->getActiveTheme()->getName();
+  $theme_settings = \Drupal::config($theme_name . '.settings');
+  CacheableMetadata::createFromRenderArray($variables)
+    ->addCacheableDependency($theme_settings)
+    ->applyTo($variables);
+  // Union all theme setting variables to the html.html.twig template.
+  $variables += $theme_settings->getOriginal();
+}
+
+/**
+ * Prepares variables for the field.html.twig template.
+ */
+function basic_preprocess_field(&$variables, $hook) {
+  // Make additional variables available to the template.
+  $variables['bundle'] = $variables['element']['#bundle'];
+}

+ 46 - 0
sites/all/themes/contrib/basic/composer.json

@@ -0,0 +1,46 @@
+{
+  "name": "drupal/basic",
+  "description": "HTML5, SASS, Responsive grid starter theme.",
+  "type": "drupal-theme",
+  "homepage": "http://drupal.org/project/basic",
+  "authors": [
+    {
+      "name": "Steve Krueger",
+      "email": "steve@thejibe.com",
+      "homepage": "http://thejibe.com",
+      "role": "Maintainer"
+    },
+    {
+      "name": "Joël Pittet",
+      "email": "joel@pittet.ca",
+      "homepage": "https://www.drupal.org/u/joelpittet",
+      "role": "Maintainer"
+    },
+    {
+      "name": "Leah Wagner",
+      "email": "leah@thejibe.com",
+      "homepage": "http://thejibe.com",
+      "role": "Maintainer"
+    },
+    {
+      "name": "Catherine Winters",
+      "email": "catherine@catherinewinters.com",
+      "homepage": "http://www.catherinewinters.com",
+      "role": "Maintainer"
+    },
+    {
+      "name": "Johannes Schmidt",
+      "email": "mail@2tabs.com",
+      "homepage": "http://2tabs.com",
+      "role": "Maintainer"
+    }
+  ],
+  "support": {
+    "issues": "https://www.drupal.org/project/issues/basic",
+    "irc": "irc://irc.freenode.org/drupal-contribute",
+    "source": "http://cgit.drupalcode.org/basic"
+  },
+  "license": "GPL-2.0+",
+  "minimum-stability": "dev",
+  "require": {}
+}

+ 9 - 0
sites/all/themes/contrib/basic/config/install/basic.settings.yml

@@ -0,0 +1,9 @@
+browser_sync:
+  enabled: false
+  host: localhost
+  port: 3000
+clear_registry: false
+ie_enabled: false
+ie_enabled_versions:
+  ie8: false
+  ie9: false

+ 23 - 0
sites/all/themes/contrib/basic/config/optional/block.block.basic_account_menu.yml

@@ -0,0 +1,23 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - system.menu.account
+  module:
+    - system
+  theme:
+    - basic
+id: basic_account_menu
+theme: basic
+region: header
+weight: 0
+provider: null
+plugin: 'system_menu_block:account'
+settings:
+  id: 'system_menu_block:account'
+  label: 'User account menu'
+  provider: system
+  label_display: '0'
+  level: 1
+  depth: 1
+visibility: {  }

+ 22 - 0
sites/all/themes/contrib/basic/config/optional/block.block.basic_branding.yml

@@ -0,0 +1,22 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - system
+  theme:
+    - basic
+id: basic_branding
+theme: basic
+region: header
+weight: 0
+provider: null
+plugin: system_branding_block
+settings:
+  id: system_branding_block
+  label: 'Site branding'
+  provider: system
+  label_display: '0'
+  use_site_logo: true
+  use_site_name: true
+  use_site_slogan: true
+visibility: {  }

+ 19 - 0
sites/all/themes/contrib/basic/config/optional/block.block.basic_breadcrumbs.yml

@@ -0,0 +1,19 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - system
+  theme:
+    - basic
+id: basic_breadcrumbs
+theme: basic
+region: content
+weight: -45
+provider: null
+plugin: system_breadcrumb_block
+settings:
+  id: system_breadcrumb_block
+  label: Breadcrumbs
+  provider: system
+  label_display: '0'
+visibility: {  }

+ 19 - 0
sites/all/themes/contrib/basic/config/optional/block.block.basic_content.yml

@@ -0,0 +1,19 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - system
+  theme:
+    - basic
+id: basic_content
+theme: basic
+region: content
+weight: 0
+provider: null
+plugin: system_main_block
+settings:
+  id: system_main_block
+  label: 'Main page content'
+  provider: system
+  label_display: '0'
+visibility: {  }

+ 23 - 0
sites/all/themes/contrib/basic/config/optional/block.block.basic_footer.yml

@@ -0,0 +1,23 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - system.menu.footer
+  module:
+    - system
+  theme:
+    - basic
+id: basic_footer
+theme: basic
+region: footer
+weight: 0
+provider: null
+plugin: 'system_menu_block:footer'
+settings:
+  id: 'system_menu_block:footer'
+  label: 'Footer menu'
+  provider: system
+  label_display: '0'
+  level: 1
+  depth: 0
+visibility: {  }

+ 19 - 0
sites/all/themes/contrib/basic/config/optional/block.block.basic_help.yml

@@ -0,0 +1,19 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - help
+  theme:
+    - basic
+id: basic_help
+theme: basic
+region: help
+weight: -30
+provider: null
+plugin: help_block
+settings:
+  id: help_block
+  label: Help
+  provider: help
+  label_display: '0'
+visibility: {  }

+ 17 - 0
sites/all/themes/contrib/basic/config/optional/block.block.basic_local_actions.yml

@@ -0,0 +1,17 @@
+langcode: en
+status: true
+dependencies:
+  theme:
+    - basic
+id: basic_local_actions
+theme: basic
+region: content
+weight: -20
+provider: null
+plugin: local_actions_block
+settings:
+  id: local_actions_block
+  label: 'Primary admin actions'
+  provider: core
+  label_display: '0'
+visibility: {  }

+ 19 - 0
sites/all/themes/contrib/basic/config/optional/block.block.basic_local_tasks.yml

@@ -0,0 +1,19 @@
+langcode: en
+status: true
+dependencies:
+  theme:
+    - basic
+id: basic_local_tasks
+theme: basic
+region: content
+weight: -40
+provider: null
+plugin: local_tasks_block
+settings:
+  id: local_tasks_block
+  label: Tabs
+  provider: core
+  label_display: '0'
+  primary: true
+  secondary: true
+visibility: {  }

+ 23 - 0
sites/all/themes/contrib/basic/config/optional/block.block.basic_main_menu.yml

@@ -0,0 +1,23 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - system.menu.main
+  module:
+    - system
+  theme:
+    - basic
+id: basic_main_menu
+theme: basic
+region: header
+weight: 1
+provider: null
+plugin: 'system_menu_block:main'
+settings:
+  id: 'system_menu_block:main'
+  label: 'Main navigation'
+  provider: system
+  label_display: '0'
+  level: 1
+  depth: 1
+visibility: {  }

+ 19 - 0
sites/all/themes/contrib/basic/config/optional/block.block.basic_messages.yml

@@ -0,0 +1,19 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - system
+  theme:
+    - basic
+id: basic_messages
+theme: basic
+region: highlighted
+weight: 0
+provider: null
+plugin: system_messages_block
+settings:
+  id: system_messages_block
+  label: 'Status messages'
+  provider: system
+  label_display: '0'
+visibility: {  }

+ 17 - 0
sites/all/themes/contrib/basic/config/optional/block.block.basic_page_title.yml

@@ -0,0 +1,17 @@
+langcode: en
+status: true
+dependencies:
+  theme:
+    - basic
+id: basic_page_title
+theme: basic
+region: content
+weight: -50
+provider: null
+plugin: page_title_block
+settings:
+  id: page_title_block
+  label: 'Page title'
+  provider: core
+  label_display: '0'
+visibility: {  }

+ 19 - 0
sites/all/themes/contrib/basic/config/optional/block.block.basic_search.yml

@@ -0,0 +1,19 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - search
+  theme:
+    - basic
+id: basic_search
+theme: basic
+region: sidebar_first
+weight: -1
+provider: null
+plugin: search_form_block
+settings:
+  id: search_form_block
+  label: Search
+  provider: search
+  label_display: visible
+visibility: {  }

+ 23 - 0
sites/all/themes/contrib/basic/config/optional/block.block.basic_tools.yml

@@ -0,0 +1,23 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - system.menu.tools
+  module:
+    - system
+  theme:
+    - basic
+id: basic_tools
+theme: basic
+region: sidebar_first
+weight: 0
+provider: null
+plugin: 'system_menu_block:tools'
+settings:
+  id: 'system_menu_block:tools'
+  label: Tools
+  provider: system
+  label_display: visible
+  level: 1
+  depth: 0
+visibility: {  }

+ 33 - 0
sites/all/themes/contrib/basic/config/schema/basic.schema.yml

@@ -0,0 +1,33 @@
+basic.settings:
+  type: theme_settings
+  label: 'Basic theme settings'
+  mapping:
+    browser_sync:
+      type: mapping
+      label: 'Enable Browser Sync'
+      mapping:
+        enabled:
+          type: boolean
+          label: 'Enable Browser Sync'
+        host:
+          type: string
+          label: 'Host'
+        port:
+          type: integer
+          label: 'Port'
+    clear_registry:
+      type: boolean
+      label: 'Enable clear Registry'
+    ie_enabled:
+      type: boolean
+      label: 'Enable IE support HTML classes'
+    ie_enabled_versions:
+      type: mapping
+      label: 'IE versions supported'
+      mapping:
+        ie8:
+          type: boolean
+          label: 'Support IE8'
+        ie9:
+          type: boolean
+          label: 'Support IE8'

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 107 - 0
sites/all/themes/contrib/basic/css/base/base.css


+ 33 - 0
sites/all/themes/contrib/basic/css/components/components.css

@@ -0,0 +1,33 @@
+html {
+  box-sizing: border-box;
+}
+
+*, *::after, *::before {
+  box-sizing: inherit;
+}
+
+.breadcrumb li {
+  list-style-type: none;
+  display: inline-block;
+}
+
+#navigation li {
+  list-style-type: none;
+  display: inline-block;
+}
+
+.site-name {
+  font-size: 2.2em;
+  line-height: 1.3em;
+  font-weight: 300;
+  padding: 0 0 0.5em;
+  margin: 0;
+}
+
+.pager__item {
+  display: inline;
+}
+
+.pager__item a {
+  display: inline-block;
+}

+ 50 - 0
sites/all/themes/contrib/basic/css/components/messages.css

@@ -0,0 +1,50 @@
+html {
+  box-sizing: border-box;
+}
+
+*, *::after, *::before {
+  box-sizing: inherit;
+}
+
+.messages {
+  padding: 9px;
+  margin: 1em 0;
+  color: #919191;
+  background-color: #ddd;
+  border: 1px solid #c4c4c4;
+  word-wrap: break-word;
+}
+
+.messages pre {
+  border: 0;
+}
+
+.messages--warning {
+  color: #903023;
+  background-color: #ddc44f;
+  border-color: #d1b328;
+}
+
+.messages--warning pre {
+  background-color: #d1b328;
+}
+
+.messages--error {
+  color: white;
+  background-color: #cd4533;
+  border-color: #a53728;
+}
+
+.messages--error pre {
+  background-color: #a53728;
+}
+
+.messages--status {
+  color: #304319;
+  background-color: #8dbe51;
+  border-color: #73a03c;
+}
+
+.messages--status pre {
+  background-color: #73a03c;
+}

+ 24 - 0
sites/all/themes/contrib/basic/css/components/tabs.css

@@ -0,0 +1,24 @@
+html {
+  box-sizing: border-box;
+}
+
+*, *::after, *::before {
+  box-sizing: inherit;
+}
+
+ul.tabs {
+  width: 100%;
+  margin: 0 0 5px;
+  border-bottom: 1px solid #ddd;
+}
+
+ul.tabs li {
+  display: inline-block;
+}
+
+ul.tabs a {
+  display: block;
+  border: 1px solid #ddd;
+  border-bottom: 0;
+  border-radius: 3px 3px 0 0;
+}

+ 174 - 0
sites/all/themes/contrib/basic/css/layout/layout.css

@@ -0,0 +1,174 @@
+html {
+  box-sizing: border-box;
+}
+
+*, *::after, *::before {
+  box-sizing: inherit;
+}
+
+.container {
+  max-width: 1200px;
+  margin-left: auto;
+  margin-right: auto;
+  width: auto;
+}
+
+.container::after {
+  clear: both;
+  content: "";
+  display: block;
+}
+
+@media screen and (min-width: 45em) {
+  .one-sidebar.sidebar-second #content {
+    float: left;
+    display: block;
+    margin-right: 3.22581%;
+    width: 74.19355%;
+  }
+  .one-sidebar.sidebar-second #content:last-child {
+    margin-right: 0;
+  }
+}
+
+@media screen and (min-width: 60em) {
+  .one-sidebar.sidebar-second #content {
+    float: left;
+    display: block;
+    margin-right: 2.12766%;
+    width: 65.95745%;
+  }
+  .one-sidebar.sidebar-second #content:last-child {
+    margin-right: 0;
+  }
+}
+
+@media screen and (min-width: 45em) {
+  .one-sidebar.sidebar-first #content {
+    float: left;
+    display: block;
+    margin-right: 3.22581%;
+    width: 74.19355%;
+    margin-left: 25.80645%;
+  }
+  .one-sidebar.sidebar-first #content:last-child {
+    margin-right: 0;
+  }
+}
+
+@media screen and (min-width: 60em) {
+  .one-sidebar.sidebar-first #content {
+    float: left;
+    display: block;
+    margin-right: 2.12766%;
+    width: 74.46809%;
+    margin-left: 25.53191%;
+  }
+  .one-sidebar.sidebar-first #content:last-child {
+    margin-right: 0;
+  }
+}
+
+@media screen and (min-width: 45em) {
+  .two-sidebars #content {
+    float: left;
+    display: block;
+    margin-right: 3.22581%;
+    width: 48.3871%;
+    margin-left: 25.80645%;
+  }
+  .two-sidebars #content:last-child {
+    margin-right: 0;
+  }
+}
+
+@media screen and (min-width: 60em) {
+  .two-sidebars #content {
+    float: left;
+    display: block;
+    margin-right: 2.12766%;
+    width: 40.42553%;
+    margin-left: 25.53191%;
+  }
+  .two-sidebars #content:last-child {
+    margin-right: 0;
+  }
+}
+
+@media screen and (min-width: 45em) {
+  #sidebar-first {
+    float: left;
+    display: block;
+    margin-right: 3.22581%;
+    width: 22.58065%;
+    margin-left: -77.41935%;
+  }
+  #sidebar-first:last-child {
+    margin-right: 0;
+  }
+  .one-sidebar.sidebar-first #sidebar-first {
+    margin-left: -103.22581%;
+  }
+}
+
+@media screen and (min-width: 60em) {
+  #sidebar-first {
+    float: left;
+    display: block;
+    margin-right: 2.12766%;
+    width: 23.40426%;
+    margin-left: -68.08511%;
+  }
+  #sidebar-first:last-child {
+    margin-right: 0;
+  }
+  .one-sidebar.sidebar-first #sidebar-first {
+    margin-left: -102.12766%;
+  }
+}
+
+@media screen and (min-width: 45em) {
+  #sidebar-second {
+    float: left;
+    display: block;
+    margin-right: 3.22581%;
+    width: 22.58065%;
+    margin-left: 0%;
+  }
+  #sidebar-second:last-child {
+    margin-right: 0;
+  }
+}
+
+@media screen and (min-width: 60em) {
+  #sidebar-second {
+    float: left;
+    display: block;
+    margin-right: 2.12766%;
+    width: 31.91489%;
+    margin-left: 0%;
+  }
+  #sidebar-second:last-child {
+    margin-right: 0;
+  }
+}
+
+#footer {
+  float: none;
+  clear: both;
+}
+
+#header, #footer,
+#sidebar-first,
+#sidebar-second,
+#navigation {
+  background: rgba(170, 170, 170, 0.2);
+}
+
+#header,
+#footer,
+.mission,
+.breadcrumb,
+.node {
+  clear: both;
+}

+ 34 - 0
sites/all/themes/contrib/basic/css/theme/print.css

@@ -0,0 +1,34 @@
+* {
+  background-color: transparent;
+}
+
+.sidebar,
+#navigation,
+#header-region,
+#footer,
+.breadcrumb,
+.tabs,
+.feed-icon,
+.links {
+  display: none;
+}
+
+.layout-container {
+  width: 100%;
+}
+
+#content,
+.title {
+  margin: 20px 0;
+  width: auto;
+}
+
+a:hover, a:active, a:link, a:visited {
+  color: black;
+}
+
+#content a:link:after, #content a:visited:after {
+  content: " (" attr(href) ") ";
+  font-size: 0.8em;
+  font-weight: normal;
+}

+ 7 - 0
sites/all/themes/contrib/basic/css/theme/theme.css

@@ -0,0 +1,7 @@
+html {
+  box-sizing: border-box;
+}
+
+*, *::after, *::before {
+  box-sizing: inherit;
+}

+ 26 - 0
sites/all/themes/contrib/basic/images/optimized/README.txt

@@ -0,0 +1,26 @@
+=============================
+Image Minification with Grunt
+=============================
+
+When running Grunt, save images to /images/source and compressed images will 
+automatically be saved to /images/optimized.
+
+===========================
+How to Use Grunt with Basic
+===========================
+
+Grunt requires Node.JS to be installed on your machine. There are various
+package managers that can handle this for you.
+
+https://nodejs.org/download/
+
+Once Node.JS is installed, go to basic/grunt and install your Grunt packages:
+
+  npm install
+
+This will install the neccessary node_modules to run Grunt. Once installed, run
+Grunt via the command line:
+
+  grunt
+
+This will initialize Grunt and start watching changes to your SASS files. Voilà!

+ 26 - 0
sites/all/themes/contrib/basic/images/source/README.txt

@@ -0,0 +1,26 @@
+=============================
+Image Minification with Grunt
+=============================
+
+When running Grunt, save images to /images/source and compressed images will
+automatically be saved to /images/optimized.
+
+===========================
+How to Use Grunt with Basic
+===========================
+
+Grunt requires Node.JS to be installed on your machine. There are various
+package managers that can handle this for you.
+
+https://nodejs.org/download/
+
+Once Node.JS is installed, go to basic/grunt and install your Grunt packages:
+
+  npm install
+
+This will install the neccessary node_modules to run grunt. Once installed, run
+Grunt via the command line:
+
+  grunt
+
+This will initialize Grunt and start watching changes to your SASS files. Voilà!

+ 442 - 0
sites/all/themes/contrib/basic/includes/basic.drush.inc

@@ -0,0 +1,442 @@
+<?php
+
+/**
+ * @file
+ * Drush hooks and include commands for Basic theme.
+ */
+
+/**
+ * Implements hook_drush_command().
+ */
+function basic_drush_command() {
+
+  $items['basic-install'] = array(
+    'description' => dt('Run through the installation process of the Basic theme.'),
+    'options' => array(
+      'destination' => array(
+        'description' => 'Path to which the theme will be placed. If you\'re providing a relative path, note it is relative to the drupal root.',
+        'example-value' => 'themes/',
+      ),
+    ),
+    'aliases' => array('binstall'),
+  );
+
+  return $items;
+}
+
+/**
+ * Implements hook_drush_help().
+ */
+function basic_drush_help($section) {
+  switch ($section) {
+    case 'drush:basic-install':
+      return dt('Runs through an automated process for installing and renaming your theme to use as your own.');
+  }
+}
+
+/**
+ * Implements drush_hook_COMMAND().
+ */
+function drush_basic_install() {
+  drush_print('Checking for npm...');
+  $npm_check_output = drush_shell_exec('npm version 2>&1');
+  if (strpos($npm_check_output, 'command not found')) {
+    drush_print('NPM could not be found. Please install npm (https://nodejs.org/en/) and try again.');
+    exit();
+  }
+  else {
+    drush_print('npm was found.');
+  }
+
+  // Prompt the user what we're doing.
+  drush_print('-----------------------------');
+  drush_print(dt('Welcome to the Basic Install!'));
+  drush_print('-----------------------------');
+  drush_print(dt('We will perform the automated tasks for you to use your new theme. We will create a copy of the Basic theme and store it in the standard theme directory or in spescified destination.'));
+  drush_confirm(dt('Do you wish to continue?'));
+
+  // Rebuild the theme data so that we can safely check for the existence of
+  // themes by using the information provided by list_themes().
+  $theme_handler = \Drupal::service('theme_handler');
+  $theme_handler->rebuildThemeData();
+
+  // Prompt for a theme name.
+  $name = drush_prompt(dt('Please enter the name of that you want for your theme'), 'My Theme');
+
+  // Try to generate a machine-readable name. If that fails, prompt for one.
+  if (!$machine_name = drush_basic_generate_theme_name($name)) {
+    drush_print(dt("Sorry, I couldn't generate a machine-readable name for @name", array(
+      '@name' => $name,
+    )));
+  }
+  // Prompt for a theme name using the automatically generated default if any.
+  drush_set_option('machine-name', drush_basic_require_valid_theme_name(dt('Please enter a machine-readable name for your new theme'), $machine_name));
+
+  // Try to generate a machine-readable name. If that fails, prompt for one.
+  if (!$machine_name = drush_get_option('machine-name', drush_basic_generate_theme_name($name))) {
+    drush_print(dt("Sorry, I couldn't generate a machine-readable name for @name. Please use the '--machine-name' option to specify it manually.", array(
+      '@name' => $name,
+    )));
+  }
+
+  $origin_path = $theme_handler->getTheme('basic')->getPath();
+  $temporary = \Drupal::config('system.file')->get('path.temporary');
+  $temp_path = $temporary . '/' . $machine_name;
+  $destination_path = drush_basic_get_destination($machine_name);
+
+  // Check whether the destination path exist and bail out if it does,
+  // so we don't delete any important data by accident.
+  if (file_exists($destination_path)) {
+    return drush_set_error('BASIC_COPY_PATH', dt('The path !path already exists.', array(
+      '!path' => $destination_path,
+    )));
+  }
+
+  if (is_dir($temp_path)) {
+    basic_rm_dir($temp_path);
+  }
+
+  // Copy into temp directory.
+  if (!basic_copy_dir($origin_path, $temp_path)) {
+    return drush_set_error('DRUSH_COPY_DIR_FAILURE', dt('Failed to copy !origin_path to !temp_path.', array(
+      '!origin_path' => $origin_path,
+      '!temp_path' => $temp_path,
+    )));
+  }
+
+  // Recursively rewrite the file names and contents of all the files that are
+  // now in the subtheme's directory to represent the human- and
+  // machine-readable names of the subtheme.
+  $search = array(
+    'basic' => $machine_name,
+    'Basic' => $name,
+  );
+
+  if (!drush_basic_rewrite_recursive($temp_path, array_keys($search), array_values($search))) {
+    return drush_set_error('BASIC_COPY_GENERATE_THEME', dt('Failed to rewrite files and contents while generating theme.'));
+  }
+
+  // Copy from temp folder into new theme's folder.
+  if (!basic_copy_dir($temp_path, $destination_path)) {
+    return drush_set_error('DRUSH_COPY_DIR_FAILURE', dt('Failed to copy !temp_path to !destination_path.', array(
+      '!temp_path' => $temp_path,
+      '!destination_path' => $destination_path,
+    )));
+  }
+
+  // Run npm install on the new theme folder.
+  drush_print(dt("Building node dependencies for the theme @theme. This could take a couple minutes.", array(
+    '@theme' => $machine_name,
+  )));
+  drush_op('chdir', DRUPAL_ROOT . '/' . $destination_path);
+  drush_shell_exec('npm install');
+  drush_print(dt("Node dependancies have been successfully built."));
+
+  // Notify user of successful installation.
+  drush_print(dt("------------------------------------------------------------------"));
+  drush_print(dt("The new theme, !theme, has been successfully derived from Basic and placed in !destination.", array(
+    '!theme' => $machine_name,
+    '!destination' => $destination_path,
+  )));
+  drush_print(dt("------------------------------------------------------------------"));
+}
+
+/**
+ * Generates a valid machine-readable name for a theme from any string.
+ *
+ * @param string $string
+ *   The string to generate the machine-readable name from.
+ *
+ * @return string
+ *   The generated machine-readable name.
+ */
+function drush_basic_generate_theme_name($string) {
+  // Lowercase to start.
+  $string = strtolower($string);
+  // Machine-readable names have to start with a lowercase letter.
+  // $string = preg_replace('/^[^a-z]+/', '', strtolower($string));
+  // Machine-readable names may only contain alphanumeric characters and
+  // underscores.
+  $string = preg_replace('/[^a-z0-9_]+/', '_', $string);
+  // Trim all trailing and leading underscores.
+  $string = trim($string, '_');
+
+  // Get list of current themes.
+  $theme_handler = \Drupal::service('theme_handler');
+  $themes = $theme_handler->listInfo();
+
+  if (isset($themes[$string])) {
+    $plain = $string;
+    $counter = 0;
+
+    while (isset($themes[$string])) {
+      // Make sure that the machine-readable name of the theme is unique.
+      $string = $plain . '_' . $counter++;
+    }
+  }
+
+  return $string;
+}
+
+/**
+ * Helper function that continuously prompts for a valid machine-readable name.
+ *
+ * @param string $message
+ *   The message that should be displayed.
+ * @param string $default
+ *   (Optional) The default theme name. Defaults to NULL.
+ *
+ * @return string
+ *   A valid, unique machine-readable name.
+ */
+function drush_basic_require_valid_theme_name($message, $default = NULL) {
+  while (TRUE) {
+    // Keep prompting for a machine-name until we get an acceptable value.
+    $prompt = drush_prompt($message, $default);
+
+    if (!preg_match('/^[a-z][a-z0-9_]*$/', $prompt)) {
+      drush_print('The machine-readable name is invalid. It may only contain lowercase numbers, letters and underscores and must start with a letter.');
+    }
+    else {
+
+      // Get list of current themes.
+      $theme_handler = \Drupal::service('theme_handler');
+      $themes = $theme_handler->listInfo();
+
+      // Validate that the machine-readable name of the theme is unique.
+      if (isset($themes[$prompt])) {
+        drush_print(dt('A theme with the name @name already exists. The machine-readable name must be unique.', array(
+          '@name' => $prompt,
+        )));
+      }
+      else {
+        // The given machine-readable name is valid. Let's proceed.
+        return $prompt;
+      }
+    }
+  }
+}
+
+/**
+ * Helper function to get proper destination for the new theme.
+ *
+ * @param string $machine_name
+ *   A valid, unique machine-readable name for the new theme.
+ *
+ * @return string
+ *   The path to the destination where the new theme should be placed.
+ */
+function drush_basic_get_destination($machine_name) {
+  // Find proper destination if no destination option is provided.
+  if ($destination = drush_get_option('destination')) {
+    $destination_path = drush_trim_path($destination) . '/' . $machine_name;
+  }
+  else {
+    $site_root = drush_get_context('DRUSH_DRUPAL_SITE_ROOT');
+    if ($site_root == 'sites/default') {
+      $destination_path = 'themes/' . $machine_name;
+    }
+    else {
+      $destination_path = $site_root . '/themes/' . $machine_name;
+    }
+  }
+  $destination_path = drush_normalize_path($destination_path);
+  return $destination_path;
+}
+
+/**
+ * Recursively rewrites (and renames) all files in a given path.
+ *
+ * @param string $path
+ *   The path to rewrite all files in.
+ * @param string|array $search
+ *   The string(s) to look for when replacing the file names and contents. Can
+ *   be an array or a string.
+ * @param string|array $replace
+ *   The string(s) to replace $search with. Can be an array or a string.
+ *
+ * @return bool
+ *   TRUE if the operation succeeded, FALSE otherwise.
+ *
+ * @see omega_drush_replace_contents()
+ * @see str_replace()
+ */
+function drush_basic_rewrite_recursive($path, $search, $replace) {
+  if (!is_dir($path)) {
+    return drush_set_error('INVALID_PATH', dt('The given path !path is not a directory.', array(
+      '!path' => $path,
+    )));
+  }
+
+  // If the file actually is a directory, proceed with the recursion.
+  $directory = new DirectoryIterator($path);
+
+  foreach ($directory as $item) {
+    if ($item->isDot()) {
+      // Do not process '..' and '.'.
+      continue;
+    }
+
+    // Retrieve the path of the current item.
+    $pathname = $item->getPathname();
+    if ($item->isDir() && !drush_basic_rewrite_recursive($pathname, $search, $replace)) {
+      return FALSE;
+    }
+    elseif ($item->isFile()) {
+      // If it is a file, try to replace its contents.
+      $content = file_get_contents($pathname);
+
+      // Nothing to replace in empty files.
+      if (empty($content)) {
+        unlink($pathname);
+        continue;
+      }
+
+      if (($changed_content = str_replace($search, $replace, $content)) === NULL) {
+        return drush_set_error('REWRITE_FAILURE', dt('There was an error while trying to rewrite !path (!search to !replace)', array(
+          '!path' => $pathname,
+          '!search' => $search,
+          '!replace' => $replace,
+        )));
+      }
+
+      if ($content !== $changed_content) {
+        file_put_contents($pathname, $changed_content);
+      }
+    }
+  }
+
+  return TRUE;
+}
+
+/**
+ * Copy $src to $dest.
+ *
+ * @param string $src
+ *   The directory to copy.
+ * @param string $dest
+ *   The destination to copy the source to, including the new name of
+ *   the directory.  To copy directory "a" from "/b" to "/c", then
+ *   $src = "/b/a" and $dest = "/c/a".  To copy "a" to "/c" and rename
+ *   it to "d", then $dest = "/c/d".
+ * @param int $overwrite
+ *   Action to take if destination already exists.
+ *     - FILE_EXISTS_OVERWRITE - completely removes existing directory.
+ *     - FILE_EXISTS_ABORT - aborts the operation.
+ *     - FILE_EXISTS_MERGE - Leaves existing files and directories in place.
+ *
+ * @return bool
+ *   TRUE on success, FALSE on failure.
+ */
+function basic_copy_dir($src, $dest, $overwrite = FILE_EXISTS_ABORT) {
+  // Preflight based on $overwrite if $dest exists.
+  if (file_exists($dest)) {
+    if ($overwrite === FILE_EXISTS_OVERWRITE) {
+      drush_op('drush_delete_dir', $dest, TRUE);
+    }
+    elseif ($overwrite === FILE_EXISTS_ABORT) {
+      return drush_set_error('DRUSH_DESTINATION_EXISTS', dt('Destination directory !dest already exists.', array('!dest' => $dest)));
+    }
+    elseif ($overwrite === FILE_EXISTS_MERGE) {
+      // $overwrite flag may indicate we should merge instead.
+      drush_log(dt('Merging existing !dest directory', array('!dest' => $dest)));
+    }
+  }
+  // $src readable?
+  if (!is_readable($src)) {
+    return drush_set_error('DRUSH_SOURCE_NOT_EXISTS', dt('Source directory !src is not readable or does not exist.', array('!src' => $src)));
+  }
+  // $dest writable?
+  if (!is_writable(dirname($dest))) {
+    return drush_set_error('DRUSH_DESTINATION_NOT_WRITABLE', dt('Destination directory !dest is not writable.', array('!dest' => dirname($dest))));
+  }
+  // Try to do a recursive copy.
+  if (@drush_op('_basic_recursive_copy', $src, $dest)) {
+    return TRUE;
+  }
+
+  return drush_set_error('DRUSH_COPY_DIR_FAILURE', dt('Unable to copy !src to !dest.', array('!src' => $src, '!dest' => $dest)));
+}
+
+/**
+ * Internal function called by basic_copy_dir; do not use directly.
+ */
+function _basic_recursive_copy($src, $destination) {
+  static $machine_name;
+  if (!isset($machine_name)) {
+    $machine_name = drush_get_option('machine-name');
+  }
+  // All subdirectories and contents.
+  $ignore_directories = array(
+    'node_modules',
+  );
+  $no_mask = '/^' . implode('|', $ignore_directories) . '$/';
+
+  if (is_dir($src)) {
+    if (!drush_mkdir($destination, TRUE)) {
+      return FALSE;
+    }
+    $dir_handle = opendir($src);
+    while ($file = readdir($dir_handle)) {
+      if (($file[0] != '.' || $file == '.gitignore') && !preg_match($no_mask, $file)) {
+        if (_basic_recursive_copy("$src/$file", "$destination/$file") !== TRUE) {
+          return FALSE;
+        }
+      }
+    }
+    closedir($dir_handle);
+  }
+  elseif (is_link($src)) {
+    symlink(readlink($src), $destination);
+  }
+  elseif (!copy($src, $destination)) {
+    return FALSE;
+  }
+
+  // Rename files with basic.
+  if (strpos($destination, 'basic') !== FALSE) {
+    $renamed_destination = str_replace('basic', $machine_name, $destination);
+    rename($destination, $renamed_destination);
+  }
+
+  // Preserve file modification time.
+  touch($destination, filemtime($src));
+
+  // Preserve execute permission.
+  if (!is_link($src) && !drush_is_windows()) {
+    // Get execute bits of $src.
+    $execperms = fileperms($src) & 0111;
+    // Apply execute permissions if any.
+    if ($execperms > 0) {
+      $perms = fileperms($destination) | $execperms;
+      chmod($destination, $perms);
+    }
+  }
+
+  return TRUE;
+}
+
+/**
+ * Recursively removes all files within the provided directory.
+ *
+ * USE WITH CAUTION.
+ *
+ * @param string $dir
+ *   File path for the directory you want to delete.
+ */
+function basic_rm_dir($dir) {
+  if (is_dir($dir)) {
+    $objects = scandir($dir);
+    foreach ($objects as $object) {
+      if ($object != "." && $object != "..") {
+        if (is_dir($dir . "/" . $object)) {
+          basic_rm_dir($dir . "/" . $object);
+        }
+        else {
+          unlink($dir . "/" . $object);
+        }
+      }
+    }
+    rmdir($dir);
+  }
+}

+ 2 - 0
sites/all/themes/contrib/basic/js/build/scripts.js

@@ -0,0 +1,2 @@
+!function(Drupal,$,window){Drupal.behaviors.basic={attach:function(context,settings){$(window).load(function(){}),$(window).resize(function(){}),$(window).scroll(function(){})}}}(Drupal,jQuery,this);
+//# sourceMappingURL=scripts.js.map

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 0
sites/all/themes/contrib/basic/js/modernizr.js


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 4 - 0
sites/all/themes/contrib/basic/js/selectivizr-min.js


+ 37 - 0
sites/all/themes/contrib/basic/js/source/scripts.js

@@ -0,0 +1,37 @@
+/**
+ * @file
+ * A JavaScript file for the theme.
+ *
+ * In order for this JavaScript to be loaded on pages, see the instructions in
+ * the README.txt next to this file.
+ */
+
+// JavaScript should be made compatible with libraries other than jQuery by
+// wrapping it with an "anonymous closure". See:
+// - https://drupal.org/node/1446420
+// - http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth
+(function (Drupal, $) {
+  'use strict';
+
+  // To understand behaviors, see https://www.drupal.org/node/2269515
+  Drupal.behaviors.basic = {
+    attach: function (context, settings) {
+
+      // Execute code once the DOM is ready. $(handler) not required
+      // within Drupal.behaviors.
+      $(window).on('load', function () {
+        // Execute code once the window is fully loaded.
+      });
+
+      $(window).on('resize', function () {
+        // Execute code when the window is resized.
+      });
+
+      $(window).on('scroll', function () {
+        // Execute code when the window scrolls.
+      });
+
+    }
+  };
+
+})(Drupal, jQuery);

BIN
sites/all/themes/contrib/basic/logo.png


+ 50 - 0
sites/all/themes/contrib/basic/logo.svg

@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="162px" height="40px" viewBox="0 0 162 40" enable-background="new 0 0 162 40" xml:space="preserve">
+<g>
+	<g>
+		<path fill="#383C3F" d="M52.229,26.851C52.094,23.447,52.136,0,52.136,0h2.443v9.65c0,1.449-0.033,2.78-0.1,3.998l-0.073,2.098
+			h0.173c1.02-1.611,2.25-2.795,3.69-3.552c1.439-0.757,3.17-1.136,5.196-1.136c3.75,0,6.577,1.181,8.477,3.542
+			c1.9,2.361,2.85,5.812,2.85,10.353c0,4.46-1,7.898-2.999,10.316c-1.999,2.419-4.809,3.628-8.428,3.628
+			c-1.91,0-3.628-0.396-5.159-1.185c-1.531-0.788-2.74-1.908-3.628-3.356C54.579,34.355,52.397,31,52.229,26.851z M63.415,13.28
+			c-3.16,0-5.422,0.904-6.787,2.715c-1.367,1.809-2.049,4.796-2.049,8.958v0.421c0,4.046,0.711,6.951,2.134,8.711
+			c1.424,1.761,3.641,2.641,6.652,2.641c2.928,0,5.132-1.024,6.614-3.074c1.481-2.046,2.221-4.963,2.221-8.747
+			C72.201,17.154,69.272,13.28,63.415,13.28z"/>
+		<path fill="#383C3F" d="M98.511,38.402l-0.617-4.244h-0.197c-1.349,1.728-2.735,2.948-4.159,3.664
+			c-1.424,0.718-3.105,1.074-5.047,1.074c-2.632,0-4.682-0.674-6.145-2.024c-1.466-1.347-2.197-3.216-2.197-5.601
+			c0-2.618,1.09-4.649,3.271-6.098c2.178-1.447,5.335-2.213,9.464-2.296l5.109-0.146v-1.778c0-2.549-0.519-4.473-1.555-5.775
+			c-1.037-1.298-2.707-1.949-5.011-1.949c-2.483,0-5.06,0.692-7.724,2.072l-0.914-2.122c2.946-1.383,5.857-2.072,8.737-2.072
+			c2.944,0,5.146,0.764,6.603,2.294s2.185,3.915,2.185,7.158v17.842H98.511L98.511,38.402z M88.639,36.675
+			c2.863,0,5.12-0.818,6.774-2.455c1.653-1.637,2.48-3.911,2.48-6.823v-2.642l-4.688,0.197c-3.77,0.182-6.455,0.771-8.058,1.768
+			c-1.605,0.994-2.408,2.544-2.408,4.649c0,1.679,0.515,2.984,1.543,3.912C85.31,36.21,86.763,36.675,88.639,36.675z"/>
+		<path fill="#383C3F" d="M125.634,31.418c0,2.403-0.913,4.25-2.739,5.541c-1.827,1.293-4.418,1.938-7.775,1.938
+			c-3.587,0-6.432-0.552-8.539-1.654v-2.641c2.699,1.351,5.547,2.024,8.539,2.024c2.65,0,4.663-0.441,6.035-1.321
+			c1.375-0.88,2.062-2.053,2.062-3.517c0-1.349-0.548-2.484-1.641-3.405c-1.096-0.921-2.894-1.827-5.394-2.716
+			c-2.682-0.971-4.566-1.806-5.651-2.505c-1.086-0.699-1.905-1.489-2.455-2.37c-0.553-0.878-0.827-1.952-0.827-3.22
+			c0-2.007,0.844-3.595,2.529-4.764c1.687-1.167,4.043-1.751,7.072-1.751c2.894,0,5.642,0.542,8.242,1.628l-0.913,2.224
+			c-2.633-1.086-5.078-1.63-7.329-1.63c-2.191,0-3.925,0.361-5.209,1.087c-1.283,0.723-1.924,1.727-1.924,3.009
+			c0,1.4,0.497,2.519,1.491,3.357c0.996,0.84,2.939,1.778,5.838,2.813c2.419,0.873,4.179,1.658,5.28,2.357
+			c1.104,0.699,1.931,1.493,2.48,2.381C125.358,29.174,125.634,30.219,125.634,31.418z"/>
+		<path fill="#383C3F" d="M134.987,38.402h-2.442V11.576h2.442V38.402z"/>
+		<path fill="#383C3F" d="M154.683,38.897c-3.834,0-6.836-1.21-9.008-3.629c-2.173-2.418-3.258-5.791-3.258-10.118
+			c0-4.442,1.125-7.901,3.38-10.378c2.254-2.475,5.341-3.714,9.256-3.714c2.32,0,4.541,0.404,6.664,1.208l-0.666,2.172
+			c-2.32-0.771-4.337-1.159-6.048-1.159c-3.289,0-5.784,1.014-7.479,3.047c-1.692,2.032-2.542,4.956-2.542,8.773
+			c0,3.619,0.85,6.452,2.542,8.502c1.695,2.049,4.065,3.072,7.109,3.072c2.435,0,4.697-0.436,6.786-1.308v2.271
+			C159.708,38.478,157.464,38.897,154.683,38.897z"/>
+	</g>
+	<g>
+		<path fill="#383C3F" d="M15.325,38.863c0-7.852,0-15.675,0-23.533c7.844,0,15.679,0,23.573,0c0,0.206,0,0.392,0,0.579
+			c0,6.58-0.002,13.161,0.003,19.742c0,1.057-0.255,1.981-1.137,2.662c-0.571,0.44-1.22,0.578-1.903,0.579
+			c-6.721,0.007-13.441,0.004-20.159,0.003C15.583,38.895,15.465,38.875,15.325,38.863z"/>
+		<path fill="#383C3F" d="M38.863,11.07c-12.952,0-25.877,0-38.83,0c-0.012-0.161-0.03-0.296-0.03-0.431
+			C0.002,8.121-0.005,5.604,0.005,3.085C0.012,1.59,0.804,0.45,2.066,0.128C2.431,0.035,2.822,0.006,3.2,0.005
+			C14.035-0.001,24.871,0,35.705,0.001c1.57,0,2.686,0.733,3.044,2.012c0.088,0.313,0.142,0.647,0.144,0.973
+			c0.01,2.587,0.004,5.174,0.002,7.762C38.896,10.848,38.877,10.948,38.863,11.07z"/>
+		<path fill="#383C3F" d="M11.075,38.896c-0.758,0-1.467,0-2.176,0c-1.927,0-3.854,0.006-5.782-0.002
+			c-1.509-0.007-2.636-0.772-2.975-2.035c-0.093-0.348-0.132-0.719-0.133-1.08C0,29.111,0.002,22.443,0.003,15.776
+			c0-0.137,0.014-0.273,0.023-0.445c3.688,0,7.355,0,11.049,0C11.075,23.173,11.075,30.996,11.075,38.896z"/>
+	</g>
+</g>
+</svg>

+ 26 - 0
sites/all/themes/contrib/basic/package.json

@@ -0,0 +1,26 @@
+{
+  "name": "basic",
+  "version": "0.1.0",
+  "dependencies": {
+    "bourbon": "~4.3.0",
+    "bourbon-neat": "~1.8.0",
+    "grunt": "^1.0.1",
+    "autoprefixer": "^6.7.2",
+    "grunt-browser-sync": "^2.2.0",
+    "grunt-contrib-concat": "^1.0.1",
+    "grunt-contrib-imagemin": "^1.0.1",
+    "grunt-contrib-uglify": "^2.1.0",
+    "grunt-contrib-watch": "^1.0.0",
+    "grunt-notify": "^0.4.5",
+    "grunt-sass": "^2.0.0",
+    "grunt-svgmin": "^4.0.0",
+    "grunt-postcss": "^0.8.0",
+    "pixrem": "^3.0.2",
+    "postcss": "^5.2.12"
+  },
+  "description": "=========================== How to Use Grunt with Basic ===========================",
+  "main": "Gruntfile.js",
+  "devDependencies": {},
+  "author": "",
+  "license": "MIT"
+}

+ 32 - 0
sites/all/themes/contrib/basic/sass/base/_buttons.sass

@@ -0,0 +1,32 @@
+// Button styles
+#{$all-buttons}
+  appearance: none
+  background-color: $action-color
+  border: 0
+  border-radius: $base-border-radius
+  color: #fff
+  cursor: pointer
+  display: inline-block
+  font-family: $base-font-family
+  font-size: $base-font-size
+  -webkit-font-smoothing: antialiased
+  font-weight: 600
+  line-height: 1
+  padding: $small-spacing $base-spacing
+  text-decoration: none
+  transition: background-color $base-duration $base-timing
+  user-select: none
+  vertical-align: middle
+  white-space: nowrap
+
+  &:hover,
+  &:focus
+    background-color: shade($action-color, 20%)
+    color: #fff
+
+  &:disabled
+    cursor: not-allowed
+    opacity: 0.5
+
+    &:hover
+      background-color: $action-color

+ 71 - 0
sites/all/themes/contrib/basic/sass/base/_forms.sass

@@ -0,0 +1,71 @@
+// Form styles
+fieldset
+  background-color: transparent
+  border: 0
+  margin: 0
+  padding: 0
+
+legend
+  font-weight: 600
+  margin-bottom: $small-spacing / 2
+  padding: 0
+
+label
+  display: block
+  font-weight: normal
+  margin-bottom: $small-spacing / 2
+
+input,
+select
+  display: block
+  font-family: $base-font-family
+  font-size: $base-font-size
+
+#{$all-text-inputs},
+select[multiple]
+  background-color: $base-background-color
+  border: $base-border
+  border-radius: $base-border-radius
+  box-shadow: $form-box-shadow
+  box-sizing: border-box
+  font-family: $base-font-family
+  font-size: $base-font-size
+  margin-bottom: $small-spacing
+  padding: $base-spacing / 3
+  transition: border-color $base-duration $base-timing
+  width: 100%
+
+  &:hover
+    border-color: shade($base-border-color, 20%)
+
+  &:focus
+    border-color: $action-color
+    box-shadow: $form-box-shadow-focus
+    outline: none
+
+  &:disabled
+    background-color: shade($base-background-color, 5%)
+    cursor: not-allowed
+
+    &:hover
+      border: $base-border
+
+textarea
+  resize: vertical
+
+[type="search"]
+  appearance: none
+
+[type="checkbox"],
+[type="radio"]
+  display: inline
+  margin-right: $small-spacing / 2
+
+[type="file"]
+  margin-bottom: $small-spacing
+  width: 100%
+
+select
+  margin-bottom: $base-spacing
+  max-width: 100%
+  width: auto

+ 16 - 0
sites/all/themes/contrib/basic/sass/base/_lists.sass

@@ -0,0 +1,16 @@
+// List styles
+ul,
+ol
+  list-style-type: none
+  margin: 0
+  padding: 0
+
+dl
+  margin-bottom: $small-spacing
+
+dt
+  font-weight: 600
+  margin-top: $small-spacing
+
+dd
+  margin: 0

+ 9 - 0
sites/all/themes/contrib/basic/sass/base/_media.sass

@@ -0,0 +1,9 @@
+// Media styles
+figure
+  margin: 0
+
+img,
+picture
+  max-width: 100%
+  height: auto
+  vertical-align: top

+ 21 - 0
sites/all/themes/contrib/basic/sass/base/_tables.sass

@@ -0,0 +1,21 @@
+// Table styles
+table
+  border-collapse: collapse
+  margin: $small-spacing 0
+  table-layout: fixed
+  width: 100%
+
+th
+  border-bottom: 1px solid shade($base-border-color, 25%)
+  font-weight: 600
+  padding: $small-spacing 0
+  text-align: left
+
+td
+  border-bottom: $base-border
+  padding: $small-spacing 0
+
+tr,
+td,
+th
+  vertical-align: middle

+ 71 - 0
sites/all/themes/contrib/basic/sass/base/_typography.sass

@@ -0,0 +1,71 @@
+// Typographic styles
+body
+  color: $base-font-color
+  font-family: $base-font-family
+  font-size: $base-font-size
+  line-height: $base-line-height
+  letter-spacing: $base-letter-spacing
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6
+  font-family: $heading-font-family
+  font-size: $base-font-size
+  line-height: $heading-line-height
+  margin: 0 0 $small-spacing
+
+h1
+  font-size: 2.2em
+
+h2
+  font-size: 1.8em
+
+h3
+  font-size: 1.4em
+
+h4
+  font-size: 1.2em
+
+h5
+  font-size: 1.1em
+
+p
+  margin: 0 0 $small-spacing
+
+a
+  color: $action-color
+  text-decoration: none
+  transition: color $base-duration $base-timing
+
+  &:active,
+  &:focus,
+  &:hover
+    color: shade($action-color, 25%)
+
+hr
+  border-bottom: $base-border
+  border-left: 0
+  border-right: 0
+  border-top: 0
+  margin: $base-spacing 0
+
+// Code
+pre, code, tt
+  font: 1em "andale mono", "lucida console", monospace
+  line-height: 1.5
+
+pre
+  background-color: #efefef
+  display: block
+  padding: 5px
+  margin: 5px 0
+  border: 1px solid #aaaaaa
+
+// Abbreviation
+abbr
+  border-bottom: 1px dotted #666666
+  cursor: help
+  white-space: nowrap

+ 13 - 0
sites/all/themes/contrib/basic/sass/base/base.sass

@@ -0,0 +1,13 @@
+@import "../config/config"
+
+// BASE: HTML element styling Read more about SMACSS categorization for Drupal
+// Themes: https://www.drupal.org/node/1887922
+
+// This file is complied separately so we can pull in config dependencies above
+// while also maintaining Drupal SMACSS structure.
+@import "buttons"
+@import "forms"
+@import "lists"
+@import "media"
+@import "tables"
+@import "typography"

+ 5 - 0
sites/all/themes/contrib/basic/sass/components/_breadcrumb.sass

@@ -0,0 +1,5 @@
+// Breadcrumb styles
+.breadcrumb
+  li
+    list-style-type: none
+    display: inline-block

+ 5 - 0
sites/all/themes/contrib/basic/sass/components/_navigation.sass

@@ -0,0 +1,5 @@
+// Navigation styles
+#navigation
+  li
+    list-style-type: none
+    display: inline-block

+ 5 - 0
sites/all/themes/contrib/basic/sass/components/_pager.sass

@@ -0,0 +1,5 @@
+.pager__item
+  display: inline
+
+  a
+    display: inline-block

+ 7 - 0
sites/all/themes/contrib/basic/sass/components/_site-name.sass

@@ -0,0 +1,7 @@
+// Site name
+.site-name
+  font-size: 2.2em
+  line-height: 1.3em
+  font-weight: 300
+  padding: 0 0 0.5em
+  margin: 0

+ 11 - 0
sites/all/themes/contrib/basic/sass/components/components.sass

@@ -0,0 +1,11 @@
+@import "../config/config"
+
+// COMPONENTS: Discrete, reusable UI elements
+// Read more about SMACSS categorization for Drupal themes: https://www.drupal.org/node/1887922
+
+// This file is complied separately so we can pull in config dependencies above
+// while also maintaining Drupals SMACSS structure.
+@import "breadcrumb"
+@import "navigation"
+@import "site-name"
+@import "pager"

+ 33 - 0
sites/all/themes/contrib/basic/sass/components/messages.sass

@@ -0,0 +1,33 @@
+@import "../config/config"
+
+// Messages.
+.messages
+  padding: 9px
+  margin: 1em 0
+  color: darken($light-gray, 30%)
+  background-color: $light-gray
+  border: 1px solid darken($light-gray, 10%)
+  word-wrap: break-word
+  pre
+    border: 0
+
+.messages--warning
+  color: darken($error-color, 15%)
+  background-color: $warning-color
+  border-color: darken($warning-color, 10%)
+  pre
+    background-color: darken($warning-color, 10%)
+
+.messages--error
+  color: white
+  background-color: $error-color
+  border-color: darken($error-color, 10%)
+  pre
+    background-color: darken($error-color, 10%)
+
+.messages--status
+  color: darken($status-color, 35%)
+  background-color: $status-color
+  border-color: darken($status-color, 10%)
+  pre
+    background-color: darken($status-color, 10%)

+ 16 - 0
sites/all/themes/contrib/basic/sass/components/tabs.sass

@@ -0,0 +1,16 @@
+@import "../config/config"
+
+// Tabs.
+ul.tabs
+  width: 100%
+  margin: 0 0 5px
+  border-bottom: 1px solid $light-gray
+
+  li
+    display: inline-block
+
+  a
+    display: block
+    border: 1px solid $light-gray
+    border-bottom: 0
+    border-radius: 3px 3px 0 0

+ 36 - 0
sites/all/themes/contrib/basic/sass/config/_config.sass

@@ -0,0 +1,36 @@
+// Config
+// ---------
+// Use the same color all over the place? Need to do
+// some math with height and width and text size?
+// Sass supports variables as well as basic math
+// operations and many useful functions.
+//
+// For setting variables, see:
+// /sass/config/_variables.sass
+//
+// For setting mixins:
+// /sass/config/_mixins.sass
+//
+// For complete documentation:
+// http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#variables_
+//
+// Available functions:
+// http://sass-lang.com/docs/yardoc/Sass/Script/Functions.html
+
+// Bourbon and Bourbon Neat documentation:
+// Bourbon: http://bourbon.io/docs/
+// Bourbon Neat (grid): http://neat.bourbon.io/docs/
+
+// Import variables and mixins to be used (Bourbon)
+@import "../../node_modules/bourbon/app/assets/stylesheets/bourbon"
+@import "../../node_modules/bourbon-neat/app/assets/stylesheets/neat-helpers"
+
+// Import grid to be used (Bourbon Neat)
+@import "grid-settings"
+
+// We load this after we provide our overrides
+@import "../../node_modules/bourbon-neat/app/assets/stylesheets/neat"
+
+// Import local files
+@import "variables"
+@import "mixins"

+ 27 - 0
sites/all/themes/contrib/basic/sass/config/_grid-settings.sass

@@ -0,0 +1,27 @@
+// Bourbon grid display. Set to "true" to turn on.
+// $visual-grid: false
+// $visual-grid-color: #EEEEEE
+// $visual-grid-index: back
+// $visual-grid-opacity: 0.4
+
+// Set to false if you'd like to remove the responsiveness
+$responsive: true
+
+// Neat Overrides
+$column: 60px
+$gutter: 20px
+$grid-columns: 4
+
+// We set the max width of the page.
+$font-size:     16px
+$max-width:     1200px
+
+// Breakpoints
+$small-screen:  320px
+$medium-screen: 720px
+$large-screen:  960px
+
+// Define your mobile first breakpoints using min-width
+$small-screen-up:   new-breakpoint(min-width #{$small-screen/$font-size}em 4)
+$medium-screen-up:  new-breakpoint(min-width #{$medium-screen/$font-size}em 8)
+$large-screen-up:   new-breakpoint(min-width #{$large-screen/$font-size}em 12)

+ 19 - 0
sites/all/themes/contrib/basic/sass/config/_mixins.sass

@@ -0,0 +1,19 @@
+// Mixins
+// --------
+// Mixins allow you to define styles that can be re-used / throughout the
+// stylesheet without needing to resort to / non-semantic classes like .float-
+// left. Mixins can also / contain full CSS rules, and anything else allowed /
+// elsewhere in a Sass document. They can even take / arguments which allows you
+// to produce a wide variety / of styles with very few mixins.
+
+// For complete documentation:
+// Sass mixins: http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#mixins
+// Bourbon mixins: http://bourbon.io/docs/
+
+// Omega Reset for Bourbon Neat grid
+// Read more: http://www.joshfry.me/blog/2013/05/13/omega-reset-for-bourbon-neat
+@mixin omega-reset($nth)
+  &:nth-child(#{$nth})
+    margin-right: flex-gutter()
+  &:nth-child(#{$nth}+1)
+    clear: none

+ 65 - 0
sites/all/themes/contrib/basic/sass/config/_variables.sass

@@ -0,0 +1,65 @@
+// Variables
+// -----------
+// Use the same color all over the place? Need to do some math with height and
+// width and text size? Sass supports variables as well as basic math operations
+// and many useful functions.
+
+// For complete documentation:
+// http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#variables_
+
+// Margin/Padding
+$margin: $gutter
+$padding: $gutter
+
+// Typography
+$base-font-family: $helvetica
+$heading-font-family: $base-font-family
+
+// Font Sizes
+$base-font-size: $font-size
+
+// Line height
+$base-line-height: 1.5
+$heading-line-height: 1.3
+
+// Letter spacing
+$base-letter-spacing: 0.03em
+
+// Other Sizes
+$base-border-radius: 2px
+$base-spacing: $base-line-height * 1em
+$small-spacing: $base-spacing / 2
+$base-z-index: 0
+
+// Colors
+$dark-gray: #333
+$medium-gray: #999
+$light-gray: #ddd
+
+// Brand Colors
+$primary-color: #555
+
+// Action Colors
+$status-color: #8dbe51
+$warning-color: #ddc44f
+$error-color: #cd4533
+
+// Font Colors
+$base-font-color: $dark-gray
+$action-color: $primary-color
+
+// Border
+$base-border-color: $light-gray
+$base-border: 1px solid $base-border-color
+
+// Background Colors
+$base-background-color: #fff
+$secondary-background-color: tint($base-border-color, 75%)
+
+// Forms
+$form-box-shadow: inset 0 1px 3px rgba(#000, 0.06)
+$form-box-shadow-focus: $form-box-shadow, 0 0 5px adjust-color($action-color, $lightness: -5%, $alpha: -0.3)
+
+// Animations
+$base-duration: 150ms
+$base-timing: ease

+ 101 - 0
sites/all/themes/contrib/basic/sass/layout/_layout--grid.sass

@@ -0,0 +1,101 @@
+// Layout
+// ------
+// Using a negative margin technique, made possible with Bourbon Neat, the page
+// is loaded in this order:
+
+// 1. Header
+// 2. Content
+// 3. Navigation menus
+// 4. Sidebar Left
+// 5. Sideabr Right
+//
+// Layout rules.
+// (Disclaimer: do not change if you're not sure you know what you're doing.)
+
+.container
+  @include outer-container
+  width: auto
+
+#content
+  .no-sidebar &
+    // 100% width for small screens. No definitions required.
+    // Same logic for medium screens. No definitions required.
+    // Same logic for large screens. No definitions required.
+
+  .one-sidebar.sidebar-second &
+    // 100% width for small screens. No definitions required.
+    // Span this div 6 columns wide for medium screens.
+    @include media($medium-screen-up)
+      @include span-columns(6)
+    // Span this div 8 columns wide for large screens.
+    @include media($large-screen-up)
+      @include span-columns(8)
+
+  .one-sidebar.sidebar-first &
+    // 100% width for small screens. No definitions required.
+    // Span this div 6 columns wide for medium screens.
+    @include media($medium-screen-up)
+      @include span-columns(6)
+      @include shift(2)
+    // Span this div 9 columns wide for large screens.
+    @include media($large-screen-up)
+      @include span-columns(9)
+      @include shift(3)
+
+  .two-sidebars &
+    // 100% width for small screens. No definitions required.
+    // Span this div 4 columns wide for medium screens.
+    @include media($medium-screen-up)
+      @include span-columns(4)
+      @include shift(2)
+    // Span this div 5 columns wide for large screens.
+    @include media($large-screen-up)
+      @include span-columns(5)
+      @include shift(3)
+
+#sidebar-first
+  // 100% width for small screens. No definitions required.
+  // Span this div 2 columns wide for medium screens.
+  @include media($medium-screen-up)
+    @include span-columns(2)
+    // Shift it to the left to place it in the far left column. Different shift for two-sidebar and one-sidebar layout.
+    @include shift(-6)
+    .one-sidebar.sidebar-first &
+      @include shift(-8)
+  @include media($large-screen-up)
+    // Span this div 3 columns wide for large screens.
+    @include span-columns(3)
+    // Shift it to the left to place it in the far left column. Different shift for two-sidebar and one-sidebar layout.
+    @include shift(-8)
+    .one-sidebar.sidebar-first &
+      @include shift(-12)
+
+#sidebar-second
+  // 100% width for small screens. No definitions required.
+  // Span this div 2 columns wide for medium screens.
+  @include media($medium-screen-up)
+    @include span-columns(2)
+    @include shift(0)
+  @include media($large-screen-up)
+    // Span this div 4 columns wide for large screens.
+    @include span-columns(4)
+    @include shift(0)
+
+#footer
+  float: none
+  clear: both
+
+// Region Colors. Delete when starting a new theme.
+#header, #footer,
+#sidebar-first,
+#sidebar-second,
+#navigation
+  background: rgba(#aaa, 0.2)
+
+// Layout Helpers
+#header,
+#footer,
+.mission,
+.breadcrumb,
+.node
+  clear: both

+ 8 - 0
sites/all/themes/contrib/basic/sass/layout/layout.sass

@@ -0,0 +1,8 @@
+@import "../config/config"
+
+// LAYOUT: Macro arrangement of a web page, including any grid systems.
+// Read more about SMACSS categorization for Drupal Themes: https://www.drupal.org/node/1887922
+
+// This file is complied separately so we can pull in config dependencies above
+// while also maintaining Drupals SMACSS structure.
+@import "layout--grid"

+ 36 - 0
sites/all/themes/contrib/basic/sass/theme/print.sass

@@ -0,0 +1,36 @@
+// Use this stylesheet for print styles only.
+*
+  background-color: transparent
+
+.sidebar,
+#navigation,
+#header-region,
+#footer,
+.breadcrumb,
+.tabs,
+.feed-icon,
+.links
+  display: none
+
+.layout-container
+  width: 100%
+
+#content,
+.title
+  margin: 20px 0
+  width: auto
+
+a
+  &:hover,
+  &:active,
+  &:link,
+  &:visited
+    color: black
+
+// CSS2 selector to add visible href after links.
+#content a
+  &:link:after,
+  &:visited:after
+    content: " (" attr(href) ") "
+    font-size: 0.8em
+    font-weight: normal

+ 9 - 0
sites/all/themes/contrib/basic/sass/theme/theme.sass

@@ -0,0 +1,9 @@
+@import "../config/config"
+
+// THEME: purely visual styling (“look-and-feel”) for a component.
+// Read more about SMACSS categorization for Drupal Themes: https://www.drupal.org/node/1887922
+// When following SMCASS, this would be used for dark/light themes (not general styling): https://smacss.com/book/type-theme
+
+// This file is complied separately so we can pull in config dependencies above
+// while also maintaining Drupals SMACSS structure.
+// @import "theme/theme--light"

BIN
sites/all/themes/contrib/basic/screenshot.png


+ 12 - 0
sites/all/themes/contrib/basic/templates/block/block--local-actions-block.html.twig

@@ -0,0 +1,12 @@
+{% extends "block.html.twig" %}
+{#
+/**
+ * @file
+ * Theme override for local actions (primary admin actions.)
+ */
+#}
+{% block content %}
+  {% if content %}
+    <nav class="action-links">{{ content }}</nav>
+  {% endif %}
+{% endblock %}

+ 14 - 0
sites/all/themes/contrib/basic/templates/block/block--local-tasks-block.html.twig

@@ -0,0 +1,14 @@
+{% extends "@block/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 %}

+ 45 - 0
sites/all/themes/contrib/basic/templates/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>

+ 30 - 0
sites/all/themes/contrib/basic/templates/block/block--system-branding-block.html.twig

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

+ 56 - 0
sites/all/themes/contrib/basic/templates/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>

+ 32 - 0
sites/all/themes/contrib/basic/templates/block/block.html.twig

@@ -0,0 +1,32 @@
+{% extends "@block/block.html.twig" %}
+{#
+/**
+ * @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 attributes = attributes.addClass([
+  'block-' ~ configuration.provider|clean_class,
+  attributes.id
+]) %}

+ 25 - 0
sites/all/themes/contrib/basic/templates/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 %}

+ 109 - 0
sites/all/themes/contrib/basic/templates/comment.html.twig

@@ -0,0 +1,109 @@
+{#
+/**
+ * @file
+ * Default theme implementation for comments.
+ *
+ * Available variables:
+ * - author: Comment author. Can be a link or plain text.
+ * - content: The content-related items for the comment display. Use
+ *   {{ content }} to print them all, or print a subset such as
+ *   {{ content.field_example }}. Use the following code to temporarily suppress
+ *   the printing of a given child element:
+ *   @code
+ *   {{ content|without('field_example') }}
+ *   @endcode
+ * - created: Formatted date and time for when the comment was created.
+ *   Preprocess functions can reformat it by calling format_date() with the
+ *   desired parameters on the 'comment.created' variable.
+ * - changed: Formatted date and time for when the comment was last changed.
+ *   Preprocess functions can reformat it by calling format_date() with the
+ *   desired parameters on the 'comment.changed' variable.
+ * - permalink: Comment permalink.
+ * - submitted: Submission information created from author and created
+ *   during template_preprocess_comment().
+ * - user_picture: The comment author's profile picture.
+ * - status: Comment status. Possible values are:
+ *   unpublished, published, or preview.
+ * - title: Comment title, linked to the comment.
+ * - attributes: HTML attributes for the containing element.
+ *   The attributes.class may contain one or more of the following classes:
+ *   - comment: The current template type; e.g., 'theming hook'.
+ *   - by-anonymous: Comment by an unregistered user.
+ *   - by-{entity-type}-author: Comment by the author of the parent entity,
+ *     eg. by-node-author.
+ *   - preview: When previewing a new or edited comment.
+ *   The following applies only to viewers who are registered users:
+ *   - unpublished: An unpublished comment visible only to administrators.
+ * - title_prefix: Additional output populated by modules, intended to be
+ *   displayed in front of the main title tag that appears in the template.
+ * - title_suffix: Additional output populated by modules, intended to be
+ *   displayed after the main title tag that appears in the template.
+ * - content_attributes: List of classes for the styling of the comment content.
+ * - title_attributes: Same as attributes, except applied to the main title
+ *   tag that appears in the template.
+ *
+ * These variables are provided to give context about the parent comment (if
+ * any):
+ * - comment_parent: 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.
+ * - entity: Entity the comments are attached to.
+ *
+ * @see template_preprocess_comment()
+ *
+ * @ingroup themeable
+ */
+#}
+
+<article{{ attributes }}>
+  {% if title %}
+    {{ title_prefix }}
+  {% endif %}
+
+  {#
+  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 new" data-comment-timestamp="{{ new_indicator_timestamp }}"></mark>
+
+  {% if title %}
+    <h3{{ title_attributes.addClass('title') }}>{{ title }}</h3>
+    {{ title_suffix }}
+  {% endif %}
+
+
+  <footer>
+    {{ user_picture }}
+    <p class="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="visually-hidden">{{ parent }}</p>
+    {% endif %}
+
+    {{ permalink }}
+  </footer>
+
+  <div{{ content_attributes.addClass('content') }}>
+    {{ content|without('links') }}
+  </div>
+  {% if content.links %}
+    {{ content.links }}
+  {% endif %}
+</article>

+ 42 - 0
sites/all/themes/contrib/basic/templates/field--comment.html.twig

@@ -0,0 +1,42 @@
+{#
+/**
+ * @file
+ * Default 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.
+ * - content_attributes: HTML attributes for the form title.
+ * - 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()
+ */
+#}
+<section{{ attributes.addClass('comments') }}>
+  {% if comments and not label_hidden and (entity.entityType != 'node' or entity.bundle != 'forum') %}
+    {{ title_prefix }}
+    <h2{{ title_attributes }}>{{ label }}</h2>
+    {{ title_suffix }}
+  {% endif %}
+
+  {{ comments }}
+
+  {% if comment_form %}
+    <h2{{ content_attributes.addClass('title') }}>{{ 'Add new comment'|t }}</h2>
+    {{ comment_form }}
+  {% endif %}
+</section>

+ 20 - 0
sites/all/themes/contrib/basic/templates/field.html.twig

@@ -0,0 +1,20 @@
+{% extends "@stable/field/field.html.twig" %}
+
+{# Create classes array #}
+{% set classes = [] %}
+
+{# BEM inspired class syntax: https://en.bem.info/
+   Enable this code if you would like field classes like "article__tags", where article is the content type and field_tags is the field name.
+#}
+{% set classes = classes|merge([
+  bundle ~ '__' ~ field_name|replace({'field_' : ''})|clean_class
+]) %}
+
+
+{% set attributes = attributes.addClass(classes) %}
+
+{#
+  Ensures that the visually hidden option for field labels works correctly.
+  @todo: Remove when https://www.drupal.org/node/2779919 is resolved.
+#}
+{% set title_attributes = title_attributes.addClass(label_display == 'visually_hidden' ? 'visually-hidden') %}

+ 81 - 0
sites/all/themes/contrib/basic/templates/html.html.twig

@@ -0,0 +1,81 @@
+{#
+/**
+ * @file
+ * Default theme implementation 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.
+ * - css: A list of CSS files for the current page.
+ * - head: Markup for the HEAD element (including meta tags, keyword tags, and
+ *   so on).
+ * - head_title: A modified version of the page title, for use in the TITLE tag.
+ * - head_title_array: List of text elements that make up the head_title
+ *   variable. May contain 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'.
+ * - styles: Style tags necessary to import all necessary CSS files in the head.
+ * - scripts: Script tags necessary to load the JavaScript files and settings
+ *   in the head.
+ * - db_offline: A flag indicating if the database is offline.
+ *
+ * @see template_preprocess_html()
+ *
+ * @ingroup themeable
+ */
+#}
+<!DOCTYPE html>
+{% if ie_enabled_versions.ie8 %}
+  {{- attach_library('basic/ie8') }}
+{% endif %}
+{% if ie_enabled_versions.ie9 or ie_enabled_versions.ie8 %}
+  <!--[if lt IE 7]>     <html{{ html_attributes.addClass('no-js', 'lt-ie9', 'lt-ie8', 'lt-ie7') }}><![endif]-->
+  <!--[if IE 7]>        <html{{ html_attributes.removeClass('lt-ie7') }}><![endif]-->
+  <!--[if IE 8]>        <html{{ html_attributes.removeClass('lt-ie8') }}><![endif]-->
+  <!--[if gt IE 8]><!--><html{{ html_attributes.removeClass('lt-ie9') }}><!--<![endif]-->
+{% else -%}
+  <html{{ html_attributes }}>
+{% endif %}
+  <head>
+    <head-placeholder token="{{ placeholder_token }}">
+    <title>{{ head_title|safe_join(' | ') }}</title>
+    <css-placeholder token="{{ placeholder_token }}">
+    <js-placeholder token="{{ placeholder_token }}">
+  </head>
+  {% set classes = [] %}
+  {% for role in user.roles %}
+    {% set classes = classes|merge(['role--' ~ role|clean_class]) %}
+  {% endfor %}
+
+  {% set sidebar_first = page.sidebar_first|render %}
+  {% set sidebar_second = page.sidebar_second|render %}
+  <body{{ attributes.addClass(classes,
+    not is_front ? 'with-subnav',
+    sidebar_first ? 'sidebar-first',
+    sidebar_second ? 'sidebar-second',
+    (sidebar_first and not sidebar_second) or (sidebar_second and not sidebar_first) ? 'one-sidebar',
+    (sidebar_first and sidebar_second) ? 'two-sidebars',
+    (not sidebar_first and not sidebar_second) ? 'no-sidebar'
+  ) }}>
+    <div id="skip">
+      <a href="#main-menu" class="visually-hidden focusable skip-link">
+        {{ 'Skip to main navigation'|t }}
+      </a>
+    </div>
+    {{ page_top }}
+    {{ page }}
+    {{ page_bottom }}
+    <js-bottom-placeholder token="{{ placeholder_token }}">
+    {% if browser_sync.enabled %}
+      <script id="__bs_script__">
+      document.write("<script async src='http://{{ browser_sync.host }}:{{ browser_sync.port }}/browser-sync/browser-sync-client.js'><\/script>".replace("HOST", location.hostname));
+      </script>
+    {% endif %}
+  </body>
+</html>

+ 19 - 0
sites/all/themes/contrib/basic/templates/menu-local-task.html.twig

@@ -0,0 +1,19 @@
+{#
+/**
+ * @file
+ * Default theme implementation 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()
+ *
+ * @ingroup themeable
+ */
+#}
+<li{{ attributes.addClass('tabs__tab').addClass(is_active ? 'tabs__tab--active') }}>{{ link }}</li>

+ 29 - 0
sites/all/themes/contrib/basic/templates/menu-local-tasks.html.twig

@@ -0,0 +1,29 @@
+{#
+/**
+ * @file
+ * Default theme implementation to display primary and secondary local tasks.
+ *
+ * Available variables:
+ * - primary: HTML list items representing primary tasks.
+ * - secondary: HTML list items representing primary tasks.
+ *
+ * Each item in these variables (primary and secondary) can be individually
+ * themed in menu-local-task.html.twig.
+ *
+ * @see template_preprocess_menu_local_tasks()
+ *
+ * @ingroup themeable
+ */
+#}
+
+{{ attach_library('basic/tabs') }}
+
+{% if primary %}
+  <h2 class="visually-hidden">{{ 'Primary tabs'|t }}</h2>
+  <ul class="tabs primary">{{ primary }}</ul>
+{% endif %}
+{% if secondary %}
+  <h2 class="visually-hidden">{{ 'Secondary tabs'|t }}</h2>
+  <ul class="tabs secondary">{{ secondary }}</ul>
+{% endif %}
+

+ 55 - 0
sites/all/themes/contrib/basic/templates/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 http://twig.sensiolabs.org/doc/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 %}

+ 53 - 0
sites/all/themes/contrib/basic/templates/node.html.twig

@@ -0,0 +1,53 @@
+{# Create classes array. The 'node' class is required for contextual edit links. #}
+{% set classes = [
+  'node'
+] %}
+
+{# BEM inspired class syntax: https://en.bem.info/
+   Enable this code if you would like node classes like "article article--layout-teaser", where article is the content type and teaser is the view mode.
+{% set classes = classes|merge([
+  node.bundle|clean_class,
+  view_mode ? node.bundle|clean_class ~ '--layout-' ~ view_mode|clean_class
+]) %}
+{% set title_classes = [
+  node.bundle|clean_class ~ '__title'
+] %}
+#}
+
+<article{{ attributes.addClass(classes) }}>
+
+  {% if title_prefix or title_suffix or display_submitted or unpublished or page is empty and label %}
+    <header>
+      {{ title_prefix }}
+      {% if not page and label %}
+        <h2{{ title_attributes.addClass(title_classes) }}>
+          <a href="{{ url }}" rel="bookmark">{{ label }}</a>
+        </h2>
+      {% endif %}
+      {{ title_suffix }}
+
+      {% if display_submitted %}
+        <div class="submitted">
+          {{ author_picture }}
+          {% trans %}Submitted by {{ author_name }} on {{ date }}{% endtrans %}
+          {{ metadata }}
+        </div>
+      {% endif %}
+
+      {% if not node.published %}
+        <p class="node--unpublished">{{ 'Unpublished'|t }}</p>
+      {% endif %}
+    </header>
+  {% endif %}
+
+  <div{{ content_attributes.addClass('content') }}>
+    {{ content|without('links') }}
+  </div><!-- /.content -->
+
+  {% if content.links %}
+    <div class="links">
+      {{ content.links }}
+    </div><!-- /.links -->
+  {% endif %}
+
+</article><!-- /.node -->

+ 93 - 0
sites/all/themes/contrib/basic/templates/page.html.twig

@@ -0,0 +1,93 @@
+{% set main_menu = page.primary_menu|render %}
+{% set secondary_menu = page.secondary_menu|render %}
+<div{{ attributes.addClass(
+  'layout-container',
+  main_menu or secondary_menu ? 'with-navigation',
+  secondary_menu ? 'with-subnav'
+) }}>
+
+  <!-- ______________________ HEADER _______________________ -->
+
+  <header id="header">
+    <div class="container">
+      {% if page.header %}
+        <div id="header-region">
+          {{ page.header }}
+        </div>
+      {% endif %}
+    </div>
+  </header><!-- /#header -->
+
+  {% if main_menu or secondary_menu %}
+    <nav id="navigation" class="menu{% if main_menu %} with-primary{% endif %}{% if secondary_menu %} with-secondary{% endif %}">
+      <div class="container">
+        {{ main_menu }}
+        {{ secondary_menu }}
+      </div>
+    </nav><!-- /#navigation -->
+  {% endif %}
+
+  <!-- ______________________ MAIN _______________________ -->
+
+  <div id="main">
+    <div class="container">
+      <section id="content">
+
+        <div id="content-header">
+
+          {{ page.breadcrumb }}
+
+          {% if page.highlighted|render %}
+            <div id="highlighted">{{ page.highlighted }}</div>
+          {% endif %}
+
+          {{ title_prefix }}
+
+          {% if title %}
+            <h1 class="title">{{ title }}</h1>
+          {% endif %}
+
+          {{ title_suffix }}
+          {{ page.help }}
+
+          {% if tabs %}
+            <div class="tabs">{{ tabs }}</div>
+          {% endif %}
+
+          {% if action_links %}
+            <ul class="action-links">{{ action_links }}</ul>
+          {% endif %}
+
+        </div><!-- /#content-header -->
+
+        <div id="content-area">
+          {{ page.content }}
+        </div>
+
+      </section><!-- /#content -->
+
+      {% if page.sidebar_first|render %}
+        <aside id="sidebar-first" class="column sidebar first">
+          {{ page.sidebar_first }}
+        </aside><!-- /#sidebar-first -->
+      {% endif %}
+
+      {% if page.sidebar_second|render %}
+        <aside id="sidebar-second" class="column sidebar second">
+          {{ page.sidebar_second }}
+        </aside><!-- /#sidebar-second -->
+      {% endif %}
+    </div><!-- /.container -->
+  </div><!-- /#main -->
+
+  <!-- ______________________ FOOTER _______________________ -->
+
+  {% if page.footer|render %}
+    <footer id="footer">
+      <div class="container">
+        {{ page.footer }}
+      </div>
+    </footer><!-- /#footer -->
+  {% endif %}
+
+</div><!-- /.layout-container -->

+ 98 - 0
sites/all/themes/contrib/basic/templates/pager.html.twig

@@ -0,0 +1,98 @@
+{#
+/**
+ * @file
+ * Theme override to display a pager.
+ *
+ * Available variables:
+ * - items: List of pager items.
+ *   The list is keyed by the following elements:
+ *   - first: Item for the first page; not present on the first page of results.
+ *   - previous: Item for the previous page; not present on the first page
+ *     of results.
+ *   - next: Item for the next page; not present on the last page of results.
+ *   - last: Item for the last page; not present on the last page of results.
+ *   - pages: List of pages, keyed by page number.
+ *   Sub-sub elements:
+ *   items.first, items.previous, items.next, items.last, and each item inside
+ *   items.pages contain the following elements:
+ *   - href: URL with appropriate query parameters for the item.
+ *   - attributes: A keyed list of HTML attributes for the item.
+ *   - text: The visible text used for the item link, such as "‹ Previous"
+ *     or "Next ›".
+ * - current: The page number of the current page.
+ * - ellipses: If there are more pages than the quantity allows, then an
+ *   ellipsis before or after the listed pages may be present.
+ *   - previous: Present if the currently visible list of pages does not start
+ *     at the first page.
+ *   - next: Present if the visible list of pages ends before the last page.
+ *
+ * @see template_preprocess_pager()
+ */
+#}
+{% if items %}
+  <nav class="pager" role="navigation" aria-labelledby="pagination-heading">
+    <h4 id="pagination-heading" class="visually-hidden">{{ 'Pagination'|t }}</h4>
+    <ul class="pager__items js-pager__items">
+      {# Print first item if we are not on the first page. #}
+      {% if items.first %}
+        <li class="pager__item pager__item--first">
+          <a href="{{ items.first.href }}" title="{{ 'Go to first page'|t }}"{{ items.first.attributes|without('href', 'title') }}>
+            <span class="visually-hidden">{{ 'First page'|t }}</span>
+            <span aria-hidden="true">{{ items.first.text|default('« First'|t) }}</span>
+          </a>
+        </li>
+      {% endif %}
+      {# Print previous item if we are not on the first page. #}
+      {% 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('‹ Previous'|t) }}</span>
+          </a>
+        </li>
+      {% endif %}
+      {# Add an ellipsis if there are further previous pages. #}
+      {% if ellipses.previous %}
+        <li class="pager__item pager__item--ellipsis" role="presentation">&hellip;</li>
+      {% endif %}
+      {# Now generate the actual pager piece. #}
+      {% for key, item in items.pages %}
+        <li class="pager__item{{ current == key ? ' pager__item--active' : '' }}">
+          {% if current == key %}
+            {% set title = 'Current page'|t %}
+          {% else %}
+            {% set title = 'Go to page @key'|t({'@key': key}) %}
+          {% endif %}
+          <a href="{{ item.href }}" title="{{ title }}"{{ item.attributes|without('href', 'title') }}>
+            <span class="visually-hidden">
+              {{ current == key ? 'Current page'|t : 'Page'|t }}
+            </span>
+            {{- key -}}
+          </a>
+        </li>
+      {% endfor %}
+      {# Add an ellipsis if there are further next pages. #}
+      {% if ellipses.next %}
+        <li class="pager__item pager__item--ellipsis" role="presentation">&hellip;</li>
+      {% endif %}
+      {# Print next item if we are not on the last page. #}
+      {% 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('Next ›'|t) }}</span>
+          </a>
+        </li>
+      {% endif %}
+      {# Print last item if we are not on the last page. #}
+      {% if items.last %}
+        <li class="pager__item pager__item--last">
+          <a href="{{ items.last.href }}" title="{{ 'Go to last page'|t }}"{{ items.last.attributes|without('href', 'title') }}>
+            <span class="visually-hidden">{{ 'Last page'|t }}</span>
+            <span aria-hidden="true">{{ items.last.text|default('Last »'|t) }}</span>
+          </a>
+        </li>
+      {% endif %}
+    </ul>
+  </nav>
+{% endif %}

+ 58 - 0
sites/all/themes/contrib/basic/templates/status-messages.html.twig

@@ -0,0 +1,58 @@
+{#
+/**
+ * @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.
+ * - display: (optional) May have a value of 'status' or 'error' when only
+ *   displaying messages of that specific type.
+ * - attributes: HTML attributes for the element, including:
+ *   - class: HTML classes.
+ *
+ * @see template_preprocess_status_messages()
+ */
+#}
+
+{{ attach_library('basic/messages') }}
+
+{% for type, messages in message_list %}
+  {%
+    set classes = [
+      'messages',
+      'messages--' ~ type,
+    ]
+  %}
+  <div{{ attributes.addClass(classes) }}>
+    {% 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. #}
+  {{ attributes.removeClass(classes) }}
+{% endfor %}

+ 41 - 0
sites/all/themes/contrib/basic/templates/views-mini-pager.html.twig

@@ -0,0 +1,41 @@
+{#
+/**
+ * @file
+ * Theme override for a views mini-pager.
+ *
+ * Available variables:
+ * - items: List of pager items.
+ *
+ * @see template_preprocess_views_mini_pager()
+ */
+#}
+{% if items.previous or items.next %}
+  <nav class="pager" role="navigation" aria-labelledby="pagination-heading">
+    <h4 class="visually-hidden">{{ 'Pagination'|t }}</h4>
+    <ul class="pager__items js-pager__items">
+      {% if items.previous %}
+        <li class="pager__item">
+          <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">
+          {% trans %}
+            Page {{ items.current }}
+          {% endtrans %}
+        </li>
+      {% endif %}
+      {% if items.next %}
+        <li class="pager__item">
+          <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 %}

+ 83 - 0
sites/all/themes/contrib/basic/theme-settings.php

@@ -0,0 +1,83 @@
+<?php
+
+/**
+ * @file
+ * Provides an additional config form for theme settings.
+ */
+
+use Drupal\Core\Form\FormStateInterface;
+
+// Set theme name to use in the key values.
+$theme_name = \Drupal::theme()->getActiveTheme()->getName();
+
+/**
+ * Implements hook_form_system_theme_settings_alter().
+ *
+ * Form override for theme settings.
+ */
+function basic_form_system_theme_settings_alter(array &$form, FormStateInterface $form_state) {
+  $form['options_settings'] = [
+    '#type' => 'fieldset',
+    '#title' => t('Theme Specific Settings'),
+  ];
+
+  // BrowserSync support.
+  $form['options_settings']['basic_browser_sync'] = [
+    '#type' => 'fieldset',
+    '#title' => t('BrowserSync Settings'),
+  ];
+  $form['options_settings']['basic_browser_sync']['browser_sync']['#tree'] = TRUE;
+  $form['options_settings']['basic_browser_sync']['browser_sync']['enabled'] = [
+    '#type' => 'checkbox',
+    '#title' => t('Enable BrowserSync support for theme'),
+    '#default_value' => theme_get_setting('browser_sync.enabled'),
+    '#description' => t("Checking this box will automatically add the BrowserSync JS to your theme for development."),
+  ];
+
+  $form['options_settings']['basic_browser_sync']['browser_sync']['host'] = [
+    '#type' => 'textfield',
+    '#title' => t('BrowserSync host'),
+    '#default_value' => theme_get_setting('browser_sync.host'),
+    '#description' => t("Default: localhost. Enter 'HOST' which will be replaced by your site's hostname."),
+    '#states' => [
+      'visible' => [':input[name="browser_sync[enabled]"]' => ['checked' => TRUE]],
+    ],
+  ];
+
+  $form['options_settings']['basic_browser_sync']['browser_sync']['port'] = [
+    '#type' => 'number',
+    '#title' => t('Enable BrowserSync support for theme'),
+    '#default_value' => theme_get_setting('browser_sync.port'),
+    '#description' => t("Default: '3000'."),
+    '#states' => [
+      'visible' => [':input[name="browser_sync[enabled]"]' => ['checked' => TRUE]],
+    ],
+  ];
+
+  // IE specific settings.
+  $form['options_settings']['basic_ie'] = [
+    '#type' => 'fieldset',
+    '#title' => t('Internet Explorer Stylesheets'),
+  ];
+  $form['options_settings']['basic_ie']['ie_enabled'] = [
+    '#type' => 'checkbox',
+    '#title' => t('Enable Internet Explorer stylesheets in theme'),
+    '#default_value' => theme_get_setting('ie_enabled'),
+    '#description' => t('If you check this box you can choose which IE stylesheets in theme get rendered on display.'),
+  ];
+  $form['options_settings']['basic_ie']['ie_enabled_css'] = [
+    '#type' => 'fieldset',
+    '#title' => t('Which IE versions you want to enable ".lt-ie" CSS classes'),
+    '#states' => [
+      'visible' => [':input[name="ie_enabled"]' => ['checked' => TRUE]],
+    ],
+  ];
+  $form['options_settings']['basic_ie']['ie_enabled_css']['ie_enabled_versions'] = [
+    '#type' => 'checkboxes',
+    '#options' => [
+      'ie8' => t('Internet Explorer 8'),
+      'ie9' => t('Internet Explorer 9'),
+    ],
+    '#default_value' => array_keys(array_filter(theme_get_setting('ie_enabled_versions'))) ?: [],
+  ];
+}

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác