Compare commits

..

15 Commits

Author SHA1 Message Date
Justas Azna 9dd6cc1608 Compile signatures 2017-10-08 15:41:16 +02:00
Justas Azna fb50d7bc8d play -> justas -> english only sig 2017-10-08 15:39:58 +02:00
Justas Azna e0862e6e13 Visual tweaks to play template as requested by Lars 2017-10-08 15:28:22 +02:00
Justas Azna 3fbc24f4fe Cleanup play email template conf 2017-10-08 15:26:06 +02:00
Justas Azna 7b301f7c75 Small tweaks for Lars' signature 2017-10-05 15:44:04 +02:00
Justas Azna 2bf2325615 Remove slogan from Lars' signature 2017-10-05 15:34:07 +02:00
Justas Azna 3925c4bed6 Tweak Lars' signature 2017-10-05 15:14:19 +02:00
Sander Sink d5df4ced66 Merge branch 'master' into fadeit@v4.x 2017-07-12 19:08:49 +03:00
Sander Sink 979e3065f3 added myself 2017-07-12 19:08:35 +03:00
Dan Mindru 71da58f72f Add /dist/play 2017-05-11 10:07:37 +02:00
Dan Mindru 74d080c99e Merge branch 'master' into fadeit@v4.x 2017-05-11 10:07:04 +02:00
Dan Mindru f1f6b45b3b Merge master & add Play sigs too 2017-05-11 10:05:28 +02:00
Dan Mindru 371da9b9c5 Merge branch 'master' of github.com:fadeit/responsive-html-email-signature into fadeit@v4.x 2017-05-11 09:55:28 +02:00
Dan Mindru e0405fc561 fadeit signatures 2017-05-11 09:51:39 +02:00
Dan Mindru 5525119e57 Allow /dist 2017-05-11 09:51:25 +02:00
79 changed files with 4524 additions and 30017 deletions

View File

@ -1,18 +0,0 @@
module.exports = {
env: {
browser: true,
commonjs: true,
es6: true
},
extends: ['standard', 'prettier'],
globals: {
Atomics: 'readonly',
SharedArrayBuffer: 'readonly'
},
parserOptions: {
ecmaVersion: 2018
},
rules: {
semi: 0
}
};

2
.gitattributes vendored
View File

