├── Assets ├── images │ └── brand-logo.png ├── js │ ├── moon.js │ └── clipboard.min.js └── css │ ├── prism.css │ └── moon.css ├── _config.yml ├── .github └── FUNDING.yml ├── Makefile ├── config.php ├── LICENSE ├── Template ├── layout │ └── header │ │ ├── title.php │ │ └── customizerTitle.php ├── header.php └── layout.php ├── Plugin.php └── README.md /Assets/images/brand-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kenlog/Moon/HEAD/Assets/images/brand-logo.png -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman 2 | title: Kanboard plugin theme 3 | plugins: 4 | - jemoji 5 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | liberapay: kenlog 4 | custom: ['https://paypal.me/kenlog'] 5 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | plugin = Moon 2 | 3 | all: 4 | @ echo "Build archive for plugin ${plugin}" 5 | @ git archive HEAD --prefix=${plugin}/ --format=zip -o ${plugin}.zip -------------------------------------------------------------------------------- /Assets/js/moon.js: -------------------------------------------------------------------------------- 1 | $(window).scroll(function() { 2 | var height = $(window).scrollTop(); 3 | if (height > 200) { 4 | $('#backToTop').fadeIn(); 5 | } else { 6 | $('#backToTop').fadeOut(); 7 | } 8 | }); 9 | 10 | $(document).ready(function() { 11 | $("#backToTop").click(function(event) { 12 | event.preventDefault(); 13 | $("html, body").animate({ scrollTop: 0 }, "slow"); 14 | return false; 15 | }); 16 | 17 | }); -------------------------------------------------------------------------------- /config.php: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 |

11 | 12 |

13 | 14 | 15 | 16 | url->link($this->text->e($project['name']), 'BoardViewController', 'show', array('project_id' => $project['id'])) ?> 17 | 18 | text->e($title) ?> 19 | 20 | 21 | 22 | app->tooltipHTML($description) ?> 23 | 24 |

25 | -------------------------------------------------------------------------------- /Template/layout/header/customizerTitle.php: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 |

9 | 10 |

11 | 12 | 13 | 14 | url->link($this->text->e($project['name']), 'BoardViewController', 'show', array('project_id' => $project['id'])) ?> 15 | 16 | text->e($title) ?> 17 | 18 | 19 | 20 | app->tooltipHTML($description) ?> 21 | 22 |

