1
0
Fork 0

Initial public commit

master
Lukas Bestle 8 vuotta sitten
commit bbc99c6967

2
.gitignore vendored

@ -0,0 +1,2 @@
.DS_Store
/node_modules

18
.gitmodules vendored

@ -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

@ -0,0 +1,95 @@
# Rewrite rules
<IfModule mod_rewrite.c>
# 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]
</IfModule>
# Mime types
<IfModule mod_mime.c>
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
</IfModule>
# Compression
<IfModule mod_deflate.c>
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
</IfModule>
# Caching
<IfModule mod_expires.c>
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"
</IfModule>

@ -0,0 +1,2 @@
npm install
node_modules/.bin/gulp prod

@ -0,0 +1 @@
zlib.output_compression = On

@ -0,0 +1,2 @@
*
!.gitignore

@ -0,0 +1,2 @@
*
!.gitignore

@ -0,0 +1,2 @@
*
!.gitignore

@ -0,0 +1,2 @@
*
!.gitignore

@ -0,0 +1,2 @@
*
!.gitignore

@ -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.

@ -0,0 +1,14 @@
Title: Startseite
----
Description:
----
Text:
# Willkommen bei codesignd
Wo sich **Code** und **Design** begegnen.
Auch bei deinen Websites und Webprojekten.

@ -0,0 +1,14 @@
Title: Home
----
Description:
----
Text:
# Welcome at codesignd
Where **code** and **design** meet.
Even at your websites and web projects.

File diff suppressed because one or more lines are too long

After

Leveys:  |  Korkeus:  |  Koko: 5.1 KiB

File diff suppressed because one or more lines are too long

After

Leveys:  |  Korkeus:  |  Koko: 5.7 KiB

File diff suppressed because one or more lines are too long

After

Leveys:  |  Korkeus:  |  Koko: 6.7 KiB

File diff suppressed because one or more lines are too long

After

Leveys:  |  Korkeus:  |  Koko: 5.0 KiB

