commit bbc99c6967bc68a393c6125230d21fbaa7999b04 Author: Lukas Bestle Date: Mon Aug 15 18:16:26 2016 +0200 Initial public commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9fc7239 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.DS_Store +/node_modules \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..292a4cc --- /dev/null +++ b/.gitmodules @@ -0,0 +1,18 @@ +[submodule "kirby"] + path = kirby + url = https://github.com/getkirby/kirby.git +[submodule "site/patterns"] + path = site/patterns + url = https://git.codesignd.com/sites/patterns.git +[submodule "site/plugins/cachebuster"] + path = site/plugins/cachebuster + url = https://github.com/getkirby-plugins/cachebuster-plugin.git +[submodule "site/plugins/baromator"] + path = site/plugins/baromator + url = cdd@git.codesignd.com:corporate-identity/baromator.git +[submodule "site/plugins/patterns"] + path = site/plugins/patterns + url = https://github.com/getkirby-plugins/patterns-plugin.git +[submodule "site/plugins/uniform"] + path = site/plugins/uniform + url = https://github.com/mzur/kirby-uniform.git diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..c371257 --- /dev/null +++ b/.htaccess @@ -0,0 +1,95 @@ +# Rewrite rules + + # enable awesome urls. i.e.: + # http://yourdomain.com/about-us/team + RewriteEngine on + + # make sure to set the RewriteBase correctly + # if you are running the site in a subfolder. + # Otherwise links or the entire site will break. + # + # If your homepage is http://yourdomain.com/mysite + # Set the RewriteBase to: + # + RewriteBase / + + # enforce HTTPS + RewriteCond %{ENV:HTTPS} !=on + RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L] + + # rewrite /favicon.ico + RewriteRule ^favicon.ico$ assets/img/favicon.ico [L] + + # cache busting + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^(assets/.+)\.(\d+)\.(\w+)$ $1.$3 [L] + + # block text files in the content folder from being accessed directly + RewriteRule ^content/(.*)\.(txt|md|mdown)$ index.php [L] + + # block all files in the site folder from being accessed directly + RewriteRule ^site/(.*) index.php [L] + + # block all files in the kirby folder from being accessed directly + RewriteRule ^kirby/(.*) index.php [L] + + # make panel links work + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule ^panel/(.*) panel/index.php [L] + + # make site links work + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule ^(.*) index.php [L] + + +# Mime types + + AddType text/css css + AddType application/javascript js + + AddType image/svg+xml svg + AddType image/jpeg jpg jpeg + AddType image/png png + AddType image/x-icon ico + + AddType application/vnd.ms-fontobject eot + AddType application/font-woff woff + AddType font/woff2 woff2 + + AddType application/pgp-keys asc + + +# Compression + + AddOutputFilterByType DEFLATE application/atom+xml \ + application/javascript \ + application/json \ + application/rss+xml \ + application/xhtml+xml \ + application/xml \ + image/svg+xml \ + image/x-icon \ + text/cache-manifest \ + text/css \ + text/html \ + text/plain + + +# Caching + + ExpiresActive On + + ExpiresByType text/css "modification plus 1 year" + ExpiresByType application/javascript "modification plus 1 year" + + ExpiresByType image/svg+xml "modification plus 1 year" + ExpiresByType image/jpeg "modification plus 1 year" + ExpiresByType image/png "modification plus 1 year" + ExpiresByType image/x-icon "modification plus 1 year" + + ExpiresByType application/vnd.ms-fontobject "modification plus 1 year" + ExpiresByType application/font-woff "modification plus 1 year" + ExpiresByType font/woff2 "modification plus 1 year" + diff --git a/.postdeploy.sh b/.postdeploy.sh new file mode 100755 index 0000000..5a288d1 --- /dev/null +++ b/.postdeploy.sh @@ -0,0 +1,2 @@ +npm install +node_modules/.bin/gulp prod diff --git a/.user.ini b/.user.ini new file mode 100644 index 0000000..4d3da6a --- /dev/null +++ b/.user.ini @@ -0,0 +1 @@ +zlib.output_compression = On diff --git a/assets/avatars/.gitignore b/assets/avatars/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/assets/avatars/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/assets/css/.gitignore b/assets/css/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/assets/css/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/assets/fonts/.gitignore b/assets/fonts/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/assets/fonts/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/assets/img/.gitignore b/assets/img/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/assets/img/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/assets/js/.gitignore b/assets/js/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/assets/js/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/assets/readme.md b/assets/readme.md new file mode 100644 index 0000000..9fbe3a1 --- /dev/null +++ b/assets/readme.md @@ -0,0 +1,4 @@ +# Note about the assets directory + +The `assets` directory only contains empty subdirectories. +This is because the site uses [Kirby patterns](https://github.com/getkirby-plugins/patterns-plugin). The files in this directory are generated automatically by gulp. \ No newline at end of file diff --git a/content/1-home/home.de.txt b/content/1-home/home.de.txt new file mode 100755 index 0000000..c4d2249 --- /dev/null +++ b/content/1-home/home.de.txt @@ -0,0 +1,14 @@ +Title: Startseite + +---- + +Description: + +---- + +Text: + +# Willkommen bei codesignd + +Wo sich **Code** und **Design** begegnen. +Auch bei deinen Websites und Webprojekten. diff --git a/content/1-home/home.en.txt b/content/1-home/home.en.txt new file mode 100755 index 0000000..cdc3338 --- /dev/null +++ b/content/1-home/home.en.txt @@ -0,0 +1,14 @@ +Title: Home + +---- + +Description: + +---- + +Text: + +# Welcome at codesignd + +Where **code** and **design** meet. +Even at your websites and web projects. diff --git a/content/1-home/illustration.svg b/content/1-home/illustration.svg new file mode 100644 index 0000000..50c0a1f --- /dev/null +++ b/content/1-home/illustration.svg @@ -0,0 +1 @@ + diff --git a/content/2-services/conception.svg b/content/2-services/conception.svg new file mode 100644 index 0000000..e2de326 --- /dev/null +++ b/content/2-services/conception.svg @@ -0,0 +1 @@ + diff --git a/content/2-services/development.svg b/content/2-services/development.svg new file mode 100644 index 0000000..9b2ffa0 --- /dev/null +++ b/content/2-services/development.svg @@ -0,0 +1 @@ + diff --git a/content/2-services/kirby.svg b/content/2-services/kirby.svg new file mode 100644 index 0000000..f4a3178 --- /dev/null +++ b/content/2-services/kirby.svg @@ -0,0 +1 @@ + diff --git a/content/2-services/server.svg b/content/2-services/server.svg new file mode 100644 index 0000000..9120d5e --- /dev/null +++ b/content/2-services/server.svg @@ -0,0 +1 @@ + diff --git a/content/2-services/services.de.txt b/content/2-services/services.de.txt new file mode 100644 index 0000000..67651c7 --- /dev/null +++ b/content/2-services/services.de.txt @@ -0,0 +1,49 @@ +Title: Leistungen + +---- + +URL-Key: leistungen + +---- + +Description: codesignd bietet Konzeption, Backend-Entwicklung mit Kirby und Beratung und Hilfe beim Web-Hosting. + +---- + +Services: + +- + title: 'Konzept & Koordination' + illustration: conception.svg + text: | + Zu jedem erfolgreichen Projekt gehört auch ein gutes Konzept. Direkt mit den ersten Vorstellungen loszulegen bringt oft auf gute Ideen, aber bevor es dann an die Umsetzung des Endprodukts geht, finde ich für die Ideen einen Platz in einem stimmigen Gesamtkonzept. Das hilft nicht nur dabei, später sauberen und konsistenten Code zu schreiben, sondern schafft auch früh Klarheit über die Ziele und Möglichkeiten. + + Aber auch nach der Konzeptionsphase kümmere ich mich gerne um die Koordination des Projekts. Sollten besondere Fähigkeiten benötigt werden, arbeite ich im Netzwerk mit anderen Freiberuflern zusammen. +- + title: Entwicklung + illustration: development.svg + text: | + Das Konzept steht? Dann geht es an die Umsetzung. Seien es robuster und zuverlässiger Frontend-Code mit HTML und CSS, interaktive Elemente über JavaScript oder komplexe Abläufe mit Datenbankanbindungen oder internen Benutzerbereichen, im Gespräch mit dir finde ich für so manches eine solide Lösung. + + Besonders wichtig ist mir, hochwertigen Code zu schreiben. Das bedeutet: Gute Struktur, Code-Kommentare zum besseren Verständnis durch andere Entwickler und (Unit-)Tests für zentralen Code. Denn schlechter Code rächt sich, z. B. bei einer späteren Erweiterung, durch eine vermeidbare Sicherheitslücke oder wenn neue Entwickler ins Team kommen. Guter Code ist wartbar, verständlich und sicher. +- + title: Kirby + illustration: kirby.svg + text: | + Der beste Code nutzt jedoch nichts, wenn die Website am Ende nur durch den Entwickler gewartet werden kann. Die Lösung sind Content Management Systeme (CMS). Sie bieten eine benutzerfreundliche Oberfläche, um den Inhalt selbst zu ändern und zu formatieren. + + Seit 4 Jahren arbeite ich ausschließlich mit [Kirby](https://getkirby.com), einem sehr flexiblen und dadurch äußerst anpassbaren CMS. Als Mitglied der Entwicklungs- und Support-Teams von Kirby habe ich viel Erfahrung mit der Funktionsweise und kann das System an deine Bedürfnisse und die Anforderungen des Projekts anpassen und Lösungen finden, die zu deinem Workflow passen. +- + title: 'Server & Service' + illustration: server.svg + text: | + Auch nach der Umsetzung des Projekts bin ich für dich da, suche gemeinsam mit dir einen passenden Web-Hoster aus und richte die Website dort ein. Je nach Hoster biete ich die Einrichtung von Backup-Strategien, maßgeschneiderten Deployment-Prozessen und Staging-Sites an. Bevor die Website dann online geht, sind natürlich auch Optimierungen wie HTTPS, CDNs, Caching und Komprimierung möglich. + + Und wenn du auch nach dem Projekt eine Frage hast oder etwas nicht funktioniert, helfe ich dir gerne weiter. + +---- + +Cta: + +Zusammen ist das meine KEKS-Strategie. +Klingt lecker? Dann erzähl mir von deinem Projekt, ich berate dich gerne! diff --git a/content/2-services/services.en.txt b/content/2-services/services.en.txt new file mode 100644 index 0000000..3985fe8 --- /dev/null +++ b/content/2-services/services.en.txt @@ -0,0 +1,45 @@ +Title: Services + +---- + +Description: codesignd offers conception, backend development with Kirby as well as consulting and help with web hosting. + +---- + +Services: + +- + title: 'Conception & Coordination' + illustration: conception.svg + text: | + Every successful project needs a good conception. Starting with the first ideas right away can often inspire, but before it's time to implement the final product, I put it all together in a coherent conception. That not only helps writing good and consistent code, it also provides clarity of the goals and options very early on. + + After the initial conception phase, I can coordinate the project. If special skills are required, I work together with other freelancers from my network. +- + title: Development + illustration: development.svg + text: | + The conception is ready? Then the next step is the implementation. Be it robust and reliable frontend code with HTML and CSS, interactive elements with JavaScript or complex processes with database integrations or internal user areas, together with you I can find a sound solution for many use cases. + + Especially important to me is to write high quality code. That means: A good code structure, code comments for a better understanding by other developers and (unit) tests for important code. Bad code comes back to roost, e.g. in future expansions, through an avoidable security issue or when new developers join the team. Good code is maintainable, easy to understand and secure. +- + title: Kirby + illustration: kirby.svg + text: | + The best code doesn't help if the site can only be maintained by the developer. The solution are Content Management Systems (CMS). They provide an easy to use interface to change and format the content. + + In the last 4 years, I have been exclusively working with [Kirby](https://getkirby.com), a very flexible and thus very adaptable CMS. As a member of the development and support teams of Kirby, I am very experienced with the functionality and can adapt the system to your needs and the project requirements as well as find solutions to fit your workflow. +- + title: 'Servers & Service' + illustration: server.svg + text: | + I'm there for you even after the implementation of the project, will help you to find a fitting web hosting provider and set the website up for you. Depending on the provider I offer setting up backup strategies, custom-fit deployment processes and staging sites. Before the website goes live, optimizations like HTTPS, CDNs, caching and compression are possible too. + + And if you have any questions after the project is done or if anything doesn't work, I'm here to help. + +---- + +Cta: + +Sounds great? +Then feel free to tell me about your project, I will be happy to help you. diff --git a/content/3-contact/contact.de.txt b/content/3-contact/contact.de.txt new file mode 100644 index 0000000..e7d7019 --- /dev/null +++ b/content/3-contact/contact.de.txt @@ -0,0 +1,9 @@ +Title: Kontakt + +---- + +URL-Key: kontakt + +---- + +Description: Erfahre, wie du Lukas Bestle, den Inhaber von codesignd, erreichen kannst. diff --git a/content/3-contact/contact.en.txt b/content/3-contact/contact.en.txt new file mode 100644 index 0000000..7149edf --- /dev/null +++ b/content/3-contact/contact.en.txt @@ -0,0 +1,5 @@ +Title: Contact + +---- + +Description: Find out how to contact Lukas Bestle, the owner of codesignd. diff --git a/content/error/default.de.txt b/content/error/default.de.txt new file mode 100755 index 0000000..6164bcf --- /dev/null +++ b/content/error/default.de.txt @@ -0,0 +1,16 @@ +Title: Fehler + +---- + +Description: Die angeforderte Seite konnte nicht gefunden werden. + +---- + +Text: + +# Vier-Null-Vier + +Hm, da ist was schiefgelaufen. +Die angeforderte Seite konnte nicht gefunden werden. + +Macht aber nichts, (link: / text: auf der Startseite geht's weiter). diff --git a/content/error/default.en.txt b/content/error/default.en.txt new file mode 100755 index 0000000..e874794 --- /dev/null +++ b/content/error/default.en.txt @@ -0,0 +1,16 @@ +Title: Error + +---- + +Description: The requested page could not be found. + +---- + +Text: + +# Four-oh-four + +Hm, something went wrong here. +The requested page could not be found. + +Never mind, (link: / text: let's continue on the homepage). diff --git a/content/legal/default.de.txt b/content/legal/default.de.txt new file mode 100644 index 0000000..9da722b --- /dev/null +++ b/content/legal/default.de.txt @@ -0,0 +1,45 @@ +Title: Impressum + +---- + +URL-Key: impressum + +---- + +Description: + +---- + +Text: + +# Impressum + +**codesignd, Lukas Bestle** +Seidenstr. 7 +72764 Reutlingen +Deutschland + +USt-IdNr.: DE 300 983 590 + +

