<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Allan White</title>
    <description>The latest articles on DEV Community by Allan White (@allanwhite).</description>
    <link>https://dev.to/allanwhite</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F247210%2Ffa7de4fe-a8ab-4f83-b90a-ab9fe48564d8.jpg</url>
      <title>DEV Community: Allan White</title>
      <link>https://dev.to/allanwhite</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/allanwhite"/>
    <language>en</language>
    <item>
      <title>CSS-only horizontally-scrolling cards with snapping</title>
      <dc:creator>Allan White</dc:creator>
      <pubDate>Thu, 17 Oct 2019 23:03:15 +0000</pubDate>
      <link>https://dev.to/allanwhite/css-only-horizontally-scrolling-cards-with-snapping-pl0</link>
      <guid>https://dev.to/allanwhite/css-only-horizontally-scrolling-cards-with-snapping-pl0</guid>
      <description>&lt;p&gt;It's a common design problem to have content cards to lay out in different arrangements in various viewports. In this exploration, I wanted to see how cards might be more effectively organized using a simple design pattern of a scrolling horizontal list. Try it on mobile:&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/allanwhite/embed/oNNbpqx?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;It's implemented with CSS, and doesn't require any scripting for the layout or interactions. &lt;a href="https://github.com/ApoorvSaxena/lozad.js"&gt;Lozad&lt;/a&gt; is used for lazy-loading.&lt;/p&gt;

&lt;p&gt;There's some nice hover effects in place, CSS custom properties, and I use a simple CSS mask gradient on the edge to indicate there are more cards. &lt;em&gt;To-do:&lt;/em&gt; Enable &lt;code&gt;tabindex&lt;/code&gt; for accessibilty.&lt;/p&gt;

&lt;p&gt;I experimented with more robust CSS grid layout for the cards, but I found after playing with it on mobile it was overkill.&lt;/p&gt;

</description>
      <category>codepen</category>
    </item>
    <item>
      <title>Figma Tutorial: Automating production with Google Sheets</title>
      <dc:creator>Allan White</dc:creator>
      <pubDate>Fri, 11 Oct 2019 06:30:43 +0000</pubDate>
      <link>https://dev.to/allanwhite/figma-tutorial-automating-production-with-google-sheets-2b94</link>
      <guid>https://dev.to/allanwhite/figma-tutorial-automating-production-with-google-sheets-2b94</guid>
      <description>&lt;p&gt;Making social share images can be fun — until you have to make dozens at once. &lt;/p&gt;

&lt;p&gt;We went through a company merger this summer, and with it came a large set of blog posts and podcasts we had to migrate from Wordpress to Contentful (Narrator: &lt;em&gt;It was not fun.&lt;/em&gt;). One task we decided to circle back on was creating social share images, as the original content didn't have them. We kept putting it off because of the time involved.&lt;/p&gt;

