Designing A Textbox, Unabridged

Designing A Textbox, Unabridged

Designing A Textbox, Unabridged

Shane Hudson

Ever spent an hour (or even a day) working on something just to throw the whole lot away and redo it in five minutes? That isn’t just a beginner’s code mistake; it is a real-world situation that you can easily find yourself in especially if the problem you’re trying to solve isn’t well understood to begin with.

This is why I’m such a big proponent of upfront design, user research, and creating often multiple prototypes — also known as the old adage of “You don’t know what you don’t know.” At the same time, it is very easy to look at something someone else has made, which may have taken them quite a lot of time, and think it is extremely easy because you have the benefit of hindsight by seeing a finished product.

This idea that simple is easy was summed up nicely by Jen Simmons while speaking about CSS Grid and Piet Mondrian’s paintings:

“I feel like these paintings, you know, if you look at them with the sense of like ‘Why’s that important? I could have done that.’ It's like, well yeah, you could paint that today because we’re so used to this kind of thinking, but would you have painted this when everything around you was Victorian — when everything around you was this other style?”

I feel this sums up the feeling I have about seeing websites and design systems that make complete sense; it’s almost as if the fact they make sense means they were easy to make. Of course, it is usually the opposite; writing the code is the simple bit, but it’s the thinking and process that goes into it that takes the most effort.

With that in mind, I’m going to explore building a text box, in an exaggeration of situations many of us often find ourselves in. Hopefully, by the end of this article, we can all feel more emphatic to how the journey from start to finish is rarely linear.

A Comprehensive Guide To User Testing

So you think you’ve designed something that’s perfect, but your test tells you otherwise. Let’s explore the importance of user testing. Read more →

Brief

We all know that careful planning and understanding of the user need is important to a successful project of any size. We also all know that all too often we feel to need to rush to quickly design and develop new features. That can often mean our common sense and best practices are forgotten as we slog away to quickly get onto the next task on the everlasting to-do list. Rinse and repeat.

Today our task is to build a text box. Simple enough, it needs to allow a user to type in some text. In fact, it is so simple that we leave the task to last because there is so much other important stuff to do. Then, just before we pack up to go home, we smirk and write:

<input type="text">

There we go!

Oh wait, we probably need to hook that up to send data to the backend when the form is submitted, like so:

<input type="text" name="our_textbox">

That’s better. Done. Time to go home.

How Do You Add A New Line?

The issue with using a simple text box is it is pretty useless if you want to type a lot of text. For a name or title it works fine, but quite often a user will type more text than you expect. Trust me when I say if you leave a textbox for long enough without strict validation, someone will paste the entire of War and Peace. In many cases, this can be prevented by having a maximum amount of characters.

In this situation though, we have found out that our laziness (or bad prioritization) of leaving it to the last minute meant we didn’t consider the real requirements. We just wanted to do another task on that everlasting to-do list and get home. This text box needs to be reusable; examples of its usage include as a content entry box, a Twitter-style note box, and a user feedback box. In all of those cases, the user is likely to type a lot of text, and a basic text box would just scroll sideways. Sometimes that may be okay, but generally, that’s an awful experience.

Thankfully for us, that simple mistake doesn’t take long to fix:

<textarea name="our_textbox"></textarea>

Now, let’s take a moment to consider that line. A <textarea>: as simple as it can get without removing the name. Isn’t it interesting, or is it just my pedantic mind that we need to use a completely different element to add a new line? It isn’t a type of input, or an attribute used to add multi-line to an input. Also, the <textarea> element is not self-closing but an input is? Strange.

This “moment to consider” sent me time traveling back to October 1993, trawling through the depths of the www-talk mailing list. There was clearly much discussion about the future of the web and what “HTML+” should contain. This was 1993 and they were discussing ideas such as <input type="range"> which wasn’t available until HTML5, and Jim Davis said:

“Well, it's far-fetched I suppose, but you might use HTML forms as part of a game playing interface.”

