Collective #411

Original Source: http://feedproxy.google.com/~r/tympanus/~3/Y0gejRI-Sic/

C411_HelloSign

This content is sponsored via Syndicate Ads
HelloSign API: Everything IT requires and Developers love

HelloSign API’s robust SDK, amazing support, detailed documentation, and super clean dashboard is sure to make your entire team happy. Try it free today!

Check it out

C411_webpack

Webpack 4 configurator

Create a personalized and optimized webpack.config.js with this useful configurator.

Check it out

C411_grid

cssgr.id

An interactive CSS grid boilerplate code generator made by Dan Netherton. Read more about it in this article.

Check it out

C411_critter

Login Critter

An animated avatar that responds to text field interactions.

Check it out

C411_MorphPlay

Morph Play Button To Video Player #GSAP #ExpoScaleEase

A fantastic morphing player button demo by Maciej Leszczyński.

Check it out

C411_unavatar

Unavatar

A micro service for getting a user avatar across multiple social services by providing a username, email or domain as input.

Check it out

C411_lifefaker

Lifefaker

A brilliant satirical campaign that highlights how social media can affect your mental health. Read more about it in this article.

Check it out

C411_var

CSS environment variables

Serg Hospodarets’ tweet on how CSS environment variables are getting standardized.

Check it out

C411_figma

Introducing: Figma to React

Karl Jiang shows how Figma’s web API can be used to convert designs into React code.

Read it

C411_figurine

Figurine

Message printing with stylish, random fonts. By Arsham Shirvani.

Check it out

C411_font

Free Font: Aloja

A beautiful handwritten font designed by Ieva Mezule.

Get it

C411_heartbeat

Heartbeat Function

Matt DesLauriers shares a function that results into a ‘beating heart’ type of effect.

Check it out

C411_halftone

Halftone video effect

Louis Hoebregts created this awesome demo with a halftone effect for video input.

Check it out

C411_sort

Ivy

A visualization of various sorting algorithms with “async” powered animations. By Aaron Bird.

Check it out

C411_control

The Illusion of Control in Web Design

Aaron Gustafson on the fragility of websites and how we can’t control everything.

Read it

C411_vscode

VS Code Extensions for Happier JavaScript Coding

A summary of great Visual Studio Code extensions for higher productivity. By Alek Shnayder.

Check it out

C411_loadasset

load-asset

A simple Promise-based asset loader with cross browser support.

Check it out

C411_circripples

Circular Ripples

A WebGL and Web Audio experiment with generative music using a Markov chain. Check out more experiments by Tim Pulver.

Check it out

C411_contents

More accessible markup with display: contents

Hidde de Vries writes about how we can achieve accessible markup and beautiful layout with display: contents.

Read it

C411_dom

A Reusable Way To Present Fresh DOM

Adam Argyle shares a reusable keyframe animation in CSS that transitions your node from whatever, to ‘in’.

Check it out

C411_inspector

Web Inspector Styles Sidebar Improvements

Read about the latest design refresh of the Web Inspector in Safari.

Read it

C411_particlesbutton

From Our Blog
Particle Effects for Buttons

A little library that can be used for bursting particles effects. The idea is to disintegrate an element into particles and make it disappear (or vice versa).

Check it out

Collective #411 was written by Pedro Botelho and published on Codrops.

Particle Effects for Buttons

Original Source: http://feedproxy.google.com/~r/tympanus/~3/FCCHhng3mvw/

Today we’d like to share a little effect library with you that can be used to create bursting particle effects. The idea is to desintegrate an element into particles and making it disappear (and vice versa). This effect looks really interesting on buttons, so we’ve created a little collection that showcases a bunch of different styles for the effect.

The inspiration for this idea came from Cuberto’s Hyperloop interface shot, Route Selection UI.

particleeffects_featured

The demo is kindly sponsored by Segment: One API, 200+ tools, no more integrations.
If you would like to sponsor one of our demos, find out more here.

The animations are powered by anime.js. Here’s an example of how you can use it:

<!– Normal HTML element to disintegrate –>
<button class=”button”>Button</button>

<script src=”anime.min.js”></script>
<script src=”dist/particles.min.js”></script>
<script>
// Initialize a new instance of Particles to disintegrate/integrate the button
var particles = new Particles(‘.button’);

// Disintegrate the button into particles
particles.disintegrate();

// particles.integrate(); // would do the opposite
</script>

The following options are available:

Name
Type
Default
Description

canvasPadding

Integer

150

Padding for the generated canvas that will be positioned right behind the target element. A canvasPadding = 0 will cause the canvas and the target element to have the same dimensions.

duration

Integer

1000

Duration (ms) to perform the animations of target element and particles.

easing

String or Function

easeInOutCubic

Easing function to perform the animation of target element. It will be passed directly to anime.js.

type

String

circle

Type of particle. Could be any of the following values: circle, rectangle, triangle

style

String

fill

Style of particle. Could be any of the following values: fill, stroke.

direction

String

left

Direction to start disintegrating the element. Could be any of the following values: left, right top, bottom. The opposite direction will be used to perform the integrate operation.

size

Float or Function

Random from 1 to 4

Size (px) for particles.

speed

Float or Function

Random from -2 to 2

Pixels per frame that a particle will be moved. It could be a function to set it randomly per particle (as default value).

color

String

Target’s background-color

Color used to fill the particles.

particlesAmount
Coefficient

Float

3

A coefficient to calculate the amount of particles to animate. A particlesAmountCoefficient = 0 will result in 0 particles, while bigger values will increase the amount of particles.

oscillation
Coefficient

Float

20

A coefficient to calculate the oscilation of particles while animating. A oscilationCoefficient = 0 will result in no oscilation (straight movements), while bigger values will increase the oscilation, resulting in
a kind of randomness.

begin

Function

undefined

Execute a function at the beginning of the animation.

complete

Function

undefined

Execute a function at the end of the animation.

We hope you enjoy this and find it useful!

References and Credits

anime.js

Particle Effects for Buttons was written by Luis Manuel and published on Codrops.

A Guide To The State Of Print Stylesheets In 2018

Original Source: https://www.smashingmagazine.com/2018/05/print-stylesheets-in-2018/

A Guide To The State Of Print Stylesheets In 2018

A Guide To The State Of Print Stylesheets In 2018

Rachel Andrew

2018-05-01T14:00:19+02:00
2018-05-01T15:51:08+00:00

Today, I’d like to return to a subject that has already been covered in Smashing Magazine in the past — the topic of the print stylesheet. In this case, I am talking about printing pages directly from the browser. It’s an experience that can lead to frustration with enormous images (and even advertising) being printed out. Just sometimes, however, it adds a little bit of delight when a nicely optimized page comes out of the printer using a minimum of ink and paper and ensuring that everything is easy to read.

This article will explore how we can best create that second experience. We will take a look at how we should include print styles in our web pages, and look at the specifications that really come into their own once printing. We’ll find out about the state of browser support, and how to best test our print styles. I’ll then give you some pointers as to what to do when a print stylesheet isn’t enough for your printing needs.

Key Places For Print Support

If you still have not implemented any print styles on your site, there are a few key places where a solid print experience will be helpful to your users. For example, many users will want to print a transaction confirmation page after making a purchase or booking even if you will send details via email.