Kontakt

+ +(qdated:) + +Diese E-Mail-Adresse ist eine Woche lang gültig und verfällt anschließend. E-Mails an diese Adresse erreichen mich persönlich und werden schnellstmöglich beantwortet. Mit der Antwort erhältst du meine dauerhaft gültige E-Mail-Adresse. +Durch dieses Verfahren wird die E-Mail-Adresse vor automatisiertem Spam geschützt. Vielen Dank für dein Verständnis. + +## Datenschutz + +Beim Besuch dieser Website werden folgende Daten gespeichert: + +- Datum und Uhrzeit der Anfrage +- gekürzte IP-Adresse +- aufgerufene URL +- ggf. Referrer (URL einer hierher verlinkenden Website) +- Browser- und Betriebssystemversion + +Die Speicherung erfolgt ausschließlich auf dem Server des Betreibers. Eine Weitergabe der Daten oder Zusammenführung mit weiteren Daten erfolgt nicht. Nach vier Wochen werden die Daten automatisch gelöscht. + +### Kontaktformular + +Bei Nutzung des Kontaktformulars werden deine Angaben per E-Mail an mich übermittelt. Eine Weitergabe der Daten oder Zusammenführung mit weiteren Daten erfolgt nicht. diff --git a/content/legal/default.en.txt b/content/legal/default.en.txt new file mode 100644 index 0000000..67f9746 --- /dev/null +++ b/content/legal/default.en.txt @@ -0,0 +1,43 @@ +Title: Imprint + +---- + +Description: + +---- + +Text: + +# Legal information / imprint + +The following information is required by German law. + +**codesignd, Lukas Bestle** +Seidenstr. 7 +72764 Reutlingen +Germany + +USt-IdNr.: DE 300 983 590 + +

