Bob Liu Thoughts on UX Design & Strategy 2025-12-15T23:17:47Z https://liu.design/ Bob Liu bob@liu.design Library Signage System 2025-12-01T00:00:00Z https://liu.design/projects/library-signage-system/ <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-signage-system/stacks-after-0-1440w.webp 1440w, https://liu.design/projects/library-signage-system/stacks-after-0-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-signage-system/stacks-after-0-1440w.jpeg 1440w, https://liu.design/projects/library-signage-system/stacks-after-0-2400w.jpeg 2400w" sizes="100vw" /><img src="https://liu.design/projects/library-signage-system/stacks-after-0-1440w.jpeg" width="1440" height="1920" alt="Redesigned signs on library stacks with a stepping stool placed nearby" loading="lazy" decoding="async" /> </figure> <p>In 2025, my team partnered with the Collection Services department at the University of Arizona Libraries to redesign the library’s collection signage system. We brought creative problem-solving to the interesting challenge of creating a design system for physical signs.</p> <h2>Library signs are unhelpful, if not confusing</h2> <p>As college students increasingly access information in digital formats, locating physical materials in the library has become an intimidating task. The University of Arizona Libraries, which are academic libraries at a public institution, need new signs to solve this problem.</p> <p>Before starting the project, our team interviewed undergraduate and graduate students, library staff, and student shelvers. Each shared their different perspective of using or working at the library.</p> <h3>Signs are outdated, complicated, and neglected</h3> <p>Wayfinding signs, door signs, and collection signs at the library are managed by different teams. Starting in the beginning of the project, the teams decided to focus on the collection signs.</p> <p>Many collection signs in the libraries are old, with some being suspected to have been printed shortly after the library first opened in the 1970s. Shelves and containers of different sizes are used for library materials, while there isn’t a consistent standard or workflow for producing the signs.</p> <div> <div class="gallery full-width" id="gallery-legacy-signs"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-signage-system/legacy-signs-1-1440w.webp 1440w, https://liu.design/projects/library-signage-system/legacy-signs-1-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-signage-system/legacy-signs-1-1440w.jpeg 1440w, https://liu.design/projects/library-signage-system/legacy-signs-1-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-signage-system/legacy-signs-1-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1800" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-signage-system/legacy-signs-1-1440w.jpeg" width="1440" height="1080" alt="Old signs of different sizes on a chest that says ASI in the library space" loading="lazy" decoding="async" /> </a> <figcaption>Legacy microfiche signs</figcaption> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-signage-system/legacy-signs-2-1440w.webp 1440w, https://liu.design/projects/library-signage-system/legacy-signs-2-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-signage-system/legacy-signs-2-1440w.jpeg 1440w, https://liu.design/projects/library-signage-system/legacy-signs-2-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-signage-system/legacy-signs-2-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1800" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-signage-system/legacy-signs-2-1440w.jpeg" width="1440" height="1080" alt="Old signs of different sizes on a chest that says POSTERS in the library space" loading="lazy" decoding="async" /> </a> <figcaption>Legacy poster signs</figcaption> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-legacy-signs', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>Most books are placed on stacks that only had a sign that indicates call number ranges. This index card-sized sign is placed in a “flag” that sticks out on the top of either end of a stack, so we called it a “flag sign.” We realized the flag is too tall (about 6 ½ feet or 2m) to view from a wheelchair, making the flag sign inaccessible. Additionally, other than the call numbers, it doesn’t indicate what subject the stack holds.</p> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-signage-system/stacks-before-1440w.webp 1440w, https://liu.design/projects/library-signage-system/stacks-before-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-signage-system/stacks-before-1440w.jpeg 1440w, https://liu.design/projects/library-signage-system/stacks-before-2400w.jpeg 2400w" sizes="100vw" /><img src="https://liu.design/projects/library-signage-system/stacks-before-1440w.jpeg" width="1440" height="1919" alt="Library stacks filled with books with a stepping stool placed nearby" loading="lazy" decoding="async" /><figcaption>Most library stacks only had a sign that indicates call numbers</figcaption> </figure> <h3>Not everyone knows how to use a library</h3> <p>Many participants the team interviewed don’t know how to use the library. Out of the ten undergraduate and graduate students we interviewed—not including student shelvers—only three have checked out a book from the library.</p> <p>The University of Arizona Libraries uses the Library of Congress Classification system. Only one participant knew the term “call numbers,” while many others think the numbers are simply dates. All participants think call numbers are confusing since they don’t explicitly say the subject.</p> <h3>Collections shift often</h3> <p>There are frequent changes in space and constructions in the University of Arizona Libraries that causes collections to shift. Each time the books are moved, signage on the stacks needs to be updated too. This adds burden to the library’s Print &amp; Collaborative Collection Initiatives Unit, the team that manages the stacks.</p> <h3>Cost awareness</h3> <p>In the planning phase of this project, I spoke with various stakeholders at the library including the leadership. Budget was a common theme for these conversations, especially when people picture any collection shifts in a bigger scope.</p> <h2>Goal</h2> <p>We want to design signs for regular stacks, which include the majority of books at the library, and the library’s curated collections.</p> <p>We want a signage system that:</p> <ol> <li>makes browsing more intuitive</li> <li>makes it easier to update collection signage</li> <li>is cost efficient</li> </ol> <p>To meet our budget limitations for the signage system, I also designed with the following restrictions:</p> <ol> <li>Use common office supplies.</li> <li>For installation, use easily accessible tools instead of specialized equipment.</li> </ol> <h2>The design</h2> <div> <div class="gallery full-width" id="gallery-design"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-signage-system/breakdown-overview-1440w.webp 1440w, https://liu.design/projects/library-signage-system/breakdown-overview-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-signage-system/breakdown-overview-1440w.jpeg 1440w, https://liu.design/projects/library-signage-system/breakdown-overview-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-signage-system/breakdown-overview-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1350" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-signage-system/breakdown-overview-1440w.jpeg" width="1440" height="810" alt="Four templates for the signage system: two index card-sized flag signs and two letter-sized eye-level signs" loading="lazy" decoding="async" /> </a> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-signage-system/breakdown-flag-1440w.webp 1440w, https://liu.design/projects/library-signage-system/breakdown-flag-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-signage-system/breakdown-flag-1440w.jpeg 1440w, https://liu.design/projects/library-signage-system/breakdown-flag-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-signage-system/breakdown-flag-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1350" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-signage-system/breakdown-flag-1440w.jpeg" width="1440" height="810" alt="Anatomy of two flag signs that include the call number range, curated collection name, and color-coded frames to distinguish regular stacks and curated collections" loading="lazy" decoding="async" /> </a> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-signage-system/breakdown-regular-1440w.webp 1440w, https://liu.design/projects/library-signage-system/breakdown-regular-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-signage-system/breakdown-regular-1440w.jpeg 1440w, https://liu.design/projects/library-signage-system/breakdown-regular-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-signage-system/breakdown-regular-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1350" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-signage-system/breakdown-regular-1440w.jpeg" width="1440" height="810" alt="Anatomy of the eye-level signs for regular stacks that include the call number parts, Library of Congress class, links to the library website, and a red frame" loading="lazy" decoding="async" /> </a> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-signage-system/breakdown-collection-1440w.webp 1440w, https://liu.design/projects/library-signage-system/breakdown-collection-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-signage-system/breakdown-collection-1440w.jpeg 1440w, https://liu.design/projects/library-signage-system/breakdown-collection-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-signage-system/breakdown-collection-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1350" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-signage-system/breakdown-collection-1440w.jpeg" width="1440" height="810" alt="Anatomy of the eye-level signs for curated collections that include the call number parts, curated collection name, links to the library website, and a blue frame" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-design', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>I created two types of signs. Both signs are installed on both ends of each stack (“stack-ends”):</p> <ol> <li><strong>Eye-level signs</strong>: printed on US letter-size papers (8.5 × 11 inch or 216 × 279mm) and installed at 48 inches or 1.2m for the lower edge.</li> <li><strong>Flag signs</strong>: printed on index card papers (3 × 5 inches or 76 × 127mm) and inserted in the card holders near the top of the stack-end.</li> </ol> <h2>Editing &amp; printing</h2> <p>The Print &amp; Collaborative Collection Initiatives Unit team that manages the stacks has been editing existing signs in Microsoft Word and printing them using a black &amp; white printer. To minimize disruptions to their day-to-day work and avoid introducing new tools, I created a new but familiar workflow for printing the signs.</p> <p>I created prototypes for the templates using Figma but finalized them in Google Docs. This allows Collection Services members to edit call numbers, subjects, and collection names in a tool they know well.</p> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-signage-system/google-doc-1440w.webp 1440w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-signage-system/google-doc-1440w.jpeg 1440w" sizes="100vw" /><img src="https://liu.design/projects/library-signage-system/google-doc-1440w.jpeg" width="1440" height="960" alt="Sign template in a Google Docs editor" loading="lazy" decoding="async" /><figcaption>Editing the sign in Google Docs</figcaption> </figure> <p>I created a two-step process for printing the signs. My team, the UX team at the library, have access to a color printer, so we batch-print the color frames. Then, we hand off to the Print &amp; Collaborative Collection Initiatives team so they can layer the actual content on top of the frame using a black and white printer. This reduced the stress of adopting a new setup, and printing less with a color printer helped save cost.</p> <div> <div class="gallery full-width" id="gallery-print"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-signage-system/print-1-1440w.webp 1440w, https://liu.design/projects/library-signage-system/print-1-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-signage-system/print-1-1440w.jpeg 1440w, https://liu.design/projects/library-signage-system/print-1-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-signage-system/print-1-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-signage-system/print-1-1440w.jpeg" width="1440" height="960" alt="Printed frame and frame with content for a language and literature stack's eye-level sign" loading="lazy" decoding="async" /> </a> <figcaption>Printed eye-level sign and frame for regular stacks</figcaption> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-signage-system/print-2-1440w.webp 1440w, https://liu.design/projects/library-signage-system/print-2-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-signage-system/print-2-1440w.jpeg 1440w, https://liu.design/projects/library-signage-system/print-2-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-signage-system/print-2-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-signage-system/print-2-1440w.jpeg" width="1440" height="960" alt="Printed frame and frame with content for a Children's Literature collection eye-level sign" loading="lazy" decoding="async" /> </a> <figcaption>Printed eye-level sign and frame for curated collections</figcaption> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-signage-system/print-3-1440w.webp 1440w, https://liu.design/projects/library-signage-system/print-3-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-signage-system/print-3-1440w.jpeg 1440w, https://liu.design/projects/library-signage-system/print-3-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-signage-system/print-3-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-signage-system/print-3-1440w.jpeg" width="1440" height="960" alt="Frame and frame with content printed on an index card template for a language and literature stack's flag sign" loading="lazy" decoding="async" /> </a> <figcaption>Printed flag signs and frames for regular stacks</figcaption> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-signage-system/print-4-1440w.webp 1440w, https://liu.design/projects/library-signage-system/print-4-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-signage-system/print-4-1440w.jpeg 1440w, https://liu.design/projects/library-signage-system/print-4-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-signage-system/print-4-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-signage-system/print-4-1440w.jpeg" width="1440" height="960" alt="Frame and frame with content printed on an index card template for a Children's Literature collection flag sign" loading="lazy" decoding="async" /> </a> <figcaption>Printed flag signs and frames for curated collections</figcaption> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-print', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>The flag signs are printed in groups of three using the Avery #5388 index card template. This template has perforated lines that makes separating easy.</p> <h2>Installing</h2> <p>I consulted with the university’s sign shop staff and learned about the accessibility requirements for the types of signs I designed. I learned that the eye-level sign needs to be installed at 48 inches or 1.2m for its lower edge. Also, to my surprise, the sign shop doesn’t have a fast and easy way to install the eye-level signs—they recommended using a measuring tape.</p> <p>Since we need to install hundreds of signs during a collection shift, we need to find a way to speed up the process. I worked with Arshia Amin, our student assistant, to design a cost-efficient tool that serves as mounting guide. We combined a mailing tube that measures 48 inches long with a 3D-printed piece that sits on one end of the tool.</p> <div> <div class="gallery full-width" id="gallery-mounting-guide"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-signage-system/mounting-guide-1-1440w.webp 1440w, https://liu.design/projects/library-signage-system/mounting-guide-1-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-signage-system/mounting-guide-1-1440w.jpeg 1440w, https://liu.design/projects/library-signage-system/mounting-guide-1-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-signage-system/mounting-guide-1-2400w.jpeg" data-pswp-width="2400" data-pswp-height="3199" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-signage-system/mounting-guide-1-1440w.jpeg" width="1440" height="1919" alt="The mounting guide tool set near a library shelf" loading="lazy" decoding="async" /> </a> <figcaption>Custom-designed mounting guide tool</figcaption> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-signage-system/mounting-guide-2-1440w.webp 1440w, https://liu.design/projects/library-signage-system/mounting-guide-2-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-signage-system/mounting-guide-2-1440w.jpeg 1440w, https://liu.design/projects/library-signage-system/mounting-guide-2-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-signage-system/mounting-guide-2-2400w.jpeg" data-pswp-width="2400" data-pswp-height="3200" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-signage-system/mounting-guide-2-1440w.jpeg" width="1440" height="1920" alt="A man using the mounting guide tool to install a collection sign with books in the background" loading="lazy" decoding="async" /> </a> <figcaption>Lining up a sign using the guide tool</figcaption> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-mounting-guide', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>To install an eye-level sign, first put double-sided on all four corners of a printed sign. Then, line up the mailing tube with the edge of a stack-end. Finally, line up the sign with the corner on the 3D-printed piece, and press firmly to attach the sign.</p> <h2>Result</h2> <figure class="full-width"> <source type="image/webp" srcset="https://liu.design/projects/library-signage-system/stacks-after-1-1440w.webp 1440w, https://liu.design/projects/library-signage-system/stacks-after-1-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-signage-system/stacks-after-1-1440w.jpeg 1440w, https://liu.design/projects/library-signage-system/stacks-after-1-2400w.jpeg 2400w" sizes="100vw" /><img src="https://liu.design/projects/library-signage-system/stacks-after-1-2400w.jpeg" width="2400" height="1799" alt="Library stacks full of books with both new signs installed" loading="lazy" decoding="async" /><figcaption>Redesigned signs on the Education stacks</figcaption> </figure> <div> <div class="gallery full-width" id="gallery-stacks-after"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-signage-system/stacks-after-2-1440w.webp 1440w, https://liu.design/projects/library-signage-system/stacks-after-2-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-signage-system/stacks-after-2-1440w.jpeg 1440w, https://liu.design/projects/library-signage-system/stacks-after-2-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-signage-system/stacks-after-2-2400w.jpeg" data-pswp-width="2400" data-pswp-height="3200" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-signage-system/stacks-after-2-1440w.jpeg" width="1440" height="1920" alt="Student walking by the Education stacks with the redesigned signs installed" loading="lazy" decoding="async" /> </a> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-signage-system/stacks-after-3-1440w.webp 1440w, https://liu.design/projects/library-signage-system/stacks-after-3-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-signage-system/stacks-after-3-1440w.jpeg 1440w, https://liu.design/projects/library-signage-system/stacks-after-3-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-signage-system/stacks-after-3-2400w.jpeg" data-pswp-width="2400" data-pswp-height="3200" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-signage-system/stacks-after-3-1440w.jpeg" width="1440" height="1920" alt="Children's Literature collection stacks with the redesigned signs installed" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-stacks-after', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <h2>My role</h2> <p>Throughout this project, I:</p> <ul> <li>designed the signage templates using Figma and Google Docs</li> <li>created the printing workflow and documentation</li> <li>partnered with library staff to interview library users and staff</li> <li>partnered with library staff to test prototypes through usability testing</li> <li>partnered with UX Student Assistants to create the mounting guide tool</li> <li>partnered with UX Student Assistants to install signs for the pilot project</li> </ul> <figure class="full-width"> <source type="image/webp" srcset="https://liu.design/projects/library-signage-system/printed-signs-1440w.webp 1440w, https://liu.design/projects/library-signage-system/printed-signs-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-signage-system/printed-signs-1440w.jpeg 1440w, https://liu.design/projects/library-signage-system/printed-signs-2400w.jpeg 2400w" sizes="100vw" /><img src="https://liu.design/projects/library-signage-system/printed-signs-2400w.jpeg" width="2400" height="1600" alt="Printed library collection signs placed on a large surface" loading="lazy" decoding="async" /> </figure> UX Manager’s 6 Tips to Make Your Portfolio Stand Out 2025-01-03T00:00:00Z https://liu.design/blog/portfolio-tips/ <figure class=""> <source type="image/webp" srcset="https://liu.design/blog/portfolio-tips/portfolio-tips-1440w.webp 1440w, https://liu.design/blog/portfolio-tips/portfolio-tips-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/portfolio-tips/portfolio-tips-1440w.jpeg 1440w, https://liu.design/blog/portfolio-tips/portfolio-tips-2400w.jpeg 2400w" sizes="100vw" /><img src="https://liu.design/blog/portfolio-tips/portfolio-tips-1440w.jpeg" width="1440" height="960" alt="Illustration of a browser window and arrows" loading="lazy" decoding="async" /> </figure> <p>Over the last five years, I mentored twelve students and early-career UX designers. As they prepared their professional portfolio for the job search, many of them asked the same questions:</p> <ul> <li>How many projects should I include in my portfolio?</li> <li>What if I only have class/side projects?</li> <li>What tool should I use to build my website?</li> </ul> <p>I had some answers as I reviewed candidates’ portfolios when hiring for positions on my team. Here are my six quick tips for your work-in-progress UX portfolio:</p> <h2>Tip #1: Engage your audience in 10 seconds</h2> <p>As UX practitioners, one of the first things we learned is to design with our target audience in mind. <strong>When creating a UX portfolio, our primary audience should be potential employers who only have ten seconds.</strong> That’s how much time they might spend on each candidate’s portfolio when reviewing hundreds of applications.</p> <p>However, don’t feel discouraged! The hiring team coming to your portfolio already means success. Now is a good time to use your UX wisdom to make sure your site visitors can find the <strong>who, what, and why</strong> in 10 seconds:</p> <ul> <li>Who you are</li> <li>What you’ve achieved in the past</li> <li>Why you’re a good fit for this job</li> </ul> <p>Your site should have simple and clear navigation that instantly takes the visitor to a page with all your projects and another page about yourself. Your hobbies, such as side projects, illustrations, and photographs, deserve a place on your website, but they shouldn’t play a leading role. They can wait until job hunting is no longer your priority.</p> <p>Next, take some time to name the case studies that you’re listing on the projects page. In most cases, your portfolio <em>is</em> a one-size-fits-all thing for all jobs you’re applying for, which means most potential employers come to your website with no context about the products you designed before. So, <strong>you should avoid naming your case study after the product</strong>. Instead, use the motivation, purpose, or outcome of the project.</p> <p>For example, imagine that I redesigned a library space management platform called CalendLib and the goal was to improve the visitor’s experience of reserving a library meeting room. It’d be a missed opportunity if I called the project “CalendLib,” because 9 out of 10 people reading my portfolio wouldn’t know what that is, so they wouldn’t even click on the project. Instead, I’d call it “Library room reservation system” or “Redesigning the library room reservation experience.”</p> <h2>Tip #2: You might not need a fancy setup</h2> <p>You may have heard this: your portfolio is the first project people will see. Yes, you should put some thought into designing your portfolio, but don’t overthink it.</p> <p>Before trying to throw something fancy on your website, ask yourself: does it answer the <strong>who, what, and why</strong>? Again, they are:</p> <ul> <li>Who you are</li> <li>What you’ve achieved in the past</li> <li>Why you’re a good fit for this job</li> </ul> <p>Let’s say you want to design a cool interaction on your portfolio website that hides and reveals some of its menu items. If you are applying for front-end engineer or animation designer positions, great! That shows some relevant skills. But if you’re applying for UX researcher positions, it probably won’t help much.</p> <div> <div class="gallery undefined" id="gallery-portfolio-gallery"> <figure class=""> <source type="image/webp" srcset="https://liu.design/blog/portfolio-tips/notion-portfolio-1440w.webp 1440w, https://liu.design/blog/portfolio-tips/notion-portfolio-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/portfolio-tips/notion-portfolio-1440w.jpeg 1440w, https://liu.design/blog/portfolio-tips/notion-portfolio-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/portfolio-tips/notion-portfolio-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1675" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/portfolio-tips/notion-portfolio-1440w.jpeg" width="1440" height="1005" alt="Screenshot of a UX portfolio built on Notion" loading="lazy" decoding="async" /> </a> <figcaption>Portfolio built with Notion. Credit: Riley Zuckert</figcaption> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-portfolio-gallery', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>For most UX jobs, a simple blog setup that lets you add images and text should work just fine. If you only have limited time, spend more of it crafting your case studies instead of building a website from scratch. Here are two platforms I recommended to my mentees:</p> <ol> <li><a href="https://www.notion.com/" target="_blank" rel="noopener noreferrer">Notion</a>: document sharing tool that lets you publish pages on the internet. You have the freedom to add images, videos, code, spreadsheets, and even embeds on any page. Free Plus plan for students.</li> <li><a href="https://cargo.site/" target="_blank" rel="noopener noreferrer">Cargo</a>: try this site builder if you want more customization options. It has a simple WYSIWYG (what you see is what you get) editor that has plenty of typesetting and styling options. You can also build your own site structure and add a custom domain. Subscribe to their <a href="https://blog.cargo.site/" target="_blank" rel="noopener noreferrer">weekly newsletter</a> to get inspirations.</li> </ol> <h2>Tip #3: Focus on quality, not quantity</h2> <p>How many projects should you include? It depends on what jobs you’re applying for, but definitely not the more, the merrier.</p> <p>Remember, your portfolio needs to answer why you’re a good fit for this job. <strong>If you’re applying for more than one type of job, consider including at least one project to represent each.</strong> For example, if you’re applying for both product designer and UX researcher positions, you may want to have one case study about applying a design system and another about conducting user interviews to understand pain points.</p> <p><strong>Class projects are OK to include in your portfolio.</strong> Some mentees didn’t feel confident doing so because class projects are often based on an imaginary scenario and not actually implemented. However, for those who just got started in UX, this might be the only option. Class projects aren’t necessarily weak ones, as they’re often good evidence of your collaboration skills and attention to detail. More on this next.</p> <h2>Tip #4: Tell a story of where things went wrong</h2> <p>When writing about a project, make sure you’re telling a good story — and it doesn’t always need a happy ending. Let’s admit it: UX work is messy. There’s always something going wrong, and less than one in ten projects comes out exactly as we expected. However, too often I’ve seen case studies where everything went like strawberry cotton candy from start to finish. In these case studies, the stakeholder never asked difficult questions, everyone did their job right, and the design had no issues whatsoever when tested with the user.</p> <p>That’s a shame because <strong>the skipped parts are often the most interesting ones</strong>. When reading case studies in candidates’ portfolios, I always find myself enjoying the part where designers tried to explain mysteries. Why was a project challenging, and how come no one else did it right? If a project failed, why did it fail, and how would the designer handle it differently? And if the designer weren’t part of it from start to finish, what previous mistakes did they correct, and what happened after they left?</p> <p>Have the courage to show your audience what’s under the rug — if the client or employer lets you.</p> <h2>Tip #5: Show your work as part of a team</h2> <p>UX work is never done alone. We’re always depending on someone: may it be the stakeholder, user, engineer, or someone in the leadership. Therefore, <strong>when hiring for a UX position, I always look for signs of collaboration in the candidates’ portfolios</strong>. These are good evidence that they could fit a UX position.</p> <p>I read some case studies in which one person appears to have done all the work. Granted that it’s possible to have UX teams of one, the person would still need to seek support or approval from someone who tasked them with the project, and in the meantime, validate the ideas with the users.</p> <p>Communications, negotiation, decision-making, and compromises are always happening, and you should document them in your case study. Also <strong>make sure to clearly indicate your roles for each project</strong>.</p> <p>So, what if you’re writing about a class project? Collaboration can still happen! If you assigned tasks to others, kept track of deadlines, or presented your deliverables, you can focus on your project management skills. If you wrote the code or partnered with someone who did it, focus on the design-development handoff and explain how you went back and forth to get the details right.</p> <h2>Tip #6: Zoom in on your wireframes</h2> <p>When writing a case study, it may be tempting to throw a giant Figma embed or screenshot that shows lots of components, frames, and prototype spaghetti. Some people think it’s a cool way to show off their design skills. On the other side, as the reader of the case studies, I often feel overwhelmed and don’t know where to look.</p> <p>As the storyteller, we can and should narrate our design by zooming in on where the reader should pay attention. Maybe it’s a button label that went through multiple iterations, an input field that checks all boxes for accessibility, a search bar that did well in usability testing, or a set of icons that blends into the design system. Try to extract small details from your big Figma file and tell the story behind them. No matter how big or small your design is, there’s always an opportunity to show your attention to detail.</p> <div> <div class="gallery full-width" id="gallery-wireframes"> <figure class=""> <source type="image/webp" srcset="https://liu.design/blog/portfolio-tips/figma-spaghetti-1440w.webp 1440w, https://liu.design/blog/portfolio-tips/figma-spaghetti-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/portfolio-tips/figma-spaghetti-1440w.jpeg 1440w, https://liu.design/blog/portfolio-tips/figma-spaghetti-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/portfolio-tips/figma-spaghetti-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1613" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/portfolio-tips/figma-spaghetti-1440w.jpeg" width="1440" height="967" alt="Screenshot showing many lines connecting frames in a Figma file" loading="lazy" decoding="async" /> </a> <figcaption>Don’t do this: show your spider web Figma spaghetti (screenshot from my work)</figcaption> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/blog/portfolio-tips/zoomed-in-screenshots-1440w.webp 1440w, https://liu.design/blog/portfolio-tips/zoomed-in-screenshots-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/portfolio-tips/zoomed-in-screenshots-1440w.jpeg 1440w, https://liu.design/blog/portfolio-tips/zoomed-in-screenshots-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/portfolio-tips/zoomed-in-screenshots-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1613" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/portfolio-tips/zoomed-in-screenshots-1440w.jpeg" width="1440" height="967" alt="Screenshot of a UX portfolio with UI elements that are clear and relevant to the context" loading="lazy" decoding="async" /> </a> <figcaption>Do this: zoom into UI elements that are relevant to the context. Credit: Rachel Schmidt</figcaption> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-wireframes', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>Now that you have some good stories on your portfolio website, <strong>you should still create a slide deck when presenting at a job interview</strong>. A slide deck shows that you have presented to stakeholders in a professional setup and that you care about the job. It also helps you structure your presentation better than a portfolio article.</p> <h2>Wrapping up</h2> <p>Best of luck putting together your portfolio! If you need more specific advice, check out <a href="https://uxua.arizona.edu/mentors" target="_blank" rel="noopener noreferrer">UX@UA’s free mentorship program</a>.</p> Bring Teams Together With a Design Studio 2024-06-05T00:00:00Z https://liu.design/blog/design-studio/ <figure class=""> <source type="image/webp" srcset="https://liu.design/blog/design-studio/design-studio-1440w.webp 1440w, https://liu.design/blog/design-studio/design-studio-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/design-studio/design-studio-1440w.jpeg 1440w, https://liu.design/blog/design-studio/design-studio-2400w.jpeg 2400w" sizes="100vw" /><img src="https://liu.design/blog/design-studio/design-studio-1440w.jpeg" width="1440" height="960" alt="Illustration of two hands putting sticky dots on a wireframe" loading="lazy" decoding="async" /> </figure> <p>Imagine presenting a prototype you spent two weeks designing to your stakeholders. You tried to address as many pain points as possible based on your interview with 20 users. You drop your mic on the last screen and expect a standing ovation, only to hear comments like the margins are off, buttons are misplaced, and key features X and Y are missing. We’ve all been there.</p> <p>As UX professionals, we learn what our users want and reflect it in the design. But stakeholders, who may have different goals, are often looped in once a draft prototype is ready, which causes a gap in expectation and unpleasant surprises. The question is, how might we improve the design process — so user needs are aligned with organizational priorities, and stakeholders become your allies?</p> <p>In 2019, I started experimenting with a new workshop format that aims to include the stakeholders early in the design process. I named it “design studio.” Over the years, I used it with seven project teams at the University of Arizona Libraries, and it delivered the expectation every time.</p> <p>The workshop is so simple that anyone can run with their own teams. Here’s how.</p> <h2>What’s a design studio?</h2> <div> <div class="gallery full-width" id="gallery-design-studio-sc"> <figure class=""> <source type="image/webp" srcset="https://liu.design/blog/design-studio/design-studio-sc-1-1440w.webp 1440w, https://liu.design/blog/design-studio/design-studio-sc-1-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/design-studio/design-studio-sc-1-1440w.jpeg 1440w, https://liu.design/blog/design-studio/design-studio-sc-1-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/design-studio/design-studio-sc-1-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/design-studio/design-studio-sc-1-1440w.jpeg" width="1440" height="960" alt="Four people standing in front of whiteboards that have sketches on them" loading="lazy" decoding="async" /> </a> <figcaption>Design studio for the University of Arizona Libraries Special Collections, April 2023</figcaption> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/blog/design-studio/design-studio-sc-2-1440w.webp 1440w, https://liu.design/blog/design-studio/design-studio-sc-2-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/design-studio/design-studio-sc-2-1440w.jpeg 1440w, https://liu.design/blog/design-studio/design-studio-sc-2-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/design-studio/design-studio-sc-2-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/design-studio/design-studio-sc-2-1440w.jpeg" width="1440" height="960" alt="Two people discussing about sketches on whiteboards" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-design-studio-sc', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>Design studio is a lightweight workshop for understanding design goals and mindfully including stakeholders in the design process. The outcome is a list of goals that informs the project requirements and product design.</p> <p>At the core of the workshop is a fully analog sketching session. This structured activity encourages project contributors to share their vision and empathize with the users. The rest of the workshop has several interactive activities to help build trust between the implementors and stakeholders.</p> <h2>Who should participate?</h2> <p>A design studio is good for groups of all sizes and doesn’t require the participants to have any previous design experience. That said, I had better success running the workshop with groups that include:</p> <ul> <li>1-3 key stakeholders: those who make important decisions, such as product owners, sponsors, and department heads.</li> <li>2-12 collaborators: members of the project team, such as UX researchers, product designers, developers, and content providers. You might also want to invite customer service professionals who have direct experience working with your users, or even the power users themselves.</li> </ul> <p>Depending on your group size, plan on having 1-2 facilitators who are familiar with the steps of the workshop.</p> <h2>What do I need?</h2> <div> <div class="gallery undefined" id="gallery-supplies"> <figure class=""> <source type="image/webp" srcset="https://liu.design/blog/design-studio/supplies-1440w.webp 1440w, https://liu.design/blog/design-studio/supplies-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/design-studio/supplies-1440w.jpeg 1440w, https://liu.design/blog/design-studio/supplies-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/design-studio/supplies-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/design-studio/supplies-1440w.jpeg" width="1440" height="960" alt="A roll of tape, a sharpie, a sheet of dot stickers, and two index cards" loading="lazy" decoding="async" /> </a> <figcaption>Supplies for a design studio</figcaption> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-supplies', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>To run a design studio in person, all you need are basic office supplies, including:</p> <ul> <li>Index cards: the ideal size is 4x6 inch (about 10x15 cm). Prepare 2-3 per participant.</li> <li>Markers: Sharpies or thick pens. Prepare 1 per participant.</li> <li>A roll of tape</li> <li>Stickers (optional): small dot stickers are the best. Prepare 3-6 per participant.</li> </ul> <p>In addition, book a space with a whiteboard, wall, window, or another large vertical surface where you can put tape on.</p> <h2>Steps</h2> <p>The design studio is a 5-step process that takes about an hour. Everyone, including the facilitator, should participate in all steps. Participants should be seated around tables. Consider breaking bigger groups down into several small ones. If possible, provide refreshments.</p> <h3>Step 1: intro</h3> <p>The facilitator introduces the workshop and shares context of the project. Participants go around the table for intros as the facilitator hands out workshop supplies.</p> <h3>Step 2: sketch</h3> <div> <div class="gallery full-width" id="gallery-design-studio-sketch"> <figure class=""> <source type="image/webp" srcset="https://liu.design/blog/design-studio/design-studio-news-1-1440w.webp 1440w, https://liu.design/blog/design-studio/design-studio-news-1-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/design-studio/design-studio-news-1-1440w.jpeg 1440w, https://liu.design/blog/design-studio/design-studio-news-1-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/design-studio/design-studio-news-1-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/design-studio/design-studio-news-1-1440w.jpeg" width="1440" height="960" alt="A woman sketching on index cards" loading="lazy" decoding="async" /> </a> <figcaption>Design studio for the University of Arizona Libraries News page, February 2023</figcaption> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/blog/design-studio/design-studio-homepage-1-1440w.webp 1440w, https://liu.design/blog/design-studio/design-studio-homepage-1-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/design-studio/design-studio-homepage-1-1440w.jpeg 1440w, https://liu.design/blog/design-studio/design-studio-homepage-1-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/design-studio/design-studio-homepage-1-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/design-studio/design-studio-homepage-1-1440w.jpeg" width="1440" height="960" alt="A group of people sitting around a table sketching on index cards" loading="lazy" decoding="async" /> </a> <figcaption>Design studio for the University of Arizona library homepage, May 2024</figcaption> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-design-studio-sketch', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>Each participant spends 5-7 minutes to sketch something they’d like to see in the final design. The scope doesn’t matter as long the idea fits on an index card. For example, they can draw something as small as a button and as big as the whole page. They can also choose to jot down their idea on the index card instead of sketching.</p> <p>Keep in mind — the index card is a rather small canvas for a Sharpie. This is intentional as it forces the participant to focus on the features that matter the most to them. Follow these guidelines:</p> <ul> <li>The key stakeholders can choose to have three index cards while others have two.</li> <li>Draw or write down only one idea per index card.</li> <li>Use only one side of the card.</li> <li>Do not tape two cards together to make a bigger card.</li> </ul> <p>Once done, ask the participants to tape their sketches to the whiteboard.</p> <h3>Step 3: gallery walk</h3> <div> <div class="gallery full-width" id="gallery-design-studio-gallery-walk"> <figure class=""> <source type="image/webp" srcset="https://liu.design/blog/design-studio/design-studio-news-2-1440w.webp 1440w, https://liu.design/blog/design-studio/design-studio-news-2-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/design-studio/design-studio-news-2-1440w.jpeg 1440w, https://liu.design/blog/design-studio/design-studio-news-2-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/design-studio/design-studio-news-2-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/design-studio/design-studio-news-2-1440w.jpeg" width="1440" height="960" alt="Four people discussing sketches on whiteboards" loading="lazy" decoding="async" /> </a> <figcaption>Design studio for the University of Arizona Libraries News page, February 2023</figcaption> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/blog/design-studio/design-studio-homepage-2-1440w.webp 1440w, https://liu.design/blog/design-studio/design-studio-homepage-2-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/design-studio/design-studio-homepage-2-1440w.jpeg 1440w, https://liu.design/blog/design-studio/design-studio-homepage-2-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/design-studio/design-studio-homepage-2-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/design-studio/design-studio-homepage-2-1440w.jpeg" width="1440" height="960" alt="Several people viewing sketches on whiteboards" loading="lazy" decoding="async" /> </a> <figcaption>Design studio for the University of Arizona library homepage, May 2024</figcaption> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-design-studio-gallery-walk', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>Once everyone’s done sketching, participants walk closer to the whiteboard to review others’ work. They can put dot stickers on sketches they like, agree with, or are interested in.</p> <h3>Step 4: share</h3> <p>Participants take turns to share what they sketched with the group. Others can ask clarifying questions. The facilitator takes notes of features or patterns they noticed.</p> <p>As the participants continue to share their sketches, the facilitator should call out any repeated designs. This helps reinforce the shared goal and build consensus for the group.</p> <h3>Step 5: recap</h3> <div> <div class="gallery full-width" id="gallery-design-studio-hours"> <figure class=""> <source type="image/webp" srcset="https://liu.design/blog/design-studio/design-studio-hours-1-1440w.webp 1440w, https://liu.design/blog/design-studio/design-studio-hours-1-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/design-studio/design-studio-hours-1-1440w.jpeg 1440w, https://liu.design/blog/design-studio/design-studio-hours-1-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/design-studio/design-studio-hours-1-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1800" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/design-studio/design-studio-hours-1-1440w.jpeg" width="1440" height="1080" alt="Five people talking in a room that has a monitor showing a library website and a whiteboard with sketches" loading="lazy" decoding="async" /> </a> <figcaption>Design studio for the University of Arizona library hours, July 2019</figcaption> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/blog/design-studio/design-studio-hours-2-1440w.webp 1440w, https://liu.design/blog/design-studio/design-studio-hours-2-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/design-studio/design-studio-hours-2-1440w.jpeg 1440w, https://liu.design/blog/design-studio/design-studio-hours-2-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/design-studio/design-studio-hours-2-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1800" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/design-studio/design-studio-hours-2-1440w.jpeg" width="1440" height="1080" alt="Sketches and notes on a whiteboard" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-design-studio-hours', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>Once every participant has done sharing, the facilitator starts a recap. Describe designs that received many votes, had the most agreement, or led to an active discussion. At the end, put these features or patterns in a “wish list.”</p> <h2>Before and after the design studio</h2> <p>As the facilitator, it’s a good idea to come to the design studio prepared. The right amount of research will help you narrow down to the right scope for the workshop. Before the design studio, consider:</p> <ul> <li>Conducting user research. Interview the users to understand their journey, and run usability testing to probe what is and isn’t working.</li> <li>Talking to the stakeholders. Know their roles and have an initial understanding of their goals, needs, pain points, and capacity.</li> </ul> <p>Once you wrap up the design studio, make sure you share findings, including whiteboard snapshots and the final “wish list,” with the project team. Then use the “wish list” as a starting point for drafting project requirements and wireframes.</p> <h2>Can I do it online?</h2> <p>Yes! The design studio is flexible enough to be tweaked for fully-remote teams. All you need is an online whiteboard tool — I use <a href="https://www.figma.com/figjam/" target="_blank" rel="noopener noreferrer">Figjam</a> but other online whiteboards, such as <a href="https://miro.com/" target="_blank" rel="noopener noreferrer">Miro</a> and <a href="https://apps.apple.com/us/app/freeform/id6443742539" target="_blank" rel="noopener noreferrer">Freeform</a>, work equally well.</p> <div> <div class="gallery undefined" id="gallery-remote-workshop"> <figure class=""> <source type="image/webp" srcset="https://liu.design/blog/design-studio/remote-workshop-1440w.webp 1440w, https://liu.design/blog/design-studio/remote-workshop-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/design-studio/remote-workshop-1440w.jpeg 1440w, https://liu.design/blog/design-studio/remote-workshop-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/design-studio/remote-workshop-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/design-studio/remote-workshop-1440w.jpeg" width="1440" height="960" alt="Screenshot of an online whiteboard tool that has photos of sketches and sticky notes" loading="lazy" decoding="async" /> </a> <figcaption>Online design studio for the University of Arizona Libraries' tech lending project, April 2022</figcaption> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-remote-workshop', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>While the whiteboard is virtual, the sketching activity stays analog. As the facilitator, you would still ask the participants to sketch on physical index cards (or index card-sized paper). Once complete, each participant takes photos of their sketches and uploads them to the online whiteboard. All the other steps remain the same.</p> <h2>Your turn</h2> <p>I’d love to hear how your design studio goes! Feel free to get in touch via <a href="mailto:bob@liu.design">email</a> or on <a href="https://mastodon.design/@bobliu" target="_blank" rel="noopener noreferrer">Mastodon</a> and share your experience.</p> What the Board Said 2024-04-23T00:00:00Z https://liu.design/blog/talk-back-board/ <figure class=""> <source type="image/webp" srcset="https://liu.design/blog/talk-back-board/tin-can-whiteboards-1440w.webp 1440w, https://liu.design/blog/talk-back-board/tin-can-whiteboards-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/talk-back-board/tin-can-whiteboards-1440w.jpeg 1440w, https://liu.design/blog/talk-back-board/tin-can-whiteboards-2400w.jpeg 2400w" sizes="100vw" /><img src="https://liu.design/blog/talk-back-board/tin-can-whiteboards-1440w.jpeg" width="1440" height="960" alt="Illustration of two whiteboards connected by a tin can telephone" loading="lazy" decoding="async" /> </figure> <p>My team at the University of Arizona Libraries uses whiteboards to capture feedback from library users. We leave questions or prompts on the whiteboard and invite library visitors to respond with sticky notes. We call them “talk-back boards.”</p> <p>Talk-back boards are often displayed in museums or libraries to capture free-form feedback as a part of visitor study projects. Museums also use them for interactive programs where visitors can participate.</p> <p>We set up the first talk-back board at our library in 2018. Over the years, more than 40 boards were displayed with topics including website feedback, book recommendations, space evaluation, and creative projects. We captured responses for 37 boards in the library’s <a href="https://lib.arizona.edu/research-repo" target="_blank" rel="noopener noreferrer">UX Research Repo</a>.</p> <p>Here’s a recap of four of my favorite talk-back boards.</p> <h2>February 2024: “What brings you to the library today?”</h2> <div> <div class="gallery undefined" id="gallery-board-visit"> <figure class=""> <source type="image/webp" srcset="https://liu.design/blog/talk-back-board/board-visit-1440w.webp 1440w, https://liu.design/blog/talk-back-board/board-visit-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/talk-back-board/board-visit-1440w.jpeg 1440w, https://liu.design/blog/talk-back-board/board-visit-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/talk-back-board/board-visit-2400w.jpeg" data-pswp-width="2400" data-pswp-height="3200" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/talk-back-board/board-visit-1440w.jpeg" width="1440" height="1920" alt="A whiteboard in an open space covered by pink and red sticky notes" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-board-visit', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>Our team want to know what motivates people to visit the library in person, so we often post the same question in different library locations. This board was set up during the week of Valentine’s Day in 2024, and we prepared pink, orange, and red sticky notes to celebrate.</p> <p>In the instructions on the board, we asked the participants to add new answer with a sticky note and vote on existing answers with a smaller sticker. The same instructions were included for most talk-back boards we set up.</p> <blockquote> <p>Answers that received more than 3 votes:</p> <ol> <li>“gaslight myself to think that I’m studious” (+6)</li> <li>“bc then I can get a silly little coffee :)” (+5)</li> <li>“To cry” (+5)</li> <li>“TO LOCK TF IN!” (+4)</li> <li>“To be Studious” (+3)</li> <li>“To take a piss” (+3)</li> <li>“coding HW :( WOMENINSTEM” (+3)</li> </ol> </blockquote> <p>327 sticky notes were captured in 8 days. We analyzed each answer and extracted the following themes:</p> <ol> <li>Studying/working (100 responses)</li> <li>Relationship (37 responses)</li> <li>Restroom (11 responses)</li> <li>Library technology (8 responses)</li> <li>Borrowing/returning books (7 responses)</li> <li>Buying coffee (7 responses)</li> <li>View/scenery (6 responses)</li> <li>Bad weather (4 responses)</li> <li>Reminiscence (4 responses)</li> </ol> <p>In addition to the common reasons of visiting the library such as studying or using the restroom, we were glad to see answers mentioning library technology as a result of the Libraries’ revamped and expanded <a href="https://lib.arizona.edu/borrow/tech" target="_blank" rel="noopener noreferrer">tech lending program</a>. Interestingly, the Valentine’s color scheme may have led the answers in a certain way, which is why “relationship” became the second most popular theme.</p> <p>Our student assistant, Linda Lopez, also asked ChatGPT to analyze the answers. When doing so, she found that it could not recognize terms like “lock in” and “grind” as Gen Z slang for studying. She then manually edited some of the data before running the analysis in ChatGPT again, and here are the themes she got:</p> <ol> <li>Study purposes</li> <li>Specific academic work</li> <li>Personal activities</li> <li>Specific tasks</li> <li>Humor</li> <li>Interpersonal connections</li> <li>Emotional state</li> <li>Physical needs</li> <li>Miscellaneous</li> </ol> <h2>August 2023: “Write a monsoon haiku!”</h2> <div> <div class="gallery undefined" id="gallery-board-haiku"> <figure class=""> <source type="image/webp" srcset="https://liu.design/blog/talk-back-board/board-haiku-1440w.webp 1440w, https://liu.design/blog/talk-back-board/board-haiku-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/talk-back-board/board-haiku-1440w.jpeg 1440w, https://liu.design/blog/talk-back-board/board-haiku-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/talk-back-board/board-haiku-2400w.jpeg" data-pswp-width="2400" data-pswp-height="3199" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/talk-back-board/board-haiku-1440w.jpeg" width="1440" height="1919" alt="A whiteboard in an open space covered by white and yellow sticky notes" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-board-haiku', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>In June and July, people in Tucson anxiously wait for the monsoon rains to bring the cure for the unbearable Arizona heat. That’s also the time of the year when we set up this recurring creative project where library visitors are invited to write a haiku, which are 3-line poems in the following format:</p> <ul> <li>First line: 5 syllables</li> <li>Second line: 7 syllables</li> <li>Third line: 5 syllables</li> </ul> <p>Here are four most popular haikus of the 2023 monsoon season:</p> <blockquote> <p><em>11 votes:</em><br /> I like to eat hail<br /> oh it is very yomy<br /> Thank you so much</p> </blockquote> <blockquote> <p><em>10 votes:</em><br /> Why so late Monsoon?<br /> Are you angry at humans<br /> Since we broke the earth?</p> </blockquote> <blockquote> <p><em>7 votes:</em><br /> Welcome monsoon, hi!<br /> We are so happy you’re here.<br /> Thanks for bringing life.</p> </blockquote> <blockquote> <p><em>7 votes:</em><br /> metamorphic rocks<br /> foliated and shiny<br /> with or without rain</p> </blockquote> <p>When capturing answers on this board, our friend Kevin O’Dea, Platforms Engineer at the Libraries, helped us develop a workflow to quickly transcribe text from photos. He created a Photoshop script that detects sticky notes, crops them out, and exports them to individual images. He then used OCR tools to extract text from the images.</p> <h2>December 2021: “What stories about social justice and anti-racism matter to you?”</h2> <div> <div class="gallery undefined" id="gallery-board-social-justice"> <figure class=""> <source type="image/webp" srcset="https://liu.design/blog/talk-back-board/board-social-justice-1440w.webp 1440w, https://liu.design/blog/talk-back-board/board-social-justice-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/talk-back-board/board-social-justice-1440w.jpeg 1440w, https://liu.design/blog/talk-back-board/board-social-justice-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/talk-back-board/board-social-justice-2400w.jpeg" data-pswp-width="2400" data-pswp-height="3200" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/talk-back-board/board-social-justice-1440w.jpeg" width="1440" height="1920" alt="A whiteboard with a question: What stories about social justice and anti-racism matter to you? and answers on sticky notes" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-board-social-justice', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>In 2021, the Main Library unveiled the new <em>Books that Matter</em> collection that focuses on social justice and anti-racism. We set up this board to learn what books students think should be added to this collection.</p> <p>Here are seven answers with the most votes:</p> <ol> <li>“JUSTICE 4 PALESTINE” (+7)</li> <li>“gender pay gap” (+5)</li> <li>“criminal justice system” (+4)</li> <li>“how to identify &amp; disrupt white supremacy” (+3)</li> <li>“non-stereotypical immigrant stories” (+3)</li> <li>“Maternal health” (+3)</li> <li>“Anti-capitalist stories” (+3)</li> </ol> <h2>September 2021: “How much did you spend on textbooks &amp; homework access codes this semester?”</h2> <div> <div class="gallery full-width" id="gallery-interaction-textbook"> <figure class=""> <source type="image/webp" srcset="https://liu.design/blog/talk-back-board/interaction-textbook-1-1440w.webp 1440w, https://liu.design/blog/talk-back-board/interaction-textbook-1-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/talk-back-board/interaction-textbook-1-1440w.jpeg 1440w, https://liu.design/blog/talk-back-board/interaction-textbook-1-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/talk-back-board/interaction-textbook-1-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1800" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/talk-back-board/interaction-textbook-1-1440w.jpeg" width="1440" height="1080" alt="A student handing a marker to another student to answer questions on a whiteboard" loading="lazy" decoding="async" /> </a> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/blog/talk-back-board/interaction-textbook-2-1440w.webp 1440w, https://liu.design/blog/talk-back-board/interaction-textbook-2-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/talk-back-board/interaction-textbook-2-1440w.jpeg 1440w, https://liu.design/blog/talk-back-board/interaction-textbook-2-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/talk-back-board/interaction-textbook-2-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1799" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/talk-back-board/interaction-textbook-2-1440w.jpeg" width="1440" height="1079" alt="A student using writing on a whiteboard with a question: How much did you spend on textbooks this semester" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-interaction-textbook', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>In 2021, our library was ready to implement a flat-fee textbook program introduced by the university’s book store. Two librarians who led the project wanted to learn how much students spent on textbooks and homework access codes prior to this program.</p> <p>Our student assistant Riley Zuckert, who has a background in data science, designed a talk-back board that visualizes data. She set up the board with two questions:</p> <ul> <li>How much did you spend on textbooks this semester?</li> <li>How much did you spend on homework access codes this semester?</li> </ul> <p>Under each question, she included a vertical axis to represent cost ranges from $0 to $800+. She then invited students to mark their numbers on the axis.</p> <p>The board collected 308 answers over two weeks. We then calculated the percentages based on the answers:</p> <p><em>How much did you spend on textbooks this semester?</em> (Based on 170 answers)</p> <ul> <li>$0: 22.35%</li> <li>$1-$99: 21.18%</li> <li><strong>$100-$199: 27.06%</strong></li> <li>$200-$299: 15.29%</li> <li>$300-$399: 7.06%</li> <li>$400-$499: 2.35%</li> <li>$500-$599: 0.59%</li> <li>$600-$699: 0.59%</li> <li>$700-$799: 0%</li> <li>$800+: 3.53%</li> </ul> <p><em>How much did you spend on homework access codes this semester?</em> (Based on 138 answers)</p> <ul> <li><strong>$0: 36.23%</strong></li> <li>$1-$99: 30.43%</li> <li>$100-$199: 20.09%</li> <li>$200-$299: 4.35%</li> <li>$300-$399: 0.72%</li> <li>$400-$499: 2.17%</li> <li>$500-$599: 0%</li> <li>$600-$699: 0%</li> <li>$700-$799: 0%</li> <li>$800+: 0.72%</li> </ul> <p>In the meantime, Lauren Dunn, intern on our team, ran a survey with the same questions on Instagram and collected 20 more answers. Riley then combined the data from the talk-back board and Instagram to created the following histograms to visualize the answers:</p> <div> <div class="gallery full-width" id="gallery-cost-visualized"> <figure class=""> <source type="image/webp" srcset="https://liu.design/blog/talk-back-board/textbook-cost-visualized-1440w.webp 1440w, https://liu.design/blog/talk-back-board/textbook-cost-visualized-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/talk-back-board/textbook-cost-visualized-1440w.jpeg 1440w, https://liu.design/blog/talk-back-board/textbook-cost-visualized-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/talk-back-board/textbook-cost-visualized-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1282" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/talk-back-board/textbook-cost-visualized-1440w.jpeg" width="1440" height="769" alt="Three histograms that visualize data for the question: How much did UArizona students spend on textbooks in Fall 2021?" loading="lazy" decoding="async" /> </a> <figcaption>Image credit: Riley Zuckert</figcaption> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/blog/talk-back-board/access-code-cost-visualized-1440w.webp 1440w, https://liu.design/blog/talk-back-board/access-code-cost-visualized-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/talk-back-board/access-code-cost-visualized-1440w.jpeg 1440w, https://liu.design/blog/talk-back-board/access-code-cost-visualized-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/talk-back-board/access-code-cost-visualized-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1283" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/talk-back-board/access-code-cost-visualized-1440w.jpeg" width="1440" height="769" alt="Three histograms that visualize data for the question: How much did UArizona students spend on homework access codes in Fall 2021?" loading="lazy" decoding="async" /> </a> <figcaption>Image credit: Riley Zuckert</figcaption> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-cost-visualized', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <h2>Takeaways</h2> <div> <div class="gallery undefined" id="gallery-respond-to-board"> <figure class=""> <source type="image/webp" srcset="https://liu.design/blog/talk-back-board/respond-to-board-1440w.webp 1440w, https://liu.design/blog/talk-back-board/respond-to-board-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/talk-back-board/respond-to-board-1440w.jpeg 1440w, https://liu.design/blog/talk-back-board/respond-to-board-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/talk-back-board/respond-to-board-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1800" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/talk-back-board/respond-to-board-1440w.jpeg" width="1440" height="1080" alt="Three students pointing at sticky notes on a whiteboard at the entrance to a public space" loading="lazy" decoding="async" /> </a> <figcaption>Talk-back board at the University of Arizona Main Library, March 2020</figcaption> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-respond-to-board', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>The talk-back board has become an essential piece in our UX research toolkit for collecting unmoderated user feedback for websites, services, and spaces. It’s also perfect for engaging library visitors through creative projects that help them de-stress with fun distraction.</p> <p>As we experimented with a wide spectrum of topics, we developed handy workflows to transcribe written answers to text for analysis. We also learned how to use AI tools for the initial analysis such as identifying common themes.</p> <p>Since the boards were mostly left unattended in a public space, we inevitably saw inappropriate responses. Our team members as well as the Libraries’ desk staff regularly checked the board to remove those responses. We also refilled the supplies as needed.</p> <h2>Want to read more?</h2> <p>You can browse more of our talk-back boards in the Libraries’ <a href="https://ualibraries.notion.site/Research-Repo-186fb1c12a4b4481a7aee963ecf18437?pvs=4" target="_blank" rel="noopener noreferrer">UX Research Repo</a>.</p> Welcome to liu.design 2024-02-26T00:00:00Z https://liu.design/blog/welcome/ <figure class=""> <source type="image/webp" srcset="https://liu.design/blog/welcome/new-site-1440w.webp 1440w, https://liu.design/blog/welcome/new-site-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/welcome/new-site-1440w.jpeg 1440w, https://liu.design/blog/welcome/new-site-2400w.jpeg 2400w" sizes="100vw" /><img src="https://liu.design/blog/welcome/new-site-1440w.jpeg" width="1440" height="960" alt="Illustration of an index card with text: “new site hello again world”" loading="lazy" decoding="async" /> </figure> <p>Hi there, and welcome to liu.design! Building a new website was one of my New Year’s resolutions. I’m glad to have completed it by March when 2024 can still be called the “new year.”</p> <p>This post marks the end of my previous portfolio website: bobliu.<nolink>io, which went live exactly four years ago on March 1, 2020. Here are some changes I made on the new website and things I learned while building it.</nolink></p> <h2>New domain</h2> <p>I launched this website on <a href="https://liu.design/">liu.design</a>. I wanted to stop using bobliu.<nolink>io mainly because the .io domains became a part of the UK government’s modern-day colonialism<sup class="footnote-ref"><a href="https://liu.design/blog/welcome/#fn1" id="fnref1">[1]</a></sup>. I had been eyeing this domain for a while and was lucky no one grabbed it before I did.</nolink></p> <p>bobliu<nolink>.io now redirects to this site. I plan to keep the previous domain for a little longer and wait for the search engines to catch up.</nolink></p> <h2>Design more, write more</h2> <p>I rewrote about my past projects when moving them to this site. It’s always fun to look back at my almost-binary mindset and think about how differently I approach things now. I hope you’ll have fun reading them too.</p> <p>My previous design portfolio didn’t have a structure to capture my random thoughts that are yet to be full-blown projects. So, as you read this post, I have also committed myself to write a blog. I hope to write about design strategies I experimented with, whether they worked or didn’t, and occasionally share life updates.</p> <h2>Eleventy</h2> <p>If you’re a designer, you probably are no stranger to portfolios sites forever under construction. To me, this wasn’t the first time I went from writing about a new project to rebuilding the entire website.</p> <p>I like static site generators and have used several of them to build my portfolio since 2017. bobliu.<nolink>io was built with a Vue-based static site generator called Gridsome. I liked the framework a lot but had to move away from it because the project’s development quietly ended in 2020.</nolink></p> <div> <div class="gallery undefined" id="gallery-previous-site"> <figure class=""> <source type="image/webp" srcset="https://liu.design/blog/welcome/previous-site-1440w.webp 1440w, https://liu.design/blog/welcome/previous-site-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/blog/welcome/previous-site-1440w.jpeg 1440w, https://liu.design/blog/welcome/previous-site-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/blog/welcome/previous-site-2400w.jpeg" data-pswp-width="2400" data-pswp-height="2706" data-cropped="true" target="_blank"> <img src="https://liu.design/blog/welcome/previous-site-1440w.jpeg" width="1440" height="1623" alt="Screenshot of my previous site" loading="lazy" decoding="async" /> </a> <figcaption>Last screenshot of bobliu.io before it went offline</figcaption> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-previous-site', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>This site was built from scratch with <a href="https://www.11ty.dev/" target="_blank" rel="noopener noreferrer">Eleventy</a>. I like that Eleventy:</p> <ul> <li>has an intuitive file structure</li> <li>supports any template language</li> <li>builds in no time for a site of this size</li> </ul> <p>My biggest pet peeve with static site generators is having to fiddle with file paths, and Eleventy was no exception to that. To customize the images displayed on this website, I had to create <em>shortcodes</em> and define where images live in the project folder. Figuring out the following line alone took my whole Saturday morning:</p> <pre class="language-js"><code class="language-js"><span class="token keyword">let</span> imageSrc <span class="token operator">=</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>path<span class="token punctuation">.</span><span class="token function">dirname</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>page<span class="token punctuation">.</span>inputPath<span class="token punctuation">)</span><span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">/</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>src<span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">;</span></code></pre> <p>(Looks like Eleventy is working on an “almost-zero-configuration” image plugin<sup class="footnote-ref"><a href="https://liu.design/blog/welcome/#fn2" id="fnref2">[2]</a></sup> with the upcoming 3.0 release.)</p> <p>Other than that, Eleventy mostly felt flexible and forgiving, and it didn’t get in the way too much. I do wish Eleventy’s documentation was more detailed and included examples, though I found answers to most of my questions from the amazing blog articles others wrote.</p> <h2>Get in touch</h2> <p>Together with the new domain, I also made myself a new email: <a href="mailto:bob@liu.design">bob@liu.design</a>. Drop me a line! You can also find me on social media linked from the bottom of this page. Thanks again for stopping by.</p> <hr class="footnotes-sep" /> <section class="footnotes"> <ol class="footnotes-list"> <li id="fn1" class="footnote-item"><p><a href="https://www.wired.com/story/the-digital-colonialism-behind-tv-and-ly/" target="_blank" rel="noopener noreferrer">The Digital Colonialism Behind .tv and .ly</a> <a href="https://liu.design/blog/welcome/#fnref1" class="footnote-backref">↩︎</a></p> </li> <li id="fn2" class="footnote-item"><p><a href="https://fosstodon.org/@eleventy/111904085623744762" target="_blank" rel="noopener noreferrer">Eleventy on Mastodon</a> <a href="https://liu.design/blog/welcome/#fnref2" class="footnote-backref">↩︎</a></p> </li> </ol> </section> The UX Cookbook 2022-02-01T00:00:00Z https://liu.design/projects/the-ux-cookbook/ <p><a href="https://theuxcookbook.com/" target="_blank" rel="noopener noreferrer">The UX Cookbook</a> is a collection of guides for UX research, design, and strategy. The UX team at University of Arizona Libraries started the project in 2020 and made it open and free to anyone in the UX community.</p> <p>The project started as the Libraries’ UX team’s internal design and user research documentation. The loosely-organized documentation was used to train new team members and provide consultation for staff and faculty at the University of Arizona. In 2020, the Libraries’ UX team began restructuring the documentation and made it open to the public.</p> <p>I designed The UX Cookbook’s branding and structure. I also wrote and edited guides.</p> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/the-ux-cookbook/full-page-ipad-1440w.webp 1440w, https://liu.design/projects/the-ux-cookbook/full-page-ipad-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/the-ux-cookbook/full-page-ipad-1440w.jpeg 1440w, https://liu.design/projects/the-ux-cookbook/full-page-ipad-2400w.jpeg 2400w" sizes="100vw" /><img src="https://liu.design/projects/the-ux-cookbook/full-page-ipad-1440w.jpeg" width="1440" height="1551" alt="The UX Cookbook webiste displayed on an iPad" loading="lazy" decoding="async" /> </figure> <h2>Goal</h2> <p>When members of the Libraries’ UX team collaborated and consulted with faculty and staff members at the University of Arizona, we realized common user research and design methods, such as usability testing, card sorting, and prototyping, sounded intimidating to those who weren’t familiar.</p> <p>The team hoped to create a set of UX documentation that simplifies UX jargon and helps people easily apply UX methods in their work. We developed content based on our existing internal documentation before making it public. We pictured the target audience being those who:</p> <ul> <li>Work in higher-ed, government, or non-profit organizations</li> <li>Want to apply UX methods in their work</li> <li>Usually don’t have dedicated UX team members</li> </ul> <p>Because of this, we wanted the documentation to be fun, approachable, and easy to get started with.</p> <h2>The “recipes”</h2> <p>I proposed calling the documentation a <em>cookbook</em> so its articles become <em>recipes</em>. To spice it up even more, each <em>recipe</em> can include all or some of the following sections:</p> <ul> <li><em>Nutrition profile</em>: a short description of the method</li> <li><em>Cooking time</em>: how long the method takes</li> <li><em>Perfect for</em>: what the method does</li> <li><em>Ingredients</em>: what tools are needed</li> <li><em>Prep work</em>: what to prepare before starting</li> <li><em>Directions</em>: step-by-step instructions</li> <li><em>Plating</em>: how to present research findings or design artifacts</li> <li><em>Gallery</em>: a showcase of finished work from the UX community</li> </ul> <p>To validate the feasibility of this structure, we started a crowdsourced recipe-drafting project. Members of the Libraries’ UX team, along with collaborators from other parts of the University of Arizona, contributed recipes about different UX methods in three categories: user research, design, and content strategy. After a few iterations, we agreed on a structure that covers the must-haves in a UX guide.</p> <div> <div class="gallery full-width" id="gallery-content"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/the-ux-cookbook/content-header-1440w.webp 1440w, https://liu.design/projects/the-ux-cookbook/content-header-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/the-ux-cookbook/content-header-1440w.jpeg 1440w, https://liu.design/projects/the-ux-cookbook/content-header-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/the-ux-cookbook/content-header-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/the-ux-cookbook/content-header-1440w.jpeg" width="1440" height="960" alt="Screenshot of a recipe’s header section" loading="lazy" decoding="async" /> </a> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/the-ux-cookbook/content-sections-1440w.webp 1440w, https://liu.design/projects/the-ux-cookbook/content-sections-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/the-ux-cookbook/content-sections-1440w.jpeg 1440w, https://liu.design/projects/the-ux-cookbook/content-sections-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/the-ux-cookbook/content-sections-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/the-ux-cookbook/content-sections-1440w.jpeg" width="1440" height="960" alt="Screenshot of a recipe’s content" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-content', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>I selected Notion as the content management system for The UX Cookbook. This was largely because contributors who did editorial work in Notion and liked its flexible structure that suits text-heavy content. The contributors also liked Notion’s ease of maintenance as a document-sharing platform.</p> <p>Notion natively supports publishing any document as a live webpage, but the page’s URL isn’t customizable. I used <a href="https://super.so/" target="_blank" rel="noopener noreferrer">Super</a> to publish the pages with friendly URLs and add the pages to our custom domain.</p> <h2>Brand</h2> <p>I designed the UX Cookbook’s brand two years after its launch. I was inspired by a Chinese snack called <em>tánghúlu</em> (糖葫芦, “sugar bottle gourd”), which are hawthorn berries covered in sugar and put on a stick. It’s a popular childhood snack in northern China and often consumed around Lunar New Year because its auspicious meaning.</p> <p>I created a monochrome color palette based on <em>tánghúlu</em>’s color, red. Then, based on the berries’ shape, I designed circular illustrations of a variety of UI elements, such as radio buttons, checkboxes, calendar days, and hearts for like. These shapes became building blocks of the logo and recipe covers’ design.</p> <div> <div class="gallery full-width" id="gallery-branding"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/the-ux-cookbook/branding-elements-1440w.webp 1440w, https://liu.design/projects/the-ux-cookbook/branding-elements-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/the-ux-cookbook/branding-elements-1440w.jpeg 1440w, https://liu.design/projects/the-ux-cookbook/branding-elements-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/the-ux-cookbook/branding-elements-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/the-ux-cookbook/branding-elements-1440w.jpeg" width="1440" height="960" alt="The UX Cookbook’s circular design elements" loading="lazy" decoding="async" /> </a> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/the-ux-cookbook/branding-ref-sheet-1440w.webp 1440w, https://liu.design/projects/the-ux-cookbook/branding-ref-sheet-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/the-ux-cookbook/branding-ref-sheet-1440w.jpeg 1440w, https://liu.design/projects/the-ux-cookbook/branding-ref-sheet-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/the-ux-cookbook/branding-ref-sheet-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/the-ux-cookbook/branding-ref-sheet-1440w.jpeg" width="1440" height="960" alt="The UX Cookbook’s design reference sheet, including logos, a color palette, and typography" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-branding', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>Each recipe cover includes the recipe’s name on the left 2/3 of a rectangle. In the remaining space, I did a creative challenge by combining 2-3 circular UI elements to visualize what the UX method does.</p> <div> <div class="gallery full-width" id="gallery-recipe"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/the-ux-cookbook/recipe-competitive-analysis-1440w.webp 1440w, https://liu.design/projects/the-ux-cookbook/recipe-competitive-analysis-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/the-ux-cookbook/recipe-competitive-analysis-1440w.jpeg 1440w, https://liu.design/projects/the-ux-cookbook/recipe-competitive-analysis-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/the-ux-cookbook/recipe-competitive-analysis-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/the-ux-cookbook/recipe-competitive-analysis-1440w.jpeg" width="1440" height="960" alt="Cover of the Competitive analysis recipe" loading="lazy" decoding="async" /> </a> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/the-ux-cookbook/recipe-writing-web-1440w.webp 1440w, https://liu.design/projects/the-ux-cookbook/recipe-writing-web-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/the-ux-cookbook/recipe-writing-web-1440w.jpeg 1440w, https://liu.design/projects/the-ux-cookbook/recipe-writing-web-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/the-ux-cookbook/recipe-writing-web-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/the-ux-cookbook/recipe-writing-web-1440w.jpeg" width="1440" height="960" alt="Cover of the Writing for the Web recipe" loading="lazy" decoding="async" /> </a> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/the-ux-cookbook/recipe-journey-mapping-1440w.webp 1440w, https://liu.design/projects/the-ux-cookbook/recipe-journey-mapping-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/the-ux-cookbook/recipe-journey-mapping-1440w.jpeg 1440w, https://liu.design/projects/the-ux-cookbook/recipe-journey-mapping-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/the-ux-cookbook/recipe-journey-mapping-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/the-ux-cookbook/recipe-journey-mapping-1440w.jpeg" width="1440" height="960" alt="Cover of the Surveys recipe" loading="lazy" decoding="async" /> </a> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/the-ux-cookbook/recipe-user-interviews-1440w.webp 1440w, https://liu.design/projects/the-ux-cookbook/recipe-user-interviews-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/the-ux-cookbook/recipe-user-interviews-1440w.jpeg 1440w, https://liu.design/projects/the-ux-cookbook/recipe-user-interviews-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/the-ux-cookbook/recipe-user-interviews-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/the-ux-cookbook/recipe-user-interviews-1440w.jpeg" width="1440" height="960" alt="Cover of the User Interviews recipe" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-recipe', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <h2>Result</h2> <p>Shortly after its launch, The UX Cookbook became a free UX reference loved and shared by many. Every day, the website records visitors from all continents of the world (except Antarctica).</p> <p>The UX team at the University of Arizona Libraries actively maintains the documentation and adds new recipes.</p> <p>Now, The UX Cookbook is a popular open educational resource that instructors use in classrooms. It is also frequently shared by folks in the government sector and higher education through mailing lists and intranets.</p> UArizona Library Hours 2020-03-01T00:00:00Z https://liu.design/projects/library-hours/ <p>The <a href="https://lib.arizona.edu/" target="_blank" rel="noopener noreferrer">University of Arizona Libraries</a> has six locations on campus that each operates during different hours. The hours change throughout the year, and can be different depending on the visitor’s affiliation to the university. In 2020, the Libraries launched a new library hours module to address the limitations with its previous library hours page.</p> <p>I led the project’s UX design and research work.</p> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-hours/door-sign-1440w.webp 1440w, https://liu.design/projects/library-hours/door-sign-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-hours/door-sign-1440w.jpeg 1440w, https://liu.design/projects/library-hours/door-sign-2400w.jpeg 2400w" sizes="100vw" /><img src="https://liu.design/projects/library-hours/door-sign-1440w.jpeg" width="1440" height="960" alt="Library door sign that shows hours of operation" loading="lazy" decoding="async" /><figcaption>Main Library’s door sign</figcaption> </figure> <h2>Research with users</h2> <p>I designed exploratory user research to learn about pain points with the previous library hours page, then worked with other members of the Libraries’ UX team to conduct interviews with 21 students, faculty, and staff at the university.</p> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-hours/tiny-cafe-1440w.webp 1440w, https://liu.design/projects/library-hours/tiny-cafe-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-hours/tiny-cafe-1440w.jpeg 1440w, https://liu.design/projects/library-hours/tiny-cafe-2400w.jpeg 2400w" sizes="100vw" /><img src="https://liu.design/projects/library-hours/tiny-cafe-1440w.jpeg" width="1440" height="1080" alt="Man standing next to a desk with two laptops and a sign that reads ‘Tiny Café’" loading="lazy" decoding="async" /><figcaption>Tiny Café, lightweight user research setup at the Main Library</figcaption> </figure> <h3>Pain point 1: complicated access</h3> <blockquote> <p>“The website is confusing … I’d rather walk to the library and try to get in. I can at least read the sign on the door.” — <em>Participant #4, undergraduate student</em></p> </blockquote> <p>Many library locations operate in two schedules because they provide after-hours access to university affiliates with a <em>CatCard</em> (campus ID). Among all locations, the Health Sciences Library has the most complicated access because only those considered <em>Health Sciences Affiliates</em> can access the building after hours, but not everyone with a <em>CatCard</em> is considered a <em>Health Sciences Affiliate</em>.</p> <h3>Pain point 2: confusing language</h3> <blockquote> <p>“On Sunday, the hours are ‘24 hours’ and ‘opens at 9.’ Aren’t they contradicting each other?” — <em>Participant #11, graduate student</em></p> </blockquote> <p>Almost all participants said hours on the library website were confusing, inaccurate, or misleading. For example, on any Sunday in the Fall 2019 semester, the Main Library is open to the public 9am-9pm. However, the building provides after-hours access from 9pm-9am everyday except Saturday, so <em>CatCard</em> holders can enter the building anytime starting 9pm on Sunday through 1am on the following Saturday.</p> <p>Because of this, the previous library hours page displayed Sunday hours as “24 hours, opens at 9:00am” which confused many participants.</p> <h3>Pain point 3: not mobile-friendly</h3> <p>Moreover, the previous library hours page dates back to 2009. It had an outdated look and was not designed for mobile, which became another barrier for those who check hours on the phone.</p> <h2>Design studio with stakeholders</h2> <p>Our team interviewed the stakeholders from the Libraries’ Access and Information Services team to gather project requirements and success criteria. While working on this project, I created a design activity called <em>Design Studio</em>, which was an effective way of getting stakeholder input from an early stage of the design process.</p> <div> <div class="gallery full-width" id="gallery-design-studio"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-hours/design-studio-1-1440w.webp 1440w, https://liu.design/projects/library-hours/design-studio-1-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-hours/design-studio-1-1440w.jpeg 1440w, https://liu.design/projects/library-hours/design-studio-1-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-hours/design-studio-1-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1800" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-hours/design-studio-1-1440w.jpeg" width="1440" height="1080" alt="Written notes and index cards with hand sketches on a whiteboard" loading="lazy" decoding="async" /> </a> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-hours/design-studio-2-1440w.webp 1440w, https://liu.design/projects/library-hours/design-studio-2-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-hours/design-studio-2-1440w.jpeg 1440w, https://liu.design/projects/library-hours/design-studio-2-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-hours/design-studio-2-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1800" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-hours/design-studio-2-1440w.jpeg" width="1440" height="1080" alt="Written notes and index cards with hand sketches on a whiteboard" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-design-studio', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>Design Studio is a one- to two-hour freeform activity where stakeholders, designers, UX researchers, and developers gather in a room. Each contributor gets a sharpie and a couple of index cards then follows the same prompt: “In 3-5 minutes, sketch or jot down features you’d like to see in the new product or service.”</p> <p>During the Design Studio activity for the library hours project, project team members visualized the following features:</p> <ul> <li>A library hours page with weekly and monthly views</li> <li>An hours widget on the Libraries’ homepage</li> <li>Clear helper text that explains after-hour access for affiliates</li> </ul> <p>At the end of the activity, I captured, organized, and grouped the responses to summarize top features, then worked with the project manager to draft requirements to guide the design process.</p> <h2>Design &amp; validation</h2> <p>I created wireframes based on input received in the Design Studio. Many sketches contributed by stakeholders hinted at a similar layout, which includes seven squares arranged horizontally to represent a week. I constructed the desktop wireframes based on this layout.</p> <p>I led the Libraries’ transition to Figma as its primary design and handoff tool. As part of the transition, I built a component library for the Libraries’ Drupal 7-based content management system used at that time. I started this project’s design with the existing component library and added project-specific components and patterns along the way</p> <div> <div class="gallery full-width" id="gallery-design-1"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-hours/design-wireframes-1440w.webp 1440w, https://liu.design/projects/library-hours/design-wireframes-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-hours/design-wireframes-1440w.jpeg 1440w, https://liu.design/projects/library-hours/design-wireframes-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-hours/design-wireframes-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-hours/design-wireframes-1440w.jpeg" width="1440" height="960" alt="Library hours page wireframes" loading="lazy" decoding="async" /> </a> <figcaption>Wireframes</figcaption> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-hours/design-components-1440w.webp 1440w, https://liu.design/projects/library-hours/design-components-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-hours/design-components-1440w.jpeg 1440w, https://liu.design/projects/library-hours/design-components-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-hours/design-components-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-hours/design-components-1440w.jpeg" width="1440" height="960" alt="Design components used on the library hours page" loading="lazy" decoding="async" /> </a> <figcaption>Component library</figcaption> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-design-1', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>As I had learned from preliminary research, microcopy design was one of the most challenging parts of this project. Specifically:</p> <ul> <li>how to indicate that a location is open beyond midnight on a day, and</li> <li>how to indicate who is eligible for after-hours access</li> </ul> <p>Because of this, I made several versions of the prototype with different microcopy design with which our team conducted usability and preference testing. Our student assistant, America Curl, also discovered a handy roaming testing setup — she put sticky notes with different microcopy designs on a small whiteboard, then walked around in the library lobby and elsewhere on campus asking random students for feedback. In return, she gave them snacks and beverages.</p> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-hours/roaming-test-1440w.webp 1440w, https://liu.design/projects/library-hours/roaming-test-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-hours/roaming-test-1440w.jpeg 1440w, https://liu.design/projects/library-hours/roaming-test-2400w.jpeg 2400w" sizes="100vw" /><img src="https://liu.design/projects/library-hours/roaming-test-1440w.jpeg" width="1440" height="1079" alt="A student holding a whiteboard that has different versions of language for a weekly calendar" loading="lazy" decoding="async" /><figcaption>America Curl with her roaming microcopy testing setup</figcaption> </figure> <p>After rounds of testing, we found “stays open” was the pattern most people understood. On a weekly calendar that starts on Sunday, the hours can be displayed as “Opens at 9am (stays open)” on Sunday, “24 hours” on Monday through Thursday, and “24 hours (closes at 1am)” on Friday.</p> <p>I also added an audience switcher in the UI to indicate different hours for different user groups. In a later iteration, our team also added helper text to the audience switcher to clarify eligibility. Usability testing showed 88% of participants understood who are eligible for after-hours access and what the extended hours are.</p> <div> <div class="gallery full-width" id="gallery-design-2"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-hours/design-ui-copy-1440w.webp 1440w, https://liu.design/projects/library-hours/design-ui-copy-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-hours/design-ui-copy-1440w.jpeg 1440w, https://liu.design/projects/library-hours/design-ui-copy-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-hours/design-ui-copy-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-hours/design-ui-copy-1440w.jpeg" width="1440" height="960" alt="Library hours page wireframes" loading="lazy" decoding="async" /> </a> <figcaption>Revised microcopy</figcaption> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-hours/design-audience-switcher-1440w.webp 1440w, https://liu.design/projects/library-hours/design-audience-switcher-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-hours/design-audience-switcher-1440w.jpeg 1440w, https://liu.design/projects/library-hours/design-audience-switcher-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-hours/design-audience-switcher-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-hours/design-audience-switcher-1440w.jpeg" width="1440" height="960" alt="Design components used on the library hours page" loading="lazy" decoding="async" /> </a> <figcaption>Audience switcher for indicating different hour for different user groups</figcaption> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-design-2', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <h2>Result</h2> <p>The new library hours module was launched in Spring 2020. Shortly after the launch, most library buildings were closed due to the COVID-19 pandemic. However, the new library hours page received very positive feedback later in 2020 and 2021.</p> <p>Web analytics data in 2021 show the new library hours page had a 60% bounce rate, up from 48% in the previous version. While lower bounce rates are often desirable, the library hours pages are considered an exception — we want the user to come to the page, get the information they need, then leave. So, a higher bounce rate means less users had to navigate to other pages on the Libraries’ website to find the hours.</p> <div> <div class="gallery full-width" id="gallery-result"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-hours/result-weekly-1440w.webp 1440w, https://liu.design/projects/library-hours/result-weekly-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-hours/result-weekly-1440w.jpeg 1440w, https://liu.design/projects/library-hours/result-weekly-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-hours/result-weekly-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-hours/result-weekly-1440w.jpeg" width="1440" height="960" alt="Design components used on the library hours page" loading="lazy" decoding="async" /> </a> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-hours/result-monthly-1440w.webp 1440w, https://liu.design/projects/library-hours/result-monthly-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-hours/result-monthly-1440w.jpeg 1440w, https://liu.design/projects/library-hours/result-monthly-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-hours/result-monthly-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-hours/result-monthly-1440w.jpeg" width="1440" height="960" alt="Library hours page wireframes" loading="lazy" decoding="async" /> </a> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-hours/result-widget-1440w.webp 1440w, https://liu.design/projects/library-hours/result-widget-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-hours/result-widget-1440w.jpeg 1440w, https://liu.design/projects/library-hours/result-widget-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-hours/result-widget-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-hours/result-widget-1440w.jpeg" width="1440" height="960" alt="Library hours page wireframes" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-result', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>Our project team decided to open-source the project so more libraries can use our solution to improve their user experience. Below is the same design and source code implemented by the Indiana University Bloomington Libraries.</p> <div> <div class="gallery undefined" id="gallery-result-iub"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/library-hours/result-iub-1440w.webp 1440w, https://liu.design/projects/library-hours/result-iub-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/library-hours/result-iub-1440w.jpeg 1440w, https://liu.design/projects/library-hours/result-iub-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/library-hours/result-iub-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/library-hours/result-iub-1440w.jpeg" width="1440" height="960" alt="Screenshot of the Indiana University Bloomington’s libraries & hours page" loading="lazy" decoding="async" /> </a> <figcaption>Indiana University Bloomington’s Libraries & Hours page using the same design</figcaption> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-result-iub', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> UX@UA Brand Identity 2019-10-01T00:00:00Z https://liu.design/projects/uxua-brand/ <p><a href="https://uxua.arizona.edu/" target="_blank" rel="noopener noreferrer">UX@UA</a> is the largest community for UX professionals and learners in Arizona. The community is based at the University of Arizona (UA) and hosts regular in-person events in Tucson, as well as virtual events and consultation services online. The community was founded in 2018, and as of 2023, over 1,400 members joined the community from all over the world through events and social media channels.</p> <p>In 2019, I became an organizer of UX@UA and was invited to design the community’s branding.</p> <div> <div class="gallery full-width" id="gallery-logo"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/uxua-brand/logo-banner-1440w.webp 1440w, https://liu.design/projects/uxua-brand/logo-banner-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/uxua-brand/logo-banner-1440w.jpeg 1440w, https://liu.design/projects/uxua-brand/logo-banner-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/uxua-brand/logo-banner-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/uxua-brand/logo-banner-1440w.jpeg" width="1440" height="960" alt="UX@UA standard logo" loading="lazy" decoding="async" /> </a> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/uxua-brand/logo-social-media-1440w.webp 1440w, https://liu.design/projects/uxua-brand/logo-social-media-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/uxua-brand/logo-social-media-1440w.jpeg 1440w, https://liu.design/projects/uxua-brand/logo-social-media-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/uxua-brand/logo-social-media-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/uxua-brand/logo-social-media-1440w.jpeg" width="1440" height="960" alt="UX@UA square logo" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-logo', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <h2>Goal</h2> <p>The community’s organizers hoped to see a versatile branding that fits various use cases such as event signage, social media posts, slide decks, and websites. The brand elements should be familiar to those affiliated with the University of Arizona, and instantly recognizable for event attendees and social media followers.</p> <p>In addition to the digital brand assets, the organizers also wanted to use the new branding to produce marketing swags to give away at in-person events.</p> <div> <div class="gallery full-width" id="gallery-posters"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/uxua-brand/poster-2022-1440w.webp 1440w, https://liu.design/projects/uxua-brand/poster-2022-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/uxua-brand/poster-2022-1440w.jpeg 1440w, https://liu.design/projects/uxua-brand/poster-2022-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/uxua-brand/poster-2022-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/uxua-brand/poster-2022-1440w.jpeg" width="1440" height="960" alt="Poster of UX@UA October 2022 event" loading="lazy" decoding="async" /> </a> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/uxua-brand/poster-2023-1440w.webp 1440w, https://liu.design/projects/uxua-brand/poster-2023-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/uxua-brand/poster-2023-1440w.jpeg 1440w, https://liu.design/projects/uxua-brand/poster-2023-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/uxua-brand/poster-2023-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/uxua-brand/poster-2023-1440w.jpeg" width="1440" height="960" alt="Poster of UX@UA December 2023 event" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-posters', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <h2>Brand research</h2> <p>I surveyed UX@UA members on Slack to research the identity of the community. Then I worked with the other organizers and outlined the community’s brand voice, which impacts not just the branding but also the way the organizers communicate with members:</p> <ul> <li>Cheerful, but not silly</li> <li>Organized, but not retro</li> <li>Experimental, but not rebellious</li> <li>Educational, but not scholarly</li> </ul> <p>We also gathered adjectives that describe and don’t describe UX@UA’s voice. People think the community is <em>welcoming</em>, <em>active</em>, <em>colorful</em>, <em>resourceful</em>, <em>collaborative</em>, and <em>clear</em>. They think words like <em>dense</em>, <em>wordy</em>, <em>scattered</em>, and <em>jumbled</em> don’t describe its voice.</p> <div> <div class="gallery full-width" id="gallery-usage"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/uxua-brand/usage-linkedin-1440w.webp 1440w, https://liu.design/projects/uxua-brand/usage-linkedin-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/uxua-brand/usage-linkedin-1440w.jpeg 1440w, https://liu.design/projects/uxua-brand/usage-linkedin-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/uxua-brand/usage-linkedin-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/uxua-brand/usage-linkedin-1440w.jpeg" width="1440" height="960" alt="Screenshot of UX@UA's LinkedIn page with the logo in view" loading="lazy" decoding="async" /> </a> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/uxua-brand/usage-pin-1440w.webp 1440w, https://liu.design/projects/uxua-brand/usage-pin-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/uxua-brand/usage-pin-1440w.jpeg 1440w, https://liu.design/projects/uxua-brand/usage-pin-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/uxua-brand/usage-pin-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/uxua-brand/usage-pin-1440w.jpeg" width="1440" height="960" alt="A white tote with a UX@UA pin" loading="lazy" decoding="async" /> </a> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/uxua-brand/usage-sticker-1440w.webp 1440w, https://liu.design/projects/uxua-brand/usage-sticker-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/uxua-brand/usage-sticker-1440w.jpeg 1440w, https://liu.design/projects/uxua-brand/usage-sticker-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/uxua-brand/usage-sticker-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/uxua-brand/usage-sticker-1440w.jpeg" width="1440" height="960" alt="Woman using a laptop with a UX@UA sticker" loading="lazy" decoding="async" /> </a> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/uxua-brand/usage-tablesign-1440w.webp 1440w, https://liu.design/projects/uxua-brand/usage-tablesign-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/uxua-brand/usage-tablesign-1440w.jpeg 1440w, https://liu.design/projects/uxua-brand/usage-tablesign-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/uxua-brand/usage-tablesign-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/uxua-brand/usage-tablesign-1440w.jpeg" width="1440" height="960" alt="Table sign at an event with UX@UA logo" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-usage', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <h2>Design</h2> <p>Because of UX@UA’s affiliation with the University of Arizona, I chose the two primary colors (Arizona Red and Arizona Blue) from the university’s brand, and paired them with an accent color (Sky).</p> <p>The subject of the logo are four letters in the community’s name. The @ sign was positioned in a playful way to break the alignment of the letters, leaving an impression that matches the community’s brand voice. All characters use UA’s brand typeface at that time, Milo.</p> <p>The characters in the logo can be arranged in two ways: wide and square. The wide logo are used in banners, slides, or large printed materials. The square logo fits social media profiles and can be adapted to create stickers, pins, or other small marketing swags.</p> <figure class="full-width"> <source type="image/webp" srcset="https://liu.design/projects/uxua-brand/event-1440w.webp 1440w, https://liu.design/projects/uxua-brand/event-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/uxua-brand/event-1440w.jpeg 1440w, https://liu.design/projects/uxua-brand/event-2400w.jpeg 2400w" sizes="100vw" /><img src="https://liu.design/projects/uxua-brand/event-2400w.jpeg" width="2400" height="1600" alt="People attending a UX@UA event with the logo visible at a distance" loading="lazy" decoding="async" /> </figure> Craft Design System 2018-04-01T00:00:00Z https://liu.design/projects/craft-design-system/ <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/craft-design-system/craft-blocks-1440w.webp 1440w, https://liu.design/projects/craft-design-system/craft-blocks-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/craft-design-system/craft-blocks-1440w.jpeg 1440w, https://liu.design/projects/craft-design-system/craft-blocks-2400w.jpeg 2400w" sizes="100vw" /><img src="https://liu.design/projects/craft-design-system/craft-blocks-1440w.jpeg" width="1440" height="960" alt="Illustration of some web components in the design system" loading="lazy" decoding="async" /> </figure> <p>Craft is a web design system created for the State of Minnesota Department of Human Services. As the state government’s first web design system, Craft’s name came from its five design principles: consistent, reusable, accessible, familiar and trustworthy.</p> <p>I performed visual design for the components, developed live prototypes using React, and conducted research with stakeholders and end users.</p> <h2>Goal</h2> <p>In 2017, the State of Minnesota Department of Human Services (DHS) started its Systems Modernization project, which aims to rebuild online public service platforms with newer web technology.</p> <p>Style governance became a challenge as the project teams set on a journey to build the new platforms. Developers chose from several front-end frameworks, and without a consistent design standard, the style, visual design, and accessibility differed from project to project.</p> <p>As a member of one of the project teams, I wanted to build a library of usable and accessible components that match the State’s brand, voice, and tone. In the meantime, I hoped that the component library is shared with the other modernization projects for a consistent user and developer experience. So, I teamed up with contributors from other projects, including designers, developers, and marketers, and started the collaborative project to build Craft.</p> <h2>Colors &amp; typography</h2> <p>I used the State of Minnesota’s 2017 brand guide for printed materials as my visual design reference. First off, I created a color palette in which most colors meet WCAG AA color contrast when paired with black or white foreground text.</p> <p>Following the marketing advisors’ guidance, I selected Source Sans Pro as Craft’s default typeface for headings and Open Sans for body copy. Both are open-source fonts served by Google Fonts.</p> <div> <div class="gallery full-width" id="gallery-brand"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/craft-design-system/brand-colors-1440w.webp 1440w, https://liu.design/projects/craft-design-system/brand-colors-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/craft-design-system/brand-colors-1440w.jpeg 1440w, https://liu.design/projects/craft-design-system/brand-colors-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/craft-design-system/brand-colors-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/craft-design-system/brand-colors-1440w.jpeg" width="1440" height="960" alt="Color palette that includes primary, secondary, tertiary, and neutral colors" loading="lazy" decoding="async" /> </a> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/craft-design-system/brand-typography-1440w.webp 1440w, https://liu.design/projects/craft-design-system/brand-typography-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/craft-design-system/brand-typography-1440w.jpeg 1440w, https://liu.design/projects/craft-design-system/brand-typography-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/craft-design-system/brand-typography-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/craft-design-system/brand-typography-1440w.jpeg" width="1440" height="960" alt="List of heading and body type styles" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-brand', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <h2>Components &amp; patterns</h2> <p>Craft was designed to be a system that streamlines both design and development processes. From day one, each component was designed in Sketch and developed in a React framework.</p> <p>We hoped developers using other front-end frameworks to also have access to Craft components’ style, behavior, and interaction without building from scratch. So, the team created a fallback option using plain HTML/CSS and jQuery.</p> <p>Following the <a href="https://bradfrost.com/blog/post/atomic-web-design/" target="_blank" rel="noopener noreferrer">Atomic design</a> methodology, I first designed basic components, then used them to assemble common UI patterns in government web applications. Below are some examples.</p> <h3>Buttons</h3> <div> <div class="gallery undefined" id="gallery-pattern-buttons"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/craft-design-system/pattern-button-1440w.webp 1440w, https://liu.design/projects/craft-design-system/pattern-button-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/craft-design-system/pattern-button-1440w.jpeg 1440w, https://liu.design/projects/craft-design-system/pattern-button-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/craft-design-system/pattern-button-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/craft-design-system/pattern-button-1440w.jpeg" width="1440" height="960" alt="Primary buttons, secondary buttons, and inactive buttons on a webpage" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-pattern-buttons', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h4</span><span class="token punctuation">></span></span>Primary buttons<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h4</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span><span class="token punctuation">></span></span>Blue<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Button</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>green<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Green<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Button</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>red<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Red<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Button</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h4</span><span class="token punctuation">></span></span>Outline buttons<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h4</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>outline<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Blue<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Button</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>red outline<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Red<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Button</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>dark<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Dark<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Button</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>light<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>bg-dark<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Light<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Button</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h4</span><span class="token punctuation">></span></span>Inactive button<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h4</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>inactive<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Inactive<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Button</span><span class="token punctuation">></span></span></code></pre> <p>We used the <a href="https://styled-components.com/" target="_blank" rel="noopener noreferrer">styled-components</a> library to package style variations with the component. For example, the developer can easily apply styles for a <code>Button</code> component by adding classes such as <code>type=&quot;outline&quot;</code> and <code>type=&quot;dark&quot;</code>.</p> <p>I also adjusted the color of each button’s three states to ensure the color contrast meets or exceeds WCAG AA.</p> <div> <div class="gallery undefined" id="gallery-accessibility"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/craft-design-system/pattern-button-contrast-1440w.webp 1440w, https://liu.design/projects/craft-design-system/pattern-button-contrast-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/craft-design-system/pattern-button-contrast-1440w.jpeg 1440w, https://liu.design/projects/craft-design-system/pattern-button-contrast-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/craft-design-system/pattern-button-contrast-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/craft-design-system/pattern-button-contrast-1440w.jpeg" width="1440" height="960" alt="Primary buttons, secondary buttons, and inactive buttons on a webpage" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-accessibility', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <h3>Form validation</h3> <p>Government websites tend to leave an impression of being unusable and inaccesssible, and webforms often take the blame. The Craft Design System aims to improve the usability in government webforms starting with displaying helpful error messages.</p> <p>The Social Security number field was one of the common fields in the State’s webforms. It was also one of the trickiest when it comes to form validation, since formatting and error prompts were different by platform.</p> <p>Craft comes with webform patterns that include the Social Security number field. Using one line of code, the developer can insert the form field combined with its auto-formatting and validation features.</p> <div> <div class="gallery undefined" id="gallery-pattern-form-validation"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/craft-design-system/pattern-form-validation-1440w.webp 1440w, https://liu.design/projects/craft-design-system/pattern-form-validation-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/craft-design-system/pattern-form-validation-1440w.jpeg 1440w, https://liu.design/projects/craft-design-system/pattern-form-validation-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/craft-design-system/pattern-form-validation-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/craft-design-system/pattern-form-validation-1440w.jpeg" width="1440" height="960" alt="Form field for SSN input with an error message" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-pattern-form-validation', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>FormField</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>ssn<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></code></pre> <h3>Special patterns</h3> <p>Craft includes patterns unique to the State of Minnesota’s web platforms. For example, many webforms used by county and state workers include a question prompting eligible or impacted counties.</p> <p>Minnesota has 87 counties, and the question was usually accompanied by 87 checkboxes, which was overwhelming, inaccessible, and painful to use.</p> <p>I designed a special pattern called <em>label box</em> to solve this issue. It comes with a single field with the 87 counties’ names built in. Once the user starts typing the name of a county, matching results show up in a list that follows the curser. The user can then navigate with the mouse or keyboard or hit enter to select the first result in the list.</p> <div> <div class="gallery full-width" id="gallery-pattern-counties"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/craft-design-system/pattern-counties-before-1440w.webp 1440w, https://liu.design/projects/craft-design-system/pattern-counties-before-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/craft-design-system/pattern-counties-before-1440w.jpeg 1440w, https://liu.design/projects/craft-design-system/pattern-counties-before-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/craft-design-system/pattern-counties-before-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/craft-design-system/pattern-counties-before-1440w.jpeg" width="1440" height="960" alt="Question in a webform that includes 87 checkboxes for Minnesota’s counties" loading="lazy" decoding="async" /> </a> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/craft-design-system/pattern-counties-after-1440w.webp 1440w, https://liu.design/projects/craft-design-system/pattern-counties-after-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/craft-design-system/pattern-counties-after-1440w.jpeg 1440w, https://liu.design/projects/craft-design-system/pattern-counties-after-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/craft-design-system/pattern-counties-after-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/craft-design-system/pattern-counties-after-1440w.jpeg" width="1440" height="960" alt="Revised patterns that use labels and a select menu for inputting counties" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-pattern-counties', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>FormField</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>county<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></code></pre> <p>Similarly, the pattern for selecting counties is a part of the <code>FormField</code> component and can be added to a webform with one line of code.</p> <p>The <em>label box</em> pattern may also be customized to support other input values.</p> <h3>Common webforms</h3> <p>In addition to individual form fields, Craft has a <code>FormModule</code> that includes common combinations of form fields.</p> <p>For example, the address form is one of the most frequently-used webform patterns while also laborious to implement. With plain HTML, just the state select menu alone has more than fifty lines of code. Users reported the form had inconsistent validation on different platforms.</p> <div> <div class="gallery undefined" id="gallery-pattern-address-form"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/craft-design-system/pattern-address-form-1440w.webp 1440w, https://liu.design/projects/craft-design-system/pattern-address-form-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/craft-design-system/pattern-address-form-1440w.jpeg 1440w, https://liu.design/projects/craft-design-system/pattern-address-form-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/craft-design-system/pattern-address-form-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/craft-design-system/pattern-address-form-1440w.jpeg" width="1440" height="960" alt="Webform with address, city, state, and ZIP code fields" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-pattern-address-form', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <pre class="language-html"><code class="language-html"><span class="token comment">&lt;!-- Address form: plain HTML --></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>form-address<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>label</span> <span class="token attr-name">for</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>add1<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Address line 1<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>label</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>add1<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-2x required<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>label</span> <span class="token attr-name">for</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>add2<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Address line 2<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>label</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>add2<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-2x<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>label</span> <span class="token attr-name">for</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>city<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>City<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>label</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>city<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>required<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>label</span> <span class="token attr-name">for</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>state<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>State<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>label</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>select</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>state<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>AL<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Alabama<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>option</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>AK<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Alaska<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>option</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>AZ<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Arizona<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>option</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>AR<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Arkansas<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>option</span><span class="token punctuation">></span></span> ... <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>select</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>label</span> <span class="token attr-name">for</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>zip<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>ZIP code<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>label</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>zip<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>required<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></code></pre> <p>Craft addresses this issue by combining the address form fields and the recommended validation pattern in one component. This approach aims to save time for developers while also improving usability for the end users with a consistent data format and error messages.</p> <pre class="language-html"><code class="language-html"><span class="token comment">&lt;!-- Address form: Craft --></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>FormModule</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>address<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></code></pre> MovieLens Movie Recommender System 2017-07-01T00:00:00Z https://liu.design/projects/movielens/ <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/movielens/movie-cards-1440w.webp 1440w, https://liu.design/projects/movielens/movie-cards-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/movielens/movie-cards-1440w.jpeg 1440w, https://liu.design/projects/movielens/movie-cards-2400w.jpeg 2400w" sizes="100vw" /><img src="https://liu.design/projects/movielens/movie-cards-1440w.jpeg" width="1440" height="960" alt="Three MovieLens movie cards that display movie posters and star ratings" loading="lazy" decoding="async" /> </figure> <p><a href="https://movielens.org/" target="_blank" rel="noopener noreferrer">MovieLens</a> is a recommendation system for movies built and maintained by GroupLens Research at the University of Minnesota. The user builds a profile by rating movies they have watched, and MovieLens generates new movie recommendations based on their rating.</p> <p>I designed MovieLens’ movie card component that displays movie information and prompts rating, conducted user research, and developed a prototype in the website’s Angular-based framework.</p> <h2>Goal</h2> <p>Researchers at GroupLens Research use MovieLens to collect movie rating data and train the recommendation systems. They wanted to see a website that encourages the user to rate movies, and helps the user easily find movies they watched. The previous MovieLens interface was designed to meet these needs.</p> <div> <div class="gallery undefined" id="gallery-previous-homepage"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/movielens/previous-homepage-1440w.webp 1440w, https://liu.design/projects/movielens/previous-homepage-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/movielens/previous-homepage-1440w.jpeg 1440w, https://liu.design/projects/movielens/previous-homepage-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/movielens/previous-homepage-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/movielens/previous-homepage-1440w.jpeg" width="1440" height="960" alt="Screenshot of the previous MovieLens homepage" loading="lazy" decoding="async" /> </a> <figcaption>Search results in the previous MovieLens design</figcaption> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-previous-homepage', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <p>The previous design, however, was not favored by users. 12 out of 14 active MovieLens users I interviewed did not like the previous site design. They thought the movie cards, which was a blend of text, icons, stars, and a movie poster in a small space, made pages look cluttered and confusing.</p> <p>Another pain point was the previous design used differently-colored stars to indicate system predicted rating and the user’s actual rating, but users had a hard time figuring it out.</p> <p>In the 2017 redesign, I focused on addressing these two pain points and keeping the card-based rating experience.</p> <h2>Design</h2> <p>The size of a movie card is approximately 176 x 320 pixels. However, it displays a large amount of information, including the movie’s poster, name, release year, genres, predicted rating, user rating, rating widget, and additional actions.</p> <p>The challenge was to present dense information in a clean an intuitive way. I was inspired by belly bands (or <em>obi</em> in Japanese) often used in packaging of books or notebooks. The band moves up and down, covering or revealing information on the book cover.</p> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/movielens/obi-1440w.webp 1440w, https://liu.design/projects/movielens/obi-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/movielens/obi-1440w.jpeg 1440w, https://liu.design/projects/movielens/obi-2400w.jpeg 2400w" sizes="100vw" /><img src="https://liu.design/projects/movielens/obi-1440w.jpeg" width="1440" height="960" alt="Japanese book with a printed paper band" loading="lazy" decoding="async" /><figcaption>Belly band of a Japense book</figcaption> </figure> <p>In a similar structure, I created a moving information panel for the movie card. In its default state, the panel stays on the bottom of the movie poster and displays the movie name and predicted rating.</p> <p>When the user points the mouse at a movie card, the panel moves up to reveal more information, including release year, genres, predicted rating, average rating, and the rating widget. The user can then use the rating widget to add their rating.</p> <p>Once the mouse leaves the movie card, the panel moves back to its original state, and the rating changes to the user’s actual rating. The user can also click on the movie poster to go to the movie details page.</p> <div> <div class="gallery full-width" id="gallery-card"> <figure class=""> <source type="image/webp" srcset="https://liu.design/projects/movielens/card-symbols-1440w.webp 1440w, https://liu.design/projects/movielens/card-symbols-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/movielens/card-symbols-1440w.jpeg 1440w, https://liu.design/projects/movielens/card-symbols-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/movielens/card-symbols-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/movielens/card-symbols-1440w.jpeg" width="1440" height="960" alt="Three MovieLens movie cards that display movie names, years, genres, posters, and star ratings, and explanation of each element on the cards" loading="lazy" decoding="async" /> </a> </figure><figure class=""> <source type="image/webp" srcset="https://liu.design/projects/movielens/card-actions-1440w.webp 1440w, https://liu.design/projects/movielens/card-actions-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/movielens/card-actions-1440w.jpeg 1440w, https://liu.design/projects/movielens/card-actions-2400w.jpeg 2400w" sizes="100vw" /> <a href="https://liu.design/projects/movielens/card-actions-2400w.jpeg" data-pswp-width="2400" data-pswp-height="1600" data-cropped="true" target="_blank"> <img src="https://liu.design/projects/movielens/card-actions-1440w.jpeg" width="1440" height="960" alt="Three actions through MovieLens cards: rate a movie, search by genre, and see movie details" loading="lazy" decoding="async" /> </a> </figure> </div> <script type="module"> import PhotoSwipeLightbox from '/assets/js/photoswipe-lightbox.esm.min.js'; import PhotoSwipe from '/assets/js/photoswipe.esm.min.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery-card', children: 'a', imageClickAction: 'close', tapAction: 'close', showHideAnimationType: 'fade', arrowPrev: false, arrowNext: false, zoom: false, close: false, counter: false, pswpModule: PhotoSwipe, preload: [1, 1] }); lightbox.init(); </script> </div> <div class="embed"> <div style="padding:59.2% 0 0 0;position:relative;"><iframe src="https://player.vimeo.com/video/397350764?h=1d0577416c&autoplay=1&loop=1&portrait=0" style="position:absolute;top:0;left:0;width:100%;height:100%;" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe></div><script src="https://player.vimeo.com/api/player.js"></script> </div> <h2>Result</h2> <p>All 13 participants in a subsequent usability testing preferred the new MovieLens design over the previous one. Participants mentioned the new design “looks cleaner and faster,” “feels smooth,” and “is easy to understand.”</p> <figure class="full-width"> <source type="image/webp" srcset="https://liu.design/projects/movielens/new-homepage-1440w.webp 1440w, https://liu.design/projects/movielens/new-homepage-2400w.webp 2400w" sizes="100vw" /> <source type="image/jpeg" srcset="https://liu.design/projects/movielens/new-homepage-1440w.jpeg 1440w, https://liu.design/projects/movielens/new-homepage-2400w.jpeg 2400w" sizes="100vw" /><img src="https://liu.design/projects/movielens/new-homepage-2400w.jpeg" width="2400" height="1600" alt="Screenshot of the redesigned MovieLens homepage" loading="lazy" decoding="async" /> </figure> <h2>Limitations</h2> <p>During my time at GroupLens Research, I had only tested the movie card prototype above with desktop browsers. The design potentially had usability issues on mobile due to the animated information panel triggered by mouse hovering and UI elements with small click targets.</p> <p>Another planned next step was to test and optimize the movie card design for screen readers.</p>