Any information that your visitor might want to use when away from their computer is also a good candidate for a print stylesheet. The most common thing that I print are recipes. I could load them up on my iPad but it is often more convenient to simply print the recipe to pop onto the fridge door while I cook. Other such examples might be directions or travel information. When traveling abroad and not always having access to data these printouts can be invaluable.

Nope, we can’t do any magic tricks, but we have articles, books and webinars featuring techniques we all can use to improve our work. Smashing Members get a seasoned selection of magic front-end tricks — e.g. live designing sessions and perf audits, too. Just sayin’! 😉

Explore Smashing Wizardry →

Smashing Cat, just preparing to do some magic stuff.

Reference materials of any sort are also often printed. For many people, being able to make notes on paper copies is the way they best learn. Again, it means the information is accessible in an offline format. It is easy for us to wonder why people want to print web pages, however, our job is often to make content accessible — in the best format for our visitors. If that best format is printed to paper, then who are we to argue?

Why Would This Page Be Printed?

A good question to ask when deciding on the content to include or hide in the print stylesheet is, “Why is the user printing this page?” Well, maybe there’s a recipe they’d like to follow while cooking in the kitchen or take along with them when shopping to buy ingredients. Or they’d like to print out a confirmation page after purchasing a ticket as proof of booking. Or perhaps they’d like a receipt or invoice to be printed (or printed to PDF) in order to store it in the accounts either as paper or electronically.

Considering the use of the printed document can help you to produce a print version of your content that is most useful in the context in which the user is in when referring to that print-out.

Workflow

Once we have decided to include print styles in our CSS, we need to add them to our workflow to ensure that when we make changes to the layout we also include those changes in the print version.

Adding Print Styles To A Page

To enable a “print stylesheet” what we are doing is telling the browser what these CSS rules are for when the document is printed. One method of doing this is to link an additional stylesheet by using the <link> element.

<link media=”print” href=”print.css”>

This method does keep your print styles separate from everything else which you might consider to be tidier, however, that has downsides.

The linked stylesheet creates an additional request to the server. In addition, that nice, neat separation of print styles from other styles can have a downside. While you may take care to update the separate styles before going live, the stylesheet may find itself suffering due to being out of sight and therefore out of mind — ultimately becoming useless as features are added to the site but not reflected in the print styles.

The alternate method for including print styles is to use @media in the same way that you includes CSS for certain breakpoints in your responsive design. This method keeps all of the CSS together for a feature. Styles for narrow to wide breakpoints, and styles for print. Alongside Feature Queries with @supports, this encourages a way of development that ensures that all of the CSS for a design feature is kept and maintained together.

@media print {

}

Overwriting Screen CSS Or Creating Separate Rules

Much of the time you are likely to find that the CSS you use for the screen display works for print with a few small adjustments. Therefore you only need to write CSS for print, for changes to that basic CSS. You might overwrite a font size, or family, yet leave other elements in the CSS alone.

If you really want to have completely separate styles for print and start with a blank slate then you will need to wrap the rest of your site styles in a Media Query with the screen keyword.

@media screen {

}

On that note, if you are using Media Queries for your Responsive Design, then you may have written them for screen.

@media screen and (min-width: 500px) {

}

If you want these styles to be used when printing, then you should remove the screen keyword. In practice, however, I often find that if I work “mobile first” the single column mobile layout is a really good starting point for my print layout. By having the media queries that bring in the more complex layouts for screen only, I have far less overwriting of styles to do for print.

Add Your Print Styles To Your Pattern Libraries And Style Guides

To help ensure that your print styles are seen as an integral part of the site design, add them to your style guide or pattern library for the site if you have one. That way there is always a reminder that the print styles exist, and that any new pattern created will need to have an equivalent print version. In this way, you are giving the print styles visibility as a first-class citizen of your design system.

Basics Of CSS For Print

When it comes to creating the CSS for print, there are three things you are likely to find yourself doing. You will want to hide, and not display content which is irrelevant when printed. You may also want to add content to make a print version more useful. You might also want to adjust fonts or other elements of your page to optimize them for print. Let’s take a look at these techniques.

Hiding Content

In CSS the method to hide content and also prevent generation of boxes is to use the display property with a value of none.

.box {
display: none;
}

Using display: none will collapse the element and all of its child elements. Therefore, if you have an image gallery marked up as a list, all you would need to do to hide this when printed is to set display: none on the ul.

Things that you might want to hide are images which would be unnecessary when printed, navigation, advertising panels and areas of the page which display links to related content and so on. Referring back to why a user might print the page can help you to decide what to remove.

Inserting Content

There might be some content that makes sense to display when the page is printed. You could have some content set to display: none in a screen stylesheet and show it in your print stylesheet. Additionally, however, you can use CSS to expose content not normally output to the screen. A good example of this would be the URL of a link in the document. In your screen document, a link would normally show the link text which can then be clicked to visit that new page or external website. When printed links cannot be followed, however, it might be useful if the reader could see the URL in case they wished to visit the link at a later time.

We achieve this by using CSS Generated Content. Generated Content gives you a way to insert content into your document via CSS. When printing, this becomes very useful.

You can insert a simple text string into your document. The next example targets the element with a class of wrapper and inserts before it the string, “Please see www.mysite.com for the latest version of this information.”

.wrapper::after {
content: “Please see www.mysite.com for the latest version of this information.”;
}

You can insert things that already exist in the document however, an example would be the content of the link href. We add Generated Content after each instance of a with an attribute of href and the content we insert is the value of the href attribute – which will be the link.

a[href]:after {
content: ” (” attr(href) “)”;
}

You could use the newer CSS :not selector to exclude internal links if you wished.

a[href^=”http”]:not([href*=”example.com”]):after {
content: ” (” attr(href) “)”;
}

There are some other useful tips like this in the article, “I Totally Forgot About Print Stylesheets”, written by Manuel Matuzovic.

Advanced Print Styling

If your printed version fits neatly onto one page then you should be able to create a print stylesheet relatively simply by using the techniques of the last section. However, once you have something which prints onto multiple pages (and particularly if it contains elements such as tables or figures), you may find that items break onto new pages in a suboptimal manner. You may also want to control things about the page itself, e.g. changing the margin size.

CSS does have a way to do these things, however, as we will see, browser support is patchy.

Paged Media

The CSS Paged Media Specification opens with the following description of its role.

“This CSS module specifies how pages are generated and laid out to hold fragmented content in a paged presentation. It adds functionality for controlling page margins, page size and orientation, and headers and footers, and extends generated content to enable page numbering and running headers/footers.”

The screen is continuous media; if there is more content, we scroll to see it. There is no concept of it being broken up into individual pages. As soon as we are printing we output to a fixed size page, described in the specification as paged media. The Paged Media specification doesn’t deal with how content is fragmented between pages, we will get to that later. Instead, it looks at the features of the pages themselves.

We need a way to target an individual page, and we do this by using the @page rule. This is used much like a regular selector, in that we target @page and then write CSS to be used by the page. A simple example would be to change the margin on all of the pages created when you print your document.

@page {
margin: 20px;
}

You can target specific pages with :left and :right spread pseudo-class selectors. The first page can be targeted with the :first pseudo-class selector and blank pages caused by page breaks can be selected with :blank. For example, to set a top margin only on the first page:

