├── .editorconfig ├── .gitattributes ├── .github └── FUNDING.yml ├── .gitignore ├── .jshintrc ├── .travis.yml ├── README.md ├── app ├── index.js └── templates │ ├── Gruntfile.js │ ├── LICENSE │ ├── README.md │ ├── _package.json │ ├── ascii │ ├── umbraco-logo.txt │ └── umbraco-text.txt │ ├── basic │ ├── app │ │ ├── scripts │ │ │ └── controllers │ │ │ │ └── name.controller.js │ │ ├── styles │ │ │ └── name.less │ │ └── views │ │ │ └── name.html │ └── config │ │ └── package.manifest │ ├── config │ ├── _package.nuspec │ ├── _package.xml │ └── readme.txt │ ├── gitignore │ ├── google-maps │ ├── app │ │ ├── scripts │ │ │ └── controllers │ │ │ │ └── name.controller.js │ │ ├── styles │ │ │ └── name.less │ │ └── views │ │ │ └── name.html │ └── config │ │ └── package.manifest │ ├── markdown-editor │ ├── app │ │ ├── scripts │ │ │ └── controllers │ │ │ │ └── name.controller.js │ │ ├── styles │ │ │ └── name.less │ │ └── views │ │ │ └── name.html │ └── config │ │ └── package.manifest │ └── test │ ├── app.conf.js │ ├── karma.conf.js │ └── specs │ └── name.controller.spec.js ├── package.json ├── test ├── test-creation.js └── test-load.js ├── yo-umbraco-grunt-target.gif ├── yo-umbraco-grunt.gif ├── yo-umbraco.gif ├── yo-umbraco.sublime-project └── yo-umbraco.sublime-workspace /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: warrenbuckley # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | temp/ 3 | generator-umbraco-sublime-proj.sublime-project 4 | generator-umbraco-sublime-proj.sublime-workspace 5 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "node": true, 3 | "esnext": true, 4 | "bitwise": true, 5 | "camelcase": true, 6 | "curly": true, 7 | "eqeqeq": true, 8 | "immed": true, 9 | "indent": 2, 10 | "latedef": true, 11 | "newcap": true, 12 | "noarg": true, 13 | "quotmark": "single", 14 | "regexp": true, 15 | "undef": true, 16 | "unused": true, 17 | "strict": true, 18 | "trailing": true, 19 | "smarttabs": true, 20 | "white": true 21 | } 22 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '0.10' 4 | before_install: 5 | - currentfolder=${PWD##*/} 6 | - if [ "$currentfolder" != 'generator-umbraco' ]; then cd .. && eval "mv $currentfolder generator-umbraco" && cd generator-umbraco; fi 7 | 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # generator-umbraco [](https://travis-ci.org/warrenbuckley/generator-umbraco) [](https://waffle.io/warrenbuckley/generator-umbraco) 2 | 3 | > An Umbraco [Yeoman](http://yeoman.io) generator 4 | 5 | ## Getting Started 6 | 7 | ### What is Yeoman? 8 | 9 | Trick question. It's not a thing. It's this guy: 10 | 11 |  12 | 13 | Basically, he wears a top hat, lives in your computer, and waits for you to tell him what kind of application you wish to create. 14 | 15 | Not every new computer comes with a Yeoman pre-installed. He lives in the [npm](https://npmjs.org) package repository. You only have to ask for him once, then he packs up and moves into your hard drive. *Make sure you clean up, he likes new and shiny things.* 16 | 17 | ``` 18 | npm install -g yo 19 | ``` 20 | 21 | ### Yeoman Generators 22 | 23 | Yeoman travels light. He didn't pack any generators when he moved in. You can think of a generator like a plug-in. You get to choose what type of application you wish to create, such as a Backbone application or even a Chrome extension. 24 | 25 | To install generator-umbraco from npm, run: 26 | 27 | ``` 28 | npm install -g generator-umbraco 29 | ``` 30 | 31 | Finally, initiate the generator: 32 | 33 | ``` 34 | yo umbraco 35 | ``` 36 |  37 | 38 | 39 | The friendly YeoMan will ask you some questions about creating your Umbraco property editor and then go off and scaffold it all for you to start building your own Umbraco property editor. 40 | 41 | Once you have YeoMan create the Umbraco Property Editor for you you can use the power of GruntJS build tool to help build the property editor. If you have GruntJS already installed then you will not need to run the command below. 42 | 43 | ``` 44 | npm install -g grunt-cli 45 | ``` 46 | 47 | ### Grunt Tasks 48 | There are several grunt tasks you can run from the folder where YeoMan has copied the folder & files for you, make sure you chaneg directory to that folder then you can run the following commands: 49 | 50 |  51 | 52 | 53 | #### General Build 54 | ``` 55 | grunt 56 | ``` 57 | 58 | #### Build NuGet Package 59 | ``` 60 | grunt nuget 61 | ``` 62 | 63 | #### Build Umbraco Package 64 | ``` 65 | grunt package 66 | ``` 67 | 68 | #### Automatically watch & build files 69 | This will monitor the Less, Javascript & HTML files for you and build, concat & copy them as needed every time you save a file. 70 | ``` 71 | grunt watch 72 | ``` 73 | 74 | #### Test with an Umbraco Site 75 | You can easily copy your property editor to an Umbraco site to test it out. This will copy the folder that gets run when calling grunt. You simply need to specify the root of the Umbraco site by specifiying a target switch. 76 | ``` 77 | grunt --target=c:\inetpub\wwwroot\my-umbraco-site\ 78 | ``` 79 | 80 | #### Unit test your controller 81 | Your property editor comes with a basic test setup for unit testing the editors controller. This is done with [Jasmine](http://jasmine.github.io/2.0/introduction.html) and [Karma](http://karma-runner.github.io/0.12/index.html) 82 | 83 | To run your unit tests: 84 | ``` 85 | grunt test 86 | ``` 87 | 88 | **Notice**: To run unit tests you have to copy over all Umbraco's core javascript files. Which you can do by setting -target to point at your /umbraco/ directory, you only have to do this once. 89 | 90 | ``` 91 | grunt test --target=c:\inetpub\wwwroot\my-umbraco-site\umbraco 92 | ``` 93 | 94 | 95 | 96 | 97 |  98 | -------------------------------------------------------------------------------- /app/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var util = require('util'); 4 | var path = require('path'); 5 | var yeoman = require('yeoman-generator'); 6 | var chalk = require('chalk'); 7 | var changeCase = require('change-case'); 8 | 9 | var UmbracoGenerator = yeoman.generators.Base.extend({ 10 | init: function () { 11 | this.pkg = yeoman.file.readJSON(path.join(__dirname, '../package.json')); 12 | 13 | this.on('end', function () { 14 | if (!this.options['skip-install']) { 15 | console.log(chalk.green('Installing npm dependencies')); 16 | process.chdir(this.names.alias); 17 | this.npmInstall(); 18 | } 19 | }); 20 | }, 21 | 22 | askFor: function () { 23 | var done = this.async(); 24 | 25 | //Umbraco ASCII Art 26 | var ascii = this.readFileAsString(path.join(this.sourceRoot(), '/ascii/umbraco-text.txt')); 27 | console.log(chalk.green(ascii)); 28 | 29 | //Add in some version info 30 | console.log(chalk.green('Version: ' + this.pkg.version )); 31 | console.log(chalk.green('Author: ' + this.pkg.author.name )); 32 | console.log(chalk.green('Contributors: ' + this.pkg.contributors[0].name + ' & ' + this.pkg.contributors[1].name + ' & ' + this.pkg.contributors[2].name)); 33 | 34 | console.log(chalk.yellow("Hello there! Let's create an Umbraco Property Editor.\n")); 35 | 36 | var prompts = [ 37 | { 38 | name: 'name', 39 | message: 'Name', 40 | default: 'Awesome Property Editor' 41 | }, 42 | { 43 | name: 'description', 44 | message: 'Description', 45 | default: 'An Umbraco Property Editor' 46 | }, 47 | { 48 | name: 'author', 49 | message: 'Author', 50 | default: this.user.git.username || 'Warren Buckley' 51 | }, 52 | { 53 | name: 'template', 54 | message: 'Do you wish to use a template to help you?', 55 | type: 'list', 56 | choices: [ 57 | { 58 | name: "No thanks I am fine", 59 | value: "basic" 60 | }, 61 | { 62 | name: "Google Maps", 63 | value: "google-maps" 64 | } 65 | ] 66 | }, 67 | { 68 | name: 'valueType', 69 | message: 'What type of data will you be storing?', 70 | type: 'list', 71 | choices: [ 72 | { 73 | name: "JSON", 74 | value: "JSON" 75 | }, 76 | { 77 | name: "String", 78 | value: "STRING" 79 | }, 80 | { 81 | name: "Text", 82 | value: "TEXT" 83 | }, 84 | { 85 | name: "Date Time", 86 | value: "DATETIME" 87 | }, 88 | { 89 | name: "Integer", 90 | value: "INT" 91 | } 92 | ], 93 | when: function(answers) { 94 | return answers.template === "basic"; 95 | }, 96 | default: 'JSON' 97 | } 98 | ]; 99 | 100 | this.prompt(prompts, function(props) { 101 | 102 | this.names = { 103 | name: props.name, 104 | alias: changeCase.pascalCase(props.name), 105 | ctrl: changeCase.pascalCase(props.name) + 'Controller', 106 | css: changeCase.paramCase(props.name), 107 | file: changeCase.dotCase(props.name), 108 | template: changeCase.paramCase(props.template) 109 | } 110 | 111 | this.author = props.author; 112 | this.description = props.description; 113 | this.valueType = props.valueType; 114 | 115 | //Log template type 116 | console.log(this.names.template); 117 | 118 | 119 | done(); 120 | 121 | }.bind(this)); 122 | }, 123 | 124 | app: function () { 125 | //Read package.manifest JSON (So we can loop over them in the HTML view markup) 126 | this.pkgmanifest = yeoman.file.readJSON(path.join(__dirname,'templates/' , this.names.template ,'/config/package.manifest')); 127 | this.prevalues = this.pkgmanifest.propertyEditors[0].prevalues.fields; 128 | 129 | //Create Directories 130 | this.mkdir(this.names.alias); 131 | this.mkdir(this.names.alias + '/app/scripts/controllers'); 132 | this.mkdir(this.names.alias + '/app/styles'); 133 | this.mkdir(this.names.alias + '/app/views'); 134 | this.mkdir(this.names.alias + '/config'); 135 | this.mkdir(this.names.alias + '/test'); 136 | this.mkdir(this.names.alias + '/test/specs'); 137 | 138 | //Template: Common files 139 | this.template('README.md', this.names.alias + '/README.md'); 140 | this.template('LICENSE', this.names.alias + '/LICENSE'); 141 | this.template('gitignore', this.names.alias + '/.gitignore'); 142 | this.template('_package.json', this.names.alias + '/package.json'); 143 | this.template('Gruntfile.js', this.names.alias + '/Gruntfile.js'); 144 | 145 | //Template: Files specific to template type (/basic/app/views/name.html ...) 146 | this.template(this.names.template + '/app/views/name.html', this.names.alias + '/app/views/' + this.names.file + '.html'); 147 | this.template(this.names.template + '/app/scripts/controllers/name.controller.js', this.names.alias + '/app/scripts/controllers/' + this.names.file + '.controller.js'); 148 | this.template(this.names.template + '/app/styles/name.less', this.names.alias + '/app/styles/' + this.names.file + '.less'); 149 | this.template(this.names.template + '/config/package.manifest', this.names.alias + '/config/package.manifest'); 150 | 151 | 152 | //COPY: Files specific for test setup 153 | this.copy('test/karma.conf.js', this.names.alias + '/test/karma.conf.js'); 154 | this.copy('test/app.conf.js', this.names.alias + '/test/app.conf.js'); 155 | 156 | //TEMPLATE: controller test setup 157 | this.template('test/specs/name.controller.spec.js', this.names.alias + '/test/specs/' + this.names.ctrl + '.spec.js'); 158 | 159 | 160 | //Copy Files: No param's need replacing 161 | this.copy('config/_package.nuspec', this.names.alias + '/config/package.nuspec'); 162 | this.copy('config/_package.xml', this.names.alias + '/config/package.xml'); 163 | this.copy('config/readme.txt', this.names.alias + '/config/readme.txt'); 164 | 165 | } 166 | }); 167 | 168 | module.exports = UmbracoGenerator; 169 | 170 | -------------------------------------------------------------------------------- /app/templates/Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function (grunt) { 2 | require('load-grunt-tasks')(grunt); 3 | require('time-grunt')(grunt); 4 | require('grunt-karma')(grunt); 5 | 6 | //cant load this with require 7 | grunt.loadNpmTasks('grunt-contrib-jshint'); 8 | 9 | if (grunt.option('target') && !grunt.file.isDir(grunt.option('target'))) { 10 | grunt.fail.warn('The --target option specified is not a valid directory'); 11 | } 12 | 13 | grunt.initConfig({ 14 | pkg: grunt.file.readJSON('package.json'), 15 | dest: grunt.option('target') || 'dist', 16 | basePath: 'App_Plugins/<%%= pkg.name %>', 17 | 18 | concat: { 19 | dist: { 20 | src: [ 21 | 'app/scripts/controllers/*.controller.js', 22 | 'app/scripts/services/*.service.js', 23 | 'app/scripts/resources/*.resouce.js', 24 | 'app/scripts/directives/*.directive.js', 25 | ], 26 | dest: '<%%= dest %>/<%%= basePath %>/js/<%= names.file %>.js', 27 | nonull: true 28 | } 29 | }, 30 | 31 | less: { 32 | dist: { 33 | options: { 34 | paths: ['app/styles'], 35 | }, 36 | files: { 37 | '<%%= dest %>/<%%= basePath %>/css/<%= names.file %>.css': 'app/styles/<%= names.file %>.less', 38 | } 39 | } 40 | }, 41 | 42 | watch: { 43 | options: { 44 | atBegin: true 45 | }, 46 | 47 | less: { 48 | files: ['app/styles/**/*.less'], 49 | tasks: ['less:dist'] 50 | }, 51 | 52 | js: { 53 | files: ['app/scripts/**/*.js'], 54 | tasks: ['concat:dist'] 55 | }, 56 | 57 | testControllers: { 58 | files: ['app/scripts/**/*.controller.js', 'test/specs/**/*.spec.js'], 59 | tasks: ['jshint', 'test'] 60 | }, 61 | 62 | html: { 63 | files: ['app/views/**/*.html'], 64 | tasks: ['copy:views'] 65 | }, 66 | 67 | config: { 68 | files: ['config/package.manifest'], 69 | tasks: ['copy:config'] 70 | } 71 | }, 72 | 73 | copy: { 74 | config: { 75 | src: 'config/package.manifest', 76 | dest: '<%%= dest %>/<%%= basePath %>/package.manifest', 77 | }, 78 | 79 | views: { 80 | expand: true, 81 | cwd: 'app/views/', 82 | src: '**', 83 | dest: '<%%= dest %>/<%%= basePath %>/views/' 84 | }, 85 | 86 | nuget: { 87 | expand: true, 88 | cwd: '<%%= dest %>', 89 | src: '**', 90 | dest: 'tmp/nuget/content/' 91 | }, 92 | 93 | umbraco: { 94 | expand: true, 95 | cwd: '<%%= dest %>/', 96 | src: '**', 97 | dest: 'tmp/umbraco/' 98 | }, 99 | 100 | testAssets: { 101 | expand: true, 102 | cwd: '<%%= dest %>', 103 | src: ['js/umbraco.*.js', 'lib/**/*.js'], 104 | dest: 'test/assets/' 105 | } 106 | }, 107 | 108 | template: { 109 | nuspec: { 110 | options: { 111 | data: { 112 | name: '<%%= pkg.name %>', 113 | version: '<%%= pkg.version %>', 114 | author: '<%%= pkg.author.name %>', 115 | description: '<%%= pkg.description %>' 116 | } 117 | }, 118 | files: { 119 | 'tmp/nuget/<%%= pkg.name %>.nuspec': 'config/package.nuspec' 120 | } 121 | } 122 | }, 123 | 124 | mkdir: { 125 | pkg: { 126 | options: { 127 | create: ['pkg/nuget', 'pkg/umbraco'] 128 | }, 129 | }, 130 | }, 131 | 132 | nugetpack: { 133 | dist: { 134 | src: 'tmp/nuget/<%%= pkg.name %>.nuspec', 135 | dest: 'pkg/nuget/' 136 | } 137 | }, 138 | 139 | umbracoPackage: { 140 | options: { 141 | name: '<%%= pkg.name %>', 142 | version: '<%%= pkg.version %>', 143 | url: '<%%= pkg.url %>', 144 | license: '<%%= pkg.license %>', 145 | licenseUrl: '<%%= pkg.licenseUrl %>', 146 | author: '<%%= pkg.author %>', 147 | authorUrl: '<%%= pkg.authorUrl %>', 148 | manifest: 'config/package.xml', 149 | readme: 'config/readme.txt', 150 | sourceDir: 'tmp/umbraco', 151 | outputDir: 'pkg/umbraco', 152 | } 153 | }, 154 | 155 | clean: { 156 | dist: '<%= dest %>', 157 | test: 'test/assets' 158 | }, 159 | 160 | karma: { 161 | unit: { 162 | configFile: 'test/karma.conf.js' 163 | } 164 | }, 165 | 166 | jshint: { 167 | dev: { 168 | files: { 169 | src: ['app/scripts/**/*.js'] 170 | }, 171 | options: { 172 | curly: true, 173 | eqeqeq: true, 174 | immed: true, 175 | latedef: true, 176 | newcap: true, 177 | noarg: true, 178 | sub: true, 179 | boss: true, 180 | eqnull: true, 181 | //NOTE: we need to use eval sometimes so ignore it 182 | evil: true, 183 | //NOTE: we need to check for strings such as "javascript:" so don't throw errors regarding those 184 | scripturl: true, 185 | //NOTE: we ignore tabs vs spaces because enforcing that causes lots of errors depending on the text editor being used 186 | smarttabs: true, 187 | globals: {} 188 | } 189 | } 190 | } 191 | }); 192 | 193 | grunt.registerTask('default', ['jshint', 'concat', 'less', 'copy:config', 'copy:views']); 194 | grunt.registerTask('nuget', ['clean', 'default', 'copy:nuget', 'template:nuspec', 'mkdir:pkg', 'nugetpack']); 195 | grunt.registerTask('package', ['clean', 'default', 'copy:umbraco', 'mkdir:pkg', 'umbracoPackage']); 196 | 197 | grunt.registerTask('test', 'Clean, copy test assets, test', function () { 198 | var assetsDir = grunt.config.get('dest'); 199 | //copies over umbraco assets from --target, this must point at the /umbraco/ directory 200 | if (assetsDir !== 'dist') { 201 | grunt.task.run(['clean:test', 'copy:testAssets', 'karma']); 202 | } else if (grunt.file.isDir('test/assets/js/')) { 203 | grunt.log.oklns('Test assets found, running tests'); 204 | grunt.task.run(['karma']); 205 | } else { 206 | grunt.log.errorlns('Tests assets not found, skipping tests'); 207 | } 208 | }); 209 | }; 210 | -------------------------------------------------------------------------------- /app/templates/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) <%= new Date().getFullYear() %> <%= author %> 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | 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, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /app/templates/README.md: -------------------------------------------------------------------------------- 1 | # <%= names.name %> 2 | 3 | <%= description %> 4 | 5 | ## Setup 6 | 7 | ### Install Dependencies 8 | 9 | ```bash 10 | npm install -g grunt-cli 11 | npm install 12 | ``` 13 | 14 | ### Build 15 | 16 | ```bash 17 | grunt 18 | ``` 19 | 20 | ### Watch 21 | 22 | ```bash 23 | grunt watch 24 | ``` 25 | 26 | -------------------------------------------------------------------------------- /app/templates/_package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "<%= names.alias %>", 3 | "version": "0.0.0", 4 | "description": "<%= description %>", 5 | "license": "MIT", 6 | "author": { 7 | "name": "<%= author %>", 8 | "email": "", 9 | "url": "" 10 | }, 11 | "devDependencies": { 12 | "grunt": "~0.4.2", 13 | "load-grunt-tasks": "~0.3.0", 14 | "grunt-contrib-concat": "~0.3.0", 15 | "grunt-contrib-watch": "~0.5.3", 16 | "grunt-contrib-less": "~0.9.0", 17 | "grunt-contrib-clean": "~0.5.0", 18 | "grunt-contrib-copy": "~0.5.0", 19 | "grunt-contrib-jshint": "^0.10.0", 20 | "grunt-template": "~0.2.2", 21 | "grunt-nuget": "~0.1.1", 22 | "grunt-mkdir": "~0.1.1", 23 | "grunt-umbraco-package": "~0.0.3", 24 | "time-grunt": "~0.2.10", 25 | "grunt-karma": "^0.8.3", 26 | "karma": "^0.12.16", 27 | "karma-jasmine": "^0.1.5", 28 | "karma-phantomjs-launcher": "^0.1.4" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/templates/ascii/umbraco-logo.txt: -------------------------------------------------------------------------------- 1 | ,iii. 2 | iiiiiiiiii: 3 | ,iiiiiiiiiiiii 4 | iiiiiiiiiiiiiiii: 5 | iiiiiiiiiiiiiiiiii. 6 | .iiiiiiiiiiiiiiiiiii 7 | iiiiiiiiiiiiiiiiiiiii 8 | ;iiii iiiiiiiii iiii C, 9 | iiiii iiiiiiiii iiiii Gi 10 | iiiii iiiiiiiii iiiii GL GL GGGG,GGG GLGGG GGG, GGGG GGG GGGi 11 | iiiii iiiiiiiii iiiii GC GL G: CG GG GC GG G , GG GG GG ,G 12 | iiii: iiiiiiiii iiiii GC GL G .G GG Gi GG G .tGG G G G, 13 | iiii; iiiiiiiii iiiii GC GL G .G GG Gi GG G GG;GG ,G G Gi 14 | iiiii iiiiiiiii iiiii GL GL G .G GG Gi GG G tG GG G G G 15 | iiiii iiiiiiii: iiiii GGGGGL G .G GG GGGGG G GGGGG GGGG GGGGG 16 | iiiii :iiii ;C tC C: .Cl C; 17 | iiiii ;iiiii 18 | iiiiiiiiiiiiiiiiiiii 19 | iiiiiiiiiiiiiiiiiii 20 | iiiiiiiiiiiiiiiii 21 | iiiiiiiiiiiiii, 22 | iiiiiiiiiii 23 | .iiiii 24 | 25 | -------------------------------------------------------------------------------- /app/templates/ascii/umbraco-text.txt: -------------------------------------------------------------------------------- 1 | $$\ $$\ $$\ 2 | $$ | $$ | $$ | 3 | $$ | $$ |$$$$$$\$$$$\ $$$$$$$\ $$$$$$\ $$$$$$\ $$$$$$$\ $$$$$$\ 4 | $$ | $$ |$$ _$$ _$$\ $$ __$$\ $$ __$$\ \____$$\ $$ _____|$$ __$$\ 5 | $$ | $$ |$$ / $$ / $$ |$$ | $$ |$$ | \__|$$$$$$$ |$$ / $$ / $$ | 6 | $$ | $$ |$$ | $$ | $$ |$$ | $$ |$$ | $$ __$$ |$$ | $$ | $$ | 7 | \$$$$$$ |$$ | $$ | $$ |$$$$$$$ |$$ | \$$$$$$$ |\$$$$$$$\ \$$$$$$ | 8 | \______/ \__| \__| \__|\_______/ \__| \_______| \_______| \______/ 9 | -------------------------------------------------------------------------------- /app/templates/basic/app/scripts/controllers/name.controller.js: -------------------------------------------------------------------------------- 1 | angular.module('umbraco').controller('<%= names.ctrl %>', function($scope) { 2 | console.log('Hello from <%= names.ctrl %>'); 3 | }); 4 | 5 | -------------------------------------------------------------------------------- /app/templates/basic/app/styles/name.less: -------------------------------------------------------------------------------- 1 | .<%= names.css %> { 2 | // Your styles here 3 | } 4 | 5 | -------------------------------------------------------------------------------- /app/templates/basic/app/views/name.html: -------------------------------------------------------------------------------- 1 |