diff --git a/tests/fixtures/example-sites/cookbook/.env.example b/tests/fixtures/example-sites/cookbook/.env.example new file mode 100644 index 00000000000..93d0480f356 --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/.env.example @@ -0,0 +1,8 @@ +# If you have a domain, you should set the URL here so that permalinks can be generated. +# SITE_URL=https://example.org + +# If you want to use Torchlight.dev, enter your API token here to automatically enable it +# TORCHLIGHT_TOKEN=torch_ + +# If you want to change the default port of the realtime compiler server, you can do so here +# SERVER_PORT=8080 diff --git a/tests/fixtures/example-sites/cookbook/.gitattributes b/tests/fixtures/example-sites/cookbook/.gitattributes new file mode 100644 index 00000000000..ebb5fcb6137 --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/.gitattributes @@ -0,0 +1,16 @@ +* text=auto + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +/.github export-ignore +.styleci.yml export-ignore +.scrutinizer.yml export-ignore +BACKERS.md export-ignore +CONTRIBUTING.md export-ignore +CHANGELOG.md export-ignore + +tests/ export-ignore \ No newline at end of file diff --git a/tests/fixtures/example-sites/cookbook/.gitignore b/tests/fixtures/example-sites/cookbook/.gitignore new file mode 100644 index 00000000000..b6648de061d --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/.gitignore @@ -0,0 +1,13 @@ +/vendor +/node_modules +/builds +/.idea +/.vscode +/.vagrant +/.cache +.phpunit.result.cache + +.env + +/_site +composer.lock \ No newline at end of file diff --git a/tests/fixtures/example-sites/cookbook/LICENSE.md b/tests/fixtures/example-sites/cookbook/LICENSE.md new file mode 100644 index 00000000000..761daf50778 --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Caen De Silva + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/tests/fixtures/example-sites/cookbook/README.md b/tests/fixtures/example-sites/cookbook/README.md new file mode 100644 index 00000000000..dd38eafabcc --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/README.md @@ -0,0 +1,111 @@ +# HydePHP - Elegant and Powerful Static Site Generator + + +[![Latest Version on Packagist](https://img.shields.io/packagist/v/hyde/framework?include_prereleases)](https://packagist.org/packages/hyde/framework) +[![Total Downloads on Packagist](https://img.shields.io/packagist/dt/hyde/framework)](https://packagist.org/packages/hyde/framework) +[![License MIT](https://img.shields.io/github/license/hydephp/hyde) ](https://github.com/hydephp/hyde/blob/master/LICENSE.md) +[![Test Coverage](https://codecov.io/gh/hydephp/develop/branch/master/graph/badge.svg?token=G6N2161TOT)](https://codecov.io/gh/hydephp/develop) +[![Test Suite](https://github.com/hydephp/develop/actions/workflows/continuous-integration.yml/badge.svg)](https://github.com/hydephp/develop/actions/workflows/continuous-integration.yml) + + +## Make static websites, blogs, and documentation pages with the tools you already know and love. + +### About HydePHP +HydePHP is a content-first Laravel-powered console application that allows you to create static HTML pages, blog posts, and documentation sites, +using your choice of Markdown and/or Blade. + +Build sites in record-time with a full batteries-included TailwindCSS frontend that just works without any fuzz. + +### Speed & simplicity first, full control when you need it. +Hyde is all about letting you get started quickly by giving you a full-featured frontend starter kit, while also giving you the power and freedom of doing things the way you want to. + +Markdown purist? That's all you need. Blade artisan? Go for it. +Hyde comes with hand-crafted frontend templates so you can focus on your content. +You don't _need_ to customize anything. But you _can_ customize everything. + +See the documentation and learn more at https://hydephp.com/docs/ + +## Features + +### Content Creation +- Create blog posts using Markdown and Front Matter. +- Create documentation pages from plain Markdown, no front matter needed! +- Create simple pages using Markdown, or create advanced ones using Laravel Blade. +- You can scaffold blog posts and Markdown pages to automatically fill in the front matter. +- You can also scaffold Blade pages to automatically use the default layout. + +### Built-in Frontend +- Hyde comes with a TailwindCSS starter kit so you can start making content right away. +- The starter kit is fully responsive, has a dark mode theme, and is customizable. +- The frontend is accessible to screenreaders and rich with semantic HTML and microdata. +- Hyde automatically chooses the right layout to use depending on the content being rendered. +- Hyde also fills in and creates content like navigation menus and sidebars automatically. + +### Easy Asset Managing +- The Hyde starter comes with [HydeFront](https://github.com/hydephp/hydefront/) to serve the base stylesheet and JavaScript through the jsDelivr CDN. +- Hyde ships with precompiled and minified TailwindCSS styles in the app.css file, you can also load them through the CDN. +- This means that all the styles you need are already installed. However, if you want to customize the Tailwind config, or if you add new Tailwind classes through Blade files, you can simply run the `npm run dev` command to recompile the styles using Laravel Mix. + +### Customization +- You don't need to configure anything as Hyde is shipped with sensible defaults. +- You can, however, customize nearly everything. Here are some examples: +- All frontend components and page layouts are created with Blade so you + can publish the vendor views, just like in Laravel. +- Override many of the dynamic content features like the menus and footer. + +## Getting Started - High-level overview +> See [Installation Guide](https://hydephp.com/docs/master/installation.html) and [Getting Started](https://hydephp.com/docs/master/getting-started.html) for the full details. + +It's a breeze to get started with Hyde. Create a new Hyde project using Composer: + +```bash +composer create-project hyde/hyde +``` + +Next, place your Markdown files in one of the content directories: `_posts`, `_docs`, and `_pages` which also accepts Blade files. You can also use use the `hyde:make` command to scaffold them. + +When you're ready, run the build command to compile your static site which will save your HTML files in the `_site` directory. + +```bash +php hyde build +``` + +## ⚠ Beta Software Warning +Heads up! HydePHP is still new and currently in beta. Please report any bugs and issues in the appropriate issue tracker. Versions in the 0.x series might not be stable and may change at any time. No backwards compatibility guarantees are made and there will be breaking changes without notice. + +Please wait until v1.0 for production use and remember to back up your source files before updating (use Git!). +See https://hydephp.com/docs/master/updating-hyde for the upgrade guide. + +## Resources + +### Changelog + +Please see [CHANGELOG](https://github.com/hydephp/develop/blob/master/CHANGELOG.md) for more information on what has changed recently. + +### Contributing + +HydePHP is an open-source project, contributions are very welcome! + +Development is made in the HydePHP Monorepo, which you can find here https://github.com/hydephp/develop. + +### Security + +If you discover any security-related issues, please email caen@desilva.se instead of using the issue tracker. +All vulnerabilities will be promptly addressed. + +### Credits + +- [Caen De Silva](https://github.com/caendesilva), feel free to buy me a coffee! https://www.buymeacoffee.com/caen +- [All Contributors](../../contributors) + +### License + +The MIT License (MIT). Please see [License File](LICENSE.md) for more information. + +### Attributions +> Please see the respective authors' repositories for their license files + +- The Hyde core is built with [Laravel Zero](https://laravel-zero.com/) which is based on [Laravel](https://laravel.com/) +- The documentation frontend was originally based on [Lagrafo - Docs for Laravel apps](https://github.com/caendesilva/lagrafo) +- The dark mode switch is based on a component from [Flowbite](https://flowbite.com/docs/customize/dark-mode/). +- The frontend is built with [TailwindCSS](https://tailwindcss.com/). diff --git a/tests/fixtures/example-sites/cookbook/SECURITY.md b/tests/fixtures/example-sites/cookbook/SECURITY.md new file mode 100644 index 00000000000..22c2b805181 --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/SECURITY.md @@ -0,0 +1,28 @@ +# Security Policy + +## Supported Versions + +### Hyde is currently in Beta and has no supported versions. + +Versions in the 0.x series are not stable and may change at any time. +No backwards compatibility guarantees are made and there will be breaking changes without notice. + +| Version | Supported | Classification | +|---------|-----------|---------------------------| +| > 0.64 | :warning: | Beta (active development) | +| < 0.64 | :x: | Beta (legacy) | +| < 0.8 | :x: | Alpha stage | + + + + + +## Reporting a Vulnerability + +If you discover a security vulnerability within this package, please send an e-mail to the creator, Caen De Silva, via caen@desilva.se. + +All security vulnerabilities will be promptly addressed. diff --git a/tests/fixtures/example-sites/cookbook/_docs/.gitkeep b/tests/fixtures/example-sites/cookbook/_docs/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/fixtures/example-sites/cookbook/_media/app.css b/tests/fixtures/example-sites/cookbook/_media/app.css new file mode 100644 index 00000000000..dd840dbdbe6 --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/_media/app.css @@ -0,0 +1,2 @@ +/*! HydeFront v2.0.0 | MIT License | https://hydephp.com*/.hyde-search-context{margin-bottom:10px}.hyde-search-results{margin-top:1.25em;max-height:60vh;overflow-y:auto}#search-status{margin-top:0}#sidebar-toggle{display:inline-block;height:2rem;position:relative;width:2rem}#sidebar-toggle span.icon-bar{background-color:#000;display:block;height:2.375px;left:5.5px;position:absolute;transition:all .3s ease-out;width:20px}#sidebar-toggle span.icon-bar:first-child{top:9px}#sidebar-toggle span.icon-bar:nth-child(2),#sidebar-toggle span.icon-bar:nth-child(3){top:15px;transform-origin:center}#sidebar-toggle span.icon-bar:last-child{top:21px}#sidebar-toggle.active span.icon-bar:first-child{opacity:0}#sidebar-toggle.active span.icon-bar:nth-child(2){transform:rotate(45deg)}#sidebar-toggle.active span.icon-bar:nth-child(3){transform:rotate(-45deg)}#sidebar-toggle.active span.icon-bar:last-child{opacity:0}.dark #sidebar-toggle span.icon-bar{background-color:#fff;height:2px}.table-of-contents{padding-bottom:.75rem}.table-of-contents>li{margin-bottom:.35rem;margin-top:.15rem}.table-of-contents ul{padding-left:.5rem}.table-of-contents a{display:block;margin-left:-2rem;opacity:.825;padding-left:2rem}.table-of-contents a:before{content:"#";font-size:75%;margin-right:4px;opacity:.5;transition:opacity .3s ease-in-out}.table-of-contents a:hover{background-color:hsla(0,0%,87%,.5);opacity:1;transition:opacity,background .3s ease-in-out}.table-of-contents a:hover:before{opacity:1}#hyde-docs .prose h1,#hyde-docs .prose h2,#hyde-docs .prose h3,#hyde-docs .prose h4,#hyde-docs .prose h5,#hyde-docs .prose h6{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}#hyde-docs .prose h1:focus .heading-permalink,#hyde-docs .prose h1:hover .heading-permalink,#hyde-docs .prose h2:focus .heading-permalink,#hyde-docs .prose h2:hover .heading-permalink,#hyde-docs .prose h3:focus .heading-permalink,#hyde-docs .prose h3:hover .heading-permalink,#hyde-docs .prose h4:focus .heading-permalink,#hyde-docs .prose h4:hover .heading-permalink,#hyde-docs .prose h5:focus .heading-permalink,#hyde-docs .prose h5:hover .heading-permalink,#hyde-docs .prose h6:focus .heading-permalink,#hyde-docs .prose h6:hover .heading-permalink{filter:grayscale(100%);opacity:.75;transition:opacity .1s ease-out}#hyde-docs .prose h1 .heading-permalink,#hyde-docs .prose h2 .heading-permalink,#hyde-docs .prose h3 .heading-permalink,#hyde-docs .prose h4 .heading-permalink,#hyde-docs .prose h5 .heading-permalink,#hyde-docs .prose h6 .heading-permalink{margin-left:.25rem;opacity:0;padding:0 .25rem;scroll-margin:1rem;transition:opacity .3s ease}#hyde-docs .prose h1 .heading-permalink:focus,#hyde-docs .prose h1 .heading-permalink:hover,#hyde-docs .prose h2 .heading-permalink:focus,#hyde-docs .prose h2 .heading-permalink:hover,#hyde-docs .prose h3 .heading-permalink:focus,#hyde-docs .prose h3 .heading-permalink:hover,#hyde-docs .prose h4 .heading-permalink:focus,#hyde-docs .prose h4 .heading-permalink:hover,#hyde-docs .prose h5 .heading-permalink:focus,#hyde-docs .prose h5 .heading-permalink:hover,#hyde-docs .prose h6 .heading-permalink:focus,#hyde-docs .prose h6 .heading-permalink:hover{filter:unset;opacity:1}html{scroll-behavior:smooth}.torchlight-enabled pre{border-radius:.25rem;margin-bottom:1rem;margin-top:1rem;overflow-x:auto;padding:0}.torchlight-enabled pre code.torchlight{display:block;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;padding-bottom:1rem;padding-top:1rem}.torchlight-enabled pre code.torchlight .line{padding-left:1rem;padding-right:1rem}.torchlight-enabled pre code.torchlight .line-number,.torchlight-enabled pre code.torchlight .summary-caret{margin-right:1rem}.prose blockquote.info{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}.prose blockquote.success{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity))}.prose blockquote.warning{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity))}.prose blockquote.danger{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}code{display:inline-block;max-width:80vw;overflow-x:auto;vertical-align:top;word-break:break-all}pre code{display:block;max-width:unset}pre>code>.filepath{float:right;opacity:.5;position:relative;right:.25rem;top:-.25rem;transition:opacity .25s}pre>code>.filepath:hover{opacity:1}.torchlight-enabled pre>code>.filepath{right:1rem}@media screen and (max-width:767px){pre>code>.filepath{display:none}}@media screen and (min-width:768px){[x-cloak].x-uncloak-md{display:revert!important}} +/*! tailwindcss v3.1.0 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}html{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}::-webkit-backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:96ch}.prose :where([class~=lead]):not(:where([class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-bottom:1.2em;margin-top:1.2em}.prose :where(a):not(:where([class~=not-prose] *)){color:#5956eb;font-weight:500;text-decoration:none}.prose :where(a):not(:where([class~=not-prose] *)):hover{color:#4f46e5}.prose :where(strong):not(:where([class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(ol):not(:where([class~=not-prose] *)){list-style-type:decimal;padding-left:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose] *)){list-style-type:disc;padding-left:1.625em}.prose :where(ol>li):not(:where([class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.prose :where(ul>li):not(:where([class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(hr):not(:where([class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-bottom:3em;margin-top:3em}.prose :where(blockquote):not(:where([class~=not-prose] *)){background-color:#80808020;border-left-color:#d1d5db;border-left-width:.25rem;color:unset;font-style:unset;font-weight:500;line-height:1.25em;margin-bottom:1em;margin-top:1em;padding-bottom:.25em;padding-left:.75em;padding-top:.25em;quotes:"\201C""\201D""\2018""\2019"}.prose :where(blockquote):not(:where([class~=not-prose] *)) p{margin-bottom:.25em;margin-top:.25em;padding-right:.25em}.prose :where(blockquote):not(:where([class~=not-prose] *)) p:before{content:unset}.prose :where(blockquote):not(:where([class~=not-prose] *)) p:after{content:unset}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose] *)){color:var(--tw-prose-headings);font-size:2.25em;font-weight:800;line-height:1.1111111;margin-bottom:.8888889em;margin-top:0}.prose :where(h1 strong):not(:where([class~=not-prose] *)){font-weight:900}.prose :where(h2):not(:where([class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.5em;font-weight:700;line-height:1.3333333;margin-bottom:.75em;margin-top:1.5em}.prose :where(h2 strong):not(:where([class~=not-prose] *)){font-weight:800}.prose :where(h3):not(:where([class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.25em;font-weight:600;line-height:1.6;margin-bottom:.6em;margin-top:1.6em}.prose :where(h3 strong):not(:where([class~=not-prose] *)){font-weight:700}.prose :where(h4):not(:where([class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;line-height:1.5;margin-bottom:.5em;margin-top:1.5em}.prose :where(h4 strong):not(:where([class~=not-prose] *)){font-weight:700}.prose :where(figure>*):not(:where([class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose :where(figcaption):not(:where([class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose :where(code):not(:where([class~=not-prose] *)){background-color:#80808033;border-radius:4px;color:var(--tw-prose-code);font-size:.875em;font-weight:600;font:unset;margin-left:-2px;margin-right:1px;padding-left:4px;padding-right:4px}.prose :where(code):not(:where([class~=not-prose] *)):before{content:unset}.prose :where(code):not(:where([class~=not-prose] *)):after{content:unset}.prose :where(a code):not(:where([class~=not-prose] *)){color:var(--tw-prose-links)}.prose :where(pre):not(:where([class~=not-prose] *)){background-color:var(--tw-prose-pre-bg);border-radius:.375rem;color:var(--tw-prose-pre-code);font-size:.875em;font-weight:400;line-height:1.7142857;margin-bottom:1.7142857em;margin-top:1.7142857em;overflow-x:auto;padding:.8571429em 1.1428571em}.prose :where(pre):not(:where([class~=not-prose] *)) code{font-family:Fira Code Regular,Consolas,Monospace,Courier New}.prose :where(pre code):not(:where([class~=not-prose] *)){background-color:transparent;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;padding:0}.prose :where(pre code):not(:where([class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose] *)){font-size:.875em;line-height:1.7142857;margin-bottom:2em;margin-top:2em;table-layout:auto;text-align:left;width:100%}.prose :where(thead):not(:where([class~=not-prose] *)){border-bottom-color:var(--tw-prose-th-borders);border-bottom-width:1px}.prose :where(thead th):not(:where([class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;padding-bottom:.5714286em;padding-left:.5714286em;padding-right:.5714286em;vertical-align:bottom}.prose :where(tbody tr):not(:where([class~=not-prose] *)){border-bottom-color:var(--tw-prose-td-borders);border-bottom-width:1px}.prose :where(tbody tr:last-child):not(:where([class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose] *)){padding:.5714286em;vertical-align:baseline}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.5em}.prose :where(p):not(:where([class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose :where(img):not(:where([class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(video):not(:where([class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(figure):not(:where([class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(h2 code):not(:where([class~=not-prose] *)){font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose] *)){font-size:.9em}.prose :where(li):not(:where([class~=not-prose] *)){margin-bottom:.5em;margin-top:.5em}.prose :where(ol>li):not(:where([class~=not-prose] *)){padding-left:.375em}.prose :where(ul>li):not(:where([class~=not-prose] *)){padding-left:.375em}.prose>:where(ul>li p):not(:where([class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose>:where(ul>li>:first-child):not(:where([class~=not-prose] *)){margin-top:1.25em}.prose>:where(ul>li>:last-child):not(:where([class~=not-prose] *)){margin-bottom:1.25em}.prose>:where(ol>li>:first-child):not(:where([class~=not-prose] *)){margin-top:1.25em}.prose>:where(ol>li>:last-child):not(:where([class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose :where(hr+*):not(:where([class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose] *)){padding-left:0}.prose :where(thead th:last-child):not(:where([class~=not-prose] *)){padding-right:0}.prose :where(tbody td:first-child):not(:where([class~=not-prose] *)){padding-left:0}.prose :where(tbody td:last-child):not(:where([class~=not-prose] *)){padding-right:0}.prose>:where(:first-child):not(:where([class~=not-prose] *)){margin-top:0}.prose>:where(:last-child):not(:where([class~=not-prose] *)){margin-bottom:0}.sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.visible{visibility:visible}.invisible{visibility:hidden}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.left-80{left:20rem}.left-0{left:0}.right-0{right:0}.top-auto{top:auto}.top-16{top:4rem}.top-0{top:0}.right-4{right:1rem}.top-4{top:1rem}.bottom-4{bottom:1rem}.-left-64{left:-16rem}.bottom-0{bottom:0}.z-50{z-index:50}.z-40{z-index:40}.z-10{z-index:10}.z-30{z-index:30}.float-right{float:right}.float-left{float:left}.m-8{margin:2rem}.m-2{margin:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0{margin-bottom:0;margin-top:0}.my-4{margin-bottom:1rem;margin-top:1rem}.my-8{margin-bottom:2rem;margin-top:2rem}.mx-0{margin-left:0;margin-right:0}.mx-4{margin-left:1rem;margin-right:1rem}.mx-8{margin-left:2rem;margin-right:2rem}.my-3{margin-bottom:.75rem;margin-top:.75rem}.my-auto{margin-bottom:auto;margin-top:auto}.mx-3{margin-left:.75rem;margin-right:.75rem}.my-1{margin-bottom:.25rem;margin-top:.25rem}.-mx-4{margin-left:-1rem;margin-right:-1rem}.my-2{margin-bottom:.5rem;margin-top:.5rem}.ml-auto{margin-left:auto}.mr-auto{margin-right:auto}.mb-8{margin-bottom:2rem}.mb-4{margin-bottom:1rem}.mt-2{margin-top:.5rem}.mt-8{margin-top:2rem}.mt-4{margin-top:1rem}.mt-auto{margin-top:auto}.mt-3{margin-top:.75rem}.-ml-4{margin-left:-1rem}.-ml-8{margin-left:-2rem}.mb-2{margin-bottom:.5rem}.-ml-1{margin-left:-.25rem}.ml-4{margin-left:1rem}.mr-1{margin-right:.25rem}.mr-4{margin-right:1rem}.mb-3{margin-bottom:.75rem}.-mb-2{margin-bottom:-.5rem}.-ml-6{margin-left:-1.5rem}.mb-0{margin-bottom:0}.block{display:block}.inline{display:inline}.flex{display:flex}.contents{display:contents}.hidden{display:none}.h-1{height:.25rem}.h-auto{height:auto}.h-6{height:1.5rem}.h-16{height:4rem}.h-8{height:2rem}.h-screen{height:100vh}.h-0{height:0}.h-\[calc\(100vh_-_8rem\)\]{height:calc(100vh - 8rem)}.h-5{height:1.25rem}.max-h-\[75vh\]{max-height:75vh}.min-h-screen{min-height:100vh}.min-h-\[calc\(100vh_-_4rem\)\]{min-height:calc(100vh - 4rem)}.min-h-\[300px\]{min-height:300px}.w-1{width:.25rem}.w-full{width:100%}.w-16{width:4rem}.w-fit{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.w-screen{width:100vw}.w-6{width:1.5rem}.w-\[70ch\]{width:70ch}.w-64{width:16rem}.w-5{width:1.25rem}.max-w-sm{max-width:24rem}.max-w-7xl{max-width:80rem}.max-w-lg{max-width:32rem}.max-w-3xl{max-width:48rem}.max-w-xs{max-width:20rem}.max-w-\[1000px\]{max-width:1000px}.max-w-full{max-width:100%}.flex-shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-auto{cursor:auto}.cursor-pointer{cursor:pointer}.list-none{list-style-type:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.overflow-auto{overflow:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.border-2{border-width:2px}.border-4{border-width:4px}.border-y{border-bottom-width:1px}.border-t,.border-y{border-top-width:1px}.border-b-4{border-bottom-width:4px}.border-l-\[0\.325rem\]{border-left-width:.325rem}.border-b{border-bottom-width:1px}.border-l-4{border-left-width:4px}.border-yellow-400{--tw-border-opacity:1;border-color:rgb(250 204 21/var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.border-indigo-400{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-indigo-500{--tw-border-opacity:1;border-color:rgb(89 86 235/var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.bg-black\/5{background-color:rgba(0,0,0,.05)}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.bg-black\/50{background-color:rgba(0,0,0,.5)}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-cover{background-size:cover}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.bg-no-repeat{background-repeat:no-repeat}.fill-current{fill:currentColor}.fill-black{fill:#000}.p-4{padding:1rem}.p-12{padding:3rem}.p-2{padding:.5rem}.py-0{padding-bottom:0;padding-top:0}.py-4{padding-bottom:1rem;padding-top:1rem}.py-8{padding-bottom:2rem;padding-top:2rem}.px-0{padding-left:0;padding-right:0}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-32{padding-bottom:8rem;padding-top:8rem}.py-16{padding-bottom:4rem;padding-top:4rem}.py-12{padding-bottom:3rem;padding-top:3rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-24{padding-bottom:6rem;padding-top:6rem}.pb-12{padding-bottom:3rem}.pt-3{padding-top:.75rem}.pl-4{padding-left:1rem}.pl-8{padding-left:2rem}.pb-3{padding-bottom:.75rem}.pl-5{padding-left:1.25rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-sans{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-5xl{font-size:3rem;line-height:1}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[90\%\]{font-size:90%}.text-base{font-size:1rem;line-height:1.5rem}.font-black{font-weight:900}.font-light{font-weight:300}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-normal{line-height:1.5}.leading-10{line-height:2.5rem}.leading-relaxed{line-height:1.625}.leading-8{line-height:2rem}.leading-4{line-height:1rem}.tracking-wide{letter-spacing:.025em}.tracking-tight{letter-spacing:-.025em}.tracking-normal{letter-spacing:0}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity))}.text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}.text-transparent{color:transparent}.text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-indigo-500{--tw-text-opacity:1;color:rgb(89 86 235/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity))}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-75{opacity:.75}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.drop-shadow-2xl{--tw-drop-shadow:drop-shadow(0 25px 25px rgba(0,0,0,.15));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-75{transition-duration:75ms}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}[x-cloak]{display:none!important}.first\:mt-0:first-child{margin-top:0}.hover\:bg-black\/10:hover{background-color:rgba(0,0,0,.1)}.hover\:bg-black\/5:hover{background-color:rgba(0,0,0,.05)}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.hover\:underline:hover{-webkit-text-decoration-line:underline;text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:not-sr-only:focus{clip:auto;height:auto;margin:0;overflow:visible;padding:0;position:static;white-space:normal;width:auto}.focus\:absolute:focus{position:absolute}.focus\:mx-auto:focus{margin-left:auto;margin-right:auto}.focus\:mt-2:focus{margin-top:.5rem}.focus\:w-64:focus{width:16rem}.focus\:p-2:focus{padding:.5rem}.prose-h1\:mb-3 :is(:where(h1):not(:where([class~=not-prose] *))){margin-bottom:.75rem}.prose-p\:my-3 :is(:where(p):not(:where([class~=not-prose] *))){margin-bottom:.75rem;margin-top:.75rem}.dark .dark\:prose-invert{--tw-prose-body:var(--tw-prose-invert-body);--tw-prose-headings:var(--tw-prose-invert-headings);--tw-prose-lead:var(--tw-prose-invert-lead);--tw-prose-links:var(--tw-prose-invert-links);--tw-prose-bold:var(--tw-prose-invert-bold);--tw-prose-counters:var(--tw-prose-invert-counters);--tw-prose-bullets:var(--tw-prose-invert-bullets);--tw-prose-hr:var(--tw-prose-invert-hr);--tw-prose-quotes:var(--tw-prose-invert-quotes);--tw-prose-quote-borders:var(--tw-prose-invert-quote-borders);--tw-prose-captions:var(--tw-prose-invert-captions);--tw-prose-code:var(--tw-prose-invert-code);--tw-prose-pre-code:var(--tw-prose-invert-pre-code);--tw-prose-pre-bg:var(--tw-prose-invert-pre-bg);--tw-prose-th-borders:var(--tw-prose-invert-th-borders);--tw-prose-td-borders:var(--tw-prose-invert-td-borders)}.dark .dark\:prose-invert :where(a):not(:where([class~=not-prose] *)){color:#818cf8}.dark .dark\:prose-invert :where(a):not(:where([class~=not-prose] *)):hover{color:#6366f1}.dark .dark\:block{display:block}.dark .dark\:hidden{display:none}.dark .dark\:border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.dark .dark\:border-\[\#1b2533\]{--tw-border-opacity:1;border-color:rgb(27 37 51/var(--tw-border-opacity))}.dark .dark\:bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.dark .dark\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.dark .dark\:bg-black\/10{background-color:rgba(0,0,0,.1)}.dark .dark\:bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.dark .dark\:bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.dark .dark\:fill-gray-200{fill:#e5e7eb}.dark .dark\:fill-white{fill:#fff}.dark .dark\:font-medium{font-weight:500}.dark .dark\:text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.dark .dark\:text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.dark .dark\:text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}.dark .dark\:text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}.dark .dark\:hover\:bg-black\/10:hover{background-color:rgba(0,0,0,.1)}.dark .dark\:hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}@media (min-width:640px){.sm\:mb-0{margin-bottom:0}.sm\:mt-4{margin-top:1rem}.sm\:flex{display:flex}.sm\:leading-none{line-height:1}.sm\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}}@media (min-width:768px){.md\:visible{visibility:visible}.md\:top-0{top:0}.md\:left-64{left:16rem}.md\:left-0{left:0}.md\:my-6{margin-bottom:1.5rem;margin-top:1.5rem}.md\:mx-2{margin-left:.5rem;margin-right:.5rem}.md\:my-0{margin-bottom:0;margin-top:0}.md\:mt-8{margin-top:2rem}.md\:mb-12{margin-bottom:3rem}.md\:mt-0{margin-top:0}.md\:ml-0{margin-left:0}.md\:block{display:block}.md\:inline-block{display:inline-block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:min-h-screen{min-height:100vh}.md\:w-1\/2{width:50%}.md\:w-\[calc\(100vw_-_16rem\)\]{width:calc(100vw - 16rem)}.md\:w-auto{width:auto}.md\:max-w-none{max-width:none}.md\:max-w-2xl{max-width:42rem}.md\:flex-grow-0{flex-grow:0}.md\:flex-grow{flex-grow:1}.md\:items-center{align-items:center}.md\:border-none{border-style:none}.md\:bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.md\:bg-transparent{background-color:transparent}.md\:bg-left{background-position:0}.md\:py-0{padding-bottom:0;padding-top:0}.md\:px-16{padding-left:4rem;padding-right:4rem}.md\:py-16{padding-bottom:4rem;padding-top:4rem}.md\:pb-0{padding-bottom:0}.md\:pl-0{padding-left:0}.md\:text-center{text-align:center}.md\:text-3xl{font-size:1.875rem;line-height:2.25rem}.md\:text-6xl{font-size:3.75rem;line-height:1}.md\:text-5xl{font-size:3rem;line-height:1}.md\:text-4xl{font-size:2.25rem;line-height:2.5rem}.md\:shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.dark .dark\:md\:bg-transparent{background-color:transparent}}@media (min-width:1024px){.lg\:mb-12{margin-bottom:3rem}.lg\:ml-8{margin-left:2rem}.lg\:bg-center{background-position:50%}.lg\:text-7xl{font-size:4.5rem;line-height:1}.lg\:text-lg{font-size:1.125rem;line-height:1.75rem}.lg\:text-5xl{font-size:3rem;line-height:1}}@media (min-width:1280px){.xl\:mb-16{margin-bottom:4rem}} diff --git a/tests/fixtures/example-sites/cookbook/_pages/404.blade.php b/tests/fixtures/example-sites/cookbook/_pages/404.blade.php new file mode 100644 index 00000000000..0c302f01a0c --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/_pages/404.blade.php @@ -0,0 +1,51 @@ + + + + + 404 - Page not found + + + + + + + + + + + + + + + +
+
+
+
+ 404 +
+ +
+ +