@page :first {
margin-top: 250pt;
}

To set a larger margin on the right side of a left-hand page and the left side of a right-hand page:

@page :left {
margin-right: 200pt;
}

@page :right {
margin-left: 200pt;
}

The specification defines being able to insert content into the margins created, however, no browser appears to support this feature. I describe this in my article about creating stylesheets for use with print-specific user agents, Designing For Print With CSS.

Is your pattern library up to date today? Alla Kholmatova has just finished a fully fledged book on Design Systems and how to get them right. With common traps, gotchas and the lessons she learned. Hardcover, eBook. Just sayin’.

Table of Contents →

CSS Fragmentation

Where the Paged Media module deals with the page boxes themselves, the CSS Fragmentation Module details how content breaks between fragmentainers. A fragmentainer (or fragment container) is a container which contains a portion of a fragmented flow. This is a flow which, when it gets to a point where it would overflow, breaks into a new container.

The contexts in which you will encounter fragmentation currently are in paged media, therefore when printing, and also when using Multiple-column layout and your content breaks between column boxes. The Fragmentation specification defines various rules for breaking, CSS properties that give you some control over how content breaks into new fragments, in these contexts. It also defines how content breaks in the CSS Regions specification, although this isn’t something usable cross-browser right now.

And, speaking of browsers, fragmentation is a bit of a mess in terms of support at the moment. The browser compatibility tables for each property on MDN seem to be accurate as to support, however testing use of these properties carefully will be required.

Older Properties From CSS2

In addition to the break-* properties from CSS Fragmentation Level 3, we have page-break-* properties which came from CSS2. In spec terms, these have been superseded by the newer break-* properties, as these are more generic and can be used in the different contexts breaking happens. There isn’t much difference between a page and a multicol break. However, in terms of browser support, there is better browser support for the older properties. This means you may well need to use those at the current time to control breaking. Browsers that implement the newer properties are to alias the older ones rather than drop them.

In the examples that follow, I shall show both the new property and the old one where it exists.

break-before & break-after

These properties deal with breaks between boxes, and accept the following values, with the initial value being auto. The final four values do not apply to paged media, instead being for multicol and regions.

auto
avoid
avoid-page
page
left
right
recto
verso
avoid-column
column
avoid-region
region

The older properties of page-break-before and page-break-after accept a smaller range of values.

auto
always
avoid
left
right
inherit

To always cause a page break before an h2 element, you would use the following:

h2 {
break-before: page;
}

To avoid a paragraph being detached from the heading immediately preceding it:

h2, h3 {
break-after: avoid-page;
}

The older page-break-* property to always cause a page break before an h2:

h2 {
page-break-before: always;
}

To avoid a paragraph being detached from the heading immediately preceding it:

h2, h3{
page-break-after: avoid;
}

On MDN find information and usage examples for the properties:

break-before
break-after
page-break-before
page-break-after

break-inside

This property controls breaks inside boxes and accepts the values:

auto
avoid
avoid-page
avoid-column
avoid-region

As with the previous two properties, there is an aliased page-break-inside from CSS2, which accepts the values:

auto
avoid
inherit

For example, perhaps you have a figure or a table and you don’t want a half of it to end up on one page and the other half on another page.

figure {
break-inside: avoid;
}

And when using the older property:

figure {
page-break-inside: avoid;
}

On MDN:

break-inside
page-break-inside

Orphans And Widows

The Fragmentation specification also defines the properties orphans and widows. The orphans property defines how many lines can be left at the bottom of the first page when content such as a paragraph is broken between two pages. The widows property defines how many lines may be left at the top of the second page.

Therefore, in order to prevent ending up with a single line at the end of a page and a single line at the top the next page, you can use the following:

p {
orphans: 2;
widows: 2;
}

The widows and orphans properties are well supported (the missing browser implementation being Firefox).

On MDN:

widows
orphans

box-decoration-break

The final property defined in the Fragmentation module is box-decoration-break. This property deals with whether borders, margins, and padding break or wrap the content. The values it accepts are:

slice
clone

For example, if my content area has a 10-pixel grey border and I print the content, then the default way that this will print is that the border will continue onto each page, however, it will only wrap at the end of the content. So we get a break before going to the next page and continuing.

The border does not wrap each page and so breaks between pages

The border does not wrap each page and so breaks between pages

If I use box-decoration-break: clone, the border and any padding and margin will complete on each page, thus giving each page a grey border.

The border wraps each individual page

The border wraps each individual page

Currently, this only works for Paged Media in Firefox, and you can find out more about box-decoration-break on MDN.

Browser Support

As already mentioned, browser support is patchy for Paged Media and Fragmentation. Where Fragmentation is concerned, an additional issue is that breaking has to be specified and implemented for each layout method. If you were hoping to use Flexbox or CSS Grid in print stylesheets, you will probably be disappointed. You can check out the Chrome bugs for Flexbox and for Grid.

The best suggestion I can give right now is to keep your print stylesheets reasonably simple. Add fragmentation properties — including both the old page-break-* properties as well as the new properties. However, accept that these may well not work in all browsers. And, if you find lack of browser support frustrating, raise these issues with browsers or vote for already raised issues. Fragmentation, in particular, should be treated as a suggestion rather than a command, even where it is supported. It would be possible to be so specific about where and when you want things to break that it is almost impossible to lay out the pages. You should assume that sometimes you may get suboptimal breaking.

Testing Print Stylesheets

Testing print stylesheets can be something of a bore, typically requiring using print preview or printing to a PDF repeatedly. However, browser DevTools have made this a little easier for us. Both Chrome and Firefox have a way to view the print styles only.

Firefox

Open the Developer Toolbar then type media emulate print at the prompt.

Typing media emulate print

Emulating print styles in Firefox

Chrome

Open DevTools, click on the three dots icon and then select “More Tools” and “Rendering”. You can then select print under Emulate CSS Media.

Chrome DevTools emulate print media

Emulating print styles in Chrome

This will only be helpful in testing changes to the CSS layout, hidden or generated content. It can’t help you with fragmentation — you will need to print or print to PDF for that. However, it will save you a few round trips to the printer and can help you check as you develop new parts of the site that you are still hiding and showing the correct things.

What To Do When A Print Stylesheet Isn’t Enough

In an ideal world, browsers would have implemented more of the Paged Media specification when printing direct from the browser, and fragmentation would be more thoroughly implemented in a consistent way. It is certainly worth raising the bugs that you find when printing from the browser with the browsers concerned. If we don’t request these things are fixed, they will remain low priority to be fixed.

If you do need to have a high level of print support and want to use CSS, then currently you would need to use a print-specific User Agent, such as Prince. I detail how you can use CSS to format books when outputting to Prince in my article “Designing For Print With CSS.”

Prince is also available to install on your server in order to generate nicely printed documents using CSS on the web, however, it comes at a high price. An alternative is a server like DocRaptor who offer an API on top of the Prince rendering engine.

There are open-source HTML- and CSS-to-PDF generators such as wkhtmltopdf, but most use browser rendering engines to create the print output and therefore have the same limitations as browsers when it comes to implementing the Paged Media and Fragmentation specifications. An exception is WeasyPrint which seems to have its own implementation and supports slightly different features, although is not in any way as full-featured as something like Prince.

