<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title>Intridea - Company Blog</title>
  <id>tag:www.intridea.com,2021:Forming A Design Team, Part II: Process</id>
  <link rel="self" type="application/atom+xml" href="http://www.intridea.com/blog/feed"/>
  <updated>2015-09-25T19:55:23Z</updated>
  <entry xml:base="http://www.intridea.com">
    <author>
      <name>Mike DelGuidice</name>
    </author>
    <id>tag:www.intridea.com,2015-10-06:795</id>
    <published>2015-10-06T00:00:00Z</published>
    <updated>2015-10-06T00:00:00Z</updated>
    <category term="ui"/>
    <category term="teams"/>
    <category term="ux"/>
    <category term="UI"/>
    <link rel="alternate" type="text/html" href="http://www.intridea.com/blog/2015/10/6/forming-a-design-team-part-ii-process"/>
    <title>Forming A Design Team, Part II: Process</title>
    <content type="html">&lt;p&gt;&lt;img src="https://s3.amazonaws.com/intridea.com/blog/header_image.jpg" alt="process"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;Here it is peeps, the second post in our journey to create a killer design team…PROCESS. EEEK,*GASP*...I know, firsthand, that process can be a “dirty”  word, the bane of creation, and something most companies don’t effectively use. But in this post we’re not going to talk about traditional process, the one where X person get’s a job then hands over some requirements to another person and so on and so on. No...no, here we’re going to be talking about the design process, and yes the two go hand in hand and a lot of the same people are involved (or should be), but in this post I’m going to discuss the parts that make a design team stronger, more efficient, and produce better work.&lt;/p&gt;

&lt;p&gt;So where do we start with our design process, especially in the ever changing landscape that is the web? &lt;a href="http://blog.invisionapp.com/author/clark-wimberly/"&gt;Clark Wimberly&lt;/a&gt; from Invision has some great ideas in his post &lt;em&gt;Reimagining The Web Design Process&lt;/em&gt;, most notably is that of an agile team. One that is able to easily adapt to changes, and make rapid adjustments as needed. No longer do we work (and live for that matter) in a world that has static or fixed content, so it’s only right that as a team we should be able to rapidly shift to match this. &lt;/p&gt;

&lt;p&gt;He goes on to say that we need to stop using &lt;strong&gt;mobile first&lt;/strong&gt; as a buzzword and actually start to approach our design process with smaller screens, using an “Atomic” approach, as Brad Frost would say (more on this in a minute). Clark couldn’t be more correct, especially since Google has recently (&lt;a href="http://searchengineland.com/its-official-google-says-more-searches-now-on-mobile-than-on-desktop-220369"&gt;May 5th&lt;/a&gt;) said they are now getting more search queries on mobile than on desktop. &lt;/p&gt;

&lt;p&gt;So, back to that &lt;a href="http://bradfrost.com/blog/post/atomic-web-design/"&gt;Atomic Design&lt;/a&gt; thing...what is it? How does is play into our design process? It’s an amazingly simple, but complex, ideology on how to handle the design and layout of websites. Breaking it down to it’s most basic idea is that you start with a single “brick”, something like a font, or a few color options.Then take those pieces and make a small UI element, like a form or menu, you keep adding small “bricks”, bit by bit, until you’re left with an assembled page. From there it’s rinse, wash, repeat on the other sections of your site. So, how does this work into our process? Quite naturally, by taking our mobile first approach and combining it with this bit by bit assembly we can very quickly and early in the game start to target the areas of our layout that need adjustment, and make the necessary corrections before we’ve gone too far.&lt;/p&gt;

&lt;p&gt;Methodology is just one aspect of the design process, there are actual steps, hence the process part, that should accompany that. What those steps are will vary from team to team, but loosely they should be: planning, research, design/development, iterate. What do these mean though?&lt;/p&gt;

&lt;p&gt;&lt;li&gt;&lt;strong&gt;PLANNING:&lt;/strong&gt; figuring out what the project timeline is, when it starts and ends, when milestones need to be met, etc. This is also the phase when we need to determine who will be involved throughout the project, making sure the right people are brought in at the right time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RESEARCH:&lt;/strong&gt; Make sure that the problem we’re solving is the right one, ask questions WHY, HOW...dig deep to understand the project. Determine who our target is, establish restrictions and needs, to help eliminate questions that may arise later.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DESIGN/DEVELOPMENT(and prototype):&lt;/strong&gt; Start to layout the concept, get ideas down into something more solid. Simultaneously development can begin with prototypes to test ideas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ITERATE:&lt;/strong&gt; Today a design is never truly finished, even after handoff things are bound to come up, so take feedback, comments, etc, and adjust your product to match the needs of it’s users.&lt;/li&gt;&lt;/p&gt;

&lt;p&gt;A good process, much like a good team, needs to be agile in it’s execution. Not every project will have a need for every step nor will it all allow for every step, so it’s ultimately up to your team lead to make sure the right parts are followed at the right time. Remember that establishing or adjusting a current process can’t happen overnight, it’s a gradual shift, much like our Atomic Design theory, an effective design process should be built upon, bit by bit and allow for rapid adjustment.&lt;/br&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;Want to learn more?&lt;/strong&gt; Check out Intridea&amp;#39;s post on &lt;a href="http://www.intridea.com/blog/2015/8/18/building-an-exceptional-design-team-structure"&gt;Forming A Design Team, Part I: Structure&lt;/a&gt; &lt;/p&gt;
</content>
  </entry>
  <entry xml:base="http://www.intridea.com">
    <author>
      <name>Demetri Ganoff</name>
    </author>
    <id>tag:www.intridea.com,2015-09-29:796</id>
    <published>2015-09-29T00:00:00Z</published>
    <updated>2015-09-29T00:00:00Z</updated>
    <category term="javascript"/>
    <category term="code review"/>
    <category term="clean codebase"/>
    <link rel="alternate" type="text/html" href="http://www.intridea.com/blog/2015/9/29/writing-code-for-your-future-self"/>
    <title>Writing Code for Your Future Self</title>
    <content type="html">&lt;p&gt;&lt;img src="https://s3.amazonaws.com/intridea.com/blog/readable.jpg" alt="writingcode"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;One of the greatest things about the web industry is the respect and generosity developers have for one another to share knowledge in this ever-changing atmosphere. Whether you&amp;#39;re on a small or large team, solo coder or open-source hero, arguably the most important pieces of your code aren&amp;#39;t code at all. Commenting and writing readable code can save yourself and teammates valuable time by quickly understanding what your code does without the countless hours you spent carefully crafting the most elegant code imaginable. Even if you&amp;#39;re working alone, readable code can avoid those awkward situations of you having to figure out what genius (spoiler: you) wrote this awfully convoluted code. Other benefits include auto-generated documentation and speedier code reviews. So, next time you write the &amp;quot;one function to rule them all&amp;quot;, take the time to rename it from &lt;code&gt;doesSomething&lt;/code&gt; to &lt;code&gt;addTaxToSubTotal&lt;/code&gt; and comment the hell out of it - your teammates and future self will thank you.&lt;/p&gt;

&lt;h4&gt;What is “Readable” Code?&lt;/h4&gt;

&lt;p&gt;JavaScript: it was the best of languages, it was the worst of languages. Because of JavaScript’s flexible nature, we can sometimes write code that looks very strange and hard to read. Here are a few guidelines you can follow to ensure you are writing readable code:&lt;/p&gt;

&lt;p&gt;&lt;li&gt;&lt;strong&gt;Describe:&lt;/strong&gt; Use descriptive variable and function names, even if they take longer to type. In six month from now, you’ll have a much better chance of understanding what a function does if it’s called &lt;code&gt;getAllCustomerNames&lt;/code&gt; rather than &lt;code&gt;getData&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simplify:&lt;/strong&gt; Don’t over-engineer your logic to the point of unreadable complexity. Saving a few lines of code while giving up readability is not worth it in the long-run.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comment:&lt;/strong&gt; Complex logic is sometimes unavoidable. When it’s not abundantly clear what your code does just by looking at it, comments can lend a helping hand in plain english. Don’t shy away from lots of comments either. Techniques like minification will strip out all comments for production code, so you don’t waste any precious bytes.&lt;/li&gt;&lt;/p&gt;

&lt;h4&gt;Refactoring for Readability&lt;/h4&gt;

&lt;p&gt;Let’s take a look at some code that could use help to make it more readable. Below we have a function that performs some actions on product information. I will refactor the function so that it performs the same actions, but is much easier to maintain and collaborate on.&lt;/p&gt;