Contact

+ +(qdated:) + +This email address is valid for one week, after which it expires. Emails to this address are received by me personally and are responded to as fast as possible. Together with my reply, you will get my permanently valid email address. +This process protects the email address against automated spam. Thank you for your understanding. + +## Privacy + +Visiting this website temporarily stores the following information: + +- date and time of visit +- truncated IP address +- visited URL +- referrer (URL of the site you came from) +- version information of browser and operating system + +The data is stored on the server of the website owner only. No data is circulated or combined with other data. All data is automatically deleted after four weeks. + +### Contact form + +When using the contact form, your information is sent to me via email. No data is circulated or combined with other data. diff --git a/content/site.de.txt b/content/site.de.txt new file mode 100755 index 0000000..767d6cd --- /dev/null +++ b/content/site.de.txt @@ -0,0 +1,9 @@ +Title: codesignd + +---- + +Description: codesignd ist Lukas Bestle, ein Backend-Web-Entwickler und Mitglied des Kirby-Teams. + +---- + +Copyright: © 2015-2016 Lukas Bestle diff --git a/content/site.en.txt b/content/site.en.txt new file mode 100755 index 0000000..6fd2e4d --- /dev/null +++ b/content/site.en.txt @@ -0,0 +1,9 @@ +Title: codesignd + +---- + +Description: codesignd is Lukas Bestle, a backend web developer and member of the Kirby team. + +---- + +Copyright: © 2015-2016 Lukas Bestle diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..44c1ea6 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,245 @@ +'use strict'; + +// Directory name inside the patterns repo +var site = 'codesignd'; + +//////////////////////////////////////////////////////////////////////////////// + +// Node dependencies +var fs = require('fs'); +var path = require('path'); + +// gulp and gulp plugins +var gulp = require('gulp'); +var autoprefixer = require('gulp-autoprefixer'); +var cleanCSS = require('gulp-clean-css'); +var concat = require('gulp-concat'); +var header = require('gulp-header'); +var include = require('gulp-include'); +var preservetime = require('gulp-preservetime'); +var refresh = require('gulp-refresh'); +var rename = require('gulp-rename'); +var gulpSass = require('gulp-sass'); +var sass = gulpSass.compiler; +var uglify = require('gulp-uglify'); + +// Other npm modules +var del = require('del'); + +// Load package.json of the patterns repo +var packageData = require('./site/patterns/package.json'); + +//////////////////////////////////////////////////////////////////////////////// + +var helpers = {}; + +/** + * Returns a banner for asset files + * + * @param {string} type File type of the generated file + * @return {object} + */ +helpers.banner = function(type) { + var banner = [ + '/*!', + ' * <%= pkg.description %>', + ' * @link <%= pkg.homepage %>', + ' * @copyright <%= pkg.copyright %>', + ' * @license <%= pkg.license' + type + ' || pkg.license %>', + ' */', + '' + ].join('\n'); + + return header(banner, {pkg: packageData}); +}; + +/** + * Builds the CSS of the specified site + * + * @param {string} site Site name, defaults to "shared" if not given + * @param {boolean} minify Whether to minify using clean-css + * @return {stream} + */ +helpers.buildCSS = function(site, minify) { + if(!site) site = 'shared'; + if(!minify) minify = false; + + var sassOptions = { + functions: { + '-cdd-cachebuster($filepath)': function(filepath, done) { + var pathString = filepath.getValue(); + + fs.stat(__dirname + pathString, function(err, stats) { + if(err) throw err; + + var mtime = Math.round(Date.parse(stats.mtime) / 1000); + + var parsed = path.parse(pathString); + var filepath = parsed.dir + '/' + parsed.name + '.' + mtime + parsed.ext; + done(sass.types.String(filepath)); + }); + } + }, + outputStyle: 'expanded' + }; + + // Compile the SCSS file + var stream = gulp.src('site/patterns/' + site + '/' + site + '.scss') + .pipe(gulpSass(sassOptions).on('error', gulpSass.logError)) + .pipe(autoprefixer({browsers: ['> 1%']})) + .pipe(rename('index.css')) + .pipe(helpers.banner('CSS')) + .pipe(gulp.dest('assets/css')); + + // Minify CSS if required + if(minify) { + stream = stream.pipe(rename('index.min.css')) + .pipe(cleanCSS()) + .pipe(gulp.dest('assets/css')); + } + + // Trigger LiveReload + return stream.pipe(refresh()); +}; + +/** + * Builds the JS of the specified site + * + * @param {string} site Site name, defaults to "shared" if not given + * @param {boolean} minify Whether to minify using UglifyJS + * @return {stream} + */ +helpers.buildJS = function(site, minify) { + if(!site) site = 'shared'; + if(!minify) minify = false; + + var src = ['site/patterns/shared/**/*.js']; + if(site !== 'shared') src.push('site/patterns/' + site + '/**/*.js'); + + // Concat the JS files + var stream = gulp.src(src) + .pipe(concat('index.js')) + .pipe(include({includePaths: __dirname + '/node_modules'})) + .pipe(helpers.banner('JS')) + .pipe(gulp.dest('assets/js')); + + // Minify JS if required + if(minify) { + stream = stream.pipe(rename('index.min.js')) + .pipe(uglify({preserveComments: 'license'})) + .pipe(gulp.dest('assets/js')); + } + + // Trigger LiveReload + return stream.pipe(refresh()); +}; + +/** + * Copies all files matching a specified pattern to the assets dir + * Removes folder hierarchies so make sure that each file has a unique name! + * + * @param {string} site Site name, defaults to "shared" if not given + * @param {string} pattern Something like "*.{jpg,svg}" + * @param {string} dest Either "fonts" or "img" + * @return {stream} + */ +helpers.copyFiles = function(site, pattern, dest) { + if(!site) site = 'shared'; + + var src = ['site/patterns/shared/**/' + pattern]; + if(site !== 'shared') src.push('site/patterns/' + site + '/**/' + pattern); + + return gulp.src(src, {since: gulp.lastRun(dest)}) + .pipe(rename({dirname: ''})) // Flat hierarchy + .pipe(gulp.dest('assets/' + dest)) + .pipe(preservetime()) + .pipe(refresh()); +}; + +//////////////////////////////////////////////////////////////////////////////// + +/** + * Compiles the CSS file of the current site + */ +gulp.task('css', function() { + return helpers.buildCSS(site); +}); + +/** + * Compiles and minifies the CSS file of the current site + */ +gulp.task('css.min', function() { + return helpers.buildCSS(site, true); +}); + +/** + * Combines the JS files of the current site + */ +gulp.task('js', function() { + return helpers.buildJS(site); +}); + +/** + * Combines and minifies the JS files of the current site + */ +gulp.task('js.min', function() { + return helpers.buildJS(site, true); +}); + +/** + * Copies all webfonts to assets/fonts + */ +gulp.task('fonts', function() { + return helpers.copyFiles(site, '*.{woff,woff2,eot}', 'fonts'); +}); + +/** + * Copies all images to assets/img + */ +gulp.task('img', function() { + return helpers.copyFiles(site, '*.{jpg,png,svg,ico}', 'img'); +}); + +/** + * Copies prism.js components to assets/js/prism + */ +gulp.task('prismjs', function() { + return gulp.src('node_modules/prismjs/components/*') + .pipe(gulp.dest('assets/js/prism')); +}); + +/** + * Builds everything except the minified files for local development + */ +gulp.task('default', gulp.series(gulp.parallel('fonts', 'img'), gulp.parallel('css', 'js', 'prismjs'))); + +/** + * Watches for changes + */ +function watchwait() { + refresh.listen(); + + gulp.watch('site/patterns/**/*.scss', gulp.series('css')); + gulp.watch('site/patterns/**/*.js', gulp.series('js')); + gulp.watch('site/patterns/**/*.{woff,woff2,eot}', gulp.series('fonts')); + gulp.watch('site/patterns/**/*.{jpg,png,svg,ico}', gulp.series('img')); + + gulp.watch(['content/**/*.txt', 'site/**/*.{php,yml}']).on('change', refresh.changed); +} +gulp.task('watch', gulp.series('default', watchwait)); + +/** + * Cleans built files + */ +gulp.task('clean', function() { + return del('assets/*/*'); +}); + +/** + * Builds everything for production + * WARNING: Deletes some source files, only run this after committing your files + */ +function prodclean() { + return del(['node_modules', 'gulpfile.js', 'site/patterns/*/', '!site/patterns/{shared,' + site + '}']); +} +gulp.task('prod', gulp.series('clean', gulp.parallel('fonts', 'img'), gulp.parallel('css.min', 'js.min', 'prismjs'), prodclean)); diff --git a/index.php b/index.php new file mode 100755 index 0000000..feef4bf --- /dev/null +++ b/index.php @@ -0,0 +1,16 @@ +launch(); \ No newline at end of file diff --git a/kirby b/kirby new file mode 160000 index 0000000..fae381e --- /dev/null +++ b/kirby @@ -0,0 +1 @@ +Subproject commit fae381e5716a50fdc36fc8f5fa9ef9fe30e97384 diff --git a/license.md b/license.md new file mode 100755 index 0000000..0020a36 --- /dev/null +++ b/license.md @@ -0,0 +1,22 @@ +# License of the codesignd website + +## Kirby + +This site is based on [Kirby CMS](https://getkirby.com). Kirby is not free. You can find Kirby's license on the [Kirby website](https://getkirby.com/license). + +## Content + +Copyright (c) 2016 Lukas Bestle + +You may not use, copy, modify, merge, publish, distribute, sublicense and/or sell copies of the content from this project without explicit permission by Lukas Bestle. + +## All other code in this repository + +**The MIT License (MIT)** +Copyright (c) 2016 Lukas Bestle + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/package.json b/package.json new file mode 100644 index 0000000..f75b666 --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "codesignd-site", + "description": "codesignd website", + "homepage": "https://git.codesignd.com/sites/codesignd", + "license": "SEE LICENSE IN license.md", + "private": true, + + "dependencies": { + "element-closest": "2.0.1", + "flexismooth": "1.0.0", + "prismjs": "1.5.1", + "whatwg-fetch": "1.0.0" + }, + "devDependencies": { + "del": "^2.2.1", + "gulp": "gulpjs/gulp.git#4.0", + "gulp-autoprefixer": "^3.1.0", + "gulp-clean-css": "^2.0.12", + "gulp-concat": "^2.6.0", + "gulp-header": "^1.8.7", + "gulp-include": "^2.3.1", + "gulp-preservetime": "^1.0.0", + "gulp-refresh": "^1.1.0", + "gulp-rename": "^1.2.2", + "gulp-sass": "^2.3.2", + "gulp-uglify": "^1.5.3" + } +} diff --git a/pgp.asc b/pgp.asc new file mode 100644 index 0000000..242dd42 --- /dev/null +++ b/pgp.asc @@ -0,0 +1,298 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +0rkW0xLAQiVeN+M2gyMJgUhr/d8BWK+ls28= +=qAnb +-----END PGP PUBLIC KEY BLOCK----- diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..32ac437 --- /dev/null +++ b/readme.md @@ -0,0 +1,18 @@ +# codesignd website + +> codesignd website at codesignd.com/codesignd.de + +This is the main repository of the codesignd website. Most of the actual code is stored in the [patterns repository](https://git.codesignd.com/sites/patterns), which is shared with other codesignd websites. +Feel free to take a look at the code and the [pattern library](https://codesignd.com/patterns) and don't hesitate to contact me: + +- [Email and contact form](https://codesignd.com/contact) +- [Follow me on Twitter](https://twitter.com/lukasbestle) +- Find me in the [Kirby Forum](https://forum.getkirby.com/users/lukasbestle) + +## Copyright + +© 2016 Lukas Bestle + +## License + +See license.md. diff --git a/site/accounts/.gitignore b/site/accounts/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/site/accounts/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/site/blueprints/contact.yml b/site/blueprints/contact.yml new file mode 100755 index 0000000..3cb19e9 --- /dev/null +++ b/site/blueprints/contact.yml @@ -0,0 +1,11 @@ +title: Contact +pages: false +files: false +fields: + title: + label: Title + type: text + description: + label: Desciption + type: text + icon: file-text diff --git a/site/blueprints/default.yml b/site/blueprints/default.yml new file mode 100755 index 0000000..3dbd174 --- /dev/null +++ b/site/blueprints/default.yml @@ -0,0 +1,14 @@ +title: Page +pages: true +files: true +fields: + title: + label: Title + type: text + description: + label: Desciption + type: text + icon: file-text + text: + label: Text + type: textarea diff --git a/site/blueprints/home.yml b/site/blueprints/home.yml new file mode 100755 index 0000000..e63134c --- /dev/null +++ b/site/blueprints/home.yml @@ -0,0 +1,14 @@ +title: Homepage +pages: false +files: true +fields: + title: + label: Title + type: text + description: + label: Desciption + type: text + icon: file-text + text: + label: Text + type: textarea diff --git a/site/blueprints/services.yml b/site/blueprints/services.yml new file mode 100755 index 0000000..1705b70 --- /dev/null +++ b/site/blueprints/services.yml @@ -0,0 +1,30 @@ +title: Services +pages: false +files: true +fields: + title: + label: Title + type: text + description: + label: Desciption + type: text + icon: file-text + services: + label: Services + type: structure + entry: > + {{title}}
+ {{text}} + fields: + title: + label: Title + type: text + illustration: + label: Illustration + type: image + text: + label: Text + type: textarea + cta: + label: Call to action + type: textarea diff --git a/site/blueprints/site.yml b/site/blueprints/site.yml new file mode 100644 index 0000000..1d6c599 --- /dev/null +++ b/site/blueprints/site.yml @@ -0,0 +1,15 @@ +title: Site +pages: true +files: false +fields: + title: + label: Title + type: text + description: + label: Desciption + type: text + icon: file-text + copyright: + label: Copyright + type: text + icon: copyright diff --git a/site/cache/.gitignore b/site/cache/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/site/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/site/config/config.codesignd.dev.php b/site/config/config.codesignd.dev.php new file mode 100755 index 0000000..87c17b7 --- /dev/null +++ b/site/config/config.codesignd.dev.php @@ -0,0 +1,25 @@ + 'en', + 'name' => 'English', + 'default' => true, + 'locale' => 'en_US', + 'url' => 'http://codesignd.dev', + ], + [ + 'code' => 'de', + 'name' => 'Deutsch', + 'locale' => 'de_DE', + 'url' => 'http://de.codesignd.dev', + ] +]); diff --git a/site/config/config.de.codesignd.dev.php b/site/config/config.de.codesignd.dev.php new file mode 100644 index 0000000..9c59614 --- /dev/null +++ b/site/config/config.de.codesignd.dev.php @@ -0,0 +1,3 @@ + 'en', + 'name' => 'English', + 'default' => true, + 'locale' => 'en_US', + 'url' => 'https://codesignd.com' + ], + [ + 'code' => 'de', + 'name' => 'Deutsch', + 'locale' => 'de_DE', + 'url' => 'https://codesignd.de' + ] +]); + +// Bar-o-mator plugin +c::set('baromator.routes', true); +c::set('baromator.basecolor', '#ED8F1B'); + +// Cachebuster plugin +c::set('cachebuster', true); + +// Patterns plugin +c::set('patterns.title', 'codesignd Patterns'); +c::set('patterns.preview.css', ['assets/css/index.css', 'site/patterns/theme.css']); +c::set('patterns.preview.js', 'assets/js/index.js'); + +// Serve the pattern library theme file +c::set('routes', [ + [ + 'pattern' => 'site/patterns/theme\.(:num)\.css', + 'action' => function() { + return new Response(f::read(kirby()->roots()->site() . DS . 'patterns' . DS . 'theme.css'), 'css'); + } + ] +]); diff --git a/site/controllers/contact.php b/site/controllers/contact.php new file mode 100644 index 0000000..5daf1f3 --- /dev/null +++ b/site/controllers/contact.php @@ -0,0 +1,21 @@ + [ + 'name' => '', + '_from' => 'email' + ], + 'actions' => [ + [ + '_action' => 'email', + 'to' => qdated(), + 'sender' => 'codesignd form ', + 'subject' => 'Message from the contact form (' . $site->title() . ')', + 'snippet' => 'email-templates/contact' + ] + ] + ]); + + return compact('form'); +}; diff --git a/site/languages/de.php b/site/languages/de.php new file mode 100644 index 0000000..47e2fc4 --- /dev/null +++ b/site/languages/de.php @@ -0,0 +1,23 @@ +Twitter und mache mich darauf aufmerksam. Danke!'); diff --git a/site/languages/en.php b/site/languages/en.php new file mode 100644 index 0000000..0a7a1ca --- /dev/null +++ b/site/languages/en.php @@ -0,0 +1,23 @@ +Twitter and tell me about this. Thank you!'); diff --git a/site/patterns b/site/patterns new file mode 160000 index 0000000..f9c5f3d --- /dev/null +++ b/site/patterns @@ -0,0 +1 @@ +Subproject commit f9c5f3db5a8cbb3d25e1a84c19b7c56d73b71422 diff --git a/site/plugins/baromator b/site/plugins/baromator new file mode 160000 index 0000000..cfe2ef2 --- /dev/null +++ b/site/plugins/baromator @@ -0,0 +1 @@ +Subproject commit cfe2ef2c4cb94f7e1e2bb244427e18569f19bed5 diff --git a/site/plugins/cachebuster b/site/plugins/cachebuster new file mode 160000 index 0000000..eb92317 --- /dev/null +++ b/site/plugins/cachebuster @@ -0,0 +1 @@ +Subproject commit eb92317c13603859d298b554a88656cdcdc38f17 diff --git a/site/plugins/patterns b/site/plugins/patterns new file mode 160000 index 0000000..3e1d562 --- /dev/null +++ b/site/plugins/patterns @@ -0,0 +1 @@ +Subproject commit 3e1d562073062a44395d49d2f8d3e2a9b8fae10a diff --git a/site/plugins/qdated.php b/site/plugins/qdated.php new file mode 100644 index 0000000..b441b0d --- /dev/null +++ b/site/plugins/qdated.php @@ -0,0 +1,42 @@ +' . l::get('qdated.error') . '