You will find more information about user agents for print on the print-css.rocks site.

Other Resources

Due to the fact that printing from CSS has really moved on very little in the past few years, many older resources on Smashing Magazine and elsewhere are still valid. Some additional tips and tricks can be found in the following resources. If you have discovered a useful print workflow or technical tip, then add it to the comments below.

“I Totally Forgot About Print Stylesheets,” Manuel Matuzovic, UX Collective
“Print Stylesheet Approaches: Blacklist vs Whitelist,” Chris Coyier, CSS-Tricks
“The Perfect Print Stylesheet,” Andreas Hecht, Noupe
“How To Set Up A Print Stylesheet,” Christian Krammer, Smashing Magazine
“5 Powerful Tips And Tricks For Print Style Sheets,” Dudley Storey, Smashing Magazine

Smashing Editorial
(il)

How to start a blog: 11 pro tips

Original Source: http://feedproxy.google.com/~r/CreativeBloq/~3/pdQQv7U8JIY/how-to-start-a-blog-1131726

So you've decided to start your own blog. Maybe you want to share your expert drawing tips or drum up a bit of interest in your design portfolio, but before you rush into anything, consider this: the web (and in particular the blogosphere) is a crowded place.

Why your business should be blogging

There are plenty of blogs out there, all clamouring for people's attention, so you'll need to stand out from the crowd if you want to stand a chance of being noticed, and you'll need to stick with it; there's nothing quite so off-putting as a blog that was last updated in 2015.

Your blog needs to be attractive, creative and clever, and it needs to speak to your readers. It needs to tell them why you're different, what you're offering, and why they should take the time to read on. Ready to get started? Here are 11 tips that will get you going and help you take your offering from interesting to inspirational… 

01. Choose a blogging platform

You’re spoiled for choice when it comes to platforms, and most are free

There are several blogging platforms out there, from Blogger and WordPress to Tumblr, Squarespace and Ghost. Or if you're feeling bold and know your code, you can create your blog from scratch. Which platform you choose will very much depend on what you're most comfortable using, how involved you want to be with the creation process, and what you plan to put on it.

The good news is that most of these are either free blog platforms or offer a trial session so you can give it a whirl and see if it suits you.

02. Get a good domain name

How to start a blog - domain

Most platforms make it easy to buy a custom URL for your blog

Most blogging platforms will set you up on a subdomain by default, but if you want to be taken seriously then you should really buy your own domain name. You'll want something short, memorable and above all easy to spell, and take care when it comes to the top level domain. There are all manner of fancy TLDs available these days such as .blog or .agency, but there's a lot to be said for the classics; if you can get the domain you want with a good old-fashioned .com then go for it.

03. Decide on the blog's content

How to start a blog - content

Sort out your content plan or you’ll be heading for yet another abandoned blog of shame

You want to learn how to start a blog, but do you know what you want a blog for in the first place? Blogging for the sake of blogging is pointless – you'll soon get bored and your carefully crafted site will soon be home to nothing but tumbleweed.

Sometimes it is a good idea to grab a notepad and pen before you even start. Jot down the types of blog posts you'd like to publish so you always have a reference point you can come back to if the ideas seem to have dried up.

Only then should you move on – you know how to start a blog, now it's time to design and populate it…

04. Keep your blog design simple

Free WordPress themes such as InterStellar offer simple design

When creating a design blog, it can be tempting to go crazy. After all, you want your blog to stand out and for people to remember you. How harmful can a rainbow of colours and a plethora of fonts be? The answer is: Very.

Keep your blog design simple. Stick to no more than three colours, and three fonts. With fonts; you need a heading, subheading and body copy font. Your main text font can then be enhanced by different weights or attributes, but keep these to a minimum.

05. Use contrasting colours

The design of The Fox is Black is based on a simple black and fluoro yellow colour scheme

Don't go crazy, and keep to a simple colour scheme. Contrasting colours can work well in the right design. It's a good rule of thumb that your blog features a main primary colour, a shade of grey, and a colour for your call-to-action.

06. Embrace white space

How to start a blog - white space

The Entyce site isn’t afraid to make use of white space

When finding inspiration before you create a design blog, don't be afraid of white space – it can really enhance your design and keep it looking professional.

Don't be afraid to leave some parts of the design empty where it warrants it. You should also use white space as borders to help highlight key parts of the blog. Remember, sometimes less really is more.

07. Keep your design goal-driven

How to start a blog - goal driven

Web design resource Treehouse uses its blog to promote its courses

If the purpose of your blog is to get conversions – whether that's sales, signups, or enquires – then everything else comes second. This means you should create a design blog that is designed with three things in mind:

Topic: What is your blog about?Value proposition: What makes it unique?Audience: Who is your main target audience?

To get conversions, your design blog needs a strong call-to-action in its design, be that headlines, prominent buttons, or even arrows. A goal-driven design will help your blog convert, and keep visitors coming back time and time again.

08. Follow conventions

Superdream makes its posts easy to navigate

It can be easy to forget about the important features of a blog when getting creative with the design. Whatever your blog ends up looking like, make sure you keep the main conventions of a blog in place. 

These include:

SidebarsHeadersSubscription optionsAuthor attributionSearch bars

These all make your design blog easy to navigate, which is a highly important feature. Keeping these elements in place will make your content easy to find, and keep your visitors on the blog for longer. Together, all this adds up to a goal-driven design.

09. Experiment

For Print Only uses bold graphics and grids

Although for the most part it's important to follow conventions, that doesn't mean you shouldn't break the rules from time to time!

Try a few new elements, and experiment with colours, fonts, and placement. By mixing things up, you create a visually exciting experience for your audience. Just make sure that your readers can always find your posts, and exactly what they're looking for.

10. Make it responsive

How to start a blog - Responsive

Test your design with a tool like Google’s Resizer

Nowadays, responsive web design is a prerequisite for any respectable design blog. Work closely with a designer and developer to help produce a design that is both eye-catching and functional.

11. Promote it!

How to start a blog - Social

WIth a tool such as Hootsuite you can easily do most of your social shizzle in one go

There is no point in knowing how to start a blog without learning how to promote it too… This is where social media comes into its own. Create Facebook and Twitter pages for your blog, or use existing accounts to shout about it. If you are involving a lot of images in your blog, why not set up Pinterest and Instagram accounts, too?

Most modern blogging platforms such as Squarespace provide integration for everything from Twitter and Instagram to Tumblr and Dribbble, so you can spread the message quickly and effectively.

Related articles:

The 14 best free blogging platforms12 must-have code testing toolsThe 34 best free WordPress themes

Fresh Resource for Web Developers – April 2018

Original Source: https://www.hongkiat.com/blog/designers-developers-monthly-04-2018/

A monthly dose of new and highly useful resources for web designers and developers.

The post Fresh Resource for Web Developers – April 2018 appeared first on Hongkiat.

Visit hongkiat.com for full content.

Building A Serverless Contact Form For Your Static Site

Original Source: https://www.smashingmagazine.com/2018/05/building-serverless-contact-form-static-website/

Building A Serverless Contact Form For Your Static Site

Building A Serverless Contact Form For Your Static Site