-------------------------------------------------------------------------------- /Template/header.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | render('Moon:layout/header/customizerTitle', array( 5 | 'project' => isset($project) ? $project : null, 6 | 'task' => isset($task) ? $task : null, 7 | 'description' => isset($description) ? $description : null, 8 | 'title' => $title, 9 | )) ?> 10 | 11 | render('header/title', array( 12 | 'project' => isset($project) ? $project : null, 13 | 'task' => isset($task) ? $task : null, 14 | 'description' => isset($description) ? $description : null, 15 | 'title' => $title, 16 | )) ?> 17 | 18 | render('header/user_notifications'), 20 | $this->render('header/creation_dropdown'), 21 | $this->render('header/user_dropdown') 22 | )) ?> 23 | 24 | 25 |
26 | 27 |
28 | 29 |
30 | 31 |
32 |
33 | 34 | render('header/board_selector', array('board_selector' => $board_selector)) ?> 35 | 36 |
37 | 40 |
41 | -------------------------------------------------------------------------------- /Plugin.php: -------------------------------------------------------------------------------- 1 | template->setTemplateOverride('header/title', 'Moon:layout/header/customizerTitle'); 26 | $this->template->setTemplateOverride('header', 'Moon:header'); 27 | $this->template->setTemplateOverride('layout', 'Moon:layout'); 28 | } elseif (isset($themeMoonConfig['logo'])) { 29 | $this->template->setTemplateOverride('header/title', 'Moon:layout/header/title'); 30 | $this->template->setTemplateOverride('header', 'Moon:header'); 31 | $this->template->setTemplateOverride('layout', 'Moon:layout'); 32 | } 33 | 34 | $this->hook->on("template:layout:css", array("template" => $pluginFolder . "/Moon/Assets/css/moon.css")); 35 | 36 | $this->hook->on("template:layout:css", array("template" => $pluginFolder . "/Moon/Assets/css/prism.css")); 37 | 38 | $this->hook->on('template:layout:js', array('template' => $pluginFolder . '/Moon/Assets/js/clipboard.min.js')); 39 | 40 | $this->hook->on('template:layout:js', array('template' => $pluginFolder . '/Moon/Assets/js/prism.js')); 41 | 42 | $this->hook->on('template:layout:js', array('template' => $pluginFolder . '/Moon/Assets/js/moon.js')); 43 | } 44 | 45 | public function getPluginName() 46 | { 47 | return 'Moon'; 48 | } 49 | 50 | public function getPluginDescription() 51 | { 52 | return t('This theme allows you to add special features like replacing the logo and adds syntax highlighting for Markdown code.'); 53 | } 54 | 55 | public function getPluginAuthor() 56 | { 57 | return 'Valentino Pesce'; 58 | } 59 | 60 | public function getPluginVersion() 61 | { 62 | return '1.4.7'; 63 | } 64 | 65 | public function getCompatibleVersion() 66 | { 67 | return '>=1.0.48'; 68 | } 69 | 70 | public function getPluginHomepage() 71 | { 72 | return 'https://github.com/kenlog/Moon'; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Checkout our latest project 2 | 3 | - [Global Search Plugin for Kanboard](https://github.com/kenlog/global-search-kanboard.git) 4 | ----------- 5 | 6 | [![Latest release](https://img.shields.io/github/release/kenlog/Moon.svg)](https://github.com/kenlog/Moon/releases) 7 | [![GitHub license](https://img.shields.io/github/license/Naereen/StrapDown.js.svg)](https://github.com/kenlog/Moon/blob/master/LICENSE) 8 | [![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://github.com/kenlog/Moon/graphs/contributors) 9 | [![Open Source Love](https://badges.frapsoft.com/os/v1/open-source.svg?v=103)]() 10 | [![Downloads](https://img.shields.io/github/downloads/kenlog/Moon/total.svg)](https://github.com/kenlog/Moon/releases) 11 | 12 | 13 | Donate with PayPal button 14 | 15 | # Moon plugin (modern theme for kanboard) 16 | 17 | This theme allows you to add special features like replacing the logo and adds syntax highlighting for Markdown code. 18 | 19 | # Screenshot 20 | ![dashboard](https://user-images.githubusercontent.com/11728231/47354997-877d4980-d6c0-11e8-9cd5-205d28e04b42.png) 21 | ![board](https://user-images.githubusercontent.com/11728231/47355000-89dfa380-d6c0-11e8-80df-41387c603ceb.png) 22 | ![task1](https://user-images.githubusercontent.com/11728231/47355004-8ba96700-d6c0-11e8-8f20-9a4f1e3c3038.png) 23 | ![task2](https://user-images.githubusercontent.com/11728231/47355009-8cda9400-d6c0-11e8-8b4b-bf1e222c8c89.png) 24 | ![task3](https://user-images.githubusercontent.com/11728231/47355014-8ea45780-d6c0-11e8-8293-061ba548783b.png) 25 | 26 | Author 27 | ------------ 28 | - Valentino Pesce 29 | - License MIT 30 | 31 | Requirements 32 | ------------ 33 | Kanboard >= v1.0.48 34 | Kanboard installed at a web server. 35 | You can find the download at [kanboard.org](https://kanboard.org/) 36 | 37 | Installation 38 | ------------ 39 | You have the choice between 3 methods: 40 | 41 | 1. Install the plugin from the Kanboard plugin manager in one click 42 | 2. Download the zip file and decompress everything under the directory `plugins/Moon` 43 | 3. Clone this repository into the folder `plugins/Moon` 44 | 45 | Note: Plugin folder is case-sensitive. 46 | **Important: remove all unused themes** 47 | 48 | Add options for the theme 49 | ------------ 50 | - Replace the KB logo with your own logo 51 | For more information have a look in the config.php 52 | ### Supports the [Customizer](https://github.com/creecros/Customizer) plugin 53 | 54 | Syntax highlighting for Markdown code 55 | ------------ 56 | 151 languages currently supported by Prism, with their corresponding alias, to use in place of xxxx 57 | 58 | ```diff 59 | -```xxxx 60 | class BaseClass { 61 | function __construct() { 62 | print "In BaseClass constructor\n"; 63 | } 64 | } 65 | -``` 66 | +```php 67 | class BaseClass { 68 | function __construct() { 69 | print "In BaseClass constructor\n"; 70 | } 71 | } 72 | +``` 73 | ``` 74 | 75 | ### :star: If you like it, do not forget to give a star on GitHub! 76 | 77 | :construction_worker: Any contribution will be highly appreciated 78 | ------------ 79 | Clone the repository: 80 | ```console 81 | git clone https://github.com/kenlog/Moon.git 82 | ``` 83 | :bug: Reporting Issues 84 | ------------ 85 | Please [create an issue](https://github.com/kenlog/Moon/issues) for any bugs you've found. 86 | -------------------------------------------------------------------------------- /Template/layout.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | asset->colorCss() ?> 16 | asset->css('assets/css/vendor.min.css') ?> 17 | 18 | asset->css('assets/css/'.$this->user->getTheme().'.min.css') ?> 19 | 20 | asset->css('assets/css/light.min.css') ?> 21 | 22 | asset->css('assets/css/print.min.css', true, 'print') ?> 23 | asset->customCss() ?> 24 | 25 | 26 | asset->js('assets/js/vendor.min.js') ?> 27 | asset->js('assets/js/app.min.js') ?> 28 | 29 | 30 | hook->asset('css', 'template:layout:css') ?> 31 | hook->asset('js', 'template:layout:js') ?> 32 | task->customizerFileModel->getByType(2)) : ?> 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | <?php if (isset($page_title)): ?> 49 | <?= $this->text->e($page_title) ?> 50 | <?php elseif (isset($title)): ?> 51 | <?= $this->text->e($title) ?> 52 | <?php else: ?> 53 | Kanboard 54 | <?php endif ?> 55 | 56 | 57 | hook->render('template:layout:head') ?> 58 | 59 | 67 | 68 | 69 | app->flashMessage() ?> 70 | 71 | 72 | hook->render('template:layout:top') ?> 73 | render('header', array( 74 | 'title' => $title, 75 | 'description' => isset($description) ? $description : '', 76 | 'board_selector' => isset($board_selector) ? $board_selector : array(), 77 | 'project' => isset($project) ? $project : array(), 78 | )) ?> 79 |
80 | app->flashMessage() ?> 81 | 82 |
83 | hook->render('template:layout:bottom') ?> 84 |
85 | 86 | 87 | 88 |
89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /Assets/css/prism.css: -------------------------------------------------------------------------------- 1 | /* PrismJS 1.20.0 2 | https://prismjs.com/download.html#themes=prism-okaidia&languages=markup+css+clike+javascript+abap+abnf+actionscript+ada+al+antlr4+apacheconf+apl+applescript+aql+arduino+arff+asciidoc+asm6502+aspnet+autohotkey+autoit+bash+basic+batch+bbcode+bison+bnf+brainfuck+brightscript+bro+c+concurnas+csharp+cpp+cil+coffeescript+cmake+clojure+crystal+csp+css-extras+d+dart+dax+diff+django+dns-zone-file+docker+ebnf+eiffel+ejs+elixir+elm+etlua+erb+erlang+excel-formula+fsharp+factor+firestore-security-rules+flow+fortran+ftl+gcode+gdscript+gedcom+gherkin+git+glsl+gml+go+graphql+groovy+haml+handlebars+haskell+haxe+hcl+hlsl+http+hpkp+hsts+ichigojam+icon+iecst+inform7+ini+io+j+java+javadoc+javadoclike+javastacktrace+jolie+jq+jsdoc+js-extras+js-templates+json+jsonp+json5+julia+keyman+kotlin+latex+latte+less+lilypond+liquid+lisp+livescript+llvm+lolcode+lua+makefile+markdown+markup-templating+matlab+mel+mizar+monkey+moonscript+n1ql+n4js+nand2tetris-hdl+nasm+neon+nginx+nim+nix+nsis+objectivec+ocaml+opencl+oz+parigp+parser+pascal+pascaligo+pcaxis+peoplecode+perl+php+phpdoc+php-extras+plsql+powerquery+powershell+processing+prolog+properties+protobuf+pug+puppet+pure+purebasic+python+q+qml+qore+r+racket+jsx+tsx+renpy+reason+regex+rest+rip+roboconf+robotframework+ruby+rust+sas+sass+scss+scala+scheme+shell-session+smalltalk+smarty+solidity+solution-file+soy+sparql+splunk-spl+sqf+sql+stylus+swift+tap+tcl+textile+toml+tt2+turtle+twig+typescript+t4-cs+t4-vb+t4-templating+unrealscript+vala+vbnet+velocity+verilog+vhdl+vim+visual-basic+warpscript+wasm+wiki+xeora+xml-doc+xojo+xquery+yaml+zig&plugins=show-language+toolbar+copy-to-clipboard */ 3 | /** 4 | * okaidia theme for JavaScript, CSS and HTML 5 | * Loosely based on Monokai textmate theme by http://www.monokai.nl/ 6 | * @author ocodia 7 | */ 8 | 9 | code[class*="language-"], 10 | pre[class*="language-"] { 11 | color: #f8f8f2; 12 | background: none; 13 | text-shadow: 0 1px rgba(0, 0, 0, 0.3); 14 | font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; 15 | font-size: 1em; 16 | text-align: left; 17 | white-space: pre; 18 | word-spacing: normal; 19 | word-break: normal; 20 | word-wrap: normal; 21 | line-height: 1.5; 22 | 23 | -moz-tab-size: 4; 24 | -o-tab-size: 4; 25 | tab-size: 4; 26 | 27 | -webkit-hyphens: none; 28 | -moz-hyphens: none; 29 | -ms-hyphens: none; 30 | hyphens: none; 31 | } 32 | 33 | /* Code blocks */ 34 | pre[class*="language-"] { 35 | padding: 1em; 36 | margin: .5em 0; 37 | overflow: auto; 38 | border-radius: 0.3em; 39 | } 40 | 41 | :not(pre) > code[class*="language-"], 42 | pre[class*="language-"] { 43 | background: #272822; 44 | } 45 | 46 | /* Inline code */ 47 | :not(pre) > code[class*="language-"] { 48 | padding: .1em; 49 | border-radius: .3em; 50 | white-space: normal; 51 | } 52 | 53 | .token.comment, 54 | .token.prolog, 55 | .token.doctype, 56 | .token.cdata { 57 | color: slategray; 58 | } 59 | 60 | .token.punctuation { 61 | color: #f8f8f2; 62 | } 63 | 64 | .token.namespace { 65 | opacity: .7; 66 | } 67 | 68 | .token.property, 69 | .token.tag, 70 | .token.constant, 71 | .token.symbol, 72 | .token.deleted { 73 | color: #f92672; 74 | } 75 | 76 | .token.boolean, 77 | .token.number { 78 | color: #ae81ff; 79 | } 80 | 81 | .token.selector, 82 | .token.attr-name, 83 | .token.string, 84 | .token.char, 85 | .token.builtin, 86 | .token.inserted { 87 | color: #a6e22e; 88 | } 89 | 90 | .token.operator, 91 | .token.entity, 92 | .token.url, 93 | .language-css .token.string, 94 | .style .token.string, 95 | .token.variable { 96 | color: #f8f8f2; 97 | } 98 | 99 | .token.atrule, 100 | .token.attr-value, 101 | .token.function, 102 | .token.class-name { 103 | color: #e6db74; 104 | } 105 | 106 | .token.keyword { 107 | color: #66d9ef; 108 | } 109 | 110 | .token.regex, 111 | .token.important { 112 | color: #fd971f; 113 | } 114 | 115 | .token.important, 116 | .token.bold { 117 | font-weight: bold; 118 | } 119 | .token.italic { 120 | font-style: italic; 121 | } 122 | 123 | .token.entity { 124 | cursor: help; 125 | } 126 | 127 | div.code-toolbar { 128 | position: relative; 129 | } 130 | 131 | div.code-toolbar > .toolbar { 132 | position: absolute; 133 | top: .3em; 134 | right: .2em; 135 | transition: opacity 0.3s ease-in-out; 136 | opacity: 0; 137 | } 138 | 139 | div.code-toolbar:hover > .toolbar { 140 | opacity: 1; 141 | } 142 | 143 | /* Separate line b/c rules are thrown out if selector is invalid. 144 | IE11 and old Edge versions don't support :focus-within. */ 145 | div.code-toolbar:focus-within > .toolbar { 146 | opacity: 1; 147 | } 148 | 149 | div.code-toolbar > .toolbar .toolbar-item { 150 | display: inline-block; 151 | } 152 | 153 | div.code-toolbar > .toolbar a { 154 | cursor: pointer; 155 | } 156 | 157 | div.code-toolbar > .toolbar button { 158 | background: none; 159 | border: 0; 160 | color: inherit; 161 | font: inherit; 162 | line-height: normal; 163 | overflow: visible; 164 | padding: 0; 165 | -webkit-user-select: none; /* for button */ 166 | -moz-user-select: none; 167 | -ms-user-select: none; 168 | } 169 | 170 | div.code-toolbar > .toolbar a, 171 | div.code-toolbar > .toolbar button, 172 | div.code-toolbar > .toolbar span { 173 | color: #bbb; 174 | font-size: .8em; 175 | padding: 0 .5em; 176 | background: #f5f2f0; 177 | background: rgba(224, 224, 224, 0.2); 178 | box-shadow: 0 2px 0 0 rgba(0,0,0,0.2); 179 | border-radius: .5em; 180 | } 181 | 182 | div.code-toolbar > .toolbar a:hover, 183 | div.code-toolbar > .toolbar a:focus, 184 | div.code-toolbar > .toolbar button:hover, 185 | div.code-toolbar > .toolbar button:focus, 186 | div.code-toolbar > .toolbar span:hover, 187 | div.code-toolbar > .toolbar span:focus { 188 | color: inherit; 189 | text-decoration: none; 190 | } 191 | 192 | -------------------------------------------------------------------------------- /Assets/js/clipboard.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * clipboard.js v2.0.6 3 | * https://clipboardjs.com/ 4 | * 5 | * Licensed MIT © Zeno Rocha 6 | */ 7 | !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return o={},r.m=n=[function(t,e){t.exports=function(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly");n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var o=window.getSelection(),r=document.createRange();r.selectNodeContents(t),o.removeAllRanges(),o.addRange(r),e=o.toString()}return e}},function(t,e){function n(){}n.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){var o=this;function r(){o.off(t,r),e.apply(n,arguments)}return r._=e,this.on(t,r,n)},emit:function(t){for(var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;o