&lt;p&gt;Then Figma &lt;a href="https://www.figma.com/blog/introducing-figma-plugins/"&gt;introduced their plugin infrastructure&lt;/a&gt;, and a thousand plugins bloomed! I swear, there's a &lt;a href="https://twitter.com/allanwhite/status/1181415822251761664?s=20"&gt;new one&lt;/a&gt; every day. Magically, a Google Sheets integration didn't take long to emerge. I decided to give it a try. Here's a &lt;a href="https://twitter.com/allanwhite/status/1176979129201086464?s=20"&gt;short overview&lt;/a&gt; of the concept: &lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
      &lt;div class="ltag__twitter-tweet__media ltag__twitter-tweet__media__video-wrapper"&gt;
        &lt;div class="ltag__twitter-tweet__media--video-preview"&gt;
          &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o7EoAHa3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/ext_tw_video_thumb/1176979047961595905/pu/img/76b6wSgIVuM_NYFx.jpg" alt="unknown tweet media content"&gt;
          &lt;img src="/assets/play-butt.svg" class="ltag__twitter-tweet__play-butt" alt="Play butt"&gt;
        &lt;/div&gt;
        &lt;div class="ltag__twitter-tweet__video"&gt;
          
            
          
        &lt;/div&gt;
      &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--7GhLntb3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1121844396708642816/DXB3amaP_normal.png" alt="Allan White profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Allan White
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        &lt;a class="comment-mentioned-user" href="https://dev.to/allanwhite"&gt;@allanwhite&lt;/a&gt;

      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      Fun with Figma: Data-driven design automation with the Google Sheets &lt;a href="https://twitter.com/figmadesign"&gt;@figmadesign&lt;/a&gt; plugin by &lt;a href="https://twitter.com/DavidWilliames"&gt;@DavidWilliames&lt;/a&gt; &lt;a href="https://twitter.com/hashtag/howto"&gt;#howto&lt;/a&gt; &lt;a href="https://twitter.com/hashtag/tutorial"&gt;#tutorial&lt;/a&gt; &lt;a href="https://twitter.com/hashtag/designops"&gt;#designops&lt;/a&gt;&lt;br&gt;&lt;br&gt;Full version in the thread. 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      21:57 PM - 25 Sep 2019
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1176979129201086464" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1176979129201086464" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      0
      &lt;a href="https://twitter.com/intent/like?tweet_id=1176979129201086464" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      20
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;And here's a &lt;a href="https://twitter.com/allanwhite/status/1177311499171139584?s=20"&gt;detailed version&lt;/a&gt;: &lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
      &lt;div class="ltag__twitter-tweet__media ltag__twitter-tweet__media__video-wrapper"&gt;
        &lt;div class="ltag__twitter-tweet__media--video-preview"&gt;
          &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7soMpgdH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/ext_tw_video_thumb/1177311189484765184/pu/img/yJlL0E3q2tSP18QK.jpg" alt="unknown tweet media content"&gt;
          &lt;img src="/assets/play-butt.svg" class="ltag__twitter-tweet__play-butt" alt="Play butt"&gt;
        &lt;/div&gt;
        &lt;div class="ltag__twitter-tweet__video"&gt;
          
            
          
        &lt;/div&gt;
      &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--7GhLntb3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1121844396708642816/DXB3amaP_normal.png" alt="Allan White profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Allan White
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        &lt;a class="comment-mentioned-user" href="https://dev.to/allanwhite"&gt;@allanwhite&lt;/a&gt;

      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      Auto-generating Twitter share cards from Contentful posts with Middleman and &lt;a href="https://twitter.com/figmadesign"&gt;@figmadesign&lt;/a&gt;. Been neck-deep in it lately, so here's another mini-tutorial: 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      19:58 PM - 26 Sep 2019
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1177311499171139584" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1177311499171139584" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      2
      &lt;a href="https://twitter.com/intent/like?tweet_id=1177311499171139584" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      4
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;After having one of our interns update all the background images in the old entries, I ran the script again and produced a nice pile of new share images to attach to the entries. It worked like a charm — but was a bit challenging to get there (mostly because of setting up the Google Sheet correctly).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nha7F3IK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/suomb8015llu88mrk4uw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nha7F3IK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/suomb8015llu88mrk4uw.jpg" alt="Finished Figma output."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What's missing (far as I can tell): auto-generation of content frames (you have to clone them in advance), and smart layer naming for export (that really sucked). It's early in the game still. It's useful today. &lt;a href="https://www.figma.com/c/plugin/740286071386014712/Data-Lab"&gt;The Data Lab plugin&lt;/a&gt; looks promising, and I'm keeping an eye on new data-integration possibilities. It should be possible to directly connect to data sources like Contentful and other headless CMS apps.&lt;/p&gt;

</description>
      <category>figma</category>
      <category>design</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>It's all about relationships: Keeping data models simpler, more reusable, and powerful</title>
      <dc:creator>Allan White</dc:creator>
      <pubDate>Fri, 11 Oct 2019 00:32:37 +0000</pubDate>
      <link>https://dev.to/allanwhite/it-s-all-about-relationships-keeping-data-models-simpler-more-reusable-and-powerful-257o</link>
      <guid>https://dev.to/allanwhite/it-s-all-about-relationships-keeping-data-models-simpler-more-reusable-and-powerful-257o</guid>
      <description>&lt;p&gt;When envisioning your content for a marketing website (or really, any web project) it's useful to visualize your &lt;em&gt;entity types&lt;/em&gt; before getting started. “Entities” are a fancy way of saying, “types of things”. What are the main bits of content that are unique? What other  types are reusable (for example, blog authors or people in general)? In this post, I'll look at how we identified these data types, and leveraged the Related Entries features of &lt;a href="https://contentful.com"&gt;Contentful&lt;/a&gt; for running our marketing site, &lt;a href="https://datica.com/"&gt;Datica.com&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Elegance: between complexity and power