+ Sorry, the page you are looking for could not be found. +

+ + + + +
+ +
+ +
+
+
+
+
+ + \ No newline at end of file diff --git a/tests/fixtures/example-sites/cookbook/_pages/index.blade.php b/tests/fixtures/example-sites/cookbook/_pages/index.blade.php new file mode 100644 index 00000000000..b056164374f --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/_pages/index.blade.php @@ -0,0 +1,17 @@ +@php($title = 'Latest Posts') +@extends('hyde::layouts.app') +@section('content') + +
+
+

+ Latest Posts +

+
+ +
+ @include('hyde::components.blog-post-feed') +
+
+ +@endsection diff --git a/tests/fixtures/example-sites/cookbook/_posts/.gitkeep b/tests/fixtures/example-sites/cookbook/_posts/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/fixtures/example-sites/cookbook/_posts/a-nice-cup-of-tea.md b/tests/fixtures/example-sites/cookbook/_posts/a-nice-cup-of-tea.md new file mode 100644 index 00000000000..543cf3b0423 --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/_posts/a-nice-cup-of-tea.md @@ -0,0 +1,37 @@ +--- +title: 'A Nice Cup of Tea' +description: "A nice cup of tea is the usual answer in Britain and Ireland to any everyday problem. Nothing is so bad that a nice cup of tea with a friend or family member can't make it better." +category: Cookbook +author: 'wikibooks' +date: '27 July 2022 09:38 UTC' +image: + url: https://cdn.desilva.se/hydephp/media/demos/1024px-Nice_Cup_of_Tea.jpg + description: 'A nice cup of tea (and a sit down). A Denby teapot and cup with milk jug.' + title: 'A nice cup of tea (and a sit down). A Denby teapot and cup with milk jug.' + author: 'Wikimedia Commons' + copyright: 'Public Domain' +--- + + + +## Introduction + +A nice cup of tea is the usual answer in Britain and Ireland to any everyday problem. Nothing is so bad that a nice cup of tea with a friend or family member can't make it better. + +## Procedure + +A nice cup of tea, milk and no sugar + +Preparing and serving the tea + +1. Pour freshly drawn water into a tea kettle. Electric kettles are fast and convenient. +2. If infusing a pot of tea, pour some hot tap water into your teapot and let stand for about several seconds to a minute to pre-warm it. Alternately, you can swish some of the hotter boiling water from your kettle around in the teapot for a few seconds. Pour out this water before adding the tea to the teapot. +3. If using loose tea, prepare the tea + 1. Commonly one-half to one tea measure (or rounded teaspoon if you do not have a tea measure) is added per desired cup of tea. Some people add an extra measure "for the pot" (e.g., if 4 cups of tea are desired, 5 measures of tea would be used. It really is a matter of personal preference.) + 2. If you are using an infuser, be sure it is closed tightly so the tea does not spill into the pot. Rinse the tea-filled infuser briefly under cool tap water to wash away tiny flakes that would otherwise drift into the teapot. + 3. If using a filter basket infuser, do not overfill the basket (refer to the instructions that came with your basket). The brief rinse is usually not necessary unless the basket's mesh is quite porous. + 4. Simply dropping loose tea into the teapot is also an option, though you may want to strain the tea as you pour it into the cups. +4. Place the tea or tea bag into the teapot. +5. When the water reaches the preferred temperature, pour it from the tea kettle into the teapot or single-serving teacup. As you pour, try to avoid pouring directly onto the tea (especially important for green and white teas) to avoid scalding the leaves. +6. Allow the tea to infuse quietly (i.e., do not stir the teapot or "dunk the teabag"). Agitating the tea releases more of the bitter compounds and degrades the taste. Watch the time to avoid over-infusion, and remove the infuser or tea bag when the time is up. If you did not use an infuser or tea bag, pour the tea into cups for immediate consumption. +7. Remember that the tannins in tea stain, so it is advisable to pour the tea over a non-staining surface, wipe up any spills quickly, and do not leave tea standing in a teapot for long periods of time. diff --git a/tests/fixtures/example-sites/cookbook/app/Providers/AppServiceProvider.php b/tests/fixtures/example-sites/cookbook/app/Providers/AppServiceProvider.php new file mode 100644 index 00000000000..ee8ca5bcd8f --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/app/Providers/AppServiceProvider.php @@ -0,0 +1,28 @@ +singleton( + Illuminate\Contracts\Console\Kernel::class, + LaravelZero\Framework\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Debug\ExceptionHandler::class, + Illuminate\Foundation\Exceptions\Handler::class +); + +/* +|-------------------------------------------------------------------------- +| Set Important Hyde Configurations +|-------------------------------------------------------------------------- +| +| Now, we create a new instance of the HydeKernel, which encapsulates +| our Hyde project and provides helpful methods for interacting with it. +| Then, we bind the kernel into the application service container. +| +*/ + +$hyde = new \Hyde\Foundation\HydeKernel( + dirname(__DIR__) +); + +$app->singleton( + \Hyde\Foundation\HydeKernel::class, function () { + return \Hyde\Foundation\HydeKernel::getInstance(); + } +); + +\Hyde\Foundation\HydeKernel::setInstance($hyde); + +/* +|-------------------------------------------------------------------------- +| Return The Application +|-------------------------------------------------------------------------- +| +| This script returns the application instance. The instance is given to +| the calling script so we can separate the building of the instances +| from the actual running of the application and sending responses. +| +*/ + +return $app; diff --git a/tests/fixtures/example-sites/cookbook/bin/release.php b/tests/fixtures/example-sites/cookbook/bin/release.php new file mode 100644 index 00000000000..b2cdff77430 --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/bin/release.php @@ -0,0 +1,167 @@ +'; + +$changelog = substr_replace($changelog, $needle."\n\n".$notes, strpos($changelog, $needle), strlen($needle)); +file_put_contents(__DIR__.'/../../CHANGELOG.md', $changelog); + +echo "Done. \n"; + +$title = "$version - ".date('Y-m-d'); +$body = ltrim(substr($notes, strpos($notes, "\n") + 2)); +$companionBody = sprintf('Please see the release notes in the development monorepo https://github.com/hydephp/develop/releases/tag/%s', $version); + +$developCreateLink = "https://github.com/hydephp/develop/releases/new?tag=$version&title=".urlencode($title).'&body='.urlencode($body); +$frameworkCreateLink = "https://github.com/hydephp/framework/releases/new?tag=$version&title=".urlencode($title).'&body='.urlencode($companionBody); +$hydeCreateLink = "https://github.com/hydephp/hyde/releases/new?tag=$version&title=".urlencode($title).'&body='.urlencode($companionBody); + +echo 'Creating HTML file...'; + +file_put_contents(getcwd().'/release.html', << + + + + + + Release $version + + +