This really does show that the web wasn’t just intended to be about documents as is widely believed. Marc Andreessen suggested to have <input type="textarea"> instead of allowing new lines in the single-line text type, [saying]: (http://1997.webhistory.org/www.lists/www-talk.1993q4/0200.html)

“Makes the browser code cleaner — they have to be handled differently internally.”

That’s a fair reason to have <textarea> separate to text, but that’s still not what we ended up with. So why is <textarea> its own element?

I didn’t find any decision in the mailing list archives, but by the following month, the HTML+ Discussion Document had the <textarea> element and a note saying:

“In the initial design for forms, multi-line text fields were supported by the INPUT element with TYPE=TEXT. Unfortunately, this causes problems for fields with long text values as SGML limits the length of attributea literals. The HTML+ DTD allows for up to 1024 characters (the SGML default is only 240 characters!)”

Ah, so that’s why the text goes within the element and cannot be self-closing; they were not able to use an attribute for long text. In 1994, the <textarea> element was included, along with many others from HTML+ such as <option> in the HTML 2 spec.

Okay, that’s enough. I could easily explore the archives further but back to the task.

Styling A <textarea>

So we’ve got a default <textarea>. If you rarely use them or haven’t seen the browser defaults in a long time, then you may be surprised. A <textarea> (made almost purely for multi-line text) looks very similar to a normal text input except most browser defaults style the border darker, the box slightly larger, and there are lines in the bottom right. Those lines are the resize handle; they aren’t actually part of the spec so browsers all handle (pun absolutely intended) it in their own way. That generally means that the resize handle cannot be restyled, though you can disable resizing by setting resize: none to the <textarea>. It is possible to create a custom handle or use browser specific pseudo elements such as ::-webkit-resizer.

The default <code>&lt;textarea&gt;</code> looks very small with a grey border and three lines as a resize handle.
A default textarea with no styling (Large preview)

It’s important to understand the defaults, especially because of the resizing ability. It’s a very unique behavior; the user is able to drag to change the size of the element by default. If you don’t override the minimum and maximum sizes then the size could be as small as 9px × 9px (when I checked Chrome) or as large as they have patience to drag it. That’s something that could cause mayhem with the rest of the site’s layout if it’s not considered. Imagine a grid where <textarea> is in one column and a blue box is in another; the size of the blue box is purely decided by the size of the <textarea>.

Other than that, we can approach styling a <textarea> much the same as any other input. Want to change the grey around the edge into thick green dashes? Sure here you go: border: 5px dashed green;. Want to restyle the focus in which a lot of browsers have a slightly blurred box shadow? Change the outline — responsibly though, you know, that’s important for accessibility. You can even add a background image to your <textarea> if that interests you (I can think of a few ideas that would have been popular when skeuomorphic design was more celebrated).

Scope Creep

We’ve all experienced scope creep in our work, whether it is a client that doesn’t think the final version matches their idea or you just try to squeeze in a tiny tweak and end up taking forever to finish it. So I ( enjoying creating the persona of an exaggerated project manager telling us what we need to build) have decided that our <textarea> just is not good enough. Yes, it is now multi-line, and that’s great, and yes it even ‘pops’ a bit more with its new styling. Yet, it just doesn’t fit the very vague user need that I’ve pretty much just thought of now after we thought we were almost done.

What happens if the user puts in thousands of words? Or drags the resize handle so far it breaks the layout? It needs to be reusable, as we have already mentioned, but in some of the situations (such as a ‘Twittereqsue’ note taking box), we will need a limit. So the next task is to add a character limit. The user needs to be able to see how many characters they have left.

In the same way we started with <input> instead of <textarea>, it is very easy to think that adding the maxlength attribute would solve our issue. That is one way to limit the amount of characters the user types, it uses the browser’s built-in validation, but it is not able to display how many characters are left.

We started with the HTML, then added the CSS, now it is time for some JavaScript. As we’ve seen, charging along like a bull in a china shop without stopping to consider the right approaches can really slow us down in the long run. Especially in situations where there is a large refactor required to change it. So let’s think about this counter; it needs to update as the user types, so we need to trigger an event when the user types. It then needs to check if the amount of text is already at the maximum length.

So which event handler should we choose?

  • change
    Intuitively, it may make sense to choose the change event. It works on <textarea> and does what it says on the tin. Except, it only triggers when the element loses focus so it wouldn’t update while typing.
  • keypress
    The keypress event is triggered when typing any character, which is a good start. But it does not trigger when characters are deleted, so the counter wouldn’t update after pressing backspace. It also doesn’t trigger after a copy/paste.
  • keyup
    This one gets quite close, it is triggered whenever a key has been pressed (including the backspace button). So it does trigger when deleting characters, but still not after a copy/paste.
  • input
    This is the one we want. This triggers whenever a character is added, deleted or pasted.

This is another good example of how using our intuition just isn’t enough sometimes. There are so many quirks (especially in JavaScript!) that are all important to consider before getting started. So the code to add a counter that updates needs to update a counter (which we’ve done with a span that has a class called counter) by adding an input event handler to the <textarea>. The maximum amount of characters is set in a variable called maxLength and added to the HTML, so if the value is changed it is changed in only one place.

var textEl = document.querySelector('textarea')
var counterEl = document.querySelector('.counter')
var maxLength = 200
    
textEl.setAttribute('maxlength', maxLength)
textEl.addEventListener('input', (val) => {
var count = textEl.value.length
counterEl.innerHTML = ${count}/${maxLength}
})

Browser Compatibility And Progressive Enhancement

Progressive enhancement is a mindset in which we understand that we have no control over what the user exactly sees on their screen, and instead, we try to guide the browser. Responsive Web Design is a good example, where we build a website that adjusts to suit the content on the particular size viewport without manually setting what each size would look like. It means that on the one hand, we strongly care that a website works across all browsers and devices, but on the other hand, we don’t care that they look exactly the same.

Currently, we are missing a trick. We haven’t set a sensible default for the counter. The default is currently “0/200” if 200 were the maximum length; this kind of makes sense but has two downsides. The first, it doesn’t really make sense at first glance. You need to start typing before it is obvious the 0 updates as you type. The other downside is that the 0 updates as you type, meaning if the JavaScript event doesn’t trigger properly (maybe the script did not download correctly or uses JavaScript that an old browser doesn’t support such as the double arrow in the code above) then it won’t do anything. A better way would be to think carefully beforehand. How would we go about making it useful when it is both working and when it isn’t?

In this case, we could make the default text be “200 character limit.” This would mean that without any JavaScript at all, the user would always see the character limit but it just wouldn’t feedback about how close they are to the limit. However, when the JavaScript is working, it would update as they type and could say “200 characters remaining” instead. It is a very subtle change but means that although two users could get different experiences, neither are getting an experience that feels broken.

Another default that we could set is the maxlength on the element itself rather than afterwards with JavaScript. Without doing this, the baseline version (the one without JS) would be able to type past the limit.

User Testing

It’s all very well testing on various browsers and thinking about the various permutations of how devices could serve the website in a different way, but are users able to use it?

Generally speaking, no. I’m consistently shocked by user testing; people never use a site how you expect them to. This means that user testing is crucial.

It’s quite hard to simulate a user test session in an article, so for the purposes of this article, I’m going to just focus on one point that I’ve seen users struggle with on various projects.

The user is happily writing away, gets to 0 characters remaining, and then gets stuck. They forget what they were writing, or they don’t notice that it had stopped typing.

This happens because there is nothing telling the user that something has changed; if they are typing away without paying much attention, then they can hit the maximum length without noticing. This is a frustrating experience.

One way to solve this issue is to allow overtyping, so the maximum length still counts for it to be valid when submitted but it allows the user to type as much as they want and then edit it before submission. This is a good solution as it gives the control back to the user.

Okay, so how do we implement overtyping? Instead of jumping into the code, let’s step through in theory. maxlength doesn’t allow overtyping, it just stops allowing input once it hits the limit. So we need to remove maxlength and write a JS equivalent. We can use the input event handler as we did before, as we know that works on paste, etc. So in that event, the handler would check if the user has typed more than the limit, and if so, the counter text could change to say “10 characters too many.” The baseline version (without the JS) would no longer have a limit at all, so a useful middle ground could be to add the maxlength to the element in the HTML and remove the attribute using JavaScript.

That way, the user would see that they are over the limit without being cut off while typing. There would still need to be validation to make sure it isn’t submitted, but that is worth the extra small bit of work to make the user experience far better.

An example showing “17 characters too many” in red text next to a <code>&lt;textarea&gt;</code>.
Allowing the user to overtype (Large preview)

Designing The Overtype

This gets us to quite a solid position: the user is now able to use any device and get a decent experience. If they type too much it is not going to cut them off; instead, it will just allow it and encourage them to edit it down.

There’s a variety of ways this could be designed differently, so let’s look at how Twitter handles it:

A screenshot from Twitter showing their textarea with overtyped text with a red background.
Twitter's <textarea> (Large preview)

Twitter has been iterating its main tweet <textarea> since they started the company. The current version uses a lot of techniques that we could consider using.

As you type on Twitter, there is a circle that completes once you get to the character limit of 280. Interestingly, it doesn’t say how many characters are available until you are 20 characters away from the limit. At that point, the incomplete circle turns orange. Once you have 0 characters remaining, it turns red. After the 0 characters, the countdown goes negative; it doesn’t appear to have a limit on how far you can overtype (I tried as far as 4,000 characters remaining) but the tweet button is disabled while overtyping.

So this works the same way as our <textarea> does, with the main difference being the characters represented by a circle that updates and shows the number of characters remaining after 260 characters. We could implement this by removing the text and replacing it with an SVG circle.

The other thing that Twitter does is add a red background behind the overtyped text. This makes it completely obvious that the user is going to need to edit or remove some of the text to publish the tweet. It is a really nice part of the design. So how would we implement that? We would start again from the beginning.

You remember the part where we realized that a basic input text box would not give us multiline? And that a maxlength attribute would not give us the ability to overtype? This is one of those cases. As far as I know, there is nothing in CSS that gives us the ability to style parts of the text inside a <textarea>. This is the point where some people would suggest web components, as what we would need is a pretend <textarea>. We would need some kind of element — probably a div — with contenteditable on it and in JS we would need to wrap the overtyped text in a span that is styled with CSS.

What would the baseline non-JS version look like then? Well, it wouldn’t work at all because while contenteditable will work without JS, we would have no way to actually do anything with it. So we would need to have a <textarea> by default and remove that if JS is available. We would also need to do a lot of accessibility testing because while we can trust a <textarea> to be accessible relying on browser features is a much safer bet than building your own components. How does Twitter handle it? You may have seen it; if you are on a train and your JavaScript doesn’t load while going into a tunnel then you get chucked into a decade-old legacy version of Twitter where there is no character limit at all.

What happens then if you tweet over the character limit? Twitter reloads the page with an error message saying “Your Tweet was over the character limit. You’ll have to be more clever.” No, Twitter. You need to be more clever.

Retro

The only way to conclude this dramatization is a retrospective. What went well? What did we learn? What would we do differently next time or what would we change completely?

We started very simple with a basic textbox; in some ways, this is good because it can be all too easy to overcomplicate things from the beginning and an MVP approach is good. However, as time went on, we realized how important it is to have some critical thinking and to consider what we are doing. We should have known a basic textbox wouldn’t be enough and that a way of setting a maximum length would be useful. It is even possible that if we have conducted or sat in on user research sessions in the past that we could have anticipated the need to allow overtyping. As for the browser compatibility and user experiences across devices, considering progressive enhancement from the beginning would have caught most of those potential issues.

So one change we could make is to be much more proactive about the thinking process instead of jumping straight into the task, thinking that the code is easy when actually the code is the least important part.

On a similar vein to that, we had the “scope creep” of maxlength, and while we could possibly have anticipated that, we would rather not have any scope creep at all. So everybody involved from the beginning would be very useful, as a diverse multidisciplinary approach to even small tasks like this can seriously reduce the time it takes to figure out and fix all the unexpected tweaks.

Back To The Real World

Okay, so I can get quite deep into this made-up project, but I think it demonstrates well how complicated the most seemingly simple tasks can be. Being user-focussed, having a progressive enhancement mindset, and thinking things through from the beginning can have a real impact on both the speed and quality of delivery. And I didn’t even mention testing!

I went into some detail about the history of the <textarea> and which event listeners to use, some of this can seem overkill, but I find it fascinating to gain a real understanding of the subtleties of the web, and it can often help demystify issues we will face in the future.

Smashing Editorial (ra, il)

Preparing Your App For iOS 12 Notifications

Preparing Your App For iOS 12 Notifications

Preparing Your App For iOS 12 Notifications

Kaya Thomas

In 2016, Apple announced a new extension that will allow developers to better customize their push and local notifications called the UNNotificationContentExtension. The extension gets triggered when a user long presses or 3D touches on a notification whenever it is delivered to the phone or from the lock/home screen. In the content extension, developers can use a view controller to structure the UI of their notification, but there was no user interaction enabled within the view controller — until now. With the release of iOS 12 and XCode 10, the view controller in the content extension now enables user interaction which means notifications will become even more powerful and customizable.

At WWDC 2018, Apple also announced several changes to notification settings and how they appear on the home screen. In an effort to make users more aware of how they are using apps and allowing more user control of their app usage, there is a new notification setting called “Deliver Quietly.” Users can set your app to Delivery Quietly from the Notification Center, which means they will not receive banners or sound notifications from your app, but they will appear in the Notification Center. Apple using an in-house algorithm, which presumably tracks often you interact with notifications, will also ask users if they still want to receive notifications from particular apps and encourage you to turn on Deliver Quietly or turn them off completely.

Notifications are getting a big refresh in iOS 12, and I’ve only scratched the surface. In the rest of this article, we’ll go over the rest of the new notification features coming to iOS 12 and how you can implement them in your own app.

Recommended reading: WWDC 2018 Diary Of An iOS Developer

Remote vs Local Notifications

There are two ways to send push notifications to a device: remotely or locally. To send notifications remotely, you need a server that can send JSON payloads to Apple’s Push Notification Service. Along with a payload, you also need to send the device token and any other authentication certificate or tokens that verify your server is allowed to send the push notification through Apple. For this article, we focus on local notifications which do not need a separate server. Local notifications are requested and sent through the UNUserNotificationCenter. We’ll go over later how specifically to make the request for a local notification.

In order to send a notification, you first need to get permission from the user on whether or not they want you to send them notifications. With the release of iOS 12, there are a lot of changes to notification settings and permissions so let’s break it down. To test out any of the code yourself, make sure you have the Xcode 10 beta installed.

Notification Settings And Permissions

Deliver Quietly

Delivery Quietly is Apple’s attempt to allow users more control over the noise they may receive from notifications. Instead of going into the settings app and looking for the app whose notification settings you want to change, you can now change the setting directly from the notification. This means that a lot more users may turn off notifications for your app or just delivery them quietly which means the app will get badged and notifications only show up in the Notification Center. If your app has its own custom notification settings, Apple is allowing you to link directly to that screen from the settings management view pictured below.

iPhone 8 Plus shown with Manage selected from notification which brings up the Deliver Quietly and Turn Off options.
Delivery quietly feature. (Large preview)

In order to link to your custom notification setting screen, you must set providesAppNotificationSettings as a UNAuthorizationOption when you are requesting notification permissions in the app delegate.

In didFinishLaunchingWithOptions, add the following code:

UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound, .providesAppNotificationSettings]) { ... }

When you do this, you’ll now see your custom notification settings in two places:

  • If the user selects Turn Off when they go to manage settings directly from the notification;
  • In the notification settings within the system’s Settings app.
iPhone 8 Plus shown with Turn Off selected from notification which brings up the Turn Off All Notifications and Configure in NotificationTester options.
Deep link to to custom notification settings for NotificationTester from notification in the Notification Center. (Large preview)
iPhone 8 Plus shown with system Settings app open with Notifications screen for NotificationTester app.
Deep link to custom notification settings for NotificationTester from system’s Settings app. (Large preview)

You also have to make sure to handle the callback for when the user selects on either way to get to your notification settings. Your app delegate or an extension of your app delegate has to conform to the protocol UNUserNotificationCenterDelegate so you can then implement the following callback method:

func userNotificationCenter(_ center: UNUserNotificationCenter, openSettingsFor notification: UNNotification?) {
    let navController = self.window?.rootViewController as! UINavigationController
    let notificationSettingsVC = NotificationSettingsViewController()
    navController.pushViewController(notificationSettingsVC, animated: true)
}

Another new UNAuthorizationOption is provisional authorization. If you don’t mind your notifications being delivered quietly, you can set add .provisional to your authorization options as shown below. This means that you don’t have to prompt the user to allow notifications — the notifications will still show up in the Notification Center.

UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .provisional]) { ... }

So now that you’ve determined how to request permission from the user to deliver notifications and how to navigate users to your own customized settings view, let’s go more into more detail about the actual notifications.

Sending Grouped Notifications