&lt;/h2&gt;

&lt;p&gt;The universe of programming contains some helpful concepts that are useful for achieving one of my favorite adjectives: &lt;em&gt;elegance&lt;/em&gt;. Elegance, for me, represents a pleasing balance between complexity and power. It’s tempting to go crazy with a feature like Related Entries—but this can increase complexity and make things harder to manage. &lt;/p&gt;

&lt;p&gt;In my career, I’m usually building a site for someone else: a marketing team or other group who is producing content using the publishing tools I’m building. Often, we’re not the ones &lt;em&gt;using&lt;/em&gt; the CMS; a complex workflow or deeply nested content model can easily confuse the ones doing the publishing. &lt;/p&gt;

&lt;p&gt;I find that when it comes to content modeling, it’s best not to over-plan at the beginning, but take a more iterative approach. There are usually some obvious types of things (i.e. entities or content types) that make sense as related types, like blog authors or call-to-action banners. Starting with a basic set of fields and adding on as you go vastly simplifies the work rendering that content in your templating system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Assessing your content model
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Case study: A blog entry
&lt;/h3&gt;

&lt;p&gt;In this example, we examine a blog entry, which has both regular and related fields. &lt;a href="https://datica.com/blog/mapping-digital-health-dr-ethan-bechtel-ohmd/"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GRv0BgY0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/oi5gv1tuovf3yvc0ei4l.jpg" alt="blog screenshot example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;td&gt;Short text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slug&lt;/td&gt;
&lt;td&gt;Short text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Publish Date&lt;/td&gt;
&lt;td&gt;Date &amp;amp; time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tags&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;References, many&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Categories, Blog&lt;/td&gt;
&lt;td&gt;Short text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Author&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Featured Image&lt;/td&gt;
&lt;td&gt;Media&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Social Share Image&lt;/td&gt;
&lt;td&gt;Media&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Summary&lt;/td&gt;
&lt;td&gt;Long text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lead&lt;/td&gt;
&lt;td&gt;Long text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Featured Person&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Main Entry&lt;/td&gt;
&lt;td&gt;Long text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Call to Action&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Related Entries&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;References, many&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discovery Topic&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;How did we go about deciding which fields to make referenced fields (in bold here), and which to remain as part of the core entry? &lt;strong&gt;Reusability&lt;/strong&gt;, &lt;strong&gt;scalability&lt;/strong&gt;, and &lt;strong&gt;development costs&lt;/strong&gt; are the primary considerations when planning related entries. It’s really tempting to go crazy and add lots of custom fields and related fields. These all come with a cost in development time, tech debt, and content training and management.&lt;/p&gt;

&lt;p&gt;Questions I ask myself and the team I’m building the system for: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How common would this related entry be across all entries of a given type? Of other types? Authors, for example, are a near-universal entity type across blog entries. A related product or service might be fairly rare. &lt;/li&gt;
&lt;li&gt;How unique to this parent entry or type is the proposed related type? Is it going to be used &lt;em&gt;only&lt;/em&gt; with say, a blog entry, or is it useful in many places? Quotes were an early entity type that were intended to be associated in lots of places and with many other content types—product pages, customer case studies, etc. I actually got into a bit of trouble with this one when it came to the Customer data model, where Case Study entries contain Customers who contain Quotes… which one gets displayed? It was a bit of a mess on the template side. Don’t be too slick!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A list of our “Metadata bits”
&lt;/h2&gt;