Brian Holt

2018-05-02T18:30:17+02:00
2018-05-02T17:49:19+00:00

Static site generators provide a fast and simple alternative to Content Management Systems (CMS) like WordPress. There’s no server or database setup, just a build process and simple HTML, CSS, and JavaScript. Unfortunately, without a server, it’s easy to hit their limits quickly. For instance, in adding a contact form.

With the rise of serverless architecture adding a contact form to your static site doesn’t need to be the reason to switch to a CMS anymore. It’s possible to get the best of both worlds: a static site with a serverless back-end for the contact form (that you don’t need to maintain). Maybe best of all, in low-traffic sites, like portfolios, the high limits of many serverless providers make these services completely free!

In this article, you’ll learn the basics of Amazon Web Services (AWS) Lambda and Simple Email Service (SES) APIs to build your own static site mailer on the Serverless Framework. The full service will take form data submitted from an AJAX request, hit the Lambda endpoint, parse the data to build the SES parameters, send the email address, and return a response for our users. I’ll guide you through getting Serverless set up for the first time through deployment. It should take under an hour to complete, so let’s get started!

The static site form, sending the message to the Lambda endpoint and returning a response to the user.The static site form, sending the message to the Lambda endpoint and returning a response to the user.

Nope, we can’t do any magic tricks, but we have articles, books and webinars featuring techniques we all can use to improve our work. Smashing Members get a seasoned selection of magic front-end tricks — e.g. live designing sessions and perf audits, too. Just sayin’! 😉

Explore Smashing Wizardry →

Smashing Cat, just preparing to do some magic stuff.

Setting Up

There are minimal prerequisites in getting started with Serverless technology. For our purposes, it’s simply a Node Environment with Yarn, the Serverless Framework, and an AWS account.

Setting Up The Project

The Serverless Framework web site. Useful for installation and documentation.

The Serverless Framework web site. Useful for installation and documentation.

We use Yarn to install the Serverless Framework to a local directory.

Create a new directory to host the project.
Navigate to the directory in your command line interface.
Run yarn init to create a package.json file for this project.
Run yarn add serverless to install the framework locally.
Run yarn serverless create –template aws-nodejs –name static-site-mailer to create a Node service template and name it static-site-mailer.

Our project is setup but we won’t be able to do anything until we set up our AWS services.

Setting Up An Amazon Web Services Account, Credentials, And Simple Email Service

The Amazon Web Services sign up page, which includes a generous free tier, enabling our project to be entirely free.

The Amazon Web Services sign up page, which includes a generous free tier, enabling our project to be entirely free.

The Serverless Framework has recorded a video walk-through for setting up AWS credentials, but I’ve listed the steps here as well.

Sign Up for an AWS account or log in if you already have one.
In the AWS search bar, search for “IAM”.
On the IAM page, click on “Users” on the sidebar, then the “Add user” button.
On the Add user page, give the user a name – something like “serverless” is appropriate. Check “Programmatic access” under Access type then click next.
On the permissions screen, click on the “Attach existing policies directly” tab, search for “AdministratorAccess” in the list, check it, and click next.
On the review screen you should see your user name, with “Programmatic access”, and “AdministratorAccess”, then create the user.
The confirmation screen shows the user “Access key ID” and “Secret access key”, you’ll need these to provide the Serverless Framework with access. In your CLI, type yarn sls config credentials –provider aws –key YOUR_ACCESS_KEY_ID –secret YOUR_SECRET_ACCESS_KEY, replacing YOUR_ACCESS_KEY_ID and YOUR_SECRET_ACCESS_KEY with the keys on the confirmation screen.

Your credentials are configured now, but while we’re in the AWS console let’s set up Simple Email Service.

Click Console Home in the top left corner to go home.
On the home page, in the AWS search bar, search for “Simple Email Service”.
On the SES Home page, click on “Email Addresses” in the sidebar.
On the Email Addresses listing page, click the “Verify a New Email Address” button.
In the dialog window, type your email address then click “Verify This Email Address”.
You’ll receive an email in moments containing a link to verify the address. Click on the link to complete the process.

Now that our accounts are made, let’s take a peek at the Serverless template files.

Setting Up The Serverless Framework

Running serverless create creates two files: handler.js which contains the Lambda function, and serverless.yml which is the configuration file for the entire Serverless Architecture. Within the configuration file, you can specify as many handlers as you’d like, and each one will map to a new function that can interact with other functions. In this project, we’ll only create a single handler, but in a full Serverless Architecture, you’d have several of the various functions of the service.

The default file structure generated from the Serverless Framework containing handler.js and serverless.yml.

The default file structure generated from the Serverless Framework containing handler.js and serverless.yml.

In handler.js, you’ll see a single exported function named hello. This is currently the main (and only) function. It, along with all Node handlers, take three parameters:

event
This can be thought of as the input data for the function.
context object
This contains the runtime information of the Lambda function.
callback
An optional parameter to return information to the caller.

// handler.js

‘use strict’;

module.exports.hello = (event, context, callback) => {
const response = {
statusCode: 200,
body: JSON.stringify({
message: ‘Go Serverless v1.0! Your function executed successfully!’,
input: event,
}),
};

callback(null, response);
};

At the bottom of hello, there’s a callback. It’s an optional argument to return a response, but if it’s not explicitly called, it will implicitly return with null. The callback takes two parameters:

Error error
For providing error information for when the Lambda itself fails. When the Lambda succeeds, null should be passed into this parameter.
Object result
For providing a response object. It must be JSON.stringify compatible. If there’s a parameter in the error field, this field is ignored.

Our static site will send our form data in the event body and the callback will return a response for our user to see.

In serverless.yml you’ll see the name of the service, provider information, and the functions.

# serverless.yml

service: static-site-mailer

provider:
name: aws
runtime: nodejs6.10

functions:
hello:
handler: handler.hello

How the function names in serverless.yml map to handler.js.

How the function names in serverless.yml map to handler.js.

Notice the mapping between the hello function and the handler? We can name our file and function anything and as long as it maps to the configuration it will work. Let’s rename our function to staticSiteMailer.

# serverless.yml

functions:
staticSiteMailer:
handler: handler.staticSiteMailer

// handler.js

module.exports.staticSiteMailer = (event, context, callback) => {

};

Lambda functions need permission to interact with other AWS infrastructure. Before we can send an email, we need to allow SES to do so. In serverless.yml, under provider.iamRoleStatements add the permission.

# serverless.yml

provider:
name: aws
runtime: nodejs6.10
iamRoleStatements:
– Effect: “Allow”
Action:
– “ses:SendEmail”
Resource: [“*”]

Since we need a URL for our form action, we need to add HTTP events to our function. In serverless.yml we create a path, specify the method as post, and set CORS to true for security.

functions:
staticSiteMailer:
handler: handler.staticSiteMailer
events:
– http:
method: post
path: static-site-mailer
cors: true

Our updated serverless.yml and handler.js files should look like:

# serverless.yml

service: static-site-mailer

provider:
name: aws
runtime: nodejs6.10

functions:
staticSiteMailer:
handler: handler.staticSiteMailer
events:
– http:
method: post
path: static-site-mailer
cors: true

