├── site ├── accounts │ └── .gitkeep ├── cache │ └── .gitkeep ├── sessions │ └── .gitkeep ├── blueprints │ ├── fields │ │ └── text.yml │ ├── files │ │ ├── logo.yml │ │ ├── favicon.yml │ │ └── project.yml │ ├── sections │ │ └── files.yml │ ├── pages │ │ ├── textpage.yml │ │ ├── error.yml │ │ └── project.yml │ └── site.yml ├── templates │ ├── error.php │ ├── default.php │ ├── project.php │ ├── pages │ │ ├── textpage.twig │ │ ├── error.twig │ │ ├── homepage.twig │ │ └── project.twig │ └── layouts │ │ └── default.twig ├── config │ └── config.php └── plugins │ ├── color-field │ ├── helpers.php │ ├── index.php │ └── Color.php │ ├── favicon │ └── index.php │ ├── bots │ └── index.php │ ├── image │ └── index.php │ └── twig │ └── index.php ├── .npmrc ├── content ├── favicon.gif.txt ├── home │ └── homepage.txt ├── _drafts │ └── draft │ │ └── textpage.txt ├── 2_forrest-text-page │ ├── ju-on-e6xsi7qqvaa-unsplash.jpg.txt │ ├── blake-cheek-cpwyhs2ww24-unsplash.jpg.txt │ ├── ju-on-e6xsi7qqvaa-unsplash.jpg │ ├── blake-cheek-cpwyhs2ww24-unsplash.jpg │ └── textpage.txt ├── favicon.gif ├── error │ └── error.txt ├── 6_norway │ ├── ben-wicks-dvq4eej_mkc-unsplash.jpg │ ├── ben-wicks-kbfnvbtelys-unsplash.jpg │ ├── ben-wicks-dvq4eej_mkc-unsplash.jpg.txt │ ├── ben-wicks-kbfnvbtelys-unsplash.jpg.txt │ └── project.txt ├── 4_mountains │ ├── mark-basarab-z8ct_q3ocqm-unsplash.jpg │ ├── simon-fitall-tvleqh3p1os-unsplash.jpg │ ├── mark-basarab-z8ct_q3ocqm-unsplash.jpg.txt │ ├── simon-fitall-tvleqh3p1os-unsplash.jpg.txt │ └── project.txt ├── 9_city-night │ ├── chuttersnap-jh0wcegjsrq-unsplash.jpg │ ├── dominik-reallife-aacetp_lram-unsplash.jpg │ ├── chuttersnap-jh0wcegjsrq-unsplash.jpg.txt │ ├── dominik-reallife-aacetp_lram-unsplash.jpg.txt │ └── project.txt ├── 3_beach-and-sand │ ├── alex-perez-iul_chth4ny-unsplash.jpg │ ├── alex-perez-nlukaa-ndde-unsplash.jpg │ ├── coral-ouellette-j6nhmplhk6i-unsplash.jpg │ ├── alex-perez-iul_chth4ny-unsplash.jpg.txt │ ├── alex-perez-nlukaa-ndde-unsplash.jpg.txt │ ├── coral-ouellette-j6nhmplhk6i-unsplash.jpg.txt │ └── project.txt ├── 5_view-from-above │ ├── shawn-ang-l-it0glrp1m-unsplash.jpg │ ├── shawn-ang-vccokh7eule-unsplash.jpg │ ├── shawn-ang-l-it0glrp1m-unsplash.jpg.txt │ ├── shawn-ang-vccokh7eule-unsplash.jpg.txt │ └── project.txt ├── 7_at-the-library │ ├── chuttersnap-sxyrbn3c7j4-unsplash.jpg │ ├── fahrul-azmi-cfuz-6i83vs-unsplash.jpg │ ├── chuttersnap-sxyrbn3c7j4-unsplash.jpg.txt │ ├── fahrul-azmi-cfuz-6i83vs-unsplash.jpg.txt │ └── project.txt ├── 8_construction-site │ ├── max-larochelle-td-sdlqxfsy-unsplash.jpg │ ├── max-larochelle-td-sdlqxfsy-unsplash.jpg.txt │ ├── christopher-burns-8kfcr12oeum-unsplash.jpg.txt │ ├── christopher-burns-8kfcr12oeum-unsplash.jpg │ └── project.txt ├── site.txt ├── 1_about │ └── textpage.txt └── 10_example-content │ └── textpage.txt ├── .browserslistrc ├── media └── .htaccess ├── index.php ├── .gitignore ├── bin ├── release └── permissions ├── purgecss.config.js ├── .vscode └── settings.json ├── package.json ├── src └── css │ ├── color.css │ ├── body.css │ ├── index.css │ ├── debug.css │ └── copy.css ├── .htaccess ├── composer.json ├── LICENSE ├── README.md ├── static └── master.css └── composer.lock /site/accounts/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /site/cache/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /site/sessions/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | package-lock=false 2 | -------------------------------------------------------------------------------- /content/favicon.gif.txt: -------------------------------------------------------------------------------- 1 | Template: favicon -------------------------------------------------------------------------------- /content/home/homepage.txt: -------------------------------------------------------------------------------- 1 | Title: Home 2 | -------------------------------------------------------------------------------- /content/_drafts/draft/textpage.txt: -------------------------------------------------------------------------------- 1 | Title: Draft -------------------------------------------------------------------------------- /content/2_forrest-text-page/ju-on-e6xsi7qqvaa-unsplash.jpg.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 2% 2 | last 2 Firefox versions 3 | not dead 4 | -------------------------------------------------------------------------------- /content/2_forrest-text-page/blake-cheek-cpwyhs2ww24-unsplash.jpg.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /site/blueprints/fields/text.yml: -------------------------------------------------------------------------------- 1 | label: Text 2 | type: textarea 3 | -------------------------------------------------------------------------------- /site/blueprints/files/logo.yml: -------------------------------------------------------------------------------- 1 | title: Logo 2 | 3 | accept: 4 | mime: image/* 5 | -------------------------------------------------------------------------------- /site/blueprints/files/favicon.yml: -------------------------------------------------------------------------------- 1 | title: Favicon 2 | 3 | accept: 4 | mime: image/* 5 | -------------------------------------------------------------------------------- /site/templates/error.php: -------------------------------------------------------------------------------- 1 | template()->name(), $kirby->data); 4 | -------------------------------------------------------------------------------- /content/favicon.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lemmon/kirby-portfolio-theme/HEAD/content/favicon.gif -------------------------------------------------------------------------------- /site/blueprints/sections/files.yml: -------------------------------------------------------------------------------- 1 | type: files 2 | sortable: false 3 | image: 4 | cover: true 5 | -------------------------------------------------------------------------------- /site/templates/default.php: -------------------------------------------------------------------------------- 1 | intendedTemplate()->name(), $kirby->data); 4 | -------------------------------------------------------------------------------- /site/templates/project.php: -------------------------------------------------------------------------------- 1 | intendedTemplate()->name(), $kirby->data); 4 | -------------------------------------------------------------------------------- /media/.htaccess: -------------------------------------------------------------------------------- 1 | Header unset ETag 2 | Header set Cache-Control "public, max-age=31536000, immutable" 3 | -------------------------------------------------------------------------------- /site/config/config.php: -------------------------------------------------------------------------------- 1 | 'localhost' === $_SERVER['SERVER_NAME'], 5 | ]; 6 | -------------------------------------------------------------------------------- /content/error/error.txt: -------------------------------------------------------------------------------- 1 | Title: Error 2 | 3 | ---- 4 | 5 | Text: Sorry, the page you have requested was not found. 6 | -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | render(); 8 | -------------------------------------------------------------------------------- /content/6_norway/ben-wicks-dvq4eej_mkc-unsplash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lemmon/kirby-portfolio-theme/HEAD/content/6_norway/ben-wicks-dvq4eej_mkc-unsplash.jpg -------------------------------------------------------------------------------- /content/6_norway/ben-wicks-kbfnvbtelys-unsplash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lemmon/kirby-portfolio-theme/HEAD/content/6_norway/ben-wicks-kbfnvbtelys-unsplash.jpg -------------------------------------------------------------------------------- /content/4_mountains/mark-basarab-z8ct_q3ocqm-unsplash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lemmon/kirby-portfolio-theme/HEAD/content/4_mountains/mark-basarab-z8ct_q3ocqm-unsplash.jpg -------------------------------------------------------------------------------- /content/4_mountains/simon-fitall-tvleqh3p1os-unsplash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lemmon/kirby-portfolio-theme/HEAD/content/4_mountains/simon-fitall-tvleqh3p1os-unsplash.jpg -------------------------------------------------------------------------------- /content/9_city-night/chuttersnap-jh0wcegjsrq-unsplash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lemmon/kirby-portfolio-theme/HEAD/content/9_city-night/chuttersnap-jh0wcegjsrq-unsplash.jpg -------------------------------------------------------------------------------- /content/2_forrest-text-page/ju-on-e6xsi7qqvaa-unsplash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lemmon/kirby-portfolio-theme/HEAD/content/2_forrest-text-page/ju-on-e6xsi7qqvaa-unsplash.jpg -------------------------------------------------------------------------------- /site/plugins/color-field/helpers.php: -------------------------------------------------------------------------------- 1 | x.match(/[\w-/:]+(? 7 |
8 |

{{ page.title }}

9 |
10 |
11 | {{~ page.text | kt({ width: 640, srcset: [ 320, 640, 960, 1280 ] }) }} 12 |
13 | 14 | {%~ endif %} 15 | 16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /src/css/color.css: -------------------------------------------------------------------------------- 1 | .linkcolor, 2 | .linkcolor\:hover:hover, 3 | .anchor:hover .linkcolor\:hover { 4 | color: var(--link-color); 5 | } 6 | 7 | .hlcolor { 8 | color: var(--theme-highlight-text-color); 9 | } 10 | 11 | .bg-hlbgcolor { 12 | background-color: var(--theme-highlight-background-color); 13 | box-shadow: -1px 0 0 2px var(--theme-highlight-background-color), 14 | 1px 0 0 2px var(--theme-highlight-background-color); 15 | box-decoration-break: clone; 16 | } 17 | -------------------------------------------------------------------------------- /site/plugins/favicon/index.php: -------------------------------------------------------------------------------- 1 | [ 5 | [ 6 | 'pattern' => 'favicon.ico', 7 | 'action' => function () { 8 | $file = site()->files()->filterBy('template', 'favicon')->first(); 9 | if (!$file) { 10 | http_response_code(404); 11 | die('not found'); 12 | } 13 | header('Content-Type: ' . $file->mime()); 14 | readfile($file->root()); 15 | exit; 16 | }, 17 | ], 18 | ], 19 | ]); 20 | -------------------------------------------------------------------------------- /site/plugins/color-field/index.php: -------------------------------------------------------------------------------- 1 | [ 8 | 'isColor' => function ($field) { 9 | return $field->isNotEmpty() and Lemmon\is_color($field->value()); 10 | }, 11 | 'toColor' => function ($field) { 12 | return ($field->isNotEmpty() and Lemmon\is_color($field->value())) 13 | ? new Lemmon\Color($field->value()) 14 | : null 15 | ; 16 | }, 17 | ], 18 | ]); 19 | -------------------------------------------------------------------------------- /bin/permissions: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | cd "$(dirname $0)/.." 3 | 4 | # make directories writable 5 | chmod 777 media 6 | chmod 777 site/accounts 7 | chmod 777 site/cache 8 | chmod 777 site/sessions 9 | # accounts files and directories writable 10 | find site/accounts -type d -exec chmod 0777 {} \; 11 | find site/accounts -type f -exec chmod 0666 {} \; 12 | # content files and directories writable 13 | find content -type d -exec chmod 0777 {} \; 14 | find content -type f -exec chmod 0666 {} \; 15 | # change owner of content 16 | chown -R `ls -ld . | awk '{print $3}'` content 17 | -------------------------------------------------------------------------------- /content/8_construction-site/project.txt: -------------------------------------------------------------------------------- 1 | Title: Construction Site 2 | 3 | ---- 4 | 5 | Text: Aenean gravida ante id nunc malesuada sagittis. Sed lacinia aliquam arcu, vel aliquam sem rutrum non. Cras accumsan quam et velit euismod consectetur. Quisque euismod ante sed diam ullamcorper interdum. Nulla sodales placerat tellus, vitae tristique tellus porta vel. Maecenas finibus eros quis purus faucibus, sed aliquet arcu ultricies. 6 | 7 | ---- 8 | 9 | Client: 10 | 11 | ---- 12 | 13 | Role: 14 | 15 | ---- 16 | 17 | Date: August 1990 18 | 19 | ---- 20 | 21 | Website: -------------------------------------------------------------------------------- /site/templates/pages/error.twig: -------------------------------------------------------------------------------- 1 | {% extends layout() %} 2 | 3 | {% block main %} 4 | 5 | {%~ if page.text.notEmpty %} 6 |
7 |
8 |

{{ page.title }}

9 |
10 |
11 | {{ page.text | kt({ width: 640, srcset: [ 320, 640, 960, 1280 ] }) }} 12 | {%~ with { _page: page('home') } %} 13 |

{{ _page.title }}

14 | {%~ endwith %} 15 |
16 |
17 | {%~ endif %} 18 | 19 | {% endblock %} 20 | -------------------------------------------------------------------------------- /src/css/body.css: -------------------------------------------------------------------------------- 1 | .body { 2 | max-width: 28rem; 3 | margin-left: auto; 4 | margin-right: auto; 5 | padding-top: 1.5rem; 6 | padding-bottom: 1.5rem; 7 | } 8 | 9 | @media (--view-sd) { 10 | 11 | .body { 12 | max-width: 39rem; 13 | } 14 | 15 | } 16 | 17 | @media (--view-md) { 18 | 19 | .body { 20 | display: grid; 21 | grid-template-columns: 19rem auto; 22 | grid-template-rows: repeat(3, min-content); 23 | max-width: 58rem; 24 | } 25 | 26 | .main { 27 | grid-column-start: 2; 28 | grid-row-start: 1; 29 | grid-row-end: span 3; 30 | } 31 | 32 | } 33 | 34 | @media (--view-ld) { 35 | 36 | .body { 37 | max-width: 77rem; 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /content/3_beach-and-sand/project.txt: -------------------------------------------------------------------------------- 1 | Title: Beach & Sand 2 | 3 | ---- 4 | 5 | Text: Nulla ullamcorper mauris magna, non auctor eros molestie pulvinar. Morbi id enim vestibulum, tempor quam a, commodo magna. Cras eros odio, rhoncus ac auctor eget, sodales tempus mauris. Fusce finibus mauris sed velit dictum ullamcorper. Duis sed urna leo. In volutpat ipsum at ante sodales tincidunt. Maecenas facilisis velit non posuere tempus. Quisque risus libero, sagittis sit amet nulla sit amet, sollicitudin maximus tortor. Ut suscipit aliquam diam, nec mollis arcu bibendum a. Morbi eleifend bibendum fringilla. 6 | 7 | ---- 8 | 9 | Date: Last Christmas 10 | 11 | ---- 12 | 13 | Website: http://example.com/ 14 | 15 | ---- 16 | 17 | Client: People 18 | 19 | ---- 20 | 21 | Role: Chief Advisor -------------------------------------------------------------------------------- /.htaccess: -------------------------------------------------------------------------------- 1 | RewriteEngine on 2 | 3 | # Kirby 4 | RewriteRule (^|/)\.(?!well-known\/) index.php [L] 5 | RewriteRule ^content/(.*)\.(txt|md|mdown)$ index.php [L] 6 | RewriteRule ^site/(.*) index.php [L] 7 | SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 8 | RewriteRule ^kirby/(.*) index.php [L] 9 | RewriteCond %{REQUEST_FILENAME} !-f 10 | RewriteCond %{REQUEST_FILENAME} !-d 11 | RewriteRule ^(.*) index.php [L] 12 | 13 | # compress text file responses 14 | 15 | AddOutputFilterByType DEFLATE text/plain 16 | AddOutputFilterByType DEFLATE text/html 17 | AddOutputFilterByType DEFLATE text/css 18 | AddOutputFilterByType DEFLATE text/javascript 19 | AddOutputFilterByType DEFLATE application/json 20 | AddOutputFilterByType DEFLATE application/javascript 21 | AddOutputFilterByType DEFLATE application/x-javascript 22 | 23 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "lemmon/kirby-portfolio", 3 | "type": "project", 4 | "description": "Free customizable portfolio theme for Kirby CMS.", 5 | "keywords": [ 6 | "kirby", 7 | "cms", 8 | "template", 9 | "theme" 10 | ], 11 | "license": "MIT", 12 | "require": { 13 | "php": ">=8.0.2 <8.3.0", 14 | "getkirby/cms": "^3.9", 15 | "twig/twig": "^3.0" 16 | }, 17 | "require-dev": { 18 | "symfony/var-dumper": "^6.3" 19 | }, 20 | "config": { 21 | "optimize-autoloader": true, 22 | "allow-plugins": { 23 | "getkirby/composer-installer": true 24 | } 25 | }, 26 | "scripts": { 27 | "start": [ 28 | "Composer\\Config::disableProcessTimeout", 29 | "@php -S localhost:8000 kirby/router.php" 30 | ] 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /content/site.txt: -------------------------------------------------------------------------------- 1 | Title: Portfolio Theme 2 | 3 | ---- 4 | 5 | Tagline: Free Customizable Kirby Template 6 | 7 | ---- 8 | 9 | Description: Lemmon Portfolio is a free Kirby CMS theme. Minimalistic look with focus on your content. Customizable and responsive. 10 | 11 | ---- 12 | 13 | Social: 14 | 15 | - 16 | name: GitHub 17 | code: f09b 18 | url: > 19 | https://github.com/lemmon/kirby-portfolio-theme 20 | - 21 | name: Twitter 22 | code: f099 23 | url: https://twitter.com/lemmon 24 | 25 | ---- 26 | 27 | Footer: (c) (date: year) Built with (link: https://github.com/lemmon/kirby-portfolio-theme text: Portfolio Theme) by (link: https://twitter.com/lemmon text: Lemmon Juice) 28 | 29 | ---- 30 | 31 | Htmllang: en 32 | 33 | ---- 34 | 35 | Googleanalytics: 36 | 37 | ---- 38 | 39 | Googletagmanager: 40 | 41 | ---- 42 | 43 | Backgroundcolor: 44 | 45 | ---- 46 | 47 | Textcolor: 48 | 49 | ---- 50 | 51 | Linkcolor: 52 | 53 | ---- 54 | 55 | Highlighttextcolor: 56 | 57 | ---- 58 | 59 | Highlightbackgroundcolor: 60 | 61 | ---- 62 | 63 | Highlightcolor: -------------------------------------------------------------------------------- /site/plugins/bots/index.php: -------------------------------------------------------------------------------- 1 | [ 5 | [ 6 | 'pattern' => 'robots.txt', 7 | 'action' => function () { 8 | if (kirby()->request()->path()->toString() !== kirby()->path()) { 9 | die('404'); 10 | } 11 | $res = [ 12 | 'User-agent: *', 13 | 'Disallow: /panel/', 14 | 'Allow: /', 15 | 'Sitemap: ' . kirby()->url() . '/sitemap.txt', 16 | ]; 17 | return new Response(join("\n", $res), 'text/plain'); 18 | }, 19 | ], 20 | [ 21 | 'pattern' => 'sitemap.txt', 22 | 'action' => function () { 23 | $pages = [ 24 | site()->url() . '/', 25 | ]; 26 | foreach (site()->index()->listed()->not('home') as $page) { 27 | $pages[] = $page->url(); 28 | } 29 | return new Response(join("\n", $pages), 'text/plain'); 30 | }, 31 | ], 32 | [ 33 | 'pattern' => 'sitemap', 34 | 'action' => function () { 35 | return go('sitemap.txt', 301); 36 | }, 37 | ], 38 | ], 39 | ]); 40 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2022 Jakub Pelák 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /site/plugins/color-field/Color.php: -------------------------------------------------------------------------------- 1 | _r = hexdec($m[1]); 21 | $this->_g = hexdec($m[2]); 22 | $this->_b = hexdec($m[3]); 23 | $this->_a = !empty($m[4]) ? (hexdec($m[4]) / 255) : null; 24 | } 25 | 26 | function __toString(): string 27 | { 28 | return $this->getValue(); 29 | } 30 | 31 | function getValue(): string 32 | { 33 | return $this->_a 34 | ? sprintf('rgba(%d, %d, %d, %01.2F)', $this->_r, $this->_g, $this->_b, $this->_a) 35 | : sprintf('#%02s%02s%02s', dechex($this->_r), dechex($this->_g), dechex($this->_b)) 36 | ; 37 | } 38 | 39 | function setAlpha(float $value): self 40 | { 41 | $this->_a = $value / 100; 42 | return $this; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /content/1_about/textpage.txt: -------------------------------------------------------------------------------- 1 | Title: About 2 | 3 | ---- 4 | 5 | Text: 6 | 7 | This is an example site for the Lemmon Portfolio Theme. Built with (link: https://abrusco.com/ text: Abrusco CSS) on top of (link: https://getkirby.com/ text: Kirby CMS). This template is free, customizable, mobile-first, and responsive. 8 | 9 | ## Installation 10 | 11 | ### Composer 12 | 13 | ``` 14 | composer create-project lemmon/kirby-portfolio 15 | ``` 16 | 17 | ### Git 18 | 19 | ``` 20 | git clone git@github.com:lemmon/kirby-portfolio-theme.git 21 | cd kirby-portfolio-theme 22 | composer install 23 | ``` 24 | 25 | ### ZIP Archive 26 | 27 | Download the (link: https://github.com/lemmon/kirby-portfolio-theme/archive/master.zip text: zip archive) from (link: https://github.com/lemmon/kirby-portfolio-theme text: GitHub), extract it, and run `composer install` within the project root directory. 28 | 29 | ## Troubleshooting 30 | 31 | Sometimes you might be faced with folder permissions issue. Try running `bin/permissions` to resolve this. 32 | 33 | You can read more about the Kirby CMS in their official (link: https://getkirby.com/docs text: documentation). 34 | 35 | ## License 36 | 37 | This theme is released under the MIT license. For Kirby license see the (link: https://getkirby.com/license text: License) section on (link: https://getkirby.com/ text: Kirby CMS) official website. -------------------------------------------------------------------------------- /src/css/index.css: -------------------------------------------------------------------------------- 1 | @import 'abrusco/base'; 2 | @import 'abrusco/modules'; 3 | 4 | @import './body'; 5 | @import './copy'; 6 | 7 | @import 'abrusco/utils'; 8 | @import 'abrusco/debug'; 9 | 10 | @import './color'; 11 | 12 | /* Inter font-family */ 13 | 14 | :root { 15 | --font-family: 'Inter', sans-serif; 16 | } 17 | 18 | @supports (font-variation-settings: normal) { 19 | :root { 20 | --font-family: 'Inter var', sans-serif; 21 | } 22 | } 23 | 24 | /* responsivity */ 25 | 26 | @custom-media --view-sd (min-width: 40rem); 27 | @custom-media --view-md (min-width: 61rem); 28 | @custom-media --view-ld (min-width: 80rem); 29 | @custom-media --view-xl (min-width: 100rem); 30 | 31 | /* theme variables */ 32 | 33 | :root { 34 | 35 | --theme-background-color: var(--white); 36 | --theme-text-color: var(--black); 37 | --theme-text-color-05: var(--black-05); 38 | --theme-link-color: inherit; 39 | --theme-highlight-text-color: inherit; 40 | --theme-highlight-background-color: var(--yellow); 41 | 42 | --default-background-color: var(--theme-background-color); 43 | --default-color: var(--theme-text-color); 44 | --link-color: var(--theme-link-color); 45 | 46 | --copy-space-primary: 1.5em; 47 | --copy-space-secondary: 0.5em; 48 | 49 | } 50 | -------------------------------------------------------------------------------- /site/blueprints/pages/project.yml: -------------------------------------------------------------------------------- 1 | title: Project 2 | 3 | columns: 4 | 5 | - width: 1/2 6 | sections: 7 | 8 | project: 9 | type: files 10 | template: project 11 | layout: cards 12 | size: tiny 13 | image: 14 | ratio: 1/1 15 | cover: true 16 | 17 | - width: 1/2 18 | sections: 19 | 20 | content: 21 | type: fields 22 | fields: 23 | 24 | text: 25 | extends: fields/text 26 | 27 | textPosition: 28 | label: Text Position 29 | type: select 30 | placeholder: aside 31 | options: 32 | - above 33 | 34 | files: 35 | extends: sections/files 36 | template: default 37 | 38 | metadata: 39 | type: fields 40 | fields: 41 | 42 | client: 43 | label: Client 44 | type: text 45 | icon: bookmark 46 | 47 | role: 48 | label: Role 49 | type: text 50 | icon: user 51 | help: e.g. "Assistant Chief Lighting Technician" or "Horse Wrangler" 52 | 53 | date: 54 | label: Date 55 | type: text 56 | icon: calendar 57 | help: e.g. "Feb 14, 2020" or "Summer 1979" 58 | 59 | website: 60 | label: Website 61 | type: url 62 | icon: url 63 | -------------------------------------------------------------------------------- /site/plugins/image/index.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'image' => [ 6 | 'attr' => [ 7 | 'alt', 8 | 'title', 9 | 'caption', 10 | ], 11 | 'html' => function ($tag) { 12 | // find file 13 | $file = $tag->file($tag->value); 14 | if (!$file) return; 15 | // params 16 | $alt = $tag->alt ?? $file->alt()->value(); 17 | $title = $tag->title ?? $file->title()->value(); 18 | $caption = $tag->caption ?? $file->caption()->value(); 19 | // responsivity 20 | if (!in_array($file->mime(), ['image/gif', 'image/svg+xml'])) { 21 | if (!empty($tag->data['srcset'])) { 22 | $srcset = $file->srcset($tag->data['srcset']); 23 | } 24 | if (!empty($tag->data['width'])) { 25 | $file = $file->resize($tag->data['width']); 26 | } 27 | } 28 | // html 29 | return Html::figure([ 30 | Html::img($file->url(), [ 31 | 'width' => $file->width(), 32 | 'height' => $file->height(), 33 | 'alt' => $alt ?: ' ', 34 | 'title' => $title, 35 | 'srcset' => $srcset ?? null, 36 | ]), 37 | ], $caption ? [ 38 | kirbytext($caption), 39 | ] : null, [ 40 | 'class' => 'image', 41 | ]); 42 | }, 43 | ], 44 | ], 45 | ]); 46 | -------------------------------------------------------------------------------- /src/css/debug.css: -------------------------------------------------------------------------------- 1 | @media (--view-sd) { 2 | 3 | .body { 4 | background-image: url('data:image/svg+xml;utf8, \ 5 | \ 6 | \ 7 | \ 8 | \ 9 | '); 10 | background-position: top center; 11 | background-repeat: repeat-y; 12 | } 13 | 14 | } 15 | 16 | @media (--view-md) { 17 | 18 | .body { 19 | background-image: url('data:image/svg+xml;utf8, \ 20 | \ 21 | \ 22 | \ 23 | \ 24 | \ 25 | '); 26 | background-position: top center; 27 | background-repeat: repeat-y; 28 | } 29 | 30 | } 31 | 32 | @media (--view-ld) { 33 | 34 | .body { 35 | background-image: url('data:image/svg+xml;utf8, \ 36 | \ 37 | \ 38 | \ 39 | \ 40 | \ 41 | \ 42 | '); 43 | background-position: top center; 44 | background-repeat: repeat-y; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /site/templates/pages/homepage.twig: -------------------------------------------------------------------------------- 1 | {% extends layout() %} 2 | 3 | {% block title %} 4 | {% if site.tagline.notEmpty %}{{ site.title }} – {{ site.tagline }}{% else %}{{ parent() }}{% endif %} 5 | {% endblock %} 6 | 7 | {% block meta_description parent() ?: site.description | excerpt(160) %} 8 | 9 | {% block main %} 10 | 11 |
12 | {%~ for _page in site.pages %} 13 | {%~ if _page.template == 'project' %} 14 | {%~ with { 15 | _image: _page.images.filterBy('template', 'project').sortBy('sort').first, 16 | } %} 17 |
18 |
19 | {%~ if _image %} 20 | {{ _page.title }} Cover 32 | {%~ else %} 33 | 34 | {%~ endif %} 35 |
36 |

{{ _page.title }}

37 |
38 | {%~ endwith %} 39 | {%~ endif %} 40 | {%~ endfor %} 41 |
42 | 43 | {% endblock %} 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Kirby Portfolio Theme 2 | 3 | ![Kirby Portfolio Theme](https://themes.lemmonjuice.com/portfolio--anim@1440w.webp) 4 | 5 | Lemmon Portfolio is a free Kirby CMS theme. Minimalistic look with focus on your content. 6 | Built with [Abrusco CSS](https://abrusco.com/) on top of [Kirby CMS](https://getkirby.com/). 7 | This template is free, customizable, mobile-first, and responsive. 8 | 9 | [View Demo](https://themes.lemmonjuice.com/portfolio/). 10 | 11 | ## Installation 12 | 13 | ### Composer 14 | 15 | ``` 16 | composer create-project lemmon/kirby-portfolio 17 | ``` 18 | 19 | ### Git 20 | 21 | ``` 22 | git clone git@github.com:lemmon/kirby-portfolio-theme.git 23 | cd kirby-portfolio-theme 24 | composer install 25 | ``` 26 | 27 | ### ZIP Archive 28 | 29 | Download the [zip archive](https://github.com/lemmon/kirby-portfolio-theme/archive/master.zip), 30 | extract it, and run `composer install` within the project root directory. 31 | 32 | ### Pre-built release 33 | 34 | You can download latest pre-built release in the [Releases](https://github.com/lemmon/kirby-portfolio-theme/releases) section. 35 | 36 | - download the zip file 37 | - extract it 38 | - upload the contents to your web server 39 | 40 | ## Troubleshooting 41 | 42 | Sometimes you might face a folder permissions issue. Try running `bin/permissions` to resolve this. 43 | 44 | You can read more about the Kirby CMS in their official [documentation](https://getkirby.com/docs). 45 | 46 | ## License 47 | 48 | This theme is released under the MIT license. For Kirby license see the [License](https://getkirby.com/license) section 49 | on [Kirby CMS](https://getkirby.com/) official website. 50 | 51 | ## More Themes 52 | 53 | - [Tablog](https://demo1.tablo.me/) — Minimalistic Blog Theme 54 | - [Tablook](https://demo2.tablo.me/) — Minimalist Portfolio Theme for Artists and Visual Creators 55 | 56 | -------------------------------------------------------------------------------- /content/2_forrest-text-page/textpage.txt: -------------------------------------------------------------------------------- 1 | Title: Forrest Text Page 2 | 3 | ---- 4 | 5 | Text: 6 | 7 | Proin mattis ut erat quis viverra. Vestibulum sed vestibulum ante. Morbi iaculis risus non urna commodo facilisis. Aenean tempus sapien vitae viverra mattis. Integer ligula tellus, porta at augue et, aliquet placerat turpis. Pellentesque magna erat, rutrum et efficitur a, facilisis sagittis justo. Nulla id condimentum dui. Sed vitae nunc ante. Duis fermentum condimentum enim, quis posuere enim bibendum a. Phasellus sodales nisl nisl, at ultrices lacus sagittis ut. Vestibulum id est aliquam, ultrices nunc in, vestibulum ipsum. Vivamus placerat nisl in convallis rutrum. Praesent vulputate urna vel dignissim tincidunt. 8 | 9 | (image: blake-cheek-cpwyhs2ww24-unsplash.jpg caption: credit: https://unsplash.com/photos/CPwYhs2ww24 alt: Forrest Inline Alt Text) 10 | 11 | ## Pellentesque Venenatis Lectus 12 | 13 | Pellentesque diam nulla, tincidunt ut facilisis sit amet, aliquam a elit. Sed sed magna mi. Mauris volutpat finibus felis eu eleifend. In aliquet eros volutpat velit volutpat, **non molestie eros aliquam**. Quisque fringilla imperdiet augue in sagittis. Quisque a efficitur ipsum, quis hendrerit tellus. Integer cursus urna a mi consectetur, eget convallis leo dapibus. Ut eget dictum sem. Donec sed mauris molestie, sagittis est sit amet, pharetra urna. Pellentesque ac venenatis lectus. 14 | 15 | (image: ju-on-e6xsi7qqvaa-unsplash.jpg caption: credit: https://unsplash.com/photos/e6XsI7qqvAA) 16 | 17 | Cras fringilla nunc a lacus maximus volutpat. Fusce egestas magna in pulvinar mattis. Etiam nisl nisl, ornare quis diam id, auctor sagittis odio. Nam aliquet augue orci, at scelerisque sem suscipit et. Morbi euismod a erat a fringilla. In viverra arcu lectus, non fringilla turpis faucibus a. Nullam id vehicula magna, at ullamcorper ligula. Maecenas auctor dui eget augue bibendum, quis finibus diam pretium. *Sed placerat nisi eget velit maximus, hendrerit iaculis odio volutpat.* -------------------------------------------------------------------------------- /content/10_example-content/textpage.txt: -------------------------------------------------------------------------------- 1 | Title: Example Content 2 | 3 | ---- 4 | 5 | Text: 6 | 7 | Cras fringilla nunc a lacus maximus volutpat. Fusce egestas magna in pulvinar mattis. Etiam nisl nisl, ornare quis diam id, **auctor sagittis odio**. Nam aliquet augue orci, at scelerisque sem suscipit et. Morbi euismod a erat a fringilla. In viverra arcu lectus, non fringilla turpis faucibus a. Nullam id vehicula magna, at ullamcorper ligula. *Maecenas auctor dui eget augue bibendum, quis finibus diam pretium.* Sed placerat nisi eget velit maximus, hendrerit (link: https://www.lemmonjuice.com/ text: iaculis odio volutpat). 8 | 9 | ## Ordered List 10 | 11 | 1. Nam sit amet nulla eget nunc pulvinar 12 | 2. Donec lobortis tellus dictum 13 | 3. Donec mollis risus vel risus congue, sed mollis eros rhoncus; id vehicula magna, at ullamcorper ligula, maecenas auctor dui eget augue bibendum 14 | 4. Aenean tincidunt libero eu justo aliquam rhoncus 15 | 16 | ## Unordered List 17 | 18 | - Quisque eu metus at orci tempus gravida in sed 19 | - In condimentum magna et lorem pharetra, non eleifend velit 20 | - Integer elementum magna eget urna volutpat 21 | - Duis vel nunc non arcu placerat 22 | 23 | ## Blockquote 24 | 25 | > Mauris molestie purus egestas elit fermentum porta. Sed et placerat ligula, vel molestie nulla. Phasellus nisl nulla, pulvinar quis finibus eget, sollicitudin eu neque. Integer tempus nibh sit amet mi tincidunt rutrum. Donec luctus quam neque, vel rutrum leo posuere ac. Cras semper in elit pharetra tincidunt. Nunc non metus ac risus porta vestibulum. 26 | 27 | ## Code 28 | 29 | Maecenas efficitur in turpis eu tincidunt. Sed lacinia tincidunt orci sit amet varius. Pellentesque non condimentum leo. Integer `` cursus et elit non volutpat. Proin a ipsum ornare, rutrum sapien a, mollis felis. 30 | 31 | ``` 32 | 33 | 34 | 35 | 36 | 37 | 38 |

Hello World!

39 | 40 | 41 | ``` 42 | 43 | ## YouTube Video 44 | 45 | (video: https://www.youtube.com/watch?v=sOpMrVnjYeY) 46 | 47 | ## Vimeo Video 48 | 49 | (video: https://vimeo.com/32001208) -------------------------------------------------------------------------------- /site/plugins/twig/index.php: -------------------------------------------------------------------------------- 1 | __DIR__ . '/../../cache/twig', 8 | 'debug' => option('debug'), 9 | ]); 10 | $twig->addFunction(new Twig\TwigFunction('layout', function ($name = 'default') { 11 | return "layouts/{$name}.twig"; 12 | })); 13 | $twig->addFunction(new Twig\TwigFunction('partial', function ($name) { 14 | return "partials/{$name}.twig"; 15 | })); 16 | $twig->addFunction(new Twig\TwigFunction('template', function ($name) { 17 | return "pages/{$name}.twig"; 18 | })); 19 | $twig->addFunction(new Twig\TwigFunction('dump', function (...$args) { 20 | return Symfony\Component\VarDumper\VarDumper::dump(...$args); 21 | })); 22 | $twig->addFunction(new Twig\TwigFunction('site', 'site')); 23 | $twig->addFunction(new Twig\TwigFunction('page', 'page')); 24 | $twig->addFunction(new Twig\TwigFunction('pages', 'pages')); 25 | $twig->addFilter(new Twig\TwigFilter('kt', 'kirbytext', ['is_safe' => ['html']])); 26 | $twig->addFilter(new Twig\TwigFilter('kti', 'kirbytextinline', ['is_safe' => ['html']])); 27 | $twig->addFilter(new Twig\TwigFilter('excerpt', function ($text, $len = null) { 28 | $text = strval($text); 29 | $text = preg_split('/\n\h*\n/', $text); 30 | $text = array_filter($text, function ($p) { 31 | return $p and !preg_match('/^(\d+\.|[\-\+\*]\s|[#!\>])/', $p); 32 | }); 33 | if (!$text) return null; 34 | $text = reset($text); 35 | $text = kirbytextinline($text); 36 | $text = strip_tags($text); 37 | $text = html_entity_decode($text); 38 | $text = preg_replace('/\n+/', ' ', $text); 39 | if ($len and mb_strlen($text) > $len) { 40 | $text = mb_substr($text, 0, $len); 41 | $text = preg_replace('/\W+$/u', '', $text); 42 | $append = '…'; 43 | } 44 | return $text ? htmlspecialchars($text, ENT_COMPAT | ENT_HTML5) . ($append ?? '') : null; 45 | }, ['is_safe' => ['html']])); 46 | $twig->addGlobal('kirby', kirby()); 47 | $twig->addGlobal('site', site()); 48 | $twig->addGlobal('page', page()); 49 | $twig->addGlobal('pages', pages()); 50 | /* drop hook for Kirby 3.4.0 compatibility */ 51 | /*kirby()->trigger('twig', $twig);*/ 52 | $twig->display("pages/{$template}.twig", $data ?? []); 53 | } 54 | -------------------------------------------------------------------------------- /site/templates/pages/project.twig: -------------------------------------------------------------------------------- 1 | {% extends layout() %} 2 | 3 | {% block main %} 4 | {% with { 5 | tp: page.textPosition.value, 6 | } %} 7 | 8 |
9 |
10 | 11 |
12 | 13 |
14 |

{{ page.title }}

15 |
16 | 17 | {%~ if page.text.notEmpty 18 | or page.client.notEmpty 19 | or page.role.notEmpty 20 | or page.date.notEmpty 21 | or page.website.notEmpty %} 22 |
23 | {%~ if page.text.notEmpty %} 24 |
25 |
26 | {{ page.text | kt({ width: 640, srcset: [ 320, 640, 960, 1280 ] }) }} 27 |
28 |
29 | {%~ endif %} 30 | {%~ if page.client.notEmpty 31 | or page.role.notEmpty 32 | or page.date.notEmpty 33 | or page.website.notEmpty %} 34 |
35 |
36 |
37 | {%~ if page.client.notEmpty %} 38 |
Client
39 |
{{ page.client }}
40 | {%~ endif %} 41 | {%~ if page.role.notEmpty %} 42 |
Role
43 |
{{ page.role }}
44 | {%~ endif %} 45 | {%~ if page.date.notEmpty %} 46 |
Date
47 |
{{ page.date }}
48 | {%~ endif %} 49 | {%~ if page.website.notEmpty %} 50 |
Website
51 |
{{ page.website }}
52 | {%~ endif %} 53 |
54 |
55 |
56 | {%~ endif %} 57 |
58 | {%~ endif %} 59 | 60 |
61 | 62 |
63 | {%~ with { images: page.images.filterBy('template', 'project').sortBy('sort') } %} 64 | {%~ if images.count %} 65 |
66 | {%~ for _image in images %} 67 |
68 | {{ 69 | "(image: %s caption: %s)" 70 | | format(_image.filename, _image.caption) 71 | | kt({ width: 640, srcset: [ 320, 640, 960, 1280 ] }) 72 | }} 73 |
74 | {%~ endfor %} 75 |
76 | {%~ endif %} 77 | {%~ endwith %} 78 |
79 | 80 | {% endwith %} 81 | {% endblock %} 82 | -------------------------------------------------------------------------------- /src/css/copy.css: -------------------------------------------------------------------------------- 1 | .copy { 2 | line-height: 1.5; 3 | & > * { 4 | max-width: 36rem; 5 | } 6 | & h1 { 7 | font-size: var(--h2); 8 | line-height: var(--lh2); 9 | } 10 | & h2 { 11 | font-size: var(--h3); 12 | line-height: var(--lh2); 13 | } 14 | & h3 { 15 | font-size: var(--h4); 16 | line-height: var(--lh2); 17 | } 18 | & h4 { 19 | font-size: var(--h5); 20 | line-height: var(--lh2); 21 | } 22 | & h1, 23 | & h2, 24 | & h3, 25 | & h4, 26 | & h5, 27 | & h6 { 28 | font-weight: 700; 29 | } 30 | & figcaption { 31 | font-style: italic; 32 | margin-top: .5em; 33 | } 34 | & a { 35 | color: var(--link-color); 36 | text-decoration: underline; 37 | } 38 | & img { 39 | display: block; 40 | height: auto; 41 | max-width: 100%; 42 | margin-left: auto; 43 | margin-right: auto; 44 | } 45 | & strong { 46 | font-weight: bold; 47 | } 48 | & em { 49 | font-style: italic; 50 | } 51 | & ol, 52 | & ul { 53 | padding-left: 2em; 54 | & li::before { 55 | display: inline-block; 56 | width: 2em; 57 | padding-right: .5em; 58 | margin-left: -2em; 59 | text-align: right; 60 | opacity: .3; 61 | } 62 | } 63 | & ol { 64 | counter-reset: ol; 65 | & li::before { 66 | counter-increment: ol; 67 | content: counter(ol, upper-roman); 68 | } 69 | } 70 | & ul { 71 | & li::before { 72 | content: "\2013"; 73 | } 74 | } 75 | & blockquote { 76 | padding-left: 2em; 77 | position: relative; 78 | &::before { 79 | content: ""; 80 | display: block; 81 | position: absolute; 82 | left: 1.25em; 83 | top: .25em; 84 | bottom: .25em; 85 | margin-left: -1px; 86 | width: 2px; 87 | background-color: currentColor; 88 | opacity: .1; 89 | } 90 | } 91 | & pre, 92 | & code { 93 | font-family: Courier, monospace; 94 | font-size: 14px; 95 | line-height: 20px; 96 | } 97 | & code { 98 | padding: 2px; 99 | background-color: var(--theme-text-color-05); 100 | } 101 | & pre { 102 | white-space: pre-wrap; 103 | background-color: var(--theme-text-color-05); 104 | & code { 105 | display: block; 106 | padding: 16px 18px; 107 | background-color: transparent; 108 | } 109 | } 110 | & p code { 111 | position: relative; 112 | top: -2px; 113 | } 114 | & dt { 115 | opacity: .6; 116 | } 117 | & dd + dt { 118 | margin-top: .5em; 119 | } 120 | } 121 | 122 | @media (--view-ld) { 123 | .copy--wide { 124 | & figure.image { 125 | max-width: none; 126 | display: flex; 127 | flex-direction: row; 128 | align-items: flex-start; 129 | & img { 130 | width: 36rem; 131 | } 132 | & figcaption { 133 | width: 19rem; 134 | margin: 0; 135 | padding-left: 2rem; 136 | position: sticky; 137 | top: 2rem; 138 | } 139 | } 140 | } 141 | } 142 | 143 | .video { 144 | position: relative; 145 | width: 100%; 146 | &::before { 147 | content: ""; 148 | display: block; 149 | padding-top: calc(100% * 720 / 1280); 150 | } 151 | & iframe { 152 | display: block; 153 | position: absolute; 154 | left: 0; 155 | right: 0; 156 | top: 0; 157 | bottom: 0; 158 | width: 100%; 159 | height: 100%; 160 | } 161 | } 162 | -------------------------------------------------------------------------------- /site/blueprints/site.yml: -------------------------------------------------------------------------------- 1 | title: Site 2 | 3 | tabs: 4 | 5 | content: 6 | label: Content 7 | icon: text 8 | sections: 9 | 10 | pages: 11 | headline: Pages 12 | type: pages 13 | create: 14 | - project 15 | - textpage 16 | image: 17 | query: page.images.filterBy('template', 'project').sortBy('sort').first 18 | conver: true 19 | info: "{{ page.intendedTemplate }}" 20 | 21 | settings: 22 | label: Settings 23 | icon: cog 24 | columns: 25 | 26 | - width: 2/3 27 | sections: 28 | 29 | fields: 30 | type: fields 31 | fields: 32 | 33 | tagline: 34 | label: Tagline 35 | type: text 36 | help: > 37 | Tagline will be displayed in title tag next to your site name. 38 | (e.g. {{ site.title }} - Your Custom Tagline) 39 | 40 | description: 41 | label: Description 42 | type: textarea 43 | 44 | social: 45 | label: Social 46 | type: structure 47 | fields: 48 | name: 49 | label: Name 50 | type: text 51 | code: 52 | label: Code 53 | type: text 54 | help: Font Awesome Unicode code. 55 | url: 56 | label: Url 57 | type: url 58 | 59 | footer: 60 | label: Footer 61 | type: textarea 62 | buttons: false 63 | help: > 64 | This theme is completely free for both personal and commercial use, 65 | however any kind of attribution is appreciated. 66 | 67 | - width: 1/3 68 | fields: 69 | 70 | htmlLang: 71 | label: Document Language 72 | type: text 73 | help: <html lang="{{site.htmlLang}}"> 74 | 75 | googleAnalytics: 76 | label: Google Analytics 77 | type: text 78 | placeholder: UA-XXXXX-Y 79 | width: 1/2 80 | 81 | googleTagManager: 82 | label: Google Tag Manager 83 | type: text 84 | placeholder: GTM-XXXX 85 | width: 1/2 86 | 87 | 88 | visual: 89 | label: Visual 90 | icon: settings 91 | columns: 92 | 93 | - width: 1/3 94 | sections: 95 | 96 | logo: 97 | type: files 98 | template: logo 99 | empty: No logo yet 100 | max: 1 101 | sortable: false 102 | layout: cards 103 | size: huge 104 | info: "{{ file.width }} x {{ file.height }}" 105 | image: 106 | ratio: 1/1 107 | cover: false 108 | back: white 109 | 110 | favicon: 111 | type: files 112 | template: favicon 113 | empty: No favicon uploaded 114 | max: 1 115 | sortable: false 116 | size: tiny 117 | info: "{{ file.width }} x {{ file.height }} ({{ file.mime }})" 118 | image: 119 | ratio: 1/1 120 | cover: false 121 | 122 | - width: 1/3 123 | fields: 124 | 125 | backgroundColor: 126 | label: Background Color 127 | type: text 128 | placeholder: '#FFFFFF' 129 | 130 | textColor: 131 | label: Text Color 132 | type: text 133 | placeholder: '#040404' 134 | 135 | linkColor: 136 | label: Link Color 137 | type: text 138 | 139 | highlightTextColor: 140 | label: Highlight Text Color 141 | type: text 142 | 143 | highlightBackgroundColor: 144 | label: Highlight Background Color 145 | type: text 146 | placeholder: '#FFDC00' 147 | -------------------------------------------------------------------------------- /site/templates/layouts/default.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {% block title %}{{ page.title }} – {{ site.title }}{% endblock %} 6 | 7 | {%~ block meta %} 8 | 9 | {%~ endblock %} 10 | 11 | 12 | 13 | 33 | {%~ if site.googleAnalytics.notEmpty %} 34 | 35 | 43 | 44 | {%~ endif %} 45 | {%~ if site.googleTagManager.notEmpty %} 46 | 47 | 52 | 53 | {%~ endif %} 54 | 55 | 56 | 57 | {%~ if site.googleTagManager.notEmpty %} 58 | 59 | 61 | 62 | {%~ endif %} 63 | 64 |
65 |
66 | {%~ with { logo: site.images.filterBy('template', 'logo').first } %} 67 | {%~ if logo %} 68 |
{{ site.title }}
79 | {%~ else %} 80 |

{{ site.title }}

81 | {%~ endif %} 82 | {%~ endwith %} 83 |
84 | {%~ if site.description.notEmpty %} 85 | 90 | {%~ endif %} 91 | 102 | {%~ if site.social.notEmpty %} 103 | 110 | {%~ endif %} 111 |
112 | 113 |
114 | {%~ block main none %} 115 |
116 | 117 | {%~ if site.footer.notEmpty %} 118 | 123 | {%~ endif %} 124 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /static/master.css: -------------------------------------------------------------------------------- 1 | a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,main,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{border:0;font-size:100%;font:inherit;margin:0;padding:0;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section{display:block}[hidden]{display:none}body{line-height:1}menu,ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}table{border-collapse:collapse;border-spacing:0}:root{--default-font-size:16px;--default-font-family:var(--sansserif-font-family);--default-background-color:var(--white,#fff);--default-color:var(--black,#000);--default-border-width:1px;--default-border-color:currentColor;--default-bold-fw:bold;--font-size:var(--default-font-size);--font-family:var(--default-font-family);--background-color:var(--default-background-color);--color:var(--default-color);--border-width:var(--default-border-width);--border-color:var(--default-border-color);--bold-fw:var(--default-bold-fw);--serif-font-family:Georgia,"Times New Roman",serif;--sansserif-font-family:system-ui;--code-font-family:Courier,monospace;--h1:2.5rem;--h2:2.0rem;--h3:1.5rem;--h4:1.25rem;--h5:1.125rem;--h6:1.0625rem;--d1:3.0rem;--d2:3.5rem;--d3:4.0rem;--d4:5.0rem;--d5:6.0rem;--f0:1rem;--f1:.9375rem;--f2:.875rem;--f3:.8125rem;--f4:.75rem;--lh0:1;--lh1:1.125;--lh2:1.250;--lh3:1.375;--lh4:1.5;--lh5:2;--br1:.125rem;--br2:.25rem;--br3:.5rem;--br4:.75rem;--br5:1rem;--black:#040404;--white:#fff;--black-95:rgba(4,4,4,.95);--black-90:rgba(4,4,4,.9);--black-80:rgba(4,4,4,.8);--black-70:rgba(4,4,4,.7);--black-60:rgba(4,4,4,.6);--black-50:rgba(4,4,4,.5);--black-40:rgba(4,4,4,.4);--black-30:rgba(4,4,4,.3);--black-20:rgba(4,4,4,.2);--black-10:rgba(4,4,4,.1);--black-05:rgba(4,4,4,.05);--black-025:rgba(4,4,4,.025);--black-0125:rgba(4,4,4,.013);--white-95:hsla(0,0%,100%,.95);--white-90:hsla(0,0%,100%,.9);--white-80:hsla(0,0%,100%,.8);--white-70:hsla(0,0%,100%,.7);--white-60:hsla(0,0%,100%,.6);--white-50:hsla(0,0%,100%,.5);--white-40:hsla(0,0%,100%,.4);--white-30:hsla(0,0%,100%,.3);--white-20:hsla(0,0%,100%,.2);--white-10:hsla(0,0%,100%,.1);--white-05:hsla(0,0%,100%,.05);--white-025:hsla(0,0%,100%,.025);--white-0125:hsla(0,0%,100%,.013);--aqua:#7fdbff;--blue:#0074d9;--navy:#001f3f;--teal:#39cccc;--green:#2ecc40;--olive:#3d9970;--lime:#01ff70;--yellow:#ffdc00;--orange:#ff851b;--red:#ff4136;--fuchsia:#f012be;--purple:#b10dc9;--maroon:#85144b}html{background-color:var(--background-color);box-sizing:border-box;color:var(--color);font-family:var(--font-family);font-size:var(--font-size)}*,:after,:before{box-sizing:inherit}a{background-color:transparent;color:inherit;outline:0;text-decoration:none}hr{border:0;margin:0}.copy>:first-child{margin-top:0}.copy>:last-child{margin-bottom:0}.copy>:not(h1,h2,h3,h4,h5,h6,p){margin-bottom:var(--copy-space-primary)}.copy>:not(h1,h2,h3,h4,h5,h6,p),.copy>h1,.copy>h2,.copy>h3,.copy>h4,.copy>h5,.copy>h6{margin-top:var(--copy-space-primary)}.copy>p{margin-bottom:var(--copy-space-primary);margin-top:var(--copy-space-secondary)}:root{--copy-space-secondary:.5em}.div{color:var(--border-color)}.div:before{background-color:currentColor;content:"";display:block;height:100%;min-height:var(--border-width);min-width:var(--border-width);width:100%}.body{margin-left:auto;margin-right:auto;max-width:28rem;padding-bottom:1.5rem;padding-top:1.5rem}@media (min-width:40rem){.body{max-width:39rem}}@media (min-width:61rem){.body{display:grid;grid-template-columns:19rem auto;grid-template-rows:repeat(3,min-content);max-width:58rem}.main{grid-column-start:2;grid-row-end:span 3;grid-row-start:1}}@media (min-width:80rem){.body{max-width:77rem}}.copy{line-height:1.5}.copy>*{max-width:36rem}.copy h1{font-size:var(--h2)}.copy h1,.copy h2{line-height:var(--lh2)}.copy h2{font-size:var(--h3)}.copy h3{font-size:var(--h4)}.copy h3,.copy h4{line-height:var(--lh2)}.copy h4{font-size:var(--h5)}.copy h1,.copy h2,.copy h3,.copy h4,.copy h5,.copy h6{font-weight:700}.copy figcaption{font-style:italic;margin-top:.5em}.copy a{color:var(--link-color);text-decoration:underline}.copy img{display:block;height:auto;margin-left:auto;margin-right:auto;max-width:100%}.copy strong{font-weight:700}.copy em{font-style:italic}.copy ol,.copy ul{padding-left:2em}.copy ol li:before,.copy ul li:before{display:inline-block;margin-left:-2em;opacity:.3;padding-right:.5em;text-align:right;width:2em}.copy ol{counter-reset:ol}.copy ol li:before{content:counter(ol,upper-roman);counter-increment:ol}.copy ul li:before{content:"\2013"}.copy blockquote{padding-left:2em;position:relative}.copy blockquote:before{background-color:currentColor;bottom:.25em;content:"";display:block;left:1.25em;margin-left:-1px;opacity:.1;position:absolute;top:.25em;width:2px}.copy code,.copy pre{font-family:Courier,monospace;font-size:14px;line-height:20px}.copy code{padding:2px}.copy code,.copy pre{background-color:var(--theme-text-color-05)}.copy pre{white-space:pre-wrap}.copy pre code{background-color:transparent;display:block;padding:16px 18px}.copy p code{position:relative;top:-2px}.copy dt{opacity:.6}.copy dd+dt{margin-top:.5em}@media (min-width:80rem){.copy--wide figure.image{align-items:flex-start;display:flex;flex-direction:row;max-width:none}.copy--wide figure.image img{width:36rem}.copy--wide figure.image figcaption{margin:0;padding-left:2rem;position:sticky;top:2rem;width:19rem}}.video{position:relative;width:100%}.video:before{content:"";display:block;padding-top:56.25%}.video iframe{bottom:0;display:block;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.al{text-align:left}.ar{text-align:right}.ac{text-align:center}.uc{text-transform:uppercase}.lc{text-transform:lowercase}.cc{text-transform:capitalize}.nc{text-transform:none}.h1{font-size:var(--h1)}.h2{font-size:var(--h2)}.h3{font-size:var(--h3)}.h4{font-size:var(--h4)}.h5{font-size:var(--h5)}.h6{font-size:var(--h6)}.d1{font-size:var(--d1)}.d2{font-size:var(--d2)}.d3{font-size:var(--d3)}.d4{font-size:var(--d4)}.d5{font-size:var(--d5)}.f0{font-size:var(--f0)}.f1{font-size:var(--f1)}.f2{font-size:var(--f2)}.f3{font-size:var(--f3)}.f4{font-size:var(--f4)}.lh0{line-height:var(--lh0)}.lh1{line-height:var(--lh1)}.lh2{line-height:var(--lh2)}.lh3{line-height:var(--lh3)}.lh4{line-height:var(--lh4)}.lh5{line-height:var(--lh5)}.bold{font-weight:var(--bold-fw)}.fw100{font-weight:100}.fw200{font-weight:200}.fw300{font-weight:300}.fw400{font-weight:400}.fw500{font-weight:500}.fw600{font-weight:600}.fw700{font-weight:700}.fw800{font-weight:800}.fw900{font-weight:900}.fw1000{font-weight:1000}.italic{font-style:italic}.anchor:hover .ul\:hover,.ul,.ul\:hover:hover{text-decoration:underline}.ol{text-decoration:overline}.lt{text-decoration:line-through}.va-inherit{vertical-align:inherit}.va-baseline{vertical-align:baseline}.va-sub{vertical-align:sub}.va-super{vertical-align:super}.va-middle{vertical-align:middle}.va-top{vertical-align:top}.va-bottom{vertical-align:bottom}.nowrap{white-space:nowrap}.pre{white-space:pre}.pre-wrap{white-space:pre-wrap}.pre-line{white-space:pre-line}.break-spaces{white-space:break-spaces}.break-word{overflow-wrap:break-word}.serif{font-family:var(--serif-font-family)}.sansserif{font-family:var(--sansserif-font-family)}.code{font-family:var(--code-font-family)}@media (max-width:24rem){.xs\:al{text-align:left}.xs\:ar{text-align:right}.xs\:ac{text-align:center}}@media (min-width:40rem){.sd\:al{text-align:left}.sd\:ar{text-align:right}.sd\:ac{text-align:center}.sd\:h1{font-size:var(--h1)}.sd\:h2{font-size:var(--h2)}.sd\:h3{font-size:var(--h3)}.sd\:h4{font-size:var(--h4)}.sd\:h5{font-size:var(--h5)}.sd\:h6{font-size:var(--h6)}.sd\:d1{font-size:var(--d1)}.sd\:d2{font-size:var(--d2)}.sd\:d3{font-size:var(--d3)}.sd\:d4{font-size:var(--d4)}.sd\:d5{font-size:var(--d5)}.sd\:f0{font-size:var(--f0)}.sd\:f1{font-size:var(--f1)}.sd\:f2{font-size:var(--f2)}.sd\:f3{font-size:var(--f3)}.sd\:f4{font-size:var(--f4)}.sd\:lh0{line-height:var(--lh0)}.sd\:lh1{line-height:var(--lh1)}.sd\:lh2{line-height:var(--lh2)}.sd\:lh3{line-height:var(--lh3)}.sd\:lh4{line-height:var(--lh4)}.sd\:lh5{line-height:var(--lh5)}}@media (min-width:61rem){.md\:al{text-align:left}.md\:ar{text-align:right}.md\:ac{text-align:center}.md\:h1{font-size:var(--h1)}.md\:h2{font-size:var(--h2)}.md\:h3{font-size:var(--h3)}.md\:h4{font-size:var(--h4)}.md\:h5{font-size:var(--h5)}.md\:h6{font-size:var(--h6)}.md\:d1{font-size:var(--d1)}.md\:d2{font-size:var(--d2)}.md\:d3{font-size:var(--d3)}.md\:d4{font-size:var(--d4)}.md\:d5{font-size:var(--d5)}.md\:f0{font-size:var(--f0)}.md\:f1{font-size:var(--f1)}.md\:f2{font-size:var(--f2)}.md\:f3{font-size:var(--f3)}.md\:f4{font-size:var(--f4)}.md\:lh0{line-height:var(--lh0)}.md\:lh1{line-height:var(--lh1)}.md\:lh2{line-height:var(--lh2)}.md\:lh3{line-height:var(--lh3)}.md\:lh4{line-height:var(--lh4)}.md\:lh5{line-height:var(--lh5)}}@media (min-width:80rem){.ld\:al{text-align:left}.ld\:ar{text-align:right}.ld\:ac{text-align:center}.ld\:h1{font-size:var(--h1)}.ld\:h2{font-size:var(--h2)}.ld\:h3{font-size:var(--h3)}.ld\:h4{font-size:var(--h4)}.ld\:h5{font-size:var(--h5)}.ld\:h6{font-size:var(--h6)}.ld\:d1{font-size:var(--d1)}.ld\:d2{font-size:var(--d2)}.ld\:d3{font-size:var(--d3)}.ld\:d4{font-size:var(--d4)}.ld\:d5{font-size:var(--d5)}.ld\:f0{font-size:var(--f0)}.ld\:f1{font-size:var(--f1)}.ld\:f2{font-size:var(--f2)}.ld\:f3{font-size:var(--f3)}.ld\:f4{font-size:var(--f4)}.ld\:lh0{line-height:var(--lh0)}.ld\:lh1{line-height:var(--lh1)}.ld\:lh2{line-height:var(--lh2)}.ld\:lh3{line-height:var(--lh3)}.ld\:lh4{line-height:var(--lh4)}.ld\:lh5{line-height:var(--lh5)}}.block{display:block}.inline{display:inline}.inlineblock{display:inline-block}.visible{visibility:visible}.hidden{visibility:hidden}.o100{opacity:1}.o95{opacity:.95}.o90{opacity:.9}.o80{opacity:.8}.o70{opacity:.7}.o60{opacity:.6}.o50{opacity:.5}.o40{opacity:.4}.o30{opacity:.3}.o20{opacity:.2}.o10{opacity:.1}.o05{opacity:.05}.o0{opacity:0}.absolute{position:absolute}.relative{position:relative}.fixed{position:fixed}.sticky{position:sticky}.left{left:0}.right{right:0}.top{top:0}.bottom{bottom:0}.z0{z-index:0}.z1{z-index:1}.z2{z-index:2}.z3{z-index:3}.z9{z-index:9}.z99{z-index:99}.z999{z-index:999}.z9999{z-index:9999}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.object-fill{object-fit:fill}.object-scaledown{object-fit:scale-down}.show{display:block}.hide{display:none}.min8{min-width:8rem}.min10{min-width:10rem}.min12{min-width:12rem}.min14{min-width:14rem}.min16{min-width:16rem}.min18{min-width:18rem}.min20{min-width:20rem}.min24{min-width:24rem}.max{max-width:none}.max4{max-width:4rem}.max6{max-width:6rem}.max8{max-width:8rem}.max10{max-width:10rem}.max12{max-width:12rem}.max15{max-width:15rem}.max16{max-width:16rem}.max20{max-width:20rem}.max22{max-width:22rem}.max24{max-width:24rem}.max26{max-width:26rem}.max28{max-width:28rem}.max30{max-width:30rem}.max32{max-width:32rem}.max34{max-width:34rem}.max35{max-width:35rem}.max36{max-width:36rem}.max38{max-width:38rem}.max40{max-width:40rem}.max42{max-width:42rem}.max44{max-width:44rem}.max45{max-width:45rem}.max47{max-width:47rem}.max48{max-width:48rem}.max49{max-width:49rem}.max50{max-width:50rem}.max51{max-width:51rem}.max52{max-width:52rem}.max54{max-width:54rem}.max55{max-width:55rem}.max56{max-width:56rem}.max60{max-width:60rem}.max64{max-width:64rem}.max65{max-width:65rem}.max66{max-width:66rem}.max68{max-width:68rem}.max70{max-width:70rem}.max72{max-width:72rem}.max74{max-width:74rem}.max75{max-width:75rem}.max77{max-width:77rem}.max78{max-width:78rem}.max80{max-width:80rem}.max90{max-width:90rem}.w100{width:100%}.w50{width:50%}.w0{width:0}.wa{width:auto}.h100{height:100%}.h50{height:50%}.h0{height:0%}.ha{height:auto}.minvw{min-width:100vw}.minvh{min-height:100vh}.maxw{max-width:100%}.maxh{max-height:100%}.row,.row-wrap{display:flex;flex-direction:row}.col,.col-wrap{display:flex;flex-direction:column}.row-reverse,.row-reverse-wrap{display:flex;flex-direction:row-reverse}.col-reverse,.col-reverse-wrap{display:flex;flex-direction:column-reverse}.col-reverse-wrap,.col-wrap,.flex-wrap,.row-reverse-wrap,.row-wrap{flex-wrap:wrap}.grid,.grid2{display:grid}.grid2{grid-template-columns:repeat(2,1fr)}.grid3{display:grid;grid-template-columns:repeat(3,1fr)}.grid4{display:grid;grid-template-columns:repeat(4,1fr)}.grid5{display:grid;grid-template-columns:repeat(5,1fr)}.grid6{display:grid;grid-template-columns:repeat(6,1fr)}.grid7{display:grid;grid-template-columns:repeat(7,1fr)}.grid8{display:grid;grid-template-columns:repeat(8,1fr)}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-center{align-self:center}.self-baseline{align-self:baseline}.self-stretch{align-self:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.span0{flex:0}.span1{flex:1}.span2{flex:2}.span3{flex:3}.span4{flex:4}.span5{flex:5}.span6{flex:6}.span7{flex:7}.span8{flex:8}.span9{flex:9}.span-auto{flex-basis:auto}.order0{order:0}.order1{order:1}.order2{order:2}.order3{order:3}.order4{order:4}.order5{order:5}.order6{order:6}.order7{order:7}.order8{order:8}.order9{order:9}@media (max-width:24rem){.xs\:show{display:block}.xs\:hide{display:none}}@media (min-width:40rem){.sd\:show{display:block}.sd\:hide{display:none}.sd\:max{max-width:none}.sd\:row,.sd\:row-wrap{display:flex;flex-direction:row}.sd\:col,.sd\:col-wrap{display:flex;flex-direction:column}.sd\:row-reverse,.sd\:row-reverse-wrap{display:flex;flex-direction:row-reverse}.sd\:col-reverse,.sd\:col-reverse-wrap{display:flex;flex-direction:column-reverse}.sd\:col-reverse-wrap,.sd\:col-wrap,.sd\:flex-wrap,.sd\:row-reverse-wrap,.sd\:row-wrap{flex-wrap:wrap}.sd\:grid,.sd\:grid2{display:grid}.sd\:grid2{grid-template-columns:repeat(2,1fr)}.sd\:grid3{display:grid;grid-template-columns:repeat(3,1fr)}.sd\:grid4{display:grid;grid-template-columns:repeat(4,1fr)}.sd\:grid5{display:grid;grid-template-columns:repeat(5,1fr)}.sd\:grid6{display:grid;grid-template-columns:repeat(6,1fr)}.sd\:grid7{display:grid;grid-template-columns:repeat(7,1fr)}.sd\:grid8{display:grid;grid-template-columns:repeat(8,1fr)}.sd\:order0{order:0}.sd\:order1{order:1}.sd\:order9{order:9}}@media (min-width:61rem){.md\:show{display:block}.md\:hide{display:none}.md\:max{max-width:none}.md\:row,.md\:row-wrap{display:flex;flex-direction:row}.md\:col,.md\:col-wrap{display:flex;flex-direction:column}.md\:row-reverse,.md\:row-reverse-wrap{display:flex;flex-direction:row-reverse}.md\:col-reverse,.md\:col-reverse-wrap{display:flex;flex-direction:column-reverse}.md\:col-reverse-wrap,.md\:col-wrap,.md\:flex-wrap,.md\:row-reverse-wrap,.md\:row-wrap{flex-wrap:wrap}.md\:grid,.md\:grid2{display:grid}.md\:grid2{grid-template-columns:repeat(2,1fr)}.md\:grid3{display:grid;grid-template-columns:repeat(3,1fr)}.md\:grid4{display:grid;grid-template-columns:repeat(4,1fr)}.md\:grid5{display:grid;grid-template-columns:repeat(5,1fr)}.md\:grid6{display:grid;grid-template-columns:repeat(6,1fr)}.md\:grid7{display:grid;grid-template-columns:repeat(7,1fr)}.md\:grid8{display:grid;grid-template-columns:repeat(8,1fr)}.md\:order0{order:0}.md\:order1{order:1}.md\:order9{order:9}}@media (min-width:80rem){.ld\:show{display:block}.ld\:hide{display:none}.ld\:max{max-width:none}.ld\:row,.ld\:row-wrap{display:flex;flex-direction:row}.ld\:col,.ld\:col-wrap{display:flex;flex-direction:column}.ld\:row-reverse,.ld\:row-reverse-wrap{display:flex;flex-direction:row-reverse}.ld\:col-reverse,.ld\:col-reverse-wrap{display:flex;flex-direction:column-reverse}.ld\:col-reverse-wrap,.ld\:col-wrap,.ld\:flex-wrap,.ld\:row-reverse-wrap,.ld\:row-wrap{flex-wrap:wrap}.ld\:grid,.ld\:grid2{display:grid}.ld\:grid2{grid-template-columns:repeat(2,1fr)}.ld\:grid3{display:grid;grid-template-columns:repeat(3,1fr)}.ld\:grid4{display:grid;grid-template-columns:repeat(4,1fr)}.ld\:grid5{display:grid;grid-template-columns:repeat(5,1fr)}.ld\:grid6{display:grid;grid-template-columns:repeat(6,1fr)}.ld\:grid7{display:grid;grid-template-columns:repeat(7,1fr)}.ld\:grid8{display:grid;grid-template-columns:repeat(8,1fr)}.ld\:order0{order:0}.ld\:order1{order:1}.ld\:order9{order:9}}@media (min-width:100rem){.xl\:show{display:block}.xl\:hide{display:none}.xl\:max{max-width:none}.xl\:row,.xl\:row-wrap{display:flex;flex-direction:row}.xl\:col,.xl\:col-wrap{display:flex;flex-direction:column}.xl\:row-reverse,.xl\:row-reverse-wrap{display:flex;flex-direction:row-reverse}.xl\:col-reverse,.xl\:col-reverse-wrap{display:flex;flex-direction:column-reverse}.xl\:col-reverse-wrap,.xl\:col-wrap,.xl\:flex-wrap,.xl\:row-reverse-wrap,.xl\:row-wrap{flex-wrap:wrap}.xl\:grid,.xl\:grid2{display:grid}.xl\:grid2{grid-template-columns:repeat(2,1fr)}.xl\:grid3{display:grid;grid-template-columns:repeat(3,1fr)}.xl\:grid4{display:grid;grid-template-columns:repeat(4,1fr)}.xl\:grid5{display:grid;grid-template-columns:repeat(5,1fr)}.xl\:grid6{display:grid;grid-template-columns:repeat(6,1fr)}.xl\:grid7{display:grid;grid-template-columns:repeat(7,1fr)}.xl\:grid8{display:grid;grid-template-columns:repeat(8,1fr)}.xl\:order0{order:0}.xl\:order1{order:1}.xl\:order9{order:9}}.m0{margin:0}.m025{margin:.25rem}.m05{margin:.5rem}.m1{margin:1rem}.m2{margin:2rem}.m3{margin:3rem}.m4{margin:4rem}.ma{margin:auto}.mx0{margin-left:0;margin-right:0}.mx1{margin-left:1rem;margin-right:1rem}.mx2{margin-left:2rem;margin-right:2rem}.mx{margin-left:auto;margin-right:auto}.my0{margin-bottom:0;margin-top:0}.my1{margin-bottom:1rem;margin-top:1rem}.my2{margin-bottom:2rem;margin-top:2rem}.my{margin-bottom:auto;margin-top:auto}.mt025{margin-top:.25rem}.mt05{margin-top:.5rem}.mt1{margin-top:1rem}.mt2{margin-top:2rem}.mt{margin-top:auto}.mb025{margin-bottom:.25rem}.mb05{margin-bottom:.5rem}.mb1{margin-bottom:1rem}.mb2{margin-bottom:2rem}.mb{margin-bottom:auto}.ml025{margin-left:.25rem}.ml05{margin-left:.5rem}.ml1{margin-left:1rem}.ml2{margin-left:2rem}.ml{margin-left:auto}.mr025{margin-right:.25rem}.mr05{margin-right:.5rem}.mr1{margin-right:1rem}.mr2{margin-right:2rem}.mr{margin-right:auto}.p0{padding:0}.p0125{padding:.125rem}.p025{padding:.25rem}.p05{padding:.5rem}.p075{padding:.75rem}.p1{padding:1rem}.p125{padding:1.25rem}.p15{padding:1.5rem}.p175{padding:1.75rem}.p2{padding:2rem}.p25{padding:2.5rem}.p3{padding:3rem}.p4{padding:4rem}.p0125b{padding:calc(.125rem - var(--border-width))}.p025b{padding:calc(.25rem - var(--border-width))}.p05b{padding:calc(.5rem - var(--border-width))}.p075b{padding:calc(.75rem - var(--border-width))}.p1b{padding:calc(1rem - var(--border-width))}.p125b{padding:calc(1.25rem - var(--border-width))}.p15b{padding:calc(1.5rem - var(--border-width))}.p175b{padding:calc(1.75rem - var(--border-width))}.p2b{padding:calc(2rem - var(--border-width))}.px0{padding-left:0;padding-right:0}.px0125{padding-left:.125rem;padding-right:.125rem}.px025{padding-left:.25rem;padding-right:.25rem}.px05{padding-left:.5rem;padding-right:.5rem}.px075{padding-left:.75rem;padding-right:.75rem}.px1{padding-left:1rem;padding-right:1rem}.px125{padding-left:1.25rem;padding-right:1.25rem}.px15{padding-left:1.5rem;padding-right:1.5rem}.px175{padding-left:1.75rem;padding-right:1.75rem}.px2{padding-left:2rem;padding-right:2rem}.px25{padding-left:2.5rem;padding-right:2.5rem}.px3{padding-left:3rem;padding-right:3rem}.px4{padding-left:4rem;padding-right:4rem}.px0125b{padding-left:calc(.125rem - var(--border-width));padding-right:calc(.125rem - var(--border-width))}.px025b{padding-left:calc(.25rem - var(--border-width));padding-right:calc(.25rem - var(--border-width))}.px05b{padding-left:calc(.5rem - var(--border-width));padding-right:calc(.5rem - var(--border-width))}.px075b{padding-left:calc(.75rem - var(--border-width));padding-right:calc(.75rem - var(--border-width))}.px1b{padding-left:calc(1rem - var(--border-width));padding-right:calc(1rem - var(--border-width))}.px125b{padding-left:calc(1.25rem - var(--border-width));padding-right:calc(1.25rem - var(--border-width))}.px15b{padding-left:calc(1.5rem - var(--border-width));padding-right:calc(1.5rem - var(--border-width))}.px175b{padding-left:calc(1.75rem - var(--border-width));padding-right:calc(1.75rem - var(--border-width))}.px2b{padding-left:calc(2rem - var(--border-width));padding-right:calc(2rem - var(--border-width))}.py0{padding-bottom:0;padding-top:0}.py0125{padding-bottom:.125rem;padding-top:.125rem}.py025{padding-bottom:.25rem;padding-top:.25rem}.py05{padding-bottom:.5rem;padding-top:.5rem}.py075{padding-bottom:.75rem;padding-top:.75rem}.py1{padding-bottom:1rem;padding-top:1rem}.py125{padding-bottom:1.25rem;padding-top:1.25rem}.py15{padding-bottom:1.5rem;padding-top:1.5rem}.py175{padding-bottom:1.75rem;padding-top:1.75rem}.py2{padding-bottom:2rem;padding-top:2rem}.py25{padding-bottom:2.5rem;padding-top:2.5rem}.py3{padding-bottom:3rem;padding-top:3rem}.py4{padding-bottom:4rem;padding-top:4rem}.py0125b{padding-bottom:calc(.125rem - var(--border-width));padding-top:calc(.125rem - var(--border-width))}.py025b{padding-bottom:calc(.25rem - var(--border-width));padding-top:calc(.25rem - var(--border-width))}.py05b{padding-bottom:calc(.5rem - var(--border-width));padding-top:calc(.5rem - var(--border-width))}.py075b{padding-bottom:calc(.75rem - var(--border-width));padding-top:calc(.75rem - var(--border-width))}.py1b{padding-bottom:calc(1rem - var(--border-width));padding-top:calc(1rem - var(--border-width))}.py125b{padding-bottom:calc(1.25rem - var(--border-width));padding-top:calc(1.25rem - var(--border-width))}.py15b{padding-bottom:calc(1.5rem - var(--border-width));padding-top:calc(1.5rem - var(--border-width))}.py175b{padding-bottom:calc(1.75rem - var(--border-width));padding-top:calc(1.75rem - var(--border-width))}.py2b{padding-bottom:calc(2rem - var(--border-width));padding-top:calc(2rem - var(--border-width))}.pt0{padding-top:0}.pt0125{padding-top:.125rem}.pt025{padding-top:.25rem}.pt05{padding-top:.5rem}.pt075{padding-top:.75rem}.pt1{padding-top:1rem}.pt125{padding-top:1.25rem}.pt15{padding-top:1.5rem}.pt175{padding-top:1.75rem}.pt2{padding-top:2rem}.pt3{padding-top:3rem}.pt4{padding-top:4rem}.pb0{padding-bottom:0}.pb0125{padding-bottom:.125rem}.pb025{padding-bottom:.25rem}.pb05{padding-bottom:.5rem}.pb075{padding-bottom:.75rem}.pb1{padding-bottom:1rem}.pb125{padding-bottom:1.25rem}.pb15{padding-bottom:1.5rem}.pb175{padding-bottom:1.75rem}.pb2{padding-bottom:2rem}.pb3{padding-bottom:3rem}.pb4{padding-bottom:4rem}.pl0{padding-left:0}.pl0125{padding-left:.125rem}.pl025{padding-left:.25rem}.pl05{padding-left:.5rem}.pl075{padding-left:.75rem}.pl1{padding-left:1rem}.pl125{padding-left:1.25rem}.pl15{padding-left:1.5rem}.pl175{padding-left:1.75rem}.pl2{padding-left:2rem}.pl3{padding-left:3rem}.pl4{padding-left:4rem}.pr0{padding-right:0}.pr0125{padding-right:.125rem}.pr025{padding-right:.25rem}.pr05{padding-right:.5rem}.pr075{padding-right:.75rem}.pr1{padding-right:1rem}.pr125{padding-right:1.25rem}.pr15{padding-right:1.5rem}.pr175{padding-right:1.75rem}.pr2{padding-right:2rem}.pr3{padding-right:3rem}.pr4{padding-right:4rem}@media (min-width:40rem){.sd\:p0{padding:0}.sd\:p0125{padding:.125rem}.sd\:p025{padding:.25rem}.sd\:p05{padding:.5rem}.sd\:p075{padding:.75rem}.sd\:p1{padding:1rem}.sd\:p125{padding:1.25rem}.sd\:p15{padding:1.5rem}.sd\:p175{padding:1.75rem}.sd\:p2{padding:2rem}.sd\:p25{padding:2.5rem}.sd\:p3{padding:3rem}.sd\:p4{padding:4rem}.sd\:p0125b{padding:calc(.125rem - var(--border-width))}.sd\:p025b{padding:calc(.25rem - var(--border-width))}.sd\:p05b{padding:calc(.5rem - var(--border-width))}.sd\:p075b{padding:calc(.75rem - var(--border-width))}.sd\:p1b{padding:calc(1rem - var(--border-width))}.sd\:p125b{padding:calc(1.25rem - var(--border-width))}.sd\:p15b{padding:calc(1.5rem - var(--border-width))}.sd\:p175b{padding:calc(1.75rem - var(--border-width))}.sd\:p2b{padding:calc(2rem - var(--border-width))}.sd\:px0{padding-left:0;padding-right:0}.sd\:px0125{padding-left:.125rem;padding-right:.125rem}.sd\:px025{padding-left:.25rem;padding-right:.25rem}.sd\:px05{padding-left:.5rem;padding-right:.5rem}.sd\:px075{padding-left:.75rem;padding-right:.75rem}.sd\:px1{padding-left:1rem;padding-right:1rem}.sd\:px125{padding-left:1.25rem;padding-right:1.25rem}.sd\:px15{padding-left:1.5rem;padding-right:1.5rem}.sd\:px175{padding-left:1.75rem;padding-right:1.75rem}.sd\:px2{padding-left:2rem;padding-right:2rem}.sd\:px25{padding-left:2.5rem;padding-right:2.5rem}.sd\:px3{padding-left:3rem;padding-right:3rem}.sd\:px4{padding-left:4rem;padding-right:4rem}.sd\:px0125b{padding-left:calc(.125rem - var(--border-width));padding-right:calc(.125rem - var(--border-width))}.sd\:px025b{padding-left:calc(.25rem - var(--border-width));padding-right:calc(.25rem - var(--border-width))}.sd\:px05b{padding-left:calc(.5rem - var(--border-width));padding-right:calc(.5rem - var(--border-width))}.sd\:px075b{padding-left:calc(.75rem - var(--border-width));padding-right:calc(.75rem - var(--border-width))}.sd\:px1b{padding-left:calc(1rem - var(--border-width));padding-right:calc(1rem - var(--border-width))}.sd\:px125b{padding-left:calc(1.25rem - var(--border-width));padding-right:calc(1.25rem - var(--border-width))}.sd\:px15b{padding-left:calc(1.5rem - var(--border-width));padding-right:calc(1.5rem - var(--border-width))}.sd\:px175b{padding-left:calc(1.75rem - var(--border-width));padding-right:calc(1.75rem - var(--border-width))}.sd\:px2b{padding-left:calc(2rem - var(--border-width));padding-right:calc(2rem - var(--border-width))}.sd\:py0{padding-bottom:0;padding-top:0}.sd\:py0125{padding-bottom:.125rem;padding-top:.125rem}.sd\:py025{padding-bottom:.25rem;padding-top:.25rem}.sd\:py05{padding-bottom:.5rem;padding-top:.5rem}.sd\:py075{padding-bottom:.75rem;padding-top:.75rem}.sd\:py1{padding-bottom:1rem;padding-top:1rem}.sd\:py125{padding-bottom:1.25rem;padding-top:1.25rem}.sd\:py15{padding-bottom:1.5rem;padding-top:1.5rem}.sd\:py175{padding-bottom:1.75rem;padding-top:1.75rem}.sd\:py2{padding-bottom:2rem;padding-top:2rem}.sd\:py25{padding-bottom:2.5rem;padding-top:2.5rem}.sd\:py3{padding-bottom:3rem;padding-top:3rem}.sd\:py4{padding-bottom:4rem;padding-top:4rem}.sd\:py0125b{padding-bottom:calc(.125rem - var(--border-width));padding-top:calc(.125rem - var(--border-width))}.sd\:py025b{padding-bottom:calc(.25rem - var(--border-width));padding-top:calc(.25rem - var(--border-width))}.sd\:py05b{padding-bottom:calc(.5rem - var(--border-width));padding-top:calc(.5rem - var(--border-width))}.sd\:py075b{padding-bottom:calc(.75rem - var(--border-width));padding-top:calc(.75rem - var(--border-width))}.sd\:py1b{padding-bottom:calc(1rem - var(--border-width));padding-top:calc(1rem - var(--border-width))}.sd\:py125b{padding-bottom:calc(1.25rem - var(--border-width));padding-top:calc(1.25rem - var(--border-width))}.sd\:py15b{padding-bottom:calc(1.5rem - var(--border-width));padding-top:calc(1.5rem - var(--border-width))}.sd\:py175b{padding-bottom:calc(1.75rem - var(--border-width));padding-top:calc(1.75rem - var(--border-width))}.sd\:py2b{padding-bottom:calc(2rem - var(--border-width));padding-top:calc(2rem - var(--border-width))}}@media (min-width:61rem){.md\:p0{padding:0}.md\:p0125{padding:.125rem}.md\:p025{padding:.25rem}.md\:p05{padding:.5rem}.md\:p075{padding:.75rem}.md\:p1{padding:1rem}.md\:p125{padding:1.25rem}.md\:p15{padding:1.5rem}.md\:p175{padding:1.75rem}.md\:p2{padding:2rem}.md\:p25{padding:2.5rem}.md\:p3{padding:3rem}.md\:p4{padding:4rem}.md\:p0125b{padding:calc(.125rem - var(--border-width))}.md\:p025b{padding:calc(.25rem - var(--border-width))}.md\:p05b{padding:calc(.5rem - var(--border-width))}.md\:p075b{padding:calc(.75rem - var(--border-width))}.md\:p1b{padding:calc(1rem - var(--border-width))}.md\:p125b{padding:calc(1.25rem - var(--border-width))}.md\:p15b{padding:calc(1.5rem - var(--border-width))}.md\:p175b{padding:calc(1.75rem - var(--border-width))}.md\:p2b{padding:calc(2rem - var(--border-width))}.md\:px0{padding-left:0;padding-right:0}.md\:px0125{padding-left:.125rem;padding-right:.125rem}.md\:px025{padding-left:.25rem;padding-right:.25rem}.md\:px05{padding-left:.5rem;padding-right:.5rem}.md\:px075{padding-left:.75rem;padding-right:.75rem}.md\:px1{padding-left:1rem;padding-right:1rem}.md\:px125{padding-left:1.25rem;padding-right:1.25rem}.md\:px15{padding-left:1.5rem;padding-right:1.5rem}.md\:px175{padding-left:1.75rem;padding-right:1.75rem}.md\:px2{padding-left:2rem;padding-right:2rem}.md\:px25{padding-left:2.5rem;padding-right:2.5rem}.md\:px3{padding-left:3rem;padding-right:3rem}.md\:px4{padding-left:4rem;padding-right:4rem}.md\:px0125b{padding-left:calc(.125rem - var(--border-width));padding-right:calc(.125rem - var(--border-width))}.md\:px025b{padding-left:calc(.25rem - var(--border-width));padding-right:calc(.25rem - var(--border-width))}.md\:px05b{padding-left:calc(.5rem - var(--border-width));padding-right:calc(.5rem - var(--border-width))}.md\:px075b{padding-left:calc(.75rem - var(--border-width));padding-right:calc(.75rem - var(--border-width))}.md\:px1b{padding-left:calc(1rem - var(--border-width));padding-right:calc(1rem - var(--border-width))}.md\:px125b{padding-left:calc(1.25rem - var(--border-width));padding-right:calc(1.25rem - var(--border-width))}.md\:px15b{padding-left:calc(1.5rem - var(--border-width));padding-right:calc(1.5rem - var(--border-width))}.md\:px175b{padding-left:calc(1.75rem - var(--border-width));padding-right:calc(1.75rem - var(--border-width))}.md\:px2b{padding-left:calc(2rem - var(--border-width));padding-right:calc(2rem - var(--border-width))}.md\:py0{padding-bottom:0;padding-top:0}.md\:py0125{padding-bottom:.125rem;padding-top:.125rem}.md\:py025{padding-bottom:.25rem;padding-top:.25rem}.md\:py05{padding-bottom:.5rem;padding-top:.5rem}.md\:py075{padding-bottom:.75rem;padding-top:.75rem}.md\:py1{padding-bottom:1rem;padding-top:1rem}.md\:py125{padding-bottom:1.25rem;padding-top:1.25rem}.md\:py15{padding-bottom:1.5rem;padding-top:1.5rem}.md\:py175{padding-bottom:1.75rem;padding-top:1.75rem}.md\:py2{padding-bottom:2rem;padding-top:2rem}.md\:py25{padding-bottom:2.5rem;padding-top:2.5rem}.md\:py3{padding-bottom:3rem;padding-top:3rem}.md\:py4{padding-bottom:4rem;padding-top:4rem}.md\:py0125b{padding-bottom:calc(.125rem - var(--border-width));padding-top:calc(.125rem - var(--border-width))}.md\:py025b{padding-bottom:calc(.25rem - var(--border-width));padding-top:calc(.25rem - var(--border-width))}.md\:py05b{padding-bottom:calc(.5rem - var(--border-width));padding-top:calc(.5rem - var(--border-width))}.md\:py075b{padding-bottom:calc(.75rem - var(--border-width));padding-top:calc(.75rem - var(--border-width))}.md\:py1b{padding-bottom:calc(1rem - var(--border-width));padding-top:calc(1rem - var(--border-width))}.md\:py125b{padding-bottom:calc(1.25rem - var(--border-width));padding-top:calc(1.25rem - var(--border-width))}.md\:py15b{padding-bottom:calc(1.5rem - var(--border-width));padding-top:calc(1.5rem - var(--border-width))}.md\:py175b{padding-bottom:calc(1.75rem - var(--border-width));padding-top:calc(1.75rem - var(--border-width))}.md\:py2b{padding-bottom:calc(2rem - var(--border-width));padding-top:calc(2rem - var(--border-width))}}@media (min-width:80rem){.ld\:p0{padding:0}.ld\:p0125{padding:.125rem}.ld\:p025{padding:.25rem}.ld\:p05{padding:.5rem}.ld\:p075{padding:.75rem}.ld\:p1{padding:1rem}.ld\:p125{padding:1.25rem}.ld\:p15{padding:1.5rem}.ld\:p175{padding:1.75rem}.ld\:p2{padding:2rem}.ld\:p25{padding:2.5rem}.ld\:p3{padding:3rem}.ld\:p4{padding:4rem}.ld\:p0125b{padding:calc(.125rem - var(--border-width))}.ld\:p025b{padding:calc(.25rem - var(--border-width))}.ld\:p05b{padding:calc(.5rem - var(--border-width))}.ld\:p075b{padding:calc(.75rem - var(--border-width))}.ld\:p1b{padding:calc(1rem - var(--border-width))}.ld\:p125b{padding:calc(1.25rem - var(--border-width))}.ld\:p15b{padding:calc(1.5rem - var(--border-width))}.ld\:p175b{padding:calc(1.75rem - var(--border-width))}.ld\:p2b{padding:calc(2rem - var(--border-width))}.ld\:px0{padding-left:0;padding-right:0}.ld\:px0125{padding-left:.125rem;padding-right:.125rem}.ld\:px025{padding-left:.25rem;padding-right:.25rem}.ld\:px05{padding-left:.5rem;padding-right:.5rem}.ld\:px075{padding-left:.75rem;padding-right:.75rem}.ld\:px1{padding-left:1rem;padding-right:1rem}.ld\:px125{padding-left:1.25rem;padding-right:1.25rem}.ld\:px15{padding-left:1.5rem;padding-right:1.5rem}.ld\:px175{padding-left:1.75rem;padding-right:1.75rem}.ld\:px2{padding-left:2rem;padding-right:2rem}.ld\:px25{padding-left:2.5rem;padding-right:2.5rem}.ld\:px3{padding-left:3rem;padding-right:3rem}.ld\:px4{padding-left:4rem;padding-right:4rem}.ld\:px0125b{padding-left:calc(.125rem - var(--border-width));padding-right:calc(.125rem - var(--border-width))}.ld\:px025b{padding-left:calc(.25rem - var(--border-width));padding-right:calc(.25rem - var(--border-width))}.ld\:px05b{padding-left:calc(.5rem - var(--border-width));padding-right:calc(.5rem - var(--border-width))}.ld\:px075b{padding-left:calc(.75rem - var(--border-width));padding-right:calc(.75rem - var(--border-width))}.ld\:px1b{padding-left:calc(1rem - var(--border-width));padding-right:calc(1rem - var(--border-width))}.ld\:px125b{padding-left:calc(1.25rem - var(--border-width));padding-right:calc(1.25rem - var(--border-width))}.ld\:px15b{padding-left:calc(1.5rem - var(--border-width));padding-right:calc(1.5rem - var(--border-width))}.ld\:px175b{padding-left:calc(1.75rem - var(--border-width));padding-right:calc(1.75rem - var(--border-width))}.ld\:px2b{padding-left:calc(2rem - var(--border-width));padding-right:calc(2rem - var(--border-width))}.ld\:py0{padding-bottom:0;padding-top:0}.ld\:py0125{padding-bottom:.125rem;padding-top:.125rem}.ld\:py025{padding-bottom:.25rem;padding-top:.25rem}.ld\:py05{padding-bottom:.5rem;padding-top:.5rem}.ld\:py075{padding-bottom:.75rem;padding-top:.75rem}.ld\:py1{padding-bottom:1rem;padding-top:1rem}.ld\:py125{padding-bottom:1.25rem;padding-top:1.25rem}.ld\:py15{padding-bottom:1.5rem;padding-top:1.5rem}.ld\:py175{padding-bottom:1.75rem;padding-top:1.75rem}.ld\:py2{padding-bottom:2rem;padding-top:2rem}.ld\:py25{padding-bottom:2.5rem;padding-top:2.5rem}.ld\:py3{padding-bottom:3rem;padding-top:3rem}.ld\:py4{padding-bottom:4rem;padding-top:4rem}.ld\:py0125b{padding-bottom:calc(.125rem - var(--border-width));padding-top:calc(.125rem - var(--border-width))}.ld\:py025b{padding-bottom:calc(.25rem - var(--border-width));padding-top:calc(.25rem - var(--border-width))}.ld\:py05b{padding-bottom:calc(.5rem - var(--border-width));padding-top:calc(.5rem - var(--border-width))}.ld\:py075b{padding-bottom:calc(.75rem - var(--border-width));padding-top:calc(.75rem - var(--border-width))}.ld\:py1b{padding-bottom:calc(1rem - var(--border-width));padding-top:calc(1rem - var(--border-width))}.ld\:py125b{padding-bottom:calc(1.25rem - var(--border-width));padding-top:calc(1.25rem - var(--border-width))}.ld\:py15b{padding-bottom:calc(1.5rem - var(--border-width));padding-top:calc(1.5rem - var(--border-width))}.ld\:py175b{padding-bottom:calc(1.75rem - var(--border-width));padding-top:calc(1.75rem - var(--border-width))}.ld\:py2b{padding-bottom:calc(2rem - var(--border-width));padding-top:calc(2rem - var(--border-width))}}@media (min-width:100rem){.xl\:p0{padding:0}.xl\:p0125{padding:.125rem}.xl\:p025{padding:.25rem}.xl\:p05{padding:.5rem}.xl\:p075{padding:.75rem}.xl\:p1{padding:1rem}.xl\:p125{padding:1.25rem}.xl\:p15{padding:1.5rem}.xl\:p175{padding:1.75rem}.xl\:p2{padding:2rem}.xl\:p25{padding:2.5rem}.xl\:p3{padding:3rem}.xl\:p4{padding:4rem}.xl\:p0125b{padding:calc(.125rem - var(--border-width))}.xl\:p025b{padding:calc(.25rem - var(--border-width))}.xl\:p05b{padding:calc(.5rem - var(--border-width))}.xl\:p075b{padding:calc(.75rem - var(--border-width))}.xl\:p1b{padding:calc(1rem - var(--border-width))}.xl\:p125b{padding:calc(1.25rem - var(--border-width))}.xl\:p15b{padding:calc(1.5rem - var(--border-width))}.xl\:p175b{padding:calc(1.75rem - var(--border-width))}.xl\:p2b{padding:calc(2rem - var(--border-width))}.xl\:px0{padding-left:0;padding-right:0}.xl\:px0125{padding-left:.125rem;padding-right:.125rem}.xl\:px025{padding-left:.25rem;padding-right:.25rem}.xl\:px05{padding-left:.5rem;padding-right:.5rem}.xl\:px075{padding-left:.75rem;padding-right:.75rem}.xl\:px1{padding-left:1rem;padding-right:1rem}.xl\:px125{padding-left:1.25rem;padding-right:1.25rem}.xl\:px15{padding-left:1.5rem;padding-right:1.5rem}.xl\:px175{padding-left:1.75rem;padding-right:1.75rem}.xl\:px2{padding-left:2rem;padding-right:2rem}.xl\:px25{padding-left:2.5rem;padding-right:2.5rem}.xl\:px3{padding-left:3rem;padding-right:3rem}.xl\:px4{padding-left:4rem;padding-right:4rem}.xl\:px0125b{padding-left:calc(.125rem - var(--border-width));padding-right:calc(.125rem - var(--border-width))}.xl\:px025b{padding-left:calc(.25rem - var(--border-width));padding-right:calc(.25rem - var(--border-width))}.xl\:px05b{padding-left:calc(.5rem - var(--border-width));padding-right:calc(.5rem - var(--border-width))}.xl\:px075b{padding-left:calc(.75rem - var(--border-width));padding-right:calc(.75rem - var(--border-width))}.xl\:px1b{padding-left:calc(1rem - var(--border-width));padding-right:calc(1rem - var(--border-width))}.xl\:px125b{padding-left:calc(1.25rem - var(--border-width));padding-right:calc(1.25rem - var(--border-width))}.xl\:px15b{padding-left:calc(1.5rem - var(--border-width));padding-right:calc(1.5rem - var(--border-width))}.xl\:px175b{padding-left:calc(1.75rem - var(--border-width));padding-right:calc(1.75rem - var(--border-width))}.xl\:px2b{padding-left:calc(2rem - var(--border-width));padding-right:calc(2rem - var(--border-width))}.xl\:py0{padding-bottom:0;padding-top:0}.xl\:py0125{padding-bottom:.125rem;padding-top:.125rem}.xl\:py025{padding-bottom:.25rem;padding-top:.25rem}.xl\:py05{padding-bottom:.5rem;padding-top:.5rem}.xl\:py075{padding-bottom:.75rem;padding-top:.75rem}.xl\:py1{padding-bottom:1rem;padding-top:1rem}.xl\:py125{padding-bottom:1.25rem;padding-top:1.25rem}.xl\:py15{padding-bottom:1.5rem;padding-top:1.5rem}.xl\:py175{padding-bottom:1.75rem;padding-top:1.75rem}.xl\:py2{padding-bottom:2rem;padding-top:2rem}.xl\:py25{padding-bottom:2.5rem;padding-top:2.5rem}.xl\:py3{padding-bottom:3rem;padding-top:3rem}.xl\:py4{padding-bottom:4rem;padding-top:4rem}.xl\:py0125b{padding-bottom:calc(.125rem - var(--border-width));padding-top:calc(.125rem - var(--border-width))}.xl\:py025b{padding-bottom:calc(.25rem - var(--border-width));padding-top:calc(.25rem - var(--border-width))}.xl\:py05b{padding-bottom:calc(.5rem - var(--border-width));padding-top:calc(.5rem - var(--border-width))}.xl\:py075b{padding-bottom:calc(.75rem - var(--border-width));padding-top:calc(.75rem - var(--border-width))}.xl\:py1b{padding-bottom:calc(1rem - var(--border-width));padding-top:calc(1rem - var(--border-width))}.xl\:py125b{padding-bottom:calc(1.25rem - var(--border-width));padding-top:calc(1.25rem - var(--border-width))}.xl\:py15b{padding-bottom:calc(1.5rem - var(--border-width));padding-top:calc(1.5rem - var(--border-width))}.xl\:py175b{padding-bottom:calc(1.75rem - var(--border-width));padding-top:calc(1.75rem - var(--border-width))}.xl\:py2b{padding-bottom:calc(2rem - var(--border-width));padding-top:calc(2rem - var(--border-width))}}.ba{border:var(--border-width) solid var(--border-color)}.bl{border-left:var(--border-width) solid var(--border-color)}.br{border-right:var(--border-width) solid var(--border-color)}.bt{border-top:var(--border-width) solid var(--border-color)}.bb{border-bottom:var(--border-width) solid var(--border-color)}.bc-black{--border-color:var(--black)}.bc-black-95{--border-color:var(--black-95)}.bc-black-90{--border-color:var(--black-90)}.bc-black-80{--border-color:var(--black-80)}.bc-black-70{--border-color:var(--black-70)}.bc-black-60{--border-color:var(--black-60)}.bc-black-50{--border-color:var(--black-50)}.bc-black-40{--border-color:var(--black-40)}.bc-black-30{--border-color:var(--black-30)}.bc-black-20{--border-color:var(--black-20)}.bc-black-10{--border-color:var(--black-10)}.bc-black-05{--border-color:var(--black-05)}.bc-black-025{--border-color:var(--black-025)}.bc-black-0125{--border-color:var(--black-0125)}.bc-white{--border-color:var(--white)}.bc-white-95{--border-color:var(--white-95)}.bc-white-90{--border-color:var(--white-90)}.bc-white-80{--border-color:var(--white-80)}.bc-white-70{--border-color:var(--white-70)}.bc-white-60{--border-color:var(--white-60)}.bc-white-50{--border-color:var(--white-50)}.bc-white-40{--border-color:var(--white-40)}.bc-white-30{--border-color:var(--white-30)}.bc-white-20{--border-color:var(--white-20)}.bc-white-10{--border-color:var(--white-10)}.bc-white-05{--border-color:var(--white-05)}.bc-white-025{--border-color:var(--white-025)}.bc-white-0125{--border-color:var(--white-0125)}.bc-aqua{--border-color:var(--aqua)}.bc-blue{--border-color:var(--blue)}.bc-navy{--border-color:var(--navy)}.bc-teal{--border-color:var(--teal)}.bc-green{--border-color:var(--green)}.bc-olive{--border-color:var(--olive)}.bc-lime{--border-color:var(--lime)}.bc-yellow{--border-color:var(--yellow)}.bc-orange{--border-color:var(--orange)}.bc-red{--border-color:var(--red)}.bc-fuchsia{--border-color:var(--fuchsia)}.bc-purple{--border-color:var(--purple)}.bc-maroon{--border-color:var(--maroon)}.br1{border-radius:var(--br1)}.br2{border-radius:var(--br2)}.br3{border-radius:var(--br3)}.br4{border-radius:var(--br4)}.br5{border-radius:var(--br5)}.br100{border-radius:100%}.br999{border-radius:999px}.anchor:hover .color-current\:hover,.color-current,.color-current\:hover:hover{color:currentColor}.anchor:hover .color-inherit\:hover,.color-inherit,.color-inherit\:hover:hover{color:inherit}.color-transparent{color:transparent}.black{color:var(--black)}.black-95{color:var(--black-95)}.black-90{color:var(--black-90)}.black-80{color:var(--black-80)}.black-70{color:var(--black-70)}.black-60{color:var(--black-60)}.black-50{color:var(--black-50)}.black-40{color:var(--black-40)}.black-30{color:var(--black-30)}.black-20{color:var(--black-20)}.black-10{color:var(--black-10)}.black-05{color:var(--black-05)}.black-025{color:var(--black-025)}.black-0125{color:var(--black-0125)}.white{color:var(--white)}.white-95{color:var(--white-95)}.white-90{color:var(--white-90)}.white-80{color:var(--white-80)}.white-70{color:var(--white-70)}.white-60{color:var(--white-60)}.white-50{color:var(--white-50)}.white-40{color:var(--white-40)}.white-30{color:var(--white-30)}.white-20{color:var(--white-20)}.white-10{color:var(--white-10)}.white-05{color:var(--white-05)}.white-025{color:var(--white-025)}.white-0125{color:var(--white-0125)}.aqua{color:var(--aqua)}.blue{color:var(--blue)}.navy{color:var(--navy)}.teal{color:var(--teal)}.green{color:var(--green)}.olive{color:var(--olive)}.lime{color:var(--lime)}.yellow{color:var(--yellow)}.orange{color:var(--orange)}.red{color:var(--red)}.fuchsia{color:var(--fuchsia)}.purple{color:var(--purple)}.maroon{color:var(--maroon)}.bg-cover{background-size:cover}.bg-contain{background-size:contain}.bg-top{background-position:top}.bg-bottom{background-position:bottom}.bg-left{background-position:0}.bg-right{background-position:100%}.bg-center{background-position:50%}.bg-topleft{background-position:0 0}.bg-topright{background-position:100% 0}.bg-bottomleft{background-position:0 100%}.bg-bottomright{background-position:100% 100%}.bg-repeatx{background-repeat:repeat-x}.bg-repeaty{background-repeat:repeat-y}.bg-norepeat{background-repeat:no-repeat}.bg-current{background-color:currentColor}.anchor:hover .bg-transparent\:hover,.bg-transparent,.bg-transparent\:hover:hover{background-color:transparent}.bg-black{background-color:var(--black)}.bg-black-95{background-color:var(--black-95)}.bg-black-90{background-color:var(--black-90)}.bg-black-80{background-color:var(--black-80)}.bg-black-70{background-color:var(--black-70)}.bg-black-60{background-color:var(--black-60)}.bg-black-50{background-color:var(--black-50)}.bg-black-40{background-color:var(--black-40)}.bg-black-30{background-color:var(--black-30)}.bg-black-20{background-color:var(--black-20)}.bg-black-10{background-color:var(--black-10)}.bg-black-05{background-color:var(--black-05)}.bg-black-025{background-color:var(--black-025)}.bg-black-0125{background-color:var(--black-0125)}.bg-white{background-color:var(--white)}.bg-white-95{background-color:var(--white-95)}.bg-white-90{background-color:var(--white-90)}.bg-white-80{background-color:var(--white-80)}.bg-white-70{background-color:var(--white-70)}.bg-white-60{background-color:var(--white-60)}.bg-white-50{background-color:var(--white-50)}.bg-white-40{background-color:var(--white-40)}.bg-white-30{background-color:var(--white-30)}.bg-white-20{background-color:var(--white-20)}.bg-white-10{background-color:var(--white-10)}.bg-white-05{background-color:var(--white-05)}.bg-white-025{background-color:var(--white-025)}.bg-white-0125{background-color:var(--white-0125)}.bg-aqua{background-color:var(--aqua)}.bg-blue{background-color:var(--blue)}.bg-navy{background-color:var(--navy)}.bg-teal{background-color:var(--teal)}.bg-green{background-color:var(--green)}.bg-olive{background-color:var(--olive)}.bg-lime{background-color:var(--lime)}.bg-yellow{background-color:var(--yellow)}.bg-orange{background-color:var(--orange)}.bg-red{background-color:var(--red)}.bg-fuchsia{background-color:var(--fuchsia)}.bg-purple{background-color:var(--purple)}.bg-maroon{background-color:var(--maroon)}.cursor-default{cursor:default}.cursor-notallowed{cursor:not-allowed}.cursor-progress{cursor:progress}.cursor-pointer{cursor:pointer}.-d{outline:1px dashed var(--purple)}.-d *{outline:1px dashed var(--lime)}.-d .-d{outline:1px dashed var(--purple)}.-view{background-color:var(--yellow);color:#000;font-size:12px;left:0;line-height:1;padding:4px;position:fixed;top:0;z-index:9999}.-view:before{content:"-"}@media (max-width:24rem){.-view:before{content:"XS"}}@media (min-width:40rem){.-view:before{content:"SD"}}@media (min-width:61rem){.-view:before{content:"MD"}}@media (min-width:80rem){.-view:before{content:"LD"}}@media (min-width:100rem){.-view:before{content:"XL"}}.anchor:hover .linkcolor\:hover,.linkcolor,.linkcolor\:hover:hover{color:var(--link-color)}.hlcolor{color:var(--theme-highlight-text-color)}.bg-hlbgcolor{background-color:var(--theme-highlight-background-color);-webkit-box-decoration-break:clone;box-decoration-break:clone;box-shadow:-1px 0 0 2px var(--theme-highlight-background-color),1px 0 0 2px var(--theme-highlight-background-color)}:root{--font-family:"Inter",sans-serif}@supports (font-variation-settings:normal){:root{--font-family:"Inter var",sans-serif}}:root{--theme-background-color:var(--white);--theme-text-color:var(--black);--theme-text-color-05:var(--black-05);--theme-link-color:inherit;--theme-highlight-text-color:inherit;--theme-highlight-background-color:var(--yellow);--default-background-color:var(--theme-background-color);--default-color:var(--theme-text-color);--link-color:var(--theme-link-color);--copy-space-primary:1.5em;--copy-space-secondary:0.5em} -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "db0da68a6ba7e14dced512e7a95ebf31", 8 | "packages": [ 9 | { 10 | "name": "claviska/simpleimage", 11 | "version": "4.2.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/claviska/SimpleImage.git", 15 | "reference": "dfbe53c01dae8467468ef2b817c09b786a7839d2" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/claviska/SimpleImage/zipball/dfbe53c01dae8467468ef2b817c09b786a7839d2", 20 | "reference": "dfbe53c01dae8467468ef2b817c09b786a7839d2", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "ext-gd": "*", 25 | "league/color-extractor": "0.4.*", 26 | "php": ">=8.0" 27 | }, 28 | "require-dev": { 29 | "laravel/pint": "^1.5", 30 | "phpstan/phpstan": "^1.10" 31 | }, 32 | "type": "library", 33 | "autoload": { 34 | "psr-0": { 35 | "claviska": "src/" 36 | } 37 | }, 38 | "notification-url": "https://packagist.org/downloads/", 39 | "license": [ 40 | "MIT" 41 | ], 42 | "authors": [ 43 | { 44 | "name": "Cory LaViska", 45 | "homepage": "http://www.abeautifulsite.net/", 46 | "role": "Developer" 47 | } 48 | ], 49 | "description": "A PHP class that makes working with images as simple as possible.", 50 | "support": { 51 | "issues": "https://github.com/claviska/SimpleImage/issues", 52 | "source": "https://github.com/claviska/SimpleImage/tree/4.2.0" 53 | }, 54 | "funding": [ 55 | { 56 | "url": "https://github.com/claviska", 57 | "type": "github" 58 | } 59 | ], 60 | "time": "2024-04-15T16:07:16+00:00" 61 | }, 62 | { 63 | "name": "composer/semver", 64 | "version": "3.4.0", 65 | "source": { 66 | "type": "git", 67 | "url": "https://github.com/composer/semver.git", 68 | "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" 69 | }, 70 | "dist": { 71 | "type": "zip", 72 | "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", 73 | "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", 74 | "shasum": "" 75 | }, 76 | "require": { 77 | "php": "^5.3.2 || ^7.0 || ^8.0" 78 | }, 79 | "require-dev": { 80 | "phpstan/phpstan": "^1.4", 81 | "symfony/phpunit-bridge": "^4.2 || ^5" 82 | }, 83 | "type": "library", 84 | "extra": { 85 | "branch-alias": { 86 | "dev-main": "3.x-dev" 87 | } 88 | }, 89 | "autoload": { 90 | "psr-4": { 91 | "Composer\\Semver\\": "src" 92 | } 93 | }, 94 | "notification-url": "https://packagist.org/downloads/", 95 | "license": [ 96 | "MIT" 97 | ], 98 | "authors": [ 99 | { 100 | "name": "Nils Adermann", 101 | "email": "naderman@naderman.de", 102 | "homepage": "http://www.naderman.de" 103 | }, 104 | { 105 | "name": "Jordi Boggiano", 106 | "email": "j.boggiano@seld.be", 107 | "homepage": "http://seld.be" 108 | }, 109 | { 110 | "name": "Rob Bast", 111 | "email": "rob.bast@gmail.com", 112 | "homepage": "http://robbast.nl" 113 | } 114 | ], 115 | "description": "Semver library that offers utilities, version constraint parsing and validation.", 116 | "keywords": [ 117 | "semantic", 118 | "semver", 119 | "validation", 120 | "versioning" 121 | ], 122 | "support": { 123 | "irc": "ircs://irc.libera.chat:6697/composer", 124 | "issues": "https://github.com/composer/semver/issues", 125 | "source": "https://github.com/composer/semver/tree/3.4.0" 126 | }, 127 | "funding": [ 128 | { 129 | "url": "https://packagist.com", 130 | "type": "custom" 131 | }, 132 | { 133 | "url": "https://github.com/composer", 134 | "type": "github" 135 | }, 136 | { 137 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 138 | "type": "tidelift" 139 | } 140 | ], 141 | "time": "2023-08-31T09:50:34+00:00" 142 | }, 143 | { 144 | "name": "filp/whoops", 145 | "version": "2.15.4", 146 | "source": { 147 | "type": "git", 148 | "url": "https://github.com/filp/whoops.git", 149 | "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546" 150 | }, 151 | "dist": { 152 | "type": "zip", 153 | "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546", 154 | "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546", 155 | "shasum": "" 156 | }, 157 | "require": { 158 | "php": "^5.5.9 || ^7.0 || ^8.0", 159 | "psr/log": "^1.0.1 || ^2.0 || ^3.0" 160 | }, 161 | "require-dev": { 162 | "mockery/mockery": "^0.9 || ^1.0", 163 | "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", 164 | "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" 165 | }, 166 | "suggest": { 167 | "symfony/var-dumper": "Pretty print complex values better with var-dumper available", 168 | "whoops/soap": "Formats errors as SOAP responses" 169 | }, 170 | "type": "library", 171 | "extra": { 172 | "branch-alias": { 173 | "dev-master": "2.7-dev" 174 | } 175 | }, 176 | "autoload": { 177 | "psr-4": { 178 | "Whoops\\": "src/Whoops/" 179 | } 180 | }, 181 | "notification-url": "https://packagist.org/downloads/", 182 | "license": [ 183 | "MIT" 184 | ], 185 | "authors": [ 186 | { 187 | "name": "Filipe Dobreira", 188 | "homepage": "https://github.com/filp", 189 | "role": "Developer" 190 | } 191 | ], 192 | "description": "php error handling for cool kids", 193 | "homepage": "https://filp.github.io/whoops/", 194 | "keywords": [ 195 | "error", 196 | "exception", 197 | "handling", 198 | "library", 199 | "throwable", 200 | "whoops" 201 | ], 202 | "support": { 203 | "issues": "https://github.com/filp/whoops/issues", 204 | "source": "https://github.com/filp/whoops/tree/2.15.4" 205 | }, 206 | "funding": [ 207 | { 208 | "url": "https://github.com/denis-sokolov", 209 | "type": "github" 210 | } 211 | ], 212 | "time": "2023-11-03T12:00:00+00:00" 213 | }, 214 | { 215 | "name": "getkirby/cms", 216 | "version": "3.10.1.2", 217 | "source": { 218 | "type": "git", 219 | "url": "https://github.com/getkirby/kirby.git", 220 | "reference": "dba5ea8ea7fd468190a401cc37d6032ec717cac8" 221 | }, 222 | "dist": { 223 | "type": "zip", 224 | "url": "https://api.github.com/repos/getkirby/kirby/zipball/dba5ea8ea7fd468190a401cc37d6032ec717cac8", 225 | "reference": "dba5ea8ea7fd468190a401cc37d6032ec717cac8", 226 | "shasum": "" 227 | }, 228 | "require": { 229 | "claviska/simpleimage": "4.2.0", 230 | "composer/semver": "3.4.0", 231 | "ext-ctype": "*", 232 | "ext-curl": "*", 233 | "ext-dom": "*", 234 | "ext-filter": "*", 235 | "ext-hash": "*", 236 | "ext-iconv": "*", 237 | "ext-json": "*", 238 | "ext-libxml": "*", 239 | "ext-mbstring": "*", 240 | "ext-openssl": "*", 241 | "ext-simplexml": "*", 242 | "filp/whoops": "2.15.4", 243 | "getkirby/composer-installer": "^1.2.1", 244 | "laminas/laminas-escaper": "2.13.0", 245 | "michelf/php-smartypants": "1.8.1", 246 | "php": "~8.1.0 || ~8.2.0 || ~8.3.0", 247 | "phpmailer/phpmailer": "6.9.1", 248 | "symfony/polyfill-intl-idn": "1.30.0", 249 | "symfony/polyfill-mbstring": "1.30.0", 250 | "symfony/yaml": "6.4.8" 251 | }, 252 | "replace": { 253 | "symfony/polyfill-php72": "*" 254 | }, 255 | "suggest": { 256 | "ext-PDO": "Support for using databases", 257 | "ext-apcu": "Support for the Apcu cache driver", 258 | "ext-exif": "Support for exif information from images", 259 | "ext-fileinfo": "Improved mime type detection for files", 260 | "ext-intl": "Improved i18n number formatting", 261 | "ext-memcached": "Support for the Memcached cache driver", 262 | "ext-sodium": "Support for the crypto class and more robust session handling", 263 | "ext-zip": "Support for ZIP archive file functions", 264 | "ext-zlib": "Sanitization and validation for svgz files" 265 | }, 266 | "type": "kirby-cms", 267 | "extra": { 268 | "unused": [ 269 | "symfony/polyfill-intl-idn" 270 | ] 271 | }, 272 | "autoload": { 273 | "files": [ 274 | "config/setup.php", 275 | "config/helpers.php" 276 | ], 277 | "psr-4": { 278 | "Kirby\\": "src/" 279 | }, 280 | "classmap": [ 281 | "dependencies/" 282 | ] 283 | }, 284 | "notification-url": "https://packagist.org/downloads/", 285 | "license": [ 286 | "proprietary" 287 | ], 288 | "authors": [ 289 | { 290 | "name": "Kirby Team", 291 | "email": "support@getkirby.com", 292 | "homepage": "https://getkirby.com" 293 | } 294 | ], 295 | "description": "The Kirby 3 core", 296 | "homepage": "https://getkirby.com", 297 | "keywords": [ 298 | "cms", 299 | "core", 300 | "kirby" 301 | ], 302 | "support": { 303 | "email": "support@getkirby.com", 304 | "forum": "https://forum.getkirby.com", 305 | "issues": "https://github.com/getkirby/kirby/issues", 306 | "source": "https://github.com/getkirby/kirby" 307 | }, 308 | "funding": [ 309 | { 310 | "url": "https://getkirby.com/buy", 311 | "type": "custom" 312 | } 313 | ], 314 | "time": "2025-05-05T19:14:17+00:00" 315 | }, 316 | { 317 | "name": "getkirby/composer-installer", 318 | "version": "1.2.1", 319 | "source": { 320 | "type": "git", 321 | "url": "https://github.com/getkirby/composer-installer.git", 322 | "reference": "c98ece30bfba45be7ce457e1102d1b169d922f3d" 323 | }, 324 | "dist": { 325 | "type": "zip", 326 | "url": "https://api.github.com/repos/getkirby/composer-installer/zipball/c98ece30bfba45be7ce457e1102d1b169d922f3d", 327 | "reference": "c98ece30bfba45be7ce457e1102d1b169d922f3d", 328 | "shasum": "" 329 | }, 330 | "require": { 331 | "composer-plugin-api": "^1.0 || ^2.0" 332 | }, 333 | "require-dev": { 334 | "composer/composer": "^1.8 || ^2.0" 335 | }, 336 | "type": "composer-plugin", 337 | "extra": { 338 | "class": "Kirby\\ComposerInstaller\\Plugin" 339 | }, 340 | "autoload": { 341 | "psr-4": { 342 | "Kirby\\": "src/" 343 | } 344 | }, 345 | "notification-url": "https://packagist.org/downloads/", 346 | "license": [ 347 | "MIT" 348 | ], 349 | "description": "Kirby's custom Composer installer for the Kirby CMS and for Kirby plugins", 350 | "homepage": "https://getkirby.com", 351 | "support": { 352 | "issues": "https://github.com/getkirby/composer-installer/issues", 353 | "source": "https://github.com/getkirby/composer-installer/tree/1.2.1" 354 | }, 355 | "funding": [ 356 | { 357 | "url": "https://getkirby.com/buy", 358 | "type": "custom" 359 | } 360 | ], 361 | "time": "2020-12-28T12:54:39+00:00" 362 | }, 363 | { 364 | "name": "laminas/laminas-escaper", 365 | "version": "2.13.0", 366 | "source": { 367 | "type": "git", 368 | "url": "https://github.com/laminas/laminas-escaper.git", 369 | "reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba" 370 | }, 371 | "dist": { 372 | "type": "zip", 373 | "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/af459883f4018d0f8a0c69c7a209daef3bf973ba", 374 | "reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba", 375 | "shasum": "" 376 | }, 377 | "require": { 378 | "ext-ctype": "*", 379 | "ext-mbstring": "*", 380 | "php": "~8.1.0 || ~8.2.0 || ~8.3.0" 381 | }, 382 | "conflict": { 383 | "zendframework/zend-escaper": "*" 384 | }, 385 | "require-dev": { 386 | "infection/infection": "^0.27.0", 387 | "laminas/laminas-coding-standard": "~2.5.0", 388 | "maglnet/composer-require-checker": "^3.8.0", 389 | "phpunit/phpunit": "^9.6.7", 390 | "psalm/plugin-phpunit": "^0.18.4", 391 | "vimeo/psalm": "^5.9" 392 | }, 393 | "type": "library", 394 | "autoload": { 395 | "psr-4": { 396 | "Laminas\\Escaper\\": "src/" 397 | } 398 | }, 399 | "notification-url": "https://packagist.org/downloads/", 400 | "license": [ 401 | "BSD-3-Clause" 402 | ], 403 | "description": "Securely and safely escape HTML, HTML attributes, JavaScript, CSS, and URLs", 404 | "homepage": "https://laminas.dev", 405 | "keywords": [ 406 | "escaper", 407 | "laminas" 408 | ], 409 | "support": { 410 | "chat": "https://laminas.dev/chat", 411 | "docs": "https://docs.laminas.dev/laminas-escaper/", 412 | "forum": "https://discourse.laminas.dev", 413 | "issues": "https://github.com/laminas/laminas-escaper/issues", 414 | "rss": "https://github.com/laminas/laminas-escaper/releases.atom", 415 | "source": "https://github.com/laminas/laminas-escaper" 416 | }, 417 | "funding": [ 418 | { 419 | "url": "https://funding.communitybridge.org/projects/laminas-project", 420 | "type": "community_bridge" 421 | } 422 | ], 423 | "time": "2023-10-10T08:35:13+00:00" 424 | }, 425 | { 426 | "name": "league/color-extractor", 427 | "version": "0.4.0", 428 | "source": { 429 | "type": "git", 430 | "url": "https://github.com/thephpleague/color-extractor.git", 431 | "reference": "21fcac6249c5ef7d00eb83e128743ee6678fe505" 432 | }, 433 | "dist": { 434 | "type": "zip", 435 | "url": "https://api.github.com/repos/thephpleague/color-extractor/zipball/21fcac6249c5ef7d00eb83e128743ee6678fe505", 436 | "reference": "21fcac6249c5ef7d00eb83e128743ee6678fe505", 437 | "shasum": "" 438 | }, 439 | "require": { 440 | "ext-gd": "*", 441 | "php": "^7.3 || ^8.0" 442 | }, 443 | "replace": { 444 | "matthecat/colorextractor": "*" 445 | }, 446 | "require-dev": { 447 | "friendsofphp/php-cs-fixer": "~2", 448 | "phpunit/phpunit": "^9.5" 449 | }, 450 | "suggest": { 451 | "ext-curl": "To download images from remote URLs if allow_url_fopen is disabled for security reasons" 452 | }, 453 | "type": "library", 454 | "autoload": { 455 | "psr-4": { 456 | "League\\ColorExtractor\\": "src" 457 | } 458 | }, 459 | "notification-url": "https://packagist.org/downloads/", 460 | "license": [ 461 | "MIT" 462 | ], 463 | "authors": [ 464 | { 465 | "name": "Mathieu Lechat", 466 | "email": "math.lechat@gmail.com", 467 | "homepage": "http://matthecat.com", 468 | "role": "Developer" 469 | } 470 | ], 471 | "description": "Extract colors from an image as a human would do.", 472 | "homepage": "https://github.com/thephpleague/color-extractor", 473 | "keywords": [ 474 | "color", 475 | "extract", 476 | "human", 477 | "image", 478 | "palette" 479 | ], 480 | "support": { 481 | "issues": "https://github.com/thephpleague/color-extractor/issues", 482 | "source": "https://github.com/thephpleague/color-extractor/tree/0.4.0" 483 | }, 484 | "time": "2022-09-24T15:57:16+00:00" 485 | }, 486 | { 487 | "name": "michelf/php-smartypants", 488 | "version": "1.8.1", 489 | "source": { 490 | "type": "git", 491 | "url": "https://github.com/michelf/php-smartypants.git", 492 | "reference": "47d17c90a4dfd0ccf1f87e25c65e6c8012415aad" 493 | }, 494 | "dist": { 495 | "type": "zip", 496 | "url": "https://api.github.com/repos/michelf/php-smartypants/zipball/47d17c90a4dfd0ccf1f87e25c65e6c8012415aad", 497 | "reference": "47d17c90a4dfd0ccf1f87e25c65e6c8012415aad", 498 | "shasum": "" 499 | }, 500 | "require": { 501 | "php": ">=5.3.0" 502 | }, 503 | "type": "library", 504 | "autoload": { 505 | "psr-0": { 506 | "Michelf": "" 507 | } 508 | }, 509 | "notification-url": "https://packagist.org/downloads/", 510 | "license": [ 511 | "BSD-3-Clause" 512 | ], 513 | "authors": [ 514 | { 515 | "name": "Michel Fortin", 516 | "email": "michel.fortin@michelf.ca", 517 | "homepage": "https://michelf.ca/", 518 | "role": "Developer" 519 | }, 520 | { 521 | "name": "John Gruber", 522 | "homepage": "https://daringfireball.net/" 523 | } 524 | ], 525 | "description": "PHP SmartyPants", 526 | "homepage": "https://michelf.ca/projects/php-smartypants/", 527 | "keywords": [ 528 | "dashes", 529 | "quotes", 530 | "spaces", 531 | "typographer", 532 | "typography" 533 | ], 534 | "support": { 535 | "issues": "https://github.com/michelf/php-smartypants/issues", 536 | "source": "https://github.com/michelf/php-smartypants/tree/1.8.1" 537 | }, 538 | "time": "2016-12-13T01:01:17+00:00" 539 | }, 540 | { 541 | "name": "phpmailer/phpmailer", 542 | "version": "v6.9.1", 543 | "source": { 544 | "type": "git", 545 | "url": "https://github.com/PHPMailer/PHPMailer.git", 546 | "reference": "039de174cd9c17a8389754d3b877a2ed22743e18" 547 | }, 548 | "dist": { 549 | "type": "zip", 550 | "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/039de174cd9c17a8389754d3b877a2ed22743e18", 551 | "reference": "039de174cd9c17a8389754d3b877a2ed22743e18", 552 | "shasum": "" 553 | }, 554 | "require": { 555 | "ext-ctype": "*", 556 | "ext-filter": "*", 557 | "ext-hash": "*", 558 | "php": ">=5.5.0" 559 | }, 560 | "require-dev": { 561 | "dealerdirect/phpcodesniffer-composer-installer": "^1.0", 562 | "doctrine/annotations": "^1.2.6 || ^1.13.3", 563 | "php-parallel-lint/php-console-highlighter": "^1.0.0", 564 | "php-parallel-lint/php-parallel-lint": "^1.3.2", 565 | "phpcompatibility/php-compatibility": "^9.3.5", 566 | "roave/security-advisories": "dev-latest", 567 | "squizlabs/php_codesniffer": "^3.7.2", 568 | "yoast/phpunit-polyfills": "^1.0.4" 569 | }, 570 | "suggest": { 571 | "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication", 572 | "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", 573 | "ext-openssl": "Needed for secure SMTP sending and DKIM signing", 574 | "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", 575 | "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", 576 | "league/oauth2-google": "Needed for Google XOAUTH2 authentication", 577 | "psr/log": "For optional PSR-3 debug logging", 578 | "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)", 579 | "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication" 580 | }, 581 | "type": "library", 582 | "autoload": { 583 | "psr-4": { 584 | "PHPMailer\\PHPMailer\\": "src/" 585 | } 586 | }, 587 | "notification-url": "https://packagist.org/downloads/", 588 | "license": [ 589 | "LGPL-2.1-only" 590 | ], 591 | "authors": [ 592 | { 593 | "name": "Marcus Bointon", 594 | "email": "phpmailer@synchromedia.co.uk" 595 | }, 596 | { 597 | "name": "Jim Jagielski", 598 | "email": "jimjag@gmail.com" 599 | }, 600 | { 601 | "name": "Andy Prevost", 602 | "email": "codeworxtech@users.sourceforge.net" 603 | }, 604 | { 605 | "name": "Brent R. Matzelle" 606 | } 607 | ], 608 | "description": "PHPMailer is a full-featured email creation and transfer class for PHP", 609 | "support": { 610 | "issues": "https://github.com/PHPMailer/PHPMailer/issues", 611 | "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.1" 612 | }, 613 | "funding": [ 614 | { 615 | "url": "https://github.com/Synchro", 616 | "type": "github" 617 | } 618 | ], 619 | "time": "2023-11-25T22:23:28+00:00" 620 | }, 621 | { 622 | "name": "psr/log", 623 | "version": "3.0.2", 624 | "source": { 625 | "type": "git", 626 | "url": "https://github.com/php-fig/log.git", 627 | "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" 628 | }, 629 | "dist": { 630 | "type": "zip", 631 | "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", 632 | "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", 633 | "shasum": "" 634 | }, 635 | "require": { 636 | "php": ">=8.0.0" 637 | }, 638 | "type": "library", 639 | "extra": { 640 | "branch-alias": { 641 | "dev-master": "3.x-dev" 642 | } 643 | }, 644 | "autoload": { 645 | "psr-4": { 646 | "Psr\\Log\\": "src" 647 | } 648 | }, 649 | "notification-url": "https://packagist.org/downloads/", 650 | "license": [ 651 | "MIT" 652 | ], 653 | "authors": [ 654 | { 655 | "name": "PHP-FIG", 656 | "homepage": "https://www.php-fig.org/" 657 | } 658 | ], 659 | "description": "Common interface for logging libraries", 660 | "homepage": "https://github.com/php-fig/log", 661 | "keywords": [ 662 | "log", 663 | "psr", 664 | "psr-3" 665 | ], 666 | "support": { 667 | "source": "https://github.com/php-fig/log/tree/3.0.2" 668 | }, 669 | "time": "2024-09-11T13:17:53+00:00" 670 | }, 671 | { 672 | "name": "symfony/deprecation-contracts", 673 | "version": "v3.6.0", 674 | "source": { 675 | "type": "git", 676 | "url": "https://github.com/symfony/deprecation-contracts.git", 677 | "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" 678 | }, 679 | "dist": { 680 | "type": "zip", 681 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", 682 | "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", 683 | "shasum": "" 684 | }, 685 | "require": { 686 | "php": ">=8.1" 687 | }, 688 | "type": "library", 689 | "extra": { 690 | "thanks": { 691 | "url": "https://github.com/symfony/contracts", 692 | "name": "symfony/contracts" 693 | }, 694 | "branch-alias": { 695 | "dev-main": "3.6-dev" 696 | } 697 | }, 698 | "autoload": { 699 | "files": [ 700 | "function.php" 701 | ] 702 | }, 703 | "notification-url": "https://packagist.org/downloads/", 704 | "license": [ 705 | "MIT" 706 | ], 707 | "authors": [ 708 | { 709 | "name": "Nicolas Grekas", 710 | "email": "p@tchwork.com" 711 | }, 712 | { 713 | "name": "Symfony Community", 714 | "homepage": "https://symfony.com/contributors" 715 | } 716 | ], 717 | "description": "A generic function and convention to trigger deprecation notices", 718 | "homepage": "https://symfony.com", 719 | "support": { 720 | "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" 721 | }, 722 | "funding": [ 723 | { 724 | "url": "https://symfony.com/sponsor", 725 | "type": "custom" 726 | }, 727 | { 728 | "url": "https://github.com/fabpot", 729 | "type": "github" 730 | }, 731 | { 732 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 733 | "type": "tidelift" 734 | } 735 | ], 736 | "time": "2024-09-25T14:21:43+00:00" 737 | }, 738 | { 739 | "name": "symfony/polyfill-ctype", 740 | "version": "v1.33.0", 741 | "source": { 742 | "type": "git", 743 | "url": "https://github.com/symfony/polyfill-ctype.git", 744 | "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" 745 | }, 746 | "dist": { 747 | "type": "zip", 748 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", 749 | "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", 750 | "shasum": "" 751 | }, 752 | "require": { 753 | "php": ">=7.2" 754 | }, 755 | "provide": { 756 | "ext-ctype": "*" 757 | }, 758 | "suggest": { 759 | "ext-ctype": "For best performance" 760 | }, 761 | "type": "library", 762 | "extra": { 763 | "thanks": { 764 | "url": "https://github.com/symfony/polyfill", 765 | "name": "symfony/polyfill" 766 | } 767 | }, 768 | "autoload": { 769 | "files": [ 770 | "bootstrap.php" 771 | ], 772 | "psr-4": { 773 | "Symfony\\Polyfill\\Ctype\\": "" 774 | } 775 | }, 776 | "notification-url": "https://packagist.org/downloads/", 777 | "license": [ 778 | "MIT" 779 | ], 780 | "authors": [ 781 | { 782 | "name": "Gert de Pagter", 783 | "email": "BackEndTea@gmail.com" 784 | }, 785 | { 786 | "name": "Symfony Community", 787 | "homepage": "https://symfony.com/contributors" 788 | } 789 | ], 790 | "description": "Symfony polyfill for ctype functions", 791 | "homepage": "https://symfony.com", 792 | "keywords": [ 793 | "compatibility", 794 | "ctype", 795 | "polyfill", 796 | "portable" 797 | ], 798 | "support": { 799 | "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" 800 | }, 801 | "funding": [ 802 | { 803 | "url": "https://symfony.com/sponsor", 804 | "type": "custom" 805 | }, 806 | { 807 | "url": "https://github.com/fabpot", 808 | "type": "github" 809 | }, 810 | { 811 | "url": "https://github.com/nicolas-grekas", 812 | "type": "github" 813 | }, 814 | { 815 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 816 | "type": "tidelift" 817 | } 818 | ], 819 | "time": "2024-09-09T11:45:10+00:00" 820 | }, 821 | { 822 | "name": "symfony/polyfill-intl-idn", 823 | "version": "v1.30.0", 824 | "source": { 825 | "type": "git", 826 | "url": "https://github.com/symfony/polyfill-intl-idn.git", 827 | "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c" 828 | }, 829 | "dist": { 830 | "type": "zip", 831 | "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", 832 | "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", 833 | "shasum": "" 834 | }, 835 | "require": { 836 | "php": ">=7.1", 837 | "symfony/polyfill-intl-normalizer": "^1.10", 838 | "symfony/polyfill-php72": "^1.10" 839 | }, 840 | "suggest": { 841 | "ext-intl": "For best performance" 842 | }, 843 | "type": "library", 844 | "extra": { 845 | "thanks": { 846 | "url": "https://github.com/symfony/polyfill", 847 | "name": "symfony/polyfill" 848 | } 849 | }, 850 | "autoload": { 851 | "files": [ 852 | "bootstrap.php" 853 | ], 854 | "psr-4": { 855 | "Symfony\\Polyfill\\Intl\\Idn\\": "" 856 | } 857 | }, 858 | "notification-url": "https://packagist.org/downloads/", 859 | "license": [ 860 | "MIT" 861 | ], 862 | "authors": [ 863 | { 864 | "name": "Laurent Bassin", 865 | "email": "laurent@bassin.info" 866 | }, 867 | { 868 | "name": "Trevor Rowbotham", 869 | "email": "trevor.rowbotham@pm.me" 870 | }, 871 | { 872 | "name": "Symfony Community", 873 | "homepage": "https://symfony.com/contributors" 874 | } 875 | ], 876 | "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", 877 | "homepage": "https://symfony.com", 878 | "keywords": [ 879 | "compatibility", 880 | "idn", 881 | "intl", 882 | "polyfill", 883 | "portable", 884 | "shim" 885 | ], 886 | "support": { 887 | "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0" 888 | }, 889 | "funding": [ 890 | { 891 | "url": "https://symfony.com/sponsor", 892 | "type": "custom" 893 | }, 894 | { 895 | "url": "https://github.com/fabpot", 896 | "type": "github" 897 | }, 898 | { 899 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 900 | "type": "tidelift" 901 | } 902 | ], 903 | "time": "2024-05-31T15:07:36+00:00" 904 | }, 905 | { 906 | "name": "symfony/polyfill-intl-normalizer", 907 | "version": "v1.33.0", 908 | "source": { 909 | "type": "git", 910 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git", 911 | "reference": "3833d7255cc303546435cb650316bff708a1c75c" 912 | }, 913 | "dist": { 914 | "type": "zip", 915 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", 916 | "reference": "3833d7255cc303546435cb650316bff708a1c75c", 917 | "shasum": "" 918 | }, 919 | "require": { 920 | "php": ">=7.2" 921 | }, 922 | "suggest": { 923 | "ext-intl": "For best performance" 924 | }, 925 | "type": "library", 926 | "extra": { 927 | "thanks": { 928 | "url": "https://github.com/symfony/polyfill", 929 | "name": "symfony/polyfill" 930 | } 931 | }, 932 | "autoload": { 933 | "files": [ 934 | "bootstrap.php" 935 | ], 936 | "psr-4": { 937 | "Symfony\\Polyfill\\Intl\\Normalizer\\": "" 938 | }, 939 | "classmap": [ 940 | "Resources/stubs" 941 | ] 942 | }, 943 | "notification-url": "https://packagist.org/downloads/", 944 | "license": [ 945 | "MIT" 946 | ], 947 | "authors": [ 948 | { 949 | "name": "Nicolas Grekas", 950 | "email": "p@tchwork.com" 951 | }, 952 | { 953 | "name": "Symfony Community", 954 | "homepage": "https://symfony.com/contributors" 955 | } 956 | ], 957 | "description": "Symfony polyfill for intl's Normalizer class and related functions", 958 | "homepage": "https://symfony.com", 959 | "keywords": [ 960 | "compatibility", 961 | "intl", 962 | "normalizer", 963 | "polyfill", 964 | "portable", 965 | "shim" 966 | ], 967 | "support": { 968 | "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" 969 | }, 970 | "funding": [ 971 | { 972 | "url": "https://symfony.com/sponsor", 973 | "type": "custom" 974 | }, 975 | { 976 | "url": "https://github.com/fabpot", 977 | "type": "github" 978 | }, 979 | { 980 | "url": "https://github.com/nicolas-grekas", 981 | "type": "github" 982 | }, 983 | { 984 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 985 | "type": "tidelift" 986 | } 987 | ], 988 | "time": "2024-09-09T11:45:10+00:00" 989 | }, 990 | { 991 | "name": "symfony/polyfill-mbstring", 992 | "version": "v1.30.0", 993 | "source": { 994 | "type": "git", 995 | "url": "https://github.com/symfony/polyfill-mbstring.git", 996 | "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" 997 | }, 998 | "dist": { 999 | "type": "zip", 1000 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", 1001 | "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", 1002 | "shasum": "" 1003 | }, 1004 | "require": { 1005 | "php": ">=7.1" 1006 | }, 1007 | "provide": { 1008 | "ext-mbstring": "*" 1009 | }, 1010 | "suggest": { 1011 | "ext-mbstring": "For best performance" 1012 | }, 1013 | "type": "library", 1014 | "extra": { 1015 | "thanks": { 1016 | "url": "https://github.com/symfony/polyfill", 1017 | "name": "symfony/polyfill" 1018 | } 1019 | }, 1020 | "autoload": { 1021 | "files": [ 1022 | "bootstrap.php" 1023 | ], 1024 | "psr-4": { 1025 | "Symfony\\Polyfill\\Mbstring\\": "" 1026 | } 1027 | }, 1028 | "notification-url": "https://packagist.org/downloads/", 1029 | "license": [ 1030 | "MIT" 1031 | ], 1032 | "authors": [ 1033 | { 1034 | "name": "Nicolas Grekas", 1035 | "email": "p@tchwork.com" 1036 | }, 1037 | { 1038 | "name": "Symfony Community", 1039 | "homepage": "https://symfony.com/contributors" 1040 | } 1041 | ], 1042 | "description": "Symfony polyfill for the Mbstring extension", 1043 | "homepage": "https://symfony.com", 1044 | "keywords": [ 1045 | "compatibility", 1046 | "mbstring", 1047 | "polyfill", 1048 | "portable", 1049 | "shim" 1050 | ], 1051 | "support": { 1052 | "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" 1053 | }, 1054 | "funding": [ 1055 | { 1056 | "url": "https://symfony.com/sponsor", 1057 | "type": "custom" 1058 | }, 1059 | { 1060 | "url": "https://github.com/fabpot", 1061 | "type": "github" 1062 | }, 1063 | { 1064 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1065 | "type": "tidelift" 1066 | } 1067 | ], 1068 | "time": "2024-06-19T12:30:46+00:00" 1069 | }, 1070 | { 1071 | "name": "symfony/yaml", 1072 | "version": "v6.4.8", 1073 | "source": { 1074 | "type": "git", 1075 | "url": "https://github.com/symfony/yaml.git", 1076 | "reference": "52903de178d542850f6f341ba92995d3d63e60c9" 1077 | }, 1078 | "dist": { 1079 | "type": "zip", 1080 | "url": "https://api.github.com/repos/symfony/yaml/zipball/52903de178d542850f6f341ba92995d3d63e60c9", 1081 | "reference": "52903de178d542850f6f341ba92995d3d63e60c9", 1082 | "shasum": "" 1083 | }, 1084 | "require": { 1085 | "php": ">=8.1", 1086 | "symfony/deprecation-contracts": "^2.5|^3", 1087 | "symfony/polyfill-ctype": "^1.8" 1088 | }, 1089 | "conflict": { 1090 | "symfony/console": "<5.4" 1091 | }, 1092 | "require-dev": { 1093 | "symfony/console": "^5.4|^6.0|^7.0" 1094 | }, 1095 | "bin": [ 1096 | "Resources/bin/yaml-lint" 1097 | ], 1098 | "type": "library", 1099 | "autoload": { 1100 | "psr-4": { 1101 | "Symfony\\Component\\Yaml\\": "" 1102 | }, 1103 | "exclude-from-classmap": [ 1104 | "/Tests/" 1105 | ] 1106 | }, 1107 | "notification-url": "https://packagist.org/downloads/", 1108 | "license": [ 1109 | "MIT" 1110 | ], 1111 | "authors": [ 1112 | { 1113 | "name": "Fabien Potencier", 1114 | "email": "fabien@symfony.com" 1115 | }, 1116 | { 1117 | "name": "Symfony Community", 1118 | "homepage": "https://symfony.com/contributors" 1119 | } 1120 | ], 1121 | "description": "Loads and dumps YAML files", 1122 | "homepage": "https://symfony.com", 1123 | "support": { 1124 | "source": "https://github.com/symfony/yaml/tree/v6.4.8" 1125 | }, 1126 | "funding": [ 1127 | { 1128 | "url": "https://symfony.com/sponsor", 1129 | "type": "custom" 1130 | }, 1131 | { 1132 | "url": "https://github.com/fabpot", 1133 | "type": "github" 1134 | }, 1135 | { 1136 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1137 | "type": "tidelift" 1138 | } 1139 | ], 1140 | "time": "2024-05-31T14:49:08+00:00" 1141 | }, 1142 | { 1143 | "name": "twig/twig", 1144 | "version": "v3.21.1", 1145 | "source": { 1146 | "type": "git", 1147 | "url": "https://github.com/twigphp/Twig.git", 1148 | "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d" 1149 | }, 1150 | "dist": { 1151 | "type": "zip", 1152 | "url": "https://api.github.com/repos/twigphp/Twig/zipball/285123877d4dd97dd7c11842ac5fb7e86e60d81d", 1153 | "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d", 1154 | "shasum": "" 1155 | }, 1156 | "require": { 1157 | "php": ">=8.1.0", 1158 | "symfony/deprecation-contracts": "^2.5|^3", 1159 | "symfony/polyfill-ctype": "^1.8", 1160 | "symfony/polyfill-mbstring": "^1.3" 1161 | }, 1162 | "require-dev": { 1163 | "phpstan/phpstan": "^2.0", 1164 | "psr/container": "^1.0|^2.0", 1165 | "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" 1166 | }, 1167 | "type": "library", 1168 | "autoload": { 1169 | "files": [ 1170 | "src/Resources/core.php", 1171 | "src/Resources/debug.php", 1172 | "src/Resources/escaper.php", 1173 | "src/Resources/string_loader.php" 1174 | ], 1175 | "psr-4": { 1176 | "Twig\\": "src/" 1177 | } 1178 | }, 1179 | "notification-url": "https://packagist.org/downloads/", 1180 | "license": [ 1181 | "BSD-3-Clause" 1182 | ], 1183 | "authors": [ 1184 | { 1185 | "name": "Fabien Potencier", 1186 | "email": "fabien@symfony.com", 1187 | "homepage": "http://fabien.potencier.org", 1188 | "role": "Lead Developer" 1189 | }, 1190 | { 1191 | "name": "Twig Team", 1192 | "role": "Contributors" 1193 | }, 1194 | { 1195 | "name": "Armin Ronacher", 1196 | "email": "armin.ronacher@active-4.com", 1197 | "role": "Project Founder" 1198 | } 1199 | ], 1200 | "description": "Twig, the flexible, fast, and secure template language for PHP", 1201 | "homepage": "https://twig.symfony.com", 1202 | "keywords": [ 1203 | "templating" 1204 | ], 1205 | "support": { 1206 | "issues": "https://github.com/twigphp/Twig/issues", 1207 | "source": "https://github.com/twigphp/Twig/tree/v3.21.1" 1208 | }, 1209 | "funding": [ 1210 | { 1211 | "url": "https://github.com/fabpot", 1212 | "type": "github" 1213 | }, 1214 | { 1215 | "url": "https://tidelift.com/funding/github/packagist/twig/twig", 1216 | "type": "tidelift" 1217 | } 1218 | ], 1219 | "time": "2025-05-03T07:21:55+00:00" 1220 | } 1221 | ], 1222 | "packages-dev": [ 1223 | { 1224 | "name": "symfony/var-dumper", 1225 | "version": "v6.4.24", 1226 | "source": { 1227 | "type": "git", 1228 | "url": "https://github.com/symfony/var-dumper.git", 1229 | "reference": "aa29484ce0544bd69fa9f0df902e5ed7b7fe5034" 1230 | }, 1231 | "dist": { 1232 | "type": "zip", 1233 | "url": "https://api.github.com/repos/symfony/var-dumper/zipball/aa29484ce0544bd69fa9f0df902e5ed7b7fe5034", 1234 | "reference": "aa29484ce0544bd69fa9f0df902e5ed7b7fe5034", 1235 | "shasum": "" 1236 | }, 1237 | "require": { 1238 | "php": ">=8.1", 1239 | "symfony/deprecation-contracts": "^2.5|^3", 1240 | "symfony/polyfill-mbstring": "~1.0" 1241 | }, 1242 | "conflict": { 1243 | "symfony/console": "<5.4" 1244 | }, 1245 | "require-dev": { 1246 | "symfony/console": "^5.4|^6.0|^7.0", 1247 | "symfony/error-handler": "^6.3|^7.0", 1248 | "symfony/http-kernel": "^5.4|^6.0|^7.0", 1249 | "symfony/process": "^5.4|^6.0|^7.0", 1250 | "symfony/uid": "^5.4|^6.0|^7.0", 1251 | "twig/twig": "^2.13|^3.0.4" 1252 | }, 1253 | "bin": [ 1254 | "Resources/bin/var-dump-server" 1255 | ], 1256 | "type": "library", 1257 | "autoload": { 1258 | "files": [ 1259 | "Resources/functions/dump.php" 1260 | ], 1261 | "psr-4": { 1262 | "Symfony\\Component\\VarDumper\\": "" 1263 | }, 1264 | "exclude-from-classmap": [ 1265 | "/Tests/" 1266 | ] 1267 | }, 1268 | "notification-url": "https://packagist.org/downloads/", 1269 | "license": [ 1270 | "MIT" 1271 | ], 1272 | "authors": [ 1273 | { 1274 | "name": "Nicolas Grekas", 1275 | "email": "p@tchwork.com" 1276 | }, 1277 | { 1278 | "name": "Symfony Community", 1279 | "homepage": "https://symfony.com/contributors" 1280 | } 1281 | ], 1282 | "description": "Provides mechanisms for walking through any arbitrary PHP variable", 1283 | "homepage": "https://symfony.com", 1284 | "keywords": [ 1285 | "debug", 1286 | "dump" 1287 | ], 1288 | "support": { 1289 | "source": "https://github.com/symfony/var-dumper/tree/v6.4.24" 1290 | }, 1291 | "funding": [ 1292 | { 1293 | "url": "https://symfony.com/sponsor", 1294 | "type": "custom" 1295 | }, 1296 | { 1297 | "url": "https://github.com/fabpot", 1298 | "type": "github" 1299 | }, 1300 | { 1301 | "url": "https://github.com/nicolas-grekas", 1302 | "type": "github" 1303 | }, 1304 | { 1305 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1306 | "type": "tidelift" 1307 | } 1308 | ], 1309 | "time": "2025-07-29T18:40:01+00:00" 1310 | } 1311 | ], 1312 | "aliases": [], 1313 | "minimum-stability": "stable", 1314 | "stability-flags": {}, 1315 | "prefer-stable": false, 1316 | "prefer-lowest": false, 1317 | "platform": { 1318 | "php": ">=8.0.2 <8.3.0" 1319 | }, 1320 | "platform-dev": {}, 1321 | "plugin-api-version": "2.6.0" 1322 | } 1323 | --------------------------------------------------------------------------------