Upgrade to 4.0.0

This commit is contained in:
Bastian Allgeier
2023-11-28 09:33:56 +01:00
parent f96b96af76
commit 3b0b6546ca
480 changed files with 21371 additions and 13327 deletions

1
.gitignore vendored
View File

@@ -48,3 +48,4 @@ Icon
# --------------- # ---------------
/site/config/.license /site/config/.license
/site/config/config.starterkit.test.php

View File

@@ -1,29 +0,0 @@
Title: Through the desert
----
Subheading:
----
Cover:
----
Text: [{"content":{"text":"<p>Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean. A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar.<\/p><p>The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didn\u2019t listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy.<\/p><p>The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didn\u2019t take long until a few insidious Copy Writers ambushed her, made her drunk with Longe and Parole and dragged her into their agency, where they abused her for their projects again and again. And if she hasn\u2019t been rewritten, then they are still using her. Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean.<\/p><p>A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar. The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didn\u2019t listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy. The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didn\u2019t take long until a few insidious Copy Writers ambushed her, made her drunk<\/p>"},"id":"b03f40c3-1dc5-4a89-8874-24f616f86e51","isHidden":false,"type":"text"}]
----
Date: 2018-09-05
----
Author:
----
Tags: sahara, desert, africa
----
Uuid: nFku43Ki3pyS9NyM

View File

@@ -1,29 +0,0 @@
Title: Chasing waterfalls
----
Subheading:
----
Cover:
----
Text: [{"content":{"text":"<p>Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language <strong>ocean<\/strong>. A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar.<\/p><p>The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didn\u2019t listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy.<\/p><p>The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didn\u2019t take long until a few insidious Copy Writers ambushed her, made her drunk with Longe and Parole and dragged her into their agency, where they abused her for their projects again and again. And if she hasn\u2019t been rewritten, then they are still using her. Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean.<\/p><p>A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar. The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didn\u2019t listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy. The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didn\u2019t take long until a few insidious Copy Writers ambushed her, made her drunk<\/p>"},"id":"fff3f248-9a0f-44ec-af0c-a59126be24a4","isHidden":false,"type":"text"}]
----
Date: 2018-10-05
----
Author:
----
Tags: water, nature, waterfalls, landscape
----
Uuid: T18qI7ZUqldFRwhl

View File

@@ -1,29 +0,0 @@
Title: A night in the forest
----
Text: [{"content":{"text":"<p>Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean. A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar.<\/p><p>The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didn\u2019t listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy.<\/p><p>The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didn\u2019t take long until a few insidious Copy Writers ambushed her, made her drunk with Longe and Parole and dragged her into their agency, where they abused her for their projects again and again. And if she hasn\u2019t been rewritten, then they are still using her. Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean.<\/p><p>A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar. The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didn\u2019t listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy. The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didn\u2019t take long until a few insidious Copy Writers ambushed her, made her drunk<\/p>"},"id":"_nEOMzN6tX","isHidden":false,"type":"text"}]
----
Date: 2019-06-25 00:00:00
----
Author:
----
Tags: forest, trees
----
Subheading:
----
Cover:
----
Uuid: jTP2YTVPzlmTTw6y

View File

@@ -1,29 +0,0 @@
Title: Across the ocean
----
Text: [{"content":{"text":"<p>Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean. A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar.<\/p><p>The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didn\u2019t listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy.<\/p><p>The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didn\u2019t take long until a few insidious Copy Writers ambushed her, made her drunk with Longe and Parole and dragged her into their agency, where they abused her for their projects again and again. And if she hasn\u2019t been rewritten, then they are still using her. Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean.<\/p><p>A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar. The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didn\u2019t listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy. The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didn\u2019t take long until a few insidious Copy Writers ambushed her, made her drunk<\/p>"},"id":"a647447a-4226-4fe8-824e-85663f7a80f2","isHidden":false,"type":"text"}]
----
Date: 2020-04-21 00:00:00
----
Author:
----
Tags: ocean, pacific
----
Subheading:
----
Cover:
----
Uuid: QJJVlR8YxRqritd9

View File

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 90 KiB

View File

@@ -0,0 +1,29 @@
Title: Through the desert
----
Text: [{"content":{"text":"<p>Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean. A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar.</p><p>The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didnt listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy.</p><p>The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didnt take long until a few insidious Copy Writers ambushed her, made her drunk with Longe and Parole and dragged her into their agency, where they abused her for their projects again and again. And if she hasnt been rewritten, then they are still using her. Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean.</p><p>A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar. The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didnt listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy. The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didnt take long until a few insidious Copy Writers ambushed her, made her drunk</p>"},"id":"b03f40c3-1dc5-4a89-8874-24f616f86e51","isHidden":false,"type":"text"}]
----
Cover:
----
Date: 2020-09-05 00:00:00
----
Author:
----
Tags: sahara, desert, africa
----
Subheading:
----
Uuid: nFku43Ki3pyS9NyM

View File

@@ -1,29 +0,0 @@
Title: Himalaya and back
----
Text: [{"content":{"text":"Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean. A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar."},"id":"ad72d143-a58f-4c7f-af4e-aa2f5d40d55a","isHidden":false,"type":"text"},{"content":{"text":"The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didn\u2019t listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy."},"id":"9fe2ae56-5578-449b-9a12-87e9592a4762","isHidden":false,"type":"text"},{"content":{"text":"The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didn\u2019t take long until a few insidious Copy Writers ambushed her, made her drunk with Longe and Parole and dragged her into their agency, where they abused her for their projects again and again. And if she hasn\u2019t been rewritten, then they are still using her. Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean."},"id":"76378830-650c-4bf6-b37e-b08c020848a4","isHidden":false,"type":"text"},{"content":{"text":"A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar. The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didn\u2019t listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy. The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didn\u2019t take long until a few insidious Copy Writers ambushed her, made her drunk"},"id":"e413187a-c2cd-42a7-908e-11c153af6907","isHidden":false,"type":"text"}]
----
Date: 2020-09-13 00:00:00
----
Author:
----
Tags: environment, nepal, mountains
----
Subheading:
----
Cover:
----
Uuid: nRb6jA7zJf4Gv8Ti

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,29 @@
Title: Chasing waterfalls
----
Text: [{"content":{"text":"<p>Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language <strong>ocean</strong>. A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar.</p><p>The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didnt listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy.</p><p>The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didnt take long until a few insidious Copy Writers ambushed her, made her drunk with Longe and Parole and dragged her into their agency, where they abused her for their projects again and again. And if she hasnt been rewritten, then they are still using her. Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean.</p><p>A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar. The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didnt listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy. The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didnt take long until a few insidious Copy Writers ambushed her, made her drunk</p>"},"id":"fff3f248-9a0f-44ec-af0c-a59126be24a4","isHidden":false,"type":"text"}]
----
Cover:
----
Date: 2021-10-05 00:00:00
----
Author:
----
Tags: water, nature, waterfalls, landscape
----
Subheading:
----
Uuid: T18qI7ZUqldFRwhl

View File

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 122 KiB

View File

Before

Width:  |  Height:  |  Size: 178 KiB

After

Width:  |  Height:  |  Size: 178 KiB

View File

@@ -0,0 +1,29 @@
Title: A night in the forest
----
Text: [{"content":{"text":"<p>Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean. A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar.</p><p>The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didnt listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy.</p><p>The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didnt take long until a few insidious Copy Writers ambushed her, made her drunk with Longe and Parole and dragged her into their agency, where they abused her for their projects again and again. And if she hasnt been rewritten, then they are still using her. Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean.</p><p>A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar. The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didnt listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy. The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didnt take long until a few insidious Copy Writers ambushed her, made her drunk</p>"},"id":"_nEOMzN6tX","isHidden":false,"type":"text"}]
----
Cover:
----
Date: 2022-06-25 00:00:00
----
Author:
----
Tags: forest, trees
----
Subheading:
----
Uuid: jTP2YTVPzlmTTw6y

View File

@@ -0,0 +1,29 @@
Title: Across the ocean
----
Text: [{"content":{"text":"<p>Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean. A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar.</p><p>The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didnt listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy.</p><p>The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didnt take long until a few insidious Copy Writers ambushed her, made her drunk with Longe and Parole and dragged her into their agency, where they abused her for their projects again and again. And if she hasnt been rewritten, then they are still using her. Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean.</p><p>A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar. The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didnt listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy. The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didnt take long until a few insidious Copy Writers ambushed her, made her drunk</p>"},"id":"a647447a-4226-4fe8-824e-85663f7a80f2","isHidden":false,"type":"text"}]
----
Cover:
----
Date: 2023-04-21 00:00:00
----
Author:
----
Tags: ocean, pacific
----
Subheading:
----
Uuid: QJJVlR8YxRqritd9

View File

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 111 KiB

View File

Before

Width:  |  Height:  |  Size: 214 KiB

After

Width:  |  Height:  |  Size: 214 KiB

View File

@@ -0,0 +1,29 @@
Title: Himalaya and back
----
Text: [{"content":{"text":"Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean. A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar."},"id":"ad72d143-a58f-4c7f-af4e-aa2f5d40d55a","isHidden":false,"type":"text"},{"content":{"text":"The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didnt listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy."},"id":"9fe2ae56-5578-449b-9a12-87e9592a4762","isHidden":false,"type":"text"},{"content":{"text":"The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didnt take long until a few insidious Copy Writers ambushed her, made her drunk with Longe and Parole and dragged her into their agency, where they abused her for their projects again and again. And if she hasnt been rewritten, then they are still using her. Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean."},"id":"76378830-650c-4bf6-b37e-b08c020848a4","isHidden":false,"type":"text"},{"content":{"text":"A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar. The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didnt listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy. The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didnt take long until a few insidious Copy Writers ambushed her, made her drunk"},"id":"e413187a-c2cd-42a7-908e-11c153af6907","isHidden":false,"type":"text"}]
----
Cover:
----
Date: 2023-09-13 00:00:00
----
Author:
----
Tags: environment, nepal, mountains
----
Subheading:
----
Uuid: nRb6jA7zJf4Gv8Ti

View File

Before

Width:  |  Height:  |  Size: 186 KiB

After

Width:  |  Height:  |  Size: 186 KiB

View File

@@ -0,0 +1,29 @@
Title: Exploring the universe
----
Text: [{"content":{"text":"<p>Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean. A small river named Duden flows by <strong>their</strong> place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar.</p>"},"id":"_MtYF6qOmq","isHidden":false,"type":"text"},{"content":{"location":"kirby","image":["file://xkPVM7MdXoEn4do6"],"src":"","alt":"Staring at stars","caption":"Staring at stars","link":"","ratio":"16/9","crop":"true"},"id":"_200yrtaus","isHidden":false,"type":"image"},{"content":{"text":"<p><strong>The Big Oxmox</strong> advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didnt listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic <a href=\"https://getkirby.com\" rel=\"noopener noreferrer nofollow\">Mountains</a>, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy.</p>"},"id":"_J5cUP6Q8A","isHidden":false,"type":"text"},{"content":{"text":"Time flies like an arrow; fruit flies like a banana","citation":"<a href=\"https://en.wikipedia.org/wiki/Anthony_Oettinger\" rel=\"noopener noreferrer nofollow\">Anthony Oettinger</a>"},"id":"_sxaa7bs0y","isHidden":false,"type":"quote"},{"content":{"level":"h2","text":"Let's put a heading here"},"id":"_mg1sjf8a6","isHidden":false,"type":"heading"},{"content":{"text":"<p>But nothing the <u>copy</u> said could convince her and so it didnt take long until a few insidious Copy Writers ambushed her, made her drunk with Longe and Parole and dragged her into their agency, where they abused her for their <em>projects</em> again and again. And if she hasnt been rewritten, then they are still using her. Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean.</p>"},"id":"_1gcmahr5x","isHidden":false,"type":"text"},{"content":{"url":"https://vimeo.com/54400762","caption":"I found this when searching for stars on Vimeo"},"id":"_d5m9sxprv","isHidden":false,"type":"video"},{"content":{"text":"## This is created by some good old markdown\n\nYou can mix it with the other blocks to get even more **flexibility**. Markdown can be <strong>mixed</strong> with HTML too, which is nice. And of course (link: https://getkirby.com text: Kirbytags) are cool too."},"id":"_mxb6p3yof","isHidden":false,"type":"markdown"},{"content":{"text":"<ul><li><p>Look, it's a list</p></li><li><p>With some nice bullet points</p></li><li><p>Here's another one</p><ol><li><p>This is a nested list</p></li><li><p>With even more list items</p></li><li><p>Mixed list types are possible as well</p></li></ol></li></ul>"},"id":"b664b628-4782-4fc5-8b97-8fe6bb57f7fc","isHidden":false,"type":"list"},{"content":{"level":"h2","text":"Stars stars stars"},"id":"_u6rqirt17","isHidden":false,"type":"heading"},{"content":{"text":"<p>Donec ullamcorper nulla non metus auctor fringilla. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna <code>mollis</code> euismod. Nulla vitae elit libero, a pharetra augue. Nullam quis risus eget urna mollis ornare vel eu leo. Aenean lacinia bibendum nulla sed consectetur. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.</p>"},"id":"_35hdmhopv","isHidden":false,"type":"text"},{"content":{"code":"<?php foreach ($page->text()->toBlocks() as $block): ?>\n<div class=\"block\">\n <?= $block ?>\n</div>\n<?php endforeach ?>","language":"php"},"id":"_l0ugjspzr","isHidden":false,"type":"code"},{"content":{"level":"h3","text":"Last heading promised!"},"id":"_9ossz5bvo","isHidden":false,"type":"heading"},{"content":{"text":"<p>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>"},"id":"_uxnakchw6","isHidden":false,"type":"text"}]
----
Cover: - file://tWNX7ZrzJUvS9Vad
----
Date: 2023-11-24 16:00:00
----
Author:
----
Tags: universe, sky
----
Subheading: Our quest to the edge of nowhere
----
Uuid: emTUJl2Q8HlLuVNO

View File

Before

Width:  |  Height:  |  Size: 251 KiB

After

Width:  |  Height:  |  Size: 251 KiB

View File

Before

Width:  |  Height:  |  Size: 191 KiB

After

Width:  |  Height:  |  Size: 191 KiB

View File