@ -0,0 +1 @@
<svg width="700" height="930" viewBox="0 0 700 930" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><g transform="rotate(30 -970.713 878.102)"><path d="M125.5 227.565L91.038 267.22a136.931 136.931 0 0 1-26.351-12.78l9.544-51.543a90.405 90.405 0 0 1-14.304-17.891l-52.412-2.177A136.675 136.675 0 0 1 .94 154.3l46.33-24.697a89.366 89.366 0 0 1 5.09-22.337L21.05 64.532a138.1 138.1 0 0 1 17.922-22.736L87.851 62.85a89.792 89.792 0 0 1 20.666-9.952l14.147-51.86c4.86-.52 9.794-.786 14.79-.786 4.653 0 9.252.231 13.787.682l14.175 51.964a89.792 89.792 0 0 1 20.666 9.952l49.565-21.35a138.117 138.117 0 0 1 17.76 22.318l-31.833 43.447a89.366 89.366 0 0 1 5.089 22.337l47.246 25.186a136.663 136.663 0 0 1-6.5 28l-53.402 2.218a90.405 90.405 0 0 1-14.304 17.891l9.645 52.085a136.896 136.896 0 0 1-26.222 12.503l-34.694-39.92a91.114 91.114 0 0 1-11.465.722c-3.885 0-7.711-.246-11.466-.722zm84.53-89.261c0-40.294-32.711-72.96-73.063-72.96-40.352 0-73.064 32.666-73.064 72.96s32.712 72.959 73.064 72.959c40.352 0 73.063-32.665 73.063-72.96z" fill="#F4B971"/><path stroke="#0BB888" stroke-width="14.613" d="M136.967 99.392l33.746 19.456v38.912l-33.746 19.455-33.747-19.455v-38.912z"/><ellipse stroke="#ED8F1B" stroke-width="30.2" cx="136.967" cy="138.304" rx="80.857" ry="80.741"/></g><g transform="rotate(-22 1292.504 16.483)"><path d="M125.5 227.565L91.038 267.22a136.931 136.931 0 0 1-26.351-12.78l9.544-51.543a90.405 90.405 0 0 1-14.304-17.891l-52.412-2.177A136.675 136.675 0 0 1 .94 154.3l46.33-24.697a89.366 89.366 0 0 1 5.09-22.337L21.05 64.532a138.1 138.1 0 0 1 17.922-22.736L87.851 62.85a89.792 89.792 0 0 1 20.666-9.952l14.147-51.86c4.86-.52 9.794-.786 14.79-.786 4.653 0 9.252.231 13.787.682l14.175 51.964a89.792 89.792 0 0 1 20.666 9.952l49.565-21.35a138.117 138.117 0 0 1 17.76 22.318l-31.833 43.447a89.366 89.366 0 0 1 5.089 22.337l47.246 25.186a136.663 136.663 0 0 1-6.5 28l-53.402 2.218a90.405 90.405 0 0 1-14.304 17.891l9.645 52.085a136.896 136.896 0 0 1-26.222 12.503l-34.694-39.92a91.114 91.114 0 0 1-11.465.722c-3.885 0-7.711-.246-11.466-.722zm84.53-89.261c0-40.294-32.711-72.96-73.063-72.96-40.352 0-73.064 32.666-73.064 72.96s32.712 72.959 73.064 72.959c40.352 0 73.063-32.665 73.063-72.96z" fill="#F4B971"/><path stroke="#0BB888" stroke-width="14.613" d="M136.967 99.392l33.746 19.456v38.912l-33.746 19.455-33.747-19.455v-38.912z"/><ellipse stroke="#ED8F1B" stroke-width="30.2" cx="136.967" cy="138.304" rx="80.857" ry="80.741"/></g><g transform="translate(195.129)"><path d="M237.64 426.779l-33.416 72.936a251.983 251.983 0 0 1-39.44-10.542l7.527-79.863a177.017 177.017 0 0 1-21.414-12.388l-65.364 46.426a255.39 255.39 0 0 1-28.881-28.88l46.426-65.365a177.017 177.017 0 0 1-12.388-21.414l-79.863 7.528A251.983 251.983 0 0 1 .285 295.776l72.936-33.416a179.801 179.801 0 0 1 0-24.72L.285 204.224a251.983 251.983 0 0 1 10.542-39.44l79.863 7.527a177.017 177.017 0 0 1 12.388-21.414L56.652 85.533a255.39 255.39 0 0 1 28.88-28.881l65.365 46.426a177.017 177.017 0 0 1 21.414-12.388l-7.528-79.863A251.983 251.983 0 0 1 204.224.285l33.416 72.936a179.801 179.801 0 0 1 24.72 0L295.776.285a251.983 251.983 0 0 1 39.44 10.542L327.69 90.69a177.017 177.017 0 0 1 21.414 12.388l65.364-46.426a255.39 255.39 0 0 1 28.881 28.88l-46.426 65.365a177.017 177.017 0 0 1 12.388 21.414l79.863-7.528a251.983 251.983 0 0 1 10.542 39.441L426.78 237.64a179.802 179.802 0 0 1 0 24.72l72.936 33.416a251.983 251.983 0 0 1-10.542 39.44l-79.863-7.527a177.017 177.017 0 0 1-12.388 21.414l46.426 65.364a255.39 255.39 0 0 1-28.88 28.881l-65.365-46.426a177.017 177.017 0 0 1-21.414 12.388l7.528 79.863a251.983 251.983 0 0 1-39.441 10.542l-33.416-72.936a179.802 179.802 0 0 1-24.72 0zM393.678 250c0-79.351-64.327-143.678-143.678-143.678S106.322 170.649 106.322 250 170.649 393.678 250 393.678 393.678 329.351 393.678 250z" fill="#F4B971"/><path stroke="#0BB888" stroke-width="28.736" d="M250 173.372l66.362 38.314v76.628L250 326.628l-66.362-38.314v-76.628z"/><circle stroke="#ED8F1B" stroke-width="59.387" cx="250.001" cy="250" r="159.004"/></g><path d="M462.316 221.5h-34.375l-10.312 13.75h55zm-44.687 17.188V249h55v-10.313h-55zm51.562 6.875h-3.437v-3.438h3.437v3.438zm-51.562 6.875v10.312h55v-10.313h-55zm51.562 6.875h-3.437v-3.438h3.437v3.438zm-51.562 6.875V276.5h55v-10.313h-55zm51.562 6.875h-3.437v-3.438h3.437v3.438z" fill="#0BB888"/></g></svg>

After

Leveys:  |  Korkeus:  |  Koko: 4.2 KiB

@ -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 <span class="color--brand-secondary">KEKS</span>-Strategie.
Klingt lecker? Dann erzähl mir von deinem Projekt, ich berate dich gerne!

@ -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.

@ -0,0 +1,9 @@
Title: Kontakt
----
URL-Key: kontakt
----
Description: Erfahre, wie du Lukas Bestle, den Inhaber von codesignd, erreichen kannst.

@ -0,0 +1,5 @@
Title: Contact
----
Description: Find out how to contact Lukas Bestle, the owner of codesignd.

@ -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).

@ -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).

