commit ed5653a7fccca184288504d71e9a22d1f14af14d Author: Stefan Bethke Date: Thu Jun 13 22:14:05 2024 +0200 Initial version diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1516e93 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +public +resources/_gen diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..dc19131 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "themes/zen"] + path = themes/zen + url = https://github.com/frjo/hugo-theme-zen.git diff --git a/.hugo_build.lock b/.hugo_build.lock new file mode 100644 index 0000000..e69de29 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..de7d867 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,4 @@ +FROM docker.io/nginx + +RUN rm -rf /usr/share/nginx/html && mkdir -p /usr/share/nginx/html +COPY public /usr/share/nginx/html \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..b01e3fd --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +# hacker.tours Web Site + + +## Build locally + +```shell +rm -rf public +hugo +docker build -t hackertours . +docker run -it --rm --name hackertours -p 8888:80 hackertours +``` + +Then open http://localhost:8888 diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 0000000..c6f3fce --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,5 @@ ++++ +title = '{{ replace .File.ContentBaseName "-" " " | title }}' +date = {{ .Date }} +draft = true ++++ diff --git a/assets/sass/_custom.scss b/assets/sass/_custom.scss new file mode 100644 index 0000000..10b66a5 --- /dev/null +++ b/assets/sass/_custom.scss @@ -0,0 +1,7 @@ +table, th, td { + border: 1px solid; + } +th, td { + padding: 3px 6px; + font-variant-numeric: tabular-nums; +} \ No newline at end of file diff --git a/content/de/_index.md b/content/de/_index.md new file mode 100644 index 0000000..69918ff --- /dev/null +++ b/content/de/_index.md @@ -0,0 +1,13 @@ +--- +title: hacker.tours (de) +--- + +## Willkommen bei den Hackertours – euer Anbieter für Sightseeing für Technik-Enthusiasten! + +Bei verschiedenen Chaos-Veranstaltungen organisiert der lokale Erfa/Chaostreff Touren zu interessanten Orten in der Stand und Umgebung. Hier findet ihr Informationen zu aktuellen und früheren Veranstaltungen! + +### 2023 + +* [37C3 Hackertours](https://hackertours.hamburg.ccc.de) + +# News diff --git a/content/de/posts/2024-06-13-hello.md b/content/de/posts/2024-06-13-hello.md new file mode 100644 index 0000000..065925e --- /dev/null +++ b/content/de/posts/2024-06-13-hello.md @@ -0,0 +1,10 @@ +--- +title: 'Mehr Hackertours auf hacker.tours!' +date: 2024-06-13T18:00:00+02:00 +summary: | + Mit der neuen Website schaffen wir eine dauerhafte Heimat für Infos rund um die Touren. +--- + +Mit der neuen Website schaffen wir eine dauerhafte Heimat für Infos rund um die Touren. + +Wenn ihr Hackertours für euren Chaos-Event plant und die hier veröffentlichen wollt, meldet euch einfach bei hackertours at hamburg.ccc.de! diff --git a/content/de/posts/_index.md b/content/de/posts/_index.md new file mode 100644 index 0000000..fee015d --- /dev/null +++ b/content/de/posts/_index.md @@ -0,0 +1,7 @@ +--- +title: News +weight: 1 + +--- + +Aktuelle Informationen zu den Hackertours. \ No newline at end of file diff --git a/content/en/_index.md b/content/en/_index.md new file mode 100644 index 0000000..189ec32 --- /dev/null +++ b/content/en/_index.md @@ -0,0 +1,13 @@ +--- +title: hacker.tours (en) +--- + +## Welcome to Hackertours – your provider of sightseeing tours for technical enthusiasts! + +At various Chaos events the local club organizes tours to interesting places in the city and surroundings. You will find infos about current and past events! + +## 2023 + +* [37C3 Hackertours](https://hackertours.hamburg.ccc.de) + +# News diff --git a/content/en/posts/2024-06-13-hello.md b/content/en/posts/2024-06-13-hello.md new file mode 100644 index 0000000..36cedea --- /dev/null +++ b/content/en/posts/2024-06-13-hello.md @@ -0,0 +1,10 @@ +--- +title: 'More Hackertours on hacker.tours!' +date: 2024-06-13T18:00:00+02:00 +summary: | + With this new web site we create a new permanent home for infos about the tours. +--- + +With this new web site we create a new permanent home for infos about the tours. + +If you are planning tours for your Chaos event, and you would like to publish information here, please get in touch at hackertours at hamburg.ccc.de! diff --git a/content/en/posts/_index.md b/content/en/posts/_index.md new file mode 100644 index 0000000..b326e13 --- /dev/null +++ b/content/en/posts/_index.md @@ -0,0 +1,7 @@ +--- +title: News +weight: 1 + +--- + +Important infos for the tours. \ No newline at end of file diff --git a/hugo.yaml b/hugo.yaml new file mode 100644 index 0000000..46262cd --- /dev/null +++ b/hugo.yaml @@ -0,0 +1,32 @@ +baseURL: 'https://hacker.tours/' +defaultContentLanguage: de +defaultContentLanguageInSubdir: true +#languageCode: 'de-de' +title: 'hacker.tours' +theme: "zen" + +#https://themes.gohugo.io/themes/hugo-theme-zen/#configuration +params: + contact: "hackertours@hamburg.ccc.de" + copyright: "[CCC Hansestadt Hamburg e.V.](https://hamburg.ccc.de) ist nur der Vermittler, für die Touren sind die jeweiligen Veranstalter verantwortlich" + description: "hacker.tours" + footer: "[Impressum & Datenschutz](https://hamburg.ccc.de/imprint/)" + logo: false + mainSections: + - posts + mobileMenu: true + poweredby: false + +languages: + en: + weight: 1 + languageName: "English" + languageCode: "en" + contentDir: content/en + title: "hacker.tours" + de: + weight: 2 + languageName: "Deutsch" + languageCode: "de" + contentDir: content/de + title: "hacker.tours" diff --git a/themes/zen/.editorconfig b/themes/zen/.editorconfig new file mode 100644 index 0000000..dace20e --- /dev/null +++ b/themes/zen/.editorconfig @@ -0,0 +1,20 @@ +# Editor configuration normalization +# @see http://editorconfig.org/ + +# This is the top-most .editorconfig file; do not search in parent directories. +root = true + +# All files. +[*] +end_of_line = LF +indent_style = space +indent_size = 2 +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.{md,mdown,markdown}] +indent_size = 4 +trim_trailing_whitespace = false +insert_final_newline = false +x-soft-wrap-text = true diff --git a/themes/zen/.eslintignore b/themes/zen/.eslintignore new file mode 100644 index 0000000..f0b3557 --- /dev/null +++ b/themes/zen/.eslintignore @@ -0,0 +1,2 @@ +*.compact.js +*.min.js diff --git a/themes/zen/.eslintrc.yaml b/themes/zen/.eslintrc.yaml new file mode 100644 index 0000000..c55568c --- /dev/null +++ b/themes/zen/.eslintrc.yaml @@ -0,0 +1,147 @@ +env: + browser: true + es2021: true +extends: 'eslint:recommended' +plugins: + - template +parserOptions: + ecmaVersion: 12 +globals: + jQuery: true + u: true +rules: + array-bracket-spacing: + - "error" + - never + block-scoped-var: "error" + brace-style: + - "error" + - stroustrup + - allowSingleLine: true + comma-dangle: + - "error" + - never + comma-style: + - "error" + - last + computed-property-spacing: + - "error" + - never + curly: + - "error" + - all + eol-last: "error" + eqeqeq: + - "error" + - smart + guard-for-in: "error" + indent: + - "error" + - 2 + - SwitchCase: 1 + key-spacing: + - "error" + - afterColon: true + beforeColon: false + keyword-spacing: + - "error" + - after: true + before: true + linebreak-style: + - "error" + - unix + lines-around-comment: + - "error" + - afterBlockComment: false + beforeBlockComment: true + max-nested-callbacks: + - "warn" + - 3 + new-parens: "error" + no-array-constructor: "error" + no-caller: "error" + no-catch-shadow: "error" + no-eval: "error" + no-extend-native: "error" + no-extra-bind: "error" + no-extra-parens: + - "error" + - functions + no-implied-eval: "error" + no-iterator: "error" + no-label-var: "error" + no-labels: "error" + no-lone-blocks: "error" + no-loop-func: "error" + no-multi-spaces: "error" + no-multi-str: "error" + no-native-reassign: "error" + no-nested-ternary: "error" + no-new-func: "error" + no-new-object: "error" + no-new-wrappers: "error" + no-octal-escape: "error" + no-process-exit: "error" + no-proto: "error" + no-return-assign: "error" + no-script-url: "error" + no-sequences: "error" + no-shadow-restricted-names: "error" + no-spaced-func: "error" + no-trailing-spaces: "error" + no-undef-init: "error" + no-undefined: "error" + no-unused-expressions: "error" + no-unused-vars: + - "error" + - args: none + vars: all + no-with: "error" + object-curly-spacing: + - "error" + - never + one-var: + - "error" + - never + quote-props: + - "error" + - consistent-as-needed + quotes: + - "error" + - single + - avoid-escape + semi: + - "error" + - always + semi-spacing: + - "error" + - after: true + before: false + space-before-blocks: + - "error" + - always + space-before-function-paren: + - "error" + - anonymous: always + named: never + space-in-parens: + - "error" + - never + space-infix-ops: "error" + space-unary-ops: + - "error" + - nonwords: false + words: true + spaced-comment: + - "error" + - always + strict: "error" + valid-jsdoc: + - "warn" + - prefer: + property: prop + returns: return + requireReturn: false + yoda: + - "error" + - never diff --git a/themes/zen/.github/FUNDING.yaml b/themes/zen/.github/FUNDING.yaml new file mode 100644 index 0000000..7396da1 --- /dev/null +++ b/themes/zen/.github/FUNDING.yaml @@ -0,0 +1,4 @@ +# These are supported funding model platforms +--- +github: frjo +ko_fi: frjo01 diff --git a/themes/zen/.github/release-drafter.yaml b/themes/zen/.github/release-drafter.yaml new file mode 100644 index 0000000..0538678 --- /dev/null +++ b/themes/zen/.github/release-drafter.yaml @@ -0,0 +1,40 @@ +name-template: '$RESOLVED_VERSION' +tag-template: 'v$RESOLVED_VERSION' +version-resolver: + major: + labels: + - 'major' + minor: + labels: + - 'minor' + patch: + labels: + - 'patch' + default: minor +categories: + - title: '🚀 Features' + labels: + - 'feature' + - title: '⚙️ Enhancements' + labels: + - 'enhancement' + - title: '🐛 Bug Fixes' + labels: + - 'fix' + - 'bugfix' + - 'bug' + - title: '🔧 Maintenance' + labels: + - 'dependencies' + - 'maintenance' + - title: '📜 Documentation' + labels: + - 'documentation' +template: | + ## Changes + + $CHANGES + + Contributors to this release: $CONTRIBUTORS + + **Full changelog**: https://github.com/$OWNER/$REPOSITORY/compare/$PREVIOUS_TAG...v$RESOLVED_VERSION diff --git a/themes/zen/.github/workflows/release-drafter.yaml b/themes/zen/.github/workflows/release-drafter.yaml new file mode 100644 index 0000000..2ac643e --- /dev/null +++ b/themes/zen/.github/workflows/release-drafter.yaml @@ -0,0 +1,31 @@ +name: Release Drafter + +on: + push: + # branches to consider in the event; optional, defaults to all + branches: + - main + # pull_request event is required only for autolabeler + pull_request: + # Only following types are handled by the action, but one can default to all as well + types: [opened, reopened, synchronize] + +permissions: + contents: read + +jobs: + update_release_draft: + permissions: + # write permission is required to create a github release + contents: write + # write permission is required for autolabeler + # otherwise, read permission is required at least + pull-requests: write + runs-on: ubuntu-latest + steps: + # Drafts your next Release notes as Pull Requests are merged into "master" + - uses: release-drafter/release-drafter@v5 + with: + config-name: release-drafter.yaml + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/themes/zen/.gitignore b/themes/zen/.gitignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/themes/zen/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/themes/zen/.stylelintignore b/themes/zen/.stylelintignore new file mode 100644 index 0000000..2fd4c3b --- /dev/null +++ b/themes/zen/.stylelintignore @@ -0,0 +1 @@ +libs/ diff --git a/themes/zen/.stylelintrc.yaml b/themes/zen/.stylelintrc.yaml new file mode 100644 index 0000000..1e2a8f4 --- /dev/null +++ b/themes/zen/.stylelintrc.yaml @@ -0,0 +1,94 @@ +plugins: + - stylelint-scss +extends: + - stylelint-config-standard-scss +rules: + at-rule-disallowed-list: + - debug + at-rule-no-unknown: null + at-rule-no-vendor-prefix: true + block-no-empty: null + block-opening-brace-space-before: always + color-hex-case: lower + color-hex-length: short + color-named: never + color-no-hex: true + color-no-invalid-hex: true + declaration-bang-space-after: never + declaration-bang-space-before: always + declaration-block-no-redundant-longhand-properties: null + declaration-block-semicolon-newline-after: always + declaration-block-semicolon-space-before: never + declaration-block-single-line-max-declarations: 1 + declaration-block-trailing-semicolon: always + declaration-colon-space-after: always-single-line + declaration-colon-space-before: never + declaration-empty-line-before: null + declaration-no-important: true + declaration-property-value-disallowed-list: + border: + - none + border-top: + - none + border-right: + - none + border-bottom: + - none + border-left: + - none + font-family-name-quotes: null + function-comma-space-after: always-single-line + function-parentheses-space-inside: never + function-url-quotes: always + indentation: 2 + length-zero-no-unit: true + max-nesting-depth: + - 3 + - ignoreAtRules: + - each + - media + - supports + - include + media-feature-name-no-vendor-prefix: true + media-feature-parentheses-space-inside: never + no-descending-specificity: null + no-missing-end-of-source-newline: true + number-leading-zero: never + number-no-trailing-zeros: true + property-no-unknown: true + property-no-vendor-prefix: true + rule-empty-line-before: + - always-multi-line + - except: + - first-nested + ignore: + - after-comment + scss/at-extend-no-missing-placeholder: true + scss/at-function-pattern: "^[a-z]+([a-z0-9-]+[a-z0-9]+)?$" + scss/at-import-no-partial-leading-underscore: true + scss/at-import-partial-extension-blacklist: + - scss + scss/at-mixin-pattern: "^[a-z]+([a-z0-9-]+[a-z0-9]+)?$" + scss/at-mixin-argumentless-call-parentheses: null + scss/at-rule-no-unknown: true + scss/comment-no-empty: null + scss/dollar-variable-colon-space-after: always + scss/dollar-variable-colon-space-before: never + scss/dollar-variable-pattern: "^[_]?[a-z]+([a-z0-9-]+[a-z0-9]+)?$" + scss/double-slash-comment-empty-line-before: null + scss/no-global-function-names: null + scss/percent-placeholder-pattern: "^[a-z0-9-_]+$" + #scss/selector-no-redundant-nesting-selector: true + selector-class-pattern: + - "^[a-z0-9\\-]+$" + - message: Selector should be written in lowercase with hyphens (selector-class-pattern) + selector-list-comma-newline-after: always + selector-max-compound-selectors: 3 + selector-max-id: 0 + #selector-no-qualifying-type: true + selector-no-vendor-prefix: true + selector-pseudo-element-colon-notation: double + selector-pseudo-element-no-unknown: true + shorthand-property-no-redundant-values: true + string-quotes: single + value-no-vendor-prefix: true diff --git a/themes/zen/LICENSE.txt b/themes/zen/LICENSE.txt new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/themes/zen/LICENSE.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + 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/zen/README.md b/themes/zen/README.md new file mode 100644 index 0000000..cfc2ae1 --- /dev/null +++ b/themes/zen/README.md @@ -0,0 +1,906 @@ +# The Hugo Zen theme + +**Zen** theme strives to be as clean and standard compliant as possible with some neat features. A solid base for your custom [Hugo](https://gohugo.io/) theme. + +It uses HTML5 with a modern CSS grid and flex layout. Care has been taken to produce semantic and accessible code. + +![Lighthouse report](https://raw.githubusercontent.com/frjo/hugo-theme-zen/main/images/lighthouse_report.png) + + +## Demo site + +Take a look at the [Zen demo site](https://zen-demo.xdeb.org/) ([GitHub](https://github.com/frjo/zen-demo)). + +## Quickstart + +Quickstart a new site with the Zen theme by using the [Zen demo repo as a template](https://github.com/frjo/zen-demo/generate). + + +## Table of contents + +* [Version 3.x](#version-3x) +* [Version 2.x](#version-2x) +* [Features](#features) +* [Minimum Hugo version](#minimum-hugo-version) +* [Installation](#installation) +* [Updating](#updating) +* [Run example site](#run-example-site) +* [Performance](#performance) +* [Sites using the Hugo Zen theme](#sites-using-the-hugo-zen-theme) +* [Nice forks of the Zen theme](#nice-forks-of-the-zen-theme) +* [Screenshots](#screenshots) +* [Configuration](#configuration) +* [Customise](#customise) +* [Render hook templates](#render-hook-templates) +* [Multilingual](#multilingual) +* [Search](#search) +* [Contact form](#contact-form) +* [Cookie consent](#cookie-consent) +* [Dates](#dates) +* [Podcast](#podcast) +* [Shortcodes](#shortcodes) +* [Content security policy headers](#Content-security-policy-headers) +* [Choose between using AlpineJS, jQuery or Umbrella JS](#choose-between-using-alpinejs-jquery-or-umbrella-js) +* [Use npm to lint Sass and JavaScript](#use-npm-to-lint-sass-and-javascript) +* [Math typesetting with KaTeX](#math-typesetting-with-katex) +* [Getting help](#getting-help) +* [Credits](#credits) + + +## Version 3.x + +* Implement modern CSS like flex, grid and variables throughout. +* All sass variables now have a css variable version. All styles use the css variable version. +* Defaults to a System-ui font stack (like GitHub and Stack overflow among others). +* New setting `params.internalPagination` to use the Hugo built in pagination template instead of the plain Zen version. +* New setting `params.sassTranspiler`. Defaults to "libsass" but "dartsass" is also supported. +* Split sass "reset" dir into "base" dir and pure "reset" file. +* Added margin top/bottom/block classes, mt--m/mb--m/mtb--m, for all "spacing" variables. +* New sass components: + * cards + * center + * disabled + * flex-group + * flex-inline + * footer + * grid-group + * grid-stack + * icon-inline + * meta + * spacing + * stretch + * tags +* Remove all use of "typey" lib. +* Remove unused/outdated components. +* Only a few small changes to templates. + + +### Upgrade to 3.x + +1. Update your projects `_colors.scss` to add the new colours. +2. Update overridden variables in projects `_extra.scss` so they match changes in themes `_variables.scss`. +3. Replace `@include font-size(s);` with `font-size: var(--fs-s);` etc. +4. Replace `@include typeface(headings);` with `font-family: var(--ff-headings);` etc. +5. Replace sass variables with css variables, e.g. `$zen-gutters` with `var(--gutters)`. + + +## Version 2.x + +* Replaced "normalize" with slimmer and updated "reset". Removed everything for old IE versions. +* Use of css4 variables. Colours are now used like this `var(--color-brand)`. +* The colors, fonts and variables sass files are now in the root sass directory. +* Use `site` instead of `.Site` and `$.Site`. +* Use a default line-height of unitless 1.5. For headers it is set to 1.3. +* Added `_extra.scss` where variables can be overridden. +* The zen-gutters variable is now a calculated value based on window width. +* Added max-line-width for readability, default to 70ch. +* New shortcodes: button, svg, reflink and details. + + +## Features + +* A mobile menu +* AlpineJS 3 +* Analytics with Matomo (Piwik) +* Cookie consent +* Commands for linting of css and js +* Contact form (PHP) +* CSS grid and flex throughout +* HTML5 +* Hugo Pipes for images, js and sass +* jQuery 3 +* Math typesetting with KaTeX +* Micro.blog +* Meta tags and JSON-LD +* Multilingual (i18n) +* Modern CSS reset +* Podcast +* Responsive design +* RSS and JSON feeds with full content +* Search with FlexSearch.js +* Umbrella JS 3 (tiny jQuery replacement, 2.5kB when gzipped) + + +## Minimum Hugo version + +Hugo Extended version 0.93.0 or higher is required. + + +## Installation + +### Hugo module + +First of all, you need to turn your new or existing site into a hugo module. + +From the root of your site: + +```shell +hugo mod init github.com/me/my-site +``` + +Afterwards, declare the `zen` theme module as a dependency of your site: + +From the root of your site: + +```shell +hugo mod get -u github.com/frjo/hugo-theme-zen/v3 +``` + +### Git submodule + +You can download and unpack the theme manually from Github but it's easier to use git to clone the repo. + +From the root of your site: + +```shell +git clone https://github.com/frjo/hugo-theme-zen.git themes/zen +``` + +If you use git to version control your site you can add the zen theme as a submodule. + +From the root of your site: + +```shell +git submodule add https://github.com/frjo/hugo-theme-zen.git themes/zen +``` + + +## Updating + +### Hugo module + +From the root of your site: + +```shell +hugo mod get -u github.com/frjo/hugo-theme-zen +``` + +### Git submodule + +From the root of your site: + +```shell +git submodule update --remote --merge +``` + + +## Run example site + +From the root of `themes/zen/exampleSite`: + +```shell +hugo server --themesDir ../.. +``` + + +## Performance + +Performance should be excellent. + +* Minimal and compliant HTML5 +* Styles 23,2 kB (6,7 kB when gzipped) +* JavaScript 1 kB (with only mobile menu active, 4 Kb with all features active) +* All scripts loaded in head with "defer" +* Optimised for HTTP/2 + +Some performance tools will complain about to many files (js and css files are not concatenated) but with HTTP/2 that can be ignored. + + +## Sites using the Hugo Zen theme + +* [BypassCensorship](https://www.bypasscensorship.org/) (multilingual) +* [Combonetwork development](https://combonet.se/) (multilingual) +* [DevSecOps Talks](https://devsecops.fm) +* [Drejargården](https://www.drejargarden.se/) +* [Helmer Grundström](https://www.helmergrundstrom.se/) +* [xdeb.org](https://xdeb.org/) +* [xdeb.net](https://xdeb.net/) + + +## Nice forks of the Zen theme + +* [DFD-Zen theme for Hugo](https://gitlab.com/danielfdickinson/dfd-hugo-theme-zen) + + +## Screenshots + +![screenshot](https://raw.githubusercontent.com/frjo/hugo-theme-zen/main/images/tn.png) + + +## Configuration + +Configurations parameters for the sites config file, in yaml format. All the "params" are optional. + +```yaml +baseurl: "https://example.org/" +title: "SiteTitle" +theme: "zen" +languageCode: "en-GB" # Set your language code (only needed for none multilingual sites). + +params: + alpine: true # Add AlpineJS, default false. + blogSections: # Sections whose `JSON+LD` in the page `` + - blog # will be `@type: BlogPosting`. + - post # Defaults to a list including only 'post' and 'blog'. + breadcrumbSections: # Sections in which pages will have a `BreadcrumbListing` + - section2 # in the `JSON+LD` in the page's ``. + - section3 # This theme requires Hugo `v0.109.0` or higher to + # generate the `BreadcrumbListing`. + cookieConsent: true # Show cookie consent form, default false. + contact: "info@example.org" + copyright: "This site is licensed under a + [Creative Commons Attribution-ShareAlike 4.0 International + License](https://creativecommons.org/licenses/by-sa/4.0/)." + dateformat: "" # Set the date format, default to "2 January, 2006" + description: "" # Set site description, used in meta tags and JSON-LD + favicon: "" # Relative path to favicon in json feed, no leading slash. + feedlinks: true # Show feed links in the footer. + footer: "A [example.org](https://example.org/) production." + icon: "" # Relative path to icon in json feed and JSON-LD, no leading slash. + image: "" # Relative path to site image in JSON-LD, no leading slash. + imageMaxWidth: "" # Max width for images added via figure shortcode. + internalPagination: true # Use Hugos internal pagination template, default false. + jquery: true # Add jQuery, default false. + languageDir: "" # Set ltr or rtl, defaults to ltr. + logo: false # Turn off the logo, defaults to true. + logoPath: # Relative path to site logo, defaults to "images/logo.png", no leading slash. + logoHeight: # Set logo height, defaults to none. + logoWidth: # Set logo width, defaults to none. + mainSections: # The sections you want to have listed on the front page. + - "section1" # Default to the section with most content if not set. + - "section2" # Set to empty if no section should be listed. + math: true # Turn on math typesetting with KaTeX, default false. + menuInHeader: true # Move the main menu to the header, default false. + microUsername: "" # Your micro.blog username. + mobileMenu: true # Turn on a mobile menu on small screens, default false. + mobileMenuOutline: true # Mobil menu button as outline, default false. + piwikSiteId: # Matomo site id + piwikTrackerUrl: "" # Matomo url, schemaless and no slash on end (example.org/matomo). + plausibleSiteID: "" # Plausible site id/domain. + plausibleTrackerURL: "" # Plausible url, schemaless and no slash on end. Optional, defaults to "plausible.io/…" + poweredby: true # Show powered by hugo in footer + privacyPolicyUrl: "" # If set will add link to cookie consent form. + realfavicongenerator: # If full set of favicons, site manifest etc. exists, default false. + relatedposts: true # Show related posts under a "See also" section, default false. + sassTranspiler: "dartsass"# The Sass transpiler to use, default "libsass". + searchLimit: 20 # Max number of search hits, default 20. + sidebar: true # Show a sidebar to the right, default false. + siteName: false # Hide the site name (visually-hidden), default true. + submitted: true # Show author and date information for a post. + themeColor: # Hex color value, used in meta tags, default "#ffffff". + umbrella: true # Add Umbrella JS, default false. + + podcast: + title: # * Feed title, defaults to site title (iTunes). + description: # * Feed description/summary, defaults to site description (iTunes). + image: # * Feed image, place inside assets directory (iTunes). + category: + name: # * Feed category (iTunes). + subcategories: [] # Feed sub category (iTunes). + explicit: false/true # Feed explicit setting, default to false (iTunes). + author: # Feed author (iTunes). + owner: + name: # Feed owner name (iTunes). + email: # Feed owner e-mail (iTunes). + lang: # Feed language, defaults to site language (iTunes). + block: no/yes # Block the feed from iTunes, default to no (iTunes). + complete: no/yes # Set the feed as complete, defaults to no (iTunes). + type: episodic/serial # Podcast type, defaults to episodic (iTunes). + newfeed: # Are you moving? Set the new feed url here (iTunes). + cdn: # CDN url, no slash on end (https://cdn.example.org). + local: false # Are the audio files local (true) or remote (false), default to true. + preload: none/metadata/auto # Set on the HTML5 audio tag, defaults to "metadata". +``` + +The site will work without setting any of the podcast parameters but your podcast feed will not be accepted by iTunes. At a minimum you need to set the first four, title, description, image and category name. Read more in the podcast section below. + + +## Customise + + +### Front page + +This is a part that almost everyone will like to customise in some manner. The template file is `layouts/index.html`. By default it will include any text you put in `content/_index.md` and below that list the posts in "mainSections" as summaries. + +If you do not specify any sections in the "mainSections" param (see configuration above) it will list the section with the most posts. If you do not want to list anything, set it but leave the value empty. + + +### Colours and variables + +This is another part that almost everyone will like to customise. + +They are found in the theme `assets/sass/_colors.scss` and `assets/sass/_variables.scss` files. Copy them to the root `assets/sass/` directory to set your own values. + +If you only want to override a few variables copy the theme `assets/sass/_extra.scss` to the root `assets/sass/_extra.scss` and set the new values there. Anything in the extra file will override values in the variables file. + +Examples of variables found in `assets/sass/_variables.scss`: + +* $base-font-size: 18px; +* $max-content-width: 960px; +* $max-line-width: 70ch; + + +### Logo + +Place your logo at `static/images/logo.png`. If you don't provide a logo, then the default theme logo will be used. + + +### Favicons + +Upload your image to [RealFaviconGenerator](https://realfavicongenerator.net/) then copy-paste the generated favicon files under `static`. + +Then set the "realfavicongenerator" param to true to add the needed meta tags. Also good to set the "themeColor" param to correct colour. + + +### Head and footer partials + +If you create partials named `head.html` and/or `footer.html` they will be used. They do not exist in the theme but are supported as a convenience. + +Content in the "head" partial will be added to the end of the "head" tag, perhaps some extra css or javascript. + +Content in the "footer" partial will replace all the default content in the "footer" tag. + + +### Layouts + +To customise a layout included in the zen theme, copy it to the root layout directory and edit it there. Make sure to maintain the directory structure inside the layouts directory. + +Add any new layouts to the root layout directory as well. This way they will not be overwritten when updating the theme. + + +#### Menu and sidebar layouts + +If a Hugo main menu is defined (.Sites.Menu.main) the menu template will use it to build a navigation menu. If not, the template will automatically add entries for the home page, each root page and each section, in that order. + +If the default sidebar is activated it will display each section with all its pages listed below. + +They are set up in `layouts/partials/menu.html`, `layouts/partials/mobilmenu.html` and `layouts/partials/sidebar.html`. + + +### CSS grid for layout + +Modern CSS grid is the easiest and cleanest way to layout your pages. + +The CSS grid layout are in `assets/sass/layouts/_layouts.scss`. A lot can be done by just reordering "grid-template-rows". + + +### Other styles and scripts + +Styles and scripts are processed with Hugo pipes that was added in Hugo 0.46. + +To customise a js or sass file, copy it to the root assets directory and edit it there. Make sure to maintain the directory structure inside the assets/sass directory. + +There is an `assets/sass/_custom.scss` file meant for your custom styles. Copy it to the root `assets/sass/_custom.scss` to use it. + +The default styles in `assets/sass/_zen.scss` are boring but functional. You can easily override them completely by placing an empty file named "_zen.scss" in root assets/sass directory. + +The sass files are by default built for production, compressed with fingerprint. + +By setting the Hugo environment variable to "development" (default when running `hugo server`) they will instead be nested with sourcemaps. + + +## Render hook templates + +### Add anchor links to headings + +Example render hook template for headings that will add anchor links. To activate it copy the file `~/theme/zen/layouts/_default/_markup/render-heading.html.example` to `layouts/_default/_markup/render-heading.html`. + +### Process Markdown images + +Example render hook that process images in the same way as the "img" shortcode. See top of the file for settings to adjust it to your needs. To activate it copy the file `~/theme/zen/layouts/_default/_markup/render-image.html.example` to `layouts/_default/_markup/render-image.html`. + +### Make external links open in a new tab. + +Example render hook to rewrite external links so they open in a new tab. To activate it copy the file `~/theme/zen/layouts/_default/_markup/render-link.html.example` to `layouts/_default/_markup/render-link.html`. + +## Multilingual + +A language selector will be included on sites with more than one language. Add `languageName` to your language configuration, this is what will be displayed in the selector. + +The language selector will link to a translation of the current page if it exist and to the front page if it does not. + +For "rtl" languages add a `languageDirection` parameter to the language configuration. If not added it will default to "ltr". + +Add a `languageCode` parameter to each language as well, that is used to set the correct language attribute in the `html` tag and in feeds. The root `languageCode` is then not needed. If not set the language key (e.g. "en") will be used. + +```yaml +languages: + sv: + weight: 1 + languageName: "Svenska" + languageCode: "sv-SE" + en: + weight: 2 + languageName: "English" + languageCode: "en-GB" + ar: + weight: 3 + languageName: "العربية" + languageDirection: "rtl" + languageCode: "ar" +``` + +The Zen theme templates has some strings that needs translation, e.g. "Home" and "Menu". Many translations are included and you can easily add more to the `i18n` site directory. All but English and Swedish are contributed by users, thanks! + +* Arabic +* Danish +* English +* Finnish +* French +* German +* Hebrew +* Indonesian +* Norwegian +* Portuguese +* Serbian +* Swahili +* Swedish + + +### Non English site + +If you want to have a site in another language than English but do not need multiple languages the following settings are needed. + +Set `defaultContentLanguage` to your language code, otherwise it will default to "en" . Also set `languageCode` so browsers are informed of what language the site is in. + +Here how it looks for a site in Swedish. + +```yaml +languageCode: "sv-SE" +defaultContentLanguage: "sv" +``` + + +## Search + +Built in integration with the excellent [FlexSearch.js](https://github.com/nextapps-de/flexsearch). A fast full text search that reads a JSON file created by Hugo to index and search the site. + +Here is the three steps needed to create a search page. + +1. Add a new output format in your configuration file. + ```yaml + outputFormats: + SearchIndex: + mediaType: "application/json" + baseName: "searchindex" + isPlainText: true + notAlternative: true + ``` +2. Add the new output format to output setting for "home". + ```yaml + outputs: + home: ["HTML", "SearchIndex", "[other formats you need]"] + ``` +3. Add the shortcode `{{< search >}}` to a page. The search and flexsearch js files gets loaded automatically on pages that use the shortcode. + +Your search page will now have a search field where all the posts of the site can be searched. + +The only setting is "searchLimit" that defaults to 20. + + +## Contact form + +If your server support php with the mail() command (very common) you can use the included contact form feature to get a contact form for your site. + +1. Copy the file `themes/zen/php/contact.php.example` to `static/php/contact.php`. +2. Edit the contact.php file so it has your own e-mail address. You may also change the mail subject prefix. +3. Add the shortcode `{{< contact >}}` to a page. The contact.js file gets loaded automatically on pages that use the shortcode. + +If you have a SPF record for your domain, make sure the web server is listed or other mail server may mark the mail as spam. + +Two types of spam protection are implemented. The form can only be posted after the user moved the mouse or pressed the tab or enter key. The form has a "honeypot" field that is invisible to humans but not to most spam boots. If that field is filled in the mail will not be sent. + +Form validation is handled by HTML5 and there is some CSS to make it look nice. + +Javascript is used for spam protection and to display error/success messages. + +## Cookie consent + +Allow users to opt-in to tracking. Matomo and Google analytic are supported out of the box. + +Set `cookieConsent` param to true to activate. Also set `privacyPolicyUrl` to include a link to your privacy policy in the cookieconsent dialog. + +See `assets/js/tracking.js` for example how to implement it for other cookies. + +The users choice is stored in localStorage item "cookieconsent". + +It it recommended to add a link or button to allow users to change their choice. Adding the class "clearcookieconsent" is all that is needed. + +```html + +Cookie settings +``` + +When a user clickes the button/link the localStorage item "cookieconsent" is cleared and the cookieconsent dialog is shown again. + +![Lighthouse report](https://raw.githubusercontent.com/frjo/hugo-theme-zen/main/images/cookieconsent.png) + + +## Dates + +If "lastmod" is set in the frontmatter on a post that value will be used in the "submitted" section. If not, "date" is used. + +With "lastmod" set a date section will also appear at the bottom of post telling the reader the created and modification dates. + + +## Podcast + +The Zen theme supports podcasting. + +* RSS feed with all the needed iTunes tags. +* Single and full layouts with HTML 5 audio player. +* Archetype with required parameters. + +Here follow all the possible podcast frontmatter parameters. Only the first two is mandatory and are in the podcast archetype. + +```yaml +podcast: + mp3: # * The path to the mp3 file, + duration: # * Episode duration, e.g 1:04:02 (iTunes). + image: + src: # Episode image src, place inside the assets directory (iTunes). + alt: # Alt text for the image, explain what is on the image. + width: # Image width in the article, defaults to 250px. + class: # Image wrapper class. + explicit: true/false # Episode explicit setting, default to false (iTunes). + episode: # Episode number (iTunes). + episodeType: full/trailer/bonus # Episode type, defaults to full (iTunes). + season: # Episode season (iTunes). + block: # Block the episode from iTunes, default to no (iTunes). +``` + +* [Apple Podcasts categories](https://help.apple.com/itc/podcasts_connect/#/itc9267a2f12) +* [Apple - A podcaster’s guide to RSS](https://help.apple.com/itc/podcasts_connect/#/itcb54353390) + + +## Shortcodes + +### Audio and Video + +Support for files in global assets directory, static directory and page resources. + +``` +{{< audio src="/audio/audio.mp3" class="something" >}} + +{{< video src="/video/video.mp4" poster="/images/poster.jpeg" class="something" >}} +``` + +Possible parameters are: + +* autoplay (only video) +* caption +* class +* loop (only video) +* poster (only video) +* preload (none/metadata/auto, default metadata) +* src +* width (only video) + +The audio and video tags will be wrapped with a figure tag. + + +### Button + +Creates a link with the class "button". If "newtab" is true the link will open in a new tab. + +Possible parameters are: + +* class +* newtab +* src +* text + + +### Clear + +Break float. + +``` +{{< figure src="/images/image.jpg" class="right" >}} + +blablabla # Displayed left of the image. + +{{< clear >}} + +blablabla # Displayed below of the image. +``` + + +### Contact + +Insert a html5 contact form, [see more above](#contact-form). + +``` +{{< contact >}} +``` + +### Details and Summary + +Insert a html5 contact form, [see more above](#contact-form). + +``` +{{< details summary="The summary text here" >}} +The details text here. + +It can be long and **contain** markdown. +{{< /details >}} +``` + +Possible parameters are: + +* class +* summary + + +### Figure and Img + +Zen comes with a improved version of the built in "figure" shortcut and a very similar "img" shortcode. Support for images in global assets directory, static directory and page resources. + +``` +{{< figure src="/images/image.jpg" alt="Example image." caption="Lorem ipsum dolor sit amet." >}} + +{{< img src="/images/image.jpg" alt="Example image." size="600x" >}} +``` + + +Possible parameters are: + +* alt +* attr (only figure) +* attrlink (only figure) +* caption (only figure) +* class +* height +* link +* size (not for images in static directory) +* srcset (not for images in static directory) +* src +* title (only figure) +* width + +Only "src" is none optional but you really should set "alt" as well. + +* You can set a max width for images with parameter "imageMaxWidth". Only used for images where size, width and height is not set. +* If width and height is not set the real dimensions of the image will be used. +* If only width or only height is set the other value will be proportionally calculated. + + +### File + +Creates a link to a file in global assets directory, static directory and page resources. + +Possible parameters are: + +* class +* newtab (default false) +* src +* text + + +### Reflink + +Creates a link to an internal page. + +``` +{{< reflink "some-page.md" >}} +``` + +This will output: + +```html +The title of the page +``` + + +### SVG + +SVG shortcode with inline support. Support for images in global assets directory, static directory and page resources. + +``` +{{< svg src="/images/image.svg" alt="Example image." caption="Lorem ipsum dolor sit amet." >}} + +{{< img src="/images/image.svg" inline="true" >}} +``` + +Possible parameters are: + +* alt (not for inline) +* caption +* class +* height (not for inline) +* inline +* link +* src +* width (not for inline) + + +### Search + +Add a search form for the site, [see more above](#search). + +``` +{{< search >}} +``` + + +### Wrapper + +A simple, but useful, shortcode to wrap content in a div with a class. The content will be run through "markdownify". + +``` +{{< wrapper class-name-you-want >}} +The **content** that should be wrapped. + +Some more content. +{{< /wrapper >}} +``` + +This will produce: + +```html +
+