Release $version

+
+ Release notes +
$notes
+
+

+

Create the Git commit

+
+ +

+

+

Publish the GitHub releases

+ +

+ + +HTML +); + +echo "Done. \n"; + +echo "\nAll done!\nNext, verify the changes, then you can commit the release with the following message: \n"; +echo "$title\n"; +echo "And here is a link to publish the release: \n"; +echo "$developCreateLink\n"; + +echo "\n\nThen you can use the following to to create the companion releases: \n"; +echo "$frameworkCreateLink\n"; +echo "$hydeCreateLink\n"; + +echo "\nYou can also open the following file in your browser, to create the releases through that: \n"; +echo 'file://'.str_replace('\\', '/', getcwd()).'/release.html'; diff --git a/tests/fixtures/example-sites/cookbook/composer.json b/tests/fixtures/example-sites/cookbook/composer.json new file mode 100644 index 00000000000..54264348cc5 --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/composer.json @@ -0,0 +1,63 @@ +{ + "name": "hyde/hyde", + "description": "Static Site Generator to rapidly create Blogs, Documentation Sites, and more, using Markdown and Blade.", + "keywords": [ + "framework", + "hyde", + "hyde framework", + "hydephp", + "static site generator", + "static site framework", + "ssg" + ], + "homepage": "https://hydephp.com", + "type": "project", + "license": "MIT", + "support": { + "issues": "https://github.com/hydephp/hyde/issues", + "source": "https://github.com/hydephp/hyde" + }, + "authors": [ + { + "name": "Caen De Silva", + "email": "caen@desilva.se" + } + ], + "require": { + "php": "^8.1", + "hyde/framework": "dev-develop", + "laravel-zero/framework": "^9.1" + }, + "require-dev": { + "hyde/realtime-compiler": "^2.7" + }, + "autoload": { + "psr-4": { + "App\\": "app/" + } + }, + "autoload-dev": { + "psr-4": { + "Hyde\\Testing\\": "tests/" + } + }, + "scripts": { + "post-autoload-dump": [ + "@php -r \"@unlink('./storage/framework/cache/packages.php');\"", + "@php hyde package:discover --ansi" + ] + }, + "config": { + "preferred-install": "dist", + "sort-packages": true, + "optimize-autoloader": true, + "allow-plugins": { + "pestphp/pest-plugin": true + } + }, + "minimum-stability": "dev", + "prefer-stable": true, + "bin": [ + "hyde" + ] +} diff --git a/tests/fixtures/example-sites/cookbook/config/app.php b/tests/fixtures/example-sites/cookbook/config/app.php new file mode 100644 index 00000000000..640003d9db5 --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/config/app.php @@ -0,0 +1,106 @@ + " + +\033[34m __ __ __ \033[33m ___ __ _____ +\033[34m / // /_ _____/ /__ \033[33m/ _ \/ // / _ \ +\033[34m / _ / // / _ / -_)\033[33m ___/ _ / ___/ +\033[34m /_//_/\_, /\_,_/\__/\033[33m_/ /_//_/_/ +\033[34m /___/ + +\033[0m", + + /* + |-------------------------------------------------------------------------- + | Application Version + |-------------------------------------------------------------------------- + | + | This value determines the "version" your application is currently running + | in. You may want to follow the "Semantic Versioning" - Given a version + | number MAJOR.MINOR.PATCH when an update happens: https://semver.org. + | + */ + + 'version' => Hyde\Hyde::version(), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. This can be overridden using + | the global command line "--env" option when calling commands. + | + | When using Hyde this setting should always be set to `production`. + | However, when developing the Hyde Core, set it to `development` + | in your .env to unlock the development commands. + | + */ + + 'env' => env('ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Autoloaded Service Providers + |-------------------------------------------------------------------------- + | + | The service providers listed here will be automatically loaded on the + | request to your application. Feel free to add your own services to + | this array to grant expanded functionality to your applications. + | + */ + + 'providers' => [ + App\Providers\AppServiceProvider::class, + Hyde\Framework\HydeServiceProvider::class, + ], + + /* + |-------------------------------------------------------------------------- + | Class Aliases + |-------------------------------------------------------------------------- + | + | This array of class aliases will be registered when this application + | is started. However, feel free to register as many as you wish as + | the aliases are "lazy" loaded so they don't hinder performance. + | + */ + + 'aliases' => [ + 'Hyde' => Hyde\Hyde::class, + 'Site' => \Hyde\Facades\Site::class, + 'Route' => \Hyde\Facades\Route::class, + 'Asset' => \Hyde\Facades\Asset::class, + 'BladePage' => \Hyde\Pages\BladePage::class, + 'MarkdownPage' => \Hyde\Pages\MarkdownPage::class, + 'MarkdownPost' => \Hyde\Pages\MarkdownPost::class, + 'DocumentationPage' => \Hyde\Pages\DocumentationPage::class, + ], + +]; diff --git a/tests/fixtures/example-sites/cookbook/config/cache.php b/tests/fixtures/example-sites/cookbook/config/cache.php new file mode 100644 index 00000000000..0ddcdd43c05 --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/config/cache.php @@ -0,0 +1,12 @@ + 'file', + + 'stores' => [ + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + ], + ], +]; diff --git a/tests/fixtures/example-sites/cookbook/config/commands.php b/tests/fixtures/example-sites/cookbook/config/commands.php new file mode 100644 index 00000000000..d15ac8b7ac1 --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/config/commands.php @@ -0,0 +1,83 @@ + NunoMaduro\LaravelConsoleSummary\SummaryCommand::class, + + /* + |-------------------------------------------------------------------------- + | Commands Paths + |-------------------------------------------------------------------------- + | + | This value determines the "paths" that should be loaded by the console's + | kernel. Foreach "path" present on the array provided below the kernel + | will extract all "Illuminate\Console\Command" based class commands. + | + */ + + 'paths' => [app_path('Commands')], + + /* + |-------------------------------------------------------------------------- + | Added Commands + |-------------------------------------------------------------------------- + | + | You may want to include a single command class without having to load an + | entire folder. Here you can specify which commands should be added to + | your list of commands. The console's kernel will try to load them. + | + */ + + 'add' => [ + // + ], + + /* + |-------------------------------------------------------------------------- + | Hidden Commands + |-------------------------------------------------------------------------- + | + | Your application commands will always be visible on the application list + | of commands. But you can still make them "hidden" specifying an array + | of commands below. All "hidden" commands can still be run/executed. + | + */ + + 'hidden' => [ + NunoMaduro\LaravelConsoleSummary\SummaryCommand::class, + Symfony\Component\Console\Command\DumpCompletionCommand::class, + Symfony\Component\Console\Command\HelpCommand::class, + \Hyde\Console\Commands\DebugCommand::class, + ], + + /* + |-------------------------------------------------------------------------- + | Removed Commands + |-------------------------------------------------------------------------- + | + | Do you have a service provider that loads a list of commands that + | you don't need? No problem. Laravel Zero allows you to specify + | below a list of commands that you don't to see in your app. + | + */ + + 'remove' => [ + Illuminate\Console\Scheduling\ScheduleRunCommand::class, + Illuminate\Console\Scheduling\ScheduleListCommand::class, + Illuminate\Console\Scheduling\ScheduleFinishCommand::class, + Illuminate\Console\Scheduling\ScheduleRunCommand::class, + LaravelZero\Framework\Commands\StubPublishCommand::class, + ], + +]; diff --git a/tests/fixtures/example-sites/cookbook/config/docs.php b/tests/fixtures/example-sites/cookbook/config/docs.php new file mode 100644 index 00000000000..2d68410dc63 --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/config/docs.php @@ -0,0 +1,125 @@ + config('site.name', 'HydePHP').' Docs', + + /* + |-------------------------------------------------------------------------- + | Documentation Site Output Directory + |-------------------------------------------------------------------------- + | + | If you want to store the compiled documentation pages in a different + | directory than the default 'docs' directory, for example to set the + | specified version, you can specify the directory here. + | + | Note that you need to take care as to not set it to something that + | may conflict with other parts, such as media or posts directories. + | + | The default value is 'docs'. For easy versioning you can do what + | HydePHP.com does, setting it to 'docs/master'. + | + */ + + 'output_directory' => 'docs', + + /* + |-------------------------------------------------------------------------- + | Collaborative Source Editing Location + |-------------------------------------------------------------------------- + | + | @see https://hydephp.com/docs/master/documentation-pages#automatic-edit-page-button + | + | By adding a base URL here, Hyde will use it to create "edit source" links + | to your documentation pages. Hyde expects this to be a GitHub path, but + | it will probably work with other methods as well, if not, send a PR! + | + | You can also change the link text with the `edit_source_link_text` setting. + | + | Example: https://github.com/hydephp/docs/blob/master + | Do not specify the filename or extension, Hyde will do that for you. + | Setting the setting to null will disable the feature. + | + */ + + // 'source_file_location_base' => 'https://github.com///<[blob/edit]>/', + 'edit_source_link_text' => 'Edit Source', + 'edit_source_link_position' => 'footer', // 'header', 'footer', or 'both' + + /* + |-------------------------------------------------------------------------- + | Sidebar Page Order + |-------------------------------------------------------------------------- + | + | In the generated Documentation pages the navigation links in the sidebar + | default to sort alphabetically. You can reorder the page identifiers + | in the list below, and the links will get sorted in that order. + | + | Internally, the items listed will get a position priority of 250 + the order its found in the list. + | Link items without an entry here will have fall back to the default priority of 999, putting them last. + | + | You can also set explicit priorities in front matter. + | + */ + + 'sidebar_order' => [ + 'readme', + 'installation', + 'getting-started', + ], + + /* + |-------------------------------------------------------------------------- + | Table of Contents Settings + |-------------------------------------------------------------------------- + | + | The Hyde Documentation Module comes with a fancy Sidebar that, by default, + | has a Table of Contents included. Here, you can configure its behavior, + | content, look and feel. You can also disable the feature completely. + | + */ + + 'table_of_contents' => [ + 'enabled' => true, + 'min_heading_level' => 2, + 'max_heading_level' => 4, + ], + + /* + |-------------------------------------------------------------------------- + | Search Customization + |-------------------------------------------------------------------------- + | + | Hyde comes with an easy to use search feature for documentation pages. + | @see https://hydephp.com/docs/master/documentation-pages#search-feature + | + */ + + // Should a docs/search.html page be generated? + 'create_search_page' => true, + + // Are there any pages you don't want to show in the search results? + 'exclude_from_search' => [ + 'changelog', + ], + +]; diff --git a/tests/fixtures/example-sites/cookbook/config/hyde.php b/tests/fixtures/example-sites/cookbook/config/hyde.php new file mode 100644 index 00000000000..9bd60350d1e --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/config/hyde.php @@ -0,0 +1,180 @@ + [ + 'port' => env('SERVER_PORT', 8080), + ], + + /* + |-------------------------------------------------------------------------- + | Global Site Meta Tags + |-------------------------------------------------------------------------- + | + | While you can add any number of meta tags in the meta.blade.php component + | using standard HTML, you can also use the Meta helper. To add a regular + | meta tag, use Meta::name() helper. To add an Open Graph property, use + | Meta::property() helper which also adds the `og:` prefix for you. + | + | Please note that some pages like blog posts contain dynamic meta tags + | which may override these globals when present in the front matter. + | + */ + + 'meta' => [ + // Meta::name('author', 'Mr. Hyde'), + // Meta::name('twitter:creator', '@HydeFramework'), + // Meta::name('description', 'My Hyde Blog'), + // Meta::name('keywords', 'Static Sites, Blogs, Documentation'), + Meta::name('generator', 'HydePHP '.Hyde\Hyde::version()), + Meta::property('site_name', config('site.name', 'HydePHP')), + ], + + /* + |-------------------------------------------------------------------------- + | Features + |-------------------------------------------------------------------------- + | + | Some of Hyde's features are optional. Feel free to disable the features + | you don't need by removing or commenting them out from this array. + | This config concept is directly inspired by Laravel Jetstream. + | + */ + + 'features' => [ + // Page Modules + Features::htmlPages(), + Features::markdownPosts(), + Features::bladePages(), + Features::markdownPages(), + Features::documentationPages(), + // Features::dataCollections(), + + // Frontend Features + Features::darkmode(), + Features::documentationSearch(), + + // Integrations + Features::torchlight(), + ], + + /* + |-------------------------------------------------------------------------- + | Blog Post Authors + |-------------------------------------------------------------------------- + | + | Hyde has support for adding authors in front matter, for example to + | automatically add a link to your website or social media profiles. + | However, it's tedious to have to add those to each and every + | post you make, and keeping them updated is even harder. + | + | Here you can add predefined authors. When writing posts, + | just specify the username in the front matter, and the + | rest of the data will be pulled from a matching entry. + | + */ + + 'authors' => [ + Author::create( + username: 'wikibooks', // Required username + name: 'Wikibooks contributors', // Optional display name + website: 'https://en.wikibooks.org/' // Optional website URL + ), + ], + + /* + |-------------------------------------------------------------------------- + | Footer Text + |-------------------------------------------------------------------------- + | + | Here you can customize the footer Markdown text for your site. + | + | If you don't want to write Markdown here, you use a Markdown include. + | You can also customize the Blade view if you want a more complex footer. + | You can disable it completely by changing the setting to `false`. + | + | To read about the many configuration options here, visit: + | https://hydephp.com/docs/master/customization#footer + | + */ + + 'footer' => 'Demo blog site built with [HydePHP](https://github.com/hydephp/hyde) - Recipes from [Wikibooks](https://en.wikibooks.org/wiki/Cookbook:Recipes) ([CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/) unless otherwise noted)', + + /* + |-------------------------------------------------------------------------- + | Navigation Menu Configuration + |-------------------------------------------------------------------------- + | + | If you are looking to customize the navigation menu links, this is the place! + | + | See the documentation for the full list of options: + | https://hydephp.com/docs/master/customization#navigation-menu--sidebar + | + */ + + 'navigation' => [ + // This configuration sets the priorities used to determine the order of the menu. + // The default values have been added below for reference and easy editing. + // The array key should match the page's route key (slug). + 'order' => [ + 'index' => 0, + 'posts' => 10, + 'docs/index' => 100, + ], + + // In case you want to customize the labels for the menu items, you can do so here. + // Simply add the route key (slug) as the key, and the label as the value. + 'labels' => [ + // 'index' => 'Start', + // 'docs/index' => 'Documentation', + ], + + // These are the pages that should not show up in the navigation menu. + 'exclude' => [ + '404', + ], + + // Any extra links you want to add to the navigation menu can be added here. + // To get started quickly, you can uncomment the defaults here. + // See the documentation link above for more information. + 'custom' => [ + // NavItem::toLink('https://github.com/hydephp/hyde', 'GitHub', 200), + ], + ], + + /* + |-------------------------------------------------------------------------- + | Load app.css from CDN + |-------------------------------------------------------------------------- + | + | Hyde ships with an app.css file containing compiled TailwindCSS styles + | in the _media/ directory. If you want to load this file from the + | HydeFront JsDelivr CDN, you can set this setting to true. + */ + + 'load_app_styles_from_cdn' => false, +]; diff --git a/tests/fixtures/example-sites/cookbook/config/markdown.php b/tests/fixtures/example-sites/cookbook/config/markdown.php new file mode 100644 index 00000000000..02d6e70f671 --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/config/markdown.php @@ -0,0 +1,83 @@ + [ + \League\CommonMark\Extension\GithubFlavoredMarkdownExtension::class, + \League\CommonMark\Extension\Attributes\AttributesExtension::class, + ], + + /* + |-------------------------------------------------------------------------- + | Configuration Options + |-------------------------------------------------------------------------- + | + | Define any options that should be passed to the CommonMark converter. + | + | Hyde handles many of the options automatically, but you may want to + | override some of them and/or add your own. Any custom options + | will be merged with the Hyde defaults during runtime. + | + */ + + 'config' => [ + // + ], + + /* + |-------------------------------------------------------------------------- + | Allow all HTML tags + |-------------------------------------------------------------------------- + | + | HydePHP uses the GitHub Flavored Markdown extension to convert Markdown. + | This, by default strips out some HTML tags. If you want to allow all + | arbitrary HTML tags, and understand the risks involved, you can + | use this config setting to enable all HTML tags. + | + */ + + 'allow_html' => false, + + /* + |-------------------------------------------------------------------------- + | Blade-supported Markdown + |-------------------------------------------------------------------------- + | + | Since Hyde v0.30.x you can use Laravel Blade in Markdown files. + | + | It's disabled by default since can be a security risk as it allows + | arbitrary PHP to run. But if your Markdown is trusted, try it out! + | + | To see the syntax and usage, see the documentation: + | @see https://hydephp.com/docs/master/advanced-markdown#blade-support + | + */ + + 'enable_blade' => false, +]; diff --git a/tests/fixtures/example-sites/cookbook/config/site.php b/tests/fixtures/example-sites/cookbook/config/site.php new file mode 100644 index 00000000000..35eb41b7846 --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/config/site.php @@ -0,0 +1,130 @@ + env('SITE_NAME', 'Dr Jekyll\'s Cooking Blog'), + + /* + |-------------------------------------------------------------------------- + | Site Base URL + |-------------------------------------------------------------------------- + | + | Setting a base URL is highly recommended, and is required to use some + | HydePHP features, like automatic sitemaps and RSS feeds. + | + | If you are serving your site from a subdirectory, + | you will need to include that in the path. + | + */ + + 'url' => env('SITE_URL', 'http://localhost'), + + /* + |-------------------------------------------------------------------------- + | Pretty URLs + |-------------------------------------------------------------------------- + | + | When the setting is enabled, generated links in the compiled HTML site + | are without the .html extension. Since this breaks local browsing you + | can leave the setting disabled, and instead add the --pretty-urls flag + | when running the php hyde build command for deployment. + | + | Note that this can cause issues when you are serving from a subdirectory. + | See https://github.com/hydephp/develop/issues/228 + | + */ + + 'pretty_urls' => false, + + /* + |-------------------------------------------------------------------------- + | Sitemap Generation + |-------------------------------------------------------------------------- + | + | When the setting is enabled, a sitemap.xml file will automatically be + | generated when the site is built. + | + | This feature requires that a site base URL has been set. + | + */ + + 'generate_sitemap' => true, + + /* + |-------------------------------------------------------------------------- + | RSS Feed Generation + |-------------------------------------------------------------------------- + | + | When enabled, an RSS feed with your Markdown blog posts will be + | generated when you compile your static site. + | + | This feature requires that a site base URL has been set. + | + */ + + // Should the RSS feed be generated? + 'generate_rss_feed' => true, + + // What filename should the RSS file use? + 'rss_filename' => 'feed.xml', + + // The channel description. By default this is "Site Name + RSS Feed". + // 'rss_description' => '', + + /* + |-------------------------------------------------------------------------- + | Site Language + |-------------------------------------------------------------------------- + | + | This value sets the language of your site and is used for the + | element in the app layout. Default is 'en'. + | + */ + + 'language' => 'en', + + /* + |-------------------------------------------------------------------------- + | Site Output Directory + |-------------------------------------------------------------------------- + | + | This setting specifies the output path for your site, useful to for + | example, store the site in the docs/ directory for GitHub Pages. + | The path is relative to the root of your project. + | + */ + + 'output_directory' => '_site', + +]; diff --git a/tests/fixtures/example-sites/cookbook/config/torchlight.php b/tests/fixtures/example-sites/cookbook/config/torchlight.php new file mode 100644 index 00000000000..668c6be8bca --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/config/torchlight.php @@ -0,0 +1,93 @@ + [ + 'enabled' => true, + 'markdown' => ' +

+ + Syntax highlighting by Torchlight.dev + +

', + ], + + // The Torchlight client caches highlighted code blocks. Here + // you can define which cache driver you'd like to use. If + // leave this blank your default app cache will be used. + 'cache' => env('TORCHLIGHT_CACHE_DRIVER'), + + // Cache blocks for 30 days. + 'cache_seconds' => env('TORCHLIGHT_CACHE_TTL', 60 * 60 * 24 * 30), + + // Which theme you want to use. You can find all the themes at + // https://torchlight.dev/docs/themes. + 'theme' => env('TORCHLIGHT_THEME', 'material-theme-palenight'), + + // If you want to use two separate themes for dark and light modes, + // you can use an array to define both themes. Torchlight renders + // both on the page, and you will be responsible for hiding one + // or the other depending on the dark / light mode via CSS. + // 'theme' => [ + // 'dark' => 'github-dark', + // 'light' => 'github-light', + // ], + + // Your API token from torchlight.dev. + 'token' => env('TORCHLIGHT_TOKEN'), + + // If you want to register the blade directives, set this to true. + 'blade_components' => true, + + // The Host of the API. + 'host' => env('TORCHLIGHT_HOST', 'https://api.torchlight.dev'), + + // We replace tabs in your code blocks with spaces in HTML. Set + // the number of spaces you'd like to use per tab. Set to + // `false` to leave literal tabs in the HTML. + 'tab_width' => 4, + + // If you pass a filename to the code component or in a markdown + // block, Torchlight will look for code snippets in the + // following directories. + 'snippet_directories' => [ + resource_path(), + ], + + // Global options to control blocks-level settings. + // https://torchlight.dev/docs/options + 'options' => [ + // Turn line numbers on or off globally. + // 'lineNumbers' => false, + + // Control the `style` attribute applied to line numbers. + // 'lineNumbersStyle' => '', + + // Turn on +/- diff indicators. + // 'diffIndicators' => true, + + // If there are any diff indicators for a line, put them + // in place of the line number to save horizontal space. + // 'diffIndicatorsInPlaceOfLineNumbers' => true, + + // When lines are collapsed, this is the text that will + // be shown to indicate that they can be expanded. + // 'summaryCollapsedIndicator' => '...', + ], +]; diff --git a/tests/fixtures/example-sites/cookbook/config/view.php b/tests/fixtures/example-sites/cookbook/config/view.php new file mode 100644 index 00000000000..569cc2797aa --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/config/view.php @@ -0,0 +1,13 @@ + [ + resource_path('views'), + base_path('_pages'), + ], + + 'compiled' => env( + 'VIEW_COMPILED_PATH', + realpath(storage_path('framework/views')) + ), +]; diff --git a/tests/fixtures/example-sites/cookbook/hyde b/tests/fixtures/example-sites/cookbook/hyde new file mode 100644 index 00000000000..c021b1f3db5 --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/hyde @@ -0,0 +1,53 @@ +#!/usr/bin/env php +make(Illuminate\Contracts\Console\Kernel::class); + +$status = $kernel->handle( + $input = new Symfony\Component\Console\Input\ArgvInput, + new Symfony\Component\Console\Output\ConsoleOutput +); + +/* +|-------------------------------------------------------------------------- +| Shutdown The Application +|-------------------------------------------------------------------------- +| +| Once Artisan has finished running, we will fire off the shutdown events +| so that any final work may be done by the application before we shut +| down the process. This is the last thing to happen to the request. +| +*/ + +$kernel->terminate($input, $status); + +exit($status); diff --git a/tests/fixtures/example-sites/cookbook/package.json b/tests/fixtures/example-sites/cookbook/package.json new file mode 100644 index 00000000000..8f60bbed62f --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/package.json @@ -0,0 +1,41 @@ +{ + "private": true, + "scripts": { + "dev": " mix", + "prod": "mix --production", + "watch": "mix watch" + }, + "name": "hyde", + "description": "Elegant and Powerful Static App Builder", + "version": "0.64.0", + "main": "hyde", + "directories": { + "test": "tests" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/hydephp/hyde.git" + }, + "keywords": [ + "hydephp", + "hyde", + "static", + "site", + "generator" + ], + "author": "Caen De Silva", + "license": "MIT", + "bugs": { + "url": "https://github.com/hydephp/hyde/issues" + }, + "homepage": "https://hydephp.com", + "devDependencies": { + "@tailwindcss/typography": "^0.5.2", + "autoprefixer": "^10.4.5", + "laravel-mix": "^6.0.49", + "postcss": "^8.4.13", + "prettier": "2.6.0", + "tailwindcss": "^3.0.24", + "hydefront": "^2.0.0" + } +} diff --git a/tests/fixtures/example-sites/cookbook/phpunit.xml.dist b/tests/fixtures/example-sites/cookbook/phpunit.xml.dist new file mode 100644 index 00000000000..8f4b58c9f29 --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/phpunit.xml.dist @@ -0,0 +1,18 @@ + + + + + ./tests + + + + + ./app + ./src + + + diff --git a/tests/fixtures/example-sites/cookbook/resources/assets/app.css b/tests/fixtures/example-sites/cookbook/resources/assets/app.css new file mode 100644 index 00000000000..ab818cd02b2 --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/resources/assets/app.css @@ -0,0 +1,20 @@ +/* +* This file is loaded into your Hyde/Hyde installation and is used to generate the styles for your project. +* You can use this file to customize your TailwindCSS or to add new classes. +* +* The HydeFront package contains some base styles to make your site look even more amazing. +* +* The compiled result of this file is shipped with HydePHP and is found at _media/app.css, +* so you don't need to compile this file unless you're making changes. +* +* If you want, you can load the compiled file with minified styles for a base install from the CDN. +* See https://hydephp.com/docs/master/managing-assets#loading-from-cdn +*/ + +@import '~hydefront/dist/hyde.css'; + +@tailwind base; +@tailwind components; +@tailwind utilities; + +[x-cloak] { display: none !important; } diff --git a/tests/fixtures/example-sites/cookbook/resources/assets/app.js b/tests/fixtures/example-sites/cookbook/resources/assets/app.js new file mode 100644 index 00000000000..3195f61b977 --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/resources/assets/app.js @@ -0,0 +1,3 @@ +/* +* This is the main JavaScript used by webpack to build the the app.js file. +*/ diff --git a/tests/fixtures/example-sites/cookbook/storage/app/.gitignore b/tests/fixtures/example-sites/cookbook/storage/app/.gitignore new file mode 100644 index 00000000000..c96a04f008e --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/storage/app/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/tests/fixtures/example-sites/cookbook/storage/framework/cache/.gitignore b/tests/fixtures/example-sites/cookbook/storage/framework/cache/.gitignore new file mode 100644 index 00000000000..869804c2ad0 --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/storage/framework/cache/.gitignore @@ -0,0 +1,3 @@ +* +!data/ +!.gitignore \ No newline at end of file diff --git a/tests/fixtures/example-sites/cookbook/storage/framework/cache/data/.gitignore b/tests/fixtures/example-sites/cookbook/storage/framework/cache/data/.gitignore new file mode 100644 index 00000000000..c96a04f008e --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/storage/framework/cache/data/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/tests/fixtures/example-sites/cookbook/storage/framework/views/.gitignore b/tests/fixtures/example-sites/cookbook/storage/framework/views/.gitignore new file mode 100644 index 00000000000..c96a04f008e --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/storage/framework/views/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/tests/fixtures/example-sites/cookbook/tailwind.config.js b/tests/fixtures/example-sites/cookbook/tailwind.config.js new file mode 100644 index 00000000000..3fc9b2ffb15 --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/tailwind.config.js @@ -0,0 +1,120 @@ +const defaultTheme = require('tailwindcss/defaultTheme'); + +module.exports = { + darkMode: 'class', + content: [ + './_pages/*.blade.php', + './resources/views/**/*.blade.php', + './vendor/hyde/framework/resources/views/**/*.blade.php', + ], + + theme: { + extend: { + typography: { + DEFAULT: { + css: { + lineHeight: '1.5em', + maxWidth: '96ch', + h2: { + marginBottom: '0.75em', + marginTop: '1.5em', + }, + a: { + color: '#5956eb', + '&:hover': { + color: '#4f46e5', + }, + textDecoration: 'none' + }, + blockquote: { + backgroundColor: '#80808020', + borderLeftColor: '#d1d5db', + color: 'unset', + fontWeight: 500, + fontStyle: 'unset', + lineHeight: '1.25em', + paddingLeft: '0.75em', + paddingTop: '.25em', + paddingBottom: '.25em', + marginTop: '1em', + marginBottom: '1em', + p: { + paddingRight: '.25em', + marginTop: '.25em', + marginBottom: '.25em', + }, + 'p::before': { + content: 'unset', + }, + 'p::after': { + content: 'unset', + }, + }, + code: { + font: 'unset', + backgroundColor: '#80808033', + paddingLeft: '4px', + paddingRight: '4px', + marginLeft: '-2px', + marginRight: '1px', + borderRadius: '4px' + }, + 'code::before': { + content: 'unset', + }, + 'code::after': { + content: 'unset', + }, + pre: { + code: { + fontFamily: "'Fira Code Regular', Consolas, Monospace, 'Courier New'", + } + } + }, + }, + invert: { + css: { + a: { + color: '#818cf8', + '&:hover': { + color: '#6366f1', + }, + }, + }, + }, + }, + colors: { + indigo: { + 500: '#5956eb', + } + }, + }, + }, + + safelist: [ + 'prose', + 'dark:prose-invert', + 'text-left', + 'text-center', + 'text-right', + 'ml-auto', + 'mx-auto', + 'mr-auto', + 'my-0', + 'my-4', + 'my-8', + 'py-0', + 'py-4', + 'py-8', + 'mx-0', + 'mx-4', + 'mx-8', + 'px-0', + 'px-4', + 'px-8', + ], + + plugins: [ + require('@tailwindcss/typography') + ], +}; diff --git a/tests/fixtures/example-sites/cookbook/webpack.mix.js b/tests/fixtures/example-sites/cookbook/webpack.mix.js new file mode 100644 index 00000000000..2e971a2c3b3 --- /dev/null +++ b/tests/fixtures/example-sites/cookbook/webpack.mix.js @@ -0,0 +1,12 @@ +// Using Laravel Mix is optional as the styles you need to get started are already included. +// However, if you add new Tailwind classes, or any customizations, you can use Webpack to +// compile the assets. See https://hydephp.com/docs/master/managing-assets.html. + +let mix = require('laravel-mix'); + +mix.js('resources/assets/app.js', 'app.js') + .postCss('resources/assets/app.css', 'app.css', [ + require('tailwindcss'), + require('autoprefixer'), +]).setPublicPath('_media') + .copyDirectory('_media', '_site/media');