Before we get into the customization of the UI of a notification, let’s go over how to make the request for a local notification. First, you have to register any UNNotificationCategory, which are like templates for the notifications you want to send. Any notification set to a particular category will inherit any actions or options that were registered with that category. After you’ve requested permission to send notifications in didFinishLaunchingWithOptions, you can register your categories in the same method.

let hiddenPreviewsPlaceholder = "%u new podcast episodes available"
let summaryFormat = "%u more episodes of %@"
let podcastCategory = UNNotificationCategory(identifier: "podcast", actions: [], intentIdentifiers: [], hiddenPreviewsBodyPlaceholder: hiddenPreviewsPlaceholder, categorySummaryFormat: summaryFormat, options: [])
UNUserNotificationCenter.current().setNotificationCategories([podcastCategory])

In the above code, I start by initiating two variables:

  • hiddenPreviewsPlaceholder
    This placeholder is used in case the user has “Show Previews” off for your app; if we don’t have a placeholder there, your notification will show with only “Notification” also the text.
  • summaryFormat
    This string is new for iOS 12 and coincides with the new feature called “Group Notifications” that will help the Notification Center look a lot cleaner. All notifications will show up in stacks which will be either representing all notifications from the app or specific groups that the developer has set for there app.

The code below shows how we associate a notification with a group.

@objc func sendPodcastNotification(for podcastName: String) {
let content = UNMutableNotificationContent()
content.body = "Introducing Season 7"
content.title = "New episode of \(podcastName):"
content.threadIdentifier = podcastName.lowercased()
content.summaryArgument = podcastName
content.categoryIdentifier = NotificationCategoryType.podcast.rawValue
sendNotification(with: content)
}

For now, I’ve hardcoded the text of the notification just for the example. The threadIdentifier is what creates the groups that we show as stacks in the Notification Center. In this example, I want the notifications grouped by podcast so each notification you get is separated by what podcast it’s associated with. The summaryArgument matches back to our categorySummaryFormat we set in the app delegate. In this case, we want the string for the format: "%u more episodes of %@" to be the podcast name. Lastly, we have to set the category identifier to ensure the notification has the template we set in the app delegate.