@@ -2,19 +2,15 @@ Title: In the jungle of Sumatra
---- ----
Subheading: Text: [{"content":{"text":"<p>Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean. A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar.</p><p>The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didnt listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy.</p><p>The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didnt take long until a few insidious Copy Writers ambushed her, made her drunk with Longe and Parole and dragged her into their agency, where they abused her for their projects again and again. And if she hasnt been rewritten, then they are still using her. Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean.</p><p>A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar. The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didnt listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy. The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country.</p>"},"id":"a05cb9ff-c9d5-4ccf-b332-08889051787a","isHidden":false,"type":"text"}]
---- ----
Cover: - sumatra.jpg Cover: - file://az5it4WXblfSnK9r
---- ----
Text: [{"content":{"text":"<p>Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean. A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar.<\/p><p>The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didn\u2019t listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy.<\/p><p>The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country. But nothing the copy said could convince her and so it didn\u2019t take long until a few insidious Copy Writers ambushed her, made her drunk with Longe and Parole and dragged her into their agency, where they abused her for their projects again and again. And if she hasn\u2019t been rewritten, then they are still using her. Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean.<\/p><p>A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth. Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar. The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didn\u2019t listen. She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek, then she continued her way. On her way she met a copy. The copy warned the Little Blind Text, that where it came from it would have been rewritten a thousand times and everything that was left from its origin would be the word \"and\" and the Little Blind Text should turn around and return to its own, safe country.<\/p>"},"id":"a05cb9ff-c9d5-4ccf-b332-08889051787a","isHidden":false,"type":"text"}] Date: 2019-07-31 00:00:00
----
Date: 2018-07-31
---- ----
@@ -26,4 +22,8 @@ Tags: jungle, nature, travel, sumatra, forest
---- ----
Subheading:
----
Uuid: I9MH5r3tV0EmRomG Uuid: I9MH5r3tV0EmRomG

View File

@@ -17,6 +17,10 @@ trim_trailing_whitespace = true
indent_size = 4 indent_size = 4
insert_final_newline = true insert_final_newline = true
[*.vue.php]
indent_size = 2
insert_final_newline = false
[*.yml] [*.yml]
indent_style = space indent_style = space

View File