@ -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
<h2 id="contact">Kontakt</h2>
(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.

@ -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
<h2 id="contact">Contact</h2>
(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.

@ -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

@ -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

@ -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));

@ -0,0 +1,16 @@
<?php
define('DS', DIRECTORY_SEPARATOR);
// load kirby
require(__DIR__ . DS . 'kirby' . DS . 'bootstrap.php');
// check for a custom site.php
if(file_exists(__DIR__ . DS . 'site.php')) {
require(__DIR__ . DS . 'site.php');
} else {
$kirby = kirby();
}
// render
echo $kirby->launch();

@ -0,0 +1 @@
Subproject commit fae381e5716a50fdc36fc8f5fa9ef9fe30e97384

@ -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.

@ -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"
}
}

@ -0,0 +1,298 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
0rkW0xLAQiVeN+M2gyMJgUhr/d8BWK+ls28=
=qAnb
-----END PGP PUBLIC KEY BLOCK-----

@ -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.

@ -0,0 +1,2 @@
*
!.gitignore

@ -0,0 +1,11 @@
title: Contact
pages: false
files: false
fields:
title:
label: Title
type: text
description:
label: Desciption
type: text
icon: file-text

@ -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

@ -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

@ -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: >
<strong>{{title}}</strong><br>
{{text}}
fields:
title:
label: Title
type: text
illustration:
label: Illustration
type: image
text:
label: Text
type: textarea
cta:
label: Call to action
type: textarea

@ -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

@ -0,0 +1,2 @@
*
!.gitignore

@ -0,0 +1,25 @@
<?php
// Enable debugging on the dev host but disable caching
c::set('debug', true);
c::set('cache', false);
// Disable assets suffix on the dev host
c::set('assets.suffix', '');
// Language setup with dev domains
c::set('languages', [
[
'code' => 'en',
'name' => 'English',
'default' => true,
'locale' => 'en_US',
'url' => 'http://codesignd.dev',
],
[
'code' => 'de',
'name' => 'Deutsch',
'locale' => 'de_DE',
'url' => 'http://de.codesignd.dev',
]
]);

@ -0,0 +1,3 @@
<?php
require_once(__DIR__ . DS . 'config.codesignd.dev.php');

@ -0,0 +1,80 @@
<?php
/*
---------------------------------------
License Setup
---------------------------------------
Please add your license key, which you've received
via email after purchasing Kirby on http://getkirby.com/buy
It is not permitted to run a public website without a
valid license key. Please read the End User License Agreement
for more information: http://getkirby.com/license
*/
// The license was removed for the public repository
c::set('license', '*snip*');
/*
---------------------------------------
Kirby Configuration
---------------------------------------
By default you don't have to configure anything to
make Kirby work. For more fine-grained configuration
of the system, please check out http://getkirby.com/docs/advanced/options
*/
// Use production assets by default
c::set('assets.suffix', '.min');
// Cache setup
c::set('cache', true);
c::set('cache.ignore', ['contact', 'legal']);
// Representations
c::set('representations.accept', true);
// Language setup
c::set('languages', [
[
'code' => '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');
}
]
]);

@ -0,0 +1,21 @@
<?php
return function($site, $pages, $page) {
$form = uniform('contact', [
'required' => [
'name' => '',
'_from' => 'email'
],
'actions' => [
[
'_action' => 'email',
'to' => qdated(),
'sender' => 'codesignd form <no-reply@codesignd.de>',
'subject' => 'Message from the contact form (' . $site->title() . ')',
'snippet' => 'email-templates/contact'
]
]
]);
return compact('form');
};

@ -0,0 +1,23 @@
<?php
l::set('nav.main.label', 'Primär');
l::set('nav.lang.label', 'Sprachauswahl');
l::set('footer.top', 'Nach oben');
l::set('footer.madewith', 'Erstellt mit');
l::set('footer.source', 'Quellcode');
l::set('go.contact', '➪ Kontakt');
l::set('home-banner.learnmore', 'Mehr erfahren');
l::set('home-banner.learnmore.label', 'Mehr über meine Leistungen erfahren');
l::set('home-banner.contact', 'Kontakt');
l::set('contact.name', 'Name');
l::set('contact.email', 'E-Mail-Adresse');
l::set('contact.message', 'Nachricht');
l::set('contact.potty', 'Bitte lasse dieses Feld leer');
l::set('contact.submit', 'Absenden');
l::set('contact.heading.email', 'E-Mail');
l::set('qdated.error', 'Bei der Anzeige der E-Mail-Adresse ist ein Fehler aufgetreten. Bitte kontaktiere mich über <a href="https://twitter.com/lukasbestle">Twitter</a> und mache mich darauf aufmerksam. Danke!');