'; + + if($text === true) $text = str_replace('@', '
@', $email); + return str::email($email, $text); +} + +/** + * qdated Kirbytag + * + * Usage: (qdated: Optional link text) + */ +kirby()->set('tag', 'qdated', [ + 'html' => function($tag) { + return qdatedHtml($tag->attr('qdated')); + } +]); diff --git a/site/plugins/uniform b/site/plugins/uniform new file mode 160000 index 0000000..26f17b1 --- /dev/null +++ b/site/plugins/uniform @@ -0,0 +1 @@ +Subproject commit 26f17b120bd2f1a250c7639a9a6ae9119b33b937 diff --git a/site/snippets/email-templates/contact.php b/site/snippets/email-templates/contact.php new file mode 100644 index 0000000..ec71dc5 --- /dev/null +++ b/site/snippets/email-templates/contact.php @@ -0,0 +1,6 @@ +Name: +Email: + +---- + + diff --git a/site/snippets/footer.php b/site/snippets/footer.php new file mode 100755 index 0000000..a7e3050 --- /dev/null +++ b/site/snippets/footer.php @@ -0,0 +1,4 @@ + 'codesignd']) ?> + + + diff --git a/site/snippets/header.php b/site/snippets/header.php new file mode 100755 index 0000000..eda22a8 --- /dev/null +++ b/site/snippets/header.php @@ -0,0 +1,31 @@ + + + + + + + + <?= $page->title()->html() ?> ~ <?= $site->title()->html() ?> + + + + + + languages()->filterBy('code', '!=', $site->language()->code()) as $lang): ?> + + + + + + + + + + + + + + 'codesignd', + 'navData' => ['languages' => $site->languages(), 'items' => $site->pages()->visible()] + ]) ?> diff --git a/site/snippets/nav.php b/site/snippets/nav.php new file mode 100644 index 0000000..7f5753d --- /dev/null +++ b/site/snippets/nav.php @@ -0,0 +1,7 @@ + false, + 'languages' => $site->languages(), + 'items' => $site->pages()->visible() +]); diff --git a/site/snippets/templates/contact.php b/site/snippets/templates/contact.php new file mode 100644 index 0000000..0f1b690 --- /dev/null +++ b/site/snippets/templates/contact.php @@ -0,0 +1,52 @@ +
+