@ -1,2 +0,0 @@
demo/* linguist-vendored
tests/sample/* linguist-vendored

View File

@ -1,29 +0,0 @@
name: Test template output
on: [push, pull_request]
jobs:
test:
name: Test on node ${{ matrix.node_version }} and ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
node_version: [10, 11, 12, 13, 14]
os: [ubuntu-latest, windows-latest, macOS-latest]
steps:
- uses: actions/checkout@v1
- name: Use Node.js ${{ matrix.node_version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node_version }}
- name: npm install & test
run: |
npm -v
node -v
npm install
npm run test
env:
CI: true

3
.gitignore vendored
View File

@ -2,6 +2,3 @@
/node_modules/
/tmp/
.DS_Store
/dist
IDEAS.md
npm_debug.log

2
.nvmrc
View File

@ -1 +1 @@
v12
v7

View File

@ -1,5 +0,0 @@
{
"semi": true,
"singleQuote": true,
"printWidth": 120
}

1
CNAME
View File

@ -1 +0,0 @@
responsive-html-email-signature-generator.com

157
README.md
View File

@ -1,73 +1,63 @@
# Responsive HTML email signature(s)
[![npm](https://img.shields.io/npm/v/responsive-html-email-signature.svg)](https://www.npmjs.com/package/responsive-html-email-signature)
[![license](https://img.shields.io/github/license/danmindru/responsive-html-email-signature.svg)](/LICENSE)
[![test action status](https://github.com/danmindru/responsive-html-email-signature/workflows/Test%20template%20output/badge.svg)](https://github.com/danmindru/responsive-html-email-signature/actions)
### Let's punch email clients in the stomach 👊
When you need some basic responsive email signatures that work on mobile.<br/>
...and your colleagues need them too.<br/>
...but you don't want to deal with tables and inline styles.
[Read the docs in other languages](/i18n) ↗️
## Preview
## Preview
Here are some examples:
![responsive emails-01](https://cloud.githubusercontent.com/assets/1515742/10591900/13889d32-76b9-11e5-8dc0-b89d80189e93.png)
![responsive emails-02](https://cloud.githubusercontent.com/assets/1515742/10591901/139c4954-76b9-11e5-80f7-5b0ccaf5af81.png)
## Getting started
- Clone repo `git clone https://github.com/danmindru/responsive-html-email-signature.git`
- Run `npm install`
- Run `npm start` to generate templates from configuration. This will continue to watch your files and re-make the template until you exit.
- Clone repo `git clone https://github.com/fadeit/responsive-html-email-signature.git`
- Clone repo & run `yarn` or `npm install`
- Run `gulp` to generate templates from configuration
### Customizing templates
- Edit files in _/templates_
- Edit files in */templates*
- Run `gulp watch` to watch templates and re-generate
- Open files from `./dist` in your fav browser to check them out
> When you're done, check out [how to add them to your email client of choice](#usage-with-different-email-clients) if in doubt.
## Motivation
## Motivation
Writing HTML emails & email signatures sucks. Let's make it easier. We can't fix all email clients, but we can surely make our lives easier with some automation. <br/>
> See a fairly comprehensive rant on the subject (and not only) [in this article](https://fadeit.dk/blog/post/html-emails-and-email-signatures-how-hard-can-it-be).
## What does this pile of code do
- [x] generates email templates from your config
- [x] allows generating multiple templates at once (for your colleagues too!)
- [x] transforms linked (`<link>`) CSS into inline styles
- [x] embeds local `img[src]` into the template (base64).\*
- [x] embeds local `img[src]` into the template (base64).*
- [x] minifies the template
- [x] ads some basic media queries for mail clients that support them
- [x] can build templates from multiple sources
- [x] watches HTML / CSS files for changes and re-builds
- [x] supports LESS / SASS / PostCSS
- [x] autoprefixer, so you don't have to worry about your `-moz-`s or `-webkit-`s
- [x] linting, checks for used template config parameters and more!
\*_Some mail clients might have [hard limits](https://support.google.com/a/answer/176652?hl=en) regarding the email size, so don't include large images if possible. If you need to, use a URL instead and host the image somewhere else._
**Some mail clients don't support them, so an external URL might be a good idea. Also, some clients might complain about the size, so keep an eye out.*
## Docs
### Installing
```bash
$ npm install
$ npm start # By default, templates will be created in `./dist` and HTML & CSS files in './templates' will be watched for changes.
$ yarn # or npm install
$ gulp # By default, HTML & CSS files in './src' will be watched for changes
```
> Note: works well with node v10+. Earlier and later versions might also work.
> Note: it's built using node v7.x, so please make sure your node version is up to date. Version 6+ should be fine.
### Configuring
To make a basic email from existing templates, you only have to edit the `conf.json` file in each template.
For example, the dark template accepts the following:
```json
{
"id": "<will-be-used-for-filename>",
@ -83,161 +73,129 @@ For example, the dark template accepts the following:
```
### Generating multiple emails from the same config (for your colleagues too!)
To generate multiple templates, use an array instead of an object in `conf.json`, like so:
Use an array instead of object in `conf.json`, having multiple configs like the one above:
```json
[{ ...conf1 }, { ...conf2 }]
[
{...conf1},
{...conf2}
]
```
### Using config values in HTML
Config variables are made available in all HTML files. <br/>
Config variables are be made available in all HTML files. <br/>
Add any variable to the configuration file and use it in HTML like so:
```html
<p><!-- @echo yourCustomVariable --></p>
```
Where the configuration contains:
```json
{
"yourCustomVariable": "Custom!"
}
```
> NB: config variables also accept HTML. That's useful for including links.
> NB: config variables accept HTML.
### Adding CSS & pre-processing
Any number of CSS, SASS or LESS in a template directory & they will be automatically processed & inlined into the files outputed in `./dist`.
Any number of CSS, SASS or LESS files in a template directory & they will be automatically processed & inlined into the files outputed in `./dist`.
### Multiple emails in the same template
Templates can contain multiple HTML files from which to build emails. For example, the dark template has `signature.html` and `signature-reply.html`, which is a simpler version.
Each HTML file will be treated as an email template, except for `*.inc.html`. See below ⬇️
### Using partials (\*.inc.html)
By naming files with `*.inc.html`, they become partials. Partials will not be treated as templates (ignored), but they can be included in any HTML template using the `@include` HTML comment.
### Partials (*.inc.html)
If you indeed have multiple emails in the same templates, you can be sure some of the HTML repeats.
Luckily, partials can be used for common parts (i.e. headers, footers).
Partials *will not* be treated as a email template, but ignored when built. They can however be included in other HTML files, like so:
```html
<section>
<!-- @include footer.inc.html -->
</section
```
Partials are useful if you have bits of HTML that repeat, like headers, footers, etc.
### Advanced templating
Inside HTML files, any [preprocess directive](https://github.com/jsoverson/preprocess#all-directives) is supported, such as `@if`, `@extend`, `@exec`, etc.
## Template structure (examples)
There are no rules regarding how to structure templates, but it's a good idea to create directories for a template group. <br/>
There are 2 examples of template structures, one for the `light` email template and one for the `dark` one.
Here's how the dark one is structured:
Here's how the dark one looks:
```bash
./templates
./src
├── dark
├── assets
├── dark.png # Image to embed as base64
├── conf.json # Template strings, logo, etc.
├── conf.js # Template strings, logo, etc.
├── dark.css # Stylesheet.
├── footer.inc.html # Contact info & logo
├── head.inc.html # 'Responsive' CSS goes here
├── signature-reply.inc.html # Simplified signature (loads head)
├── signature.html # Full signature (loads head/footer)
├── signature-reply.html # Simplified signature (loads head)
```
Here's how the light one is structured:
Here's how the light one looks:
```bash
./templates
./src
├── light
├── assets
├── light.png # Image to embed as base64
├── conf.json # Template strings, logo, etc.
├── conf.js # Template strings, logo, etc.
├── footer.inc.html # Contact info & logo
├── full-mail.html # Body + signature
├── head.inc.html # 'Responsive' CSS goes here
├── light.css # Stylesheet.
├── signature-reply.inc.html # Simplified signature (loads head)
├── signature.html # Full signature (loads head/footer)
├── signature-reply.html # Simplified signature (loads head)
```
Files are included via [gulp-preprocess](https://www.npmjs.com/package/gulp-preprocess).
There's one convention you have to keep in mind: `all files that you wish to include should follow the *.inc.html format`. The gulp task ignores `*.inc.html` files, but will try to process & create email templates from all `.html` files.
You are of course encouraged to change the default structure for your use case.
## Overview of the build process
## Overview of the build process
The diagram below shows what happens to your email templates.
Each folder in 'templates' is considered a `template group`. A template file will be generated for each of the configuration objects you add have in the template group -> `conf.js`.
![Responsive HTML email template/signatures diagram](https://user-images.githubusercontent.com/1515742/45000195-35268300-afc3-11e8-82b4-7507430c48a0.png)
Each folder in 'src' is considered a `template group`. A template file will be generated for each of the configuration objects you add have in the template group -> `conf.js`.
![Responsive HTML email template/signatures diagram](https://fadeit.dk/posts/html-emails-and-email-signatures-how-hard-can-it-be/html-responsive-email-template-build-diagram.png)
## CSS Support
Remember, it's HTML mails, so you need to check a big-ass table to find out nothing's gonna work.
See [this](https://www.campaignmonitor.com/css/) for more info. [Gulp-inline-css](https://www.npmjs.com/package/gulp-inline-css) is being used to convert whatever CSS you throw at it to inline styles, but it probably won't handle everything.
Some bonuses of using `gulp-inline-css`: many css props will be converted to attributes. For example, the 'background-color' prop will be added as 'bgcolor' attribute to table elements.
For more details take a look at the [inline-css mappings](https://github.com/jonkemp/inline-css/blob/master/lib/setTableAttrs.js).
## Usage with different email clients
### Thunderbird
There are several Thunderbird plugins which can automatically insert signatures when composing e-mails. We recommend [SmartTemplate4](https://addons.mozilla.org/en-us/thunderbird/addon/smarttemplate4) as one of the options. It can use different templates for new e-mails, replies and forwarded e-mails.
### Gmail
Go to your mailbox settings & paste the generated signature.
> **NB**: Gmail doesn't seem to support inlined (base64) images. You have to use absolute `http(s)//...`.
### Office 365 / outlook.live.com
It's a bit hacky to set up, but possible. See [this issue](https://github.com/danmindru/responsive-html-email-signature/issues/52).
### Apple Mail / OS X (oh boy)
#### Solution 1
- Open Mail.app and go to `Mail` -> `Preferences` -> `Signatures`
- Create a new signature and write some placeholder text (doesn't matter what it is, but you have to identify it later).
- Close Mail.app.
- Open terminal, then open the signature files using TextEdit (might be different for iCloud drive check the article below).
```
$ open -a TextEdit ~/Library/Mobile\ Documents/com~apple~mail/Data/V3/MailData/Signatures/ubiquitous_*.mailsignature
```
- Keep the file with the placeholder open, close the other ones.
- Replace the `<body>...</body>` and it's contents with the template of your choice. _Don't remove the meta information at the top!_
- Replace the `<body>...</body>` and it's contents with the template of your choice. *Don't remove the meta information at the top!*
- Open Mail.app and compose a new mail. Select the signature from the list to test it out.
> **NB**: Images won't appear in the signature preview, but will work fine when you compose a message.
**NB**: Images won't appear in the signature preview, but will work fine when you compose a message.
#### Solution 2
You can also open the HTML files in `/dist` in a browser, CMD + A, CMD + C and then paste into the signature box. This won't copy the `<html>` part or the `<style>` part that includes media queries. Follow the guide if you want it.
#### Troubleshooting
If solution #1 doesn't work, you can repeat the steps and lock the signature files before you open Mail.app again.
Lock Files:
```
$ chflags uchg ~/Library/Mail/V3/MailData/Signatures/*.mailsignature
```
If you want to do changes later, you have to unlock the files:
```
$ chflags nouchg ~/Library/Mail/V3/MailData/Signatures/*.mailsignature
```
@ -247,15 +205,14 @@ If you are using iCloud drive or having problems with it, you might also want to
### Outlook 2010 Client for Windows 7
#### Solution 1
- Open Outlook 2010 and go to `File > Option > Mail > Signature`
- Create new signature (with a placeholder for your convenience)
- Open signature folder using CMD
> As the AppData folder is hidden, I'd recommend you to open it via CMD.
> As the AppData folder is hidden, I'd recommend you to opne it via CMD.
```
cd AppData\Roaming\Microsoft
cd AppData\Roamin\Microsoft
start Signatures
```
@ -264,7 +221,6 @@ start Signatures
- Open Outlook again and check your signature
#### Solution 2
Unfortnately, Outlook 2010 client dosen't support HTML file import features for your email template. But you can add your own signatures by simple Copy and paste like **Solution 2** above.
- Open built html file on `/dist` folder and Ctrl A + C
@ -273,12 +229,11 @@ Unfortnately, Outlook 2010 client dosen't support HTML file import features for
> **NB**: base 64 will not be shown on Outlook 2010 client. So, I recommend to use external url if you want to use images.
## Other commands
------------------------------
### `npm run test`
<br/>
<a href="http:fadeit.dk"><img src="https://fadeit.dk/src/assets/img/brand/fadeit_logo_full.svg" alt="The fadeit logo" style="width:200px;"/></a><br/><br/>
Runs tests once.
### `npm run once`
Creates templates and exits; does not watch files.
#### About fadeit
We build awesome software, web and mobile applications.
See more at [fadeit.dk](https://fadeit.dk)

View File

@ -1,6 +0,0 @@
module.exports = {
SOURCE_DIR: 'templates',
DIST_DIR: 'dist',
WORKING_DIR: 'tmp',
CONFIGURATION_FILE: 'conf.json'
}

View File

@ -1,14 +1,18 @@
{
"id": "ONEstore",
"name": "0 0 0 매니저",
"team": "스토어 기획팀",
"title": "Dev Relations",
"welcome": "안녕하세요.",
"introParagraph": "Thanks for writing up this email.<br/> We are delighted to reply with a responsive template.",
"contactMain": "<a href='tel:+821012345678'><span>+82-10-1234-5678</span></a> | ",
"contactMail": "devhelper@onestore.co.kr",
"contactSecondary": "성남시 분당구 판교역로 188 SK플래닛 건물 11층",
"logoUrl": "assets/type01.png",
"logoAlt": "Onestore logo",
"website": "http://onesto.re/"
"persons": [
{
"id": "ONEstore",
"name": "0 0 0 매니저",
"team": "스토어 기획팀",
"title": "Dev Relations",
"welcome": "안녕하세요.",
"introParagraph": "Thanks for writing up this email.<br/> We are delighted to reply with a responsive template.",
"contactMain": "<a href='tel:+821012345678'><span>+82-10-1234-5678</span></a> | ",
"contactMail": "devhelper@onestore.co.kr",
"contactSecondary": "성남시 분당구 판교역로 188 SK플래닛 건물 11층",
"logoUrl": "assets/type01.png",
"logoAlt": "Onestore logo",
"website": "http://onesto.re/"
}
]
}

View File

@ -1,15 +1,19 @@
{
"id": "ONEstoreBlack",
"signature": "Best regards,",
"name": "Joo Hyung Park",
"team": "Service Planning Team",
"title": "Dev Relations",
"welcome": "안녕하세요.",
"introParagraph": "Thanks for writing up this email.<br/> We are delighted to reply with a responsive template.",
"contactMain": "Call <a href='tel:+821012345678'><span>+82-10-1234-5678</span></a> or email us at",
"contactMail": "devhelper@onestore.co.kr",
"contactSecondary": "188, Pangyoyeok-ro, Bundang-gu, Seongnam-si, Gyeonggi-do, Korea",
"logoUrl": "assets/type03.png",
"logoAlt": "ONEstore. logo",
"website": "http://onesto.re/"
"persons": [
{
"id": "ONEstoreBlack",
"signature": "Best regards,",
"name": "Joo Hyung Park",
"team": "Service Planning Team",
"title": "Dev Relations",
"welcome": "안녕하세요.",
"introParagraph": "Thanks for writing up this email.<br/> We are delighted to reply with a responsive template.",
"contactMain": "Call <a href='tel:+821012345678'><span>+82-10-1234-5678</span></a> or email us at",
"contactMail": "devhelper@onestore.co.kr",
"contactSecondary": "188, Pangyoyeok-ro, Bundang-gu, Seongnam-si, Gyeonggi-do, Korea",
"logoUrl": "assets/type03.png",
"logoAlt": "ONEstore. logo",
"website": "http://onesto.re/"
}
]
}

View File

@ -1,13 +1,17 @@
{
"id": "fadeit",
"signature": "Yours truly,",
"name": "Jane Whatsmyname",
"welcome": "Hi there,",
"introParagraph": "Thanks for writing up this email.<br/> We are delighted to reply with a responsive template.",
"contactMain": "Call <a href='tel:81100200'><span>81100200</span></a> or email us at",
"contactMail": "info@fadeit.dk",
"contactSecondary": "Anelystparken 31, DK-8381 Tilst, Aarhus",
"logoUrl": "http://fadeit.dk/src/assets/img/brand/fadeit-logo.png",
"logoAlt": "fadeit logo",
"website": "http://fadeit.dk"
"persons": [
{
"id": "fadeit",
"signature": "Yours truly,",
"name": "Jane Whatsmyname",
"welcome": "Hi there,",
"introParagraph": "Thanks for writing up this email.<br/> We are delighted to reply with a responsive template.",
"contactMain": "Call <a href='tel:81100200'><span>81100200</span></a> or email us at",
"contactMail": "info@fadeit.dk",
"contactSecondary": "Anelystparken 31, DK-8381 Tilst, Aarhus",
"logoUrl": "http://fadeit.dk/src/assets/img/brand/fadeit-logo.png",
"logoAlt": "fadeit logo",
"website": "http://fadeit.dk"
}
]
}

View File

@ -1,11 +1,15 @@
{
"id": "play",
"signature": "Best regards,",
"name": "Jane Whatsmyname",
"contactMain": "Call <a href='tel:004581100200'><span>(45) 81100200</span></a> or email us at",
"contactMail": "info@tryplay.dk",
"slogan": "LED Pylon. LED Wall. Digital Signage.",
"logoUrl": "https://informationscreen.com/manage/assets/images/play-logo.png",
"logoAlt": "Play. logo",
"website": "http://tryplay.dk"
"persons": [
{
"id": "play",
"signature": "Best regards,",
"name": "Jane Whatsmyname",
"contactMain": "Call <a href='tel:004581100200'><span>(45) 81100200</span></a> or email us at",
"contactMail": "info@tryplay.dk",
"slogan": "LED Pylon. LED Wall. Digital Signage.",
"logoUrl": "https://informationscreen.com/manage/assets/images/play-logo.png",
"logoAlt": "Play. logo",
"website": "http://tryplay.dk"
}
]
}

1
dist/fadeit/full-mail-dan.html vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/fadeit/full-mail-justas.html vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/fadeit/full-mail-lars.html vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/fadeit/full-mail-mie.html vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/fadeit/full-mail-sander.html vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/fadeit/signature-dan.html vendored Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="viewport" content="width=device-width"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">@media only screen and (max-width:480px){.footer td{font-size:12px!important}.footer__main__col1,.footer__main__col2{width:100%!important}.footer__main__col2__td{text-align:left;padding-bottom:20px}.footer__main__col2__td__img{padding-left:0!important}.gray-hr hr{margin-bottom:10px!important;margin-top:10px!important}}@media only screen and (min-width:1025px){.background,.body-with-bg{background-color:#F1F1F1}.body-with-bg .main{border:1px solid #E9E9E9!important;max-width:960px;margin:0 auto}.background{padding:30px}}</style></head><body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"><br><table class="main rbcc" style="border: 0; cellpadding: 0; cellspacing: 0; padding-top: 15px;" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff" width="100%"><tr class="sp" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="sp__inner" style="padding: 15px 0;"></td></tr><tr class="rbcc" style="border: 0; box-sizing: border-box; cellpadding: 0; cellspacing: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer" style="border-top: 8px solid #EAEAEA; color: #888; padding: 20px 30px 0px 30px;" bgcolor="#f5f5f5"><table class="rbcc footer__main" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="100%"><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer__main__signature" align="left" style="align: left; color: #888; font-size: 14px;">Med venlig hilsen / best regards,<br>Dan Mindru<br></td></tr><tr class="gray-hr" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td width="100%"><hr class="gray-hr" style="background: transparent; border-bottom: 1px solid #E4E4E4; border-top: none; color: transparent; margin-bottom: 20px; margin-top: 20px;"></td></tr><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><table class="rbcc footer__main__col1" align="left" style="align: left; border: 0; cellpadding: 0; cellspacing: 0; margin-bottom: 30px;" border="0" cellpadding="0" cellspacing="0" width="70%"><td class="footer__main__col1__td" align="left" style="align: left; color: #888; font-size: 14px;"><strong>Call <a href="tel:004552783387" style="color: #888; text-decoration: none;"><span style="color: #888 !important; text-decoration: none !important;">(+45) 52783387</span></a> or email me at <a href="mailto:dm@fadeit.dk" target="_blank" style="color: #888; text-decoration: none;">dm@fadeit.dk</a></strong><br><a href="https://goo.gl/maps/9ENsvuF6TjP2" style="color: #888; text-decoration: none;"><span style="color: #888 !important; text-decoration: none !important;">Thorsagervej 11-13, 8550 Ryomgård, Denmark</span></a></td></table><table class="rbcc footer__main__col2" align="right" style="align: right; border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="30%"><td class="footer__main__col2__td" align="right" style="align: right; color: #888; font-size: 14px;"><a href="https://fadeit.dk" style="color: #888; text-decoration: none;"><img src="https://fadeit.dk/src/assets/img/brand/fadeit-logo.png" alt="fadeit logo" class="footer__main__col2__td__img" style="border: 0; height: auto; max-height: 38px; max-width: 100%; padding-left: 10px; padding-top: 6px;"></a></td></table></tr></table></td></tr></table></body></html>

1
dist/fadeit/signature-justas.html vendored Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="viewport" content="width=device-width"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">@media only screen and (max-width:480px){.footer td{font-size:12px!important}.footer__main__col1,.footer__main__col2{width:100%!important}.footer__main__col2__td{text-align:left;padding-bottom:20px}.footer__main__col2__td__img{padding-left:0!important}.gray-hr hr{margin-bottom:10px!important;margin-top:10px!important}}@media only screen and (min-width:1025px){.background,.body-with-bg{background-color:#F1F1F1}.body-with-bg .main{border:1px solid #E9E9E9!important;max-width:960px;margin:0 auto}.background{padding:30px}}</style></head><body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"><br><table class="main rbcc" style="border: 0; cellpadding: 0; cellspacing: 0; padding-top: 15px;" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff" width="100%"><tr class="sp" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="sp__inner" style="padding: 15px 0;"></td></tr><tr class="rbcc" style="border: 0; box-sizing: border-box; cellpadding: 0; cellspacing: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer" style="border-top: 8px solid #EAEAEA; color: #888; padding: 20px 30px 0px 30px;" bgcolor="#f5f5f5"><table class="rbcc footer__main" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="100%"><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer__main__signature" align="left" style="align: left; color: #888; font-size: 14px;">Med venlig hilsen / best regards,<br>Justas Azna<br></td></tr><tr class="gray-hr" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td width="100%"><hr class="gray-hr" style="background: transparent; border-bottom: 1px solid #E4E4E4; border-top: none; color: transparent; margin-bottom: 20px; margin-top: 20px;"></td></tr><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><table class="rbcc footer__main__col1" align="left" style="align: left; border: 0; cellpadding: 0; cellspacing: 0; margin-bottom: 30px;" border="0" cellpadding="0" cellspacing="0" width="70%"><td class="footer__main__col1__td" align="left" style="align: left; color: #888; font-size: 14px;"><strong>Call <a href="tel:004581101101" style="color: #888; text-decoration: none;"><span style="color: #888 !important; text-decoration: none !important;">(+45) 81101101</span></a> or email me at <a href="mailto:ja@fadeit.dk" target="_blank" style="color: #888; text-decoration: none;">ja@fadeit.dk</a></strong><br><a href="https://goo.gl/maps/9ENsvuF6TjP2" style="color: #888; text-decoration: none;"><span style="color: #888 !important; text-decoration: none !important;">Thorsagervej 11-13, 8550 Ryomgård, Denmark</span></a></td></table><table class="rbcc footer__main__col2" align="right" style="align: right; border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="30%"><td class="footer__main__col2__td" align="right" style="align: right; color: #888; font-size: 14px;"><a href="https://fadeit.dk" style="color: #888; text-decoration: none;"><img src="https://fadeit.dk/src/assets/img/brand/fadeit-logo.png" alt="fadeit logo" class="footer__main__col2__td__img" style="border: 0; height: auto; max-height: 38px; max-width: 100%; padding-left: 10px; padding-top: 6px;"></a></td></table></tr></table></td></tr></table></body></html>

1
dist/fadeit/signature-lars.html vendored Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="viewport" content="width=device-width"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">@media only screen and (max-width:480px){.footer td{font-size:12px!important}.footer__main__col1,.footer__main__col2{width:100%!important}.footer__main__col2__td{text-align:left;padding-bottom:20px}.footer__main__col2__td__img{padding-left:0!important}.gray-hr hr{margin-bottom:10px!important;margin-top:10px!important}}@media only screen and (min-width:1025px){.background,.body-with-bg{background-color:#F1F1F1}.body-with-bg .main{border:1px solid #E9E9E9!important;max-width:960px;margin:0 auto}.background{padding:30px}}</style></head><body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"><br><table class="main rbcc" style="border: 0; cellpadding: 0; cellspacing: 0; padding-top: 15px;" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff" width="100%"><tr class="sp" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="sp__inner" style="padding: 15px 0;"></td></tr><tr class="rbcc" style="border: 0; box-sizing: border-box; cellpadding: 0; cellspacing: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer" style="border-top: 8px solid #EAEAEA; color: #888; padding: 20px 30px 0px 30px;" bgcolor="#f5f5f5"><table class="rbcc footer__main" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="100%"><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer__main__signature" align="left" style="align: left; color: #888; font-size: 14px;">Med venlig hilsen / best regards,<br>Lars Normark Holmgaard<br></td></tr><tr class="gray-hr" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td width="100%"><hr class="gray-hr" style="background: transparent; border-bottom: 1px solid #E4E4E4; border-top: none; color: transparent; margin-bottom: 20px; margin-top: 20px;"></td></tr><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><table class="rbcc footer__main__col1" align="left" style="align: left; border: 0; cellpadding: 0; cellspacing: 0; margin-bottom: 30px;" border="0" cellpadding="0" cellspacing="0" width="70%"><td class="footer__main__col1__td" align="left" style="align: left; color: #888; font-size: 14px;"><strong>Call <a href="tel:004581100200" style="color: #888; text-decoration: none;"><span style="color: #888 !important; text-decoration: none !important;">(+45) 81100200</span></a> or email me at <a href="mailto:lnh@fadeit.dk" target="_blank" style="color: #888; text-decoration: none;">lnh@fadeit.dk</a></strong><br><a href="https://goo.gl/maps/9ENsvuF6TjP2" style="color: #888; text-decoration: none;"><span style="color: #888 !important; text-decoration: none !important;">Thorsagervej 11-13, 8550 Ryomgård, Denmark</span></a></td></table><table class="rbcc footer__main__col2" align="right" style="align: right; border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="30%"><td class="footer__main__col2__td" align="right" style="align: right; color: #888; font-size: 14px;"><a href="https://fadeit.dk" style="color: #888; text-decoration: none;"><img src="https://fadeit.dk/src/assets/img/brand/fadeit-logo.png" alt="fadeit logo" class="footer__main__col2__td__img" style="border: 0; height: auto; max-height: 38px; max-width: 100%; padding-left: 10px; padding-top: 6px;"></a></td></table></tr></table></td></tr></table></body></html>

1
dist/fadeit/signature-mie.html vendored Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="viewport" content="width=device-width"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">@media only screen and (max-width:480px){.footer td{font-size:12px!important}.footer__main__col1,.footer__main__col2{width:100%!important}.footer__main__col2__td{text-align:left;padding-bottom:20px}.footer__main__col2__td__img{padding-left:0!important}.gray-hr hr{margin-bottom:10px!important;margin-top:10px!important}}@media only screen and (min-width:1025px){.background,.body-with-bg{background-color:#F1F1F1}.body-with-bg .main{border:1px solid #E9E9E9!important;max-width:960px;margin:0 auto}.background{padding:30px}}</style></head><body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"><br><table class="main rbcc" style="border: 0; cellpadding: 0; cellspacing: 0; padding-top: 15px;" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff" width="100%"><tr class="sp" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="sp__inner" style="padding: 15px 0;"></td></tr><tr class="rbcc" style="border: 0; box-sizing: border-box; cellpadding: 0; cellspacing: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer" style="border-top: 8px solid #EAEAEA; color: #888; padding: 20px 30px 0px 30px;" bgcolor="#f5f5f5"><table class="rbcc footer__main" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="100%"><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer__main__signature" align="left" style="align: left; color: #888; font-size: 14px;">Med venlig hilsen / best regards,<br>Mie Bøgh Noes<br></td></tr><tr class="gray-hr" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td width="100%"><hr class="gray-hr" style="background: transparent; border-bottom: 1px solid #E4E4E4; border-top: none; color: transparent; margin-bottom: 20px; margin-top: 20px;"></td></tr><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><table class="rbcc footer__main__col1" align="left" style="align: left; border: 0; cellpadding: 0; cellspacing: 0; margin-bottom: 30px;" border="0" cellpadding="0" cellspacing="0" width="70%"><td class="footer__main__col1__td" align="left" style="align: left; color: #888; font-size: 14px;"><strong>Call <a href="tel:004581100200" style="color: #888; text-decoration: none;"><span style="color: #888 !important; text-decoration: none !important;">(+45) 81100200</span></a> or email me at <a href="mailto:mbn@fadeit.dk" target="_blank" style="color: #888; text-decoration: none;">mbn@fadeit.dk</a></strong><br><a href="https://goo.gl/maps/9ENsvuF6TjP2" style="color: #888; text-decoration: none;"><span style="color: #888 !important; text-decoration: none !important;">Thorsagervej 11-13, 8550 Ryomgård, Denmark</span></a></td></table><table class="rbcc footer__main__col2" align="right" style="align: right; border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="30%"><td class="footer__main__col2__td" align="right" style="align: right; color: #888; font-size: 14px;"><a href="https://fadeit.dk" style="color: #888; text-decoration: none;"><img src="https://fadeit.dk/src/assets/img/brand/fadeit-logo.png" alt="fadeit logo" class="footer__main__col2__td__img" style="border: 0; height: auto; max-height: 38px; max-width: 100%; padding-left: 10px; padding-top: 6px;"></a></td></table></tr></table></td></tr></table></body></html>

1
dist/fadeit/signature-reply-dan.html vendored Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="viewport" content="width=device-width"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">@media only screen and (max-width:480px){.footer td{font-size:12px!important}.footer__main__col1,.footer__main__col2{width:100%!important}.footer__main__col2__td{text-align:left;padding-bottom:20px}.footer__main__col2__td__img{padding-left:0!important}.gray-hr hr{margin-bottom:10px!important;margin-top:10px!important}}@media only screen and (min-width:1025px){.background,.body-with-bg{background-color:#F1F1F1}.body-with-bg .main{border:1px solid #E9E9E9!important;max-width:960px;margin:0 auto}.background{padding:30px}}</style></head><body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"><br><table class="main rbcc" style="border: 0; cellpadding: 0; cellspacing: 0; padding-top: 15px;" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff" width="100%"><tr class="sp" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="sp__inner" style="padding: 15px 0;"></td></tr><tr class="rbcc" style="border: 0; box-sizing: border-box; cellpadding: 0; cellspacing: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer footer--simple" style="border-top: 8px solid #EAEAEA; color: #888; padding: 20px 30px 0px 30px; padding-bottom: 20px;" bgcolor="#FFFFFF"><table class="rbcc footer__main" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="100%"><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer__main__signature" align="left" style="align: left; color: #888; font-size: 14px;">Med venlig hilsen / best regards,<br>Dan Mindru<br></td></tr></table></td></tr></table></body></html>

View File

@ -0,0 +1 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="viewport" content="width=device-width"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">@media only screen and (max-width:480px){.footer td{font-size:12px!important}.footer__main__col1,.footer__main__col2{width:100%!important}.footer__main__col2__td{text-align:left;padding-bottom:20px}.footer__main__col2__td__img{padding-left:0!important}.gray-hr hr{margin-bottom:10px!important;margin-top:10px!important}}@media only screen and (min-width:1025px){.background,.body-with-bg{background-color:#F1F1F1}.body-with-bg .main{border:1px solid #E9E9E9!important;max-width:960px;margin:0 auto}.background{padding:30px}}</style></head><body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"><br><table class="main rbcc" style="border: 0; cellpadding: 0; cellspacing: 0; padding-top: 15px;" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff" width="100%"><tr class="sp" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="sp__inner" style="padding: 15px 0;"></td></tr><tr class="rbcc" style="border: 0; box-sizing: border-box; cellpadding: 0; cellspacing: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer footer--simple" style="border-top: 8px solid #EAEAEA; color: #888; padding: 20px 30px 0px 30px; padding-bottom: 20px;" bgcolor="#FFFFFF"><table class="rbcc footer__main" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="100%"><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer__main__signature" align="left" style="align: left; color: #888; font-size: 14px;">Med venlig hilsen / best regards,<br>Justas Azna<br></td></tr></table></td></tr></table></body></html>

1
dist/fadeit/signature-reply-lars.html vendored Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="viewport" content="width=device-width"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">@media only screen and (max-width:480px){.footer td{font-size:12px!important}.footer__main__col1,.footer__main__col2{width:100%!important}.footer__main__col2__td{text-align:left;padding-bottom:20px}.footer__main__col2__td__img{padding-left:0!important}.gray-hr hr{margin-bottom:10px!important;margin-top:10px!important}}@media only screen and (min-width:1025px){.background,.body-with-bg{background-color:#F1F1F1}.body-with-bg .main{border:1px solid #E9E9E9!important;max-width:960px;margin:0 auto}.background{padding:30px}}</style></head><body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"><br><table class="main rbcc" style="border: 0; cellpadding: 0; cellspacing: 0; padding-top: 15px;" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff" width="100%"><tr class="sp" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="sp__inner" style="padding: 15px 0;"></td></tr><tr class="rbcc" style="border: 0; box-sizing: border-box; cellpadding: 0; cellspacing: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer footer--simple" style="border-top: 8px solid #EAEAEA; color: #888; padding: 20px 30px 0px 30px; padding-bottom: 20px;" bgcolor="#FFFFFF"><table class="rbcc footer__main" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="100%"><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer__main__signature" align="left" style="align: left; color: #888; font-size: 14px;">Med venlig hilsen / best regards,<br>Lars Normark Holmgaard<br></td></tr></table></td></tr></table></body></html>

1
dist/fadeit/signature-reply-mie.html vendored Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="viewport" content="width=device-width"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">@media only screen and (max-width:480px){.footer td{font-size:12px!important}.footer__main__col1,.footer__main__col2{width:100%!important}.footer__main__col2__td{text-align:left;padding-bottom:20px}.footer__main__col2__td__img{padding-left:0!important}.gray-hr hr{margin-bottom:10px!important;margin-top:10px!important}}@media only screen and (min-width:1025px){.background,.body-with-bg{background-color:#F1F1F1}.body-with-bg .main{border:1px solid #E9E9E9!important;max-width:960px;margin:0 auto}.background{padding:30px}}</style></head><body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"><br><table class="main rbcc" style="border: 0; cellpadding: 0; cellspacing: 0; padding-top: 15px;" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff" width="100%"><tr class="sp" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="sp__inner" style="padding: 15px 0;"></td></tr><tr class="rbcc" style="border: 0; box-sizing: border-box; cellpadding: 0; cellspacing: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer footer--simple" style="border-top: 8px solid #EAEAEA; color: #888; padding: 20px 30px 0px 30px; padding-bottom: 20px;" bgcolor="#FFFFFF"><table class="rbcc footer__main" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="100%"><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer__main__signature" align="left" style="align: left; color: #888; font-size: 14px;">Med venlig hilsen / best regards,<br>Mie Bøgh Noes<br></td></tr></table></td></tr></table></body></html>

View File

@ -0,0 +1 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="viewport" content="width=device-width"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">@media only screen and (max-width:480px){.footer td{font-size:12px!important}.footer__main__col1,.footer__main__col2{width:100%!important}.footer__main__col2__td{text-align:left;padding-bottom:20px}.footer__main__col2__td__img{padding-left:0!important}.gray-hr hr{margin-bottom:10px!important;margin-top:10px!important}}@media only screen and (min-width:1025px){.background,.body-with-bg{background-color:#F1F1F1}.body-with-bg .main{border:1px solid #E9E9E9!important;max-width:960px;margin:0 auto}.background{padding:30px}}</style></head><body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"><br><table class="main rbcc" style="border: 0; cellpadding: 0; cellspacing: 0; padding-top: 15px;" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff" width="100%"><tr class="sp" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="sp__inner" style="padding: 15px 0;"></td></tr><tr class="rbcc" style="border: 0; box-sizing: border-box; cellpadding: 0; cellspacing: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer footer--simple" style="border-top: 8px solid #EAEAEA; color: #888; padding: 20px 30px 0px 30px; padding-bottom: 20px;" bgcolor="#FFFFFF"><table class="rbcc footer__main" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="100%"><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer__main__signature" align="left" style="align: left; color: #888; font-size: 14px;">Med venlig hilsen / best regards,<br>Sander Sink<br></td></tr></table></td></tr></table></body></html>

1
dist/fadeit/signature-sander.html vendored Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="viewport" content="width=device-width"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">@media only screen and (max-width:480px){.footer td{font-size:12px!important}.footer__main__col1,.footer__main__col2{width:100%!important}.footer__main__col2__td{text-align:left;padding-bottom:20px}.footer__main__col2__td__img{padding-left:0!important}.gray-hr hr{margin-bottom:10px!important;margin-top:10px!important}}@media only screen and (min-width:1025px){.background,.body-with-bg{background-color:#F1F1F1}.body-with-bg .main{border:1px solid #E9E9E9!important;max-width:960px;margin:0 auto}.background{padding:30px}}</style></head><body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"><br><table class="main rbcc" style="border: 0; cellpadding: 0; cellspacing: 0; padding-top: 15px;" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff" width="100%"><tr class="sp" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="sp__inner" style="padding: 15px 0;"></td></tr><tr class="rbcc" style="border: 0; box-sizing: border-box; cellpadding: 0; cellspacing: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer" style="border-top: 8px solid #EAEAEA; color: #888; padding: 20px 30px 0px 30px;" bgcolor="#f5f5f5"><table class="rbcc footer__main" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="100%"><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer__main__signature" align="left" style="align: left; color: #888; font-size: 14px;">Med venlig hilsen / best regards,<br>Sander Sink<br></td></tr><tr class="gray-hr" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td width="100%"><hr class="gray-hr" style="background: transparent; border-bottom: 1px solid #E4E4E4; border-top: none; color: transparent; margin-bottom: 20px; margin-top: 20px;"></td></tr><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><table class="rbcc footer__main__col1" align="left" style="align: left; border: 0; cellpadding: 0; cellspacing: 0; margin-bottom: 30px;" border="0" cellpadding="0" cellspacing="0" width="70%"><td class="footer__main__col1__td" align="left" style="align: left; color: #888; font-size: 14px;"><strong>Call <a href="tel:003725330876" style="color: #888; text-decoration: none;"><span style="color: #888 !important; text-decoration: none !important;">(+372) 53308767</span></a> or email me at <a href="mailto:ss@fadeit.dk" target="_blank" style="color: #888; text-decoration: none;">ss@fadeit.dk</a></strong><br><a href="https://goo.gl/maps/9ENsvuF6TjP2" style="color: #888; text-decoration: none;"><span style="color: #888 !important; text-decoration: none !important;">Thorsagervej 11-13, 8550 Ryomgård, Denmark</span></a></td></table><table class="rbcc footer__main__col2" align="right" style="align: right; border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="30%"><td class="footer__main__col2__td" align="right" style="align: right; color: #888; font-size: 14px;"><a href="https://fadeit.dk" style="color: #888; text-decoration: none;"><img src="https://fadeit.dk/src/assets/img/brand/fadeit-logo.png" alt="fadeit logo" class="footer__main__col2__td__img" style="border: 0; height: auto; max-height: 38px; max-width: 100%; padding-left: 10px; padding-top: 6px;"></a></td></table></tr></table></td></tr></table></body></html>

1
dist/play/signature-anette.html vendored Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="viewport" content="width=device-width"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">@media only screen and (max-width:560px){.footer__main__col1,.footer__main__col2{width:100%!important}.footer td{font-size:12px!important}.footer__main__col1__td{text-align:left}.footer__main__col1__td>span{margin-bottom:10px}.footer__main__col2__td{text-align:left;padding-bottom:20px}.footer__main__col2__td__img{padding-left:0!important}}</style></head><body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"><br><table class="main rbcc" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff" width="100%"><tr class="sp" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="sp__inner" style="padding: 15px 0;"></td></tr><tr class="rbcc" style="border: 0; box-sizing: border-box; cellpadding: 0; cellspacing: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="footer" style="border-top: 8px solid #585858; color: #f5f5f5; padding: 20px 30px 0px 30px;" bgcolor="#303030"><table class="rbcc footer__main" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="100%"><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="footer__main__signature" align="left" style="align: left; color: #f5f5f5; font-size: 14px;">Med venlig hilsen / best regards,<br><strong>Anette Jæger</strong><br><strong>Key Account Manager Jylland</strong><br></td></tr><tr class="spd" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="spd__inner" height="60px"></td></tr><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><table class="rbcc footer__main__col2" align="right" style="align: right; border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="30%"><td class="footer__main__col2__td" align="right" style="align: right; color: #f5f5f5; font-size: 14px;"><a href="https://playsignage.com/?utm_source=sig&utm_medium=aj" style="color: #f5f5f5;"><img src="https://playsignage.com/manage/assets/images/play-logo.png" alt="Play Digital Signage logo" class="footer__main__col2__td__img" style="border: 0; height: auto; max-height: 65px; max-width: 100%; padding-left: 20px;"></a></td></table><table class="rbcc footer__main__col1" align="left" style="align: left; border: 0; cellpadding: 0; cellspacing: 0; margin-bottom: 40px;" border="0" cellpadding="0" cellspacing="0" width="70%"><td class="footer__main__col1__td" align="left" style="align: left; color: #f5f5f5; padding-top: 15px;"><span style="font-size: 20px; margin-bottom: 5px;">Play Digital Signage</span><br>Call <a href="tel:004526335244" style="color: #f5f5f5;"><span style="color: #f5f5f5 !important; text-decoration: none !important;"><b>(+45) 26335244</b></span></a> or email me at <a href="mailto:aj@tryplay.dk" target="_blank" style="color: #f5f5f5;">aj@tryplay.dk</a></td></table></tr></table></td></tr></table></body></html>

1
dist/play/signature-justas.html vendored Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="viewport" content="width=device-width"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">@media only screen and (max-width:560px){.footer__main__col1,.footer__main__col2{width:100%!important}.footer td{font-size:12px!important}.footer__main__col1__td{text-align:left}.footer__main__col1__td>span{margin-bottom:10px}.footer__main__col2__td{text-align:left;padding-bottom:20px}.footer__main__col2__td__img{padding-left:0!important}}</style></head><body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"><br><table class="main rbcc" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff" width="100%"><tr class="sp" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="sp__inner" style="padding: 15px 0;"></td></tr><tr class="rbcc" style="border: 0; box-sizing: border-box; cellpadding: 0; cellspacing: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="footer" style="border-top: 8px solid #585858; color: #f5f5f5; padding: 20px 30px 0px 30px;" bgcolor="#303030"><table class="rbcc footer__main" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="100%"><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="footer__main__signature" align="left" style="align: left; color: #f5f5f5; font-size: 14px;">Best regards,<br><strong>Justas Azna</strong><br><strong>Software Engineer / Co-founder</strong><br></td></tr><tr class="spd" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="spd__inner" height="60px"></td></tr><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><table class="rbcc footer__main__col2" align="right" style="align: right; border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="30%"><td class="footer__main__col2__td" align="right" style="align: right; color: #f5f5f5; font-size: 14px;"><a href="https://playsignage.com/?utm_source=sig&utm_medium=ja" style="color: #f5f5f5;"><img src="https://playsignage.com/manage/assets/images/play-logo.png" alt="Play Digital Signage logo" class="footer__main__col2__td__img" style="border: 0; height: auto; max-height: 65px; max-width: 100%; padding-left: 20px;"></a></td></table><table class="rbcc footer__main__col1" align="left" style="align: left; border: 0; cellpadding: 0; cellspacing: 0; margin-bottom: 40px;" border="0" cellpadding="0" cellspacing="0" width="70%"><td class="footer__main__col1__td" align="left" style="align: left; color: #f5f5f5; padding-top: 15px;"><span style="font-size: 20px; margin-bottom: 5px;">Play Digital Signage</span><br>Call <a href="tel:004581101101" style="color: #f5f5f5;"><span style="color: #f5f5f5 !important; text-decoration: none !important;"><b>(+45) 81101101</b></span></a> or email me at <a href="mailto:justas@playsignage.com" target="_blank" style="color: #f5f5f5;">justas@playsignage.com</a></td></table></tr></table></td></tr></table></body></html>

1
dist/play/signature-lars.html vendored Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="viewport" content="width=device-width"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">@media only screen and (max-width:560px){.footer__main__col1,.footer__main__col2{width:100%!important}.footer td{font-size:12px!important}.footer__main__col1__td{text-align:left}.footer__main__col1__td>span{margin-bottom:10px}.footer__main__col2__td{text-align:left;padding-bottom:20px}.footer__main__col2__td__img{padding-left:0!important}}</style></head><body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"><br><table class="main rbcc" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff" width="100%"><tr class="sp" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="sp__inner" style="padding: 15px 0;"></td></tr><tr class="rbcc" style="border: 0; box-sizing: border-box; cellpadding: 0; cellspacing: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="footer" style="border-top: 8px solid #585858; color: #f5f5f5; padding: 20px 30px 0px 30px;" bgcolor="#303030"><table class="rbcc footer__main" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="100%"><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="footer__main__signature" align="left" style="align: left; color: #f5f5f5; font-size: 14px;">Med venlig hilsen / best regards,<br><strong>Lars Normark Holmgaard</strong><br><strong>CEO / Adm. Direktør</strong><br></td></tr><tr class="spd" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="spd__inner" height="60px"></td></tr><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><table class="rbcc footer__main__col2" align="right" style="align: right; border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="30%"><td class="footer__main__col2__td" align="right" style="align: right; color: #f5f5f5; font-size: 14px;"><a href="https://playsignage.com/?utm_source=sig&utm_medium=lnh" style="color: #f5f5f5;"><img src="https://playsignage.com/manage/assets/images/play-logo.png" alt="Play Digital Signage logo" class="footer__main__col2__td__img" style="border: 0; height: auto; max-height: 65px; max-width: 100%; padding-left: 20px;"></a></td></table><table class="rbcc footer__main__col1" align="left" style="align: left; border: 0; cellpadding: 0; cellspacing: 0; margin-bottom: 40px;" border="0" cellpadding="0" cellspacing="0" width="70%"><td class="footer__main__col1__td" align="left" style="align: left; color: #f5f5f5; padding-top: 15px;"><span style="font-size: 20px; margin-bottom: 5px;">Play Digital Signage</span><br>Call <a href="tel:004581101020" style="color: #f5f5f5;"><span style="color: #f5f5f5 !important; text-decoration: none !important;"><b>(+45) 81101020</b></span></a> or email me at <a href="mailto:lars@playsignage.com" target="_blank" style="color: #f5f5f5;">lars@playsignage.com</a></td></table></tr></table></td></tr></table></body></html>

1
dist/play/signature-reply-anette.html vendored Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="viewport" content="width=device-width"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">@media only screen and (max-width:560px){.footer__main__col1,.footer__main__col2{width:100%!important}.footer td{font-size:12px!important}.footer__main__col1__td{text-align:left}.footer__main__col1__td>span{margin-bottom:10px}.footer__main__col2__td{text-align:left;padding-bottom:20px}.footer__main__col2__td__img{padding-left:0!important}}</style></head><body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"><br><table class="main rbcc" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff" width="100%"><tr class="sp" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="sp__inner" style="padding: 15px 0;"></td></tr><tr class="rbcc" style="border: 0; box-sizing: border-box; cellpadding: 0; cellspacing: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="footer footer--simple" style="border-top: 8px solid #585858; color: #f5f5f5; padding: 20px 30px 0px 30px; padding-bottom: 20px;" bgcolor="#FFFFFF"><table class="rbcc footer__main" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="100%"><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="footer__main__signature" align="left" style="align: left; color: #888; font-size: 14px;">Med venlig hilsen / best regards,<br>Anette Jæger<br></td></tr></table></td></tr></table></body></html>

1
dist/play/signature-reply-justas.html vendored Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="viewport" content="width=device-width"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">@media only screen and (max-width:560px){.footer__main__col1,.footer__main__col2{width:100%!important}.footer td{font-size:12px!important}.footer__main__col1__td{text-align:left}.footer__main__col1__td>span{margin-bottom:10px}.footer__main__col2__td{text-align:left;padding-bottom:20px}.footer__main__col2__td__img{padding-left:0!important}}</style></head><body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"><br><table class="main rbcc" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff" width="100%"><tr class="sp" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="sp__inner" style="padding: 15px 0;"></td></tr><tr class="rbcc" style="border: 0; box-sizing: border-box; cellpadding: 0; cellspacing: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="footer footer--simple" style="border-top: 8px solid #585858; color: #f5f5f5; padding: 20px 30px 0px 30px; padding-bottom: 20px;" bgcolor="#FFFFFF"><table class="rbcc footer__main" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="100%"><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="footer__main__signature" align="left" style="align: left; color: #888; font-size: 14px;">Best regards,<br>Justas Azna<br></td></tr></table></td></tr></table></body></html>

1
dist/play/signature-reply-lars.html vendored Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="viewport" content="width=device-width"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">@media only screen and (max-width:560px){.footer__main__col1,.footer__main__col2{width:100%!important}.footer td{font-size:12px!important}.footer__main__col1__td{text-align:left}.footer__main__col1__td>span{margin-bottom:10px}.footer__main__col2__td{text-align:left;padding-bottom:20px}.footer__main__col2__td__img{padding-left:0!important}}</style></head><body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"><br><table class="main rbcc" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff" width="100%"><tr class="sp" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="sp__inner" style="padding: 15px 0;"></td></tr><tr class="rbcc" style="border: 0; box-sizing: border-box; cellpadding: 0; cellspacing: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="footer footer--simple" style="border-top: 8px solid #585858; color: #f5f5f5; padding: 20px 30px 0px 30px; padding-bottom: 20px;" bgcolor="#FFFFFF"><table class="rbcc footer__main" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="100%"><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="footer__main__signature" align="left" style="align: left; color: #888; font-size: 14px;">Med venlig hilsen / best regards,<br>Lars Normark Holmgaard<br></td></tr></table></td></tr></table></body></html>

1
dist/play/signature-reply-sander.html vendored Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="viewport" content="width=device-width"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">@media only screen and (max-width:560px){.footer__main__col1,.footer__main__col2{width:100%!important}.footer td{font-size:12px!important}.footer__main__col1__td{text-align:left}.footer__main__col1__td>span{margin-bottom:10px}.footer__main__col2__td{text-align:left;padding-bottom:20px}.footer__main__col2__td__img{padding-left:0!important}}</style></head><body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"><br><table class="main rbcc" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff" width="100%"><tr class="sp" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="sp__inner" style="padding: 15px 0;"></td></tr><tr class="rbcc" style="border: 0; box-sizing: border-box; cellpadding: 0; cellspacing: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="footer footer--simple" style="border-top: 8px solid #585858; color: #f5f5f5; padding: 20px 30px 0px 30px; padding-bottom: 20px;" bgcolor="#FFFFFF"><table class="rbcc footer__main" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="100%"><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="footer__main__signature" align="left" style="align: left; color: #888; font-size: 14px;">Best Regards,<br>Sander Sink<br></td></tr></table></td></tr></table></body></html>

1
dist/play/signature-sander.html vendored Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="viewport" content="width=device-width"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">@media only screen and (max-width:560px){.footer__main__col1,.footer__main__col2{width:100%!important}.footer td{font-size:12px!important}.footer__main__col1__td{text-align:left}.footer__main__col1__td>span{margin-bottom:10px}.footer__main__col2__td{text-align:left;padding-bottom:20px}.footer__main__col2__td__img{padding-left:0!important}}</style></head><body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"><br><table class="main rbcc" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff" width="100%"><tr class="sp" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="sp__inner" style="padding: 15px 0;"></td></tr><tr class="rbcc" style="border: 0; box-sizing: border-box; cellpadding: 0; cellspacing: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="footer" style="border-top: 8px solid #585858; color: #f5f5f5; padding: 20px 30px 0px 30px;" bgcolor="#303030"><table class="rbcc footer__main" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="100%"><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="footer__main__signature" align="left" style="align: left; color: #f5f5f5; font-size: 14px;">Best Regards,<br><strong>Sander Sink</strong><br><strong>Software Engineer / Co-founder</strong><br></td></tr><tr class="spd" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="spd__inner" height="60px"></td></tr><tr style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><table class="rbcc footer__main__col2" align="right" style="align: right; border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="30%"><td class="footer__main__col2__td" align="right" style="align: right; color: #f5f5f5; font-size: 14px;"><a href="https://playsignage.com/?utm_source=sig&utm_medium=ss" style="color: #f5f5f5;"><img src="https://playsignage.com/manage/assets/images/play-logo.png" alt="Play Digital Signage logo" class="footer__main__col2__td__img" style="border: 0; height: auto; max-height: 65px; max-width: 100%; padding-left: 20px;"></a></td></table><table class="rbcc footer__main__col1" align="left" style="align: left; border: 0; cellpadding: 0; cellspacing: 0; margin-bottom: 40px;" border="0" cellpadding="0" cellspacing="0" width="70%"><td class="footer__main__col1__td" align="left" style="align: left; color: #f5f5f5; padding-top: 15px;"><span style="font-size: 20px; margin-bottom: 5px;">Play Digital Signage</span><br>Call <a href="tel:0037253308767" style="color: #f5f5f5;"><span style="color: #f5f5f5 !important; text-decoration: none !important;"><b>(+372) 53308767</b></span></a> or email me at <a href="mailto:sander@playsignage.com" target="_blank" style="color: #f5f5f5;">sander@playsignage.com</a></td></table></tr></table></td></tr></table></body></html>

View File

@ -1,50 +1,30 @@
const gulp = require('gulp');
const plumber = require('gulp-plumber');
'use strict';
const { SOURCE_DIR, DIST_DIR, WORKING_DIR, CONFIGURATION_FILE } = require('./constants');
var gulp = require('gulp'),
fs = require('fs'),
plumber = require('gulp-plumber');
const options = {
sourceDir: SOURCE_DIR,
distDir: DIST_DIR,
workingDir: WORKING_DIR,
configurationFile: CONFIGURATION_FILE,
src: function plumbedSrc() {
var options = {
source: 'templates',
dist: 'dist',
workingDir: 'tmp',
src: function plumbedSrc(){
return gulp.src.apply(gulp, arguments).pipe(plumber());
}
};
/**
* Load tasks from the '/tasks' directory.
/** Load tasks from the '/tasks' directory.
* Look for .js & .coffee files.
* Each file should correspond to a task.
*/
require('./tasks/build')(options);
require('./tasks/dupe')(options);
require('./tasks/less')(options);
require('./tasks/lint')(options);
require('./tasks/postcss')(options);
require('./tasks/sass')(options);
require('./tasks/check-for-unused').checkForUnusedTask(options);
/* Runs the entire pipeline once. */
gulp.task(
'run-pipeline',
gulp.series('dupe', 'less', 'sass', 'postcss', 'lint', 'build', gulp.parallel('check-for-unused'))
);
/* By default templates will be built into '/dist'. */
gulp.task(
'default',
gulp.series('run-pipeline', () => {
/* gulp will watch for changes in '/templates'. */
gulp.watch(
[
options.sourceDir + '/**/*.html',
options.sourceDir + '/**/*.css',
options.sourceDir + '/**/*.scss',
options.sourceDir + '/**/*.less',
options.sourceDir + '/**/conf.json'
],
{ delay: 500 },
gulp.series('run-pipeline')
);
fs
.readdirSync('./tasks')
.filter(function readJSFiles(file) {
return (/\.(js|coffee)$/i).test(file);
})
);
.map(function loadTasks(file) {
require('./tasks/' + file)(options);
});
/** By default templates will be built into '/dist', then gulp will watch for changes in '/src'. */
gulp.task('default', ['dupe', 'less', 'sass', 'postcss', 'lint', 'build']);

View File

@ -14,7 +14,10 @@
![responsive emails-02](https://cloud.githubusercontent.com/assets/1515742/10591901/139c4954-76b9-11e5-80f7-5b0ccaf5af81.png)
## 만들게된 동기 (Motivation)
이메일용 html은 일반적인 HTML과 달리 모든 코드를 in-line CSS로 만들어야 합니다. 그래서 이메일 템플릿이랑 서명을 만들기가 굉장히 어렵습니다. "이런 HTML 템플릿과 서명을 편하게 만들어보자!" 라는 생각에서 이 템플릿을 만들었습니다. 물론 모든 이메일 클라이언트의 이슈를 전부 다 고칠 수는 없지만, 이 템플릿을 활용해서 조금 더 쉽고 깔끔한 반응형 이메일을 만들어서 받는 사람 보내는 사람 모두가 만족하게 만들 수 있습니다!
이메일용 html은 일반적인 HTML과 달리 모든 코드를 in-line CSS로 만들어야 합니다. 그래서 이메일 템플릿이랑 서명을 만들기가 굉장히 어렵습니다. "이런 HTML 템플릿과 서명을 편하게 만들어보자!" 라는 생각에서 이 템플릿을 만들었습니다. 물론 모든 이메일 클라이언트의 이슈를 전부 다 고칠 수는 없지만, 이 템플릿을 활용해서 조금 더 쉽고 깔끔한 반응형 이메일을 만들어서 받는 사람 보내는 사람 모두가 만족하게 만들 수 있습니다!
이 [블로그 포스팅](http://fadeit.dk/blog/post/html-emails-and-email-signatures-how-hard-can-it-be)에서 fadeit 의 더 많은 이애기를 들어보세요.
## 이 템플릿에서 무엇을 할 수 있나? (What does it do?)
- [x] config-based template generation
@ -35,7 +38,7 @@ $ npm install
$ gulp
```
`src/dark/` 를 확인해보시면 멋진 2개의 이메일 템플릿 샘플이 있습니다. 폴더를 통째로 다른 이름으로 복사/붙여넣기 하시고 그 안에 있는 `src/dark/conf.js` 파일을 입맛대로 바꿔보세요. 다음으로는 `gulp`를 실행해서 여러분 만의 이메일 템플릿을 빌드하세요. gulp 의 task가 동작하면서 기본 html CSS 파일을 확인하고 새로운 html 파일을 `/dist`에 저장합니다.
`src/fadeit/` 를 확인해보시면 멋진 2개의 이메일 템플릿 샘플이 있습니다. 폴더를 통째로 다른 이름으로 복사/붙여넣기 하시고 그 안에 있는 `src/fadeit/conf.js` 파일을 입맛대로 바꿔보세요. 다음으로는 `gulp`를 실행해서 여러분 만의 이메일 템플릿을 빌드하세요. gulp 의 task가 동작하면서 기본 html CSS 파일을 확인하고 새로운 html 파일을 `/dist`에 저장합니다.
## 살펴보기 (Overview)
아래 순서도는 여러분이 만든 템플릿이 어떻게 빌드가 되는지를 보여줍니다.
@ -58,15 +61,15 @@ $ gulp
## 다른 이메일 클라이언트에서 사용하는 법 (Usage with different e-mail clients)
### Thunderbird
썬더버드 이메일 클라이언트에 html 서명을 자동으로 넣어주는 몇몇 플러그인이 있스빈다. 일단 우리는 [SmartTemplate4](https://addons.mozilla.org/en-us/thunderbird/addon/smarttemplate4) 를 추천합니다. 이 플러그인을 쓰면 새 이메일, 답장, 전달 등을 할 때마다 각각 다른 이메일 템플릿을 쓸 수 있습니다.
썬더버드 이메일 클라이언트에 html 서명을 자동으로 넣어주는 몇몇 플러그인이 있스빈다. 일단 우리는 [SmartTemplate4](https://addons.mozilla.org/en-us/thunderbird/addon/smarttemplate4) 를 추천합니다. 이 플러그인을 쓰면 새 이메일, 답장, 전달 등을 할 때마다 각각 다른 이메일 템플릿을 쓸 수 있습니다.
### Apple Mail / OS X (꼭.. 써야 한다면?)
#### 방법 1
- 이메일 앱을 열고 `Mail` -> `Preferences` -> `Signatures` 로 이동하세요.
- 이메일 앱을 열고 `Mail` -> `Preferences` -> `Signatures` 로 이동하세요.
- 아무거나 새 이메일 서명을 만들세요. (나중에 찾기 편하게 placeholder 를 써두는 것이 좋습니다.)
- 이메일을 닫으세요.
- 이메일을 닫으세요.
- 터미널을 열고 TextEdit으로 서명 파일을 열어보세요. (iCloud drive를 사용하는 경우는 잘 작동하지 않는 경우가 있습니다. 아래 troubleshooting을 참고하세요. )
```
@ -76,16 +79,16 @@ $ open -a TextEdit ~/Library/Mobile\ Documents/com~apple~mail/Data/V3/MailData/S
- `<body>...</body>` 의 모든 html 코드를 여러분이 빌드한 `/dist/`의 html 파일로 교체 합니다. (`<body>`외에 다른 메타 정보는 수정하지 마세요!)
- 메일앱을 다시 실행하고 새로 바뀐 서명을 확인해보세요 :)
> **주의**: 이미지 파일은 원래 `preference`의 미리보기 화면에서는 나오지 않습니다. 하지만 이메일을 만들고 발송하는 곳에서는 잘 보여지니깐 걱정마세요!
> **주의**: 이미지 파일은 원래 `preference`의 미리보기 화면에서는 나오지 않습니다. 하지만 이메일을 만들고 발송하는 곳에서는 잘 보여지니깐 걱정마세요!
#### 방법 2
다른 방법으로는 `/dist` 에 빌드한 html 파일을 CMD + A, CMD + C 해서 설정에 이메일 서명 박스에 붙여넣기 해서 쓸 수도 있습니다. 하지만 이렇게 복붙을 하는 경우 파일의 `<html>` 이나 반응형 웹을 위한 미디어쿼리가 들어있는 `<style>` 부분을 복붙하는 것이 아니라 정상적으로 작동하지 않을 수 있습니다.
다른 방법으로는 `/dist` 에 빌드한 html 파일을 CMD + A, CMD + C 해서 설정에 이메일 서명 박스에 붙여넣기 해서 쓸 수도 있습니다. 하지만 이렇게 복붙을 하는 경우 파일의 `<html>` 이나 반응형 웹을 위한 미디어쿼리가 들어있는 `<style>` 부분을 복붙하는 것이 아니라 정상적으로 작동하지 않을 수 있습니다.
#### Troubleshooting
만약 위의 방법 1이 정상적으로 작동하지 않는다면 파일을 수정 후 메일 앱을 열기전에 아래 방법으로 파일을 잠궈야 합니다.
만약 위의 방법 1이 정상적으로 작동하지 않는다면 파일을 수정 후 메일 앱을 열기전에 아래 방법으로 파일을 잠궈야 합니다.
Lock Files:
```
@ -101,30 +104,39 @@ $ chflags nouchg ~/Library/Mail/V3/MailData/Signatures/*.mailsignature
### 아웃룩 2010에서 사용하기 (Outlook 2010)
#### 방법 1
#### 방법 1
- 아웃룩 2010을 켜고 `File > Option > Mail > Signature` 으로 접속하세요.
- 새 서명을 만드세요. (나중에 확인하기 좋게, 표시를 해두시면 좋습니다.)
- CMD를 켜고 아래와 같이 입력하세요.
- CMD를 켜고 아래와 같이 입력하세요.
> AppData 폴더가 숨김 폴더라 가급적이면 CMD를 사용하는 것을 권장합니다.
```
cd AppData\Roamin\Microsoft
start Signatures
start Signatures
```
- 이 폴더에서 아까 만든 서명파일을 찾아서 우클릭해서 편집을 하세요.
- 이 폴더에서 아까 만든 서명파일을 찾아서 우클릭해서 편집을 하세요.
- 모든 HTML코드를 여러분이 새로 만든 코드로 바꿔버리세요.
- 아웃룩을 열고 서명이 적용됐는지 확인해주세요.
- 아웃룩을 열고 서명이 적용됐는지 확인해주세요.
> **주의** 위 방법으로 진행할 경우, 한글 등 유니코드가 깨지는 문제가 있습니다. 한글 이메일 서명의 경우 아래 **방법2**을 사용하시기 바랍니다.
> **주의** 위 방법으로 진행할 경우, 한글 등 유니코드가 깨지는 문제가 있습니다. 한글 이메일 서명의 경우 아래 **방법2**을 사용하시기 바랍니다.
#### 방법 2
아웃룩에서는 html 파일을 넣는 방법을 제공하지 않습니다. (아...) 그래서 위의 **방법 2** 처럼 파일을 복사/붙여넣기 하는 방법으로 사용할 수 있습니다.
아웃룩에서는 html 파일을 넣는 방법을 제공하지 않습니다. (아...) 그래서 위의 **방법 2** 처럼 파일을 복사/붙여넣기 하는 방법으로 사용할 수 있습니다.
- `/dist` 에 빌드한 html 파일을 브라우저에서 열고, ctrl A + C 로 복사하세요.
- Outlook 을 열고 `파일 > 옵션 > 메일 > 서명` 으로 들어가세요.
- 새 서명을 만들고 아래 박스에 Ctrl + V 로 파일을 붙여넣기 하세요.
- `/dist` 에 빌드한 html 파일을 브라우저에서 열고, ctrl A + C 로 복사하세요.
- Outlook 을 열고 `파일 > 옵션 > 메일 > 서명` 으로 들어가세요.
- 새 서명을 만들고 아래 박스에 Ctrl + V 로 파일을 붙여넣기 하세요.
> base 64로 만든 이메일 파일은 잘 작동하지 않을 수 있습니다. 외부 링크를 활용하시기를 권장합니다.
> base 64로 만든 이메일 파일은 잘 작동하지 않을 수 있습니다. 외부 링크를 활용하시기를 권장합니다.
===================
<br/>
<a href="http:fadeit.dk"><img src="http://fadeit.dk/src/assets/img/brand/fadeit_logo_full.svg" alt="The fadeit logo" style="width:200px;"/></a><br/><br/>
#### About fadeit
We build awesome software, web and mobile applications.
See more at [fadeit.dk](http://fadeit.dk)

28783
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,11 +1,11 @@
{
"name": "responsive-html-email-signature",
"version": "6.1.0",
"description": "Responsive template for emails & email signatures.",
"version": "4.0.2",
"description": "Responsive template for email signatures",
"main": "index.js",
"repository": {
"type": "git",
"url": "git+https://github.com/danmindru/responsive-html-email-signature.git"
"url": "git+https://github.com/fadeit/responsive-html-email-signature.git"
},
"keywords": [
"responsive",
@ -16,79 +16,33 @@
"inline-styles",
"watches-html"
],
"author": "Dan Mindru <mindrudan@gmail.com> (https://mindrudan.com/)",
"author": "Dan Mindru <mindrudan@gmail.com> (http://mindrudan.com/)",
"license": "MIT",
"bugs": {
"url": "https://github.com/danmindru/responsive-html-email-signature/issues"
},
"homepage": "https://github.com/danmindru/responsive-html-email-signature#readme",
"scripts": {
"start": "./node_modules/.bin/gulp",
"once": "./node_modules/.bin/gulp run-pipeline",
"deploy": "npm run test && cp -r dist demo && git push origin `git subtree split --prefix demo develop`:gh-pages --force",
"test": "npm run once && npm run _test",
"test:watch": "npm run once && npm run _test:watch",
"format": "./node_modules/.bin/prettier {tasks,tests}/**/*.js gulpfile.js .eslintrc.js --write",
"lint": "./node_modules/.bin/eslint ./**/*.js gulpfile.js",
"_test": "./node_modules/.bin/ava",
"_test:watch": "./node_modules/.bin/ava --watch"
"url": "https://github.com/fadeit/responsive-html-email-signature/issues"
},
"homepage": "https://github.com/fadeit/responsive-html-email-signature#readme",
"dependencies": {
"autoprefixer": "^9.6.1",
"chalk": "^2.4.2",
"cheerio": "^0.22.0",
"del": "^5.1.0",
"gulp": "^4.0.2",
"gulp-autoprefixer": "^7.0.1",
"autoprefixer": "^6.3.6",
"del": "^2.2.0",
"gulp": "~3.9.1",
"gulp-autoprefixer": "^3.1.0",
"gulp-david": "^1.0.1",
"gulp-inline-css": "^3.5.0",
"gulp-inline-images-no-http": "^1.3.3",
"gulp-jsonlint": "^1.3.2",
"gulp-less": "^4.0.1",
"gulp-inline-css": "~3.1.0",
"gulp-inline-image-html": "~0.2.1",
"gulp-jsonlint": "^1.1.2",
"gulp-less": "^3.1.0",
"gulp-minify-html": "~1.0.5",
"gulp-minify-inline": "^1.1.0",
"gulp-plumber": "^1.2.1",
"gulp-postcss": "^8.0.0",
"gulp-preprocess": "^3.0.3",
"gulp-rename": "^2.0.0",
"gulp-sass": "^4.1.0",
"klaw": "^3.0.0",
"node-sass": "^7.0.0",
"plugin-error": "^1.0.1",
"through2": "^2.0.5"
"gulp-minify-inline": "~0.2.1",
"gulp-plumber": "^1.1.0",
"gulp-postcss": "^6.1.1",
"gulp-preprocess": "~2.0.0",
"gulp-rename": "^1.2.2",
"gulp-sass": "^3.1.0",
"klaw": "^1.3.1",
"q": "~1.4.1"
},
"devDependencies": {
"ava": "^2.4.0",
"eslint": "^6.8.0",
"eslint-config-prettier": "^6.11.0",
"eslint-config-standard": "^14.1.1",
"eslint-plugin-import": "^2.22.0",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^3.1.4",
"eslint-plugin-promise": "^4.2.1",
"eslint-plugin-standard": "^4.0.1",
"graceful-fs": "^4.2.4",
"gulp-cli": "^2.3.0",
"opencollective-postinstall": "^2.0.3",
"prettier": "^1.19.1",
"pretty-quick": "^2.0.1"
},
"resolutions": {
"graceful-fs": "^4.2.4",
"vinyl-fs": "^3.0.3"
},
"browserslist": [
"last 5 versions"
],
"husky": {
"hooks": {
"pre-push": "npm run test",
"pre-commit": "npm run lint && node ./node_modules/.bin/pretty-quick --staged --pattern ./**/*.js"
}
},
"ava": {
"helpers": [
"**/util.js"
]
"scripts": {
"deploy": "cp -r dist demo && git push origin `git subtree split --prefix demo develop`:gh-pages --force"
}
}

View File

@ -1,76 +1,111 @@
const gulp = require('gulp');
const inlineCss = require('gulp-inline-css');
const minifyHTML = require('gulp-minify-html');
const minifyInline = require('gulp-minify-inline');
const preprocess = require('gulp-preprocess');
const rename = require('gulp-rename');
const del = require('del');
const { inlineImg } = require('./check-for-image-url');
const { getConfigsForDir, getFilePathsForDir, getCssLinkTagsFromFilelist } = require('./util/util');
'use strict';
function buildTask(options) {
// Requires: 'dupe', 'less', 'sass', 'postcss', 'lint'.
gulp.task('build', function build(done) {
/**
* Makes templates for a given directory & its configurations.
*
var gulp = require('gulp'),
inlineCss = require('gulp-inline-css'),
minifyHTML = require('gulp-minify-html'),
minifyInline = require('gulp-minify-inline'),
preprocess = require('gulp-preprocess'),
rename = require('gulp-rename'),
klaw = require('klaw'),
fs = require('fs'),
Q = require('q'),
del = require('del'),
jsonlint = require('jsonlint'),
inlineimg = require('gulp-inline-image-html'),
path = require('path');
function buildTask(options){
gulp.task('build', ['dupe', 'less', 'sass', 'postcss', 'lint'], function build() {
/** Makes templates for a given directory & its configurations.
* @function makeTemplates
* @param {String} dir Directory to make templates from.
* @param {Array} confItems A list of configurations objects (usually persons) to make templates from.
*/
function makeTemplates(dir, confItems) {
return confItems.map(async conf => {
const cwd = `${options.workingDir}/${dir}`;
function makeTemplates(dir, confItems){
confItems.forEach(function handleConf(conf){
var cwd = options.workingDir + '/' + dir;
var stylesheets = [];
/**
* Find stylesheets relative to the CWD & generate <link> tags.
* This way we can automagically inject them into <head>.
*/
const files = await getFilePathsForDir(cwd);
const context = Object.assign(conf, {
stylesheets: getCssLinkTagsFromFilelist(files)
});
klaw(cwd)
.on('readable', function walkTemplateDir() {
var stylesheet;
return options
.src([cwd + '/**/*.html', '!' + cwd + '/**/*.inc.html'])
.pipe(preprocess({ context }))
.pipe(inlineImg({ getHTTP: confItems[0]['inlineRemoteUrl'] }))
.pipe(
inlineCss({
applyTableAttributes: true,
applyWidthAttributes: true,
preserveMediaQueries: true,
removeStyleTags: false
})
)
.pipe(minifyHTML({ quotes: true }))
.pipe(minifyInline())
.pipe(
rename(function rename(path) {
path.dirname = dir;
path.basename += '-' + conf.id;
return path;
})
)
.pipe(gulp.dest(options.distDir));
while (stylesheet = this.read()) {
var relativePath = __dirname.substring(0, __dirname.lastIndexOf('/')) + '/tmp/' + dir;
stylesheets.push(stylesheet.path.replace(relativePath, ''));
}
})
.on('end', function finishedTemplateDirWalk() {
conf.stylesheets = stylesheets
.filter(function filterFiles(file) {
/* Read only CSS files. */
return (file.match(/.*\.css/)) ? true : false;
})
.reduce(function(prev, current, index, acc) {
var cssPath = path.win32.basename(current)
return prev += '<link rel="stylesheet" href="' + cssPath + '">';
}, '');
options
.src([cwd + '/**/*.html', '!' + cwd + '/**/*.inc.html'])
.pipe(preprocess({
context: conf
}))
.pipe(inlineimg(cwd))
.pipe(inlineCss({
applyTableAttributes: true,
applyWidthAttributes: true,
preserveMediaQueries: true,
removeStyleTags: false
}))
.pipe(minifyHTML({quotes: true}))
.pipe(minifyInline())
.pipe(rename(function rename(path){
path.dirname = dir;
path.basename += '-' + conf.id;
return path;
}))
.pipe(gulp.dest(options.dist));
})
});
}
/*
* Clean up & then read from workingDir to generate templates.
* For each found config, a template group will be generated through `makeTemplates`.
*/
return del(options.distDir)
.then(() => {
/**
* Loop through dirs and load their conf files.
* Promisify all 'makeTemplate' calls and when resolved, let gulp know we're done.
*/
const configs = getConfigsForDir(options.workingDir, options.configurationFile);
return Promise.all(configs.map(({ dir, confItems }) => makeTemplates(dir, confItems)));
/** Clean up & then read 'src' to generate templates (build entry point). */
del(options.dist)
.then(function buildStart(){
/**
* Loop through dirs and load their conf files.
* Promisify all 'makeTemplate' calls and when resolved, make a call to the task (`cb`) to let gulp know we're done.
*/
var files = [];
var promises = [];
fs
.readdirSync('./' + options.workingDir)
.forEach(function readConfigurations(dir){
/** NB: For 'watch' to properly work, the cache needs to be deleted before each require. */
var confPath = '../tmp/' + dir + '/conf.json';
var current = null;
var confItems;
delete require.cache[require.resolve(confPath)];
current = require(confPath);
if (current && current.length) {
confItems = [...current]
} else {
confItems = [current]
}
promises.push(makeTemplates(dir, confItems));
});
Q.all(promises);
})
.then(() => done())
.catch(err => console.log(err));
.catch(function (err) { console.log(err) })
});
}

14
tasks/check-deps.js Normal file
View File

@ -0,0 +1,14 @@
'use strict';
var gulp = require('gulp'),
david = require('gulp-david');
function checkDepsTask(){
gulp.task('check-deps', function checkDeps(){
gulp
.src('package.json')
.pipe(david());
});
}
module.exports = checkDepsTask;

View File

@ -1,155 +0,0 @@
'use strict';
const https = require('https');
const http = require('http');
const path = require('path');
const url = require('url');
const fs = require('fs');
const PluginError = require('plugin-error');
const through = require('through2');
const cheerio = require('cheerio');
const { log } = require('./util/util');
const PLUGIN_NAME = 'gulp-inline-images';
const MIME_TYPE_REGEX = /.+\/([^\s]*)/;
const INLINE_ATTR = 'inline';
const NOT_INLINE_ATTR = `!${INLINE_ATTR}`;
function inlineImg(options = {}) {
const selector = options.selector || 'img[src]';
const attribute = options.attribute || 'src';
const getHTTP = options.getHTTP || false;
return through.obj(function(file, encoding, callback) {
if (file.isStream()) {
this.emit('error', new PluginError(PLUGIN_NAME, 'Streams are not supported!'));
return callback();
}
if (file.isBuffer()) {
const contents = file.contents.toString(encoding);
// Load it into cheerio's virtual DOM for easy manipulation
const $ = cheerio.load(contents);
const inlineFlag = $(`img[${INLINE_ATTR}]`);
// If images with an inline attr are found that is the selection we want
const imgTags = inlineFlag.length ? inlineFlag : $(selector);
let count = 0;
imgTags.each(function() {
const $img = $(this);
const src = $img.attr(attribute);
// Save the file format from the extension
const extFormat = path.extname(src).substr(1);
// If inlineFlag tags were found we want to remove the inline tag
if (inlineFlag.length) {
$img.removeAttr(INLINE_ATTR);
}
// Find !inline attribute
const notInlineFlag = $img.attr(NOT_INLINE_ATTR);
if (typeof notInlineFlag !== typeof undefined && notInlineFlag !== false) {
// Remove the tag and don't process this file
return $img.removeAttr(NOT_INLINE_ATTR);
}
// Count async ops
count++;
getSrcBase64(options.basedir || file.base, getHTTP, src, (err, result, resFormat, skipFormatting) => {
if (err) {
log.warn(`Failed to load http image. Check the format of ${src}.`);
log.error(err);
} else {
// Need a format in and a result for this to work
if (!skipFormatting) {
if (result && (extFormat || resFormat)) {
$img.attr('src', `data:image/${extFormat};base64,${result}`);
} else {
$img.attr('src', ``);
$img.attr('alt', `Image not found, Please check Url`);
log.warn(`Failed to read image. Check the format of ${src}.`);
}
}
if (!--count) {
file.contents = Buffer.from($.html());
callback(null, file);
}
}
});
});
// If no files are processing we don't need to wait as none were ever started
if (!imgTags.length) {
file.contents = Buffer.from($.html());
callback(null, file);
}
}
});
}
function getHTTPBase64(url, callback) {
// Get applicable library
const lib = url.startsWith('https') ? https : http;
// Initiate a git request to our URL
const req = lib.get(url, res => {
// Check for redirect
if (res.statusCode >= 301 && res.statusCode < 400 && res.headers.location) {
// Redirect
return getHTTPBase64(res.headers.location, callback);
}
// Check for HTTP errors
if (res.statusCode < 200 || res.statusCode >= 400) {
return callback(new Error('Failed to load page, status code: ' + res.statusCode));
}
// Get file format
let format;
if (res.headers['content-type']) {
const matches = res.headers['content-type'].match(MIME_TYPE_REGEX);
if (matches) {
format = matches[1];
}
}
// Create an empty buffer to store the body in
let body = Buffer.from([]);
// Append each chunk to the body
res.on('data', chunk => (body = Buffer.concat([body, chunk])));
// Done callback
res.on('end', () => callback(null, body.toString('base64'), format));
});
// Listen for network errors
req.on('error', err => callback(err));
}
function getSrcBase64(base, getHTTP, src, callback) {
// TODO: @deprecated — since v11.0.0 url.parse should be replaced with url.URL() ctor
if (!url.parse(src).hostname) {
// Get local file
const filePath = path.join(base, src);
if (fs.existsSync(filePath)) {
fs.readFile(filePath, 'base64', callback);
} else {
callback(null);
}
} else {
// Get remote file
if (getHTTP) {
return getHTTPBase64(src, callback);
} else {
callback(null, src, null, true);
}
}
}
module.exports = {
inlineImg,
getHTTPBase64,
getSrcBase64
};

View File

@ -1,10 +0,0 @@
const gulp = require('gulp');
function checkForUnusedTask(options) {
gulp.task('check-for-missing', async done => {
// TODO
done();
});
}
module.exports = checkForUnusedTask;

View File

@ -1,75 +0,0 @@
const gulp = require('gulp');
const chalk = require('chalk');
const { getConfigsForDir, getFilePathsForDir, getHtmlTemplatesFromFilelist, log } = require('./util/util');
const OUTPUT_KEYWORD = '@echo';
function checkForUnusedTask(options) {
gulp.task('check-for-unused', async done => {
const configs = getConfigsForDir(options.workingDir, options.configurationFile);
const unusedItems = await checkForUnusedItemsInConfigs(options.workingDir, configs);
outputWarningsForUnusedItems(unusedItems, configs);
done();
});
}
/**
* Outputs warnings for unused items.
*
* @param { Array<Array<string>> } unusedItems
* @param { Array<object> } configs
*/
const outputWarningsForUnusedItems = (unusedItems, configs) => {
const find = OUTPUT_KEYWORD;
const regex = new RegExp(find, 'g');
unusedItems.forEach((unusedInConfigs, index) => {
const { dir } = configs[index];
unusedInConfigs.forEach(unusedInConfItems => {
const unusedItemsToLog = unusedInConfItems
.filter(item => item !== `${OUTPUT_KEYWORD} id`)
.filter(item => item !== '@echo inlineRemoteUrl');
if (unusedItemsToLog.length) {
log.warn(
`${unusedItemsToLog.length} unused properties in ${dir}: ${unusedItemsToLog
.reduce((acc, cur) => (acc ? `${acc}, ${chalk.white(cur)}` : chalk.white(cur)), '')
.replace(regex, '')}`
);
}
});
});
};
/**
* In a directory, checks for unused configs.
*
* @param { string } rootDir
* @param { Array } configs Array of configs.
*/
const checkForUnusedItemsInConfigs = (rootDir, configs) =>
Promise.all(
configs.map(async ({ dir, confItems }) => {
return Promise.all(
confItems.map(async confItem => {
const definedStrings = Object.keys(confItem).map(key => `${OUTPUT_KEYWORD} ${key}`);
const cwd = `${rootDir}/${dir}`;
const files = await getFilePathsForDir(cwd);
const htmlTemplates = await getHtmlTemplatesFromFilelist(files);
const concatenatedTemplates = htmlTemplates.join('');
return definedStrings.filter(str => !concatenatedTemplates.includes(str));
})
);
})
);
const self = {
checkForUnusedTask,
outputWarningsForUnusedItems,
checkForUnusedItemsInConfigs
};
module.exports = self;

View File

@ -1,11 +1,15 @@
const gulp = require('gulp');
const del = require('del');
'use strict';
function dupeTask(options) {
gulp.task('dupe', function() {
var gulp = require('gulp'),
del = require('del');
function dupeTask(options){
gulp.task('dupe', function(){
del.sync([options.workingDir]);
return options.src([options.sourceDir + '/**/*']).pipe(gulp.dest('./' + options.workingDir));
return options
.src([options.source + '/**/*'])
.pipe(gulp.dest('./' + options.workingDir));
});
}

View File

@ -1,18 +1,21 @@
const gulp = require('gulp');
const less = require('gulp-less');
const autoprefixer = require('gulp-autoprefixer');
const rename = require('gulp-rename');
'use strict';
function lessTask(options) {
// Requires: dupe.
gulp.task('less', function() {
var gulp = require('gulp'),
less = require('gulp-less'),
autoprefixer = require('gulp-autoprefixer'),
rename = require('gulp-rename');
function lessTask(options){
gulp.task('less', ['dupe'], function(){
return options
.src(options.workingDir + '/**/*.less')
.pipe(less())
.pipe(autoprefixer())
.pipe(autoprefixer({
browsers: ['last 5 versions']
}))
.pipe(rename({ extname: '.css' }))
.pipe(gulp.dest(options.workingDir));
});
}
module.exports = lessTask;
module.exports = lessTask;

View File

@ -1,9 +1,10 @@
const gulp = require('gulp');
const jsonlint = require('gulp-jsonlint');
'use strict';
function lintTask(options) {
// Requiers: dupe.
gulp.task('lint', function() {
var gulp = require('gulp'),
jsonlint = require("gulp-jsonlint");
function lintTask(options){
gulp.task('lint', ['dupe'], function(){
return options
.src(options.workingDir + '/**/conf.json')
.pipe(jsonlint())
@ -11,4 +12,4 @@ function lintTask(options) {
});
}
module.exports = lintTask;
module.exports = lintTask;

View File

@ -1,11 +1,16 @@
const gulp = require('gulp');
const postcss = require('gulp-postcss');
const autoprefixer = require('autoprefixer');
'use strict';
function postcssTask(options) {
// Requires: dupe.
gulp.task('postcss', function() {
var processors = [autoprefixer()];
var gulp = require('gulp'),
postcss = require('gulp-postcss'),
autoprefixer = require('autoprefixer');
function postcssTask(options){
gulp.task('postcss', ['dupe'], function () {
var processors = [
autoprefixer({
browsers: ['last 5 versions']
})
];
return options
.src(options.workingDir + '/**/*.css')
@ -14,4 +19,4 @@ function postcssTask(options) {
});
}
module.exports = postcssTask;
module.exports = postcssTask;

View File

@ -1,21 +1,21 @@
const gulp = require('gulp');
const autoprefixer = require('gulp-autoprefixer');
const sass = require('gulp-sass');
const rename = require('gulp-rename');
'use strict';
function sassTask(options) {
// Requires: dupe.
gulp.task(
'sass',
gulp.series('dupe', function() {
return options
.src(options.workingDir + '/**/*.scss')
.pipe(sass())
.pipe(autoprefixer())
.pipe(rename({ extname: '.css' }))
.pipe(gulp.dest(options.workingDir));
})
);
var gulp = require('gulp'),
autoprefixer = require('gulp-autoprefixer'),
sass = require('gulp-sass'),
rename = require('gulp-rename');
function sassTask(options){
gulp.task('sass', ['dupe'], function(){
return options
.src(options.workingDir + '/**/*.scss')
.pipe(sass())
.pipe(autoprefixer({
browsers: ['last 5 versions']
}))
.pipe(rename({ extname: '.css' }))
.pipe(gulp.dest(options.workingDir));
});
}
module.exports = sassTask;
module.exports = sassTask;

View File

@ -1,131 +0,0 @@
const fs = require('fs');
const path = require('path');
const klaw = require('klaw');
const chalk = require('chalk');
// todo test
/**
* Given a directory, scans all directories in it (not deep) and returns found config items.
*
* @param { string } rootDir Dir to look into.
* @param { string } configFileName Files to look for in each dir, i.e. conf.json
*/
const getConfigsForDir = (rootDir, configFileName) => {
return fs
.readdirSync(rootDir)
.map(dir => {
const confPath = `${dir}/${configFileName}`;
/** Exit with warn if no configuration file found. */
if (!fs.existsSync(path.resolve(rootDir, confPath))) {
self.log.warn(`Missing configuration in "${dir}". Did you remember to create "${dir}/${configFileName}"?`);
return false;
}
let current = null;
let confItems;
const resolvedPath = path.resolve(rootDir, confPath);
delete require.cache[resolvedPath]; // NB: For 'watch' to properly work, the cache needs to be deleted before each require.
current = require(resolvedPath);
// Handle single objects or arrays of configs.
if (current && current.length) {
confItems = [...current];
} else {
confItems = [current];
}
return {
dir,
confItems
};
})
.filter(config => config);
};
/**
* Given a directory, gets all file paths in it.
*
* @param { string } dir Dir to get files paths for.
*/
const getFilePathsForDir = dir => {
const files = [];
return new Promise(resolve => {
klaw(dir)
.on('readable', function walkTemplateDir() {
let file;
while ((file = this.read())) {
const relativePath = `${__dirname.substring(0, __dirname.lastIndexOf('/'))}/${dir}`;
files.push(file.path.replace(relativePath, ''));
}
})
.on('end', function finishedTemplateDirWalk() {
resolve(files);
});
});
};
/**
* Gets an array of html files in a filelist.
*
* @param { Array } filelist
*/
const getHtmlTemplatesFromFilelist = filelist => {
return Promise.all(
filelist
.filter(file => file.match(/.*\.html/) || file.match(/.*\.inc*\.html/))
.map(
htmlTemplate =>
new Promise((resolve, reject) => {
fs.readFile(htmlTemplate, 'utf8', (error, data) => {
if (error) {
reject(error);
}
resolve(data);
});
})
)
);
};
/**
* Gets an array of css link tags from a filelist (if css files are in the filelist).
*
* @param { Array } filelist
*/
const getCssLinkTagsFromFilelist = filelist => {
return filelist
.filter(file => !!file.match(/.*\.css/)) // Read only CSS files.
.reduce((acc, cur) => {
const cssPath = path.win32.basename(cur);
return (acc += '<link rel="stylesheet" href="' + cssPath + '">');
}, '');
};
const log = {
warn: (...messages) => {
console.warn('🔵 ', chalk.yellow(messages));
},
log: (...messages) => {
console.log('🔘 ', chalk.gray(messages));
},
error: (...messages) => {
console.error('🔴 ', chalk.red(messages));
}
};
const self = {
log,
getConfigsForDir,
getFilePathsForDir,
getHtmlTemplatesFromFilelist,
getCssLinkTagsFromFilelist
};
module.exports = self;

20
tasks/watch.js Normal file
View File

@ -0,0 +1,20 @@
'use strict';
var gulp = require('gulp');
function watchTask(options){
gulp.task('watch', ['dupe', 'build'], function(){
gulp.watch(
[
options.source + '/**/*.html',
options.source + '/**/*.css',
options.source + '/**/*.scss',
options.source + '/**/*.less',
options.source + '/**/conf.json'
],
['dupe', 'less', 'sass', 'postcss', 'build']
);
});
}
module.exports = watchTask;

View File

@ -1,11 +0,0 @@
{
"id": "dark",
"signature": "Best regards,",
"name": "The dark mail team",
"contactMain": "Call <a href='tel:004580100100'><span>(45) 80100100</span></a> or email us at",
"contactMail": "info@dark.dk",
"slogan": "LED Pylon. LED Wall. Digital Signage.",
"logoUrl": "/assets/dark.png",
"logoAlt": "dark logo",
"website": "http://dark.dk"
}

View File

@ -1,160 +0,0 @@
/*
* =====================================
* 1. Common styles for general table things.
* =====================================
*/
img {
max-width: 100%;
}
body {
-webkit-font-smoothing: antialiased;
-webkit-text-size-adjust: none;
}
tr {
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
box-sizing: border-box;
font-size: 14px;
line-height: 22px;
}
.main {
width: 100%;
background-color: #ffffff;
}
.rbcc {
/*
* rbcc -> reset - border - cellspacing - cellpading
*
* Resets table attributes.
*/
border: 0;
cellpadding: 0;
cellspacing: 0;
}
.sp {
/* Separator tr; props are actually contained by it's inner element atm. */
}
.sp__inner {
padding: 15px 0;
}
.spd {
/* Separator tr (double); props are actually contained by it's inner element atm. */
}
.spd__inner {
height: 60px;
}
a {
text-decoration: none;
color: #0fade1;
}
/*
* =================
* 2. Content styles.
* ==================
*/
.main__welcome {
color: #000;
padding: 10px 30px 0 30px;
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
font-size: 16px;
line-height: 22px;
}
.main__content {
color: #000;
padding: 10px 30px 0 30px;
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
font-size: 14px;
}
/*
* ================
* 3. Footer styles.
* ================
*/
.footer {
background-color: #303030;
padding: 20px 30px 0px 30px;
color: #f5f5f5;
border-top: 8px solid #585858;
}
.footer a {
color: #f5f5f5;
}
.footer--simple {
padding-bottom: 20px;
background-color: #ffffff;
}
.footer--simple tr td {
color: #888;
}
.footer__main {
/* This style property fucks up the width on OS X, needs to be *JUST* attribute */
width: 100%;
}
.footer__main__signature {
font-size: 14px;
color: #f5f5f5;
/* @todo gulp-inline-css doesn't parse align; it needs to be duplicated in the HTML template */
align: left;
}
.footer__main__col1 {
width: 70%;
margin-bottom: 40px;
/* @todo gulp-inline-css doesn't parse align; it needs to be duplicated in the HTML template */
align: left;
}
.footer__main__col1__td {
color: #9e9e9e;
/* @todo gulp-inline-css doesn't parse align; it needs to be duplicated in the HTML template */
align: left;
padding-top: 15px;
}
.footer__main__col1__td > span {
font-size: 18px;
margin-bottom: 5px;
}
.footer__main a > span {
/* Revert apple blue-link style. */
color: #f5f5f5 !important;
text-decoration: none !important;
}
.footer__main__col2 {
width: 30%;
/* @todo gulp-inline-css doesn't parse align; it needs to be duplicated in the HTML template */
align: right;
}
.footer__main__col2__td {
font-size: 14px;
color: #f5f5f5;
/* @todo gulp-inline-css doesn't parse align; it needs to be duplicated in the HTML template */
align: right;
}
.footer__main__col2__td__img {
border: 0;
padding-left: 20px;
max-width: 100%;
max-height: 65px;
height: auto;
}

View File

@ -0,0 +1,72 @@
[
{
"id": "dan",
"signature": "Med venlig hilsen / best regards,",
"name": "Dan Mindru",
"position": "Interaction Designer",
"welcome": "Hi there,",
"introParagraph": "Thank your for your message.",
"contactMain": "Call <a href='tel:004552783387'><span>(+45) 52783387</span></a> or email me at",
"contactMail": "dm@fadeit.dk",
"contactSecondary": "<a href='https://goo.gl/maps/9ENsvuF6TjP2'><span>Thorsagervej 11-13, 8550 Ryomgård, Denmark</span></a>",
"logoUrl": "https://fadeit.dk/src/assets/img/brand/fadeit-logo.png",
"logoAlt": "fadeit logo",
"website": "https://fadeit.dk"
},
{
"id": "lars",
"signature": "Med venlig hilsen / best regards,",
"name": "Lars Normark Holmgaard",
"position": "CEO",
"welcome": "Hi there,",
"introParagraph": "Thank your for your message.",
"contactMain": "Call <a href='tel:004581100200'><span>(+45) 81100200</span></a> or email me at",
"contactMail": "lnh@fadeit.dk",
"contactSecondary": "<a href='https://goo.gl/maps/9ENsvuF6TjP2'><span>Thorsagervej 11-13, 8550 Ryomgård, Denmark</span></a>",
"logoUrl": "https://fadeit.dk/src/assets/img/brand/fadeit-logo.png",
"logoAlt": "fadeit logo",
"website": "https://fadeit.dk"
},
{
"id": "sander",
"signature": "Med venlig hilsen / best regards,",
"name": "Sander Sink",
"position": "Software Developer",
"welcome": "Hi there,",
"introParagraph": "Thank your for your message.",
"contactMain": "Call <a href='tel:003725330876'><span>(+372) 53308767</span></a> or email me at",
"contactMail": "ss@fadeit.dk",
"contactSecondary": "<a href='https://goo.gl/maps/9ENsvuF6TjP2'><span>Thorsagervej 11-13, 8550 Ryomgård, Denmark</span></a>",
"logoUrl": "https://fadeit.dk/src/assets/img/brand/fadeit-logo.png",
"logoAlt": "fadeit logo",
"website": "https://fadeit.dk"
},
{
"id": "justas",
"signature": "Med venlig hilsen / best regards,",
"name": "Justas Azna",
"position": "Software Engineer",
"welcome": "Hi,",
"introParagraph": "Thank your for your message.",
"contactMain": "Call <a href='tel:004581101101'><span>(+45) 81101101</span></a> or email me at",
"contactMail": "ja@fadeit.dk",
"contactSecondary": "<a href='https://goo.gl/maps/9ENsvuF6TjP2'><span>Thorsagervej 11-13, 8550 Ryomgård, Denmark</span></a>",
"logoUrl": "https://fadeit.dk/src/assets/img/brand/fadeit-logo.png",
"logoAlt": "fadeit logo",
"website": "https://fadeit.dk"
},
{
"id": "mie",
"signature": "Med venlig hilsen / best regards,",
"name": "Mie Bøgh Noes",
"position": "Bogholderi",
"welcome": "Hej,",
"introParagraph": "Thank your for your message.",
"contactMain": "Call <a href='tel:004581100200'><span>(+45) 81100200</span></a> or email me at",
"contactMail": "mbn@fadeit.dk",
"contactSecondary": "<a href='https://goo.gl/maps/9ENsvuF6TjP2'><span>Thorsagervej 11-13, 8550 Ryomgård, Denmark</span></a>",
"logoUrl": "https://fadeit.dk/src/assets/img/brand/fadeit-logo.png",
"logoAlt": "fadeit logo",
"website": "https://fadeit.dk"
}
]

View File

@ -1,29 +1,33 @@
<td class="footer">
<table class="rbcc footer__main">
<tr>
<!-- @todo gulp-inline-css doesn't parse align -->
<td class="footer__main__signature" align="left">
<!-- @echo signature --><br />
<!-- @echo name --><br />
</td>
</tr>
<tr class="gray-hr">
<td><hr class="gray-hr" /></td>
<td><hr class="gray-hr"/></td>
</tr>
<tr>
<!-- @todo gulp-inline-css doesn't parse align -->
<table class="rbcc footer__main__col1" align="left">
<td class="footer__main__col1__td" align="left">
<strong>
<!-- @echo contactMain -->
<a href="mailto:<!-- @echo contactMail -->" target="_blank"><!-- @echo contactMail --></a> </strong
><br />
<a href="mailto:<!-- @echo contactMail -->" target="_blank"><!-- @echo contactMail --></a>
</strong><br />
<!-- @echo contactSecondary -->
</td>
</table>
<!-- @todo gulp-inline-css doesn't parse align -->
<table class="rbcc footer__main__col2" align="right">
<!-- @todo gulp-inline-css doesn't parse align -->
<td class="footer__main__col2__td" align="right">
<a href="<!-- @echo website -->">
<img src="<!-- @echo logoUrl -->" alt="<!-- @echo logoAlt -->" class="footer__main__col2__td__img" />
<img src="<!-- @echo logoUrl -->" alt="<!-- @echo logoAlt -->" class="footer__main__col2__td__img"/>
</a>
</td>
</table>

163
templates/fadeit/light.css Normal file
View File

@ -0,0 +1,163 @@
/*
* =====================================
* 1. Common styles for general table things.
* =====================================
*/
img {
max-width: 100%;
}
body {
-webkit-font-smoothing: antialiased;
-webkit-text-size-adjust: none;
}
tr{
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
box-sizing: border-box;
font-size: 14px;
line-height: 20px;
}
.rbcc{
/*
* rbcc -> reset - border - cellspacing - cellpading
*
* Resets table attributes.
*/
border:0;
cellpadding:0;
cellspacing:0;
}
.background{
width:100%;
}
.main{
width:100%;
background-color: #ffffff;
padding-top:15px;
}
.sp{ /* Separator tr; props are actually contained by it's inner element atm. */ }
.sp__inner{
padding: 15px 0;
}
.gray-hr{ /* 100% width light grey line; props are actually contained by inner elements atm. */ }
.gray-hr td{
width: 100%;
}
.gray-hr hr{
border-bottom:1px solid #E4E4E4;
border-top:none;
margin-bottom:20px;
margin-top:20px;
color: transparent;
background:transparent;
}
a{
text-decoration: none;
color: #0fade1;
}
/*
* =================
* 2. Content styles.
* ==================
*/
.main__welcome{
color: #000;
padding: 10px 30px 0 30px;
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
font-size: 16px;
line-height: 22px;
}
.main__content{
color: #000;
padding: 10px 30px 0 30px;
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
font-size: 14px;
}
/*
* ================
* 3. Footer styles.
* ================
*/
.footer{
background-color: #f5f5f5;
padding: 20px 30px 0px 30px;
color: #888;
border-top: 8px solid #EAEAEA;
}
.footer a{
color: #888;
}
.footer--simple{
padding-bottom: 20px;
background-color: #FFFFFF;
}
.footer__main{
/* NB: This prop fucks up the width on OS X, needs to be *JUST* attribute. */
width:100%;
}
.footer__main__signature{
font-size: 14px;
color: #888;
/* @todo gulp-inline-css doesn't parse align */
align:left;
}
.footer__main__col1{
width:70%;
margin-bottom:30px;
/* @todo gulp-inline-css doesn't parse align */
align:left;
}
.footer__main__col1__td{
font-size: 14px;
color: #888;
/* @todo gulp-inline-css doesn't parse align */
align:left;
}
.footer__main a > span{
/* Revert apple blue-link style. */
color: #888!important;
text-decoration:none!important;
}
.footer__main__col2{
width:30%;
/* @todo gulp-inline-css doesn't parse align */
align:right;
}
.footer__main__col2__td{
font-size: 14px;
color: #888;
/* @todo gulp-inline-css doesn't parse align */
align:right;
}
.footer__main__col2__td__img{
border: 0;
padding-top: 6px;
padding-left:10px;
max-width: 100%;
max-height:38px;
height: auto;
}

View File

@ -1,16 +1,15 @@
<!-- @include head.inc.html -->
<body>
<br />
<br/>
<table class="main rbcc">
<tr class="sp">
<td class="sp__inner"></td>
</tr>
<tr class="sp"><td class="sp__inner"></td></tr>
<tr class="rbcc">
<td class="footer footer--simple">
<table class="rbcc footer__main">
<tr>
<!-- @todo gulp-inline-css doesn't parse align -->
<td class="footer__main__signature" align="left">
<!-- @echo signature --><br />
<!-- @echo name --><br />
@ -20,4 +19,4 @@
</td>
</tr>
</table>
</body>
</body>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -1,13 +0,0 @@
{
"id": "light",
"signature": "Yours truly,",
"name": "The light mail team",
"welcome": "Hi there,",
"introParagraph": "Thanks for writing up this email.<br/> We are delighted to reply with a responsive template.",
"contactMain": "Call <a href='tel:80100100'><span>80100100</span></a> or email us at",
"contactMail": "info@light.dk",
"contactSecondary": "<a href='https://mapurl.com'><span>Happy Steet 31, DK-8000 Aarhus C, Denmark</span></a>",
"logoUrl": "/assets/light.png",
"logoAlt": "light logo",
"website": "http://light.dk"
}

View File

@ -1,166 +0,0 @@
/*
* =====================================
* 1. Common styles for general table things.
* =====================================
*/
img {
max-width: 100%;
}
body {
-webkit-font-smoothing: antialiased;
-webkit-text-size-adjust: none;
}
tr {
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
box-sizing: border-box;
font-size: 14px;
line-height: 20px;
}
.rbcc {
/*
* rbcc -> reset - border - cellspacing - cellpading
*
* Resets table attributes.
*/
border: 0;
cellpadding: 0;
cellspacing: 0;
}
.background {
width: 100%;
}
.main {
width: 100%;
background-color: #ffffff;
padding-top: 15px;
}
.sp {
/* Separator tr; props are actually contained by it's inner element atm. */
}
.sp__inner {
padding: 15px 0;
}
.gray-hr {
/* 100% width light grey line; props are actually contained by inner elements atm. */
}
.gray-hr td {
width: 100%;
}
.gray-hr hr {
border-bottom: 1px solid #e4e4e4;
border-top: none;
margin-bottom: 20px;
margin-top: 20px;
color: transparent;
background: transparent;
}
a {
text-decoration: none;
color: #0fade1;
}
/*
* =================
* 2. Content styles.
* ==================
*/
.main__welcome {
color: #000;
padding: 10px 30px 0 30px;
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
font-size: 16px;
line-height: 22px;
}
.main__content {
color: #000;
padding: 10px 30px 0 30px;
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
font-size: 14px;
}
/*
* ================
* 3. Footer styles.
* ================
*/
.footer {
background-color: #f5f5f5;
padding: 20px 30px 0px 30px;
color: #888;
border-top: 8px solid #eaeaea;
}
.footer a {
color: #888;
}
.footer--simple {
padding-bottom: 20px;
background-color: #ffffff;
}
.footer__main {
/* NB: This prop fucks up the width on OS X, needs to be *JUST* attribute. */
width: 100%;
}
.footer__main__signature {
font-size: 14px;
color: #888;
/* @todo gulp-inline-css doesn't parse align; it needs to be duplicated in the HTML template */
align: left;
}
.footer__main__col1 {
width: 70%;
margin-bottom: 30px;
/* @todo gulp-inline-css doesn't parse align; it needs to be duplicated in the HTML template */
align: left;
}
.footer__main__col1__td {
font-size: 14px;
color: #888;
/* @todo gulp-inline-css doesn't parse align; it needs to be duplicated in the HTML template */
align: left;
}
.footer__main a > span {
/* Revert apple blue-link style. */
color: #888 !important;
text-decoration: none !important;
}
.footer__main__col2 {
width: 30%;
/* @todo gulp-inline-css doesn't parse align; it needs to be duplicated in the HTML template */
align: right;
}
.footer__main__col2__td {
font-size: 14px;
color: #888;
/* @todo gulp-inline-css doesn't parse align; it needs to be duplicated in the HTML template */
align: right;
}
.footer__main__col2__td__img {
border: 0;
padding-top: 6px;
padding-left: 10px;
max-width: 100%;
max-height: 38px;
height: auto;
}

View File

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

54
templates/play/conf.json Normal file
View File

@ -0,0 +1,54 @@
[
{
"id": "lars",
"signature": "Med venlig hilsen / best regards,",
"name": "Lars Normark Holmgaard",
"position": "CEO / Adm. Direktør",
"contactMain": "Call <a href='tel:004581101020'><span><b>(+45) 81101020</b></span></a> or email me at",
"contactMail": "lars@playsignage.com",
"contactAddress": "<a href='https://goo.gl/maps/9ENsvuF6TjP2'><span>Thorsagervej 11-13, 8550 Ryomgård, Denmark</span></a>",
"slogan": "Play Digital Signage",
"logoUrl": "https://playsignage.com/manage/assets/images/play-logo.png",
"logoAlt": "Play Digital Signage logo",
"website": "https://playsignage.com/?utm_source=sig&utm_medium=lnh"
},
{
"id": "justas",
"signature": "Best regards,",
"name": "Justas Azna",
"position": "Software Engineer / Co-founder",
"contactMain": "Call <a href='tel:004581101101'><span><b>(+45) 81101101</b></span></a> or email me at",
"contactMail": "justas@playsignage.com",
"contactAddress": "<a href='https://goo.gl/maps/9ENsvuF6TjP2'><span>Thorsagervej 11-13, 8550 Ryomgård, Denmark</span></a>",
"slogan": "Play Digital Signage",
"logoUrl": "https://playsignage.com/manage/assets/images/play-logo.png",
"logoAlt": "Play Digital Signage logo",
"website": "https://playsignage.com/?utm_source=sig&utm_medium=ja"
},
{
"id": "anette",
"signature": "Med venlig hilsen / best regards,",
"name": "Anette Jæger",
"position": "Key Account Manager Jylland",
"contactMain": "Call <a href='tel:004526335244'><span><b>(+45) 26335244</b></span></a> or email me at",
"contactMail": "aj@tryplay.dk",
"contactAddress": "<a href='https://goo.gl/maps/9ENsvuF6TjP2'><span>Thorsagervej 11-13, 8550 Ryomgård, Denmark</span></a>",
"slogan": "Play Digital Signage",
"logoUrl": "https://playsignage.com/manage/assets/images/play-logo.png",
"logoAlt": "Play Digital Signage logo",
"website": "https://playsignage.com/?utm_source=sig&utm_medium=aj"
},
{
"id": "sander",
"signature": "Best Regards,",
"name": "Sander Sink",
"position": "Software Engineer / Co-founder",
"contactMain": "Call <a href='tel:0037253308767'><span><b>(+372) 53308767</b></span></a> or email me at",
"contactMail": "sander@playsignage.com",
"contactAddress": "<a href='https://goo.gl/maps/9ENsvuF6TjP2'><span>Thorsagervej 11-13, 8550 Ryomgård, Denmark</span></a>",
"slogan": "Play Digital Signage",
"logoUrl": "https://playsignage.com/manage/assets/images/play-logo.png",
"logoAlt": "Play Digital Signage logo",
"website": "https://playsignage.com/?utm_source=sig&utm_medium=ss"
}
]

156
templates/play/dark.css Normal file
View File

@ -0,0 +1,156 @@
/*
* =====================================
* 1. Common styles for general table things.
* =====================================
*/
img {
max-width: 100%;
}
body {
-webkit-font-smoothing: antialiased;
-webkit-text-size-adjust: none;
}
tr{
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
box-sizing: border-box;
font-size: 14px;
line-height: 22px;
}
.main{
width:100%;
background-color: #ffffff;
}
.rbcc{
/*
* rbcc -> reset - border - cellspacing - cellpading
*
* Resets table attributes.
*/
border:0;
cellpadding:0;
cellspacing:0;
}
.sp{ /* Separator tr; props are actually contained by it's inner element atm. */ }
.sp__inner{
padding: 15px 0;
}
.spd{ /* Separator tr (double); props are actually contained by it's inner element atm. */ }
.spd__inner{
height: 60px;
}
a{
color: #0fade1;
}
/*
* =================
* 2. Content styles.
* ==================
*/
.main__welcome{
color: #000;
padding: 10px 30px 0 30px;
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
font-size: 16px;
line-height: 22px;
}
.main__content{
color: #000;
padding: 10px 30px 0 30px;
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
font-size: 14px;
}
/*
* ================
* 3. Footer styles.
* ================
*/
.footer{
background-color: #303030;
padding: 20px 30px 0px 30px;
color: #f5f5f5;
border-top: 8px solid #585858;
}
.footer a{
color: #f5f5f5;
}
.footer--simple{
padding-bottom: 20px;
background-color: #FFFFFF;
}
.footer--simple tr td{
color: #888;
}
.footer__main{
/* This style property fucks up the width on OS X, needs to be *JUST* attribute */
width:100%;
}
.footer__main__signature{
font-size: 14px;
color: #f5f5f5;
/* @todo gulp-inline-css doesn't parse align */
align:left;
}
.footer__main__col1{
width:70%;
margin-bottom:40px;
/* @todo gulp-inline-css doesn't parse align */
align:left;
}
.footer__main__col1__td{
color: #f5f5f5;
/* @todo gulp-inline-css doesn't parse align */
align:left;
padding-top: 15px;
}
.footer__main__col1__td > span{
font-size:20px;
margin-bottom:5px;
}
.footer__main a > span{
/* Revert apple blue-link style. */
color: #f5f5f5!important;
text-decoration:none!important;
}
.footer__main__col2{
width:30%;
/* @todo gulp-inline-css doesn't parse align */
align:right;
}
.footer__main__col2__td{
font-size: 14px;
color: #f5f5f5;
/* @todo gulp-inline-css doesn't parse align */
align:right;
}
.footer__main__col2__td__img{
border: 0;
padding-left:20px;
max-width: 100%;
max-height:65px;
height: auto;
}

View File

@ -1,28 +1,32 @@
<td class="footer">
<table class="rbcc footer__main">
<tr>
<!-- @todo gulp-inline-css doesn't parse align -->
<td class="footer__main__signature" align="left">
<!-- @echo signature --><br />
<strong><!-- @echo name --></strong><br />
<strong><!-- @echo position --></strong><br />
</td>
</tr>
<tr class="spd">
<td class="spd__inner"></td>
</tr>
<tr class="spd"><td class="spd__inner"></td></tr>
<tr>
<!-- @todo gulp-inline-css doesn't parse align -->
<table class="rbcc footer__main__col2" align="right">
<!-- @todo gulp-inline-css doesn't parse align -->
<td class="footer__main__col2__td" align="right">
<a href="<!-- @echo website -->">
<img src="<!-- @echo logoUrl -->" alt="<!-- @echo logoAlt -->" class="footer__main__col2__td__img" />
<img src="<!-- @echo logoUrl -->" alt="<!-- @echo logoAlt -->" class="footer__main__col2__td__img"/>
</a>
</td>
</table>
<!-- @todo gulp-inline-css doesn't parse align -->
<table class="rbcc footer__main__col1" align="left">
<!-- @todo gulp-inline-css doesn't parse align -->
<td class="footer__main__col1__td" align="left">
<span><!-- @echo slogan --></span><br />
<span><!-- @echo slogan --></span><br/>
<!-- @echo contactMain -->
<a href="mailto:<!-- @echo contactMail -->" target="_blank"><!-- @echo contactMail --></a>
</td>

View File

@ -1,18 +1,16 @@
<!-- @include head.inc.html -->
<body>
<br />
<!-- <br/> Makes it easier to add text when composing -->
<br/> <!-- <br/> Makes it easier to add text when composing -->
<table class="main rbcc">
<tr class="sp">
<td class="sp__inner"></td>
</tr>
<tr class="sp"><td class="sp__inner"></td></tr>
<tr class="rbcc">
<td class="footer footer--simple">
<table class="rbcc footer__main">
<tr>
<!-- @todo gulp-inline-css doesn't parse align -->
<td class="footer__main__signature" align="left">
<!-- @echo signature --><br />
<!-- @echo name --><br />
@ -22,4 +20,4 @@
</td>
</tr>
</table>
</body>
</body>

View File

@ -1,37 +0,0 @@
const test = require('ava');
const { readFileSync } = require('../util');
test('dark signature output', async t => {
const expected = readFileSync('tests/sample/dark/signature-dark.html');
const built = readFileSync('dist/dark/signature-dark.html');
t.deepEqual(expected, built);
});
test('dark signature reply output', async t => {
const expected = readFileSync('tests/sample/dark/signature-reply-dark.html');
const built = readFileSync('dist/dark/signature-reply-dark.html');
t.deepEqual(expected, built);
});
test('light signature output', async t => {
const expected = readFileSync('tests/sample/light/signature-light.html');
const built = readFileSync('dist/light/signature-light.html');
t.deepEqual(expected, built);
});
test('light signature reply output', async t => {
const expected = readFileSync('tests/sample/light/signature-reply-light.html');
const built = readFileSync('dist/light/signature-reply-light.html');
t.deepEqual(expected, built);
});
test('light full mail output', async t => {
const expected = readFileSync('tests/sample/light/full-mail-light.html');
const built = readFileSync('dist/light/full-mail-light.html');
t.deepEqual(expected, built);
});

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="viewport" content="width=device-width"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">@media only screen and (max-width:560px){.footer td{font-size:12px!important}.footer__main__col1{width:100%!important}.footer__main__col1__td{text-align:left}.footer__main__col1__td>span{margin-bottom:10px}.footer__main__col2{width:100%!important}.footer__main__col2__td{text-align:left;padding-bottom:20px}.footer__main__col2__td__img{padding-left:0!important}}</style></head><body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"><br><table class="main rbcc" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff" width="100%"><tr class="sp" style="-webkit-box-sizing: border-box; box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="sp__inner" style="padding: 15px 0;"></td></tr><tr class="rbcc" style="-webkit-box-sizing: border-box; border: 0; box-sizing: border-box; cellpadding: 0; cellspacing: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="footer footer--simple" style="border-top: 8px solid #585858; color: #f5f5f5; padding: 20px 30px 0px 30px; padding-bottom: 20px;" bgcolor="#ffffff"><table class="rbcc footer__main" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="100%"><tr style="-webkit-box-sizing: border-box; box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 22px;"><td class="footer__main__signature" align="left" style="align: left; color: #888; font-size: 14px;">Best regards,<br>The dark mail team<br></td></tr></table></td></tr></table></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="viewport" content="width=device-width"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">@media only screen and (max-width:480px){.footer td{font-size:12px!important}.footer__main__col1{width:100%!important}.footer__main__col2{width:100%!important}.footer__main__col2__td{text-align:left;padding-bottom:20px}.footer__main__col2__td__img{padding-left:0!important}.gray-hr hr{margin-bottom:10px!important;margin-top:10px!important}}@media only screen and (min-width:1025px){.body-with-bg{background-color:#f1f1f1}.body-with-bg .main{border:1px solid #e9e9e9!important;max-width:960px;margin:0 auto}.background{padding:30px;background-color:#f1f1f1}}</style></head><body style="-webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none;"><br><table class="main rbcc" style="border: 0; cellpadding: 0; cellspacing: 0; padding-top: 15px;" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff" width="100%"><tr class="sp" style="-webkit-box-sizing: border-box; box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="sp__inner" style="padding: 15px 0;"></td></tr><tr class="rbcc" style="-webkit-box-sizing: border-box; border: 0; box-sizing: border-box; cellpadding: 0; cellspacing: 0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer footer--simple" style="border-top: 8px solid #eaeaea; color: #888; padding: 20px 30px 0px 30px; padding-bottom: 20px;" bgcolor="#ffffff"><table class="rbcc footer__main" style="border: 0; cellpadding: 0; cellspacing: 0;" border="0" cellpadding="0" cellspacing="0" width="100%"><tr style="-webkit-box-sizing: border-box; box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"><td class="footer__main__signature" align="left" style="align: left; color: #888; font-size: 14px;">Yours truly,<br>The light mail team<br></td></tr></table></td></tr></table></body></html>

View File

@ -1,5 +0,0 @@
const fs = require('fs');
module.exports = {
readFileSync: path => fs.readFileSync(('./', path), 'utf8')
};

3650
yarn.lock Normal file

File diff suppressed because it is too large Load Diff