@ -0,0 +1,23 @@
<?php
l::set('nav.main.label', 'Primary');
l::set('nav.lang.label', 'Language select');
l::set('footer.top', 'Top');
l::set('footer.madewith', 'Made with');
l::set('footer.source', 'Source');
l::set('go.contact', '➪ Contact');
l::set('home-banner.learnmore', 'Learn more');
l::set('home-banner.learnmore.label', 'Learn more about my services');
l::set('home-banner.contact', 'Contact');
l::set('contact.name', 'Name');
l::set('contact.email', 'Email address');
l::set('contact.message', 'Message');
l::set('contact.potty', 'Please leave this field blank');
l::set('contact.submit', 'Submit');
l::set('contact.heading.email', 'Email');
l::set('qdated.error', 'An error occured while displaying the email address. Please contact me via <a href="https://twitter.com/lukasbestle">Twitter</a> and tell me about this. Thank you!');

@ -0,0 +1 @@
Subproject commit f9c5f3db5a8cbb3d25e1a84c19b7c56d73b71422

@ -0,0 +1 @@
Subproject commit cfe2ef2c4cb94f7e1e2bb244427e18569f19bed5

@ -0,0 +1 @@
Subproject commit eb92317c13603859d298b554a88656cdcdc38f17

@ -0,0 +1 @@
Subproject commit 3e1d562073062a44395d49d2f8d3e2a9b8fae10a

@ -0,0 +1,42 @@
<?php
/**
* Returns the current qdated address
* If qdated is not available, returns null
*
* @return string
*/
function qdated() {
$path = $_SERVER['HOME'] . DS . '.qdated-current';
if(!is_file($path)) return null;
return 'dated-' . trim(f::read($path)) . '@' . url::host();
}
/**
* Returns an HTML a mailto tag with the current qdated address
* If qdated is not available, returns an HTML error message
*
* @param mixed $text Optional text for the link
* Can also be true to use the email
* address but put a line break in it
* @return string HTML code
*/
function qdatedHtml($text = false) {
$email = qdated();
if(!$email) return '<p><strong>' . l::get('qdated.error') . '</strong></p>';
if($text === true) $text = str_replace('@', '<br>@', $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'));
}
]);

@ -0,0 +1 @@
Subproject commit 26f17b120bd2f1a250c7639a9a6ae9119b33b937

@ -0,0 +1,6 @@
Name: <?= a::get($form, 'name') . "\n" ?>
Email: <?= a::get($form, '_from') . "\n" ?>
----
<?= a::get($form, 'message') ?>

@ -0,0 +1,4 @@
<?php pattern('shared/2-blocks/footer', ['pSite' => 'codesignd']) ?>
<?= js('assets/js/index' . c::get('assets.suffix') . '.js') ?>
</body>
</html>

@ -0,0 +1,31 @@
<!DOCTYPE html>
<html lang="<?= $site->language()->code() ?>">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title><?= $page->title()->html() ?> ~ <?= $site->title()->html() ?></title>
<meta name="description" content="<?= $page->description()->or($site->description()) ?>">
<link rel="icon" href="<?= url('assets/img/favicon-96.png') ?>" type="image/png">
<link rel="apple-touch-icon-precomposed" href="<?= url('assets/img/favicon-152.png') ?>">
<?php foreach($site->languages()->filterBy('code', '!=', $site->language()->code()) as $lang): ?>
<link rel="alternate" href="<?= $page->url($lang->code()) ?>" hreflang="<?= $lang->code() ?>">
<?php endforeach ?>
<link rel="pgpkey" type="application/pgp-keys" href="<?= url('pgp.asc') ?>">
<link rel="preload" href="<?= url('assets/fonts/input-sans-narrow-regular.woff2') ?>" as="font" type="font/woff2" crossorigin>
<?php if($suffix = c::get('assets.suffix')): ?>
<style><?= f::read('assets/css/index' . $suffix . '.css') ?></style>
<?php else: ?>
<?= css('assets/css/index.css') ?>
<?php endif ?>
</head>
<body id="top">
<?php pattern('shared/2-blocks/header', [
'pSite' => 'codesignd',
'navData' => ['languages' => $site->languages(), 'items' => $site->pages()->visible()]
]) ?>

@ -0,0 +1,7 @@
<?php
pattern('shared/2-blocks/nav', [
'wrapper' => false,
'languages' => $site->languages(),
'items' => $site->pages()->visible()
]);