&lt;pre&gt;&lt;code class="javascript"&gt;function changeData (data) {
  if (data.price &amp;gt; 100) {
    data.label = &amp;quot;expensive&amp;quot;;
  } else {
    data.label = &amp;quot;cheap&amp;quot;;
  }

  return data;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This function is pretty simple, it takes a data object and sets the &lt;code&gt;label&lt;/code&gt; property to “expensive” if its &lt;code&gt;price&lt;/code&gt; property is greater than 100, otherwise sets it to “cheap”. Although this logic is simple, there are a number of changes that could be made to make this function much easier to read and maintain.&lt;/p&gt;

&lt;p&gt;&lt;li&gt;&lt;strong&gt;Function name:&lt;/strong&gt; “changeData” is not a very descriptive name. Since this function is changing product data in a very specific way, we can name the function as such. This will also help developers understand what the function does when it is called elsewhere in the application.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Function parameters:&lt;/strong&gt; “data” is obviously not descriptive at all. We should rename this to best reflect what piece of data is being brought into the function.
Verbose logic: The &lt;code&gt;if&lt;/code&gt; statement could be simplified into a &lt;code&gt;ternary&lt;/code&gt; statement since there are only two possible outcomes for the &lt;code&gt;label&lt;/code&gt; property.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Commenting:&lt;/strong&gt; We are missing comments for this function, which could provide some great context to the maintainer.&lt;/li&gt;&lt;/p&gt;

&lt;p&gt;Let’s see what the refactored function would look like:&lt;/p&gt;

&lt;pre&gt;&lt;code class="javascript"&gt;function setProductLabel (product) {
  /**
   * Set the Product label based on its price.
   *
   * @param {object} product The Product object to update
   * @param {int} product.price The total price of the Product
   * @param {string} product.label The current label of the Product
   * @return {object} product
   */
  product.label = (product.price &amp;gt; 100) ? &amp;quot;expensive&amp;quot; : &amp;quot;cheap&amp;quot;;

  return product;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;ProTip:&lt;/strong&gt; Put the comment block inside the function so that if you print the function in a console log, the comments print with it.&lt;/p&gt;

&lt;h4&gt;Conclusion&lt;/h4&gt;

&lt;p&gt;Writing clean, readable and well-commented code is a skill that needs to be honed and valued. Many developers overlook this, but it’s really what can set you apart from others in your field. And remember any little bit helps, so use the guidelines above to gradually improve your code today!&lt;/br&gt;&lt;/p&gt;

&lt;p&gt;Any questions, thoughts, ideas? &lt;a href="http://www.twitter.com/intridea"&gt;Let us know&lt;/a&gt;! &lt;/p&gt;
</content>
  </entry>
  <entry xml:base="http://www.intridea.com">
    <author>
      <name>Mike DelGuidice</name>
    </author>
    <id>tag:www.intridea.com,2015-08-18:793</id>
    <published>2015-08-18T00:00:00Z</published>
    <updated>2015-08-18T00:00:00Z</updated>
    <category term="design"/>
    <category term="team development"/>
    <link rel="alternate" type="text/html" href="http://www.intridea.com/blog/2015/8/18/building-an-exceptional-design-team-structure"/>
    <title>Forming A Design Team, Part I: Structure</title>
    <content type="html">&lt;p&gt;&lt;img src="https://s3.amazonaws.com/intridea.com/blog/header_image.jpg" alt="structure"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;For the last eight years, I’ve been doing the design thang, working with companies ranging from a two person team to a large open floor creative group.  Adjusting to these various structures was second nature, and not something I ever gave much thought to until now.&lt;/p&gt;

&lt;p&gt;With the recent merger of our two design teams - Intridea and Mobomo - a unique opportunity to assist in the restructure and building of our teams was brought to the table. I know this isn’t an isolated situation and the process is in no way easy!&lt;/p&gt;

&lt;p&gt;Thus, for the greater of mankind, I will chronicle our journey; the highs, the lows, and everything in between! I’m shooting for a four part series, breaking each post into specific topics: structure, process, tools, and culture.&lt;/p&gt;

&lt;h3&gt;Structure&lt;/h3&gt;

&lt;p&gt;I went bananas scouring articles on best practices, must haves, and shit you never do! Everyone has their own “right way” to structure a team -  some work, most don’t. And while the ways to structure a team are extensive, the golden ticket wasn’t really structure but specific traits that differentiated a successful from a &lt;em&gt;“meh”&lt;/em&gt; team. &lt;/p&gt;

&lt;p&gt;Now, like anything, if you don’t establish a solid platform - that jenga tower is gonna fall! So let’s ask a few questions:
&lt;ol&gt;
&lt;li&gt;What are the key roles?&lt;/li&gt;
&lt;li&gt;What kind of team do you want? Singular focus, multi disciplined, elusive unicorn?&lt;/li&gt;
&lt;li&gt;What is the goal of your team?&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;

&lt;h4&gt;What Are the Key Roles?&lt;/h4&gt;

&lt;p&gt;As mentioned above, I’ve worked in an array of team structures, but what’s been most effective, not only in my career, but in my research, was that of a “traditional” formation. One involving directors at the top, followed by senior leaders who then oversee the junior level folks. Why does this approach work? There’s a funnel, a singular route of communication, and a cascading approach to mentorship.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Directors&lt;/strong&gt; drive their team to ask the tough questions; pushing them to think in a different direction, from a different angle. You know never know if the problem you’re solving is the right one, until you ask “why”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Senior designers&lt;/strong&gt; are your battle hardened troops, the ones who can articulate and defend their position on a specific choice with facts and rationale. They’ll choose right, over right now, and will fight for what’s correct. They’ll also help mentor and develop junior designers, guiding them to make smart choices and back up their own decisions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Junior designers&lt;/strong&gt; will eventually take over the reigns for their senior counterparts, so it’s vital that they learn and develop the key attributes that will make them good mentors one day. Find people with the qualities your company values: hire slowly - fire quickly.&lt;/br&gt;&lt;/p&gt;

&lt;h4&gt;What Kind of Team Do You Want?&lt;/h4&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/intridea.com/blog/support_image_2.jpg" alt="team"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;Now that we’ve figured out who to hire, we need to establish what kind of team we want.  Should our team of designers also know code? Eat and breath exceptional design, and only design? Or should we focus on a strictly UI design team? &lt;/p&gt;

&lt;p&gt;What I’ve seen, and what I’ve read, all seem to point to the same thing, diversity! Find folks who bring different strengths to the table and push one another to do amazing things. Though, I should say, there are some &lt;em&gt;must have&lt;/em&gt; skills each designer needs: 
&lt;li&gt;Be a problem solver, and enjoy it&lt;/li&gt;
&lt;li&gt;Possess a great sense of visual design&lt;/li&gt;
&lt;li&gt;Able to identify great work&lt;/li&gt;
&lt;li&gt;Able to take creative feedback without taking it personally (still a struggle for me)&lt;/li&gt;&lt;/p&gt;

&lt;p&gt;Most of the other attributes can be taught or learned as they progress.&lt;/p&gt;

&lt;h4&gt;What is the Goal of Your Team?&lt;/h4&gt;

&lt;p&gt;Finally, what’s the goal of your team? What are you trying to achieve? For fear of sounding like a cop out, I’d like to revisit this question in the next post. This is a new venture for all of us, and seeing as we don’t really have a team yet, I can’t say what our goal is. I do know that it will involve creating amazing work, with amazing people, but as for concrete and tangible goals: TBD.&lt;/br&gt;&lt;/p&gt;

&lt;p&gt;Got any insight on team restructures? &lt;a href="http://www.twitter.com/intridea"&gt;Let us know&lt;/a&gt;! &lt;/p&gt;
</content>
  </entry>
  <entry xml:base="http://www.intridea.com">
    <author>
      <name>Jeff Pelletier</name>
    </author>
    <id>tag:www.intridea.com,2015-08-11:792</id>
    <published>2015-08-11T00:00:00Z</published>
    <updated>2015-08-11T00:00:00Z</updated>
    <category term="AngularJS"/>
    <category term="ionic"/>
    <category term="ngCordova"/>
    <link rel="alternate" type="text/html" href="http://www.intridea.com/blog/2015/8/11/setup-ngcordova-in-ionic"/>
    <title>Setup ngCordova in Ionic</title>
    <content type="html">&lt;p&gt;&lt;img src="https://s3.amazonaws.com/intridea.com/blog/NGCordova.jpg" alt="ngCordova"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;I’ve previously written about the power of the &lt;a href="http://www.intridea.com/blog/2015/5/19/the-ionic-cli"&gt;Ionic CLI&lt;/a&gt;, which offers some great tools to developers building mobile apps using web technologies. While Ionic offers a CLI and mobile-optimized UI components, it doesn’t handle native level integration, for example accessing a user’s camera, or contacts. Since Ionic is built on top of AngularJS, we can use Angular to access native plugins, and this is where ngCordova comes in.&lt;/p&gt;

&lt;p&gt;ngCordova is a framework that makes the native Cordova API available as AngularJS services. In this post, I’ll walk through setting up ngCordova, and accessing the contacts on a user’s device. First, a few prerequisites. You must have the following installed on your machine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/book/en/v2/Getting-Started-Installing-Git"&gt;Git&lt;/a&gt; (If you want to follow along, or create your own repo)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/"&gt;NodeJS&lt;/a&gt; (Installing NodeJS installs its package manager, NPM)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bower.io/#install-bower"&gt;Bower&lt;/a&gt; (You can use NPM to install both Bower and Ionic)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ionicframework.com/docs/guide/installation.html"&gt;Ionic&lt;/a&gt; (The Ionic install instructions also have you install Cordova)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ve created a &lt;a href="https://github.com/withinsight/ionic-ngcordova-demo"&gt;Git repository&lt;/a&gt; that you can checkout and follow along with, or you can create a new repo and progress through the steps on your own.&lt;/p&gt;

&lt;p&gt;First, you’ll want to create a new Ionic app by running this command in Terminal:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ionic start ionic-ngcordova
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This starts a new Ionic project, in a folder titled “ionic-ngcordova”. That last bit is arbitrary; you can name it whatever you’d like. Also, this will by default use Ionic’s “tabs” app template &lt;a href="http://ionicframework.com/getting-started/"&gt;(there are others, like “blank”, or “sidemenu” available)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Next, a few housecleaning items I tackle with any new Ionic project. In Terminal, change directories (cd ionic-ngcordova) so you’re in the folder Ionic just created, and enable Sass:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ionic setup sass
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Next we’re going to add a few directories to the Git ignore list that shouldn’t be included in our repo. To do this, open the project directory in your favorite text editor. For me, that’s Sublime, so I can open the current directory, with the folder structure visible using:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;subl ./
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With the project open in your text editor, locate the .gitignore file in the root directory. We’re going to add the following lines to the bottom of this file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hooks/
www/css/
www/lib/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The hooks directory includes native Cordova JS that’s managed by Ionic, the www/css directory contains your compiled CSS (generated by Sass), and the www/lib directory is where Bower places all its assets (check out the .bowerrc file in the root directory for more info here).&lt;/p&gt;

&lt;p&gt;With these steps complete, we have a nice clean repo, and you can run the app in a browser or the iOS Simulator via the command line to make sure everything is working:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// Browser 
ionic serve

// OS Simulator 
ionic emulate ios
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now for the fun stuff. Back in Terminal, in the project root, let’s install ngCordova:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;bower install ngCordova --save-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This installs the ngCordova package (specifically, in www/lib/ngCordova), and saves it as a dependency in the bower.json file in the app root (The --save-dev flag, a good habit to get into).&lt;/p&gt;

&lt;p&gt;Back in your text editor, open up the index.html file, located at www/index.html. This is the root HTML file that your app runs on. Now that Bower has placed the ngCordova library in www/lib/ngCordova, we need to reference ngCordova’s JavaScript file in our app’s index.html file. Include this line &lt;a href="https://github.com/withinsight/ionic-ngcordova-demo/commit/a9a80cd1cc9ba235817d1eb066a5ba2ca339f317"&gt;after the line&lt;/a&gt; that includes the bundled Ionic/AngularJS file:&lt;/p&gt;

&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;script src=&amp;quot;lib/ngCordova/dist/ng-cordova.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Next, we need to inject ngCordova as a dependency into our AngularJS app. This is done in the app’s primary JS file, located at www/js/app.js. &lt;a href="https://github.com/withinsight/ionic-ngcordova-demo/commit/4844eda2e774d299ab2a1520057a46780fc45d22"&gt;Following the other default controllers and services injected by Ionic&lt;/a&gt;, add ‘ngCordova’:&lt;/p&gt;

&lt;pre&gt;&lt;code class="js"&gt;angular.module(&amp;#39;starter&amp;#39;, [&amp;#39;ionic&amp;#39;, &amp;#39;starter.controllers&amp;#39;, &amp;#39;starter.services&amp;#39;, &amp;#39;ngCordova&amp;#39;])
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ngCordova is now available to our app, and we can install and start using any of the native Cordova plugins listed in the &lt;a href="http://ngcordova.com/docs/plugins/"&gt;ngCordova docs&lt;/a&gt;. Let’s see how we’d access the user’s contacts using the $cordovaContacts plugin.&lt;/p&gt;

&lt;p&gt;First, we need to install the plugin using Ionic:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ionic plugin add cordova-plugin-contacts
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This installs the Cordova Contacts plugin in the plugins directory in the app root. The ‘ionic plugin add’ command is essentially the same as Cordova’s ‘cordova plugin add’. Check out the &lt;a href="https://cordova.apache.org/docs/en/edge/guide_cli_index.md.html#add-plugin-features"&gt;Cordova docs&lt;/a&gt; for more info here.&lt;/p&gt;

&lt;p&gt;Now that we have our native plugin installed, let’s emulate using the iOS Simulator, also using the livereload feature of Ionic’s CLI:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ionic emulate ios -l
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will launch the app in the iOS Simulator, and reload in real time as you make code changes in your text editor.&lt;/p&gt;

&lt;p&gt;With the app running in the iOS Simulator, we’re only a few steps away from accessing the user’s contacts. First, we need to inject the $cordovaContacts service into the controller where we want to access the contacts from. I think a user would probably access contacts from their Account tab, so let’s open up www/js/controllers.js, and &lt;a href="https://github.com/withinsight/ionic-ngcordova-demo/commit/dc2286d73f6b0d8471b9cd5dc681c870634e27e4"&gt;inject $cordovaContacts into the Account controller&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code class="js"&gt;.controller(&amp;#39;AccountCtrl&amp;#39;, function($scope, $cordovaContacts) {
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With the service available to our controller, we’ll add two buttons that will allow the user to select a single contact, or multiple contacts, respectively. Open up www/templates/tab-account.html, and add this markup &lt;a href="https://github.com/withinsight/ionic-ngcordova-demo/commit/d500a9f442ca0c5ab52317bef2d19dcbf897198a"&gt;following the closing &lt;/ion-list&gt; tag&lt;/a&gt;. This will use the standard &lt;a href="http://ionicframework.com/docs/components/#buttons"&gt;Ionic button markup&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;button class=&amp;quot;button button-positive button-block&amp;quot;&amp;gt;
  Get Contact
&amp;lt;/button&amp;gt;

&amp;lt;button class=&amp;quot;button button-positive button-block&amp;quot;&amp;gt;
  Get Contacts
&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now for the magic. Our last step is setting up a function to be called when the user touches a button, and calling the $cordovaContacts appropriately based on which button they’ve touched.&lt;/p&gt;

&lt;p&gt;First, let’s add the click handlers using Angular’s ng-click directive:&lt;/p&gt;

&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;button class=&amp;quot;button button-positive button-block&amp;quot; ng-click=&amp;quot;getContact()&amp;quot;&amp;gt;
  Get Contact
&amp;lt;/button&amp;gt;

&amp;lt;button class=&amp;quot;button button-positive button-block&amp;quot; ng-click=&amp;quot;getContacts()&amp;quot;&amp;gt;
  Get Contacts
&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;At this point, your app should look like this:&lt;/br&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/intridea.com/blog/ionic-buttons-300.png" alt="ios button"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;Lastly, let’s create the functions in www/js/controllers.js. In the AccountCtrl controller, add the following lines &lt;a href="https://github.com/withinsight/ionic-ngcordova-demo/commit/f14e5cf97d824679acd350e8d34305094dfc149e"&gt;after the $scope.settings object&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code class="js"&gt;$scope.getContact = function() {
    $cordovaContacts.pickContact().then(function(result) {
        console.log(result);
    });
}

$scope.getContacts = function() {
    $cordovaContacts.find({multiple: true}).then(function(result) {
        console.log(result);
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you hit ‘c’ in Terminal, this will enable Ionic’s console logs feature, and you’ll see the contact objects being logged as you touch the buttons. Alternatively, you can launch Safari, then go to Develop &amp;gt; iOS Simulator and visit the full Safari console there.&lt;/p&gt;

&lt;p&gt;You’ll notice that touching the “Get Contact” button launches the native iOS contact picker component:&lt;/br&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/intridea.com/blog/contact-picker-300.png" alt="contact picker"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;The “Get Contacts” button simply grabs all the contacts on the device and dumps them to the console, in all their gory detail. Creepy:&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/intridea.com/blog/console.png" alt="console"&gt;&lt;/p&gt;

&lt;p&gt;While ngCordova is the bridge that allows easy access to Cordova plugins via AngularJS, all the Cordova plugins available have more documentation than is found on the ngCordova site. You’ll notice an “Official Docs” link on each ngCordova docs detail page, which points to the original Apache/Cordova documentation, for example the &lt;a href="https://github.com/apache/cordova-plugin-contacts"&gt;official Cordova Contacts documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Hopefully you can see how in just a few steps, we’re able to setup a new mobile app using Cordova, leverage Ionic’s tools and UI components, and further layer in ngCordova to access Cordova plugins via AngularJS. &lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;Any questions, thoughts, ideas? &lt;a href="http://www.twitter.com/intridea"&gt;Let us know&lt;/a&gt;! &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want to learn more?&lt;/strong&gt; Check out Intridea&amp;#39;s posts on &lt;a href="http://www.intridea.com/blog/2015/5/19/the-ionic-cli"&gt;Ionic CLI&lt;/a&gt; and &lt;a href="http://www.intridea.com/blog/2015/8/04/ionic-experiments-ionic-materials"&gt;Ionic Experiments&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="http://www.intridea.com">
    <author>
      <name>Jeff Pelletier</name>
    </author>
    <id>tag:www.intridea.com,2015-08-04:791</id>
    <published>2015-08-04T01:10:00Z</published>
    <updated>2015-08-04T01:10:00Z</updated>
    <category term="AngularJS"/>
    <category term="polymer"/>
    <category term="ionic"/>
    <link rel="alternate" type="text/html" href="http://www.intridea.com/blog/2015/8/4/ionic-experiments-ionic-materials"/>
    <title>Ionic Experiments: Ionic Material, Angular Material, and Polymer</title>
    <content type="html">&lt;p&gt;&lt;img src="https://s3.amazonaws.com/intridea.com/blog/ionic_experiments.jpg" alt="ionic"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;There’s been a lot of buzz around Google’s Material Design recently, from &lt;a href="http://www.getmdl.io/"&gt;Material Design Lite&lt;/a&gt; (Google’s non-JS implementation of Material Design), to &lt;a href="https://material.angularjs.org/latest/#/"&gt;Angular Material&lt;/a&gt; (Google’s Angular port of the Material Design library), to &lt;a href="http://ionicmaterial.com/"&gt;Ionic Material&lt;/a&gt; (a non-Google project that builds on top of Ionic’s UI), and even Google’s Material Design implementation with &lt;a href="https://elements.polymer-project.org/"&gt;Polymer’s Paper Elements&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Envisioning a scenario where a client has heard of Google’s Material Design, and requests it as the UI basis for a mobile project, I set out to see what would happen when we start to implement some of these new front-end options in an Ionic/Cordova app.&lt;/p&gt;

&lt;h4&gt;Angular Material&lt;/h4&gt;

&lt;p&gt;Angular Material is an implementation of Material Design in AngularJS, that’s supported internally by Google. It provides UI components from the Material Design library as easy-to-implement AngularJS directives, and has a strong focus on accessibility, which is a big concern with AngularJS apps. &lt;/p&gt;

&lt;p&gt;The demos for Angular Material are very well fleshed out, and it looks promising. I was able to integrate into Ionic easily, as both run on AngularJS. I spent almost zero time on CSS, but I was able to achieve comparable results. &lt;/p&gt;

&lt;p&gt;Here’s what the Angular Material md-card directive looks like (Ionic on the left, Angular Material on the right):&lt;/br&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/intridea.com/blog/angular-material-card.png" alt="angular"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;Here’s what it looks like when you swap out the Ionic list directive with the Angular Material list directive:&lt;/br&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/intridea.com/blog/angular-material-list.png" alt="angular"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;I’ve created a &lt;a href="https://github.com/withinsight/ionic-angular-material-demo"&gt;demo repo&lt;/a&gt; if you’d like to see the changes I made, and download, run and play with the implementation yourself.&lt;/p&gt;

&lt;h4&gt;Ionic Material&lt;/h4&gt;

&lt;p&gt;Ionic Material is not maintained by Google, but has some &lt;a href="http://ionicmaterial.com/#preview"&gt;pretty slick demos&lt;/a&gt;. It’s designed to be layered on top of Ionic, and enhance the existing directives, meaning it’s even less of a switch than implementing Angular Material. &lt;/p&gt;

&lt;p&gt;Upon setting it up in the app, I didn’t really have to change much other than adding Ionic Material to the project, and already the “material” design impact is felt:&lt;/br&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/intridea.com/blog/ionic-material-300.png" alt="ionic"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;I’ve also created a &lt;a href="https://github.com/withinsight/ionic-material-demo"&gt;repo showing the implementation of Ionic Material in an Ionic app&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;Polymer&lt;/h4&gt;

&lt;p&gt;Is implementing Polymer in an Ionic app a good idea? Who knows. Probably not. I wanted to see how far I would get before running into issues.&lt;/p&gt;

&lt;p&gt;Implementing Polymer in Ionic was fun, and the bonus here is that you’re using web components which are on track to be standardized in browsers, so you have to love the compatibility forecast. I was able to replace Ionic’s header with Polymer’s &lt;a href="https://elements.polymer-project.org/elements/paper-toolbar?view=demo:demo/index.html"&gt;paper toolbar&lt;/a&gt;, I added Polymer’s &lt;a href="https://elements.polymer-project.org/elements/iron-pages"&gt;iron-pages&lt;/a&gt; and &lt;a href="https://elements.polymer-project.org/elements/paper-tabs?view=demo:demo/index.html"&gt;paper-tabs&lt;/a&gt; in place of Ionic’s tabs, and converted the layout to use the &lt;a href="https://elements.polymer-project.org/elements/paper-scroll-header-panel?view=demo:demo/index.html"&gt;paper-scroll-header-panel&lt;/a&gt; web component. &lt;/p&gt;

&lt;p&gt;This screenshot is taken as the touch animation is firing on one of the tabs:&lt;/br&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/intridea.com/blog/ionic-polymer-300.png" alt="polymer"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;I’ve created a &lt;a href="https://github.com/withinsight/ionic-polymer-demo"&gt;repo for the Ionic Polymer experiment&lt;/a&gt;, so you can check out how that looks locally.&lt;/p&gt;

&lt;h4&gt;Summary&lt;/h4&gt;

&lt;p&gt;Angular Material is currently at 0.10.0, so I ran into components that didn’t work pretty quickly. &lt;a href="https://material.angularjs.org/latest/#/demo/material.components.fabSpeedDial"&gt;That FAB Speed Dial component&lt;/a&gt; sure does look snazzy, though. It’s an internal Google project, so I expect we’ll see a lot coming soon. Since it’s so early in the development, I’m going to put this one on my watch list and kick the tires again once a bit of time has passed.&lt;/p&gt;

&lt;p&gt;Ionic Material is even earlier in its development, currently at a 0.0.1 release. It will probably be the easiest to implement, once its ready. While not an official Google project, this is also one to put on your watch list.&lt;/p&gt;

&lt;p&gt;Polymer starts to clash with AngularJS pretty quickly. For example, I ran into issues with data binding, and I really was just scratching the surface. It’s probably best to implement Polymer as a Cordova app, without Ionic, so you avoid these conflicts. Of course, you also lose a lot of value if you remove Ionic from the equation, so there’s room for discussion, depending on the project.&lt;/p&gt;

&lt;p&gt;Hopefully this has given you some insight into the recent developments surrounding Google’s Material Design library, and how they might fit into your Ionic mobile app development cycles.&lt;/br&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;Any questions, thoughts, ideas? &lt;a href="http://www.twitter.com/intridea"&gt;Let us know&lt;/a&gt;! &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want to learn more?&lt;/strong&gt; Check out Intridea&amp;#39;s post on &lt;a href="http://www.intridea.com/blog/2015/5/19/the-ionic-cli"&gt;Ionic CLI&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="http://www.intridea.com">
    <author>
      <name>Mike Tierney</name>
    </author>
    <id>tag:www.intridea.com,2015-07-28:789</id>
    <published>2015-07-28T00:00:00Z</published>
    <updated>2015-07-28T00:00:00Z</updated>
    <category term="css"/>
    <category term="javascript"/>
    <link rel="alternate" type="text/html" href="http://www.intridea.com/blog/2015/7/28/dont-abandon-css-yet"/>
    <title>Don't Abandon CSS Just Yet</title>
    <content type="html">&lt;p&gt;&lt;img src="http://s3.amazonaws.com/intridea.com/production/posts/featured_images/789/original.jpg" alt="Javascript"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;There&amp;#39;s been a tremendous push in recent months to move all of the components used for building anything for the web in to JavaScript, and only JavaScript (abandoning the use of HTML for templates and CSS for styling). While I can understand how we&amp;#39;ve gotten to this point, I think we&amp;#39;re at risk of ignoring potentially more robust solutions. Rather than build up your application (or site) using a single monolithic JavaScript framework, I implore you to consider something that&amp;#39;s a bit more open-web and future friendly: continuing to build with component-based architecture using all of the current tools available to you, and looking forward to use web components.&lt;/p&gt;

&lt;p&gt;Before we get into why I think component-based architecture is the correct way for now, and web components are the way of the future, let&amp;#39;s explore how we&amp;#39;ve gotten to where we are today.&lt;/p&gt;

&lt;p&gt;It starts out innocently enough: you apply an &lt;code&gt;ng-click&lt;/code&gt; attribute to a link or a button in your template. Then you add a couple of additional lines of markup to handle an if/else pattern to that template (&lt;code&gt;&amp;lt;span ng-if=&amp;quot;truthy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span ng-if=&amp;quot;falsy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/code&gt; seem familiar?). Before you know it, you&amp;#39;re applying ng-mouseover and writing custom directives to handle events specific to your markup.&lt;/p&gt;

&lt;p&gt;Others might be looking at this and decide that it&amp;#39;s lunacy to have all of that written by you, in-line in your template (and they&amp;#39;re probably right -- if you&amp;#39;re adding a lot of logic to your template, you probably need to reconsider what you&amp;#39;re doing and approach the problem from a different angle). It&amp;#39;s difficult to maintain, tightly couples your template to the controller logic behind it, and it&amp;#39;s really not the template&amp;#39;s job to manage complex logic.&lt;/p&gt;

&lt;p&gt;However, rather than refactor to use unobtrusive JavaScript patterns or to extract out difficult logic so it&amp;#39;s not present in the template, there&amp;#39;s a push (primarily from the React project) to build everything up using JavaScript. Your logic (controllers, models, etc), your templates, and even your CSS. The thinking is, for the most part, that if you are doing these complicated decision trees in the code, then it should be handled by something designed to handle said complicated decision making.&lt;/p&gt;

&lt;p&gt;For those who&amp;#39;ve been building websites and applications for long enough, seeing something that looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;div
  onMouseOver=&amp;quot;{() =&amp;gt; this.setState({ hover: true })}
  onMouseLeave=&amp;quot;{() =&amp;gt; this.setState({ hover: false })}&amp;quot;
  style={{borderColor: this.state.hover ? &amp;#39;red&amp;#39; : &amp;#39;transparent&amp;#39; }} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;...should remind you of nightmares of years past. This largely disregards the efforts of &lt;a href="http://www.webstandards.org/"&gt;WASP&lt;/a&gt; (Zeldman, Meyer, Holzschlag, et al) and, more recently, the &lt;a href="http://webstandardssherpa.com/"&gt;Web Standards Sherpa&lt;/a&gt; that lead the charge on making the web more maintainable (proper HTML markup, separation of style, content, and behavior) and &lt;a href="http://futurefriendlyweb.com/"&gt;future friendly&lt;/a&gt;. Additionally, we return to a state where the separation of concerns is being tossed out altogether and we&amp;#39;re being asked to ignore years of learning in the favor or writing everything in JavaScript.&lt;/p&gt;

&lt;p&gt;A typical React component would look something like this:&lt;/p&gt;

&lt;p&gt;&lt;div data-height="300" data-theme-id="16922" data-slug-hash="5d05546a72fa6426f4b2250ccb4ccbf5" data-default-tab="js" data-user="miketierney" class='codepen'&gt;&lt;pre&gt;&lt;code&gt;var buttonBase = {
  padding: 5,
  border: &amp;quot;1px solid #aaa&amp;quot;,
  borderRadius: 5,
  backgroundColor: &amp;quot;#eee&amp;quot;,
};&lt;/p&gt;

&lt;p&gt;var buttonBaseHover = _.defaults({
  backgroundColor: &amp;quot;cyan&amp;quot;,
  borderColor: &amp;quot;magenta&amp;quot;,
  cursor: &amp;quot;pointer&amp;quot;,
}, buttonBase);&lt;/p&gt;

&lt;p&gt;var BasicButton = React.createClass({
  getDefaultProps: function() {
    return {
      type: &amp;quot;button&amp;quot;,
      label: &amp;quot;Click me&amp;quot;,
    };
  },
  getInitialState: function() {
    return {
      isHovering: false,
    };
  },
  propTypes: {
    type: React.PropTypes.string.isRequired,
    label: React.PropTypes.string,
  },
  handleMouseOver: function() {
    this.setState({isHovering: true });
  },
  handleMouseOut: function() {
    this.setState({isHovering: false });
  },
  render: function() {
    return (
      &amp;lt;button
       type={this.props.type}
       style={this.state.isHovering ? buttonBaseHover : buttonBase}
       onMouseOver={this.handleMouseOver}
       onMouseOut={this.handleMouseOut}
      &amp;gt;
        {this.props.label}
      &amp;lt;/button&amp;gt;
    );
  }
});&lt;/p&gt;

&lt;p&gt;React.render(&amp;lt;BasicButton label=&amp;quot;Demo Button&amp;quot; /&amp;gt;, document.getElementById(&amp;#39;container&amp;#39;));&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;See the Pen &lt;a href='http://codepen.io/miketierney/pen/5d05546a72fa6426f4b2250ccb4ccbf5/'&gt;React Button Component&lt;/a&gt; by Mike Tierney (&lt;a href='http://codepen.io/miketierney'&gt;@miketierney&lt;/a&gt;) on &lt;a href='http://codepen.io'&gt;CodePen&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;script async src="//assets.codepen.io/assets/embed/ei.js"&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;While this has the merits of being transportable (one of the better arguments for this style of development), it lends itself to higher maintenance issues. Like the common complaint of CSS, this is the sort of thing that quickly ends up creating bloat - it&amp;#39;s easy to envision a scenario where a &amp;quot;BasicButton1&amp;quot; gets added because a developer is uncertain about making changes to it. While conditionals could be added to the render method, you then have added processing impact on whether or how to render the button. Many developers will make the same mistake here that they do with CSS: &amp;quot;I don&amp;#39;t know where this is used, so I&amp;#39;ll just make a copy of it, modify it, and use that in my implementation.&amp;quot; Both are signs of maintenance issues, and both can be addressed with proper processes and practices (like code reviews).&lt;/p&gt;

&lt;h4&gt;One Tool For All Jobs&lt;/h4&gt;

&lt;p&gt;If we move towards using One Tool For All Jobs (in this instance, JavaScript), we neglect the fact that the tools we&amp;#39;re abandoning are actually quite good at doing what they need to do. CSS does a great many of the things that are related to styles far better than JavaScript and it has the added benefit of being cacheable, leveraging readily available resources (rather than littering your JS scope with event handlers for &lt;em&gt;every&lt;/em&gt; element that needs to support interactivity; that can impact performance pretty heavily), and with proper use of the cascade you can more easily create variant styles as needed (site theming as a whole, for example).&lt;/p&gt;

&lt;p&gt;To handle that hover effect from earlier in the post, you&amp;#39;d need to do this:&lt;/p&gt;

&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;div class=&amp;quot;hover-div&amp;quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code class="css"&gt;.hover-div:hover,
.hover-div:focus {
  border-color: red;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I&amp;#39;ve also added the &lt;code&gt;:focus&lt;/code&gt; pseudo-class so we also have keyboard support. It&amp;#39;d take more than that to add that same support into that inline sample, and you&amp;#39;re providing better support for your users. &lt;code&gt;:focus&lt;/code&gt; is a relatively small thing by itself, but think about the broader implications. A natural byproduct of this is to rebuild native components. As an example, we&amp;#39;re already rebuilding the &lt;a href="https://github.com/angular-ui/ui-select"&gt;select&lt;/a&gt; &lt;a href="https://select2.github.io/"&gt;menu&lt;/a&gt; (because it&amp;#39;s too hard to style natively), and that&amp;#39;s just the start of a slippery slope. This should not be the norm - rebuilding existing browser components and behaviors in pure JavaScript might seem appealing (because you have total control over what it does, more or less), but the overhead of creating it in the first place is inevitably going to be greater than anticipated, and then you have to take into consideration the fact that you now have to maintain that. Furthermore, you now have to accommodate all current and future interaction patterns, UX experiences, and many other OS-level features that users are &lt;em&gt;already familiar with&lt;/em&gt; in order to make your fancy widget not seem out of place. Is it really worth that? Do you &lt;em&gt;really&lt;/em&gt; need (or have) that level of control? Why would you want to abandon future improvements that will roll out as browsers and standards improve? Finally, on this particular point, you&amp;#39;ll also need to factor in support for assistive technologies. Just because you&amp;#39;re building a &amp;quot;web app&amp;quot; doesn&amp;#39;t mean you get a free pass to just ignore those users.&lt;/p&gt;

&lt;p&gt;Many of the proponents of using this all-in-javascript approach are focused solely on making sure that everything is managed locally (as opposed to globally, which is how CSS operates). They neatly solve this &amp;quot;pollution&amp;quot; of the global space by injecting all of the styles directly on the element being styled, which is truly the only way to avoid that issue. However, this comes at a cost -- more complex elements can potentially have a significant number of style selectors (and let&amp;#39;s be honest here, we&amp;#39;re still using CSS whether it&amp;#39;s in the DOM or in a dedicated stylesheet). This leads to greater DOM bloat, and more re-draws of elements within a page when states change, content is updated, or the initial view is rendered. While these things may not impact the immediate load time of the page, there&amp;#39;s an overall &lt;a href="http://www.slideshare.net/nzakas/high-performance-javascript-webdirections-usa-2010#73"&gt;impact on page rendering&lt;/a&gt; because of this. CSS isn&amp;#39;t free of this, certainly, but one advantage of loading those files once is that this is minimized. Additionally, for things like layout and global styles, you &lt;em&gt;want&lt;/em&gt; to have a more global take on things. For re-usable components (buttons, form elements, links) - why make the browser evaluate and render style for every element one at a time when you can pre-load the styles into memory and when a node appears that matches  the selector, the styles will be applied.&lt;/p&gt;

&lt;h4&gt;Component-based Architecture&lt;/h4&gt;

&lt;p&gt;My counter-proposal would be to use one of the better trends we&amp;#39;ve seen lately: component based architecture. Build small to large - much like the members of the React team who are advocating for using CSS in the JavaScript application want to do. This can be done with traditional techniques, however, and diligence to fending off entropy and bad practices. With tools like Sass and Less, we have the ability to create small files that are focused purely on building out a single component, which can then be stitched into the larger application as whole. When building a single page application, we can even start using an approach where our JS, HTML, and CSS all live together in the same directory, to later be concatenated,minified, and then moved into the appropriate locations. With a reasonable application of namespacing in CSS (pick your poison; I&amp;#39;m partial to &lt;a href="https://smacss.com/"&gt;SMACSS&lt;/a&gt;), we can accomplish the same goals - re-usable, easy to maintain, components - without jamming everything in to JavaScript.&lt;/p&gt;

&lt;p&gt;Right now, I think a compromise is a mix of global and local styling. I still think styles added directly to DOM nodes is a mistake (with some exceptions -- an argument can be made for inlining styles on canvas/svg-based charts, for example, and I&amp;#39;m sure there are other situations, but those should be the exception and not the rule). We should think about making our components themable as much as possible, re-using tools that are available to us (the Cascade naturally supports this sort of behavior), and embrace the fact that we &lt;em&gt;never&lt;/em&gt; have 100% control over the way our web-based application will look and behave. There are simply too many variables that are out of our control.&lt;/p&gt;

&lt;p&gt;If you&amp;#39;re concerned that your team is too large and you cannot communicate some of these practices widely, there are plenty of  tools available to look for &lt;a href="https://github.com/addyosmani/grunt-uncss"&gt;unused CSS&lt;/a&gt;, &lt;a href="https://github.com/peterkeating/grunt-csscss"&gt;duplicate CSS&lt;/a&gt;, &lt;a href="https://github.com/gruntjs/grunt-contrib-csslint"&gt;&amp;quot;bad&amp;quot; CSS&lt;/a&gt;, and &lt;a href="https://github.com/CSSLint/csslint/wiki/Rules#performance"&gt;inefficient selectors&lt;/a&gt;. These can be integrated in to your build process or development flow, depending on your preference.&lt;/p&gt;

&lt;p&gt;One final point to make here is that we need to ensure that we are optimizing for our users. When we make the browser do all of the work for us because it makes maintaining a code-base easier, that&amp;#39;s fine up to a point, but we need to be mindful of the overall impact that that has on the experience of the end-user. This also means, rather uncomfortably, that we (as developers) need to embrace that there are a great many things that are out of our control, and we should build our solutions to be as flexible as possible. Otherwise, we&amp;#39;d still just be building it all using Flash.&lt;/br&gt;&lt;/p&gt;

&lt;p&gt;Additional recommended reading:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://css-tricks.com/the-debate-around-do-we-even-need-css-anymore/"&gt;The Debate Around &amp;quot;Do We Even Need CSS Anymore?&amp;quot;&lt;/a&gt; (Chris Coyier)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://anotheruiguy.roughdraft.io/c1b9d46d0c7996e783fe-js-dominance-over-the-presentation-layer"&gt;JS Dominance Over the Presentation Layer&lt;/a&gt; (Dale Sande)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pandastrike.com/posts/20150311-react-bad-idea"&gt;React is a Terrible Idea&lt;/a&gt; (Dan Yoder); note that I don&amp;#39;t necessarily agree with the title, but the overall premise is solid&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ianfeather.co.uk/practical-questions-around-web-components/"&gt;Practical Questions Around Web Components&lt;/a&gt; (Ian Feather); a thorough, if harsh, look at some of the Web Components spec&amp;#39;s short-comings&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry xml:base="http://www.intridea.com">
    <author>
      <name>Marc Garrett</name>
    </author>
    <id>tag:www.intridea.com,2015-06-16:788</id>
    <published>2015-06-16T00:00:00Z</published>
    <updated>2015-06-16T00:00:00Z</updated>
    <category term="team"/>
    <category term="mobomo"/>
    <link rel="alternate" type="text/html" href="http://www.intridea.com/blog/2015/6/16/intridea-joins-team-mobomo"/>
    <title>Intridea joins team Mobomo</title>
    <content type="html">&lt;p&gt;&lt;img src="https://s3.amazonaws.com/uploads.hipchat.com/7195/20290/FVAsPz2QpbpEPJx/Intridea-Mobomo-June2015.jpg" alt="image"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;I&amp;#39;m thrilled to announce that Mobomo has acquired Intridea. &lt;/p&gt;

&lt;p&gt;Our teams are a perfect fit of complementary skills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mobomo focuses on Rails web development and mobile expertise, especially in the government space. Mobomo is the team behind NASA.gov, the official Navy mobile apps, and USASearch—the search engine that will eventually power every single query for the United States Government. &lt;/li&gt;
&lt;li&gt;Intridea has evolved into a product development, user experience, and AngularJS consultancy with a focus on startups and the enterprise. If you&amp;#39;ve read business news, received a paycheck, opened an email, had a baby, or attended a wedding, you&amp;#39;ve encountered Intridea&amp;#39;s work. Our designs are viable, useful, and engage tens of millions of users.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Few agencies offer a best-in-class combination of user centered software design and engineering services. By bringing together Mobomo and Intridea, our teams will ship mission critical applications to our Fortune 500 clients.&lt;/p&gt;

&lt;p&gt;We share a common DNA in Barg Upender, who co-founded Intridea in 2007 and founded Mobomo in 2009. Joining Mobomo feels like coming home.&lt;/br&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="http://www.intridea.com">
    <author>
      <name>Demetri Ganoff</name>
    </author>
    <id>tag:www.intridea.com,2015-05-26:787</id>
    <published>2015-05-26T00:00:00Z</published>
    <updated>2015-05-26T00:00:00Z</updated>
    <category term="AngularJS"/>
    <link rel="alternate" type="text/html" href="http://www.intridea.com/blog/2015/5/26/angular-promises-taming-the-async"/>
    <title>Angular &amp; Promises: Taming the Async</title>
    <content type="html">&lt;p&gt;&lt;img src="https://s3.amazonaws.com/uploads.hipchat.com/7195/313437/aSAFqiOIZ2dqmYD/lock.jpg" alt="angularjs lock"&gt;&lt;/p&gt;

&lt;h4&gt;What is Async?&lt;/h4&gt;

&lt;p&gt;Async (aka asynchronous) JavaScript refers to the execution of more than one piece of code at the same time. This is great because it prevents your application from freezing up when certain code takes a long time to execute, but it can also cause issues in your code if you are expecting something to be complete when it may not be. These situations are called &lt;a href="http://en.wikipedia.org/wiki/Race_condition"&gt;race conditions&lt;/a&gt;. Here is an example of when a function is performing asyc code and we don’t get the result we are expecting: &lt;a href="http://codepen.io/dganoff/pen/oXLNeb"&gt;http://codepen.io/dganoff/pen/oXLNeb&lt;/a&gt;. Notice the &lt;code&gt;name&lt;/code&gt; variable isn’t returned as “Bob”, but is instead returned as it’s initial value.&lt;/p&gt;

&lt;h4&gt;Enter: Promises&lt;/h4&gt;

&lt;p&gt;Promises allow developers to detect when asynchronous code finishes and then act on it. Instead of a function returning a value we expect, we can have it return a Promise, and then let the Promise tell us when the value is ready to use. Now let’s take a look at how Promises can fix our issue in the original example: &lt;a href="http://codepen.io/dganoff/pen/QbNxJq"&gt;http://codepen.io/dganoff/pen/QbNxJq&lt;/a&gt;. Using the built-in promise library &lt;a href="https://docs.angularjs.org/api/ng/service/$q"&gt;$q&lt;/a&gt; that ships with Angular, we can return a Promise instead of just the &lt;code&gt;name&lt;/code&gt; variable. The Promise is “resolved” after the timeout finishes, which tells the promise to execute its &lt;code&gt;then&lt;/code&gt; method to finally return the value we originally wanted.&lt;/p&gt;

&lt;h4&gt;Real-world GitHub API Example&lt;/h4&gt;

&lt;p&gt;One of the most common uses for Promises is within a Service that makes a HTTP call and returns the response to a controller. Since HTTP calls take some time to finish, they are a prime candidate for Promises. Here’s an example of how we can use a Promise to return the HTTP response to a controller when it’s ready: &lt;a href="http://codepen.io/dganoff/pen/zGKpzv"&gt;http://codepen.io/dganoff/pen/zGKpzv&lt;/a&gt; &lt;/p&gt;

&lt;h4&gt;Advanced Promises&lt;/h4&gt;

&lt;p&gt;Let’s say you need to make a number of consecutive HTTP calls within your Service before returning the result back to the controller. The $q library has a very useful method call $q.all. This allows you to pass an array of Promises to the method and it will only execute its ‘then’ method once all Promises have been resolved. This prevents any race conditions when executing multiple HTTP calls before performing another action.&lt;/p&gt;

&lt;p&gt;Another case where we can use multiple Promises is a technique called ‘Chaining Promises’. Sometimes within a controller, we’ll need to call one HTTP Service before another HTTP Service can be called, in case we need information from the first Service. The nice thing about $q Promises is that the Promise itself returns a Promise. This way we can have a function return one of our Services that returns a Promise and then act on that once it’s ready. If we take our GitHub API example, I can chain the ‘getGithubUserInfo’ function with another function by returning a Promise. This is what that might look like: &lt;a href="http://codepen.io/dganoff/pen/aOmEVZ"&gt;http://codepen.io/dganoff/pen/aOmEVZ&lt;/a&gt; &lt;/p&gt;

&lt;h4&gt;Conclusion&lt;/h4&gt;

&lt;p&gt;Promises are a powerful tool in software development. Any web developer should have at least a basic understanding of Promises, if not a thorough grasp of the concepts discussed in this article. Please feel free to fork and edit these codepen examples to test our your own skills with Promises so you can master this critical technique.&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="http://www.intridea.com">
    <author>
      <name>Jeff Pelletier</name>
    </author>
    <id>tag:www.intridea.com,2015-05-19:786</id>
    <published>2015-05-19T00:00:00Z</published>
    <updated>2015-05-19T00:00:00Z</updated>
    <category term="css"/>
    <category term="AngularJS"/>
    <link rel="alternate" type="text/html" href="http://www.intridea.com/blog/2015/5/19/the-ionic-cli"/>
    <title>The Ionic CLI</title>
    <content type="html">&lt;p&gt;&lt;img src="https://s3.amazonaws.com/uploads.hipchat.com/7195/313437/fPE6ZPCDGVy0ufO/jeff_p_ionic_bg.jpg" alt="Ionic"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;With the &lt;a href="http://blog.ionic.io/announcing-ionic-1-0/"&gt;release of Ionic 1.0&lt;/a&gt;, we’ve reached a new level in building hybrid mobile applications via web technologies. While Ionic is probably more well known for its &lt;a href="http://ionicframework.com/docs/components/"&gt;CSS components&lt;/a&gt; and &lt;a href="http://ionicframework.com/docs/api/"&gt;JavaScript/AngularJS extensions&lt;/a&gt;, I’d like to highlight a few tools that have really improved my ability to develop applications rapidly, which are included with the &lt;a href="http://ionicframework.com/docs/cli/"&gt;Ionic CLI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The first, and probably most time-saving tool in the Ionic CLI, is the ability to live reload your app as you make code changes. Prior to being able to live reload, if you wanted to preview/test changes in a simulator or on an actual device, you would have to “build” (or compile) your app’s package, and then “run” (or install on the device, and launch). Web developers familiar with using live reload in Chrome to debug web apps will be very familiar with the Ionic CLI live reload process. Each time you save an HTML, CSS, or JS file that’s being “watched” in your app, the app will refresh while running on your device, so you don’t have to build &amp;amp; run each time (which is a very slow process). You can also change the files being watched by editing the watchPatterns in your ionic.project file. Read more about the live reload tool on the &lt;a href="http://blog.ionic.io/live-reload-all-things-ionic-cli/"&gt;Ionic blog&lt;/a&gt;, or in the &lt;a href="http://ionicframework.com/docs/cli/run.html"&gt;CLI documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One of the great features of developing hybrid apps is leveraging the same code base for building iOS and Android apps. Ionic’s CSS components and JS extensions appear differently on iOS and Android, as they’re geared to mimic each native platform closely. The Ionic Lab tool allows developers to launch a browser window displaying how the app would look and behave on both iOS and Android. Since its running in a browser, it’s not going to allow you to preview native-level functionality, like if the &lt;a href="http://ngcordova.com/"&gt;ngCordova&lt;/a&gt; &lt;a href="http://ngcordova.com/docs/plugins/camera/"&gt;$cordovaCamera&lt;/a&gt; service performs differently on each platform, but it is very handy for monitoring CSS changes, and whether a change you made breaks something on one platform, but not the other. It also comes with the aforementioned live reload tool built in, so you’ll see both the iOS and Android version of your app refreshing in real time. Read more about Ionic Lab on the &lt;a href="http://blog.ionic.io/ionic-lab/"&gt;Ionic blog&lt;/a&gt;, or in the &lt;a href="http://ionicframework.com/docs/cli/test.html"&gt;CLI documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The last tool I really appreciate is the ability to print your app’s console logs to the Terminal tab you’re running the app from. There was a time when, before Safari allowed debugging of an iPhone connected to a Mac, developers had to hack together a solution in order to gain visibility into the JS running in their hybrid app running on a device. This consisted of Xcode logs and a tool called WEINRE (“WEb INspector REmote”). It was not pretty. Suffice to say that the ability to access the console logs of your app running on a device by simply passing the “-c” flag when running the “ionic serve” command is nothing short of a godsend. Read more about the &lt;a href="http://ionicframework.com/docs/cli/run.html"&gt;command line flags&lt;/a&gt; available with the Ionic CLI.&lt;/p&gt;

&lt;p&gt;While using live reload, Ionic Lab, and a combination of console logs and other tools available with the Ionic CLI have vastly improved the speed with which I can build hybrid mobile apps, the Ionic CLI currently has many additional features. You can &lt;a href="http://ionicframework.com/docs/cli/run.html"&gt;emulate or run&lt;/a&gt; your app on a simulator or actual device, &lt;a href="http://ionicframework.com/docs/cli/icon-splashscreen.html"&gt;automatically generate the icons and splash screens&lt;/a&gt; required for both iOS and Android, or &lt;a href="http://ionicframework.com/docs/cli/uploading_viewing.html"&gt;share your app with others&lt;/a&gt; using &lt;a href="http://blog.ionic.io/view-app-is-alive/"&gt;Ionic View&lt;/a&gt;. There are also many more exciting things in the pipeline, like Ionic Deploy (update your app without having to resubmit to app stores), Ionic Analytics (track all activity in your app), and &lt;a href="http://creator.ionic.io/"&gt;Ionic Creator&lt;/a&gt; (prototype Ionic apps using drag-and-drop components). &lt;/p&gt;

&lt;p&gt;Its an exciting time to be a hybrid mobile app developer, and Ionic is leading the pack when it comes to modern hybrid frameworks. Start building your own apps today!&lt;/br&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="http://www.intridea.com">
    <author>
      <name>Mike Tierney</name>
    </author>
    <id>tag:www.intridea.com,2015-05-12:785</id>
    <published>2015-05-12T00:00:00Z</published>
    <updated>2015-05-12T00:00:00Z</updated>
    <category term="AngularJS"/>
    <link rel="alternate" type="text/html" href="http://www.intridea.com/blog/2015/5/12/extending-angularjs-log-service"/>
    <title>Extending AngularJS's $log</title>
    <content type="html">&lt;p&gt;&lt;img src="https://s3.amazonaws.com/uploads.hipchat.com/7195/313437/HhrFb5XKpN6JpYS/log-beauty%20%281%29.jpg" alt="log$"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;Have you ever been working with a particularly complicated web application and found that the output you were getting back from &lt;code&gt;$log&lt;/code&gt; was difficult to wade through? Perhaps it&amp;#39;s a complex XML response (because you&amp;#39;re working with a SOAP API), or it&amp;#39;s a particularly dense JSON response. Maybe the browser you use as your primary workhorse is working fine, but you found a gnarly bug in handling the response you&amp;#39;re getting back from an API and it&amp;#39;s failing in one of the other browsers you’re testing?&lt;/p&gt;

&lt;p&gt;I recently ran into an issue similar to this; for me, it was while working with a SOAP API. And while the browser I&amp;#39;m using has all of the necessary development tools, emitting the responses I was looking for in an easy-to-read way was just &lt;em&gt;not&lt;/em&gt; happening for me. No matter how I went about logging it all out, the response was coming back as a single line of text when emitted to the JavaScript console, and because it was a string I was having trouble easily inspecting it. While I wasn&amp;#39;t having browser-specific issues (in this case), needing to add the extra effort of moving over to a view in my debugger was costing me precious turn-around time in trying to debug this response. If I was having this sort of issue with these responses, then the other developers on my team likely were as well.&lt;/p&gt;

&lt;p&gt;After doing some research, I came across a fairly light-weight library called &lt;a href="http://www.eslinstructor.net/vkbeautify"&gt;vkbeautify&lt;/a&gt;, which handles beautifying (as well as minifying) strings that are passed in to the appropriate method. This solved part of my problem: I now had a way to programmatically re-format my XML strings. Now, I could have stopped with simply injecting the library into the application, then just emitting out the formatted strings while I was debugging the issue I was trying to resolve. However, as I mentioned earlier, I&amp;#39;m working as part of a larger team, and I wanted the rest of the team to have this ability as well. Furthermore, I wanted us to be able to selectively emit data into the console in a consistent manner with some sane defaults.&lt;/p&gt;

&lt;p&gt;The next logical step was to look at the &lt;code&gt;$log&lt;/code&gt; service. Since this is an abstraction of the global &lt;code&gt;console&lt;/code&gt; interface (&lt;code&gt;log&lt;/code&gt;, &lt;code&gt;info&lt;/code&gt;, &lt;code&gt;warn&lt;/code&gt;, &lt;code&gt;debug&lt;/code&gt;, etc) and it had the benefit of being stubbed so it wouldn’t display in unit tests, it made sense that I should simply extend that service. That way, any developer could call a method of the &lt;code&gt;$log&lt;/code&gt; service to emit these nicely formatted strings.&lt;/p&gt;

&lt;p&gt;To accomplish this, I created a provider decorator for &lt;code&gt;$log&lt;/code&gt; and made it available from within the application. One of the nice things about provider decorators is that you can leverage a reference parent service and then call that service’s methods, which was nice because I wanted to leverage the existing infrastructure as much as possible &amp;ndash; truly extending the &lt;code&gt;$log&lt;/code&gt; service. So, I added a new method (called pretty, a nod to the concept of &amp;quot;pretty printing,&amp;quot; which is common in most programming languages), and had that piggy-back on one of the other methods in the service. It looks a bit like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;angular.module(&amp;quot;myApp&amp;quot;).config([&amp;quot;$provide&amp;quot;, function ($provide) {
  $provide.decorator(&amp;quot;$log&amp;quot;, [&amp;quot;$delegate&amp;quot;, function ($delegate) { // $delegate, here, is an internal       reference to $log
    $delegate.pretty = function (input, opts) {
      var output;
      opts = opts || {};
      output = vkbeautify[(opts.type || &amp;quot;json&amp;quot;)]](input); // use the correct vkbeautify for beautifying the        string - vkbeautify.json, vkbeautify.xml, vkbeautify.sql, etc; defaults to json
      $delegate[(opts.output || &amp;quot;log&amp;quot;)].call(null, output); // leverage one of the other $log methods to    actually emit the output; defaults to log
    };
    return $delegate;
  }]);
}]);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now, in our application, when a developer makes a call to &lt;code&gt;$log.pretty()&lt;/code&gt;, the input they pass to it is run through vkbeautify with the given data type and output method (defaulting to &lt;code&gt;json&lt;/code&gt; and &lt;code&gt;$log.log&lt;/code&gt;, respectively). These values can be changed by passing in an Object as the second parameter with a property of type or output set to the desired value. Here are a few examples:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$log.pretty(&amp;quot;&amp;lt;div&amp;gt;&amp;lt;h1&amp;gt;Hello world&amp;lt;/h1&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;, {type: “xml”);
//
// &amp;lt;div&amp;gt;
//   &amp;lt;h1&amp;gt;Hello world&amp;lt;/h1&amp;gt;
// &amp;lt;/div&amp;gt;

$log.pretty(&amp;quot;body:{background:#fff;}.rounded_box:{border-radius:20px;}&amp;quot;, {type: &amp;quot;css&amp;quot;});
//
// body: {
//   background: #fff;
// }
// .rounded_box {
//   border-radius: 20px;
// }

$log.pretty({jsonObj: {childAry: [1,2,3], childObj: {someProp: &amp;quot;prop&amp;quot;}}}, {output: &amp;quot;info&amp;quot;}); // this would    emit using $log.info; leveraging that type is defaulted to json
//
// {
//   jsonObj: {
//     childAry: [
//       1,
//       2,
//       3,
//     ],
//     childObj: {
//       someProp: &amp;quot;prop&amp;quot;
//     }
//   }
// }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;While I lose the ability to log out multiple items with this method (&lt;code&gt;console.log(var1, var2, var3)&lt;/code&gt;, for example), I gain the far more important ability to emit nicely formatted output that is easier to scan and understand. The big take-away here is that you can leverage the ability to extend &lt;code&gt;$log&lt;/code&gt; to create output necessary to make debugging your code simpler. Think of the existing API as a starting point, and go from there. Chances are good that most use cases are already covered, but there&amp;#39;s always something that isn&amp;#39;t.&lt;/p&gt;

&lt;p&gt;Finally, to help anyone else that finds themselves in this specific situation, I’ve released this as a package that’s available on &lt;a href="http://bower.io"&gt;bower&lt;/a&gt;. Just run &lt;code&gt;bower install ng-log-pretty&lt;/code&gt; and include both vkbeautify and the library itself in your application and you’ll be off and running. You can also check out the &lt;a href="https://github.com/intridea/ng-log-pretty"&gt;code on GitHub&lt;/a&gt;.&lt;/br&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="http://www.intridea.com">
    <author>
      <name>Kathryn Ottinger</name>
    </author>
    <id>tag:www.intridea.com,2015-05-05:784</id>
    <published>2015-05-05T00:00:00Z</published>
    <updated>2015-05-05T00:00:00Z</updated>
    <category term="remote"/>
    <category term="distributed"/>
    <link rel="alternate" type="text/html" href="http://www.intridea.com/blog/2015/5/5/7-tips-for-rockin-autonomy-work-life"/>
    <title>7 Tips for Rockin' Autonomy Work Life</title>
    <content type="html">&lt;p&gt;&lt;img src="https://s3.amazonaws.com/uploads.hipchat.com/7195/313437/DfRTdsgjzFnqysG/home-work.jpg" alt="workfromhome"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;Sticking to a schedule, writing out your daily goals, and keeping yourself motivated are crucial to a healthy and effective remote position.  Here are a few tips from a seasoned remote veteran: &lt;/p&gt;

&lt;h4&gt;1. Sticky Notes&lt;/h4&gt;

&lt;p&gt;Write down your tasks. The physical act of writing down, crossing out, and throwing away a sticky note is amazing!  Scientifically speaking, this is more than just writing on a piece of paper.  It’s a way to calm your mind, focus on the task at hand, and see through a project vs. aimlessly wandering through your day. &lt;/p&gt;

&lt;h4&gt;2. Breaks&lt;/h4&gt;

&lt;p&gt;Know that busy does not equate to productivity. If you’re feeling burned out at 10 am after an hour of research - &lt;strong&gt;TAKE A BREAK&lt;/strong&gt;.  Go for a walk, grab a coffee, or give someone a call.  Step back from your computer and let your mind recharge.  Some of the best musicians work in 90 min intervals and are consistent about 15-20 minute breaks.  &lt;/p&gt;

&lt;h4&gt;3. Routine&lt;/h4&gt;

&lt;p&gt;Stick to a schedule.  Wake up at the same time, exercise, eat breakfast, journal, and most importantly &lt;strong&gt;SHOWER&lt;/strong&gt;.  Just because you work from home doesn’t mean you should roll out of bed and go straight to working. Developing the habit of routine will help you work at optimal times and have a sense of accomplishment at the end of the day.&lt;/p&gt;

&lt;h4&gt;4. #standup updates&lt;/h4&gt;

&lt;p&gt;This is a strategy @Intridea uses for most projects and day to day operations.  It’s a way of building accountability and awareness with our peers in regards to individual to-do lists.  Working remotely can often feel like a silo and keeping everyone informed of your “work list” not only helps you to stay on task, but keeps others from derailing you with “emergency, last minute” requests. &lt;/p&gt;

&lt;h4&gt;5. Plan the Night Before&lt;/h4&gt;

&lt;p&gt;Create tomorrow’s to-do list the night before; it’s at the forefront of your mind and writing them down will keep you from dwelling on them throughout the night.  Empty your brain and save valuable morning time by utilizing those last 15 minutes of your day to set tomorrow up for success.  &lt;/p&gt;

&lt;h4&gt;6. Know When to Stop&lt;/h4&gt;

&lt;p&gt;Fight the urge to check work email after a certain time.  Make it a point to shut down and be present with your family and friends. Traditional employees have the luxury of separating home life from work life, you however will need to be intentional with your personal time and designated “work” hours.&lt;/p&gt;

&lt;h4&gt;7. Social Media fasting&lt;/h4&gt;

&lt;p&gt;Block out times in the day for social media and honor your schedule.  Facebook and Twitter can easily destroy productivity and suck hours away from your day!  Know yourself and know when you work best - avoid these distractors and use them as rewards for getting stuff done vs. wasting your valuable time and energy on it.&lt;/br&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Got any remote working hacks?&lt;/strong&gt;  Share them with us on &lt;a href="https://twitter.com/intridea"&gt;Twitter&lt;/a&gt;! &lt;/p&gt;
</content>
  </entry>
  <entry xml:base="http://www.intridea.com">
    <author>
      <name>Randy Weber</name>
    </author>
    <id>tag:www.intridea.com,2015-04-28:783</id>
    <published>2015-04-28T00:00:00Z</published>
    <updated>2015-04-28T00:00:00Z</updated>
    <category term="javascript"/>
    <category term="AngularJS"/>
    <category term="Web Apps"/>
    <link rel="alternate" type="text/html" href="http://www.intridea.com/blog/2015/4/28/reduce-your-angularjs-code-and-improve-its-readability-using-ecmascript-6"/>
    <title>Reduce Your AngularJS Code and Improve its Readability Using ECMAScript 6</title>
    <content type="html">&lt;p&gt;&lt;img src="https://s3.amazonaws.com/uploads.hipchat.com/7195/313437/06SsPA6jumx8vOR/shink.jpg" alt="shink"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;If you’re reasonably up-to-date with front-end app development then there’s a good chance you’ve heard the buzz flying around about ECMAScript 6. For those unfamiliar, ECMAScript 6, also known as Harmony, is the next major version of JavaScript programming language. In this post, I’ll utilize new ECMAScript 6 features to reduce and improve readability of code in a &lt;a href="https://github.com/rjw209/angular-es6-demo"&gt;sample AngularJS application&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Our sample application is a simple baseball card auction app that serves as a platform for users to sell rather valuable baseball cards and consists of three Controllers (BaseballCardsCtrl, BaseModalCtrl, and ConfirmModalCtrl) and three Services (UserService, CardService, and NotificationService).&lt;/p&gt;

&lt;h4&gt;Block-scoped bindings and arrow functions&lt;/h4&gt;

&lt;p&gt;The very first thing our application needs to do is fetch the current user’s profile, so we’ll start by taking a look at the &lt;code&gt;getUserInfo&lt;/code&gt; function of our UserService which is responsible for retrieving the user’s information.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function getUserInfo() {
    if (user) {
        return $q.when(user);
    } else {
        let handleSuccess = (response) =&amp;gt; {
            user = response.data;

            return user;
        };

        let handleError = (error) =&amp;gt; {
            NotificationService.logError(&amp;#39;Unable to retrieve user info&amp;#39;, error);

            return null;
        };

        return $http.get(&amp;#39;/dist/data/get_user_info_response.json&amp;#39;).then(handleSuccess, handleError);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This function uses two of the new features of ECMAScript 6, namely block-scoped bindings, and arrow, or lambda functions. The &lt;code&gt;handleSuccess&lt;/code&gt; and &lt;code&gt;handleError&lt;/code&gt; functions above are declared using the let keyword, which restricts them to only being accessible by code in the same block; in this case, the else block of our if-else statement. This increases the overall readability of our code by moving variable or function declarations and assignments into the block where they’re intended to be used. Both handlers make use of arrow functions which provide a shorthand, expressive syntax for defining functions. In addition to providing a more compact syntax for defining functions, arrow functions also lexically bind the “this” keyword value, eliminating the need to manually bind object context when registering event handlers and such.&lt;/p&gt;

&lt;h4&gt;Generators and paused execution&lt;/h4&gt;

&lt;p&gt;Next, let’s take a look at an excerpt from our BaseballCardsCtrl that uses the UserService’s &lt;code&gt;getUserInfo&lt;/code&gt; and CardService’s &lt;code&gt;getCards&lt;/code&gt; methods to retrieve and store a reference to the user’s profile and baseball card data.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var it;

initialize();

function initialize() {
    vm.notifications = NotificationService.getNotifications();

    it = fetchData();

    it.next();
}

function *fetchData() {
    vm.user = yield getUserInfo();

    vm.cards = yield getCards(vm.user);
}

function getUserInfo() {
    UserService.getUserInfo().then((user) =&amp;gt; { it.next(user); });
}

function getCards(user) {
    CardService.getCards(user).then((cards) =&amp;gt; { it.next(cards); });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The most interesting thing to note about the above code is the &lt;code&gt;*fetchData&lt;/code&gt; function declaration. The function name is prefixed with an asterisk which is a new, special naming convention that results in the function returning a Generator object, another new feature of ECMAScript 6.&lt;/p&gt;

&lt;p&gt;Generators are special Iterators that can pause their execution when the yield keyword is encountered. The ability to pause function execution allows us to control the order of asynchronous operations without need to use a series of nested callbacks. In our initialize function above, we store a reference to the Generator object on which we immediately invoke it’s next method to instruct &lt;code&gt;*fetchData&lt;/code&gt; to begin executing its function body. The &lt;code&gt;*fetchData&lt;/code&gt; function calls &lt;code&gt;getUserInfo&lt;/code&gt; then pauses due to the presence of the yield keyword. The &lt;code&gt;getUserInfo&lt;/code&gt; function is responsible for registering a callback function to be executed once the user’s information is retrieved from the server. Once the user’s information is retrieved, the callback invokes the Generator’s next function with the user data, which is returned by the first yield statement in &lt;code&gt;*fetchData&lt;/code&gt;. The &lt;code&gt;*fetchData&lt;/code&gt; function then releases the pause allowing execution to continue and the &lt;code&gt;getCards&lt;/code&gt; function to be invoked with the necessary user data.&lt;/p&gt;

&lt;h4&gt;Object destructuring and string templates&lt;/h4&gt;

&lt;p&gt;Now that our application has been wired up to retrieve the necessary user and baseball card data, it needs a way to allow our user to actually sell his cards. The following snippet is from our CardService.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function sellCard(card, index) {
    return $http.get(&amp;#39;/dist/data/sell_card_response.json&amp;#39;).then(handleSuccess, handleError);

    function handleError(error) {
        NotificationService.logError(&amp;#39;Unable to sell card&amp;#39;, error);

        return null;
    }

    function handleSuccess() {
        var { year, firstName, lastName, value } = card,
            dollars = $filter(&amp;#39;currency&amp;#39;)(value);

        cards.splice(index, 1);

        UserService.updateBalance(value);

        NotificationService.logSuccess(`Sold ${year} ${firstName} ${lastName} for ${dollars}`);

        return card;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The majority of this code looks similar to what you’ve seen in other AngularJS applications with one exception, the first line within the nested handleSuccess method. This particular line uses what’s called Object Destructuring, another one of our new ECMAScript 6 features. Object Destructuring provides a shorthand syntax for declaring one or more variables with their values being initialized as property values of a target object. This is only a very basic example of how one might use Object Destructuring to consolidate multiple variable declarations into a single statement; it does support more complex mappings to nested object properties as well. &lt;/p&gt;

&lt;p&gt;Another difference you may have noticed is our use of a string template to build a success message to be used as a “successful sale” notification. Traditionally, this would have been accomplished by concatenating multiple string literals with variables, but now we can achieve the same result using much more concise, readable syntax using variable interpolation with template strings.&lt;/p&gt;

&lt;h4&gt;Classes and prototypal inheritance&lt;/h4&gt;

&lt;p&gt;One requirement of our application is to prompt our users to confirm that they would like to proceed, after clicking a button to sell a particular baseball card. For this demo we use the UI-Bootstrap modal for our confirmation prompt. In real world applications there is often the need to utilize many different modals that implement a common subset of functions to handle repetitive tasks such as closing the modal when the user clicks a Cancel button. Implementing these functions for each modal leads to redundant code. Fortunately, ECMAScript 6 introduces a new way to approach prototypal inheritance in JavaScript using a more concise, readable syntax.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function BaseModalCtrl($modalInstance) {
    &amp;#39;use strict&amp;#39;;

    var vm = this;

    vm.dismiss = $modalInstance.dismiss;
    vm.close = $modalInstance.close;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;First we define an ordinary constructor function that creates dismiss and close members that reference the &lt;code&gt;$modalInstance&lt;/code&gt; service’s dismiss and close methods. Admittedly, there’s nothing new or interesting to see here but in our next code excerpt, we will see how we can easily extend this functionality when we create our ConfirmModalCtrl.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class ConfirmModalCtrl extends BaseModalCtrl {
    constructor(data, $modalInstance) {
        super($modalInstance);

        this.data = data;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;While this feature isn&amp;#39;t a new concept in JavaScript language, it does provide syntactic sugar, and achieve prototypal inheritance using a more concise, intuitive syntax. ECMAScript 6 classes and inheritance offer a standardized way to define JavaScript class constructors, public and private members, and make superclass methods calls. Of course, this is all possible today using native ECMAScript 5 code, but the syntax is not as elegant or intuitive. We now have an easy, readable way to extend functionality and eliminate code redundancy in our JavaScript classes.&lt;/p&gt;

&lt;h4&gt;Structure through modules&lt;/h4&gt;

&lt;p&gt;Lastly, let’s learn how to import various application components and register them with AngularJS. Historically, JavaScript has lacked a native way to structure applications and manage component dependencies. However while AngularJS does have its own dependency injection mechanism, it does not support importing external dependencies and requires components be available from within the current scope before registering with Angular. &lt;/p&gt;

&lt;p&gt;ECMAScript aims to provide a native, standardized way to handle importing external dependencies with the introduction of modules. Lets take a look at how we can utilize the new module syntax to import external file dependencies and register our different components with Angular.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; import BaseballCardsCtrl from &amp;#39;./controllers/baseball_cards.ctrl.js&amp;#39;;
     import ConfirmModalCtrl from &amp;#39;./controllers/confirm_modal.ctrl.js&amp;#39;;
     import UserService from &amp;#39;./services/user.service.js&amp;#39;;
     import CardService from &amp;#39;./services/card.service.js&amp;#39;;
     import NotificationService from &amp;#39;./services/notification.service.js&amp;#39;;

 angular.module(&amp;#39;demo&amp;#39;, [&amp;#39;ui.bootstrap&amp;#39;])
  .controller(&amp;#39;ConfirmModalCtrl&amp;#39;, ConfirmModalCtrl)
  .controller(&amp;#39;BaseballCardsCtrl&amp;#39;, BaseballCardsCtrl)
  .service(&amp;#39;UserService&amp;#39;, UserService)
  .service(&amp;#39;CardService&amp;#39;, CardService)
  .service(&amp;#39;NotificationService&amp;#39;, NotificationService);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As you can see in our above example, ECMAScript 6 modules introduce the new import keyword, allowing you to reference application components defined in external files. Here, we import each of our AngularJS application components (BaseballCardsCtrl, ConfirmModalCtrl, UserService, CardService, and NotificationService) and register them with our demo application. Each of our components uses an export statement, another new keyword in ECMAScript 6, to selectively make internal components available for import and use in other files..&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; export default NotificationService;

  function NotificationService($log, $timeout) {
  ...
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The import and export statements support different syntax giving you flexibility over how components are referenced throughout your application. Note: We’ve only used the most basic, as it fulfills our application’s current needs.&lt;/p&gt;

&lt;h4&gt;Conclusion&lt;/h4&gt;

&lt;p&gt;ECMAScript 6 is still in draft mode and its specification isn’t expected to be officially published until later this year. For this reason, modern browsers currently have varying or incomplete support for many of the new language features. Fortunately though, there are quite a few &lt;a href="https://github.com/addyosmani/es6-tools"&gt;tools&lt;/a&gt;  to integrate support for ECMAScript 6 into your workflows and translate the code to ECMAScript 5 compatible syntax. As the release of the new ECMAScript 6 specification approaches, its new features are being integrated into more and more applications. &lt;/p&gt;

&lt;p&gt;JavaScript is one of the most popular and widely used programming languages today; it’s not going anywhere any time soon and as it continues to evolve, so should our applications to harness it’s full potential and expressiveness. Our &lt;a href="https://github.com/rjw209/angular-es6-demo"&gt;sample application&lt;/a&gt; uses one subset of the new features available in ECMAScript 6; there’s a lot more to it than what we’ve seen in this short example. For more complete information on ECMAScript 6 and how to integrate support for it in your workflow, check out the following resources.&lt;/br&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Application&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;li&gt;Demo: &lt;a href="http://embed.plnkr.co/dLK1ruytvNSljXz5L3CV/preview"&gt;http://embed.plnkr.co/dLK1ruytvNSljXz5L3CV/preview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Repository: &lt;a href="https://github.com/rjw209/angular-es6-demo"&gt;https://github.com/rjw209/angular-es6-demo&lt;/a&gt;&lt;/li&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;li&gt;&lt;a href="https://people.mozilla.org/%7Ejorendorff/es6-draft.html"&gt;Draft EMCA 262&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/addyosmani/es6-tools"&gt;EMCAScript 6 Tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kangax.github.io/compat-table/es6/"&gt;EMCAScript Compatibility Table&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jsrocks.org/"&gt;JSRocks&lt;/a&gt;&lt;/li&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="http://www.intridea.com">
    <author>
      <name>Kathryn Ottinger</name>
    </author>
    <id>tag:www.intridea.com,2015-04-21:782</id>
    <published>2015-04-21T11:20:00Z</published>
    <updated>2015-04-21T11:20:00Z</updated>
    <category term="remote"/>
    <category term="distributed"/>
    <category term="AngularJS"/>
    <link rel="alternate" type="text/html" href="http://www.intridea.com/blog/2015/4/21/3-things-i-learned-while-working-remote"/>
    <title>3 Things I Learned While Working Remote</title>
    <content type="html">&lt;p&gt;&lt;img src="https://s3.amazonaws.com/uploads.hipchat.com/7195/313437/BxtYejGgrhHtCeH/home.jpg" alt="working from home"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;Working remote is great; autonomy, flexibility, work/life balance, you name it!   However, while the benefits severely outweigh the costs, working from home does present its own set of challenges. Below are the findings of a veteran to remote working.&lt;/p&gt;

&lt;h4&gt;1. You get to work from home, but you shouldn’t always.&lt;/h4&gt;

&lt;p&gt;Working remote is the freedom to work from anywhere.  Often times we get fixated on remote equaling home office, but it so much more than that!  Perhaps you enjoy working out in the sun, or maybe a little structure at a co-working space is your thing? Whatever it is -  the point is you get to choose and that’s a beautiful thing. &lt;/p&gt;

&lt;p&gt;Some of my best connections, ideas, and productivity have occurred outside the home office, so just because you can work from your kitchen, doesn’t mean you always should.&lt;/p&gt;

&lt;h4&gt;2. Autonomy is amazing, but also requires intentional discipline.&lt;/h4&gt;

&lt;p&gt;When describing my job, I often equate it to being your own boss w/o the usual entrepreneurial stressors. However, while there’s tons of freedom, with that freedom comes great responsibility (Spiderman plug).  Sticking to a schedule, writing out your daily goals, and keeping yourself motivated are crucial to a healthy and effective work life.  If you’re someone who thrives under constant supervision, be wary of remote jobs, this may not be for you. Self motivation and discipline are key to success in this arena.  &lt;/p&gt;

&lt;h4&gt;3. Effective communication is a requirement, not a nice to have.&lt;/h4&gt;

&lt;p&gt;&lt;br&gt;&lt;iframe src="//giphy.com/embed/g52Y39pUaT21i?html5=true" width="480" height="270" frameBorder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;&lt;/br&gt;&lt;/p&gt;

&lt;p&gt;With the subtraction of body language, tone of voice, and physical proximity, the written word, emoticons, and timely responses become crucial. This is why utilizing GIFs, emoticons, and #status updates are important.  If you think you’re being redundant, you’re probably doing just the right amount. Never underestimate the importance of emotional intelligence in the virtual world.&lt;/br&gt; &lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;strong&gt;Think you can hack it? Intridea is hiring! :)&lt;/strong&gt; Learn more about our &lt;a href="http://jobs.intridea.com/apply/CWfdwM/AngularJS-Engineer.html"&gt;AngularJS Engineer&lt;/a&gt; position.&lt;/br&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="http://www.intridea.com">
    <author>
      <name>Ben Markowitz</name>
    </author>
    <id>tag:www.intridea.com,2015-04-14:781</id>
    <published>2015-04-14T11:35:00Z</published>
    <updated>2015-04-14T11:35:00Z</updated>
    <category term="ux"/>
    <category term="Guerilla UX"/>
    <link rel="alternate" type="text/html" href="http://www.intridea.com/blog/2015/4/14/guerilla-ux"/>
    <title>Guerilla UX: UX in the Analog World</title>
    <content type="html">&lt;p&gt;As a UX designer, improving the end user experience is my passion.  When an interface or interaction seems confusing, I often find myself asking “What would I tell the user if I was there?” And immediately picture myself as a bystander, brainstorming every possible solution.&lt;/p&gt;

&lt;p&gt;When you eat and breath this on a daily basis, it can quickly spill into the analog world. Suddenly, you have a heightened awareness of places and things where designers have built with the user in mind. And it’s in those instances, you can almost sense the designer looking over your shoulder, giving you a helping hand. &lt;/p&gt;

&lt;p&gt;My first observation of this was the gas pump. We’ve all experienced “gas cap confusion” or the internal debate as to which side that dang cap is on! No matter how long you’ve been driving your car, this situation occurs more often than we’d like to admit. If you know where to look though, there’s a bit of user experience design making life a little easier. For years auto manufacturers have included a tiny arrow next to the gas pump icon indicating which side it&amp;#39;s on.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/uploads.hipchat.com/7195/313437/5htSwh6roSdtPYk/gas_arrow.jpg" alt="GasPump"&gt;&lt;/p&gt;

&lt;p&gt;It’s such a simple touch. Just a tiny little arrow. But if you know about it, it can save you a world of frustration when heading to the pump. &lt;/p&gt;

&lt;p&gt;Which got me thinking, are there other ways to simplify daily life via user experience design? And so began my pursuit and practice of Guerilla UX. &lt;/p&gt;

&lt;p&gt;When we moved into our house, a point of frequent confusion was our garage doors, or more specifically the control panels that opened them. There’s a garage door on the left and another on the right, but with the panels stacked vertically (poor user interface design) it was impossible to remember! With a bit of Guerilla UX though, determining which pad opened which door was quickly resolved. Arrows now clearly indicate the side the control panels open. &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/uploads.hipchat.com/7195/313437/JuiVkJYfNTJ7CJ0/garage.jpg" alt="GarageDoor"&gt;&lt;/p&gt;

&lt;p&gt;Another place with some added UX love is my printer. It’s a common hurdle; which side of the paper will the printer print on? And it’s of special concern when printing on special paper or making labels!  Pre-UX, I’d always make a mark at the bottom of a plain sheet of paper and print a test page to avoid wasted time and paper. My Guerilla solution? A simple label with an arrow showing which direction to load the paper and a smiley face to indicate the top as well as what side it will print on. Tada!&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/uploads.hipchat.com/7195/313437/OWHSpbJbdBUZKtS/printer.jpg" alt="Printer"&gt;&lt;/p&gt;

&lt;p&gt;These are just a few places I’ve added Guerilla UX to my daily life, but I have a feeling other designers (and non-designers) may use a bit of Guerilla UX to make their lives easier too. &lt;/p&gt;

&lt;p&gt;Got some good examples? &lt;a href="https://twitter.com/intridea"&gt;Tweet&lt;/a&gt; them to us with the hashtag &lt;strong&gt;#GuerillaUX&lt;/strong&gt; and we’ll share the best ones!&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="http://www.intridea.com">
    <author>
      <name>Mike DelGuidice</name>
    </author>
    <id>tag:www.intridea.com,2015-04-07:780</id>
    <published>2015-04-07T00:00:00Z</published>
    <updated>2015-04-07T00:00:00Z</updated>
    <category term="ui"/>
    <category term="ux"/>
    <category term="UI"/>
    <link rel="alternate" type="text/html" href="http://www.intridea.com/blog/2015/4/7/tidal-misses-the-mark"/>
    <title>Tidal: Misses the Boat</title>
    <content type="html">&lt;p&gt;&lt;img src="https://s3.amazonaws.com/uploads.hipchat.com/7195/313437/LKrVZt8RHSlnCWo/tidal_bg.jpg" alt="tidal"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;With &amp;quot;The ruler’s back” kicking off one of Jay-Z&amp;#39;s greatest albums to date and the recent (re)launch of his streaming service Tidal, my hopes of a Jay-Z disruption were extremely high.&lt;/p&gt;

&lt;p&gt;With claims to revolutionize streaming and pay artists what they deserve, Tidal depicted the utopian ideal of edgy design, quality, and fairness. I was pumped to check it out, not merely as an H.O.V. fan, but as a UX/UI junkie craving to experience music streaming in a new way. With creds for shaping one of the most popular music genres, you&amp;#39;d think Tidal would bleed the Jay-Z innovation as well. Yet, what I discovered was anything but revolutionary.&lt;/br&gt;&lt;/p&gt;

&lt;iframe src="https://player.vimeo.com/video/124244262" width="500" height="289" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;br&gt;The interface is the same grid layout we’ve all come to know (and love) from our other player, &lt;strong&gt;cough&lt;/strong&gt; Spotify. Not that there is a problem with the way big “S” handles their layout, in my opinion, it does some pretty amazing things, especially in regards with how it handles an incredible library of content.&lt;/br&gt; &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/uploads.hipchat.com/7195/313437/ELXKMYTBTIk6R1C/tidal_pic_1.jpg" alt="Tidal"&gt; &lt;/p&gt;

&lt;p&gt;&lt;br&gt;I just expected more with Tidal, especially coming from J-HOVA, someone who’s built his career by straying from the beaten path. I wanted something that would blow my mind, something that made me NEED Tidal, but it just wasn’t there. &lt;/p&gt;

&lt;p&gt;There were glimpses of what Tidal could have been, with slick transitions that make sense to a user and don’t remove them from the moment.&lt;/br&gt;&lt;/p&gt;

&lt;iframe src="https://player.vimeo.com/video/124243863" width="500" height="287" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;br&gt;There were literally two instances when this level of detail was applied. And the look of the app is super sharp, black on black with pops of neon blue that scream for you to click. &lt;/br&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/uploads.hipchat.com/7195/313437/g7pcik8FQDEtEYp/tidal_pic_2.jpg" alt="Tidal2"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;Also, there’s no denying that Tidal has a very trendy look, but it’s the details that make a truly immersive and engaging experience. Unfortunately, with Tidal&amp;#39;s design inconsistencies and jarring page transitions, it was difficult to convince myself I needed this new platform for music streaming.  And with a price tag of $19.99 for premium membership, Tidal, missed the boat (pun intended) on this user.&lt;/br&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/uploads.hipchat.com/7195/313437/g6AcPUbIVFcEO2Q/tidal_pic_3.jpg" alt="Tidal 3"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;Let me clarify though, this is in no way a put down to the team of incredible designers who obviously spent countless nights away from their families. This is merely my take on a, now, very traditional service from someone who has made a name for themselves by rising above, not floating amongst his peers.&lt;/br&gt;&lt;/p&gt;

&lt;p&gt;What are your thoughts?  Would you make the switch from Spotify to Tidal? &lt;a href="https://twitter.com/intridea"&gt;Let us know.&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="http://www.intridea.com">
    <author>
      <name>Eric Himmelreich</name>
    </author>
    <id>tag:www.intridea.com,2015-03-31:779</id>
    <published>2015-03-31T11:35:00Z</published>
    <updated>2015-03-31T11:35:00Z</updated>
    <category term="tutorial"/>
    <category term="AngularJS"/>
    <category term="editor"/>
    <link rel="alternate" type="text/html" href="http://www.intridea.com/blog/2015/3/31/learn-thou-editor"/>
    <title>Learn Thou Editor</title>
    <content type="html">&lt;p&gt;&lt;img src="https://s3.amazonaws.com/uploads.hipchat.com/7195/313437/QlrhkTrHLuBHX9z/editor-learning.jpg" alt="AngularJS editor"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;When it comes to learning your editor, most of us avoid it like the plague.  It’s time consuming, opinions run rampant, and quite frankly, we’ve got better things to do!&lt;/p&gt;

&lt;p&gt;Yet this avoidance isn&amp;#39;t effective (and we know it). Simple tasks such as performing “find and replace” become much more difficult when we don&amp;#39;t understand how our editor operates... &lt;/p&gt;

&lt;p&gt;So why do we still refuse to eat our vegetables? For a few reasons:&lt;/p&gt;

&lt;h4&gt;It’s overwhelming.&lt;/h4&gt;

&lt;p&gt;Reviewing an editor, like emacs (or vim, or sublime text) is overwhelming. Not only can the editor accomplish many tasks, but there are multiple ways of doing them! For instance, when performing a “find and replace” on a file in emacs, you can use a regular expression (now you have two problems) or a keyboard macro.  All these options can quickly lead you down a rabbit hole and wondering (three hours later) “what did I just do with my time?!”&lt;/p&gt;

&lt;h4&gt;Getting sidetracked by editor holy wars&lt;/h4&gt;

&lt;p&gt;When asking a co-worker for advice, if that co-worker doesn&amp;#39;t use your editor of choice the discussion can devolve into: &amp;quot;Emacs is awful. You should use Vim and do it this way.&amp;quot; Then instead of learning your editor, the conversation continues into the merits of one editor versus another, when both could do the job adequately.  Avoid this at all costs.&lt;/p&gt;

&lt;h4&gt;Deadlines&lt;/h4&gt;

&lt;p&gt;We have work to do. When working on a bugfix or a feature with a tight deadline, you can&amp;#39;t afford to spend time learning your editor. But then, not learning your editor makes your text editing less efficient, which makes development work take longer than it should. Soooo...&lt;/p&gt;

&lt;h4&gt;A Better Approach&lt;/h4&gt;

&lt;p&gt;Despite all these variables though, learning your editor is worth it. You just have to get strategic. Here’s my suggestion: while doing your everyday work, keep a notepad with an ongoing “need to learn” list for your editor. Then, when you find yourself wanting to perform a particular task (search across project files) and don&amp;#39;t know how to do it, you can come back to it later vs. stopping everything to figure it out right then and there. &lt;/p&gt;

&lt;p&gt;Then once a week, for thirty minutes, take one item on your list and look up how do it. For the coming week, keep in your mind (or a post-it note on your monitor) how to perform this task in your editor, and use it when necessary. This will help you remember the task and how to do it. Next week, you can cross off another item on your list.&lt;/p&gt;

&lt;p&gt;This approach requires a small time commitment each week and avoids going down the rabbit hole of configuring your editor during your normal work day.&lt;/br&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="http://www.intridea.com">
    <author>
      <name>Michael Bleigh</name>
    </author>
    <id>tag:www.intridea.com,2015-03-24:778</id>
    <published>2015-03-24T00:00:00Z</published>
    <updated>2015-03-24T00:00:00Z</updated>
    <category term="AngularJS"/>
    <link rel="alternate" type="text/html" href="http://www.intridea.com/blog/2015/3/24/angularjs-2-0-crazy-like-a-fox"/>
    <title>AngularJS 2.0: Crazy Like A Fox?</title>
    <content type="html">&lt;p&gt;&lt;img src="https://s3.amazonaws.com/uploads.hipchat.com/7195/313437/ltrykxetCbOr7HZ/fractured_angular.jpg" alt="angular"&gt;&lt;/p&gt;

&lt;p&gt;&lt;sub&gt;&lt;em&gt;This article originally appeared on the &lt;a href="https://divshot.com/"&gt;Divshot&lt;/a&gt; blog. Divshot is a developer-focused platform for deploying modern front-end applications. It was also started with Intridea&amp;#39;s support by Michael Bleigh!&lt;/em&gt; &lt;/sub&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;If you follow the front-end world even a little bit, you&amp;#39;ve probably seen the internet explode over the massively incompatible rewrite that is AngularJS 2.0. Some think &lt;a href="http://blog.dantup.com/2014/10/have-the-angular-team-lost-their-marbles/"&gt;the Angular team has lost their marbles&lt;/a&gt;. I&amp;#39;m not so sure.&lt;/p&gt;

&lt;p&gt;Angular is dominating the story for modern front-end frameworks right now. Even if it&amp;#39;s not your personal favorite, you have to admire its meteoric rise. It&amp;#39;s a rare case of a library achieving massive adoption from both the startup and enterprise set in a very short timeframe (it took Rails years to get buy-in from bigger businesses). The Angular team is sitting on top of the world, and what do they decide to do? &lt;strong&gt;Rewrite the whole thing from scratch.&lt;/strong&gt;&lt;/p&gt;

&lt;p align="center"&gt;&lt;img src="https://i.imgur.com/M8AdYhy.png" alt="Advice Dog"&gt;&lt;/p&gt;

&lt;p&gt;Are. They. &lt;em&gt;Insane?&lt;/em&gt; Rewrites-as-new-versions have horror stories right out in the open! Python 3.0 was released nearly six years ago and still has a puny fraction of code being written for it. Enterprise developers have only just convinced their bosses to let them build with modern web tech, and now they have to sell them on either a massive rewrite of existing code or an 18-month support death clock. The hubris of the Angular team is unmatched since the times of Marie Antoinette!&lt;/p&gt;

&lt;p align="center"&gt;&lt;img src="https://i.imgur.com/eSVQuoj.png" alt="Disapproving Zoidberg"&gt;&lt;/p&gt;

&lt;p&gt;Except, that&amp;#39;s not what&amp;#39;s really going on. The Angular team isn&amp;#39;t squandering their community goodwill out of sheer capriciousness. Instead they&amp;#39;re doing something risky: they&amp;#39;re pro-actively disrupting their own product before it&amp;#39;s rendered irrelevant by external competition.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;But Michael,&lt;/em&gt; I hear you thinking, &lt;em&gt;you just talked about how dominant AngularJS is. Shouldn&amp;#39;t they be taking steps to reinforce their leading position rather than putting the whole project in jeopardy?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That&amp;#39;s certainly an approach they could take, but I believe it would ultimately lead to Angular falling by the wayside two to three years from now.&lt;/p&gt;

&lt;h3&gt;The Innovator&amp;#39;s Dilemma&lt;/h3&gt;

&lt;p&gt;An oft-referenced issue in the tech world is the &lt;strong&gt;Innovator&amp;#39;s Dilemma&lt;/strong&gt;, as described in a 1997 book by Clayton Christensen. Wikipedia summarizes it thusly: &amp;quot;successful companies can put too much emphasis on customers&amp;#39; current needs, and fail to adopt new technology or business models that will meet customers&amp;#39; unstated or future needs...such companies will eventually fall behind.&amp;quot;&lt;/p&gt;

&lt;p&gt;I&amp;#39;ll admit that I hadn&amp;#39;t been following the progress of the Angular 2.0 design docs very closely. I had heard with interest about the new persistence layer, but hadn&amp;#39;t done much other investigating. Today I spent a bit of time perusing some of the content, and the real purpose of the rewrite started to make sense to me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AngularJS 2.0 is a concerted effort to make sure that Angular remains relevant in the coming front-end world dominated by Web Components.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;Sea Change Is Coming&lt;/h3&gt;

&lt;p&gt;I&amp;#39;ve written before about how &lt;a href="https://divshot.com/blog/web-components/web-components-are-revolutionary/"&gt;Web Components are revolutionary&lt;/a&gt;. I strongly believe that in a few years they will become the dominant paradigm for front-end development. Web Components are not, however, in direct competition with modern front-end frameworks like Angular, Ember, or React. Instead, they are a new set of foundational technologies that will enable radically different and more powerful ways of building applications in the browser.&lt;/p&gt;

&lt;p&gt;How is this related to Angular 2.0? The evidence is plain. As I browse through &lt;a href="https://drive.google.com/#folders/0B7Ovm8bUYiUDR29iSkEyMk5pVUk"&gt;the design docs&lt;/a&gt;, I see &lt;strong&gt;at least six&lt;/strong&gt; that reference Web Components directly or allude to related subjects. The Angular team is taking everything they&amp;#39;ve learned about building an application framework and building a brand new one for the Web Components world.&lt;/p&gt;

&lt;p&gt;This is a brave and risky decision, but one that I think has a greater chance to &lt;em&gt;protect&lt;/em&gt; Angular&amp;#39;s market leadership than threaten it. There is not (yet) an accepted set of best practices for using Web Components to build applications. &lt;a href="http://www.polymer-project.org/"&gt;Polymer&lt;/a&gt; works at a lower level than an application framework; in fact, it&amp;#39;s quite likely that application frameworks will emerge that are built &lt;em&gt;on top&lt;/em&gt; of Polymer.&lt;/p&gt;

&lt;p&gt;If Angular 2.0 arrives on the scene as the first comprehensive application framework for Web Components, and it&amp;#39;s also &lt;em&gt;good&lt;/em&gt; at that job, it could see massive adoption, and not just from the existing Angular userbase.&lt;/p&gt;

&lt;h3&gt;What&amp;#39;s Next?&lt;/h3&gt;

&lt;p&gt;There&amp;#39;s no doubt that the recent firestorm will tarnish Angular&amp;#39;s reputation a bit. Someone who is researching which framework to use today might see the uproar and decide to turn elsewhere. Open source projects are just as vulnerable to brand perception as companies, and I think the Angular team needs to get out in front of it. Firmly establish the basis and need for change while reassuring developers that 1.X users won&amp;#39;t be abandoned wholesale. Acknowledge that incompatibility is a massive pain and demonstrate awesome new stuff that makes the pain worth it.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s an exciting time to be building apps in the browser, but it&amp;#39;s also a turbulent one. Angular has done a great job of introducing a huge audience to sophisticated front-end development, but the last couple years are just a warm-up act to the true front-end revolution. Angular 2.0 seems a bit crazy now. Looking at the bigger picture, however, it might just be crazy like a fox.&lt;/p&gt;

&lt;h3&gt;Update: Two Roads Diverged&lt;/h3&gt;

&lt;p&gt;Since I finished writing this post, two interesting and relevant bits of content have been published. Tom Dale wrote about &lt;a href="https://github.com/emberjs/rfcs/pull/15"&gt;The Road To Ember 2.0&lt;/a&gt;. The Ember team is taking a gradual, migration-focused approach to integrating new technologies like Web Components, DOM-based templating, and other new tech. They call this &amp;quot;Stability Without Stagnation.&amp;quot; Henrik Joretag of Ampersand wrote to &lt;a href="http://blog.andyet.com/2014/10/29/optimize-for-change-its-the-only-constant"&gt;Optimize for change. It&amp;#39;s the only constant&lt;/a&gt; about how they are taking the &amp;quot;lots of little modules&amp;quot; instead of an all-in framework approach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;These are both smart, valid, and potentially wildly successful approaches.&lt;/strong&gt; The fact that there are different teams of smart people building software to make the front-end better, and that those teams have different and directly conflicting philosophies is &lt;em&gt;fantastic&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Maintaining large, popular open source projects is really damn hard. It&amp;#39;s even harder when that project is a framework, because they are so deeply intertwined with users&amp;#39; application code. If you move forward gradually, you risk stagnation. If you move forward in great leaps, you risk leaving behind those who don&amp;#39;t have the time and energy to leap with you. Like most things, it&amp;#39;s not a question of good and bad, it&amp;#39;s a question of risk and reward, of tradeoffs.&lt;/p&gt;

&lt;p&gt;It seems &lt;a href="http://en.wikipedia.org/wiki/May_you_live_in_interesting_times"&gt;we&amp;#39;re all cursed to live in interesting times&lt;/a&gt;.&lt;/br&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="http://www.intridea.com">
    <author>
      <name>Michael Bleigh</name>
    </author>
    <id>tag:www.intridea.com,2015-03-10:777</id>
    <published>2015-03-10T00:00:00Z</published>
    <updated>2015-03-10T00:00:00Z</updated>
    <category term="web components"/>
    <category term="polymer"/>
    <link rel="alternate" type="text/html" href="http://www.intridea.com/blog/2015/3/10/polymer-0-8-sneak-peek"/>
    <title>Polymer 0.8 Sneak Peek</title>
    <content type="html">&lt;p&gt;&lt;img src="https://s3.amazonaws.com/uploads.hipchat.com/7195/313437/qWSh2TPPO75sLnH/thumb.jpg" alt="web components"&gt;
&lt;sub&gt;&lt;em&gt;This article originally appeared on the &lt;a href="https://divshot.com/"&gt;Divshot&lt;/a&gt; blog. Divshot is a developer-focused platform for deploying modern front-end applications. It was also started with Intridea&amp;#39;s support by Michael Bleigh!&lt;/em&gt; &lt;/sub&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;The next release of Polymer, 0.8, is going to be a doozy. It&amp;#39;s the first release on the &amp;quot;heading towards production&amp;quot; track and it&amp;#39;s going to have some pretty massive differences from previous versions. So what exactly is new, and what&amp;#39;s changing?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This data was gathered primarily from reading the &lt;a href="https://github.com/Polymer/polymer/blob/0.8-preview/PRIMER.md"&gt;Polymer 0.8 Primer&lt;/a&gt; which is very, very extensive. I&amp;#39;m just hitting the highlights. Also note that any of this could change before the final release is cut.&lt;/p&gt;

&lt;h3&gt;A Tale of Three Polymers&lt;/h3&gt;

&lt;p&gt;&lt;img src="http://media.giphy.com/media/sY1yvrxROgCM8/giphy.gif" alt="Three Polymigos"&gt;&lt;/p&gt;

&lt;p&gt;One of the biggest changes in 0.8 is that there is no longer a single Polymer library. Instead, it&amp;#39;s been broken into the three &amp;quot;layers&amp;quot; of &lt;code&gt;polymer-micro&lt;/code&gt;, &lt;code&gt;polymer-mini&lt;/code&gt;, and &lt;code&gt;polymer&lt;/code&gt;. Why the change?&lt;/p&gt;

&lt;p&gt;Remember, Polymer is really just a layer on top of the Web Components standards. Web Components are meant to be inter-operable with each other regardless of things like which framework was used to build them. Creating lighter-weight versions of Polymer makes it an easier choice for authors of reusable components by being less of an install burden. So which library should you use when?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;polymer-micro&lt;/strong&gt; has only a bare layer of sugar on top of the raw DOM APIs and a few niceties. You don&amp;#39;t get any DOM template stamping facilities, so this is really meant for reusable elements with little to no DOM interaction (e.g. &lt;code&gt;core-ajax&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;polymer-mini&lt;/strong&gt; layers some DOM control on top of micro and lets you do template stamping (but &lt;strong&gt;not&lt;/strong&gt; template binding). Also gives you access to &lt;code&gt;&amp;lt;content&amp;gt;&lt;/code&gt; and the new &lt;code&gt;lightDOM&lt;/code&gt; and &lt;code&gt;localDOM&lt;/code&gt; properties.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;polymer&lt;/strong&gt; is the closest thing to 0.5 (but still quite a bit different). It adds on attribute and property observation, template data binding, layout attributes, and more. This is what you&amp;#39;re going to want to use if you&amp;#39;re building a Polymer &lt;em&gt;application&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Things You Can&amp;#39;t Do Anymore&lt;/h3&gt;

&lt;p&gt;When you first look at 0.8 you may be a bit surprised. There&amp;#39;s actually many things from 0.5 that are &lt;em&gt;gone&lt;/em&gt;, vanished, kaput. It all has to do with production readiness. Polymer 0.8 is built to be lean, mean, and a foundation for shipping production code. Some of the more expensive (computationally and/or filesize-wise) features have been nixed. Watch the &lt;a href="https://www.youtube.com/watch?v=0LT6W5QVCJI"&gt;Polymer State of the Union&lt;/a&gt; talk for more detail there.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Elements can&amp;#39;t inherit from custom elements anymore, only native. It&amp;#39;s marked as a todo, but it&amp;#39;s unclear if it&amp;#39;s a before-0.8-launches todo.&lt;/li&gt;
&lt;li&gt;Template binding is substantially less powerful than it was in Polymer 0.5, as is property observation. Everything&amp;#39;s more explicit, and more is expected to happen in JS vs declared in templates.&lt;/li&gt;
&lt;li&gt;Polymer will no longer ship with a spec-complete Shadow DOM polyfill. This was one of the biggest performance bottlenecks in non-Chrome browsers. The new polyfill implementation will be &amp;quot;Shady DOM&amp;quot; (details TBD).&lt;/li&gt;
&lt;li&gt;Property observation &lt;a href="https://github.com/Polymer/polymer/blob/0.8-preview/PRIMER.md#compound-property-effects"&gt;does a bit less magic&lt;/a&gt;, you&amp;#39;ll have to manually debounce some things.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Things That Are Different&lt;/h3&gt;

&lt;p&gt;In addition to removing some of the heavier features, there are also lots of structural changes to how you build custom elements. Here&amp;#39;s a non-comprehensive list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;polymer-element&amp;gt;&lt;/code&gt; is gone. Now you use the &lt;code&gt;Polymer&lt;/code&gt; JS function to register your element, and the new &lt;a href="https://github.com/Polymer/polymer/blob/0.8-preview/PRIMER.md#template-stamping-into-local-dom"&gt;&lt;code&gt;dom-module&lt;/code&gt;&lt;/a&gt; element to specify templates.&lt;/li&gt;
&lt;li&gt;You use the &lt;code&gt;is&lt;/code&gt; property to declare the element name in a Polymer registration, e.g. &lt;code&gt;Polymer({is: &amp;#39;my-element&amp;#39;})&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Attribute bindings now work based on dash-case instead of camel-case (i.e. &lt;code&gt;&amp;lt;my-element first-name=&amp;quot;{{name}}&amp;quot;&amp;gt;&lt;/code&gt; binds to the &lt;code&gt;firstName&lt;/code&gt; property. &lt;strong&gt;I am super happy about this, camel-case attributes are hideous.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;You should now use the &lt;a href="https://github.com/Polymer/polymer/blob/0.8-preview/PRIMER.md#dom-api"&gt;&lt;code&gt;lightDOM&lt;/code&gt; and &lt;code&gt;localDOM&lt;/code&gt;&lt;/a&gt; APIs to manipulate element DOM so that they are maintained properly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Here, Bite Down on This&lt;/h3&gt;

&lt;p&gt;&lt;img src="http://media.giphy.com/media/OCu7zWojqFA1W/giphy.gif" alt="Hold on to your butts."&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#39;m not going to lie, if you&amp;#39;re building stuff with Polymer the transition to 0.8 is going to hurt, bad. There&amp;#39;s very little that won&amp;#39;t need to be rewritten significantly (if not from scratch). That being said, &lt;strong&gt;this is a totally necessary transition&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;As Matt McNulty said in his Polymer State of the Union, Polymer started as an experiment, and with 0.8 that experiment is over. It&amp;#39;s time for Polymer to transition from a fun future-facing toy that we can dream about into a serious, performance-oriented tool we can use to ship real code.&lt;/p&gt;

&lt;p&gt;By focusing on performance and footprint, the Polymer team is laying a practical foundation upon which much can be built. And yes, the changes are pretty drastic, but they&amp;#39;re throwing them at us all at once. The plan is for the API to change minimally between 0.8 and 1.0, so (fingers crossed) this will be the biggest rewrite you ever have to do for Polymer.&lt;/p&gt;

&lt;h3&gt;Lingering Questions&lt;/h3&gt;

&lt;p&gt;I&amp;#39;ve been drinking the Web Components Kool-Aid since Polymer was first announced at Google I/O in 2013. The encapsulation and composability of custom elements is revolutionary for web apps. As we start looking at the road to production-ready Web Components, however, I still have a few questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How will module loading shake out? With Mozilla &lt;a href="https://hacks.mozilla.org/2014/12/mozilla-and-web-components/"&gt;backing away from HTML Imports&lt;/a&gt; and ES6 gaining popularity, it seems like there&amp;#39;s a growing rift in how to do this properly. This is a key issue that needs to be sorted out; you shouldn&amp;#39;t need a build step to do basic module loading for a web app.&lt;/li&gt;
&lt;li&gt;The DOM is big and unwieldy. Can we incorporate some of the gains of Virtual DOM tech into Polymer and/or the Web Components specs themselves? The concept of &amp;quot;Local DOM&amp;quot; or &amp;quot;Shadow DOM&amp;quot; gives us a clean encapsulation point, maybe soon we can get some of the benefits of React and its kin.&lt;/li&gt;
&lt;li&gt;When are Apple and Microsoft going to get fully on board with Web Components? The true promise of Polymer can&amp;#39;t be realized until we have native browser support for the standards in all browsers.&lt;/br&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;hr&gt;

&lt;p&gt;Questions aside, I&amp;#39;m excited for Polymer 0.8 and we will continue to champion Web Components here at Divshot. Latest estimates put 0.8 landing sometime in March; I can&amp;#39;t wait!&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="http://www.intridea.com">
    <author>
      <name>Demetri Ganoff</name>
    </author>
    <id>tag:www.intridea.com,2015-03-03:776</id>
    <published>2015-03-03T00:00:00Z</published>
    <updated>2015-03-03T00:00:00Z</updated>
    <category term="AngularJS"/>
    <link rel="alternate" type="text/html" href="http://www.intridea.com/blog/2015/3/3/angularjs-any-loader-module"/>
    <title>AngularJS Any Loader Module</title>
    <content type="html">&lt;p&gt;&lt;img src="https://s3.amazonaws.com/uploads.hipchat.com/7195/313437/y4wuV05QEk1NDMt/any-loader.jpg" alt="Angularjs Anyloader"&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;At one point or another, AngularJS applications will rely on loading data. And when that moment arrives, it&amp;#39;s nice to let your users know about it. The most common practice is some variation of a loading indicator. You’ve seen them; the spinning circle of patience, that only disappears when whatever you were waiting for finally arrives - hooray!&lt;/p&gt;

&lt;h4&gt;Any Loader To the Rescue&lt;/h4&gt;

&lt;p&gt;Wouldn’t it be great if you could add these loading indicators to your app by dropping a simple directive into your markup? At Intridea we&amp;#39;ve developed &lt;code&gt;any-loader-ng&lt;/code&gt;, a module to easily display a loading indicator anywhere in your app. The module has two highly customizable directives for a stand-alone loading spinner (&lt;code&gt;&amp;lt;any-loader&amp;gt;&lt;/code&gt;) and a button with multiple loading state configurations (&lt;code&gt;&amp;lt;loader-button&amp;gt;&lt;/code&gt;). Both directives can accept a simple configuration object that determine the loading behavior. We’ve also used Font Awesome as the icon font with the default spinner icon being &lt;code&gt;fa-spinner&lt;/code&gt;, but that can be customized.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here we have the &lt;code&gt;&amp;lt;any-loader&amp;gt;&lt;/code&gt; directive in its simplest form:&lt;/p&gt;

&lt;p&gt;Controller:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var loaderConfig = {
  &amp;quot;isLoading&amp;quot;: false
};
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Markup:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;any-loader cfg=”loaderConfig”&amp;gt;&amp;lt;/any-loader&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;By changing the controller’s loaderConfig.isLoading value to true, perhaps while you are loading some data over HTTP, it will enable the loading indicator to be displayed. There are other optional properties you can add to the configuration object to further customize the directive. The &lt;code&gt;size&lt;/code&gt; property takes a string to change the css &lt;code&gt;font-size&lt;/code&gt; of the icon (i.e. ‘3em’) to suit your visual needs. The &lt;code&gt;iconClass&lt;/code&gt; property allows you to override the default icon class with whichever you choose. These customizations make the directive versatile enough for almost any app.&lt;/p&gt;

&lt;p&gt;This time, let’s take a look at using all the optional configurations for the &lt;code&gt;&amp;lt;loader-button&amp;gt;&lt;/code&gt; directive.&lt;/p&gt;

&lt;p&gt;Controller:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var buttonConfig = {
  &amp;quot;label&amp;quot;: &amp;quot;Load Something&amp;quot;,
  &amp;quot;isLoading&amp;quot;: false,
  &amp;quot;isSuccess&amp;quot;: false,
  &amp;quot;isFail&amp;quot;: false,
  &amp;quot;successMsg&amp;quot;: &amp;quot;Success!&amp;quot;,
  &amp;quot;failMsg&amp;quot;: &amp;quot;Failed :(&amp;quot;
};
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Markup:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;loader-button cfg=&amp;quot;buttonConfig&amp;quot;&amp;gt;&amp;lt;/loader-button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With this configuration, there are four separate states of the button: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; the default state uses the `label` as the button text&lt;/li&gt; 
&lt;li&gt;the loading state uses the loading indicator as the button text&lt;/li&gt; 
&lt;li&gt;the successful state uses the `successMsg` as the button text&lt;/li&gt; 
&lt;li&gt;the failed state uses the `failMsg` as the button text&lt;/li&gt; 
&lt;/ol&gt; 

&lt;p&gt;The button is also disabled while loading and after it finishes (regardless if it succeeds or fails).&lt;/p&gt;

&lt;h4&gt;Installing the Module&lt;/h4&gt;

&lt;p&gt;The module can be added to your project through Bower. Simply install the package using this line in your terminal:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;bower install any-loader-ng --save-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Once downloaded, the module requires AngularJS and Font Awesome to work properly, so be sure to have those downloaded and added to your project. To include the module to your project, just add the &lt;code&gt;&amp;lt;bower directory&amp;gt;/any-loader-ng/dist/any-loader-ng.min.js&lt;/code&gt; file. We’ve distributed a non-minified version for development as well.&lt;/p&gt;

&lt;p&gt;Adding the module to your AngularJS application is the same as any other module dependency:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;angular.module(‘myApp’, [‘anyLoader’]);
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Go Load Stuff!&lt;/h4&gt;

&lt;p&gt;Thanks to Any Loader, there’s one less thing you have to worry about in your next AngularJS project! Check out this &lt;a href="http://plnkr.co/edit/S5m4le3q9Yfvz7IZPuLC?p=preview"&gt;demo&lt;/a&gt; created to show off all the wonderful ways to use Any Loader.&lt;/br&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:base="http://www.intridea.com">
    <author>
      <name>Michael Bleigh</name>
    </author>
    <id>tag:www.intridea.com,2015-02-12:775</id>
    <published>2015-02-12T00:00:00Z</published>
    <updated>2015-02-12T00:00:00Z</updated>
    <category term="web components"/>
    <category term="polymer"/>
    <link rel="alternate" type="text/html" href="http://www.intridea.com/blog/2015/2/12/let-s-kill-semantic-html"/>
    <title>Let's Kill Semantic HTML</title>
    <content type="html">&lt;p&gt;&lt;img src="https://s3.amazonaws.com/uploads.hipchat.com/7195/313437/qWSh2TPPO75sLnH/thumb.jpg" alt="web components"&gt;
&lt;sub&gt;&lt;em&gt;This article originally appeared on the &lt;a href="https://divshot.com/"&gt;Divshot&lt;/a&gt; blog. Divshot is a developer-focused platform for deploying modern front-end applications. It was also started with Intridea&amp;#39;s support by Michael Bleigh!&lt;/em&gt; &lt;/sub&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;I&amp;#39;m going to say something that (even in my own head) seems downright heretical. &lt;strong&gt;It&amp;#39;s time to move past rigid separation of presentation and markup in web applications.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Many of us have been building things for the web long enough to remember the dark times, in the long-long-ago. Back when tables were used for layout, and the whole web looked, well, &lt;a href="http://code.divshot.com/geo-bootstrap/"&gt;something like this&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As the web matured, we developers realized that six-deep nested tables weren&amp;#39;t, perhaps, the best way to build things. And so began the age of the &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;. CSS allowed us to do everything (sort of, with a lot of hacky workarounds) we had done with tables, but now our markup could be gloriously free of style information. Gone were the &lt;code&gt;&amp;lt;font&amp;gt;&lt;/code&gt; tags. Use of the &lt;code&gt;style&lt;/code&gt; attribute became taboo, a sign of semantic weakness. And it was, if not good, at least better.&lt;/p&gt;

&lt;p&gt;Somewhere around this time, however, a second important trend was brewing: the birth of the web application. Web sites that weren&amp;#39;t just ways to display one&amp;#39;s intense fandom for Doom II, but were ways to actually &lt;em&gt;do&lt;/em&gt; things. As it turns out, browsers are quite the distribution mechanism.&lt;/p&gt;

&lt;h3&gt;Give and Take&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;True Fact:&lt;/strong&gt; Square pegs do go in round holes if you hammer hard enough. That&amp;#39;s how we used to get rounded corners.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As web applications grew more and more sophisticated, the contortions we applied using CSS to maintain semantics grew ever more bizarre. Floats within floats within relative-positioned negative-margin containers. Triple-nested &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; tags for that perfect sliding door rounded corner tab effect. The poor browsers, created to scroll top-to-bottom through a document&amp;#39;s content, were being vigorously abused for the sake of better, more interactive applications.&lt;/p&gt;

&lt;p&gt;Fortunately, browser standards change over time. Under the flag of HTML5 we got rounded corners, gradients, background image sizing, new tags like &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;. We even got stuff we didn&amp;#39;t have to think about before, like media queries to make sites work on fast-growing mobile device categories. Our semantics were more semantic than ever, our buttons as glossy and round as we could ever care for them to be.&lt;/p&gt;

&lt;p&gt;Building a proper interface or application layout, however, had scarcely gotten easier. Why is that? &lt;strong&gt;Because the semantics of HTML don&amp;#39;t match those of application interfaces.&lt;/strong&gt; Paragraphs, sections, articles, and lists are semantics that make sense in the context of a document, not an application.&lt;/p&gt;

&lt;h3&gt;Quibbling the Semantics of Semantic HTML&lt;/h3&gt;

&lt;p&gt;The document/application disconnect has given rise to frameworks like &lt;a href="http://getbootstrap.com/"&gt;Bootstrap&lt;/a&gt; that provide much-desired UI widgets and layout constructs for building &lt;em&gt;applications&lt;/em&gt;, not documents. You&amp;#39;ll often see developers cringe at the inherent &amp;quot;wrongness&amp;quot; of &amp;quot;polluting&amp;quot; markup with Bootstrap classes. I posit that this is a reflexive and inappropriate reaction to what&amp;#39;s really taking place.&lt;/p&gt;

&lt;p&gt;Bootstrap, Foundation, and other similar projects are doing their best to equip developers with new semantics to describe interfaces. Interfaces are inherently visual; positioning, size, relative placement, and alignment are central semantic considerations for an interface&amp;#39;s structure. There is no bright line between content and presentation because the presentation &lt;em&gt;is&lt;/em&gt; the content.&lt;/p&gt;

&lt;p&gt;Just look at modern JavaScript applications. Oftentimes the &amp;quot;document&amp;quot; content, the bit that was once central to the &amp;quot;semanticity&amp;quot; of a site, is JSON data loaded &lt;em&gt;after the page loads&lt;/em&gt; and rendered to the interface using any of a number of client-side technologies. The HTML in these applications describes something fundamentally different from a rich text document.&lt;/p&gt;

&lt;h3&gt;Semantics are Dead, Long Live Semantics&lt;/h3&gt;

&lt;p&gt;UI and JavaScript frameworks provide stopgap measures to increase &amp;quot;app semanticity&amp;quot; in HTML, but they still function largely as hacks grafted onto an old, creaking system. Luckily for all of us, native solutions are finally beginning to arrive.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://philipwalton.github.io/solved-by-flexbox/"&gt;&lt;strong&gt;Flexbox&lt;/strong&gt;&lt;/a&gt; solves many (if not most) of the fundamentally difficult aspects of building proper application layouts with HTML and CSS. It is a standard that gives us the power to do, and do it right.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://webcomponents.org/"&gt;&lt;strong&gt;Web Components&lt;/strong&gt;&lt;/a&gt; offer us a real solution to the issue of app vs. content semantics. Namely, &lt;strong&gt;they let us define our own&lt;/strong&gt;. If paragraphs and blockquotes don&amp;#39;t suit your semantic requirements, how about &lt;code&gt;user-profile&lt;/code&gt; or &lt;code&gt;google-map&lt;/code&gt;? By freeing us from a set of predetermined tags, Web Components allow us to construct our own semantic context. They are going to change &lt;em&gt;everything&lt;/em&gt; about how we build web applications.&lt;/p&gt;

&lt;p&gt;The web is and will continue to be the best content distribution platform in existence. Nothing can rival its reach and simplicity. Now, after an extended awkward phase, the web seems finally ready to fight to ensure its spot as the best app distribution platform as well.&lt;/p&gt;

&lt;h3&gt;A Taste of the Future&lt;/h3&gt;

&lt;p&gt;What exactly does interface-semantic HTML look like? We can glimpse one possible future in &lt;a href="http://www.polymer-project.org/"&gt;Polymer&lt;/a&gt;, Google&amp;#39;s Web Components polyfill and oh-so-much-more. It ships with a collection of &lt;a href="http://www.polymer-project.org/docs/polymer/layout-attrs.html"&gt;layout attributes&lt;/a&gt; that allow developers to leverage Flexbox almost effortlessly.&lt;/p&gt;

&lt;p&gt;Let&amp;#39;s say I want my page to flow with a fixed header, then some content, then a footer at the bottom. Using layout attributes, it looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;body fullbleed vertical layout&amp;gt;
  &amp;lt;header&amp;gt;My Header content here&amp;lt;/header&amp;gt;
  &amp;lt;section flex id=&amp;quot;main&amp;quot;&amp;gt;My main content&amp;lt;/section&amp;gt;
  &amp;lt;footer&amp;gt;
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With no custom CSS and a declarative syntax that reads almost like English, the layout attributes offer simple semantics with a kind of &amp;quot;it just works&amp;quot; magic to them. Memorize a few keywords and you can build complex application layouts just about as fast as you can type.&lt;/p&gt;

&lt;p&gt;I don&amp;#39;t know whether Polymer&amp;#39;s layout attributes are the best way forward. What I do know is that using them feels natural, almost addictive. HTML is remarkable for its ability to be declarative and compositional. Polymer offers one potential solution, but the biggest potential lies in the ability of developers everywhere to strike out in new directions, ignoring the constraints of the past. We&amp;#39;re going to make some mistakes, we&amp;#39;re going to take things too far; that&amp;#39;s how progress is made!&lt;/p&gt;

&lt;h3&gt;What to Take Away&lt;/h3&gt;

&lt;p&gt;When building applications (as opposed to authoring documents), the structure of HTML should be judged not on how closely it adheres to semantics of &lt;em&gt;content&lt;/em&gt; but to those of &lt;em&gt;interface&lt;/em&gt;. Don&amp;#39;t sacrifice the future on the altar of semantic purity. The next time that vein in your forehead starts throbbing at some &amp;quot;non-semantic&amp;quot; HTML, ask yourself: what are the true semantics at play?&lt;/p&gt;

&lt;p&gt;It&amp;#39;s early days for the next HTML revolution. I strongly encourage everyone to start learning, start experimenting, and start questioning the status quo. The best practices of the future haven&amp;#39;t been discovered yet. Now&amp;#39;s your chance to play a part in writing them. My suggestions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Play with Web Components. The &lt;a href="http://www.polymer-project.org/"&gt;Polymer site&lt;/a&gt; is probably the most comprehensive starting point for practical use today.&lt;/li&gt;
&lt;li&gt;Challenge your assumptions. Pretend you aren&amp;#39;t scarred by years of battling HTML. What would your HTML look like if &lt;em&gt;you&lt;/em&gt; defined the semantics?&lt;/li&gt;
&lt;li&gt;Share your results! No one has invented the best way to do just about anything with Web Components yet. The more people there are thinking, doing, and sharing, the faster we&amp;#39;ll discover those as a community.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let&amp;#39;s all go forth and define the semantics of a new generation. The web platform, despite being more than 20 years old, is still in its infancy.&lt;/p&gt;

&lt;h3&gt;Update: Let&amp;#39;s NOT Kill Accessibility&lt;/h3&gt;

&lt;p&gt;As was pointed out in the comments, many users of the web have needs other than
just looking at things and clicking on them. This post was aimed at the dogmatism
of &amp;quot;pure&amp;quot; markup and was in no way intended to encourage making the web less
accessible. Here are a couple great links about keeping accessibility while
building Web Components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://marcysutton.github.io/accessibility-of-web-components/slides.html#/slide1"&gt;Accessibility of Web Components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.paciellogroup.com/blog/2014/09/web-components-punch-list/"&gt;Web Components Punch List&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks to &lt;a href="https://twitter.com/stommepoes"&gt;@stommepoes&lt;/a&gt;, &lt;a href="https://twitter.com/aardrian"&gt;@aardrian&lt;/a&gt;, and &lt;a href="https://twitter.com/marcysutton"&gt;@marcysutton&lt;/a&gt; for pointing out the omission
and supplying the links! We should remember that putting users first isn&amp;#39;t just a
good idea, &lt;a href="http://www.w3.org/TR/html-design-principles/#priority-of-constituencies"&gt;it&amp;#39;s the standard&lt;/a&gt;!&lt;/br&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Any questions, thoughts, ideas?&lt;/strong&gt; &lt;a href="http://www.twitter.com/intridea"&gt;Send &amp;#39;em our way&lt;/a&gt;!&lt;/p&gt;
</content>
  </entry>
</feed>
