Category: Design

What if the graphic design hue was adjustable in production?

In my current project, I needed to come up with a way to visually differentiate subdomain accounts. Adding rich theming support didn't make sense since:

  • End users are not responsible for the site design and hiring a graphic designer is low priority
  • The web application is for automating a workflow as much as possible. Less options and configuration means less maintenance and manual intervention

In order to meet these guidelines, I wondered about the possibility of asking end users to choose just one site color. Could the web application do something meaningful and seamlessly with that single choice?

Game Plan

Every time one of the stylesheets is linked to in the view:

  • open up the stylesheet
  • find all RGB color values and convert to match the requested color
  • save stylesheet to a cache directory

We'll be using the HSL color model. It breaks down a color into three components: hue, saturation, and lightness. Hue is what we're interested in. By shifting only a color's hue, we can, for instance, turn a red color to yellow without breaking the design legibility or contrast.

Conveniently, CSS3 allows us to adjust the hue by specifying an angle in degrees on a color wheel where red is both 0 and 360. Using this method, we only need to do basic substitution without any math conversions.

The bad news is HSL color values are not supported by older browsers or Internet Explorer 8. It is reassuring that modern versions of the other major web browsers (Safari, Firefox, Opera, and Chrome) do support the HSL model but we'll have to play the waiting game for legacy browsers to go out of use. To be safe, our color values will start off and end up as RGB values.

Finally, once we convert the stylesheets, we'll need to cache them somewhere. I'm storing them in #{Rails.root}/public/stylesheets/hue#{hue_value} because:

  • reuse: it is possible for several subdomain accounts to share the same hue value
  • it'll be served as a static file by Apache
  • free cache sweeping: upon deployment via Capistrano, old cached files are not carried over

Implementation Limitations

The colors in my stylesheets are RGB hex strings such as #1234AA and #123. There is no support for color names like 'red' in my implementation since I don't use them.

Another consideration are the graphic design constraints. Since only a dominate hue is allowed, image usage should be minimized or you'll have to worry about image conversions (not covered in this tutorial). Shoot for a minimalist design with blocks of solid color.

Implementation

install the Color gem. It is used to handle our color model and hue conversions.

# config/environment.rb config.gem 'color', :version => '1.4.0' rake gems:install

We're going to add several methods into ActionView::Helpers::AssetTagHelper. First, use alias_method_chain() to append our manipulation logic to run just before the original stylesheet_link_tag().

def stylesheet_link_tag_with_hue(*sources) options = sources.extract_options! sources.map! do |stylesheet_path| if stylesheet_path.starts_with?('/') || stylesheet_path.starts_with?('http') stylesheet_path else stylesheet_path = stylesheet_path + '.css' if File.extname(stylesheet_path) == '' ensure_stylesheet_for_hue(HUE, stylesheet_path) "hue/#{HUE}/" + stylesheet_path end end sources << options stylesheet_link_tag_without_hue *sources end alias_method_chain :stylesheet_link_tag, :hue

It'll run through the list of stylesheet sources. If any source is a candidate for hue conversion, ensure_stylesheet_for_hue() is called and the source is prepended with the hue directory path.

Here is where the file operations and hue conversions take place:

def ensure_stylesheet_for_hue(hue, path_suffix) source_path = Rails.root.join('public', 'stylesheets', path_suffix) destination_path = Rails.root.join('public', 'stylesheets', 'hue', hue.to_s, path_suffix) return nil unless File.exist?(source_path) return nil if File.exist?(destination_path) && Rails.env != 'development' File.open(source_path) do |file| output = file.read.gsub(/#([0-9a-f]{6}|[0-9a-f]{3})/i) do color = hsl_color_from_rgb_hex_string($1) color.hue = hue color.html end FileUtils.mkdir_p(File.dirname(destination_path)) File.open(destination_path, 'w') {|output_file| output_file.write(output)} end end

The color library doesn't have a constructor for our RGB color hex strings so we'll add one here.

def hsl_color_from_rgb_hex_string(hex) args = case hex.length when 3: [hex[0,1]*2, hex[1,1]*2, hex[2,1]*2] when 6: [hex[0,2], hex[2,2], hex[4,2]] end args.map! {|arg| arg.to_i(16)} Color::RGB.new(*args).to_hsl end

Results

Overall, I'm satisfied with the functionality. The biggest issue is the connotations we give to various colors and their shadings. For my site, it is hard to select an orange hue since dark orange doesn't look like orange. Also, it's not pink, it's lightish red. Some minor tweaking of saturation and lightness helps to make it work well with all hues though.

Design Ruby on Rails. June 01, 2009 - 10:10AM. 0 Comments

Tutoring Remote Clients

Recently, our team spent a great amount of time tutoring a remote client. In this case, the client needed help understanding the basics for an off the shelf e-commerce package. Our usual channels of communication were not adequate since the client was not web-savvy and was easily confused with our instructions. We had to adapt, re-evaluate our assumptions, and find ways to get the client up to speed. How could we teach the essentials without face to face conferences and without a shared lingua franca? We rejected our usual suspects, tried a few new strategies, and found another one that, in hindsight, could have been very useful in tutoring remote clients.

Screen Sharing

The best solution is to use realtime chat involving a shared desktop. This is as close to a face to face conference as possible.

My preference is iChat screen sharing but not everybody uses Apple computers. a VNC derivative or Windows remote desktop would have been fine too.

Screen sharing is very close to a face to face conference but it does have its problems. The biggest is that the setup could be difficult for non web-savvy clients. Troubleshooting remotely is falling back to square one. Only recommended for clients with a reasonable chance of setting it up or who have lots of patience.

Existing Documentation

Usually, there is documentation for users to study. Have a look around the software website and you'll probably find official manuals and screencasts. Chances are good that a web search will find some great user created tutorials as well. This is a good first step and many times it'll work well to point clients to these resources instead of creating the content yourself.

In our case example, there are plenty of documentation for the software chosen by our client. Sadly, in response to some of the client's questions, references to selected manual pages and 7 minute video tutorials from the original developers were too confusing so we had to look at other solutions.

Phone Conferences, Email, Instant Messenging

Phone calls, email, and instant messenging are lousy for demoing or tutoring purposes. It's not meant for walking through a website or explaining multi-step tasks. However, they're great for answering questions that don't require great detail and if the team and remote client have a shared jargon.

Services such as Skype and Vonage could help keep long distance call costs down while still acting like a regular phone line.

Campfire is a web based instant messaging tool. No worries about setup and it retains chat histories accessible by all members of the team.

Highlighted Screenshots

Our aft-mentioned client was paralyzed and frustrated with the complexity of the website admin panel. The interface was too cluttered and the client was unable to navigate the menu to even begin performing administration tasks. Clarity is the key goal to strive for.

Try highlighting certain page elements to clarify what exactly the client should be concerned with. Another way of looking at it is the opposite: to de-emphasize as much of the non-essentials of a busy screen as much as possible.

Any additional text has immediate context. Consequently, text stays concise by only explaining the significance of the highlight elements. No need to describe page elements beforehand.

I tried a couple of highlighting techniques and the one I like best involves darkening, and thus lowering the contrast, of the entire screenshot. The background still preserves enough prominence such that the client can still figure out detail if desired. Since the page is dark, it is then easy to accentuate the important elements: make it bright and full of contrast.

Here is a screenshot to illustrate how easy it is to recreate the effect in Photoshop. Of course, many variations are possible so experiment until you find something to your liking.

While these screenshots can be made fairly quickly, a whole series of them sucks up precious time. Still, they are effective in getting the message across and can be worth the effort. Because I took into account what the client knowledge level was and customized it to answer questions directly and concisely, the client was able to learn at an accelerated rate.

Desktop Recording

The other day I came across this software called Jing that captures the video of the computer screen while recording from the computer's sound input. It isn't realtime like screen sharing, but is valuable for constructing quick and dirty tutorials that require little or no post processing.

The premise of a streamlined workflow is what sold me on the idea. First, record a demonstration as you would normally present it. Jing will then automatically upload the movie so that it is accessible through the web.

Jing can be configured to automatically upload the movie through FTP to a web accessible directory. If you don't have a web host, they do offer complimentary 2GB webspace accounts at screencasts.com. You can signup for this account during the Jing program installation.

So far, I've created a few test movies and the quality is great. movies are about a megabyte for every 20 seconds but your mileage will vary.

I can't say Jing is perfect though. It doesn't integrate well with the OSX environment with its custom yellow and black theme. Worse, switching to and from some of Jing's dialog boxes is a hassle since they'll disappear and are unrecoverable through the dock or expose. Sometimes application windows are unmovable and are set to appear above all others. Jing needs an interface overhaul.

Another downer is that files are encoded in only .swf format. That's fine for quick throw away movies but is not post processing friendly. Finally, the greatest sin is that Jing crashed too many times to ignore. I wasn't keeping track but it felt like there was a 50% chance it'll crash every time I record. I will need to find a more robust desktop recording software for more involved work.

Despite the negatives, Jing has a clear and productive purpose. I'll keep Jing installed.

Design Web. October 07, 2008 - 03:35PM. 1 Comment

Lasers make anything 100x better.

Laser-printed logo onto a bean seed. Watch it grow with you. Genius method to embed specific values into a brand.

Yiying Lu's portfolio site has lots of other creative designs as well.

Design. September 29, 2008 - 06:56AM. 0 Comments

Finding Inspiration Pre and Post Release - Comments on a Daniel Burka Presentation

I highly recommend listening to the MP3 and following along with the slides of The why and how: UI case studies presentation given at Web Directions North 2008 by Daniel Burka. On the surface, it is an hour presentation fussing over insignificant details but that is what's so great about it. Much of it isn't about aesthetics or graphic design. Instead, the spotlight is on the process of tweaking placement, wording, and prominence. It is about rearranging for clarity and directing user actions processes. It is about intuitiveness; the end users should understand why things are in chronological order or in a threading model. The kind of design, as illustrated in the presentation with Digg and Pownce examples, that exhibits Getting Real.

Daniel Burka's examples are fascinating because he starts off with something entirely acceptable but they are then iterated into something that is clearly better. Better not so that end users bask in awe over it's majesty, but through transparency and clarity in its form. Yet, it is the journey that can provide the direction, incentive, and inspiration that guides design, not just some divine inspiration or foresight.

One of the things that Daniel Burka talks about is his success with using HTML mockups. I whole heartily agree as I found sketching with pen and paper and mockups in photoshop have their place in defining the general form but I'm hard pressed to properly define function in this manner. I don't feel like I'm the only one since I've converted photoshop mockups to webapps, but sometimes would run into issues and ambiguity that the photoshop artist didn't expect. It's not their fault but unless you're working in a webapp or through HTML, you won't be thinking about webapp related issues. So it is refreshing to hear a designer say (loose transcript starting around 35min):

"This is actually a mockup of about eight connected HTML pages a little bit of javascript and CSS files. And so this is something I didn't do with the previous comment system. I went immediately into implementation. So implemented in real code. Which took a lot longer and wasn't as easy to play with because it was half broken most of the time while the code was being written. And so what is happening here is I can play around with if I digg this comment what happens. If I bury it, I can actually change your vote now and if I bury it OK that's what happens. I want to see the comment again after I bury it OK that's what happens. You can hide it. I can report the user. I was playing around with these things and now these interactions I can actually kind of - it's so awkward having a bunch of HTML files interlinked but being able to play around with these interactions means I'm significantly more confident this time that when we release this thing. The flow of when you're playing around and writing comments and editing comments, I got it setup for what happens when you write a comment we open it and save it, you edit it, you save those changes, so all those things I feel much more confident that each of those little processes all fit together alot better, they're alot tighter."

Design is an organic, ongoing and collaborative process and one in which all team members should have a hand in. Here, we have an example of a designer crossing the boundaries and working partly in the realm of the web developer. In the same manner, I would love to cross the boundary in the other direction more often. But too often client project work necessitates design up front for signing off and limiting cost/time resources that prevents creativity and experimentation in the latter stages of the project. In such cases, the webapp's growth is stunted before it has a chance to mature.

Continuous refinements occur alongside continuous inspiration. Daniel Burka shows example after example where he focused and improved on design elements post release despite how sufficient they were already. The lesson: please don't discount the inspiration generated through production use. If given the freedom of multiple iterations, projects will flourish.

I leave you with one last presentation reference about finding design inspiration from within the webpage itself. Remember, form follows function.

(~40min into the presentation): "Like I was saying before with the yellow dig button, is take that idea then take it further. Let it design language breath through the rest of the site. And so the story format has it on the left, I took it to the homepage, so you take this really basic horizontal line, you add one little off center hatch to the page and it adds a sense of brand, a sense of identity to the page. Adds a little drama to the page."
Design Web. June 25, 2008 - 08:02AM. 0 Comments

Revisory Project Reflection



Demo movie [1MB]. Revisory: Summer 2006.

Description

Online discussion space on graphical assets or unpolished concepts through message threads and image manipulation tools. Revisory facilitates non-linear design processes between people in distributed teams to better explore brainstormed ideas.

Development

The primary goal of this project to begin an introductory exploration of various web scripting technologies:

  • Ruby on Rails
  • HTML5 canvas element
  • Prototype and script.aculo.us frameworks
  • Javascript

The initial technical feasibility assessment concluded that the project was not commercially viable. A crucial factor was that the canvas element lacked current and future support by Internet Explorer. However, it was included in the latest version of Firefox, Safari, and Opera at the time. A decision was made to build a simple conceptional tech prototype as a learning experience through a project lifecycle.

Athestics is based on the simplicity of a blank canvas. The low key design encourages quick freeform sketches regardless of artistic ability. With its monochrome nature, the site design should fall back into the background and stand in contrast to the color possibilities of the user generated content.

End Results

Some testing was conducted near the end of this experiment. Revisory was utilized in highlighting the various design considerations given to a dynamic PDF document for review by a client. We found that keeping images updated and in context as per discussion point through appropriate zooming, panning, and highlighting held great value. The web app was relevant when visual communication was desired.

One area needing of improvement is in the generalized drawing tools. Most marks were kept simple to merely augment the existing image. Also, tools do not suggest efficient uses. Instead, future iterations should involve testing for more common behaviors to automate before any additional development starts.


Image used in demo is "More Fun Than Tekken" by Sevenflow and Kultdesign.

Design Ruby on Rails. July 08, 2007 - 09:59AM. 0 Comments