├── public ├── media │ └── index.html ├── site │ ├── cache │ │ └── index.html │ ├── accounts │ │ └── index.html │ ├── sessions │ │ └── index.html │ ├── snippets │ │ ├── index.html │ │ └── global │ │ │ ├── menu.php │ │ │ ├── header.php │ │ │ ├── logo.php │ │ │ ├── footer.php │ │ │ ├── htmlhead.php │ │ │ └── favicon.php │ ├── plugins │ │ ├── hero │ │ │ ├── .gitignore │ │ │ ├── snippets │ │ │ │ ├── colorhero.php │ │ │ │ ├── herocontent.php │ │ │ │ ├── imagehero.php │ │ │ │ ├── hero.php │ │ │ │ ├── slideshero.php │ │ │ │ ├── videohero.php │ │ │ │ └── pageshero.php │ │ │ ├── composer.json │ │ │ └── blueprints │ │ │ │ └── files │ │ │ │ ├── videos.yml │ │ │ │ └── images.yml │ │ ├── kirby3-webp │ │ │ ├── .gitignore │ │ │ ├── composer.json │ │ │ ├── snippets │ │ │ │ └── webp.php │ │ │ └── LICENSE.md │ │ ├── kirby3-schema │ │ │ ├── .gitignore │ │ │ ├── composer.json │ │ │ ├── index.php │ │ │ └── README.md │ │ ├── kirby3-seo │ │ │ ├── .gitignore │ │ │ ├── composer.json │ │ │ ├── blueprints │ │ │ │ ├── fields │ │ │ │ │ └── meta.yml │ │ │ │ └── tabs │ │ │ │ │ ├── meta.yml │ │ │ │ │ └── contact.yml │ │ │ ├── snippets │ │ │ │ ├── favicon.php │ │ │ │ └── meta.php │ │ │ └── index.php │ │ ├── link-field │ │ │ ├── index.css │ │ │ ├── languages │ │ │ │ ├── de.php │ │ │ │ └── en.php │ │ │ └── composer.json │ │ ├── autoresize │ │ │ ├── .github │ │ │ │ └── FUNDING.yml │ │ │ ├── composer.json │ │ │ ├── README.md │ │ │ └── index.php │ │ ├── cachebuster │ │ │ ├── .gitignore │ │ │ ├── composer.json │ │ │ └── index.php │ │ ├── focus │ │ │ ├── composer.json │ │ │ └── .editorconfig │ │ ├── entity-field │ │ │ ├── composer.json │ │ │ ├── index.css │ │ │ ├── LICENSE.md │ │ │ └── index.php │ │ └── kirby3-forge │ │ │ └── index.php │ ├── config │ │ └── config.php │ ├── blueprints │ │ ├── pages │ │ │ ├── default.yml │ │ │ ├── error.yml │ │ │ └── home.yml │ │ ├── tabs │ │ │ ├── content.yml │ │ │ ├── files.yml │ │ │ └── sitemenu.yml │ │ ├── files │ │ │ └── images.yml │ │ └── site.yml │ ├── controllers │ │ ├── error.php │ │ ├── default.php │ │ └── home.php │ └── templates │ │ ├── home.php │ │ ├── default.php │ │ └── error.php ├── content │ ├── 1_home │ │ ├── 3sbk0w5f9o.webp.txt │ │ ├── lw31n7hd1i.webp.txt │ │ ├── mhl5llu02e.webp.txt │ │ ├── 3sbk0w5f9o.jpg.txt │ │ ├── lw31n7hd1i.jpg.txt │ │ ├── 3sbk0w5f9o.jpg │ │ ├── lw31n7hd1i.jpg │ │ ├── mhl5llu02e.jpg │ │ ├── 3sbk0w5f9o.webp │ │ ├── lw31n7hd1i.webp │ │ ├── mhl5llu02e.webp │ │ └── mhl5llu02e.jpg.txt │ ├── 2_about │ │ ├── mhl5llu02e.webp.txt │ │ ├── mhl5llu02e.jpg.txt │ │ ├── mhl5llu02e.jpg │ │ └── mhl5llu02e.webp │ ├── site.txt │ └── error │ │ └── error.txt ├── kirby │ ├── views │ │ ├── snippets │ │ │ ├── footer.php │ │ │ └── header.php │ │ ├── php.php │ │ └── fatal.php │ ├── config │ │ ├── fields │ │ │ ├── hidden.php │ │ │ ├── gap.php │ │ │ ├── line.php │ │ │ ├── mixins │ │ │ │ ├── userpicker.php │ │ │ │ ├── filepicker.php │ │ │ │ ├── pagepicker.php │ │ │ │ ├── min.php │ │ │ │ ├── datetime.php │ │ │ │ └── options.php │ │ │ ├── list.php │ │ │ ├── range.php │ │ │ ├── select.php │ │ │ ├── tel.php │ │ │ ├── headline.php │ │ │ ├── writer.php │ │ │ ├── radio.php │ │ │ ├── multiselect.php │ │ │ ├── url.php │ │ │ ├── email.php │ │ │ ├── info.php │ │ │ ├── number.php │ │ │ └── checkboxes.php │ │ ├── blueprints │ │ │ ├── files │ │ │ │ └── default.yml │ │ │ ├── pages │ │ │ │ └── default.yml │ │ │ ├── blocks │ │ │ │ ├── text.yml │ │ │ │ ├── video.yml │ │ │ │ ├── quote.yml │ │ │ │ ├── image.yml │ │ │ │ ├── heading.yml │ │ │ │ ├── table.yml │ │ │ │ └── code.yml │ │ │ └── site.yml │ │ ├── blocks │ │ │ ├── table │ │ │ │ └── table.yml │ │ │ ├── list │ │ │ │ ├── list.php │ │ │ │ └── list.yml │ │ │ ├── text │ │ │ │ ├── text.php │ │ │ │ └── text.yml │ │ │ ├── markdown │ │ │ │ ├── markdown.php │ │ │ │ └── markdown.yml │ │ │ ├── heading │ │ │ │ ├── heading.php │ │ │ │ └── heading.yml │ │ │ ├── code │ │ │ │ ├── code.php │ │ │ │ └── code.yml │ │ │ ├── gallery │ │ │ │ ├── gallery.php │ │ │ │ └── gallery.yml │ │ │ ├── quote │ │ │ │ ├── quote.php │ │ │ │ └── quote.yml │ │ │ ├── video │ │ │ │ ├── video.php │ │ │ │ └── video.yml │ │ │ └── image │ │ │ │ ├── image.php │ │ │ │ └── image.yml │ │ ├── templates │ │ │ └── emails │ │ │ │ └── auth │ │ │ │ ├── login.php │ │ │ │ └── password-reset.php │ │ ├── templates.php │ │ ├── sections │ │ │ ├── mixins │ │ │ │ ├── layout.php │ │ │ │ ├── min.php │ │ │ │ ├── empty.php │ │ │ │ ├── help.php │ │ │ │ ├── headline.php │ │ │ │ ├── max.php │ │ │ │ ├── pagination.php │ │ │ │ └── parent.php │ │ │ └── info.php │ │ ├── api │ │ │ ├── routes │ │ │ │ ├── translations.php │ │ │ │ ├── roles.php │ │ │ │ └── languages.php │ │ │ ├── models │ │ │ │ ├── FileBlueprint.php │ │ │ │ ├── SiteBlueprint.php │ │ │ │ ├── UserBlueprint.php │ │ │ │ ├── Role.php │ │ │ │ ├── Translation.php │ │ │ │ ├── PageBlueprint.php │ │ │ │ └── Language.php │ │ │ ├── authentication.php │ │ │ ├── routes.php │ │ │ ├── models.php │ │ │ └── collections.php │ │ ├── presets │ │ │ ├── files.php │ │ │ └── pages.php │ │ ├── snippets.php │ │ ├── setup.php │ │ ├── urls.php │ │ ├── blueprints.php │ │ └── fields.php │ ├── i18n │ │ └── rules │ │ │ ├── fi.json │ │ │ ├── nb.json │ │ │ ├── sv_SE.json │ │ │ ├── de.json │ │ │ ├── da.json │ │ │ ├── uk.json │ │ │ ├── hr.json │ │ │ ├── it.json │ │ │ ├── et.json │ │ │ ├── tr.json │ │ │ ├── rm.json │ │ │ ├── eo.json │ │ │ ├── az.json │ │ │ ├── hu.json │ │ │ ├── lv.json │ │ │ ├── cs.json │ │ │ ├── lt.json │ │ │ ├── pl.json │ │ │ ├── fr.json │ │ │ ├── ar.json │ │ │ ├── ka.json │ │ │ ├── fa.json │ │ │ ├── LICENSE │ │ │ ├── mk.json │ │ │ ├── bg.json │ │ │ ├── ru.json │ │ │ ├── hi.json │ │ │ ├── sr.json │ │ │ └── hy.json │ ├── panel │ │ └── dist │ │ │ ├── favicon.png │ │ │ ├── apple-touch-icon.png │ │ │ └── favicon.svg │ ├── SECURITY.md │ ├── src │ │ ├── Parsley │ │ │ ├── Schema.php │ │ │ └── Schema │ │ │ │ └── Plain.php │ │ ├── Form │ │ │ ├── Mixin │ │ │ │ ├── Max.php │ │ │ │ ├── Min.php │ │ │ │ └── EmptyState.php │ │ │ └── Fields.php │ │ ├── Http │ │ │ ├── Exceptions │ │ │ │ └── NextRouteException.php │ │ │ ├── Request │ │ │ │ └── Auth │ │ │ │ │ ├── BearerAuth.php │ │ │ │ │ └── BasicAuth.php │ │ │ ├── Path.php │ │ │ └── Query.php │ │ ├── Cms │ │ │ ├── FilePermissions.php │ │ │ ├── SitePermissions.php │ │ │ ├── LayoutColumns.php │ │ │ ├── R.php │ │ │ ├── S.php │ │ │ ├── Visitor.php │ │ │ ├── Response.php │ │ │ ├── NestCollection.php │ │ │ ├── Html.php │ │ │ ├── NestObject.php │ │ │ ├── Layouts.php │ │ │ ├── KirbyTags.php │ │ │ ├── Nest.php │ │ │ ├── UserBlueprint.php │ │ │ ├── SiteBlueprint.php │ │ │ ├── UserPermissions.php │ │ │ └── KirbyTag.php │ │ ├── Toolkit │ │ │ ├── Config.php │ │ │ ├── Facade.php │ │ │ ├── Tpl.php │ │ │ └── Controller.php │ │ ├── Exception │ │ │ ├── NotFoundException.php │ │ │ ├── LogicException.php │ │ │ ├── ErrorPageException.php │ │ │ ├── DuplicateException.php │ │ │ ├── PermissionException.php │ │ │ ├── BadMethodCallException.php │ │ │ └── InvalidArgumentException.php │ │ └── Data │ │ │ ├── Json.php │ │ │ └── Handler.php │ ├── router.php │ ├── .editorconfig │ ├── kirby.pub │ ├── bootstrap.php │ └── assets │ │ └── whoops.css ├── index.php ├── assets │ ├── favicon │ │ ├── favicon.ico │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── mstile-70x70.png │ │ ├── mstile-144x144.png │ │ ├── mstile-150x150.png │ │ ├── mstile-310x150.png │ │ ├── mstile-310x310.png │ │ ├── apple-touch-icon.png │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-512x512.png │ │ ├── site.webmanifest │ │ ├── browserconfig.xml │ │ └── safari-pinned-tab.svg │ └── fonts │ │ └── fonts.txt ├── .editorconfig ├── .gitignore └── composer.json ├── config ├── rsync_exclude.txt ├── favicon.html └── faviconDescription.json ├── src ├── sass │ ├── 06-components │ │ ├── _components.middle.scss │ │ ├── _components.siteheader.scss │ │ ├── _components.footer.scss │ │ ├── _components.menu.scss │ │ └── _components.forms.scss │ ├── 04-elements │ │ ├── _elements.table.scss │ │ ├── _elements.html.scss │ │ ├── _elements.buttons.scss │ │ ├── _elements.body.scss │ │ └── _elements.media.scss │ ├── 05-objects │ │ ├── _objects.container.scss │ │ ├── _objects.wrapper.scss │ │ └── _objects.logo.scss │ ├── 02-tools │ │ └── _tools.media.scss │ └── 01-settings │ │ ├── _settings.svg.scss │ │ ├── _settings.core.scss │ │ ├── _settings.colors.scss │ │ ├── _settings.mq.scss │ │ ├── _settings.ratio.scss │ │ └── _settings.forms.scss ├── fonts │ └── fonts.txt └── js │ └── site.js ├── mix-manifest.json ├── README.md ├── .gitignore └── package.json /public/media/index.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/site/cache/index.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/site/accounts/index.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/site/sessions/index.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/site/snippets/index.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/content/1_home/3sbk0w5f9o.webp.txt: -------------------------------------------------------------------------------- 1 | Template: images -------------------------------------------------------------------------------- /public/content/1_home/lw31n7hd1i.webp.txt: -------------------------------------------------------------------------------- 1 | Template: images -------------------------------------------------------------------------------- /public/content/1_home/mhl5llu02e.webp.txt: -------------------------------------------------------------------------------- 1 | Template: images -------------------------------------------------------------------------------- /public/content/2_about/mhl5llu02e.webp.txt: -------------------------------------------------------------------------------- 1 | Template: images -------------------------------------------------------------------------------- /public/kirby/views/snippets/footer.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /public/kirby/config/fields/hidden.php: -------------------------------------------------------------------------------- 1 | false 5 | ]; 6 | -------------------------------------------------------------------------------- /public/kirby/config/fields/line.php: -------------------------------------------------------------------------------- 1 | false 5 | ]; 6 | -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | render(); 6 | -------------------------------------------------------------------------------- /public/kirby/config/blocks/list/list.php: -------------------------------------------------------------------------------- 1 | 2 | text(); 3 | -------------------------------------------------------------------------------- /public/kirby/config/blocks/text/text.php: -------------------------------------------------------------------------------- 1 | 2 | text(); 3 | -------------------------------------------------------------------------------- /public/site/plugins/link-field/index.css: -------------------------------------------------------------------------------- 1 | [data-v-1199651c] .k-field-header { 2 | display: none; 3 | } 4 | 5 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/fi.json: -------------------------------------------------------------------------------- 1 | { 2 | "Ä": "A", 3 | "Ö": "O", 4 | "ä": "a", 5 | "ö": "o" 6 | } 7 | -------------------------------------------------------------------------------- /public/kirby/config/blueprints/blocks/text.yml: -------------------------------------------------------------------------------- 1 | name: Text 2 | icon: text 3 | fields: 4 | text: 5 | type: writer 6 | -------------------------------------------------------------------------------- /public/content/1_home/3sbk0w5f9o.jpg.txt: -------------------------------------------------------------------------------- 1 | Caption: 2 | 3 | ---- 4 | 5 | Feature: false 6 | 7 | ---- 8 | 9 | Template: images -------------------------------------------------------------------------------- /public/content/1_home/lw31n7hd1i.jpg.txt: -------------------------------------------------------------------------------- 1 | Caption: 2 | 3 | ---- 4 | 5 | Feature: false 6 | 7 | ---- 8 | 9 | Template: images -------------------------------------------------------------------------------- /public/content/2_about/mhl5llu02e.jpg.txt: -------------------------------------------------------------------------------- 1 | Caption: 2 | 3 | ---- 4 | 5 | Feature: false 6 | 7 | ---- 8 | 9 | Template: images -------------------------------------------------------------------------------- /public/kirby/config/blocks/markdown/markdown.php: -------------------------------------------------------------------------------- 1 | 2 | text()->kt(); 3 | -------------------------------------------------------------------------------- /public/assets/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashandSalt/ForgeLiteKirby/develop/public/assets/favicon/favicon.ico -------------------------------------------------------------------------------- /public/content/1_home/3sbk0w5f9o.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashandSalt/ForgeLiteKirby/develop/public/content/1_home/3sbk0w5f9o.jpg -------------------------------------------------------------------------------- /public/content/1_home/lw31n7hd1i.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashandSalt/ForgeLiteKirby/develop/public/content/1_home/lw31n7hd1i.jpg -------------------------------------------------------------------------------- /public/content/1_home/mhl5llu02e.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashandSalt/ForgeLiteKirby/develop/public/content/1_home/mhl5llu02e.jpg -------------------------------------------------------------------------------- /public/kirby/panel/dist/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashandSalt/ForgeLiteKirby/develop/public/kirby/panel/dist/favicon.png -------------------------------------------------------------------------------- /public/assets/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashandSalt/ForgeLiteKirby/develop/public/assets/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /public/assets/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashandSalt/ForgeLiteKirby/develop/public/assets/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /public/assets/favicon/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashandSalt/ForgeLiteKirby/develop/public/assets/favicon/mstile-70x70.png -------------------------------------------------------------------------------- /public/content/1_home/3sbk0w5f9o.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashandSalt/ForgeLiteKirby/develop/public/content/1_home/3sbk0w5f9o.webp -------------------------------------------------------------------------------- /public/content/1_home/lw31n7hd1i.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashandSalt/ForgeLiteKirby/develop/public/content/1_home/lw31n7hd1i.webp -------------------------------------------------------------------------------- /public/content/1_home/mhl5llu02e.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashandSalt/ForgeLiteKirby/develop/public/content/1_home/mhl5llu02e.webp -------------------------------------------------------------------------------- /public/content/2_about/mhl5llu02e.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashandSalt/ForgeLiteKirby/develop/public/content/2_about/mhl5llu02e.jpg -------------------------------------------------------------------------------- /public/content/2_about/mhl5llu02e.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashandSalt/ForgeLiteKirby/develop/public/content/2_about/mhl5llu02e.webp -------------------------------------------------------------------------------- /public/assets/favicon/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashandSalt/ForgeLiteKirby/develop/public/assets/favicon/mstile-144x144.png -------------------------------------------------------------------------------- /public/assets/favicon/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashandSalt/ForgeLiteKirby/develop/public/assets/favicon/mstile-150x150.png -------------------------------------------------------------------------------- /public/assets/favicon/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashandSalt/ForgeLiteKirby/develop/public/assets/favicon/mstile-310x150.png -------------------------------------------------------------------------------- /public/assets/favicon/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashandSalt/ForgeLiteKirby/develop/public/assets/favicon/mstile-310x310.png -------------------------------------------------------------------------------- /public/kirby/config/blueprints/site.yml: -------------------------------------------------------------------------------- 1 | name: Site 2 | title: Site 3 | sections: 4 | pages: 5 | headline: Pages 6 | type: pages 7 | 8 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/nb.json: -------------------------------------------------------------------------------- 1 | { 2 | "Æ": "AE", 3 | "Ø": "OE", 4 | "Å": "AA", 5 | "æ": "ae", 6 | "ø": "oe", 7 | "å": "aa" 8 | } 9 | -------------------------------------------------------------------------------- /public/site/snippets/global/menu.php: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /public/assets/favicon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashandSalt/ForgeLiteKirby/develop/public/assets/favicon/apple-touch-icon.png -------------------------------------------------------------------------------- /public/kirby/i18n/rules/sv_SE.json: -------------------------------------------------------------------------------- 1 | { 2 | "Ä": "A", 3 | "Å": "a", 4 | "Ö": "O", 5 | "ä": "a", 6 | "å": "a", 7 | "ö": "o" 8 | } 9 | -------------------------------------------------------------------------------- /public/kirby/panel/dist/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashandSalt/ForgeLiteKirby/develop/public/kirby/panel/dist/apple-touch-icon.png -------------------------------------------------------------------------------- /public/site/plugins/autoresize/.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: ['https://www.paypal.me/medienbaecker/10','https://a.paddle.com/v2/click/1129/36156?link=1170'] 2 | -------------------------------------------------------------------------------- /public/site/snippets/global/header.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | 6 |
7 | -------------------------------------------------------------------------------- /public/assets/favicon/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashandSalt/ForgeLiteKirby/develop/public/assets/favicon/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/assets/favicon/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashandSalt/ForgeLiteKirby/develop/public/assets/favicon/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/content/1_home/mhl5llu02e.jpg.txt: -------------------------------------------------------------------------------- 1 | Alt: 2 | 3 | ---- 4 | 5 | Caption: 6 | 7 | ---- 8 | 9 | Feature: true 10 | 11 | ---- 12 | 13 | Template: images -------------------------------------------------------------------------------- /public/site/snippets/global/logo.php: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /public/kirby/config/blocks/heading/heading.php: -------------------------------------------------------------------------------- 1 | 2 | <level()->or('h2') ?>>text() ?>> 3 | -------------------------------------------------------------------------------- /public/kirby/config/blueprints/blocks/video.yml: -------------------------------------------------------------------------------- 1 | name: Video 2 | icon: video 3 | label: "{{ url }}" 4 | fields: 5 | url: 6 | type: url 7 | caption: 8 | type: writer 9 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/de.json: -------------------------------------------------------------------------------- 1 | { 2 | "Ä": "AE", 3 | "Ö": "OE", 4 | "Ü": "UE", 5 | "ß": "ss", 6 | "ä": "ae", 7 | "ö": "oe", 8 | "ü": "ue" 9 | } 10 | -------------------------------------------------------------------------------- /public/site/plugins/hero/snippets/colorhero.php: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | -------------------------------------------------------------------------------- /public/content/site.txt: -------------------------------------------------------------------------------- 1 | Title: Forge 2 | 3 | ---- 4 | 5 | Menu: 6 | 7 | - 8 | link: 9 | type: page 10 | value: home 11 | - 12 | link: 13 | type: page 14 | value: about -------------------------------------------------------------------------------- /public/kirby/i18n/rules/da.json: -------------------------------------------------------------------------------- 1 | { 2 | "Æ": "Ae", 3 | "æ": "ae", 4 | "Ø": "Oe", 5 | "ø": "oe", 6 | "Å": "Aa", 7 | "å": "aa", 8 | "É": "E", 9 | "é": "e" 10 | } 11 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/uk.json: -------------------------------------------------------------------------------- 1 | { 2 | "Ґ": "G", 3 | "І": "I", 4 | "Ї": "Ji", 5 | "Є": "Ye", 6 | "ґ": "g", 7 | "і": "i", 8 | "ї": "ji", 9 | "є": "ye" 10 | } 11 | -------------------------------------------------------------------------------- /public/kirby/config/blocks/code/code.php: -------------------------------------------------------------------------------- 1 | 2 |
code()->html(false) ?>
3 | -------------------------------------------------------------------------------- /config/rsync_exclude.txt: -------------------------------------------------------------------------------- 1 | .git 2 | .gitignore 3 | .DS_Store 4 | .well-known 5 | .user.ini 6 | php.ini 7 | error_log 8 | fonts.txt 9 | cgi-bin 10 | site/sessions 11 | site/cache 12 | .lock 13 | .cache 14 | -------------------------------------------------------------------------------- /public/kirby/config/blocks/list/list.yml: -------------------------------------------------------------------------------- 1 | name: field.blocks.list.name 2 | icon: list-bullet 3 | wysiwyg: true 4 | preview: list 5 | fields: 6 | text: 7 | label: field.blocks.list.name 8 | type: list 9 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/hr.json: -------------------------------------------------------------------------------- 1 | { 2 | "Č": "C", 3 | "Ć": "C", 4 | "Ž": "Z", 5 | "Š": "S", 6 | "Đ": "Dj", 7 | "č": "c", 8 | "ć": "c", 9 | "ž": "z", 10 | "š": "s", 11 | "đ": "dj" 12 | } -------------------------------------------------------------------------------- /public/site/config/config.php: -------------------------------------------------------------------------------- 1 | true, 6 | 7 | // Cache Buster 8 | 'schnti.cachebuster.active' => false, 9 | 10 | 11 | ]; 12 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/it.json: -------------------------------------------------------------------------------- 1 | { 2 | "À": "a", 3 | "È": "e", 4 | "Ì": "i", 5 | "Ò": "o", 6 | "Ù": "u", 7 | "à": "a", 8 | "é": "e", 9 | "è": "e", 10 | "ì": "i", 11 | "ò": "o", 12 | "ù": "u" 13 | } 14 | -------------------------------------------------------------------------------- /public/site/blueprints/pages/default.yml: -------------------------------------------------------------------------------- 1 | title: Default 2 | 3 | tabs: 4 | 5 | # CONTENT 6 | content: tabs/content 7 | 8 | # SEO 9 | seo: tabs/seo/meta 10 | 11 | # PAGE FILES 12 | files: tabs/files 13 | -------------------------------------------------------------------------------- /public/site/blueprints/pages/error.yml: -------------------------------------------------------------------------------- 1 | title: Error 2 | 3 | tabs: 4 | 5 | # CONTENT 6 | content: tabs/content 7 | 8 | # SEO 9 | seo: tabs/seo/meta 10 | 11 | # PAGE FILES 12 | files: tabs/files 13 | -------------------------------------------------------------------------------- /public/site/controllers/error.php: -------------------------------------------------------------------------------- 1 | controller('seo' , compact('page', 'site', 'kirby')); 7 | 8 | 9 | return $seo; 10 | }; 11 | -------------------------------------------------------------------------------- /src/sass/06-components/_components.middle.scss: -------------------------------------------------------------------------------- 1 | // ====================================================================== 2 | // 06-components - Middle 3 | // ====================================================================== 4 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/et.json: -------------------------------------------------------------------------------- 1 | { 2 | "Š": "S", 3 | "Ž": "Z", 4 | "Õ": "O", 5 | "Ä": "A", 6 | "Ö": "O", 7 | "Ü": "U", 8 | "š": "s", 9 | "ž": "z", 10 | "õ": "o", 11 | "ä": "a", 12 | "ö": "o", 13 | "ü": "u" 14 | } -------------------------------------------------------------------------------- /public/kirby/config/blocks/text/text.yml: -------------------------------------------------------------------------------- 1 | name: field.blocks.text.name 2 | icon: text 3 | wysiwyg: true 4 | preview: text 5 | fields: 6 | text: 7 | type: writer 8 | nodes: false 9 | placeholder: field.blocks.text.placeholder 10 | -------------------------------------------------------------------------------- /public/kirby/config/templates/emails/auth/login.php: -------------------------------------------------------------------------------- 1 | 2 |
3 | 10 |
11 | -------------------------------------------------------------------------------- /public/kirby/config/templates.php: -------------------------------------------------------------------------------- 1 | __DIR__ . '/templates/emails/auth/login.php', 6 | 'emails/auth/password-reset' => __DIR__ . '/templates/emails/auth/password-reset.php' 7 | ]; 8 | // @codeCoverageIgnoreEnd 9 | -------------------------------------------------------------------------------- /src/sass/04-elements/_elements.buttons.scss: -------------------------------------------------------------------------------- 1 | // ====================================================================== 2 | // 04-elements - Buttons 3 | // ====================================================================== 4 | 5 | .btn { 6 | @include button; 7 | box-sizing: border-box; 8 | } 9 | -------------------------------------------------------------------------------- /public/kirby/config/blocks/quote/quote.php: -------------------------------------------------------------------------------- 1 | 2 |
3 | text() ?> 4 | citation()->isNotEmpty()): ?> 5 | 8 | 9 |
10 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/az.json: -------------------------------------------------------------------------------- 1 | { 2 | "Ə": "E", 3 | "Ç": "C", 4 | "Ğ": "G", 5 | "İ": "I", 6 | "Ş": "S", 7 | "Ö": "O", 8 | "Ü": "U", 9 | "ə": "e", 10 | "ç": "c", 11 | "ğ": "g", 12 | "ı": "i", 13 | "ş": "s", 14 | "ö": "o", 15 | "ü": "u" 16 | } 17 | -------------------------------------------------------------------------------- /mix-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "/public/assets/js/site.js": "/public/assets/js/site.js", 3 | "/public/assets/css/site.css": "/public/assets/css/site.css", 4 | "/public/assets/fonts/fonts.txt": "/public/assets/fonts/fonts.txt", 5 | "/public/assets/images/Logo.svg": "/public/assets/images/Logo.svg" 6 | } 7 | -------------------------------------------------------------------------------- /public/site/plugins/cachebuster/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | ## IDE and system 3 | .DS_Store 4 | .idea 5 | .project 6 | .settings 7 | config.codekit 8 | 9 | ## libs 10 | /bower_components/ 11 | /node_modules/ 12 | 13 | ## kirby 14 | /website/panel/ 15 | /website/kirby/ 16 | /website/site/cache/ 17 | /website/thumbs/ -------------------------------------------------------------------------------- /public/kirby/SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | Please see the [Security Policy on the Kirby website](https://getkirby.com/security) for a list of the currently supported Kirby versions and of past security incidents as well as for information on how to report security vulnerabilities in the Kirby core or in the Panel. 4 | -------------------------------------------------------------------------------- /public/kirby/src/Parsley/Schema.php: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/sass/04-elements/_elements.body.scss: -------------------------------------------------------------------------------- 1 | // ====================================================================== 2 | // 04-elements - Body 3 | // ====================================================================== 4 | 5 | body { 6 | padding: 0; 7 | margin: 0; 8 | background-color: #eee; 9 | height: 100%; 10 | } 11 | -------------------------------------------------------------------------------- /public/kirby/config/blocks/markdown/markdown.yml: -------------------------------------------------------------------------------- 1 | name: field.blocks.markdown.name 2 | icon: markdown 3 | preview: markdown 4 | wysiwyg: true 5 | fields: 6 | text: 7 | label: field.blocks.markdown.label 8 | placeholder: field.blocks.markdown.placeholder 9 | type: textarea 10 | buttons: false 11 | font: monospace 12 | -------------------------------------------------------------------------------- /src/sass/05-objects/_objects.wrapper.scss: -------------------------------------------------------------------------------- 1 | // ====================================================================== 2 | // 05-objects - Wrapper 3 | // ====================================================================== 4 | 5 | .wrapper { 6 | min-height: 100%; 7 | display: grid; 8 | grid-template-rows: auto 1fr auto; 9 | } 10 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/hu.json: -------------------------------------------------------------------------------- 1 | { 2 | "Á": "a", 3 | "É": "e", 4 | "Í": "i", 5 | "Ó": "o", 6 | "Ö": "o", 7 | "Ő": "o", 8 | "Ú": "u", 9 | "Ü": "u", 10 | "Ű": "u", 11 | "á": "a", 12 | "é": "e", 13 | "í": "i", 14 | "ó": "o", 15 | "ö": "o", 16 | "ő": "o", 17 | "ú": "u", 18 | "ü": "u", 19 | "ű": "u" 20 | } 21 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/lv.json: -------------------------------------------------------------------------------- 1 | { 2 | "Ā": "A", 3 | "Ē": "E", 4 | "Ģ": "G", 5 | "Ī": "I", 6 | "Ķ": "K", 7 | "Ļ": "L", 8 | "Ņ": "N", 9 | "Ū": "U", 10 | "ā": "a", 11 | "ē": "e", 12 | "ģ": "g", 13 | "ī": "i", 14 | "ķ": "k", 15 | "ļ": "l", 16 | "ņ": "n", 17 | "ū": "u" 18 | } 19 | -------------------------------------------------------------------------------- /public/kirby/config/blocks/video/video.php: -------------------------------------------------------------------------------- 1 | 2 | url()->isNotEmpty()): ?> 3 |
4 | url()) ?> 5 | caption()->isNotEmpty()): ?> 6 |
caption() ?>
7 | 8 |
9 | 10 | -------------------------------------------------------------------------------- /public/kirby/config/fields/mixins/userpicker.php: -------------------------------------------------------------------------------- 1 | [ 7 | 'userpicker' => function (array $params = []) { 8 | $params['model'] = $this->model(); 9 | 10 | return (new UserPicker($params))->toArray(); 11 | } 12 | ] 13 | ]; 14 | -------------------------------------------------------------------------------- /public/kirby/src/Form/Mixin/Max.php: -------------------------------------------------------------------------------- 1 | max; 12 | } 13 | 14 | protected function setMax(int $max = null) 15 | { 16 | $this->max = $max; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /public/kirby/src/Form/Mixin/Min.php: -------------------------------------------------------------------------------- 1 | min; 12 | } 13 | 14 | protected function setMin(int $min = null) 15 | { 16 | $this->min = $min; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /public/site/plugins/hero/snippets/herocontent.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 |
7 |

8 | 9 |
10 | 11 |
12 | 13 |
14 | -------------------------------------------------------------------------------- /src/sass/04-elements/_elements.media.scss: -------------------------------------------------------------------------------- 1 | // ====================================================================== 2 | // 04-elements - Media 3 | // ====================================================================== 4 | 5 | figure { 6 | padding: 0; 7 | margin: 0; 8 | } 9 | 10 | img { 11 | width: 100%; 12 | height: auto; 13 | } 14 | -------------------------------------------------------------------------------- /public/kirby/config/blocks/video/video.yml: -------------------------------------------------------------------------------- 1 | name: field.blocks.video.name 2 | icon: video 3 | preview: video 4 | fields: 5 | url: 6 | label: field.blocks.video.url.label 7 | type: url 8 | placeholder: field.blocks.video.url.placeholder 9 | caption: 10 | label: field.blocks.video.caption 11 | type: writer 12 | inline: true 13 | -------------------------------------------------------------------------------- /public/site/templates/home.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 |

title() ?>

10 | pagetext()->kt() ?> 11 |
12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/sass/02-tools/_tools.media.scss: -------------------------------------------------------------------------------- 1 | // ====================================================================== 2 | // 02-tools - Media 3 | // ====================================================================== 4 | 5 | %fluidimg { 6 | width: 100%; 7 | height: auto; 8 | } 9 | 10 | %embed { 11 | @include ioe; 12 | margin: 0 0 rem(24px); 13 | } 14 | -------------------------------------------------------------------------------- /public/kirby/config/sections/mixins/layout.php: -------------------------------------------------------------------------------- 1 | [ 5 | /** 6 | * Section layout. Available layout methods: `list`, `cards`. 7 | */ 8 | 'layout' => function (string $layout = 'list') { 9 | return $layout === 'cards' ? 'cards' : 'list'; 10 | } 11 | ] 12 | ]; 13 | -------------------------------------------------------------------------------- /public/site/templates/default.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 |

title() ?>

10 | pagetext()->kt() ?> 11 |
12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /public/site/templates/error.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 |

title() ?>

10 | pagetext()->kt() ?> 11 |
12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/cs.json: -------------------------------------------------------------------------------- 1 | { 2 | "Č": "C", 3 | "Ď": "D", 4 | "Ě": "E", 5 | "Ň": "N", 6 | "Ř": "R", 7 | "Š": "S", 8 | "Ť": "T", 9 | "Ů": "U", 10 | "Ž": "Z", 11 | "č": "c", 12 | "ď": "d", 13 | "ě": "e", 14 | "ň": "n", 15 | "ř": "r", 16 | "š": "s", 17 | "ť": "t", 18 | "ů": "u", 19 | "ž": "z" 20 | } 21 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/lt.json: -------------------------------------------------------------------------------- 1 | { 2 | "Ą": "A", 3 | "Č": "C", 4 | "Ę": "E", 5 | "Ė": "E", 6 | "Į": "I", 7 | "Š": "S", 8 | "Ų": "U", 9 | "Ū": "U", 10 | "Ž": "Z", 11 | "ą": "a", 12 | "č": "c", 13 | "ę": "e", 14 | "ė": "e", 15 | "į": "i", 16 | "š": "s", 17 | "ų": "u", 18 | "ū": "u", 19 | "ž": "z" 20 | } 21 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/pl.json: -------------------------------------------------------------------------------- 1 | { 2 | "Ą": "A", 3 | "Ć": "C", 4 | "Ę": "E", 5 | "Ł": "L", 6 | "Ń": "N", 7 | "Ó": "O", 8 | "Ś": "S", 9 | "Ź": "Z", 10 | "Ż": "Z", 11 | "ą": "a", 12 | "ć": "c", 13 | "ę": "e", 14 | "ł": "l", 15 | "ń": "n", 16 | "ó": "o", 17 | "ś": "s", 18 | "ź": "z", 19 | "ż": "z" 20 | } 21 | -------------------------------------------------------------------------------- /public/site/blueprints/tabs/content.yml: -------------------------------------------------------------------------------- 1 | label: Content 2 | icon: text 3 | 4 | columns: 5 | # CONTENT 6 | left: 7 | width: 3/3 8 | sections: 9 | # FIELDS 10 | content: 11 | type: fields 12 | fields: 13 | pagetext: 14 | label: Content 15 | type: textarea 16 | -------------------------------------------------------------------------------- /public/site/snippets/global/htmlhead.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /public/site/controllers/default.php: -------------------------------------------------------------------------------- 1 | controller('seo' , compact('page', 'site', 'kirby')); 7 | 8 | // Override Meta Title 9 | $metatitle = $page->seotitle().' | '.$site->title(); 10 | 11 | $data = compact('metatitle'); 12 | 13 | return array_merge($seo, $data); 14 | 15 | }; 16 | -------------------------------------------------------------------------------- /public/kirby/config/fields/mixins/filepicker.php: -------------------------------------------------------------------------------- 1 | [ 7 | 'filepicker' => function (array $params = []) { 8 | // fetch the parent model 9 | $params['model'] = $this->model(); 10 | 11 | return (new FilePicker($params))->toArray(); 12 | } 13 | ] 14 | ]; 15 | -------------------------------------------------------------------------------- /public/kirby/config/fields/mixins/pagepicker.php: -------------------------------------------------------------------------------- 1 | [ 7 | 'pagepicker' => function (array $params = []) { 8 | // inject the current model 9 | $params['model'] = $this->model(); 10 | 11 | return (new PagePicker($params))->toArray(); 12 | } 13 | ] 14 | ]; 15 | -------------------------------------------------------------------------------- /public/kirby/router.php: -------------------------------------------------------------------------------- 1 | " > 2 |
class="hero-media image "> 3 | [1920, 1140, 768], 'src' => $heroimage, 'type' => 'jpg', 'class' => 'slide-wrapper', 'width' => 1920, 'height' => 1200]); ?> 4 |
5 | 6 | 7 | -------------------------------------------------------------------------------- /public/kirby/src/Form/Mixin/EmptyState.php: -------------------------------------------------------------------------------- 1 | empty = $this->i18n($empty); 12 | } 13 | 14 | public function empty(): ?string 15 | { 16 | return $this->stringTemplate($this->empty); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /public/kirby/config/blocks/gallery/gallery.yml: -------------------------------------------------------------------------------- 1 | name: field.blocks.gallery.name 2 | icon: dashboard 3 | preview: gallery 4 | fields: 5 | images: 6 | label: field.blocks.gallery.images.label 7 | type: files 8 | multiple: true 9 | layout: cards 10 | size: tiny 11 | empty: field.blocks.gallery.images.empty 12 | uploads: 13 | template: blocks/image 14 | image: 15 | ratio: 1/1 16 | -------------------------------------------------------------------------------- /public/kirby/config/fields/list.php: -------------------------------------------------------------------------------- 1 | [ 5 | /** 6 | * Sets the allowed HTML formats. Available formats: `bold`, `italic`, `underline`, `strike`, `code`, `link`. Activate them all by passing `true`. Deactivate them all by passing `false` 7 | */ 8 | 'marks' => function ($marks = true) { 9 | return $marks; 10 | } 11 | ] 12 | ]; 13 | -------------------------------------------------------------------------------- /public/kirby/panel/dist/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | -------------------------------------------------------------------------------- /public/kirby/src/Http/Exceptions/NextRouteException.php: -------------------------------------------------------------------------------- 1 | 10 | * @link https://getkirby.com 11 | * @copyright Bastian Allgeier GmbH 12 | * @license https://opensource.org/licenses/MIT 13 | */ 14 | class NextRouteException extends \Exception 15 | { 16 | } 17 | -------------------------------------------------------------------------------- /public/site/plugins/hero/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hashandsalt/hero", 3 | "description": "Plugin for creating Hero Banners", 4 | "type": "kirby-plugin", 5 | "license": "MIT", 6 | "authors": [{ 7 | "name": "James Steel", 8 | "email": "hello@hashandsalt.com" 9 | }], 10 | 11 | "require": { 12 | "getkirby/composer-installer": "^1.1" 13 | }, 14 | "config": { 15 | "optimize-autoloader": true 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /public/kirby/src/Cms/FilePermissions.php: -------------------------------------------------------------------------------- 1 | 10 | * @link https://getkirby.com 11 | * @copyright Bastian Allgeier GmbH 12 | * @license https://getkirby.com/license 13 | */ 14 | class FilePermissions extends ModelPermissions 15 | { 16 | protected $category = 'files'; 17 | } 18 | -------------------------------------------------------------------------------- /public/kirby/src/Cms/SitePermissions.php: -------------------------------------------------------------------------------- 1 | 10 | * @link https://getkirby.com 11 | * @copyright Bastian Allgeier GmbH 12 | * @license https://getkirby.com/license 13 | */ 14 | class SitePermissions extends ModelPermissions 15 | { 16 | protected $category = 'site'; 17 | } 18 | -------------------------------------------------------------------------------- /public/site/plugins/autoresize/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "medienbaecker/autoresize", 3 | "description": "Kirby Autoresize Plugin", 4 | "type": "kirby-plugin", 5 | "license": "MIT", 6 | "authors": [ 7 | { 8 | "name": "Thomas Günther", 9 | "email": "mail@medienbaecker.com", 10 | "homepage": "https://www.medienbaecker.com" 11 | } 12 | ], 13 | "require": { 14 | "getkirby/composer-installer": "^1.1" 15 | } 16 | } -------------------------------------------------------------------------------- /public/kirby/src/Cms/LayoutColumns.php: -------------------------------------------------------------------------------- 1 | 10 | * @link https://getkirby.com 11 | * @copyright Bastian Allgeier GmbH 12 | * @license https://getkirby.com/license 13 | */ 14 | class LayoutColumns extends Items 15 | { 16 | const ITEM_CLASS = '\Kirby\Cms\LayoutColumn'; 17 | } 18 | -------------------------------------------------------------------------------- /public/site/plugins/focus/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flokosiol/focus", 3 | "description": "Better image cropping for Kirby CMS", 4 | "version": "3.0.5", 5 | "type": "kirby-plugin", 6 | "license": "MIT", 7 | "authors": [ 8 | { 9 | "name": "Flo Kosiol", 10 | "email": "git@flokosiol.de" 11 | } 12 | ], 13 | "require": { 14 | "getkirby/composer-installer": "^1.1" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /public/site/plugins/kirby3-seo/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hashandsalt/kirby3-slate", 3 | "description": "Kirby 3 plugin for the Slate Framework", 4 | "type": "kirby-plugin", 5 | "license": "MIT", 6 | "authors": [{ 7 | "name": "James Steel", 8 | "email": "hello@hashandsalt.com" 9 | }], 10 | 11 | "require": { 12 | "getkirby/composer-installer": "^1.1" 13 | }, 14 | "config": { 15 | "optimize-autoloader": true 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /public/kirby/config/blueprints/blocks/heading.yml: -------------------------------------------------------------------------------- 1 | icon: title 2 | fields: 3 | text: 4 | type: text 5 | level: 6 | type: select 7 | width: 1/2 8 | default: 1 9 | empty: false 10 | default: "2" 11 | options: 12 | - value: "1" 13 | text: Heading 1 14 | - value: "2" 15 | text: Heading 2 16 | - value: "3" 17 | text: Heading 3 18 | id: 19 | type: text 20 | label: ID 21 | width: 1/2 22 | -------------------------------------------------------------------------------- /public/kirby/views/php.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |

4 | This page is currently offline. We are very sorry for the inconvenience and will fix it as soon as possible. 5 |

6 |

7 | Advice for developers and administrators:
8 | Change the PHP version to 7.3, 7.4 or 8.0 (PHP 7.4 is recommended) 9 |

10 | 11 | 12 | -------------------------------------------------------------------------------- /public/site/plugins/link-field/languages/de.php: -------------------------------------------------------------------------------- 1 | 'URL', 5 | 'page' => 'Seite', 6 | 'file' => 'Datei', 7 | 'email' => 'E-Mail', 8 | 'tel' => 'Telefon', 9 | 'label.text' => 'Text', 10 | 'label.popup' => 'Popup', 11 | 'label.fragment' => 'Anker', 12 | 'label.settings' => 'Einstellungen', 13 | 'label.close' => 'Schließen', 14 | 'placeholder.elementid' => 'Anker-ID', 15 | 'error.type' => 'Falscher Feld-Typ: {type}' 16 | ]; 17 | -------------------------------------------------------------------------------- /src/fonts/fonts.txt: -------------------------------------------------------------------------------- 1 | // ====================================================================== 2 | // kirbykit.dev hello@hashandsalt.com 3 | // ====================================================================== 4 | // 5 | // ====================================================================== 6 | // Fonts 7 | // ====================================================================== 8 | 9 | Drop your font files in here, but pay attention to the font license! 10 | -------------------------------------------------------------------------------- /public/site/plugins/link-field/languages/en.php: -------------------------------------------------------------------------------- 1 | 'URL', 5 | 'page' => 'Page', 6 | 'file' => 'File', 7 | 'email' => 'Email', 8 | 'tel' => 'Phone', 9 | 'label.text' => 'Text', 10 | 'label.popup' => 'Popup', 11 | 'label.fragment' => 'Fragment', 12 | 'label.settings' => 'Settings', 13 | 'label.close' => 'Close', 14 | 'placeholder.elementid' => 'Element ID', 15 | 'error.type' => 'Invalid field type: {type}' 16 | ]; 17 | -------------------------------------------------------------------------------- /public/assets/fonts/fonts.txt: -------------------------------------------------------------------------------- 1 | // ====================================================================== 2 | // kirbykit.dev hello@hashandsalt.com 3 | // ====================================================================== 4 | // 5 | // ====================================================================== 6 | // Fonts 7 | // ====================================================================== 8 | 9 | Drop your font files in here, but pay attention to the font license! 10 | -------------------------------------------------------------------------------- /public/site/controllers/home.php: -------------------------------------------------------------------------------- 1 | controller('seo' , compact('page', 'site', 'kirby')); 7 | 8 | // Hero 9 | $hero = $kirby->controller('hero', compact('page', 'site', 'kirby')); 10 | 11 | // Override Meta Title 12 | $metatitle = $page->seotitle().' | '.$site->title(); 13 | 14 | $data = compact('metatitle'); 15 | 16 | return array_merge($seo, $hero, $data); 17 | 18 | }; 19 | -------------------------------------------------------------------------------- /public/site/plugins/kirby3-schema/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hashandsalt/kirby3-schema", 3 | "description": "Kirby 3 - Schema", 4 | "type": "kirby-plugin", 5 | "license": "MIT", 6 | "authors": [{ 7 | "name": "James Steel", 8 | "email": "hello@hashandsalt.com" 9 | }], 10 | 11 | "require": { 12 | "getkirby/composer-installer": "^1.1", 13 | "spatie/schema-org": "^2.8" 14 | }, 15 | "config": { 16 | "optimize-autoloader": true 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /public/site/plugins/kirby3-seo/blueprints/fields/meta.yml: -------------------------------------------------------------------------------- 1 | type: group 2 | fields: 3 | 4 | seotitle: 5 | label: SEO Title 6 | type: text 7 | icon: font 8 | width: 1/2 9 | required: true 10 | seotags: 11 | label: Keywords 12 | type: tags 13 | width: 1/2 14 | seometa: 15 | label: Meta Description 16 | type: textarea 17 | size: small 18 | required: true 19 | -------------------------------------------------------------------------------- /public/site/plugins/kirby3-webp/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hashandsalt/kirby3-webp", 3 | "description": "Kirby 3 WebP plugin", 4 | "type": "kirby-plugin", 5 | "license": "MIT", 6 | "authors": [{ 7 | "name": "James Steel", 8 | "email": "hello@hashandsalt.com" 9 | }], 10 | "require": { 11 | "getkirby/composer-installer": "^1.1", 12 | "rosell-dk/webp-convert": "^2.3" 13 | }, 14 | "config": { 15 | "optimize-autoloader": true 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /public/content/error/error.txt: -------------------------------------------------------------------------------- 1 | Title: Error 2 | 3 | ---- 4 | 5 | Pagetext: Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum id ligula porta felis euismod semper. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cras mattis consectetur purus sit amet fermentum. 6 | 7 | ---- 8 | 9 | Seotitle: Error 10 | 11 | ---- 12 | 13 | Seotags: 14 | 15 | ---- 16 | 17 | Seometa: An error occured 18 | 19 | ---- 20 | 21 | Shareimage: -------------------------------------------------------------------------------- /public/site/plugins/focus/.editorconfig: -------------------------------------------------------------------------------- 1 | # This file is for unifying the coding style for different editors and IDEs 2 | # editorconfig.org 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | end_of_line = lf 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | 12 | [*.php] 13 | indent_size = 4 14 | 15 | [*.md,*.txt] 16 | trim_trailing_whitespace = false 17 | insert_final_newline = false 18 | 19 | [composer.json] 20 | indent_size = 4 21 | -------------------------------------------------------------------------------- /src/sass/05-objects/_objects.logo.scss: -------------------------------------------------------------------------------- 1 | // ====================================================================== 2 | // 05-objects - Logo 3 | // ====================================================================== 4 | 5 | .logo { 6 | a { 7 | display: block; 8 | width: rem(80px); 9 | height: rem(80px); 10 | } 11 | 12 | svg { 13 | width: 100%; 14 | height: 100%; 15 | } 16 | @include media(" 11 | * @link https://getkirby.com 12 | * @copyright Bastian Allgeier GmbH 13 | * @license https://opensource.org/licenses/MIT 14 | */ 15 | class Config extends Silo 16 | { 17 | /** 18 | * @var array 19 | */ 20 | public static $data = []; 21 | } 22 | -------------------------------------------------------------------------------- /public/assets/favicon/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "short_name": "", 4 | "icons": [ 5 | { 6 | "src": "android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "theme_color": "#222222", 17 | "background_color": "#222222", 18 | "display": "standalone" 19 | } 20 | -------------------------------------------------------------------------------- /public/site/plugins/hero/snippets/hero.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /public/kirby/config/sections/mixins/min.php: -------------------------------------------------------------------------------- 1 | [ 5 | /** 6 | * Sets the minimum number of required entries in the section 7 | */ 8 | 'min' => function (int $min = null) { 9 | return $min; 10 | } 11 | ], 12 | 'methods' => [ 13 | 'validateMin' => function () { 14 | if ($this->min && $this->min > $this->total) { 15 | return false; 16 | } 17 | 18 | return true; 19 | } 20 | ] 21 | ]; 22 | -------------------------------------------------------------------------------- /public/kirby/config/sections/mixins/empty.php: -------------------------------------------------------------------------------- 1 | [ 7 | /** 8 | * Sets the text for the empty state box 9 | */ 10 | 'empty' => function ($empty = null) { 11 | return I18n::translate($empty, $empty); 12 | } 13 | ], 14 | 'computed' => [ 15 | 'empty' => function () { 16 | if ($this->empty) { 17 | return $this->model()->toString($this->empty); 18 | } 19 | } 20 | ] 21 | ]; 22 | -------------------------------------------------------------------------------- /public/kirby/views/fatal.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |

4 | This page is currently offline due to an unexpected error. We are very sorry for the inconvenience and will fix it as soon as possible. 5 |

6 |

7 | Advice for developers and administrators:
8 | Enable debug mode to get further information about the error. 9 |

10 | 11 | 12 | -------------------------------------------------------------------------------- /public/kirby/config/blocks/heading/heading.yml: -------------------------------------------------------------------------------- 1 | name: field.blocks.heading.name 2 | icon: title 3 | wysiwyg: true 4 | preview: heading 5 | fields: 6 | level: 7 | label: field.blocks.heading.level 8 | type: select 9 | empty: false 10 | default: "h2" 11 | width: 1/6 12 | options: 13 | - h1 14 | - h2 15 | - h3 16 | - h4 17 | - h5 18 | - h6 19 | text: 20 | label: field.blocks.heading.text 21 | type: writer 22 | inline: true 23 | width: 5/6 24 | placeholder: field.blocks.heading.placeholder 25 | -------------------------------------------------------------------------------- /public/site/blueprints/tabs/sitemenu.yml: -------------------------------------------------------------------------------- 1 | label: Menu 2 | icon: menu 3 | columns: 4 | # main 5 | menu: 6 | sections: 7 | 8 | # files 9 | sitemenu: 10 | type: fields 11 | fields: 12 | menu: 13 | label: Site Menu 14 | type: structure 15 | fields: 16 | link: 17 | type: link 18 | label: link 19 | options: 20 | - page 21 | - url 22 | -------------------------------------------------------------------------------- /public/kirby/config/blueprints/blocks/table.yml: -------------------------------------------------------------------------------- 1 | name: Table 2 | icon: menu 3 | fields: 4 | rows: 5 | label: Menu 6 | type: structure 7 | columns: 8 | dish: true 9 | description: true 10 | price: 11 | before: € 12 | width: 1/4 13 | align: right 14 | fields: 15 | dish: 16 | label: Dish 17 | type: text 18 | description: 19 | label: Description 20 | type: text 21 | price: 22 | label: Price 23 | type: number 24 | before: € 25 | step: 0.01 26 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "À": "A", 3 | "Â": "A", 4 | "Æ": "AE", 5 | "Ç": "C", 6 | "É": "E", 7 | "È": "E", 8 | "Ê": "E", 9 | "Ë": "E", 10 | "Ï": "I", 11 | "Î": "I", 12 | "Ô": "O", 13 | "Œ": "OE", 14 | "Ù": "U", 15 | "Û": "U", 16 | "Ü": "U", 17 | "à": "a", 18 | "â": "a", 19 | "æ": "ae", 20 | "ç": "c", 21 | "é": "e", 22 | "è": "e", 23 | "ê": "e", 24 | "ë": "e", 25 | "ï": "i", 26 | "î": "i", 27 | "ô": "o", 28 | "œ": "oe", 29 | "ù": "u", 30 | "û": "u", 31 | "ü": "u", 32 | "ÿ": "y", 33 | "Ÿ": "Y" 34 | } 35 | -------------------------------------------------------------------------------- /public/site/plugins/entity-field/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "oblik/kirby-entity-field", 3 | "description": "Kirby field that acts as a one-entry structure.", 4 | "type": "kirby-plugin", 5 | "license": "MIT", 6 | "authors": [ 7 | { 8 | "name": "Hristiyan Dodov", 9 | "email": "h.dodov@gmail.com" 10 | } 11 | ], 12 | "require": { 13 | "getkirby/composer-installer": "^1.1", 14 | "getkirby/cms": "^3.3" 15 | }, 16 | "extra": { 17 | "installer-name": "entity-field" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/sass/06-components/_components.siteheader.scss: -------------------------------------------------------------------------------- 1 | // ====================================================================== 2 | // 06-components - Site Header 3 | // ====================================================================== 4 | 5 | .header { 6 | @include container; 7 | display: grid; 8 | grid-template-columns: 1fr 2fr; 9 | @include media(" 2 |
class="hero-media slides "> 3 |
4 | 5 |
6 | [1920, 1140, 768], 'src' => $slide, 'type' => 'jpg', 'class' => 'slide-wrapper', 'width' => 920, 'height' => 720]); ?> 7 |
8 | 9 |
10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /public/assets/favicon/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | #222222 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/ar.json: -------------------------------------------------------------------------------- 1 | { 2 | "أ" : "a", 3 | "ب" : "b", 4 | "ت" : "t", 5 | "ث" : "th", 6 | "ج" : "g", 7 | "ح" : "h", 8 | "خ" : "kh", 9 | "د" : "d", 10 | "ذ" : "th", 11 | "ر" : "r", 12 | "ز" : "z", 13 | "س" : "s", 14 | "ش" : "sh", 15 | "ص" : "s", 16 | "ض" : "d", 17 | "ط" : "t", 18 | "ظ" : "th", 19 | "ع" : "aa", 20 | "غ" : "gh", 21 | "ف" : "f", 22 | "ق" : "k", 23 | "ك" : "k", 24 | "ل" : "l", 25 | "م" : "m", 26 | "ن" : "n", 27 | "ه" : "h", 28 | "و" : "o", 29 | "ي" : "y" 30 | } 31 | -------------------------------------------------------------------------------- /public/site/plugins/hero/snippets/videohero.php: -------------------------------------------------------------------------------- 1 |
2 |
3 |
> 4 | 8 |
9 |
10 | 11 |
12 | -------------------------------------------------------------------------------- /src/sass/01-settings/_settings.core.scss: -------------------------------------------------------------------------------- 1 | // ====================================================================== 2 | // Slate Core Config | hello@hashandsalt.com 3 | // ====================================================================== 4 | 5 | // Core 6 | /// Media Embed - 16:9 ratio 7 | /// @group Media 8 | $ioe-padding: ((100 / 16) * 9); 9 | 10 | /// Base Value For REM calculations 11 | /// @group Type 12 | $rem-base: 16px; 13 | 14 | /// REM Fallback 15 | /// @group REM Calc 16 | $rem-fallback: false; 17 | 18 | /// PX units only 19 | /// @group REM Calc 20 | $rem-px-only: false; 21 | -------------------------------------------------------------------------------- /public/.editorconfig: -------------------------------------------------------------------------------- 1 | [*.{css,scss,less,js,json,ts,sass,html,hbs,mustache,phtml,html.twig,md,yml}] 2 | charset = utf-8 3 | indent_style = space 4 | indent_size = 2 5 | end_of_line = lf 6 | insert_final_newline = true 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | 10 | [*.md] 11 | indent_size = 4 12 | trim_trailing_whitespace = false 13 | 14 | [site/templates/**.php] 15 | indent_size = 2 16 | 17 | [site/snippets/**.php] 18 | indent_size = 2 19 | 20 | [package.json,.{babelrc,editorconfig,eslintrc,lintstagedrc,stylelintrc}] 21 | indent_style = space 22 | indent_size = 2 23 | -------------------------------------------------------------------------------- /public/kirby/src/Cms/R.php: -------------------------------------------------------------------------------- 1 | 12 | * @link https://getkirby.com 13 | * @copyright Bastian Allgeier GmbH 14 | * @license https://getkirby.com/license 15 | */ 16 | class R extends Facade 17 | { 18 | /** 19 | * @return \Kirby\Http\Request 20 | */ 21 | public static function instance() 22 | { 23 | return App::instance()->request(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /public/kirby/src/Cms/S.php: -------------------------------------------------------------------------------- 1 | 12 | * @link https://getkirby.com 13 | * @copyright Bastian Allgeier GmbH 14 | * @license https://getkirby.com/license 15 | */ 16 | class S extends Facade 17 | { 18 | /** 19 | * @return \Kirby\Session\Session 20 | */ 21 | public static function instance() 22 | { 23 | return App::instance()->session(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /public/site/plugins/cachebuster/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "schnti/cachebuster", 3 | "description": "Kirby 3 Cachebuster Plugin", 4 | "license": "MIT", 5 | "authors": [ 6 | { 7 | "name": "Timo Schneider", 8 | "email": "info@kleiner-als.de", 9 | "homepage": "https://kleiner-als.de" 10 | } 11 | ], 12 | "type": "kirby-plugin", 13 | "keywords": [ 14 | "kirby3", 15 | "kirby3-cms", 16 | "kirby3-plugin" 17 | ], 18 | "require": { 19 | "getkirby/composer-installer": "^1.1" 20 | }, 21 | "extra": { 22 | "installer-name": "cachebuster" 23 | } 24 | } -------------------------------------------------------------------------------- /public/kirby/config/fields/mixins/min.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'min' => function () { 6 | // set min to at least 1, if required 7 | if ($this->required === true) { 8 | return $this->min ?? 1; 9 | } 10 | 11 | return $this->min; 12 | }, 13 | 'required' => function () { 14 | // set required to true if min is set 15 | if ($this->min) { 16 | return true; 17 | } 18 | 19 | return $this->required; 20 | } 21 | ] 22 | ]; 23 | -------------------------------------------------------------------------------- /public/kirby/src/Cms/Visitor.php: -------------------------------------------------------------------------------- 1 | 12 | * @link https://getkirby.com 13 | * @copyright Bastian Allgeier GmbH 14 | * @license https://getkirby.com/license 15 | */ 16 | class Visitor extends Facade 17 | { 18 | /** 19 | * @return \Kirby\Http\Visitor 20 | */ 21 | public static function instance() 22 | { 23 | return App::instance()->visitor(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /public/site/plugins/autoresize/README.md: -------------------------------------------------------------------------------- 1 | # Autoresize for Kirby 3 2 | 3 | Automatically resize images on upload. 4 | 5 | ![Resizing a huge image](https://user-images.githubusercontent.com/7975568/51390756-73ff4480-1b30-11e9-913d-7c6ba78fb7bd.gif) 6 | 7 | ## Options 8 | 9 | ```php 10 | return [ 11 | 'medienbaecker.autoresize.maxWidth' => 2000, 12 | 'medienbaecker.autoresize.maxHeight' => 2000, 13 | 'medienbaecker.autoresize.excludeTemplates' => [ 14 | 'home', 15 | 'project' 16 | ], 17 | 'medienbaecker.autoresize.excludePages' => [ 18 | 'projects/project-a' 19 | ], 20 | ]; 21 | ``` 22 | -------------------------------------------------------------------------------- /public/kirby/src/Exception/NotFoundException.php: -------------------------------------------------------------------------------- 1 | 11 | * @link https://getkirby.com 12 | * @copyright Bastian Allgeier GmbH 13 | * @license https://opensource.org/licenses/MIT 14 | */ 15 | class NotFoundException extends Exception 16 | { 17 | protected static $defaultKey = 'notFound'; 18 | protected static $defaultFallback = 'Not found'; 19 | protected static $defaultHttpCode = 404; 20 | } 21 | -------------------------------------------------------------------------------- /public/kirby/config/sections/mixins/help.php: -------------------------------------------------------------------------------- 1 | [ 7 | /** 8 | * Sets the help text 9 | */ 10 | 'help' => function ($help = null) { 11 | return I18n::translate($help, $help); 12 | } 13 | ], 14 | 'computed' => [ 15 | 'help' => function () { 16 | if ($this->help) { 17 | $help = $this->model()->toString($this->help); 18 | $help = $this->kirby()->kirbytext($help); 19 | return $help; 20 | } 21 | } 22 | ] 23 | ]; 24 | -------------------------------------------------------------------------------- /public/site/plugins/entity-field/index.css: -------------------------------------------------------------------------------- 1 | .k-field-label[data-v-f9ca46]{padding-bottom:0}.k-structure-form[data-v-f9ca46]:not(.is-open){border-bottom:0;border-style:dashed;box-shadow:none}.k-structure-form.is-open .k-entity-header[data-v-f9ca46]{background:rgba(17,17,17,.025)}.k-entity-header{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1.5rem;border-bottom:1px dashed #ccc;user-select:none}.k-entity-header.is-clickable,.k-entity-header.is-clickable label{cursor:pointer}.k-entity-header-title{display:flex}.k-entity-header-title .k-icon{margin-right:.5rem}.k-structure-field[type=entity]>.k-field-header{display:none} -------------------------------------------------------------------------------- /public/kirby/config/api/routes/translations.php: -------------------------------------------------------------------------------- 1 | 'translations', 9 | 'method' => 'GET', 10 | 'auth' => false, 11 | 'action' => function () { 12 | return $this->kirby()->translations(); 13 | } 14 | ], 15 | [ 16 | 'pattern' => 'translations/(:any)', 17 | 'method' => 'GET', 18 | 'auth' => false, 19 | 'action' => function (string $code) { 20 | return $this->kirby()->translations()->find($code); 21 | } 22 | ] 23 | 24 | ]; 25 | -------------------------------------------------------------------------------- /public/kirby/config/fields/range.php: -------------------------------------------------------------------------------- 1 | 'number', 5 | 'props' => [ 6 | /** 7 | * Unset inherited props 8 | */ 9 | 'placeholder' => null, 10 | 11 | /** 12 | * The maximum value on the slider 13 | */ 14 | 'max' => function (float $max = 100) { 15 | return $max; 16 | }, 17 | /** 18 | * Enables/disables the tooltip and set the before and after values 19 | */ 20 | 'tooltip' => function ($tooltip = true) { 21 | return $tooltip; 22 | }, 23 | ] 24 | ]; 25 | -------------------------------------------------------------------------------- /public/kirby/config/fields/select.php: -------------------------------------------------------------------------------- 1 | 'radio', 5 | 'props' => [ 6 | /** 7 | * Unset inherited props 8 | */ 9 | 'columns' => null, 10 | 11 | /** 12 | * Custom icon to replace the arrow down. 13 | */ 14 | 'icon' => function (string $icon = null) { 15 | return $icon; 16 | }, 17 | /** 18 | * Custom placeholder string for empty option. 19 | */ 20 | 'placeholder' => function (string $placeholder = '—') { 21 | return $placeholder; 22 | }, 23 | ] 24 | ]; 25 | -------------------------------------------------------------------------------- /public/kirby/src/Exception/LogicException.php: -------------------------------------------------------------------------------- 1 | 11 | * @link https://getkirby.com 12 | * @copyright Bastian Allgeier GmbH 13 | * @license https://opensource.org/licenses/MIT 14 | */ 15 | class LogicException extends Exception 16 | { 17 | protected static $defaultKey = 'logic'; 18 | protected static $defaultFallback = 'This task cannot be finished'; 19 | protected static $defaultHttpCode = 400; 20 | } 21 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/ka.json: -------------------------------------------------------------------------------- 1 | { 2 | "ა": "a", 3 | "ბ": "b", 4 | "გ": "g", 5 | "დ": "d", 6 | "ე": "e", 7 | "ვ": "v", 8 | "ზ": "z", 9 | "თ": "t", 10 | "ი": "i", 11 | "კ": "k", 12 | "ლ": "l", 13 | "მ": "m", 14 | "ნ": "n", 15 | "ო": "o", 16 | "პ": "p", 17 | "ჟ": "zh", 18 | "რ": "r", 19 | "ს": "s", 20 | "ტ": "t", 21 | "უ": "u", 22 | "ფ": "f", 23 | "ქ": "k", 24 | "ღ": "gh", 25 | "ყ": "q", 26 | "შ": "sh", 27 | "ჩ": "ch", 28 | "ც": "ts", 29 | "ძ": "dz", 30 | "წ": "ts", 31 | "ჭ": "ch", 32 | "ხ": "kh", 33 | "ჯ": "j", 34 | "ჰ": "h" 35 | } 36 | -------------------------------------------------------------------------------- /public/kirby/src/Exception/ErrorPageException.php: -------------------------------------------------------------------------------- 1 | 12 | * @link https://getkirby.com 13 | * @copyright Bastian Allgeier GmbH 14 | * @license https://opensource.org/licenses/MIT 15 | */ 16 | class ErrorPageException extends Exception 17 | { 18 | protected static $defaultKey = 'errorPage'; 19 | protected static $defaultFallback = 'Triggered error page'; 20 | protected static $defaultHttpCode = 404; 21 | } 22 | -------------------------------------------------------------------------------- /public/kirby/src/Exception/DuplicateException.php: -------------------------------------------------------------------------------- 1 | 12 | * @link https://getkirby.com 13 | * @copyright Bastian Allgeier GmbH 14 | * @license https://opensource.org/licenses/MIT 15 | */ 16 | class DuplicateException extends Exception 17 | { 18 | protected static $defaultKey = 'duplicate'; 19 | protected static $defaultFallback = 'The entry exists'; 20 | protected static $defaultHttpCode = 400; 21 | } 22 | -------------------------------------------------------------------------------- /public/.gitignore: -------------------------------------------------------------------------------- 1 | # System files 2 | # ------------ 3 | 4 | Icon 5 | .DS_Store 6 | 7 | # Temporary files 8 | # --------------- 9 | 10 | /media/* 11 | !/media/index.html 12 | 13 | # -------------SECURITY------------- 14 | # NEVER publish these files via Git! 15 | # -------------SECURITY------------- 16 | 17 | # Cache Files 18 | # --------------- 19 | 20 | /site/cache/* 21 | !/site/cache/index.html 22 | 23 | # Accounts 24 | # --------------- 25 | 26 | /site/accounts/* 27 | !/site/accounts/index.html 28 | 29 | # Sessions 30 | # --------------- 31 | 32 | /site/sessions/* 33 | !/site/sessions/index.html 34 | 35 | # License 36 | # --------------- 37 | /site/config/.license 38 | -------------------------------------------------------------------------------- /src/sass/01-settings/_settings.colors.scss: -------------------------------------------------------------------------------- 1 | // ====================================================================== 2 | // Slate Colors | hello@hashandsalt.com 3 | // ====================================================================== 4 | 5 | // Basic 6 | $bright: #eee; 7 | $gray: #9f9f9f; 8 | $dark: #3c3c3c; 9 | $jet: #000; 10 | 11 | // Pallette 12 | $primary: #96def0; 13 | $secondary: #2980b9; 14 | $tertiary: #8e44ad; 15 | 16 | // Feedback 17 | $positive: #2ecc71; 18 | $negative: #971318; 19 | $warning: #f39c12; 20 | $disabled: #adadad; 21 | 22 | // Gradients 23 | $gradient-start: $primary; 24 | $gradient-middle: darken($primary, 20%); 25 | $gradient-end: darken($primary, 40%); 26 | -------------------------------------------------------------------------------- /public/assets/favicon/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by potrace 1.11, written by Peter Selinger 2001-2013 9 | 10 | 12 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /public/kirby/config/fields/tel.php: -------------------------------------------------------------------------------- 1 | 'text', 5 | 'props' => [ 6 | /** 7 | * Unset inherited props 8 | */ 9 | 'converter' => null, 10 | 'counter' => null, 11 | 'spellcheck' => null, 12 | 13 | /** 14 | * Sets the HTML5 autocomplete attribute 15 | */ 16 | 'autocomplete' => function (string $autocomplete = 'tel') { 17 | return $autocomplete; 18 | }, 19 | 20 | /** 21 | * Changes the phone icon 22 | */ 23 | 'icon' => function (string $icon = 'phone') { 24 | return $icon; 25 | } 26 | ] 27 | ]; 28 | -------------------------------------------------------------------------------- /public/kirby/src/Exception/PermissionException.php: -------------------------------------------------------------------------------- 1 | 12 | * @link https://getkirby.com 13 | * @copyright Bastian Allgeier GmbH 14 | * @license https://opensource.org/licenses/MIT 15 | */ 16 | class PermissionException extends Exception 17 | { 18 | protected static $defaultKey = 'permission'; 19 | protected static $defaultFallback = 'You are not allowed to do this'; 20 | protected static $defaultHttpCode = 403; 21 | } 22 | -------------------------------------------------------------------------------- /public/kirby/config/sections/mixins/headline.php: -------------------------------------------------------------------------------- 1 | [ 7 | /** 8 | * The headline for the section. This can be a simple string or a template with additional info from the parent page. 9 | */ 10 | 'headline' => function ($headline = null) { 11 | return I18n::translate($headline, $headline); 12 | } 13 | ], 14 | 'computed' => [ 15 | 'headline' => function () { 16 | if ($this->headline) { 17 | return $this->model()->toString($this->headline); 18 | } 19 | 20 | return ucfirst($this->name); 21 | } 22 | ] 23 | ]; 24 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/fa.json: -------------------------------------------------------------------------------- 1 | { 2 | "آ" : "A", 3 | "ا" : "a", 4 | "ب" : "b", 5 | "پ" : "p", 6 | "ت" : "t", 7 | "ث" : "th", 8 | "ج" : "j", 9 | "چ" : "ch", 10 | "ح" : "h", 11 | "خ" : "kh", 12 | "د" : "d", 13 | "ذ" : "th", 14 | "ر" : "r", 15 | "ز" : "z", 16 | "ژ" : "zh", 17 | "س" : "s", 18 | "ش" : "sh", 19 | "ص" : "s", 20 | "ض" : "z", 21 | "ط" : "t", 22 | "ظ" : "z", 23 | "ع" : "a", 24 | "غ" : "gh", 25 | "ف" : "f", 26 | "ق" : "g", 27 | "ك" : "k", 28 | "ک" : "k", 29 | "گ" : "g", 30 | "ل" : "l", 31 | "م" : "m", 32 | "ن" : "n", 33 | "و" : "o", 34 | "ه" : "h", 35 | "ی" : "y" 36 | } 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Forge Lite 2 | 3 | A slightly enhanced version of Kirby Plainkit using Laraval Mix to build the source. 4 | 5 | ## Running 6 | 7 | * Map a local test domain to the `public folder` 8 | * Set the name of the domain in `webpack.mix.js` 9 | * run `yarn install -D && yarn start` 10 | 11 | ## Other tasks 12 | 13 | Contains extra tasks in `package.json` for optimising images and deploying the project. Read that file for more info. The image optimisation tasks require ImageOptim CLI and SVGO installed locally. 14 | 15 | For deploys, amend the paths and server details in the `deploy` bash script in the project root. Trigger it via the scripts in `package.json`. 16 | 17 | More detailed readme coming soon. 18 | -------------------------------------------------------------------------------- /public/site/plugins/hero/blueprints/files/videos.yml: -------------------------------------------------------------------------------- 1 | title: Videos 2 | 3 | accept: video/* 4 | 5 | columns: 6 | 7 | # main 8 | left: 9 | width: 2/3 10 | sections: 11 | meta: 12 | type: fields 13 | fields: 14 | alt: 15 | label: Title 16 | type: text 17 | caption: 18 | label: Caption 19 | type: textarea 20 | 21 | # sidebar 22 | right: 23 | width: 1/3 24 | sections: 25 | feature: 26 | type: fields 27 | fields: 28 | poster: 29 | label: Poster 30 | type: image 31 | width: 1/3 32 | -------------------------------------------------------------------------------- /public/site/plugins/kirby3-schema/index.php: -------------------------------------------------------------------------------- 1 | 8 | * @copyright James Steel 9 | * @link https://github.com/HashandSalt/kirby3-schema 10 | * @license MIT 11 | */ 12 | 13 | @include_once __DIR__ . '/vendor/autoload.php'; 14 | 15 | use Spatie\SchemaOrg\Schema; 16 | 17 | Kirby::plugin('hashsandsalt/kirby3-schema', [ 18 | 19 | 'siteMethods' => [ 20 | 'schema' => function ($type) { 21 | $schema = Schema::{$type}(); 22 | return $schema; 23 | } 24 | ], 25 | 26 | ]); 27 | -------------------------------------------------------------------------------- /public/site/plugins/link-field/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "oblik/kirby-link-field", 3 | "description": "Kirby 3 field for all types of links.", 4 | "type": "kirby-plugin", 5 | "license": "MIT", 6 | "authors": [ 7 | { 8 | "name": "Hristiyan Dodov", 9 | "email": "h.dodov@gmail.com", 10 | "homepage": "https://dodov.me/" 11 | } 12 | ], 13 | "scripts": { 14 | "test": "phpunit" 15 | }, 16 | "require": { 17 | "getkirby/cms": "^3.2", 18 | "getkirby/composer-installer": "^1.1" 19 | }, 20 | "require-dev": { 21 | "phpunit/phpunit": "^9.0", 22 | "oblik/kirby-tester": "^1.2" 23 | }, 24 | "extra": { 25 | "installer-name": "link-field" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /public/site/snippets/global/favicon.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/kirby/config/presets/files.php: -------------------------------------------------------------------------------- 1 | [ 6 | 'headline' => $props['headline'] ?? t('files'), 7 | 'type' => 'files', 8 | 'layout' => $props['layout'] ?? 'cards', 9 | 'template' => $props['template'] ?? null, 10 | 'image' => $props['image'] ?? null, 11 | 'info' => '{{ file.dimensions }}' 12 | ] 13 | ]; 14 | 15 | // remove global options 16 | unset( 17 | $props['headline'], 18 | $props['layout'], 19 | $props['template'], 20 | $props['image'] 21 | ); 22 | 23 | return $props; 24 | }; 25 | -------------------------------------------------------------------------------- /public/kirby/config/fields/headline.php: -------------------------------------------------------------------------------- 1 | false, 5 | 'props' => [ 6 | /** 7 | * Unset inherited props 8 | */ 9 | 'after' => null, 10 | 'autofocus' => null, 11 | 'before' => null, 12 | 'default' => null, 13 | 'disabled' => null, 14 | 'icon' => null, 15 | 'placeholder' => null, 16 | 'required' => null, 17 | 'translate' => null, 18 | 19 | /** 20 | * If `false`, the prepended number will be hidden 21 | */ 22 | 'numbered' => function (bool $numbered = true) { 23 | return $numbered; 24 | } 25 | ] 26 | ]; 27 | -------------------------------------------------------------------------------- /public/kirby/config/fields/writer.php: -------------------------------------------------------------------------------- 1 | [ 5 | /** 6 | * Enables inline mode, which will not wrap new lines in paragraphs and creates hard breaks instead. 7 | * 8 | * @param bool $inline 9 | */ 10 | 'inline' => function (bool $inline = false) { 11 | return $inline; 12 | }, 13 | /** 14 | * Sets the allowed HTML formats. Available formats: `bold`, `italic`, `underline`, `strike`, `code`, `link`. Activate them all by passing `true`. Deactivate them all by passing `false` 15 | */ 16 | 'marks' => function ($marks = true) { 17 | return $marks; 18 | } 19 | ] 20 | ]; 21 | -------------------------------------------------------------------------------- /public/site/plugins/kirby3-seo/snippets/favicon.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/kirby/config/sections/mixins/max.php: -------------------------------------------------------------------------------- 1 | [ 5 | /** 6 | * Sets the maximum number of allowed entries in the section 7 | */ 8 | 'max' => function (int $max = null) { 9 | return $max; 10 | } 11 | ], 12 | 'methods' => [ 13 | 'isFull' => function () { 14 | if ($this->max) { 15 | return $this->total >= $this->max; 16 | } 17 | 18 | return false; 19 | }, 20 | 'validateMax' => function () { 21 | if ($this->max && $this->total > $this->max) { 22 | return false; 23 | } 24 | 25 | return true; 26 | } 27 | ] 28 | ]; 29 | -------------------------------------------------------------------------------- /public/kirby/src/Exception/BadMethodCallException.php: -------------------------------------------------------------------------------- 1 | 11 | * @link https://getkirby.com 12 | * @copyright Bastian Allgeier GmbH 13 | * @license https://opensource.org/licenses/MIT 14 | */ 15 | class BadMethodCallException extends Exception 16 | { 17 | protected static $defaultKey = 'invalidMethod'; 18 | protected static $defaultFallback = 'The method "{ method }" does not exist'; 19 | protected static $defaultHttpCode = 400; 20 | protected static $defaultData = ['method' => null]; 21 | } 22 | -------------------------------------------------------------------------------- /public/kirby/config/api/models/FileBlueprint.php: -------------------------------------------------------------------------------- 1 | [ 10 | 'name' => function (FileBlueprint $blueprint) { 11 | return $blueprint->name(); 12 | }, 13 | 'options' => function (FileBlueprint $blueprint) { 14 | return $blueprint->options(); 15 | }, 16 | 'tabs' => function (FileBlueprint $blueprint) { 17 | return $blueprint->tabs(); 18 | }, 19 | 'title' => function (FileBlueprint $blueprint) { 20 | return $blueprint->title(); 21 | }, 22 | ], 23 | 'type' => 'Kirby\Cms\FileBlueprint', 24 | 'views' => [ 25 | ], 26 | ]; 27 | -------------------------------------------------------------------------------- /public/kirby/config/api/models/SiteBlueprint.php: -------------------------------------------------------------------------------- 1 | [ 10 | 'name' => function (SiteBlueprint $blueprint) { 11 | return $blueprint->name(); 12 | }, 13 | 'options' => function (SiteBlueprint $blueprint) { 14 | return $blueprint->options(); 15 | }, 16 | 'tabs' => function (SiteBlueprint $blueprint) { 17 | return $blueprint->tabs(); 18 | }, 19 | 'title' => function (SiteBlueprint $blueprint) { 20 | return $blueprint->title(); 21 | }, 22 | ], 23 | 'type' => 'Kirby\Cms\SiteBlueprint', 24 | 'views' => [ 25 | ], 26 | ]; 27 | -------------------------------------------------------------------------------- /public/kirby/config/api/models/UserBlueprint.php: -------------------------------------------------------------------------------- 1 | [ 10 | 'name' => function (UserBlueprint $blueprint) { 11 | return $blueprint->name(); 12 | }, 13 | 'options' => function (UserBlueprint $blueprint) { 14 | return $blueprint->options(); 15 | }, 16 | 'tabs' => function (UserBlueprint $blueprint) { 17 | return $blueprint->tabs(); 18 | }, 19 | 'title' => function (UserBlueprint $blueprint) { 20 | return $blueprint->title(); 21 | }, 22 | ], 23 | 'type' => 'Kirby\Cms\UserBlueprint', 24 | 'views' => [ 25 | ], 26 | ]; 27 | -------------------------------------------------------------------------------- /public/kirby/config/snippets.php: -------------------------------------------------------------------------------- 1 | $blocksRoot . '/code/code.php', 8 | 'blocks/gallery' => $blocksRoot . '/gallery/gallery.php', 9 | 'blocks/heading' => $blocksRoot . '/heading/heading.php', 10 | 'blocks/image' => $blocksRoot . '/image/image.php', 11 | 'blocks/list' => $blocksRoot . '/list/list.php', 12 | 'blocks/markdown' => $blocksRoot . '/markdown/markdown.php', 13 | 'blocks/quote' => $blocksRoot . '/quote/quote.php', 14 | 'blocks/table' => $blocksRoot . '/table/table.php', 15 | 'blocks/text' => $blocksRoot . '/text/text.php', 16 | 'blocks/video' => $blocksRoot . '/video/video.php', 17 | ]; 18 | -------------------------------------------------------------------------------- /public/kirby/src/Exception/InvalidArgumentException.php: -------------------------------------------------------------------------------- 1 | 11 | * @link https://getkirby.com 12 | * @copyright Bastian Allgeier GmbH 13 | * @license https://opensource.org/licenses/MIT 14 | */ 15 | class InvalidArgumentException extends Exception 16 | { 17 | protected static $defaultKey = 'invalidArgument'; 18 | protected static $defaultFallback = 'Invalid argument "{ argument }" in method "{ method }"'; 19 | protected static $defaultHttpCode = 400; 20 | protected static $defaultData = ['argument' => null, 'method' => null]; 21 | } 22 | -------------------------------------------------------------------------------- /public/kirby/config/api/models/Role.php: -------------------------------------------------------------------------------- 1 | [ 10 | 'description' => function (Role $role) { 11 | return $role->description(); 12 | }, 13 | 'name' => function (Role $role) { 14 | return $role->name(); 15 | }, 16 | 'permissions' => function (Role $role) { 17 | return $role->permissions()->toArray(); 18 | }, 19 | 'title' => function (Role $role) { 20 | return $role->title(); 21 | }, 22 | ], 23 | 'type' => 'Kirby\Cms\Role', 24 | 'views' => [ 25 | 'compact' => [ 26 | 'description', 27 | 'name', 28 | 'title' 29 | ] 30 | ] 31 | ]; 32 | -------------------------------------------------------------------------------- /public/site/plugins/hero/blueprints/files/images.yml: -------------------------------------------------------------------------------- 1 | title: Images 2 | 3 | accept: image/* 4 | 5 | columns: 6 | 7 | # main 8 | left: 9 | width: 2/3 10 | sections: 11 | meta: 12 | type: fields 13 | fields: 14 | alt: 15 | label: Alt 16 | type: text 17 | caption: 18 | label: Caption 19 | type: textarea 20 | focus: 21 | label: Focus 22 | type: focus 23 | 24 | # sidebar 25 | right: 26 | width: 1/3 27 | sections: 28 | feature: 29 | type: fields 30 | fields: 31 | feature: 32 | label: Feature Image? 33 | type: toggle 34 | width: 1/3 35 | -------------------------------------------------------------------------------- /public/kirby/config/api/routes/roles.php: -------------------------------------------------------------------------------- 1 | 'roles', 9 | 'method' => 'GET', 10 | 'action' => function () { 11 | switch (get('canBe')) { 12 | case 'changed': 13 | return $this->kirby()->roles()->canBeChanged(); 14 | case 'created': 15 | return $this->kirby()->roles()->canBeCreated(); 16 | default: 17 | return $this->kirby()->roles(); 18 | } 19 | } 20 | ], 21 | [ 22 | 'pattern' => 'roles/(:any)', 23 | 'method' => 'GET', 24 | 'action' => function (string $name) { 25 | return $this->kirby()->roles()->find($name); 26 | } 27 | ] 28 | ]; 29 | -------------------------------------------------------------------------------- /public/kirby/config/fields/radio.php: -------------------------------------------------------------------------------- 1 | ['options'], 5 | 'props' => [ 6 | /** 7 | * Unset inherited props 8 | */ 9 | 'after' => null, 10 | 'before' => null, 11 | 'icon' => null, 12 | 'placeholder' => null, 13 | 14 | /** 15 | * Arranges the radio buttons in the given number of columns 16 | */ 17 | 'columns' => function (int $columns = 1) { 18 | return $columns; 19 | }, 20 | ], 21 | 'computed' => [ 22 | 'default' => function () { 23 | return $this->sanitizeOption($this->default); 24 | }, 25 | 'value' => function () { 26 | return $this->sanitizeOption($this->value) ?? ''; 27 | } 28 | ] 29 | ]; 30 | -------------------------------------------------------------------------------- /public/site/plugins/kirby3-seo/blueprints/tabs/meta.yml: -------------------------------------------------------------------------------- 1 | label: SEO 2 | icon: search 3 | columns: 4 | # SEO Meta 5 | left: 6 | width: 2/3 7 | sections: 8 | 9 | seocontent: 10 | type: fields 11 | fields: 12 | extends: fields/seo/meta 13 | 14 | # Share Image 15 | right: 16 | width: 1/3 17 | sections: 18 | seomedia: 19 | type: fields 20 | fields: 21 | shareimage: 22 | label: Share Image 23 | type: files 24 | uploads: 25 | template: shot 26 | width: 1/3 27 | max: 1 28 | info: "{{ file.dimensions }}" 29 | image: 30 | ratio: 2/1 31 | -------------------------------------------------------------------------------- /public/kirby/config/fields/mixins/datetime.php: -------------------------------------------------------------------------------- 1 | [ 5 | /** 6 | * Defines a custom format that is used when the field is saved 7 | */ 8 | 'format' => function (string $format = null) { 9 | return $format; 10 | } 11 | ], 12 | 'methods' => [ 13 | 'toDatetime' => function ($value, string $format = 'Y-m-d H:i:s') { 14 | if ($timestamp = timestamp($value, $this->step)) { 15 | return date($format, $timestamp); 16 | } 17 | 18 | return null; 19 | } 20 | ], 21 | 'save' => function ($value) { 22 | if ($value !== null && $timestamp = strtotime($value)) { 23 | return date($this->format, $timestamp); 24 | } 25 | 26 | return ''; 27 | }, 28 | ]; 29 | -------------------------------------------------------------------------------- /public/kirby/src/Parsley/Schema/Plain.php: -------------------------------------------------------------------------------- 1 | 'text', 20 | 'content' => [ 21 | 'text' => $text 22 | ] 23 | ]; 24 | } 25 | 26 | public function marks(): array 27 | { 28 | return []; 29 | } 30 | 31 | public function nodes(): array 32 | { 33 | return []; 34 | } 35 | 36 | public function skip(): array 37 | { 38 | return ['meta', 'script', 'style']; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /public/kirby/config/api/authentication.php: -------------------------------------------------------------------------------- 1 | kirby()->auth(); 7 | $allowImpersonation = $this->kirby()->option('api.allowImpersonation') ?? false; 8 | 9 | // csrf token check 10 | if ($auth->type($allowImpersonation) === 'session' && $auth->csrf() === false) { 11 | throw new PermissionException('Unauthenticated'); 12 | } 13 | 14 | // get user from session or basic auth 15 | if ($user = $auth->user(null, $allowImpersonation)) { 16 | if ($user->role()->permissions()->for('access', 'panel') === false) { 17 | throw new PermissionException(['key' => 'access.panel']); 18 | } 19 | 20 | return $user; 21 | } 22 | 23 | throw new PermissionException('Unauthenticated'); 24 | }; 25 | -------------------------------------------------------------------------------- /public/site/plugins/cachebuster/index.php: -------------------------------------------------------------------------------- 1 | [ 7 | 'active' => true 8 | ], 9 | 'components' => [ 10 | 'css' => function ($kirby, $url) { 11 | 12 | if ($kirby->option('schnti.cachebuster.active')) { 13 | 14 | $file = $kirby->roots()->index() . DS . $url; 15 | return dirname($url) . '/' . F::name($url) . '.' . F::modified($file) . '.css'; 16 | 17 | } else { 18 | return $url; 19 | } 20 | }, 21 | 'js' => function ($kirby, $url) { 22 | 23 | if ($kirby->option('schnti.cachebuster.active')) { 24 | 25 | $file = $kirby->roots()->index() . DS . $url; 26 | return dirname($url) . '/' . F::name($url) . '.' . F::modified($file) . '.js'; 27 | 28 | } else { 29 | return $url; 30 | } 31 | } 32 | ] 33 | ]); 34 | -------------------------------------------------------------------------------- /public/kirby/src/Cms/Response.php: -------------------------------------------------------------------------------- 1 | 11 | * @link https://getkirby.com 12 | * @copyright Bastian Allgeier GmbH 13 | * @license https://getkirby.com/license 14 | */ 15 | class Response extends \Kirby\Http\Response 16 | { 17 | /** 18 | * Adjusted redirect creation which 19 | * parses locations with the Url::to method 20 | * first. 21 | * 22 | * @param string $location 23 | * @param int $code 24 | * @return self 25 | */ 26 | public static function redirect(string $location = '/', int $code = 302) 27 | { 28 | return parent::redirect(Url::to($location), $code); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # System files 2 | # ------------ 3 | 4 | Icon 5 | .DS_Store 6 | node_modules 7 | yarn.lock 8 | package-lock.json 9 | sitespeed-result 10 | yarn-error.log 11 | 12 | # Temporary files 13 | # --------------- 14 | 15 | /public/media/* 16 | !/public/media/index.html 17 | 18 | /public/vendor/* 19 | 20 | # -------------SECURITY------------- 21 | # NEVER publish these files via Git! 22 | # -------------SECURITY------------- 23 | 24 | # Cache Files 25 | # --------------- 26 | 27 | /public/site/cache/* 28 | !/public/site/cache/index.html 29 | 30 | # Accounts 31 | # --------------- 32 | 33 | /public/site/accounts/* 34 | !/public/site/accounts/index.html 35 | 36 | # Sessions 37 | # --------------- 38 | 39 | /public/site/sessions/* 40 | !/public/site/sessions/index.html 41 | 42 | # License 43 | # --------------- 44 | /public/site/config/.licpublic/nse 45 | 46 | 47 | -------------------------------------------------------------------------------- /public/kirby/config/setup.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'sitemenu' => function ($btnclass = 'btn-small', $activeclass = 'active') { 6 | $sitemenu = $this->menu()->toStructure(); 7 | $menulist = ''; 8 | foreach ($sitemenu as $menu) { 9 | $link = $menu->link()->toLinkObject(); 10 | $active = ''; 11 | if ($link->type() == 'page') { 12 | $active = ($this->find($menu->link()->toLinkObject()->value())->isOpen()) ? $activeclass : ''; 13 | } 14 | $link = Html::a($link->url(), $link->title(), ['title' => $link->title(), 'class' => $btnclass]); 15 | $li = Html::tag('li', [$link], ['class' => $active]); 16 | $menulist .= $li; 17 | } 18 | return $menulist; 19 | } 20 | ] 21 | ]); 22 | -------------------------------------------------------------------------------- /public/kirby/config/api/routes.php: -------------------------------------------------------------------------------- 1 | option('languages', false) !== false) { 22 | $routes = array_merge($routes, include __DIR__ . '/routes/languages.php'); 23 | } 24 | 25 | return $routes; 26 | }; 27 | -------------------------------------------------------------------------------- /public/site/blueprints/files/images.yml: -------------------------------------------------------------------------------- 1 | title: Images 2 | 3 | accept: image/* 4 | 5 | tabs: 6 | 7 | # BASIC 8 | basic: 9 | label: Basic 10 | icon: text 11 | columns: 12 | 13 | # LEFT COLUMN 14 | left: 15 | width: 2/3 16 | sections: 17 | meta: 18 | type: fields 19 | fields: 20 | alt: 21 | label: Alt 22 | type: text 23 | caption: 24 | label: Caption 25 | type: textarea 26 | 27 | # RIGHT COLUMN 28 | right: 29 | width: 1/3 30 | sections: 31 | feature: 32 | type: fields 33 | fields: 34 | feature: 35 | label: Feature Image? 36 | type: toggle 37 | width: 1/3 38 | -------------------------------------------------------------------------------- /public/kirby/src/Cms/NestCollection.php: -------------------------------------------------------------------------------- 1 | 13 | * @link https://getkirby.com 14 | * @copyright Bastian Allgeier GmbH 15 | * @license https://getkirby.com/license 16 | */ 17 | class NestCollection extends BaseCollection 18 | { 19 | /** 20 | * Converts all objects in the collection 21 | * to an array. This can also take a callback 22 | * function to further modify the array result. 23 | * 24 | * @param \Closure|null $map 25 | * @return array 26 | */ 27 | public function toArray(Closure $map = null): array 28 | { 29 | return parent::toArray($map ?? function ($object) { 30 | return $object->toArray(); 31 | }); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /public/kirby/src/Toolkit/Facade.php: -------------------------------------------------------------------------------- 1 | 11 | * @link https://getkirby.com 12 | * @copyright Bastian Allgeier GmbH 13 | * @license https://opensource.org/licenses/MIT 14 | */ 15 | abstract class Facade 16 | { 17 | /** 18 | * Returns the instance that should be 19 | * available statically 20 | * 21 | * @return mixed 22 | */ 23 | abstract public static function instance(); 24 | 25 | /** 26 | * Proxy for all public instance calls 27 | * 28 | * @param string $method 29 | * @param array $args 30 | * @return mixed 31 | */ 32 | public static function __callStatic(string $method, array $args = null) 33 | { 34 | return static::instance()->$method(...$args); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /public/kirby/views/snippets/header.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Error 8 | 9 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /public/kirby/config/fields/multiselect.php: -------------------------------------------------------------------------------- 1 | 'tags', 5 | 'props' => [ 6 | /** 7 | * Unset inherited props 8 | */ 9 | 'accept' => null, 10 | /** 11 | * Custom icon to replace the arrow down. 12 | */ 13 | 'icon' => function (string $icon = null) { 14 | return $icon; 15 | }, 16 | /** 17 | * Enable/disable the search in the dropdown 18 | * Also limit displayed items (display: 20) 19 | * and set minimum number of characters to search (min: 3) 20 | */ 21 | 'search' => function ($search = true) { 22 | return $search; 23 | }, 24 | /** 25 | * If `true`, selected entries will be sorted 26 | * according to their position in the dropdown 27 | */ 28 | 'sort' => function (bool $sort = false) { 29 | return $sort; 30 | }, 31 | ] 32 | ]; 33 | -------------------------------------------------------------------------------- /public/kirby/config/sections/info.php: -------------------------------------------------------------------------------- 1 | [ 7 | 'headline', 8 | ], 9 | 'props' => [ 10 | 'text' => function ($text = null) { 11 | return I18n::translate($text, $text); 12 | }, 13 | 'theme' => function (string $theme = null) { 14 | return $theme; 15 | } 16 | ], 17 | 'computed' => [ 18 | 'text' => function () { 19 | if ($this->text) { 20 | $text = $this->model()->toString($this->text); 21 | $text = $this->kirby()->kirbytext($text); 22 | return $text; 23 | } 24 | }, 25 | ], 26 | 'toArray' => function () { 27 | return [ 28 | 'options' => [ 29 | 'headline' => $this->headline, 30 | 'text' => $this->text, 31 | 'theme' => $this->theme 32 | ] 33 | ]; 34 | } 35 | ]; 36 | -------------------------------------------------------------------------------- /public/kirby/config/api/models/Translation.php: -------------------------------------------------------------------------------- 1 | [ 10 | 'author' => function (Translation $translation) { 11 | return $translation->author(); 12 | }, 13 | 'data' => function (Translation $translation) { 14 | return $translation->dataWithFallback(); 15 | }, 16 | 'direction' => function (Translation $translation) { 17 | return $translation->direction(); 18 | }, 19 | 'id' => function (Translation $translation) { 20 | return $translation->id(); 21 | }, 22 | 'name' => function (Translation $translation) { 23 | return $translation->name(); 24 | }, 25 | ], 26 | 'type' => 'Kirby\Cms\Translation', 27 | 'views' => [ 28 | 'compact' => [ 29 | 'direction', 30 | 'id', 31 | 'name' 32 | ] 33 | ] 34 | ]; 35 | -------------------------------------------------------------------------------- /public/kirby/config/api/models.php: -------------------------------------------------------------------------------- 1 | include __DIR__ . '/models/File.php', 8 | 'FileBlueprint' => include __DIR__ . '/models/FileBlueprint.php', 9 | 'FileVersion' => include __DIR__ . '/models/FileVersion.php', 10 | 'Language' => include __DIR__ . '/models/Language.php', 11 | 'Page' => include __DIR__ . '/models/Page.php', 12 | 'PageBlueprint' => include __DIR__ . '/models/PageBlueprint.php', 13 | 'Role' => include __DIR__ . '/models/Role.php', 14 | 'Site' => include __DIR__ . '/models/Site.php', 15 | 'SiteBlueprint' => include __DIR__ . '/models/SiteBlueprint.php', 16 | 'System' => include __DIR__ . '/models/System.php', 17 | 'Translation' => include __DIR__ . '/models/Translation.php', 18 | 'User' => include __DIR__ . '/models/User.php', 19 | 'UserBlueprint' => include __DIR__ . '/models/UserBlueprint.php', 20 | ]; 21 | -------------------------------------------------------------------------------- /public/kirby/config/blocks/image/image.php: -------------------------------------------------------------------------------- 1 | alt(); 5 | $caption = $block->caption(); 6 | $crop = $block->crop()->isTrue(); 7 | $link = $block->link(); 8 | $ratio = $block->ratio()->or('auto'); 9 | $src = null; 10 | 11 | if ($block->location() == 'web') { 12 | $src = $block->src(); 13 | } elseif ($image = $block->image()->toFile()) { 14 | $alt = $alt ?? $image->alt(); 15 | $src = $image->url(); 16 | } 17 | 18 | ?> 19 | 20 | $ratio, 'data-crop' => $crop], ' ') ?>> 21 | isNotEmpty()): ?> 22 | 23 | <?= $alt ?> 24 | 25 | 26 | <?= $alt ?> 27 | 28 | 29 | isNotEmpty()): ?> 30 |
31 | 32 |
33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /public/kirby/config/urls.php: -------------------------------------------------------------------------------- 1 | function () { 7 | return Url::index(); 8 | }, 9 | 'base' => function (array $urls) { 10 | return rtrim($urls['index'], '/'); 11 | }, 12 | 'current' => function (array $urls) { 13 | $path = trim($this->path(), '/'); 14 | 15 | if (empty($path) === true) { 16 | return $urls['index']; 17 | } else { 18 | return $urls['base'] . '/' . $path; 19 | } 20 | }, 21 | 'assets' => function (array $urls) { 22 | return $urls['base'] . '/assets'; 23 | }, 24 | 'api' => function (array $urls) { 25 | return $urls['base'] . '/' . ($this->options['api']['slug'] ?? 'api'); 26 | }, 27 | 'media' => function (array $urls) { 28 | return $urls['base'] . '/media'; 29 | }, 30 | 'panel' => function (array $urls) { 31 | return $urls['base'] . '/' . ($this->options['panel']['slug'] ?? 'panel'); 32 | } 33 | ]; 34 | -------------------------------------------------------------------------------- /public/kirby/bootstrap.php: -------------------------------------------------------------------------------- 1 | =') === false || 9 | version_compare(PHP_VERSION, '8.1.0', '<') === false 10 | ) { 11 | die(include __DIR__ . '/views/php.php'); 12 | } 13 | 14 | if (is_file($autoloader = dirname(__DIR__) . '/vendor/autoload.php')) { 15 | 16 | /** 17 | * Always prefer a site-wide Composer autoloader 18 | * if it exists, it means that the user has probably 19 | * installed additional packages 20 | */ 21 | include $autoloader; 22 | } elseif (is_file($autoloader = __DIR__ . '/vendor/autoload.php')) { 23 | 24 | /** 25 | * Fall back to the local autoloader if that exists 26 | */ 27 | include $autoloader; 28 | } else { 29 | 30 | /** 31 | * If neither one exists, don't bother searching; 32 | * it's a custom directory setup and the users need to 33 | * load the autoloader themselves 34 | */ 35 | } 36 | -------------------------------------------------------------------------------- /public/kirby/config/blueprints.php: -------------------------------------------------------------------------------- 1 | $blocksRoot . '/code/code.yml', 8 | 'blocks/gallery' => $blocksRoot . '/gallery/gallery.yml', 9 | 'blocks/heading' => $blocksRoot . '/heading/heading.yml', 10 | 'blocks/image' => $blocksRoot . '/image/image.yml', 11 | 'blocks/list' => $blocksRoot . '/list/list.yml', 12 | 'blocks/markdown' => $blocksRoot . '/markdown/markdown.yml', 13 | 'blocks/quote' => $blocksRoot . '/quote/quote.yml', 14 | 'blocks/table' => $blocksRoot . '/table/table.yml', 15 | 'blocks/text' => $blocksRoot . '/text/text.yml', 16 | 'blocks/video' => $blocksRoot . '/video/video.yml', 17 | 18 | // file blueprints 19 | 'files/default' => __DIR__ . '/blueprints/files/default.yml', 20 | 21 | // page blueprints 22 | 'pages/default' => __DIR__ . '/blueprints/pages/default.yml', 23 | 24 | // site blueprints 25 | 'site' => __DIR__ . '/blueprints/site.yml' 26 | ]; 27 | -------------------------------------------------------------------------------- /public/kirby/src/Cms/Html.php: -------------------------------------------------------------------------------- 1 | 12 | * @link https://getkirby.com 13 | * @copyright Bastian Allgeier GmbH 14 | * @license https://getkirby.com/license 15 | */ 16 | class Html extends \Kirby\Toolkit\Html 17 | { 18 | /** 19 | * Generates an `a` tag with an absolute Url 20 | * 21 | * @param string|null $href Relative or absolute Url 22 | * @param string|array|null $text If `null`, the link will be used as link text. If an array is passed, each element will be added unencoded 23 | * @param array $attr Additional attributes for the a tag. 24 | * @return string 25 | */ 26 | public static function link(string $href = null, $text = null, array $attr = []): string 27 | { 28 | return parent::link(Url::to($href), $text, $attr); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/js/site.js: -------------------------------------------------------------------------------- 1 | // ====================================================================== 2 | // Forge Lite | hello@hashandsalt.com 3 | // ====================================================================== 4 | 5 | // window.$ = window.jQuery = require('jquery'); 6 | 7 | // ====================================================================== 8 | // Modules 9 | // ====================================================================== 10 | 11 | // require any further scripts here ie: 12 | // require('npmpackagename'); 13 | // require('./mylocalfile.js'); 14 | 15 | // Tiny Slider 16 | import { 17 | tns 18 | } from 'tiny-slider/src/tiny-slider.js'; 19 | 20 | // HERO Slider 21 | let heroslides = document.querySelectorAll('.hero-slider'); 22 | 23 | if (heroslides) { 24 | [].forEach.call(heroslides , function(el) { 25 | tns({ 26 | container: el, 27 | items: 1, 28 | slideBy: 'page', 29 | autoplay: true, 30 | mode: "gallery", 31 | controls: false, 32 | nav: false, 33 | speed: 500 34 | }); 35 | }); 36 | } -------------------------------------------------------------------------------- /public/kirby/config/fields/url.php: -------------------------------------------------------------------------------- 1 | 'text', 7 | 'props' => [ 8 | /** 9 | * Unset inherited props 10 | */ 11 | 'converter' => null, 12 | 'counter' => null, 13 | 'spellcheck' => null, 14 | 15 | /** 16 | * Sets the HTML5 autocomplete attribute 17 | */ 18 | 'autocomplete' => function (string $autocomplete = 'url') { 19 | return $autocomplete; 20 | }, 21 | 22 | /** 23 | * Changes the link icon 24 | */ 25 | 'icon' => function (string $icon = 'url') { 26 | return $icon; 27 | }, 28 | 29 | /** 30 | * Sets custom placeholder text, when the field is empty 31 | */ 32 | 'placeholder' => function ($value = null) { 33 | return I18n::translate($value, $value) ?? 'https://example.com'; 34 | } 35 | ], 36 | 'validations' => [ 37 | 'minlength', 38 | 'maxlength', 39 | 'url' 40 | ], 41 | ]; 42 | -------------------------------------------------------------------------------- /public/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hashandsalt/forge", 3 | "description": "Forge: a boilerplate for Kirby", 4 | "type": "project", 5 | "keywords": [ 6 | "kirby", 7 | "cms" 8 | ], 9 | "homepage": "https://hashandsalt.com", 10 | "authors": [ 11 | { 12 | "name": "James Steel", 13 | "email": "hello@hashandsalt.com", 14 | "homepage": "https://hashandsalt.com" 15 | } 16 | ], 17 | "require": { 18 | "php": ">=7.1.0", 19 | "getkirby/cms": "^3.5.0", 20 | "hashandsalt/kirby3-seo": "^1.0", 21 | "hashandsalt/kirby3-schema": "^0.0.1", 22 | "oblik/kirby-link-field": "^3.0", 23 | "medienbaecker/autoresize": "^2.0", 24 | "schnti/cachebuster": "^1.0", 25 | "timoetting/kirby-color": "^1.0", 26 | "flokosiol/focus": "^3.0", 27 | "oblik/kirby-entity-field": "^1.0", 28 | "hashandsalt/kirby3-webp": "^0.0.6", 29 | "hashandsalt/hero": "^1.0" 30 | }, 31 | "config": { 32 | "optimize-autoloader": true 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /public/kirby/config/fields/email.php: -------------------------------------------------------------------------------- 1 | 'text', 7 | 'props' => [ 8 | /** 9 | * Unset inherited props 10 | */ 11 | 'converter' => null, 12 | 'counter' => null, 13 | 14 | /** 15 | * Sets the HTML5 autocomplete mode for the input 16 | */ 17 | 'autocomplete' => function (string $autocomplete = 'email') { 18 | return $autocomplete; 19 | }, 20 | 21 | /** 22 | * Changes the email icon to something custom 23 | */ 24 | 'icon' => function (string $icon = 'email') { 25 | return $icon; 26 | }, 27 | 28 | /** 29 | * Custom placeholder text, when the field is empty. 30 | */ 31 | 'placeholder' => function ($value = null) { 32 | return I18n::translate($value, $value) ?? I18n::translate('email.placeholder'); 33 | } 34 | ], 35 | 'validations' => [ 36 | 'minlength', 37 | 'maxlength', 38 | 'email' 39 | ] 40 | ]; 41 | -------------------------------------------------------------------------------- /public/kirby/config/api/models/PageBlueprint.php: -------------------------------------------------------------------------------- 1 | [ 10 | 'name' => function (PageBlueprint $blueprint) { 11 | return $blueprint->name(); 12 | }, 13 | 'num' => function (PageBlueprint $blueprint) { 14 | return $blueprint->num(); 15 | }, 16 | 'options' => function (PageBlueprint $blueprint) { 17 | return $blueprint->options(); 18 | }, 19 | 'preview' => function (PageBlueprint $blueprint) { 20 | return $blueprint->preview(); 21 | }, 22 | 'status' => function (PageBlueprint $blueprint) { 23 | return $blueprint->status(); 24 | }, 25 | 'tabs' => function (PageBlueprint $blueprint) { 26 | return $blueprint->tabs(); 27 | }, 28 | 'title' => function (PageBlueprint $blueprint) { 29 | return $blueprint->title(); 30 | }, 31 | ], 32 | 'type' => 'Kirby\Cms\PageBlueprint', 33 | 'views' => [ 34 | ], 35 | ]; 36 | -------------------------------------------------------------------------------- /src/sass/01-settings/_settings.mq.scss: -------------------------------------------------------------------------------- 1 | // ====================================================================== 2 | // Slate Media Query Config | hello@hashandsalt.com 3 | // ====================================================================== 4 | 5 | // Breakpoints 6 | // ---------------------------------------------------------------------- 7 | $breakpoints: ( 8 | 'tiny': $bp-tiny, 9 | 'xsmall': $bp-xsmall, 10 | 'small': $bp-small, 11 | 'medium': $bp-medium, 12 | 'large': $bp-large, 13 | 'xl': $bp-xl 14 | ); 15 | 16 | // Media Types 17 | // ---------------------------------------------------------------------- 18 | $media-expressions: ( 19 | 'screen': 'screen', 20 | 'print': 'print', 21 | 'handheld': 'handheld', 22 | 'retina2x': ('(-webkit-min-device-pixel-ratio: 2)', '(min-resolution: 192dpi)'), 23 | 'retina3x': ('(-webkit-min-device-pixel-ratio: 3)', '(min-resolution: 350dpi)') 24 | ); 25 | 26 | // Unit Intervals 27 | // ---------------------------------------------------------------------- 28 | $unit-intervals: ( 29 | 'px': 0, //1 30 | 'em': 0, //0.01 31 | 'rem': 0 //0.1 32 | ); 33 | -------------------------------------------------------------------------------- /src/sass/01-settings/_settings.ratio.scss: -------------------------------------------------------------------------------- 1 | // ====================================================================== 2 | // Slate Ratios | hello@hashandsalt.com 3 | // ====================================================================== 4 | 5 | // Minor Second 6 | $minor-second: 1.067; 7 | 8 | // Major Second 9 | $major-second: 1.125; 10 | 11 | // Minor Third 12 | $minor-third: 1.2; 13 | 14 | // Miajor Third 15 | $major-third: 1.25; 16 | 17 | // Perfect Forth 18 | $perfect-fourth: 1.333; 19 | 20 | // Augmented Forth 21 | $augmented-fourth: 1.414; 22 | 23 | // Perfect Fith 24 | $perfect-fifth: 1.5; 25 | 26 | // Minor Sixth 27 | $minor-sixth: 1.6; 28 | 29 | // Golden Section 30 | $golden-section: 1.618; 31 | 32 | // Major Sixth 33 | $major-sixth: 1.667; 34 | 35 | // Minor Seventh 36 | $minor-seventh: 1.778; 37 | 38 | // Major Seventh 39 | $major-seventh: 1.875; 40 | 41 | // Octave 42 | $octave: 2; 43 | 44 | // Major Tenth 45 | $major-tenth: 2.5; 46 | 47 | // Major Eleventh 48 | $major-eleventh: 2.667; 49 | 50 | // Major Twelth 51 | $major-twelfth: 3; 52 | 53 | // Double Octave 54 | $double-octave: 4; 55 | -------------------------------------------------------------------------------- /public/kirby/src/Cms/NestObject.php: -------------------------------------------------------------------------------- 1 | 12 | * @link https://getkirby.com 13 | * @copyright Bastian Allgeier GmbH 14 | * @license https://getkirby.com/license 15 | */ 16 | class NestObject extends Obj 17 | { 18 | /** 19 | * Converts the object to an array 20 | * 21 | * @return array 22 | */ 23 | public function toArray(): array 24 | { 25 | $result = []; 26 | 27 | foreach ((array)$this as $key => $value) { 28 | if (is_a($value, 'Kirby\Cms\Field') === true) { 29 | $result[$key] = $value->value(); 30 | continue; 31 | } 32 | 33 | if (is_object($value) === true && method_exists($value, 'toArray')) { 34 | $result[$key] = $value->toArray(); 35 | continue; 36 | } 37 | 38 | $result[$key] = $value; 39 | } 40 | 41 | return $result; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /public/kirby/src/Http/Request/Auth/BearerAuth.php: -------------------------------------------------------------------------------- 1 | token = $token; 23 | } 24 | 25 | /** 26 | * Converts the object to a string 27 | * 28 | * @return string 29 | */ 30 | public function __toString(): string 31 | { 32 | return ucfirst($this->type()) . ' ' . $this->token(); 33 | } 34 | 35 | /** 36 | * Returns the authentication token 37 | * 38 | * @return string 39 | */ 40 | public function token(): string 41 | { 42 | return $this->token; 43 | } 44 | 45 | /** 46 | * Returns the auth type 47 | * 48 | * @return string 49 | */ 50 | public function type(): string 51 | { 52 | return 'bearer'; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /public/site/plugins/kirby3-webp/snippets/webp.php: -------------------------------------------------------------------------------- 1 | toWebp(); 3 | $variants = $src->toVariants()->filterBy('extension', '!=', 'webp'); 4 | $source = $src->toSource(); 5 | ?> 6 | 7 | $class], ' '))?>> 8 | 9 | 10 | 16 | 17 | 18 | 19 | 20 | 26 | 27 | 28 | 29 | <?=$source->alt()?> 33 | 34 | -------------------------------------------------------------------------------- /src/sass/06-components/_components.footer.scss: -------------------------------------------------------------------------------- 1 | // ====================================================================== 2 | // 06-components - Footer 3 | // ====================================================================== 4 | 5 | 6 | footer { 7 | background-color: $jet; 8 | } 9 | 10 | .footer-inner { 11 | @include container; 12 | 13 | padding: rem(12px) 0; 14 | 15 | display: grid; 16 | grid-template-columns: 1fr 1fr; 17 | grid-template-rows: 1fr; 18 | row-gap: rem(12px); 19 | 20 | @include media(" 2 | 3 | 4 | 5 | 6 | 7 | Favicon 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /public/site/plugins/kirby3-webp/LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 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 | -------------------------------------------------------------------------------- /public/kirby/src/Toolkit/Tpl.php: -------------------------------------------------------------------------------- 1 | 12 | * @link https://getkirby.com 13 | * @copyright Bastian Allgeier GmbH 14 | * @license https://opensource.org/licenses/MIT 15 | */ 16 | class Tpl 17 | { 18 | /** 19 | * Renders the template 20 | * 21 | * @param string $file 22 | * @param array $data 23 | * @return string 24 | */ 25 | public static function load(string $file = null, array $data = []): string 26 | { 27 | if (is_file($file) === false) { 28 | return ''; 29 | } 30 | 31 | ob_start(); 32 | 33 | $exception = null; 34 | try { 35 | F::load($file, null, $data); 36 | } catch (Throwable $e) { 37 | $exception = $e; 38 | } 39 | 40 | $content = ob_get_contents(); 41 | ob_end_clean(); 42 | 43 | if ($exception === null) { 44 | return $content; 45 | } 46 | 47 | throw $exception; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /public/site/plugins/entity-field/LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Oblik Studio Ltd. 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 | -------------------------------------------------------------------------------- /public/kirby/src/Cms/Layouts.php: -------------------------------------------------------------------------------- 1 | 10 | * @link https://getkirby.com 11 | * @copyright Bastian Allgeier GmbH 12 | * @license https://getkirby.com/license 13 | */ 14 | class Layouts extends Items 15 | { 16 | const ITEM_CLASS = '\Kirby\Cms\Layout'; 17 | 18 | public static function factory(array $items = null, array $params = []) 19 | { 20 | $first = $items[0] ?? []; 21 | 22 | // if there are no wrapping layouts for blocks yet … 23 | if (array_key_exists('content', $first) === true || array_key_exists('type', $first) === true) { 24 | $items = [ 25 | [ 26 | 'id' => uuid(), 27 | 'columns' => [ 28 | [ 29 | 'width' => '1/1', 30 | 'blocks' => $items 31 | ] 32 | ] 33 | ] 34 | ]; 35 | } 36 | 37 | return parent::factory($items, $params); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/mk.json: -------------------------------------------------------------------------------- 1 | { 2 | "А": "A", 3 | "Б": "B", 4 | "В": "V", 5 | "Г": "G", 6 | "Д": "D", 7 | "Ѓ": "Gj", 8 | "Е": "E", 9 | "Ж": "Zh", 10 | "З": "Z", 11 | "Ѕ": "Dz", 12 | "И": "I", 13 | "Ј": "J", 14 | "К": "K", 15 | "Л": "L", 16 | "Љ": "Lj", 17 | "М": "M", 18 | "Н": "N", 19 | "Њ": "Nj", 20 | "О": "O", 21 | "П": "P", 22 | "Р": "R", 23 | "С": "S", 24 | "Т": "T", 25 | "Ќ": "Kj", 26 | "У": "U", 27 | "Ф": "F", 28 | "Х": "H", 29 | "Ц": "C", 30 | "Ч": "Ch", 31 | "Џ": "Dj", 32 | "Ш": "Sh", 33 | "а": "a", 34 | "б": "b", 35 | "в": "v", 36 | "г": "g", 37 | "д": "d", 38 | "ѓ": "gj", 39 | "е": "e", 40 | "ж": "zh", 41 | "з": "z", 42 | "ѕ": "dz", 43 | "и": "i", 44 | "ј": "j", 45 | "к": "k", 46 | "л": "l", 47 | "љ": "lj", 48 | "м": "m", 49 | "н": "n", 50 | "њ": "nj", 51 | "о": "o", 52 | "п": "p", 53 | "р": "r", 54 | "с": "s", 55 | "т": "t", 56 | "ќ": "kj", 57 | "у": "u", 58 | "ф": "f", 59 | "х": "h", 60 | "ц": "c", 61 | "ч": "ch", 62 | "џ": "dj", 63 | "ш": "sh" 64 | } 65 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/bg.json: -------------------------------------------------------------------------------- 1 | { 2 | "А": "A", 3 | "Б": "B", 4 | "В": "V", 5 | "Г": "G", 6 | "Д": "D", 7 | "Е": "E", 8 | "Ж": "J", 9 | "З": "Z", 10 | "И": "I", 11 | "Й": "Y", 12 | "К": "K", 13 | "Л": "L", 14 | "М": "M", 15 | "Н": "N", 16 | "О": "O", 17 | "П": "P", 18 | "Р": "R", 19 | "С": "S", 20 | "Т": "T", 21 | "У": "U", 22 | "Ф": "F", 23 | "Х": "H", 24 | "Ц": "Ts", 25 | "Ч": "Ch", 26 | "Ш": "Sh", 27 | "Щ": "Sht", 28 | "Ъ": "A", 29 | "Ь": "I", 30 | "Ю": "Iu", 31 | "Я": "Ia", 32 | "а": "a", 33 | "б": "b", 34 | "в": "v", 35 | "г": "g", 36 | "д": "d", 37 | "е": "e", 38 | "ж": "j", 39 | "з": "z", 40 | "и": "i", 41 | "й": "y", 42 | "к": "k", 43 | "л": "l", 44 | "м": "m", 45 | "н": "n", 46 | "о": "o", 47 | "п": "p", 48 | "р": "r", 49 | "с": "s", 50 | "т": "t", 51 | "у": "u", 52 | "ф": "f", 53 | "х": "h", 54 | "ц": "ts", 55 | "ч": "ch", 56 | "ш": "sh", 57 | "щ": "sht", 58 | "ъ": "a", 59 | "ь": "i", 60 | "ю": "iu", 61 | "я": "ia", 62 | "ия": "ia", 63 | "йо": "iо", 64 | "ьо": "io" 65 | } 66 | -------------------------------------------------------------------------------- /public/kirby/config/sections/mixins/pagination.php: -------------------------------------------------------------------------------- 1 | [ 7 | /** 8 | * Sets the number of items per page. If there are more items the pagination navigation will be shown at the bottom of the section. 9 | */ 10 | 'limit' => function (int $limit = 20) { 11 | return $limit; 12 | }, 13 | /** 14 | * Sets the default page for the pagination. This will overwrite default pagination. 15 | */ 16 | 'page' => function (int $page = null) { 17 | return get('page', $page); 18 | }, 19 | ], 20 | 'methods' => [ 21 | 'pagination' => function () { 22 | $pagination = new Pagination([ 23 | 'limit' => $this->limit, 24 | 'page' => $this->page, 25 | 'total' => $this->total 26 | ]); 27 | 28 | return [ 29 | 'limit' => $pagination->limit(), 30 | 'offset' => $pagination->offset(), 31 | 'page' => $pagination->page(), 32 | 'total' => $pagination->total(), 33 | ]; 34 | }, 35 | ] 36 | ]; 37 | -------------------------------------------------------------------------------- /public/kirby/config/fields/info.php: -------------------------------------------------------------------------------- 1 | [ 7 | /** 8 | * Unset inherited props 9 | */ 10 | 'after' => null, 11 | 'autofocus' => null, 12 | 'before' => null, 13 | 'default' => null, 14 | 'disabled' => null, 15 | 'icon' => null, 16 | 'placeholder' => null, 17 | 'required' => null, 18 | 'translate' => null, 19 | 20 | /** 21 | * Text to be displayed 22 | */ 23 | 'text' => function ($value = null) { 24 | return I18n::translate($value, $value); 25 | }, 26 | 27 | /** 28 | * Change the design of the info box 29 | */ 30 | 'theme' => function (string $theme = null) { 31 | return $theme; 32 | } 33 | ], 34 | 'computed' => [ 35 | 'text' => function () { 36 | if ($text = $this->text) { 37 | $text = $this->model()->toString($text); 38 | $text = $this->kirby()->kirbytext($text); 39 | return $text; 40 | } 41 | } 42 | ], 43 | 'save' => false, 44 | ]; 45 | -------------------------------------------------------------------------------- /public/site/plugins/kirby3-seo/blueprints/tabs/contact.yml: -------------------------------------------------------------------------------- 1 | label: Contact 2 | icon: globe 3 | 4 | fields: 5 | telephone: 6 | label: Telephone 7 | type: tel 8 | width: 1/3 9 | emailaddress: 10 | label: Email Address 11 | type: email 12 | width: 1/3 13 | socialtwitterURL: 14 | label: Twitter 15 | type: url 16 | width: 1/3 17 | twittercreator: 18 | label: Twitter Creator 19 | type: url 20 | width: 1/3 21 | sociallinkedinURL: 22 | label: LinkedIn 23 | type: url 24 | width: 1/3 25 | socialfaceBookURL: 26 | label: Facebook 27 | type: url 28 | width: 1/3 29 | socialinstagramURL: 30 | label: Instagram 31 | type: url 32 | width: 1/3 33 | socialpinterestURL: 34 | label: Pinterest 35 | type: url 36 | width: 1/3 37 | socialyoutubeURL: 38 | label: Youtube 39 | type: url 40 | width: 1/3 41 | -------------------------------------------------------------------------------- /public/kirby/config/api/models/Language.php: -------------------------------------------------------------------------------- 1 | [ 10 | 'code' => function (Language $language) { 11 | return $language->code(); 12 | }, 13 | 'default' => function (Language $language) { 14 | return $language->isDefault(); 15 | }, 16 | 'direction' => function (Language $language) { 17 | return $language->direction(); 18 | }, 19 | 'locale' => function (Language $language) { 20 | return $language->locale(); 21 | }, 22 | 'name' => function (Language $language) { 23 | return $language->name(); 24 | }, 25 | 'rules' => function (Language $language) { 26 | return $language->rules(); 27 | }, 28 | 'url' => function (Language $language) { 29 | return $language->url(); 30 | }, 31 | ], 32 | 'type' => 'Kirby\Cms\Language', 33 | 'views' => [ 34 | 'default' => [ 35 | 'code', 36 | 'default', 37 | 'direction', 38 | 'locale', 39 | 'name', 40 | 'rules', 41 | 'url' 42 | ] 43 | ] 44 | ]; 45 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "Ъ": "", 3 | "Ь": "", 4 | "А": "A", 5 | "Б": "B", 6 | "Ц": "C", 7 | "Ч": "Ch", 8 | "Д": "D", 9 | "Е": "E", 10 | "Ё": "E", 11 | "Э": "E", 12 | "Ф": "F", 13 | "Г": "G", 14 | "Х": "H", 15 | "И": "I", 16 | "Й": "Y", 17 | "Я": "Ya", 18 | "Ю": "Yu", 19 | "К": "K", 20 | "Л": "L", 21 | "М": "M", 22 | "Н": "N", 23 | "О": "O", 24 | "П": "P", 25 | "Р": "R", 26 | "С": "S", 27 | "Ш": "Sh", 28 | "Щ": "Shch", 29 | "Т": "T", 30 | "У": "U", 31 | "В": "V", 32 | "Ы": "Y", 33 | "З": "Z", 34 | "Ж": "Zh", 35 | "ъ": "", 36 | "ь": "", 37 | "а": "a", 38 | "б": "b", 39 | "ц": "c", 40 | "ч": "ch", 41 | "д": "d", 42 | "е": "e", 43 | "ё": "e", 44 | "э": "e", 45 | "ф": "f", 46 | "г": "g", 47 | "х": "h", 48 | "и": "i", 49 | "й": "y", 50 | "я": "ya", 51 | "ю": "yu", 52 | "к": "k", 53 | "л": "l", 54 | "м": "m", 55 | "н": "n", 56 | "о": "o", 57 | "п": "p", 58 | "р": "r", 59 | "с": "s", 60 | "ш": "sh", 61 | "щ": "shch", 62 | "т": "t", 63 | "у": "u", 64 | "в": "v", 65 | "ы": "y", 66 | "з": "z", 67 | "ж": "zh" 68 | } 69 | -------------------------------------------------------------------------------- /public/site/blueprints/site.yml: -------------------------------------------------------------------------------- 1 | title: Site 2 | 3 | tabs: 4 | sitecontent: 5 | label: Site Content 6 | icon: page 7 | columns: 8 | # Content 9 | left: 10 | width: 2/3 11 | sections: 12 | sitepages: 13 | headline: Site Pages 14 | type: pages 15 | unlisted: true 16 | status: listed 17 | layout: cards 18 | sortBy: title 19 | size: small 20 | limit: 20 21 | image: 22 | cover: true 23 | back: white 24 | ratio: 16/9 25 | 26 | # sidebar 27 | right: 28 | width: 1/3 29 | sections: 30 | 31 | # Pages 32 | drafts: 33 | headline: Drafts 34 | type: pages 35 | status: drafts 36 | sortBy: title 37 | unlisted: 38 | headline: Unlisted 39 | type: pages 40 | unlisted: true 41 | status: unlisted 42 | sortBy: title 43 | 44 | 45 | 46 | # Site Files 47 | sitefiles: tabs/files 48 | 49 | # Site Menu 50 | menu: tabs/sitemenu 51 | -------------------------------------------------------------------------------- /src/sass/06-components/_components.menu.scss: -------------------------------------------------------------------------------- 1 | // ====================================================================== 2 | // 06-components - Menu 3 | // ====================================================================== 4 | 5 | .menu-list { 6 | margin: 0; 7 | padding: 0; 8 | list-style: none; 9 | display: flex; 10 | justify-content: center; 11 | text-transform: uppercase; 12 | 13 | @include media(">medium") { 14 | justify-content: flex-end; 15 | } 16 | 17 | li { 18 | margin: 0 rem(4px); 19 | 20 | &:last-child { 21 | margin: 0 0 0 rem(4px); 22 | } 23 | } 24 | 25 | a { 26 | color: $bright; 27 | text-decoration: none; 28 | 29 | &:hover { 30 | color: $bright; 31 | border-bottom: 2px solid $bright; 32 | } 33 | } 34 | 35 | 36 | 37 | .header & { 38 | a { 39 | background-color: $jet; 40 | padding: rem(4px) rem(8px); 41 | 42 | &:hover { 43 | background-color: $secondary; 44 | color: $bright; 45 | border: none; 46 | } 47 | 48 | 49 | } 50 | 51 | .active a { 52 | background-color: $secondary; 53 | } 54 | 55 | } 56 | 57 | footer & { 58 | .active a { 59 | border-bottom: 2px solid $bright; 60 | } 61 | 62 | } 63 | 64 | } -------------------------------------------------------------------------------- /public/kirby/config/blueprints/blocks/code.yml: -------------------------------------------------------------------------------- 1 | name: Code 2 | icon: code 3 | fields: 4 | code: 5 | label: Code 6 | type: textarea 7 | buttons: false 8 | font: monospace 9 | language: 10 | label: Language 11 | type: select 12 | default: text 13 | options: 14 | bash: Bash 15 | basic: BASIC 16 | c: C 17 | clojure: Clojure 18 | cpp: C++ 19 | csharp: C# 20 | css: CSS 21 | diff: Diff 22 | elixir: Elixir 23 | elm: Elm 24 | erlang: Erlang 25 | go: Go 26 | graphql: GraphQL 27 | haskell: Haskell 28 | html: HTML 29 | java: Java 30 | js: JavaScript 31 | json: JSON 32 | latext: LaTeX 33 | less: Less 34 | lisp: Lisp 35 | lua: Lua 36 | makefile: Makefile 37 | markdown: Markdown 38 | markup: Markup 39 | objectivec: Objective-C 40 | pascal: Pascal 41 | perl: Perl 42 | php: PHP 43 | text: Plain Text 44 | python: Python 45 | r: R 46 | ruby: Ruby 47 | rust: Rust 48 | sass: Sass 49 | scss: SCSS 50 | shell: Shell 51 | sql: SQL 52 | swift: Swift 53 | typescript: TypeScript 54 | vbnet: VB.net 55 | xml: XML 56 | yaml: YAML 57 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/hi.json: -------------------------------------------------------------------------------- 1 | { 2 | "अ": "a", 3 | "आ": "aa", 4 | "ए": "e", 5 | "ई": "ii", 6 | "ऍ": "ei", 7 | "ऎ": "ae", 8 | "ऐ": "ai", 9 | "इ": "i", 10 | "ओ": "o", 11 | "ऑ": "oi", 12 | "ऒ": "oii", 13 | "ऊ": "uu", 14 | "औ": "ou", 15 | "उ": "u", 16 | "ब": "B", 17 | "भ": "Bha", 18 | "च": "Ca", 19 | "छ": "Chha", 20 | "ड": "Da", 21 | "ढ": "Dha", 22 | "फ": "Fa", 23 | "फ़": "Fi", 24 | "ग": "Ga", 25 | "घ": "Gha", 26 | "ग़": "Ghi", 27 | "ह": "Ha", 28 | "ज": "Ja", 29 | "झ": "Jha", 30 | "क": "Ka", 31 | "ख": "Kha", 32 | "ख़": "Khi", 33 | "ल": "L", 34 | "ळ": "Li", 35 | "ऌ": "Li", 36 | "ऴ": "Lii", 37 | "ॡ": "Lii", 38 | "म": "Ma", 39 | "न": "Na", 40 | "ङ": "Na", 41 | "ञ": "Nia", 42 | "ण": "Nae", 43 | "ऩ": "Ni", 44 | "ॐ": "oms", 45 | "प": "Pa", 46 | "क़": "Qi", 47 | "र": "Ra", 48 | "ऋ": "Ri", 49 | "ॠ": "Ri", 50 | "ऱ": "Ri", 51 | "स": "Sa", 52 | "श": "Sha", 53 | "ष": "Shha", 54 | "ट": "Ta", 55 | "त": "Ta", 56 | "ठ": "Tha", 57 | "द": "Tha", 58 | "थ": "Tha", 59 | "ध": "Thha", 60 | "ड़": "ugDha", 61 | "ढ़": "ugDhha", 62 | "व": "Va", 63 | "य": "Ya", 64 | "य़": "Yi", 65 | "ज़": "Za" 66 | } 67 | -------------------------------------------------------------------------------- /public/site/plugins/kirby3-schema/README.md: -------------------------------------------------------------------------------- 1 | # Kirby 3 Schema 2 | 3 | This plugin is for easily generating JSON Schema structured data. 4 | 5 | ## Install 6 | 7 | ### Download 8 | 9 | Download and copy this repository to `/site/plugins/kirby3-schema`. 10 | 11 | ### Composer 12 | 13 | ``` 14 | composer require hashandsalt/kirby3-schema 15 | ``` 16 | 17 | **** 18 | 19 | ## Commercial Usage 20 | 21 | This plugin is free but if you use it in a commercial project please consider to 22 | - [make a donation 🍻](https://paypal.me/hashandsalt?locale.x=en_GB) or 23 | - [buy a Kirby license using this affiliate link](https://a.paddle.com/v2/click/1129/36141?link=1170) 24 | 25 | **** 26 | 27 | 28 | ## Usage 29 | 30 | It's a wrapper around [spatie/schema-org](https://github.com/spatie/schema-org) that turns it into a site method, used like this: 31 | 32 | ``` 33 | schema('LocalBusiness') 34 | ->name('Hash&Salt') 35 | ->email('email@example.com') 36 | ->contactPoint($page->schema('contactPoint') 37 | ->areaServed('Worldwide') 38 | ) ?> 39 | 40 | It supports anything thats in the [RDFa spec](https://github.com/schemaorg/schemaorg/blob/master/data/schema.rdfa) for structured data which is about 600 data points. Refer to [schema.org site](http://schema.org/docs/schemas.html) for details on each bit. Go nuts :) 41 | -------------------------------------------------------------------------------- /public/kirby/src/Http/Path.php: -------------------------------------------------------------------------------- 1 | 14 | * @link https://getkirby.com 15 | * @copyright Bastian Allgeier GmbH 16 | * @license https://opensource.org/licenses/MIT 17 | */ 18 | class Path extends Collection 19 | { 20 | public function __construct($items) 21 | { 22 | if (is_string($items) === true) { 23 | $items = Str::split($items, '/'); 24 | } 25 | 26 | parent::__construct($items ?? []); 27 | } 28 | 29 | public function __toString(): string 30 | { 31 | return $this->toString(); 32 | } 33 | 34 | public function toString(bool $leadingSlash = false, bool $trailingSlash = false): string 35 | { 36 | if (empty($this->data) === true) { 37 | return ''; 38 | } 39 | 40 | $path = implode('/', $this->data); 41 | 42 | $leadingSlash = $leadingSlash === true ? '/' : null; 43 | $trailingSlash = $trailingSlash === true ? '/' : null; 44 | 45 | return $leadingSlash . $path . $trailingSlash; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/sr.json: -------------------------------------------------------------------------------- 1 | { 2 | "а": "a", 3 | "б": "b", 4 | "в": "v", 5 | "г": "g", 6 | "д": "d", 7 | "ђ": "dj", 8 | "е": "e", 9 | "ж": "z", 10 | "з": "z", 11 | "и": "i", 12 | "ј": "j", 13 | "к": "k", 14 | "л": "l", 15 | "љ": "lj", 16 | "м": "m", 17 | "н": "n", 18 | "њ": "nj", 19 | "о": "o", 20 | "п": "p", 21 | "р": "r", 22 | "с": "s", 23 | "т": "t", 24 | "ћ": "c", 25 | "у": "u", 26 | "ф": "f", 27 | "х": "h", 28 | "ц": "c", 29 | "ч": "c", 30 | "џ": "dz", 31 | "ш": "s", 32 | "А": "A", 33 | "Б": "B", 34 | "В": "V", 35 | "Г": "G", 36 | "Д": "D", 37 | "Ђ": "Dj", 38 | "Е": "E", 39 | "Ж": "Z", 40 | "З": "Z", 41 | "И": "I", 42 | "Ј": "J", 43 | "К": "K", 44 | "Л": "L", 45 | "Љ": "Lj", 46 | "М": "M", 47 | "Н": "N", 48 | "Њ": "Nj", 49 | "О": "O", 50 | "П": "P", 51 | "Р": "R", 52 | "С": "S", 53 | "Т": "T", 54 | "Ћ": "C", 55 | "У": "U", 56 | "Ф": "F", 57 | "Х": "H", 58 | "Ц": "C", 59 | "Ч": "C", 60 | "Џ": "Dz", 61 | "Ш": "S", 62 | "š": "s", 63 | "đ": "dj", 64 | "ž": "z", 65 | "ć": "c", 66 | "č": "c", 67 | "Š": "S", 68 | "Đ": "DJ", 69 | "Ž": "Z", 70 | "Ć": "C", 71 | "Č": "C" 72 | } -------------------------------------------------------------------------------- /src/sass/01-settings/_settings.forms.scss: -------------------------------------------------------------------------------- 1 | // ====================================================================== 2 | // Slate Framework 3 | // ====================================================================== 4 | // 5 | // ====================================================================== 6 | // Slate Forms 7 | // ====================================================================== 8 | 9 | // Main Skin 10 | // --------------------------------------------------------------------- 11 | 12 | $form-skin: ( 13 | // Components 14 | components: ( 15 | baseform: true, 16 | inputs: true, 17 | addons: true, 18 | select: true, 19 | range: true, 20 | validation: true 21 | ), 22 | // Form Element 23 | form: ( 24 | margin: 0 0 0 0, 25 | padding: 0, 26 | color: $dark, 27 | ), 28 | // Legend Element 29 | legend: ( 30 | margin: 0 0 0 0, 31 | line-height: $line-height, 32 | ), 33 | // Fieldset Element 34 | fieldset: ( 35 | margin: 0 0 0 0, 36 | padding: 24px 0 24px 0, 37 | ), 38 | // Label Elements 39 | labels: ( 40 | color: $dark, 41 | spacing: 0 0 0 0, 42 | ), 43 | // Skins 44 | skins: ( 45 | inputs: $input-skin, 46 | addons: $input-skin, 47 | select: $input-skin, 48 | range: $input-skin, 49 | validation: $input-skin, 50 | ), 51 | ); 52 | -------------------------------------------------------------------------------- /public/kirby/config/blocks/image/image.yml: -------------------------------------------------------------------------------- 1 | name: field.blocks.image.name 2 | icon: image 3 | preview: image 4 | fields: 5 | location: 6 | label: field.blocks.image.location 7 | type: radio 8 | columns: 2 9 | default: "kirby" 10 | options: 11 | kirby: Kirby 12 | web: Web 13 | image: 14 | label: field.blocks.image.name 15 | type: files 16 | multiple: false 17 | image: 18 | back: black 19 | uploads: 20 | template: blocks/image 21 | when: 22 | location: kirby 23 | src: 24 | label: field.blocks.image.url 25 | type: url 26 | when: 27 | location: web 28 | alt: 29 | label: field.blocks.image.alt 30 | type: text 31 | icon: title 32 | caption: 33 | label: field.blocks.image.caption 34 | type: writer 35 | icon: text 36 | inline: true 37 | link: 38 | label: field.blocks.image.link 39 | type: text 40 | icon: url 41 | ratio: 42 | label: field.blocks.image.ratio 43 | type: select 44 | placeholder: Auto 45 | width: 1/2 46 | options: 47 | 1/1: "1:1" 48 | 16/9: "16:9" 49 | 10/8: "10:8" 50 | 21/9: "21:9" 51 | 7/5: "7:5" 52 | 4/3: "4:3" 53 | 5/3: "5:3" 54 | 3/2: "3:2" 55 | 3/1: "3:1" 56 | crop: 57 | label: field.blocks.image.crop 58 | type: toggle 59 | width: 1/2 60 | -------------------------------------------------------------------------------- /public/kirby/src/Cms/KirbyTags.php: -------------------------------------------------------------------------------- 1 | 11 | * @link https://getkirby.com 12 | * @copyright Bastian Allgeier GmbH 13 | * @license https://getkirby.com/license 14 | */ 15 | class KirbyTags extends \Kirby\Text\KirbyTags 16 | { 17 | /** 18 | * The KirbyTag rendering class 19 | * 20 | * @var string 21 | */ 22 | protected static $tagClass = 'Kirby\Cms\KirbyTag'; 23 | 24 | /** 25 | * @param string|null $text 26 | * @param array $data 27 | * @param array $options 28 | * @param \Kirby\Cms\App|null $app 29 | * @return string 30 | */ 31 | public static function parse(string $text = null, array $data = [], array $options = [], ?App $app = null): string 32 | { 33 | if ($app !== null) { 34 | $text = $app->apply('kirbytags:before', compact('text', 'data', 'options'), 'text'); 35 | } 36 | 37 | $text = parent::parse($text, $data, $options); 38 | 39 | if ($app !== null) { 40 | $text = $app->apply('kirbytags:after', compact('text', 'data', 'options'), 'text'); 41 | } 42 | 43 | return $text; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /public/site/plugins/hero/snippets/pageshero.php: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 | 6 | 7 | 8 | images()->filterby('feature', true)->first(); ?> 9 | 10 |
11 |
12 |
class="slide-media "> 13 | [1920, 1140, 640], 'src' => $feature, 'type' => 'jpg', 'class' => 'slide-wrapper', 'width' => 1920, 'height' => 1200]); ?> 14 |
15 | 24 |
25 |
26 | 27 | 28 |
29 | 30 |
31 | 32 |
33 | 34 |
35 | 36 |
37 | -------------------------------------------------------------------------------- /public/kirby/config/api/routes/languages.php: -------------------------------------------------------------------------------- 1 | 'languages', 9 | 'method' => 'GET', 10 | 'action' => function () { 11 | return $this->kirby()->languages(); 12 | } 13 | ], 14 | [ 15 | 'pattern' => 'languages', 16 | 'method' => 'POST', 17 | 'action' => function () { 18 | return $this->kirby()->languages()->create($this->requestBody()); 19 | } 20 | ], 21 | [ 22 | 'pattern' => 'languages/(:any)', 23 | 'method' => 'GET', 24 | 'action' => function (string $code) { 25 | return $this->kirby()->languages()->find($code); 26 | } 27 | ], 28 | [ 29 | 'pattern' => 'languages/(:any)', 30 | 'method' => 'PATCH', 31 | 'action' => function (string $code) { 32 | if ($language = $this->kirby()->languages()->find($code)) { 33 | return $language->update($this->requestBody()); 34 | } 35 | } 36 | ], 37 | [ 38 | 'pattern' => 'languages/(:any)', 39 | 'method' => 'DELETE', 40 | 'action' => function (string $code) { 41 | if ($language = $this->kirby()->languages()->find($code)) { 42 | return $language->delete(); 43 | } 44 | } 45 | ] 46 | ]; 47 | -------------------------------------------------------------------------------- /public/kirby/config/fields/number.php: -------------------------------------------------------------------------------- 1 | [ 7 | /** 8 | * Default number that will be saved when a new page/user/file is created 9 | */ 10 | 'default' => function ($default = null) { 11 | return $this->toNumber($default); 12 | }, 13 | /** 14 | * The lowest allowed number 15 | */ 16 | 'min' => function (float $min = null) { 17 | return $min; 18 | }, 19 | /** 20 | * The highest allowed number 21 | */ 22 | 'max' => function (float $max = null) { 23 | return $max; 24 | }, 25 | /** 26 | * Allowed incremental steps between numbers (i.e `0.5`) 27 | */ 28 | 'step' => function ($step = null) { 29 | return $this->toNumber($step); 30 | }, 31 | 'value' => function ($value = null) { 32 | return $this->toNumber($value); 33 | } 34 | ], 35 | 'methods' => [ 36 | 'toNumber' => function ($value) { 37 | if ($this->isEmpty($value) === true) { 38 | return null; 39 | } 40 | 41 | return is_float($value) === true ? $value : (float)Str::float($value); 42 | } 43 | ], 44 | 'validations' => [ 45 | 'min', 46 | 'max' 47 | ] 48 | ]; 49 | -------------------------------------------------------------------------------- /public/kirby/src/Cms/Nest.php: -------------------------------------------------------------------------------- 1 | 15 | * @link https://getkirby.com 16 | * @copyright Bastian Allgeier GmbH 17 | * @license https://getkirby.com/license 18 | */ 19 | class Nest 20 | { 21 | /** 22 | * @param $data 23 | * @param null $parent 24 | * @return mixed 25 | */ 26 | public static function create($data, $parent = null) 27 | { 28 | if (is_scalar($data) === true) { 29 | return new Field($parent, $data, $data); 30 | } 31 | 32 | $result = []; 33 | 34 | foreach ($data as $key => $value) { 35 | if (is_array($value) === true) { 36 | $result[$key] = static::create($value, $parent); 37 | } elseif (is_scalar($value) === true) { 38 | $result[$key] = new Field($parent, $key, $value); 39 | } 40 | } 41 | 42 | if (is_int(key($data))) { 43 | return new NestCollection($result); 44 | } else { 45 | return new NestObject($result); 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /public/kirby/config/blocks/code/code.yml: -------------------------------------------------------------------------------- 1 | name: field.blocks.code.name 2 | icon: code 3 | wysiwyg: true 4 | preview: code 5 | fields: 6 | code: 7 | label: field.blocks.code.name 8 | type: textarea 9 | placeholder: field.blocks.code.placeholder 10 | buttons: false 11 | font: monospace 12 | language: 13 | label: field.blocks.code.language 14 | type: select 15 | default: text 16 | options: 17 | bash: Bash 18 | basic: BASIC 19 | c: C 20 | clojure: Clojure 21 | cpp: C++ 22 | csharp: C# 23 | css: CSS 24 | diff: Diff 25 | elixir: Elixir 26 | elm: Elm 27 | erlang: Erlang 28 | go: Go 29 | graphql: GraphQL 30 | haskell: Haskell 31 | html: HTML 32 | java: Java 33 | js: JavaScript 34 | json: JSON 35 | latext: LaTeX 36 | less: Less 37 | lisp: Lisp 38 | lua: Lua 39 | makefile: Makefile 40 | markdown: Markdown 41 | markup: Markup 42 | objectivec: Objective-C 43 | pascal: Pascal 44 | perl: Perl 45 | php: PHP 46 | text: Plain Text 47 | python: Python 48 | r: R 49 | ruby: Ruby 50 | rust: Rust 51 | sass: Sass 52 | scss: SCSS 53 | shell: Shell 54 | sql: SQL 55 | swift: Swift 56 | typescript: TypeScript 57 | vbnet: VB.net 58 | xml: XML 59 | yaml: YAML 60 | -------------------------------------------------------------------------------- /src/sass/06-components/_components.forms.scss: -------------------------------------------------------------------------------- 1 | // ====================================================================== 2 | // 06-components - Forms 3 | // ====================================================================== 4 | 5 | .form { 6 | @include form-complete; 7 | 8 | .input-image { 9 | width: rem(100px); 10 | height: rem(45px); 11 | margin: rem(12px) 0 0; 12 | } 13 | 14 | [type="range"] { 15 | margin: rem(16px) 0 0; 16 | } 17 | } 18 | 19 | .form-elements { 20 | display: grid; 21 | grid-column-gap: rem(24px); 22 | grid-row-gap: rem(24px); 23 | grid-template-columns: 1fr; 24 | @include minbreak($bp-medium) { 25 | grid-template-columns: 1fr 1fr; 26 | grid-template-rows: auto; 27 | } 28 | @include minbreak($bp-large) { 29 | grid-template-columns: 1fr 1fr; 30 | grid-template-rows: auto; 31 | } 32 | 33 | .form-input { 34 | line-height: 0; 35 | 36 | span { 37 | display: block; 38 | @include type-free(21px, 24px, 24px, 24px, true); 39 | } 40 | } 41 | 42 | .choices { 43 | margin: 0; 44 | padding: 0; 45 | list-style: none; 46 | } 47 | } 48 | 49 | .radios { 50 | @include checkradio(); 51 | } 52 | 53 | .error-box { 54 | border: 1px solid $negative; 55 | background-color: lighten($negative, 60%); 56 | padding: rem(8px); 57 | color: $negative; 58 | 59 | p { 60 | @include type-free($base-font-size, 0, 0, 24px, true); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /config/faviconDescription.json: -------------------------------------------------------------------------------- 1 | { 2 | "masterPicture": "./src/favicon/favicon.svg", 3 | "iconsPath": "./public/assets/favicon", 4 | "design": { 5 | "ios": { 6 | "pictureAspect": "noChange", 7 | "assets": { 8 | "ios6AndPriorIcons": false, 9 | "ios7AndLaterIcons": false, 10 | "precomposedIcons": false, 11 | "declareOnlyDefaultIcon": true 12 | } 13 | }, 14 | "desktopBrowser": { 15 | "design": "raw" 16 | }, 17 | "windows": { 18 | "pictureAspect": "noChange", 19 | "backgroundColor": "#222222", 20 | "onConflict": "override", 21 | "assets": { 22 | "windows80Ie10Tile": false, 23 | "windows10Ie11EdgeTiles": { 24 | "small": false, 25 | "medium": true, 26 | "big": false, 27 | "rectangle": false 28 | } 29 | } 30 | }, 31 | "androidChrome": { 32 | "pictureAspect": "noChange", 33 | "themeColor": "#222222", 34 | "manifest": { 35 | "display": "standalone", 36 | "orientation": "notSet", 37 | "onConflict": "override", 38 | "declared": true 39 | }, 40 | "assets": { 41 | "legacyIcon": false, 42 | "lowResolutionIcons": false 43 | } 44 | }, 45 | "safariPinnedTab": { 46 | "pictureAspect": "silhouette", 47 | "themeColor": "#222222" 48 | } 49 | }, 50 | "settings": { 51 | "scalingAlgorithm": "Mitchell", 52 | "errorOnImageTooSmall": false, 53 | "readmeFile": false, 54 | "htmlCodeFile": false, 55 | "usePathAsIs": false 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /public/kirby/src/Http/Query.php: -------------------------------------------------------------------------------- 1 | 14 | * @link https://getkirby.com 15 | * @copyright Bastian Allgeier GmbH 16 | * @license https://opensource.org/licenses/MIT 17 | */ 18 | class Query extends Obj 19 | { 20 | public function __construct($query) 21 | { 22 | if (is_string($query) === true) { 23 | parse_str(ltrim($query, '?'), $query); 24 | } 25 | 26 | parent::__construct($query ?? []); 27 | } 28 | 29 | public function isEmpty(): bool 30 | { 31 | return empty((array)$this) === true; 32 | } 33 | 34 | public function isNotEmpty(): bool 35 | { 36 | return empty((array)$this) === false; 37 | } 38 | 39 | public function __toString(): string 40 | { 41 | return $this->toString(); 42 | } 43 | 44 | public function toString($questionMark = false): string 45 | { 46 | $query = http_build_query($this); 47 | 48 | if (empty($query) === true) { 49 | return ''; 50 | } 51 | 52 | if ($questionMark === true) { 53 | $query = '?' . $query; 54 | } 55 | 56 | return $query; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /public/kirby/i18n/rules/hy.json: -------------------------------------------------------------------------------- 1 | { 2 | "Ա": "A", 3 | "Բ": "B", 4 | "Գ": "G", 5 | "Դ": "D", 6 | "Ե": "E", 7 | "Զ": "Z", 8 | "Է": "E", 9 | "Ը": "Y", 10 | "Թ": "Th", 11 | "Ժ": "Zh", 12 | "Ի": "I", 13 | "Լ": "L", 14 | "Խ": "Kh", 15 | "Ծ": "Ts", 16 | "Կ": "K", 17 | "Հ": "H", 18 | "Ձ": "Dz", 19 | "Ղ": "Gh", 20 | "Ճ": "Tch", 21 | "Մ": "M", 22 | "Յ": "Y", 23 | "Ն": "N", 24 | "Շ": "Sh", 25 | "Ո": "Vo", 26 | "Չ": "Ch", 27 | "Պ": "P", 28 | "Ջ": "J", 29 | "Ռ": "R", 30 | "Ս": "S", 31 | "Վ": "V", 32 | "Տ": "T", 33 | "Ր": "R", 34 | "Ց": "C", 35 | "Ւ": "u", 36 | "Փ": "Ph", 37 | "Ք": "Q", 38 | "և": "ev", 39 | "Օ": "O", 40 | "Ֆ": "F", 41 | "ա": "a", 42 | "բ": "b", 43 | "գ": "g", 44 | "դ": "d", 45 | "ե": "e", 46 | "զ": "z", 47 | "է": "e", 48 | "ը": "y", 49 | "թ": "th", 50 | "ժ": "zh", 51 | "ի": "i", 52 | "լ": "l", 53 | "խ": "kh", 54 | "ծ": "ts", 55 | "կ": "k", 56 | "հ": "h", 57 | "ձ": "dz", 58 | "ղ": "gh", 59 | "ճ": "tch", 60 | "մ": "m", 61 | "յ": "y", 62 | "ն": "n", 63 | "շ": "sh", 64 | "ո": "vo", 65 | "չ": "ch", 66 | "պ": "p", 67 | "ջ": "j", 68 | "ռ": "r", 69 | "ս": "s", 70 | "վ": "v", 71 | "տ": "t", 72 | "ր": "r", 73 | "ց": "c", 74 | "ւ": "u", 75 | "փ": "ph", 76 | "ք": "q", 77 | "օ": "o", 78 | "ֆ": "f" 79 | } 80 | -------------------------------------------------------------------------------- /public/kirby/config/sections/mixins/parent.php: -------------------------------------------------------------------------------- 1 | [ 7 | /** 8 | * Sets the query to a parent to find items for the list 9 | */ 10 | 'parent' => function (string $parent = null) { 11 | return $parent; 12 | } 13 | ], 14 | 'methods' => [ 15 | 'parentModel' => function () { 16 | $parent = $this->parent; 17 | 18 | if (is_string($parent) === true) { 19 | $query = $parent; 20 | $parent = $this->model->query($query); 21 | 22 | if (!$parent) { 23 | throw new Exception('The parent for the query "' . $query . '" cannot be found in the section "' . $this->name() . '"'); 24 | } 25 | 26 | if ( 27 | is_a($parent, 'Kirby\Cms\Page') === false && 28 | is_a($parent, 'Kirby\Cms\Site') === false && 29 | is_a($parent, 'Kirby\Cms\File') === false && 30 | is_a($parent, 'Kirby\Cms\User') === false 31 | ) { 32 | throw new Exception('The parent for the section "' . $this->name() . '" has to be a page, site or user object'); 33 | } 34 | } 35 | 36 | if ($parent === null) { 37 | return $this->model; 38 | } 39 | 40 | return $parent; 41 | } 42 | ] 43 | ]; 44 | -------------------------------------------------------------------------------- /public/site/plugins/autoresize/index.php: -------------------------------------------------------------------------------- 1 | page()->intendedTemplate(), $excludeTemplates); 10 | if(!empty($excludePages)) $excluded = in_array($file->page()->uid(), $excludePages); 11 | if($file->isResizable() && !$excluded) { 12 | if($file->width() > $maxWidth || $file->height() > $maxHeight){ 13 | try { 14 | kirby()->thumb($file->root(), $file->root(), [ 15 | 'width' => $maxWidth, 16 | 'height' => $maxHeight, 17 | ]); 18 | } 19 | catch (Exception $e) { 20 | throw new Exception($e->getMessage()); 21 | } 22 | } 23 | } 24 | } 25 | 26 | Kirby::plugin('medienbaecker/autoresize', [ 27 | 'options' => [ 28 | 'maxWidth' => 2000, 29 | 'maxHeight' => 2000, 30 | 'excludeTemplates' => [], 31 | 'excludePages' => [] 32 | ], 33 | 'hooks' => [ 34 | 'file.create:after' => function ($file) { 35 | autoresize($file); 36 | }, 37 | 'file.replace:after' => function ($newFile, $oldFile) { 38 | autoresize($newFile); 39 | } 40 | ] 41 | ]); -------------------------------------------------------------------------------- /public/kirby/config/api/collections.php: -------------------------------------------------------------------------------- 1 | [ 12 | 'model' => 'page', 13 | 'type' => 'Kirby\Cms\Pages', 14 | 'view' => 'compact' 15 | ], 16 | 17 | /** 18 | * Files 19 | */ 20 | 'files' => [ 21 | 'model' => 'file', 22 | 'type' => 'Kirby\Cms\Files' 23 | ], 24 | 25 | /** 26 | * Languages 27 | */ 28 | 'languages' => [ 29 | 'model' => 'language', 30 | 'type' => 'Kirby\Cms\Languages' 31 | ], 32 | 33 | /** 34 | * Pages 35 | */ 36 | 'pages' => [ 37 | 'model' => 'page', 38 | 'type' => 'Kirby\Cms\Pages', 39 | 'view' => 'compact' 40 | ], 41 | 42 | /** 43 | * Roles 44 | */ 45 | 'roles' => [ 46 | 'model' => 'role', 47 | 'type' => 'Kirby\Cms\Roles', 48 | 'view' => 'compact' 49 | ], 50 | 51 | /** 52 | * Translations 53 | */ 54 | 'translations' => [ 55 | 'model' => 'translation', 56 | 'type' => 'Kirby\Cms\Translations', 57 | 'view' => 'compact' 58 | ], 59 | 60 | /** 61 | * Users 62 | */ 63 | 'users' => [ 64 | 'default' => function () { 65 | return $this->users(); 66 | }, 67 | 'model' => 'user', 68 | 'type' => 'Kirby\Cms\Users', 69 | 'view' => 'compact' 70 | ] 71 | 72 | ]; 73 | -------------------------------------------------------------------------------- /public/kirby/src/Cms/UserBlueprint.php: -------------------------------------------------------------------------------- 1 | 11 | * @link https://getkirby.com 12 | * @copyright Bastian Allgeier GmbH 13 | * @license https://getkirby.com/license 14 | */ 15 | class UserBlueprint extends Blueprint 16 | { 17 | /** 18 | * UserBlueprint constructor. 19 | * 20 | * @param array $props 21 | * @throws \Kirby\Exception\InvalidArgumentException 22 | */ 23 | public function __construct(array $props) 24 | { 25 | // normalize and translate the description 26 | $props['description'] = $this->i18n($props['description'] ?? null); 27 | 28 | // register the other props 29 | parent::__construct($props); 30 | 31 | // normalize all available page options 32 | $this->props['options'] = $this->normalizeOptions( 33 | $props['options'] ?? true, 34 | // defaults 35 | [ 36 | 'create' => null, 37 | 'changeEmail' => null, 38 | 'changeLanguage' => null, 39 | 'changeName' => null, 40 | 'changePassword' => null, 41 | 'changeRole' => null, 42 | 'delete' => null, 43 | 'update' => null, 44 | ] 45 | ); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /public/kirby/assets/whoops.css: -------------------------------------------------------------------------------- 1 | body { 2 | background: #efefef; 3 | font: normal normal 400 12px/1.5 -apple-system, BlinkMacSystemFont, Segoe UI, 4 | Roboto, Helvetica, Arial, sans-serif; 5 | } 6 | 7 | .left-panel { 8 | background: transparent; 9 | } 10 | 11 | header { 12 | background-color: #313740; 13 | } 14 | 15 | .exc-title-primary { 16 | color: hsl(0, 71%, 55%); 17 | } 18 | 19 | .frame.active { 20 | color: hsl(0, 71%, 55%); 21 | box-shadow: inset -5px 0 0 0 #d16464; 22 | } 23 | 24 | .frame:not(.active):hover { 25 | background: rgba(203, 215, 229, 0.5); 26 | } 27 | 28 | .rightButton { 29 | color: #999; 30 | box-shadow: inset 0 0 0 1px #777; 31 | border-radius: 0; 32 | } 33 | 34 | .rightButton:hover { 35 | box-shadow: inset 0 0 0 1px #555; 36 | color: #777; 37 | } 38 | 39 | .details-heading { 40 | color: #7e9abf; 41 | font-weight: 500; 42 | } 43 | 44 | .frame-code { 45 | background: #000; 46 | } 47 | 48 | pre.code-block, 49 | code.code-block, 50 | .frame-args.code-block, 51 | .frame-args.code-block samp { 52 | background: #16171a; 53 | } 54 | 55 | .linenums li.current { 56 | background: transparent; 57 | } 58 | 59 | .linenums li.current.active { 60 | background: rgba(209, 100, 100, 0.3); 61 | } 62 | 63 | pre .atv, 64 | code .atv, 65 | pre .str, 66 | code .str { 67 | color: #a7bd68; 68 | } 69 | 70 | pre .tag, 71 | code .tag { 72 | color: #d16464; 73 | } 74 | 75 | pre .kwd, 76 | code .kwd { 77 | color: #8abeb7; 78 | } 79 | 80 | pre .atn, 81 | code .atn { 82 | color: #de935f; 83 | } 84 | -------------------------------------------------------------------------------- /public/kirby/config/fields/mixins/options.php: -------------------------------------------------------------------------------- 1 | [ 7 | /** 8 | * API settings for options requests. This will only take affect when `options` is set to `api`. 9 | */ 10 | 'api' => function ($api = null) { 11 | return $api; 12 | }, 13 | /** 14 | * An array with options 15 | */ 16 | 'options' => function ($options = []) { 17 | return $options; 18 | }, 19 | /** 20 | * Query settings for options queries. This will only take affect when `options` is set to `query`. 21 | */ 22 | 'query' => function ($query = null) { 23 | return $query; 24 | }, 25 | ], 26 | 'computed' => [ 27 | 'options' => function (): array { 28 | return $this->getOptions(); 29 | } 30 | ], 31 | 'methods' => [ 32 | 'getOptions' => function () { 33 | return Options::factory( 34 | $this->options(), 35 | $this->props, 36 | $this->model() 37 | ); 38 | }, 39 | 'sanitizeOption' => function ($option) { 40 | $allowed = array_column($this->options(), 'value'); 41 | return in_array($option, $allowed, true) === true ? $option : null; 42 | }, 43 | 'sanitizeOptions' => function ($options) { 44 | $allowed = array_column($this->options(), 'value'); 45 | return array_intersect($options, $allowed); 46 | }, 47 | ] 48 | ]; 49 | -------------------------------------------------------------------------------- /public/kirby/src/Data/Json.php: -------------------------------------------------------------------------------- 1 | 12 | * @link https://getkirby.com 13 | * @copyright Bastian Allgeier GmbH 14 | * @license https://opensource.org/licenses/MIT 15 | */ 16 | class Json extends Handler 17 | { 18 | /** 19 | * Converts an array to an encoded JSON string 20 | * 21 | * @param mixed $data 22 | * @return string 23 | */ 24 | public static function encode($data): string 25 | { 26 | return json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); 27 | } 28 | 29 | /** 30 | * Parses an encoded JSON string and returns a multi-dimensional array 31 | * 32 | * @param mixed $string 33 | * @return array 34 | */ 35 | public static function decode($string): array 36 | { 37 | if ($string === null) { 38 | return []; 39 | } 40 | 41 | if (is_array($string) === true) { 42 | return $string; 43 | } 44 | 45 | if (is_string($string) === false) { 46 | throw new InvalidArgumentException('Invalid JSON data; please pass a string'); 47 | } 48 | 49 | $result = json_decode($string, true); 50 | 51 | if (is_array($result) === true) { 52 | return $result; 53 | } else { 54 | throw new InvalidArgumentException('JSON string is invalid'); 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /public/kirby/config/fields.php: -------------------------------------------------------------------------------- 1 | 'Kirby\Form\Field\BlocksField', 5 | 'checkboxes' => __DIR__ . '/fields/checkboxes.php', 6 | 'date' => __DIR__ . '/fields/date.php', 7 | 'email' => __DIR__ . '/fields/email.php', 8 | 'files' => __DIR__ . '/fields/files.php', 9 | 'gap' => __DIR__ . '/fields/gap.php', 10 | 'headline' => __DIR__ . '/fields/headline.php', 11 | 'hidden' => __DIR__ . '/fields/hidden.php', 12 | 'info' => __DIR__ . '/fields/info.php', 13 | 'layout' => 'Kirby\Form\Field\LayoutField', 14 | 'line' => __DIR__ . '/fields/line.php', 15 | 'list' => __DIR__ . '/fields/list.php', 16 | 'multiselect' => __DIR__ . '/fields/multiselect.php', 17 | 'number' => __DIR__ . '/fields/number.php', 18 | 'pages' => __DIR__ . '/fields/pages.php', 19 | 'radio' => __DIR__ . '/fields/radio.php', 20 | 'range' => __DIR__ . '/fields/range.php', 21 | 'select' => __DIR__ . '/fields/select.php', 22 | 'structure' => __DIR__ . '/fields/structure.php', 23 | 'tags' => __DIR__ . '/fields/tags.php', 24 | 'tel' => __DIR__ . '/fields/tel.php', 25 | 'text' => __DIR__ . '/fields/text.php', 26 | 'textarea' => __DIR__ . '/fields/textarea.php', 27 | 'time' => __DIR__ . '/fields/time.php', 28 | 'toggle' => __DIR__ . '/fields/toggle.php', 29 | 'url' => __DIR__ . '/fields/url.php', 30 | 'users' => __DIR__ . '/fields/users.php', 31 | 'writer' => __DIR__ . '/fields/writer.php' 32 | ]; 33 | -------------------------------------------------------------------------------- /public/kirby/src/Form/Fields.php: -------------------------------------------------------------------------------- 1 | 13 | * @link https://getkirby.com 14 | * @copyright Bastian Allgeier GmbH 15 | * @license https://opensource.org/licenses/MIT 16 | */ 17 | class Fields extends Collection 18 | { 19 | /** 20 | * Internal setter for each object in the Collection. 21 | * This takes care of validation and of setting 22 | * the collection prop on each object correctly. 23 | * 24 | * @param string $name 25 | * @param object|array $field 26 | * @return self 27 | */ 28 | public function __set(string $name, $field) 29 | { 30 | if (is_array($field) === true) { 31 | // use the array key as name if the name is not set 32 | $field['name'] = $field['name'] ?? $name; 33 | $field = Field::factory($field['type'], $field, $this); 34 | } 35 | 36 | return parent::__set($field->name(), $field); 37 | } 38 | 39 | /** 40 | * Converts the fields collection to an 41 | * array and also does that for every 42 | * included field. 43 | * 44 | * @param \Closure|null $map 45 | * @return array 46 | */ 47 | public function toArray(Closure $map = null): array 48 | { 49 | $array = []; 50 | 51 | foreach ($this as $field) { 52 | $array[$field->name()] = $field->toArray(); 53 | } 54 | 55 | return $array; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "forge", 3 | "version": "2.0.5", 4 | "description": "A boilerplate for Kirby CMS & Slate", 5 | "author": "Hash&Salt", 6 | "email": "hello@hashandsalt.com", 7 | "license": "MIT", 8 | "config": { 9 | "favout": "public/assets/favicon", 10 | "speeddevurl": "http://forge.test", 11 | "speedliveurl": "http://forge.test" 12 | }, 13 | "scripts": { 14 | "test": "echo \"Error: no test specified\" && exit 1", 15 | "start": "npx mix watch", 16 | "dev": "npx mix", 17 | "production": "npx mix --production", 18 | "deploy:live:sim": "./config/deploy live", 19 | "deploy:live": "./config/deploy live go", 20 | "deploy:staging:sim": "./config/deploy staging", 21 | "deploy:staging": "./config/deploy staging go", 22 | "content:sync:sim": "./config/deploy sync", 23 | "content:sync": "./config/deploy sync go", 24 | "favicon": "real-favicon generate ./config/faviconDescription.json ./config/faviconData.json $npm_package_config_favout", 25 | "favicon-inject": "real-favicon inject ./config/faviconData.json ./config/ config/*.html", 26 | "sitespeed:dev": "sitespeed.io $npm_package_config_speeddevurl -b chrome", 27 | "sitespeed:live": "sitespeed.io $npm_package_config_speedliveurl -b chrome" 28 | }, 29 | "devDependencies": { 30 | "@slateengine/slatesass": "^8.0.5", 31 | "@slateengine/slatesasskits": "^8.0.7", 32 | "browser-sync": "^2.26.14", 33 | "browser-sync-webpack-plugin": "2.2.2", 34 | "laravel-mix": "^6.0.13", 35 | "postcss": "^8.1", 36 | "sass": "^1.32.8", 37 | "sass-loader": "10.*", 38 | "tiny-slider": "^2.9.3" 39 | }, 40 | "dependencies": { 41 | 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /public/kirby/src/Cms/SiteBlueprint.php: -------------------------------------------------------------------------------- 1 | 11 | * @link https://getkirby.com 12 | * @copyright Bastian Allgeier GmbH 13 | * @license https://getkirby.com/license 14 | */ 15 | class SiteBlueprint extends Blueprint 16 | { 17 | /** 18 | * Creates a new page blueprint object 19 | * with the given props 20 | * 21 | * @param array $props 22 | */ 23 | public function __construct(array $props) 24 | { 25 | parent::__construct($props); 26 | 27 | // normalize all available page options 28 | $this->props['options'] = $this->normalizeOptions( 29 | $props['options'] ?? true, 30 | // defaults 31 | [ 32 | 'changeTitle' => null, 33 | 'update' => null, 34 | ], 35 | // aliases 36 | [ 37 | 'title' => 'changeTitle', 38 | ] 39 | ); 40 | } 41 | 42 | /** 43 | * Returns the preview settings 44 | * The preview setting controls the "Open" 45 | * button in the panel and redirects it to a 46 | * different URL if necessary. 47 | * 48 | * @return string|bool 49 | */ 50 | public function preview() 51 | { 52 | $preview = $this->props['options']['preview'] ?? true; 53 | 54 | if (is_string($preview) === true) { 55 | return $this->model->toString($preview); 56 | } 57 | 58 | return $preview; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /public/kirby/src/Http/Request/Auth/BasicAuth.php: -------------------------------------------------------------------------------- 1 | credentials = base64_decode($token); 35 | $this->username = Str::before($this->credentials, ':'); 36 | $this->password = Str::after($this->credentials, ':'); 37 | } 38 | 39 | /** 40 | * Returns the entire unencoded credentials string 41 | * 42 | * @return string 43 | */ 44 | public function credentials(): string 45 | { 46 | return $this->credentials; 47 | } 48 | 49 | /** 50 | * Returns the password 51 | * 52 | * @return string|null 53 | */ 54 | public function password(): ?string 55 | { 56 | return $this->password; 57 | } 58 | 59 | /** 60 | * Returns the authentication type 61 | * 62 | * @return string 63 | */ 64 | public function type(): string 65 | { 66 | return 'basic'; 67 | } 68 | 69 | /** 70 | * Returns the username 71 | * 72 | * @return string|null 73 | */ 74 | public function username(): ?string 75 | { 76 | return $this->username; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /public/kirby/src/Cms/UserPermissions.php: -------------------------------------------------------------------------------- 1 | 10 | * @link https://getkirby.com 11 | * @copyright Bastian Allgeier GmbH 12 | * @license https://getkirby.com/license 13 | */ 14 | class UserPermissions extends ModelPermissions 15 | { 16 | /** 17 | * @var string 18 | */ 19 | protected $category = 'users'; 20 | 21 | /** 22 | * UserPermissions constructor 23 | * 24 | * @param \Kirby\Cms\Model $model 25 | */ 26 | public function __construct(Model $model) 27 | { 28 | parent::__construct($model); 29 | 30 | // change the scope of the permissions, when the current user is this user 31 | $this->category = $this->user && $this->user->is($model) ? 'user' : 'users'; 32 | } 33 | 34 | /** 35 | * @return bool 36 | */ 37 | protected function canChangeRole(): bool 38 | { 39 | return $this->model->roles()->count() > 1; 40 | } 41 | 42 | /** 43 | * @return bool 44 | */ 45 | protected function canCreate(): bool 46 | { 47 | // the admin can always create new users 48 | if ($this->user->isAdmin() === true) { 49 | return true; 50 | } 51 | 52 | // users who are not admins cannot create admins 53 | if ($this->model->isAdmin() === true) { 54 | return false; 55 | } 56 | 57 | return true; 58 | } 59 | 60 | /** 61 | * @return bool 62 | */ 63 | protected function canDelete(): bool 64 | { 65 | return $this->model->isLastAdmin() !== true; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /public/kirby/src/Toolkit/Controller.php: -------------------------------------------------------------------------------- 1 | 15 | * @link https://getkirby.com 16 | * @copyright Bastian Allgeier GmbH 17 | * @license https://opensource.org/licenses/MIT 18 | */ 19 | class Controller 20 | { 21 | protected $function; 22 | 23 | public function __construct(Closure $function) 24 | { 25 | $this->function = $function; 26 | } 27 | 28 | public function arguments(array $data = []): array 29 | { 30 | $info = new ReflectionFunction($this->function); 31 | $args = []; 32 | 33 | foreach ($info->getParameters() as $parameter) { 34 | $name = $parameter->getName(); 35 | $args[] = $data[$name] ?? null; 36 | } 37 | 38 | return $args; 39 | } 40 | 41 | public function call($bind = null, $data = []) 42 | { 43 | $args = $this->arguments($data); 44 | 45 | if ($bind === null) { 46 | return call_user_func($this->function, ...$args); 47 | } 48 | 49 | return $this->function->call($bind, ...$args); 50 | } 51 | 52 | public static function load(string $file) 53 | { 54 | if (is_file($file) === false) { 55 | return null; 56 | } 57 | 58 | $function = F::load($file); 59 | 60 | if (is_a($function, 'Closure') === false) { 61 | return null; 62 | } 63 | 64 | return new static($function); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /public/site/plugins/kirby3-seo/index.php: -------------------------------------------------------------------------------- 1 | [ 8 | 'seo/meta' => __DIR__ . '/snippets/meta.php', 9 | 'seo/favicon' => __DIR__ . '/snippets/favicon.php' 10 | ], 11 | 12 | 'blueprints' => [ 13 | 'tabs/seo/contact' => __DIR__ . '/blueprints/tabs/contact.yml', 14 | 'tabs/seo/meta' => __DIR__ . '/blueprints/tabs/meta.yml', 15 | 'fields/seo/meta' => __DIR__ . '/blueprints/fields/meta.yml' 16 | ], 17 | 18 | 'controllers' => [ 19 | 20 | 'seo' => function ($page, $kirby, $site) { 21 | return [ 22 | 23 | // Meta 24 | 'metatitle' => $site->title(), 25 | 'metadesc' => $page->seometa(), 26 | 'metakeywords' => $page->seotags(), 27 | 'metarobots' => 'index, follow, noodp', 28 | 'metaurl' => $site->url(), 29 | 'metaimage' => $page->shareimage()->toFile() ? $page->shareimage()->toFile()->crop(1280, 720)->url() : ' ', 30 | 31 | // Facebook Meta 32 | 'metafbtype' => 'website', 33 | 'metafbsitename' => $site->title(), 34 | 'metafblocale' => 'en_GB', 35 | 36 | // Twitter Meta 37 | 'metatwcard' => 'summary_large_image', 38 | 'metatwsite' => $site->socialtwitterurl()->isNotEmpty() ? $site->socialtwitterurl() : ' ', 39 | 'metatwcreator' => $site->twittercreator()->isNotEmpty() ? $site->twittercreator() : ' ', 40 | 41 | ]; 42 | } 43 | ] 44 | ]); 45 | -------------------------------------------------------------------------------- /public/kirby/src/Cms/KirbyTag.php: -------------------------------------------------------------------------------- 1 | 11 | * @link https://getkirby.com 12 | * @copyright Bastian Allgeier GmbH 13 | * @license https://getkirby.com/license 14 | */ 15 | class KirbyTag extends \Kirby\Text\KirbyTag 16 | { 17 | /** 18 | * Finds a file for the given path. 19 | * The method first searches the file 20 | * in the current parent, if it's a page. 21 | * Afterwards it uses Kirby's global file finder. 22 | * 23 | * @param string $path 24 | * @return \Kirby\Cms\File|null 25 | */ 26 | public function file(string $path) 27 | { 28 | $parent = $this->parent(); 29 | 30 | if ( 31 | is_object($parent) === true && 32 | method_exists($parent, 'file') === true && 33 | $file = $parent->file($path) 34 | ) { 35 | return $file; 36 | } 37 | 38 | if (is_a($parent, 'Kirby\Cms\File') === true && $file = $parent->page()->file($path)) { 39 | return $file; 40 | } 41 | 42 | return $this->kirby()->file($path, null, true); 43 | } 44 | 45 | /** 46 | * Returns the current Kirby instance 47 | * 48 | * @return \Kirby\Cms\App 49 | */ 50 | public function kirby() 51 | { 52 | return $this->data['kirby'] ?? App::instance(); 53 | } 54 | 55 | /** 56 | * Returns the parent model 57 | * 58 | * @return \Kirby\Cms\Model|null 59 | */ 60 | public function parent() 61 | { 62 | return $this->data['parent']; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /public/site/plugins/kirby3-seo/snippets/meta.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | "description", "content" => $metadesc]).PHP_EOL ?> 5 | "keywords", "content" => $metakeywords]).PHP_EOL ?> 6 | 7 | "og:title", "content" => $metatitle]).PHP_EOL ?> 8 | "og:type", "content" => $metafbtype]).PHP_EOL ?> 9 | "og:site_name", "content" => $metafbsitename]).PHP_EOL ?> 10 | "og:url", "content" => $metaurl]).PHP_EOL ?> 11 | "og:image", "content" => $metaimage ]).PHP_EOL ?> 12 | "og:description", "content" => $metadesc]).PHP_EOL ?> 13 | "og:locale", "content" => $metafblocale]).PHP_EOL ?> 14 | 15 | "twitter:title", "content" => $metatitle]).PHP_EOL ?> 16 | "twitter:card", "content" => $metatwcard]).PHP_EOL ?> 17 | "twitter:site", "content" => $metatwsite]).PHP_EOL ?> 18 | "twitter:creator", "content" => $metatwcreator]).PHP_EOL ?> 19 | "twitter:image", "content" => $metaimage ]).PHP_EOL ?> 20 | "twitter:url", "content" => $metaurl]).PHP_EOL ?> 21 | "twitter:description", "content" => $metadesc]).PHP_EOL ?> 22 | 23 | "robots", "content" => $metarobots]).PHP_EOL ?> 24 | -------------------------------------------------------------------------------- /public/kirby/config/presets/pages.php: -------------------------------------------------------------------------------- 1 | $headline, 11 | 'type' => 'pages', 12 | 'layout' => 'list', 13 | 'status' => $status 14 | ]; 15 | 16 | if ($props === true) { 17 | $props = []; 18 | } 19 | 20 | if (is_string($props) === true) { 21 | $props = [ 22 | 'headline' => $props 23 | ]; 24 | } 25 | 26 | // inject the global templates definition 27 | if (empty($templates) === false) { 28 | $props['templates'] = $props['templates'] ?? $templates; 29 | } 30 | 31 | return array_replace_recursive($defaults, $props); 32 | }; 33 | 34 | $sections = []; 35 | 36 | $drafts = $props['drafts'] ?? []; 37 | $unlisted = $props['unlisted'] ?? false; 38 | $listed = $props['listed'] ?? []; 39 | 40 | 41 | if ($drafts !== false) { 42 | $sections['drafts'] = $section(t('pages.status.draft'), 'drafts', $drafts); 43 | } 44 | 45 | if ($unlisted !== false) { 46 | $sections['unlisted'] = $section(t('pages.status.unlisted'), 'unlisted', $unlisted); 47 | } 48 | 49 | if ($listed !== false) { 50 | $sections['listed'] = $section(t('pages.status.listed'), 'listed', $listed); 51 | } 52 | 53 | // cleaning up 54 | unset($props['drafts'], $props['unlisted'], $props['listed'], $props['templates']); 55 | 56 | return array_merge($props, ['sections' => $sections]); 57 | }; 58 | -------------------------------------------------------------------------------- /public/kirby/config/fields/checkboxes.php: -------------------------------------------------------------------------------- 1 | ['min', 'options'], 8 | 'props' => [ 9 | /** 10 | * Unset inherited props 11 | */ 12 | 'after' => null, 13 | 'before' => null, 14 | 'icon' => null, 15 | 'placeholder' => null, 16 | 17 | /** 18 | * Arranges the checkboxes in the given number of columns 19 | */ 20 | 'columns' => function (int $columns = 1) { 21 | return $columns; 22 | }, 23 | /** 24 | * Default value for the field, which will be used when a page/file/user is created 25 | */ 26 | 'default' => function ($default = null) { 27 | return Str::split($default, ','); 28 | }, 29 | /** 30 | * Maximum number of checked boxes 31 | */ 32 | 'max' => function (int $max = null) { 33 | return $max; 34 | }, 35 | /** 36 | * Minimum number of checked boxes 37 | */ 38 | 'min' => function (int $min = null) { 39 | return $min; 40 | }, 41 | 'value' => function ($value = null) { 42 | return Str::split($value, ','); 43 | }, 44 | ], 45 | 'computed' => [ 46 | 'default' => function () { 47 | return $this->sanitizeOptions($this->default); 48 | }, 49 | 'value' => function () { 50 | return $this->sanitizeOptions($this->value); 51 | }, 52 | ], 53 | 'save' => function ($value): string { 54 | return A::join($value, ', '); 55 | }, 56 | 'validations' => [ 57 | 'options', 58 | 'max', 59 | 'min' 60 | ] 61 | ]; 62 | -------------------------------------------------------------------------------- /public/site/plugins/entity-field/index.php: -------------------------------------------------------------------------------- 1 | [ 10 | 'toggle' => false, 11 | ], 12 | 'fields' => [ 13 | 'entity' => [ 14 | 'props' => [ 15 | 'fields' => function (array $fields) { 16 | return $fields; 17 | }, 18 | 'icon' => function ($icon = false) { 19 | return $icon; 20 | }, 21 | 'toggle' => function ($toggle = null) { 22 | return $toggle ?? option('oblik.entity-field.toggle'); 23 | }, 24 | ], 25 | 'computed' => [ 26 | 'value' => function () { 27 | $model = Yaml::decode($this->value); 28 | return $this->form($model)->values(); 29 | }, 30 | 'fields' => function () { 31 | return $this->form()->fields()->toArray(); 32 | } 33 | ], 34 | 'methods' => [ 35 | 'form' => function (array $values = []) { 36 | return new Form([ 37 | 'fields' => $this->attrs['fields'], 38 | 'values' => $values, 39 | 'model' => $this->model 40 | ]); 41 | }, 42 | ], 43 | 'save' => function ($value) { 44 | $data = $this->form($value)->data(true); 45 | $dataFiltered = array_filter($data); 46 | 47 | if (count($dataFiltered) > 0) { 48 | return $dataFiltered; 49 | } else { 50 | return null; 51 | } 52 | }, 53 | 'validations' => [ 54 | // needs custom validator to validate the form with: 55 | // $this->field()->form($this->requestBody())->errors() 56 | // before saving @see https://github.com/getkirby/ideas/issues/277 57 | ] 58 | ] 59 | ], 60 | 'fieldMethods' => [ 61 | 'toEntity' => function ($field) { 62 | return new Content($field->yaml(), $field->parent()); 63 | } 64 | ] 65 | ]); 66 | -------------------------------------------------------------------------------- /public/kirby/src/Data/Handler.php: -------------------------------------------------------------------------------- 1 | 15 | * @link https://getkirby.com 16 | * @copyright Bastian Allgeier GmbH 17 | * @license https://opensource.org/licenses/MIT 18 | */ 19 | abstract class Handler 20 | { 21 | /** 22 | * Parses an encoded string and returns a multi-dimensional array 23 | * 24 | * Needs to throw an Exception if the file can't be parsed. 25 | * 26 | * @param mixed $string 27 | * @return array 28 | */ 29 | abstract public static function decode($string): array; 30 | 31 | /** 32 | * Converts an array to an encoded string 33 | * 34 | * @param mixed $data 35 | * @return string 36 | */ 37 | abstract public static function encode($data): string; 38 | 39 | /** 40 | * Reads data from a file 41 | * 42 | * @param string $file 43 | * @return array 44 | */ 45 | public static function read(string $file): array 46 | { 47 | $contents = F::read($file); 48 | if ($contents === false) { 49 | throw new Exception('The file "' . $file . '" does not exist'); 50 | } 51 | 52 | return static::decode($contents); 53 | } 54 | 55 | /** 56 | * Writes data to a file 57 | * 58 | * @param string $file 59 | * @param mixed $data 60 | * @return bool 61 | */ 62 | public static function write(string $file = null, $data = []): bool 63 | { 64 | return F::write($file, static::encode($data)); 65 | } 66 | } 67 | --------------------------------------------------------------------------------