&lt;p&gt;Here’s a few key related entry types that we ended up with and have proven their usefulness:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Calls to action (CTAs).&lt;/strong&gt; These can be associated with any entry, and have some complex variable features themselves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forms and Scripts.&lt;/strong&gt; These are used like CTAs, but for embedding our Hubspot forms (though can be used in other ways too).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;People.&lt;/strong&gt; These are probably the most heavily-used related content type, and is used for everything from our company leadership directory to customer profiles to guest authors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Products/services&lt;/strong&gt; and features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tags&lt;/strong&gt; which are used for search and SEO purposes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Events&lt;/strong&gt; are talks, meetups, tradeshows, or webinars. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quotes&lt;/strong&gt; are related to people, customers, landing pages, and even used for press quotes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bulletproofing your related content
&lt;/h2&gt;

&lt;p&gt;If you relate something, you must consider what that piece of content looks like when rendered. A button? A simple link? A card, with an image preview and other related metadata? What are your fallback and content truncation rules? Some of these problems are managed through content governance, like limiting the length of text fields, or helpful help and error text (all of which happens on the Contentful side, in this case). Other aspects of bulletproofing your related content must happen on the template side. In the process of learning Ruby ERB and now, Slim templating for our Middleman static site, I discovered early on that not checking for the presence of fields would break the entire static site build. &lt;/p&gt;

&lt;p&gt;I learned early in my career that content authors cannot see or envision these limitations—they need us to train them and the “system” that we build for them to handle missing fields, too-large images, or content gaps elegantly with a minimum of fuss. &lt;/p&gt;

&lt;h2&gt;
  
  
  A case study: single-page content app
&lt;/h2&gt;

&lt;p&gt;We have some fairly complex data models involving Datica's &lt;a href="//datica.com/dhsf"&gt;Digital Health Success Framework&lt;/a&gt;. At launch, the content is managed using hand-written yaml data files. It was such a new concept (layered timelines, complex interactions, lots of little metadata bits on each entry, etc.) that we didn’t know what would be needed at first. It being a new experimental concept also meant we didn’t know if it would take off or not—no sense overbuilding a web product that’s one-and-done. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S0CshU8X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/mr45277tcaio5gelhcw6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S0CshU8X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/mr45277tcaio5gelhcw6.png" alt="DHSF timeline screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After a few months, the design &amp;amp; data model iterations had slowed and the data model stabilized. The pace of updates (we added a new layer or dimension, and the time scale changed) also fell into a pattern that we could predict.&lt;/p&gt;

&lt;p&gt;Read more about the &lt;a href="https://allanwhite.design/work/digital-health-success-framework/"&gt;development of the DHSF&lt;/a&gt; at my site.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fundamental Questions For Content Modeling
&lt;/h2&gt;

&lt;p&gt;When evaluating how much effort to put into making content managed in a CMS, I ask questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How often will this content need to be added or updated?&lt;/li&gt;
&lt;li&gt;How many different people need to be able to make these changes?&lt;/li&gt;
&lt;li&gt;What skill or subject expertise will authors need?&lt;/li&gt;
&lt;li&gt;How deeply does this content need to be integrated with other content? &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This last point is one that can be a real rabbit hole, sucking you into an inception-like world of complexity and frustration. I've found it's not wise to rely on relationships more than one or two levels deep.&lt;/p&gt;

&lt;p&gt;After thinking through the example above for a few months, observing our editorial patterns and analytics, I decided it wasn't worth the effort and complexity to port the data model into our Contentful CMS. The project got done faster and I was able to move on to other projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recap
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Modern CMS systems are incredibly robust and can usually model any kind of data you can imagine. Keep it simple and don't paint yourself into a corner. &lt;/li&gt;
&lt;li&gt;Know your users: get to know the needs and workflow requirements of the editors who will be using the CMS. Their needs are different than our needs as developers. Is it clear where to edit a thing? Is it tedious? How reusable does an entity really need to be? All of these questions should be handled like you're doing UX product discovery — just internally.&lt;/li&gt;
&lt;li&gt;Do some solid basic planning, prototype, iterate quickly, and then add complexity carefully. Rely on related content types only for items &lt;em&gt;your editors&lt;/em&gt; really, really need to re-use.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>content</category>
      <category>cms</category>
      <category>design</category>
    </item>
  </channel>
</rss>