@ -0,0 +1,52 @@
<article class="text">
<h1><?= html($page->title()) ?></h1>
<div class="contact">
<div class="contact__main">
<form class="contact__form form<?php e($form->successful(), ' form--success') ?>" action="<?= url::current() ?>" method="post">
<div class="field field--required field--small">
<label class="field__label" for="name"><?= l::get('contact.name', 'Name') ?></label>
<input class="input field__input<?php e($form->hasError('name'), ' input--invalid') ?>" type="text" name="name" id="name" value="<?php $form->echoValue('name') ?>" placeholder=" " autocomplete="name" required/>
</div>
<div class="field field--required field--small">
<label class="field__label" for="email"><?= l::get('contact.email', 'Email address') ?></label>
<input class="input field__input<?php e($form->hasError('_from'), ' input--invalid') ?>" type="email" name="_from" id="email" value="<?php $form->echoValue('_from') ?>" placeholder=" " autocomplete="email" required/>
</div>
<div class="field">
<label class="field__label" for="message"><?= l::get('contact.message', 'Message') ?></label>
<textarea class="input field__input" rows="7" name="message" id="message"><?php $form->echoValue('message') ?></textarea>
</div>
<label class="vh" for="website"><?= l::get('contact.potty', 'Please leave this field blank') ?></label>
<input class="vh" type="text" name="website" id="website" autocomplete="off"/>
<div class="form__message"><?php if($form->hasMessage() && !$form->successful()): ?><?php $form->echoMessage() ?><?php endif ?></div>
<button class="button form__submit" type="submit" name="_submit" value="<?php echo $form->token() ?>"<?php e($form->successful(), ' disabled')?>><?= l::get('contact.submit', 'Submit') ?></button>
<img class="contact__stamp" src="<?= url('assets/img/stamp.svg') ?>" alt="">
</form>
<div class="contact__thank-you">
<?php if($form->hasMessage() && $form->successful()): ?>
<?php $form->echoMessage() ?>
<?php endif ?>
</div>
</div>
<aside class="contact__sidebar">
<div class="contact__detail">
<h2 class="contact__heading"><?= l::get('contact.heading.email', 'Email') ?></h2>
<div class="contact__email"><?= qdatedHtml(true) ?> <a href="<?= url('legal') ?>#contact">?</a></div>
<small><a href="<?= url('pgp.asc') ?>" rel="pgpkey" type="application/pgp-keys">PGP: 2E2A DD32 FE50 61C1</a></small>
</div>
<div class="contact__detail">
<h2 class="contact__heading">Twitter</h2>
<?= twitter('lukasbestle') ?>
</div>
</aside>
</div>
</article>

@ -0,0 +1,3 @@
<article class="text text-container">
<?= $page->text()->kirbytext() ?>
</article>

@ -0,0 +1 @@
<?php pattern('codesignd/2-blocks/home-banner', ['illustration' => $page->image()->url(), 'text' => $page->text()->kt()]) ?>

@ -0,0 +1,10 @@
<article class="text">
<h1><?= html($page->title()) ?></h1>
<?php foreach($page->services()->toStructure() as $service): ?>
<?php $illustration = ($illustration = $service->illustration()->toFile())? $illustration->url() : false ?>
<?php pattern('codesignd/2-blocks/service', ['illustration' => $illustration, 'title' => $service->title(), 'coloredTitle' => ($site->language()->code() === 'de'), 'text' => $service->text()->kt()]) ?>
<?php endforeach ?>
</article>
<hr>
<?php pattern('shared/2-blocks/cta', ['text' => $page->cta()->kirbytext(), 'button' => l::get('go.contact', '➪ Contact'), 'link' => url('contact')]) ?>

@ -0,0 +1,19 @@
<?php
// Special treatment for AJAX submissions
if(r::is('POST')) {
$fields = [];
foreach(r::data() as $field => $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');
}

@ -0,0 +1,3 @@
<?php
require_once('default.php');

@ -0,0 +1,17 @@
<?php
// Determine snippet name and fall back to default if it does not exist
$snippet = 'templates/' . $page->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);

@ -0,0 +1,13 @@
<?php
// Determine snippet name and fall back to default if it does not exist
$snippet = 'templates/' . $page->intendedTemplate();
if(!$kirby->get('snippet', $snippet)) $snippet = 'templates/default';
?>
<?php snippet('header') ?>
<main class="main">
<?php snippet($snippet) ?>
</main>
<?php snippet('footer') ?>

2
thumbs/.gitignore vendored

@ -0,0 +1,2 @@
*
!.gitignore
Ladataan…
Peruuta
Tallenna