func sendNotification(for category: String, with content: UNNotificationContent) {
let uuid = UUID().uuidString
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
let request = UNNotificationRequest(identifier: uuid, content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
}

The above method is how we request the notification to be sent to the device. The identifier for the request is just a random unique string; the content is passed in and we create the content in our sendPodcastNotification method, and lastly, the trigger is when you want the notification to send. If you want the notification to send immediately, you can set that parameter to nil.

iPhone 8 Plus lock screen shown with a grouped notification stack from Notification Tester app.
Grouped notifications for NotificationTester. (Large preview)
iPhone 8 Plus lock screen shown with a grouped notification stack from Notification Tester app that has hidden content.
Notification grouped with previews turned off. (Large preview)

Using the methods we’ve described above, here’s the result on the simulator. I have a button that has the sendPodcastNotification method as a target. I tapped the button three times to have the notifications sent to the device. In the first photo, I have “Show Previews” set to “Always” so I see the podcast and the name of the new episodes along with the summary that shows I have two more new episodes to check out. When “Show Previews” is set to “Never,” the result is the second image above. The user won’t see which podcast it is to respect the “No Preview” setting, but they can still see that I have three new episodes to check out.

Notification Content Extension

Now that we understand how to set our notification categories and make the request for them to be sent, we can go over how to customize the look of the notification using the Notification Service and Notification Content extensions. The Notification Service extension allows you to edit the notification content and download any attachments in your notification like images, audio or video files. The Notification Content extension contains a view controller and storyboard that allows you to customize the look of your notification as well as handle any user interaction within the view controller or taps on notification actions.

To add these extensions to your app go File →  New →  Target.

Xcode shown after selecting from menu to add a new target, Notification Content Extension is highlighted.
Adding new target to app for the Notification Content Extension. (Large preview)

You can only add them one at a time, so name your extension and repeat the process to add the other. If a pop-up appears asking you to activate your new scheme, click the “Activate” button to set it up for debugging.

For the purpose of this tutorial, we will be focusing on the Notification Content Extension. For local notifications, we can include the attachments in the request, which we’ll go over later.

First, go to the Info.plist file in the Notification Content Extension target.

Info.plist file for Notification Content Extension shown in Xcode.
Info.plist for the Notification Content Extension. (Large preview)

The following attributes are required:

  • UNNotificationExtensionCategory
    A string value equal to the notification category which we created and set in the app delegate. This will let the content extension know which notification you want to have custom UI for.
  • UNNotificationExtensionInitialContentSizeRatio
    A number between 0 and 1 which determines the aspect ratio of your UI. The default value is 1 which will allow your interface to have its total height equal to its width.

I’ve also set UNNotificationExtensionDefaultContentHidden to “YES” so that the default notification does not show when the content extension is running.

You can use the storyboard to set up your view or create the UI programmatically in the view controller. For this example I’ve set up my storyboard with an image view which will show the podcast logo, two labels for the title and body of the notification content, and a “Like” button which will show a heart image.

Now, in order to get the image showing for the podcast logo and the button, we need to go back to our notification request:

guard let pathUrlForPodcastImg = Bundle.main.url(forResource: "startup", withExtension: "jpg") else { return }
let imgAttachment = try! UNNotificationAttachment(identifier: "image", url: pathUrlForPodcastImg, options: nil)

guard let pathUrlForButtonNormal = Bundle.main.url(forResource: "heart-outline", withExtension: "png") else { return }
let buttonNormalStateImgAtt = try! UNNotificationAttachment(identifier: "button-normal-image", url: pathUrlForButtonNormal, options: nil)

guard let pathUrlForButtonHighlighted = Bundle.main.url(forResource: "heart-filled", withExtension: "png") else { return }
let buttonHighlightStateImgAtt = try! UNNotificationAttachment(identifier: "button-highlight-image", url: pathUrlForButtonHighlighted, options: nil)

content.attachments = [imgAttachment, buttonNormalStateImgAtt, buttonHighlightStateImgAtt]

I added a folder in my project that contains all the images we need for the notification so we can access them through the main bundle.

Project navigator shown in Xcode.
Xcode project navigator. (Large preview)

For each image, we get the file path and use that to create a UNNotificationAttachment. Added that to our notification content allows us to access the images in the Notification Content Extension in the didReceive method shown below.

func didReceive(_ notification: UNNotification) {
self.newEpisodeLabel.text = notification.request.content.title
self.episodeNameLabel.text = notification.request.content.body

let imgAttachment = notification.request.content.attachments[0]
let buttonNormalStateAtt = notification.request.content.attachments[1]
let buttonHighlightStateAtt = notification.request.content.attachments[2]

guard let imageData = NSData(contentsOf: imgAttachment.url), let buttonNormalStateImgData = NSData(contentsOf: buttonNormalStateAtt.url), let buttonHighlightStateImgData = NSData(contentsOf: buttonHighlightStateAtt.url) else { return }

let image = UIImage(data: imageData as Data)
let buttonNormalStateImg = UIImage(data: buttonNormalStateImgData as Data)?.withRenderingMode(.alwaysOriginal)
let buttonHighlightStateImg = UIImage(data: buttonHighlightStateImgData as Data)?.withRenderingMode(.alwaysOriginal)

imageView.image = image
likeButton.setImage(buttonNormalStateImg, for: .normal)
likeButton.setImage(buttonHighlightStateImg, for: .selected)
}

Now we can use the file path URLs we set in the request to grab the data for the URL and turn them into images. Notice that I have two different images for the different button states which will allow us to update the UI for user interaction. When I run the app and send the request, here’s what the notification looks like:

iPhone 8 Plus shown with custom notification loaded after force touching the notification.
Content extension loaded for NotificationTester app. (Large preview)

Everything I’ve mentioned so far in relation to the content extension isn’t new in iOS 12, so let’s dig into the two new features: User Interaction and Dynamic Actions. When the content extension was first added in iOS 10, there was no ability to capture user touch within a notification, but now we can register UIControl events and respond when the user interacts with a UI element.

For this example, we want to show the user that the “Like” button has been selected or unselected. We already set the images for the .normal and .selected states, so now we just need to add a target for the UIButton so we can update the selected state.

override func viewDidLoad() {
super.viewDidLoad()
// Do any required interface initialization here.
likeButton.addTarget(self, action: #selector(likeButtonTapped(sender:)), for: .touchUpInside)
}
@objc func likeButtonTapped(sender: UIButton) {
likeButton.isSelected = !sender.isSelected
}

Now with the above code we get the following behavior:

GIF of iPhone 8 Plus with custom notification loaded and like button being selected and unselected.
Selecting like button within notification. (Large preview)

In the selector method likeButtonTapped, we could also add any logic for saving the liked state in User Defaults or the Keychain, so we have access to it in our main application.

Notification actions have existed since iOS 10, but once you click on them, usually the user will be rerouted to the main application or the content extension is dismissed. Now in iOS 12, we can update the list of notification actions that are shown in response to which action the user selects.

First, let’s go back to our app delegate where we create our notification categories so we can add some actions to our podcast category.

let playAction = UNNotificationAction(identifier: "play-action", title: "Play", options: [])
let queueAction = UNNotificationAction(identifier: "queue-action", title: "Queue Next", options: [])
let podcastCategory = UNNotificationCategory(identifier: "podcast", actions: [playAction, queueAction], intentIdentifiers: [], hiddenPreviewsBodyPlaceholder: hiddenPreviewsPlaceholder, categorySummaryFormat: summaryFormat, options: [])

Now when we run the app and send a notification, we see the following actions shown below:

iPhone 8 Plus with custom notification loaded with an options to Play or Add to Queue.
Notification quick actions. (Large preview)

When the user selects “Play,” we want the action to be updated to “Pause.” If they select “Queue Next,” we want that action to be updated to “Remove from Queue.” We can do this in our didReceive method in the Notification Content Extension’s view controller.

func didReceive(_ response: UNNotificationResponse, completionHandler completion:
(UNNotificationContentExtensionResponseOption) -> Void) {
guard let currentActions = extensionContext?.notificationActions else { return }

if response.actionIdentifier == "play-action" {
let pauseAction = UNNotificationAction(identifier: "pause-action", title: "Pause", options: [])
let otherAction = currentActions[1]
let newActions = [pauseAction, otherAction]
extensionContext?.notificationActions = newActions

} else if response.actionIdentifier == "queue-action" {
let removeAction = UNNotificationAction(identifier: "remove-action", title: "Remove from Queue", options: [])
let otherAction = currentActions[0]
let newActions = [otherAction, removeAction]
extensionContext?.notificationActions = newActions

}  else if response.actionIdentifier == "pause-action" {
let playAction = UNNotificationAction(identifier: "play-action", title: "Play", options: [])
let otherAction = currentActions[1]
let newActions = [playAction, otherAction]
extensionContext?.notificationActions = newActions

} else if response.actionIdentifier == "remove-action" {
let queueAction = UNNotificationAction(identifier: "queue-action", title: "Queue Next", options: [])
let otherAction = currentActions[0]
let newActions = [otherAction, queueAction]
extensionContext?.notificationActions = newActions
}
completion(.doNotDismiss)
}

By resetting the extensionContext?.notificationActions list to contain the updated actions, it allows us to change the actions every time the user selects one. The behavior is shown below:

GIF of iPhone 8 Plus with custom notification loaded and the quick actions being changed from Play to Pause and Add to Queue to Remove from Queue.
Dynamic notification quick actions. (Large preview)

Summary

There’s a lot to do before iOS 12 launches to make sure your notifications are ready. The steps vary in complexity and you don’t have to implement them all. Make sure to first download XCode 10 beta so you can try out the features we’ve gone over. If you want to play around with the demo app I’ve referenced throughout the article, check it out on Github.

For Your Notification Permissions Request And Settings, You’ll Need To:

  • Determine whether or not you want to enable provisional authorization and add it to your authorization options.
  • If you have already have a customized notification settings view in your app, add providesAppNotificationSettings to your authorization options as well as implement the call back in your app delegate or whichever class conforms to UNUserNotificationCenterDelegate.

For Notification Grouping:

  • Add a thread identifier to your remote and local notifications so your notifications are correctly grouped in the Notification Center.
  • When registering your notification categories, add the category summary parameter if you want your grouped notification to be more descriptive than “more notifications.”
  • If you want to customize the summary text even more, then add a summary identifier to match whichever formatting you added for the category summary.

For Customized Rich Notifications:

  • Add the Notification Content extension target to your app to create rich notifications.
  • Design and implement the view controller to contain whichever elements you want in your notification.
  • Consider which interactive elements would be useful to you, i.e. buttons, table view, switches, etc.
  • Update the didReceive method in the view controller to respond to selected actions and update the list of actions if necessary.

Further Reading

Smashing Editorial (ra, yk, il)

204: 6 ‘Ordinary’ Things That Will Grow Your Blog into Something Extraordinary

204: 6 ‘Ordinary’ Things That Will Grow Your Blog into Something Extraordinary

How Ordinary Things Can Lead to Extraordinary Results With Your Blog
This week and I’m excited to be spending time face to face with quite a few ProBlogger podcast listeners and blog readers at our Aussie blogging events.
We’ve been holding annual Australian events since 2010 and it is a highlight of my year each time. It’s fantastic to put faces to names, hear the stories of what bloggers are learning and to get inspired by meeting many of you.
So because I’m away this week and busy with the event I thought it might be fun to give you a taste of what happens at a ProBlogger event and to play you a talk I gave at one of our events a few years ago. Continue reading “204: 6 ‘Ordinary’ Things That Will Grow Your Blog into Something Extraordinary”

5 Smart Alternatives to the Hamburger Menu

Screen space is a precious resource on mobile. To meet the challenge of small screen space while still making navigation accessible, designers often rely on hiding navigation behind the hamburger icon, a prime example of hidden navigation. In this article, we’ll see why hidden navigation creates bad UX and what alternatives are available for designers.

Why the Hamburger Menu Is Bad For UX

On mobile, visible navigation is used 1.5x more than hamburger

If you’re working on digital products, you’ve probably already read dozens of articles describing how the hamburger menu on mobile hurts UX metrics. The main downside is its low discoverability, and this is backed up by actual numbers. In qualitative studies, NNGroup found that hidden navigation is less discoverable than visible or partially visible navigation. This means that when navigation is hidden, users are less likely to use navigation. Hamburger menus drive engagement down, slow down exploration and confuse people.

So What Should We Use Instead?

While there is no hard-and-fast rule for mobile apps and websites, a general recommendation is to use either visiblethe main navigation options are shown in a visible navigation bar—or combo navigation, where some of the main navigation options are visible and some are hidden under an interactive element.

1. Tab Bar

If you have a limited number of top-level destinations in your website or app, a tabbed navigation might be the solution. When a menu is visible at the top or bottom, it’s basically advertising that a navigation is there and people are able to see the navigation options right from the start.

Tabs seem to be the simplest navigation pattern. However, a few things should be considered when designing this type of navigation:

  • Tab bar allows 5 or fewer navigation options to display.
  • One of the options should always be active and should be visually highlighted by, for example, using a contrasting color.
  • The first tab has to be the home page and the order of the tabs should relate to their priority or logical order in the user flow.
  • It’s better to use icons together with labels for each navigation option. Icons without labels work only for common actions, like a magnifying glass icon for search, and for interfaces that the users use frequently (e.g. Instagram).

Tip: In order to save screen space, the navigation bar could be hidden/revealed on downward and upward scrolling.

2. Tab Bar With “More” Option

When you have more than 5 top-level destinations, a practical solution might be to show the 4 prioritized sections and have a 5th element as a list of remaining options.

The design principles for this solution are basically the same as for Tab bar. There’s just one exception: the last element is the ‘more’ item.

The ‘more’ item can work as a dropdown menu or even link to a separate navigation page with the remaining sections. From the first glance this solution isn’t much better than the hamburger menu, since it also hides content and its label doesn’t say too much about what’s hidden behind it. If you correctly prioritize navigation options, however, a majority of your users will have 4 or 5 visible top-priority navigation options on the screen all the time so the navigation experience for them will be improved.

3. Progressively Collapsing Menu

Progressively collapsing menu, also known as the “Priority+” pattern, is a menu that adapts to the screen width. It shows as much of the navigation as possible and puts everything else under a “more” button. Basically, this pattern is a sophisticated version of the ‘Tab bar  + more’ navigation where the number of navigation options hidden behind the “more” menu depends on the available screen space. The flexibility of this solution provides a better user experience than a ‘static’ ‘Tab bar  + more’.

Image Credit: Brad Frost

4. Scrollable Navigation

Similar to the previous two patterns, this is another approach for longer lists. If you have a number of navigation options without a big distinction in priorities, for example music genres, you can list all the items in a scrollable view. By making the list scrollable you allow users to move from side-to-side.

The downside of this solution is that still only the top few items are visible without scrolling and all the remaining ones are out of the sight. This is, however, an acceptable solution when the users are expected to explore the content, for example news categories, music categories or in an online store.

5. Full-Screen Navigation

While with other patterns mentioned in this article, the struggle is to minimize the space that the navigation systems take up, the full-screen pattern takes the exact opposite approach. This approach usually devotes the home page exclusively to navigation. Users incrementally tap or swipe to reveal additional menu options as they scroll up and down.

This pattern works well in task-based and direction-based websites and apps, especially when users tend to limit themselves to only one branch of the navigation hierarchy during a single session. Funnelling users from broad overview pages to detail pages helps them to home in on what they’re looking for and to focus on content within an individual section.

Full-screen navigation in Yelp

Using full-screen navigation, designers can organize large chunks of information in a coherent manner and reveal information without overwhelming the user. Once the user makes their decision about where to go, then you can dedicate the entire screen space to content.

Conclusion

With navigation patterns for mobile, there isn’t a one-size-fits-all solution; it always depends on your product, on your users, and on the context. However, the foundation of every well-designed navigation is information architecture: clear structure, priorities, and labels based on your users’ needs. Helping users navigate should be a top priority for every app designer. Both first-time and returning users should be able to figure out how to move through your app with ease.

LAST DAY: Zelda – A Beautiful and Classy Script Font – only $7!

Source

Do Kids See What We Wish We Could See?

A few weeks back, my four year old daughter Salem was still awake and chattering away in her bedroom, despite being in bed for over an hour.

When I went in to give her a cuddle and ask why she was still awake, she whispered to me, “She’s here.”

“Who’s here?” I asked.

“The girl.”

I pulled away a little and looked at Salem, who was looking intently behind my shoulder. “What girl?”

“The girl in the corner.”

I looked behind me to the corner of Salem’s room, where there was a little bit of shadow, but couldn’t see anything. I looked back at Salem, who smiled at me and said, “She’s gone now.”

To say I was a little freaked out is understating it. It probably didn’t help that I had recently watched The Conjuring, where a family has a not-so-pleasant experience with spirits in their new home.

It’s not the first time that Salem has had “conversations” in her room that we can hear through the monitor. Usually we just put it down to her telling herself stories to fall asleep, but after that recent “the girl” exchange, I’m not so sure.

Seems I’m not alone, either…

The Vision Only Kids Have?

When I shared this story on Facebook, many of my friends left examples of their own kids.

CREEPY! But probably true. Lauren used to wave and laugh at someone in the corner of her room when she was a baby.  She also knew my dead father’s name when she was only 2 years old…also super creepy!

I used to volunteer at a daycare. One of the girls named her boy doll “Mushu” – which is kind of an odd, Asian name, right? So her mom asked her why she named him so, and the girl said “He told me.”

My son also had “a friend” growing up. He talked about him often and one night while checking on him before bed I saw him in the corner of the room watching over him. We even had to have a chair at the dinner table for him.

The overarching connection between each example is that they all refer to children, and not adults.

In addition to those, another friend suggested the reason for this.

Some children are more sensitive than others. Spirits know when people can see them and are drawn to those people.

Which made me wonder if the innocence of young children allow spirits to be seen as physical beings, and we lose that as we grow into adults and see life in a different way?

The Time I Saw a UFO

I think I believe in ghosts, or whatever spirits are, or the friends that my daughter and the kids in the examples above talk to. I’m not 100% sure, but there’s too much to discard completely.

Do all kids simply have imaginary conversations, or are there spirits of kids that died early that roam the earth looking for friends to keep them company?

Do all kids find a storytelling gift early, and it’s only when they go to school and are taught that it’s “bad” to use your imagination that they lose the will to converse with someone that isn’t there?

Are our beliefs and imagination shaped by adults that don’t remember their own childhood?Click To Tweet

The reason I’m not sold on the belief that ghosts don’t exist is that many people claim that there’s no such thing as UFO’s – and yet I clearly saw one when I was a teenager in Scotland.

My sister and I were coming home from a movie, and something caught my eye. I looked up, and there was a light traveling at crazy speed, in three different directions in about the same amount of seconds.

The light stopped, hovered, rose, and then dropped. Then it scuttled one way, then another. It took one final swoop, for about five seconds, then shot up into the air beyond the clouds.

I looked at my sister, who was nine at the time, and she said that was the coolest thing she’s ever seen. To this day, I believe we both saw a UFO.

So if I saw something that so many adults say doesn’t exist, doesn’t it stand to reason our kids see things we say don’t exist?

The Things We Wish We Saw

I don’t know.

I do know that I’m extremely jealous of my little girl, if she has a ghost for a friend. How cool would that be? As long as it’s like Casper and not Chucky…

While I don’t recall our son Ewan having the same experience, my wife recalls him also having conversations, but the cats we used to have kept the ghosts at bay (seemingly cats are very good at this kind of thing, as shared by others on that same Facebook thread).

As an adult, it’d be nice to have something whimsical, or imaginary, but that’s also real to believe in.

The world is a cruel, cold place at times. It’d be nice to be able to see old friends no longer here, or loved ones long since passed.

But perhaps the realities of the world have made it too late for us to go back to that.

It reminds me of the scene in the Christmas movie, The Polar Express. The main character, a little boy who refound his belief in Santa Claus after an adventure to the North Pole, is given one of the bells from Santa’s sleigh.

On Christmas Day, only the boy and his little sister can hear the chime when they shake the bell. His parents can’t. As the voiceover of the boy-now-an-adult shares, even his sister lost the ability to hear the bell as she got older.

Not him, though – because he’d seen with his own eyes, and he believed.

Perhaps we’ve lost the ability to see beyond our eyes, and believe that which we no longer do. If so, that’s a shame.

Then again, we could always let our kids show us the way again…

original: Pure Blogging

Do Kids See What We Wish We Could See? originally appeared on Danny Brown – – all rights reserved.

Powered by WPeMatico

4 WordPress Alternatives: the What, Where, and Why

This guest post is by Matt Setter of MaltBlue.com.

As bloggers, we’re all familiar with WordPress, whether as a self-hosted setup, or via WordPress.com. I think that, if you’re a blogger and you’ve not used it, then you’re likely in an odd minority.

If you do a Google search for “blogging software,” WordPress will likely be among the first results you’ll see. But is it necessarily the best choice?

Yes, “everybody’s doing it,” but does that make it the right choice? Just like in the 90’s when Microsoft seemed like the only choice, but then we found alternatives like Mac or Linux, there are alternatives to WordPress too.

Now maybe you’re quite happy with your WordPress installation, it meets your needs, and your site’s humming along nicely. Well, that’s perfectly fine. But what if you’re not? What if you want to change, or have the opportunity to change?

What if you’re:

  • just starting out
  • about to rebuild or redesign your blog
  • moving hosts
  • concerned WordPress is not meeting your needs
  • contrarian in your thinking?

Well if you’re any one of these, you’ll love this post. Today I present to you four alternatives you may never have heard of, showing you the pros and cons of each, how much they cost, and where you can get them from. Ready? Great! Let’s begin.

Habari

habariHabari is a secure blogging platform designed from the ground up with the current and future needs of the blogging community firmly in mind. It’s also designed to be open and transparent, using modern software development techniques in its design.

Some examples of blogs run on this platform include:

  • http://barefootrunner.co.uk/
  • http://futurespark.com.au/

The Habari project screencast linked below gives a great introduction to the CMS.

Features

  • Support for a wide variety of plugins and extensions, including:
    • contact forms
    • Last.FM
    • spam management
    • Amazon
    • Google Maps, AdSense, and Analytics
    • star ratings
    • members-only access
    • LinkedIn
    • Twitter
  • modern theme support
  • support for multiple users and multiple sites in one installation
  • support for tagging
  • support for a wide variety of media, including Viddler and Flickr
  • custom RSS feeds and statistics
  • Feedburner integration
  • modern spam filtering techniques
  • automatic Twitter updates
  • Disqus integration for commenting.

Cost and availability

Habari is available as a free download from the project home page. You can even try out a demo version without needing to install it.

Support options

Habari support is available via:

  • FAQ
  • users group
  • IRC (internet chat, similar to ICQ, MSN, Google Chat etc).

Is it for you?

If you’re keen to roll up your sleeves and manage things yourself, or you have great tech support, try out Habari. However, if your host doesn’t support it or you’re not able to do it yourself, then this may not be the best option for you.

CushyCMS

cushycmsCushyCMS is, as the home page says, “A Truly Simple CMS.” It was designed to be implemented with as little effort as possible; to be “Super Easy To Use!”

Where Habari is more like WordPress in that you can download, install, and configure it yourself, CushyCMS is a fully hosted solution.

Minimal manual effort is required on your part, other than the work required to implement modest customisations. Have a look at the introductory video below to see just how easy it is.

Blogs that use CushyCMS include:

  • http://thewebtherapist.com/
  • http://www.the-nomads.co.uk/

Features

Depending on the package that you choose, different features will be available to you. In the free package, you get:

  • five sites
  • unlimited site editors
  • availability in 20 languages.

If you take the pro package, you can:

  • brand your installation
  • customise the interface via a wysiwig editor
  • remove all ads from the site
  • use your own domain name and logo
  • configure access rights for each user
  • customise the CSS classes.

Cost and availability

CushyCMS is available from Stateless Systems and comes in two forms:

  • free
  • pro, for US$28 per month.

Support options

This depends on the package that you’ve chosen. If you’ve chosen the free package, you get:

  • videos
  • documentation
  • package FAQ
  • access to the Google user group.

If you upgrade to the pro package, you get all that, plus direct email support from Stateless Systems.

Is it for you?

Depending on your needs and requirements, CushyCMS could be just what you’re looking for. You can sign up and get started in minutes. There’s no need to worry about what your current provider does or doesn’t support, as this system is fully hosted. You can get started with the free version, but you’ll have limited branding and domain control privileges.

You can upgrade to the pro version, but unless you’re making regular money with your blog, you might not want to pay the monthly fee for it. However, you do get a company backing the product with 24/7 support, should you have any questions or queries.

concrete5

concrete5Just like WordPress and Habari, concrete5 is available to be downloaded, configured, and installed at your web host and is a blogging platform built from the ground up to satisfy the needs of website editors, designers, and developers alike on a foundation of proven open source technologies.

The underlying philosophy of concrete5 is to make running a website easy. As you can see from the demo video below, in just about all aspects of site administration, you can simply click on a region of the page and edit it to your heart’s content.

A couple of blogs that run on concrete5 are:

  • http://www.gigstadpainting.com/
  • http://www.sustainableharvest.com/

Features

Concrete5:

  • is easy to theme yourself, or you can choose from a wide variety of pre-made themes
  • supports a wide variety of plugins and extensions including:
    • digital download support
    • discussion forums
    • ecommerce
    • ad servers
    • configurable menu navigation
    • star reviews
    • scrolling ticker
    • image gallery
    • traffic and statistics management
    • Google Maps
    • user chat
    • country-based redirect
    • Vimeo and YouTube support.
  • easy to configure, whether by hand or via the wysiwig editor
  • easy to update, right from your browser
  • open source and completely free to use
  • easy to install and configure.

Cost and availability

Concrete5 is available from the concrete5 website and is open source, so it’s free.

Support options

Similar to Habari, concrete5 doesn’t have a paid support option, however it does have:

  • an active community
  • clear documentation
  • a thorough FAQ.

If you are a developer, or have access to development support, training and integration packages are also available.

Is it for you?

Concrete5 is a good mixture of the best parts of the two previous packages. You can install it yourself, but training and custom build support are also available. So, depending on your needs and your available budget, concrete5 may be the right option for you. Why not give a trial version a go today to see?

TomatoCMS

tomatocmsLast, but by no means least, is TomatoCMS. Like Habari and Concrete5, TomatoCMS is an open source, modern blogging and CMS platform designed from the ground up to meet today’s needs and demands.

Examples of blogs that run on this platform include:

  • http://www.thethao68.com/
  • http://home.phono.co.jp/

Two key aspects set TomatoCMS apart: Widgets and the Layout Editor. Let’s look at its feature list.

Features

Among a vast array of compelling features are:

  • a variety of built-in modules (extension) including:
    • banner advertising support
    • category management
    • comment management
    • simple menu management
    • multimedia management
    • in-built news system
    • tag support
    • poll support
  • built on the Zend Framework, jQuery, and 960grid, making it fast, light and flexible.

In addition to this it’s also:

  • SEO friendly
  • secure
  • highly themable
  • packaged with a simple visual editor allowing you to drag, drop, and resize almost any interface element.

Cost and availability

As with Habari and Concrete5, TomatoCMS is also a free download available to be installed and configured on your host as your needs demand.

Support options

Also like Habari and Concrete5, TomatoCMS doesn’t offer a commercial support package. However it does have a solid project wiki and a thriving forum. If you have troubles with it, then you’re likely to find the solution there without too much hassle.

Is it for you?

If you’re keen to control most, if not all, of the aspects of the system on your own host, then this is the option for you. However, if you need support then this option may not be the best choice.

Choices, choices

So there you have it. If you want to change from WordPress, have an opportunity to change, or are just starting out, now you have four additional options to WordPress to choose from.

Take a closer look and evaluate them. When you find the one that ticks all your boxes, give it a try and let me know how it goes for you.

Do you run your blog on an alternative to WordPress? Why is it your platform of choice? What makes it the best one for your blog and your business? Let us know in the comments.

Matthew Setter is a freelance writer, technical editor and proofreader. His mission is to help businesses present their online message in an engaging and compelling way so they’re noticed and remembered.

The post 4 WordPress Alternatives: the What, Where, and Why appeared first on ProBlogger.

4 WordPress Alternatives: the What, Where, and Why
https://problogger.com/4-wordpress-alternatives-the-what-where-and-why/
http://www.problogger.net/archives/category/blog-networks/feed/
Blog Networks – ProBlogger
Blog Tips to Help You Make Money Blogging – ProBlogger
https://problogger.com/wp-content/uploads/powerpress/problogger_podcast-891.jpg

Powered by WPeMatico

Hope Comes From the Inside

When I was 28, my childhood friend and former roommate died from a drugs overdose. He was just 27.

It didn’t surprise me that he was gone. Perhaps, subconsciously, I was surprised he’d lasted so long.

Doesn’t mean it didn’t hurt like hell. It did. It broke me.

We always think that being prepared for someone’s death makes it a little easier. That the suddenness feels less sudden.

Whoever came up with that piece of wisdom was a fucking liar.

Or idiot. Maybe both.

When Jamie died, knowing that he’d been taken by the thing that had consumed him for most of his adult life didn’t make it easier.

Didn’t make it less sudden.

It simply reinforced the tragedy of a life that could have been so much more.

We Never Set Out to Fall

Jamie and I went to school together. Not just high school, but primary school too (early grade school in North America).

That meant the best part of 10 years in each other’s company as kids. A lot of time to build a great friendship.

Hope

After school, I went on to University, and Jamie joined the army. Did three tours, and came out a wiser and more thoughtful man.

But he also came out a very different man.

He served in the first Gulf War, and I truly believe that experience took away a large part of his belief in the world not being as bad a place as we all know it can be.

While he never talked specifics, it was clear Jamie had seen some horrific things. And not just committed by “the enemy”.

When he came out the army, he initially struggled to adjust to civilian life. As he sought to get back into the workplace, I offered him the spare room in the flat I was renting at the time.

Those seven months were almost like being back in high school.

We drank, brought girls home, played video games, and – like most young people – experimented with drugs.

Nothing too hard at first. But it wasn’t too long before we tried some coke and ecstasy.

While I won’t deny the experience was enjoyable, it wasn’t what I wanted to be doing. So I stopped the drugs, and suggested Jamie might want to cut back too.

I didn’t want to tell him to stop – he was a grown man. And the drugs helped him forget the war. So who was I to stop him?

But I did worry he was getting too involved.

I wish that you could see,
This face in front of me,
You’re sorry you swear it you’re done,
But I can’t tell you from the drugs.

He shrugged it off, laughing that he was in control, and that he could stop at any time.

Except he didn’t.

And it impacted our friendship.

He decided to leave the flat, and go live with an old girlfriend from high school, who’d gotten her parents’ house after they died in an accident abroad.

As he was leaving, I hugged him, and asked that he get help. Or, at the very least, not fall any further than he had.

He looked at me, and smiled. “We never set out to fall, Danny. We just do. I can’t promise you I won’t – but I promise I’ll get back up.”

With that, he hugged me, and walked away to the new chapter in his life.

Turns out it was to be the final one.

Hope Comes From Inside

That was the last I saw of Jamie. I moved to England to work, and my visits home were infrequent for the first couple of years.

Jamie moved again – turns out old girlfriends aren’t too keen on junkies selling their dead parents’ valuables to fund buying the next fix.

We lost touch, and life went on the way it always does when you see people less.

Four years later, I got a phone call on a wet Sunday afternoon. It was Jamie’s sister, Lisa. I almost knew what she was going to say before her words dropped me to the floor.

“He’s dead, Danny. Jamie’s dead.”

Numbness is a weird sensation. They say that it kicks in to stop pain from overcoming. Or for emotions to remain in check.

I don’t know if that’s what I felt when Lisa hung up the phone, but one thing I do know – numbness definitely doesn’t stop pain.

Doesn’t change the cold, horrible truth.

He’s dead, Danny. Jamie’s dead.

Three days later, I was at the side of a grave in Glasgow. Myself and the minister included, there were only six of us standing around the hole in the ground.

One of them was our old English teacher, Mr. Cummings. It was nice to see him there – he was always one of Jamie’s favourites.

Lisa and her mum were there, as well as someone I didn’t recognize. Turns out it was Jamie’s counselor. He’d finally gotten round to seeking help for his drugs, but succumbed before he could get it.

So fucking typical of you, I thought to myself when I learned this.

After the ceremony, the five of us – Lisa, Jamie’s mum, the counselor, Mr. Cummings and me – retired to a local bar, and shared stories of what Jamie had meant to us.

Memories

We all felt we were to blame. That we’d let Jamie down.

It was Jamie’s mother who spoke to try and ease our guilts.

“Jamie wouldn’t want you – want us – to feel responsible. Every one of us tried. God knows, I tried more than any mother might think is enough. But it wasn’t to be. It never would have been.

“My laddie was never the same after Iraq. I’m not blaming the war; I’m just saying he came back a different person than he went. He simply lost hope about the things he thought was right.

“So, mourn him, but don’t feel responsible for him. He once said to me, ‘Ma, you need hope to live life, and that hope comes from the inside. My hope is long gone – but that doesn’t mean it won’t come back. It will for me – just you watch.’”

Her words tapered off, and Lisa hugged her tight.

We sat another hour or so. Laughing, crying, sometimes just sitting in silence and wistfully looking nowhere in particular.

Then we hugged, and went our separate ways.

Where the Sunshine Slows

I was reminded of Jamie the other night, when I was flicking through YouTube and caught a performance of Drugs or Me, by Jimmy Eat World.

They’ve been one of my favourite bands ever since their second album Clarity, and they remain so today.

As I listened to the lyrics, it brought everything about Jamie back.

His smile. His friendship. His infectious laughter. Him.

As the memories mixed with tears, the song came to an end. And, much like Jamie’s life, it was a perfect close.

Keep my heart,
Somewhere drugs don’t go,
Where the sunshine slows,
Always keep me close.

Jamie’s gone and, despite his mum’s words, I’ll always feel that I let him down.

Letting him walk out the flat we roomed together instead of making him stay and helping him fight the fight he didn’t want to have.

Maybe I could have helped. Maybe not.

Others who have lost friends and loved ones to addiction say blame is a natural emotion, and one we’ll always feel.

Doesn’t mean it’s right. Usually it’s not. But it remains natural to blame ourselves.

The truth is, Jamie lost hope. When we lose that, there’s little anyone can do to make things better.

What we can do is keep their memory alive, and remember the parts of their lives that weren’t tainted by the broken parts.

Somewhere where the sunshine slows, and we keep them close.

Hope Comes From the Inside originally appeared on Danny Brown – – all rights reserved.

Powered by WPeMatico

Design Principles: Compositional Flow And Rhythm

When someone lands on a page of your site what do you want that person to do? Where do you want them to look? What information do you want your visitors to notice and in what order?

Ideally, you want people to see your most important information first and your next most important information second. You want potential customers to see the copy that will convince them to buy before they see the “Buy Now” button. You want people to be presented with the right information at the right time, and one way to do that is to control the flow of your composition1.

Compositional flow determines how the eye is led through a design: where it looks first, where it looks next, where the eye pauses, and how long it stays.

Note: This is the sixth post in a series on design principles. You can find the first five posts in the series here:

Design Patterns: Flow In The Absence Of Design

A couple of articles back in this series I talked about visual direction7 and I mentioned Rudolph Arnheim’s structural net. You should read that post for details, but the general idea is that in a rectangular canvas the center and the four corners of the canvas act as magnets to pull the eye. Along with these natural focal points, there are axes running between them and your eye moves along them from focal point to focal point.

Arnheim’s structural net is not the only pattern that suggests where and how the eye naturally moves through a composition. The Gutenberg diagram, the F-pattern layout, and Z-pattern layout all suggest how a viewer’s eye will move and they assume a natural flow to a design.

Note: These patterns are described for languages that are read left to right. Adjust for other reading directions.

The Gutenberg diagram8
The Gutenberg diagram. (View large version9)
  • Gutenberg diagram: In this pattern the eye generally sweeps from the top-left to the bottom-right, passing through Arnheim’s optical center. Less attention is paid to the other corners which are called fallow areas. Since the eye movesto the right as it moves down, the top-right corner is a strong fallow area, while the bottom-left corner is mostly ignored.
  • F-pattern layout: In this pattern the eye starts in the top-left and moves across the page to the right before moving down a little and repeating the movement across the page. The general pattern follows the shape of the letter F.
  • Z-pattern layout: The eye starts in the top-left and moves right. At the top-right corner it moves down and to the left in a diagonal before moving once again to the right. Overall it follows the shape of the letter Z and repeats the pattern down the page until it reaches the bottom-right.

I’m sure you’ve seen eye tracking studies and discussions of the above patterns before. What rarely gets mentioned is how these patterns describe text-heavy pages10. They describe how our eye moves through columns of text.

The F-pattern is often mentioned in combination with search results pages. Why is that? It’s because search results pages are text-heavy pages presented as lists of bite-sized information to scan. An F-pattern is a natural way to scan these pages.

Reading patterns on text-heavy and design-light pages often follow an F or Z path11
Reading patterns on text-heavy and design-light pages often follow an F or Z path. (View large version12)

Add hierarchy, direction, movement and rhythm, and the flow through your design won’t follow the patterns above. The patterns fall away in the presence of design.

They’re still useful because you can take advantage of the patterns and place important information where the eye would naturally fall to increase the visual prominence of the information. You can take advantage of these natural patterns, but do understand they describe text-heavy pages only.

A viewer’s eye will move through a composition in some way regardless of whether or not you control the movement. You might as well control the movement.

Compositional Flow

You might have seen the word “storytelling” appear more and more often in discussions about design and conversion optimization. Compositional flow can help you tell your story by presenting information in the right order.

Flow is about movement and direction, and leading the eye from one part of a composition to another in the direction you want it to move. You create flow through a combination of visual weight and visual direction.

Elements of greater visual weight (focal points) pull the eye and become resting places. Other elements impart direction and move your eye from one point to another through visual cues such as arrows and lines.

Flow starts with your dominant element, which should be the entry point into your composition. From there you provide directional cues for the eye to follow through your design.

The most obvious directional cue is an arrow pointing at something. An image of a face looking in one direction is another strong and easy directional cue. Others include.

  • Repetition of elements
  • Rhythm
  • Implied action
  • Diagonal lines
  • Gestural lines
  • Directional lines
  • Perspective
  • Subject matter of elements
  • Gradation

You’ll notice lines feature in the list above. Showing direction is one of the primary characteristics of lines. Lines can also be used to cut off motion in one direction by being perpendicular to that motion. When this happens they act as barriers, stopping or possibly reversing the path the eye was following.

Create direction and movement through the items mentioned above. Add elements that serve as barriers to change the direction the eye is moving. Create open paths in empty space to allow easy movement through and between your positive design elements.

Flow And Harmony

On a micro level you want the path the eye follows to align well with whatever action you want someone to take. For example, it makes sense to place the button to search after the form field, because the natural process is to fill in the field and then click the button. Placing the button first would move your visitor in one direction until the end, when they have to move all the way back to the start.

Two search forms illustrating inconsistent and consistent compositional flow.13
Compositional flow in search forms. (View large version14)

It makes more sense to have arrows point to the thing you want someone to look at instead of away from that thing. You’re creating flow even when the arrows point away, but not a flow that makes any sense to achieve the goals of the site.

An arrow pointing away from text, creating inconsistent flow; and an arrowing pointing toward text, creating consistent flow.15
Arrows should point where you want the eye to look. (View large version16)

Movement

Movement is closely related to direction. Motion implies a direction and direction implies movement. If you want someone to look to the right, one way is to have something on the page move to the right. The eye will follow it.

There are several types of movement.

  • Literal (physical) movement: occurs when some physical activity is present.
  • Static movement: occurs when the eye jumps around from point to point in the hierarchy.
  • Compositional movement: occurs when design elements lead the viewer’s eye from one point to another through a composition.

Animation can be used to create literal movement on the page. Dominance, focal points and hierarchy create static movement. When elements that impart direction and movement are added between focal points you create compositional flow.

The same list of directional cues I presented earlier are used to show movement through a composition.

Rhythm

Rhythm can help control the pace of flow in a composition; it’s patterned movement. Rhythmic patterns are built from elements and the intervals between them, and just as your ear will follow along with the rhythm of a song, your eye will follow rhythm created visually.

A pattern and a rhythm will exist as soon as you add multiple elements to the page. Two of anything implies a structure. It’s going to be there no matter what you do so, again, you should learn to control it.

Repetition creates flow and rhythm through the repeated elements. When the eye sees a red circle it notices other red circles in the composition and seeks to establish a pattern. In addition to repetition you can use alternation and gradation to create rhythm.

  • Repetition: creates patterns through predictability.
  • Alternation: creates patterns through contrasting pairs.
  • Gradation: creates patterns through a progression of regular steps.

Rhythm is created both through the elements the eye follows and the intervals between them. Changes to either alter the pattern. Variations in the pattern add interest. Emphasis of something in the pattern can break the rhythm and pause the flow momentarily.

There are three primary types of rhythm:

  • Regular rhythm: occurs when the intervals between elements are predictable, or the elements themselves are similar in size and length. Placing repeating elements at regular intervals would be an example.
  • Flowing rhythm: occurs when the elements or intervals are organic. This creates natural patterns that evoke a feeling of organic movement. Stripes on a tiger or zebra are good examples.
  • Progressive rhythm: occurs when the sequence of forms or shapes is shown through progressive steps. Some characteristics of elements might have stepped changes, or the interval might have stepped changes. This gradual increase or decrease in sequence creates movement. A color gradient is a good example.
A field of flowers exhibits a flowing rhythm17
A field of flowers exhibits a flowing rhythm. (View large version18)

Any of the above types of rhythm can be used to create movement and compositional flow. Which you would choose depends on the specifics of your design: if the design is trying to communicate consistency, a regular rhythm is probably best; if the design is trying to communicate something more natural and organic, a flowing rhythm would likely be preferred.

Flow And Gestalt

The further along we get in this series, the more gestalt principles contribute to the design principles we’re looking at.

Dominance and focal points create areas in your design that pull the eye. Similarity and contrast are used to create pattern and rhythm.

All the gestalt principles that connect or show commonality among elements will help lead the eye from one element in the group to the others.

Uniform connectedness leads the eye through the thing that connects the elements. Elements with a common fate appear to move in the same direction carrying the eye along with them. The principle of continuation is specifically about continuing to move in one direction.

Examples

Let’s take a look at screenshots from a few sites and think about how their designs flow and move, and what kind of rhythm they might have.

As I’ve mentioned previously in the series, this is my opinion. You might look at these same screenshots and see a different flow and rhythm than I do. That’s fine. It’s more important for both of us to think critically about the designs we see than it is for us to agree about what we think.

Dorigati

When I look at the Dorigati home page19 my eye is quickly drawn to the hero image of wine barrels at the top of the page. It doesn’t take long to be pulled from here to focal points like the site logo and the image of the wine bottle to the right.

Screenshot of the Dorigati.it home page20
Screenshot of the Dorigati.it home page. (View large version21)

There’s a strong implied diagonal flow between the logo and bottle, and your eye likely flows back and forth between them. Think how quickly that connects the company name with the products the site offers.

The curve at the bottom of the logo appears to point downward leading your eye to the name of the wine being presented. Notice that the heading to the left and the name of the wine are the same blue and similar to the blue in the logo. The repetition of color creates a rhythm and flow through all three items.

The rhythm of color is used again with the gold headings down the page and the decorative flourishes to the left. A similar color is used for the dates. While the interval can vary depending on the length of the text in each entry, it’s fairly predictable and a regular rhythm.

The wine bottle also serves to connect the header with the main content, creating a vertical flow through the hero image and serving as a bridge across it. Without the image of the wine bottle it requires more effort for your eye to cross the horizontal lines that create barriers to movement.

Dress Responsively

There’s a strong horizontal flow at the top of the Dress Responsively home page22. The navigation and text both lead your eye horizontally and make it very easy to scan left and right across the header.

Screenshot from the home page of the Dress Responsively website23
Screenshot from the home page of the Dress Responsively website. (View large version24)

My eye tends to start with the “YOU DECIDE” text and easily moves right and left where it can take in the logo, navigation, and the remaining text in the header.

Notice at the end of “YOU DECIDE” your eye is also pulled down. There’s a repetition of rectangular and orange shapes that creates a vertical rhythm. The shape of the “WTH?” button is echoed in the mostly rectangular “548 votes” shape and the “SEE DETAILS” button below the text. This vertical flow is strengthened by a strong vertical line that’s created by aligning the left edge of these shapes with the text between them.

The orange color repeats itself as text in both the header and also further down the page (not shown in the screenshot). Having encountered the color repetition at the top of the page, your eye follows it down the page increasing the vertical flow.

Incredible Types

The header of the Incredible Types home page25 also has a horizontal flow due to the shape of the lines and block of text. The light grid lines create a subtle pull down and also create a regular rhythm horizontally across the page.

Screenshot from the home page of the Incredible Types website26
Screenshot from the home page of the Incredible Types website. (View large version27)

Below the header is a grid of images. Notice how the gutters (both horizontal and vertical) between images provide a channel for your eye to move through. They help your eye flow from image to image in either direction. They also create a regular rhythm in both directions.

Screenshot of the footer from the home page of the Incredible Types website28
Screenshot of the footer from the home page of the Incredible Types website. (View large version29)

In the footer, text is grouped into two rows and four columns once again creating both horizontal and vertical flow and rhythm. I think the horizontal flow stronger than the vertical and so my eye tends to move left and right more than up and down, but the flow exists in both directions.

Love & Luxe

The Events page on the Love &Luxe site30 is another design that shows both horizontal and vertical flow.

Screenshot from an interior page of the Love & Luxe website31
Screenshot from an interior page of the Love & Luxe website. (View large version32)

The pink in the left column draws my eye and creates vertical flow through its shape. Note how the site name is rotated so it too creates a vertical flow. The contrast in color with the menu next to it creates a strong vertical line where the two meet.

The text at the bottom of this column repeats, creating a vertical rhythm as you read one block then the one below it. However, the horizontal nature of the lines changes the flow to horizontal and moves your eye to the right.

The dark background behind the current menu items creates an even stronger horizontal flow because your eye is drawn to the contrast. The triangle it displays at its top-right corner points to the right.

On the right, in the main content, the color and size of the dates creates a regular vertical rhythm through repetition. The screenshot only shows two of these, but they continue further down the page. The pink headlines work to reinforce the rhythm created by the repeating blue dates.

The horizontal lines between each entry stop the vertical flow momentarily, keeping you in each entry a little longer. The rhythm of the repeating colors in the dates and headlines pulls you further down the page once you’re ready to cross the horizontal line and move to another entry.

The images naturally change with each entry, but the one in this screenshot directs your eye down and to the left diagonally.

Summary

You have a lot of control over where people look when they’re viewing a webpage you’ve designed. On a text-heavy and graphic-light page, a visitor’s eye likely follows something like a Z-pattern or F-pattern across and down the page.

However, as soon as you design page elements and add graphics, those patterns no longer apply. Your visitor’s eye will follow the flow, movement and rhythm you create.

Think about the priority of the information you’re communicating. Think if it would be more useful when seen in a specific order. Think about where on the page you want someone to look first, second, and third.

Then create visual cues to lead them through the page in the order you think best. Add a line for someone to follow, or create one by aligning various elements. Repeat a color or text size to create a rhythm for the eye to follow. Present images of moving objects to direct the eye.

Don’t leave it to a default pattern to lead your visitor’s eye. Create compositional flow through the page and lead them yourself.

There’s one last topic I want to share with you in this series on design principles, and that’s balance. I’ll talk about compositional balance in general and then walk you through the four different types of balance (symmetrical, asymmetrical, radial and mosaic) you can create.

Additional Resources

(og, ml)

Footnotes

  1. 1 http://www.vanseodesign.com/web-design/direct-the-eye/
  2. 2 http://www.smashingmagazine.com/2014/03/28/design-principles-visual-perception-and-the-principles-of-gestalt/
  3. 3 http://www.smashingmagazine.com/2014/05/16/design-principles-space-figure-ground-relationship/
  4. 4 http://www.smashingmagazine.com/2014/09/22/design-principles-connecting-and-separating-elements-through-contrast-and-similarity/
  5. 5 http://www.smashingmagazine.com/2014/12/12/design-principles-visual-weight-direction/
  6. 6 http://www.smashingmagazine.com/2015/02/27/design-principles-dominance-focal-points-hierarchy/
  7. 7 http://www.smashingmagazine.com/2014/12/12/design-principles-visual-weight-direction/
  8. 8 http://www.smashingmagazine.com/wp-content/uploads/2015/03/gutenberg-diagram-opt.png
  9. 9 http://www.smashingmagazine.com/wp-content/uploads/2015/03/gutenberg-diagram-opt.png
  10. 10 http://www.vanseodesign.com/web-design/3-design-layouts/
  11. 11 http://www.smashingmagazine.com/wp-content/uploads/2015/03/f-pattern-z-pattern-opt.png
  12. 12 http://www.smashingmagazine.com/wp-content/uploads/2015/03/f-pattern-z-pattern-opt.png
  13. 13 http://www.smashingmagazine.com/wp-content/uploads/2015/03/01-search-forms-opt.png
  14. 14 http://www.smashingmagazine.com/wp-content/uploads/2015/03/01-search-forms-opt.png
  15. 15 http://www.smashingmagazine.com/wp-content/uploads/2015/03/02-arrows-opt.png
  16. 16 http://www.smashingmagazine.com/wp-content/uploads/2015/03/02-arrows-opt.png
  17. 17 http://www.smashingmagazine.com/wp-content/uploads/2015/03/flowers-opt.jpg
  18. 18 http://www.smashingmagazine.com/wp-content/uploads/2015/03/flowers-opt.jpg
  19. 19 http://dorigati.it
  20. 20 http://www.smashingmagazine.com/wp-content/uploads/2015/03/dorigati-opt.jpg
  21. 21 http://www.smashingmagazine.com/wp-content/uploads/2015/03/dorigati-opt.jpg
  22. 22 http://dressresponsively.com
  23. 23 http://www.smashingmagazine.com/wp-content/uploads/2015/03/dressresponsively.com-opt.jpg
  24. 24 http://www.smashingmagazine.com/wp-content/uploads/2015/03/dressresponsively.com-opt.jpg
  25. 25 http://incredibletypes.com/
  26. 26 http://www.smashingmagazine.com/wp-content/uploads/2015/03/incredibletypes-footer-opt.png
  27. 27 http://www.smashingmagazine.com/wp-content/uploads/2015/03/incredibletypes-footer-opt.png
  28. 28 http://www.smashingmagazine.com/wp-content/uploads/2015/03/incredibletypes-footer-opt.png
  29. 29
  30. 30 http://loveandluxesf.com/events/
  31. 31 http://www.smashingmagazine.com/wp-content/uploads/2015/03/loveandluxe-opt.jpg
  32. 32 http://www.smashingmagazine.com/wp-content/uploads/2015/03/loveandluxe-opt.jpg
  33. 33 http://speckyboy.com/2010/06/18/how-to-control-flow-within-your-web-designs/%0A
  34. 34 http://www.vanseodesign.com/web-design/does-your-design-flow/
  35. 35 http://moz.com/blog/eye-tracking-in-2014-how-users-view-and-interact-with-todays-google-serps
  36. 36 http://www.leancrew.com/all-this/2014/04/the-wrong-sided-arrow-in-1password/
  37. 37 http://3.7designs.co/blog/2009/01/the-gutenburg-diagram-in-design/
  38. 38 http://www.nngroup.com/articles/f-shaped-pattern-reading-web-content/
  39. 39 http://webdesign.tutsplus.com/articles/understanding-the-f-layout-in-web-design–webdesign-687
  40. 40 http://webdesign.tutsplus.com/articles/understanding-the-z-layout-in-web-design–webdesign-28

The post Design Principles: Compositional Flow And Rhythm appeared first on Smashing Magazine.

Design Principles: Compositional Flow And Rhythm
http://www.smashingmagazine.com/2015/04/29/design-principles-compositional-flow-and-rhythm/
http://www.smashingmagazine.com/feed/?#
Smashing Magazine
For Professional Web Designers and Developers

Powered by WPeMatico

The State Of Airline Websites 2015: Lessons Learned


  

With this article, we start exploring various industries and study the current state of front-end, UX and performance of relatively complex websites. First up are airline websites. Some sections of the article were written by the editorial team. We’d love to hear your flights booking experience in the comments to this article! — Ed.

Zurich Air prompt a little pop-up if they assume that you are about to abandon the purchase.

From my home in Phoenix, Arizona, the entire world is only a few clicks away. I’ve booked flights to St. Louis, San Francisco, Honolulu, New York, London, Melbourne, Entebbe and beyond. Sometimes I’ll land in one location, travel around and leave from another. Sometimes I’ll switch or cancel a flight, and sometimes the weather does that for me. Regardless, I always get to where I want to go, and fantastic technology is in place to help me every step of the way.

The post The State Of Airline Websites 2015: Lessons Learned appeared first on Smashing Magazine.

Powered by WPeMatico

How to Create a Small Business Website on Site123

Having a website is crucial for every business regardless of its size – from tiny to ”ginourmous” (gigantic + enormous), everyone needs to have an online presence and corroborate it with a website. Still, many companies and organizations do not have a website yet. If you are among those, here you will learn how to make a website with advanced features in very simple steps. Most people think it is hard to put together a nice website, work on SEO and manage a business altogether. It is in fact very easy and with the right tools you will be able to tweak your website and make it appear on Google and other search engines.  You can get it ready just the way you need it. Imagine if you could easily work on your SEO settings easily and even get a sitemap to rank you higher on search engines like this: That would be amazing, wouldn’t it? You can take full advantage of this and other tools available on the free website builder we will be working with today. Now picture yourself with access to the most beautiful design patterns to promote your brand. You can take advantage of sophisticated options available among the many possibilities you have: It does not seem that hard now, does it? It is just a matter of being at the right place at the right time. Before we take you there, let’s talk about a few aspects of a functional website. There is no meaning in having a website if the website has no meaning. So what is really important when it comes to a website? Must Haves – The Essential Parts of a Modern Website There are a few things that are really indispensable if you want a website that is up to date and provides great user experience. Here are a few of them: ­ Responsive design: It is so much better when we go on a website and find everything we are looking for. We like to pass the mouse over something and seeing it changing its color as we feel the website is responding to our actions. Your website should be just the same. You can easily change a color or two and make your website responsive to your visitors. This will make them “feel at home” on your website and this will enhance your brand recognition....

The post How to Create a Small Business Website on Site123 appeared first on 85ideas.com.

Efficient Responsive Design Process


  

What’s your responsive design process like? Do you feel that it’s efficient? The following article is an excerpt from Ben Callahan’s chapter “Responsive Process,” first published in the Smashing Book 5 (table of contents). We’ve collected some useful techniques and practices from real-life responsive projects in the book — and you can get your hard copy or grab the eBook today. You will not be disappointed, you know. —Ed.

Responsive Process

“The successful respondent to this RFP will provide three static design options for our team to evaluate.” I’ve never been a huge fan of taking a multi-option design approach, but I get it — sometimes a client needs this. “Each of these options will provide design for three unique layouts: home page, listing page, detail page.” All right. Now, we’re up to nine static design files. This is getting a bit out of hand.

The post Efficient Responsive Design Process appeared first on Smashing Magazine.

Powered by WPeMatico

It’s Just Like Blowing Whisky Out Your Arse

Hot

Whenever people say to me, “Wouldn’t it be great to drop everything and just go on an adventure?”, I always wonder what kind of adventure they mean.

Depending on how old you are, an adventure can suggest a myriad of things.

For young kids, an adventure could be as simple as a trip to the zoo for the first time. Or it could be a camping trip.

For older kids, an adventure could be the first time away from home on a school trip. Or it could be sneaking into a movie above their age rating.

For adults, an adventure could be role-playing with your partner. Or it could be as simple as trying something new, like naked pottery.

(I’m not even sure there is such a thing, but I’d imagine it’d be quite the adventure if there is)

The point is, the word adventure means so many things to so many people, that it’s hard to say, “Yes!” when asked the question at the start of this post.

After all, what if your take on adventure is a world away from mine (and vice versa)? It wouldn’t be an adventure as much as it’d be an experiment in keeping a calm demeanour.

But perhaps we’re asking the wrong question – perhaps, instead of an adventure, we should be approaching it in a completely different way.

The Ineffectiveness of Suggestion

I get it. The allure of dropping everything to do something adventurous and wild is appealing. But is it really?

How many times has someone said  to you, “My life is so boring. I wish it was more adventurous/fulfilling/exciting” (delete where applicable)?

I’m going to hazard a guess a few times. Let’s face it, we all do it and we all hear it.

If it’s not us complaining, we’re the recipients of someone else in the complaining hat.

That’s natural. No-one has the perfect life. No-one.

Sure, some lives might look perfect, but you only have to look at the sadness of those who appear to have a perfect life to know that nothing is what it seems.

So when someone says to us, “Let’s drop everything and have an adventure!”, we smile, and wish, and dream – because for a small moment in time, we can forget the imperfect life we lead.

But it’s an empty suggestion – because more often than not, that’s all it turns out to be.

A suggestion.

Something we’ll smile and validate with a nod – but the nod is the only action we’ll take.

Instead, we continue with our lives, and the adventure dies another inglorious death.

Try Blowing Whisky From Your Arse

Now, before I continue, I just want to lead with the caveat that I have never – at least to the best of my recollection – blown whisky from my arse.

There have been times after a night of whisky that I’ve felt I could fire some straight from my arse, but that’s something different altogether.

That’s beside the point, though. The real point is, if we truly want to have an adventure, we need to make it a real adventure.

We need to feel the thrill of something so real, something so alive, that we will never forget it in a lifetime of forgotten memories.

We need to feel. 

It doesn’t have to be ridiculous, either.

  • Kiss your wife/husband/partner like the first time you felt the heat, the one that’s still there, it’s just on mute;
  • Buy the stupidest winter hat and wear it with a “Fuck yeah!” smile, and own that piece of stupid wool right there;
  • Get shit-faced and then record yourself on your phone camera, and plant the honest seeds of who you want to be if no-one was to stop you.

None of these are unattainable. None of these are too far a bridge to cross. None of these are super outrageous.

But, much like blowing whisky out your arse is sure to make you feel alive, so can these and others like them.

And if they help you find the next adventure that you really want to go on… wouldn’t that be a trip?

It’s Just Like Blowing Whisky Out Your Arse originally appeared on Danny Brown – – all rights reserved.

Powered by WPeMatico

Perhaps Tomorrow

Uniqueness

Homeward bound, to the clackety — clack of the track. Strangers all around, though not by sight. Tired eyes, looking for the landmarks that signal home.

The windows beckon, offering stolen glances of a landscape we knew much better in the light of half a day ago.

Muted notes from bands we’ll never know, headphones offering solace from the silence that engulfs.

Stolen glances. Untold stories. Lives crisscrossing, yet not.

The city lights near. The shuffled gait begins. Together we move, but as individuals.

Disembark and depart. The white lined boxes empty one by one, until as barren as the opportunity to connect.

Home. Sanctuary. Familiarity. Warmth.

At least for some.

Perhaps tomorrow we’ll learn another’s life. Perhaps tomorrow we’ll offer up a smile. Perhaps tomorrow we’ll unburden the burdened.

Tomorrow’s another day, after all. No need to change today what can wait until tomorrow.

It’s not like tomorrow will never come, after all.

Yes, perhaps tomorrow.

The post Perhaps Tomorrow appeared first on Danny Brown – all rights reserved.

Powered by WPeMatico