provider:
name: aws
runtime: nodejs6.10
iamRoleStatements:
– Effect: “Allow”
Action:
– “ses:SendEmail”
Resource: [“*”]

// handler.js

‘use strict’;

module.exports.staticSiteMailer = (event, context, callback) => {
const response = {
statusCode: 200,
body: JSON.stringify({
message: ‘Go Serverless v1.0! Your function executed successfully!’,
input: event,
}),
};

callback(null, response);
};

Our Serverless Architecture is setup, so let’s deploy it and test it. You’ll get a simple JSON response.

yarn sls deploy –verbose
yarn sls invoke –function staticSiteMailer

{
“statusCode”: 200,
“body”: “{“message”:”Go Serverless v1.0! Your function executed successfully!”,”input”:{}}”
}

The return response from invoking our brand new serverless function.

The return response from invoking our brand new serverless function.

Creating The HTML Form

Our Lambda function input and form output need to match, so before we build the function we’ll build the form and capture its output. We keep it simple with name, email, and message fields. We’ll add the form action once we’ve deployed our serverless architecture and got our URL, but we know it will be a POST request so we can add that in. At the end of the form, we add a paragraph tag for displaying response messages to the user which we’ll update on the submission callback.

<form action=”{{ SERVICE URL }}” method=”POST”>
<label>
Name
<input type=”text” name=”name” required>
</label>
<label>
Email
<input type=”email” name=”reply_to” required>
</label>
<label>
Message:
<textarea name=”message” required></textarea>
</label>
<button type=”submit”>Send Message</button>
</form>
<p id=”js-form-response”></p>

To capture the output we add a submit handler to the form, turn our form parameters into an object, and send stringified JSON to our Lambda function. In the Lambda function we use JSON.parse() to read our data. Alternatively, you could use jQuery’s Serialize or query-string to send and parse the form parameters as a query string but JSON.stringify() and JSON.parse() are native.

(() => {
const form = document.querySelector(‘form’);
const formResponse = document.querySelector(‘js-form-response’);

form.onsubmit = e => {
e.preventDefault();

// Prepare data to send
const data = {};
const formElements = Array.from(form);
formElements.map(input => (data[input.name] = input.value));

// Log what our lambda function will receive
console.log(JSON.stringify(data));
};
})();

Go ahead and submit your form then capture the console output. We’ll use it in our Lambda function next.

Capturing the form data in a console log.

Capturing the form data in a console log.

Invoking Lambda Functions

Especially during development, we need to test our function does what we expect. The Serverless Framework provides the invoke and invoke local command to trigger your function from live and development environments respectively. Both commands require the function name passed through, in our case staticSiteMailer.

yarn sls invoke local –function staticSiteMailer

To pass mock data into our function, create a new file named data.json with the captured console output under a body key within a JSON object. It should look something like:

// data.json

{
“body”: “{“name”: “Sender Name”,”reply_to”: “sender@email.com”,”message”: “Sender message”}”
}

To invoke the function with the local data, pass the –path argument along with the path to the file.

yarn sls invoke local –function staticSiteMailer –path data.json

An updated return response from our serverless function when we pass it JSON data.

An updated return response from our serverless function when we pass it JSON data.

You’ll see a similar response to before, but the input key will contain the event we mocked. Let’s use our mock data to send an email using Simple Email Service!

Sending An Email With Simple Email Service

We’re going to replace the staticSiteMailer function with a call to a private sendEmail function. For now you can comment out or remove the template code and replace it with:

// hander.js

function sendEmail(formData, callback) {
// Build the SES parameters
// Send the email
}

module.exports.staticSiteMailer = (event, context, callback) => {
const formData = JSON.parse(event.body);

sendEmail(formData, function(err, data) {
if (err) {
console.log(err, err.stack);
} else {
console.log(data);
}
});
};

First, we parse the event.body to capture the form data, then we pass it to a private sendEmail function. sendEmail is responsible for sending the email, and the callback function will return a failure or success response with err or data. In our case, we can simply log the error or data since we’ll be replacing this with the Lambda callback in a moment.

Amazon provides a convenient SDK, aws-sdk, for connecting their services with Lambda functions. Many of their services, including SES, are part of it. We add it to the project with yarn add aws-sdk and import it into the top the handler file.

// handler.js

const AWS = require(‘aws-sdk’);
const SES = new AWS.SES();

In our private sendEmail function, we build the SES.sendEmail parameters from the parsed form data and use the callback to return a response to the caller. The parameters require the following as an object:

Source
The email address SES is sending from.
ReplyToAddresses
An array of email addresses added to the reply to the field in the email.
Destination
An object that must contain at least one ToAddresses, CcAddresses, or BccAddresses. Each field takes an array of email addresses that correspond to the to, cc, and bcc fields respectively.
Message
An object which contains the Body and Subject.

Is your pattern library up to date today? Alla Kholmatova has just finished a fully fledged book on Design Systems and how to get them right. With common traps, gotchas and the lessons she learned. Hardcover, eBook. Just sayin’.

Table of Contents →

Since formData is an object we can call our form fields directly like formData.message, build our parameters, and send it. We pass your SES-verified email to Source and Destination.ToAddresses. As long as the email is verified you can pass anything here, including different email addresses. We pluck our reply_to, message, and name off our formData object to fill in the ReplyToAddresses and Message.Body.Text.Data fields.

// handler.js
function sendEmail(formData, callback) {
const emailParams = {
Source: ‘your_email@example.com’, // SES SENDING EMAIL
ReplyToAddresses: [formData.reply_to],
Destination: {
ToAddresses: [‘your_email@example.com’], // SES RECEIVING EMAIL
},
Message: {
Body: {
Text: {
Charset: ‘UTF-8’,
Data: `${formData.message}nnName: ${formData.name}nEmail: ${formData.reply_to}`,
},
},
Subject: {
Charset: ‘UTF-8’,
Data: ‘New message from your_site.com’,
},
},
};

SES.sendEmail(emailParams, callback);
}

SES.sendEmail will send the email and our callback will return a response. Invoking the local function will send an email to your verified address.

yarn sls invoke local –function testMailer –path data.json

The return response from SES.sendEmail when it succeeds.

The return response from SES.sendEmail when it succeeds.

Returning A Response From The Handler

Our function sends an email using the command line, but that’s not how our users will interact with it. We need to return a response to our AJAX form submission. If it fails, we should return an appropriate statusCode as well as the err.message. When it succeeds, the 200 statusCode is sufficient, but we’ll return the mailer response in the body as well. In staticSiteMailer we build our response data and replace our sendEmail callback function with the Lambda callback.

// handler.js

module.exports.staticSiteMailer = (event, context, callback) => {
const formData = JSON.parse(event.body);

sendEmail(formData, function(err, data) {
const response = {
statusCode: err ? 500 : 200,
headers: {
‘Content-Type’: ‘application/json’,
‘Access-Control-Allow-Origin’: ‘https://your-domain.com’,
},
body: JSON.stringify({
message: err ? err.message : data,
}),
};

callback(null, response);
});
};

Our Lambda callback now returns both success and failure messages from SES.sendEmail. We build the response with checks if err is present so our response is consistent. The Lambda callback function itself passes null in the error argument field and the response as the second. We want to pass errors onwards, but if the Lambda itself fails, its callback will be implicitly called with the error response.