@@ -1,7 +1,7 @@
# Kirby License Agreement # Kirby License Agreement
Published: March 21, 2023 Published: November 28, 2023
Source: https://getkirby.com/license/2023-03-21 Source: https://getkirby.com/license/2023-11-28
## About this Agreement ## About this Agreement
@@ -11,44 +11,79 @@ This End User License Agreement (the **"Agreement"**) is fundamental to the rela
If you do not agree to this Agreement, please do not download, install or use Kirby. Installation or use of Kirby signifies that you have read, understood, and agreed to be bound by this Agreement. If you do not agree to this Agreement, please do not download, install or use Kirby. Installation or use of Kirby signifies that you have read, understood, and agreed to be bound by this Agreement.
## Summary
This section summarizes the most important conditions of this Agreement to give you a quick overview:
- With your purchase you obtain a license. A license allows you to use Kirby according to this Agreement.
- Each project (defined by its URL) needs its own license. You need to purchase the right license for your project and/or client. You can find our license variants on <https://getkirby.com/buy>. In some explicitly listed cases, you can use Kirby without having to purchase a license.
- Each license includes any Kirby version that gets released within three years from the date when you first activated your license. We also provide free security updates for older versions that may protect your project beyond three years.
- After those three years, you can continue to use Kirby for your project with any of these versions as long as you want.
- To use any newer version released after this time, you will need to upgrade your license.
- Upgrading your license extends the timeframe for an additional three years during which you can use new releases. You can perform the upgrade at any time.
- You have the right to transfer or reassign a license to another person or project if needed.
- There are some restrictions for use of Kirby that you can find below.
For the full license details, please read the Agreement in full. Only the following sections are legally binding.
## Definitions ## Definitions
Before we get started with the conditions of the Agreement, let's define the terms that will be used throughout it: Before we get started with the conditions of the Agreement, let's define the terms that will be used throughout it:
- When we refer to **"You"**, we mean the licensee. Before purchasing Kirby, that's the individual or company that has downloaded and/or installed Kirby for a Development Installation, Private Installation or Extension Demo. When used for a Public Site, the licensee is the individual or company that has purchased the Kirby license. If you work on a client project and have purchased the Kirby license for your client, you (and _not_ the client) are the licensee. - When we refer to **"You"**, we mean the licensee. Before purchasing Kirby, that's the individual or company that has downloaded and/or installed Kirby for a Development Installation, Private Installation or Extension Demo. When used for a Public Site, the licensee is the individual or company that has purchased the Kirby license. If you work on a client project and have purchased the Kirby license for your client, you (and _not_ the client) are the licensee.
- When we refer to **"We"**/**"Us"**/**"Our"**, we mean the licensor, the Content Folder GmbH & Co. KG. You can find Our company and contact information on Our [contact page](https://getkirby.com/contact). - When we refer to **"We"**/**"Us"**/**"Our"**, we mean the licensor, the Content Folder GmbH & Co. KG. You can find Our company and contact information on Our [contact page](https://getkirby.com/contact).
- **"Client"** is the individual or company on whose behalf You create or work on a Website. This only applies if the client is not the licensee.
- A **"Website"** is a single Kirby project that is defined by its domain name and root directory (e.g. `https://sub.example.com` or `https://example.com/example/`). Each (sub)domain and root directory is a separate Website, even if the projects are related in any way. Exception: If You use the cross-domain multi-language feature with the same `content` folder, these domains count as the same Website. - A **"Website"** is a single Kirby project that is defined by its domain name and root directory (e.g. `https://sub.example.com` or `https://example.com/example/`). Each (sub)domain and root directory is a separate Website, even if the projects are related in any way. Exception: If You use the cross-domain multi-language feature with the same `content` folder, these domains count as the same Website.
You may use Kirby as a headless backend or as a static site generator. In these cases the Website is defined by the domain and root directory of the user- or visitor-facing frontend(s). You may use Kirby as a headless backend or as a static site generator. In these cases the Website is defined by the domain and root directory of the user- or visitor-facing frontend(s).
- A **"Development Installation"** is a Website that is installed purely for the purposes of development and client preview. It must only be accessible by a restricted number of users (like on a personal computer, on a server in a network with restricted access or when protecting a staging website with a password that only a restricted number of users know). - A **"Development Installation"** is a Website that is installed purely for the purposes of development and client preview. It must only be accessible by a restricted number of users (like on a personal computer, on a server in a network with restricted access or when protecting a staging website with a password that only a restricted number of users know).
- A **"Private Installation"** is a Website that is installed purely for personal use. It must only be accessible by You and Your family. - A **"Private Installation"** is a Website that is installed purely for personal use. It must only be accessible by You and Your family.
- An **"Extension Demo"** is a Website with the single purpose to showcase a free or commercial Kirby theme or Kirby plugin, as long as that Website only contains demo content. If the showcased extension is a Kirby theme, the demo content must be exactly as shipped with the theme. Demos for Kirby plugins may _not_ contain any additional content that is not needed to showcase the plugin in use. - An **"Extension Demo"** is a Website with the single purpose to showcase a free or commercial Kirby theme or Kirby plugin, as long as that Website only contains demo content. If the showcased extension is a Kirby theme, the demo content must be exactly as shipped with the theme. Demos for Kirby plugins may _not_ contain any additional content that is not needed to showcase the plugin in use.
- A **"Public Site"** is a Website that is _neither_ a Development Installation, a Private Installation nor an Extension Demo. - A **"Public Site"** is a Website that is _neither_ a Development Installation, a Private Installation nor an Extension Demo.
- An **"Update"** is defined as a Kirby release which adds smaller new features, minor functionality enhancements or bug fixes. This class of release is identified by the change of the revision to the right of the first decimal point, e.g. 3.1 to 3.2, 3.X.1 to 3.X.2 or 3.X.X.1 to 3.X.X.2. - A **"Minor Release"** is a stable Kirby release which adds smaller new features, minor functionality enhancements or bug fixes. This class of release is identified by the change of the revision to the right of the first decimal point, e.g. 4.1 to 4.2, 4.X.1 to 4.X.2.
- An **"Upgrade"** is a major Kirby release which incorporates major new features or enhancements that increase the core functionality of Kirby to a larger extent. This class of release is identified by the change of the revision to the left of the first decimal point, e.g. 3.X to 4.0. - A **"Major Release"** is a stable Kirby release which incorporates major new features or enhancements that increase or change the core functionality of Kirby to a larger extent. It may also deprecate existing parts of the Source Code or change them in a breaking way. This class of release is identified by the change of the revision to the left of the first decimal point, e.g. 4.X to 5.0.
- A **"Major Generation"** is defined as all releases that share the revision to the left of the first decimal point, e.g. 4.0.0, 4.0.X, 4.X.0 and 4.X.X.
- The **"Source Code"** is defined as the contents of all files that are provided with Kirby and that make Kirby work. This includes (but is not limited to) all PHP, JavaScript, JSON, HTML and CSS files as well as all related image and other media files. - The **"Source Code"** is defined as the contents of all files that are provided with Kirby and that make Kirby work. This includes (but is not limited to) all PHP, JavaScript, JSON, HTML and CSS files as well as all related image and other media files.
- The **"Activation Date"** determines the included updates. It is defined like this:
- For a newly purchased license, it is the date when the license was first activated for use with a Public Site.
- When You upgrade an already activated license, it is the date on which the upgrade was performed in Our license hub. If the license is still within the Included Updates Period, the Activation Date of the upgrade license will be set to the end of the Included Updates Period of the existing license.
- When You upgrade a license that had _not_ been activated before, the upgrade license adopts the unactivated state of the existing license. The Activation Date is set on first activation for use with a Public Site.
- The **"Included Updates Period"** is the time span of three (3) years after the Activation Date.
- Licensees (You), Clients and Websites are **"Qualified"** if they satisfy the purchase requirements from the ["Order Process" section](#order-process) of this Agreement.
Every time you see one of these capitalized terms in the following text, it has the meaning that has been explained above. Every time you see one of these capitalized terms in the following text, it has the meaning that has been explained above.
## Usage for a Public Site ## Usage for a Public Site
Installing Kirby on or using it for a Public Site requires a [paid license](https://getkirby.com/buy). Installing Kirby on or using it for a Public Site requires a [paid license](https://getkirby.com/buy). Once a paid license is needed, the license must be immediately activated to the Public Sites domain name and root directory via our license hub or the activation feature in the Kirby Panel.
As Kirby is software and software is intangible, We don't sell it as such. Instead, this Agreement grants a license for each purchase to install and use a single instance of Kirby on a **specific Website**. Additional Kirby licenses must be purchased in order to install and use Kirby on **additional Websites**. As Kirby is software and software is intangible, We don't sell it as such. Instead, this Agreement grants a license for each purchase to install and use a single instance of Kirby on a **specific Website**. Additional Kirby licenses must be purchased in order to install and use Kirby on **additional Websites**.
The license is **non-exclusive** (meaning that You are not the only one who We will issue a license) and **generally non-transferable** (meaning that the one who purchases the license is the licensee). The license is **non-exclusive** (meaning that You are not the only one to whom We will issue a license) and **generally non-transferable** (meaning that the one who purchases the license is the licensee).
On request, We will **transfer** a license to anyone who is also allowed to buy Kirby licenses by law and this Agreement. The new licensee will take over all rights and obligations of this Agreement from You at the moment We confirm the license transfer. On request, We will **transfer** a license to anyone who would be allowed and Qualified to purchase the license by law and this Agreement. The new licensee will take over all rights and obligations of this Agreement from You at the moment We confirm the license transfer.
We will also **reassign** a license to another Website domain and root directory of Your choice, provided that You confirm that the previous Website is no longer in operation and will not be operated with the same license in the future. We will also **reassign** a license to another Qualified Website domain and root directory, if You confirm that the previous Website is no longer in operation and will not be operated with the same license in the future.
If the new licensee, Website or Client in a transfer or reassignment is not Qualified for the existing license, You or the new licensee need to **upgrade the license to the qualifying terms and conditions** before the transfer or reassignment can be performed.
If you need to transfer your Kirby license to another individual or company (for example to your client or a new agency) or reassign it to a different project, please get in touch directly at <support@getkirby.com>. If you need to transfer your Kirby license to another individual or company (for example to your client or a new agency) or reassign it to a different project, please get in touch directly at <support@getkirby.com>.
A license is valid for all Updates of the same major Kirby release. We reserve the right to charge an **upgrade fee for Upgrade releases**. Whether a release is an Update or Upgrade is at Our sole discretion. A license is valid for all Major Releases that We publish before the end of the Included Updates Period. It is also valid for all releases in those Major Generations independent of their release date. Whether a release is a Minor Release or Major Release is at Our sole discretion.
The use of releases in Major Generations that We publish after the Included Updates Period requires a **paid license upgrade**. An upgrade license replaces the existing license.
## Order Process ## Order Process
Our order process is conducted by Our online reseller [Paddle.com](https://paddle.com). Paddle.com is the Merchant of Record for all Our orders. Paddle provides all customer service inquiries and handles returns. Our order process is conducted by Our online reseller [Paddle.com](https://paddle.com). Paddle.com is the Merchant of Record for all Our orders. Paddle provides all customer service inquiries and handles returns.
When purchasing a license, You are **responsible to choose the right license** based on You and the Website project. Different license variants can come with certain requirements towards You and/or the Website project. We publish all such requirements on <https://getkirby.com/buy> in a way that makes them clearly visible before the purchase. With Your purchase, You confirm that You and the Website project qualify for the selected license variant.
If the Website is created for a Client, You need to make sure that the **Client qualifies for the selected license**.
If You purchase licenses **in advance**, You need to ensure to only use the license(s) for projects that satisfy the requirements for the selected license variant(s).
We **reserve the right to verify** at any time after the purchase whether You, the Website and (if applicable) the Client are Qualified. Changes to the situation of You, the Website or the Client as well as changes to the published information on Our "Buy" page after the purchase or after the assignment to a Client do _not_ take effect on an existing license unless You upgrade the license or We transfer or reassign the license on Your request.
## Free Licenses ## Free Licenses
Kirby can be used **for free in the following cases**. Kirby can be used **for free in the following cases**.
@@ -133,7 +168,7 @@ The following cases are exempted from this restriction:
E.g. the following cases are explicitly **_not_ allowed**: E.g. the following cases are explicitly **_not_ allowed**:
- Selling, licensing or distributing a new product based on Kirby that modifies or hides Kirbys identity as a Content Management System (CMS) - Selling, licensing or distributing a new product based on Kirby that modifies or hides Kirbys identity as a Content Management System (CMS)
- Forking Kirby and selling the modified version ([see above](#restrictions__modification-of-the-source-code)) - Forking Kirby and selling the modified version ([see above](#modification-of-the-source-code))
- Buying licenses in bulk and reselling them in your own shop - Buying licenses in bulk and reselling them in your own shop
- Bundling or including Kirbys Source Code in the publication and/or distribution of a Websites source code or a (free or paid) theme or plugin (please use Git submodules or Composer or provide a link to Our repository or website instead) - Bundling or including Kirbys Source Code in the publication and/or distribution of a Websites source code or a (free or paid) theme or plugin (please use Git submodules or Composer or provide a link to Our repository or website instead)
@@ -168,6 +203,14 @@ You may also _not_:
Technical support is **provided as described on Our website** at <https://getkirby.com>. **No representations or guarantees** are made regarding the response time in which support questions are answered, however We will do Our best to respond quickly. Technical support is **provided as described on Our website** at <https://getkirby.com>. **No representations or guarantees** are made regarding the response time in which support questions are answered, however We will do Our best to respond quickly.
For each Major Generation, We aim to provide **security support for three (3) years** after the Major Release. Security support means that We will provide free security updates for the supported releases, which will include fixes for security vulnerabilities according to the following rules:
- We published a security advisory on <https://getkirby.com/security> within the respective security support period. We will publish vulnerabilities on this page as soon as they are known to Us and an official fix for any supported release is available.
- The latest release of the supported Major Generation is affected by the vulnerability.
With each vulnerability, We aim to publish the security advisory and security updates for all supported Major Generations at the same time.
You can find up-to-date information on our currently supported versions in our [public security policy](https://getkirby.com/security).
We reserve the right to **limit technical support for free licenses**. We reserve the right to **limit technical support for free licenses**.
## Refund Policy ## Refund Policy
@@ -204,6 +247,8 @@ YOU EXPRESSLY UNDERSTAND AND AGREE THAT **WE SHALL NOT BE LIABLE** FOR ANY DIREC
Bastian Allgeier **owns all rights**, title and interest to Kirby (including all intellectual property rights) and **reserves all rights to Kirby** that are not expressly granted in this Agreement. Bastian Allgeier **owns all rights**, title and interest to Kirby (including all intellectual property rights) and **reserves all rights to Kirby** that are not expressly granted in this Agreement.
In the event that Kirby will no longer be actively maintained, Bastian Allgeier will provide the Source Code under the terms of a free and open source software (FOSS) license as far as legally and contractually possible.
## Applicable Law & Place of Jurisdiction ## Applicable Law & Place of Jurisdiction
1. For all disputes arising out of or in connection with this Agreement, the courts competent for Neckargemünd, Germany, shall have exclusive jurisdiction. However, We shall have the choice to file lawsuits against You before the courts competent for Your place of business. 1. For all disputes arising out of or in connection with this Agreement, the courts competent for Neckargemünd, Germany, shall have exclusive jurisdiction. However, We shall have the choice to file lawsuits against You before the courts competent for Your place of business.
@@ -219,4 +264,4 @@ Should any provision of this Agreement be or become invalid, void or unenforceab
Due to Kirby's flexibility, you may have special use cases or requirements that don't fit this Agreement. Due to Kirby's flexibility, you may have special use cases or requirements that don't fit this Agreement.
If that's the case or if you have any questions, feel free to get in touch: <support@getkirby.com>. We are happy to think outside the box and find custom license solutions for your creative application of Kirby. If that's the case or if you have any questions, feel free to [get in touch](mailto:support@getkirby.com). We are happy to think outside the box and find custom license solutions for your creative application of Kirby.

View File

@@ -1,3 +1,22 @@
# Security Policy # Security Policy
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. ## Supported versions and past security incidents
You can find up-to-date information on the security status of each version on <https://getkirby.com/security>.
## Security of your Kirby site
We have a detailed [security guide](https://getkirby.com/docs/guide/security) with information on how to keep your Kirby installation secure.
## Reporting a vulnerability
If you have spotted a vulnerability in Kirby's core or the Panel, please make sure to let us know immediately. We appreciate your efforts to responsibly disclose your findings, and will make every effort to acknowledge your contributions.
You can always contact us directly at **<security@getkirby.com>**.
If you want to encrypt your message, our GPG key is [6E6B 057A F491 FFAD 363F 6F49 9101 10FA A459 E120](https://getkirby.com/pgp.asc).
You can also use the [security advisory form on GitHub](https://github.com/getkirby/kirby/security/advisories/new) to securely and privately report a vulnerability to us.
We will send you a response as soon as possible and will keep you informed on our progress towards a fix and announcement.
**Please do not write to us publicly, e.g. in the forum, on Discord or in a GitHub issue. A public report can give attackers valuable time to exploit the issue before it is fixed. By letting us know directly and coordinating the disclosure with us, you can help to protect other Kirby users from such attacks.**

View File

@@ -5,8 +5,8 @@
* stop at older or too recent versions * stop at older or too recent versions
*/ */
if ( if (
version_compare(PHP_VERSION, '8.0.0', '>=') === false || version_compare(PHP_VERSION, '8.1.0', '>=') === false ||
version_compare(PHP_VERSION, '8.3.0', '<') === false version_compare(PHP_VERSION, '8.4.0', '<') === false
) { ) {
die(include __DIR__ . '/views/php.php'); die(include __DIR__ . '/views/php.php');
} }

View File

@@ -1,9 +1,9 @@
{ {
"name": "getkirby/cms", "name": "getkirby/cms",
"description": "The Kirby 3 core", "description": "The Kirby core",
"license": "proprietary", "license": "proprietary",
"type": "kirby-cms", "type": "kirby-cms",
"version": "3.9.8", "version": "4.0.0",
"keywords": [ "keywords": [
"kirby", "kirby",
"cms", "cms",
@@ -24,7 +24,7 @@
"source": "https://github.com/getkirby/kirby" "source": "https://github.com/getkirby/kirby"
}, },
"require": { "require": {
"php": ">=8.0.0 <8.3.0", "php": "~8.1.0 || ~8.2.0 || ~8.3.0",
"ext-SimpleXML": "*", "ext-SimpleXML": "*",
"ext-ctype": "*", "ext-ctype": "*",
"ext-curl": "*", "ext-curl": "*",
@@ -36,16 +36,17 @@
"ext-libxml": "*", "ext-libxml": "*",
"ext-mbstring": "*", "ext-mbstring": "*",
"ext-openssl": "*", "ext-openssl": "*",
"christian-riesen/base32": "1.6.0",
"claviska/simpleimage": "4.0.6", "claviska/simpleimage": "4.0.6",
"composer/semver": "3.4.0", "composer/semver": "3.4.0",
"filp/whoops": "2.15.4", "filp/whoops": "2.15.4",
"getkirby/composer-installer": "^1.2.1", "getkirby/composer-installer": "^1.2.1",
"laminas/laminas-escaper": "2.12.0", "laminas/laminas-escaper": "2.13.0",
"michelf/php-smartypants": "1.8.1", "michelf/php-smartypants": "1.8.1",
"phpmailer/phpmailer": "6.8.1", "phpmailer/phpmailer": "6.9.1",
"symfony/polyfill-intl-idn": "1.28.0", "symfony/polyfill-intl-idn": "1.28.0",
"symfony/polyfill-mbstring": "1.28.0", "symfony/polyfill-mbstring": "1.28.0",
"symfony/yaml": "5.4.30" "symfony/yaml": "6.3.8"
}, },
"replace": { "replace": {
"symfony/polyfill-php72": "*" "symfony/polyfill-php72": "*"
@@ -79,7 +80,7 @@
}, },
"optimize-autoloader": true, "optimize-autoloader": true,
"platform": { "platform": {
"php": "8.0.0" "php": "8.1.0"
}, },
"platform-check": false "platform-check": false
}, },
@@ -106,7 +107,7 @@
], ],
"fix": "php-cs-fixer fix", "fix": "php-cs-fixer fix",
"test": "phpunit --stderr", "test": "phpunit --stderr",
"test:coverage": "phpunit --stderr --coverage-html=tests/coverage", "test:coverage": "XDEBUG_MODE=coverage phpunit --stderr --coverage-html=tests/coverage",
"zip": "composer archive --format=zip --file=dist" "zip": "composer archive --format=zip --file=dist"
} }
} }

139
kirby/composer.lock generated
View File

@@ -4,8 +4,67 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "3b71d9ba412291355108b25c00119867", "content-hash": "c2116047cb2cec949e7949915b204002",
"packages": [ "packages": [
{
"name": "christian-riesen/base32",
"version": "1.6.0",
"source": {
"type": "git",
"url": "https://github.com/ChristianRiesen/base32.git",
"reference": "2e82dab3baa008e24a505649b0d583c31d31e894"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ChristianRiesen/base32/zipball/2e82dab3baa008e24a505649b0d583c31d31e894",
"reference": "2e82dab3baa008e24a505649b0d583c31d31e894",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^2.17",
"phpstan/phpstan": "^0.12",
"phpunit/phpunit": "^8.5.13 || ^9.5"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.x-dev"
}
},
"autoload": {
"psr-4": {
"Base32\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Christian Riesen",
"email": "chris.riesen@gmail.com",
"homepage": "http://christianriesen.com",
"role": "Developer"
}
],
"description": "Base32 encoder/decoder according to RFC 4648",
"homepage": "https://github.com/ChristianRiesen/base32",
"keywords": [
"base32",
"decode",
"encode",
"rfc4648"
],
"support": {
"issues": "https://github.com/ChristianRiesen/base32/issues",
"source": "https://github.com/ChristianRiesen/base32/tree/1.6.0"
},
"time": "2021-02-26T10:19:33+00:00"
},
{ {
"name": "claviska/simpleimage", "name": "claviska/simpleimage",
"version": "4.0.6", "version": "4.0.6",
@@ -260,33 +319,33 @@
}, },
{ {
"name": "laminas/laminas-escaper", "name": "laminas/laminas-escaper",
"version": "2.12.0", "version": "2.13.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laminas/laminas-escaper.git", "url": "https://github.com/laminas/laminas-escaper.git",
"reference": "ee7a4c37bf3d0e8c03635d5bddb5bb3184ead490" "reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/ee7a4c37bf3d0e8c03635d5bddb5bb3184ead490", "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/af459883f4018d0f8a0c69c7a209daef3bf973ba",
"reference": "ee7a4c37bf3d0e8c03635d5bddb5bb3184ead490", "reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-ctype": "*", "ext-ctype": "*",
"ext-mbstring": "*", "ext-mbstring": "*",
"php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0" "php": "~8.1.0 || ~8.2.0 || ~8.3.0"
}, },
"conflict": { "conflict": {
"zendframework/zend-escaper": "*" "zendframework/zend-escaper": "*"
}, },
"require-dev": { "require-dev": {
"infection/infection": "^0.26.6", "infection/infection": "^0.27.0",
"laminas/laminas-coding-standard": "~2.4.0", "laminas/laminas-coding-standard": "~2.5.0",
"maglnet/composer-require-checker": "^3.8.0", "maglnet/composer-require-checker": "^3.8.0",
"phpunit/phpunit": "^9.5.18", "phpunit/phpunit": "^9.6.7",
"psalm/plugin-phpunit": "^0.17.0", "psalm/plugin-phpunit": "^0.18.4",
"vimeo/psalm": "^4.22.0" "vimeo/psalm": "^5.9"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -318,7 +377,7 @@
"type": "community_bridge" "type": "community_bridge"
} }
], ],
"time": "2022-10-10T10:11:09+00:00" "time": "2023-10-10T08:35:13+00:00"
}, },
{ {
"name": "league/color-extractor", "name": "league/color-extractor",
@@ -437,16 +496,16 @@
}, },
{ {
"name": "phpmailer/phpmailer", "name": "phpmailer/phpmailer",
"version": "v6.8.1", "version": "v6.9.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/PHPMailer/PHPMailer.git", "url": "https://github.com/PHPMailer/PHPMailer.git",
"reference": "e88da8d679acc3824ff231fdc553565b802ac016" "reference": "039de174cd9c17a8389754d3b877a2ed22743e18"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/e88da8d679acc3824ff231fdc553565b802ac016", "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/039de174cd9c17a8389754d3b877a2ed22743e18",
"reference": "e88da8d679acc3824ff231fdc553565b802ac016", "reference": "039de174cd9c17a8389754d3b877a2ed22743e18",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -466,6 +525,7 @@
"yoast/phpunit-polyfills": "^1.0.4" "yoast/phpunit-polyfills": "^1.0.4"
}, },
"suggest": { "suggest": {
"decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication",
"ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses",
"ext-openssl": "Needed for secure SMTP sending and DKIM signing", "ext-openssl": "Needed for secure SMTP sending and DKIM signing",
"greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication",
@@ -505,7 +565,7 @@
"description": "PHPMailer is a full-featured email creation and transfer class for PHP", "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
"support": { "support": {
"issues": "https://github.com/PHPMailer/PHPMailer/issues", "issues": "https://github.com/PHPMailer/PHPMailer/issues",
"source": "https://github.com/PHPMailer/PHPMailer/tree/v6.8.1" "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.1"
}, },
"funding": [ "funding": [
{ {
@@ -513,7 +573,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-08-29T08:26:30+00:00" "time": "2023-11-25T22:23:28+00:00"
}, },
{ {
"name": "psr/log", "name": "psr/log",
@@ -567,25 +627,25 @@
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
"version": "v2.5.2", "version": "v3.4.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git", "url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf",
"reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1" "php": ">=8.1"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "2.5-dev" "dev-main": "3.4-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/contracts", "name": "symfony/contracts",
@@ -614,7 +674,7 @@
"description": "A generic function and convention to trigger deprecation notices", "description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0"
}, },
"funding": [ "funding": [
{ {
@@ -630,7 +690,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-01-02T09:53:40+00:00" "time": "2023-05-23T14:45:45+00:00"
}, },
{ {
"name": "symfony/polyfill-ctype", "name": "symfony/polyfill-ctype",
@@ -970,31 +1030,28 @@
}, },
{ {
"name": "symfony/yaml", "name": "symfony/yaml",
"version": "v5.4.30", "version": "v6.3.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/yaml.git", "url": "https://github.com/symfony/yaml.git",
"reference": "c6980e82a6656f6ebfabfd82f7585794cb122554" "reference": "3493af8a8dad7fa91c77fa473ba23ecd95334a92"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/yaml/zipball/c6980e82a6656f6ebfabfd82f7585794cb122554", "url": "https://api.github.com/repos/symfony/yaml/zipball/3493af8a8dad7fa91c77fa473ba23ecd95334a92",
"reference": "c6980e82a6656f6ebfabfd82f7585794cb122554", "reference": "3493af8a8dad7fa91c77fa473ba23ecd95334a92",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.2.5", "php": ">=8.1",
"symfony/deprecation-contracts": "^2.1|^3", "symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-ctype": "^1.8" "symfony/polyfill-ctype": "^1.8"
}, },
"conflict": { "conflict": {
"symfony/console": "<5.3" "symfony/console": "<5.4"
}, },
"require-dev": { "require-dev": {
"symfony/console": "^5.3|^6.0" "symfony/console": "^5.4|^6.0"
},
"suggest": {
"symfony/console": "For validating YAML files using the lint command"
}, },
"bin": [ "bin": [
"Resources/bin/yaml-lint" "Resources/bin/yaml-lint"
@@ -1025,7 +1082,7 @@
"description": "Loads and dumps YAML files", "description": "Loads and dumps YAML files",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/yaml/tree/v5.4.30" "source": "https://github.com/symfony/yaml/tree/v6.3.8"
}, },
"funding": [ "funding": [
{ {
@@ -1041,7 +1098,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-10-27T18:36:14+00:00" "time": "2023-11-06T10:58:05+00:00"
} }
], ],
"packages-dev": [], "packages-dev": [],
@@ -1051,7 +1108,7 @@
"prefer-stable": false, "prefer-stable": false,
"prefer-lowest": false, "prefer-lowest": false,
"platform": { "platform": {
"php": ">=8.0.0 <8.3.0", "php": "~8.1.0 || ~8.2.0 || ~8.3.0",
"ext-simplexml": "*", "ext-simplexml": "*",
"ext-ctype": "*", "ext-ctype": "*",
"ext-curl": "*", "ext-curl": "*",
@@ -1066,7 +1123,7 @@
}, },
"platform-dev": [], "platform-dev": [],
"platform-overrides": { "platform-overrides": {
"php": "8.0.0" "php": "8.1.0"
}, },
"plugin-api-version": "2.6.0" "plugin-api-version": "2.6.0"
} }

View File

@@ -3,7 +3,6 @@
return [ return [
// cms classes // cms classes
'collection' => 'Kirby\Cms\Collection', 'collection' => 'Kirby\Cms\Collection',
'field' => 'Kirby\Cms\Field',
'file' => 'Kirby\Cms\File', 'file' => 'Kirby\Cms\File',
'files' => 'Kirby\Cms\Files', 'files' => 'Kirby\Cms\Files',
'find' => 'Kirby\Cms\Find', 'find' => 'Kirby\Cms\Find',
@@ -24,6 +23,9 @@ return [
'users' => 'Kirby\Cms\Users', 'users' => 'Kirby\Cms\Users',
'visitor' => 'Kirby\Cms\Visitor', 'visitor' => 'Kirby\Cms\Visitor',
// content classes
'field' => 'Kirby\Content\Field',
// data handler // data handler
'data' => 'Kirby\Data\Data', 'data' => 'Kirby\Data\Data',
'json' => 'Kirby\Data\Json', 'json' => 'Kirby\Data\Json',
@@ -69,17 +71,25 @@ return [
'v' => 'Kirby\Toolkit\V', 'v' => 'Kirby\Toolkit\V',
'xml' => 'Kirby\Toolkit\Xml', 'xml' => 'Kirby\Toolkit\Xml',
// TODO: remove in 4.0.0 // Deprecated aliases:
'kirby\cms\asset' => 'Kirby\Filesystem\Asset', // Any of these might be removed at any point in the future
'kirby\cms\dir' => 'Kirby\Filesystem\Dir', 'kirby\cms\asset' => 'Kirby\Filesystem\Asset',
'kirby\cms\filename' => 'Kirby\Filesystem\Filename', 'kirby\cms\content' => 'Kirby\Content\Content',
'kirby\cms\filefoundation' => 'Kirby\Filesystem\IsFile', 'kirby\cms\contenttranslation' => 'Kirby\Content\ContentTranslation',
'kirby\cms\form' => 'Kirby\Form\Form', 'kirby\cms\dir' => 'Kirby\Filesystem\Dir',
'kirby\cms\kirbytag' => 'Kirby\Text\KirbyTag', 'kirby\cms\filename' => 'Kirby\Filesystem\Filename',
'kirby\cms\kirbytags' => 'Kirby\Text\KirbyTags', 'kirby\cms\filefoundation' => 'Kirby\Filesystem\IsFile',
'kirby\cms\template' => 'Kirby\Template\Template', 'kirby\cms\field' => 'Kirby\Content\Field',
'kirby\toolkit\dir' => 'Kirby\Filesystem\Dir', 'kirby\cms\form' => 'Kirby\Form\Form',
'kirby\toolkit\f' => 'Kirby\Filesystem\F', 'kirby\cms\kirbytag' => 'Kirby\Text\KirbyTag',
'kirby\toolkit\file' => 'Kirby\Filesystem\File', 'kirby\cms\kirbytags' => 'Kirby\Text\KirbyTags',
'kirby\toolkit\mime' => 'Kirby\Filesystem\Mime', 'kirby\cms\template' => 'Kirby\Template\Template',
'kirby\form\options' => 'Kirby\Options\Options',
'kirby\form\optionsapi' => 'Kirby\Options\OptionsApi',
'kirby\form\optionsquery' => 'Kirby\Options\OptionsQuery',
'kirby\toolkit\dir' => 'Kirby\Filesystem\Dir',
'kirby\toolkit\f' => 'Kirby\Filesystem\F',
'kirby\toolkit\file' => 'Kirby\Filesystem\File',
'kirby\toolkit\mime' => 'Kirby\Filesystem\Mime',
'kirby\toolkit\query' => 'Kirby\Query\Query',
]; ];

View File

@@ -1,6 +1,6 @@
<?php <?php
use Kirby\Exception\PermissionException; use Kirby\Exception\AuthException;
return function () { return function () {
$auth = $this->kirby()->auth(); $auth = $this->kirby()->auth();
@@ -11,17 +11,17 @@ return function () {
$auth->type($allowImpersonation) === 'session' && $auth->type($allowImpersonation) === 'session' &&
$auth->csrf() === false $auth->csrf() === false
) { ) {
throw new PermissionException('Unauthenticated'); throw new AuthException('Unauthenticated');
} }
// get user from session or basic auth // get user from session or basic auth
if ($user = $auth->user(null, $allowImpersonation)) { if ($user = $auth->user(null, $allowImpersonation)) {
if ($user->role()->permissions()->for('access', 'panel') === false) { if ($user->role()->permissions()->for('access', 'panel') === false) {
throw new PermissionException(['key' => 'access.panel']); throw new AuthException(['key' => 'access.panel']);
} }
return $user; return $user;
} }
throw new PermissionException('Unauthenticated'); throw new AuthException('Unauthenticated');
}; };

View File

@@ -3,6 +3,14 @@
/** /**
* Api Collection Definitions * Api Collection Definitions
*/ */
use Kirby\Cms\Files;
use Kirby\Cms\Languages;
use Kirby\Cms\Pages;
use Kirby\Cms\Roles;
use Kirby\Cms\Translations;
use Kirby\Cms\Users;
return [ return [
/** /**
@@ -10,7 +18,7 @@ return [
*/ */
'children' => [ 'children' => [
'model' => 'page', 'model' => 'page',
'type' => 'Kirby\Cms\Pages', 'type' => Pages::class,
'view' => 'compact' 'view' => 'compact'
], ],
@@ -19,7 +27,7 @@ return [
*/ */
'files' => [ 'files' => [
'model' => 'file', 'model' => 'file',
'type' => 'Kirby\Cms\Files' 'type' => Files::class,
], ],
/** /**
@@ -27,7 +35,7 @@ return [
*/ */
'languages' => [ 'languages' => [
'model' => 'language', 'model' => 'language',
'type' => 'Kirby\Cms\Languages' 'type' => Languages::class,
], ],
/** /**
@@ -35,7 +43,7 @@ return [
*/ */
'pages' => [ 'pages' => [
'model' => 'page', 'model' => 'page',
'type' => 'Kirby\Cms\Pages', 'type' => Pages::class,
'view' => 'compact' 'view' => 'compact'
], ],
@@ -44,7 +52,7 @@ return [
*/ */
'roles' => [ 'roles' => [
'model' => 'role', 'model' => 'role',
'type' => 'Kirby\Cms\Roles', 'type' => Roles::class,
'view' => 'compact' 'view' => 'compact'
], ],
@@ -53,7 +61,7 @@ return [
*/ */
'translations' => [ 'translations' => [
'model' => 'translation', 'model' => 'translation',
'type' => 'Kirby\Cms\Translations', 'type' => Translations::class,
'view' => 'compact' 'view' => 'compact'
], ],
@@ -63,7 +71,7 @@ return [
'users' => [ 'users' => [
'default' => fn () => $this->users(), 'default' => fn () => $this->users(),
'model' => 'user', 'model' => 'user',
'type' => 'Kirby\Cms\Users', 'type' => Users::class,
'view' => 'compact' 'view' => 'compact'
] ]

View File

@@ -8,6 +8,7 @@ return [
'FileBlueprint' => include __DIR__ . '/models/FileBlueprint.php', 'FileBlueprint' => include __DIR__ . '/models/FileBlueprint.php',
'FileVersion' => include __DIR__ . '/models/FileVersion.php', 'FileVersion' => include __DIR__ . '/models/FileVersion.php',
'Language' => include __DIR__ . '/models/Language.php', 'Language' => include __DIR__ . '/models/Language.php',
'License' => include __DIR__ . '/models/License.php',
'Page' => include __DIR__ . '/models/Page.php', 'Page' => include __DIR__ . '/models/Page.php',
'PageBlueprint' => include __DIR__ . '/models/PageBlueprint.php', 'PageBlueprint' => include __DIR__ . '/models/PageBlueprint.php',
'Role' => include __DIR__ . '/models/Role.php', 'Role' => include __DIR__ . '/models/Role.php',

View File

@@ -59,7 +59,7 @@ return [
'url' => fn (File $file) => $file->url(), 'url' => fn (File $file) => $file->url(),
'uuid' => fn (File $file) => $file->uuid()?->toString() 'uuid' => fn (File $file) => $file->uuid()?->toString()
], ],
'type' => 'Kirby\Cms\File', 'type' => File::class,
'views' => [ 'views' => [
'default' => [ 'default' => [
'content', 'content',

View File

@@ -12,7 +12,6 @@ return [
'tabs' => fn (FileBlueprint $blueprint) => $blueprint->tabs(), 'tabs' => fn (FileBlueprint $blueprint) => $blueprint->tabs(),
'title' => fn (FileBlueprint $blueprint) => $blueprint->title(), 'title' => fn (FileBlueprint $blueprint) => $blueprint->title(),
], ],
'type' => 'Kirby\Cms\FileBlueprint', 'type' => FileBlueprint::class,
'views' => [ 'views' => [],
],
]; ];

View File

@@ -20,7 +20,7 @@ return [
'type' => fn (FileVersion $file) => $file->type(), 'type' => fn (FileVersion $file) => $file->type(),
'url' => fn (FileVersion $file) => $file->url(), 'url' => fn (FileVersion $file) => $file->url(),
], ],
'type' => 'Kirby\Cms\FileVersion', 'type' => FileVersion::class,
'views' => [ 'views' => [
'default' => [ 'default' => [
'dimensions', 'dimensions',

View File

@@ -15,7 +15,7 @@ return [
'rules' => fn (Language $language) => $language->rules(), 'rules' => fn (Language $language) => $language->rules(),
'url' => fn (Language $language) => $language->url(), 'url' => fn (Language $language) => $language->url(),
], ],
'type' => 'Kirby\Cms\Language', 'type' => Language::class,
'views' => [ 'views' => [
'default' => [ 'default' => [
'code', 'code',

View File

@@ -0,0 +1,17 @@
<?php
use Kirby\Cms\License;
/**
* Page
*/
return [
'fields' => [
'status' => fn (License $license) => $license->status()->value(),
'code' => function (License $license) {
return $this->kirby()->user()->isAdmin() ? $license->code() : $license->code(true);
},
'type' => fn (License $license) => $license->type()->label(),
],
'type' => License::class,
];

View File

@@ -40,7 +40,7 @@ return [
'url' => fn (Page $page) => $page->url(), 'url' => fn (Page $page) => $page->url(),
'uuid' => fn (Page $page) => $page->uuid()?->toString() 'uuid' => fn (Page $page) => $page->uuid()?->toString()
], ],
'type' => 'Kirby\Cms\Page', 'type' => Page::class,
'views' => [ 'views' => [
'compact' => [ 'compact' => [
'id', 'id',

View File

@@ -15,7 +15,6 @@ return [
'tabs' => fn (PageBlueprint $blueprint) => $blueprint->tabs(), 'tabs' => fn (PageBlueprint $blueprint) => $blueprint->tabs(),
'title' => fn (PageBlueprint $blueprint) => $blueprint->title(), 'title' => fn (PageBlueprint $blueprint) => $blueprint->title(),
], ],
'type' => 'Kirby\Cms\PageBlueprint', 'type' => PageBlueprint::class,
'views' => [ 'views' => [],
],
]; ];

View File

@@ -12,7 +12,7 @@ return [
'permissions' => fn (Role $role) => $role->permissions()->toArray(), 'permissions' => fn (Role $role) => $role->permissions()->toArray(),
'title' => fn (Role $role) => $role->title(), 'title' => fn (Role $role) => $role->title(),
], ],
'type' => 'Kirby\Cms\Role', 'type' => Role::class,
'views' => [ 'views' => [
'compact' => [ 'compact' => [
'description', 'description',

View File

@@ -19,7 +19,7 @@ return [
'title' => fn (Site $site) => $site->title()->value(), 'title' => fn (Site $site) => $site->title()->value(),
'url' => fn (Site $site) => $site->url(), 'url' => fn (Site $site) => $site->url(),
], ],
'type' => 'Kirby\Cms\Site', 'type' => Site::class,
'views' => [ 'views' => [
'compact' => [ 'compact' => [
'title', 'title',

View File

@@ -12,6 +12,6 @@ return [
'tabs' => fn (SiteBlueprint $blueprint) => $blueprint->tabs(), 'tabs' => fn (SiteBlueprint $blueprint) => $blueprint->tabs(),
'title' => fn (SiteBlueprint $blueprint) => $blueprint->title(), 'title' => fn (SiteBlueprint $blueprint) => $blueprint->title(),
], ],
'type' => 'Kirby\Cms\SiteBlueprint', 'type' => SiteBlueprint::class,
'views' => [], 'views' => [],
]; ];

View File

@@ -49,7 +49,7 @@ return [
return null; return null;
} }
], ],
'type' => 'Kirby\Cms\System', 'type' => System::class,
'views' => [ 'views' => [
'login' => [ 'login' => [
'authStatus', 'authStatus',

View File

@@ -13,7 +13,7 @@ return [
'id' => fn (Translation $translation) => $translation->id(), 'id' => fn (Translation $translation) => $translation->id(),
'name' => fn (Translation $translation) => $translation->name(), 'name' => fn (Translation $translation) => $translation->name(),
], ],
'type' => 'Kirby\Cms\Translation', 'type' => Translation::class,
'views' => [ 'views' => [
'compact' => [ 'compact' => [
'direction', 'direction',

View File

@@ -27,7 +27,7 @@ return [
'username' => fn (User $user) => $user->username(), 'username' => fn (User $user) => $user->username(),
'uuid' => fn (User $user) => $user->uuid()?->toString() 'uuid' => fn (User $user) => $user->uuid()?->toString()
], ],
'type' => 'Kirby\Cms\User', 'type' => User::class,
'views' => [ 'views' => [
'default' => [ 'default' => [
'avatar', 'avatar',

View File

@@ -12,7 +12,6 @@ return [
'tabs' => fn (UserBlueprint $blueprint) => $blueprint->tabs(), 'tabs' => fn (UserBlueprint $blueprint) => $blueprint->tabs(),
'title' => fn (UserBlueprint $blueprint) => $blueprint->title(), 'title' => fn (UserBlueprint $blueprint) => $blueprint->title(),
], ],
'type' => 'Kirby\Cms\UserBlueprint', 'type' => UserBlueprint::class,
'views' => [ 'views' => [],
],
]; ];

View File

@@ -19,7 +19,10 @@ return function ($kirby) {
// only add the language routes if the // only add the language routes if the
// multi language setup is activated // multi language setup is activated
if ($kirby->option('languages', false) !== false) { if ($kirby->option('languages', false) !== false) {
$routes = array_merge($routes, include __DIR__ . '/routes/languages.php'); $routes = array_merge(
$routes,
include __DIR__ . '/routes/languages.php'
);
} }
return $routes; return $routes;

View File

@@ -1,7 +1,8 @@
<?php <?php
// routing pattern to match all models with files // routing pattern to match all models with files
$pattern = '(account|pages/[^/]+|site|users/[^/]+)'; $filePattern = '(account/|pages/[^/]+/|site/|users/[^/]+/|)files/(:any)';
$parentPattern = '(account|pages/[^/]+|site|users/[^/]+)/files';
/** /**
* Files Routes * Files Routes
@@ -9,14 +10,14 @@ $pattern = '(account|pages/[^/]+|site|users/[^/]+)';
return [ return [
[ [
'pattern' => $pattern . '/files/(:any)/sections/(:any)', 'pattern' => $filePattern . '/sections/(:any)',
'method' => 'GET', 'method' => 'GET',
'action' => function (string $path, string $filename, string $sectionName) { 'action' => function (string $path, string $filename, string $sectionName) {
return $this->file($path, $filename)->blueprint()->section($sectionName)?->toResponse(); return $this->file($path, $filename)->blueprint()->section($sectionName)?->toResponse();
} }
], ],
[ [
'pattern' => $pattern . '/files/(:any)/fields/(:any)/(:all?)', 'pattern' => $filePattern . '/fields/(:any)/(:all?)',
'method' => 'ALL', 'method' => 'ALL',
'action' => function (string $parent, string $filename, string $fieldName, string $path = null) { 'action' => function (string $parent, string $filename, string $fieldName, string $path = null) {
if ($file = $this->file($parent, $filename)) { if ($file = $this->file($parent, $filename)) {
@@ -25,14 +26,14 @@ return [
} }
], ],
[ [
'pattern' => $pattern . '/files', 'pattern' => $parentPattern,
'method' => 'GET', 'method' => 'GET',
'action' => function (string $path) { 'action' => function (string $path) {
return $this->parent($path)->files()->sorted(); return $this->files($path)->sorted();
} }
], ],
[ [
'pattern' => $pattern . '/files', 'pattern' => $parentPattern,
'method' => 'POST', 'method' => 'POST',
'action' => function (string $path) { 'action' => function (string $path) {
// move_uploaded_file() not working with unit test // move_uploaded_file() not working with unit test
@@ -54,10 +55,10 @@ return [
} }
], ],
[ [
'pattern' => $pattern . '/files/search', 'pattern' => $parentPattern . '/search',
'method' => 'GET|POST', 'method' => 'GET|POST',
'action' => function (string $path) { 'action' => function (string $path) {
$files = $this->parent($path)->files(); $files = $this->files($path);
if ($this->requestMethod() === 'GET') { if ($this->requestMethod() === 'GET') {
return $files->search($this->requestQuery('q')); return $files->search($this->requestQuery('q'));
@@ -67,24 +68,24 @@ return [
} }
], ],
[ [
'pattern' => $pattern . '/files/sort', 'pattern' => $parentPattern . '/sort',
'method' => 'PATCH', 'method' => 'PATCH',
'action' => function (string $path) { 'action' => function (string $path) {
return $this->parent($path)->files()->changeSort( return $this->files($path)->changeSort(
$this->requestBody('files'), $this->requestBody('files'),
$this->requestBody('index') $this->requestBody('index')
); );
} }
], ],
[ [
'pattern' => $pattern . '/files/(:any)', 'pattern' => $filePattern,
'method' => 'GET', 'method' => 'GET',
'action' => function (string $path, string $filename) { 'action' => function (string $path, string $filename) {
return $this->file($path, $filename); return $this->file($path, $filename);
} }
], ],
[ [
'pattern' => $pattern . '/files/(:any)', 'pattern' => $filePattern,
'method' => 'PATCH', 'method' => 'PATCH',
'action' => function (string $path, string $filename) { 'action' => function (string $path, string $filename) {
return $this->file($path, $filename)->update( return $this->file($path, $filename)->update(
@@ -95,7 +96,7 @@ return [
} }
], ],
[ [
'pattern' => $pattern . '/files/(:any)', 'pattern' => $filePattern,
'method' => 'POST', 'method' => 'POST',
'action' => function (string $path, string $filename) { 'action' => function (string $path, string $filename) {
// move the source file from the temp dir // move the source file from the temp dir
@@ -105,28 +106,29 @@ return [
} }
], ],
[ [
'pattern' => $pattern . '/files/(:any)', 'pattern' => $filePattern,
'method' => 'DELETE', 'method' => 'DELETE',
'action' => function (string $path, string $filename) { 'action' => function (string $path, string $filename) {
return $this->file($path, $filename)->delete(); return $this->file($path, $filename)->delete();
} }
], ],
[ [
'pattern' => $pattern . '/files/(:any)/name', 'pattern' => $filePattern . '/name',
'method' => 'PATCH', 'method' => 'PATCH',
'action' => function (string $path, string $filename) { 'action' => function (string $path, string $filename) {
return $this->file($path, $filename)->changeName($this->requestBody('name')); return $this->file($path, $filename)->changeName($this->requestBody('name'));
} }
], ],
[ [
'pattern' => 'files/search', 'pattern' => $parentPattern . '/search',
'method' => 'GET|POST', 'method' => 'GET|POST',
'action' => function () { 'action' => function () {
$files = $this $files = $this
->site() ->site()
->index(true) ->index(true)
->filter('isReadable', true) ->filter('isListable', true)
->files(); ->files()
->filter('isListable', true);
if ($this->requestMethod() === 'GET') { if ($this->requestMethod() === 'GET') {
return $files->search($this->requestQuery('q')); return $files->search($this->requestQuery('q'));

View File

@@ -0,0 +1,35 @@
<?php
// @codeCoverageIgnoreStart
return [
'routes' => function ($kirby) {
return [
[
'pattern' => 'query',
'method' => 'POST|GET',
'auth' => $kirby->option('kql.auth') !== false,
'action' => function () use ($kirby) {
$kql = '\Kirby\Kql\Kql';
if (class_exists($kql) === false) {
return [
'code' => 500,
'status' => 'error',
'message' => 'KQL plugin is not installed',
];
}
$input = $kirby->request()->get();
$result = $kql::run($input);
return [
'code' => 200,
'result' => $result,
'status' => 'ok',
];
}
]
];
}
];
// @codeCoverageIgnoreEnd

View File

@@ -4,8 +4,9 @@
/** /**
* Page Routes * Page Routes
*/ */
return [
return [
[ [
'pattern' => 'pages/(:any)', 'pattern' => 'pages/(:any)',
'method' => 'GET', 'method' => 'GET',

View File

@@ -75,7 +75,7 @@ return [
$pages = $this $pages = $this
->site() ->site()
->index(true) ->index(true)
->filter('isReadable', true); ->filter('isListable', true);
if ($this->requestMethod() === 'GET') { if ($this->requestMethod() === 'GET') {
return $pages->search($this->requestQuery('q')); return $pages->search($this->requestQuery('q'));

View File

@@ -8,6 +8,7 @@ return function () {
'label' => I18n::translate('view.account'), 'label' => I18n::translate('view.account'),
'search' => 'users', 'search' => 'users',
'dialogs' => require __DIR__ . '/account/dialogs.php', 'dialogs' => require __DIR__ . '/account/dialogs.php',
'drawers' => require __DIR__ . '/account/drawers.php',
'dropdowns' => require __DIR__ . '/account/dropdowns.php', 'dropdowns' => require __DIR__ . '/account/dropdowns.php',
'views' => require __DIR__ . '/account/views.php' 'views' => require __DIR__ . '/account/views.php'
]; ];

View File

@@ -1,5 +1,7 @@
<?php <?php
use Kirby\Panel\UserTotpEnableDialog;
$dialogs = require __DIR__ . '/../users/dialogs.php'; $dialogs = require __DIR__ . '/../users/dialogs.php';
return [ return [
@@ -46,6 +48,13 @@ return [
'submit' => $dialogs['user.delete']['submit'], 'submit' => $dialogs['user.delete']['submit'],
], ],
// account fields dialogs
'account.fields' => [
'pattern' => '(account)/files/(:any)/fields/(:any)/(:all?)',
'load' => $dialogs['user.fields']['load'],
'submit' => $dialogs['user.fields']['submit']
],
// change file name // change file name
'account.file.changeName' => [ 'account.file.changeName' => [
'pattern' => '(account)/files/(:any)/changeName', 'pattern' => '(account)/files/(:any)/changeName',
@@ -60,6 +69,13 @@ return [
'submit' => $dialogs['user.file.changeSort']['submit'], 'submit' => $dialogs['user.file.changeSort']['submit'],
], ],
// change file template
'account.file.changeTemplate' => [
'pattern' => '(account)/files/(:any)/changeTemplate',
'load' => $dialogs['user.file.changeTemplate']['load'],
'submit' => $dialogs['user.file.changeTemplate']['submit'],
],
// delete // delete
'account.file.delete' => [ 'account.file.delete' => [
'pattern' => '(account)/files/(:any)/delete', 'pattern' => '(account)/files/(:any)/delete',
@@ -67,4 +83,24 @@ return [
'submit' => $dialogs['user.file.delete']['submit'], 'submit' => $dialogs['user.file.delete']['submit'],
], ],
// account file fields dialogs
'account.file.fields' => [
'pattern' => '(account)/files/(:any)/fields/(:any)/(:all?)',
'load' => $dialogs['user.file.fields']['load'],
'submit' => $dialogs['user.file.fields']['submit']
],
// account enable TOTP
'account.totp.enable' => [
'pattern' => '(account)/totp/enable',
'load' => fn () => (new UserTotpEnableDialog())->load(),
'submit' => fn () => (new UserTotpEnableDialog())->submit()
],
// account disable TOTP
'account.totp.disable' => [
'pattern' => '(account)/totp/disable',
'load' => $dialogs['user.totp.disable']['load'],
'submit' => $dialogs['user.totp.disable']['submit']
],
]; ];

View File

@@ -0,0 +1,19 @@
<?php
$drawers = require __DIR__ . '/../users/drawers.php';
return [
// account fields drawers
'account.fields' => [
'pattern' => '(account)/files/(:any)/fields/(:any)/(:all?)',
'load' => $drawers['user.fields']['load'],
'submit' => $drawers['user.fields']['submit']
],
// account file fields drawers
'account.file.fields' => [
'pattern' => '(account)/files/(:any)/fields/(:any)/(:all?)',
'load' => $drawers['user.file.fields']['load'],
'submit' => $drawers['user.file.fields']['submit']
],
];

View File

@@ -2,6 +2,7 @@
use Kirby\Cms\App; use Kirby\Cms\App;
use Kirby\Cms\Find; use Kirby\Cms\Find;
use Kirby\Toolkit\I18n;
return [ return [
'account' => [ 'account' => [
@@ -19,6 +20,13 @@ return [
], ],
'account.password' => [ 'account.password' => [
'pattern' => 'reset-password', 'pattern' => 'reset-password',
'action' => fn () => ['component' => 'k-reset-password-view'] 'action' => fn () => [
'component' => 'k-reset-password-view',
'breadcrumb' => [
[
'label' => I18n::translate('view.resetPassword')
]
]
]
] ]
]; ];

View File

@@ -0,0 +1,61 @@
<?php
use Kirby\Cms\Find;
use Kirby\Panel\Field;
return [
'model' => [
'load' => function (
string $modelPath,
string $fieldName,
string|null $path = null
) {
return Field::dialog(
model: Find::parent($modelPath),
fieldName: $fieldName,
path: $path,
method: 'GET'
);
},
'submit' => function (
string $modelPath,
string $fieldName,
string|null $path = null
) {
return Field::dialog(
model: Find::parent($modelPath),
fieldName: $fieldName,
path: $path,
method: 'POST'
);
}
],
'file' => [
'load' => function (
string $modelPath,
string $filename,
string $fieldName,
string|null $path = null
) {
return Field::dialog(
model: Find::file($modelPath, $filename),
fieldName: $fieldName,
path: $path,
method: 'GET'
);
},
'submit' => function (
string $modelPath,
string $filename,
string $fieldName,
string|null $path = null
) {
return Field::dialog(
model: Find::file($modelPath, $filename),
fieldName: $fieldName,
path: $path,
method: 'POST'
);
}
],
];

View File

@@ -0,0 +1,61 @@
<?php
use Kirby\Cms\Find;
use Kirby\Panel\Field;
return [
'model' => [
'load' => function (
string $modelPath,
string $fieldName,
string|null $path = null
) {
return Field::drawer(
model: Find::parent($modelPath),
fieldName: $fieldName,
path: $path,
method: 'GET'
);
},
'submit' => function (
string $modelPath,
string $fieldName,
string|null $path = null
) {
return Field::drawer(
model: Find::parent($modelPath),
fieldName: $fieldName,
path: $path,
method: 'POST'
);
}
],
'file' => [
'load' => function (
string $modelPath,
string $filename,
string $fieldName,
string|null $path = null
) {
return Field::drawer(
model: Find::file($modelPath, $filename),
fieldName: $fieldName,
path: $path,
method: 'GET'
);
},
'submit' => function (
string $modelPath,
string $filename,
string $fieldName,
string|null $path = null
) {
return Field::drawer(
model: Find::file($modelPath, $filename),
fieldName: $fieldName,
path: $path,
method: 'POST'
);
}
],
];

View File

@@ -40,7 +40,8 @@ return [
}, },
'submit' => function (string $path, string $filename) { 'submit' => function (string $path, string $filename) {
$file = Find::file($path, $filename); $file = Find::file($path, $filename);
$renamed = $file->changeName($file->kirby()->request()->get('name')); $name = $file->kirby()->request()->get('name');
$renamed = $file->changeName($name);
$oldUrl = $file->panel()->url(true); $oldUrl = $file->panel()->url(true);
$newUrl = $renamed->panel()->url(true); $newUrl = $renamed->panel()->url(true);
$response = [ $response = [
@@ -96,6 +97,44 @@ return [
} }
], ],
'changeTemplate' => [
'load' => function (string $path, string $filename) {
$file = Find::file($path, $filename);
$blueprints = $file->blueprints();
return [
'component' => 'k-form-dialog',
'props' => [
'fields' => [
'warning' => [
'type' => 'info',
'theme' => 'notice',
'text' => I18n::translate('file.changeTemplate.notice')
],
'template' => Field::template($blueprints, [
'required' => true
])
],
'theme' => 'notice',
'submitButton' => I18n::translate('change'),
'value' => [
'template' => $file->template()
]
]
];
},
'submit' => function (string $path, string $filename) {
$file = Find::file($path, $filename);
$template = $file->kirby()->request()->get('template');
$file->changeTemplate($template);
return [
'event' => 'file.changeTemplate',
];
}
],
'delete' => [ 'delete' => [
'load' => function (string $path, string $filename) { 'load' => function (string $path, string $filename) {
$file = Find::file($path, $filename); $file = Find::file($path, $filename);
@@ -129,4 +168,5 @@ return [
]; ];
} }
], ],
]; ];

View File

@@ -0,0 +1,11 @@
<?php
return function () {
return [
'icon' => 'lab',
'label' => 'Lab',
'menu' => false,
'drawers' => require __DIR__ . '/lab/drawers.php',
'views' => require __DIR__ . '/lab/views.php'
];
};

View File

@@ -0,0 +1,30 @@
<?php
use Kirby\Panel\Lab\Docs;
return [
'lab.docs' => [
'pattern' => 'lab/docs/(:any)',
'load' => function (string $component) {
if (Docs::installed() === false) {
return [
'component' => 'k-text-drawer',
'props' => [
'text' => 'The UI docs are not installed.'
]
];
}
$docs = new Docs($component);
return [
'component' => 'k-lab-docs-drawer',
'props' => [
'icon' => 'book',
'title' => $component,
'docs' => $docs->toArray()
]
];
},
],
];

View File

@@ -0,0 +1,138 @@
<?php
use Kirby\Panel\Lab\Category;
use Kirby\Panel\Lab\Docs;
return [
'lab' => [
'pattern' => 'lab',
'action' => function () {
return [
'component' => 'k-lab-index-view',
'props' => [
'categories' => Category::all(),
'info' => Category::installed() ? null : 'The default Lab examples are not installed.',
'tab' => 'examples',
],
];
}
],
'lab.docs' => [
'pattern' => 'lab/docs',
'action' => function () {
$props = match (Docs::installed()) {
true => [
'categories' => [['examples' => Docs::all()]],
'tab' => 'docs',
],
false => [
'info' => 'The UI docs are not installed.',
'tab' => 'docs',
]
};
return [
'component' => 'k-lab-index-view',
'title' => 'Docs',
'breadcrumb' => [
[
'label' => 'Docs',
'link' => 'lab/docs'
]
],
'props' => $props,
];
}
],
'lab.doc' => [
'pattern' => 'lab/docs/(:any)',
'action' => function (string $component) {
$crumbs = [
[
'label' => 'Docs',
'link' => 'lab/docs'
],
[
'label' => $component,
'link' => 'lab/docs/' . $component
]
];
if (Docs::installed() === false) {
return [
'component' => 'k-lab-index-view',
'title' => $component,
'breadcrumb' => $crumbs,
'props' => [
'info' => 'The UI docs are not installed.',
'tab' => 'docs',
],
];
}
$docs = new Docs($component);
return [
'component' => 'k-lab-docs-view',
'title' => $component,
'breadcrumb' => $crumbs,
'props' => [
'component' => $component,
'docs' => $docs->toArray(),
'lab' => $docs->lab()
]
];
}
],
'lab.vue' => [
'pattern' => [
'lab/(:any)/(:any)/index.vue',
'lab/(:any)/(:any)/(:any)/index.vue'
],
'action' => function (
string $category,
string $id,
string|null $tab = null
) {
return Category::factory($category)->example($id, $tab)->serve();
}
],
'lab.example' => [
'pattern' => 'lab/(:any)/(:any)/(:any?)',
'action' => function (
string $category,
string $id,
string|null $tab = null
) {
$category = Category::factory($category);
$example = $category->example($id, $tab);
$props = $example->props();
$vue = $example->vue();
return [
'component' => 'k-lab-playground-view',
'breadcrumb' => [
[
'label' => $category->name(),
],
[
'label' => $example->title(),
'link' => $example->url()
]
],
'props' => [
'docs' => $props['docs'] ?? null,
'examples' => $vue['examples'],
'file' => $example->module(),
'github' => $example->github(),
'props' => $props,
'styles' => $vue['style'],
'tab' => $example->tab(),
'tabs' => array_values($example->tabs()),
'template' => $vue['template'],
'title' => $example->title(),
],
];
}
]
];

View File

@@ -4,7 +4,7 @@ use Kirby\Toolkit\I18n;
return function ($kirby) { return function ($kirby) {
return [ return [
'icon' => 'globe', 'icon' => 'translate',
'label' => I18n::translate('view.languages'), 'label' => I18n::translate('view.languages'),
'menu' => true, 'menu' => true,
'dialogs' => require __DIR__ . '/languages/dialogs.php', 'dialogs' => require __DIR__ . '/languages/dialogs.php',

View File

@@ -2,13 +2,15 @@
use Kirby\Cms\App; use Kirby\Cms\App;
use Kirby\Cms\Find; use Kirby\Cms\Find;
use Kirby\Panel\Field; use Kirby\Cms\LanguageVariable;
use Kirby\Exception\NotFoundException;
use Kirby\Toolkit\A; use Kirby\Toolkit\A;
use Kirby\Toolkit\Escape; use Kirby\Toolkit\Escape;
use Kirby\Toolkit\I18n; use Kirby\Toolkit\I18n;
$languageDialogFields = [ $languageDialogFields = [
'name' => [ 'name' => [
'counter' => false,
'label' => I18n::translate('language.name'), 'label' => I18n::translate('language.name'),
'type' => 'text', 'type' => 'text',
'required' => true, 'required' => true,
@@ -19,7 +21,7 @@ $languageDialogFields = [
'type' => 'text', 'type' => 'text',
'required' => true, 'required' => true,
'counter' => false, 'counter' => false,
'icon' => 'globe', 'icon' => 'translate',
'width' => '1/2' 'width' => '1/2'
], ],
'direction' => [ 'direction' => [
@@ -34,11 +36,27 @@ $languageDialogFields = [
'width' => '1/2' 'width' => '1/2'
], ],
'locale' => [ 'locale' => [
'label' => I18n::translate('language.locale'), 'counter' => false,
'type' => 'text', 'label' => I18n::translate('language.locale'),
'type' => 'text',
], ],
]; ];
$translationDialogFields = [
'key' => [
'counter' => false,
'icon' => null,
'label' => I18n::translate('language.variable.key'),
'type' => 'text'
],
'value' => [
'buttons' => false,
'counter' => false,
'label' => I18n::translate('language.variable.value'),
'type' => 'textarea'
]
];
return [ return [
// create language // create language
@@ -92,8 +110,10 @@ return [
}, },
'submit' => function (string $id) { 'submit' => function (string $id) {
Find::language($id)->delete(); Find::language($id)->delete();
return [ return [
'event' => 'language.delete', 'event' => 'language.delete',
'redirect' => 'languages'
]; ];
} }
], ],
@@ -152,4 +172,95 @@ return [
]; ];
} }
], ],
'language.translation.create' => [
'pattern' => 'languages/(:any)/translations/create',
'load' => function (string $languageCode) use ($translationDialogFields) {
// find the language to make sure it exists
Find::language($languageCode);
return [
'component' => 'k-form-dialog',
'props' => [
'fields' => $translationDialogFields,
'size' => 'large',
],
];
},
'submit' => function (string $languageCode) {
$request = App::instance()->request();
$language = Find::language($languageCode);
$key = $request->get('key', '');
$value = $request->get('value', '');
LanguageVariable::create($key, $value);
if ($language->isDefault() === false) {
$language->variable($key)->update($value);
}
return true;
}
],
'language.translation.delete' => [
'pattern' => 'languages/(:any)/translations/(:any)/delete',
'load' => function (string $languageCode, string $translationKey) {
$variable = Find::language($languageCode)->variable($translationKey, true);
if ($variable->exists() === false) {
throw new NotFoundException([
'key' => 'language.variable.notFound'
]);
}
return [
'component' => 'k-remove-dialog',
'props' => [
'text' => I18n::template('language.variable.delete.confirm', [
'key' => Escape::html($variable->key())
])
],
];
},
'submit' => function (string $languageCode, string $translationKey) {
return Find::language($languageCode)->variable($translationKey, true)->delete();
}
],
'language.translation.update' => [
'pattern' => 'languages/(:any)/translations/(:any)/update',
'load' => function (string $languageCode, string $translationKey) use ($translationDialogFields) {
$variable = Find::language($languageCode)->variable($translationKey, true);
if ($variable->exists() === false) {
throw new NotFoundException([
'key' => 'language.variable.notFound'
]);
}
$fields = $translationDialogFields;
$fields['key']['disabled'] = true;
$fields['value']['autofocus'] = true;
return [
'component' => 'k-form-dialog',
'props' => [
'fields' => $fields,
'size' => 'large',
'value' => [
'key' => $variable->key(),
'value' => $variable->value()
]
],
];
},
'submit' => function (string $languageCode, string $translationKey) {
Find::language($languageCode)->variable($translationKey, true)->update(
App::instance()->request()->get('value')
);
return true;
}
]
]; ];

View File

@@ -1,9 +1,104 @@
<?php <?php
use Kirby\Cms\App; use Kirby\Cms\App;
use Kirby\Cms\Find;
use Kirby\Toolkit\Escape; use Kirby\Toolkit\Escape;
use Kirby\Toolkit\I18n;
return [ return [
'language' => [
'pattern' => 'languages/(:any)',
'when' => function (): bool {
return App::instance()->option('languages.variables', true) !== false;
},
'action' => function (string $code) {
$language = Find::language($code);
$link = '/languages/' . $language->code();
$strings = [];
$foundation = App::instance()->defaultLanguage()->translations();
$translations = $language->translations();
ksort($foundation);
foreach ($foundation as $key => $value) {
$strings[] = [
'key' => $key,
'value' => $translations[$key] ?? null,
'options' => [
[
'click' => 'update',
'icon' => 'edit',
'text' => I18n::translate('edit'),
],
[
'click' => 'delete',
'disabled' => $language->isDefault() === false,
'icon' => 'trash',
'text' => I18n::translate('delete'),
]
]
];
}
$next = function () use ($language) {
if ($next = $language->next()) {
return [
'link' => '/languages/' . $next->code(),
'title' => $next->name(),
];
}
};
$prev = function () use ($language) {
if ($prev = $language->prev()) {
return [
'link' => '/languages/' . $prev->code(),
'title' => $prev->name(),
];
}
};
return [
'component' => 'k-language-view',
'breadcrumb' => [
[
'label' => $name = $language->name(),
'link' => $link,
]
],
'props' => [
'deletable' => $language->isDeletable(),
'code' => Escape::html($language->code()),
'default' => $language->isDefault(),
'direction' => $language->direction(),
'id' => $language->code(),
'info' => [
[
'label' => 'Status',
'value' => I18n::translate('language.' . ($language->isDefault() ? 'default' : 'secondary')),
],
[
'label' => I18n::translate('language.code'),
'value' => $language->code(),
],
[
'label' => I18n::translate('language.locale'),
'value' => $language->locale(LC_ALL)
],
[
'label' => I18n::translate('language.direction'),
'value' => I18n::translate('language.direction.' . $language->direction()),
],
],
'name' => $name,
'next' => $next,
'prev' => $prev,
'translations' => $strings,
'url' => $language->url(),
]
];
}
],
'languages' => [ 'languages' => [
'pattern' => 'languages', 'pattern' => 'languages',
'action' => function () { 'action' => function () {
@@ -13,13 +108,15 @@ return [
'component' => 'k-languages-view', 'component' => 'k-languages-view',
'props' => [ 'props' => [
'languages' => $kirby->languages()->values(fn ($language) => [ 'languages' => $kirby->languages()->values(fn ($language) => [
'default' => $language->isDefault(), 'deletable' => $language->isDeletable(),
'id' => $language->code(), 'default' => $language->isDefault(),
'info' => Escape::html($language->code()), 'id' => $language->code(),
'text' => Escape::html($language->name()), 'info' => Escape::html($language->code()),
]) 'text' => Escape::html($language->name()),
]),
'variables' => $kirby->option('languages.variables', true)
] ]
]; ];
} }
], ]
]; ];

View File

@@ -0,0 +1,11 @@
<?php
use Kirby\Toolkit\I18n;
return function () {
return [
'icon' => 'search',
'label' => I18n::translate('search'),
'views' => require __DIR__ . '/search/views.php'
];
};

View File

@@ -0,0 +1,17 @@
<?php
use Kirby\Cms\App;
return [
'search' => [
'pattern' => 'search',
'action' => function () {
return [
'component' => 'k-search-view',
'props' => [
'type' => App::instance()->request()->get('type'),
]
];
}
],
];

View File

@@ -11,7 +11,9 @@ return function ($kirby) {
'label' => $kirby->site()->blueprint()->title() ?? I18n::translate('view.site'), 'label' => $kirby->site()->blueprint()->title() ?? I18n::translate('view.site'),
'menu' => true, 'menu' => true,
'dialogs' => require __DIR__ . '/site/dialogs.php', 'dialogs' => require __DIR__ . '/site/dialogs.php',
'drawers' => require __DIR__ . '/site/drawers.php',
'dropdowns' => require __DIR__ . '/site/dropdowns.php', 'dropdowns' => require __DIR__ . '/site/dropdowns.php',
'requests' => require __DIR__ . '/site/requests.php',
'searches' => require __DIR__ . '/site/searches.php', 'searches' => require __DIR__ . '/site/searches.php',
'views' => require __DIR__ . '/site/views.php', 'views' => require __DIR__ . '/site/views.php',
]; ];

View File

@@ -2,14 +2,19 @@
use Kirby\Cms\App; use Kirby\Cms\App;
use Kirby\Cms\Find; use Kirby\Cms\Find;
use Kirby\Cms\PageRules;
use Kirby\Exception\Exception; use Kirby\Exception\Exception;
use Kirby\Exception\InvalidArgumentException; use Kirby\Exception\InvalidArgumentException;
use Kirby\Exception\PermissionException; use Kirby\Exception\PermissionException;
use Kirby\Panel\ChangesDialog;
use Kirby\Panel\Field; use Kirby\Panel\Field;
use Kirby\Panel\PageCreateDialog;
use Kirby\Panel\Panel; use Kirby\Panel\Panel;
use Kirby\Toolkit\I18n; use Kirby\Toolkit\I18n;
use Kirby\Toolkit\Str; use Kirby\Toolkit\Str;
use Kirby\Uuid\Uuids;
$fields = require __DIR__ . '/../fields/dialogs.php';
$files = require __DIR__ . '/../files/dialogs.php'; $files = require __DIR__ . '/../files/dialogs.php';
return [ return [
@@ -155,10 +160,16 @@ return [
'component' => 'k-form-dialog', 'component' => 'k-form-dialog',
'props' => [ 'props' => [
'fields' => [ 'fields' => [
'notice' => [
'type' => 'info',
'theme' => 'notice',
'text' => I18n::translate('page.changeTemplate.notice')
],
'template' => Field::template($blueprints, [ 'template' => Field::template($blueprints, [
'required' => true 'required' => true
]) ])
], ],
'theme' => 'notice',
'submitButton' => I18n::translate('change'), 'submitButton' => I18n::translate('change'),
'value' => [ 'value' => [
'template' => $page->intendedTemplate()->name() 'template' => $page->intendedTemplate()->name()
@@ -167,9 +178,10 @@ return [
]; ];
}, },
'submit' => function (string $id) { 'submit' => function (string $id) {
$request = App::instance()->request(); $page = Find::page($id);
$template = App::instance()->request()->get('template');
Find::page($id)->changeTemplate($request->get('template')); $page->changeTemplate($template);
return [ return [
'event' => 'page.changeTemplate', 'event' => 'page.changeTemplate',
@@ -224,17 +236,8 @@ return [
$slug = trim($request->get('slug', '')); $slug = trim($request->get('slug', ''));
// basic input validation before we move on // basic input validation before we move on
if (Str::length($title) === 0) { PageRules::validateTitleLength($title);
throw new InvalidArgumentException([ PageRules::validateSlugLength($slug);
'key' => 'page.changeTitle.empty'
]);
}
if (Str::length($slug) === 0) {
throw new InvalidArgumentException([
'key' => 'page.slug.invalid'
]);
}
// nothing changed // nothing changed
if ($page->title()->value() === $title && $page->slug() === $slug) { if ($page->title()->value() === $title && $page->slug() === $slug) {
@@ -277,93 +280,30 @@ return [
'page.create' => [ 'page.create' => [
'pattern' => 'pages/create', 'pattern' => 'pages/create',
'load' => function () { 'load' => function () {
$kirby = App::instance(); $request = App::instance()->request();
$request = $kirby->request(); $dialog = new PageCreateDialog(
parentId: $request->get('parent'),
sectionId: $request->get('section'),
slug: $request->get('slug'),
template: $request->get('template'),
title: $request->get('title'),
viewId: $request->get('view'),
);
// the parent model for the new page return $dialog->load();
$parent = $request->get('parent', 'site');
// the view on which the add button is located
// this is important to find the right section
// and provide the correct templates for the new page
$view = $request->get('view', $parent);
// templates will be fetched depending on the
// section settings in the blueprint
$section = $request->get('section');
// this is the parent model
$model = Find::parent($parent);
// this is the view model
// i.e. site if the add button is on
// the dashboard
$view = Find::parent($view);
// available blueprints/templates for the new page
// are always loaded depending on the matching section
// in the view model blueprint
$blueprints = $view->blueprints($section);
// the pre-selected template
$template = $blueprints[0]['name'] ?? $blueprints[0]['value'] ?? null;
$fields = [
'parent' => Field::hidden(),
'title' => Field::title([
'required' => true,
'preselect' => true
]),
'slug' => Field::slug([
'required' => true,
'sync' => 'title',
'path' => empty($model->id()) === false ? '/' . $model->id() . '/' : '/'
]),
'template' => Field::hidden()
];
// only show template field if > 1 templates available
// or when in debug mode
if (count($blueprints) > 1 || $kirby->option('debug') === true) {
$fields['template'] = Field::template($blueprints, [
'required' => true
]);
}
return [
'component' => 'k-form-dialog',
'props' => [
'fields' => $fields,
'submitButton' => I18n::translate('page.draft.create'),
'value' => [
'parent' => $parent,
'slug' => '',
'template' => $template,
'title' => '',
]
]
];
}, },
'submit' => function () { 'submit' => function () {
$request = App::instance()->request(); $request = App::instance()->request();
$title = trim($request->get('title', '')); $dialog = new PageCreateDialog(
parentId: $request->get('parent'),
sectionId: $request->get('section'),
slug: $request->get('slug'),
template: $request->get('template'),
title: $request->get('title'),
viewId: $request->get('view'),
);
if (Str::length($title) === 0) { return $dialog->submit($request->get());
throw new InvalidArgumentException([
'key' => 'page.changeTitle.empty'
]);
}
$page = Find::parent($request->get('parent', 'site'))->createChild([
'content' => ['title' => $title],
'slug' => $request->get('slug'),
'template' => $request->get('template'),
]);
return [
'event' => 'page.create',
'redirect' => $page->panel()->url(true)
];
} }
], ],
@@ -529,6 +469,13 @@ return [
} }
], ],
// page field dialogs
'page.fields' => [
'pattern' => '(pages/.*?)/fields/(:any)/(:all?)',
'load' => $fields['model']['load'],
'submit' => $fields['model']['submit']
],
// change filename // change filename
'page.file.changeName' => [ 'page.file.changeName' => [
'pattern' => '(pages/.*?)/files/(:any)/changeName', 'pattern' => '(pages/.*?)/files/(:any)/changeName',
@@ -543,6 +490,13 @@ return [
'submit' => $files['changeSort']['submit'], 'submit' => $files['changeSort']['submit'],
], ],
// change template
'page.file.changeTemplate' => [
'pattern' => '(pages/.*?)/files/(:any)/changeTemplate',
'load' => $files['changeTemplate']['load'],
'submit' => $files['changeTemplate']['submit'],
],
// delete // delete
'page.file.delete' => [ 'page.file.delete' => [
'pattern' => '(pages/.*?)/files/(:any)/delete', 'pattern' => '(pages/.*?)/files/(:any)/delete',
@@ -550,6 +504,56 @@ return [
'submit' => $files['delete']['submit'], 'submit' => $files['delete']['submit'],
], ],
// page file field dialogs
'page.file.fields' => [
'pattern' => '(pages/.*?)/files/(:any)/fields/(:any)/(:all?)',
'load' => $fields['file']['load'],
'submit' => $fields['file']['submit'],
],
// move page
'page.move' => [
'pattern' => 'pages/(:any)/move',
'load' => function (string $id) {
$page = Find::page($id);
$parent = $page->parentModel();
if (Uuids::enabled() === false) {
$parentId = $parent?->id() ?? '/';
} else {
$parentId = $parent?->uuid()->toString() ?? 'site://';
}
return [
'component' => 'k-page-move-dialog',
'props' => [
'value' => [
'move' => $page->panel()->url(true),
'parent' => $parentId
]
]
];
},
'submit' => function (string $id) {
$kirby = App::instance();
$parentId = $kirby->request()->get('parent');
$parent = (empty($parentId) === true || $parentId === '/' || $parentId === 'site://') ? $kirby->site() : Find::page($parentId);
$oldPage = Find::page($id);
$newPage = $oldPage->move($parent);
return [
'event' => 'page.move',
'redirect' => $newPage->panel()->url(true),
'dispatch' => [
'content/move' => [
$oldPage->panel()->url(true),
$newPage->panel()->url(true)
]
],
];
}
],
// change site title // change site title
'site.changeTitle' => [ 'site.changeTitle' => [
'pattern' => 'site/changeTitle', 'pattern' => 'site/changeTitle',
@@ -572,14 +576,21 @@ return [
}, },
'submit' => function () { 'submit' => function () {
$kirby = App::instance(); $kirby = App::instance();
$kirby->site()->changeTitle($kirby->request()->get('title')); $kirby->site()->changeTitle($kirby->request()->get('title'));
return [ return [
'event' => 'site.changeTitle', 'event' => 'site.changeTitle',
]; ];
} }
], ],
// site field dialogs
'site.fields' => [
'pattern' => '(site)/fields/(:any)/(:all?)',
'load' => $fields['model']['load'],
'submit' => $fields['model']['submit'],
],
// change filename // change filename
'site.file.changeName' => [ 'site.file.changeName' => [
'pattern' => '(site)/files/(:any)/changeName', 'pattern' => '(site)/files/(:any)/changeName',
@@ -594,6 +605,13 @@ return [
'submit' => $files['changeSort']['submit'], 'submit' => $files['changeSort']['submit'],
], ],
// change template
'site.file.changeTemplate' => [
'pattern' => '(site)/files/(:any)/changeTemplate',
'load' => $files['changeTemplate']['load'],
'submit' => $files['changeTemplate']['submit'],
],
// delete // delete
'site.file.delete' => [ 'site.file.delete' => [
'pattern' => '(site)/files/(:any)/delete', 'pattern' => '(site)/files/(:any)/delete',
@@ -601,4 +619,24 @@ return [
'submit' => $files['delete']['submit'], 'submit' => $files['delete']['submit'],
], ],
// site file field dialogs
'site.file.fields' => [
'pattern' => '(site)/files/(:any)/fields/(:any)/(:all?)',
'load' => $fields['file']['load'],
'submit' => $fields['file']['submit'],
],
// content changes
'changes' => [
'pattern' => 'changes',
'load' => function () {
$dialog = new ChangesDialog();
return $dialog->load();
},
'submit' => function () {
$dialog = new ChangesDialog();
$ids = App::instance()->request()->get('ids');
return $dialog->submit($ids);
}
],
]; ];

View File

@@ -0,0 +1,33 @@
<?php
$fields = require __DIR__ . '/../fields/drawers.php';
return [
// page field drawers
'page.fields' => [
'pattern' => '(pages/.*?)/fields/(:any)/(:all?)',
'load' => $fields['model']['load'],
'submit' => $fields['model']['submit']
],
// page file field drawers
'page.file.fields' => [
'pattern' => '(pages/.*?)/files/(:any)/fields/(:any)/(:all?)',
'load' => $fields['file']['load'],
'submit' => $fields['file']['submit'],
],
// site field drawers
'site.fields' => [
'pattern' => '(site)/fields/(:any)/(:all?)',
'load' => $fields['model']['load'],
'submit' => $fields['model']['submit'],
],
// site file field drawers
'site.file.fields' => [
'pattern' => '(site)/files/(:any)/fields/(:any)/(:all?)',
'load' => $fields['file']['load'],
'submit' => $fields['file']['submit'],
],
];

View File

@@ -1,14 +1,9 @@
<?php <?php
use Kirby\Panel\Dropdown;
$files = require __DIR__ . '/../files/dropdowns.php'; $files = require __DIR__ . '/../files/dropdowns.php';
return [ return [
'changes' => [
'pattern' => 'changes',
'options' => fn () => Dropdown::changes()
],
'page' => [ 'page' => [
'pattern' => 'pages/(:any)', 'pattern' => 'pages/(:any)',
'options' => function (string $path) { 'options' => function (string $path) {

View File

@@ -0,0 +1,66 @@
<?php
use Kirby\Cms\App;
use Kirby\Cms\Find;
use Kirby\Toolkit\I18n;
return [
'tree' => [
'pattern' => 'site/tree',
'action' => function () {
$kirby = App::instance();
$request = $kirby->request();
$move = $request->get('move');
$move = $move ? Find::parent($move) : null;
$parent = $request->get('parent');
if ($parent === null) {
$site = $kirby->site();
$panel = $site->panel();
$uuid = $site->uuid()?->toString();
$url = $site->url();
$value = $uuid ?? '/';
return [
[
'children' => $panel->url(true),
'disabled' => $move?->isMovableTo($site) === false,
'hasChildren' => true,
'icon' => 'home',
'id' => '/',
'label' => I18n::translate('view.site'),
'open' => false,
'url' => $url,
'uuid' => $uuid,
'value' => $value
]
];
}
$parent = Find::parent($parent);
$pages = [];
foreach ($parent->childrenAndDrafts()->filterBy('isListable', true) as $child) {
$panel = $child->panel();
$uuid = $child->uuid()?->toString();
$url = $child->url();
$value = $uuid ?? $child->id();
$pages[] = [
'children' => $panel->url(true),
'disabled' => $move?->isMovableTo($child) === false,
'hasChildren' => $child->hasChildren() === true || $child->hasDrafts() === true,
'icon' => $panel->image()['icon'] ?? null,
'id' => $child->id(),
'open' => false,
'label' => $child->title()->value(),
'url' => $url,
'uuid' => $uuid,
'value' => $value
];
}
return $pages;
}
]
];

View File

@@ -8,50 +8,49 @@ return [
'pages' => [ 'pages' => [
'label' => I18n::translate('pages'), 'label' => I18n::translate('pages'),
'icon' => 'page', 'icon' => 'page',
'query' => function (string $query = null) { 'query' => function (string $query = null, int $limit, int $page) {
$pages = App::instance()->site() $kirby = App::instance();
$pages = $kirby->site()
->index(true) ->index(true)
->search($query) ->search($query)
->filter('isReadable', true) ->filter('isListable', true)
->limit(10); ->paginate($limit, $page);
$results = []; return [
'results' => $pages->values(fn ($page) => [
foreach ($pages as $page) {
$results[] = [
'image' => $page->panel()->image(), 'image' => $page->panel()->image(),
'text' => Escape::html($page->title()->value()), 'text' => Escape::html($page->title()->value()),
'link' => $page->panel()->url(true), 'link' => $page->panel()->url(true),
'info' => Escape::html($page->id()) 'info' => Escape::html($page->id()),
]; 'uuid' => $page->uuid()->toString(),
} ]),
'pagination' => $pages->pagination()->toArray()
return $results; ];
} }
], ],
'files' => [ 'files' => [
'label' => I18n::translate('files'), 'label' => I18n::translate('files'),
'icon' => 'image', 'icon' => 'image',
'query' => function (string $query = null) { 'query' => function (string $query = null, int $limit, int $page) {
$files = App::instance()->site() $kirby = App::instance();
$files = $kirby->site()
->index(true) ->index(true)
->filter('isReadable', true) ->filter('isListable', true)
->files() ->files()
->filter('isListable', true)
->search($query) ->search($query)
->limit(10); ->paginate($limit, $page);
$results = []; return [
'results' => $files->values(fn ($file) => [
foreach ($files as $file) {
$results[] = [
'image' => $file->panel()->image(), 'image' => $file->panel()->image(),
'text' => Escape::html($file->filename()), 'text' => Escape::html($file->filename()),
'link' => $file->panel()->url(true), 'link' => $file->panel()->url(true),
'info' => Escape::html($file->id()) 'info' => Escape::html($file->id()),
]; 'uuid' => $file->uuid()->toString(),
} ]),
'pagination' => $files->pagination()->toArray()
return $results; ];
} }
] ]
]; ];

View File

@@ -1,6 +1,7 @@
<?php <?php
use Kirby\Cms\App; use Kirby\Cms\App;
use Kirby\Exception\LogicException;
use Kirby\Panel\Field; use Kirby\Panel\Field;
use Kirby\Toolkit\I18n; use Kirby\Toolkit\I18n;
@@ -8,64 +9,85 @@ return [
// license key // license key
'license' => [ 'license' => [
'load' => function () { 'load' => function () {
$license = App::instance()->system()->license(); $kirby = App::instance();
$license = $kirby->system()->license();
// @codeCoverageIgnoreStart $obfuscated = $kirby->user()->isAdmin() === false;
// the system is registered but the license $status = $license->status();
// key is only visible for admins $renewable = $status->renewable();
if ($license === true) {
$license = 'Kirby 3';
}
// @codeCoverageIgnoreEnd
return [ return [
'component' => 'k-form-dialog', 'component' => 'k-license-dialog',
'props' => [ 'props' => [
'size' => 'medium', 'license' => [
'fields' => [ 'code' => $license->code($obfuscated),
'license' => [ 'icon' => $status->icon(),
'type' => 'info', 'info' => $status->info($license->renewal('Y-m-d')),
'label' => I18n::translate('license'), 'theme' => $status->theme(),
'text' => $license ? $license : I18n::translate('license.unregistered.label'), 'type' => $license->label(),
'theme' => $license ? 'code' : 'negative',
'help' => $license ?
// @codeCoverageIgnoreStart
'<a href="https://hub.getkirby.com">' . I18n::translate('license.manage') . ' &rarr;</a>' :
// @codeCoverageIgnoreEnd
'<a href="https://getkirby.com/buy">' . I18n::translate('license.buy') . ' &rarr;</a>'
]
], ],
'submitButton' => false, 'cancelButton' => $renewable,
'cancelButton' => false, 'submitButton' => $renewable ? [
'icon' => 'refresh',
'text' => I18n::translate('renew'),
'theme' => 'love',
] : false,
] ]
]; ];
},
'submit' => function () {
// @codeCoverageIgnoreStart
$response = App::instance()->system()->license()->upgrade();
// the upgrade is still needed
if ($response['status'] === 'upgrade') {
return [
'redirect' => $response['url']
];
}
// the upgrade has already been completed
if ($response['status'] === 'complete') {
return [
'event' => 'system.renew',
'message' => I18n::translate('license.success')
];
}
throw new LogicException('The upgrade failed');
// @codeCoverageIgnoreEnd
} }
], ],
// license registration // license registration
'registration' => [ 'registration' => [
'load' => function () { 'load' => function () {
$system = App::instance()->system(); $system = App::instance()->system();
$local = $system->isLocal();
return [ return [
'component' => 'k-form-dialog', 'component' => 'k-form-dialog',
'props' => [ 'props' => [
'fields' => [ 'fields' => [
'domain' => [ 'domain' => [
'label' => I18n::translate('license.activate.label'),
'type' => 'info', 'type' => 'info',
'theme' => $system->isLocal() ? 'notice' : 'info', 'theme' => $local ? 'warning' : 'info',
'text' => I18n::template('license.register.' . ($system->isLocal() ? 'local' : 'domain'), ['host' => $system->indexUrl()]) 'text' => I18n::template('license.activate.' . ($local ? 'local' : 'domain'), ['host' => $system->indexUrl()])
], ],
'license' => [ 'license' => [
'label' => I18n::translate('license.register.label'), 'label' => I18n::translate('license.code.label'),
'type' => 'text', 'type' => 'text',
'required' => true, 'required' => true,
'counter' => false, 'counter' => false,
'placeholder' => 'K3-', 'placeholder' => 'K-',
'help' => I18n::translate('license.register.help') 'help' => I18n::translate('license.code.help') . ' ' . '<a href="https://getkirby.com/buy" target="_blank">' . I18n::translate('license.buy') . ' &rarr;</a>'
], ],
'email' => Field::email(['required' => true]) 'email' => Field::email(['required' => true])
], ],
'submitButton' => I18n::translate('license.register'), 'submitButton' => [
'icon' => 'key',
'text' => I18n::translate('activate'),
'theme' => 'love',
],
'value' => [ 'value' => [
'license' => null, 'license' => null,
'email' => null 'email' => null
@@ -83,7 +105,7 @@ return [
return [ return [
'event' => 'system.register', 'event' => 'system.register',
'message' => I18n::translate('license.register.success') 'message' => I18n::translate('license.success')
]; ];
// @codeCoverageIgnoreEnd // @codeCoverageIgnoreEnd
} }

View File

@@ -14,28 +14,29 @@ return [
$environment = [ $environment = [
[ [
'label' => $license ? I18n::translate('license') : I18n::translate('license.register.label'), 'label' => $license->status()->label(),
'value' => $license ? 'Kirby 3' : I18n::translate('license.unregistered.label'), 'value' => $license->label(),
'theme' => $license ? null : 'negative', 'theme' => $license->status()->theme(),
'dialog' => $license ? 'license' : 'registration' 'icon' => $license->status()->icon(),
'dialog' => $license->status()->dialog()
], ],
[ [
'label' => $updateStatus?->label() ?? I18n::translate('version'), 'label' => $updateStatus?->label() ?? I18n::translate('version'),
'value' => $kirby->version(), 'value' => $kirby->version(),
'link' => ( 'link' => $updateStatus?->url() ??
$updateStatus ? 'https://github.com/getkirby/kirby/releases/tag/' . $kirby->version(),
$updateStatus->url() : 'theme' => $updateStatus?->theme(),
'https://github.com/getkirby/kirby/releases/tag/' . $kirby->version() 'icon' => $updateStatus?->icon() ?? 'info'
),
'theme' => $updateStatus?->theme()
], ],
[ [
'label' => 'PHP', 'label' => 'PHP',
'value' => phpversion() 'value' => phpversion(),
'icon' => 'code'
], ],
[ [
'label' => I18n::translate('server'), 'label' => I18n::translate('server'),
'value' => $system->serverSoftware() ?? '?' 'value' => $system->serverSoftware() ?? '?',
'icon' => 'server'
] ]
]; ];

View File

@@ -9,6 +9,7 @@ return function ($kirby) {
'search' => 'users', 'search' => 'users',
'menu' => true, 'menu' => true,
'dialogs' => require __DIR__ . '/users/dialogs.php', 'dialogs' => require __DIR__ . '/users/dialogs.php',
'drawers' => require __DIR__ . '/users/drawers.php',
'dropdowns' => require __DIR__ . '/users/dropdowns.php', 'dropdowns' => require __DIR__ . '/users/dropdowns.php',
'searches' => require __DIR__ . '/users/searches.php', 'searches' => require __DIR__ . '/users/searches.php',
'views' => require __DIR__ . '/users/views.php' 'views' => require __DIR__ . '/users/views.php'

View File

@@ -6,9 +6,11 @@ use Kirby\Cms\UserRules;
use Kirby\Exception\InvalidArgumentException; use Kirby\Exception\InvalidArgumentException;
use Kirby\Panel\Field; use Kirby\Panel\Field;
use Kirby\Panel\Panel; use Kirby\Panel\Panel;
use Kirby\Panel\UserTotpDisableDialog;
use Kirby\Toolkit\Escape; use Kirby\Toolkit\Escape;
use Kirby\Toolkit\I18n; use Kirby\Toolkit\I18n;
$fields = require __DIR__ . '/../fields/dialogs.php';
$files = require __DIR__ . '/../files/dialogs.php'; $files = require __DIR__ . '/../files/dialogs.php';
return [ return [
@@ -18,6 +20,12 @@ return [
'pattern' => 'users/create', 'pattern' => 'users/create',
'load' => function () { 'load' => function () {
$kirby = App::instance(); $kirby = App::instance();
// get default value for role
if ($role = $kirby->request()->get('role')) {
$role = $kirby->roles()->find($role)?->id();
}
return [ return [
'component' => 'k-form-dialog', 'component' => 'k-form-dialog',
'props' => [ 'props' => [
@@ -41,7 +49,7 @@ return [
'email' => '', 'email' => '',
'password' => '', 'password' => '',
'translation' => $kirby->panelLanguage(), 'translation' => $kirby->panelLanguage(),
'role' => $kirby->user()->role()->name() 'role' => $role ?? $kirby->user()->role()->name()
] ]
] ]
]; ];
@@ -287,6 +295,13 @@ return [
} }
], ],
// user field dialogs
'user.fields' => [
'pattern' => '(users/.*?)/fields/(:any)/(:all?)',
'load' => $fields['model']['load'],
'submit' => $fields['model']['submit']
],
// change file name // change file name
'user.file.changeName' => [ 'user.file.changeName' => [
'pattern' => '(users/.*?)/files/(:any)/changeName', 'pattern' => '(users/.*?)/files/(:any)/changeName',
@@ -301,11 +316,31 @@ return [
'submit' => $files['changeSort']['submit'], 'submit' => $files['changeSort']['submit'],
], ],
// change file template
'user.file.changeTemplate' => [
'pattern' => '(users/.*?)/files/(:any)/changeTemplate',
'load' => $files['changeTemplate']['load'],
'submit' => $files['changeTemplate']['submit'],
],
// delete file // delete file
'user.file.delete' => [ 'user.file.delete' => [
'pattern' => '(users/.*?)/files/(:any)/delete', 'pattern' => '(users/.*?)/files/(:any)/delete',
'load' => $files['delete']['load'], 'load' => $files['delete']['load'],
'submit' => $files['delete']['submit'], 'submit' => $files['delete']['submit'],
] ],
// user file fields dialogs
'user.file.fields' => [
'pattern' => '(users/.*?)/files/(:any)/fields/(:any)/(:all?)',
'load' => $fields['file']['load'],
'submit' => $fields['file']['submit']
],
// user disable TOTP
'user.totp.disable' => [
'pattern' => 'users/(:any)/totp/disable',
'load' => fn (string $id) => (new UserTotpDisableDialog($id))->load(),
'submit' => fn (string $id) => (new UserTotpDisableDialog($id))->submit()
],
]; ];

View File

@@ -0,0 +1,18 @@
<?php
$fields = require __DIR__ . '/../fields/drawers.php';
return [
// user field drawers
'user.fields' => [
'pattern' => '(users/.*?)/fields/(:any)/(:all?)',
'load' => $fields['model']['load'],
'submit' => $fields['model']['submit']
],
// user file fields drawers
'user.file.fields' => [
'pattern' => '(users/.*?)/files/(:any)/fields/(:any)/(:all?)',
'load' => $fields['file']['load'],
'submit' => $fields['file']['submit']
],
];

View File

@@ -8,20 +8,22 @@ return [
'users' => [ 'users' => [
'label' => I18n::translate('users'), 'label' => I18n::translate('users'),
'icon' => 'users', 'icon' => 'users',
'query' => function (string $query = null) { 'query' => function (string $query = null, int $limit, int $page) {
$users = App::instance()->users()->search($query)->limit(10); $kirby = App::instance();
$results = []; $users = $kirby->users()
->search($query)
->paginate($limit, $page);
foreach ($users as $user) { return [
$results[] = [ 'results' => $users->values(fn ($user) => [
'image' => $user->panel()->image(), 'image' => $user->panel()->image(),
'text' => Escape::html($user->username()), 'text' => Escape::html($user->username()),
'link' => $user->panel()->url(true), 'link' => $user->panel()->url(true),
'info' => Escape::html($user->role()->title()) 'info' => Escape::html($user->role()->title()),
]; 'uuid' => $user->uuid()->toString(),
} ]),
'pagination' => $users->pagination()->toArray()
return $results; ];
} }
] ]
]; ];

View File

@@ -31,6 +31,10 @@ return [
$users = $users->role($role); $users = $users->role($role);
} }
// sort users alphabetically
$users = $users->sortBy('username', 'asc');
// paginate
$users = $users->paginate([ $users = $users->paginate([
'limit' => 20, 'limit' => 20,
'page' => $kirby->request()->get('page') 'page' => $kirby->request()->get('page')

View File

@@ -8,7 +8,7 @@ fields:
query: model.images query: model.images
multiple: true multiple: true
layout: cards layout: cards
size: tiny size: small
empty: field.blocks.gallery.images.empty empty: field.blocks.gallery.images.empty
uploads: uploads:
template: blocks/image template: blocks/image

View File

@@ -5,20 +5,31 @@ preview: heading
fields: fields:
level: level:
label: field.blocks.heading.level label: field.blocks.heading.level
type: select type: toggles
empty: false empty: false
default: "h2" default: "h2"
width: 1/6 labels: false
options: options:
- h1 - value: h1
- h2 icon: h1
- h3 text: H1
- h4 - value: h2
- h5 icon: h2
- h6 text: H2
- value: h3
icon: h3
text: H3
- value: h4
icon: h4
text: H4
- value: h5
icon: h5
text: H5
- value: h6
icon: h6
text: H6
text: text:
label: field.blocks.heading.text label: field.blocks.heading.text
type: writer type: writer
inline: true inline: true
width: 5/6
placeholder: field.blocks.heading.placeholder placeholder: field.blocks.heading.placeholder

View File

@@ -8,8 +8,8 @@ fields:
columns: 2 columns: 2
default: "kirby" default: "kirby"
options: options:
kirby: Kirby kirby: "{{ t('field.blocks.image.location.internal') }}"
web: Web web: "{{ t('field.blocks.image.location.external') }}"
image: image:
label: field.blocks.image.name label: field.blocks.image.name
type: files type: files

View File

@@ -1,56 +0,0 @@
name: Code
icon: code
fields:
code:
label: Code
type: textarea
buttons: false
font: monospace
language:
label: Language
type: select
default: text
options:
bash: Bash
basic: BASIC
c: C
clojure: Clojure
cpp: C++
csharp: C#
css: CSS
diff: Diff
elixir: Elixir
elm: Elm
erlang: Erlang
go: Go
graphql: GraphQL
haskell: Haskell
html: HTML
java: Java
js: JavaScript
json: JSON
latext: LaTeX
less: Less
lisp: Lisp
lua: Lua
makefile: Makefile
markdown: Markdown
markup: Markup
objectivec: Objective-C
pascal: Pascal
perl: Perl
php: PHP
text: Plain Text
python: Python
r: R
ruby: Ruby
rust: Rust
sass: Sass
scss: SCSS
shell: Shell
sql: SQL
swift: Swift
typescript: TypeScript
vbnet: VB.net
xml: XML
yaml: YAML

View File

@@ -1,20 +0,0 @@
icon: title
fields:
text:
type: text
level:
type: select
width: 1/2
empty: false
default: "2"
options:
- value: "1"
text: Heading 1
- value: "2"
text: Heading 2
- value: "3"
text: Heading 3
id:
type: text
label: ID
width: 1/2

View File

@@ -1,16 +0,0 @@
name: Image
icon: image
fields:
image:
type: files
multiple: false
alt:
type: text
icon: title
caption:
type: writer
inline: true
icon: text
link:
type: text
icon: url

View File

@@ -1,12 +0,0 @@
name: Quote
icon: quote
fields:
text:
label: Quote Text
type: writer
inline: true
citation:
label: Citation
type: writer
inline: true
placeholder: by …

View File

@@ -1,25 +0,0 @@
name: Table
icon: menu
fields:
rows:
label: Menu
type: structure
columns:
dish: true
description: true
price:
before:
width: 1/4
align: right
fields:
dish:
label: Dish
type: text
description:
label: Description
type: text
price:
label: Price
type: number
before:
step: 0.01

View File

@@ -1,5 +0,0 @@
name: Text
icon: text
fields:
text:
type: writer

View File

@@ -1,8 +0,0 @@
name: Video
icon: video
label: "{{ url }}"
fields:
url:
type: url
caption:
type: writer

View File

@@ -1,2 +0,0 @@
name: File
title: file

View File

@@ -1,3 +0,0 @@
name: Page
title: Page

View File

@@ -1,7 +0,0 @@
name: Site
title: Site
sections:
pages:
headline: Pages
type: pages

Some files were not shown because too many files have changed in this diff Show More