├── .bowerrc ├── .eslintrc.json ├── .gitignore ├── License.md ├── README.md ├── app ├── abstractors │ ├── doc.js │ └── text.js ├── app.js └── theme_manager │ ├── endpoints │ ├── get_all_themes.js │ └── get_theme_by_name.js │ └── theme_manager.js ├── assets ├── css │ ├── bootstrap-selection.scss │ ├── components │ │ ├── bubble │ │ │ └── bubble.scss │ │ ├── button │ │ │ └── btn.scss │ │ ├── card │ │ │ ├── card-body.scss │ │ │ └── card.scss │ │ ├── core │ │ │ ├── body.scss │ │ │ ├── clearfix.scss │ │ │ ├── pull-right.scss │ │ │ ├── reset.scss │ │ │ └── text-center.scss │ │ ├── features │ │ │ ├── code.scss │ │ │ ├── fullvideo.scss │ │ │ └── splash-holder.scss │ │ ├── grid │ │ │ └── wide.scss │ │ ├── horizontal_rules │ │ │ └── colored-line.scss │ │ ├── jumbotron │ │ │ └── jumbotron.scss │ │ ├── layout │ │ │ ├── footer.scss │ │ │ ├── header.scss │ │ │ ├── menu │ │ │ │ ├── footer-menu.scss │ │ │ │ └── screen-menu.scss │ │ │ ├── page-container.scss │ │ │ └── page-wrapper.scss │ │ ├── panel │ │ │ ├── gradient.scss │ │ │ ├── panel.scss │ │ │ └── veil.scss │ │ ├── screen │ │ │ ├── screen-padder.scss │ │ │ └── screen.scss │ │ ├── specific │ │ │ ├── blog │ │ │ │ └── blog_article_teaser.scss │ │ │ ├── codebox.scss │ │ │ ├── documentation │ │ │ │ ├── docs-list.scss │ │ │ │ └── markdown-block.scss │ │ │ ├── feature.scss │ │ │ ├── homepage │ │ │ │ └── badges-holder.scss │ │ │ ├── login_img.scss │ │ │ ├── press │ │ │ │ └── press.scss │ │ │ ├── stepnumber.scss │ │ │ └── theme_manager │ │ │ │ └── theme.scss │ │ ├── table │ │ │ └── table.scss │ │ ├── tags │ │ │ └── tag_holder.scss │ │ ├── typography │ │ │ ├── anchor.scss │ │ │ ├── blockquote.scss │ │ │ ├── dark.scss │ │ │ ├── heading1.scss │ │ │ ├── heading2.scss │ │ │ ├── heading3.scss │ │ │ ├── heading5.scss │ │ │ ├── icon.scss │ │ │ └── paragraph.scss │ │ └── utilities │ │ │ └── text-center.scss │ ├── main.scss │ ├── mixins │ │ ├── clearfix.scss │ │ ├── font-size.scss │ │ ├── full.scss │ │ ├── hoverlink.scss │ │ ├── no-smooth-font.scss │ │ └── text-shadow.scss │ └── variables │ │ ├── colors.scss │ │ ├── font-sizes.scss │ │ ├── layout.scss │ │ └── transitions.scss ├── fonticons │ └── icons_template.scss ├── fonts │ └── fontsgohere.txt ├── hbs_helpers │ └── blog.js ├── img │ ├── example_files │ │ ├── admin.png │ │ ├── babel.gif │ │ ├── background-image-text.png │ │ ├── globalizer.gif │ │ ├── icons_20.ai │ │ ├── makingicons.png │ │ ├── retinasprites.png │ │ ├── templatitator.gif │ │ ├── typedbackgroundimage.png │ │ └── useartboards.png │ ├── favicon │ │ ├── android-icon-144x144.png │ │ ├── android-icon-192x192.png │ │ ├── android-icon-36x36.png │ │ ├── android-icon-48x48.png │ │ ├── android-icon-72x72.png │ │ ├── android-icon-96x96.png │ │ ├── apple-icon-114x114.png │ │ ├── apple-icon-120x120.png │ │ ├── apple-icon-144x144.png │ │ ├── apple-icon-152x152.png │ │ ├── apple-icon-180x180.png │ │ ├── apple-icon-57x57.png │ │ ├── apple-icon-60x60.png │ │ ├── apple-icon-72x72.png │ │ ├── apple-icon-76x76.png │ │ ├── apple-icon-precomposed.png │ │ ├── apple-icon.png │ │ ├── browserconfig.xml │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon-96x96.png │ │ ├── favicon.ico │ │ ├── favicon_144.png │ │ ├── favicon_512.png │ │ ├── favicon_64.png │ │ ├── manifest.json │ │ ├── ms-icon-144x144.png │ │ ├── ms-icon-150x150.png │ │ ├── ms-icon-310x310.png │ │ └── ms-icon-70x70.png │ ├── mockups │ │ └── room.jpg │ ├── press │ │ ├── enduro_e.png │ │ ├── logo.ai │ │ ├── logo.svg │ │ └── square_logo.jpg │ ├── temp │ │ ├── a.png │ │ └── bride-1822488_1920.jpg │ └── test │ │ └── upload.test └── js │ ├── features │ └── docnav.js │ ├── handlebars.js │ └── main.js ├── bower.json ├── cms ├── .settings.js ├── .users.js ├── generators │ ├── blog │ │ ├── advantages_of_static_serving.js │ │ ├── angular-project-with-endurojs.js │ │ ├── blog.js │ │ ├── how-to-make-a-blog-with-endurojs.js │ │ ├── link-s3-to-enduro.js │ │ ├── multicultural-site-with-endurojs.js │ │ └── personal-portfolio-website-with-endurojs.js │ └── docs │ │ ├── ab-testing.js │ │ ├── abstractors.js │ │ ├── admin-extensions.js │ │ ├── app.js │ │ ├── brick-processors.js │ │ ├── built-in-helpers.js │ │ ├── cli.js │ │ ├── content-files.js │ │ ├── context-modifiers.js │ │ ├── docs.js │ │ ├── enduro-bricks.js │ │ ├── endurojs-for-managers.js │ │ ├── event-hooks.js │ │ ├── files-helper.js │ │ ├── generators.js │ │ ├── globalizer.js │ │ ├── grouped-each.js │ │ ├── hello-world.js │ │ ├── heroku.js │ │ ├── iconfont-generator.js │ │ ├── introduction-to-admin.js │ │ ├── juicebox.js │ │ ├── linker.js │ │ ├── list-of-admin-control-types.js │ │ ├── made-with-enduro.js │ │ ├── multilingual-support.js │ │ ├── netlify.js │ │ ├── object-control-type.js │ │ ├── sass.js │ │ ├── spritesheet-generator.js │ │ ├── static-pages.js │ │ ├── temper.js │ │ ├── templates.js │ │ ├── templatitator.js │ │ ├── termination.js │ │ ├── themes.js │ │ ├── trollhunter.js │ │ ├── using-s3-as-filesystem.js │ │ └── what-is-enduro.js ├── global │ ├── documentation │ │ └── documentation_list.js │ ├── features.js │ ├── navigation │ │ └── mainmenu.js │ └── theme_manager │ │ └── themes.js ├── index.js └── press.js ├── components ├── layout │ ├── body.hbs │ ├── favicon.hbs │ ├── footer.hbs │ ├── keywords.hbs │ └── mainmenu.hbs ├── parts │ └── badges.hbs └── vector_components │ ├── logo.hbs │ └── logo_juste.hbs ├── enduro.json ├── package.json ├── pages ├── blog.hbs ├── docs.hbs ├── generators │ ├── blog.hbs │ └── docs.hbs ├── index.hbs ├── press.hbs └── themes.hbs └── support_files └── blog_static_database_queries.ai /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "assets/vendor" 3 | } -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "parserOptions": { 3 | "ecmaVersion": 6, 4 | "ecmaFeatures": { 5 | "experimentalObjectRestSpread": true, 6 | "jsx": true 7 | }, 8 | "sourceType": "module" 9 | }, 10 | 11 | "env": { 12 | "es6": true, 13 | "node": true 14 | }, 15 | 16 | "globals": { 17 | "document": false, 18 | "navigator": false, 19 | "window": false 20 | }, 21 | 22 | "rules": { 23 | "accessor-pairs": 2, 24 | "arrow-spacing": [2, { "before": true, "after": true }], 25 | "block-spacing": [2, "always"], 26 | "brace-style": [2, "1tbs", { "allowSingleLine": true }], 27 | "camelcase": [0, { "properties": "never" }], 28 | "comma-dangle": [2, "only-multiline"], 29 | "comma-spacing": [2, { "before": false, "after": true }], 30 | "comma-style": [2, "last"], 31 | "constructor-super": 2, 32 | "curly": [2, "multi-line"], 33 | "dot-location": [2, "property"], 34 | "eol-last": 2, 35 | "eqeqeq": [0, "allow-null"], 36 | "handle-callback-err": [2, "^(err|error)$" ], 37 | "indent": [1, "tab", { "SwitchCase": 1 }], 38 | "key-spacing": [2, { "beforeColon": false, "afterColon": true }], 39 | "keyword-spacing": [2, { "before": true, "after": true }], 40 | "new-cap": [0, { "newIsCap": true, "capIsNew": false }], 41 | "new-parens": 2, 42 | "no-array-constructor": 2, 43 | "no-caller": 2, 44 | "no-class-assign": 2, 45 | "no-cond-assign": 0, 46 | "no-const-assign": 2, 47 | "no-constant-condition": 2, 48 | "no-control-regex": 2, 49 | "no-debugger": 2, 50 | "no-delete-var": 2, 51 | "no-dupe-args": 2, 52 | "no-dupe-class-members": 2, 53 | "no-dupe-keys": 2, 54 | "no-duplicate-case": 2, 55 | "no-duplicate-imports": 2, 56 | "no-empty-character-class": 2, 57 | "no-empty-pattern": 2, 58 | "no-eval": 2, 59 | "no-ex-assign": 2, 60 | "no-extend-native": 2, 61 | "no-extra-bind": 2, 62 | "no-extra-boolean-cast": 2, 63 | "no-extra-parens": [2, "functions"], 64 | "no-fallthrough": 2, 65 | "no-floating-decimal": 0, 66 | "no-func-assign": 2, 67 | "no-implied-eval": 2, 68 | "no-inner-declarations": [2, "functions"], 69 | "no-invalid-regexp": 2, 70 | "no-irregular-whitespace": 2, 71 | "no-iterator": 2, 72 | "no-label-var": 2, 73 | "no-labels": [2, { "allowLoop": false, "allowSwitch": false }], 74 | "no-lone-blocks": 2, 75 | "no-mixed-spaces-and-tabs": 2, 76 | "no-multi-spaces": 2, 77 | "no-multi-str": 2, 78 | "no-multiple-empty-lines": [2, { "max": 1 }], 79 | "no-native-reassign": 2, 80 | "no-negated-in-lhs": 2, 81 | "no-new": 2, 82 | "no-new-func": 2, 83 | "no-new-object": 2, 84 | "no-new-require": 2, 85 | "no-new-symbol": 2, 86 | "no-new-wrappers": 2, 87 | "no-obj-calls": 2, 88 | "no-octal": 2, 89 | "no-octal-escape": 2, 90 | "no-path-concat": 2, 91 | "no-proto": 2, 92 | "no-redeclare": 2, 93 | "no-regex-spaces": 2, 94 | "no-return-assign": [0, "except-parens"], 95 | "no-self-assign": 2, 96 | "no-self-compare": 2, 97 | "no-sequences": 2, 98 | "no-shadow-restricted-names": 2, 99 | "no-spaced-func": 2, 100 | "no-sparse-arrays": 2, 101 | "no-this-before-super": 2, 102 | "no-throw-literal": 2, 103 | "no-trailing-spaces": 2, 104 | "no-undef": 0, 105 | "no-undef-init": 2, 106 | "no-unexpected-multiline": 2, 107 | "no-unmodified-loop-condition": 2, 108 | "no-unneeded-ternary": [2, { "defaultAssignment": false }], 109 | "no-unreachable": 2, 110 | "no-unsafe-finally": 2, 111 | "no-unused-vars": [2, { "vars": "all", "args": "none" }], 112 | "no-useless-call": 2, 113 | "no-useless-computed-key": 2, 114 | "no-useless-constructor": 2, 115 | "no-useless-escape": 2, 116 | // "no-useless-rename": 2, 117 | "no-whitespace-before-property": 2, 118 | "no-with": 2, 119 | "object-property-newline": [2, { "allowMultiplePropertiesPerLine": true }], 120 | "one-var": [2, { "initialized": "never" }], 121 | "operator-linebreak": [2, "after", { "overrides": { "?": "before", ":": "before" } }], 122 | "padded-blocks": [0, "never"], 123 | "quotes": [2, "single", { "avoidEscape": true, "allowTemplateLiterals": true }], 124 | // "rest-spread-spacing": [2, "never"], 125 | "semi": [2, "never"], 126 | "semi-spacing": [2, { "before": false, "after": true }], 127 | "space-before-blocks": [2, "always"], 128 | "space-before-function-paren": [2, "always"], 129 | "space-in-parens": [2, "never"], 130 | "space-infix-ops": 2, 131 | "space-unary-ops": [2, { "words": true, "nonwords": false }], 132 | "spaced-comment": 2, 133 | "template-curly-spacing": [2, "never"], 134 | // "unicode-bom": [2, "never"], 135 | "use-isnan": 2, 136 | "valid-typeof": 2, 137 | "wrap-iife": [2, "any"], 138 | "yield-star-spacing": [2, "both"], 139 | "yoda": [2, "never"] 140 | } 141 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /_generated 2 | /assets/vendor 3 | /node_modules 4 | /assets/css/sprites 5 | enduro_secret.json 6 | /juicebox 7 | /t -------------------------------------------------------------------------------- /License.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Official website of enduro.js - Minimalistic, lean & mean, node.js cms 2 | 3 | Hosted here: http://endurojs.com/ 4 | 5 | **Other repositories:** [Enduro](https://github.com/Gottwik/Enduro) • [samples](https://github.com/Gottwik/enduro_samples) • [Enduro admin](https://github.com/Gottwik/enduro_admin) • endurojs.com site 6 | 7 | ![Imgur](http://i.imgur.com/NM9ZODP.png) 8 | 9 | # Contributing 10 | 11 | This website is made in [enduro.js](https://github.com/kiskadigitalmedia/Enduro) and has bower dependencies. To get it running locally follow these steps: 12 | 13 | 1. Make sure you have node.js installed. Grab it here if you don't: https://nodejs.org/en/download/ 14 | 1. Install enduro globally - `$ npm install enduro -g` 15 | 1. Make sure you have bower installed globally. If not run `$ npm install -g bower` 16 | 1. Install bower dependencies - `$ bower install` 17 | 1. Install npm dependencies - `$ npm install` 18 | 1. Finally, start up enduro - `$ enduro start` for production mode, or `$ enduro dev` for development mode. 19 | 1. Done. Browser with the website loaded should appear. 20 | -------------------------------------------------------------------------------- /app/abstractors/doc.js: -------------------------------------------------------------------------------- 1 | // placeholder abstractor 2 | var abstractor = function () {} 3 | 4 | // vendor dependencies 5 | var marked = require('marked') 6 | marked.setOptions({ 7 | renderer: new marked.Renderer(), 8 | gfm: true, 9 | tables: true, 10 | breaks: false, 11 | pedantic: true, 12 | sanitize: true, 13 | smartLists: true, 14 | smartypants: false 15 | }) 16 | 17 | abstractor.prototype.init = function (context) { 18 | return new Promise(function (resolve, reject) { 19 | 20 | // initialize abstractor 21 | resolve() 22 | }) 23 | } 24 | 25 | abstractor.prototype.abstract = function (context) { 26 | return new Promise(function (resolve, reject) { 27 | 28 | // hides the abstracted context 29 | context['$abstracted_content_hidden'] = true 30 | 31 | // creates abstracted context object 32 | context.abstracted_content = {} 33 | 34 | // creates the markdowned context 35 | context.abstracted_content.marked_doc = marked(context.doc) 36 | 37 | // applies folder markdown_rule 38 | context.abstracted_content.marked_doc = folder_markdown(context.abstracted_content.marked_doc) 39 | 40 | // creates folder structure 41 | var headings = context.abstracted_content.marked_doc.match(/.*?\/h[{1-3}]>/g) 42 | 43 | var heading_structure = [] 44 | 45 | for (m in headings) { 46 | 47 | var heading = {} 48 | 49 | var heading_match = headings[m].match(/(.*)?<\/h[{1-3}]>/) 50 | 51 | heading.heading = heading_match[3] 52 | heading.level = heading_match[1] 53 | heading.link = heading_match[2] 54 | heading_structure.push(heading) 55 | } 56 | 57 | context.abstracted_content.contents = heading_structure 58 | 59 | // abstract directive 60 | return resolve() 61 | 62 | }) 63 | } 64 | 65 | // custom markdown rule for markdown 66 | function folder_markdown (input) { 67 | return input.replace(/\$\$([\w\/\.-]*)/g, '$1') 68 | } 69 | 70 | module.exports = new abstractor() 71 | -------------------------------------------------------------------------------- /app/abstractors/text.js: -------------------------------------------------------------------------------- 1 | // placeholder abstractor 2 | var abstractor = function () {} 3 | 4 | abstractor.prototype.abstract = function(context) { 5 | return new Promise(function(resolve, reject) { 6 | 7 | context['$linkified_text_hidden'] = true 8 | context['linkified_text'] = context['text'].replace(/\[(.*?)\]\((.*?)\)/g, '$1') 9 | 10 | resolve() 11 | 12 | }) 13 | } 14 | 15 | 16 | module.exports = new abstractor() -------------------------------------------------------------------------------- /app/app.js: -------------------------------------------------------------------------------- 1 | var local_app = function () {} 2 | 3 | // vendor dependencies 4 | const path = require('path') 5 | const mongo_client = require('mongodb').MongoClient 6 | const glob = require('glob') 7 | 8 | global.theme_manager = require('./theme_manager/theme_manager') 9 | 10 | // constants 11 | var DATABASE_URL = (enduro.config.secret && enduro.config.secret.DATABASE_URL) || process.env.DATABASE_URL 12 | 13 | local_app.prototype.init = function (app) { 14 | 15 | // try to connect to mongodb 16 | mongo_client.connect(DATABASE_URL, function (err, mongo_db) { 17 | if (err) { console.log(err) } 18 | 19 | theme_manager.init(mongo_db) 20 | }) 21 | 22 | // hook up /theme_manager endpoints 23 | glob.sync(path.join(enduro.project_path, 'app', 'theme_manager', 'endpoints', '**', '*.js')).forEach((file) => { 24 | require(path.resolve(file)).init(app) 25 | }) 26 | } 27 | 28 | module.exports = new local_app() 29 | -------------------------------------------------------------------------------- /app/theme_manager/endpoints/get_all_themes.js: -------------------------------------------------------------------------------- 1 | // * ———————————————————————————————————————————————————————— * // 2 | // * /theme_manager/get_all_themes endpoint 3 | // * ———————————————————————————————————————————————————————— * // 4 | var add_part_endpoint = function () {} 5 | 6 | add_part_endpoint.prototype.init = function (app) { 7 | app.get('/theme_manager/get_all_themes', (req, res) => { 8 | 9 | enduro.api.flat.load('global/theme_manager/themes') 10 | .then((themes) => { 11 | res.send(themes.themes) 12 | }) 13 | 14 | }) 15 | } 16 | 17 | module.exports = new add_part_endpoint() 18 | -------------------------------------------------------------------------------- /app/theme_manager/endpoints/get_theme_by_name.js: -------------------------------------------------------------------------------- 1 | // * ———————————————————————————————————————————————————————— * // 2 | // * /theme_manager/get_theme_by_name endpoint 3 | // * ———————————————————————————————————————————————————————— * // 4 | var add_part_endpoint = function () {} 5 | 6 | // vendor dependencies 7 | var _ = require('lodash') 8 | 9 | add_part_endpoint.prototype.init = function (app) { 10 | app.get('/theme_manager/get_theme_by_name/:theme_name', (req, res) => { 11 | 12 | // stores the theme name 13 | var theme_name = req.params.theme_name 14 | 15 | // log this downlaod if stealth is not true 16 | // stealth is used to filter out requests from enduro tests 17 | if (!req.query.stealth) { 18 | theme_manager.increase_downloads_by_theme_name(theme_name, req) 19 | } 20 | 21 | // gets all theme 22 | enduro.api.flat.load('global/theme_manager/themes') 23 | .then((themes) => { 24 | 25 | // tries to find the theme by theme name 26 | var theme = _.find(themes.themes, { name: theme_name }) 27 | if (theme) { 28 | res.send({ found: true, theme_info: theme }) 29 | } else { 30 | res.send({ found: false }) 31 | } 32 | }) 33 | 34 | }) 35 | } 36 | 37 | module.exports = new add_part_endpoint() 38 | -------------------------------------------------------------------------------- /app/theme_manager/theme_manager.js: -------------------------------------------------------------------------------- 1 | var parts_manager = function () {} 2 | 3 | // vendor dependencies 4 | var request = require('request-promise') 5 | 6 | parts_manager.prototype.init = function (db) { 7 | var self = this 8 | self.themedownloads_collection = db.collection('enduro_website_themedownloads') 9 | self.themedownloads_detailed_collection = db.collection('enduro_website_themedownloads_detailed') 10 | } 11 | 12 | parts_manager.prototype.increase_downloads_by_theme_name = function (theme_name, req) { 13 | var self = this 14 | 15 | self.themedownloads_collection.update( 16 | { name: theme_name }, 17 | { $inc: { downloads: 1 }}, 18 | { upsert: true } 19 | ) 20 | 21 | var ip = req.ip 22 | 23 | request.get('http://ip-api.com/json/' + ip) 24 | .then((location) => { 25 | 26 | location = JSON.parse(location) 27 | 28 | self.themedownloads_detailed_collection.insert({ 29 | theme_name: theme_name, 30 | ip: req.ip, 31 | location: location, 32 | timestamp: +new Date, 33 | }) 34 | }) 35 | 36 | } 37 | 38 | module.exports = new parts_manager() 39 | -------------------------------------------------------------------------------- /assets/css/bootstrap-selection.scss: -------------------------------------------------------------------------------- 1 | // Override bootstrap variables here 2 | $grid-breakpoints: ( 3 | xs: 0, 4 | sm: 544px, 5 | md: 768px, 6 | lg: 992px, 7 | xl: 1280px 8 | ) !default; 9 | 10 | $grid-gutter-width: 20px; 11 | 12 | 13 | // Core variables and mixins 14 | @import '../vendor/bootstrap/scss/variables'; 15 | 16 | // Reset and dependencies 17 | @import '../vendor/bootstrap/scss/normalize'; 18 | @import '../vendor/bootstrap/scss/mixins'; 19 | @import '../vendor/bootstrap/scss/print'; 20 | 21 | // Core CSS 22 | @import '../vendor/bootstrap/scss/reboot'; 23 | @import '../vendor/bootstrap/scss/responsive-embed'; 24 | @import '../vendor/bootstrap/scss/grid'; 25 | 26 | // Utility classes 27 | @import '../vendor/bootstrap/scss/utilities'; 28 | @import '../vendor/bootstrap/scss/utilities-responsive'; 29 | 30 | // Modal 31 | @import '../vendor/bootstrap/scss/modal'; 32 | 33 | // Images 34 | @import '../vendor/bootstrap/scss/images'; -------------------------------------------------------------------------------- /assets/css/components/bubble/bubble.scss: -------------------------------------------------------------------------------- 1 | .bubble { 2 | @include font-size(xs); 3 | padding: 1px 10px 2px; 4 | margin-bottom: 1px; 5 | background-color: $secondary-color; 6 | display: inline-block; 7 | border-radius: 5px; 8 | color: $white; 9 | } -------------------------------------------------------------------------------- /assets/css/components/button/btn.scss: -------------------------------------------------------------------------------- 1 | .btn { 2 | @include hoverlink(); 3 | padding: 7px 30px; 4 | background-color: rgba($black, .2); 5 | border: 1px $white solid; 6 | display: inline-block; 7 | border-radius: 2px; 8 | margin: 0 5px; 9 | 10 | i { 11 | margin-top: -5px; 12 | margin-bottom: 10px; 13 | 14 | &.small { 15 | margin-top: 0; 16 | margin-bottom: 0; 17 | margin-left: -15px; 18 | margin-right: 15px; 19 | 20 | &:before { 21 | position: relative; 22 | top: 1px; 23 | } 24 | } 25 | } 26 | 27 | // modifiers 28 | $accent-button-color: saturate($primary-color, 40%); 29 | $accent-button-color-hover: saturate(darken($accent-button-color, 20%), 20%); 30 | &.accent { 31 | background-color: $accent-button-color; 32 | border-color: $white; 33 | color: $white; 34 | 35 | &:hover { 36 | background-color: $accent-button-color-hover; 37 | } 38 | } 39 | 40 | &.ghost { 41 | border: 1px solid $black; 42 | background-color: transparent; 43 | } 44 | 45 | &.icon { 46 | padding-right: 18px; 47 | } 48 | 49 | // environments 50 | .black & { 51 | color: $white !important; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /assets/css/components/card/card-body.scss: -------------------------------------------------------------------------------- 1 | .card-body { 2 | background-color: $white; 3 | } -------------------------------------------------------------------------------- /assets/css/components/card/card.scss: -------------------------------------------------------------------------------- 1 | .card { 2 | padding: 0px; 3 | } -------------------------------------------------------------------------------- /assets/css/components/core/body.scss: -------------------------------------------------------------------------------- 1 | body { 2 | @include font-size(sm); 3 | font-family: 'Lato', sans-serif; 4 | height: 100%; 5 | color: $primary-text-color; 6 | font-weight: 300; 7 | background-color: $white; 8 | overflow-x: hidden 9 | } 10 | 11 | .blur-background { 12 | position: fixed; 13 | width: 100%; 14 | height: 100%; 15 | background-image: url(/assets/img/pattern.png); 16 | background-size: cover; 17 | z-index: -2; 18 | top: 0; 19 | overflow: hidden; 20 | 21 | &.light { 22 | //opacity: 0.6; 23 | } 24 | } -------------------------------------------------------------------------------- /assets/css/components/core/clearfix.scss: -------------------------------------------------------------------------------- 1 | .clearfix { 2 | clear: both; 3 | } -------------------------------------------------------------------------------- /assets/css/components/core/pull-right.scss: -------------------------------------------------------------------------------- 1 | // * ———————————————————————————————————————————————————————— * // 2 | // * Text center 3 | // * ———————————————————————————————————————————————————————— * // 4 | 5 | // Check if grid breakpoints is defined(might be by bootstrap) 6 | // if not, define it again 7 | $grid-breakpoints: ( 8 | xs: 0, 9 | sm: 544px, 10 | md: 768px, 11 | lg: 992px, 12 | xl: 1280px 13 | ) !default; 14 | 15 | .pull-right { 16 | float: right; 17 | } 18 | 19 | @each $breakpoint, $size in $grid-breakpoints { 20 | @include media-breakpoint-down(#{$breakpoint}) { 21 | .pull-right-#{$breakpoint}-down { 22 | float: right; 23 | } 24 | } 25 | 26 | @include media-breakpoint-up(#{$breakpoint}) { 27 | .pull-right-#{$breakpoint}-up { 28 | float: right; 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /assets/css/components/core/reset.scss: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | margin: 0; 4 | } 5 | 6 | html { 7 | height: 100%; 8 | } 9 | 10 | 11 | body { 12 | min-height: 100%; 13 | } 14 | 15 | ul { 16 | list-style: none; 17 | padding-left: 0; 18 | } 19 | 20 | *:focus { 21 | outline: 0; 22 | } -------------------------------------------------------------------------------- /assets/css/components/core/text-center.scss: -------------------------------------------------------------------------------- 1 | // * ———————————————————————————————————————————————————————— * // 2 | // * Text center 3 | // * ———————————————————————————————————————————————————————— * // 4 | 5 | // Check if grid breakpoints is defined(might be by bootstrap) 6 | // if not, define it again 7 | $grid-breakpoints: ( 8 | xs: 0, 9 | sm: 544px, 10 | md: 768px, 11 | lg: 992px, 12 | xl: 1280px 13 | ) !default; 14 | 15 | .text-center { 16 | text-align: center; 17 | } 18 | 19 | @each $breakpoint, $size in $grid-breakpoints { 20 | @include media-breakpoint-down(#{$breakpoint}) { 21 | .text-center-#{$breakpoint}-down { 22 | text-align: center; 23 | } 24 | } 25 | 26 | @include media-breakpoint-up(#{$breakpoint}) { 27 | .text-center-#{$breakpoint}-up { 28 | text-align: center; 29 | } 30 | } 31 | } 32 | 33 | .text-left { 34 | text-align: left; 35 | } -------------------------------------------------------------------------------- /assets/css/components/features/code.scss: -------------------------------------------------------------------------------- 1 | code { 2 | @include font-size(xs); 3 | display: inline !important; 4 | border-radius: 5px; 5 | padding: 2px 10px !important; 6 | margin: -5px 5px; 7 | background: $code-background !important; 8 | white-space: nowrap !important; 9 | font-family: 'Source Code Pro', monospace; 10 | color: darken($white, 10%); 11 | } 12 | 13 | 14 | // block code 15 | pre code { 16 | display: inherit !important; 17 | padding: 15px 20px !important; 18 | margin: 0; 19 | white-space: pre-wrap !important; 20 | } -------------------------------------------------------------------------------- /assets/css/components/features/fullvideo.scss: -------------------------------------------------------------------------------- 1 | .fullvideo { 2 | position: absolute; 3 | top: 0; 4 | height: 100%; 5 | width: 177.77777778vh; /* 100 * 16 / 9 */ 6 | min-width: 100%; 7 | min-height: 56.25vw; /* 100 * 9 / 16 */ 8 | left: 50%; /* % of surrounding element */ 9 | top: 50%; 10 | transform: translate(-50%, -50%); /* % of current element */ 11 | 12 | @include media-breakpoint-down(sm) { 13 | display: none; 14 | } 15 | } -------------------------------------------------------------------------------- /assets/css/components/features/splash-holder.scss: -------------------------------------------------------------------------------- 1 | .splash-holder { 2 | height: 100%; 3 | 4 | .splash { 5 | display: inline-block; 6 | vertical-align: middle; 7 | } 8 | 9 | &:before { 10 | content: ''; 11 | height: 100%; 12 | vertical-align: middle; 13 | display: inline-block; 14 | } 15 | } -------------------------------------------------------------------------------- /assets/css/components/grid/wide.scss: -------------------------------------------------------------------------------- 1 | $wide-grid-gutter: 20px; 2 | 3 | .row.wide { 4 | margin-left: -$wide-grid-gutter; 5 | margin-right: $wide-grid-gutter; 6 | 7 | > div { 8 | padding: 0 $wide-grid-gutter; 9 | } 10 | } -------------------------------------------------------------------------------- /assets/css/components/horizontal_rules/colored-line.scss: -------------------------------------------------------------------------------- 1 | .colored-line { 2 | border-top: 1px solid $secondary-color; 3 | } -------------------------------------------------------------------------------- /assets/css/components/jumbotron/jumbotron.scss: -------------------------------------------------------------------------------- 1 | .jumbotron { 2 | height: 600px; 3 | background-size: cover; 4 | background-position: center center; 5 | text-align: center; 6 | position: relative; 7 | 8 | .contentbox { 9 | display: inline-block; 10 | vertical-align: middle; 11 | position: relative; 12 | } 13 | 14 | &:before { 15 | content: ''; 16 | display: inline-block; 17 | vertical-align: middle; 18 | height: 100%; 19 | } 20 | 21 | // modifiers 22 | &.top { 23 | background-position: top; 24 | } 25 | 26 | } -------------------------------------------------------------------------------- /assets/css/components/layout/footer.scss: -------------------------------------------------------------------------------- 1 | footer { 2 | @include no-smooth-font(); 3 | 4 | .logo svg { 5 | width: 100px; 6 | height: 50px; 7 | 8 | #justhexagon { 9 | fill: darken($white, 20%); 10 | } 11 | 12 | #juste { 13 | fill: $grey 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /assets/css/components/layout/header.scss: -------------------------------------------------------------------------------- 1 | header { 2 | width: 100%; 3 | padding: 8px 30px 0px 10px; 4 | position: fixed; 5 | top: 0; 6 | background-color: $black; 7 | color: $white; 8 | z-index: 5; 9 | height: $header-height; 10 | 11 | .logo { 12 | float: left; 13 | 14 | svg { 15 | height: 40px; 16 | 17 | path { 18 | fill: $white; 19 | } 20 | 21 | #e { 22 | fill: $black; 23 | } 24 | 25 | #lettering { 26 | stroke-width: 4px; 27 | stroke: $white; 28 | } 29 | } 30 | 31 | } 32 | 33 | @include media-breakpoint-down(sm) { 34 | padding: 8px 30px 3px 15px; 35 | } 36 | } -------------------------------------------------------------------------------- /assets/css/components/layout/menu/footer-menu.scss: -------------------------------------------------------------------------------- 1 | .footer-menu { 2 | padding-top: 15px; 3 | 4 | .footer_menu_category { 5 | font-weight: 400; 6 | margin-top: 20px; 7 | } 8 | 9 | a { 10 | } 11 | } -------------------------------------------------------------------------------- /assets/css/components/layout/menu/screen-menu.scss: -------------------------------------------------------------------------------- 1 | .screen-menu { 2 | 3 | float: right; 4 | padding: 7px 0 1px; 5 | 6 | ul { 7 | li { 8 | padding: 0 5px; 9 | display: inline-block; 10 | } 11 | } 12 | 13 | a { 14 | @include hoverlink(); 15 | } 16 | 17 | .collapsed-menu { 18 | display: none; 19 | margin-top: -2px; 20 | margin-right: -12px; 21 | cursor: pointer; 22 | 23 | i { 24 | font-size: 30px !important; 25 | } 26 | 27 | & ~ input { 28 | display: none; 29 | 30 | &:checked ~ ul { 31 | display: block; 32 | } 33 | } 34 | } 35 | 36 | @include media-breakpoint-down(sm) { 37 | ul { 38 | display: none; 39 | position: absolute; 40 | left: 0; 41 | background-color: $black; 42 | width: 100%; 43 | padding: 30px; 44 | 45 | li { 46 | display: block; 47 | padding: 5px; 48 | @include font-size(md); 49 | } 50 | 51 | } 52 | 53 | .collapsed-menu { 54 | display: block; 55 | } 56 | } 57 | } -------------------------------------------------------------------------------- /assets/css/components/layout/page-container.scss: -------------------------------------------------------------------------------- 1 | .page-container { 2 | padding: 0 100px; 3 | max-width: 1400px; 4 | margin: 0 auto; 5 | 6 | @include media-breakpoint-down(sm) { 7 | padding: 0 20px; 8 | } 9 | 10 | // modifiers 11 | &.padded { 12 | padding: 50px 70px; 13 | 14 | @include media-breakpoint-down(sm) { 15 | padding: 50px 20px; 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /assets/css/components/layout/page-wrapper.scss: -------------------------------------------------------------------------------- 1 | .page-wrapper { 2 | position: relative; 3 | 4 | 5 | // modifiers 6 | &.colored { 7 | background-color: $primary-color; 8 | color: $white; 9 | 10 | a { 11 | text-decoration: underline; 12 | } 13 | 14 | &.secondary { 15 | background-color: $secondary-color; 16 | color: $black; 17 | 18 | a { 19 | color: $primary-color; 20 | text-decoration: underline; 21 | } 22 | } 23 | } 24 | 25 | &.dark { 26 | background-color: $grey; 27 | color: $white; 28 | 29 | a { 30 | color: $white; 31 | } 32 | 33 | .btn { 34 | @include no-smooth-font(); 35 | border-color: $white; 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /assets/css/components/panel/gradient.scss: -------------------------------------------------------------------------------- 1 | .gradient { 2 | &:before { 3 | content: ''; 4 | @include full(); 5 | background: linear-gradient(to bottom, rgba($black, 1) 5%, rgba($black, 0) 50%); 6 | z-index: 1; 7 | } 8 | } -------------------------------------------------------------------------------- /assets/css/components/panel/panel.scss: -------------------------------------------------------------------------------- 1 | .panel { 2 | margin: 60px 0; 3 | } -------------------------------------------------------------------------------- /assets/css/components/panel/veil.scss: -------------------------------------------------------------------------------- 1 | .veil { 2 | @include full(); 3 | background-color: rgba($black, .3); 4 | } -------------------------------------------------------------------------------- /assets/css/components/screen/screen-padder.scss: -------------------------------------------------------------------------------- 1 | .screen-padder { 2 | padding: 50px 70px; 3 | z-index: 2; 4 | 5 | @include media-breakpoint-down(sm) { 6 | padding: 50px 20px; 7 | } 8 | 9 | &.dark { 10 | color: $white; 11 | } 12 | 13 | &.full { 14 | @include full(); 15 | } 16 | } -------------------------------------------------------------------------------- /assets/css/components/screen/screen.scss: -------------------------------------------------------------------------------- 1 | .screen { 2 | width: 100vw; 3 | min-height: 100vh; 4 | background-size: cover; 5 | background-position: top center; 6 | position: relative; 7 | 8 | // modifiers 9 | &.black { 10 | background-color: $black; 11 | } 12 | 13 | &.blue { 14 | background-color: $primary-color; 15 | color: $white; 16 | } 17 | 18 | &.colored { 19 | background-color: $primary-color; 20 | color: $white; 21 | border-top: 5px solid $secondary-color; 22 | 23 | a { 24 | color: lighten(saturate($primary-color, 100%), 50%); 25 | text-decoration: underline; 26 | } 27 | } 28 | 29 | &.fixed { 30 | position: fixed; 31 | top: 0; 32 | } 33 | 34 | 35 | &.below_header { 36 | min-height: calc(100vh - #{$header-height}); 37 | height: calc(100vh - #{$header-height}); 38 | margin-top: $header-height; 39 | } 40 | 41 | } 42 | 43 | .fixed-screen-holder { 44 | height: 100vh; 45 | } -------------------------------------------------------------------------------- /assets/css/components/specific/blog/blog_article_teaser.scss: -------------------------------------------------------------------------------- 1 | .blog_article_teaser { 2 | h2 { 3 | margin-top: -15px; 4 | } 5 | 6 | border-bottom: 1px rgba($grey, .1) solid; 7 | padding-bottom: 30px; 8 | margin-bottom: 30px; 9 | 10 | img { 11 | padding-right: 10px; 12 | } 13 | } -------------------------------------------------------------------------------- /assets/css/components/specific/codebox.scss: -------------------------------------------------------------------------------- 1 | .codebox { 2 | background-color: $light-grey; 3 | padding: 2px 10px 4px 6px; 4 | border-radius: 5px; 5 | 6 | &.url { 7 | background-color: $link-color; 8 | } 9 | } -------------------------------------------------------------------------------- /assets/css/components/specific/documentation/docs-list.scss: -------------------------------------------------------------------------------- 1 | .docs-list { 2 | padding: 30px; 3 | width: 100%; 4 | border: 1px solid lighten($grey, 70%); 5 | border-radius: 10px; 6 | margin-top: 40px; 7 | 8 | .navigation { 9 | font-weight: 400; 10 | } 11 | 12 | &.slime { 13 | position: fixed; 14 | top: 0; 15 | } 16 | 17 | li { 18 | 19 | a { 20 | text-decoration: none; 21 | } 22 | 23 | &.active { 24 | font-weight: 400; 25 | } 26 | 27 | &.side-level-3 { 28 | margin-left: 10px; 29 | } 30 | } 31 | 32 | @include media-breakpoint-down(sm) { 33 | display: none; 34 | } 35 | } -------------------------------------------------------------------------------- /assets/css/components/specific/documentation/markdown-block.scss: -------------------------------------------------------------------------------- 1 | .markdown-block { 2 | 3 | a { 4 | font-weight: 400; 5 | color: $primary-color !important; 6 | } 7 | 8 | .markdown_folder { 9 | @include font-size(xs); 10 | border-radius: 5px; 11 | display: inline-block; 12 | padding: 1px 10px !important; 13 | background: $code-background !important; 14 | color: #91cef5; 15 | position: relative; 16 | font-family: 'Source Code Pro', monospace; 17 | 18 | &:before { 19 | font-size: 18px; 20 | content: $fa-var-folder; 21 | @include fa-icon() 22 | margin: -2px 5px -5px -4px; 23 | } 24 | } 25 | 26 | li { 27 | list-style-type: circle; 28 | margin-left: 18px; 29 | } 30 | 31 | img { 32 | max-width: 100%; 33 | } 34 | 35 | a { 36 | text-decoration: underline !important; 37 | } 38 | } -------------------------------------------------------------------------------- /assets/css/components/specific/feature.scss: -------------------------------------------------------------------------------- 1 | .feature { 2 | padding: 20px; 3 | margin-bottom: 50px; 4 | 5 | i { 6 | @include font-size(xl); 7 | margin-left: 2px; 8 | margin-bottom: 5px; 9 | } 10 | 11 | @include media-breakpoint-down(lg) { 12 | &:nth-child(3n+1){ 13 | clear: left; 14 | } 15 | } 16 | 17 | @include media-breakpoint-down(md) { 18 | &:nth-child(3n+1){ 19 | clear: none; 20 | } 21 | 22 | &:nth-child(2n+1){ 23 | clear: left; 24 | } 25 | } 26 | 27 | @include media-breakpoint-up(xl) { 28 | &:nth-child(4n+1){ 29 | clear: left; 30 | } 31 | } 32 | } 33 | 34 | .feature-row { 35 | margin-bottom: 50px; 36 | } -------------------------------------------------------------------------------- /assets/css/components/specific/homepage/badges-holder.scss: -------------------------------------------------------------------------------- 1 | .badges-holder { 2 | 3 | } -------------------------------------------------------------------------------- /assets/css/components/specific/login_img.scss: -------------------------------------------------------------------------------- 1 | .login_img { 2 | float: right; 3 | position: relative; 4 | width: 80vw; 5 | right: -10vw; 6 | } -------------------------------------------------------------------------------- /assets/css/components/specific/press/press.scss: -------------------------------------------------------------------------------- 1 | .press { 2 | 3 | } -------------------------------------------------------------------------------- /assets/css/components/specific/stepnumber.scss: -------------------------------------------------------------------------------- 1 | .stepnumber { 2 | @include font-size(lg); 3 | margin-right: 10px; 4 | } -------------------------------------------------------------------------------- /assets/css/components/specific/theme_manager/theme.scss: -------------------------------------------------------------------------------- 1 | .theme { 2 | img { 3 | display: inline-block; 4 | } 5 | 6 | h2 { 7 | text-transform: capitalize; 8 | } 9 | } -------------------------------------------------------------------------------- /assets/css/components/table/table.scss: -------------------------------------------------------------------------------- 1 | table { 2 | width: 100%; 3 | } -------------------------------------------------------------------------------- /assets/css/components/tags/tag_holder.scss: -------------------------------------------------------------------------------- 1 | .tag_holder { 2 | 3 | } -------------------------------------------------------------------------------- /assets/css/components/typography/anchor.scss: -------------------------------------------------------------------------------- 1 | a { 2 | 3 | &:visited, 4 | &:link { 5 | text-decoration: none; 6 | color: inherit; 7 | 8 | i { 9 | @include font-size(icon2x, true); 10 | position: relative; 11 | top: 7px; 12 | margin-right: 10px; 13 | transition: transform $standard-transition; 14 | 15 | &.small { 16 | @include font-size(icon, true); 17 | top: 0; 18 | margin-right: 6px; 19 | } 20 | } 21 | 22 | } 23 | 24 | &:focus, 25 | &:hover { 26 | text-decoration: none; 27 | } 28 | 29 | // modifiers 30 | &.back { 31 | &:hover { 32 | i { 33 | transform: translateX(-10px); 34 | } 35 | } 36 | } 37 | 38 | &.block { 39 | transition: color $standard-transition; 40 | 41 | &:hover { 42 | color: $secondary-color; 43 | } 44 | } 45 | 46 | &.no_underline { 47 | text-decoration: none !important; 48 | } 49 | 50 | // combos 51 | &.btn, 52 | &.btn:visited, 53 | &.btn:link { 54 | color: inherit 55 | } 56 | 57 | } 58 | -------------------------------------------------------------------------------- /assets/css/components/typography/blockquote.scss: -------------------------------------------------------------------------------- 1 | blockquote { 2 | color: $black; 3 | border-left: 10px solid $secondary-color; 4 | padding: 10px; 5 | display: block; 6 | background-color: $secondary-color-on-dark; 7 | 8 | p { 9 | margin-bottom: 0px; 10 | } 11 | } -------------------------------------------------------------------------------- /assets/css/components/typography/dark.scss: -------------------------------------------------------------------------------- 1 | .dark { 2 | color: $white; 3 | 4 | p, 5 | h1, 6 | h2, 7 | h3 { 8 | @include text-shadow(); 9 | } 10 | } -------------------------------------------------------------------------------- /assets/css/components/typography/heading1.scss: -------------------------------------------------------------------------------- 1 | h1 { 2 | @include font-size(xl); 3 | font-weight: 100; 4 | margin: 30px 0 10px 0; 5 | line-height: 1; 6 | 7 | // modifiers 8 | &.short { 9 | margin: 0; 10 | } 11 | 12 | &.large { 13 | @include font-size(xxl); 14 | } 15 | } -------------------------------------------------------------------------------- /assets/css/components/typography/heading2.scss: -------------------------------------------------------------------------------- 1 | h2 { 2 | @include font-size(lg); 3 | font-weight: 100; 4 | margin: 50px 0 0 -2px; 5 | 6 | @include media-breakpoint-down(sm) { 7 | @include font-size(md); 8 | font-weight: 300; 9 | } 10 | 11 | // modifiers 12 | &.short { 13 | margin: 0; 14 | } 15 | 16 | &.active { 17 | // todo? 18 | } 19 | } -------------------------------------------------------------------------------- /assets/css/components/typography/heading3.scss: -------------------------------------------------------------------------------- 1 | h3 { 2 | @include font-size(md); 3 | font-weight: 100; 4 | padding-bottom: 10px; 5 | 6 | // modifiers 7 | &.short { 8 | margin: 0; 9 | padding: 0; 10 | } 11 | 12 | &.line { 13 | border-bottom: 1px solid lighten($secondary-color, 15%); 14 | margin-bottom: 10px; 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /assets/css/components/typography/heading5.scss: -------------------------------------------------------------------------------- 1 | h5 { 2 | font-weight: 300; 3 | } -------------------------------------------------------------------------------- /assets/css/components/typography/icon.scss: -------------------------------------------------------------------------------- 1 | i { 2 | @include font-size(icon2x, true); 3 | } -------------------------------------------------------------------------------- /assets/css/components/typography/paragraph.scss: -------------------------------------------------------------------------------- 1 | p { 2 | 3 | // modifiers 4 | &.padded { 5 | padding: 10px 0; 6 | margin-bottom: 0; 7 | } 8 | 9 | &.tiny { 10 | @include font-size(xs); 11 | font-weight: 100; 12 | } 13 | } -------------------------------------------------------------------------------- /assets/css/components/utilities/text-center.scss: -------------------------------------------------------------------------------- 1 | // * ———————————————————————————————————————————————————————— * // 2 | // * Text center 3 | // * ———————————————————————————————————————————————————————— * // 4 | 5 | // Check if grid breakpoints is defined(might be by bootstrap) 6 | // if not, define it again 7 | $grid-breakpoints: ( 8 | xs: 0, 9 | sm: 544px, 10 | md: 768px, 11 | lg: 992px, 12 | xl: 1280px 13 | ) !default; 14 | 15 | .text-center { 16 | text-align: center; 17 | } 18 | 19 | @each $breakpoint, $size in $grid-breakpoints { 20 | @include media-breakpoint-down(#{$breakpoint}) { 21 | .text-center-#{$breakpoint}-down { 22 | text-align: center; 23 | } 24 | } 25 | 26 | @include media-breakpoint-up(#{$breakpoint}) { 27 | .text-center-#{$breakpoint}-up { 28 | text-align: center; 29 | } 30 | } 31 | } 32 | 33 | .text-left { 34 | text-align: left; 35 | } -------------------------------------------------------------------------------- /assets/css/main.scss: -------------------------------------------------------------------------------- 1 | // Part of bootstrap 4 2 | @import 'bootstrap-selection'; 3 | 4 | $fa-font-path: '../vendor/font-awesome/fonts'; 5 | @import '../vendor/font-awesome/scss/font-awesome'; 6 | 7 | // Globbed variables 8 | @import 'variables/*'; 9 | 10 | // Mixins 11 | @import 'mixins/*'; 12 | 13 | // Mixins 14 | @import 'components/*'; 15 | 16 | @import '../vendor/kiskabricks_wedgecss/wedge'; 17 | 18 | -------------------------------------------------------------------------------- /assets/css/mixins/clearfix.scss: -------------------------------------------------------------------------------- 1 | @mixin clearfix() { 2 | &:after { 3 | content: ''; 4 | clear: both; 5 | display: table; 6 | } 7 | } -------------------------------------------------------------------------------- /assets/css/mixins/font-size.scss: -------------------------------------------------------------------------------- 1 | @mixin font-size($name: 'xs', $important: false) { 2 | @if $important { 3 | font-size: map-get($font-sizes, $name) !important; 4 | } @else { 5 | font-size: map-get($font-sizes, $name); 6 | } 7 | } -------------------------------------------------------------------------------- /assets/css/mixins/full.scss: -------------------------------------------------------------------------------- 1 | @mixin full($padding: 0px) { 2 | position: absolute; 3 | left: $padding; 4 | top: $padding; 5 | width: calc(100% - #{2 * $padding}); 6 | height: calc(100% - #{2 * $padding}); 7 | } -------------------------------------------------------------------------------- /assets/css/mixins/hoverlink.scss: -------------------------------------------------------------------------------- 1 | @mixin hoverlink () { 2 | transition: border-color $quick-transition, color $quick-transition, background-color $quick-transition; 3 | 4 | &:hover { 5 | border-color: $secondary-color-on-dark; 6 | color: $secondary-color-on-dark; 7 | } 8 | } -------------------------------------------------------------------------------- /assets/css/mixins/no-smooth-font.scss: -------------------------------------------------------------------------------- 1 | @mixin no-smooth-font() { 2 | -webkit-font-smoothing: antialiased; 3 | -moz-osx-font-smoothing: grayscale; 4 | } -------------------------------------------------------------------------------- /assets/css/mixins/text-shadow.scss: -------------------------------------------------------------------------------- 1 | @mixin text-shadow () { 2 | text-shadow: 1px 1px 15px rgba($black, .4), 2px 2px 50px rgba($black, .01); 3 | } -------------------------------------------------------------------------------- /assets/css/variables/colors.scss: -------------------------------------------------------------------------------- 1 | // $scheme: (#505160, #68829E, #aedb38); // Crisp & Dramatic 2 | // $scheme: (#375e97, #fb6542, #ffbb00); // Primary Colors With a Vibrant Twist 3 | // $scheme: (#98DBC6, #5BC8AC, #E6D72A); // Refreshing & Pretty 4 | // $scheme: (#1995ad, #a1d6e2, #bcbabe); // Icy Blues and Grays 5 | // $scheme: (#5d535e, #ec96a4, #dfe166); // Birds & Berries 6 | // $scheme: (#011a27, #063852, #e6df44); // Day & Night 7 | // $scheme: (#011a27, #68829E, #51cdf1); // Day & Night 8 | // $scheme: (#011a27, #557f97, #b7b7b7); // Day & Night 9 | // $scheme: (#505160, #376aa1, #4CD4B0); // Crisp & Dramatic 10 | $scheme: (#505160, #2980B9, #44BBFF); // Crisp & Dramatic 11 | 12 | 13 | // applied scheme 14 | $black: nth($scheme, 1); 15 | $primary-color: nth($scheme, 2); 16 | $secondary-color: nth($scheme, 3); 17 | 18 | // basics 19 | $white: #fff; 20 | $grey: #423d3d; 21 | 22 | // derived colors 23 | $light-grey: lighten($grey, 55%); 24 | 25 | $link-color: lighten($primary-color, 30%); 26 | 27 | $primary-text-color: $grey; 28 | 29 | $code-background: lighten(#000, 25%); 30 | 31 | $secondary-color-on-dark: saturate(lighten($secondary-color, 30%), 30%); -------------------------------------------------------------------------------- /assets/css/variables/font-sizes.scss: -------------------------------------------------------------------------------- 1 | // * ———————————————————————————————————————————————————————— * // 2 | // * Font sizes 3 | // * ———————————————————————————————————————————————————————— * // 4 | 5 | $font-sizes: ( 6 | xxl: 80px, 7 | xl: 70px, 8 | lg: 46px, 9 | md: 30px, 10 | sm: 16px, 11 | xs: 13px, 12 | icon: 20px, 13 | icon2x: 40px, 14 | ) !default; -------------------------------------------------------------------------------- /assets/css/variables/layout.scss: -------------------------------------------------------------------------------- 1 | $header-height: 56px; -------------------------------------------------------------------------------- /assets/css/variables/transitions.scss: -------------------------------------------------------------------------------- 1 | $standard-transition-speed: .3s; 2 | $standard-transition-easing: ease; 3 | 4 | $standard-transition: $standard-transition-speed $standard-transition-easing; 5 | $quick-transition: $standard-transition-speed / 2 $standard-transition-easing; -------------------------------------------------------------------------------- /assets/fonticons/icons_template.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: "<%= fontName %>"; 3 | src: url('<%= fontPath %><%= fontName %>.eot'); 4 | src: url('<%= fontPath %><%= fontName %>.eot?#iefix') format('eot'), 5 | url('<%= fontPath %><%= fontName %>.woff') format('woff'), 6 | url('<%= fontPath %><%= fontName %>.ttf') format('truetype'), 7 | url('<%= fontPath %><%= fontName %>.svg#<%= fontName %>') format('svg'); 8 | } 9 | 10 | @mixin <%= cssClass%>-styles { 11 | font-family: "<%= fontName %>"; 12 | -webkit-font-smoothing: antialiased; 13 | -moz-osx-font-smoothing: grayscale; 14 | font-style: normal; 15 | font-variant: normal; 16 | font-weight: normal; 17 | // speak: none; // only necessary if not using the private unicode range (firstGlyph option) 18 | text-decoration: none; 19 | text-transform: none; 20 | } 21 | 22 | %<%= cssClass%> { 23 | @include <%= cssClass%>-styles; 24 | } 25 | 26 | @function <%= cssClass%>-char($filename) { 27 | $char: ""; 28 | <% _.each(glyphs, function(glyph) { %> 29 | @if $filename == <%= glyph.fileName %> { 30 | $char: "\<%= glyph.codePoint %>"; 31 | }<% }); %> 32 | 33 | @return $char; 34 | } 35 | 36 | @mixin <%= cssClass%>($filename, $insert: before, $extend: true) { 37 | &:#{$insert} { 38 | @if $extend { 39 | @extend %<%= cssClass%>; 40 | } @else { 41 | @include <%= cssClass%>-styles; 42 | } 43 | content: <%= cssClass%>-char($filename); 44 | } 45 | } 46 | 47 | <% _.each(glyphs, function(glyph) { %>.<%= cssClass%>-<%= glyph.fileName %> { 48 | @include <%= cssClass%>(<%= glyph.fileName %>); 49 | } 50 | <% }); %> 51 | -------------------------------------------------------------------------------- /assets/fonts/fontsgohere.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/fonts/fontsgohere.txt -------------------------------------------------------------------------------- /assets/hbs_helpers/blog.js: -------------------------------------------------------------------------------- 1 | var _ = require('lodash') 2 | var Promise = require('bluebird') 3 | 4 | enduro.templating_engine.registerHelper('blog', function (options) { 5 | 6 | var pages 7 | return enduro.api.pagelist_generator.get_cms_list() 8 | .then((pagelist) => { 9 | var get_content_promises = [] 10 | pages = _.chain(pagelist.structured.blog) 11 | .filter((o) => { return typeof o === 'object' }).value() // filter pages only 12 | 13 | for (page_id in pages) { 14 | var page = pages[page_id] 15 | 16 | function get_content (page) { 17 | get_content_promises.push(enduro.api.flat.load(page.fullpath).then((content) => { page.content = content })) 18 | } 19 | 20 | get_content(page) 21 | } 22 | 23 | return Promise.all(get_content_promises) 24 | }) 25 | .then(() => { 26 | pages = _.chain(pages) 27 | .sortBy('content.$date_value').reverse() // sort by date 28 | .filter((page) => { return page.content.published }) // remove unpublished 29 | .value() 30 | 31 | return options.fn(pages) 32 | }) 33 | }) 34 | -------------------------------------------------------------------------------- /assets/img/example_files/admin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/example_files/admin.png -------------------------------------------------------------------------------- /assets/img/example_files/babel.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/example_files/babel.gif -------------------------------------------------------------------------------- /assets/img/example_files/background-image-text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/example_files/background-image-text.png -------------------------------------------------------------------------------- /assets/img/example_files/globalizer.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/example_files/globalizer.gif -------------------------------------------------------------------------------- /assets/img/example_files/icons_20.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/example_files/icons_20.ai -------------------------------------------------------------------------------- /assets/img/example_files/makingicons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/example_files/makingicons.png -------------------------------------------------------------------------------- /assets/img/example_files/retinasprites.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/example_files/retinasprites.png -------------------------------------------------------------------------------- /assets/img/example_files/templatitator.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/example_files/templatitator.gif -------------------------------------------------------------------------------- /assets/img/example_files/typedbackgroundimage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/example_files/typedbackgroundimage.png -------------------------------------------------------------------------------- /assets/img/example_files/useartboards.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/example_files/useartboards.png -------------------------------------------------------------------------------- /assets/img/favicon/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/android-icon-144x144.png -------------------------------------------------------------------------------- /assets/img/favicon/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/android-icon-192x192.png -------------------------------------------------------------------------------- /assets/img/favicon/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/android-icon-36x36.png -------------------------------------------------------------------------------- /assets/img/favicon/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/android-icon-48x48.png -------------------------------------------------------------------------------- /assets/img/favicon/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/android-icon-72x72.png -------------------------------------------------------------------------------- /assets/img/favicon/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/android-icon-96x96.png -------------------------------------------------------------------------------- /assets/img/favicon/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/apple-icon-114x114.png -------------------------------------------------------------------------------- /assets/img/favicon/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/apple-icon-120x120.png -------------------------------------------------------------------------------- /assets/img/favicon/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/apple-icon-144x144.png -------------------------------------------------------------------------------- /assets/img/favicon/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/apple-icon-152x152.png -------------------------------------------------------------------------------- /assets/img/favicon/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/apple-icon-180x180.png -------------------------------------------------------------------------------- /assets/img/favicon/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/apple-icon-57x57.png -------------------------------------------------------------------------------- /assets/img/favicon/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/apple-icon-60x60.png -------------------------------------------------------------------------------- /assets/img/favicon/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/apple-icon-72x72.png -------------------------------------------------------------------------------- /assets/img/favicon/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/apple-icon-76x76.png -------------------------------------------------------------------------------- /assets/img/favicon/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/apple-icon-precomposed.png -------------------------------------------------------------------------------- /assets/img/favicon/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/apple-icon.png -------------------------------------------------------------------------------- /assets/img/favicon/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | #ffffff -------------------------------------------------------------------------------- /assets/img/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /assets/img/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /assets/img/favicon/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/favicon-96x96.png -------------------------------------------------------------------------------- /assets/img/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/favicon.ico -------------------------------------------------------------------------------- /assets/img/favicon/favicon_144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/favicon_144.png -------------------------------------------------------------------------------- /assets/img/favicon/favicon_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/favicon_512.png -------------------------------------------------------------------------------- /assets/img/favicon/favicon_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/favicon_64.png -------------------------------------------------------------------------------- /assets/img/favicon/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "App", 3 | "icons": [ 4 | { 5 | "src": "\/android-icon-36x36.png", 6 | "sizes": "36x36", 7 | "type": "image\/png", 8 | "density": "0.75" 9 | }, 10 | { 11 | "src": "\/android-icon-48x48.png", 12 | "sizes": "48x48", 13 | "type": "image\/png", 14 | "density": "1.0" 15 | }, 16 | { 17 | "src": "\/android-icon-72x72.png", 18 | "sizes": "72x72", 19 | "type": "image\/png", 20 | "density": "1.5" 21 | }, 22 | { 23 | "src": "\/android-icon-96x96.png", 24 | "sizes": "96x96", 25 | "type": "image\/png", 26 | "density": "2.0" 27 | }, 28 | { 29 | "src": "\/android-icon-144x144.png", 30 | "sizes": "144x144", 31 | "type": "image\/png", 32 | "density": "3.0" 33 | }, 34 | { 35 | "src": "\/android-icon-192x192.png", 36 | "sizes": "192x192", 37 | "type": "image\/png", 38 | "density": "4.0" 39 | } 40 | ] 41 | } -------------------------------------------------------------------------------- /assets/img/favicon/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/ms-icon-144x144.png -------------------------------------------------------------------------------- /assets/img/favicon/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/ms-icon-150x150.png -------------------------------------------------------------------------------- /assets/img/favicon/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/ms-icon-310x310.png -------------------------------------------------------------------------------- /assets/img/favicon/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/favicon/ms-icon-70x70.png -------------------------------------------------------------------------------- /assets/img/mockups/room.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/mockups/room.jpg -------------------------------------------------------------------------------- /assets/img/press/enduro_e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/press/enduro_e.png -------------------------------------------------------------------------------- /assets/img/press/logo.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/press/logo.ai -------------------------------------------------------------------------------- /assets/img/press/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 14 | 18 | 23 | 27 | 31 | 38 | 40 | 46 | 56 | 57 | 60 | 61 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /assets/img/press/square_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/press/square_logo.jpg -------------------------------------------------------------------------------- /assets/img/temp/a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/temp/a.png -------------------------------------------------------------------------------- /assets/img/temp/bride-1822488_1920.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/assets/img/temp/bride-1822488_1920.jpg -------------------------------------------------------------------------------- /assets/img/test/upload.test: -------------------------------------------------------------------------------- 1 | this is a enduro upload test file -------------------------------------------------------------------------------- /assets/js/features/docnav.js: -------------------------------------------------------------------------------- 1 | // * ———————————————————————————————————————————————————————— * // 2 | // * docnav 3 | // * ———————————————————————————————————————————————————————— * // 4 | define( 5 | ['jquery'], 6 | function($) { 7 | 8 | var docnav = function(){} 9 | 10 | // initiation - gets called just once 11 | docnav.init = function(scroller) { 12 | 13 | scroller.scroll(function(scroll) { 14 | if($('.docs-list-placeholder').offset().top < scroll) { 15 | console.log($('.docs-list').outerWidth()) 16 | $('.docs-list').css('width', $('.docs-list').outerWidth()).addClass('slime') 17 | } else { 18 | $('.docs-list').css('width', '100%').removeClass('slime') 19 | } 20 | 21 | var closest = get_closest_heading() 22 | $(closest).addClass('active') 23 | 24 | $('.side-menu-item').removeClass('active') 25 | 26 | $('.side-menu-' + $(closest).attr('id')).addClass('active') 27 | }) 28 | 29 | } 30 | 31 | function get_closest_heading() { 32 | // shift middle screen to 1/3 33 | var screen_middle = $('body').scrollTop() + $('body').height() / 3 34 | 35 | return $('h1, h2, h3, h4').removeClass('active').toArray().reduce(function(prev, next) { 36 | return Math.abs($(next).offset().top - screen_middle) < Math.abs($(prev).offset().top - screen_middle) 37 | ? next 38 | : prev 39 | }) 40 | } 41 | 42 | return docnav 43 | } 44 | ) -------------------------------------------------------------------------------- /assets/js/handlebars.js: -------------------------------------------------------------------------------- 1 | define([ 2 | 'handlebars_core' 3 | ], function (__templating_engine) { 4 | 5 | require(['assets/hbs_helpers/hbs_helpers.js'], function(hbs_helpers_loader){ 6 | hbs_helpers_loader(__templating_engine) 7 | }); 8 | 9 | return __templating_engine; 10 | }); -------------------------------------------------------------------------------- /assets/js/main.js: -------------------------------------------------------------------------------- 1 | require.config({ 2 | baseUrl: '/assets/', 3 | 4 | paths: { 5 | // vendor dependencies 6 | jquery: 'vendor/jquery/dist/jquery.min', 7 | scroller: 'vendor/kiskabricks_scroller/scroller', 8 | 9 | // local dependencies 10 | docnav: 'js/features/docnav', 11 | }, 12 | }) 13 | 14 | require(['jquery'], function ($) { 15 | 16 | $(document).ready(function () { 17 | $('code').each(function (i, inline) { 18 | hljs.highlightBlock(inline) 19 | }) 20 | }) 21 | 22 | if ($('.docs-list').length) { 23 | require(['docnav', 'scroller'], function (docnav, scroller) { 24 | scroller.init() 25 | docnav.init(scroller) 26 | }) 27 | } 28 | 29 | }) 30 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "enduro_website", 3 | "description": "", 4 | "main": "assets/vendor/enduro/index.js", 5 | "authors": [ 6 | "gottwik@gmail.com" 7 | ], 8 | "license": "ISC", 9 | "homepage": "", 10 | "ignore": [ 11 | "**/.*", 12 | "node_modules", 13 | "bower_components", 14 | "assets/vendor", 15 | "test", 16 | "tests" 17 | ], 18 | "dependencies": { 19 | "bootstrap": "v4.0.0-alpha.2", 20 | "kiskabricks_wedgecss": "^1.0.0", 21 | "jquery": "^3.0.0", 22 | "requirejs": "^2.2.0", 23 | "font-awesome": "^4.6.3", 24 | "kiskabricks_scroller": "^1.0.0" 25 | }, 26 | "resolutions": { 27 | "jquery": "^3.0.0" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /cms/.settings.js: -------------------------------------------------------------------------------- 1 | { 2 | settings: { 3 | $admin_background_image_type: 'image', 4 | admin_background_image: 'https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1485265097_Wallpaper-Sunset-Winter.jpg', 5 | dark: true 6 | } 7 | } -------------------------------------------------------------------------------- /cms/.users.js: -------------------------------------------------------------------------------- 1 | { 2 | users: [ 3 | { 4 | username: 'gottwik', 5 | salt: 'b0306f9e001d084bbf0c8888618b30ef', 6 | hash: '18f39fb5e2cf83229d8a2fe644fda17ab8bd4907a4354cc182454ed9bb0269b3', 7 | user_created_timestamp: 1470054375378 8 | } 9 | ] 10 | } -------------------------------------------------------------------------------- /cms/generators/blog/blog.js: -------------------------------------------------------------------------------- 1 | { 2 | title: '', 3 | $date_value: '2016-12-22', 4 | $date_type: 'date', 5 | date: 'Thursday, 22 December, 2016', 6 | published: false, 7 | $doc_markdown: true, 8 | $doc_type: 'textarea', 9 | doc: '', 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '', 13 | contents: [] 14 | }, 15 | teaser: { 16 | doc: '', 17 | $image_type: 'image', 18 | image: '', 19 | $abstracted_content_hidden: true, 20 | abstracted_content: { 21 | marked_doc: '', 22 | contents: [] 23 | } 24 | }, 25 | meta: { 26 | last_edited: 1501680325 27 | } 28 | } -------------------------------------------------------------------------------- /cms/generators/blog/link-s3-to-enduro.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Link s3 to enduro', 3 | $date_value: '2017-01-24', 4 | $date_type: 'date', 5 | date: 'Tuesday, 24 January, 2017', 6 | published: true, 7 | $doc_markdown: true, 8 | $doc_type: 'textarea', 9 | doc: 'Linking enduro to aws s3 storage enables two features:\n* **Uploading** images directly to s3 from the admin interface\n* Using **juicebox** to version and backup site\'s content\n\nTo enable s3 quickly, just use `enduro setup s3`:\n\n![](https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1488921448_cp.png)\n\n## Manual setup\n\nBelow is a step-by-step guide on how to enable s3:\n\n### Link the s3 bucket\nFirst, you have to have a s3 bucket created. [Create one](http://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html) if you didn\'t do so. When you have your s3 bucket ready, just pass it\'s name to enduro in $$/enduro.json file along with the region of this bucket:\n\n```\n{\n "project_name": "Your project name",\n "project_slug": "ypn",\n "s3": {\n "bucket": "testbucket",\n "region": "eu-west-1"\n }\n}\n```\n\n### Add the aws credentials\n\nBe careful not to use the root credentials, but to use iam to create a key pair for use with s3 only. Once you have your key and secret, add it to $$/enduro_secret.json or as a environment variable:\n\n```\n{\n "secret": {\n "s3": {\n "S3_KEY": "",\n "S3_SECRET": ""\n }\n }\n}\n```\n\nWow, we are done! Now you can use juicebox, upload images to s3 from admin interface.', 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Linking enduro to aws s3 storage enables two features:

\n
    \n
  • Uploading images directly to s3 from the admin interface
  • \n
  • Using juicebox to version and backup site's content
  • \n
\n

To enable s3 quickly, just use enduro setup s3:

\n

\n

Manual setup

\n

Below is a step-by-step guide on how to enable s3:

\n\n

First, you have to have a s3 bucket created. Create one if you didn't do so. When you have your s3 bucket ready, just pass it's name to enduro in /enduro.json file along with the region of this bucket:

\n
{\n    "project_name": "Your project name",\n    "project_slug": "ypn",\n    "s3": {\n        "bucket": "testbucket",\n        "region": "eu-west-1"\n    }\n}\n

Add the aws credentials

\n

Be careful not to use the root credentials, but to use iam to create a key pair for use with s3 only. Once you have your key and secret, add it to /enduro_secret.json or as a environment variable:

\n
{\n    "secret": {\n        "s3": {\n            "S3_KEY": "<your_aws_key>",\n            "S3_SECRET": "<your_aws_secret_key>"\n        }\n    }\n}\n

Wow, we are done! Now you can use juicebox, upload images to s3 from admin interface.

\n', 13 | contents: [ 14 | { 15 | heading: 'Manual setup', 16 | level: '2', 17 | link: 'manual-setup' 18 | }, 19 | { 20 | heading: 'Link the s3 bucket', 21 | level: '3', 22 | link: 'link-the-s3-bucket' 23 | }, 24 | { 25 | heading: 'Add the aws credentials', 26 | level: '3', 27 | link: 'add-the-aws-credentials' 28 | } 29 | ] 30 | }, 31 | teaser: { 32 | doc: 'Linking enduro to aws s3 storage enables uploading images directly to s3 from the admin interface and using juicebox to version and backup site\'s content', 33 | $image_type: 'image', 34 | image: 'https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1485522666_aws.png', 35 | $abstracted_content_hidden: true, 36 | abstracted_content: { 37 | marked_doc: '

Linking enduro to aws s3 storage enables uploading images directly to s3 from the admin interface and using juicebox to version and backup site's content

\n', 38 | contents: [] 39 | } 40 | }, 41 | meta: { 42 | last_edited: 1501680325 43 | } 44 | } -------------------------------------------------------------------------------- /cms/generators/blog/multicultural-site-with-endurojs.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Multicultural site with enduro.js', 3 | $date_value: '2017-01-25', 4 | $date_type: 'date', 5 | date: 'Wednesday, 25 January, 2017', 6 | published: true, 7 | $doc_markdown: true, 8 | $doc_type: 'textarea', 9 | doc: 'Enduro.js provides multicultural pages out-of-the-box. Follow this short guide to learn how to set it up or check out the sample at https://github.com/Gottwik/enduro_samples/tree/master/multiculture\n\n## Setting up cultures\nFirst you need to define a **list of cultures** your site will be in. There is a convenient command line shortcut to do this:\n\n```\n$ enduro addculture en de fr\n```\n\nThis command tells enduro.js to generate separate pages for **en**, **de** and **fr** cultures.\n\n## Admin interface\nAdding cultures also enables comfortable switching cultures in the admin interface.\n\n![](https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1485356238_Jan-19-2017 14-18-15.gif)\n\nPro tip: You can use Cmd+1, Cmd+2, Cmd+3... to switch between cultures.\n\n\n## Routing\nAfter adding cultures, your page will be accessible by adding the culture slug in front of the url, so the german version will be at **www.yourdomain.com/de**.\n\nNotice that enduro.js will generate these culture-specific pages **in addition** to the default domain (first specified) for backward compatibility. In other words, **www.yourdomain.com/blog** will serve the same page as **www.yourdomain.com/en/blog**\n\n## Remove a culture\nThe cultures are stored in $$/cms/config/babel.js which look like this:\n\n```\n{\n cultures: [\n \'en\',\n \'de\',\n \'fr\'\n ]\n}\n```\n\nYou are free to modify this file to add, remove or edit cultures.\n\n## Like a boss\nYou can add culture_specific content by editing the content file directly with using [Termination](http://www.endurojs.com/docs/termination). Notice that the german content value just has **$** in front(that\'s the termination part) and **_de** at the end. Enduro.js parses this file and replaces `greeting` with `greeting_de` when generating the `de` culture.\n\n```\n{\n greeting: \'Hello\',\n superlative: \'nice\',\n $greeting_de: \'Guten tag\',\n $greeting_fr: \'Bonne journée\'\n}\n```', 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Enduro.js provides multicultural pages out-of-the-box. Follow this short guide to learn how to set it up or check out the sample at https://github.com/Gottwik/enduro_samples/tree/master/multiculture

\n

Setting up cultures

\n

First you need to define a list of cultures your site will be in. There is a convenient command line shortcut to do this:

\n
$ enduro addculture en de fr\n

This command tells enduro.js to generate separate pages for en, de and fr cultures.

\n

Admin interface

\n

Adding cultures also enables comfortable switching cultures in the admin interface.

\n

\n

Pro tip: You can use Cmd+1, Cmd+2, Cmd+3... to switch between cultures.

\n

Routing

\n

After adding cultures, your page will be accessible by adding the culture slug in front of the url, so the german version will be at www.yourdomain.com/de.

\n

Notice that enduro.js will generate these culture-specific pages in addition to the default domain (first specified) for backward compatibility. In other words, www.yourdomain.com/blog will serve the same page as www.yourdomain.com/en/blog

\n

Remove a culture

\n

The cultures are stored in /cms/config/babel.js which look like this:

\n
{\n    cultures: [\n        'en',\n        'de',\n        'fr'\n    ]\n}\n

You are free to modify this file to add, remove or edit cultures.

\n

Like a boss

\n

You can add culture_specific content by editing the content file directly with using Termination. Notice that the german content value just has $ in front(that's the termination part) and _de at the end. Enduro.js parses this file and replaces greeting with greeting_de when generating the de culture.

\n
{\n    greeting: 'Hello',\n    superlative: 'nice',\n    $greeting_de: 'Guten tag',\n    $greeting_fr: 'Bonne journée'\n}\n
', 13 | contents: [ 14 | { 15 | heading: 'Setting up cultures', 16 | level: '2', 17 | link: 'setting-up-cultures' 18 | }, 19 | { 20 | heading: 'Admin interface', 21 | level: '2', 22 | link: 'admin-interface' 23 | }, 24 | { 25 | heading: 'Routing', 26 | level: '2', 27 | link: 'routing' 28 | }, 29 | { 30 | heading: 'Remove a culture', 31 | level: '2', 32 | link: 'remove-a-culture' 33 | }, 34 | { 35 | heading: 'Like a boss', 36 | level: '2', 37 | link: 'like-a-boss' 38 | } 39 | ] 40 | }, 41 | teaser: { 42 | doc: 'Enduro.js provides multicultural pages out-of-the-box. Follow this short guide to learn how to set it up', 43 | $image_type: 'image', 44 | image: 'https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1485522378_aec-1822525_640.jpg', 45 | $abstracted_content_hidden: true, 46 | abstracted_content: { 47 | marked_doc: '

Enduro.js provides multicultural pages out-of-the-box. Follow this short guide to learn how to set it up

\n', 48 | contents: [] 49 | } 50 | }, 51 | meta: { 52 | last_edited: 1501680325 53 | } 54 | } -------------------------------------------------------------------------------- /cms/generators/docs/ab-testing.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'A/B testing', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: '[A/B testing](https://en.wikipedia.org/wiki/A/B_testing) is such important practice that enduro support it out of the box and setting it up could not be any easier.\n\n## Creating A/B variants\nLet\'s say we have a page in the root folder named `contact.hbs`. To create an A/B test variant just duplicate this file and add `@tag` at the end of it\'s name. Another file\'s name could for example be `contact@bigbutton.hbs`.\n\n## Serving files\nThe two files: `contact.hbs` and `contact@bigbutton.hbs` will be served with a 50% chance. You can create as many variants as you want and they will always be served in equal ratio.\n\n## Analyzing results\nYou\'ll have to use third-party tools to analyze which variant is more successful.\n\n![](https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1473688687_cp.png)\n\n### Analyzing results with Google analytics\nYou can pass page visit as an event and pass a goal event as another event. See this example:\n\n```\nga(\'send\', \'event\', \'contacttest\', \'visit\', \'smallbutton\')\n\n$(\'button.learn-more\').click(function () {\n ga(\'send\', \'event\', \'contacttest\', \'goal\', \'smallbutton\')\n})\n```\n\nThis code will register event under name `contacttest` and uses eventValue attribute to differentiate between A/B variants.\n\n## Cookie registration\nFor user interface consistency, users that received variant A will also receive variant A on any subsequent reloads. This is guaranteed by a cookie.', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

A/B testing is such important practice that enduro support it out of the box and setting it up could not be any easier.

\n

Creating A/B variants

\n

Let's say we have a page in the root folder named contact.hbs. To create an A/B test variant just duplicate this file and add @tag at the end of it's name. Another file's name could for example be contact@bigbutton.hbs.

\n

Serving files

\n

The two files: contact.hbs and contact@bigbutton.hbs will be served with a 50% chance. You can create as many variants as you want and they will always be served in equal ratio.

\n

Analyzing results

\n

You'll have to use third-party tools to analyze which variant is more successful.

\n

\n

Analyzing results with Google analytics

\n

You can pass page visit as an event and pass a goal event as another event. See this example:

\n
ga('send', 'event', 'contacttest', 'visit', 'smallbutton')\n\n$('button.learn-more').click(function () {\n    ga('send', 'event', 'contacttest', 'goal', 'smallbutton')\n})\n

This code will register event under name contacttest and uses eventValue attribute to differentiate between A/B variants.

\n\n

For user interface consistency, users that received variant A will also receive variant A on any subsequent reloads. This is guaranteed by a cookie.

\n', 13 | contents: [ 14 | { 15 | heading: 'Creating A/B variants', 16 | level: '2', 17 | link: 'creating-a-b-variants' 18 | }, 19 | { 20 | heading: 'Serving files', 21 | level: '2', 22 | link: 'serving-files' 23 | }, 24 | { 25 | heading: 'Analyzing results', 26 | level: '2', 27 | link: 'analyzing-results' 28 | }, 29 | { 30 | heading: 'Analyzing results with Google analytics', 31 | level: '3', 32 | link: 'analyzing-results-with-google-analytics' 33 | }, 34 | { 35 | heading: 'Cookie registration', 36 | level: '2', 37 | link: 'cookie-registration' 38 | } 39 | ] 40 | }, 41 | meta: { 42 | last_edited: 1501680325 43 | } 44 | } -------------------------------------------------------------------------------- /cms/generators/docs/admin-extensions.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Admin Extensions', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'There is a possibility to add functionality to the admin interface. How this works is that enduro injects all `.js` files located in $$/asset/admin_extensions/ to the admin interface upon loading.\n\nFor more advanced use cases, you might want to review the admin interface\'s code which is accessible [https://github.com/Gottwik/enduro_admin](here).\n\n## Contribute to enduro_admin\nExtending the admin interface this way is good for project-specific features. However, if you come up with an improvement, you are more than welcome to submit a pull request to the admin interface github repository.', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

There is a possibility to add functionality to the admin interface. How this works is that enduro injects all .js files located in /asset/admin_extensions/ to the admin interface upon loading.

\n

For more advanced use cases, you might want to review the admin interface's code which is accessible https://github.com/Gottwik/enduro_admin.

\n

Contribute to enduro_admin

\n

Extending the admin interface this way is good for project-specific features. However, if you come up with an improvement, you are more than welcome to submit a pull request to the admin interface github repository.

\n', 13 | contents: [ 14 | { 15 | heading: 'Contribute to enduro_admin', 16 | level: '2', 17 | link: 'contribute-to-enduro_admin' 18 | } 19 | ] 20 | }, 21 | meta: { 22 | last_edited: 1501680325 23 | } 24 | } -------------------------------------------------------------------------------- /cms/generators/docs/app.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'App', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'Enduro utilizes the power of generating static files to get the unbelievable performance and simplicity. However, it also enabled developers to either develop api endpoints or even generate endpoint pages dynamically.\n\n## app.js file\nenduro will include $$app/app.js file upon starting the server. The file looks like this:\n\n```\nvar local_app = function () {}\n\n// * ———————————————————————————————————————————————————————— * //\n// * init\n// *\n// * gets called upon starting enduro.js production server\n// * @param {express app} app - express app\n// * @return {nothing}\n// * ———————————————————————————————————————————————————————— * //\nlocal_app.prototype.init = function (app) {\n // express app available here\n // don\'t forget these routes will be available on production server server (defaults to localhost:5000)\n}\n\nmodule.exports = new local_app()\n\n```\n\nYou can easily create custom api routes like this:\n\n```\nvar local_app = function () {}\n\n// * ———————————————————————————————————————————————————————— * //\n// * init\n// *\n// * gets called upon starting enduro.js production server\n// * @param {express app} app - express app\n// * @return {nothing}\n// * ———————————————————————————————————————————————————————— * //\nlocal_app.prototype.init = function (app) {\n app.get(\'/api/get_random_number\', function (req, res) {\n res.send(Math.random().toString())\n })\n}\n\nmodule.exports = new local_app()\n\n```\n\nwhen you open `localhost:5000/api/get_random_number` you will get a different number each time, as you would expect.\n\nTo create dynamic pages, check out [temper](/docs/temper). Temper allows you to render your templates with all the global data, but with custom or extended context.', 6 | $abstracted_content_hidden: true, 7 | abstracted_content: { 8 | marked_doc: '

Enduro utilizes the power of generating static files to get the unbelievable performance and simplicity. However, it also enabled developers to either develop api endpoints or even generate endpoint pages dynamically.

\n

app.js file

\n

enduro will include app/app.js file upon starting the server. The file looks like this:

\n
var local_app = function () {}\n\n// * ———————————————————————————————————————————————————————— * //\n// *     init\n// *\n// *    gets called upon starting enduro.js production server\n// *    @param {express app} app - express app\n// *    @return {nothing}\n// * ———————————————————————————————————————————————————————— * //\nlocal_app.prototype.init = function (app) {\n    // express app available here\n    // don't forget these routes will be available on production server server (defaults to localhost:5000)\n}\n\nmodule.exports = new local_app()\n

You can easily create custom api routes like this:

\n
var local_app = function () {}\n\n// * ———————————————————————————————————————————————————————— * //\n// *     init\n// *\n// *    gets called upon starting enduro.js production server\n// *    @param {express app} app - express app\n// *    @return {nothing}\n// * ———————————————————————————————————————————————————————— * //\nlocal_app.prototype.init = function (app) {\n    app.get('/api/get_random_number', function (req, res) {\n        res.send(Math.random().toString())\n    })\n}\n\nmodule.exports = new local_app()\n

when you open localhost:5000/api/get_random_number you will get a different number each time, as you would expect.

\n

To create dynamic pages, check out temper. Temper allows you to render your templates with all the global data, but with custom or extended context.

\n', 9 | contents: [ 10 | { 11 | heading: 'app.js file', 12 | level: '2', 13 | link: 'app-js-file' 14 | } 15 | ] 16 | }, 17 | meta: { 18 | last_edited: 1510613919 19 | } 20 | } -------------------------------------------------------------------------------- /cms/generators/docs/brick-processors.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Brick processors', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'Brick processors opens enduro\'s internal processes to bricks/plugins. The idea is whenever you need to add funcionality to enduro, you just add a processor. You can add multiple processors they will be executed serially with first-registered-first-processed basis.\n\n# Usage\n\n```js\nenduro.api.brick_processors.add_processor(\'cms_context_processor\', function (cms_context) {\n # modify cms_context and return promise\n})\n```\n\n# List of processors\n* **cms_context_processor** - executes each time context is retrieved and allows you to modify context before rendering. Bear in mind, the context will be modified on the fly, and modifications will not be saved as it is with [abstractors](/docs/abstractors).\n\nIf you are building a brick and enduro doesn\'t offer processor for what you need, feel free to open a ticket, pullrequest or reach out at [gitter](https://gitter.im/Enduro-js/Lobby).', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Brick processors opens enduro's internal processes to bricks/plugins. The idea is whenever you need to add funcionality to enduro, you just add a processor. You can add multiple processors they will be executed serially with first-registered-first-processed basis.

\n

Usage

\n
enduro.api.brick_processors.add_processor('cms_context_processor', function (cms_context) {\n    # modify cms_context and return promise\n})\n
\n

List of processors

\n
    \n
  • cms_context_processor - executes each time context is retrieved and allows you to modify context before rendering. Bear in mind, the context will be modified on the fly, and modifications will not be saved as it is with abstractors.
  • \n
\n

If you are building a brick and enduro doesn't offer processor for what you need, feel free to open a ticket, pullrequest or reach out at gitter.

\n', 13 | contents: [ 14 | { 15 | heading: 'Usage', 16 | level: '1', 17 | link: 'usage' 18 | }, 19 | { 20 | heading: 'List of processors', 21 | level: '1', 22 | link: 'list-of-processors' 23 | } 24 | ] 25 | }, 26 | meta: { 27 | last_edited: 1510623546 28 | } 29 | } -------------------------------------------------------------------------------- /cms/generators/docs/built-in-helpers.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Built in helpers', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: '## Add\nAdds two numbers together\n```html\n{{add @index 2}} <<< outputs @index + 2\n```\ncan take multiple arguments\n```\n{{add 1 2 3}} outputs 6\n```\n\n## Class\nRender variable name if variable is true\n```html\n{{class \'gradient\'}} <<< will render \'gradient\' if class context.gradient is truthy\n```\ncan take multiple arguments\n```\n{{class \'gradient\' \'dark\' \'border\'}}\n```\nNote: converts underscores to dashes\n\n## Compare\nCompares two values and prints out one of two strings based on outcome of the comparison\n```\n{{compare age 20 \'this dude is exactly 20 years old\' \'hes not 20 years old}}\n```\n\n## Default\nPrints something in case that the provided variable is falsy\n```html\n{{default age 20}} <<< if no age is provided 20 will be used\n```', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Add

\n

Adds two numbers together

\n
{{add @index 2}} <<< outputs @index + 2\n
\n

can take multiple arguments

\n
{{add 1 2 3}} outputs 6\n

Class

\n

Render variable name if variable is true

\n
{{class 'gradient'}} <<< will render 'gradient' if class context.gradient is truthy\n
\n

can take multiple arguments

\n
{{class 'gradient' 'dark' 'border'}}\n

Note: converts underscores to dashes

\n

Compare

\n

Compares two values and prints out one of two strings based on outcome of the comparison

\n
{{compare age 20 'this dude is exactly 20 years old' 'hes not 20 years old}}\n

Default

\n

Prints something in case that the provided variable is falsy

\n
{{default age 20}} <<< if no age is provided 20 will be used\n
\n', 13 | contents: [ 14 | { 15 | heading: 'Add', 16 | level: '2', 17 | link: 'add' 18 | }, 19 | { 20 | heading: 'Class', 21 | level: '2', 22 | link: 'class' 23 | }, 24 | { 25 | heading: 'Compare', 26 | level: '2', 27 | link: 'compare' 28 | }, 29 | { 30 | heading: 'Default', 31 | level: '2', 32 | link: 'default' 33 | } 34 | ] 35 | }, 36 | meta: { 37 | last_edited: 1501680325 38 | } 39 | } -------------------------------------------------------------------------------- /cms/generators/docs/content-files.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Content files', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'Content is stored in content files. Content files are in $$cms folder.\n\n## Linking content to template\nScoping is very simple. Every page(.hbs file) from $$pages folder has access to file with the same name in $$cms folder.\n\n## Global content\nThere is a $$cms/global subfolder. Every content file in this directory is accessible to all pages. Content from global folder is in global object when referencing from handlebars template.\n\n## Basic example\n$$cms/index.js\n```js\n{\n name: \'martin\'\n}\n```\n\n$$cms/global/car.js\n```js\n{\n car: \'toyota\'\n}\n```\n\n$$pagez/index.hbs\n```html\n
{{name}}
\n
{{global.car}}
\n```', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Content is stored in content files. Content files are in cms folder.

\n

Linking content to template

\n

Scoping is very simple. Every page(.hbs file) from pages folder has access to file with the same name in cms folder.

\n

Global content

\n

There is a cms/global subfolder. Every content file in this directory is accessible to all pages. Content from global folder is in global object when referencing from handlebars template.

\n

Basic example

\n

cms/index.js

\n
{\n    name: 'martin'\n}\n
\n

cms/global/car.js

\n
{\n    car: 'toyota'\n}\n
\n

pagez/index.hbs

\n
<div class="user">{{name}}</div>\n<div class="car">{{global.car}}</div>\n
\n', 13 | contents: [ 14 | { 15 | heading: 'Linking content to template', 16 | level: '2', 17 | link: 'linking-content-to-template' 18 | }, 19 | { 20 | heading: 'Global content', 21 | level: '2', 22 | link: 'global-content' 23 | }, 24 | { 25 | heading: 'Basic example', 26 | level: '2', 27 | link: 'basic-example' 28 | } 29 | ] 30 | }, 31 | meta: { 32 | last_edited: 1501680325 33 | } 34 | } -------------------------------------------------------------------------------- /cms/generators/docs/context-modifiers.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Context modifiers', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'Context modifiers are very useful when building bricks. They modify all the context - every cms files based on some rules.\n\n# Example\n\nsay you have this context file:\n\n```js\n{\n $deadline_type: \'date\',\n deadline: \'2019-01-01\'\n}\n```\n\nand you decided that all date controls in your project should be full-width(you can set width of admin control by `$deadline_size: \'12\'`). To do this, you can use context modifier **add_sibling_to_type** either in your $$app/app.js or in the brick you are building:\n\n```\nenduro.api.brick_processors.add_processor(\'cms_context_processor\', function (cms_context) {\n return new Promise(function (resolve, reject) {\n\n enduro.api.context_modifiers.add_sibling_to_type(cms_context, \'date\', \'size\', 12)\n\n resolve(cms_context)\n })\n})\n```\n\n# List of modifiers\n\n## add_sibling_to_type\n* @param {cms context object} context\n* @param {string} type_to_search_for - will add siblings to all controls of this type\n* @param {string} added_termination - new termination key to add\n* @param {value} value - new value to add', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Context modifiers are very useful when building bricks. They modify all the context - every cms files based on some rules.

\n

Example

\n

say you have this context file:

\n
{\n    $deadline_type: 'date',\n    deadline: '2019-01-01'\n}\n
\n

and you decided that all date controls in your project should be full-width(you can set width of admin control by $deadline_size: '12'). To do this, you can use context modifier add_sibling_to_type either in your app/app.js or in the brick you are building:

\n
enduro.api.brick_processors.add_processor('cms_context_processor', function (cms_context) {\n    return new Promise(function (resolve, reject) {\n\n        enduro.api.context_modifiers.add_sibling_to_type(cms_context, 'date', 'size', 12)\n\n        resolve(cms_context)\n    })\n})\n

List of modifiers

\n

add_sibling_to_type

\n
    \n
  • @param {cms context object} context
  • \n
  • @param {string} type_to_search_for - will add siblings to all controls of this type
  • \n
  • @param {string} added_termination - new termination key to add
  • \n
  • @param {value} value - new value to add
  • \n
\n', 13 | contents: [ 14 | { 15 | heading: 'Example', 16 | level: '1', 17 | link: 'example' 18 | }, 19 | { 20 | heading: 'List of modifiers', 21 | level: '1', 22 | link: 'list-of-modifiers' 23 | }, 24 | { 25 | heading: 'add_sibling_to_type', 26 | level: '2', 27 | link: 'add_sibling_to_type' 28 | } 29 | ] 30 | }, 31 | meta: { 32 | last_edited: 1510623055 33 | } 34 | } -------------------------------------------------------------------------------- /cms/generators/docs/docs.js: -------------------------------------------------------------------------------- 1 | { 2 | title: '', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: '', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '', 13 | contents: [] 14 | }, 15 | meta: { 16 | last_edited: 1501680325 17 | } 18 | } -------------------------------------------------------------------------------- /cms/generators/docs/enduro-bricks.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Enduro bricks', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'Enduro bricks are plugins for enduro. Although, enduro comes with lot\'s of features built-in, with enduro bricks you can add some niche features on per-project basis.\n\n## Installing enduro bricks\nTo install enduro brick just run `enduro install `.\n\n## Example: Add wysiwyg editor\nTry creating a new project and running `enduro install enduro_quill`. This will add wysiwyg editor, [quill](https://github.com/quilljs/quill) admin control type. Use it by:\n\n```js\n{\n $blog_article_type: \'quill\',\n blog_article: \'\'\n}\n```\n\n## Developing enduro bricks\nWe worked hard to create a friendly ecosystem to build new bricks. Check out [enduro_quill](https://github.com/Gottwik/enduro_quill) to see basic example.', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Enduro bricks are plugins for enduro. Although, enduro comes with lot's of features built-in, with enduro bricks you can add some niche features on per-project basis.

\n

Installing enduro bricks

\n

To install enduro brick just run enduro install <brick_name>.

\n

Example: Add wysiwyg editor

\n

Try creating a new project and running enduro install enduro_quill. This will add wysiwyg editor, quill admin control type. Use it by:

\n
{\n    $blog_article_type: 'quill',\n    blog_article: ''\n}\n
\n

Developing enduro bricks

\n

We worked hard to create a friendly ecosystem to build new bricks. Check out enduro_quill to see basic example.

\n', 13 | contents: [ 14 | { 15 | heading: 'Installing enduro bricks', 16 | level: '2', 17 | link: 'installing-enduro-bricks' 18 | }, 19 | { 20 | heading: 'Example: Add wysiwyg editor', 21 | level: '2', 22 | link: 'example-add-wysiwyg-editor' 23 | }, 24 | { 25 | heading: 'Developing enduro bricks', 26 | level: '2', 27 | link: 'developing-enduro-bricks' 28 | } 29 | ] 30 | }, 31 | meta: { 32 | last_edited: 1510622232 33 | } 34 | } -------------------------------------------------------------------------------- /cms/generators/docs/endurojs-for-managers.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Enduro.js for managers', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'To get an idea of what enduro.js is and how you might use it, let\'s compare it to market leader - wordpress.\n\n### Easy vs fast?\nWith wordpress, it is __easy__ to build a website.\nWith enduro.js, it is __fast__ to build a website.\n\nenduro.js is not necessary easy to use. It has great, easy-to-use admin interface, but to create a web project in enduro.js you will need a professional node.js developers.\n\n### CMS vs framework\nWordpress is a __content management software__.\nEnduro.js is a __web development framework__.\n\n![](https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1470398313_wordcloud_small.png)\n\nEnduro.js has all these tools built in and is ready to be deployed in a web scale cloud delivery service of your choice.\n\n### Isomorphic javascript\nWordpress splits it\'s code to __frontend__ and __backend__.\nEnduro.js has only one language - __javascript__ all over the stack.\n\n![](https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1470385144_isojavascript_small.png)\n\nWith the technological advances of javascript and node.js, it is crazy efficient to use only one language instead of using two.\n\n### Click or code\nWith wordpress, you have __graphical__ interface to set up the project.\nWith enduro.js, you have __command line__ interface to set up the project.\n\n![](https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1470383901_Aug-05-2016%2009-58-06.gif)\n\nLook, clicking is lame and slow. I don\'t want to waste my time clicking on things, do you? If you have professionals at your company they prefer typing.', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

To get an idea of what enduro.js is and how you might use it, let's compare it to market leader - wordpress.

\n

Easy vs fast?

\n

With wordpress, it is easy to build a website.\nWith enduro.js, it is fast to build a website.

\n

enduro.js is not necessary easy to use. It has great, easy-to-use admin interface, but to create a web project in enduro.js you will need a professional node.js developers.

\n

CMS vs framework

\n

Wordpress is a content management software.\nEnduro.js is a web development framework.

\n

\n

Enduro.js has all these tools built in and is ready to be deployed in a web scale cloud delivery service of your choice.

\n

Isomorphic javascript

\n

Wordpress splits it's code to frontend and backend.\nEnduro.js has only one language - javascript all over the stack.

\n

\n

With the technological advances of javascript and node.js, it is crazy efficient to use only one language instead of using two.

\n

Click or code

\n

With wordpress, you have graphical interface to set up the project.\nWith enduro.js, you have command line interface to set up the project.

\n

\n

Look, clicking is lame and slow. I don't want to waste my time clicking on things, do you? If you have professionals at your company they prefer typing.

\n', 13 | contents: [ 14 | { 15 | heading: 'Easy vs fast?', 16 | level: '3', 17 | link: 'easy-vs-fast-' 18 | }, 19 | { 20 | heading: 'CMS vs framework', 21 | level: '3', 22 | link: 'cms-vs-framework' 23 | }, 24 | { 25 | heading: 'Isomorphic javascript', 26 | level: '3', 27 | link: 'isomorphic-javascript' 28 | }, 29 | { 30 | heading: 'Click or code', 31 | level: '3', 32 | link: 'click-or-code' 33 | } 34 | ] 35 | }, 36 | meta: { 37 | last_edited: 1501680325 38 | } 39 | } -------------------------------------------------------------------------------- /cms/generators/docs/event-hooks.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Event hooks', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'events hooks allows for external commands to be executed upon specific enduro.js\' action. Commands are specified in the $$/enduro.json file.\n\n## List of events\nCurrently only **post_update** hook is enabled.\n\n## Example\nthe post_update event below copies the $$/_generated directory into a $$../eventcopy directory.\n\n```json\n{\n "project_name": "set name here",\n "project_slug": "sn",\n "s3": {\n "bucket": "enduro.sethere",\n "region": "eu-west-1"\n },\n "juicebox_enabled": false,\n "events": {\n "post_update": "cp -R _generated/. ../eventcopy"\n }\n}\n```', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

events hooks allows for external commands to be executed upon specific enduro.js' action. Commands are specified in the /enduro.json file.

\n

List of events

\n

Currently only post_update hook is enabled.

\n

Example

\n

the post_update event below copies the /_generated directory into a ../eventcopy directory.

\n
{\n    "project_name": "set name here",\n    "project_slug": "sn",\n    "s3": {\n        "bucket": "enduro.sethere",\n        "region": "eu-west-1"\n    },\n    "juicebox_enabled": false,\n    "events": {\n        "post_update": "cp -R _generated/. ../eventcopy"\n    }\n}\n
\n', 13 | contents: [ 14 | { 15 | heading: 'List of events', 16 | level: '2', 17 | link: 'list-of-events' 18 | }, 19 | { 20 | heading: 'Example', 21 | level: '2', 22 | link: 'example' 23 | } 24 | ] 25 | }, 26 | meta: { 27 | last_edited: 1501680325 28 | } 29 | } -------------------------------------------------------------------------------- /cms/generators/docs/files-helper.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Files helper', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'Built-in files helper allows to display a list of files in your template.\n\n## Usage\n\nThe helper takes just one argument, a path relative to project\'s root folder:\n\n```html\n{{#files \'/assets/images/\'}}\n

Image: {{this.file_name_no_extension}}

\n{{/files}}\n```\n\nand returns these properties of the file:\n\n```js\n{\n absolute_path: \'/Users/123/projects/someproject/pages/index.hbs\',\n relative_path: \'/index.hbs\',\n file_name: \'index.hbs\',\n file_name_no_extension: \'index\',\n depth: 0\n}\n```', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Built-in files helper allows to display a list of files in your template.

\n

Usage

\n

The helper takes just one argument, a path relative to project's root folder:

\n
{{#files '/assets/images/'}}\n    <p>Image: {{this.file_name_no_extension}}</p>\n{{/files}}\n
\n

and returns these properties of the file:

\n
{\n    absolute_path: '/Users/123/projects/someproject/pages/index.hbs',\n    relative_path: '/index.hbs',\n    file_name: 'index.hbs',\n    file_name_no_extension: 'index',\n    depth: 0\n}\n
\n', 13 | contents: [ 14 | { 15 | heading: 'Usage', 16 | level: '2', 17 | link: 'usage' 18 | } 19 | ] 20 | }, 21 | meta: { 22 | last_edited: 1501680325 23 | } 24 | } -------------------------------------------------------------------------------- /cms/generators/docs/generators.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Generators', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'Generators allows to create multiple pages based on one template. This feature also allows content managers to create new pages.\n\n\n![](https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1474268328_generators_low.png)\n\n## Creating a generator\n* Create your handlebars template in `$$/pages/generators/:generatorname.hbs`\n* Create content file `$$/cms/generators/:generatorname/:pagename`.\n* Your page will be accessible at `/:generatorname/:pagename`\n\n## Admin UI\nAdmin is, as always, auto-pregenerated. No additional work needed. You can just create new pages easily.local\n\n![](https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1474268933_Sep-19-2016 09-08-21.gif)\n\n\n## Generator template\nWhen user adds new page throught the Admin UI, the created page will be duplicated from the first content file in the generator. If you wish, you can create a `$$/cms/generators/:generatorname/:generatorname.js` and defined the content\'s template in this file.', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Generators allows to create multiple pages based on one template. This feature also allows content managers to create new pages.

\n

\n

Creating a generator

\n
    \n
  • Create your handlebars template in /pages/generators/:generatorname.hbs
  • \n
  • Create content file /cms/generators/:generatorname/:pagename.
  • \n
  • Your page will be accessible at /:generatorname/:pagename
  • \n
\n

Admin UI

\n

Admin is, as always, auto-pregenerated. No additional work needed. You can just create new pages easily.local

\n

\n

Generator template

\n

When user adds new page throught the Admin UI, the created page will be duplicated from the first content file in the generator. If you wish, you can create a /cms/generators/:generatorname/:generatorname.js and defined the content's template in this file.

\n', 13 | contents: [ 14 | { 15 | heading: 'Creating a generator', 16 | level: '2', 17 | link: 'creating-a-generator' 18 | }, 19 | { 20 | heading: 'Admin UI', 21 | level: '2', 22 | link: 'admin-ui' 23 | }, 24 | { 25 | heading: 'Generator template', 26 | level: '2', 27 | link: 'generator-template' 28 | } 29 | ] 30 | }, 31 | meta: { 32 | last_edited: 1501680325 33 | } 34 | } -------------------------------------------------------------------------------- /cms/generators/docs/globalizer.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Globalizer', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'Globalizer links parts of contexts to other parts by refencing them with \'@@\' before the object path\n\n## Example\n\nwe have __children__:\n```js\n{\n children: [\n {\n name: \'Samuel\',\n favorite_toy: \'Mindstorms\'\n },\n {\n name: \'Tim\',\n favorite_toy: \'Duplo\'\n },\n ]\n}\n```\n\nand we have __toys__:\n```js\n{\n toys: {\n mindstorms: {\n website: \'http://www.lego.com/en-us/mindstorms\'\n },\n duplo: {\n website: \'http://www.lego.com/en-us/duplo\'\n }\n }\n}\n```\n\nglobalizer offers a way to connect these two entities.\n```js\n{\n children: [\n {\n name: \'Samuel\',\n favorite_toy: \'@@toys.mindstorms\'\n },\n {\n name: \'Tim\',\n favorite_toy: \'@@toys.duplo\'\n },\n ]\n}\n```\n\nNow we can comfortably access website of the toy by:\n```html\n{{favorite_toy.website}}\n```\n\nNot only that, the non-technical person administering the content will be able to just pick from available options:\n\n![gif showing globalizer](/assets/img/example_files/globalizer.gif)\n\n## Chaining globalizers\nYou can chain as many globalizers as you want. For example, you can do this:\n```\n{\n children: {\n samuel: {\n name: \'Samuel\',\n favorite_toy: \'@@global.toys.mindstorms\'\n },\n tim: {\n name: \'Tim\',\n favorite_toy: \'@@global.toys.duplo\'\n },\n },\n toys: {\n mindstorms: {\n website: \'http://www.lego.com/en-us/mindstorms\',\n store: \'@@global.shops.toyrus\'\n },\n duplo: {\n website: \'http://www.lego.com/en-us/duplo\'\n }\n },\n shops: {\n toyrus: {\n has_parking: true\n }\n }\n}\n```\n\nNow you can find out if the store where Samuel\'s favorite toy is sold has parking by:\n```\n {{global.children.samuel.favorite_toy.store.large}}\n```\n\n## Shallow globalizer\nTo circumvent having a circular globalizer you can use special shallow globalizer using `!@` prefix. This will not go deeper than the first link.\n\n## Limitations\nOne current limitation is that you can\'t make deep circular links\n\n```\n{\n toys: {\n mindstorms: {\n website: \'http://www.lego.com/en-us/mindstorms\',\n favorite_child: \'@@global.children\'\n },\n duplo: {\n website: \'http://www.lego.com/en-us/duplo\'\n }\n },\n children: {\n samuel: {\n name: \'Samuel\',\n favorite_toy: \'@@global.toys.mindstorms\'\n },\n tim: {\n name: \'Tim\',\n favorite_toy: \'@@global.toys.duplo\'\n },\n }\n}\n\n```', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Globalizer links parts of contexts to other parts by refencing them with '@@' before the object path

\n

Example

\n

we have children:

\n
{\n    children: [\n        {\n            name: 'Samuel'\n            favorite_toy: 'Mindstorms'\n        },\n        {\n            name: 'Tim'\n            favorite_toy: 'Duplo'\n        },\n    ]\n}\n
\n

and we have toys:

\n
{\n    toys: {\n        mindstorms: {\n            website: 'http://www.lego.com/en-us/mindstorms'\n        },\n        duplo: {\n            website: 'http://www.lego.com/en-us/duplo'\n        }\n    }\n}\n
\n

globalizer offers a way to connect these two entities.

\n
{\n    children: [\n        {\n            name: 'Samuel',\n            favorite_toy: '@@toys.mindstorms'\n        },\n        {\n            name: 'Tim',\n            favorite_toy: '@@toys.duplo'\n        },\n    ]\n}\n
\n

Now we can comfortably access website of the toy by:

\n
{{favorite_toy.website}}\n
\n

Not only that, the non-technical person administering the content will be able to just pick from available options:

\n

gif showing globalizer

\n

Chaining globalizers

\n

You can chain as many globalizers as you want. For example, you can do this:

\n
{\n    children: {\n        samuel: {\n            name: 'Samuel',\n            favorite_toy: '@@global.toys.mindstorms'\n        },\n        tim: {\n            name: 'Tim',\n            favorite_toy: '@@global.toys.duplo'\n        },\n    },\n    toys: {\n        mindstorms: {\n            website: 'http://www.lego.com/en-us/mindstorms',\n            store: '@@global.shops.toyrus'\n        },\n        duplo: {\n            website: 'http://www.lego.com/en-us/duplo'\n        }\n    },\n    shops: {\n        toyrus: {\n            has_parking: true\n        }\n    }\n}\n

Now you can find out if the store where Samuel's favorite toy is sold has parking by:

\n
    {{global.children.samuel.favorite_toy.store.has_parking}}\n

Shallow globalizer

\n

To circumvent having a circular globalizer you can use special shallow globalizer using !@ prefix. This will not go deeper than the first link.

\n

Limitations

\n

One current limitation is that you can't make deep circular links

\n
{\n    toys: {\n        mindstorms: {\n            website: 'http://www.lego.com/en-us/mindstorms',\n            favorite_child: '@@global.children'\n        },\n        duplo: {\n            website: 'http://www.lego.com/en-us/duplo'\n        }\n    },\n    children: {\n        samuel: {\n            name: 'Samuel',\n            favorite_toy: '@@global.toys.mindstorms'\n        },\n        tim: {\n            name: 'Tim',\n            favorite_toy: '@@global.toys.duplo'\n        },\n    }\n}\n
', 13 | contents: [ 14 | { 15 | heading: 'Example', 16 | level: '2', 17 | link: 'example' 18 | }, 19 | { 20 | heading: 'Chaining globalizers', 21 | level: '2', 22 | link: 'chaining-globalizers' 23 | }, 24 | { 25 | heading: 'Shallow globalizer', 26 | level: '2', 27 | link: 'shallow-globalizer' 28 | }, 29 | { 30 | heading: 'Limitations', 31 | level: '2', 32 | link: 'limitations' 33 | } 34 | ] 35 | }, 36 | meta: { 37 | last_edited: 1501680325 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /cms/generators/docs/grouped-each.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Helper - Grouped each', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: '`@!helper` `@!block helper` `@!templates`\n\n`grouped_each` helper provides way to split long array into smaller arrays of specified length.\n\n## Usage\n`{{#grouped_each :size_of_chunks :context}}`\n\n## Use case\ngrouped_each comes handy when you have a list of, say, 30 items and you want to display them 3 at a time. grouped_each will split the list of 30 items into 10 lists of 3 items and provides each list of 3 items as `{{this}}`.\n\n```html\n{{#grouped_each 3 global.documentation_list}}\n {{#each this}}\n
\n columns\n
\n {{/each}}\n
\n{{/grouped_each}}\n```\n\n## Shout out\nThanks @Timothy Robertson of https://funkjedi.com/technology/412-every-nth-item-in-handlebars/ for providing the idea and base implementation.', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

@!helper @!block helper @!templates

\n

grouped_each helper provides way to split long array into smaller arrays of specified length.

\n

Usage

\n

{{#grouped_each :size_of_chunks :context}}

\n

Use case

\n

grouped_each comes handy when you have a list of, say, 30 items and you want to display them 3 at a time. grouped_each will split the list of 30 items into 10 lists of 3 items and provides each list of 3 items as {{this}}.

\n
{{#grouped_each 3 global.documentation_list}}\n    {{#each this}}\n        <div class="col-md-4">\n            columns\n        </div>\n    {{/each}}\n        <div class="wedge"></div>\n{{/grouped_each}}\n
\n

Shout out

\n

Thanks @Timothy Robertson of https://funkjedi.com/technology/412-every-nth-item-in-handlebars/ for providing the idea and base implementation.

\n', 13 | contents: [ 14 | { 15 | heading: 'Usage', 16 | level: '2', 17 | link: 'usage' 18 | }, 19 | { 20 | heading: 'Use case', 21 | level: '2', 22 | link: 'use-case' 23 | }, 24 | { 25 | heading: 'Shout out', 26 | level: '2', 27 | link: 'shout-out' 28 | } 29 | ] 30 | }, 31 | meta: { 32 | last_edited: 1501680325 33 | } 34 | } -------------------------------------------------------------------------------- /cms/generators/docs/hello-world.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Hello world in enduro.js', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: '## Installation\nGo ahead and install enduro globally by running `npm install enduro -g`\n\n## Creating new project\nCreate a new project by running `enduro create helloworld`. Now just cd into the created directory\n\n## Run enduro\nNow that you created an enduro project, just start enduro in a development mode: `$ enduro dev`.\n\nEnduro\'s development mode has all the build tools ready for you to build your project as comfortable and efficiently as possible. Just try to change $$/assets/css/main.scss file.\n\nCheck out [working with templates](/docs/templates) and [sass](/docs/sass) to get your project started', 6 | $marked_doc_hidden: true, 7 | marked_doc: '

Installation

\n

Go ahead and install enduro globally by running npm install enduro -g

\n

Creating new project

\n

Create a new project by running enduro create helloworld. Now just cd into the created directory

\n

Run enduro

\n

Default, developer mode can be run just by typing enduro

\n

Now enduro is up and running. Feel free to look around the folder structure.

\n

Check out working with templates and sass to get your project started

\n', 8 | contents: [ 9 | { 10 | heading: 'Installation', 11 | level: '2' 12 | }, 13 | { 14 | heading: 'Creating new project', 15 | level: '2' 16 | }, 17 | { 18 | heading: 'Run enduro', 19 | level: '2' 20 | } 21 | ], 22 | $contents_hidden: true, 23 | $abstracted_content_hidden: true, 24 | abstracted_content: { 25 | marked_doc: '

Installation

\n

Go ahead and install enduro globally by running npm install enduro -g

\n

Creating new project

\n

Create a new project by running enduro create helloworld. Now just cd into the created directory

\n

Run enduro

\n

Now that you created an enduro project, just start enduro in a development mode: $ enduro dev.

\n

Enduro's development mode has all the build tools ready for you to build your project as comfortable and efficiently as possible. Just try to change /assets/css/main.scss file.

\n

Check out working with templates and sass to get your project started

\n', 26 | contents: [ 27 | { 28 | heading: 'Installation', 29 | level: '2', 30 | link: 'installation' 31 | }, 32 | { 33 | heading: 'Creating new project', 34 | level: '2', 35 | link: 'creating-new-project' 36 | }, 37 | { 38 | heading: 'Run enduro', 39 | level: '2', 40 | link: 'run-enduro' 41 | } 42 | ] 43 | }, 44 | meta: { 45 | last_edited: 1501680325 46 | } 47 | } -------------------------------------------------------------------------------- /cms/generators/docs/heroku.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Deploying on heroku', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'Enduro.js is ready to be used on heroku or any other cloud service.\n\nIf you used `$ enduro create appname` you are all set up, enduro-wise. Just follow these steps:\n* Init, add and commit your project to git `git init`, `git add .`, `git commit -m \'first commit\'`\n* Install [heroku\'s toolbelt](https://toolbelt.heroku.com/)\n* Create new heroku app: `heroku create enduro-test-app`\n* Grab git link that heroku provided and push to it: `git push master`\n\nWow, we are done. You enduro.js app is live, with admin interface and everything.', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Enduro.js is ready to be used on heroku or any other cloud service.

\n

If you used $ enduro create appname you are all set up, enduro-wise. Just follow these steps:

\n
    \n
  • Init, add and commit your project to git git init, git add ., git commit -m 'first commit'
  • \n
  • Install heroku's toolbelt
  • \n
  • Create new heroku app: heroku create enduro-test-app
  • \n
  • Grab git link that heroku provided and push to it: git push <herokugit> master
  • \n
\n

Wow, we are done. You enduro.js app is live, with admin interface and everything.

\n', 13 | contents: [] 14 | }, 15 | meta: { 16 | last_edited: 1501680325 17 | } 18 | } -------------------------------------------------------------------------------- /cms/generators/docs/iconfont-generator.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Iconfont generators', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: '![making svg icons](/assets/img/example_files/makingicons.png)\n\n\n## Iconfont generator\nJust place one icon per file in `svg` format in $$assets/fonticons . Enduro will process these files and generate an icon font and an associated stylesheet. Finally, all you need to do is include the produced `.scss` file :\n```\n@import \'../../_generated/_prebuilt/icons\';\n```\n\n### Using generated iconfont\nOnce you have included the generated scss file, you can use the icons in two ways:\n\n**In sass**\n```css\n@include icon(user)\n```\n\n**In html**\n```\n

\n

Iconfont generator

\n

Just place one icon per file in svg format in assets/fonticons . Enduro will process these files and generate an icon font and an associated stylesheet. Finally, all you need to do is include the produced .scss file :

\n
@import '../../_generated/_prebuilt/icons';\n

Using generated iconfont

\n

Once you have included the generated scss file, you can use the icons in two ways:

\n

In sass

\n
@include icon(user)\n
\n

In html

\n
<i class="icon-user></i>\n

Making icons

\n

I use adobe illustrator to create icons. Check out this sample file. To export the file, I choose 'use artboards' option, which will save as many svg files as there are artboards in the file.

\n

making svg icons

\n

Thanks to https://github.com/nfroidure/gulp-iconfont which enduro uses internally to make all this happen.

\n', 13 | contents: [ 14 | { 15 | heading: 'Iconfont generator', 16 | level: '2', 17 | link: 'iconfont-generator' 18 | }, 19 | { 20 | heading: 'Using generated iconfont', 21 | level: '3', 22 | link: 'using-generated-iconfont' 23 | }, 24 | { 25 | heading: 'Making icons', 26 | level: '3', 27 | link: 'making-icons' 28 | } 29 | ] 30 | }, 31 | meta: { 32 | last_edited: 1501680325 33 | } 34 | } -------------------------------------------------------------------------------- /cms/generators/docs/introduction-to-admin.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Introduction to admin', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'So, with enduro.js, the content is stored in flat json-like files, such as this:\n```js\n{\n title: \'My first blog post!\',\n text: \'Too bad I have nothing to write\',\n background-image: \'https://cdn.meme.am/instances/500x/66927624.jpg\'\n}\n```\n\nWhich will display this out of the box in the admin interface\n![](/assets/img/example_files/admin.png)\n\n## Awesome features\nSo you have your content defined in [content files](/docs/content-files). You can edit these content files out-of-the-box with enduro, but with [termination](/docs/termination) you can customize how the content filed is edited by user.\n\n![](https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1470382533_Aug-05-2016 09-33-55.gif)\n\n## Accessing admin\nIf you run enduro on your local machine you can access admin on `http://localhost:5000/admin`. If you are running your enduro project on a server, say on heroku, you can access it at `www.yourdomain.com/admin`\n\n## Adding users\nTo use admin interface, you must set up at least one administrator user. Do it by running `$ enduro admin add `', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

So, with enduro.js, the content is stored in flat json-like files, such as this:

\n
{\n    title: 'My first blog post!',\n    text: 'Too bad I have nothing to write',\n    background-image: 'https://cdn.meme.am/instances/500x/66927624.jpg'\n}\n
\n

Which will display this out of the box in the admin interface\n

\n

Awesome features

\n

So you have your content defined in content files. You can edit these content files out-of-the-box with enduro, but with termination you can customize how the content filed is edited by user.

\n

\n

Accessing admin

\n

If you run enduro on your local machine you can access admin on http://localhost:5000/admin. If you are running your enduro project on a server, say on heroku, you can access it at www.yourdomain.com/admin

\n

Adding users

\n

To use admin interface, you must set up at least one administrator user. Do it by running $ enduro addadmin username password

\n', 13 | contents: [ 14 | { 15 | heading: 'Awesome features', 16 | level: '2', 17 | link: 'awesome-features' 18 | }, 19 | { 20 | heading: 'Accessing admin', 21 | level: '2', 22 | link: 'accessing-admin' 23 | }, 24 | { 25 | heading: 'Adding users', 26 | level: '2', 27 | link: 'adding-users' 28 | } 29 | ] 30 | }, 31 | meta: { 32 | last_edited: 1501680325 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /cms/generators/docs/linker.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Linker', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'Enduro.js exposes some of it\'s functionality comfortably under a global variable `enduro` through the use of [linker](https://github.com/Gottwik/Enduro/blob/master/libs/linker/linker.js).\n\n## API functions\n\nYou can access these libraries under `enduro.api`\n\n* [temper](/docs/temper)\n* flat\n* flat_helpers\n* pagelist_generator\n* logger\n\n### Example usage\n\nYou can render a template in $$/pages folder dynamically by using **enduro.apitemper** in the $$/app/app.js file:\n\n```\nvar local_app = function () {}\n\nvar temper = enduro.api.temper\n\nlocal_app.prototype.init = function (app) {\n app.get(\'/random\', function (req, res) {\n temper.render(\'random\', { random_number: Math.random() })\n .then((output) => {\n res.send(output)\n })\n })\n}\n\nmodule.exports = new local_app()\n```', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Enduro.js exposes some of it's functionality comfortably under a global variable enduro through the use of linker.

\n

API functions

\n

You can access these libraries under enduro.api

\n
    \n
  • temper
  • \n
  • flat
  • \n
  • flat_helpers
  • \n
  • pagelist_generator
  • \n
  • logger
  • \n
\n

Example usage

\n

You can render a template in /pages folder dynamically by using enduro.apitemper in the /app/app.js file:

\n
var local_app = function () {}\n\nvar temper = enduro.api.temper\n\nlocal_app.prototype.init = function (app) {\n    app.get('/random', function (req, res) {\n        temper.render('random', { random_number: Math.random() })\n            .then((output) => {\n                res.send(output)\n            })\n    })\n}\n\nmodule.exports = new local_app()\n
', 13 | contents: [ 14 | { 15 | heading: 'API functions', 16 | level: '2', 17 | link: 'api-functions' 18 | }, 19 | { 20 | heading: 'Example usage', 21 | level: '3', 22 | link: 'example-usage' 23 | } 24 | ] 25 | }, 26 | meta: { 27 | last_edited: 1501680325 28 | } 29 | } -------------------------------------------------------------------------------- /cms/generators/docs/list-of-admin-control-types.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'List of admin control types', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: '## What are control types?\nWell, as you might already know, enduro provides a sweet admin ui. Control types are a way for you to tell enduro what value to expect. For example, there is a date control, which offer user an enhanced experience when a date is expected.\n\nCurrently these controls are available in enduro by default:\n\n## auto-detected types\n\n### Textfield\n`something: \'text is here\'`\n\nTextfield is the default control.\n\n### Object\n```\nsomething : {\n something_else: \'\'\n}\n```\n\n### Array\n```\nsomething : [\n { label: "first" },\n { label: "second" },\n]\n```\nArray control allows to add and remove items\n\n## Set by type termination\n\n### Image\n`$image_type : \'image\'`\n\nNice, full-featured image uploading control will let you drag in, copy/paste or just browse for an image. Fully compatible with your choice of remote file storage(such as aws s3).\n\n### File\n`$resume_type : \'file\'`\n\nSimple file uploading control that lets you drag and drop files.\n\n### Textarea\n`$text_type : \'textarea\'`\n\nSimply textarea to input longer blocks of text.\n\n### Slider\n`$value_type : \'slider\'`\n\nCreates input slider that goes from 0 to 100 by default.\n\n### Colorpicker\n`$color_type : \'colorpicker\'`\n\nStandard browser\'s colorpicker that outputs hex color code.\n\n### Title\n`$title_type : \'title\'`\n\nCreates header out of the property\'s value. Property will be non-editable though\n\n### Date\n`$published_on_type : \'date\'`\n\nCreates datepicker.\n\n### Time\n`$foo_time_type : \'time\'`\n\nCreates time selection dropdown.', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

What are control types?

\n

Well, as you might already know, enduro provides a sweet admin ui. Control types are a way for you to tell enduro what value to expect. For example, there is a date control, which offer user an enhanced experience when a date is expected.

\n

Currently these controls are available in enduro by default:

\n

auto-detected types

\n

Textfield

\n

something: 'text is here'

\n

Textfield is the default control.

\n

Object

\n
something : {\n    something_else: ''\n}\n

Array

\n
something : [\n    { label: "first" },\n    { label: "second" },\n]\n

Array control allows to add and remove items

\n

Set by type termination

\n

Image

\n

$image_type : 'image'

\n

Nice, full-featured image uploading control will let you drag in, copy/paste or just browse for an image. Fully compatible with your choice of remote file storage(such as aws s3).

\n

File

\n

$resume_type : 'file'

\n

Simple file uploading control that lets you drag and drop files.

\n

Textarea

\n

$text_type : 'textarea'

\n

Simply textarea to input longer blocks of text.

\n

Slider

\n

$value_type : 'slider'

\n

Creates input slider that goes from 0 to 100 by default.

\n

Colorpicker

\n

$color_type : 'colorpicker'

\n

Standard browser's colorpicker that outputs hex color code.

\n

Title

\n

$title_type : 'title'

\n

Creates header out of the property's value. Property will be non-editable though

\n

Date

\n

$published_on_type : 'date'

\n

Creates datepicker.

\n

Time

\n

$foo_time_type : 'time'

\n

Creates time selection dropdown.

\n', 13 | contents: [ 14 | { 15 | heading: 'What are control types?', 16 | level: '2', 17 | link: 'what-are-control-types-' 18 | }, 19 | { 20 | heading: 'auto-detected types', 21 | level: '2', 22 | link: 'auto-detected-types' 23 | }, 24 | { 25 | heading: 'Textfield', 26 | level: '3', 27 | link: 'textfield' 28 | }, 29 | { 30 | heading: 'Object', 31 | level: '3', 32 | link: 'object' 33 | }, 34 | { 35 | heading: 'Array', 36 | level: '3', 37 | link: 'array' 38 | }, 39 | { 40 | heading: 'Set by type termination', 41 | level: '2', 42 | link: 'set-by-type-termination' 43 | }, 44 | { 45 | heading: 'Image', 46 | level: '3', 47 | link: 'image' 48 | }, 49 | { 50 | heading: 'File', 51 | level: '3', 52 | link: 'file' 53 | }, 54 | { 55 | heading: 'Textarea', 56 | level: '3', 57 | link: 'textarea' 58 | }, 59 | { 60 | heading: 'Slider', 61 | level: '3', 62 | link: 'slider' 63 | }, 64 | { 65 | heading: 'Colorpicker', 66 | level: '3', 67 | link: 'colorpicker' 68 | }, 69 | { 70 | heading: 'Title', 71 | level: '3', 72 | link: 'title' 73 | }, 74 | { 75 | heading: 'Date', 76 | level: '3', 77 | link: 'date' 78 | }, 79 | { 80 | heading: 'Time', 81 | level: '3', 82 | link: 'time' 83 | } 84 | ] 85 | }, 86 | meta: { 87 | last_edited: 1501680325 88 | } 89 | } -------------------------------------------------------------------------------- /cms/generators/docs/made-with-enduro.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Made with enduro badge', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'If you enjoy using enduro.js, you can always add \'made with enduro.js\' badge at your site.\n\n\nUse this code to do so:\n```\n\n```', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

If you enjoy using enduro.js, you can always add 'made with enduro.js' badge at your site.

\n

Use this code to do so:

\n
<a href="http://www.endurojs.com/" target="_blank"><img src="https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1484647615_made_with_enduro.png" srcset="https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1484647615_made_with_enduro.png 1x, https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1484647617_made_with_enduro@2x.png 2x"></a>\n
', 13 | contents: [] 14 | }, 15 | meta: { 16 | last_edited: 1501680325 17 | } 18 | } -------------------------------------------------------------------------------- /cms/generators/docs/multilingual-support.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Multilingual support', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'Enduro comes with multilingual support built-in and easy to set up. Just run `$ enduro culture add en de` and you can add translations\n\n![](/assets/img/example_files/babel.gif)\n\n## Links\nAfter you\'ve added cultures, the default homepage will be www.yourdomain.com/en. If you had a page named info, it\'s url will now be www.yourdomain.com/en/info.\n\n## Admin interface\nNo additional setup necessary.\n\n## Default language\nIf no translation is provided, the first language is used.\n\n## Removing, reordering languages\nCurrently there is no cli command that will do this for you, but it\'s super easy to edit the settings file manually. It\'s located in $$cms/config/babel.js and look like this:\n```\n{\n cultures: [\n \'en\',\n \'de\'\n ]\n}\n```', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Enduro comes with multilingual support built-in and easy to set up. Just run $ enduro culture add en de and you can add translations

\n

\n\n

After you've added cultures, the default homepage will be www.yourdomain.com/en. If you had a page named info, it's url will now be www.yourdomain.com/en/info.

\n

Admin interface

\n

No additional setup necessary.

\n

Default language

\n

If no translation is provided, the first language is used.

\n

Removing, reordering languages

\n

Currently there is no cli command that will do this for you, but it's super easy to edit the settings file manually. It's located in cms/config/babel.js and look like this:

\n
{\n    cultures: [\n        'en',\n        'de'\n    ]\n}\n
', 13 | contents: [ 14 | { 15 | heading: 'Links', 16 | level: '2', 17 | link: 'links' 18 | }, 19 | { 20 | heading: 'Admin interface', 21 | level: '2', 22 | link: 'admin-interface' 23 | }, 24 | { 25 | heading: 'Default language', 26 | level: '2', 27 | link: 'default-language' 28 | }, 29 | { 30 | heading: 'Removing, reordering languages', 31 | level: '2', 32 | link: 'removing-reordering-languages' 33 | } 34 | ] 35 | }, 36 | meta: { 37 | last_edited: 1501680325 38 | } 39 | } -------------------------------------------------------------------------------- /cms/generators/docs/netlify.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Deploying with Netlify', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'The awesome [Netlify service](https://app.netlify.com/) is ideal for enduro.js workflow. It is ready to host your enduro.js static website for an unbeatable price (or even for free, check out their [pricing](https://www.netlify.com/pricing/)) and the deployment process could not be easier.\n\n![](https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1488293175_netlify_feelsgood_horizontal.png)\n\n## Getting ready\n\nYou only need two things for this to work:\n* Enduro.js project (pssst, you can just `enduro theme mirror`)\n* [Netlify cli tools](https://www.netlify.com/docs/#quickstart) (`npm install netlify-cli -g`)\n\n## Deploying your website\n\n### Manual deploy\n\nThis is shockingly easy: Just do `enduro render && netlify deploy -p _generated` and your website is live.\n\nTo break this down:\n* `enduro render` will generate all the static files and stage everything into a $$_generated subfolder.\n* `netlify deploy` will create a new Netlify app\n* `-p _generated` will specify that you will be wanting to upload the $$_generated folder.\n\n![](https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1488353875_cp.png)\n\n### Doing this properly with Github\n\nNetlify can be linked to a Github repository. This way, Netlify will rebuild the static website each time you update your git repository. This is the proper way to do this.\n\nAll you need to do is initiate `netlify init` command. Notice, that you have to have an origin set up **with ssh**.\n\nWhen the cli process prompts you, just input these values.\n\n| Prompt | Value |\n|--------------------- |-------------- |\n| Directory to deploy | _generated |\n| Build command | enduro build |\n\nThen it just takes about a minute for Netlify to build your website.\n\n![](https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1488355577_cp.png)\n\n### No cli approach\n\nJust for the sake of providing all options, you can also just drag the $$_generated folder into Netlify web user interface and it will work awesomely. Whatever. It is dead simple and it works.\n\n![](https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1488356406_cp.png)\n\n\n## Limitations\nNetlify offers purely static hosting. If your project has some api functionality or you\'ve set up some pages to be dynamic you\'ll have to use node.js hosting such as [heroku](http://www.endurojs.com/docs/heroku). With Netlify you won\'t be able to use admin interface to change your website. You\'ll have to use localhost:5000/admin or just change the files manually.', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

The awesome Netlify service is ideal for enduro.js workflow. It is ready to host your enduro.js static website for an unbeatable price (or even for free, check out their pricing) and the deployment process could not be easier.

\n

\n

Getting ready

\n

You only need two things for this to work:

\n
    \n
  • Enduro.js project (pssst, you can just enduro theme mirror)
  • \n
  • Netlify cli tools (npm install netlify-cli -g)
  • \n
\n

Deploying your website

\n

Manual deploy

\n

This is shockingly easy: Just do enduro render && netlify deploy -p _generated and your website is live.

\n

To break this down:

\n
    \n
  • enduro render will generate all the static files and stage everything into a _generated subfolder.
  • \n
  • netlify deploy will create a new Netlify app
  • \n
  • -p _generated will specify that you will be wanting to upload the _generated folder.
  • \n
\n

\n

Doing this properly with Github

\n

Netlify can be linked to a Github repository. This way, Netlify will rebuild the static website each time you update your git repository. This is the proper way to do this.

\n

All you need to do is initiate netlify init command. Notice, that you have to have an origin set up with ssh.

\n

When the cli process prompts you, just input these values.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
PromptValue
Directory to deploy_generated
Build commandenduro build
\n

Then it just takes about a minute for Netlify to build your website.

\n

\n

No cli approach

\n

Just for the sake of providing all options, you can also just drag the _generated folder into Netlify web user interface and it will work awesomely. Whatever. It is dead simple and it works.

\n

\n

Limitations

\n

Netlify offers purely static hosting. If your project has some api functionality or you've set up some pages to be dynamic you'll have to use node.js hosting such as heroku. With Netlify you won't be able to use admin interface to change your website. You'll have to use localhost:5000/admin or just change the files manually.

\n', 13 | contents: [ 14 | { 15 | heading: 'Getting ready', 16 | level: '2', 17 | link: 'getting-ready' 18 | }, 19 | { 20 | heading: 'Deploying your website', 21 | level: '2', 22 | link: 'deploying-your-website' 23 | }, 24 | { 25 | heading: 'Manual deploy', 26 | level: '3', 27 | link: 'manual-deploy' 28 | }, 29 | { 30 | heading: 'Doing this properly with Github', 31 | level: '3', 32 | link: 'doing-this-properly-with-github' 33 | }, 34 | { 35 | heading: 'No cli approach', 36 | level: '3', 37 | link: 'no-cli-approach' 38 | }, 39 | { 40 | heading: 'Limitations', 41 | level: '2', 42 | link: 'limitations' 43 | } 44 | ] 45 | }, 46 | meta: { 47 | last_edited: 1501680325 48 | } 49 | } -------------------------------------------------------------------------------- /cms/generators/docs/object-control-type.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Object control type', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'Object control type is the most simple control that is created by a simple javascript object:\n```\nblog_article: {}\n```\nWill result in this:\n\n![](https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1473411617_cp.png)\n\n## Available terminations\n* noframe\n* expander\n\n### Noframe\nCompletely removes the frame around the object.\n\nUsage:\n```\n$blog_article_noframe: true,\nblog_article: {}\n```\n\n### Expander\nMakes the object collapsible in the admin interface. Good for deeply nested or large objects.\n\nUsage:\n```\n$blog_article_expander: true,\nblog_article: {}\n```', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Object control type is the most simple control that is created by a simple javascript object:

\n
blog_article: {}\n

Will result in this:

\n

\n

Available terminations

\n
    \n
  • noframe
  • \n
  • expander
  • \n
\n

Noframe

\n

Completely removes the frame around the object.

\n

Usage:

\n
$blog_article_noframe: true,\nblog_article: {}\n

Expander

\n

Makes the object collapsible in the admin interface. Good for deeply nested or large objects.

\n

Usage:

\n
$blog_article_expander: true,\nblog_article: {}\n
', 13 | contents: [ 14 | { 15 | heading: 'Available terminations', 16 | level: '2', 17 | link: 'available-terminations' 18 | }, 19 | { 20 | heading: 'Noframe', 21 | level: '3', 22 | link: 'noframe' 23 | }, 24 | { 25 | heading: 'Expander', 26 | level: '3', 27 | link: 'expander' 28 | } 29 | ] 30 | }, 31 | meta: { 32 | last_edited: 1501680325 33 | } 34 | } -------------------------------------------------------------------------------- /cms/generators/docs/sass.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Sass', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'Enduro comes with sass. All `.scss` files that are located directly in $$assets/css , not in subfolders gets compiled. The compiled `.css` files end up in $$_generated/assets/css so they can be imported like this:\n```\n\n```\n\n## Globbing\nTo import whole directory, just do: `@import \'mixins/*\';`\n\nThanks to [https://github.com/mathisonian/gulp-sass-bulk-import](Gulp-sass-bulk-import) for this\n\n## Autoprefixer\nAutoprefixer is present with these settings\n```\n{\n browsers: [\'last 2 versions\'],\n cascade: false,\n}\n```', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Enduro comes with sass. All .scss files that are located directly in assets/css , not in subfolders gets compiled. The compiled .css files end up in _generated/assets/css so they can be imported like this:

\n
<link rel="stylesheet" href="/assets/css/main.css">\n

Globbing

\n

To import whole directory, just do: @import 'mixins/*';

\n

Thanks to https://github.com/mathisonian/gulp-sass-bulk-import for this

\n

Autoprefixer

\n

Autoprefixer is present with these settings

\n
{\n    browsers: ['last 2 versions'],\n    cascade: false,\n}\n
', 13 | contents: [ 14 | { 15 | heading: 'Globbing', 16 | level: '2', 17 | link: 'globbing' 18 | }, 19 | { 20 | heading: 'Autoprefixer', 21 | level: '2', 22 | link: 'autoprefixer' 23 | } 24 | ] 25 | }, 26 | meta: { 27 | last_edited: 1501680325 28 | } 29 | } -------------------------------------------------------------------------------- /cms/generators/docs/spritesheet-generator.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Spritesheet generator', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'Enduro.js has spritesheet generation built-in.\n\n## Save all sprites\nSave all your sprites to $$assets/spriteicons. These sprites should be *png* and you also need to save a double sized sprite, with @2x added at the end of the name.\n\n![retina sprites](/assets/img/example_files/retinasprites.png)\n\n## Include sass file\nThe spritesheet generation process will generate a **.scss** file that stores coordinates for each sprite. You have to include this file in your main.scss file. Use syntax below to include this file.\n\n```\n@import \'../../_generated/_prebuilt/sprites\';\n```\n\n## Use the sprites\nYou can access the sprites with a convenient mixin `@include retina-sprite($);`. This mixin will set the background image, its position and its size.\n\nCredits to https://github.com/Ensighten/spritesmith, which enduro.js uses internally to provide support for retina sprites.', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Enduro.js has spritesheet generation built-in.

\n

Save all sprites

\n

Save all your sprites to assets/spriteicons. These sprites should be png and you also need to save a double sized sprite, with @2x added at the end of the name.

\n

retina sprites

\n

Include sass file

\n

The spritesheet generation process will generate a .scss file that stores coordinates for each sprite. You have to include this file in your main.scss file. Use syntax below to include this file.

\n
@import '../../_generated/_prebuilt/sprites';\n

Use the sprites

\n

You can access the sprites with a convenient mixin @include retina-sprite($<original_file_name>);. This mixin will set the background image, its position and its size.

\n

Credits to https://github.com/Ensighten/spritesmith, which enduro.js uses internally to provide support for retina sprites.

\n', 13 | contents: [ 14 | { 15 | heading: 'Save all sprites', 16 | level: '2', 17 | link: 'save-all-sprites' 18 | }, 19 | { 20 | heading: 'Include sass file', 21 | level: '2', 22 | link: 'include-sass-file' 23 | }, 24 | { 25 | heading: 'Use the sprites', 26 | level: '2', 27 | link: 'use-the-sprites' 28 | } 29 | ] 30 | }, 31 | meta: { 32 | last_edited: 1501680325 33 | } 34 | } -------------------------------------------------------------------------------- /cms/generators/docs/static-pages.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Deploying static pages', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'Enduro is so, so much more than a static page generator. It has a admin interface, all kinds of extensibility and raw node.js power to do whatever the project needs. However, there is no shame to use enduro to generate static pages.\n\n## src folder\nAfter you run enduro, it will build the whole project into $$_generated folder. If you are happy with your site and want to publish it only, say on github pages, just grab the $$_generated folder, upload it and you are done.', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Enduro is so, so much more than a static page generator. It has a admin interface, all kinds of extensibility and raw node.js power to do whatever the project needs. However, there is no shame to use enduro to generate static pages.

\n

src folder

\n

After you run enduro, it will build the whole project into _generated folder. If you are happy with your site and want to publish it only, say on github pages, just grab the _generated folder, upload it and you are done.

\n', 13 | contents: [ 14 | { 15 | heading: 'src folder', 16 | level: '2', 17 | link: 'src-folder' 18 | } 19 | ] 20 | }, 21 | meta: { 22 | last_edited: 1501680325 23 | } 24 | } -------------------------------------------------------------------------------- /cms/generators/docs/temper.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Temper', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'Temper renders a template with a provided context.\n\n`function render(filename, context)`\n* **@ filename** (string) - path to the template relative to the $$/pages folder.\n* **@ context** (object) - data to be passed onto the handlebars template\n* **> returns** (promise) with processed html data as a payload\n\n## Example usage\n\n$$/pages/user.hbs content:\n\n```\n
user\'s name: {{user_name}}
\n```\n\nWe can render this template by create an express route in the $$/app/app.js file:\n\n```\napp.get(\'/user\', function (req, res) {\n enduro.api.temper.render(\'user\', { user_name: \'martin\' })\n .then((output) => {\n res.send(output)\n })\n})\n```', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Temper renders a template with a provided context.

\n

function render(filename, context)

\n
    \n
  • @ filename (string) - path to the template relative to the /pages folder.
  • \n
  • @ context (object) - data to be passed onto the handlebars template
  • \n
  • > returns (promise) with processed html data as a payload
  • \n
\n

Example usage

\n

/pages/user.hbs content:

\n
<div>user's name: {{user_name}}</div>\n

We can render this template by create an express route in the /app/app.js file:

\n
app.get('/user', function (req, res) {\n    enduro.api.temper.render('user', { user_name: 'martin' })\n        .then((output) => {\n            res.send(output)\n        })\n})\n
', 13 | contents: [ 14 | { 15 | heading: 'Example usage', 16 | level: '2', 17 | link: 'example-usage' 18 | } 19 | ] 20 | }, 21 | meta: { 22 | last_edited: 1501680325 23 | } 24 | } -------------------------------------------------------------------------------- /cms/generators/docs/templates.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Working with templates', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: '## Handlebars\nEnduro is built around [http://handlebarsjs.com/](handlebars) templates.\n\n## Templates\nTo include a variable in your template, wrap it in two sets of curly braces. Like this:\n```\n
\n

{{title}}

\n

{{text}}

\n
\n```\n\n## Context\nSo where does the title and text come from? For every page in the $$pages folder there is a javascript object file in $$cms folder. For this case, the context file will look like this\n```js\n{\n title: \'enduro\',\n text: \'everybody loves enduro\'\n}\n```\n\n## Components\nOne good idea is to split up the page into smaller parts - components. For example, let\'s create a footer component and save it in the `components` folder:\n```\n
\n 2016 enduro.js\n
\n```\n\nNow you can comfortably include it in the homepage by adding `{{>footer}}`.\n\nNote: whatever folder structure there is in the components directory, components are registered by the file name only.\n\n## Block components\nAnother option is to create a block component, which wraps around whatever is inside. Let\'s create a body component that looks like this:\n```\n
\n 2016 enduro.js\n
\n\n{{>@partial-block}}\n\n
\n 2016 enduro.js\n
\n```\n\nNow it\'s ready to be used like this:\n```html\n{{#>body}}\n Content goes here\n{{/body}}\n```\n\n## Helpers\nHandlebars is logicless templating engine - so no mixing in code. Only way to built complex templates are using helpers.\n\nFor example: `{{lorem 20}}` will print random 20 lorem words.\n\nHandlebars itself has some built-in helpers such as {{#if}} {{#each}} - Checkout the list here: [Handlebars helpers](http://handlebarsjs.com/builtin_helpers.html)\n\n### Built in helpers\nI decided to include some handy helpers directly in enduro. Check out the list here: [Built-in helpers](/docs/built-in-helpers)\n\n### Custom helpers\nYou can, and probably will have to write your own helpers. Just add .js files in assets/hbs_helpers.\n\nCheck out this slug helper:\n\n```\n// * ———————————————————————————————————————————————————————— * //\n// * slug helper\n// * ———————————————————————————————————————————————————————— * //\n\n__templating_engine.registerHelper("slug", function (input) {\n return input.toString().toLowerCase()\n .replace(/s+/g, \'-\') // Replace spaces with -\n .replace(/[^w-]+/g, \'\') // Remove all non-word chars\n .replace(/--+/g, \'-\') // Replace multiple - with single -\n .replace(/^-+/, \'\') // Trim - from start of text\n .replace(/-+$/, \'\') // Trim - from end of text\n});\n```', 6 | $contents_hidden: true, 7 | $abstracted_content_hidden: true, 8 | abstracted_content: { 9 | marked_doc: '

Handlebars

\n

Enduro is built around http://handlebarsjs.com/ templates.

\n

Templates

\n

To include a variable in your template, wrap it in two sets of curly braces. Like this:

\n
<div>\n    <h2>{{title}}</h2>\n    <h2>{{text}}</h2>\n</div>\n

Context

\n

So where does the title and text come from? For every page in the pages folder there is a javascript object file in cms folder. For this case, the context file will look like this

\n
{\n    title: 'enduro',\n    text: 'everybody loves enduro'\n}\n
\n

Components

\n

One good idea is to split up the page into smaller parts - components. For example, let's create a footer component and save it in the components folder:

\n
<footer>\n    2016 enduro.js\n</footer>\n

Now you can comfortably include it in the homepage by adding {{>footer}}.

\n

Note: whatever folder structure there is in the components directory, components are registered by the file name only.

\n

Block components

\n

Another option is to create a block component, which wraps around whatever is inside. Let's create a body component that looks like this:

\n
<header>\n    2016 enduro.js\n</header>\n\n{{>@partial-block}}\n\n<footer>\n    2016 enduro.js\n</footer>\n

Now it's ready to be used like this:

\n
{{#>body}}\n    Content goes here\n{{/body}}\n
\n

Helpers

\n

Handlebars is logicless templating engine - so no mixing in code. Only way to built complex templates are using helpers.

\n

For example: {{lorem 20}} will print random 20 lorem words.

\n

Handlebars itself has some built-in helpers such as {{#if}} {{#each}} - Checkout the list here: Handlebars helpers

\n

Built in helpers

\n

I decided to include some handy helpers directly in enduro. Check out the list here: Built-in helpers

\n

Custom helpers

\n

You can, and probably will have to write your own helpers. Just add .js files in assets/hbs_helpers.

\n

Check out this slug helper:

\n
// * ———————————————————————————————————————————————————————— * //\n// *    slug helper\n// * ———————————————————————————————————————————————————————— * //\n\n__templating_engine.registerHelper("slug", function (input) {\n    return input.toString().toLowerCase()\n        .replace(/s+/g, '-') // Replace spaces with -\n        .replace(/[^w-]+/g, '') // Remove all non-word chars\n        .replace(/--+/g, '-') // Replace multiple - with single -\n        .replace(/^-+/, '') // Trim - from start of text\n        .replace(/-+$/, '') // Trim - from end of text\n});\n
', 10 | contents: [ 11 | { 12 | heading: 'Handlebars', 13 | level: '2', 14 | link: 'handlebars' 15 | }, 16 | { 17 | heading: 'Templates', 18 | level: '2', 19 | link: 'templates' 20 | }, 21 | { 22 | heading: 'Context', 23 | level: '2', 24 | link: 'context' 25 | }, 26 | { 27 | heading: 'Components', 28 | level: '2', 29 | link: 'components' 30 | }, 31 | { 32 | heading: 'Block components', 33 | level: '2', 34 | link: 'block-components' 35 | }, 36 | { 37 | heading: 'Helpers', 38 | level: '2', 39 | link: 'helpers' 40 | }, 41 | { 42 | heading: 'Built in helpers', 43 | level: '3', 44 | link: 'built-in-helpers' 45 | }, 46 | { 47 | heading: 'Custom helpers', 48 | level: '3', 49 | link: 'custom-helpers' 50 | } 51 | ] 52 | }, 53 | meta: { 54 | last_edited: 1501680325 55 | } 56 | } -------------------------------------------------------------------------------- /cms/generators/docs/termination.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Termination', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'Termination is adding information to data fields that is used exclusively by admin interface. You can specify all kinds of properties, such as types, limitations, hide/show things, remove frames, size the input fields and much more\n\nGeneraly, to use any termination, you prepend dollar sign -\'$\' and add termination property after a underscore. So if you have field `name`, you can hide it from admin by `$name_hidden: true`.\n\n## Example\nThis \n```\n{\n background_image: \'https://cdn.meme.am/instances/500x/66927624.jpg\'\n}\n```\nGives you this\n\n![](/assets/img/example_files/background-image-text.png)\n\nBut what is much cooler is saying the background_image field is an image. Like this:\n```\n{\n $background_image_type: \'image\',\n background_image: \'https://cdn.meme.am/instances/500x/66927624.jpg\'\n}\n```\n\n![](/assets/img/example_files/typedbackgroundimage.png)\n\nCheck out the available types to choose from at [List of admin control types](/docs/list-of-admin-control-types)', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Termination is adding information to data fields that is used exclusively by admin interface. You can specify all kinds of properties, such as types, limitations, hide/show things, remove frames, size the input fields and much more

\n

Generaly, to use any termination, you prepend dollar sign -'$' and add termination property after a underscore. So if you have field name, you can hide it from admin by $name_hidden: true.

\n

Example

\n

This

\n
{\n    background_image: 'https://cdn.meme.am/instances/500x/66927624.jpg'\n}\n

Gives you this

\n

\n

But what is much cooler is saying the background_image field is an image. Like this:

\n
{\n    $background_image_type: 'image',\n    background_image: 'https://cdn.meme.am/instances/500x/66927624.jpg'\n}\n

\n

Check out the available types to choose from at List of admin control types

\n', 13 | contents: [ 14 | { 15 | heading: 'Example', 16 | level: '2', 17 | link: 'example' 18 | } 19 | ] 20 | }, 21 | meta: { 22 | last_edited: 1501680325 23 | } 24 | } -------------------------------------------------------------------------------- /cms/generators/docs/themes.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Enduro themes', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'Enduro.js themes are the best way to get you up and running as fast as possible. They are also great first contact to enduro.js since you get to see the finished product, which you can then just tweak to your liking.\n\nTo see which themes are available, just visit [Theme manager homepage](/themes).\n\n![](https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1487880073_themes_intro.jpg)\n\n## Getting started with enduro.js themes\nFirst you have to make sure you have node.js installed on your machine. Second prerequisite is having enduro.js installed globally (just run `npm i enduro -g`).\n\n## Create a project out of a theme\nTo start just run:\n\n```bash\n$ enduro theme mirror\n```\n\nThis will find a **mirror** theme, download it, install its npm and bower dependencies and start enduro.js. Then you can just go to localhost:5000/admin to put in your content and make finished website\n\n![](https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1487936465_theme_cli_screenshot.png)\n\n## How to deploy your page\nOnce you fill you content there are two ways you can make the page accessible:\n\n### Static hosting\nenduro.js [pregenerates static html files](/docs/static-pages), which you can just upload to a server and serve statically. No node.js required. Some providers even allows you to host a static page for free - check out [github pages](https://pages.github.com/)\n\n### Node.js dynamic hosting\nThis will run enduro on a server and provide you with same admin functionality as if you were using localhost. I suggest you use heroku for this [Heroku](/docs/heroku). It\'s affordable and easy to use.\n\n## Creating enduro.js themes\nenduro.js theme is just an enduro.js project made in a general enough way so it can be used by other people just by changing the content. Everybody is more than welcome to contribute by creating a pull request to [Github repository](https://github.com/Gottwik/enduro_website/blob/master/cms/global/theme_manager/themes.js) of this website. The file is quite self-explanatory.', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Enduro.js themes are the best way to get you up and running as fast as possible. They are also great first contact to enduro.js since you get to see the finished product, which you can then just tweak to your liking.

\n

To see which themes are available, just visit Theme manager homepage.

\n

\n

Getting started with enduro.js themes

\n

First you have to make sure you have node.js installed on your machine. Second prerequisite is having enduro.js installed globally (just run npm i enduro -g).

\n

Create a project out of a theme

\n

To start just run:

\n
$ enduro theme mirror\n
\n

This will find a mirror theme, download it, install its npm and bower dependencies and start enduro.js. Then you can just go to localhost:5000/admin to put in your content and make finished website

\n

\n

How to deploy your page

\n

Once you fill you content there are two ways you can make the page accessible:

\n

Static hosting

\n

enduro.js pregenerates static html files, which you can just upload to a server and serve statically. No node.js required. Some providers even allows you to host a static page for free - check out github pages

\n

Node.js dynamic hosting

\n

This will run enduro on a server and provide you with same admin functionality as if you were using localhost. I suggest you use heroku for this Heroku. It's affordable and easy to use.

\n

Creating enduro.js themes

\n

enduro.js theme is just an enduro.js project made in a general enough way so it can be used by other people just by changing the content. Everybody is more than welcome to contribute by creating a pull request to Github repository of this website. The file is quite self-explanatory.

\n', 13 | contents: [ 14 | { 15 | heading: 'Getting started with enduro.js themes', 16 | level: '2', 17 | link: 'getting-started-with-enduro-js-themes' 18 | }, 19 | { 20 | heading: 'Create a project out of a theme', 21 | level: '2', 22 | link: 'create-a-project-out-of-a-theme' 23 | }, 24 | { 25 | heading: 'How to deploy your page', 26 | level: '2', 27 | link: 'how-to-deploy-your-page' 28 | }, 29 | { 30 | heading: 'Static hosting', 31 | level: '3', 32 | link: 'static-hosting' 33 | }, 34 | { 35 | heading: 'Node.js dynamic hosting', 36 | level: '3', 37 | link: 'node-js-dynamic-hosting' 38 | }, 39 | { 40 | heading: 'Creating enduro.js themes', 41 | level: '2', 42 | link: 'creating-enduro-js-themes' 43 | } 44 | ] 45 | }, 46 | meta: { 47 | last_edited: 1501680325 48 | } 49 | } -------------------------------------------------------------------------------- /cms/generators/docs/trollhunter.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Basic website login', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'Enduro offers no-setup basic login for under-construction or internal projects. This login will hold off website crawlers or random visitors. To keep things simple, the authentication is done by **passphrase only** - no username/password. This feature is called [trollhunter](https://en.wikipedia.org/wiki/Trollhunters) based book and netflix show by the same name\n\n![](https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1485182293_cp.png)\n\n## How to set up trollhunter\nEnduro\'s cli offers a convenient cli command `enduro secure ` which will enable this feature and set the passphrase.\n\n## How to turn off trollhunter\nJust delete file $$/.enduro_secure in the root folder.', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Enduro offers no-setup basic login for under-construction or internal projects. This login will hold off website crawlers or random visitors. To keep things simple, the authentication is done by passphrase only - no username/password. This feature is called trollhunter based book and netflix show by the same name

\n

\n

How to set up trollhunter

\n

Enduro's cli offers a convenient cli command enduro secure <passphrase> which will enable this feature and set the passphrase.

\n

How to turn off trollhunter

\n

Just delete file /.enduro_secure in the root folder.

\n', 13 | contents: [ 14 | { 15 | heading: 'How to set up trollhunter', 16 | level: '2', 17 | link: 'how-to-set-up-trollhunter' 18 | }, 19 | { 20 | heading: 'How to turn off trollhunter', 21 | level: '2', 22 | link: 'how-to-turn-off-trollhunter' 23 | } 24 | ] 25 | }, 26 | meta: { 27 | last_edited: 1501680325 28 | } 29 | } -------------------------------------------------------------------------------- /cms/generators/docs/using-s3-as-filesystem.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'Link s3 to enduro', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'Linking enduro to aws s3 storage enables two features:\n* **Uploading** images directly to s3 from the admin interface\n* Using **juicebox** to version and backup site\'s content\n\nTo enable s3 quickly, just use `enduro setup s3`:\n\n![](https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1488921448_cp.png)\n\nWow, we are done! Now you can use juicebox, upload images to s3 from admin interface.\n\n## Manual setup\n\nBelow is a step-by-step guide on how to enable s3:\n\n### Link the s3 bucket\nFirst, you have to have a s3 bucket created. [Create one](http://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html) if you didn\'t do so. When you have your s3 bucket ready, just pass it\'s name to enduro in $$/enduro.json file along with the region of this bucket:\n\n```\n{\n "project_name": "Your project name",\n "project_slug": "ypn",\n "s3": {\n "bucket": "testbucket",\n "region": "eu-west-1"\n }\n}\n```\n\n### Add the aws credentials\n\nBe careful not to use the root credentials, but to use iam to create a key pair for use with s3 only. Once you have your key and secret, add it to $$/enduro_secret.json or as a environment variable:\n\n```\n{\n "secret": {\n "s3": {\n "S3_KEY": "",\n "S3_SECRET": ""\n }\n }\n}\n```\n\n### Cloudfront\nCloudfront is a cdn from aws. If you want to use it, just add cloudfront variable into the s3 object in $$/enduro.json file.\n\n```\n{\n "project_name": "enduro website",\n "project_slug": "ew",\n "s3": {\n "bucket": "enduro.website",\n "region": "eu-west-1",\n "cloudfront": "d32ujqjov16ho0.cloudfront.net"\n },\n "juicebox_enabled": true\n}\n```\n\n### Limitations\nCurrently, using s3 Frankfurt - eu-central-1 location is not possible.', 6 | $abstracted_content_hidden: true, 7 | abstracted_content: { 8 | marked_doc: '

Linking enduro to aws s3 storage enables two features:

\n
    \n
  • Uploading images directly to s3 from the admin interface
  • \n
  • Using juicebox to version and backup site's content
  • \n
\n

To enable s3 quickly, just use enduro setup s3:

\n

\n

Wow, we are done! Now you can use juicebox, upload images to s3 from admin interface.

\n

Manual setup

\n

Below is a step-by-step guide on how to enable s3:

\n\n

First, you have to have a s3 bucket created. Create one if you didn't do so. When you have your s3 bucket ready, just pass it's name to enduro in /enduro.json file along with the region of this bucket:

\n
{\n    "project_name": "Your project name",\n    "project_slug": "ypn",\n    "s3": {\n        "bucket": "testbucket",\n        "region": "eu-west-1"\n    }\n}\n

Add the aws credentials

\n

Be careful not to use the root credentials, but to use iam to create a key pair for use with s3 only. Once you have your key and secret, add it to /enduro_secret.json or as a environment variable:

\n
{\n    "secret": {\n        "s3": {\n            "S3_KEY": "<your_aws_key>",\n            "S3_SECRET": "<your_aws_secret_key>"\n        }\n    }\n}\n

Cloudfront

\n

Cloudfront is a cdn from aws. If you want to use it, just add cloudfront variable into the s3 object in /enduro.json file.

\n
{\n    "project_name": "enduro website",\n    "project_slug": "ew",\n    "s3": {\n        "bucket": "enduro.website",\n        "region": "eu-west-1",\n        "cloudfront": "d32ujqjov16ho0.cloudfront.net"\n    },\n    "juicebox_enabled": true\n}\n

Limitations

\n

Currently, using s3 Frankfurt - eu-central-1 location is not possible.

\n', 9 | contents: [ 10 | { 11 | heading: 'Manual setup', 12 | level: '2', 13 | link: 'manual-setup' 14 | }, 15 | { 16 | heading: 'Link the s3 bucket', 17 | level: '3', 18 | link: 'link-the-s3-bucket' 19 | }, 20 | { 21 | heading: 'Add the aws credentials', 22 | level: '3', 23 | link: 'add-the-aws-credentials' 24 | }, 25 | { 26 | heading: 'Cloudfront', 27 | level: '3', 28 | link: 'cloudfront' 29 | }, 30 | { 31 | heading: 'Limitations', 32 | level: '3', 33 | link: 'limitations' 34 | } 35 | ] 36 | }, 37 | teaser: { 38 | doc: 'Linking enduro to aws s3 storage enables uploading images directly to s3 from the admin interface and using juicebox to version and backup site\'s content', 39 | $image_type: 'image', 40 | image: 'https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1485522666_aws.png', 41 | $abstracted_content_hidden: true, 42 | abstracted_content: { 43 | marked_doc: '

Linking enduro to aws s3 storage enables uploading images directly to s3 from the admin interface and using juicebox to version and backup site's content

\n', 44 | contents: [] 45 | } 46 | }, 47 | meta: { 48 | last_edited: 1501680325 49 | } 50 | } -------------------------------------------------------------------------------- /cms/generators/docs/what-is-enduro.js: -------------------------------------------------------------------------------- 1 | { 2 | title: 'What is enduro', 3 | $doc_markdown: true, 4 | $doc_type: 'textarea', 5 | doc: 'Enduro.js is to developers what kitchen is to chefs. You can make a meal in a kitchen; you can make a website with enduro.js. Easy as that.\n\n## Blazing fast start\nFrom zero to deployed website in 30 seconds?\n\n![enduro create](http://i.imgur.com/DtxhA7z.gif)\n\n\n## Beautiful admin interface\nNo-effort, auto-generated admin interface.\n\n![](https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1470730877_Aug-09-2016 10-17-32.gif)\n\n\n## Collection of tools\nYou can think of enduro.js as a collection of tools that enables making a website from zero to live, deployed website\n\n![](https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1470731928_blob)\n\n## Built for professionals\nDeveloping a web project in enduro.js is optimized for use by professional developers. In the end it is a command line tool and a decent knowledge of html, sass, templating engines, node.js is required to do anything.\n\n![](https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1470732193_Aug-09-2016 10-42-42.gif)\n\nThat being said, enduro.js automatically produces a smooth admin interface for comfortable adding and editing of content. This admin interface is designed with a cutting-edge ease-of-use and your clients will love it.', 6 | $marked_doc_hidden: true, 7 | marked_doc: '', 8 | contents: [], 9 | $contents_hidden: true, 10 | $abstracted_content_hidden: true, 11 | abstracted_content: { 12 | marked_doc: '

Enduro.js is to developers what kitchen is to chefs. You can make a meal in a kitchen; you can make a website with enduro.js. Easy as that.

\n

Blazing fast start

\n

From zero to deployed website in 30 seconds?

\n

enduro create

\n

Beautiful admin interface

\n

No-effort, auto-generated admin interface.

\n

\n

Collection of tools

\n

You can think of enduro.js as a collection of tools that enables making a website from zero to live, deployed website

\n

\n

Built for professionals

\n

Developing a web project in enduro.js is optimized for use by professional developers. In the end it is a command line tool and a decent knowledge of html, sass, templating engines, node.js is required to do anything.

\n

\n

That being said, enduro.js automatically produces a smooth admin interface for comfortable adding and editing of content. This admin interface is designed with a cutting-edge ease-of-use and your clients will love it.

\n', 13 | contents: [ 14 | { 15 | heading: 'Blazing fast start', 16 | level: '2', 17 | link: 'blazing-fast-start' 18 | }, 19 | { 20 | heading: 'Beautiful admin interface', 21 | level: '2', 22 | link: 'beautiful-admin-interface' 23 | }, 24 | { 25 | heading: 'Collection of tools', 26 | level: '2', 27 | link: 'collection-of-tools' 28 | }, 29 | { 30 | heading: 'Built for professionals', 31 | level: '2', 32 | link: 'built-for-professionals' 33 | } 34 | ] 35 | }, 36 | meta: { 37 | last_edited: 1501680325 38 | } 39 | } -------------------------------------------------------------------------------- /cms/global/documentation/documentation_list.js: -------------------------------------------------------------------------------- 1 | { 2 | $documentation_list_size: 12, 3 | documentation_list: [ 4 | { 5 | label: 'Understanding enduro', 6 | topics: [ 7 | { 8 | label: 'What is enduro' 9 | }, 10 | { 11 | label: 'Enduro.js for managers' 12 | }, 13 | { 14 | label: 'Themes' 15 | } 16 | ] 17 | }, 18 | { 19 | label: 'Getting started', 20 | topics: [ 21 | { 22 | label: 'Hello world' 23 | }, 24 | { 25 | label: 'Templates' 26 | }, 27 | { 28 | label: 'Content files' 29 | } 30 | ] 31 | }, 32 | { 33 | label: 'Using Enduro.js', 34 | topics: [ 35 | { 36 | label: 'Cli' 37 | }, 38 | { 39 | label: 'App' 40 | }, 41 | { 42 | label: 'Ab testing' 43 | }, 44 | { 45 | label: 'Juicebox' 46 | }, 47 | { 48 | label: 'Generators' 49 | } 50 | ] 51 | }, 52 | { 53 | label: 'Build tools', 54 | topics: [ 55 | { 56 | label: 'Sass' 57 | }, 58 | { 59 | label: 'Iconfont generator' 60 | }, 61 | { 62 | label: 'Spritesheet generator' 63 | } 64 | ] 65 | }, 66 | { 67 | label: 'Advanced features', 68 | topics: [ 69 | { 70 | label: 'Abstractors' 71 | }, 72 | { 73 | label: 'Globalizer' 74 | }, 75 | { 76 | label: 'Templatitator' 77 | }, 78 | { 79 | label: 'Multilingual support' 80 | }, 81 | { 82 | label: 'Linker' 83 | }, 84 | { 85 | label: 'Trollhunter' 86 | } 87 | ] 88 | }, 89 | { 90 | label: 'Admin interface', 91 | topics: [ 92 | { 93 | label: 'Introduction to admin' 94 | }, 95 | { 96 | label: 'Termination' 97 | }, 98 | { 99 | label: 'List of admin control types' 100 | } 101 | ] 102 | }, 103 | { 104 | label: 'Deployment', 105 | topics: [ 106 | { 107 | label: 'Heroku' 108 | }, 109 | { 110 | label: 'Static pages' 111 | }, 112 | { 113 | label: 'Netlify' 114 | } 115 | ] 116 | }, 117 | { 118 | label: 'Admin controls', 119 | topics: [ 120 | { 121 | label: 'Object control type' 122 | } 123 | ] 124 | }, 125 | { 126 | label: 'Built-in helpers', 127 | topics: [ 128 | { 129 | label: 'Grouped each' 130 | } 131 | ] 132 | }, 133 | { 134 | label: 'Enduro\'s libraries', 135 | topics: [ 136 | { 137 | label: 'temper' 138 | } 139 | ] 140 | }, 141 | { 142 | label: 'Misc', 143 | topics: [ 144 | { 145 | label: 'Made with enduro' 146 | } 147 | ] 148 | }, 149 | { 150 | label: 'Enduro bricks', 151 | topics: [ 152 | { 153 | label: 'Enduro bricks' 154 | }, 155 | { 156 | label: 'Context modifiers' 157 | }, 158 | { 159 | label: 'Brick processors' 160 | } 161 | ] 162 | } 163 | ], 164 | meta: { 165 | last_edited: 1510623577 166 | } 167 | } -------------------------------------------------------------------------------- /cms/global/navigation/mainmenu.js: -------------------------------------------------------------------------------- 1 | { 2 | mainmenu: { 3 | items: [ 4 | { 5 | label: 'Home', 6 | link: '/', 7 | new_window: false 8 | }, 9 | { 10 | label: 'Themes', 11 | link: '/themes', 12 | new_window: false 13 | }, 14 | { 15 | label: 'Documentation', 16 | link: '/docs', 17 | new_window: false 18 | }, 19 | { 20 | label: 'Blog', 21 | link: '/blog', 22 | new_window: false 23 | }, 24 | { 25 | label: 'Demo', 26 | link: 'http://demo.endurojs.com/admin', 27 | new_window: true 28 | } 29 | ] 30 | }, 31 | meta: { 32 | last_edited: 1501680325 33 | } 34 | } -------------------------------------------------------------------------------- /cms/global/theme_manager/themes.js: -------------------------------------------------------------------------------- 1 | { 2 | themes: [ 3 | { 4 | name: 'mirror', 5 | $preview_image_type: 'image', 6 | preview_image: 'https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1487946946_mirror.jpg', 7 | description: 'Simple and minimalistic personal portfolio theme', 8 | author: 'Martin Gottweis', 9 | git_repository: 'https://github.com/Gottwik/enduro_mirror.git', 10 | gz_link: 'https://github.com/Gottwik/enduro_mirror/archive/master.tar.gz', 11 | tags: [ 12 | { 13 | tag: 'personal' 14 | }, 15 | { 16 | tag: 'portfolio' 17 | }, 18 | { 19 | tag: 'resume' 20 | }, 21 | { 22 | tag: 'freelancer' 23 | }, 24 | { 25 | tag: 'jobhunting' 26 | } 27 | ] 28 | }, 29 | { 30 | name: 'enblog', 31 | $preview_image_type: 'image', 32 | preview_image: 'https://d32ujqjov16ho0.cloudfront.net/direct_uploads/1499771480_image.png', 33 | description: 'Dead simple yet custmizable enduro.js blog', 34 | author: 'Cosmo Myzrail Gorynych', 35 | git_repository: 'https://github.com/CosmoMyzrailGorynych/enblog_theme.git', 36 | gz_link: 'https://github.com/CosmoMyzrailGorynych/enblog_theme/archive/master.tar.gz', 37 | tags: [ 38 | { 39 | tag: 'blog' 40 | }, 41 | { 42 | tag: 'personal' 43 | }, 44 | { 45 | tag: 'travel' 46 | } 47 | ] 48 | } 49 | ], 50 | meta: { 51 | last_edited: 1501680325 52 | } 53 | } -------------------------------------------------------------------------------- /cms/index.js: -------------------------------------------------------------------------------- 1 | { 2 | $background_video_type: 'video', 3 | background_video: 'https://d32ujqjov16ho0.cloudfront.net/direct_uploads/1473692861_Skyline.mp4', 4 | $background_video_poster_type: 'image', 5 | background_video_poster: 'https://d32ujqjov16ho0.cloudfront.net/direct_uploads/1473748977_videobg.jpg', 6 | heading: 'Enduro.js', 7 | tagline: 'Minimalistic, lean & mean, node.js cms', 8 | features_heading: 'Why enduro?', 9 | meta: { 10 | last_edited: 1501680325 11 | } 12 | } -------------------------------------------------------------------------------- /cms/press.js: -------------------------------------------------------------------------------- 1 | { 2 | press_items: [ 3 | { 4 | $file_type: 'image', 5 | file: 'https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1483439572_enduro_e.png', 6 | $preview_image_type: 'image', 7 | preview_image: 'https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1483439993_wb01vp9sr2dl2pam7vi.png', 8 | name: 'Small \'E\' in hexagon', 9 | filetype: 'png' 10 | }, 11 | { 12 | $file_type: 'image', 13 | file: 'https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1483439682_logo.svg', 14 | $preview_image_type: 'image', 15 | preview_image: 'https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1483439978_ky0mjwht2rkvyj5rk9.png', 16 | name: 'Full enduro logo', 17 | filetype: 'svg' 18 | }, 19 | { 20 | $file_type: 'image', 21 | file: 'https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1484646517_built_with_enduro.svg', 22 | $preview_image_type: 'image', 23 | preview_image: 'https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1484646509_pprb9gm7y7eczui9kke29.png', 24 | name: 'Built with enduro.js', 25 | filetype: 'svg' 26 | }, 27 | { 28 | $file_type: 'image', 29 | file: 'https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1484647422_made_with_enduro.psd', 30 | $preview_image_type: 'image', 31 | preview_image: 'https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1484647476_k6ludni09zelcpiudi.png', 32 | name: 'Built with enduro.js', 33 | filetype: 'psd' 34 | }, 35 | { 36 | $file_type: 'image', 37 | file: 'https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1484647615_made_with_enduro.png', 38 | $preview_image_type: 'image', 39 | preview_image: 'https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1484647635_o1jtlsej2wdo83hyw4s4i.png', 40 | name: 'Built with enduro.js', 41 | filetype: 'png' 42 | }, 43 | { 44 | $file_type: 'image', 45 | file: 'https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1484647617_made_with_enduro@2x.png', 46 | $preview_image_type: 'image', 47 | preview_image: 'https://s3-eu-west-1.amazonaws.com/enduro.website/direct_uploads/1484647639_hj27cysfnyr37jw3tyb9.png', 48 | name: 'Built with enduro.js - retina', 49 | filetype: 'png' 50 | } 51 | ], 52 | meta: { 53 | last_edited: 1501680325 54 | } 55 | } -------------------------------------------------------------------------------- /components/layout/body.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | enduro.js - {{default title 'minimalistic, lean & mean, node.js cms for professionals'}} 5 | 6 | 7 | 8 | 9 | 10 | 11 | {{>favicon}} 12 | {{>keywords}} 13 | 14 | 15 | 16 | 25 | 26 | 27 | 28 |
29 | 32 | {{>mainmenu}} 33 |
34 |
35 | 36 | {{>@partial-block}} 37 | 38 | {{>footer}} 39 | 40 | 41 | -------------------------------------------------------------------------------- /components/layout/favicon.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /components/layout/footer.hbs: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

Shout out to pexels and freepik

5 |
6 |
7 | 8 |
9 |
10 | 11 |
12 | 13 |
14 | 42 |
43 | 44 |
45 | 62 |
63 | 64 | 67 | 68 |
69 | 70 |
71 | 76 |
77 | 78 |
79 |
-------------------------------------------------------------------------------- /components/layout/keywords.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /components/layout/mainmenu.hbs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /components/parts/badges.hbs: -------------------------------------------------------------------------------- 1 | {{!-- badges --}} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /components/vector_components/logo_juste.hbs: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /enduro.json: -------------------------------------------------------------------------------- 1 | { 2 | "project_name": "enduro website", 3 | "project_slug": "ew", 4 | "s3": { 5 | "bucket": "enduro.website", 6 | "region": "eu-west-1", 7 | "cloudfront": "d32ujqjov16ho0.cloudfront.net" 8 | }, 9 | "juicebox_enabled": true 10 | } 11 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "enduro_website", 3 | "version": "1.0.0", 4 | "description": "Official website for enduro.js", 5 | "repository": "https://github.com/Gottwik/enduro_website", 6 | "main": "assets/vendor/enduro/index.js", 7 | "scripts": { 8 | "postinstall": "./node_modules/bower/bin/bower install", 9 | "start": "node_modules/.bin/enduro start" 10 | }, 11 | "author": "Martin Gottweis", 12 | "license": "MIT", 13 | "dependencies": { 14 | "bower": "^1.7.7", 15 | "enduro": "1.4.42", 16 | "glob": "^7.1.1", 17 | "lodash": "^4.17.4", 18 | "marked": "^0.3.6", 19 | "mongodb": "^2.2.24", 20 | "request-promise": "^4.1.1" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /pages/blog.hbs: -------------------------------------------------------------------------------- 1 | {{#>body title="enduro.js blog"}} 2 | 3 |
4 |
5 | 6 |
7 |
8 | {{#blog}} 9 | {{#each this}} 10 | 27 | {{/each}} 28 | {{/blog}} 29 |
30 |
31 | {{/body}} -------------------------------------------------------------------------------- /pages/docs.hbs: -------------------------------------------------------------------------------- 1 | {{#>body}} 2 |
3 |
4 |
5 |

Documentation

6 |
7 |
8 | 9 |
10 |
11 |
12 | 39 | 40 |
41 |
42 | 43 |
44 |
45 |
46 | {{#grouped_each 3 global.documentation_list}} 47 | {{#each this}} 48 |
49 |
50 |
51 |

{{label}}

52 |
    53 | {{#each topics}} 54 |
  • {{label}}
  • 55 | {{/each}} 56 |
57 |
58 |
59 |
60 | {{/each}} 61 |
62 | {{/grouped_each}} 63 |
64 |
65 |
66 | {{/body}} -------------------------------------------------------------------------------- /pages/generators/blog.hbs: -------------------------------------------------------------------------------- 1 | {{#>body title=title}} 2 |
3 |
4 |
5 | 6 | Back to blog 7 | 8 |
9 |
10 |

{{title}}

11 |
{{date}}
12 |
13 |
{{{abstracted_content.marked_doc}}}
14 |
15 |
16 | 17 | Back to blog 18 | 19 |
20 |
21 | 22 | 30 | 31 | 32 |
33 | 34 | 35 | {{/body}} -------------------------------------------------------------------------------- /pages/generators/docs.hbs: -------------------------------------------------------------------------------- 1 | {{#>body title=title}} 2 |
3 |
4 |
5 | 6 | Back to topic list 7 | 8 |
9 |
10 |

{{title}}

11 |
{{{abstracted_content.marked_doc}}}
12 |
13 |
14 |
15 |
    16 | {{#each abstracted_content.contents}} 17 |
  • 18 | {{heading}} 19 |
  • 20 | {{/each}} 21 |
22 |
23 |
24 | 25 | Back to topic list 26 | 27 |
28 |
29 | 30 | 31 | {{/body}} -------------------------------------------------------------------------------- /pages/index.hbs: -------------------------------------------------------------------------------- 1 | {{#>body}} 2 |
3 | 6 |
7 | 8 |
9 |

{{heading}}

10 |

{{tagline}}

11 |
12 | {{>badges}} 13 |
14 | 15 |
16 |
17 | Demo 18 | Install 19 |
20 | 21 |
22 |
23 | 24 |
25 |
26 |

{{features_heading}}

27 |
28 |
29 | {{#each global.features}} 30 |
31 | 32 |

{{title}}

33 |

{{{linkified_text}}}

34 |
35 | {{/each}} 36 |
37 |
38 |
39 |
40 | 41 | 51 | 52 | {{/body}} -------------------------------------------------------------------------------- /pages/press.hbs: -------------------------------------------------------------------------------- 1 | {{#>body}} 2 | 3 |
4 |
5 | 6 |
7 |
8 |
9 | {{#each press_items}} 10 |
11 |
12 | 13 |
14 |
{{filetype}}
15 |
16 |

{{name}}

17 | Download 18 |
19 |
20 | {{/each}} 21 |
22 |
23 |
24 | 25 | 26 | {{/body}} -------------------------------------------------------------------------------- /pages/themes.hbs: -------------------------------------------------------------------------------- 1 | {{#>body}} 2 | 3 | 4 |
5 |
6 |
7 |

enduro.js themes

8 |

Enduro.js themes are the best way to get you up and running as fast as possible. To learn more about how themes work read the themes documentation page

9 |
10 |
11 |
12 | 13 |
14 |
15 |
16 | {{#each global.themes}} 17 |
18 |
19 | 20 |

{{name}}

21 |

{{description}}

22 |
23 | {{#each tags}} 24 |
{{tag}}
25 | {{/each}} 26 |
27 |
28 | 29 | $ enduro theme {{name}} 30 | 31 | Github 32 |
33 |
34 | {{/each}} 35 |
36 |
37 |
38 | 39 | 40 | {{/body}} -------------------------------------------------------------------------------- /support_files/blog_static_database_queries.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gottwik/enduro_website/20d88b8cc4df55a5e4f5cda4f28fbcb35a9e489a/support_files/blog_static_database_queries.ai --------------------------------------------------------------------------------