In the headers, you’ll need to replace Access-Control-Allow-Origin with your own domain. This will prevent any other domains from using your service and potentially racking up an AWS bill in your name! And I don’t cover it in this article, but it’s possible to set-up Lambda to use your own domain. You’ll need to have an SSL/TLS certificate uploaded to Amazon. The Serverless Framework team wrote a fantastic tutorial on how to do so.

Invoking the local function will now send an email and return the appropriate response.

yarn sls invoke local –function testMailer –path data.json

The return response from our serverless function, containing the SES.sendEmail return response in the body.

The return response from our serverless function, containing the SES.sendEmail return response in the body.

Calling The Lambda Function From The Form

Our service is complete! To deploy it run yarn sls deploy -v. Once it’s deployed you’ll get a URL that looks something like https://r4nd0mh45h.execute-api.us-east-1.amazonaws.com/dev/static-site-mailer which you can add to the form action. Next, we create the AJAX request and return the response to the user.

(() => {
const form = document.querySelector(‘form’);
const formResponse = document.querySelector(‘js-form-response’);

form.onsubmit = e => {
e.preventDefault();

// Prepare data to send
const data = {};
const formElements = Array.from(form);
formElements.map(input => (data[input.name] = input.value));

// Log what our lambda function will receive
console.log(JSON.stringify(data));

// Construct an HTTP request
var xhr = new XMLHttpRequest();
xhr.open(form.method, form.action, true);
xhr.setRequestHeader(‘Accept’, ‘application/json; charset=utf-8’);
xhr.setRequestHeader(‘Content-Type’, ‘application/json; charset=UTF-8’);

// Send the collected data as JSON
xhr.send(JSON.stringify(data));

// Callback function
xhr.onloadend = response => {
if (response.target.status === 200) {
// The form submission was successful
form.reset();
formResponse.innerHTML = ‘Thanks for the message. I’ll be in touch shortly.’;
} else {
// The form submission failed
formResponse.innerHTML = ‘Something went wrong’;
console.error(JSON.parse(response.target.response).message);
}
};
};
})();

In the AJAX callback, we check the status code with response.target.status. If it’s anything other than 200 we can show an error message to the user, otherwise let them know the message was sent. Since our Lambda returns stringified JSON we can parse the body message with JSON.parse(response.target.response).message. It’s especially useful to log the error.

You should be able to submit your form entirely from your static site!

The static site form, sending the message to the Lambda endpoint and returning a response to the user.The static site form, sending the message to the Lambda endpoint and returning a response to the user.

Next Steps

Adding a contact form to your static is easy with the Serverless Framework and AWS. There’s room for improvement in our code, like adding form validation with a honeypot, preventing AJAX calls for invalid forms and improving the UX if the response, but this is enough to get started. You can see some of these improvements within the static site mailer repo I’ve created. I hope I’ve inspired you to try out Serverless yourself!

Smashing Editorial
(lf, ra, il)

Awaken Akira pays tribute to an animated classic

Original Source: http://feedproxy.google.com/~r/CreativeBloq/~3/LTNE124JLkA/awaken-akira-pays-tribute-to-an-animated-classic

It's almost 30 years since Katsuhiro Otomo's Akira was released in Japan on 16 July 1988. Otomo's epic animated tale of teenage biker gangs and rampant genetic mutations in post-apocalyptic Neo-Tokyo took another three years to make it to the West, but once it arrived it quickly became a cult hit and is largely responsible for bringing the word 'manga' to Western vocabularies.

How to colour your manga art like a pro

Akira's notable for its insanely smooth and detailed hand-drawn animation, giving it an almost CG look years before actual CG animation became the norm. And while talk of a live action remake of Akira keeps cropping up, so far it's yet to materialise.

So for now we'll just have to make do with Awaken Akira, an amazing CG tribute created by a couple of dedicated Akira fans, Ash Thorp and Zaoeyo (XiaoLin Zeng).

Awaken Akira only lasts a minute – and that's including the credits – but it's a glorious taster of a dream Akira remake that we'd love to see in full. It took Thorp and Zaoeyo a year to make, fitting in work on it between other commitments, and demonstrates a similar attention to detail to that which you'll see in the original animated film.

Tetsuo!

Awaken Akira comes across like a teaser trailer or taster reel; rather than replicate action from the film, it instead recreates a selection of key shots from the film in CG, focusing on locations and items rather than the characters. It does an incredible job of conjuring up the flavour and atmosphere of Otomo's iconic original, and the enterprise is lent further impact with a score by Pilotpriest that echoes the original soundtrack superbly.

If you're keen to see how Thorp and Zaoeyo did it, they've thoughtfully collected a number of their processes into a YouTube playlist, showcasing and explaining their techniques over the course of 26 in-depth videos.

Kaneda!

The sheer amount of work that's gone into creating this minute of video gives you a whole new appreciation of the effort that Katsuhiro Otomo and his team must have put into animating the original film. 

It's a beautiful love letter to an animated classic, and even if it's all over just a little too quickly, it's just the incentive to dig out your DVD or Blu-Ray and watch the original again. Enjoy!

How to draw manga charactersThe 27 greatest animated music videos6 manga artists to watch out for

The Keys to Advertising Your Web Design Business

Original Source: http://feedproxy.google.com/~r/1stwebdesigner/~3/kBaw0miLtno/

If you’ve just started a new business, congratulations! Once you have your site up and running, now comes the real challenge: advertising. You may not even know where to begin, so here’s a quick guide on how to spread the word and get your name out there.

Advertisement Banners

One of the easiest ways to advertise your business is with an online banner. These little rectangles don’t pull in many clicks, but they’re cheap. It can help immensely to advertise on relevant websites, and people may remember a good ad even if they don’t click right then.

You can use a service like Google Adwords, Facebook Ads or BlogAds. Just make sure to design a banner that’s memorable – not annoying or distracting. You are a designer, after all!

Advertisement Banners

Social Media

Want to know the best part of social media advertising? It’s free, assuming you don’t hire someone to do it for you! It’s also surprisingly effective. Generic social media accounts may fail, but if you put a bit of personality behind it, you‘ll find your business soaring. Interact first, promote your business second.

Take time to share curated content, partner with other businesses, share fun but relevant videos and images, give a behind-the-scenes look into web design life and use personal branding; people trust the individual more than the business.

Social Media

Directories

Get your business listed in a directory. Yelp, White Pages, Foursquare and any other relevant site you think will help. Many of these are free, so do your research. Don’t forget Google My Business, which adds a helpful little box on the right of search results that lists relevant information.

Email Marketing

Email marketing is highly effective – when done correctly. If done incorrectly, the only place you’ll be marketing to is the spam folder.

So grow your email list in legal ways, not by purchasing lists, but by offering an incentive for people to give you their info. Coupons, tips, eBooks, the list goes on. Personalize your emails so they get sent to the right people. Customers who’ve used your services before could get special rewards, while you can focus on converting those who haven’t. Autoresponders can automate the whole process.

Here’s a more in-depth guide if you’re confused. Email marketing services include Campaign Monitor, MailChimp and AWeber.

Email Marketing

Create a Portfolio

