diff --git a/content/00-welcome/04-markdown-test.md b/content/00-welcome/00-markdown-test.md
similarity index 100%
rename from content/00-welcome/04-markdown-test.md
rename to content/00-welcome/00-markdown-test.md
diff --git a/content/00-welcome/04-markdown-test.yaml b/content/00-welcome/00-markdown-test.yaml
similarity index 100%
rename from content/00-welcome/04-markdown-test.yaml
rename to content/00-welcome/00-markdown-test.yaml
diff --git a/content/00-welcome/03-get-help.md b/content/00-welcome/02-get-help.md
similarity index 100%
rename from content/00-welcome/03-get-help.md
rename to content/00-welcome/02-get-help.md
diff --git a/content/00-welcome/03-get-help.yaml b/content/00-welcome/03-get-help.yaml
deleted file mode 100644
index f079925..0000000
--- a/content/00-welcome/03-get-help.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
-meta:
- title: 'Get Help'
- description: 'If you need any help, then please read the documentation on typemill.net first. Some short video-tutorials are in work right'
- heroimage: null
- heroimagealt: null
- owner: null
- author: 'Sebastian Schürmanns'
- allowedrole: null
- alloweduser: null
- manualdate: null
- modified: '2021-06-13'
- created: null
- time: null
- navtitle: ''
- hide: false
-seo:
- heroimage: media/live/bildschirmfoto-zu-2019-08-30-20-46-29.png
- heroimagealt: Alt-Text
-customfields:
- myfield:
- bla:
- - text
- - test
diff --git a/content/00-welcome/00-setup-your-website.md b/content/00-welcome/03-setup-your-website.md
similarity index 100%
rename from content/00-welcome/00-setup-your-website.md
rename to content/00-welcome/03-setup-your-website.md
diff --git a/content/00-welcome/00-setup-your-website.yaml b/content/00-welcome/03-setup-your-website.yaml
similarity index 100%
rename from content/00-welcome/00-setup-your-website.yaml
rename to content/00-welcome/03-setup-your-website.yaml
diff --git a/content/00-welcome/02-write-content.md b/content/00-welcome/04-write-content.md
similarity index 100%
rename from content/00-welcome/02-write-content.md
rename to content/00-welcome/04-write-content.md
diff --git a/content/00-welcome/02-write-content.yaml b/content/00-welcome/04-write-content.yaml
similarity index 100%
rename from content/00-welcome/02-write-content.yaml
rename to content/00-welcome/04-write-content.yaml
diff --git a/content/01-cyanine-theme/01-colors-and-fonts.md b/content/01-cyanine-theme/00-colors-and-fonts.md
similarity index 100%
rename from content/01-cyanine-theme/01-colors-and-fonts.md
rename to content/01-cyanine-theme/00-colors-and-fonts.md
diff --git a/content/01-cyanine-theme/00-colors-and-fonts.yaml b/content/01-cyanine-theme/00-colors-and-fonts.yaml
new file mode 100644
index 0000000..9432aef
--- /dev/null
+++ b/content/01-cyanine-theme/00-colors-and-fonts.yaml
@@ -0,0 +1,15 @@
+meta:
+ navtitle: 'colors and fonts'
+ hide: false
+ title: 'Colors and Fonts'
+ description: 'First of all cyanine supports individual logos. If you want to use our logo, then please upload it in the system settings. Cyanine will automatically replace the title text with your logo. '
+ heroimage: null
+ heroimagealt: null
+ owner: null
+ author: trendschau
+ allowedrole: null
+ alloweduser: null
+ manualdate: null
+ modified: '2021-10-04'
+ created: '2020-06-11'
+ time: 20-37-12
diff --git a/content/01-cyanine-theme/00-landingpage.md b/content/01-cyanine-theme/01-landingpage.md
similarity index 100%
rename from content/01-cyanine-theme/00-landingpage.md
rename to content/01-cyanine-theme/01-landingpage.md
diff --git a/content/01-cyanine-theme/01-landingpage.yaml b/content/01-cyanine-theme/01-landingpage.yaml
new file mode 100644
index 0000000..201a9c8
--- /dev/null
+++ b/content/01-cyanine-theme/01-landingpage.yaml
@@ -0,0 +1,15 @@
+meta:
+ title: 'The Landingpage'
+ description: "Cyanine provides an optional landingpage with six segments: \nIntro with the content of the home page and an additional link/button.\nInfo with individual markdown content.\nTeaser with two elements. Each element has a headline, a text and a link/button.\nContrast with a headline, text-input and a"
+ heroimage: ''
+ heroimagealt: null
+ owner: trendschau
+ author: 'Sebastian Schürmanns'
+ allowedrole: null
+ alloweduser: null
+ manualdate: null
+ modified: '2021-05-18'
+ created: '2021-06-17'
+ time: 16-23-19
+ navtitle: landingpage
+ hide: false
diff --git a/data/navigation/navi-draft.txt b/data/navigation/navi-draft.txt
index 253d492..2484bbd 100644
--- a/data/navigation/navi-draft.txt
+++ b/data/navigation/navi-draft.txt
@@ -1 +1 @@
-a:3:{i:0;O:8:"stdClass":22:{s:12:"originalName";s:10:"00-welcome";s:11:"elementType";s:6:"folder";s:8:"contains";s:5:"pages";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"00";s:4:"name";s:7:"welcome";s:4:"slug";s:7:"welcome";s:4:"path";s:11:"/00-welcome";s:15:"pathWithoutType";s:17:"/00-welcome/index";s:9:"urlRelWoF";s:8:"/welcome";s:6:"urlRel";s:17:"/typemill/welcome";s:6:"urlAbs";s:33:"http://localhost/typemill/welcome";s:3:"key";i:0;s:7:"keyPath";i:0;s:12:"keyPathArray";a:1:{i:0;s:1:"0";}s:7:"chapter";i:1;s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:13:"folderContent";a:5:{i:0;O:8:"stdClass":20:{s:12:"originalName";s:24:"00-setup-your-website.md";s:11:"elementType";s:4:"file";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"00";s:4:"name";s:18:"setup your website";s:4:"slug";s:18:"setup-your-website";s:4:"path";s:36:"/00-welcome/00-setup-your-website.md";s:15:"pathWithoutType";s:33:"/00-welcome/00-setup-your-website";s:3:"key";i:0;s:7:"keyPath";s:3:"0.0";s:12:"keyPathArray";a:2:{i:0;s:1:"0";i:1;s:1:"0";}s:7:"chapter";s:3:"1.1";s:9:"urlRelWoF";s:27:"/welcome/setup-your-website";s:6:"urlRel";s:36:"/typemill/welcome/setup-your-website";s:6:"urlAbs";s:52:"http://localhost/typemill/welcome/setup-your-website";s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:7:"noindex";b:0;}i:1;O:8:"stdClass":20:{s:12:"originalName";s:19:"01-manage-access.md";s:11:"elementType";s:4:"file";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"01";s:4:"name";s:13:"manage access";s:4:"slug";s:13:"manage-access";s:4:"path";s:31:"/00-welcome/01-manage-access.md";s:15:"pathWithoutType";s:28:"/00-welcome/01-manage-access";s:3:"key";i:1;s:7:"keyPath";s:3:"0.1";s:12:"keyPathArray";a:2:{i:0;s:1:"0";i:1;s:1:"1";}s:7:"chapter";s:3:"1.2";s:9:"urlRelWoF";s:22:"/welcome/manage-access";s:6:"urlRel";s:31:"/typemill/welcome/manage-access";s:6:"urlAbs";s:47:"http://localhost/typemill/welcome/manage-access";s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:7:"noindex";b:0;}i:2;O:8:"stdClass":20:{s:12:"originalName";s:19:"02-write-content.md";s:11:"elementType";s:4:"file";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"02";s:4:"name";s:13:"write content";s:4:"slug";s:13:"write-content";s:4:"path";s:31:"/00-welcome/02-write-content.md";s:15:"pathWithoutType";s:28:"/00-welcome/02-write-content";s:3:"key";i:2;s:7:"keyPath";s:3:"0.2";s:12:"keyPathArray";a:2:{i:0;s:1:"0";i:1;s:1:"2";}s:7:"chapter";s:3:"1.3";s:9:"urlRelWoF";s:22:"/welcome/write-content";s:6:"urlRel";s:31:"/typemill/welcome/write-content";s:6:"urlAbs";s:47:"http://localhost/typemill/welcome/write-content";s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:7:"noindex";b:0;}i:3;O:8:"stdClass":20:{s:12:"originalName";s:14:"03-get-help.md";s:11:"elementType";s:4:"file";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"03";s:4:"name";s:8:"get help";s:4:"slug";s:8:"get-help";s:4:"path";s:26:"/00-welcome/03-get-help.md";s:15:"pathWithoutType";s:23:"/00-welcome/03-get-help";s:3:"key";i:3;s:7:"keyPath";s:3:"0.3";s:12:"keyPathArray";a:2:{i:0;s:1:"0";i:1;s:1:"3";}s:7:"chapter";s:3:"1.4";s:9:"urlRelWoF";s:17:"/welcome/get-help";s:6:"urlRel";s:26:"/typemill/welcome/get-help";s:6:"urlAbs";s:42:"http://localhost/typemill/welcome/get-help";s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:7:"noindex";b:0;}i:4;O:8:"stdClass":20:{s:12:"originalName";s:19:"04-markdown-test.md";s:11:"elementType";s:4:"file";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"04";s:4:"name";s:13:"markdown test";s:4:"slug";s:13:"markdown-test";s:4:"path";s:31:"/00-welcome/04-markdown-test.md";s:15:"pathWithoutType";s:28:"/00-welcome/04-markdown-test";s:3:"key";i:4;s:7:"keyPath";s:3:"0.4";s:12:"keyPathArray";a:2:{i:0;s:1:"0";i:1;s:1:"4";}s:7:"chapter";s:3:"1.5";s:9:"urlRelWoF";s:22:"/welcome/markdown-test";s:6:"urlRel";s:31:"/typemill/welcome/markdown-test";s:6:"urlAbs";s:47:"http://localhost/typemill/welcome/markdown-test";s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:7:"noindex";b:0;}}s:7:"noindex";b:0;}i:1;O:8:"stdClass":22:{s:12:"originalName";s:16:"01-cyanine-theme";s:11:"elementType";s:6:"folder";s:8:"contains";s:5:"pages";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"01";s:4:"name";s:13:"cyanine theme";s:4:"slug";s:13:"cyanine-theme";s:4:"path";s:17:"/01-cyanine-theme";s:15:"pathWithoutType";s:23:"/01-cyanine-theme/index";s:9:"urlRelWoF";s:14:"/cyanine-theme";s:6:"urlRel";s:23:"/typemill/cyanine-theme";s:6:"urlAbs";s:39:"http://localhost/typemill/cyanine-theme";s:3:"key";i:1;s:7:"keyPath";i:1;s:12:"keyPathArray";a:1:{i:0;s:1:"1";}s:7:"chapter";i:2;s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:13:"folderContent";a:4:{i:0;O:8:"stdClass":20:{s:12:"originalName";s:17:"00-landingpage.md";s:11:"elementType";s:4:"file";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"00";s:4:"name";s:11:"landingpage";s:4:"slug";s:11:"landingpage";s:4:"path";s:35:"/01-cyanine-theme/00-landingpage.md";s:15:"pathWithoutType";s:32:"/01-cyanine-theme/00-landingpage";s:3:"key";i:0;s:7:"keyPath";s:3:"1.0";s:12:"keyPathArray";a:2:{i:0;s:1:"1";i:1;s:1:"0";}s:7:"chapter";s:3:"2.1";s:9:"urlRelWoF";s:26:"/cyanine-theme/landingpage";s:6:"urlRel";s:35:"/typemill/cyanine-theme/landingpage";s:6:"urlAbs";s:51:"http://localhost/typemill/cyanine-theme/landingpage";s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:7:"noindex";b:0;}i:1;O:8:"stdClass":20:{s:12:"originalName";s:22:"01-colors-and-fonts.md";s:11:"elementType";s:4:"file";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"01";s:4:"name";s:16:"colors and fonts";s:4:"slug";s:16:"colors-and-fonts";s:4:"path";s:40:"/01-cyanine-theme/01-colors-and-fonts.md";s:15:"pathWithoutType";s:37:"/01-cyanine-theme/01-colors-and-fonts";s:3:"key";i:1;s:7:"keyPath";s:3:"1.1";s:12:"keyPathArray";a:2:{i:0;s:1:"1";i:1;s:1:"1";}s:7:"chapter";s:3:"2.2";s:9:"urlRelWoF";s:31:"/cyanine-theme/colors-and-fonts";s:6:"urlRel";s:40:"/typemill/cyanine-theme/colors-and-fonts";s:6:"urlAbs";s:56:"http://localhost/typemill/cyanine-theme/colors-and-fonts";s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:7:"noindex";b:0;}i:2;O:8:"stdClass":20:{s:12:"originalName";s:12:"02-footer.md";s:11:"elementType";s:4:"file";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"02";s:4:"name";s:6:"footer";s:4:"slug";s:6:"footer";s:4:"path";s:30:"/01-cyanine-theme/02-footer.md";s:15:"pathWithoutType";s:27:"/01-cyanine-theme/02-footer";s:3:"key";i:2;s:7:"keyPath";s:3:"1.2";s:12:"keyPathArray";a:2:{i:0;s:1:"1";i:1;s:1:"2";}s:7:"chapter";s:3:"2.3";s:9:"urlRelWoF";s:21:"/cyanine-theme/footer";s:6:"urlRel";s:30:"/typemill/cyanine-theme/footer";s:6:"urlAbs";s:46:"http://localhost/typemill/cyanine-theme/footer";s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:7:"noindex";b:0;}i:3;O:8:"stdClass":20:{s:12:"originalName";s:22:"03-content-elements.md";s:11:"elementType";s:4:"file";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"03";s:4:"name";s:16:"content elements";s:4:"slug";s:16:"content-elements";s:4:"path";s:40:"/01-cyanine-theme/03-content-elements.md";s:15:"pathWithoutType";s:37:"/01-cyanine-theme/03-content-elements";s:3:"key";i:3;s:7:"keyPath";s:3:"1.3";s:12:"keyPathArray";a:2:{i:0;s:1:"1";i:1;s:1:"3";}s:7:"chapter";s:3:"2.4";s:9:"urlRelWoF";s:31:"/cyanine-theme/content-elements";s:6:"urlRel";s:40:"/typemill/cyanine-theme/content-elements";s:6:"urlAbs";s:56:"http://localhost/typemill/cyanine-theme/content-elements";s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:7:"noindex";b:0;}}s:7:"noindex";b:0;}i:2;O:8:"stdClass":21:{s:12:"originalName";s:10:"02-docs-v2";s:11:"elementType";s:6:"folder";s:8:"contains";s:5:"pages";s:6:"status";s:9:"published";s:8:"fileType";s:0:"";s:5:"order";s:2:"02";s:4:"name";s:7:"docs v2";s:4:"slug";s:7:"docs-v2";s:4:"path";s:11:"/02-docs-v2";s:15:"pathWithoutType";s:17:"/02-docs-v2/index";s:9:"urlRelWoF";s:8:"/docs-v2";s:6:"urlRel";s:17:"/typemill/docs-v2";s:6:"urlAbs";s:33:"http://localhost/typemill/docs-v2";s:3:"key";i:2;s:7:"keyPath";i:2;s:12:"keyPathArray";a:1:{i:0;s:1:"2";}s:7:"chapter";i:3;s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:13:"folderContent";a:1:{i:0;O:8:"stdClass":19:{s:12:"originalName";s:18:"01-installation.md";s:11:"elementType";s:4:"file";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"01";s:4:"name";s:12:"installation";s:4:"slug";s:12:"installation";s:4:"path";s:30:"/02-docs-v2/01-installation.md";s:15:"pathWithoutType";s:27:"/02-docs-v2/01-installation";s:3:"key";i:0;s:7:"keyPath";s:3:"2.0";s:12:"keyPathArray";a:2:{i:0;s:1:"2";i:1;s:1:"0";}s:7:"chapter";s:3:"3.1";s:9:"urlRelWoF";s:21:"/docs-v2/installation";s:6:"urlRel";s:30:"/typemill/docs-v2/installation";s:6:"urlAbs";s:46:"http://localhost/typemill/docs-v2/installation";s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;}}}}
\ No newline at end of file
+a:3:{i:0;O:8:"stdClass":22:{s:12:"originalName";s:10:"00-welcome";s:11:"elementType";s:6:"folder";s:8:"contains";s:5:"pages";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"00";s:4:"name";s:7:"welcome";s:4:"slug";s:7:"welcome";s:4:"path";s:11:"/00-welcome";s:15:"pathWithoutType";s:17:"/00-welcome/index";s:9:"urlRelWoF";s:8:"/welcome";s:6:"urlRel";s:17:"/typemill/welcome";s:6:"urlAbs";s:33:"http://localhost/typemill/welcome";s:3:"key";i:0;s:7:"keyPath";i:0;s:12:"keyPathArray";a:1:{i:0;s:1:"0";}s:7:"chapter";i:1;s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:13:"folderContent";a:5:{i:0;O:8:"stdClass":20:{s:12:"originalName";s:19:"00-markdown-test.md";s:11:"elementType";s:4:"file";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"00";s:4:"name";s:13:"markdown test";s:4:"slug";s:13:"markdown-test";s:4:"path";s:31:"/00-welcome/00-markdown-test.md";s:15:"pathWithoutType";s:28:"/00-welcome/00-markdown-test";s:3:"key";i:0;s:7:"keyPath";s:3:"0.0";s:12:"keyPathArray";a:2:{i:0;s:1:"0";i:1;s:1:"0";}s:7:"chapter";s:3:"1.1";s:9:"urlRelWoF";s:22:"/welcome/markdown-test";s:6:"urlRel";s:31:"/typemill/welcome/markdown-test";s:6:"urlAbs";s:47:"http://localhost/typemill/welcome/markdown-test";s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:7:"noindex";b:0;}i:1;O:8:"stdClass":20:{s:12:"originalName";s:19:"01-manage-access.md";s:11:"elementType";s:4:"file";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"01";s:4:"name";s:13:"manage access";s:4:"slug";s:13:"manage-access";s:4:"path";s:31:"/00-welcome/01-manage-access.md";s:15:"pathWithoutType";s:28:"/00-welcome/01-manage-access";s:3:"key";i:1;s:7:"keyPath";s:3:"0.1";s:12:"keyPathArray";a:2:{i:0;s:1:"0";i:1;s:1:"1";}s:7:"chapter";s:3:"1.2";s:9:"urlRelWoF";s:22:"/welcome/manage-access";s:6:"urlRel";s:31:"/typemill/welcome/manage-access";s:6:"urlAbs";s:47:"http://localhost/typemill/welcome/manage-access";s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:7:"noindex";b:0;}i:2;O:8:"stdClass":20:{s:12:"originalName";s:14:"02-get-help.md";s:11:"elementType";s:4:"file";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"02";s:4:"name";s:8:"get help";s:4:"slug";s:8:"get-help";s:4:"path";s:26:"/00-welcome/02-get-help.md";s:15:"pathWithoutType";s:23:"/00-welcome/02-get-help";s:3:"key";i:2;s:7:"keyPath";s:3:"0.2";s:12:"keyPathArray";a:2:{i:0;s:1:"0";i:1;s:1:"2";}s:7:"chapter";s:3:"1.3";s:9:"urlRelWoF";s:17:"/welcome/get-help";s:6:"urlRel";s:26:"/typemill/welcome/get-help";s:6:"urlAbs";s:42:"http://localhost/typemill/welcome/get-help";s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:7:"noindex";b:0;}i:3;O:8:"stdClass":20:{s:12:"originalName";s:24:"03-setup-your-website.md";s:11:"elementType";s:4:"file";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"03";s:4:"name";s:18:"setup your website";s:4:"slug";s:18:"setup-your-website";s:4:"path";s:36:"/00-welcome/03-setup-your-website.md";s:15:"pathWithoutType";s:33:"/00-welcome/03-setup-your-website";s:3:"key";i:3;s:7:"keyPath";s:3:"0.3";s:12:"keyPathArray";a:2:{i:0;s:1:"0";i:1;s:1:"3";}s:7:"chapter";s:3:"1.4";s:9:"urlRelWoF";s:27:"/welcome/setup-your-website";s:6:"urlRel";s:36:"/typemill/welcome/setup-your-website";s:6:"urlAbs";s:52:"http://localhost/typemill/welcome/setup-your-website";s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:7:"noindex";b:0;}i:4;O:8:"stdClass":20:{s:12:"originalName";s:19:"04-write-content.md";s:11:"elementType";s:4:"file";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"04";s:4:"name";s:13:"write content";s:4:"slug";s:13:"write-content";s:4:"path";s:31:"/00-welcome/04-write-content.md";s:15:"pathWithoutType";s:28:"/00-welcome/04-write-content";s:3:"key";i:4;s:7:"keyPath";s:3:"0.4";s:12:"keyPathArray";a:2:{i:0;s:1:"0";i:1;s:1:"4";}s:7:"chapter";s:3:"1.5";s:9:"urlRelWoF";s:22:"/welcome/write-content";s:6:"urlRel";s:31:"/typemill/welcome/write-content";s:6:"urlAbs";s:47:"http://localhost/typemill/welcome/write-content";s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:7:"noindex";b:0;}}s:7:"noindex";b:0;}i:1;O:8:"stdClass":22:{s:12:"originalName";s:16:"01-cyanine-theme";s:11:"elementType";s:6:"folder";s:8:"contains";s:5:"pages";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"01";s:4:"name";s:13:"cyanine theme";s:4:"slug";s:13:"cyanine-theme";s:4:"path";s:17:"/01-cyanine-theme";s:15:"pathWithoutType";s:23:"/01-cyanine-theme/index";s:9:"urlRelWoF";s:14:"/cyanine-theme";s:6:"urlRel";s:23:"/typemill/cyanine-theme";s:6:"urlAbs";s:39:"http://localhost/typemill/cyanine-theme";s:3:"key";i:1;s:7:"keyPath";i:1;s:12:"keyPathArray";a:1:{i:0;s:1:"1";}s:7:"chapter";i:2;s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:13:"folderContent";a:4:{i:0;O:8:"stdClass":20:{s:12:"originalName";s:22:"00-colors-and-fonts.md";s:11:"elementType";s:4:"file";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"00";s:4:"name";s:16:"colors and fonts";s:4:"slug";s:16:"colors-and-fonts";s:4:"path";s:40:"/01-cyanine-theme/00-colors-and-fonts.md";s:15:"pathWithoutType";s:37:"/01-cyanine-theme/00-colors-and-fonts";s:3:"key";i:0;s:7:"keyPath";s:3:"1.0";s:12:"keyPathArray";a:2:{i:0;s:1:"1";i:1;s:1:"0";}s:7:"chapter";s:3:"2.1";s:9:"urlRelWoF";s:31:"/cyanine-theme/colors-and-fonts";s:6:"urlRel";s:40:"/typemill/cyanine-theme/colors-and-fonts";s:6:"urlAbs";s:56:"http://localhost/typemill/cyanine-theme/colors-and-fonts";s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:7:"noindex";b:0;}i:1;O:8:"stdClass":20:{s:12:"originalName";s:17:"01-landingpage.md";s:11:"elementType";s:4:"file";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"01";s:4:"name";s:11:"landingpage";s:4:"slug";s:11:"landingpage";s:4:"path";s:35:"/01-cyanine-theme/01-landingpage.md";s:15:"pathWithoutType";s:32:"/01-cyanine-theme/01-landingpage";s:3:"key";i:1;s:7:"keyPath";s:3:"1.1";s:12:"keyPathArray";a:2:{i:0;s:1:"1";i:1;s:1:"1";}s:7:"chapter";s:3:"2.2";s:9:"urlRelWoF";s:26:"/cyanine-theme/landingpage";s:6:"urlRel";s:35:"/typemill/cyanine-theme/landingpage";s:6:"urlAbs";s:51:"http://localhost/typemill/cyanine-theme/landingpage";s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:7:"noindex";b:0;}i:2;O:8:"stdClass":20:{s:12:"originalName";s:12:"02-footer.md";s:11:"elementType";s:4:"file";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"02";s:4:"name";s:6:"footer";s:4:"slug";s:6:"footer";s:4:"path";s:30:"/01-cyanine-theme/02-footer.md";s:15:"pathWithoutType";s:27:"/01-cyanine-theme/02-footer";s:3:"key";i:2;s:7:"keyPath";s:3:"1.2";s:12:"keyPathArray";a:2:{i:0;s:1:"1";i:1;s:1:"2";}s:7:"chapter";s:3:"2.3";s:9:"urlRelWoF";s:21:"/cyanine-theme/footer";s:6:"urlRel";s:30:"/typemill/cyanine-theme/footer";s:6:"urlAbs";s:46:"http://localhost/typemill/cyanine-theme/footer";s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:7:"noindex";b:0;}i:3;O:8:"stdClass":20:{s:12:"originalName";s:22:"03-content-elements.md";s:11:"elementType";s:4:"file";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"03";s:4:"name";s:16:"content elements";s:4:"slug";s:16:"content-elements";s:4:"path";s:40:"/01-cyanine-theme/03-content-elements.md";s:15:"pathWithoutType";s:37:"/01-cyanine-theme/03-content-elements";s:3:"key";i:3;s:7:"keyPath";s:3:"1.3";s:12:"keyPathArray";a:2:{i:0;s:1:"1";i:1;s:1:"3";}s:7:"chapter";s:3:"2.4";s:9:"urlRelWoF";s:31:"/cyanine-theme/content-elements";s:6:"urlRel";s:40:"/typemill/cyanine-theme/content-elements";s:6:"urlAbs";s:56:"http://localhost/typemill/cyanine-theme/content-elements";s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:7:"noindex";b:0;}}s:7:"noindex";b:0;}i:2;O:8:"stdClass":21:{s:12:"originalName";s:10:"02-docs-v2";s:11:"elementType";s:6:"folder";s:8:"contains";s:5:"pages";s:6:"status";s:9:"published";s:8:"fileType";s:0:"";s:5:"order";s:2:"02";s:4:"name";s:7:"docs v2";s:4:"slug";s:7:"docs-v2";s:4:"path";s:11:"/02-docs-v2";s:15:"pathWithoutType";s:17:"/02-docs-v2/index";s:9:"urlRelWoF";s:8:"/docs-v2";s:6:"urlRel";s:17:"/typemill/docs-v2";s:6:"urlAbs";s:33:"http://localhost/typemill/docs-v2";s:3:"key";i:2;s:7:"keyPath";i:2;s:12:"keyPathArray";a:1:{i:0;s:1:"2";}s:7:"chapter";i:3;s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;s:13:"folderContent";a:1:{i:0;O:8:"stdClass":19:{s:12:"originalName";s:18:"01-installation.md";s:11:"elementType";s:4:"file";s:6:"status";s:9:"published";s:8:"fileType";s:2:"md";s:5:"order";s:2:"01";s:4:"name";s:12:"installation";s:4:"slug";s:12:"installation";s:4:"path";s:30:"/02-docs-v2/01-installation.md";s:15:"pathWithoutType";s:27:"/02-docs-v2/01-installation";s:3:"key";i:0;s:7:"keyPath";s:3:"2.0";s:12:"keyPathArray";a:2:{i:0;s:1:"2";i:1;s:1:"0";}s:7:"chapter";s:3:"3.1";s:9:"urlRelWoF";s:21:"/docs-v2/installation";s:6:"urlRel";s:30:"/typemill/docs-v2/installation";s:6:"urlAbs";s:46:"http://localhost/typemill/docs-v2/installation";s:6:"active";b:0;s:12:"activeParent";b:0;s:4:"hide";b:0;}}}}
\ No newline at end of file
diff --git a/data/navigation/navi-extended.txt b/data/navigation/navi-extended.txt
index 2204443..c378e37 100644
--- a/data/navigation/navi-extended.txt
+++ b/data/navigation/navi-extended.txt
@@ -4,11 +4,11 @@
noindex: false
path: /00-welcome
keyPath: 0
-/welcome/setup-your-website:
+/welcome/markdown-test:
navtitle: ''
hide: false
noindex: false
- path: /00-welcome/00-setup-your-website.md
+ path: /00-welcome/00-markdown-test.md
keyPath: '0.0'
/welcome/manage-access:
navtitle: ''
@@ -16,23 +16,23 @@
noindex: false
path: /00-welcome/01-manage-access.md
keyPath: '0.1'
-/welcome/write-content:
- navtitle: ''
- hide: false
- noindex: false
- path: /00-welcome/02-write-content.md
- keyPath: '0.2'
/welcome/get-help:
navtitle: ''
hide: false
noindex: false
- path: /00-welcome/03-get-help.md
- keyPath: '0.3'
-/welcome/markdown-test:
+ path: /00-welcome/02-get-help.md
+ keyPath: '0.2'
+/welcome/setup-your-website:
navtitle: ''
hide: false
noindex: false
- path: /00-welcome/04-markdown-test.md
+ path: /00-welcome/03-setup-your-website.md
+ keyPath: '0.3'
+/welcome/write-content:
+ navtitle: ''
+ hide: false
+ noindex: false
+ path: /00-welcome/04-write-content.md
keyPath: '0.4'
/cyanine-theme:
navtitle: ''
@@ -40,17 +40,17 @@
noindex: false
path: /01-cyanine-theme
keyPath: 1
-/cyanine-theme/landingpage:
- navtitle: ''
- hide: false
- noindex: false
- path: /01-cyanine-theme/00-landingpage.md
- keyPath: '1.0'
/cyanine-theme/colors-and-fonts:
navtitle: ''
hide: false
noindex: false
- path: /01-cyanine-theme/01-colors-and-fonts.md
+ path: /01-cyanine-theme/00-colors-and-fonts.md
+ keyPath: '1.0'
+/cyanine-theme/landingpage:
+ navtitle: ''
+ hide: false
+ noindex: false
+ path: /01-cyanine-theme/01-landingpage.md
keyPath: '1.1'
/cyanine-theme/footer:
navtitle: ''
diff --git a/system/author/js/vuedraggable.umd.min.js b/system/author/js/getLevel
similarity index 100%
rename from system/author/js/vuedraggable.umd.min.js
rename to system/author/js/getLevel
diff --git a/system/typemill/Controllers/ControllerApiAuthorArticle.php b/system/typemill/Controllers/ControllerApiAuthorArticle.php
new file mode 100644
index 0000000..19374a0
--- /dev/null
+++ b/system/typemill/Controllers/ControllerApiAuthorArticle.php
@@ -0,0 +1,335 @@
+getParsedBody();
+
+ # input validation
+ $validate = new Validation();
+ $result = $validate->navigationSort($params);
+ if(!$result)
+ {
+ $response->getBody()->write(json_encode([
+ 'message' => 'Data not valid. Please refresh the page and try again.',
+ 'errors' => $result
+ ]));
+
+ return $response->withHeader('Content-Type', 'application/json')->withStatus(422);
+ }
+
+ # set variables
+ $itemKeyPath = explode('.', $params['item_id']);
+ $parentKeyFrom = explode('.', $params['parent_id_from']);
+ $parentKeyTo = explode('.', $params['parent_id_to']);
+ $urlinfo = $this->c->get('urlinfo');
+ $langattr = $this->settings['langattr'];
+
+ # get navigation
+ $navigation = new Navigation();
+ $draftNavigation = $navigation->getDraftNavigation($urlinfo, $langattr);
+
+ # validate user rights
+ $acl = $this->c->get('acl');
+
+ # if user has no right to update content from others (eg admin or editor)
+ if(!$acl->isAllowed($request->getAttribute('c_userrole'), 'content', 'update'))
+ {
+ # check ownership. This code should nearly never run, because there is no button/interface to trigger it.
+ if(!$this->checkContentOwnership())
+ {
+ $response->getBody()->write(json_encode([
+ 'message' => 'You are not allowed to move that content.',
+ 'navigation' => $draftNavigation
+ ]));
+
+ return $response->withHeader('Content-Type', 'application/json')->withStatus(422);
+ }
+ }
+
+ $item = $navigation->getItemWithKeyPath($draftNavigation, $itemKeyPath);
+
+ $extendedNavigation = $navigation->getExtendedNavigation($urlinfo, $langattr);
+
+ $pageinfo = $extendedNavigation[$params['url']] ?? false;
+
+ if(!$pageinfo)
+ {
+ $response->getBody()->write(json_encode([
+ 'message' => 'page not found',
+ ]));
+
+ return $response->withHeader('Content-Type', 'application/json')->withStatus(404);
+ }
+
+ # if an item is moved to the first level
+ if($parentKeyTo == '')
+ {
+ # create empty and default values so that the logic below still works
+ $newFolder = new \stdClass();
+ $newFolder->path = '';
+ $folderContent = $draftNavigation;
+ }
+ else
+ {
+ # get the target folder from navigation
+ $newFolder = $navigation->getItemWithKeyPath($draftNavigation, $parentKeyTo);
+
+ # get the content of the target folder
+ $folderContent = $newFolder->folderContent;
+ }
+
+ # if the item has been moved within the same folder
+ if($parentKeyFrom == $parentKeyTo)
+ {
+ # no need to ping search engines
+ $ping = false;
+
+ # get key of item
+ $itemKey = end($itemKeyPath);
+ reset($itemKeyPath);
+
+ # delete item from folderContent
+ unset($folderContent[$itemKey]);
+ }
+ else
+ {
+ # let us ping search engines
+ $ping = true;
+
+ # rename links in extended file
+ #$navigation->renameExtended($item, $newFolder);
+
+ # an active file has been moved to another folder, so send new url with response
+ if($params['active'] == 'active')
+ {
+ $url = $urlinfo['baseurl'] . '/tm/content/' . $this->settings['editor'] . $newFolder->urlRelWoF . '/' . $item->slug;
+ }
+ }
+
+ # add item to newFolder
+ array_splice($folderContent, $params['index_new'], 0, array($item));
+
+ # move and rename files in the new folder
+ $index = 0;
+ $writeError = false;
+ $storage = new StorageWrapper('\Typemill\Models\Storage');
+ foreach($folderContent as $folderItem)
+ {
+ if(!$storage->moveFile($folderItem, $newFolder->path, $index))
+ {
+ $writeError = true;
+ }
+ $index++;
+ }
+ if($writeError)
+ {
+ $response->getBody()->write(json_encode([
+ 'message' => 'Something went wrong. Please refresh the page and check, if all folders and files are writable.',
+ 'navigation' => $draftNavigation,
+ 'url' => false
+ ]));
+
+ return $response->withHeader('Content-Type', 'application/json')->withStatus(404);
+ }
+
+ # if everything worked, we have to recreate the navigation
+ $navigation->clearNavigation();
+
+/*
+ # get item for url and set it active again
+ if(isset($this->params['url']))
+ {
+ $activeItem = Folder::getItemForUrl($this->structureDraft, $this->params['url'], $this->uri->getBaseUrl());
+ }
+
+ # update the structure for website
+ $this->setFreshStructureLive();
+
+ # update the navigation
+ $this->setFreshNavigation();
+
+ # update the sitemap
+ $this->updateSitemap($ping);
+
+ # dispatch event
+ $this->c->dispatcher->dispatch('onPageSorted', new OnPageSorted($this->params));
+*/
+
+ $response->getBody()->write(json_encode([
+ 'navigation' => $navigation->getDraftNavigation($urlinfo, $langattr),
+ 'message' => '',
+ 'url' => false
+ ]));
+
+ return $response->withHeader('Content-Type', 'application/json');
+ }
+
+ public function createArticle(Request $request, Response $response, $args)
+ {
+ # validate user rights
+ $acl = $this->c->get('acl');
+
+ # if user has no right to update content from others (eg admin or editor)
+ if(!$acl->isAllowed($request->getAttribute('c_userrole'), 'mycontent', 'create'))
+ {
+ $response->getBody()->write(json_encode([
+ 'message' => 'You are not allowed to create content.',
+ ]));
+
+ return $response->withHeader('Content-Type', 'application/json')->withStatus(403);
+ }
+
+ $params = $request->getParsedBody();
+
+ # input validation
+ $validate = new Validation();
+ $result = $validate->validateNaviItem($params);
+ if(!$result)
+ {
+ $response->getBody()->write(json_encode([
+ 'message' => 'Input not valid.',
+ 'errors' => $result
+ ]));
+
+ return $response->withHeader('Content-Type', 'application/json')->withStatus(422);
+ }
+
+ # set variables
+ $urlinfo = $this->c->get('urlinfo');
+ $langattr = $this->settings['langattr'];
+
+ # get navigation
+ $navigation = new Navigation();
+ $draftNavigation = $navigation->getDraftNavigation($urlinfo, $langattr);
+
+ if($params['folder_id'] == 'root')
+ {
+ $folderContent = $draftNavigation;
+ }
+ else
+ {
+ # get the ids (key path) for item, old folder and new folder
+ $folderKeyPath = explode('.', $params['folder_id']);
+
+ # get the item from structure
+ $folder = $navigation->getItemWithKeyPath($draftNavigation, $folderKeyPath);
+
+ if(!$folder)
+ {
+ $response->getBody()->write(json_encode([
+ 'message' => 'We could not find this page. Please refresh and try again.'
+ ]));
+
+ return $response->withHeader('Content-Type', 'application/json')->withStatus(422);
+ }
+
+ $folderContent = $folder->folderContent;
+ }
+
+
+
+
+
+
+ $name = $params['item_name'];
+ $slug = Folder::createSlug($this->params['item_name'], $this->settings);
+
+ # initialize index
+ $index = 0;
+
+ # iterate through the whole content of the new folder
+ $writeError = false;
+ $folderPath = isset($folder) ? $folder->path : '';
+
+ foreach($folderContent as $folderItem)
+ {
+ # check, if the same name as new item, then return an error
+ if($folderItem->slug == $slug)
+ {
+ return $response->withJson(array('navigation' => $draftNavigation, 'errors' => 'There is already a page with this name. Please choose another name.', 'url' => $url), 404);
+ }
+
+ if(!$writeYaml->moveElement($folderItem, $folderPath, $index))
+ {
+ $writeError = true;
+ }
+ $index++;
+ }
+
+ if($writeError)
+ {
+ return $response->withJson(array('data' => $this->structureDraft, 'errors' => 'Something went wrong. Please refresh the page and check, if all folders and files are writable.', 'url' => $url), 404);
+ }
+
+
+
+
+
+
+ # add prefix number to the name
+ $namePath = $index > 9 ? $index . '-' . $slug : '0' . $index . '-' . $slug;
+ $folderPath = 'content' . $folder->path;
+
+ # create default content
+ $content = json_encode(['# ' . $name, 'Content']);
+
+ if($this->params['type'] == 'file')
+ {
+ if(!$writeYaml->writeFile($folderPath, $namePath . '.txt', $content))
+ {
+ return $response->withJson(array('data' => $this->structureDraft, 'errors' => 'We could not create the file. Please refresh the page and check, if all folders and files are writable.', 'url' => $url), 404);
+ }
+ }
+ elseif($this->params['type'] == 'folder')
+ {
+ if(!$writeYaml->checkPath($folderPath . DIRECTORY_SEPARATOR . $namePath))
+ {
+ return $response->withJson(array('data' => $this->structureDraft, 'errors' => 'We could not create the folder. Please refresh the page and check, if all folders and files are writable.', 'url' => $url), 404);
+ }
+ $this->writeCache->writeFile($folderPath . DIRECTORY_SEPARATOR . $namePath, 'index.txt', $content);
+
+ # always redirect to a folder
+ $url = $this->uri->getBaseUrl() . '/tm/content/' . $this->settings['editor'] . $folder->urlRelWoF . '/' . $slug;
+
+ }
+
+ # get extended structure
+ $extended = $writeYaml->getYaml('cache', 'structure-extended.yaml');
+
+ # create the url for the item
+ $urlWoF = $folder->urlRelWoF . '/' . $slug;
+# $urlWoF = '/' . $slug;
+
+ # add the navigation name to the item htmlspecialchars needed for french language
+ $extended[$urlWoF] = ['hide' => false, 'navtitle' => $name];
+
+ # store the extended structure
+ $writeYaml->updateYaml('cache', 'structure-extended.yaml', $extended);
+
+ # update the structure for editor
+ $this->setFreshStructureDraft();
+
+ # get item for url and set it active again
+ if(isset($this->params['url']))
+ {
+ $activeItem = Folder::getItemForUrl($this->structureDraft, $this->params['url'], $this->uri->getBaseUrl());
+ }
+
+ # activate this if you want to redirect after creating the page...
+ # $url = $this->uri->getBaseUrl() . '/tm/content/' . $this->settings['editor'] . $folder->urlRelWoF . '/' . $slug;
+
+ return $response->withJson(array('data' => $this->structureDraft, 'errors' => false, 'url' => $url));
+ }
+}
\ No newline at end of file
diff --git a/system/typemill/Models/Navigation.php b/system/typemill/Models/Navigation.php
index 8d952a9..5881ec5 100644
--- a/system/typemill/Models/Navigation.php
+++ b/system/typemill/Models/Navigation.php
@@ -40,6 +40,35 @@ class Navigation
$this->extendedNaviName = 'navi-extended.txt';
}
+ public function clearNavigation(array $deleteitems = NULL )
+ {
+ # clear cache
+ $this->extendedNavigation = false;
+ $this->draftNavigation = false;
+ $this->basicDraftNavigation = false;
+ $this->liveNavigation = false;
+ $this->basicLiveNavigation = false;
+
+ # clear files
+ $navifiles = [
+ 'extended' => $this->extendedNaviName,
+ 'draft' => $this->draftNaviName,
+ 'live' => $this->liveNaviName
+ ];
+
+ if($deleteitems)
+ {
+ $navifiles = array_intersect_key($navifiles, $deleteitems);
+ }
+
+ foreach($navifiles as $navifile)
+ {
+ $result = $this->storage->deleteFile($this->naviFolder, $navifile);
+ }
+
+ return $result;
+ }
+
public function getMainNavigation($userrole, $acl, $urlinfo, $editor)
{
$mainnavi = $this->storage->getYaml('system/typemill/settings', 'mainnavi.yaml');
@@ -76,7 +105,6 @@ class Navigation
return $allowedmainnavi;
}
-
# get the navigation with draft files for author environment
public function getDraftNavigation($urlinfo, $language, $userrole = null, $username = null)
{
diff --git a/system/typemill/Models/Storage.php b/system/typemill/Models/Storage.php
index 548efe1..2737343 100644
--- a/system/typemill/Models/Storage.php
+++ b/system/typemill/Models/Storage.php
@@ -192,9 +192,52 @@ class Storage
return false;
}
- public function moveFile()
+ # used to sort the navigation / files
+ public function moveFile($item, $folderPath, $index, $date = null)
{
+ $filetypes = array('md', 'txt', 'yaml');
+
+ # set new order as string
+ $newOrder = ($index < 10) ? '0' . $index : $index;
+ $newPath = $this->contentFolder . $folderPath . DIRECTORY_SEPARATOR . $newOrder . '-' . $item->slug;
+
+ if($item->elementType == 'folder')
+ {
+ $oldPath = $this->basePath . 'content' . $item->path;
+ if(@rename($oldPath, $newPath))
+ {
+ return true;
+ }
+ return false;
+ }
+
+ # create old path but without filetype
+ $oldPath = substr($item->path, 0, strpos($item->path, "."));
+ $oldPath = $this->contentFolder . $oldPath;
+
+ $result = true;
+
+ foreach($filetypes as $filetype)
+ {
+ $oldFilePath = $oldPath . '.' . $filetype;
+ $newFilePath = $newPath . '.' . $filetype;
+
+ #check if file with filetype exists and rename
+ if($oldFilePath != $newFilePath && file_exists($oldFilePath))
+ {
+ if(@rename($oldFilePath, $newFilePath))
+ {
+ $result = $result;
+ }
+ else
+ {
+ $result = false;
+ }
+ }
+ }
+
+ return $result;
}
/**
@@ -498,54 +541,5 @@ class Storage
return $result;
}
- public function moveElement($item, $folderPath, $index, $date = null)
- {
- $filetypes = array('md', 'txt', 'yaml');
-
- # set new order as string
- $newOrder = ($index < 10) ? '0' . $index : $index;
-
- # create new path with foldername or filename but without file-type
- # $newPath = $this->basePath . 'content' . $folderPath . DIRECTORY_SEPARATOR . $newOrder . '-' . str_replace(" ", "-", $item->name);
-
- $newPath = $this->basePath . 'content' . $folderPath . DIRECTORY_SEPARATOR . $newOrder . '-' . $item->slug;
-
- if($item->elementType == 'folder')
- {
- $oldPath = $this->basePath . 'content' . $item->path;
- if(@rename($oldPath, $newPath))
- {
- return true;
- }
- return false;
- }
-
- # create old path but without filetype
- $oldPath = substr($item->path, 0, strpos($item->path, "."));
- $oldPath = $this->basePath . 'content' . $oldPath;
-
- $result = true;
-
- foreach($filetypes as $filetype)
- {
- $oldFilePath = $oldPath . '.' . $filetype;
- $newFilePath = $newPath . '.' . $filetype;
-
- #check if file with filetype exists and rename
- if($oldFilePath != $newFilePath && file_exists($oldFilePath))
- {
- if(@rename($oldFilePath, $newFilePath))
- {
- $result = $result;
- }
- else
- {
- $result = false;
- }
- }
- }
-
- return $result;
- }
*/
}
\ No newline at end of file
diff --git a/system/typemill/Models/Validation.php b/system/typemill/Models/Validation.php
index 00d0602..503a806 100644
--- a/system/typemill/Models/Validation.php
+++ b/system/typemill/Models/Validation.php
@@ -382,6 +382,66 @@ class Validation
return $v->errors();
}
+ /**
+ * validation for resort navigation
+ *
+ * @param array $params with form data.
+ * @return true or $v->errors with array of errors to use in json-response
+ */
+
+ public function navigationSort(array $params)
+ {
+ $v = new Validator($params);
+
+ $v->rule('required', ['item_id', 'parent_id_from', 'parent_id_to']);
+ $v->rule('regex', 'item_id', '/^[0-9.]+$/i');
+ $v->rule('regex', 'parent_id_from', '/^[a-zA-Z0-9.]+$/i');
+ $v->rule('regex', 'parent_id_to', '/^[a-zA-Z0-9.]+$/i');
+ $v->rule('integer', 'index_new');
+ $v->rule('integer', 'index_old');
+
+ if($v->validate())
+ {
+ return true;
+ }
+
+ return $v->errors();
+ }
+
+ /**
+ * validation for new navigation items
+ *
+ * @param array $params with form data.
+ * @return true or $v->errors with array of errors to use in json-response
+ */
+
+ public function navigationItem(array $params)
+ {
+ $v = new Validator($params);
+
+ $v->rule('required', ['folder_id', 'item_name', 'type', 'url']);
+ $v->rule('regex', 'folder_id', '/^(root)|([0-9.]+)$/i');
+ $v->rule('navigation', 'item_name');
+ $v->rule('lengthBetween', 'item_name', 1, 60);
+ $v->rule('in', 'type', ['file', 'folder']);
+
+ if($v->validate())
+ {
+ return true;
+ }
+ else
+ {
+ return $v->errors();
+ }
+ }
+
+
+
+
+
+
+
+
/**
* validation for system settings
@@ -463,80 +523,7 @@ class Validation
}
}
- /**
- * validation for resort navigation
- *
- * @param array $params with form data.
- * @return true or $v->errors with array of errors to use in json-response
- */
-
- public function navigationSort(array $params)
- {
- $v = new Validator($params);
-
- $v->rule('required', ['item_id', 'parent_id_from', 'parent_id_to']);
- $v->rule('regex', 'item_id', '/^[0-9.]+$/i');
- $v->rule('regex', 'parent_id_from', '/^[a-zA-Z0-9.]+$/i');
- $v->rule('regex', 'parent_id_to', '/^[a-zA-Z0-9.]+$/i');
- $v->rule('integer', 'index_new');
-
- if($v->validate())
- {
- return true;
- }
- else
- {
- return $v->errors();
- }
- }
- /**
- * validation for new navigation items
- *
- * @param array $params with form data.
- * @return true or $v->errors with array of errors to use in json-response
- */
-
- public function navigationItem(array $params)
- {
- $v = new Validator($params);
-
- $v->rule('required', ['folder_id', 'item_name', 'type', 'url']);
- $v->rule('regex', 'folder_id', '/^[0-9.]+$/i');
-# $v->rule('noSpecialChars', 'item_name');
- $v->rule('navigation', 'item_name');
- $v->rule('lengthBetween', 'item_name', 1, 60);
- $v->rule('in', 'type', ['file', 'folder']);
-
- if($v->validate())
- {
- return true;
- }
- else
- {
- return $v->errors();
- }
- }
-
- public function navigationBaseItem(array $params)
- {
- $v = new Validator($params);
-
- $v->rule('required', ['item_name', 'type', 'url']);
-# $v->rule('noSpecialChars', 'item_name');
- $v->rule('navigation', 'item_name');
- $v->rule('lengthBetween', 'item_name', 1, 40);
- $v->rule('in', 'type', ['file', 'folder']);
-
- if($v->validate())
- {
- return true;
- }
- else
- {
- return $v->errors();
- }
- }
/**
* validation for dynamic fields ( settings for themes and plugins)
diff --git a/system/typemill/author/content/blox-editor.twig b/system/typemill/author/content/blox-editor.twig
index 2764e8d..48e158f 100644
--- a/system/typemill/author/content/blox-editor.twig
+++ b/system/typemill/author/content/blox-editor.twig
@@ -5,18 +5,10 @@
{{ translate('Visual Editor') }}
-
+
{% endblock %}
{% block javascript %}
-
-
-
-
-
-
{% endblock %}
diff --git a/system/typemill/author/css/output.css b/system/typemill/author/css/output.css
index daad61b..c601452 100644
--- a/system/typemill/author/css/output.css
+++ b/system/typemill/author/css/output.css
@@ -620,6 +620,14 @@ video {
pointer-events: none;
}
+.visible {
+ visibility: visible;
+}
+
+.invisible {
+ visibility: hidden;
+}
+
.static {
position: static;
}
@@ -636,6 +644,11 @@ video {
position: relative;
}
+.sticky {
+ position: -webkit-sticky;
+ position: sticky;
+}
+
.inset-0 {
top: 0px;
right: 0px;
@@ -688,6 +701,10 @@ video {
margin: auto;
}
+.m-1 {
+ margin: 0.25rem;
+}
+
.my-2 {
margin-top: 0.5rem;
margin-bottom: 0.5rem;
@@ -723,28 +740,45 @@ video {
margin-bottom: 0.75rem;
}
+.mx-1 {
+ margin-left: 0.25rem;
+ margin-right: 0.25rem;
+}
+
.mt-6 {
margin-top: 1.5rem;
}
-.mb-1 {
- margin-bottom: 0.25rem;
-}
-
-.mt-3 {
- margin-top: 0.75rem;
-}
-
.mb-4 {
margin-bottom: 1rem;
}
+.mr-3 {
+ margin-right: 0.75rem;
+}
+
+.mb-1 {
+ margin-bottom: 0.25rem;
+}
+
+.mr-1 {
+ margin-right: 0.25rem;
+}
+
+.mr-4 {
+ margin-right: 1rem;
+}
+
+.mt-3 {
+ margin-top: 0.75rem;
+}
+
.mb-3 {
margin-bottom: 0.75rem;
}
-.mr-3 {
- margin-right: 0.75rem;
+.ml-3 {
+ margin-left: 0.75rem;
}
.mt-5 {
@@ -771,10 +805,6 @@ video {
margin-top: 1rem;
}
-.mt-auto {
- margin-top: auto;
-}
-
.mt-8 {
margin-top: 2rem;
}
@@ -783,16 +813,16 @@ video {
margin-top: 1.75rem;
}
-.mr-4 {
- margin-right: 1rem;
-}
-
.mr-2 {
margin-right: 0.5rem;
}
-.ml-3 {
- margin-left: 0.75rem;
+.ml-1 {
+ margin-left: 0.25rem;
+}
+
+.-ml-1 {
+ margin-left: -0.25rem;
}
.block {
@@ -839,6 +869,10 @@ video {
height: 1.5rem;
}
+.h-0 {
+ height: 0px;
+}
+
.h-12 {
height: 3rem;
}
@@ -851,14 +885,6 @@ video {
height: 20rem;
}
-.h-64 {
- height: 16rem;
-}
-
-.h-0 {
- height: 0px;
-}
-
.h-48 {
height: 12rem;
}
@@ -879,6 +905,10 @@ video {
width: 100%;
}
+.w-1\/4 {
+ width: 25%;
+}
+
.w-2\/5 {
width: 40%;
}
@@ -895,6 +925,10 @@ video {
width: 1.5rem;
}
+.w-0 {
+ width: 0px;
+}
+
.w-5 {
width: 1.25rem;
}
@@ -931,14 +965,6 @@ video {
width: 75%;
}
-.w-1\/4 {
- width: 25%;
-}
-
-.w-0 {
- width: 0px;
-}
-
.max-w-md {
max-width: 28rem;
}
@@ -975,6 +1001,23 @@ video {
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
+@-webkit-keyframes spin {
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@keyframes spin {
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+.animate-spin {
+ -webkit-animation: spin 1s linear infinite;
+ animation: spin 1s linear infinite;
+}
+
.cursor-pointer {
cursor: pointer;
}
@@ -983,10 +1026,8 @@ video {
resize: both;
}
-.appearance-none {
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
+.list-none {
+ list-style-type: none;
}
.flex-col {
@@ -1025,12 +1066,6 @@ video {
justify-content: space-around;
}
-.space-x-8 > :not([hidden]) ~ :not([hidden]) {
- --tw-space-x-reverse: 0;
- margin-right: calc(2rem * var(--tw-space-x-reverse));
- margin-left: calc(2rem * calc(1 - var(--tw-space-x-reverse)));
-}
-
.space-x-4 > :not([hidden]) ~ :not([hidden]) {
--tw-space-x-reverse: 0;
margin-right: calc(1rem * var(--tw-space-x-reverse));
@@ -1076,10 +1111,22 @@ video {
border-right-width: 8px;
}
+.border-l-4 {
+ border-left-width: 4px;
+}
+
.border-b {
border-bottom-width: 1px;
}
+.border-b-8 {
+ border-bottom-width: 8px;
+}
+
+.border-t-8 {
+ border-top-width: 8px;
+}
+
.border-b-2 {
border-bottom-width: 2px;
}
@@ -1096,18 +1143,6 @@ video {
border-right-width: 2px;
}
-.border-l-4 {
- border-left-width: 4px;
-}
-
-.border-b-8 {
- border-bottom-width: 8px;
-}
-
-.border-t-8 {
- border-top-width: 8px;
-}
-
.border-solid {
border-style: solid;
}
@@ -1117,6 +1152,11 @@ video {
border-color: rgb(209 213 219 / var(--tw-border-opacity));
}
+.border-teal-500 {
+ --tw-border-opacity: 1;
+ border-color: rgb(20 184 166 / var(--tw-border-opacity));
+}
+
.border-stone-200 {
--tw-border-opacity: 1;
border-color: rgb(231 229 228 / var(--tw-border-opacity));
@@ -1137,11 +1177,6 @@ video {
border-color: rgb(214 211 209 / var(--tw-border-opacity));
}
-.border-teal-500 {
- --tw-border-opacity: 1;
- border-color: rgb(20 184 166 / var(--tw-border-opacity));
-}
-
.border-stone-700 {
--tw-border-opacity: 1;
border-color: rgb(68 64 60 / var(--tw-border-opacity));
@@ -1177,11 +1212,6 @@ video {
border-right-color: transparent;
}
-.border-b-blue-600 {
- --tw-border-opacity: 1;
- border-bottom-color: rgb(37 99 235 / var(--tw-border-opacity));
-}
-
.border-b-white {
--tw-border-opacity: 1;
border-bottom-color: rgb(255 255 255 / var(--tw-border-opacity));
@@ -1202,16 +1232,6 @@ video {
background-color: rgb(255 255 255 / var(--tw-bg-opacity));
}
-.bg-rose-500 {
- --tw-bg-opacity: 1;
- background-color: rgb(244 63 94 / var(--tw-bg-opacity));
-}
-
-.bg-teal-500 {
- --tw-bg-opacity: 1;
- background-color: rgb(20 184 166 / var(--tw-bg-opacity));
-}
-
.bg-stone-100 {
--tw-bg-opacity: 1;
background-color: rgb(245 245 244 / var(--tw-bg-opacity));
@@ -1222,16 +1242,26 @@ video {
background-color: rgb(68 64 60 / var(--tw-bg-opacity));
}
-.bg-red-100 {
- --tw-bg-opacity: 1;
- background-color: rgb(254 226 226 / var(--tw-bg-opacity));
-}
-
.bg-stone-200 {
--tw-bg-opacity: 1;
background-color: rgb(231 229 228 / var(--tw-bg-opacity));
}
+.bg-rose-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(244 63 94 / var(--tw-bg-opacity));
+}
+
+.bg-teal-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(20 184 166 / var(--tw-bg-opacity));
+}
+
+.bg-red-100 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(254 226 226 / var(--tw-bg-opacity));
+}
+
.bg-stone-900 {
--tw-bg-opacity: 1;
background-color: rgb(28 25 23 / var(--tw-bg-opacity));
@@ -1242,6 +1272,10 @@ video {
background-color: rgb(250 250 249 / var(--tw-bg-opacity));
}
+.bg-transparent {
+ background-color: transparent;
+}
+
.bg-opacity-90 {
--tw-bg-opacity: 0.9;
}
@@ -1254,6 +1288,10 @@ video {
background-position: center;
}
+.p-1 {
+ padding: 0.25rem;
+}
+
.p-2 {
padding: 0.5rem;
}
@@ -1274,10 +1312,6 @@ video {
padding: 1.5rem;
}
-.p-1 {
- padding: 0.25rem;
-}
-
.py-5 {
padding-top: 1.25rem;
padding-bottom: 1.25rem;
@@ -1333,6 +1367,10 @@ video {
padding-right: 0.25rem;
}
+.pl-2 {
+ padding-left: 0.5rem;
+}
+
.pl-3 {
padding-left: 0.75rem;
}
@@ -1361,8 +1399,8 @@ video {
padding-top: 0.5rem;
}
-.pl-8 {
- padding-left: 2rem;
+.pb-4 {
+ padding-bottom: 1rem;
}
.pt-4 {
@@ -1373,12 +1411,16 @@ video {
padding-bottom: 0.75rem;
}
-.pr-8 {
- padding-right: 2rem;
+.pl-4 {
+ padding-left: 1rem;
}
-.pb-4 {
- padding-bottom: 1rem;
+.pl-8 {
+ padding-left: 2rem;
+}
+
+.pl-12 {
+ padding-left: 3rem;
}
.text-left {
@@ -1416,6 +1458,16 @@ video {
line-height: 1rem;
}
+.text-3xl {
+ font-size: 1.875rem;
+ line-height: 2.25rem;
+}
+
+.text-sm {
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+}
+
.text-lg {
font-size: 1.125rem;
line-height: 1.75rem;
@@ -1426,21 +1478,11 @@ video {
line-height: 1.75rem;
}
-.text-sm {
- font-size: 0.875rem;
- line-height: 1.25rem;
-}
-
.text-2xl {
font-size: 1.5rem;
line-height: 2rem;
}
-.text-3xl {
- font-size: 1.875rem;
- line-height: 2.25rem;
-}
-
.font-normal {
font-weight: 400;
}
@@ -1519,27 +1561,42 @@ video {
color: rgb(6 182 212 / var(--tw-text-opacity));
}
+.text-stone-700 {
+ --tw-text-opacity: 1;
+ color: rgb(68 64 60 / var(--tw-text-opacity));
+}
+
+.text-stone-200 {
+ --tw-text-opacity: 1;
+ color: rgb(231 229 228 / var(--tw-text-opacity));
+}
+
+.text-stone-500 {
+ --tw-text-opacity: 1;
+ color: rgb(120 113 108 / var(--tw-text-opacity));
+}
+
.underline {
-webkit-text-decoration-line: underline;
text-decoration-line: underline;
}
-.accent-pink-300 {
- accent-color: #f9a8d4;
-}
-
.accent-white {
accent-color: #fff;
}
-.accent-teal-500 {
- accent-color: #14b8a6;
-}
-
.opacity-0 {
opacity: 0;
}
+.opacity-25 {
+ opacity: 0.25;
+}
+
+.opacity-75 {
+ opacity: 0.75;
+}
+
.shadow-lg {
--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
@@ -1598,26 +1655,6 @@ video {
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
}
-.checked\:bg-white:checked {
- --tw-bg-opacity: 1;
- background-color: rgb(255 255 255 / var(--tw-bg-opacity));
-}
-
-.checked\:bg-blue-500:checked {
- --tw-bg-opacity: 1;
- background-color: rgb(59 130 246 / var(--tw-bg-opacity));
-}
-
-.checked\:bg-teal-500:checked {
- --tw-bg-opacity: 1;
- background-color: rgb(20 184 166 / var(--tw-bg-opacity));
-}
-
-.checked\:text-white:checked {
- --tw-text-opacity: 1;
- color: rgb(255 255 255 / var(--tw-text-opacity));
-}
-
.hover\:border-b-4:hover {
border-bottom-width: 4px;
}
@@ -1637,11 +1674,21 @@ video {
border-color: rgb(20 184 166 / var(--tw-border-opacity));
}
+.hover\:border-stone-50:hover {
+ --tw-border-opacity: 1;
+ border-color: rgb(250 250 249 / var(--tw-border-opacity));
+}
+
.hover\:bg-gray-200:hover {
--tw-bg-opacity: 1;
background-color: rgb(229 231 235 / var(--tw-bg-opacity));
}
+.hover\:bg-stone-50:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(250 250 249 / var(--tw-bg-opacity));
+}
+
.hover\:bg-stone-900:hover {
--tw-bg-opacity: 1;
background-color: rgb(28 25 23 / var(--tw-bg-opacity));
@@ -1687,9 +1734,19 @@ video {
background-color: rgb(6 182 212 / var(--tw-bg-opacity));
}
-.hover\:bg-stone-50:hover {
+.hover\:bg-stone-700:hover {
--tw-bg-opacity: 1;
- background-color: rgb(250 250 249 / var(--tw-bg-opacity));
+ background-color: rgb(68 64 60 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-stone-500:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(120 113 108 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-teal-500:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(20 184 166 / var(--tw-bg-opacity));
}
.hover\:text-white:hover {
@@ -1697,6 +1754,16 @@ video {
color: rgb(255 255 255 / var(--tw-text-opacity));
}
+.hover\:text-stone-50:hover {
+ --tw-text-opacity: 1;
+ color: rgb(250 250 249 / var(--tw-text-opacity));
+}
+
+.hover\:text-stone-100:hover {
+ --tw-text-opacity: 1;
+ color: rgb(245 245 244 / var(--tw-text-opacity));
+}
+
.hover\:underline:hover {
-webkit-text-decoration-line: underline;
text-decoration-line: underline;
@@ -1707,6 +1774,11 @@ video {
border-color: rgb(37 99 235 / var(--tw-border-opacity));
}
+.focus\:border-stone-100:focus {
+ --tw-border-opacity: 1;
+ border-color: rgb(245 245 244 / var(--tw-border-opacity));
+}
+
.focus\:bg-white:focus {
--tw-bg-opacity: 1;
background-color: rgb(255 255 255 / var(--tw-bg-opacity));
@@ -1717,6 +1789,11 @@ video {
background-color: rgb(250 250 249 / var(--tw-bg-opacity));
}
+.focus\:bg-stone-100:focus {
+ --tw-bg-opacity: 1;
+ background-color: rgb(245 245 244 / var(--tw-bg-opacity));
+}
+
.focus\:text-gray-700:focus {
--tw-text-opacity: 1;
color: rgb(55 65 81 / var(--tw-text-opacity));
@@ -1738,6 +1815,10 @@ video {
background-color: rgb(250 250 249 / var(--tw-bg-opacity));
}
+.group:hover .group-hover\:visible {
+ visibility: visible;
+}
+
@media (prefers-color-scheme: dark) {
.dark\:text-gray-400 {
--tw-text-opacity: 1;
diff --git a/system/typemill/author/js/sortable.min.js b/system/typemill/author/js/sortable.min.js
new file mode 100644
index 0000000..eba0614
--- /dev/null
+++ b/system/typemill/author/js/sortable.min.js
@@ -0,0 +1,2 @@
+/*! Sortable 1.10.2 - MIT | git://github.com/SortableJS/Sortable.git */
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).Sortable=e()}(this,function(){"use strict";function o(t){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function a(){return(a=Object.assign||function(t){for(var e=1;e"===e[0]&&(e=e.substring(1)),t)try{if(t.matches)return t.matches(e);if(t.msMatchesSelector)return t.msMatchesSelector(e);if(t.webkitMatchesSelector)return t.webkitMatchesSelector(e)}catch(t){return!1}return!1}}function P(t,e,n,o){if(t){n=n||document;do{if(null!=e&&(">"===e[0]?t.parentNode===n&&h(t,e):h(t,e))||o&&t===n)return t;if(t===n)break}while(t=(i=t).host&&i!==document&&i.host.nodeType?i.host:i.parentNode)}var i;return null}var f,p=/\s+/g;function k(t,e,n){if(t&&e)if(t.classList)t.classList[n?"add":"remove"](e);else{var o=(" "+t.className+" ").replace(p," ").replace(" "+e+" "," ");t.className=(o+(n?" "+e:"")).replace(p," ")}}function R(t,e,n){var o=t&&t.style;if(o){if(void 0===n)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(t,""):t.currentStyle&&(n=t.currentStyle),void 0===e?n:n[e];e in o||-1!==e.indexOf("webkit")||(e="-webkit-"+e),o[e]=n+("string"==typeof n?"":"px")}}function v(t,e){var n="";if("string"==typeof t)n=t;else do{var o=R(t,"transform");o&&"none"!==o&&(n=o+" "+n)}while(!e&&(t=t.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function g(t,e,n){if(t){var o=t.getElementsByTagName(e),i=0,r=o.length;if(n)for(;i=e.left-n&&r<=e.right+n,i=a>=e.top-n&&a<=e.bottom+n;return n&&o&&i?l=t:void 0}}),l}((t=t.touches?t.touches[0]:t).clientX,t.clientY);if(e){var n={};for(var o in t)t.hasOwnProperty(o)&&(n[o]=t[o]);n.target=n.rootEl=e,n.preventDefault=void 0,n.stopPropagation=void 0,e[j]._onDragOver(n)}}}function kt(t){z&&z.parentNode[j]._isOutsideThisEl(t.target)}function Rt(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(t));this.el=t,this.options=e=a({},e),t[j]=this;var n={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(t.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return Ot(t,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==Rt.supportPointer&&"PointerEvent"in window,emptyInsertThreshold:5};for(var o in O.initializePlugins(this,t,n),n)o in e||(e[o]=n[o]);for(var i in At(e),this)"_"===i.charAt(0)&&"function"==typeof this[i]&&(this[i]=this[i].bind(this));this.nativeDraggable=!e.forceFallback&&xt,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?u(t,"pointerdown",this._onTapStart):(u(t,"mousedown",this._onTapStart),u(t,"touchstart",this._onTapStart)),this.nativeDraggable&&(u(t,"dragover",this),u(t,"dragenter",this)),bt.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[]),a(this,T())}function Xt(t,e,n,o,i,r,a,l){var s,c,u=t[j],d=u.options.onMove;return!window.CustomEvent||w||E?(s=document.createEvent("Event")).initEvent("move",!0,!0):s=new CustomEvent("move",{bubbles:!0,cancelable:!0}),s.to=e,s.from=t,s.dragged=n,s.draggedRect=o,s.related=i||e,s.relatedRect=r||X(e),s.willInsertAfter=l,s.originalEvent=a,t.dispatchEvent(s),d&&(c=d.call(u,s,a)),c}function Yt(t){t.draggable=!1}function Bt(){Dt=!1}function Ft(t){for(var e=t.tagName+t.className+t.src+t.href+t.textContent,n=e.length,o=0;n--;)o+=e.charCodeAt(n);return o.toString(36)}function Ht(t){return setTimeout(t,0)}function Lt(t){return clearTimeout(t)}Rt.prototype={constructor:Rt,_isOutsideThisEl:function(t){this.el.contains(t)||t===this.el||(ht=null)},_getDirection:function(t,e){return"function"==typeof this.options.direction?this.options.direction.call(this,t,e,z):this.options.direction},_onTapStart:function(e){if(e.cancelable){var n=this,o=this.el,t=this.options,i=t.preventOnFilter,r=e.type,a=e.touches&&e.touches[0]||e.pointerType&&"touch"===e.pointerType&&e,l=(a||e).target,s=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||l,c=t.filter;if(function(t){St.length=0;var e=t.getElementsByTagName("input"),n=e.length;for(;n--;){var o=e[n];o.checked&&St.push(o)}}(o),!z&&!(/mousedown|pointerdown/.test(r)&&0!==e.button||t.disabled||s.isContentEditable||(l=P(l,t.draggable,o,!1))&&l.animated||Z===l)){if(J=F(l),et=F(l,t.draggable),"function"==typeof c){if(c.call(this,e,l,this))return W({sortable:n,rootEl:s,name:"filter",targetEl:l,toEl:o,fromEl:o}),K("filter",n,{evt:e}),void(i&&e.cancelable&&e.preventDefault())}else if(c&&(c=c.split(",").some(function(t){if(t=P(s,t.trim(),o,!1))return W({sortable:n,rootEl:t,name:"filter",targetEl:l,fromEl:o,toEl:o}),K("filter",n,{evt:e}),!0})))return void(i&&e.cancelable&&e.preventDefault());t.handle&&!P(s,t.handle,o,!1)||this._prepareDragStart(e,a,l)}}},_prepareDragStart:function(t,e,n){var o,i=this,r=i.el,a=i.options,l=r.ownerDocument;if(n&&!z&&n.parentNode===r){var s=X(n);if(q=r,G=(z=n).parentNode,V=z.nextSibling,Z=n,ot=a.group,rt={target:Rt.dragged=z,clientX:(e||t).clientX,clientY:(e||t).clientY},ct=rt.clientX-s.left,ut=rt.clientY-s.top,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,z.style["will-change"]="all",o=function(){K("delayEnded",i,{evt:t}),Rt.eventCanceled?i._onDrop():(i._disableDelayedDragEvents(),!c&&i.nativeDraggable&&(z.draggable=!0),i._triggerDragStart(t,e),W({sortable:i,name:"choose",originalEvent:t}),k(z,a.chosenClass,!0))},a.ignore.split(",").forEach(function(t){g(z,t.trim(),Yt)}),u(l,"dragover",Pt),u(l,"mousemove",Pt),u(l,"touchmove",Pt),u(l,"mouseup",i._onDrop),u(l,"touchend",i._onDrop),u(l,"touchcancel",i._onDrop),c&&this.nativeDraggable&&(this.options.touchStartThreshold=4,z.draggable=!0),K("delayStart",this,{evt:t}),!a.delay||a.delayOnTouchOnly&&!e||this.nativeDraggable&&(E||w))o();else{if(Rt.eventCanceled)return void this._onDrop();u(l,"mouseup",i._disableDelayedDrag),u(l,"touchend",i._disableDelayedDrag),u(l,"touchcancel",i._disableDelayedDrag),u(l,"mousemove",i._delayedDragTouchMoveHandler),u(l,"touchmove",i._delayedDragTouchMoveHandler),a.supportPointer&&u(l,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(o,a.delay)}}},_delayedDragTouchMoveHandler:function(t){var e=t.touches?t.touches[0]:t;Math.max(Math.abs(e.clientX-this._lastX),Math.abs(e.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){z&&Yt(z),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;d(t,"mouseup",this._disableDelayedDrag),d(t,"touchend",this._disableDelayedDrag),d(t,"touchcancel",this._disableDelayedDrag),d(t,"mousemove",this._delayedDragTouchMoveHandler),d(t,"touchmove",this._delayedDragTouchMoveHandler),d(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||"touch"==t.pointerType&&t,!this.nativeDraggable||e?this.options.supportPointer?u(document,"pointermove",this._onTouchMove):u(document,e?"touchmove":"mousemove",this._onTouchMove):(u(z,"dragend",this),u(q,"dragstart",this._onDragStart));try{document.selection?Ht(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(t,e){if(vt=!1,q&&z){K("dragStarted",this,{evt:e}),this.nativeDraggable&&u(document,"dragover",kt);var n=this.options;t||k(z,n.dragClass,!1),k(z,n.ghostClass,!0),Rt.active=this,t&&this._appendGhost(),W({sortable:this,name:"start",originalEvent:e})}else this._nulling()},_emulateDragOver:function(){if(at){this._lastX=at.clientX,this._lastY=at.clientY,Nt();for(var t=document.elementFromPoint(at.clientX,at.clientY),e=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(at.clientX,at.clientY))!==e;)e=t;if(z.parentNode[j]._isOutsideThisEl(t),e)do{if(e[j]){if(e[j]._onDragOver({clientX:at.clientX,clientY:at.clientY,target:t,rootEl:e})&&!this.options.dragoverBubble)break}t=e}while(e=e.parentNode);It()}},_onTouchMove:function(t){if(rt){var e=this.options,n=e.fallbackTolerance,o=e.fallbackOffset,i=t.touches?t.touches[0]:t,r=U&&v(U,!0),a=U&&r&&r.a,l=U&&r&&r.d,s=Ct&>&&b(gt),c=(i.clientX-rt.clientX+o.x)/(a||1)+(s?s[0]-Et[0]:0)/(a||1),u=(i.clientY-rt.clientY+o.y)/(l||1)+(s?s[1]-Et[1]:0)/(l||1);if(!Rt.active&&!vt){if(n&&Math.max(Math.abs(i.clientX-this._lastX),Math.abs(i.clientY-this._lastY))o.right+10||t.clientX<=o.right&&t.clientY>o.bottom&&t.clientX>=o.left:t.clientX>o.right&&t.clientY>o.top||t.clientX<=o.right&&t.clientY>o.bottom+10}(n,a,this)&&!g.animated){if(g===z)return A(!1);if(g&&l===n.target&&(s=g),s&&(i=X(s)),!1!==Xt(q,l,z,o,s,i,n,!!s))return O(),l.appendChild(z),G=l,N(),A(!0)}else if(s.parentNode===l){i=X(s);var v,m,b,y=z.parentNode!==l,w=!function(t,e,n){var o=n?t.left:t.top,i=n?t.right:t.bottom,r=n?t.width:t.height,a=n?e.left:e.top,l=n?e.right:e.bottom,s=n?e.width:e.height;return o===a||i===l||o+r/2===a+s/2}(z.animated&&z.toRect||o,s.animated&&s.toRect||i,a),E=a?"top":"left",D=Y(s,"top","top")||Y(z,"top","top"),S=D?D.scrollTop:void 0;if(ht!==s&&(m=i[E],yt=!1,wt=!w&&e.invertSwap||y),0!==(v=function(t,e,n,o,i,r,a,l){var s=o?t.clientY:t.clientX,c=o?n.height:n.width,u=o?n.top:n.left,d=o?n.bottom:n.right,h=!1;if(!a)if(l&&pt
+
+
+
+
+
+
+
+ `,
+ data: function () {
+ return {
+ navigation: data.navigation,
+ isExpended: false,
+ expanded: [],
+ }
+ },
+ mounted: function(){
+ var expanded = localStorage.getItem('expanded');
+ if(expanded !== null)
+ {
+ var expandedArray = expanded.split(',');
+ var expandedLength = expandedArray.length;
+ var cleanExpandedArray = [];
+ for(var i = 0; i < expandedLength; i++)
+ {
+ if(typeof expandedArray[i] === 'string' && expandedArray[i] != '')
+ {
+ cleanExpandedArray.push(expandedArray[i]);
+ }
+ }
+ this.expanded = expanded.split(',');
+ }
+ eventBus.$on('toggleFolder', this.toggleFolder);
+ },
+ methods: {
+ getHomeUrl()
+ {
+ return tmaxios.defaults.baseURL + '/tm/content/visual';
+ },
+ toggleFolder: function(name)
+ {
+ var index = this.expanded.indexOf(name);
+ if (index > -1)
+ {
+ this.expanded.splice(index, 1);
+ // this.expandNavigation = false;
+ }
+ else
+ {
+ this.expanded.push(name);
+ }
+ localStorage.setItem("expanded", this.expanded.toString());
+ },
+ expandNavigation()
+ {
+ this.expanded = this.getFolderNames(this.navigation, []);
+ localStorage.setItem("expanded", this.expanded.toString());
+ },
+ collapseNavigation()
+ {
+ this.expanded = [];
+ localStorage.removeItem('expanded');
+ },
+ getFolderNames(navigation, result)
+ {
+ for (const item of navigation)
+ {
+ if (item.elementType == 'folder')
+ {
+ result.push(item.name);
+ this.getFolderNames(item.folderContent, result);
+ }
+ }
+ return result;
+ }
+ }
+});
+
+navigation.component('draggable', vuedraggable);
+
+navigation.component('navilevel',{
+ template: `
+
+
+
+
+
+
+
+
+
+
+
+
+ `,
+ props: {
+ navigation: {
+ type: Array,
+ required: true
+ },
+ parentId: {
+ default: 'root'
+ }
+ },
+ data: function () {
+ return {
+ navilevel: '',
+ load: '?',
+ freeze: false,
+ newItem: '',
+ format: /[@#*()=\[\]{};:"\\|,.<>\/]/,
+ }
+ },
+ computed:
+ {
+ dragOptions()
+ {
+ return {
+ animation: 150,
+ group: "file",
+ disabled: this.freeze,
+ ghostClass: "ghost",
+ };
+ },
+
+ // this.value when input = v-model
+ // this.list when input != v-model
+ realValue()
+ {
+ return this.value ? this.value : this.list;
+ }
+ },
+ methods:
+ {
+ getNaviClass(active, activeParent, keyPathArray)
+ {
+ var naviclass = 'pl-' + (keyPathArray.length * 2);
+ this.navilevel = naviclass;
+ if(active){ naviclass += " active" }
+ if(activeParent){ naviclass += " activeParent" }
+
+ return naviclass;
+ },
+ getUrl(segment)
+ {
+ return tmaxios.defaults.baseURL + '/tm/content/visual' + segment;
+ },
+ callToggle(name)
+ {
+ eventBus.$emit('toggleFolder', name);
+ },
+ isExpanded(name)
+ {
+ if(this.$root.expanded.indexOf(name) > -1)
+ {
+ return true;
+ }
+ return false;
+ },
+ onStart(evt)
+ {
+ /* delete error messages if exist */
+ // publishController.errors.message = false;
+ },
+ checkMove(evt)
+ {
+ /* do we want to keep that restriction, no folder into folders? */
+ if(evt.dragged.classList.contains('folder') && evt.from.parentNode.id != evt.to.parentNode.id)
+ {
+ console.info("moved folder to another folder");
+ return false;
+ }
+ if(evt.dragged.dataset.active == 'active' && !editor.draftDisabled)
+ {
+ console.info("moved page is active, save your changes first");
+ // publishController.errors.message = "Please save your changes before you move the file";
+ return false;
+ }
+ return true;
+ },
+ onEnd(evt)
+ {
+ if(evt.from.parentNode.id == evt.to.parentNode.id && evt.oldIndex == evt.newIndex)
+ {
+ return
+ }
+ this.freeze = true;
+ this.load = evt.item.id;
+
+ var self = this;
+
+// self.errors = {title: false, content: false, message: false};
+
+ tmaxios.post('/api/v1/article/sort',{
+ 'item_id': evt.item.id,
+ 'parent_id_from': evt.from.parentNode.id,
+ 'parent_id_to': evt.to.parentNode.id,
+ 'index_old': evt.oldIndex,
+ 'index_new': evt.newIndex,
+ 'active': evt.item.dataset.active,
+ 'url': evt.item.dataset.url,
+// 'url': document.getElementById("path").value,
+// 'csrf_name': document.getElementById("csrf_name").value,
+// 'csrf_value': document.getElementById("csrf_value").value,
+ })
+ .then(function (response)
+ {
+ self.load = '?';
+ self.freeze = false;
+
+ if(response.data.url)
+ {
+ window.location.replace(response.data.url);
+ }
+ if(response.data.navigation)
+ {
+ self.$root.$data.navigation = response.data.navigation;
+ }
+ })
+ .catch(function (error)
+ {
+ if(error.response.data.errors.message)
+ {
+// publishController.errors.message = error.response.data.errors;
+ }
+ });
+ },
+ addItem(type, parent)
+ {
+ // publishController.errors.message = false;
+ if(this.format.test(this.newItem) || !this.newItem || this.newItem.length > 40)
+ {
+ // publishController.errors.message = 'Special Characters are not allowed. Length between 1 and 40.';
+ return;
+ }
+
+ self = this;
+
+ self.freeze = true;
+ // self.errors = {title: false, content: false, message: false};
+
+ tmaxios.post('/api/v1/article',{
+ 'item_name': this.newItem,
+ 'folder_id': parent,
+ 'type': type,
+ // 'url': document.getElementById("path").value,
+ // 'csrf_name': document.getElementById("csrf_name").value,
+ // 'csrf_value': document.getElementById("csrf_value").value,
+ })
+ .then(function (response) {
+
+ self.freeze = false;
+
+ if(response.data.url)
+ {
+ window.location.replace(response.data.url);
+ }
+ if(response.data.navigation)
+ {
+ self.items = response.data.navigation;
+ self.newItem = '';
+ }
+ })
+ .catch(function (error)
+ {
+// publishController.errors.message = error.response.data.errors;
+ });
+ },
+ emitter(value) {
+ this.$emit("input", value);
+ },
+ },
+});
+
+navigation.mount('#contentNavigation');
+
+/*
+ data: function () {
+ return {
+ title: "Navigation",
+ navigation: data.navigation,
+ homepage: false,
+ editormode: 'visual',
+ freeze: false,
+ modalWindow: false,
+ format: /[@#*()=\[\]{};:"\\|,.<>\/]/,
+ folderName: '',
+ showForm: false,
+ newItem: '',
+ collapse: [],
+ }
+ },
+
+
+
+
+ data: function () {
+ return {
+ title: "Navigation",
+ items: data.navigation,
+ homepage: false,
+ editormode: 'visual',
+ freeze: false,
+ modalWindow: false,
+ format: /[@#*()=\[\]{};:"\\|,.<>\/]/,
+ folderName: '',
+ showForm: false,
+ newItem: '',
+ collapse: [],
+ }
+ },
+ checkMove: function(evt){
+/* this.$refs.draggit[0].checkMove(evt); *
+ if(evt.dragged.classList.contains('folder') && evt.from.parentNode.id != evt.to.parentNode.id)
+ {
+ return false;
+ }
+ if(evt.dragged.firstChild.className == 'active' && !editor.draftDisabled)
+ {
+ publishController.errors.message = "Please save your changes before you move the file";
+ return false;
+ }
+ return true;
+ },
+ onStart: function(evt){
+ this.$refs.draggit[0].onStart(evt);
+ },
+ onEnd: function(evt){
+ this.$refs.draggit[0].onEnd(evt);
+ },
+ addFile : function(type)
+ {
+ publishController.errors.message = false;
+
+ if(this.format.test(this.newItem) || !this.newItem || this.newItem.length > 40)
+ {
+ publishController.errors.message = 'Special Characters are not allowed. Length between 1 and 40.';
+ return;
+ }
+
+ self = this;
+
+ self.freeze = true;
+ self.errors = {title: false, content: false, message: false};
+
+ myaxios.post('/api/v1/baseitem',{
+ 'item_name': this.newItem,
+ 'type': type,
+ 'url': document.getElementById("path").value,
+ 'csrf_name': document.getElementById("csrf_name").value,
+ 'csrf_value': document.getElementById("csrf_value").value,
+ })
+ .then(function (response) {
+
+ self.freeze = false;
+
+ if(response.data.url)
+ {
+ window.location.replace(response.data.url);
+ }
+ if(response.data.data)
+ {
+ self.items = response.data.data;
+ self.newItem = '';
+ self.showForm = false;
+ }
+ })
+ .catch(function (error)
+ {
+ publishController.errors.message = error.response.data.errors;
+ });
+ },
+ getNavi: function()
+ {
+ publishController.errors.message = false;
+
+ var self = this;
+
+ self.freeze = true;
+ self.errors = {title: false, content: false, message: false};
+
+ var activeItem = document.getElementById("path").value;
+
+ var url = this.root + '/api/v1/navigation?url=' + activeItem;
+ var method = 'GET';
+
+ myaxios.get('/api/v1/navigation',{
+ params: {
+ 'url': activeItem,
+ 'csrf_name': document.getElementById("csrf_name").value,
+ 'csrf_value': document.getElementById("csrf_value").value,
+ }
+ })
+ .then(function (response) {
+
+ self.freeze = false;
+ if(response.data.data)
+ {
+ self.items = response.data.data;
+ self.newItem = '';
+ self.homepage = response.data.homepage;
+ }
+ })
+ .catch(function (error)
+ {
+ if(error.response.data.errors)
+ {
+ publishController.errors.message = error.response.data.errors;
+ }
+ });
+ }
+ }
+})
+
+ checkMove : function(evt)
+ {
+ if(evt.dragged.classList.contains('folder') && evt.from.parentNode.id != evt.to.parentNode.id)
+ {
+ return false;
+ }
+ if(evt.dragged.firstChild.className == 'active' && !editor.draftDisabled)
+ {
+ publishController.errors.message = "Please save your changes before you move the file";
+ return false;
+ }
+ return true;
+ },
+ onStart : function(evt)
+ {
+ /* delete error messages if exist *
+ publishController.errors.message = false;
+ },
+ getUrl : function(root, url)
+ {
+ return root + '/tm/content/' + this.$root.$data.editormode + url;
+ },
+ checkActive : function(active,parent)
+ {
+ if(active && !parent)
+ {
+ return 'active';
+ }
+ return 'inactive';
+ },
+
+ checkActive : function(active,parent)
+ {
+ if(active && !parent)
+ {
+ return 'active';
+ }
+ return 'inactive';
+ },
+ addFile : function(type)
+ {
+ publishController.errors.message = false;
+
+ if(this.format.test(this.newItem) || !this.newItem || this.newItem.length > 40)
+ {
+ publishController.errors.message = 'Special Characters are not allowed. Length between 1 and 40.';
+ return;
+ }
+
+ self = this;
+
+ self.freeze = true;
+ self.errors = {title: false, content: false, message: false};
+
+ myaxios.post('/api/v1/baseitem',{
+ 'item_name': this.newItem,
+ 'type': type,
+ 'url': document.getElementById("path").value,
+ 'csrf_name': document.getElementById("csrf_name").value,
+ 'csrf_value': document.getElementById("csrf_value").value,
+ })
+ .then(function (response) {
+
+ self.freeze = false;
+
+ if(response.data.url)
+ {
+ window.location.replace(response.data.url);
+ }
+ if(response.data.data)
+ {
+ self.items = response.data.data;
+ self.newItem = '';
+ self.showForm = false;
+ }
+ })
+ .catch(function (error)
+ {
+ publishController.errors.message = error.response.data.errors;
+ });
+ },
+
+ addFile : function(type)
+ {
+ publishController.errors.message = false;
+
+ if(this.$root.$data.format.test(this.newItem) || !this.newItem || this.newItem.length > 60)
+ {
+ publishController.errors.message = 'Special Characters are not allowed. Length between 1 and 60.';
+ return;
+ }
+
+ var self = this;
+
+ self.$root.$data.freeze = true;
+ self.errors = {title: false, content: false, message: false};
+
+ myaxios.post('/api/v1/article',{
+ 'folder_id': this.$el.id,
+ 'item_name': this.newItem,
+ 'type': type,
+ 'url': document.getElementById("path").value,
+ 'csrf_name': document.getElementById("csrf_name").value,
+ 'csrf_value': document.getElementById("csrf_value").value,
+ })
+ .then(function (response) {
+
+ self.$root.$data.freeze = false;
+
+ if(response.data.url)
+ {
+ window.location.replace(response.data.url);
+ }
+ if(response.data.data)
+ {
+ // evt.item.classList.remove("load");
+ self.$root.$data.items = response.data.data;
+ self.newItem = '';
+ self.showForm = false;
+ }
+ })
+ .catch(function (error)
+ {
+ if(error.response.data.errors)
+ {
+ publishController.errors.message = error.response.data.errors;
+ }
+ });
+ },
+ }
+})
+
+navigation.mount('#contentNavigation');
+*/
\ No newline at end of file
diff --git a/system/typemill/author/js/vuedraggable.umd.min.js b/system/typemill/author/js/vuedraggable.umd.min.js
new file mode 100644
index 0000000..a422aa6
--- /dev/null
+++ b/system/typemill/author/js/vuedraggable.umd.min.js
@@ -0,0 +1,2 @@
+(function(t,e){"object"===typeof exports&&"object"===typeof module?module.exports=e(require("vue"),require("sortablejs")):"function"===typeof define&&define.amd?define([,"sortablejs"],e):"object"===typeof exports?exports["vuedraggable"]=e(require("vue"),require("sortablejs")):t["vuedraggable"]=e(t["Vue"],t["Sortable"])})("undefined"!==typeof self?self:this,(function(t,e){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"===typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s="fb15")}({"00ee":function(t,e,n){var r=n("b622"),o=r("toStringTag"),i={};i[o]="z",t.exports="[object z]"===String(i)},"0366":function(t,e,n){var r=n("1c0b");t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}}},"057f":function(t,e,n){var r=n("fc6a"),o=n("241c").f,i={}.toString,c="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],a=function(t){try{return o(t)}catch(e){return c.slice()}};t.exports.f=function(t){return c&&"[object Window]"==i.call(t)?a(t):o(r(t))}},"06cf":function(t,e,n){var r=n("83ab"),o=n("d1e7"),i=n("5c6c"),c=n("fc6a"),a=n("c04e"),u=n("5135"),f=n("0cfb"),s=Object.getOwnPropertyDescriptor;e.f=r?s:function(t,e){if(t=c(t),e=a(e,!0),f)try{return s(t,e)}catch(n){}if(u(t,e))return i(!o.f.call(t,e),t[e])}},"0cfb":function(t,e,n){var r=n("83ab"),o=n("d039"),i=n("cc12");t.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},"13d5":function(t,e,n){"use strict";var r=n("23e7"),o=n("d58f").left,i=n("a640"),c=n("ae40"),a=i("reduce"),u=c("reduce",{1:0});r({target:"Array",proto:!0,forced:!a||!u},{reduce:function(t){return o(this,t,arguments.length,arguments.length>1?arguments[1]:void 0)}})},"14c3":function(t,e,n){var r=n("c6b6"),o=n("9263");t.exports=function(t,e){var n=t.exec;if("function"===typeof n){var i=n.call(t,e);if("object"!==typeof i)throw TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==r(t))throw TypeError("RegExp#exec called on incompatible receiver");return o.call(t,e)}},"159b":function(t,e,n){var r=n("da84"),o=n("fdbc"),i=n("17c2"),c=n("9112");for(var a in o){var u=r[a],f=u&&u.prototype;if(f&&f.forEach!==i)try{c(f,"forEach",i)}catch(s){f.forEach=i}}},"17c2":function(t,e,n){"use strict";var r=n("b727").forEach,o=n("a640"),i=n("ae40"),c=o("forEach"),a=i("forEach");t.exports=c&&a?[].forEach:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}},"1be4":function(t,e,n){var r=n("d066");t.exports=r("document","documentElement")},"1c0b":function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},"1c7e":function(t,e,n){var r=n("b622"),o=r("iterator"),i=!1;try{var c=0,a={next:function(){return{done:!!c++}},return:function(){i=!0}};a[o]=function(){return this},Array.from(a,(function(){throw 2}))}catch(u){}t.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var r={};r[o]=function(){return{next:function(){return{done:n=!0}}}},t(r)}catch(u){}return n}},"1d80":function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},"1dde":function(t,e,n){var r=n("d039"),o=n("b622"),i=n("2d00"),c=o("species");t.exports=function(t){return i>=51||!r((function(){var e=[],n=e.constructor={};return n[c]=function(){return{foo:1}},1!==e[t](Boolean).foo}))}},"23cb":function(t,e,n){var r=n("a691"),o=Math.max,i=Math.min;t.exports=function(t,e){var n=r(t);return n<0?o(n+e,0):i(n,e)}},"23e7":function(t,e,n){var r=n("da84"),o=n("06cf").f,i=n("9112"),c=n("6eeb"),a=n("ce4e"),u=n("e893"),f=n("94ca");t.exports=function(t,e){var n,s,l,d,p,v,h=t.target,b=t.global,g=t.stat;if(s=b?r:g?r[h]||a(h,{}):(r[h]||{}).prototype,s)for(l in e){if(p=e[l],t.noTargetGet?(v=o(s,l),d=v&&v.value):d=s[l],n=f(b?l:h+(g?".":"#")+l,t.forced),!n&&void 0!==d){if(typeof p===typeof d)continue;u(p,d)}(t.sham||d&&d.sham)&&i(p,"sham",!0),c(s,l,p,t)}}},"241c":function(t,e,n){var r=n("ca84"),o=n("7839"),i=o.concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,i)}},"25f0":function(t,e,n){"use strict";var r=n("6eeb"),o=n("825a"),i=n("d039"),c=n("ad6d"),a="toString",u=RegExp.prototype,f=u[a],s=i((function(){return"/a/b"!=f.call({source:"a",flags:"b"})})),l=f.name!=a;(s||l)&&r(RegExp.prototype,a,(function(){var t=o(this),e=String(t.source),n=t.flags,r=String(void 0===n&&t instanceof RegExp&&!("flags"in u)?c.call(t):n);return"/"+e+"/"+r}),{unsafe:!0})},"2ca0":function(t,e,n){"use strict";var r=n("23e7"),o=n("06cf").f,i=n("50c4"),c=n("5a34"),a=n("1d80"),u=n("ab13"),f=n("c430"),s="".startsWith,l=Math.min,d=u("startsWith"),p=!f&&!d&&!!function(){var t=o(String.prototype,"startsWith");return t&&!t.writable}();r({target:"String",proto:!0,forced:!p&&!d},{startsWith:function(t){var e=String(a(this));c(t);var n=i(l(arguments.length>1?arguments[1]:void 0,e.length)),r=String(t);return s?s.call(e,r,n):e.slice(n,n+r.length)===r}})},"2d00":function(t,e,n){var r,o,i=n("da84"),c=n("342f"),a=i.process,u=a&&a.versions,f=u&&u.v8;f?(r=f.split("."),o=r[0]+r[1]):c&&(r=c.match(/Edge\/(\d+)/),(!r||r[1]>=74)&&(r=c.match(/Chrome\/(\d+)/),r&&(o=r[1]))),t.exports=o&&+o},"342f":function(t,e,n){var r=n("d066");t.exports=r("navigator","userAgent")||""},"35a1":function(t,e,n){var r=n("f5df"),o=n("3f8c"),i=n("b622"),c=i("iterator");t.exports=function(t){if(void 0!=t)return t[c]||t["@@iterator"]||o[r(t)]}},"37e8":function(t,e,n){var r=n("83ab"),o=n("9bf2"),i=n("825a"),c=n("df75");t.exports=r?Object.defineProperties:function(t,e){i(t);var n,r=c(e),a=r.length,u=0;while(a>u)o.f(t,n=r[u++],e[n]);return t}},"3bbe":function(t,e,n){var r=n("861d");t.exports=function(t){if(!r(t)&&null!==t)throw TypeError("Can't set "+String(t)+" as a prototype");return t}},"3ca3":function(t,e,n){"use strict";var r=n("6547").charAt,o=n("69f3"),i=n("7dd0"),c="String Iterator",a=o.set,u=o.getterFor(c);i(String,"String",(function(t){a(this,{type:c,string:String(t),index:0})}),(function(){var t,e=u(this),n=e.string,o=e.index;return o>=n.length?{value:void 0,done:!0}:(t=r(n,o),e.index+=t.length,{value:t,done:!1})}))},"3f8c":function(t,e){t.exports={}},4160:function(t,e,n){"use strict";var r=n("23e7"),o=n("17c2");r({target:"Array",proto:!0,forced:[].forEach!=o},{forEach:o})},"428f":function(t,e,n){var r=n("da84");t.exports=r},"44ad":function(t,e,n){var r=n("d039"),o=n("c6b6"),i="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==o(t)?i.call(t,""):Object(t)}:Object},"44d2":function(t,e,n){var r=n("b622"),o=n("7c73"),i=n("9bf2"),c=r("unscopables"),a=Array.prototype;void 0==a[c]&&i.f(a,c,{configurable:!0,value:o(null)}),t.exports=function(t){a[c][t]=!0}},"44e7":function(t,e,n){var r=n("861d"),o=n("c6b6"),i=n("b622"),c=i("match");t.exports=function(t){var e;return r(t)&&(void 0!==(e=t[c])?!!e:"RegExp"==o(t))}},4930:function(t,e,n){var r=n("d039");t.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},"4d64":function(t,e,n){var r=n("fc6a"),o=n("50c4"),i=n("23cb"),c=function(t){return function(e,n,c){var a,u=r(e),f=o(u.length),s=i(c,f);if(t&&n!=n){while(f>s)if(a=u[s++],a!=a)return!0}else for(;f>s;s++)if((t||s in u)&&u[s]===n)return t||s||0;return!t&&-1}};t.exports={includes:c(!0),indexOf:c(!1)}},"4de4":function(t,e,n){"use strict";var r=n("23e7"),o=n("b727").filter,i=n("1dde"),c=n("ae40"),a=i("filter"),u=c("filter");r({target:"Array",proto:!0,forced:!a||!u},{filter:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},"4df4":function(t,e,n){"use strict";var r=n("0366"),o=n("7b0b"),i=n("9bdd"),c=n("e95a"),a=n("50c4"),u=n("8418"),f=n("35a1");t.exports=function(t){var e,n,s,l,d,p,v=o(t),h="function"==typeof this?this:Array,b=arguments.length,g=b>1?arguments[1]:void 0,y=void 0!==g,m=f(v),x=0;if(y&&(g=r(g,b>2?arguments[2]:void 0,2)),void 0==m||h==Array&&c(m))for(e=a(v.length),n=new h(e);e>x;x++)p=y?g(v[x],x):v[x],u(n,x,p);else for(l=m.call(v),d=l.next,n=new h;!(s=d.call(l)).done;x++)p=y?i(l,g,[s.value,x],!0):s.value,u(n,x,p);return n.length=x,n}},"4fad":function(t,e,n){var r=n("23e7"),o=n("6f53").entries;r({target:"Object",stat:!0},{entries:function(t){return o(t)}})},"50c4":function(t,e,n){var r=n("a691"),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},5135:function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},5319:function(t,e,n){"use strict";var r=n("d784"),o=n("825a"),i=n("7b0b"),c=n("50c4"),a=n("a691"),u=n("1d80"),f=n("8aa5"),s=n("14c3"),l=Math.max,d=Math.min,p=Math.floor,v=/\$([$&'`]|\d\d?|<[^>]*>)/g,h=/\$([$&'`]|\d\d?)/g,b=function(t){return void 0===t?t:String(t)};r("replace",2,(function(t,e,n,r){var g=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,y=r.REPLACE_KEEPS_$0,m=g?"$":"$0";return[function(n,r){var o=u(this),i=void 0==n?void 0:n[t];return void 0!==i?i.call(n,o,r):e.call(String(o),n,r)},function(t,r){if(!g&&y||"string"===typeof r&&-1===r.indexOf(m)){var i=n(e,t,this,r);if(i.done)return i.value}var u=o(t),p=String(this),v="function"===typeof r;v||(r=String(r));var h=u.global;if(h){var S=u.unicode;u.lastIndex=0}var O=[];while(1){var w=s(u,p);if(null===w)break;if(O.push(w),!h)break;var E=String(w[0]);""===E&&(u.lastIndex=f(p,c(u.lastIndex),S))}for(var j="",A=0,P=0;P=A&&(j+=p.slice(A,T)+k,A=T+I.length)}return j+p.slice(A)}];function x(t,n,r,o,c,a){var u=r+t.length,f=o.length,s=h;return void 0!==c&&(c=i(c),s=v),e.call(a,s,(function(e,i){var a;switch(i.charAt(0)){case"$":return"$";case"&":return t;case"`":return n.slice(0,r);case"'":return n.slice(u);case"<":a=c[i.slice(1,-1)];break;default:var s=+i;if(0===s)return e;if(s>f){var l=p(s/10);return 0===l?e:l<=f?void 0===o[l-1]?i.charAt(1):o[l-1]+i.charAt(1):e}a=o[s-1]}return void 0===a?"":a}))}}))},5692:function(t,e,n){var r=n("c430"),o=n("c6cd");(t.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.6.5",mode:r?"pure":"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})},"56ef":function(t,e,n){var r=n("d066"),o=n("241c"),i=n("7418"),c=n("825a");t.exports=r("Reflect","ownKeys")||function(t){var e=o.f(c(t)),n=i.f;return n?e.concat(n(t)):e}},"5a34":function(t,e,n){var r=n("44e7");t.exports=function(t){if(r(t))throw TypeError("The method doesn't accept regular expressions");return t}},"5c6c":function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},"5db7":function(t,e,n){"use strict";var r=n("23e7"),o=n("a2bf"),i=n("7b0b"),c=n("50c4"),a=n("1c0b"),u=n("65f0");r({target:"Array",proto:!0},{flatMap:function(t){var e,n=i(this),r=c(n.length);return a(t),e=u(n,0),e.length=o(e,n,n,r,0,1,t,arguments.length>1?arguments[1]:void 0),e}})},6547:function(t,e,n){var r=n("a691"),o=n("1d80"),i=function(t){return function(e,n){var i,c,a=String(o(e)),u=r(n),f=a.length;return u<0||u>=f?t?"":void 0:(i=a.charCodeAt(u),i<55296||i>56319||u+1===f||(c=a.charCodeAt(u+1))<56320||c>57343?t?a.charAt(u):i:t?a.slice(u,u+2):c-56320+(i-55296<<10)+65536)}};t.exports={codeAt:i(!1),charAt:i(!0)}},"65f0":function(t,e,n){var r=n("861d"),o=n("e8b5"),i=n("b622"),c=i("species");t.exports=function(t,e){var n;return o(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!o(n.prototype)?r(n)&&(n=n[c],null===n&&(n=void 0)):n=void 0),new(void 0===n?Array:n)(0===e?0:e)}},"69f3":function(t,e,n){var r,o,i,c=n("7f9a"),a=n("da84"),u=n("861d"),f=n("9112"),s=n("5135"),l=n("f772"),d=n("d012"),p=a.WeakMap,v=function(t){return i(t)?o(t):r(t,{})},h=function(t){return function(e){var n;if(!u(e)||(n=o(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}};if(c){var b=new p,g=b.get,y=b.has,m=b.set;r=function(t,e){return m.call(b,t,e),e},o=function(t){return g.call(b,t)||{}},i=function(t){return y.call(b,t)}}else{var x=l("state");d[x]=!0,r=function(t,e){return f(t,x,e),e},o=function(t){return s(t,x)?t[x]:{}},i=function(t){return s(t,x)}}t.exports={set:r,get:o,has:i,enforce:v,getterFor:h}},"6eeb":function(t,e,n){var r=n("da84"),o=n("9112"),i=n("5135"),c=n("ce4e"),a=n("8925"),u=n("69f3"),f=u.get,s=u.enforce,l=String(String).split("String");(t.exports=function(t,e,n,a){var u=!!a&&!!a.unsafe,f=!!a&&!!a.enumerable,d=!!a&&!!a.noTargetGet;"function"==typeof n&&("string"!=typeof e||i(n,"name")||o(n,"name",e),s(n).source=l.join("string"==typeof e?e:"")),t!==r?(u?!d&&t[e]&&(f=!0):delete t[e],f?t[e]=n:o(t,e,n)):f?t[e]=n:c(e,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&f(this).source||a(this)}))},"6f53":function(t,e,n){var r=n("83ab"),o=n("df75"),i=n("fc6a"),c=n("d1e7").f,a=function(t){return function(e){var n,a=i(e),u=o(a),f=u.length,s=0,l=[];while(f>s)n=u[s++],r&&!c.call(a,n)||l.push(t?[n,a[n]]:a[n]);return l}};t.exports={entries:a(!0),values:a(!1)}},"73d9":function(t,e,n){var r=n("44d2");r("flatMap")},7418:function(t,e){e.f=Object.getOwnPropertySymbols},"746f":function(t,e,n){var r=n("428f"),o=n("5135"),i=n("e538"),c=n("9bf2").f;t.exports=function(t){var e=r.Symbol||(r.Symbol={});o(e,t)||c(e,t,{value:i.f(t)})}},7839:function(t,e){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},"7b0b":function(t,e,n){var r=n("1d80");t.exports=function(t){return Object(r(t))}},"7c73":function(t,e,n){var r,o=n("825a"),i=n("37e8"),c=n("7839"),a=n("d012"),u=n("1be4"),f=n("cc12"),s=n("f772"),l=">",d="<",p="prototype",v="script",h=s("IE_PROTO"),b=function(){},g=function(t){return d+v+l+t+d+"/"+v+l},y=function(t){t.write(g("")),t.close();var e=t.parentWindow.Object;return t=null,e},m=function(){var t,e=f("iframe"),n="java"+v+":";return e.style.display="none",u.appendChild(e),e.src=String(n),t=e.contentWindow.document,t.open(),t.write(g("document.F=Object")),t.close(),t.F},x=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(e){}x=r?y(r):m();var t=c.length;while(t--)delete x[p][c[t]];return x()};a[h]=!0,t.exports=Object.create||function(t,e){var n;return null!==t?(b[p]=o(t),n=new b,b[p]=null,n[h]=t):n=x(),void 0===e?n:i(n,e)}},"7dd0":function(t,e,n){"use strict";var r=n("23e7"),o=n("9ed3"),i=n("e163"),c=n("d2bb"),a=n("d44e"),u=n("9112"),f=n("6eeb"),s=n("b622"),l=n("c430"),d=n("3f8c"),p=n("ae93"),v=p.IteratorPrototype,h=p.BUGGY_SAFARI_ITERATORS,b=s("iterator"),g="keys",y="values",m="entries",x=function(){return this};t.exports=function(t,e,n,s,p,S,O){o(n,e,s);var w,E,j,A=function(t){if(t===p&&C)return C;if(!h&&t in T)return T[t];switch(t){case g:return function(){return new n(this,t)};case y:return function(){return new n(this,t)};case m:return function(){return new n(this,t)}}return function(){return new n(this)}},P=e+" Iterator",I=!1,T=t.prototype,_=T[b]||T["@@iterator"]||p&&T[p],C=!h&&_||A(p),L="Array"==e&&T.entries||_;if(L&&(w=i(L.call(new t)),v!==Object.prototype&&w.next&&(l||i(w)===v||(c?c(w,v):"function"!=typeof w[b]&&u(w,b,x)),a(w,P,!0,!0),l&&(d[P]=x))),p==y&&_&&_.name!==y&&(I=!0,C=function(){return _.call(this)}),l&&!O||T[b]===C||u(T,b,C),d[e]=C,p)if(E={values:A(y),keys:S?C:A(g),entries:A(m)},O)for(j in E)(h||I||!(j in T))&&f(T,j,E[j]);else r({target:e,proto:!0,forced:h||I},E);return E}},"7f9a":function(t,e,n){var r=n("da84"),o=n("8925"),i=r.WeakMap;t.exports="function"===typeof i&&/native code/.test(o(i))},"825a":function(t,e,n){var r=n("861d");t.exports=function(t){if(!r(t))throw TypeError(String(t)+" is not an object");return t}},"83ab":function(t,e,n){var r=n("d039");t.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},8418:function(t,e,n){"use strict";var r=n("c04e"),o=n("9bf2"),i=n("5c6c");t.exports=function(t,e,n){var c=r(e);c in t?o.f(t,c,i(0,n)):t[c]=n}},"861d":function(t,e){t.exports=function(t){return"object"===typeof t?null!==t:"function"===typeof t}},8875:function(t,e,n){var r,o,i;(function(n,c){o=[],r=c,i="function"===typeof r?r.apply(e,o):r,void 0===i||(t.exports=i)})("undefined"!==typeof self&&self,(function(){function t(){var e=Object.getOwnPropertyDescriptor(document,"currentScript");if(!e&&"currentScript"in document&&document.currentScript)return document.currentScript;if(e&&e.get!==t&&document.currentScript)return document.currentScript;try{throw new Error}catch(p){var n,r,o,i=/.*at [^(]*\((.*):(.+):(.+)\)$/gi,c=/@([^@]*):(\d+):(\d+)\s*$/gi,a=i.exec(p.stack)||c.exec(p.stack),u=a&&a[1]||!1,f=a&&a[2]||!1,s=document.location.href.replace(document.location.hash,""),l=document.getElementsByTagName("script");u===s&&(n=document.documentElement.outerHTML,r=new RegExp("(?:[^\\n]+?\\n){0,"+(f-2)+"}[^<]*
+
+
+
{% block javascript %}{% endblock %}
diff --git a/system/typemill/author/partials/symbols.twig b/system/typemill/author/partials/symbols.twig
index 054d80c..e906d86 100644
--- a/system/typemill/author/partials/symbols.twig
+++ b/system/typemill/author/partials/symbols.twig
@@ -177,6 +177,12 @@
+
+
+
+
+
+
{{ assets.renderSvg() }}
diff --git a/system/typemill/routes/api.php b/system/typemill/routes/api.php
index 9ca52d7..ede4891 100644
--- a/system/typemill/routes/api.php
+++ b/system/typemill/routes/api.php
@@ -12,6 +12,7 @@ use Typemill\Controllers\ControllerApiSystemExtensions;
use Typemill\Controllers\ControllerApiSystemLicense;
use Typemill\Controllers\ControllerApiSystemUsers;
use Typemill\Controllers\ControllerApiImage;
+use Typemill\Controllers\ControllerApiAuthorArticle;
$app->group('/api/v1', function (RouteCollectorProxy $group) use ($acl) {
@@ -40,6 +41,10 @@ $app->group('/api/v1', function (RouteCollectorProxy $group) use ($acl) {
$group->put('/image', ControllerApiMedia::class . ':publishImage')->setName('api.image.publish');
$group->delete('/image', ControllerApiMedia::class . ':deleteImage')->setName('api.image.delete');
+ # ARTICLE
+ $group->post('/article/sort', ControllerApiAuthorArticle::class . ':sortArticle')->setName('api.article.sort')->add(new ApiAuthorization($acl, 'content', 'view')); # author
+ $group->post('/article', ControllerApiAuthorArticle::class . ':createArticle')->setName('api.article.create')->add(new ApiAuthorization($acl, 'content', 'view')); # author
+
})->add(new ApiAuthentication());
diff --git a/system/typemill/settings/permissions.yaml b/system/typemill/settings/permissions.yaml
index a897056..577a02c 100644
--- a/system/typemill/settings/permissions.yaml
+++ b/system/typemill/settings/permissions.yaml
@@ -6,14 +6,18 @@ member:
- 'view'
- 'update'
- 'delete'
-author:
- name: author
+contributor:
+ name: contributor
inherits: member
permissions:
mycontent:
- 'view'
- 'create'
- 'update'
+author:
+ name: author
+ inherits: contributor
+ permissions:
content:
- 'view'
editor:
diff --git a/tailwind.config.js b/tailwind.config.js
index 3ea2f3a..ee2910e 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -8,7 +8,8 @@ module.exports = {
},
opacity: {
'0': '0',
- }
+ },
+ visibility: ["group-hover"],
},
},
plugins: [],