The content that should be wrapped.

+ +

Some more content.

+
+``` + +If the content should be left untouched add "nomarkdown" after the class name. + +``` +{{< wrapper class-name-you-want nomarkdown >}} +The **content** that should be wrapped. + +Some more content. +{{< /wrapper >}} +``` + +This will produce: + +```html +
+The **content** that should be wrapped. Some more content. +
+``` + + +## Content security policy headers + +Includes tracking code for Matomo or Google in a way that supports Content security policy headers. Read more in my blog post [Content security policy headers when using Matomo or Google analytics](https://xdeb.org/post/2020/01/14/content-security-policy-headers-when-using-matomo-or-google-analytics/). + +## Choose between using AlpineJS, jQuery or Umbrella JS + +To add AlpineJS, jQuery or Umbrella JS, set the related parameter to true in the configuration file or in the front matter of specific pages. No problem having them loaded on the same page. + +Personally I use vanilla JS nowadays and I'm playing around with AlpineJS. + +This is the way I construct my JavaScript files. + +**Vanilla JS:** + +```js +(function () { + + 'use strict'; + + // Add a js class to the html-tag when JavsScript is active. + document.querySelector('html').classList.replace('nojs', 'js'); + +})(); +``` + + +**Umbrella JS:** + +```js +(function ($) { + + 'use strict'; + + // Add your code here. + $('html').removeClass('nojs').addClass('js'); + +})(u); +``` + +**jQuery:** + +```js +(function ($) { + + 'use strict'; + + // Add your code here. + $('html').removeClass('nojs').addClass('js'); + +})(jQuery); +``` + + +## Use npm to lint Sass and JavaScript + +* Lint your Sass using stylelint. +* Lint your JavaScript using eslint. +* Can lint files in the theme as well as the project assets directory. + +Set up your front-end development build tools: + +1. Install Node.js and npm, the Node.js package manager. +2. The package.json file in your new sub-theme contains the versions of all the +Node.js software you need. To install them run: + + npm install + +3. Run the following commands to lint your theme and projects Sass and JavaScript code. + + npm run lint-theme + npm run lint-project + nmp run lint (project + theme) + + +## Math typesetting with KaTeX + +Download the latest release from . Unpack and place the resulting "katex" directory in the root `static` directory. + +The resulting path should be `static/katex`. Then set the `math` param to "true" and write some math to be typeset. + +Wrap inline math in single "$": + +~~~~ +Lorem $E=mc^2$ ipsum +~~~~ + +and block math in double "$$": + +~~~~ +$$ +[ \int_0^1 \frac{dx}{e^x} = \frac{e-1}{e} ] +$$ +~~~~ + +Markdown rendering will in some instances mess with the math. To avoid this use the math shortcode for inline math: + +~~~~ +Lorem {{< math >}}E=mc^2{{< /math >}} ipsum +~~~~ + + and math codeblocks for block math: + +`~~~~ math` +`[ \int_0^1 \frac{dx}{e^x} = \frac{e-1}{e} ]` +`~~~~` + + + +## Getting help + +If you run into an issue that isn't answered by this documentation or the [`exampleSite`](https://github.com/frjo/hugo-theme-zen/tree/main/exampleSite), then visit the [Hugo forum](https://discourse.gohugo.io/). The folks there are helpful and friendly. **Before** asking your question, be sure to read the [requesting help guidelines](https://discourse.gohugo.io/t/requesting-help/9132). Feel free to tag me in your question, my forum username is [@frjo](https://discourse.gohugo.io/u/frjo/summary). + + +## Credits + +This is originally a port of the [Zen](https://www.drupal.org/project/zen) theme by [JohnAlbin](https://www.drupal.org/u/johnalbin), a very popular base theme for Drupal. + +Thanks to the [Cupper Hugo theme](https://github.com/zwbetz-gh/cupper-hugo-theme/) for a really good Readme, have copied a lot from it. + +Icons from [tabler/tabler-icons: A set of over 850 free MIT-licensed high-quality SVG icons for you to use in your web projects.](https://github.com/tabler/tabler-icons) and [Language Icon](http://www.languageicon.org/). diff --git a/themes/zen/archetypes/default.md b/themes/zen/archetypes/default.md new file mode 100644 index 0000000..e9df79d --- /dev/null +++ b/themes/zen/archetypes/default.md @@ -0,0 +1,7 @@ +--- +title: "{{ replace .TranslationBaseName "-" " " | humanize }}" +description: +date: {{ .Date }} +lastmod: {{ .Date }} + +--- \ No newline at end of file diff --git a/themes/zen/archetypes/micro.md b/themes/zen/archetypes/micro.md new file mode 100644 index 0000000..efbf127 --- /dev/null +++ b/themes/zen/archetypes/micro.md @@ -0,0 +1,5 @@ +--- +title: "{{ replace .TranslationBaseName "-" " " | humanize }}" +date: {{ .Date }} + +--- \ No newline at end of file diff --git a/themes/zen/archetypes/podcast.md b/themes/zen/archetypes/podcast.md new file mode 100644 index 0000000..f65a8bb --- /dev/null +++ b/themes/zen/archetypes/podcast.md @@ -0,0 +1,9 @@ +--- +title: "{{ replace .TranslationBaseName "-" " " | humanize }}" +date: {{ .Date }} +description: +podcast: + mp3: + duration: + +--- \ No newline at end of file diff --git a/themes/zen/assets/js/contact.js b/themes/zen/assets/js/contact.js new file mode 100644 index 0000000..025263e --- /dev/null +++ b/themes/zen/assets/js/contact.js @@ -0,0 +1,49 @@ +/** + * @file + * A JavaScript file for the contact form. + */ + +(function () { + + 'use strict'; + + const form = document.querySelector('.contact-form'); + const button = form.querySelector('[type=submit]'); + const action = form.getAttribute('data-protect'); + + const activateForm = function () { + form.setAttribute('action', action); + button.removeAttribute('disabled'); + }; + + // Display the hidden form. + form.classList.remove('hidden'); + + // Wait for a mouse to move, indicating they are human. + document.body.addEventListener('mousemove', activateForm, {once: true}); + // Wait for a touch move event, indicating that they are human. + document.body.addEventListener('touchmove', activateForm, {once: true}); + // A tab or enter key pressed can also indicate they are human. + document.body.addEventListener('keydown', function (e) { + if ((e.key === 'Tab') || (e.key === 'Enter')) { + activateForm(); + } + }, {once: true}); + + // Mark the form as submitted. + button.addEventListener('click', () => form.classList.add('js-submitted')); + + // Display messages. + if (location.search.substring(1) !== '') { + switch (location.search.substring(1)) { + case 'submitted': + document.querySelector('.contact-submitted').classList.remove('hidden'); + break; + + case 'error': + document.querySelector('.contact-error').classList.remove('hidden'); + break; + } + } + +})(); diff --git a/themes/zen/assets/js/cookieconsent.js b/themes/zen/assets/js/cookieconsent.js new file mode 100644 index 0000000..835a275 --- /dev/null +++ b/themes/zen/assets/js/cookieconsent.js @@ -0,0 +1,44 @@ +/** + * @file + * A JavaScript file for cookie consent. + */ + +(function () { + + 'use strict'; + + const cookiebanner = document.querySelector('.cookieconsent'); + const cookieconsent = localStorage.getItem('cookieconsent'); + + if (cookiebanner && !cookieconsent) { + cookiebanner.classList.remove('hidden'); + cookiebanner.classList.add('js-cookieconsent-open'); + } + + const cookie_buttons = document.querySelectorAll('button[data-consent]'); + cookie_buttons.forEach(function (button) { + button.addEventListener('click', function () { + if (button.getAttribute('data-consent') === 'true') { + localStorage.setItem('cookieconsent', 'accept'); + } + else { + localStorage.setItem('cookieconsent', 'decline'); + } + cookiebanner.classList.remove('js-cookieconsent-open'); + cookiebanner.classList.add('hidden'); + }); + }); + + const clear_buttons = document.querySelectorAll('.clearcookieconsent'); + clear_buttons.forEach(function (button) { + button.addEventListener('click', function (e) { + e.preventDefault(); + if (cookiebanner && cookieconsent) { + localStorage.removeItem('cookieconsent'); + cookiebanner.classList.remove('hidden'); + cookiebanner.classList.add('js-cookieconsent-open'); + } + }); + }); + +})(); diff --git a/themes/zen/assets/js/math.js b/themes/zen/assets/js/math.js new file mode 100644 index 0000000..5cd4109 --- /dev/null +++ b/themes/zen/assets/js/math.js @@ -0,0 +1,21 @@ +/** + * @file + * A JavaScript file for Katex auto renderer. + */ + +(function () { + + 'use strict'; + + document.addEventListener('DOMContentLoaded', function () { + // eslint-disable-next-line no-undef + renderMathInElement(document.body, { + delimiters: [ + {left: '$$', right: '$$', display: true}, + {left: '$', right: '$', display: false} + ], + throwOnError: false + }); + }); + +})(); diff --git a/themes/zen/assets/js/mobile.js b/themes/zen/assets/js/mobile.js new file mode 100644 index 0000000..f99be6b --- /dev/null +++ b/themes/zen/assets/js/mobile.js @@ -0,0 +1,52 @@ +/** + * @file + * A JavaScript file for the mobile menu. + */ + +(function () { + + 'use strict'; + + const nav = document.querySelector('.mobile-nav'); + const sheet = document.querySelector('.mobile-nav__sheet'); + const toggle = document.querySelector('.mobile-nav__toggle'); + + function navopen() { + nav.classList.add('js-nav-open'); + sheet.setAttribute('aria-hidden', 'false'); + toggle.setAttribute('aria-expanded', 'true'); + } + + function navclose() { + nav.classList.remove('js-nav-open'); + sheet.setAttribute('aria-hidden', 'true'); + toggle.setAttribute('aria-expanded', 'false'); + } + + // Toggle the mobile nav sheet. + const toggles = document.querySelectorAll('.mobile-nav__cover, .mobile-nav__toggle'); + toggles.forEach(function (toggle) { + toggle.addEventListener('click', function (e) { + e.preventDefault(); + if (nav.classList.contains('js-nav-open')) { + navclose(); + } + else { + navopen(); + } + }); + }); + + // Close the nav sheet after click (needed for anchor links). + const links = document.querySelectorAll('.mobile-nav__sheet a'); + links.forEach(function (link) { + link.addEventListener('click', function (e) { + navclose(); + }); + }); + + // Move focus back to button efter user tab out of last link. + const lastlink = [].slice.call(links).pop(); + lastlink.addEventListener('blur', () => toggle.focus()); + +})(); diff --git a/themes/zen/assets/js/script-early.js b/themes/zen/assets/js/script-early.js new file mode 100644 index 0000000..0f486f5 --- /dev/null +++ b/themes/zen/assets/js/script-early.js @@ -0,0 +1,13 @@ +/** + * @file + * A JavaScript file for the theme. Runs first, before other things have loaded. + */ + +(function () { + + 'use strict'; + + // Add a js class to the html-tag when JavsScript is active. + document.querySelector('html').classList.replace('nojs', 'js'); + +})(); diff --git a/themes/zen/assets/js/script.js b/themes/zen/assets/js/script.js new file mode 100644 index 0000000..78d2859 --- /dev/null +++ b/themes/zen/assets/js/script.js @@ -0,0 +1,12 @@ +/** + * @file + * A JavaScript file for the theme. + */ + +(function () { + + 'use strict'; + + // Place your code here. + +})(); diff --git a/themes/zen/assets/js/search.js b/themes/zen/assets/js/search.js new file mode 100644 index 0000000..4474026 --- /dev/null +++ b/themes/zen/assets/js/search.js @@ -0,0 +1,92 @@ +/** + * @file + * A JavaScript file for flexsearch. + */ + +/* eslint-disable */ +import * as params from '@params'; +/* eslint-enable */ + +/* eslint-disable no-undef, guard-for-in */ +(function () { + + 'use strict'; + + const index = new FlexSearch.Document({ + document: { + id: 'id', + index: ['title', 'tags', 'content', 'date'], + store: ['title', 'summary', 'date', 'permalink'] + }, + tokenize: 'forward' + }); + + function showResults(items) { + const template = document.querySelector('template').content; + const fragment = document.createDocumentFragment(); + + const results = document.querySelector('.search-results'); + results.textContent = ''; + + for (const id in items) { + const item = items[id]; + const result = template.cloneNode(true); + const a = result.querySelector('a'); + const time = result.querySelector('time'); + const content = result.querySelector('.content'); + a.innerHTML = item.title; + a.href = item.permalink; + time.innerText = item.date; + content.innerHTML = item.summary; + fragment.appendChild(result); + } + results.appendChild(fragment); + } + + function doSearch() { + const query = document.querySelector('.search-text').value.trim(); + const results = index.search({ + query: query, + enrich: true, + limit: params.searchLimit + }); + const items = {}; + results.forEach(function (result) { + result.result.forEach(function (r) { + items[r.id] = r.doc; + }); + }); + showResults(items); + } + + function enableUI() { + const searchform = document.querySelector('.search-form'); + searchform.addEventListener('submit', function (e) { + e.preventDefault(); + doSearch(); + }); + searchform.addEventListener('input', function () { + doSearch(); + }); + document.querySelector('.search-loading').classList.add('hidden'); + document.querySelector('.search-input').classList.remove('hidden'); + document.querySelector('.search-text').focus(); + } + + function buildIndex() { + const searchindex = params.basePath + 'searchindex.json'; + document.querySelector('.search-loading').classList.remove('hidden'); + fetch(searchindex) + .then(function (response) { + return response.json(); + }) + .then(function (data) { + data.forEach(function (item) { + index.add(item); + }); + }); + } + + buildIndex(); + enableUI(); +})(); diff --git a/themes/zen/assets/js/tables.js b/themes/zen/assets/js/tables.js new file mode 100644 index 0000000..282c248 --- /dev/null +++ b/themes/zen/assets/js/tables.js @@ -0,0 +1,29 @@ +/** + * @file + * A JavaScript file for responsive tables. + */ + +/* eslint-disable max-nested-callbacks */ +(function () { + + 'use strict'; + + const tables = document.querySelectorAll('.responsive-table'); + + tables.forEach(function (table) { + const headers = table.querySelectorAll('th'); + const rows = table.querySelectorAll('tbody tr'); + + rows.forEach(function (row) { + const cells = row.querySelectorAll('td'); + + cells.forEach(function (cell, i) { + cell.setAttribute('role','cell'); + if (headers[i].innerText) { + cell.setAttribute('aria-label', headers[i].innerText); + } + }); + }); + }); + +})(); diff --git a/themes/zen/assets/js/tracking.js b/themes/zen/assets/js/tracking.js new file mode 100644 index 0000000..de00fde --- /dev/null +++ b/themes/zen/assets/js/tracking.js @@ -0,0 +1,34 @@ +/** + * @file + * A JavaScript file for analytic tracking. + */ + +/* eslint-disable */ +import * as params from '@params'; +/* eslint-enable */ + +/* eslint-disable no-undef */ +const cookiebanner = params.cookieConsent; +const cookieconsent = localStorage.getItem('cookieconsent'); +const idSite = params.piwikSiteID; +const matomoTrackingApiUrl = 'https://' + params.piwikTrackerUrl + '/matomo.php'; +const googleAnalytics = params.GoogleAnalytics; + +if (idSite) { + let _paq = window._paq = window._paq || []; + + if (cookiebanner) { + _paq.push(['requireConsent']); + } + _paq.push(['setTrackerUrl', matomoTrackingApiUrl]); + _paq.push(['setSiteId', idSite]); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + if (cookiebanner && cookieconsent === 'accept') { + _paq.push(['setConsentGiven']); + } +} + +if (googleAnalytics && cookiebanner && cookieconsent === 'decline') { + window['ga-disable-' + googleAnalytics] = true; +} diff --git a/themes/zen/assets/libs/alpine.min.js b/themes/zen/assets/libs/alpine.min.js new file mode 100644 index 0000000..ff881a3 --- /dev/null +++ b/themes/zen/assets/libs/alpine.min.js @@ -0,0 +1,6 @@ +/* Alpine.js 3.11.1 alpinejs.dev */ +(()=>{var Ye=!1,Ze=!1,V=[];function Ft(e){mn(e)}function mn(e){V.includes(e)||V.push(e),hn()}function xe(e){let t=V.indexOf(e);t!==-1&&V.splice(t,1)}function hn(){!Ze&&!Ye&&(Ye=!0,queueMicrotask(_n))}function _n(){Ye=!1,Ze=!0;for(let e=0;ee.effect(t,{scheduler:r=>{Xe?Ft(r):r()}}),Qe=e.raw}function et(e){I=e}function zt(e){let t=()=>{};return[n=>{let i=I(n);return e._x_effects||(e._x_effects=new Set,e._x_runEffects=()=>{e._x_effects.forEach(o=>o())}),e._x_effects.add(i),t=()=>{i!==void 0&&(e._x_effects.delete(i),$(i))},i},()=>{t()}]}var Vt=[],Ht=[],qt=[];function Ut(e){qt.push(e)}function ye(e,t){typeof t=="function"?(e._x_cleanups||(e._x_cleanups=[]),e._x_cleanups.push(t)):(t=e,Ht.push(t))}function Wt(e){Vt.push(e)}function Gt(e,t,r){e._x_attributeCleanups||(e._x_attributeCleanups={}),e._x_attributeCleanups[t]||(e._x_attributeCleanups[t]=[]),e._x_attributeCleanups[t].push(r)}function tt(e,t){!e._x_attributeCleanups||Object.entries(e._x_attributeCleanups).forEach(([r,n])=>{(t===void 0||t.includes(r))&&(n.forEach(i=>i()),delete e._x_attributeCleanups[r])})}var nt=new MutationObserver(rt),it=!1;function ie(){nt.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0}),it=!0}function ot(){gn(),nt.disconnect(),it=!1}var oe=[],st=!1;function gn(){oe=oe.concat(nt.takeRecords()),oe.length&&!st&&(st=!0,queueMicrotask(()=>{xn(),st=!1}))}function xn(){rt(oe),oe.length=0}function h(e){if(!it)return e();ot();let t=e();return ie(),t}var at=!1,be=[];function Jt(){at=!0}function Yt(){at=!1,rt(be),be=[]}function rt(e){if(at){be=be.concat(e);return}let t=[],r=[],n=new Map,i=new Map;for(let o=0;os.nodeType===1&&t.push(s)),e[o].removedNodes.forEach(s=>s.nodeType===1&&r.push(s))),e[o].type==="attributes")){let s=e[o].target,a=e[o].attributeName,c=e[o].oldValue,l=()=>{n.has(s)||n.set(s,[]),n.get(s).push({name:a,value:s.getAttribute(a)})},u=()=>{i.has(s)||i.set(s,[]),i.get(s).push(a)};s.hasAttribute(a)&&c===null?l():s.hasAttribute(a)?(u(),l()):u()}i.forEach((o,s)=>{tt(s,o)}),n.forEach((o,s)=>{Vt.forEach(a=>a(s,o))});for(let o of r)if(!t.includes(o)&&(Ht.forEach(s=>s(o)),o._x_cleanups))for(;o._x_cleanups.length;)o._x_cleanups.pop()();t.forEach(o=>{o._x_ignoreSelf=!0,o._x_ignore=!0});for(let o of t)r.includes(o)||!o.isConnected||(delete o._x_ignoreSelf,delete o._x_ignore,qt.forEach(s=>s(o)),o._x_ignore=!0,o._x_ignoreSelf=!0);t.forEach(o=>{delete o._x_ignoreSelf,delete o._x_ignore}),t=null,r=null,n=null,i=null}function ve(e){return j(L(e))}function M(e,t,r){return e._x_dataStack=[t,...L(r||e)],()=>{e._x_dataStack=e._x_dataStack.filter(n=>n!==t)}}function ct(e,t){let r=e._x_dataStack[0];Object.entries(t).forEach(([n,i])=>{r[n]=i})}function L(e){return e._x_dataStack?e._x_dataStack:typeof ShadowRoot=="function"&&e instanceof ShadowRoot?L(e.host):e.parentNode?L(e.parentNode):[]}function j(e){let t=new Proxy({},{ownKeys:()=>Array.from(new Set(e.flatMap(r=>Object.keys(r)))),has:(r,n)=>e.some(i=>i.hasOwnProperty(n)),get:(r,n)=>(e.find(i=>{if(i.hasOwnProperty(n)){let o=Object.getOwnPropertyDescriptor(i,n);if(o.get&&o.get._x_alreadyBound||o.set&&o.set._x_alreadyBound)return!0;if((o.get||o.set)&&o.enumerable){let s=o.get,a=o.set,c=o;s=s&&s.bind(t),a=a&&a.bind(t),s&&(s._x_alreadyBound=!0),a&&(a._x_alreadyBound=!0),Object.defineProperty(i,n,{...c,get:s,set:a})}return!0}return!1})||{})[n],set:(r,n,i)=>{let o=e.find(s=>s.hasOwnProperty(n));return o?o[n]=i:e[e.length-1][n]=i,!0}});return t}function we(e){let t=n=>typeof n=="object"&&!Array.isArray(n)&&n!==null,r=(n,i="")=>{Object.entries(Object.getOwnPropertyDescriptors(n)).forEach(([o,{value:s,enumerable:a}])=>{if(a===!1||s===void 0)return;let c=i===""?o:`${i}.${o}`;typeof s=="object"&&s!==null&&s._x_interceptor?n[o]=s.initialize(e,c,o):t(s)&&s!==n&&!(s instanceof Element)&&r(s,c)})};return r(e)}function Ee(e,t=()=>{}){let r={initialValue:void 0,_x_interceptor:!0,initialize(n,i,o){return e(this.initialValue,()=>yn(n,i),s=>lt(n,i,s),i,o)}};return t(r),n=>{if(typeof n=="object"&&n!==null&&n._x_interceptor){let i=r.initialize.bind(r);r.initialize=(o,s,a)=>{let c=n.initialize(o,s,a);return r.initialValue=c,i(o,s,a)}}else r.initialValue=n;return r}}function yn(e,t){return t.split(".").reduce((r,n)=>r[n],e)}function lt(e,t,r){if(typeof t=="string"&&(t=t.split(".")),t.length===1)e[t[0]]=r;else{if(t.length===0)throw error;return e[t[0]]||(e[t[0]]={}),lt(e[t[0]],t.slice(1),r)}}var Zt={};function y(e,t){Zt[e]=t}function se(e,t){return Object.entries(Zt).forEach(([r,n])=>{Object.defineProperty(e,`$${r}`,{get(){let[i,o]=ut(t);return i={interceptor:Ee,...i},ye(t,o),n(t,i)},enumerable:!1})}),e}function Qt(e,t,r,...n){try{return r(...n)}catch(i){Z(i,e,t)}}function Z(e,t,r=void 0){Object.assign(e,{el:t,expression:r}),console.warn(`Alpine Expression Error: ${e.message} + +${r?'Expression: "'+r+`" + +`:""}`,t),setTimeout(()=>{throw e},0)}var Se=!0;function Xt(e){let t=Se;Se=!1,e(),Se=t}function P(e,t,r={}){let n;return x(e,t)(i=>n=i,r),n}function x(...e){return er(...e)}var er=ft;function tr(e){er=e}function ft(e,t){let r={};se(r,e);let n=[r,...L(e)];if(typeof t=="function")return bn(n,t);let i=vn(n,t,e);return Qt.bind(null,e,t,i)}function bn(e,t){return(r=()=>{},{scope:n={},params:i=[]}={})=>{let o=t.apply(j([n,...e]),i);Ae(r,o)}}var dt={};function wn(e,t){if(dt[e])return dt[e];let r=Object.getPrototypeOf(async function(){}).constructor,n=/^[\n\s]*if.*\(.*\)/.test(e)||/^(let|const)\s/.test(e)?`(async()=>{ ${e} })()`:e,o=(()=>{try{return new r(["__self","scope"],`with (scope) { __self.result = ${n} }; __self.finished = true; return __self.result;`)}catch(s){return Z(s,t,e),Promise.resolve()}})();return dt[e]=o,o}function vn(e,t,r){let n=wn(t,r);return(i=()=>{},{scope:o={},params:s=[]}={})=>{n.result=void 0,n.finished=!1;let a=j([o,...e]);if(typeof n=="function"){let c=n(n,a).catch(l=>Z(l,r,t));n.finished?(Ae(i,n.result,a,s,r),n.result=void 0):c.then(l=>{Ae(i,l,a,s,r)}).catch(l=>Z(l,r,t)).finally(()=>n.result=void 0)}}}function Ae(e,t,r,n,i){if(Se&&typeof t=="function"){let o=t.apply(r,n);o instanceof Promise?o.then(s=>Ae(e,s,r,n)).catch(s=>Z(s,i,t)):e(o)}else typeof t=="object"&&t instanceof Promise?t.then(o=>e(o)):e(t)}var pt="x-";function S(e=""){return pt+e}function rr(e){pt=e}var mt={};function p(e,t){return mt[e]=t,{before(r){if(!mt[r]){console.warn("Cannot find directive `${directive}`. `${name}` will use the default order of execution");return}let n=H.indexOf(r)??H.indexOf("DEFAULT");n>=0&&H.splice(n,0,e)}}}function ae(e,t,r){if(t=Array.from(t),e._x_virtualDirectives){let o=Object.entries(e._x_virtualDirectives).map(([a,c])=>({name:a,value:c})),s=ht(o);o=o.map(a=>s.find(c=>c.name===a.name)?{name:`x-bind:${a.name}`,value:`"${a.value}"`}:a),t=t.concat(o)}let n={};return t.map(nr((o,s)=>n[o]=s)).filter(ir).map(Sn(n,r)).sort(An).map(o=>En(e,o))}function ht(e){return Array.from(e).map(nr()).filter(t=>!ir(t))}var _t=!1,ce=new Map,or=Symbol();function sr(e){_t=!0;let t=Symbol();or=t,ce.set(t,[]);let r=()=>{for(;ce.get(t).length;)ce.get(t).shift()();ce.delete(t)},n=()=>{_t=!1,r()};e(r),n()}function ut(e){let t=[],r=a=>t.push(a),[n,i]=zt(e);return t.push(i),[{Alpine:F,effect:n,cleanup:r,evaluateLater:x.bind(x,e),evaluate:P.bind(P,e)},()=>t.forEach(a=>a())]}function En(e,t){let r=()=>{},n=mt[t.type]||r,[i,o]=ut(e);Gt(e,t.original,o);let s=()=>{e._x_ignore||e._x_ignoreSelf||(n.inline&&n.inline(e,t,i),n=n.bind(n,e,t,i),_t?ce.get(or).push(n):n())};return s.runCleanups=o,s}var Oe=(e,t)=>({name:r,value:n})=>(r.startsWith(e)&&(r=r.replace(e,t)),{name:r,value:n}),Te=e=>e;function nr(e=()=>{}){return({name:t,value:r})=>{let{name:n,value:i}=ar.reduce((o,s)=>s(o),{name:t,value:r});return n!==t&&e(n,t),{name:n,value:i}}}var ar=[];function Q(e){ar.push(e)}function ir({name:e}){return cr().test(e)}var cr=()=>new RegExp(`^${pt}([^:^.]+)\\b`);function Sn(e,t){return({name:r,value:n})=>{let i=r.match(cr()),o=r.match(/:([a-zA-Z0-9\-:]+)/),s=r.match(/\.[^.\]]+(?=[^\]]*$)/g)||[],a=t||e[r]||r;return{type:i?i[1]:null,value:o?o[1]:null,modifiers:s.map(c=>c.replace(".","")),expression:n,original:a}}}var gt="DEFAULT",H=["ignore","ref","data","id","radio","tabs","switch","disclosure","menu","listbox","combobox","bind","init","for","mask","model","modelable","transition","show","if",gt,"teleport"];function An(e,t){let r=H.indexOf(e.type)===-1?gt:e.type,n=H.indexOf(t.type)===-1?gt:t.type;return H.indexOf(r)-H.indexOf(n)}function q(e,t,r={}){e.dispatchEvent(new CustomEvent(t,{detail:r,bubbles:!0,composed:!0,cancelable:!0}))}function A(e,t){if(typeof ShadowRoot=="function"&&e instanceof ShadowRoot){Array.from(e.children).forEach(i=>A(i,t));return}let r=!1;if(t(e,()=>r=!0),r)return;let n=e.firstElementChild;for(;n;)A(n,t,!1),n=n.nextElementSibling}function C(e,...t){console.warn(`Alpine Warning: ${e}`,...t)}function ur(){document.body||C("Unable to initialize. Trying to load Alpine before `` is available. Did you forget to add `defer` in Alpine's ` + +{{ $math := resources.Get "js/math.js" | js.Build $opts | fingerprint -}} + +{{ end -}} diff --git a/themes/zen/layouts/partials/menu.html b/themes/zen/layouts/partials/menu.html new file mode 100644 index 0000000..eb6296e --- /dev/null +++ b/themes/zen/layouts/partials/menu.html @@ -0,0 +1,25 @@ + diff --git a/themes/zen/layouts/partials/meta.html b/themes/zen/layouts/partials/meta.html new file mode 100644 index 0000000..7d043cb --- /dev/null +++ b/themes/zen/layouts/partials/meta.html @@ -0,0 +1,30 @@ +{{ range .AlternativeOutputFormats -}} + +{{ end -}} + + + +{{ with $.Param "author" }}{{ end }} +{{ with $.Param "contact" }}{{ end }} + + + + +{{ with $.Param "image" }}{{ end }} +{{ hugo.Generator }} + + +{{ with site.Params.piwikTrackerUrl }}{{ end }} +{{ with $.Param "microusername" }}{{ end }} + +{{ if .IsTranslated -}} +{{ range .Translations -}} + +{{ end -}} +{{ end -}} + +{{ if $.Param "realfavicongenerator" -}} + + + +{{ end -}} diff --git a/themes/zen/layouts/partials/meta_breadcrumb_json_ld.html b/themes/zen/layouts/partials/meta_breadcrumb_json_ld.html new file mode 100644 index 0000000..2d1f5af --- /dev/null +++ b/themes/zen/layouts/partials/meta_breadcrumb_json_ld.html @@ -0,0 +1,29 @@ +{{ $breadcrumbScratch := newScratch -}} +{{ $crumbScratch := newScratch -}} +{{ $crumbScratch.Set "itemListElement" (slice) -}} +{{ $breadPos := 0 -}} +{{ range .Ancestors.Reverse -}} + {{ $breadPos = (add $breadPos 1) -}} + {{ $crumbScratch.Add "itemListElement" (dict + "@type" "ListItem" + "position" $breadPos + "item" (dict + "@id" .Permalink + "name" .LinkTitle + ) + ) -}} +{{ end -}} +{{ $breadPos = (add $breadPos 1) -}} +{{ $crumbScratch.Add "itemListElement" (dict + "@type" "ListItem" + "position" $breadPos + "item" (dict + "@id" .Permalink + "name" .LinkTitle + ) +) -}} +{{ $breadcrumbScratch.SetInMap "breadcrumb" "@context" "https://schema.org" -}} +{{ $breadcrumbScratch.SetInMap "breadcrumb" "@type" "BreadcrumbList" -}} +{{ $breadcrumbScratch.SetInMap "breadcrumb" "itemListElement" ($crumbScratch.Get "itemListElement") -}} +{{ $jsonifiedBreadcrumb := $breadcrumbScratch.Get "breadcrumb" | jsonify (dict "indent" " " "prefix" " ") -}} +{{ return ($jsonifiedBreadcrumb | safeJS) -}} diff --git a/themes/zen/layouts/partials/meta_json_ld.html b/themes/zen/layouts/partials/meta_json_ld.html new file mode 100644 index 0000000..156004f --- /dev/null +++ b/themes/zen/layouts/partials/meta_json_ld.html @@ -0,0 +1,58 @@ + diff --git a/themes/zen/layouts/partials/mobilemenu.html b/themes/zen/layouts/partials/mobilemenu.html new file mode 100644 index 0000000..d531437 --- /dev/null +++ b/themes/zen/layouts/partials/mobilemenu.html @@ -0,0 +1,39 @@ +
+
+ + +
diff --git a/themes/zen/layouts/partials/pagination.html b/themes/zen/layouts/partials/pagination.html new file mode 100644 index 0000000..1440def --- /dev/null +++ b/themes/zen/layouts/partials/pagination.html @@ -0,0 +1,14 @@ +{{ if $.Param "internalpagination" -}} +{{ template "_internal/pagination.html" . }} +{{ else -}} +{{ if or (.Paginator.HasPrev) (.Paginator.HasNext) -}} + +{{ end -}} +{{ end -}} diff --git a/themes/zen/layouts/partials/podcast.html b/themes/zen/layouts/partials/podcast.html new file mode 100644 index 0000000..034ed89 --- /dev/null +++ b/themes/zen/layouts/partials/podcast.html @@ -0,0 +1,12 @@ +{{ $src := (.Params.podcast.mp3 | absURL) -}} +{{ if site.Params.Podcast.cdn -}} +{{ $src = add site.Params.Podcast.cdn (.Params.podcast.mp3 | relURL) -}} +{{ end -}} +
+ +
{{ .Title }}
+
+{{ with .Params.podcast.image }} +{{ $resource := resources.Get .src }}{{ $size := "250x" }}{{ with .width }}{{ $size = (add (string .) "x") }}{{ end }}{{ $image := $resource.Resize $size -}} +
{{ .alt }}
+{{ end -}} diff --git a/themes/zen/layouts/partials/related.html b/themes/zen/layouts/partials/related.html new file mode 100644 index 0000000..81b9bcc --- /dev/null +++ b/themes/zen/layouts/partials/related.html @@ -0,0 +1,11 @@ + diff --git a/themes/zen/layouts/partials/scripts.html b/themes/zen/layouts/partials/scripts.html new file mode 100644 index 0000000..bee565e --- /dev/null +++ b/themes/zen/layouts/partials/scripts.html @@ -0,0 +1,60 @@ +{{ $opts := dict "minify" true -}} +{{ if eq hugo.Environment "development" -}} + {{ $opts = merge $opts (dict "minify" false) -}} +{{ end -}} + +{{ $early := resources.Get "js/script-early.js" | js.Build $opts | fingerprint -}} + + +{{ if $.Param "alpine" -}} +{{ $alpine := resources.Get "libs/alpine.min.js" | fingerprint -}} + +{{ end -}} + +{{ if $.Param "jquery" -}} +{{ $jquery := resources.Get "libs/jquery.slim.min.js" | fingerprint -}} + +{{ end -}} + +{{ if $.Param "umbrella" -}} +{{ $umbrella := resources.Get "libs/umbrella.min.js" | fingerprint -}} + +{{ end -}} + +{{ if $.Param "mobilemenu" -}} +{{ $mobilemenu := resources.Get "js/mobile.js" | js.Build $opts | fingerprint -}} + +{{ end -}} + +{{ if $.Param "cookieconsent" -}} +{{ $cookieconsent := resources.Get "js/cookieconsent.js" | js.Build $opts | fingerprint -}} + +{{ end -}} + +{{ if $.Param "listsort" -}} +{{ $listmin := resources.Get "libs/list.min.js" | fingerprint -}} + +{{ $listsort := resources.Get "js/listsort.js" | fingerprint -}} + +{{ end -}} + +{{ if $.Param "tables" -}} +{{ $tables := resources.Get "js/tables.js" | js.Build $opts | fingerprint -}} + +{{ end -}} + +{{ if .HasShortcode "contact" -}} +{{ $contact := resources.Get "js/contact.js" | js.Build $opts | fingerprint -}} + +{{ end -}} + +{{ if .HasShortcode "search" -}} +{{ $flexsearch := resources.Get "libs/flexsearch.compact.js" | fingerprint -}} + +{{ $search_opts := merge $opts (dict "params" (dict "searchLimit" (site.Params.searchLimit | default 20) "basePath" site.Home.RelPermalink)) -}} +{{ $search := resources.Get "js/search.js" | js.Build $search_opts | fingerprint -}} + +{{ end -}} + +{{ $script := resources.Get "js/script.js" | js.Build $opts | fingerprint -}} + diff --git a/themes/zen/layouts/partials/sidebar.html b/themes/zen/layouts/partials/sidebar.html new file mode 100644 index 0000000..cf081ca --- /dev/null +++ b/themes/zen/layouts/partials/sidebar.html @@ -0,0 +1,15 @@ +{{ $currentSection := .Section -}} +{{ $currentID := "" -}} +{{ with .File }}{{ $currentID = .UniqueID }}{{ end -}} + diff --git a/themes/zen/layouts/partials/styles.html b/themes/zen/layouts/partials/styles.html new file mode 100644 index 0000000..421cd50 --- /dev/null +++ b/themes/zen/layouts/partials/styles.html @@ -0,0 +1,19 @@ +{{ $main_options := (dict "targetPath" "css/styles.css" "outputStyle" "compressed" "enableSourceMap" false "transpiler" (site.Params.sassTranspiler | default "libsass")) -}} +{{ if eq hugo.Environment "development" -}} + {{ $main_options = merge $main_options (dict "outputStyle" "nested" "enableSourceMap" true) -}} +{{ end -}} +{{ $mobile_options := merge $main_options (dict "targetPath" "css/mobile.css") -}} +{{ $print_options := merge $main_options (dict "targetPath" "css/print.css") -}} +{{ $main_style := resources.Get "sass/styles.scss" | toCSS $main_options -}} +{{ $mobile_style := resources.Get "sass/mobile.scss" | toCSS $mobile_options -}} +{{ $print_style := resources.Get "sass/print.scss" | toCSS $print_options -}} +{{ if ne hugo.Environment "development" -}} + {{ $main_style = $main_style | fingerprint -}} + {{ $mobile_style = $mobile_style | fingerprint -}} + {{ $print_style = $print_style | fingerprint -}} +{{ end -}} +{{ if $.Param "mobilemenu" -}} + +{{ end -}} + + diff --git a/themes/zen/layouts/partials/submitted.html b/themes/zen/layouts/partials/submitted.html new file mode 100644 index 0000000..27d58b9 --- /dev/null +++ b/themes/zen/layouts/partials/submitted.html @@ -0,0 +1,3 @@ + diff --git a/themes/zen/layouts/partials/tags.html b/themes/zen/layouts/partials/tags.html new file mode 100644 index 0000000..d2bb701 --- /dev/null +++ b/themes/zen/layouts/partials/tags.html @@ -0,0 +1,8 @@ +
+{{ i18n "taxo_tags" }}: + +
diff --git a/themes/zen/layouts/partials/tracking.html b/themes/zen/layouts/partials/tracking.html new file mode 100644 index 0000000..4e318ec --- /dev/null +++ b/themes/zen/layouts/partials/tracking.html @@ -0,0 +1,27 @@ +{{ $gaid := (or site.Config.Services.GoogleAnalytics.ID site.GoogleAnalytics) -}} +{{ $opts := dict + "minify" true + "params" (dict + "cookieConsent" site.Params.cookieConsent + "piwikTrackerUrl" site.Params.piwikTrackerUrl + "piwikSiteID" site.Params.piwikSiteID + "plausibleSiteID" site.Params.plausibleSiteID + "GoogleAnalytics" $gaid) -}} +{{ if eq hugo.Environment "development" -}} + {{ $opts = merge $opts (dict "minify" false) -}} +{{ end -}} +{{ if and site.Params.piwikTrackerUrl site.Params.piwikSiteID -}} +{{ $script := resources.Get "js/tracking.js" | js.Build $opts | fingerprint -}} + + +{{ end -}} + +{{ if site.Params.plausibleSiteID -}} + +{{ end -}} + +{{ if $gaid -}} +{{ $script := resources.Get "js/tracking.js" | js.Build $opts | fingerprint -}} + +{{ template "_internal/google_analytics.html" . }} +{{ end -}} diff --git a/themes/zen/layouts/podcast/full.html b/themes/zen/layouts/podcast/full.html new file mode 100644 index 0000000..a31cf45 --- /dev/null +++ b/themes/zen/layouts/podcast/full.html @@ -0,0 +1,10 @@ +
+
+

{{ .Title }}

+{{ if $.Param "submitted" | default false }}{{ partial "submitted.html" . }}{{ end -}} +
+ +{{ partial "podcast.html" . -}} + +{{ .Content }} +
diff --git a/themes/zen/layouts/podcast/rss.xml b/themes/zen/layouts/podcast/rss.xml new file mode 100644 index 0000000..67b8d78 --- /dev/null +++ b/themes/zen/layouts/podcast/rss.xml @@ -0,0 +1,64 @@ +{{- printf "" | safeHTML }} + + + {{ site.Params.Podcast.Title | default site.Title }} + {{ .Permalink }} + {{ site.Params.Podcast.Description | default site.Params.Description }} + Hugo -- gohugo.io + {{ site.Params.Podcast.Lang | default site.LanguageCode }} + {{ with site.Params.author.email -}} + {{ . }}{{ with site.Params.author.name }} ({{ . }}){{ end }} + {{ end -}} + {{ with site.Params.author.email -}} + {{ . }}{{ with site.Params.author.name }} ({{ . }}){{ end }} + {{ end -}} + {{ with site.Copyright -}} + {{ . }} + {{ end -}} + {{ if not .Date.IsZero -}} + {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} + {{ end -}} + {{ with site.Params.Podcast.Image }}{{ $image := resources.Get . }}{{ end }} + {{ with site.Params.Podcast.Category -}} + + {{ range .subcategories }}{{ end }} + + {{ end -}} + {{ with site.Params.Podcast.Owner -}} + + {{ with .name }}{{ . }}{{ end }} + {{ with .email }}{{ . }}{{ end }} + + {{ end -}} + {{ with site.Params.Podcast.Description }}{{ . }}{{ end }} + {{ with site.Params.Podcast.Author }}{{ . }}{{ end }} + {{ with site.Params.Podcast.Type }}{{ . }}{{ end }} + {{ with site.Params.Podcast.Block }}{{ . }}{{ end }} + {{ with site.Params.Podcast.Complete }}{{ . }}{{ end }} + {{ with site.Params.Podcast.NewFeed }}{{ . }}{{ end }} + {{ if site.Params.Podcast.Explicit }}true{{ else }}false{{ end }} + {{ range .Pages -}} + + {{ .Title }} + {{ .Title }} + {{ .Permalink }} + {{ .Permalink }} + {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} + {{ with site.Params.Podcast.Author }}{{ . }}{{ end }} + {{ .Content | html }} + {{ if site.Params.Podcast.local | default true -}} + {{ with .Params.podcast.mp3 }}{{ $file_stat := os.Stat (path.Join "/static" .) }}{{ end }} + {{ else -}} + {{ with .Params.podcast.mp3 }}{{ end }} + {{ end -}} + {{ with .Params.podcast.duration }}{{ . }}{{ end }} + {{ with .Params.podcast.image.src }}{{ $image := resources.Get . }}{{ end }} + {{ with .Params.podcast.episode }}{{ . }}{{ end }} + {{ with .Params.podcast.episodeType }}{{ . }}{{ end }} + {{ with .Params.podcast.season }}{{ . }}{{ end }} + {{ with .Params.podcast.block }}{{ . }}{{ end }} + {{ if .Params.podcast.explicit }}true{{ else }}false{{ end }} + + {{ end -}} + + diff --git a/themes/zen/layouts/podcast/single.html b/themes/zen/layouts/podcast/single.html new file mode 100644 index 0000000..55ba41d --- /dev/null +++ b/themes/zen/layouts/podcast/single.html @@ -0,0 +1,15 @@ +{{ define "main" -}} +
+
+
+

{{ .Title }}

+{{ if $.Param "submitted" | default false }}{{ partial "submitted.html" . }}{{ end -}} +{{ if .Params.tags }}{{ partial "tags.html" . }}{{ end -}} +
+ +{{ partial "podcast.html" . -}} + +{{ .Content }} +
+
+{{ end -}} diff --git a/themes/zen/layouts/shortcodes/audio.html b/themes/zen/layouts/shortcodes/audio.html new file mode 100644 index 0000000..c4592dc --- /dev/null +++ b/themes/zen/layouts/shortcodes/audio.html @@ -0,0 +1,41 @@ +{{ $caption := .Get "caption" -}} +{{ $class := .Get "class" -}} +{{ $preload := .Get "preload" | default "metadata" -}} +{{ $src := .Get "src" -}} + +{{ $resource := false -}} +{{ $static := false -}} +{{ $type := false -}} + +{{ if and $src (fileExists (path.Join "/static" $src)) -}} + {{ $static = true -}} + {{ $src = relURL $src -}} +{{ else if $src -}} + {{ $src = strings.TrimLeft "/" $src -}} + {{ with resources.Get $src -}} + {{ $resource = . -}} + {{ end -}} + {{ with .Page.Resources.Get $src -}} + {{ $resource = . -}} + {{ end -}} +{{ end -}} + +{{ if $resource -}} + {{ $src = $resource.RelPermalink -}} + {{ $type = $resource.MediaType }} +{{ end -}} + +{{ if not $src -}} +{{ warnf "%s shortcode number %d in \"content/%s\" is missing the \"src\" attribute." .Name .Ordinal .Page.File.Path -}} +{{ else if not (or $static $resource) -}} +{{ warnf "%s shortcode number %d in \"content/%s\" has an error in the \"src\" attribute." .Name .Ordinal .Page.File.Path -}} +{{ end -}} + +
+ +{{ with $caption -}} +
{{ . | markdownify }}
+{{ end -}} +
diff --git a/themes/zen/layouts/shortcodes/button.html b/themes/zen/layouts/shortcodes/button.html new file mode 100644 index 0000000..a733166 --- /dev/null +++ b/themes/zen/layouts/shortcodes/button.html @@ -0,0 +1,5 @@ +{{ $class := .Get "class" -}} +{{ $newtab := .Get "newtab" | default false -}} +{{ $src := .Get "src" -}} +{{ $text := .Get "text" -}} +{{ $text }} diff --git a/themes/zen/layouts/shortcodes/clear.html b/themes/zen/layouts/shortcodes/clear.html new file mode 100644 index 0000000..a9d2c1a --- /dev/null +++ b/themes/zen/layouts/shortcodes/clear.html @@ -0,0 +1 @@ +
diff --git a/themes/zen/layouts/shortcodes/contact.html b/themes/zen/layouts/shortcodes/contact.html new file mode 100644 index 0000000..e71282a --- /dev/null +++ b/themes/zen/layouts/shortcodes/contact.html @@ -0,0 +1,16 @@ +

{{ i18n "js_required" }}

+ + + + diff --git a/themes/zen/layouts/shortcodes/details.html b/themes/zen/layouts/shortcodes/details.html new file mode 100644 index 0000000..8aeb3c7 --- /dev/null +++ b/themes/zen/layouts/shortcodes/details.html @@ -0,0 +1,6 @@ +{{ $class := .Get "class" -}} +{{ $summary := .Get "summary" -}} + +{{ with $summary }}{{ . }}{{ end }} +{{ .Inner | $.Page.RenderString (dict "display" "block") }} + diff --git a/themes/zen/layouts/shortcodes/figure.html b/themes/zen/layouts/shortcodes/figure.html new file mode 100644 index 0000000..efcac00 --- /dev/null +++ b/themes/zen/layouts/shortcodes/figure.html @@ -0,0 +1,107 @@ +{{ $alt := .Get "alt" -}} +{{ $attr := .Get "attr" -}} +{{ $attrlink := .Get "attrlink" -}} +{{ $caption := .Get "caption" -}} +{{ $class := .Get "class" -}} +{{ $height := .Get "height" -}} +{{ $link := .Get "link" -}} +{{ $size := .Get "size" -}} +{{ $src := .Get "src" -}} +{{ $srcset := .Get "srcset" -}} +{{ $title := .Get "title" -}} +{{ $width := .Get "width" -}} + +{{ $maxwidth := site.Params.imageMaxWidth -}} +{{ $realwidth := 0 -}} +{{ $realheight := 0 -}} +{{ $resource := false -}} +{{ $srcsetw := (slice) -}} +{{ $static := false -}} + +{{ if and $src (fileExists (path.Join "/static" $src)) -}} + {{ with (imageConfig (path.Join "/static" $src)) -}} + {{ $realwidth = .Width -}} + {{ $realheight = .Height -}} + {{ end -}} + {{ $static = true -}} + {{ $src = relURL $src -}} +{{ else if $src -}} + {{ $src = strings.TrimLeft "/" $src -}} + {{ with resources.Get $src -}} + {{ $resource = . -}} + {{ end -}} + {{ with .Page.Resources.Get $src -}} + {{ $resource = . -}} + {{ end -}} +{{ end -}} + +{{ if $resource -}} + {{ if $size -}} + {{ $image := $resource.Resize $size -}} + {{ $src = $image.RelPermalink -}} + {{ if or $width $height -}} + {{ $realwidth = $image.Width -}} + {{ $realheight = $image.Height -}} + {{ else -}} + {{ $width = $image.Width -}} + {{ $height = $image.Height -}} + {{ end -}} + {{ if $srcset -}} + {{ $srcsetw = $srcsetw | append (printf "%s %sw" $src (strings.TrimRight "x" $size)) -}} + {{ end -}} + {{ else -}} + {{ $src = $resource.RelPermalink -}} + {{ $realwidth = $resource.Width -}} + {{ $realheight = $resource.Height -}} + {{ end -}} + {{ if $srcset -}} + {{ range $set := split $srcset " " -}} + {{ $image := $resource.Resize (printf "%sx" $set) -}} + {{ $srcsetw = $srcsetw | append (printf "%s %sw" $image.RelPermalink $set) -}} + {{ end -}} + {{ $width = "" -}} + {{ $height = "" -}} + {{ end -}} +{{ end -}} + +{{ if and $width $height -}} + {{ $width = int $width -}} + {{ $height = int $height -}} +{{ else if $width -}} + {{ $width = int $width -}} + {{ $height = $realheight -}} + {{ if and ($realwidth) (lt ($width) ($realwidth)) -}} + {{ $height = (mul ($realheight) (div (add ($width) 0.0) ($realwidth))) -}} + {{ $height = (math.Round $height) -}} + {{ end -}} +{{ else if $height -}} + {{ $width = $realwidth -}} + {{ $height = int $height -}} + {{ if and ($realheight) (lt ($height) ($realheight)) -}} + {{ $width = (mul ($realwidth) (div (add ($height) 0.0) ($realheight))) -}} + {{ $width = (math.Round $width) -}} + {{ end -}} +{{ else if and ($maxwidth) (lt ($maxwidth) ($realwidth)) -}} + {{ $width = ($maxwidth) -}} + {{ $height = (mul ($realheight) (div (add ($width) 0.0) ($realwidth))) -}} + {{ $height = (math.Round $height) -}} +{{ end -}} + +{{ if not $src -}} +{{ warnf "%s shortcode number %d in \"content/%s\" is missing the \"src\" attribute." .Name .Ordinal .Page.File.Path -}} +{{ else if not (or $static $resource) -}} +{{ warnf "%s shortcode number %d in \"content/%s\" has an error in the \"src\" attribute." .Name .Ordinal .Page.File.Path -}} +{{ end -}} + +
+{{ with $link }}{{ end -}} +{{ $alt }} +{{- if $link }}{{ end }} +{{ if or $title $caption $attr -}} +
+{{ with $title }}{{ . }}
{{ end -}} +{{- $caption | markdownify }}{{ if and $caption $attr }} {{ end -}} +{{ with $attrlink }}{{ end }}{{ $attr | markdownify }}{{ if $attrlink }}{{ end -}} +
+{{ end -}} +
diff --git a/themes/zen/layouts/shortcodes/file.html b/themes/zen/layouts/shortcodes/file.html new file mode 100644 index 0000000..c8d7e57 --- /dev/null +++ b/themes/zen/layouts/shortcodes/file.html @@ -0,0 +1,36 @@ +{{ $class := .Get "class" -}} +{{ $newtab := .Get "newtab" | default false -}} +{{ $src := .Get "src" -}} +{{ $text := .Get "text" -}} + +{{ $resource := false -}} +{{ $static := false -}} + +{{ if and $src (fileExists (path.Join "/static" $src)) -}} + {{ $static = true -}} + {{ $src = relURL $src -}} +{{ else if $src -}} + {{ $src = strings.TrimLeft "/" $src -}} + {{ with resources.Get $src -}} + {{ $resource = . -}} + {{ end -}} + {{ with .Page.Resources.Get $src -}} + {{ $resource = . -}} + {{ end -}} +{{ end -}} + +{{ if $resource -}} + {{ $src = $resource.RelPermalink -}} +{{ end -}} + +{{ if not $text -}} + {{ $text = path.Base $src -}} +{{ end -}} + +{{ if not $src -}} +{{ warnf "%s shortcode number %d in \"content/%s\" is missing the \"src\" attribute." .Name .Ordinal .Page.File.Path -}} +{{ else if not (or $static $resource) -}} +{{ warnf "%s shortcode number %d in \"content/%s\" has an error in the \"src\" attribute." .Name .Ordinal .Page.File.Path -}} +{{ end -}} + +{{ $text }} diff --git a/themes/zen/layouts/shortcodes/img.html b/themes/zen/layouts/shortcodes/img.html new file mode 100644 index 0000000..64eb94e --- /dev/null +++ b/themes/zen/layouts/shortcodes/img.html @@ -0,0 +1,94 @@ +{{ $alt := .Get "alt" -}} +{{ $class := .Get "class" -}} +{{ $height := .Get "height" -}} +{{ $link := .Get "link" -}} +{{ $size := .Get "size" -}} +{{ $src := .Get "src" -}} +{{ $srcset := .Get "srcset" -}} +{{ $width := .Get "width" -}} + +{{ $maxwidth := site.Params.imageMaxWidth -}} +{{ $realwidth := 0 -}} +{{ $realheight := 0 -}} +{{ $resource := false -}} +{{ $srcsetw := (slice) -}} +{{ $static := false -}} + +{{ if and $src (fileExists (path.Join "/static" $src)) -}} + {{ with (imageConfig (path.Join "/static" $src)) -}} + {{ $realwidth = .Width -}} + {{ $realheight = .Height -}} + {{ end -}} + {{ $static = true -}} + {{ $src = relURL $src -}} +{{ else if $src -}} + {{ $src = strings.TrimLeft "/" $src -}} + {{ with resources.Get $src -}} + {{ $resource = . -}} + {{ end -}} + {{ with .Page.Resources.Get $src -}} + {{ $resource = . -}} + {{ end -}} +{{ end -}} + +{{ if $resource -}} + {{ if $size -}} + {{ $image := $resource.Resize $size -}} + {{ $src = $image.RelPermalink -}} + {{ if or $width $height -}} + {{ $realwidth = $image.Width -}} + {{ $realheight = $image.Height -}} + {{ else -}} + {{ $width = $image.Width -}} + {{ $height = $image.Height -}} + {{ end -}} + {{ if $srcset -}} + {{ $srcsetw = $srcsetw | append (printf "%s %sw" $src (strings.TrimRight "x" $size)) -}} + {{ end -}} + {{ else -}} + {{ $src = $resource.RelPermalink -}} + {{ $realwidth = $resource.Width -}} + {{ $realheight = $resource.Height -}} + {{ end -}} + {{ if $srcset -}} + {{ range $set := split $srcset " " -}} + {{ $image := $resource.Resize (printf "%sx" $set) -}} + {{ $srcsetw = $srcsetw | append (printf "%s %sw" $image.RelPermalink $set) -}} + {{ end -}} + {{ $width = "" -}} + {{ $height = "" -}} + {{ end -}} +{{ end -}} + +{{ if and $width $height -}} + {{ $width = int $width -}} + {{ $height = int $height -}} +{{ else if $width -}} + {{ $width = int $width -}} + {{ $height = $realheight -}} + {{ if and ($realwidth) (lt ($width) ($realwidth)) -}} + {{ $height = (mul ($realheight) (div (add ($width) 0.0) ($realwidth))) -}} + {{ $height = (math.Round $height) -}} + {{ end -}} +{{ else if $height -}} + {{ $width = $realwidth -}} + {{ $height = int $height -}} + {{ if and ($realheight) (lt ($height) ($realheight)) -}} + {{ $width = (mul ($realwidth) (div (add ($height) 0.0) ($realheight))) -}} + {{ $width = (math.Round $width) -}} + {{ end -}} +{{ else if and ($maxwidth) (lt ($maxwidth) ($realwidth)) -}} + {{ $width = ($maxwidth) -}} + {{ $height = (mul ($realheight) (div (add ($width) 0.0) ($realwidth))) -}} + {{ $height = (math.Round $height) -}} +{{ end -}} + +{{ if not $src -}} +{{ warnf "%s shortcode number %d in \"content/%s\" is missing the \"src\" attribute." .Name .Ordinal .Page.File.Path -}} +{{ else if not (or $static $resource) -}} +{{ warnf "%s shortcode number %d in \"content/%s\" has an error in the \"src\" attribute." .Name .Ordinal .Page.File.Path -}} +{{ end -}} + +{{ with $link }}{{ end -}} +{{ $alt }} +{{- if $link }}{{ end }} diff --git a/themes/zen/layouts/shortcodes/math.html b/themes/zen/layouts/shortcodes/math.html new file mode 100644 index 0000000..7ca55f7 --- /dev/null +++ b/themes/zen/layouts/shortcodes/math.html @@ -0,0 +1 @@ +${{ .Inner }}$ diff --git a/themes/zen/layouts/shortcodes/reflink.html b/themes/zen/layouts/shortcodes/reflink.html new file mode 100644 index 0000000..f2bf2b3 --- /dev/null +++ b/themes/zen/layouts/shortcodes/reflink.html @@ -0,0 +1 @@ +{{ with site.GetPage (.Get 0) }}{{ .Title }}{{ end }} diff --git a/themes/zen/layouts/shortcodes/search.html b/themes/zen/layouts/shortcodes/search.html new file mode 100644 index 0000000..d88484f --- /dev/null +++ b/themes/zen/layouts/shortcodes/search.html @@ -0,0 +1,21 @@ +

{{ i18n "js_required" }}

+ + + + +
+ + diff --git a/themes/zen/layouts/shortcodes/svg.html b/themes/zen/layouts/shortcodes/svg.html new file mode 100644 index 0000000..1b06cb3 --- /dev/null +++ b/themes/zen/layouts/shortcodes/svg.html @@ -0,0 +1,65 @@ +{{ $alt := .Get "alt" -}} +{{ $caption := .Get "caption" -}} +{{ $class := .Get "class" -}} +{{ $height := .Get "height" -}} +{{ $inline := .Get "inline" | default false -}} +{{ $link := .Get "link" -}} +{{ $src := .Get "src" -}} +{{ $width := .Get "width" -}} + +{{ $resource := false -}} +{{ $static := false -}} + +{{ if and $src (fileExists (path.Join "/static" $src)) -}} + {{ $static = true -}} + {{ $src = relURL $src -}} + {{ if $inline -}} + {{ $src = readFile (path.Join "/static" $src) -}} + {{ end -}} +{{ else if $src -}} + {{ $src = strings.TrimLeft "/" $src -}} + {{ with resources.Get $src -}} + {{ $resource = . -}} + {{ end -}} + {{ with .Page.Resources.Get $src -}} + {{ $resource = . -}} + {{ end -}} +{{ end -}} + +{{ if $resource -}} + {{ if $inline -}} + {{ $src = $resource.Content -}} + {{ else -}} + {{ $src = $resource.RelPermalink -}} + {{ end -}} +{{ end -}} + +{{ if and $width $height -}} + {{ $width = int $width -}} + {{ $height = int $height -}} +{{ else if $width -}} + {{ $width = int $width -}} +{{ else if $height -}} + {{ $height = int $height -}} +{{ end -}} + +{{ if not $src -}} +{{ warnf "%s shortcode number %d in \"content/%s\" is missing the \"src\" attribute." .Name .Ordinal .Page.File.Path -}} +{{ else if not (or $static $resource) -}} +{{ warnf "%s shortcode number %d in \"content/%s\" has an error in the \"src\" attribute." .Name .Ordinal .Page.File.Path -}} +{{ end -}} + +{{ if $caption }}
{{ end -}} +{{ with $link }}{{ end -}} +{{ if $inline -}} +
{{ $src | safeHTML }}
+{{ else -}} +{{ $alt }} +{{ end -}} +{{- if $link }}
{{ end }} +{{ if $caption -}} +
+{{ $caption | markdownify -}} +
+
+{{ end -}} diff --git a/themes/zen/layouts/shortcodes/video.html b/themes/zen/layouts/shortcodes/video.html new file mode 100644 index 0000000..558c110 --- /dev/null +++ b/themes/zen/layouts/shortcodes/video.html @@ -0,0 +1,67 @@ +{{ $autoplay := .Get "autoplay" -}} +{{ $caption := .Get "caption" -}} +{{ $class := .Get "class" -}} +{{ $loop := .Get "loop" -}} +{{ $poster := .Get "poster" -}} +{{ $preload := .Get "preload" | default "metadata" -}} +{{ $src := .Get "src" -}} +{{ $width := .Get "width" -}} + +{{ $posterres := false -}} +{{ $resource := false -}} +{{ $static := false -}} +{{ $type := false -}} + +{{ if and $src (fileExists (path.Join "/static" $src)) -}} + {{ $static = true -}} + {{ $src = relURL $src -}} +{{ else if $src -}} + {{ $src = strings.TrimLeft "/" $src -}} + {{ with resources.Get $src -}} + {{ $resource = . -}} + {{ end -}} + {{ with .Page.Resources.Get $src -}} + {{ $resource = . -}} + {{ end -}} +{{ end -}} + +{{ if $resource -}} + {{ $src = $resource.RelPermalink -}} + {{ $type = $resource.MediaType -}} +{{ end -}} + +{{ if and $poster (fileExists (path.Join "/static" $poster)) -}} + {{ $poster = relURL $poster -}} +{{ else if $poster -}} + {{ $poster = strings.TrimLeft "/" $poster -}} + {{ with resources.Get $poster -}} + {{ $posterres = . -}} + {{ end -}} + {{ with .Page.Resources.Get $poster -}} + {{ $posterres = . -}} + {{ end -}} +{{ end -}} + +{{ if $posterres -}} + {{ if $width -}} + {{ $image := $posterres.Resize (printf "%sx" $width) -}} + {{ $poster = $image.RelPermalink -}} + {{ else -}} + {{ $poster = $posterres.RelPermalink -}} + {{ end -}} +{{ end -}} + +{{ if not $src -}} +{{ warnf "%s shortcode number %d in \"content/%s\" is missing the \"src\" attribute." .Name .Ordinal .Page.File.Path -}} +{{ else if not (or $static $resource) -}} +{{ warnf "%s shortcode number %d in \"content/%s\" has an error in the \"src\" attribute." .Name .Ordinal .Page.File.Path -}} +{{ end -}} + +
+ +{{ with $caption -}} +
{{ . | markdownify }}
+{{ end -}} +
diff --git a/themes/zen/layouts/shortcodes/wrapper-end.html b/themes/zen/layouts/shortcodes/wrapper-end.html new file mode 100644 index 0000000..04f5b84 --- /dev/null +++ b/themes/zen/layouts/shortcodes/wrapper-end.html @@ -0,0 +1 @@ + diff --git a/themes/zen/layouts/shortcodes/wrapper-start.html b/themes/zen/layouts/shortcodes/wrapper-start.html new file mode 100644 index 0000000..5ed6a59 --- /dev/null +++ b/themes/zen/layouts/shortcodes/wrapper-start.html @@ -0,0 +1 @@ +
diff --git a/themes/zen/layouts/shortcodes/wrapper.html b/themes/zen/layouts/shortcodes/wrapper.html new file mode 100644 index 0000000..7c5965b --- /dev/null +++ b/themes/zen/layouts/shortcodes/wrapper.html @@ -0,0 +1,3 @@ +{{ $display := "inline" -}} +{{ if eq (.Get 1) "block" }}{{ $display = "block" }}{{ end -}} +
{{ if eq (.Get 1) "nomarkdown" }}{{ .Inner }}{{ else }}{{ .Inner | $.Page.RenderString (dict "display" $display) }}{{ end }}
diff --git a/themes/zen/layouts/taxonomy/summary.html b/themes/zen/layouts/taxonomy/summary.html new file mode 100644 index 0000000..aa3d555 --- /dev/null +++ b/themes/zen/layouts/taxonomy/summary.html @@ -0,0 +1,4 @@ +
+

{{ .Title }} ({{ .Data.Pages.Len }})

+

{{ .Description }}

+
diff --git a/themes/zen/package-lock.json b/themes/zen/package-lock.json new file mode 100644 index 0000000..8737a92 --- /dev/null +++ b/themes/zen/package-lock.json @@ -0,0 +1,2746 @@ +{ + "name": "zen", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "zen", + "version": "1.0.0", + "license": "GPL-2.0", + "devDependencies": { + "eslint": "^8.45.0", + "eslint-plugin-template": "^0.7.0", + "stylelint": "^15.10.1", + "stylelint-config-standard-scss": "^10.0.0", + "stylelint-scss": "^5.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.0.tgz", + "integrity": "sha512-dTKSIHHWc0zPvcS5cqGP+/TPFUJB0ekJ9dGKvMAFoNuBFhDPBt9OMGNZiIA5vTiNdGHHBeScYPXIGBMnVOahsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^2.1.1" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.1.1.tgz", + "integrity": "sha512-GbrTj2Z8MCTUv+52GE0RbFGM527xuXZ0Xa5g0Z+YN573uveS4G0qi6WNOMyz3yrFM/jaILTTwJ0+umx81EzqfA==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.2.tgz", + "integrity": "sha512-M8cFGGwl866o6++vIY7j1AKuq9v57cf+dGepScwCcbut9ypJNr4Cj+LLTWligYUZ0uyhEoJDKt5lvyBfh2L3ZQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^2.3.0", + "@csstools/css-tokenizer": "^2.1.1" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.0.tgz", + "integrity": "sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.13" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", + "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", + "dev": true, + "dependencies": { + "camelcase": "^6.3.0", + "map-obj": "^4.1.0", + "quick-lru": "^5.1.1", + "type-fest": "^1.2.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", + "dev": true, + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-functions-list": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.0.tgz", + "integrity": "sha512-d/jBMPyYybkkLVypgtGv12R+pIFw4/f/IHtCTxWpZc8ofTYOPigIgmA6vu5rMHartZC+WuXhBUHfnyNUIQSYrg==", + "dev": true, + "engines": { + "node": ">=12.22" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", + "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-template": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-template/-/eslint-plugin-template-0.7.0.tgz", + "integrity": "sha512-Fo3uxnVcutIgc1a4m2FBZBQdYhtOFvnWJL9XzpOfvt8Wr40oQijrg0kM749i4r+upk5SiSHzTTMKgL4rqjTRpw==", + "dev": true, + "dependencies": { + "htmlparser2": "3" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", + "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/known-css-properties": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.27.0.tgz", + "integrity": "sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==", + "dev": true + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, + "node_modules/meow": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", + "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", + "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", + "dev": true + }, + "node_modules/postcss-safe-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", + "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "dev": true, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.6.tgz", + "integrity": "sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + } + ], + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.19" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", + "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", + "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0", + "read-pkg": "^6.0.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/redent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", + "dev": true, + "dependencies": { + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", + "dev": true + }, + "node_modules/stylelint": { + "version": "15.10.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.10.1.tgz", + "integrity": "sha512-CYkzYrCFfA/gnOR+u9kJ1PpzwG10WLVnoxHDuBA/JiwGqdM9+yx9+ou6SE/y9YHtfv1mcLo06fdadHTOx4gBZQ==", + "dev": true, + "dependencies": { + "@csstools/css-parser-algorithms": "^2.3.0", + "@csstools/css-tokenizer": "^2.1.1", + "@csstools/media-query-list-parser": "^2.1.2", + "@csstools/selector-specificity": "^3.0.0", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^8.2.0", + "css-functions-list": "^3.1.0", + "css-tree": "^2.3.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.0", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^6.0.1", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", + "ignore": "^5.2.4", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.27.0", + "mathml-tag-names": "^2.1.3", + "meow": "^10.1.5", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.24", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^6.0.0", + "postcss-selector-parser": "^6.0.13", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "style-search": "^0.1.0", + "supports-hyperlinks": "^3.0.0", + "svg-tags": "^1.0.0", + "table": "^6.8.1", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "stylelint": "bin/stylelint.mjs" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-12.0.0.tgz", + "integrity": "sha512-x6x8QNARrGO2sG6iURkzqL+Dp+4bJorPMMRNPScdvaUK8PsynriOcMW7AFDKqkWAS5wbue/u8fUT/4ynzcmqdQ==", + "dev": true, + "peerDependencies": { + "stylelint": "^15.5.0" + } + }, + "node_modules/stylelint-config-recommended-scss": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-12.0.0.tgz", + "integrity": "sha512-5Bb2mlGy6WLa30oNeKpZvavv2lowJUsUJO25+OA68GFTemlwd1zbFsL7q0bReKipOSU3sG47hKneZ6Nd+ctrFA==", + "dev": true, + "dependencies": { + "postcss-scss": "^4.0.6", + "stylelint-config-recommended": "^12.0.0", + "stylelint-scss": "^5.0.0" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^15.5.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-config-standard": { + "version": "33.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-33.0.0.tgz", + "integrity": "sha512-eyxnLWoXImUn77+ODIuW9qXBDNM+ALN68L3wT1lN2oNspZ7D9NVGlNHb2QCUn4xDug6VZLsh0tF8NyoYzkgTzg==", + "dev": true, + "dependencies": { + "stylelint-config-recommended": "^12.0.0" + }, + "peerDependencies": { + "stylelint": "^15.5.0" + } + }, + "node_modules/stylelint-config-standard-scss": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-10.0.0.tgz", + "integrity": "sha512-bChBEo1p3xUVWh/wenJI+josoMk21f2yuLDGzGjmKYcALfl2u3DFltY+n4UHswYiXghqXaA8mRh+bFy/q1hQlg==", + "dev": true, + "dependencies": { + "stylelint-config-recommended-scss": "^12.0.0", + "stylelint-config-standard": "^33.0.0" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^15.5.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-scss": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-5.0.1.tgz", + "integrity": "sha512-n87iCRZrr2J7//I/QFsDXxFLnHKw633U4qvWZ+mOW6KDAp/HLj06H+6+f9zOuTYy+MdGdTuCSDROCpQIhw5fvQ==", + "dev": true, + "dependencies": { + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-selector-parser": "^6.0.13", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "stylelint": "^14.5.1 || ^15.0.0" + } + }, + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true + }, + "node_modules/stylelint/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", + "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-newlines": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", + "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/themes/zen/package.json b/themes/zen/package.json new file mode 100644 index 0000000..2b3b140 --- /dev/null +++ b/themes/zen/package.json @@ -0,0 +1,33 @@ +{ + "name": "zen", + "version": "1.0.0", + "description": "The node.js requirements to lint this project.", + "scripts": { + "lint-theme:css": "stylelint --quiet-deprecation-warnings \"assets/sass/**/*.scss\"", + "lint-theme:js": "eslint \"assets/js/**/*.js\"", + "lint-project:css": "stylelint --quiet-deprecation-warnings \"../../assets/sass/**/*.scss\"", + "lint-project:js": "eslint \"../../assets/js/**/*.js\"", + "lint-theme": "npm run lint-theme:css && npm run lint-theme:js", + "lint-project": "npm run lint-project:css && npm run lint-project:js", + "lint:css": "npm run lint-theme:css && npm run lint-project:css", + "lint:js": "npm run lint-theme:js && npm run lint-project:js", + "lint": "npm run lint:css && npm run lint:js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/frjo/hugo-theme-zen.git" + }, + "author": "Fredrik Jonsson", + "license": "GPL-2.0", + "devDependencies": { + "eslint": "^8.45.0", + "eslint-plugin-template": "^0.7.0", + "stylelint": "^15.10.1", + "stylelint-config-standard-scss": "^10.0.0", + "stylelint-scss": "^5.0.1" + }, + "engines": { + "node": ">=16.0.0" + }, + "private": true +} diff --git a/themes/zen/php/contact.php.example b/themes/zen/php/contact.php.example new file mode 100644 index 0000000..72a1bb7 --- /dev/null +++ b/themes/zen/php/contact.php.example @@ -0,0 +1,98 @@ + "$name <$email>", + 'Sender' => $sender, + 'Return-Path' => $sender, + 'MIME-Version' => '1.0', + 'Content-Type' => 'text/plain; charset=UTF-8; format=flowed; delsp=yes', + 'Content-Transfer-Encoding' => '8Bit', + 'X-Mailer' => 'Hugo - Zen', + ]; + $mime_headers = []; + foreach ($headers as $key => $value) { + $mime_headers[] = "$key: $value"; + } + $mail_headers = join("\n", $mime_headers); + + // Send the mail, suppressing errors and setting Return-Path with the "-f" option. + $success = @mail($to, $subject, $message, $mail_headers, '-f' . $sender); +} + +$status = $success ? 'submitted' : 'error'; +$contact_form_url = strtok($_SERVER['HTTP_REFERER'], '?'); + +// Redirect back to contact form with status. +header('Location: ' . $contact_form_url . '?' . $status, TRUE, 302); +exit; + +function _contact_ff_wrap(&$line) { + $line = wordwrap($line, 72, " \n"); +} + +function _contact_clean_str($str, $quotes, $strip = false, $encode = false) { + if ($strip) { + $str = strip_tags($str); + } + + $str = htmlspecialchars(trim($str), $quotes, 'UTF-8'); + + if ($encode && preg_match('/[^\x20-\x7E]/', $str)) { + $str = '=?UTF-8?B?' . base64_encode($str) . '?='; + } + + return $str; +} diff --git a/themes/zen/scripts/set_up_new_site.sh b/themes/zen/scripts/set_up_new_site.sh new file mode 100755 index 0000000..da82971 --- /dev/null +++ b/themes/zen/scripts/set_up_new_site.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash + +# shell script hardening +set -euo pipefail + +# This script copies the scss and layout files I think most people +# would like to override. It also copies the example config file. +# (Run chmod 700 on this file to make it executable) + +if [[ ! "$0" =~ "themes/zen/scripts/set_up_new_site.sh" ]]; then + echo "Error: This script must be run from the project root directory." + echo "Usage: ./themes/zen/scripts/set_up_new_site.sh" + exit 1 +fi + +mkdir -p "assets/sass" +mkdir -p "layouts" + +copy_files=("themes/zen/assets/sass/_colors.scss:assets/sass/_colors.scss" + "themes/zen/assets/sass/_extra.scss:assets/sass/_extra.scss" + "themes/zen/assets/sass/_fonts.scss:assets/sass/_fonts.scss" + "themes/zen/assets/sass/_custom.scss:assets/sass/_custom.scss" + "themes/zen/assets/sass/_zen.scss:assets/sass/_zen.scss" + "themes/zen/layouts/index.html:layouts/index.html" + "themes/zen/exampleSite/config.yaml:config.yaml" + "themes/zen/.editorconfig:.editorconfig") + +for files in "${copy_files[@]}" ; do + if [[ ! -f "${files##*:}" ]]; then + cp "${files%%:*}" "${files##*:}" + echo "Copied: ${files##*:}" + else + echo "Already exist so not overwritten: ${files##*:}" + fi +done + +if [[ -f "config.toml" && -f "config.yaml" ]]; then + mv config.toml config.toml.old +fi diff --git a/themes/zen/static/android-chrome-192x192.png b/themes/zen/static/android-chrome-192x192.png new file mode 100644 index 0000000..8283cb8 Binary files /dev/null and b/themes/zen/static/android-chrome-192x192.png differ diff --git a/themes/zen/static/android-chrome-384x384.png b/themes/zen/static/android-chrome-384x384.png new file mode 100644 index 0000000..7cf4872 Binary files /dev/null and b/themes/zen/static/android-chrome-384x384.png differ diff --git a/themes/zen/static/apple-touch-icon.png b/themes/zen/static/apple-touch-icon.png new file mode 100644 index 0000000..d7637ff Binary files /dev/null and b/themes/zen/static/apple-touch-icon.png differ diff --git a/themes/zen/static/browserconfig.xml b/themes/zen/static/browserconfig.xml new file mode 100644 index 0000000..5cd27e3 --- /dev/null +++ b/themes/zen/static/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #603cba + + + diff --git a/themes/zen/static/favicon-16x16.png b/themes/zen/static/favicon-16x16.png new file mode 100644 index 0000000..a0d7dde Binary files /dev/null and b/themes/zen/static/favicon-16x16.png differ diff --git a/themes/zen/static/favicon-32x32.png b/themes/zen/static/favicon-32x32.png new file mode 100644 index 0000000..0765a70 Binary files /dev/null and b/themes/zen/static/favicon-32x32.png differ diff --git a/themes/zen/static/favicon.ico b/themes/zen/static/favicon.ico new file mode 100644 index 0000000..ef49508 Binary files /dev/null and b/themes/zen/static/favicon.ico differ diff --git a/themes/zen/static/images/language-icon.png b/themes/zen/static/images/language-icon.png new file mode 100755 index 0000000..662921b Binary files /dev/null and b/themes/zen/static/images/language-icon.png differ diff --git a/themes/zen/static/images/language-icon.svg b/themes/zen/static/images/language-icon.svg new file mode 100644 index 0000000..e15657b --- /dev/null +++ b/themes/zen/static/images/language-icon.svg @@ -0,0 +1 @@ + diff --git a/themes/zen/static/images/link-icon.svg b/themes/zen/static/images/link-icon.svg new file mode 100644 index 0000000..386bc89 --- /dev/null +++ b/themes/zen/static/images/link-icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/themes/zen/static/images/logo.png b/themes/zen/static/images/logo.png new file mode 100644 index 0000000..72aaa45 Binary files /dev/null and b/themes/zen/static/images/logo.png differ diff --git a/themes/zen/static/mstile-150x150.png b/themes/zen/static/mstile-150x150.png new file mode 100644 index 0000000..cee8987 Binary files /dev/null and b/themes/zen/static/mstile-150x150.png differ diff --git a/themes/zen/static/robots.txt b/themes/zen/static/robots.txt new file mode 100644 index 0000000..2d653cb --- /dev/null +++ b/themes/zen/static/robots.txt @@ -0,0 +1,18 @@ +# +# robots.txt +# +# This file is to prevent the crawling and indexing of certain parts +# of your site by web crawlers and spiders run by sites like Yahoo! +# and Google. By telling these "robots" where not to go on your site, +# you save bandwidth and server resources. +# +# This file will be ignored unless it is at the root of your host: +# Used: http://example.com/robots.txt +# Ignored: http://example.com/site/robots.txt +# +# For more information about the robots.txt standard, see: +# http://www.robotstxt.org/robotstxt.html + +User-agent: * +Crawl-delay: 10 +Disallow: diff --git a/themes/zen/static/safari-pinned-tab.svg b/themes/zen/static/safari-pinned-tab.svg new file mode 100644 index 0000000..017b3a2 --- /dev/null +++ b/themes/zen/static/safari-pinned-tab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/zen/static/site.webmanifest b/themes/zen/static/site.webmanifest new file mode 100644 index 0000000..90046ae --- /dev/null +++ b/themes/zen/static/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "Zen Demo", + "short_name": "Zen Demo", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-384x384.png", + "sizes": "384x384", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/themes/zen/theme.toml b/themes/zen/theme.toml new file mode 100644 index 0000000..aa42a8e --- /dev/null +++ b/themes/zen/theme.toml @@ -0,0 +1,17 @@ +name = "Zen" +description = "A solid base for your custom Hugo theme with pipes support for Sass and Javascript." +homepage = "https://github.com/frjo/hugo-theme-zen" +license = "GPLv2" +licenselink = "http://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +tags = ["accessible", "multilingual", "responsive", "blog", "search", "math", "podcast"] +features = ["accessible", "multilingual", "responsive", "grid", "sass", "search", "matomo", "jsonfeed", "math", "podcast"] +min_version = "0.93.0" + +[author] + name = "Fredrik Jonsson" + homepage = "https://xdeb.net/" + +[original] + name = "Drupal zen base theme" + homepage = "https://www.drupal.org/project/zen" + repo = "https://cgit.drupalcode.org/zen"