From 3e5cd5b648fc49bddf6e2b620d5c7d2f5a437b50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Ka=CC=88gy?= Date: Mon, 23 Sep 2024 15:52:20 +0200 Subject: [PATCH] add block based theme as a starter --- themes/10up-block-theme/.eslintrc | 5 + themes/10up-block-theme/.lintstagedrc.json | 14 + themes/10up-block-theme/.npmrc | 1 + themes/10up-block-theme/.nvmrc | 1 + themes/10up-block-theme/.stylelintignore | 4 + themes/10up-block-theme/LICENSE.md | 339 ++++++++ .../assets/css/base/align.css | 39 + .../assets/css/base/index.css | 4 + .../assets/css/base/layout.css | 73 ++ .../10up-block-theme/assets/css/base/link.css | 11 + .../assets/css/base/reset.css | 85 ++ .../assets/css/blocks/core/.gitkeep | 0 .../assets/css/components/index.css | 0 .../assets/css/editor-style-overrides.css | 72 ++ .../10up-block-theme/assets/css/frontend.css | 4 + .../assets/css/globals/.gitkeep | 0 .../assets/css/globals/media-queries.css | 25 + .../assets/css/globals/readme.md | 10 + .../assets/css/mixins/margin-collapse.css | 14 + .../assets/css/mixins/readme.md | 10 + .../assets/css/templates/index.css | 0 .../assets/css/utilities/index.css | 1 + .../assets/css/utilities/visually-hidden.css | 10 + themes/10up-block-theme/assets/fonts/.gitkeep | 0 .../10up-block-theme/assets/images/.gitkeep | 0 .../assets/js/block-extensions.js | 0 themes/10up-block-theme/assets/js/frontend.js | 1 + themes/10up-block-theme/assets/svg/.gitkeep | 0 themes/10up-block-theme/composer.json | 31 + themes/10up-block-theme/composer.lock | 813 ++++++++++++++++++ themes/10up-block-theme/functions.php | 40 + themes/10up-block-theme/includes/blocks.php | 91 ++ .../10up-block-theme/includes/blocks/.gitkeep | 0 themes/10up-block-theme/includes/core.php | 190 ++++ .../10up-block-theme/includes/overrides.php | 84 ++ .../includes/template-tags.php | 36 + themes/10up-block-theme/includes/utility.php | 79 ++ themes/10up-block-theme/package.json | 35 + themes/10up-block-theme/parts/footer.html | 62 ++ themes/10up-block-theme/parts/header.html | 7 + .../parts/site-header-navigation-area.html | 1 + themes/10up-block-theme/patterns/.gitkeep | 0 themes/10up-block-theme/phpcs.xml | 9 + themes/10up-block-theme/screenshot.png | Bin 0 -> 18915 bytes themes/10up-block-theme/style.css | 10 + themes/10up-block-theme/stylelint.config.js | 26 + .../styles/surface-primary.json | 12 + .../styles/surface-secondary.json | 12 + .../styles/surface-tertiary.json | 12 + themes/10up-block-theme/templates/404.html | 21 + themes/10up-block-theme/templates/index.html | 31 + themes/10up-block-theme/templates/single.html | 25 + .../10up-block-theme/templates/singular.html | 7 + themes/10up-block-theme/theme.json | 390 +++++++++ themes/10up-block-theme/webpack.config.js | 55 ++ 55 files changed, 2802 insertions(+) create mode 100644 themes/10up-block-theme/.eslintrc create mode 100644 themes/10up-block-theme/.lintstagedrc.json create mode 100644 themes/10up-block-theme/.npmrc create mode 100644 themes/10up-block-theme/.nvmrc create mode 100644 themes/10up-block-theme/.stylelintignore create mode 100644 themes/10up-block-theme/LICENSE.md create mode 100644 themes/10up-block-theme/assets/css/base/align.css create mode 100644 themes/10up-block-theme/assets/css/base/index.css create mode 100644 themes/10up-block-theme/assets/css/base/layout.css create mode 100644 themes/10up-block-theme/assets/css/base/link.css create mode 100644 themes/10up-block-theme/assets/css/base/reset.css create mode 100644 themes/10up-block-theme/assets/css/blocks/core/.gitkeep create mode 100644 themes/10up-block-theme/assets/css/components/index.css create mode 100644 themes/10up-block-theme/assets/css/editor-style-overrides.css create mode 100644 themes/10up-block-theme/assets/css/frontend.css create mode 100644 themes/10up-block-theme/assets/css/globals/.gitkeep create mode 100644 themes/10up-block-theme/assets/css/globals/media-queries.css create mode 100644 themes/10up-block-theme/assets/css/globals/readme.md create mode 100644 themes/10up-block-theme/assets/css/mixins/margin-collapse.css create mode 100644 themes/10up-block-theme/assets/css/mixins/readme.md create mode 100644 themes/10up-block-theme/assets/css/templates/index.css create mode 100644 themes/10up-block-theme/assets/css/utilities/index.css create mode 100644 themes/10up-block-theme/assets/css/utilities/visually-hidden.css create mode 100644 themes/10up-block-theme/assets/fonts/.gitkeep create mode 100644 themes/10up-block-theme/assets/images/.gitkeep create mode 100644 themes/10up-block-theme/assets/js/block-extensions.js create mode 100644 themes/10up-block-theme/assets/js/frontend.js create mode 100644 themes/10up-block-theme/assets/svg/.gitkeep create mode 100644 themes/10up-block-theme/composer.json create mode 100644 themes/10up-block-theme/composer.lock create mode 100755 themes/10up-block-theme/functions.php create mode 100644 themes/10up-block-theme/includes/blocks.php create mode 100644 themes/10up-block-theme/includes/blocks/.gitkeep create mode 100755 themes/10up-block-theme/includes/core.php create mode 100644 themes/10up-block-theme/includes/overrides.php create mode 100644 themes/10up-block-theme/includes/template-tags.php create mode 100755 themes/10up-block-theme/includes/utility.php create mode 100644 themes/10up-block-theme/package.json create mode 100644 themes/10up-block-theme/parts/footer.html create mode 100644 themes/10up-block-theme/parts/header.html create mode 100644 themes/10up-block-theme/parts/site-header-navigation-area.html create mode 100644 themes/10up-block-theme/patterns/.gitkeep create mode 100644 themes/10up-block-theme/phpcs.xml create mode 100644 themes/10up-block-theme/screenshot.png create mode 100755 themes/10up-block-theme/style.css create mode 100644 themes/10up-block-theme/stylelint.config.js create mode 100644 themes/10up-block-theme/styles/surface-primary.json create mode 100644 themes/10up-block-theme/styles/surface-secondary.json create mode 100644 themes/10up-block-theme/styles/surface-tertiary.json create mode 100644 themes/10up-block-theme/templates/404.html create mode 100644 themes/10up-block-theme/templates/index.html create mode 100644 themes/10up-block-theme/templates/single.html create mode 100644 themes/10up-block-theme/templates/singular.html create mode 100644 themes/10up-block-theme/theme.json create mode 100644 themes/10up-block-theme/webpack.config.js diff --git a/themes/10up-block-theme/.eslintrc b/themes/10up-block-theme/.eslintrc new file mode 100644 index 00000000..d3ad2ab6 --- /dev/null +++ b/themes/10up-block-theme/.eslintrc @@ -0,0 +1,5 @@ +{ + "extends": [ + "@10up/eslint-config/wordpress" + ] +} diff --git a/themes/10up-block-theme/.lintstagedrc.json b/themes/10up-block-theme/.lintstagedrc.json new file mode 100644 index 00000000..b96bb4cc --- /dev/null +++ b/themes/10up-block-theme/.lintstagedrc.json @@ -0,0 +1,14 @@ +{ + "*.css": [ + "10up-toolkit lint-style" + ], + "*.js": [ + "10up-toolkit lint-js" + ], + "*.jsx": [ + "10up-toolkit lint-js" + ], + "*.php": [ + "./vendor/bin/phpcs --extensions=php --warning-severity=8 -s" + ] +} diff --git a/themes/10up-block-theme/.npmrc b/themes/10up-block-theme/.npmrc new file mode 100644 index 00000000..b6f27f13 --- /dev/null +++ b/themes/10up-block-theme/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/themes/10up-block-theme/.nvmrc b/themes/10up-block-theme/.nvmrc new file mode 100644 index 00000000..3c032078 --- /dev/null +++ b/themes/10up-block-theme/.nvmrc @@ -0,0 +1 @@ +18 diff --git a/themes/10up-block-theme/.stylelintignore b/themes/10up-block-theme/.stylelintignore new file mode 100644 index 00000000..dbd36b7a --- /dev/null +++ b/themes/10up-block-theme/.stylelintignore @@ -0,0 +1,4 @@ +local-packages/ +node_modules/ +dist/ +vendor/ diff --git a/themes/10up-block-theme/LICENSE.md b/themes/10up-block-theme/LICENSE.md new file mode 100644 index 00000000..d159169d --- /dev/null +++ b/themes/10up-block-theme/LICENSE.md @@ -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. + + + Copyright (C) + + 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. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/themes/10up-block-theme/assets/css/base/align.css b/themes/10up-block-theme/assets/css/base/align.css new file mode 100644 index 00000000..ba0b9e28 --- /dev/null +++ b/themes/10up-block-theme/assets/css/base/align.css @@ -0,0 +1,39 @@ +body .is-layout-constrained > :where(:not(.alignfull, .wp-block-image)) { + + &.alignright { + margin-right: var(--wp--custom--main-content-width-side-spacing); + max-width: calc(var(--wp--style--global--content-size) / 2); + } + + &.alignleft { + margin-left: var(--wp--custom--main-content-width-side-spacing); + max-width: calc(var(--wp--style--global--content-size) / 2); + } +} + +body .is-layout-constrained.has-global-padding > :where(:not(.alignfull, .wp-block-image)) { + + &.alignleft { + margin-left: calc(var(--wp--custom--main-content-width-side-spacing) - var(--wp--style--root--padding-left)); + } + + &.alignright { + margin-right: calc(var(--wp--custom--main-content-width-side-spacing) - var(--wp--style--root--padding-right)); + } +} + +body .is-layout-constrained > .is-layout-flow.alignwide { + + & .alignleft { + margin-left: 0; + } + + & .alignright { + margin-right: 0; + } +} + +body .has-global-padding > .alignfull { + margin-left: calc(var(--wp--style--root--padding-left) * -1); + margin-right: calc(var(--wp--style--root--padding-right) * -1); +} diff --git a/themes/10up-block-theme/assets/css/base/index.css b/themes/10up-block-theme/assets/css/base/index.css new file mode 100644 index 00000000..91fd5398 --- /dev/null +++ b/themes/10up-block-theme/assets/css/base/index.css @@ -0,0 +1,4 @@ +@import url("reset.css"); +@import url("link.css"); +@import url("layout.css"); +@import url("align.css"); diff --git a/themes/10up-block-theme/assets/css/base/layout.css b/themes/10up-block-theme/assets/css/base/layout.css new file mode 100644 index 00000000..d1a3725b --- /dev/null +++ b/themes/10up-block-theme/assets/css/base/layout.css @@ -0,0 +1,73 @@ +/** + * These are deprecated fallbacks for the variables that now live in the + * theme.json file. They are here to ensure backwards compatibility with + * older themes that do used these variables in their styles. + */ +:root { + --full-viewport-width: var(--wp--custom--full-viewport-width); + --site-outer-padding: var(--wp--custom--site-outer-padding); + --site-content-width: var(--wp--custom--site-content-width); + --main-content-width-side-spacing: var(--wp--custom--main-content-width-side-spacing); + --main-wide-width-side-spacing: var(--wp--custom--main-wide-width-side-spacing); + /* stylelint-disable-next-line length-zero-no-unit */ + --site-header-top-offset: var(--wp-admin--admin-bar--height, 0px); + + &.has-pinned-header { + --site-header-top-offset: calc(var(--header-height) + var(--wp-admin--admin-bar--height, 0px)); + } +} + +html { + scroll-behavior: smooth; +} + +/* + * Remove the default margin caused by global block-gap + * from the header and footer template parts + */ +.wp-site-blocks { + display: grid; + grid-template-areas: + "header" + "main" + "footer"; + grid-template-columns: 1fr; + grid-template-rows: auto 1fr auto; + min-height: 100vh; + min-height: 100dvh; + + & > header:where(.wp-block-template-part) { + grid-area: header; + margin-block-end: 0; + } + + & > main { + grid-area: main; + height: 100%; + } + + & > footer:where(.wp-block-template-part) { + align-self: flex-end; + grid-area: footer; + margin-block-start: 0; + } +} + +.wp-block-group:where(:not(:has(> :first-child[style*="margin"], > :last-child[style*="margin"]))) { + + @mixin margin-collapse; +} + + +.has-global-padding :where(.has-global-padding.is-layout-constrained) { + padding-left: var(--wp--style--root--padding-left); + padding-right: var(--wp--style--root--padding-right); +} + +.is-layout-constrained .wp-block-image.alignwide { + max-width: min(100%, var(--wp--style--global--wide-size)) !important; +} + +.wp-block-post-template.is-layout-flex { + align-items: stretch; +} diff --git a/themes/10up-block-theme/assets/css/base/link.css b/themes/10up-block-theme/assets/css/base/link.css new file mode 100644 index 00000000..252111b8 --- /dev/null +++ b/themes/10up-block-theme/assets/css/base/link.css @@ -0,0 +1,11 @@ +/* + * Ensure that we are not overriding the editor styles of the + * WordPress Components. + * + * This is a workaround for: https://github.com/WordPress/gutenberg/issues/10178 + * + * using :where to prevent the specificity increase of using :not + */ +a:where(:not(.components-external-link, :has(> img:only-child), .wp-element-button)) { + +} diff --git a/themes/10up-block-theme/assets/css/base/reset.css b/themes/10up-block-theme/assets/css/base/reset.css new file mode 100644 index 00000000..f2df1c75 --- /dev/null +++ b/themes/10up-block-theme/assets/css/base/reset.css @@ -0,0 +1,85 @@ +/* + * Use a more-intuitive box-sizing model. + */ +*, +*::before, +*::after { + box-sizing: border-box; +} + +/* + * Allow percentage-based heights in the application + */ +html, +body, +.wp-site-blocks { + min-height: 100%; +} + +/* + * Remove height from the admin bar of the overall height + */ +html { + height: calc(100% - var(--wp-admin--admin-bar--height, 0px)); +} + + +/* + * Improve text rendering + */ +body { + -webkit-font-smoothing: antialiased; +} + +/* + * Improve media defaults + */ +img, +picture, +video, +canvas, +svg { + display: block; + height: auto; + max-width: 100%; +} + +/* + * Remove built-in form typography styles + */ +input, +button, +textarea, +select { + font: inherit; +} + +/* + * Avoid text overflows + */ +p, +h1, +h2, +h3, +h4, +h5, +h6 { + overflow-wrap: break-word; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + text-wrap: balance; + text-wrap: pretty; /* pretty is the nicer result but it isn't supported as well. So balance is here as a fallback */ +} + +/* + * Create a root stacking context + */ +.wp-site-blocks { + isolation: isolate; +} diff --git a/themes/10up-block-theme/assets/css/blocks/core/.gitkeep b/themes/10up-block-theme/assets/css/blocks/core/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/themes/10up-block-theme/assets/css/components/index.css b/themes/10up-block-theme/assets/css/components/index.css new file mode 100644 index 00000000..e69de29b diff --git a/themes/10up-block-theme/assets/css/editor-style-overrides.css b/themes/10up-block-theme/assets/css/editor-style-overrides.css new file mode 100644 index 00000000..0c080b32 --- /dev/null +++ b/themes/10up-block-theme/assets/css/editor-style-overrides.css @@ -0,0 +1,72 @@ +/* + * Override the styling of the post title in the post editor + * to make it look as though it's part of the editor frame instead + * of the post content. + */ +.edit-post-visual-editor__post-title-wrapper { + background-color: #fff; /* stylelint-disable-line scale-unlimited/declaration-strict-value */ + border-bottom: 1px solid #e0e0e0; + margin-bottom: 0; + margin-top: 0 !important; + max-width: none; + overflow: hidden; + width: 100%; + + & .wp-block-post-title { + color: #000; /* stylelint-disable-line scale-unlimited/declaration-strict-value */ + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 16px; + height: auto; + line-height: 1; + padding: 4px 0; + } +} + +/* + * Define the various widths of editor interface elements. + * Sadly these are not exposed as CSS variables, so we have to + * manually define them here and update them if they ever change. + */ +:root { + --wp--interface--sidebar--width: 280px; + --wp--interface--secondary--sidebar--width: 350px; +} + +/* + * Substract Inspector Controls Width from full viewport width if open + */ +.interface-interface-skeleton.is-sidebar-opened .editor-styles-wrapper { + --wp--custom--full-viewport-width: calc(100vw - var(--wp--interface--sidebar--width)); +} + +/* + * Substract List View Width from full viewport width if open + */ +.interface-interface-skeleton__secondary-sidebar ~ .interface-interface-skeleton__content .editor-styles-wrapper { + --wp--custom--full-viewport-width: calc(100vw - var(--wp--interface--secondary--sidebar--width)); +} + +/* + * Substract both List View and Inspector Controls + * Width from full viewport width if open + */ +.interface-interface-skeleton.is-sidebar-opened .interface-interface-skeleton__secondary-sidebar ~ .interface-interface-skeleton__content .editor-styles-wrapper { + --wp--custom--full-viewport-width: calc(100vw - var(--wp--interface--secondary--sidebar--width) - var(--wp--interface--sidebar--width)); +} + +.wp-block-image img[src$=".svg"] { + height: auto; +} + +.is-root-container { + min-height: 90dvh; +} + +/* + * Small editor blocks like the footer social nav are hard to click + * Setting a min-height so that elements can be selected to edit + * Prior to this scrollbars overlap small elements +*/ +.block-editor-iframe__container { + min-height: 70px; +} diff --git a/themes/10up-block-theme/assets/css/frontend.css b/themes/10up-block-theme/assets/css/frontend.css new file mode 100644 index 00000000..43bf8bf9 --- /dev/null +++ b/themes/10up-block-theme/assets/css/frontend.css @@ -0,0 +1,4 @@ +@import url("base/index.css"); +@import url("templates/index.css"); +@import url("components/index.css"); +@import url("utilities/index.css"); diff --git a/themes/10up-block-theme/assets/css/globals/.gitkeep b/themes/10up-block-theme/assets/css/globals/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/themes/10up-block-theme/assets/css/globals/media-queries.css b/themes/10up-block-theme/assets/css/globals/media-queries.css new file mode 100644 index 00000000..a9169876 --- /dev/null +++ b/themes/10up-block-theme/assets/css/globals/media-queries.css @@ -0,0 +1,25 @@ +/* + * Media Queries + */ + +/* tiny */ +@custom-media --bp-tiny ( min-width: 24.375rem ); /* 390px */ +@custom-media --bp-tiny-max ( max-width: 24.3125rem ); /* 389px */ + +/* small */ +@custom-media --bp-small ( min-width: 37.5rem ); /* 600px */ +@custom-media --bp-small-max ( max-width: 37.4375rem ); /* 599px */ + +/* medium */ +@custom-media --bp-medium ( min-width: 60rem ); /* 960px */ +@custom-media --bp-medium-max ( max-width: 59.9375rem ); /* 959px */ + +/* large */ +@custom-media --bp-large ( min-width: 80rem ); /* 1280px */ +@custom-media --bp-large-max ( max-width: 79.9375rem ); /* 1279px */ + +/* WP Core Breakpoints (used for the admin bar for example) */ +@custom-media --wp-small ( min-width: 600px ); +@custom-media --wp-small-max ( max-width: 599px ); +@custom-media --wp-medium (min-width: 783px); +@custom-media --wp-medium-max (max-width: 782px); diff --git a/themes/10up-block-theme/assets/css/globals/readme.md b/themes/10up-block-theme/assets/css/globals/readme.md new file mode 100644 index 00000000..ac076696 --- /dev/null +++ b/themes/10up-block-theme/assets/css/globals/readme.md @@ -0,0 +1,10 @@ +# PostCSS Globals + + Any individual `.css` files placed in this folder or any nested folder will automatically get loaded by the [@csstools/postcss-global-data](https://github.com/csstools/postcss-plugins/tree/main/plugins/postcss-global-data) plugin. + + This ensures that the definitions defined in these files become available to all CSS entrypoints. So individual block styles, the main stylesheet, etc. all have access to these definitions. + + > [!WARNING] + > These CSS files should not produce any output. They are only meant to define global postcss features to become available to all entrypoints + > Also the loading order of these files should not matter at all. They get auto included via a glob expression. + Mixins also get their special treatment. They have a special [`mixins`](../mixins/) folder located next to this `globals` folder diff --git a/themes/10up-block-theme/assets/css/mixins/margin-collapse.css b/themes/10up-block-theme/assets/css/mixins/margin-collapse.css new file mode 100644 index 00000000..f0cc5618 --- /dev/null +++ b/themes/10up-block-theme/assets/css/mixins/margin-collapse.css @@ -0,0 +1,14 @@ +@define-mixin margin-collapse { + margin-trim: block; + + @supports not (margin-trim: block) { + + & > *:first-child { + margin-top: 0; + } + + & > *:last-child { + margin-bottom: 0; + } + } +} diff --git a/themes/10up-block-theme/assets/css/mixins/readme.md b/themes/10up-block-theme/assets/css/mixins/readme.md new file mode 100644 index 00000000..8399c076 --- /dev/null +++ b/themes/10up-block-theme/assets/css/mixins/readme.md @@ -0,0 +1,10 @@ +# PostCSS Global Mixins + + Any individual `.css` files placed in this folder or any nested folder will automatically get loaded by the [postcss-mixins](https://github.com/postcss/postcss-mixins) plugin. + + This ensures that the mixins defined in these files become available to all CSS entrypoints. So individual block styles, the main stylesheet, etc. all have access to these mixins. + + > [!WARNING] + > These CSS files should not produce any output. They are only meant to define global postcss features to become available to all entrypoints + > Also the loading order of these files should not matter at all. They get auto included via a glob expression. + Other global definitions such as `@custom-media`, `@custom-selector`, etc. also get their special treatment. They have a special [`globals`](../globals/) folder located next to this `mixins` folder diff --git a/themes/10up-block-theme/assets/css/templates/index.css b/themes/10up-block-theme/assets/css/templates/index.css new file mode 100644 index 00000000..e69de29b diff --git a/themes/10up-block-theme/assets/css/utilities/index.css b/themes/10up-block-theme/assets/css/utilities/index.css new file mode 100644 index 00000000..9c4c957f --- /dev/null +++ b/themes/10up-block-theme/assets/css/utilities/index.css @@ -0,0 +1 @@ +@import url("visually-hidden.css"); diff --git a/themes/10up-block-theme/assets/css/utilities/visually-hidden.css b/themes/10up-block-theme/assets/css/utilities/visually-hidden.css new file mode 100644 index 00000000..41eed5c5 --- /dev/null +++ b/themes/10up-block-theme/assets/css/utilities/visually-hidden.css @@ -0,0 +1,10 @@ +.visually-hidden { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} diff --git a/themes/10up-block-theme/assets/fonts/.gitkeep b/themes/10up-block-theme/assets/fonts/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/themes/10up-block-theme/assets/images/.gitkeep b/themes/10up-block-theme/assets/images/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/themes/10up-block-theme/assets/js/block-extensions.js b/themes/10up-block-theme/assets/js/block-extensions.js new file mode 100644 index 00000000..e69de29b diff --git a/themes/10up-block-theme/assets/js/frontend.js b/themes/10up-block-theme/assets/js/frontend.js new file mode 100644 index 00000000..8c371783 --- /dev/null +++ b/themes/10up-block-theme/assets/js/frontend.js @@ -0,0 +1 @@ +import '../css/frontend.css'; diff --git a/themes/10up-block-theme/assets/svg/.gitkeep b/themes/10up-block-theme/assets/svg/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/themes/10up-block-theme/composer.json b/themes/10up-block-theme/composer.json new file mode 100644 index 00000000..d0f55abf --- /dev/null +++ b/themes/10up-block-theme/composer.json @@ -0,0 +1,31 @@ +{ + "name": "10up/tenup-theme", + "type": "wordpress-theme", + "authors": [ + { + "name": "10up", + "email": "info@10up.com" + } + ], + "require": { + "php": ">=8.0", + "haydenpierce/class-finder": "^0.4.3" + }, + "require-dev": { + "10up/phpcs-composer": "dev-trunk" + }, + "scripts": { + "lint": "phpcs .", + "lint-fix": "phpcbf ." + }, + "autoload": { + "psr-4": { + "TenupBlockTheme\\": "includes/classes/" + } + }, + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true + } + } +} diff --git a/themes/10up-block-theme/composer.lock b/themes/10up-block-theme/composer.lock new file mode 100644 index 00000000..9a2cb267 --- /dev/null +++ b/themes/10up-block-theme/composer.lock @@ -0,0 +1,813 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "b8e0d1c59a064d11f91fbdc4897bab5b", + "packages": [ + { + "name": "haydenpierce/class-finder", + "version": "0.4.4", + "source": { + "type": "git", + "url": "git@gitlab.com:hpierce1102/ClassFinder.git", + "reference": "94c602870ddf8d4fa2d67fb9bae637d88f9bd76e" + }, + "dist": { + "type": "zip", + "url": "https://gitlab.com/api/v4/projects/hpierce1102%2FClassFinder/repository/archive.zip?sha=94c602870ddf8d4fa2d67fb9bae637d88f9bd76e", + "reference": "94c602870ddf8d4fa2d67fb9bae637d88f9bd76e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=5.3" + }, + "require-dev": { + "mikey179/vfsstream": "^1.6", + "phpunit/phpunit": "~9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "HaydenPierce\\ClassFinder\\": "src/", + "HaydenPierce\\ClassFinder\\UnitTest\\": "test/unit" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Hayden Pierce", + "email": "hayden@haydenpierce.com" + } + ], + "description": "A library that can provide of a list of classes in a given namespace", + "time": "2022-09-26T22:42:59+00:00" + } + ], + "packages-dev": [ + { + "name": "10up/phpcs-composer", + "version": "dev-trunk", + "source": { + "type": "git", + "url": "https://github.com/10up/phpcs-composer.git", + "reference": "75fde1b62cbb551146159154b0d7135d1da0db1c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/10up/phpcs-composer/zipball/75fde1b62cbb551146159154b0d7135d1da0db1c", + "reference": "75fde1b62cbb551146159154b0d7135d1da0db1c", + "shasum": "" + }, + "require": { + "automattic/vipwpcs": "^3.0", + "phpcompatibility/phpcompatibility-wp": "^2" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "*", + "phpcompatibility/php-compatibility": "dev-develop as 9.99.99" + }, + "default-branch": true, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "10up", + "homepage": "https://10up.com/" + } + ], + "description": "10up's PHP CodeSniffer Ruleset", + "support": { + "issues": "https://github.com/10up/phpcs-composer/issues", + "source": "https://github.com/10up/phpcs-composer/tree/trunk" + }, + "time": "2023-12-14T21:42:57+00:00" + }, + { + "name": "automattic/vipwpcs", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/Automattic/VIP-Coding-Standards.git", + "reference": "2b1d206d81b74ed999023cffd924f862ff2753c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Automattic/VIP-Coding-Standards/zipball/2b1d206d81b74ed999023cffd924f862ff2753c8", + "reference": "2b1d206d81b74ed999023cffd924f862ff2753c8", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "phpcsstandards/phpcsextra": "^1.2.1", + "phpcsstandards/phpcsutils": "^1.0.11", + "sirbrillig/phpcs-variable-analysis": "^2.11.18", + "squizlabs/php_codesniffer": "^3.9.2", + "wp-coding-standards/wpcs": "^3.1.0" + }, + "require-dev": { + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcompatibility/php-compatibility": "^9", + "phpcsstandards/phpcsdevtools": "^1.0", + "phpunit/phpunit": "^4 || ^5 || ^6 || ^7 || ^8 || ^9" + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Contributors", + "homepage": "https://github.com/Automattic/VIP-Coding-Standards/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress VIP minimum coding conventions", + "keywords": [ + "phpcs", + "standards", + "static analysis", + "wordpress" + ], + "support": { + "issues": "https://github.com/Automattic/VIP-Coding-Standards/issues", + "source": "https://github.com/Automattic/VIP-Coding-Standards", + "wiki": "https://github.com/Automattic/VIP-Coding-Standards/wiki" + }, + "time": "2024-05-10T20:31:09+00:00" + }, + { + "name": "dealerdirect/phpcodesniffer-composer-installer", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/composer-installer.git", + "reference": "4be43904336affa5c2f70744a348312336afd0da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da", + "reference": "4be43904336affa5c2f70744a348312336afd0da", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.4", + "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" + }, + "require-dev": { + "composer/composer": "*", + "ext-json": "*", + "ext-zip": "*", + "php-parallel-lint/php-parallel-lint": "^1.3.1", + "phpcompatibility/php-compatibility": "^9.0", + "yoast/phpunit-polyfills": "^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Franck Nijhof", + "email": "franck.nijhof@dealerdirect.com", + "homepage": "http://www.frenck.nl", + "role": "Developer / IT Manager" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer Standards Composer Installer Plugin", + "homepage": "http://www.dealerdirect.com", + "keywords": [ + "PHPCodeSniffer", + "PHP_CodeSniffer", + "code quality", + "codesniffer", + "composer", + "installer", + "phpcbf", + "phpcs", + "plugin", + "qa", + "quality", + "standard", + "standards", + "style guide", + "stylecheck", + "tests" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/composer-installer/issues", + "source": "https://github.com/PHPCSStandards/composer-installer" + }, + "time": "2023-01-05T11:28:13+00:00" + }, + { + "name": "phpcompatibility/php-compatibility", + "version": "9.3.5", + "source": { + "type": "git", + "url": "https://github.com/PHPCompatibility/PHPCompatibility.git", + "reference": "9fb324479acf6f39452e0655d2429cc0d3914243" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/9fb324479acf6f39452e0655d2429cc0d3914243", + "reference": "9fb324479acf6f39452e0655d2429cc0d3914243", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "squizlabs/php_codesniffer": "^2.3 || ^3.0.2" + }, + "conflict": { + "squizlabs/php_codesniffer": "2.6.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.", + "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Wim Godden", + "homepage": "https://github.com/wimg", + "role": "lead" + }, + { + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl", + "role": "lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors" + } + ], + "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.", + "homepage": "http://techblog.wimgodden.be/tag/codesniffer/", + "keywords": [ + "compatibility", + "phpcs", + "standards" + ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibility" + }, + "time": "2019-12-27T09:44:58+00:00" + }, + { + "name": "phpcompatibility/phpcompatibility-paragonie", + "version": "1.3.3", + "source": { + "type": "git", + "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git", + "reference": "293975b465e0e709b571cbf0c957c6c0a7b9a2ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/293975b465e0e709b571cbf0c957c6c0a7b9a2ac", + "reference": "293975b465e0e709b571cbf0c957c6c0a7b9a2ac", + "shasum": "" + }, + "require": { + "phpcompatibility/php-compatibility": "^9.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "paragonie/random_compat": "dev-master", + "paragonie/sodium_compat": "dev-master" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", + "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Wim Godden", + "role": "lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "lead" + } + ], + "description": "A set of rulesets for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by the Paragonie polyfill libraries.", + "homepage": "http://phpcompatibility.com/", + "keywords": [ + "compatibility", + "paragonie", + "phpcs", + "polyfill", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/issues", + "security": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/security/policy", + "source": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie" + }, + "funding": [ + { + "url": "https://github.com/PHPCompatibility", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2024-04-24T21:30:46+00:00" + }, + { + "name": "phpcompatibility/phpcompatibility-wp", + "version": "2.1.5", + "source": { + "type": "git", + "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git", + "reference": "01c1ff2704a58e46f0cb1ca9d06aee07b3589082" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/01c1ff2704a58e46f0cb1ca9d06aee07b3589082", + "reference": "01c1ff2704a58e46f0cb1ca9d06aee07b3589082", + "shasum": "" + }, + "require": { + "phpcompatibility/php-compatibility": "^9.0", + "phpcompatibility/phpcompatibility-paragonie": "^1.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", + "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Wim Godden", + "role": "lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "lead" + } + ], + "description": "A ruleset for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by WordPress.", + "homepage": "http://phpcompatibility.com/", + "keywords": [ + "compatibility", + "phpcs", + "standards", + "static analysis", + "wordpress" + ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibilityWP/issues", + "security": "https://github.com/PHPCompatibility/PHPCompatibilityWP/security/policy", + "source": "https://github.com/PHPCompatibility/PHPCompatibilityWP" + }, + "funding": [ + { + "url": "https://github.com/PHPCompatibility", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2024-04-24T21:37:59+00:00" + }, + { + "name": "phpcsstandards/phpcsextra", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHPCSExtra.git", + "reference": "11d387c6642b6e4acaf0bd9bf5203b8cca1ec489" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHPCSExtra/zipball/11d387c6642b6e4acaf0bd9bf5203b8cca1ec489", + "reference": "11d387c6642b6e4acaf0bd9bf5203b8cca1ec489", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "phpcsstandards/phpcsutils": "^1.0.9", + "squizlabs/php_codesniffer": "^3.8.0" + }, + "require-dev": { + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcsstandards/phpcsdevcs": "^1.1.6", + "phpcsstandards/phpcsdevtools": "^1.2.1", + "phpunit/phpunit": "^4.5 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" + }, + "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-stable": "1.x-dev", + "dev-develop": "1.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl", + "role": "lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHPCSExtra/graphs/contributors" + } + ], + "description": "A collection of sniffs and standards for use with PHP_CodeSniffer.", + "keywords": [ + "PHP_CodeSniffer", + "phpcbf", + "phpcodesniffer-standard", + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHPCSExtra/issues", + "security": "https://github.com/PHPCSStandards/PHPCSExtra/security/policy", + "source": "https://github.com/PHPCSStandards/PHPCSExtra" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2023-12-08T16:49:07+00:00" + }, + { + "name": "phpcsstandards/phpcsutils", + "version": "1.0.12", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHPCSUtils.git", + "reference": "87b233b00daf83fb70f40c9a28692be017ea7c6c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/87b233b00daf83fb70f40c9a28692be017ea7c6c", + "reference": "87b233b00daf83fb70f40c9a28692be017ea7c6c", + "shasum": "" + }, + "require": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.4.1 || ^0.5 || ^0.6.2 || ^0.7 || ^1.0", + "php": ">=5.4", + "squizlabs/php_codesniffer": "^3.10.0 || 4.0.x-dev@dev" + }, + "require-dev": { + "ext-filter": "*", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcsstandards/phpcsdevcs": "^1.1.6", + "yoast/phpunit-polyfills": "^1.1.0 || ^2.0.0" + }, + "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-stable": "1.x-dev", + "dev-develop": "1.x-dev" + } + }, + "autoload": { + "classmap": [ + "PHPCSUtils/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl", + "role": "lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHPCSUtils/graphs/contributors" + } + ], + "description": "A suite of utility functions for use with PHP_CodeSniffer", + "homepage": "https://phpcsutils.com/", + "keywords": [ + "PHP_CodeSniffer", + "phpcbf", + "phpcodesniffer-standard", + "phpcs", + "phpcs3", + "standards", + "static analysis", + "tokens", + "utility" + ], + "support": { + "docs": "https://phpcsutils.com/", + "issues": "https://github.com/PHPCSStandards/PHPCSUtils/issues", + "security": "https://github.com/PHPCSStandards/PHPCSUtils/security/policy", + "source": "https://github.com/PHPCSStandards/PHPCSUtils" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2024-05-20T13:34:27+00:00" + }, + { + "name": "sirbrillig/phpcs-variable-analysis", + "version": "v2.11.19", + "source": { + "type": "git", + "url": "https://github.com/sirbrillig/phpcs-variable-analysis.git", + "reference": "bc8d7e30e2005bce5c59018b7cdb08e9fb45c0d1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sirbrillig/phpcs-variable-analysis/zipball/bc8d7e30e2005bce5c59018b7cdb08e9fb45c0d1", + "reference": "bc8d7e30e2005bce5c59018b7cdb08e9fb45c0d1", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "squizlabs/php_codesniffer": "^3.5.6" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || ^1.0", + "phpcsstandards/phpcsdevcs": "^1.1", + "phpstan/phpstan": "^1.7", + "phpunit/phpunit": "^4.8.36 || ^5.7.21 || ^6.5 || ^7.0 || ^8.0 || ^9.0", + "sirbrillig/phpcs-import-detection": "^1.1", + "vimeo/psalm": "^0.2 || ^0.3 || ^1.1 || ^4.24 || ^5.0@beta" + }, + "type": "phpcodesniffer-standard", + "autoload": { + "psr-4": { + "VariableAnalysis\\": "VariableAnalysis/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Sam Graham", + "email": "php-codesniffer-variableanalysis@illusori.co.uk" + }, + { + "name": "Payton Swick", + "email": "payton@foolord.com" + } + ], + "description": "A PHPCS sniff to detect problems with variables.", + "keywords": [ + "phpcs", + "static analysis" + ], + "support": { + "issues": "https://github.com/sirbrillig/phpcs-variable-analysis/issues", + "source": "https://github.com/sirbrillig/phpcs-variable-analysis", + "wiki": "https://github.com/sirbrillig/phpcs-variable-analysis/wiki" + }, + "time": "2024-06-26T20:08:34+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.10.1", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/8f90f7a53ce271935282967f53d0894f8f1ff877", + "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" + }, + "bin": [ + "bin/phpcbf", + "bin/phpcs" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2024-05-22T21:24:41+00:00" + }, + { + "name": "wp-coding-standards/wpcs", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/WordPress/WordPress-Coding-Standards.git", + "reference": "9333efcbff231f10dfd9c56bb7b65818b4733ca7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/9333efcbff231f10dfd9c56bb7b65818b4733ca7", + "reference": "9333efcbff231f10dfd9c56bb7b65818b4733ca7", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "ext-libxml": "*", + "ext-tokenizer": "*", + "ext-xmlreader": "*", + "php": ">=5.4", + "phpcsstandards/phpcsextra": "^1.2.1", + "phpcsstandards/phpcsutils": "^1.0.10", + "squizlabs/php_codesniffer": "^3.9.0" + }, + "require-dev": { + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcompatibility/php-compatibility": "^9.0", + "phpcsstandards/phpcsdevtools": "^1.2.0", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" + }, + "suggest": { + "ext-iconv": "For improved results", + "ext-mbstring": "For improved results" + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Contributors", + "homepage": "https://github.com/WordPress/WordPress-Coding-Standards/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions", + "keywords": [ + "phpcs", + "standards", + "static analysis", + "wordpress" + ], + "support": { + "issues": "https://github.com/WordPress/WordPress-Coding-Standards/issues", + "source": "https://github.com/WordPress/WordPress-Coding-Standards", + "wiki": "https://github.com/WordPress/WordPress-Coding-Standards/wiki" + }, + "funding": [ + { + "url": "https://opencollective.com/php_codesniffer", + "type": "custom" + } + ], + "time": "2024-03-25T16:39:00+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "10up/phpcs-composer": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=8.0" + }, + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/themes/10up-block-theme/functions.php b/themes/10up-block-theme/functions.php new file mode 100755 index 00000000..14743aa3 --- /dev/null +++ b/themes/10up-block-theme/functions.php @@ -0,0 +1,40 @@ +name ] ); + } + ); + } + } +} + +/** + * Enqueue block specific styles. + */ +function enqueue_theme_block_styles() { + $stylesheets = glob( TENUP_BLOCK_THEME_DIST_PATH . '/blocks/autoenqueue/**/*.css' ); + foreach ( $stylesheets as $stylesheet_path ) { + $block_type = str_replace( TENUP_BLOCK_THEME_DIST_PATH . '/blocks/autoenqueue/', '', $stylesheet_path ); + $block_type = str_replace( '.css', '', $block_type ); + $asset_file = TENUP_BLOCK_THEME_DIST_PATH . 'blocks/autoenqueue/' . $block_type . '.asset.php'; + + if ( ! file_exists( $asset_file ) ) { + $asset_file = require $asset_file; + } else { + $asset_file = [ + 'version' => filemtime( $stylesheet_path ), + 'dependencies' => [], + ]; + } + + wp_register_style( + "tenup-theme-{$block_type}", + TENUP_BLOCK_THEME_DIST_URL . 'blocks/autoenqueue/' . $block_type . '.css', + $asset_file['dependencies'], + $asset_file['version'] + ); + + wp_enqueue_block_style( + $block_type, + [ + 'handle' => "tenup-theme-{$block_type}", + 'path' => $stylesheet_path, + ] + ); + + if ( file_exists( TENUP_BLOCK_THEME_DIST_PATH . 'blocks/autoenqueue/' . $block_type . '.js' ) ) { + wp_enqueue_script( + $block_type, + TENUP_BLOCK_THEME_DIST_URL . 'blocks/autoenqueue/' . $block_type . '.js', + $asset_file['dependencies'], + $asset_file['version'], + true + ); + } + } +} diff --git a/themes/10up-block-theme/includes/blocks/.gitkeep b/themes/10up-block-theme/includes/blocks/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/themes/10up-block-theme/includes/core.php b/themes/10up-block-theme/includes/core.php new file mode 100755 index 00000000..541af3b7 --- /dev/null +++ b/themes/10up-block-theme/includes/core.php @@ -0,0 +1,190 @@ + 'defer', + ] + ); +} + + +/** + * Enqueue styles for front-end. + * + * @return void + */ +function styles() { + wp_enqueue_style( + 'tenup-theme-styles', + TENUP_BLOCK_THEME_TEMPLATE_URL . '/dist/css/frontend.css', + [], + get_asset_info( 'frontend', 'version' ) + ); +} + +/** + * Enqueue styles for editor only. + * + * @return void + */ +function editor_style_overrides() { + wp_enqueue_style( + 'tenup-theme-editor-style-overrides', + TENUP_BLOCK_THEME_TEMPLATE_URL . '/dist/css/editor-style-overrides.css', + [], + TENUP_BLOCK_THEME_VERSION + ); + + wp_enqueue_script( + 'tenup-theme-block-extensions', + TENUP_BLOCK_THEME_TEMPLATE_URL . '/dist/js/block-extensions.js', + get_asset_info( 'block-extensions', 'dependencies' ), + get_asset_info( 'block-extensions', 'version' ), + true + ); +} + +/** + * register all icons located in the dist/svg folder + */ +function register_all_icons() { + if ( ! function_exists( '\UIKitCore\Helpers\register_icons' ) ) { + return; + } + + $icon_paths = glob( TENUP_BLOCK_THEME_DIST_PATH . 'svg/*.svg' ); + $icons = array_map( + function ( $icon_path ) { + $icon_name = preg_replace( '#\..*$#', '', basename( $icon_path ) ); + + return new \UIKitCore\Icon( + $icon_name, + ucwords( str_replace( '-', ' ', $icon_name ) ), + $icon_path + ); + }, + $icon_paths + ); + + \UIKitCore\Helpers\register_icons( + [ + 'name' => 'tenup', + 'label' => 'Theme Icons', + 'icons' => $icons, + ] + ); +} + +/** + * Handles JavaScript detection. + * + * Adds a `js` class to the root `` element when JavaScript is detected. + * + * @return void + */ +function js_detection() { + + echo "\n"; +} + +/** + * Handles scrollbar width detection. + * + * Adds a JavaScript event listener to the DOMContentLoaded event. When the DOM is fully loaded, + * it calculates the width of the scrollbar and sets a CSS variable `--wp--custom--scrollbar-width` with the width. + * It also adds an event listener to the window resize event to update the scrollbar width when the window is resized. + * + * @return void + */ +function scrollbar_detection() { + echo '' . "\n"; +} + +/** + * Inlines ct.css in the head + * + * Embeds a diagnostic CSS file written by Harry Roberts + * that helps diagnose render blocking resources and other + * performance bottle necks. + * + * The CSS is inlined in the head of the document, only when requesting + * a page with the query param ?debug_perf=1 + * + * @link https://csswizardry.com/ct/ + * @return void + */ +function embed_ct_css() { + + $debug_performance = rest_sanitize_boolean( filter_input( INPUT_GET, 'debug_perf', FILTER_SANITIZE_NUMBER_INT ) ); + + if ( ! $debug_performance ) { + return; + } + + wp_register_style( 'ct', false ); // phpcs:ignore + wp_enqueue_style( 'ct' ); + wp_add_inline_style( 'ct', 'head{--ct-is-problematic:solid;--ct-is-affected:dashed;--ct-notify:#0bce6b;--ct-warn:#ffa400;--ct-error:#ff4e42}head,head [rel=stylesheet],head script,head script:not([src])[async],head script:not([src])[defer],head script~meta[http-equiv=content-security-policy],head style,head>meta[charset]:not(:nth-child(-n+5)){display:block}head [rel=stylesheet],head script,head script~meta[http-equiv=content-security-policy],head style,head title,head>meta[charset]:not(:nth-child(-n+5)){margin:5px;padding:5px;border-width:5px;background-color:#fff;color:#333}head ::before,head script,head style{font:16px/1.5 monospace,monospace;display:block}head ::before{font-weight:700}head link[rel=stylesheet],head script[src]{border-style:var(--ct-is-problematic);border-color:var(--ct-warn)}head script[src]::before{content:"[Blocking Script – " attr(src) "]"}head link[rel=stylesheet]::before{content:"[Blocking Stylesheet – " attr(href) "]"}head script:not(:empty),head style:not(:empty){max-height:5em;overflow:auto;background-color:#ffd;white-space:pre;border-color:var(--ct-notify);border-style:var(--ct-is-problematic)}head script:not(:empty)::before{content:"[Inline Script] "}head style:not(:empty)::before{content:"[Inline Style] "}head script:not(:empty)~title,head script[src]:not([async]):not([defer]):not([type=module])~title{display:block;border-style:var(--ct-is-affected);border-color:var(--ct-error)}head script:not(:empty)~title::before,head script[src]:not([async]):not([defer]):not([type=module])~title::before{content:"[ blocked by JS] "}head [rel=stylesheet]:not([media=print]):not(.ct)~script,head style:not(:empty)~script{border-style:var(--ct-is-affected);border-color:var(--ct-warn)}head [rel=stylesheet]:not([media=print]):not(.ct)~script::before,head style:not(:empty)~script::before{content:"[JS blocked by CSS – " attr(src) "]"}head script[src][src][async][defer]{display:block;border-style:var(--ct-is-problematic);border-color:var(--ct-warn)}head script[src][src][async][defer]::before{content:"[async and defer is redundant: prefer defer – " attr(src) "]"}head script:not([src])[async],head script:not([src])[defer]{border-style:var(--ct-is-problematic);border-color:var(--ct-warn)}head script:not([src])[async]::before{content:"The async attribute is redundant on inline scripts"}head script:not([src])[defer]::before{content:"The defer attribute is redundant on inline scripts"}head [rel=stylesheet][href^="//"],head [rel=stylesheet][href^=http],head script[src][src][src^="//"],head script[src][src][src^=http]{border-style:var(--ct-is-problematic);border-color:var(--ct-error)}head script[src][src][src^="//"]::before,head script[src][src][src^=http]::before{content:"[Third Party Blocking Script – " attr(src) "]"}head [rel=stylesheet][href^="//"]::before,head [rel=stylesheet][href^=http]::before{content:"[Third Party Blocking Stylesheet – " attr(href) "]"}head script~meta[http-equiv=content-security-policy]{border-style:var(--ct-is-problematic);border-color:var(--ct-error)}head script~meta[http-equiv=content-security-policy]::before{content:"[Meta CSP defined after JS]"}head>meta[charset]:not(:nth-child(-n+5)){border-style:var(--ct-is-problematic);border-color:var(--ct-warn)}head>meta[charset]:not(:nth-child(-n+5))::before{content:"[Charset should appear as early as possible]"}link[rel=stylesheet].ct,link[rel=stylesheet][media=print],script[async],script[defer],script[type=module],style.ct{display:none}' ); +} diff --git a/themes/10up-block-theme/includes/overrides.php b/themes/10up-block-theme/includes/overrides.php new file mode 100644 index 00000000..7a70337c --- /dev/null +++ b/themes/10up-block-theme/includes/overrides.php @@ -0,0 +1,84 @@ +<?php +/** + * This file contains hooks and functions that override the behavior of WP Core. + * + * @package TenupBlockTheme + */ + +namespace TenupBlockTheme\Overrides; + +/** + * Registers instances where we will override default WP Core behavior. + * + * @link https://developer.wordpress.org/reference/functions/print_emoji_detection_script/ + * @link https://developer.wordpress.org/reference/functions/print_emoji_styles/ + * @link https://developer.wordpress.org/reference/functions/wp_staticize_emoji/ + * @link https://developer.wordpress.org/reference/functions/wp_staticize_emoji_for_email/ + * @link https://developer.wordpress.org/reference/functions/wp_generator/ + * @link https://developer.wordpress.org/reference/functions/wlwmanifest_link/ + * @link https://developer.wordpress.org/reference/functions/rsd_link/ + * + * @return void + */ +function setup() { + // Remove the Emoji detection script. + remove_action( 'wp_head', 'print_emoji_detection_script', 7 ); + + // Remove inline Emoji detection script. + remove_action( 'admin_print_scripts', 'print_emoji_detection_script' ); + + // Remove Emoji-related styles from front end and back end. + remove_action( 'wp_print_styles', 'print_emoji_styles' ); + remove_action( 'admin_print_styles', 'print_emoji_styles' ); + + // Remove Emoji-to-static-img conversion. + remove_filter( 'the_content_feed', 'wp_staticize_emoji' ); + remove_filter( 'comment_text_rss', 'wp_staticize_emoji' ); + remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' ); + + add_filter( 'tiny_mce_plugins', 'TenupBlockTheme\Overrides\disable_emojis_tinymce' ); + add_filter( 'wp_resource_hints', 'TenupBlockTheme\Overrides\disable_emoji_dns_prefetch', 10, 2 ); + + // Remove WordPress generator meta. + remove_action( 'wp_head', 'wp_generator' ); + // Remove Windows Live Writer manifest link. + remove_action( 'wp_head', 'wlwmanifest_link' ); + // Remove the link to Really Simple Discovery service endpoint. + remove_action( 'wp_head', 'rsd_link' ); +} + +/** + * Filter function used to remove the TinyMCE emoji plugin. + * + * @link https://developer.wordpress.org/reference/hooks/tiny_mce_plugins/ + * + * @param array $plugins An array of default TinyMCE plugins. + * @return array An array of TinyMCE plugins, without wpemoji. + */ +function disable_emojis_tinymce( $plugins ) { + if ( is_array( $plugins ) && in_array( 'wpemoji', $plugins, true ) ) { + return array_diff( $plugins, array( 'wpemoji' ) ); + } + + return $plugins; +} + +/** + * Remove emoji CDN hostname from DNS prefetching hints. + * + * @link https://developer.wordpress.org/reference/hooks/emoji_svg_url/ + * + * @param array $urls URLs to print for resource hints. + * @param string $relation_type The relation type the URLs are printed for. + * @return array Difference betwen the two arrays. + */ +function disable_emoji_dns_prefetch( $urls, $relation_type ) { + if ( 'dns-prefetch' === $relation_type ) { + /** This filter is documented in wp-includes/formatting.php */ + $emoji_svg_url = apply_filters( 'emoji_svg_url', 'https://s.w.org/images/core/emoji/2/svg/' ); + + $urls = array_values( array_diff( $urls, array( $emoji_svg_url ) ) ); + } + + return $urls; +} diff --git a/themes/10up-block-theme/includes/template-tags.php b/themes/10up-block-theme/includes/template-tags.php new file mode 100644 index 00000000..6a9176d5 --- /dev/null +++ b/themes/10up-block-theme/includes/template-tags.php @@ -0,0 +1,36 @@ +<?php +/** + * Custom template tags for this theme. + * + * This file is for custom template tags only and it should not contain + * functions that will be used for filtering or adding an action. + * + * All functions should be prefixed with TenupBlockTheme in order to prevent + * pollution of the global namespace and potential conflicts with functions + * from plugins. + * Example: `TENUP_BLOCK_THEME_function()` + * + * @package TenupBlockTheme\TemplateTags + */ + +namespace TenupBlockTheme\TemplateTags; + +/** + * Set up theme defaults and register supported WordPress features. + * + * @return void + */ +function setup() { + add_action( 'wp_head', 'TenupBlockTheme\TemplateTags\add_viewport_meta_tag', 10, 0 ); +} + +/** + * Add viewport meta tag to head. + * + * @return void + */ +function add_viewport_meta_tag() { + ?> + <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"> + <?php +} diff --git a/themes/10up-block-theme/includes/utility.php b/themes/10up-block-theme/includes/utility.php new file mode 100755 index 00000000..b2e5e17b --- /dev/null +++ b/themes/10up-block-theme/includes/utility.php @@ -0,0 +1,79 @@ +<?php +/** + * Utility functions for the theme. + * + * This file is for custom helper functions. + * These should not be confused with WordPress template + * tags. Template tags typically use prefixing, as opposed + * to Namespaces. + * + * @link https://developer.wordpress.org/themes/basics/template-tags/ + * @package TenupBlockTheme + */ + +namespace TenupBlockTheme\Utility; + +/** + * Get asset info from extracted asset files + * + * @param string $slug Asset slug as defined in build/webpack configuration + * @param string $attribute Optional attribute to get. Can be version or dependencies + * @return string|array + */ +function get_asset_info( $slug, $attribute = null ) { + if ( file_exists( TENUP_BLOCK_THEME_PATH . 'dist/js/' . $slug . '.asset.php' ) ) { + $asset = require TENUP_BLOCK_THEME_PATH . 'dist/js/' . $slug . '.asset.php'; + } elseif ( file_exists( TENUP_BLOCK_THEME_PATH . 'dist/css/' . $slug . '.asset.php' ) ) { + $asset = require TENUP_BLOCK_THEME_PATH . 'dist/css/' . $slug . '.asset.php'; + } else { + return null; + } + + if ( ! empty( $attribute ) && isset( $asset[ $attribute ] ) ) { + return $asset[ $attribute ]; + } + + return $asset; +} + + + +/** + * Enqueue a view script for a block + * + * @param string $block_name Block name. + * @param array $args { + * Optional. Array of arguments for enqueuing a view script. + * @type string $handle Script handle. + * @type string $src Script URL. + * @type array $dep Script dependencies. + * @type string|bool $ver Script version. + * @type bool $in_footer Whether to enqueue the script before </body> instead of in the <head>. + * } + * @return void + */ +function wp_enqueue_block_view_script( $block_name, $args = array() ) { + $default_args = array( + 'dep' => array(), + 'ver' => false, + 'in_footer' => true, + ); + + $args = wp_parse_args( $args, $default_args ); + + $block = \WP_Block_Type_Registry::get_instance()->get_registered( $block_name ); + + if ( ! empty( $args['src'] ) ) { + wp_register_script( + $args['handle'], + $args['src'], + $args['dep'], + $args['ver'], + $args['in_footer'] + ); + } + + if ( ! empty( $block ) ) { + $block->view_script_handles[] = $args['handle']; + } +} diff --git a/themes/10up-block-theme/package.json b/themes/10up-block-theme/package.json new file mode 100644 index 00000000..4ca7f8ad --- /dev/null +++ b/themes/10up-block-theme/package.json @@ -0,0 +1,35 @@ +{ + "name": "tenup-theme", + "version": "1.0.0", + "scripts": { + "start": "npm run watch", + "watch": "10up-toolkit watch --port=5020", + "build": "10up-toolkit build", + "build:analyze": "10up-toolkit build --analyze", + "format-js": "10up-toolkit format-js", + "lint-js": "10up-toolkit lint-js", + "lint-style": "10up-toolkit lint-style", + "test": "10up-toolkit test-unit-jest", + "clean-dist": "rm -rf ./dist", + "scaffold:block": "cd includes/blocks/ && wp-create-block --no-plugin --template ../../../../bin/create-block-template" + }, + "engines": { + "node": ">=18.0.0" + }, + "devDependencies": { + "10up-toolkit": "^6.2.1" + }, + "dependencies": { + "@10up/block-components": "^1.19.1", + "clsx": "^2.1.1" + }, + "10up-toolkit": { + "useBlockAssets": true, + "useScriptModules": true, + "entry": { + "editor-style-overrides": "./assets/css/editor-style-overrides.css", + "frontend": "./assets/js/frontend.js", + "block-extensions": "./assets/js/block-extensions.js" + } + } +} diff --git a/themes/10up-block-theme/parts/footer.html b/themes/10up-block-theme/parts/footer.html new file mode 100644 index 00000000..88e2b0d2 --- /dev/null +++ b/themes/10up-block-theme/parts/footer.html @@ -0,0 +1,62 @@ +<!-- wp:group {"style":{"spacing":{"margin":{"top":"0","bottom":"0"},"padding":{"bottom":"var:preset|spacing|40-64","top":"var:preset|spacing|40-64"}}},"backgroundColor":"surface-secondary","layout":{"type":"constrained"}} --> + <div class="wp-block-group has-surface-secondary-background-color has-background" style="margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--40-64);padding-bottom:var(--wp--preset--spacing--40-64)"><!-- wp:columns {"align":"wide","style":{"spacing":{"blockGap":{"top":"clamp(1.50rem, calc(1.43rem + 0.37vw), 1.69rem)","left":"150px"}}}} --> + <div class="wp-block-columns alignwide"><!-- wp:column {"width":"50%"} --> + <div class="wp-block-column" style="flex-basis:50%"><!-- wp:group {"style":{"spacing":{"blockGap":"var:preset|spacing|8"}},"layout":{"type":"flex","orientation":"vertical"}} --> + <div class="wp-block-group"><!-- wp:site-title {"level":0,"style":{"typography":{"textTransform":"none","fontStyle":"normal","fontWeight":"600"}}} /--> + + <!-- wp:paragraph --> + <p>Effortlessly design a stunning custom site with an + intuitive interface, unlimited options, and responsive layouts.</p> + <!-- /wp:paragraph --></div> + <!-- /wp:group --></div> + <!-- /wp:column --> + + <!-- wp:column {"width":"50%"} --> + <div class="wp-block-column" style="flex-basis:50%"><!-- wp:group {"layout":{"type":"grid","minimumColumnWidth":"8rem"}} --> + <div class="wp-block-group"><!-- wp:group {"style":{"spacing":{"blockGap":"var:preset|spacing|8"}},"layout":{"type":"flex","orientation":"vertical"}} --> + <div class="wp-block-group"><!-- wp:paragraph --> + <p><strong>Quick Links</strong></p> + <!-- /wp:paragraph --> + + <!-- wp:paragraph --> + <p>Sample Link<br>Sample Link<br>Sample + Link<br>Sample Link<br>Sample Link</p> + <!-- /wp:paragraph --></div> + <!-- /wp:group --> + + <!-- wp:group {"style":{"spacing":{"blockGap":"var:preset|spacing|8"}},"layout":{"type":"flex","orientation":"vertical"}} --> + <div class="wp-block-group"><!-- wp:paragraph --> + <p><strong>Resources</strong></p> + <!-- /wp:paragraph --> + + <!-- wp:paragraph --> + <p>Sample Link<br>Sample Link<br>Sample + Link<br>Sample Link<br>Sample Link</p> + <!-- /wp:paragraph --></div> + <!-- /wp:group --> + + <!-- wp:group {"style":{"spacing":{"blockGap":"var:preset|spacing|8"}},"layout":{"type":"flex","orientation":"vertical"}} --> + <div class="wp-block-group"><!-- wp:paragraph --> + <p><strong>About</strong></p> + <!-- /wp:paragraph --> + + <!-- wp:paragraph --> + <p>Sample Link<br>Sample Link<br>Sample + Link<br>Sample Link<br>Sample Link</p> + <!-- /wp:paragraph --></div> + <!-- /wp:group --></div> + <!-- /wp:group --></div> + <!-- /wp:column --></div> + <!-- /wp:columns --> + + <!-- wp:separator {"align":"wide","className":"is-style-default","style":{"spacing":{"margin":{"top":"var:preset|spacing|24"}},"color":{"background":"#e1e3e4"}},"separatorHeight":"1px"} --> + <hr class="wp-block-separator alignwide has-text-color has-alpha-channel-opacity has-background is-style-default" style="margin-top:var(--wp--preset--spacing--24);background-color:#e1e3e4;color:#e1e3e4"/> + <!-- /wp:separator --> + + <!-- wp:group {"align":"wide","style":{"spacing":{"margin":{"top":"var:preset|spacing|24"}},"border":{"radius":"2px","top":{"width":"0px","style":"none"},"right":[],"bottom":[],"left":[]}},"layout":{"type":"flex","flexWrap":"nowrap","justifyContent":"space-between"}} --> + <div class="wp-block-group alignwide" style="border-radius:2px;border-top-style:none;border-top-width:0px;margin-top:var(--wp--preset--spacing--24)"><!-- wp:tenup/copyright {"suffix":"10up Inc."} /--> + + <!-- wp:navigation {"ref":11,"overlayMenu":"never"} /--></div> + <!-- /wp:group --></div> + <!-- /wp:group --> + \ No newline at end of file diff --git a/themes/10up-block-theme/parts/header.html b/themes/10up-block-theme/parts/header.html new file mode 100644 index 00000000..6e4fa39f --- /dev/null +++ b/themes/10up-block-theme/parts/header.html @@ -0,0 +1,7 @@ +<!-- wp:group {"style":{"border":{"bottom":{"color":"var:preset|color|surface-secondary","width":"1px"},"top":[],"right":[],"left":[]}},"layout":{"type":"constrained"}} --> +<div class="wp-block-group" style="border-bottom-color:var(--wp--preset--color--surface-secondary);border-bottom-width:1px"><!-- wp:group {"align":"wide","className":"is-style-default","style":{"spacing":{"margin":{"top":"0","bottom":"0"},"padding":{"top":"var:preset|spacing|24","bottom":"var:preset|spacing|24"}}},"layout":{"type":"flex","flexWrap":"nowrap","justifyContent":"space-between"}} --> +<div class="wp-block-group alignwide is-style-default" style="margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--24);padding-bottom:var(--wp--preset--spacing--24)"><!-- wp:site-title /--> + +<!-- wp:template-part {"slug":"site-header-navigation-area"} /--></div> +<!-- /wp:group --></div> +<!-- /wp:group --> diff --git a/themes/10up-block-theme/parts/site-header-navigation-area.html b/themes/10up-block-theme/parts/site-header-navigation-area.html new file mode 100644 index 00000000..99936eab --- /dev/null +++ b/themes/10up-block-theme/parts/site-header-navigation-area.html @@ -0,0 +1 @@ +<!-- wp:navigation {"align":"wide","layout":{"type":"flex","justifyContent":"left"}} /--> diff --git a/themes/10up-block-theme/patterns/.gitkeep b/themes/10up-block-theme/patterns/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/themes/10up-block-theme/phpcs.xml b/themes/10up-block-theme/phpcs.xml new file mode 100644 index 00000000..ebc2a10d --- /dev/null +++ b/themes/10up-block-theme/phpcs.xml @@ -0,0 +1,9 @@ +<?xml version="1.0"?> +<ruleset name="10up PHPCS"> + <description>10up PHPCS extended.</description> + <exclude-pattern>dist/</exclude-pattern> + <exclude-pattern>plugins/*</exclude-pattern> + <rule ref="10up-Default" /> + + <arg name="colors"/> +</ruleset> diff --git a/themes/10up-block-theme/screenshot.png b/themes/10up-block-theme/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..849d2b38488a6b5f2b0b269caa4c232403d96a87 GIT binary patch literal 18915 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 NtEI1*qhWRD{{T>zgM<J8 literal 0 HcmV?d00001 diff --git a/themes/10up-block-theme/style.css b/themes/10up-block-theme/style.css new file mode 100755 index 00000000..e9bbfe4a --- /dev/null +++ b/themes/10up-block-theme/style.css @@ -0,0 +1,10 @@ +/** + * Theme Name: TENUP Theme + * Theme URI: https://10up.com + * Description: A theme for the TENUP project. + * Author: 10up + * Author URI: https://10up.com + * Version: 1.0.0 + * Tags: + * Text Domain: tenup-theme + */ diff --git a/themes/10up-block-theme/stylelint.config.js b/themes/10up-block-theme/stylelint.config.js new file mode 100644 index 00000000..fc8f56af --- /dev/null +++ b/themes/10up-block-theme/stylelint.config.js @@ -0,0 +1,26 @@ +const config = { + extends: ['@10up/stylelint-config'], + rules: { + 'scale-unlimited/declaration-strict-value': [ + '/color/', + { + ignoreValues: [ + 'currentcolor', + 'currentColor', + 'inherit', + 'initial', + 'transparent', + 'unset', + ], + }, + ], + 'custom-property-pattern': [ + '^([a-z][a-z0-9]*)(-[a-z0-9]+)*$|^wp[-]{1,2}([a-z][a-z0-9]*)([-]{1,2}[a-z0-9]+)*$', + { + message: 'Expected custom property name to be kebab-case or wp--kebab--case', + }, + ], + }, +}; + +module.exports = config; diff --git a/themes/10up-block-theme/styles/surface-primary.json b/themes/10up-block-theme/styles/surface-primary.json new file mode 100644 index 00000000..4da5111a --- /dev/null +++ b/themes/10up-block-theme/styles/surface-primary.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://schemas.wp.org/wp/6.6/theme.json", + "version": 3, + "title": "Primary", + "slug": "primary", + "blockTypes": [ + "core/group" + ], + "styles": { + "color": {} + } +} diff --git a/themes/10up-block-theme/styles/surface-secondary.json b/themes/10up-block-theme/styles/surface-secondary.json new file mode 100644 index 00000000..7faee321 --- /dev/null +++ b/themes/10up-block-theme/styles/surface-secondary.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://schemas.wp.org/wp/6.6/theme.json", + "version": 3, + "title": "Secondary", + "slug": "secondary", + "blockTypes": [ + "core/group" + ], + "styles": { + "color": {} + } +} diff --git a/themes/10up-block-theme/styles/surface-tertiary.json b/themes/10up-block-theme/styles/surface-tertiary.json new file mode 100644 index 00000000..bb7bcddf --- /dev/null +++ b/themes/10up-block-theme/styles/surface-tertiary.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://schemas.wp.org/wp/6.6/theme.json", + "version": 3, + "title": "Tertiary", + "slug": "tertiary", + "blockTypes": [ + "core/group" + ], + "styles": { + "color": {} + } +} diff --git a/themes/10up-block-theme/templates/404.html b/themes/10up-block-theme/templates/404.html new file mode 100644 index 00000000..a5ade16f --- /dev/null +++ b/themes/10up-block-theme/templates/404.html @@ -0,0 +1,21 @@ +<!-- wp:template-part {"slug":"header","tagName":"header"} /--> + +<!-- wp:group {"tagName":"main","className":"is-style-default","style":{"spacing":{"margin":{"top":"0","bottom":"0"},"padding":{"top":"var(--wp--preset--spacing--32-48)","bottom":"var(--wp--preset--spacing--32-48)"}},"elements":{"link":{"color":{"text":"var:preset|color|base"}}},"dimensions":{"minHeight":""}},"backgroundColor":"gray-000","layout":{"type":"constrained"}} --> +<main class="wp-block-group is-style-default has-gray-000-background-color has-background has-link-color" style="margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--32-48);padding-bottom:var(--wp--preset--spacing--32-48)"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"var(--wp--preset--spacing--40-72)","bottom":"var(--wp--preset--spacing--40-72)","right":"var(--wp--preset--spacing--32-40)","left":"var(--wp--preset--spacing--32-40)"}}},"backgroundColor":"base","layout":{"type":"constrained"}} --> +<div class="wp-block-group alignwide has-base-background-color has-background" style="padding-top:var(--wp--preset--spacing--40-72);padding-right:var(--wp--preset--spacing--32-40);padding-bottom:var(--wp--preset--spacing--40-72);padding-left:var(--wp--preset--spacing--32-40)"><!-- wp:heading {"level":1,"style":{"spacing":{"margin":{"top":"0","right":"0","bottom":"0","left":"0"}}},"fontSize":"plus-7"} --> +<h1 class="wp-block-heading has-plus-7-font-size" style="margin-top:0;margin-right:0;margin-bottom:0;margin-left:0">404</h1> +<!-- /wp:heading --> + +<!-- wp:heading --> +<h2 class="wp-block-heading">Page can not be found</h2> +<!-- /wp:heading --> + +<!-- wp:paragraph --> +<p>Perhaps a new search will find what you are looking for:</p> +<!-- /wp:paragraph --> + +<!-- wp:search {"label":"Search","showLabel":false,"buttonText":"Search","buttonPosition":"button-inside"} /--></div> +<!-- /wp:group --></main> +<!-- /wp:group --> + +<!-- wp:template-part {"slug":"footer","tagName":"footer"} /--> diff --git a/themes/10up-block-theme/templates/index.html b/themes/10up-block-theme/templates/index.html new file mode 100644 index 00000000..4c7bcaec --- /dev/null +++ b/themes/10up-block-theme/templates/index.html @@ -0,0 +1,31 @@ +<!-- wp:template-part {"slug":"header","tagName":"header"} /--> + +<!-- wp:group {"tagName":"main","className":"is-style-default","style":{"spacing":{"margin":{"top":"0","bottom":"0"},"padding":{"top":"var(--wp--preset--spacing--32-48)","bottom":"var(--wp--preset--spacing--32-48)"}}},"backgroundColor":"gray-000","layout":{"type":"constrained"}} --> +<main class="wp-block-group is-style-default has-gray-000-background-color has-background" style="margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--32-48);padding-bottom:var(--wp--preset--spacing--32-48)"><!-- wp:query {"queryId":0,"query":{"perPage":9,"pages":0,"offset":0,"postType":"post","order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":true,"taxQuery":null,"parents":[]},"align":"wide","layout":{"type":"default"}} --> +<div class="wp-block-query alignwide"><!-- wp:post-template {"style":{"elements":{"link":{"color":{"text":"var:preset|color|primary"}}}},"layout":{"type":"grid","columnCount":null,"minimumColumnWidth":"21rem"},"isEntireCardClickable":true} --> +<!-- wp:group {"align":"wide","style":{"spacing":{"blockGap":"0"},"border":{"radius":"8px","width":"1px"}},"borderColor":"surface-secondary","layout":{"type":"flex","orientation":"vertical","justifyContent":"stretch","flexWrap":"nowrap"}} --> +<div class="wp-block-group alignwide has-border-color has-surface-secondary-border-color" style="border-width:1px;border-radius:8px"><!-- wp:post-featured-image {"aspectRatio":"16/9","width":"100%","height":"","style":{"border":{"radius":{"topRight":"8px","bottomRight":"0px","topLeft":"8px","bottomLeft":"0px"}}},"displayFallback":true} /--> + +<!-- wp:group {"align":"wide","className":"is-style-default","style":{"spacing":{"padding":{"top":"var(--wp--preset--spacing--24)","right":"var(--wp--preset--spacing--24)","bottom":"var(--wp--preset--spacing--24)","left":"var(--wp--preset--spacing--24)"},"blockGap":"var:preset|spacing|8"},"layout":{"selfStretch":"fit"},"border":{"width":"0px","style":"none","radius":{"topLeft":"0px","topRight":"0px","bottomLeft":"8px","bottomRight":"8px"}}},"layout":{"type":"flex","orientation":"vertical","verticalAlignment":"space-between"}} --> +<div class="wp-block-group alignwide is-style-default" style="border-style:none;border-width:0px;border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-left-radius:8px;border-bottom-right-radius:8px;padding-top:var(--wp--preset--spacing--24);padding-right:var(--wp--preset--spacing--24);padding-bottom:var(--wp--preset--spacing--24);padding-left:var(--wp--preset--spacing--24)"><!-- wp:post-title {"isLink":true,"align":"wide","style":{"spacing":{"margin":{"top":"0","right":"0","bottom":"0","left":"0"}}},"fontSize":"heading-4"} /--> + +<!-- wp:group {"style":{"spacing":{"blockGap":"var:preset|spacing|8"}},"layout":{"type":"flex","flexWrap":"nowrap"}} --> +<div class="wp-block-group"><!-- wp:post-date {"fontSize":"minus-1"} /--> + +<!-- wp:post-terms {"term":"category","fontSize":"minus-1"} /--></div> +<!-- /wp:group --></div> +<!-- /wp:group --></div> +<!-- /wp:group --> +<!-- /wp:post-template --> + +<!-- wp:group {"align":"wide","style":{"spacing":{"margin":{"top":"var(--wp--preset--spacing--60)"}},"elements":{"link":{"color":{"text":"var:preset|color|contrast"}}}},"textColor":"contrast","layout":{"type":"default"}} --> +<div class="wp-block-group alignwide has-contrast-color has-text-color has-link-color" style="margin-top:var(--wp--preset--spacing--60)"><!-- wp:query-pagination {"paginationArrow":"arrow","align":"wide","layout":{"type":"flex","justifyContent":"space-between"}} --> +<!-- wp:query-pagination-previous /--> + +<!-- wp:query-pagination-next /--> +<!-- /wp:query-pagination --></div> +<!-- /wp:group --></div> +<!-- /wp:query --></main> +<!-- /wp:group --> + +<!-- wp:template-part {"slug":"footer","tagName":"footer"} /--> diff --git a/themes/10up-block-theme/templates/single.html b/themes/10up-block-theme/templates/single.html new file mode 100644 index 00000000..6217cc44 --- /dev/null +++ b/themes/10up-block-theme/templates/single.html @@ -0,0 +1,25 @@ +<!-- wp:template-part {"slug":"header","tagName":"header"} /--> + +<!-- wp:group {"tagName":"main","className":"is-style-default","style":{"spacing":{"margin":{"top":"0"},"padding":{"top":"var(--wp--preset--spacing--32-48)","bottom":"var(--wp--preset--spacing--32-48)"}}}} --> +<main class="wp-block-group is-style-default" style="margin-top:0;padding-top:var(--wp--preset--spacing--32-48);padding-bottom:var(--wp--preset--spacing--32-48)"><!-- wp:group {"style":{"spacing":{"margin":{"top":"var(--wp--preset--spacing--32-40)"}}},"layout":{"type":"constrained"}} --> +<div class="wp-block-group" style="margin-top:var(--wp--preset--spacing--32-40)"><!-- wp:post-terms {"term":"category","style":{"elements":{"link":{"color":{"text":"var:preset|color|primary"}}}},"textColor":"primary"} /--> + +<!-- wp:post-title {"level":1} /--> + +<!-- wp:group {"style":{"spacing":{"blockGap":"var:preset|spacing|8"}},"layout":{"type":"flex","flexWrap":"nowrap"}} --> +<div class="wp-block-group"><!-- wp:post-author {"showBio":false,"byline":""} /--> + +<!-- wp:paragraph --> +<p>·</p> +<!-- /wp:paragraph --> + +<!-- wp:post-date /--></div> +<!-- /wp:group --> + +<!-- wp:post-featured-image /--></div> +<!-- /wp:group --> + +<!-- wp:post-content {"layout":{"type":"constrained"}} /--></main> +<!-- /wp:group --> + +<!-- wp:template-part {"slug":"footer","tagName":"footer"} /--> diff --git a/themes/10up-block-theme/templates/singular.html b/themes/10up-block-theme/templates/singular.html new file mode 100644 index 00000000..4f7879c8 --- /dev/null +++ b/themes/10up-block-theme/templates/singular.html @@ -0,0 +1,7 @@ +<!-- wp:template-part {"slug":"header","tagName":"header"} /--> + +<!-- wp:group {"tagName":"main","className":"is-style-default","style":{"spacing":{"margin":{"top":"0"}}}} --> +<main class="wp-block-group is-style-default" style="margin-top:0"><!-- wp:post-content {"layout":{"type":"constrained"}} /--></main> +<!-- /wp:group --> + +<!-- wp:template-part {"slug":"footer","tagName":"footer"} /--> diff --git a/themes/10up-block-theme/theme.json b/themes/10up-block-theme/theme.json new file mode 100644 index 00000000..6f3e25e7 --- /dev/null +++ b/themes/10up-block-theme/theme.json @@ -0,0 +1,390 @@ +{ + "settings": { + "appearanceTools": true, + "color": { + "defaultDuotone": false, + "defaultGradients": false, + "defaultPalette": false, + "palette": [ + { + "color": "var(--wp--custom--color--text--primary)", + "name": "Text Primary", + "slug": "text-primary" + }, + { + "color": "var(--wp--custom--color--text--secondary)", + "name": "Text Secondary", + "slug": "text-secondary" + }, + { + "color": "var(--wp--custom--color--text--inverted)", + "name": "Text Inverted", + "slug": "text-inverted" + }, + { + "color": "var(--wp--custom--color--brand--900)", + "name": "Brand", + "slug": "brand" + }, + { + "color": "var(--wp--custom--color--brand--300)", + "name": "Brand Light", + "slug": "brand-light" + }, + { + "color": "var(--wp--custom--color--surface--primary)", + "name": "Surface Primary", + "slug": "surface-primary" + }, + { + "color": "var(--wp--custom--color--surface--secondary)", + "name": "Surface Secondary", + "slug": "surface-secondary" + }, + { + "color": "var(--wp--custom--color--surface--inverted)", + "name": "Surface Inverted", + "slug": "surface-inverted" + } + ] + }, + "custom": { + "color": { + "border": { + "brand": "var(--wp--custom--color--brand--900)", + "disabled": "var(--wp--custom--color--neutrals--500)", + "error": "var(--wp--custom--color--feedback--error--900)", + "primary": "var(--wp--custom--color--neutrals--300)", + "secondary": "var(--wp--custom--color--neutrals--900)", + "success": "var(--wp--custom--color--feedback--success--500)", + "tertiary": "var(--wp--custom--color--neutrals--700)" + }, + "brand": { + "300": "var(--wp--custom--color--primary--300)", + "500": "var(--wp--custom--color--primary--500)", + "900": "var(--wp--custom--color--primary--900)" + }, + "neutrals": { + "transparent": "transparent", + "white": "#ffffff", + "100": "#F1F3F4", + "300": "#D5D7D8", + "700": "#5F6368", + "900": "#141414", + "black": "#000000" + }, + "primary": { + "300": "#F63456", + "500": "#E12243", + "900": "#B30826" + }, + "secondary": { + "300": "#ABFCF2", + "900": "#1FB4AF" + }, + "feedback": { + "error-900": "#E80A31", + "error-500": "#F51D43", + "success-900": "#00BA27", + "success-500": "#00AC30" + }, + "surface": { + "brand": "var(--wp--custom--color--brand--900)", + "brand-light": "var(--wp--custom--color--brand--300)", + "disabled": "var(--wp--custom--color--neutrals--500)", + "inverted": "var(--wp--custom--color--neutrals--900)", + "primary": "var(--wp--custom--color--neutrals--white)", + "secondary": "var(--wp--custom--color--neutrals--100)" + }, + "text": { + "brand": "var(--wp--custom--color--primary--900)", + "disabled": "var(--wp--custom--color--neutrals--500)", + "inverted": "var(--wp--custom--color--neutrals--white)", + "primary": "var(--wp--custom--color--neutrals--900)", + "secondary": "var(--wp--custom--color--neutrals--700)" + }, + "button": { + "text": { + "default": "var(--wp--custom--color--button--primary--text--default)", + "hover": "var(--wp--custom--color--button--primary--text--hover)", + "disabled": "var(--wp--custom--color--button--primary--text--disabled)" + }, + "background": { + "default": "var(--wp--custom--color--button--primary--background--default)", + "hover": "var(--wp--custom--color--button--primary--background--hover)", + "disabled": "var(--wp--custom--color--button--primary--background--disabled)" + }, + "border": { + "default": "var(--wp--custom--color--button--primary--border--default)", + "hover": "var(--wp--custom--color--button--primary--border--hover)", + "disabled": "var(--wp--custom--color--button--primary--border--disabled)" + }, + "icon": { + "default": "var(--wp--custom--color--button--primary--icon--default)", + "hover": "var(--wp--custom--color--button--primary--icon--hover)", + "disabled": "var(--wp--custom--color--button--primary--icon--disabled)" + }, + "primary": { + "text": { + "default": "var(--wp--custom--color--text--inverted)", + "hover": "var(--wp--custom--color--text--inverted)", + "disabled": "var(--wp--custom--color--text--disabled)" + }, + "background": { + "default": "var(--wp--custom--color--surface--brand)", + "hover": "var(--wp--custom--color--surface--inverted)", + "disabled": "var(--wp--custom--color--surface--disabled)" + }, + "border": { + "default": "var(--wp--custom--color--surface--brand)", + "hover": "var(--wp--custom--color--surface--inverted)", + "disabled": "var(--wp--custom--color--surface--disabled)" + }, + "icon": { + "default": "var(--wp--custom--color--button--text--default)", + "hover": "var(--wp--custom--color--button--text--hover)", + "disabled": "var(--wp--custom--color--button--text--disabled)" + } + }, + "secondary": { + "text": { + "default": "var(--wp--custom--color--text--inverted)", + "hover": "var(--wp--custom--color--text--inverted)", + "disabled": "var(--wp--custom--color--text--disabled)" + }, + "background": { + "default": "var(--wp--custom--color--surface--inverted)", + "hover": "var(--wp--custom--color--surface--inverted)", + "disabled": "var(--wp--custom--color--surface--disabled)" + }, + "border": { + "default": "var(--wp--custom--color--surface--inverted)", + "hover": "var(--wp--custom--color--surface--inverted)", + "disabled": "var(--wp--custom--color--surface--disabled)" + }, + "icon": { + "default": "var(--wp--custom--color--button--text--default)", + "hover": "var(--wp--custom--color--button--text--hover)", + "disabled": "var(--wp--custom--color--button--text--disabled)" + } + } + } + }, + "font": { + "lineHeight": { + "120": "1.2", + "140": "1.4", + "150": "1.5" + }, + "size": { + "body": { + "lg": "var(--wp--custom--font--size--21)", + "md": "var(--wp--custom--font--size--16)", + "sm": "var(--wp--custom--font--size--12)" + }, + "button": { + "lg": "var(--wp--custom--font--size--16)", + "sm": "var(--wp--custom--font--size--14)" + }, + "display": { + "lg": { + "fluid": "true", + "max": "var(--wp--custom--font--size--90)", + "min": "var(--wp--custom--font--size--58)" + }, + "md": { + "fluid": "true", + "max": "var(--wp--custom--font--size--67))", + "min": "var(--wp--custom--font--size--54)" + } + }, + "eyebrow": { + "lg": "var(--wp--custom--font--size--12)", + "sm": "var(--wp--custom--font--size--9)" + }, + "heading": { + "1": "var(--wp--custom--font--size--51)", + "2": "var(--wp--custom--font--size--38)", + "3": "var(--wp--custom--font--size--28)", + "4": "var(--wp--custom--font--size--21)", + "5": "var(--wp--custom--font--size--16)", + "6": "var(--wp--custom--font--size--14)" + }, + "subHead": { + "lg": "var(--wp--custom--font--size--28)", + "md": "var(--wp--custom--font--size--16)", + "sm": "var(--wp--custom--font--size--12)" + }, + "9": "0.5625rem", + "12": "0.75rem", + "14": "0.875rem", + "16": "1rem", + "21": "1.3125rem", + "28": "1.75rem", + "38": "2.375rem", + "51": "3.1875rem", + "54": "3.375rem", + "58": "3.625rem", + "67": "4.1875rem", + "72": "4.5rem", + "90": "5.625rem" + } + }, + "full-viewport-width": "calc(100vw - var(--wp--custom--scrollbar-width, 0px))", + "main-content-width-side-spacing": "calc((var(--wp--custom--full-viewport-width) - var(--wp--style--global--content-size)) / 2)", + "main-wide-width-side-spacing": "calc((var(--wp--custom--full-viewport-width) - var(--wp--style--global--wide-size)) / 2)", + "scrollbar-width": "0px", + "search-block-height": "var(--wp--preset--spacing--32-48, 3rem)", + "search-block-icon-only-button-width": "var(--wp--preset--spacing--32-48, 3rem)", + "search-block-padding-inline": "var(--wp--preset--spacing--16, 1rem)", + "site-content-width": "calc(var(--wp--custom--full-viewport-width) - (2 * var(--wp--custom--site-outer-padding)))", + "site-outer-padding": "max(var(--wp--preset--spacing--16, 1rem), env(safe-area-inset-left))", + "spacing": { + "0": 0, + "2": "2px", + "4": "4px", + "8": "8px", + "12": "12px", + "16": "16px", + "24": "24px", + "32": "32px", + "40": "40px", + "48": "48px", + "56": "56px", + "64": "64px", + "72": "72px", + "80": "80px", + "96": "96px", + "112": "112px", + "120": "120px", + "128": "128px", + "144": "144px", + "160": "160px" + } + }, + "layout": { + "allowCustomContentAndWideSize": false, + "contentSize": "min(650px, var(--wp--custom--site-content-width))", + "wideSize": "min(1200px, var(--wp--custom--site-content-width))" + }, + "spacing": { + "defaultSpacingSizes": false, + "spacingSizes": [ + { + "name": "2px", + "size": "var(--wp--custom--spacing--2)", + "slug": "2" + }, + { + "name": "4px", + "size": "var(--wp--custom--spacing--4)", + "slug": "4" + }, + { + "name": "8px", + "size": "var(--wp--custom--spacing--8)", + "slug": "8" + }, + { + "name": "12px", + "size": "var(--wp--custom--spacing--12)", + "slug": "12" + }, + { + "name": "16px", + "size": "var(--wp--custom--spacing--16)", + "slug": "16" + }, + { + "name": "24px", + "size": "var(--wp--custom--spacing--24)", + "slug": "24" + }, + { + "name": "32px", + "size": "var(--wp--custom--spacing--32)", + "slug": "32" + }, + { + "name": "32px → 40px", + "size": "clamp(32px, 29.2174px + 0.8696vi, 40px)", + "slug": "32-40" + }, + { + "name": "32px → 48px", + "size": "clamp(32px, 26.4348px + 1.7391vi, 48px)", + "slug": "32-48" + }, + { + "name": "32px → 56px", + "size": "clamp(32px, 23.6522px + 2.6087vi, 56px)", + "slug": "32-56" + }, + { + "name": "40px → 64px", + "size": "clamp(40px, 31.6522px + 2.6087vi, 64px)", + "slug": "40-64" + }, + { + "name": "40px → 72px", + "size": "clamp(40px, 28.8696px + 3.4783vi, 72px)", + "slug": "40-72" + }, + { + "name": "40px → 80px", + "size": "clamp(40px, 26.087px + 4.3478vi, 80px)", + "slug": "40-80" + }, + { + "name": "56px → 112px", + "size": "clamp(56px, 36.5217px + 6.087vi, 112px)", + "slug": "56-112" + } + ] + }, + "typography": { + "fluid": { + "maxViewportWidth": "1450px", + "minViewportWidth": "390px" + }, + "fontFamilies": [ + { + "fontFamily": "-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen-Sans,Ubuntu,Cantarell,\"Helvetica Neue\",sans-serif", + "name": "System Font", + "slug": "system-font" + } + ] + }, + "useRootPaddingAwareAlignments": true + }, + "styles": { + "spacing": { + "blockGap": "var(--wp--preset--spacing--24)", + "padding": { + "bottom": "0", + "left": "var(--wp--custom--site-outer-padding)", + "right": "var(--wp--custom--site-outer-padding)", + "top": "0" + } + }, + "typography": { + "fontFamily": "var(--wp--preset--font-family--system-font)", + "fontSize": "var(--wp--preset--font-size--body)", + "lineHeight": "1.5" + } + }, + "templateParts": [ + { + "area": "header", + "name": "header", + "title": "Site Header" + }, + { + "area": "footer", + "name": "footer", + "title": "Site Footer" + } + ], + "version": 3, + "$schema": "https://schemas.wp.org/wp/6.6/theme.json" +} \ No newline at end of file diff --git a/themes/10up-block-theme/webpack.config.js b/themes/10up-block-theme/webpack.config.js new file mode 100644 index 00000000..f9d2db04 --- /dev/null +++ b/themes/10up-block-theme/webpack.config.js @@ -0,0 +1,55 @@ +const config = require('10up-toolkit/config/webpack.config.js'); +const { sync: glob } = require('fast-glob'); +const { resolve, extname } = require('path'); +const { existsSync } = require('fs'); + +const [scriptConfig, moduleConfig] = config; + +function getBlockStylesheetEntrypoints() { + // get all stylesheets located in the assets/css/blocks directory and subdirectories + const blockStylesheetDirectory = resolve(process.cwd(), './assets/css/blocks').replace(/\\/g, '/'); + + // get all stylesheets in the blocks directory + const stylesheets = glob( + // glob only accepts forward-slashes this is required to make things work on Windows + `${blockStylesheetDirectory}/**/*.css`, + { + absolute: true, + }, + ); + + const additionalEntryPoints = {}; + try { + stylesheets.forEach((filePath) => { + const blockName = filePath + .replace(`${blockStylesheetDirectory}/`, '') + .replace(extname(filePath), ''); + additionalEntryPoints[`autoenqueue/${blockName}`] = resolve(filePath); + }); + } catch (error) { + console.error(error); // eslint-disable-line no-console + } + + return additionalEntryPoints; +} +module.exports = [ + { + ...scriptConfig, + entry: () => { + const additionalEntryPoints = getBlockStylesheetEntrypoints(); + const coreEntryPoints = scriptConfig.entry(); + + const entryPoints = Object.assign(coreEntryPoints, additionalEntryPoints); + + // filter entrypoints to only include those that exist + Object.keys(entryPoints).forEach((key) => { + if (!existsSync(entryPoints[key])) { + delete entryPoints[key]; + } + }); + + return entryPoints; + }, + }, + moduleConfig, +];