title()) ?>

+ +
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ + + + +
hasMessage() && !$form->successful()): ?>echoMessage() ?>
+ + + + +
+ +
+ hasMessage() && $form->successful()): ?> + echoMessage() ?> + +
+
+ + +
+
diff --git a/site/snippets/templates/default.php b/site/snippets/templates/default.php new file mode 100644 index 0000000..5bc6ab0 --- /dev/null +++ b/site/snippets/templates/default.php @@ -0,0 +1,3 @@ +
+ text()->kirbytext() ?> +
diff --git a/site/snippets/templates/home.php b/site/snippets/templates/home.php new file mode 100644 index 0000000..845e917 --- /dev/null +++ b/site/snippets/templates/home.php @@ -0,0 +1 @@ + $page->image()->url(), 'text' => $page->text()->kt()]) ?> diff --git a/site/snippets/templates/services.php b/site/snippets/templates/services.php new file mode 100644 index 0000000..1b0f2db --- /dev/null +++ b/site/snippets/templates/services.php @@ -0,0 +1,10 @@ +
+

title()) ?>

+ + services()->toStructure() as $service): ?> + illustration()->toFile())? $illustration->url() : false ?> + $illustration, 'title' => $service->title(), 'coloredTitle' => ($site->language()->code() === 'de'), 'text' => $service->text()->kt()]) ?> + +
+
+ $page->cta()->kirbytext(), 'button' => l::get('go.contact', '➪ Contact'), 'link' => url('contact')]) ?> diff --git a/site/templates/contact.json.php b/site/templates/contact.json.php new file mode 100644 index 0000000..a9a4533 --- /dev/null +++ b/site/templates/contact.json.php @@ -0,0 +1,19 @@ + $value) { + $fields[$field] = $form->hasError($field); + } + + $data = [ + 'success' => $form->successful(), + 'fields' => $fields, + 'message' => $form->message() + ]; + + echo response::json($data); +} else { + require_once('default.json.php'); +} diff --git a/site/templates/contact.php b/site/templates/contact.php new file mode 100644 index 0000000..72e7fbc --- /dev/null +++ b/site/templates/contact.php @@ -0,0 +1,3 @@ +intendedTemplate(); +if(!$kirby->get('snippet', $snippet)) $snippet = 'templates/default'; + +// Define structured data for the frontend AJAX code +$data = [ + 'url' => $page->url(), + 'cachable' => $page->isCachable(), + 'title' => $page->title() . ' ~ ' . site()->title(), + 'nav' => snippet('nav', [], true), + 'main' => snippet($snippet, [], true) +]; + +// Return it as JSON +echo response::json($data); diff --git a/site/templates/default.php b/site/templates/default.php new file mode 100644 index 0000000..e740ebf --- /dev/null +++ b/site/templates/default.php @@ -0,0 +1,13 @@ +intendedTemplate(); +if(!$kirby->get('snippet', $snippet)) $snippet = 'templates/default'; +?> + + +
+ +
+ + diff --git a/thumbs/.gitignore b/thumbs/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/thumbs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file