Of course your website itself should show off your skills, but you may wish to create a portfolio page or even a separate site. This can display the extent of your creativity, or use testimonials from past clients and examples of your work. Visitors will be hooked.

In Person

The last way to directly market your business is in-person – get your business cards ready and get out there! Attend seminars, conferences, events and try to secure a chance to participate if you can. Otherwise, it’s a learning experience.

Just remember business card etiquette. Don’t run around throwing cards at people; wait until you’re asked for it. Make sure to follow up with any businesses you exchange cards with. You might just end up with a partnership!

In Person

Say No

While not exactly a marketing tip, this is very important for designers to understand. Sometimes, you need to turn down a client. If you’re not comfortable, they’re overly demanding, or they aren’t paying their invoices, professionally turn them down and swallow the negative review. (Some review sites may allow you to respond with your side of the story, but be civil and calm.)

A new business, of course, often doesn’t have this luxury. You may need to deal with a few unpleasant clients. However, always be firm about getting paid – don’t work for free or get scammed out of money!

Getting the Word Out

Whether you have no advertising budget or are willing to spare any expense, you should have at least a few options. Social media, directories, portfolios and email marketing are often free – so start there if you don’t know what to do. Now that you know how to advertise your design business, which of these methods will you use?


Sketchbook 4.0 for Android review

Original Source: http://feedproxy.google.com/~r/CreativeBloq/~3/2qLAjvb44Fo/sketchbook-40-for-android-review

Any Android owners who feel a sense of competition with their iPad-wielding counterparts may be slightly irked that SketchBook 4.0 is only appearing on their platform months after it launched on iOS. But set any irritation aside, and you’ll discover a compelling update with features artists looking for Android apps will appreciate.

Chief among these is a revamped user interface that stays out of your way as you work. It vanishes if your brushstrokes veers near one of its tool panels, and many interface elements are reduced in scale. This makes some controls, like the drawers for adjusting Brush size and Opacity, a little fiddly to access, however. Tap near the centre-bottom of the screen, meanwhile, and a menu with shortcuts appears.

Complicated pricing

When you first install SketchBook, it’s the Free edition, with limited functionality but no time limit on how long you can use it. To unlock the full toolset, you have two options: you can either spend £4.09 on the Pro Tools in-app purchase, which gives you the tools only within the Android app; or get an annual SketchBook subscription (£4.09 a month or £24.99 a year). The subscription must be renewed each year, unlike the in-app purchase, but you get access to the full tools on the versions of SketchBook for Windows, Mac and iOS as well as Android. 

Shibuya Race was created by artist Ryohei Yamashita using SketchBook

Bear in mind that the desktop computer editions don’t offer the one-off purchase option, only the subscription, so if you plan to use SketchBook on either Windows or Mac as well as Android, you may as well forget the in-app purchase and commit to the subscription instead.

With all these complicated buying options, it’s worth mentioning first that the Android app smoothly recognises your subscription when you first log in on the app; and second that once you’ve logged in, the app keeps all the Pro Tools active even if your tablet isn’t connected to the internet.

New features

The main differences your upgrade awards are customisable canvas sizes; dozens more brushes, including a Inking brush with a pleasing line quality; a limit to the number of layers dictated by your device’s memory rather than the Free version’s miserly three layers; the ability to make selections and masks; and unlimited Undos. You also get access to more drawing tools, including rulers and fills.

SketchBook’s user interface is much improved

We also like the Predictive Stroke mode, which tidies up your line after you draw it. It’s a real boon for digital inkers, and you can adjust the extent to which your lines will be altered.

This release brings SketchBook for Android up to speed with other versions and maintains the software’s reputation as a quality, unobtrusive drawing tool. Perhaps more importantly for patient Android owners, the under-the-bonnet changes should see more contemporaneous updates across all SketchBook versions in the future. 

This article was originally published in ImagineFX issue 158, the world's best-selling magazine for digital artists. Subscribe now.

Read more: 95 tutorials on how to draw

Collective #412

Original Source: http://feedproxy.google.com/~r/tympanus/~3/izmYPZ0PNj4/

C412_WOTW

Inspirational Website of the Week: Fazeta Producciones

Some interesting interaction details and a unique design. Our pick this week.

Get inspired

C412_francine

Pure CSS Francine

A piece of HTML/CSS art made by Diana Smith.

Check it out

C412_curtain

Curtains.js

Curtains.js is a light-weight WebGL JavaScript library that turns HTML elements into interactive textured planes.

Check it out

C412_Divi

Our Sponsor
Divi: A Web Designer’s Dream

Divi is the ultimate tool for web designers. Hundreds of thousands of WordPress freelancers and agencies are empowered by Divi to help run their growing businesses.

Try it now

C412_knockout

Responsive Knockout Text With Looping Video

A tutorial by Giulio Mainardi where he shows how to pull off a video text effect.

Read it

C412_githubcont

GitHub Contributions Chart Generator

Visualize your GitHub contributions with differently themed images.

Check it out

C412_bigint

BigInt: arbitrary-precision integers in JavaScript

Read all about the new numeric primitive in JavaScript that can represent integers with arbitrary precision. By Mathias Bynens.

Read it

C412_displaycontents

Display: Contents Is Not a CSS Reset

Adrian Roselli explains why using display: contents as a quick and dirty CSS reset is a terrible idea.

Read it

C412_subgrids

Grid Level 2 and Subgrid

An article by Rachel Andrew where she explains subgrids and why they’d make a good addition to the Grid specification.

Read it

C412_cards

Cards Webflow UI Kit

A clonable Webflow Style UI Kit fully developed in Webflow Designer and also available as Sketch file. By Jan Losert.

Check it out

C412_print

A Guide To The State Of Print Stylesheets In 2018

Rachel Andrew’s guide to modern print stylesheets.

Read it

C412_dropdown

Solved With CSS! Dropdown Menus

Una Kravets shows how to create CSS powered dropdown menus.

Read it

C412_lobe

Lobe

Build, train, and ship custom deep learning models using a simple visual interface. Available for beta invitations.

Check it out

C412_wireframe

Priority Guides: A Content-First Alternative to Wireframes

Heleen van Nues and Lennart Overkamp write about the drawbacks of wireframes and suggest the “priority guide” as alternative.

Read it

C412_minmax

CSS Grid: More flexibility with minmax()

Michelle Barker explores the minmax() function and shows why it’s so powerful.

Read it

C412_color

The Surprising Science Behind Color Codes

Patrick Woodhead shares some interesting facts on color codes.

Read it

C412_relaxed

ReLaXed

ReLaXed is a tool which creates PDF documents interactively using HTML or Pug.

Check it out

C412_grid

Smart CSS Grid

Smart CSS Grid is a minimal CSS Grid based responsive layout system with 12 columns.

Check it out

C412_selection

Selection

A simple and light-weight library for visual DOM selection.

Check it out

C412_flocking

Starling Simulation

A flocking simulation of starling murmuration using WebGL.

Check it out

C412_v8bigint

Adding BigInts to V8

The interesting story behind implementing support for BigInts in V8.

Read it

C412_sslgithubpages

Custom domains on GitHub Pages gain support for HTTPS

Read about how GitHub Pages are gaining support for HTTPS.

Read it

Collective #412 was written by Pedro Botelho and published on Codrops.