{"version":3,"file":"CaseStudy.B5yGIXhK.mjs","names":[],"sources":["https:/framerusercontent.com/modules/AosZbJOXElGO5RTrCDEA/ZjrsJtEZeymy48dgl83d/CaseStudy.js"],"sourcesContent":["// @ts-nocheck\n// Shared case study layout: title + details on the left, descriptions on the right, then the\n// work below. Pick which study this page shows in the properties panel (Study).\nimport{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{addPropertyControls,ControlType}from\"framer\";const CSS='\\n.cs { background: #050505; color: #f3efe8; font-family: Geist, system-ui, sans-serif; -webkit-font-smoothing: antialiased; }\\n.cs * { box-sizing: border-box; margin: 0; }\\n.cs .cs-in { max-width: 1240px; margin: 0 auto; padding: 0 24px; container-type: inline-size; }\\n.cs a { color: inherit; }\\n.cs .mono { font: 12px/1.4 \"Geist Mono\", ui-monospace, monospace; letter-spacing: 0.08em; text-transform: uppercase; }\\n.cs .dot { color: #ff4d1a; }\\n.cs-top { display: flex; justify-content: space-between; align-items: center; padding: 22px 0; border-bottom: 1px solid #161514; }\\n.cs-back { display: inline-flex; align-items: center; gap: 10px; text-decoration: none; color: #cfc8be; padding: 8px 0; transition: color 0.2s; }\\n.cs-back span { display: inline-block; transition: transform 0.25s; }\\n.cs-back:hover { color: #fff; } .cs-back:hover span { transform: translateX(-4px); }\\n.cs-name { color: #7a746b; }\\n.cs-head { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: clamp(20px, 3vw, 48px); padding: clamp(56px, 8vw, 110px) 0 clamp(48px, 6vw, 80px); }\\n.cs-head-l { grid-column: 1 / span 5; }\\n.cs-head-r { grid-column: 7 / span 6; padding-top: 34px; }\\n.cs h1 { font-size: clamp(44px, 6vw, 84px); line-height: 0.95; letter-spacing: -0.045em; font-weight: 600; margin-top: 16px; }\\n.cs .cs-tag { margin-top: 18px; font-size: clamp(18px, 1.6vw, 22px); line-height: 1.35; color: #a8a197; max-width: 26ch; }\\n.cs dl { margin-top: 40px; display: grid; grid-template-columns: auto 1fr; gap: 12px 20px; font-size: 14px; line-height: 1.5; border-top: 1px solid #1f1d1b; padding-top: 22px; }\\n.cs dt { color: #7a746b; padding-top: 2px; }\\n.cs dd { color: #e6e0d6; }\\n.cs .cs-links { margin-top: 28px; display: flex; flex-wrap: wrap; gap: 10px; }\\n.cs .cs-btn { display: inline-flex; gap: 8px; align-items: center; padding: 11px 16px; border: 1px solid #3a3632; color: #f3efe8; text-decoration: none; transition: border-color 0.2s, background 0.2s; }\\n.cs .cs-btn:hover { border-color: #ff4d1a; background: rgba(255, 77, 26, 0.08); }\\n.cs .cs-lead { font-size: clamp(20px, 1.9vw, 26px); line-height: 1.4; letter-spacing: -0.01em; color: #f3efe8; }\\n.cs .cs-head-r p + p { margin-top: 18px; font-size: 17px; line-height: 1.65; color: #a8a197; }\\n.cs-hero { position: relative; display: grid; place-items: center; padding: clamp(24px, 4vw, 56px) 0 clamp(72px, 9vw, 130px); isolation: isolate; }\\n.cs-hero::before { content: \"\"; position: absolute; left: 12%; right: 12%; top: 0; bottom: 8%; z-index: -1; border-radius: 50%; background: radial-gradient(closest-side, rgba(243, 239, 232, 0.16), rgba(243, 239, 232, 0.05) 50%, transparent 78%); }\\n.cs-hero img { max-width: min(100%, 880px); max-height: 640px; width: auto; height: auto; }\\n.cs-sec { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: clamp(20px, 3vw, 48px); padding: clamp(56px, 7vw, 96px) 0; border-top: 1px solid #161514; }\\n.cs-sec-l { grid-column: 1 / span 4; }\\n.cs-sec-l > div { position: sticky; top: 32px; }\\n.cs-sec-r { grid-column: 5 / -1; display: grid; gap: 36px; align-content: start; }\\n.cs h2 { margin-top: 14px; font-size: clamp(26px, 2.6vw, 36px); line-height: 1.1; letter-spacing: -0.025em; font-weight: 600; max-width: 16ch; }\\n.cs .k { color: #8d867c; }\\n.cs .body p { font-size: 17px; line-height: 1.7; color: #b7b0a6; max-width: 64ch; }\\n.cs .body p + p { margin-top: 16px; }\\n.cs .stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 28px; border-top: 1px solid #1f1d1b; padding-top: 24px; }\\n.cs .stat b { display: block; font-size: clamp(34px, 3.4vw, 48px); line-height: 1; letter-spacing: -0.04em; font-weight: 600; }\\n.cs .stat span { display: block; margin-top: 10px; font-size: 14px; line-height: 1.45; color: #8d867c; max-width: 22ch; }\\n.cs .cards { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 32px 36px; }\\n.cs .card { border-top: 1px solid #262320; padding-top: 18px; }\\n.cs .card .n { color: #ff4d1a; }\\n.cs .card h3 { margin-top: 10px; font-size: 19px; line-height: 1.25; letter-spacing: -0.01em; font-weight: 600; }\\n.cs .card p { margin-top: 10px; font-size: 15px; line-height: 1.6; color: #a8a197; }\\n.cs .cmp { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 28px; }\\n.cs .cmp .card img { display: block; height: 34px; width: auto; max-width: 100%; object-fit: contain; object-position: left; margin-bottom: 14px; }\\n.cs .cmp dl { margin-top: 12px; grid-template-columns: 1fr; gap: 4px; border: 0; padding: 0; font-size: 14px; }\\n.cs .cmp dd { color: #a8a197; margin-bottom: 10px; }\\n.cs .rows { display: grid; gap: 56px; }\\n.cs .row { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 32px; align-items: start; }\\n.cs .row h3 { margin-top: 10px; font-size: 22px; line-height: 1.2; letter-spacing: -0.015em; font-weight: 600; }\\n.cs .row p { margin-top: 10px; font-size: 15px; line-height: 1.65; color: #a8a197; }\\n.cs .row .before { margin-top: 14px; padding-left: 14px; border-left: 2px solid #2c2926; }\\n.cs .row .before b, .cs .row .after b { display: block; font: 11px/1.4 \"Geist Mono\", ui-monospace, monospace; letter-spacing: 0.08em; text-transform: uppercase; color: #7a746b; font-weight: 400; }\\n.cs .row .after { margin-top: 14px; padding-left: 14px; border-left: 2px solid #ff4d1a; }\\n.cs .row .before p, .cs .row .after p { margin-top: 6px; }\\n.cs .row .mini { display: flex; gap: 28px; margin-top: 18px; }\\n.cs .row .mini b { font-size: 28px; letter-spacing: -0.03em; font-weight: 600; }\\n.cs .row .mini span { display: block; font-size: 13px; color: #8d867c; max-width: 20ch; margin-top: 4px; }\\n.cs figure { margin: 0; }\\n.cs .frame { background: #0d0c0b; border: 1px solid #1f1d1b; display: grid; place-items: center; overflow: hidden; }\\n.cs .frame img { display: block; width: 100%; height: auto; }\\n.cs .media { display: grid; gap: 16px; }\\n.cs .media.phones { grid-template-columns: repeat(3, minmax(0, 1fr)); }\\n.cs .media.pair { grid-template-columns: repeat(2, minmax(0, 1fr)); }\\n.cs .media.phones .frame { padding: 16px; }\\n.cs .quotes { display: grid; gap: 40px; }\\n.cs .gal { display: grid; gap: 16px; }\\n.cs .gal .piece { display: block; text-decoration: none; color: inherit; break-inside: avoid; }\\n.cs .gal.art .piece { margin-bottom: 16px; }\\n.cs .gal.art .piece .frame { margin-bottom: 0; }\\n.cs .gal .cap { display: block; margin-top: 10px; color: #7a746b; line-height: 1.5; }\\n.cs .gal .cap b { color: #d6cfc5; font-weight: 400; }\\n.cs a.piece:hover .frame { border-color: rgba(255, 77, 26, 0.55); }\\n.cs .gal .frame { padding: 6%; }\\n.cs .gal img { object-fit: contain; }\\n.cs .gal.tees { grid-template-columns: repeat(var(--cols, 3), minmax(0, 1fr)); }\\n.cs .gal.art { display: block; columns: var(--cols, 3); column-gap: 16px; }\\n.cs .gal.art .frame { break-inside: avoid; margin-bottom: 16px; }\\n.cs .gal.wide .frame { padding: 0; }\\n.cs .gal.logos { grid-template-columns: repeat(var(--cols, 3), minmax(0, 1fr)); }\\n.cs .gal.logos .frame { background: #efeae2; border-color: #efeae2; aspect-ratio: 4 / 3; padding: 14%; }\\n.cs .gal.logos img { width: 100%; height: 100%; }\\n.cs [id] { scroll-margin-top: 24px; }\\n.cs blockquote { margin: 0; }\\n.cs blockquote q { display: block; font-size: clamp(20px, 1.9vw, 25px); line-height: 1.35; letter-spacing: -0.01em; quotes: \"\\\\201C\" \"\\\\201D\"; padding-left: 18px; border-left: 2px solid #ff4d1a; }\\n.cs blockquote .who { margin-top: 16px; padding-left: 20px; color: #7a746b; }\\n.cs blockquote p { margin-top: 10px; padding-left: 20px; font-size: 15px; line-height: 1.6; color: #a8a197; max-width: 64ch; }\\n.cs ul.list { list-style: none; padding: 0; display: grid; gap: 0; border-top: 1px solid #1f1d1b; }\\n.cs ul.list li { padding: 14px 0 14px 28px; border-bottom: 1px solid #1f1d1b; position: relative; font-size: 16px; line-height: 1.5; color: #d6cfc5; }\\n.cs ul.list li::before { content: \"\\\\2192\"; position: absolute; left: 0; color: #ff4d1a; }\\n.cs-next { display: block; text-decoration: none; padding: clamp(56px, 8vw, 110px) 0; border-top: 1px solid #161514; }\\n.cs-next .t { display: block; margin-top: 14px; font-size: clamp(34px, 5vw, 72px); line-height: 1; letter-spacing: -0.04em; font-weight: 600; transition: color 0.25s; }\\n.cs-next .t span { display: inline-block; transition: transform 0.25s; color: #ff4d1a; }\\n.cs-next:hover .t span { transform: translateX(8px); }\\n.cs-foot { display: flex; justify-content: space-between; gap: 16px; flex-wrap: wrap; padding: 24px 0 40px; border-top: 1px solid #161514; color: #7a746b; }\\n.cs-foot a { text-decoration: none; color: #cfc8be; } .cs-foot a:hover { color: #fff; }\\n.cs a:focus-visible { outline: 2px solid #ff4d1a; outline-offset: 4px; }\\n@container (max-width: 820px) {\\n  .cs-head, .cs-sec { display: block; }\\n  .cs-head-r { padding-top: 0; margin-top: 40px; }\\n  .cs-sec-l > div { position: static; }\\n  .cs-sec-r { margin-top: 28px; }\\n  .cs .cards, .cs .cmp, .cs .row, .cs .media.pair { grid-template-columns: 1fr; }\\n  .cs .media.phones { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }\\n  .cs .media.phones .frame { padding: 6px; }\\n  .cs .gal.tees, .cs .gal.logos { grid-template-columns: repeat(2, minmax(0, 1fr)); }\\n  .cs .gal.art { columns: var(--mcols, 2); }\\n  .cs .gal.tees, .cs .gal.logos { grid-template-columns: repeat(var(--mcols, 2), minmax(0, 1fr)); }\\n  .cs-name { display: none; }\\n}\\n@media (prefers-reduced-motion: reduce) { .cs * { transition: none !important; } }\\n.cs .frame.ph { aspect-ratio: 16 / 10; border: 1px dashed #3a3632; background: #0b0a09; padding: 24px; text-align: center; color: #7a746b; }\\n.cs .frame.ph span { max-width: 32ch; line-height: 1.6; }\\n.cs .frame.ph.tall { aspect-ratio: 9 / 16; }\\n.cs-hero .frame.ph { width: min(100%, 880px); }\\n';const STUDIES={\"spotify\":{\"path\":\"/spotifyredesign\",\"next\":\"canvas\",\"title\":\"Spotify Redesign\",\"tagline\":\"Rethinking discovery on the mobile artist page\",\"hero\":{\"src\":\"https://framerusercontent.com/images/6NiSN4uO1NdRBgQOKsj7AuvG62U.webp\",\"alt\":\"Redesigned Spotify artist page on an iPhone\"},\"meta\":[[\"Role\",\"UX Research, Interaction Design\"],[\"Method\",\"Moderated usability testing\"],[\"Platform\",\"Spotify mobile app\"],[\"Tools\",\"Figma\"]],\"links\":[[\"View the prototype\",\"https://www.figma.com/proto/pmQtURlcV5erLLmtb87Ar2/COGS-187A-Final?node-id=1-2&starting-point-node-id=1%3A2&t=N7cgzE1Dlh3wg92d-1\"]],\"intro\":[\"Spotify is part of daily student life, yet its artist page makes it surprisingly hard to explore an artist's full catalog.\",\"This project set out to find exactly where listeners get lost, then redesign the artist page to reduce friction and make discovery easier.\"],\"sections\":[{\"kicker\":\"The original design\",\"heading\":\"One long scroll, no structure\",\"body\":[\"The mobile artist page stacks every type of content into one continuous feed. There's no navigation: popular tracks, podcasts and similar artists all share the same scroll. It looks clean at a glance, but that simplicity hides real friction as soon as you want more than the top five songs.\"],\"media\":[{\"src\":\"https://framerusercontent.com/images/WOq09jLAKMl2BW0oI8EuIfkmnM.webp\",\"alt\":\"Original Spotify artist page, top\"},{\"src\":\"https://framerusercontent.com/images/a1zjmrxTGTiYQDFYLTE05M9Lqo.webp\",\"alt\":\"Original Spotify artist page, middle\"},{\"src\":\"https://framerusercontent.com/images/wuMHoXd4JvNUoIWIvYiPJU4zlT4.webp\",\"alt\":\"Original Spotify artist page, bottom\"}],\"mediaLayout\":\"phones\"},{\"kicker\":\"Research \\xb7 Round 1\",\"heading\":\"What we set out to learn\",\"stats\":[[\"4\",\"Participants\"],[\"3\",\"Tasks per session\"],[\"10–20\",\"Minutes per session\"],[\"3\",\"Recurring pain points\"]],\"cards\":[{\"n\":\"01\",\"title\":\"Featured tracks are invisible\",\"text\":'\"Appears On\" sat at the very bottom of a long page. All four participants either missed it or only found it thanks to years of using the app. If users can\\'t find it, it might as well not exist.'},{\"n\":\"02\",\"title\":\"No single view of every track\",\"text\":\"Finding older songs meant opening albums one by one. There was no way to see an artist's full catalog in one place, so discovery came down to trial and error.\"},{\"n\":\"03\",\"title\":\"A cluttered vertical scroll\",\"text\":\"Albums, singles, podcasts, recommendations and similar artists shared one dense feed with no clear hierarchy. Participants overshot content and kept scrolling back.\"}]},{\"kicker\":\"Competitive analysis\",\"heading\":\"How other apps handle it\",\"compare\":[{\"name\":\"Apple Music\",\"img\":\"https://framerusercontent.com/images/1foyNrwxbKFqXfsRpubRrKczs.png\",\"good\":'Clearly labeled sections, a visible \"Appears On\", and sorting by date or popularity, all missing from Spotify on mobile.',\"bad\":\"Feels less personal, with fewer ways to discover new music.\",\"take\":'Inspired our tab structure and the more prominent \"Appears On\".'},{\"name\":\"YouTube Music\",\"img\":\"https://framerusercontent.com/images/XDmOti7cC54grKIOX7Ln8nctpY.png\",\"good\":\"Top and featured songs show immediately; singles, EPs and albums are neatly separated, with a music vs. live filter.\",\"bad\":\"The video-heavy layout can overwhelm music-only browsing.\",\"take\":\"Confirmed the value of showing top content first and ordering the catalog by date.\"},{\"name\":\"SoundCloud\",\"img\":\"https://framerusercontent.com/images/L51gZY5TvftOZmgnx31s0ZG8mc.png\",\"good\":\"An artist summary with a song count, and a release feed that makes older tracks easy to spot.\",\"bad\":\"Disorganized and hard to navigate; often called frustrating.\",\"take\":\"Showed us what to avoid, while confirming the value of an About section.\"}]},{\"kicker\":\"Design decisions\",\"heading\":\"Four changes, each grounded in research\",\"cards\":[{\"n\":\"01\",\"title\":\"Tabs for each task\",\"text\":\"Four labeled tabs (Popular, Discography, Appears On and About) replace the single scroll, so listeners jump straight to what they need.\"},{\"n\":\"02\",\"title\":\"View all tracks\",\"text\":\"One button shows the artist's whole catalog in a single chronological list. No more opening albums one by one to find older songs.\"},{\"n\":\"03\",\"title\":'\"Appears On\" as a main tab',\"text\":\"Features and collaborations move from the bottom of the page to their own tab, as easy to reach as the top songs.\"},{\"n\":\"04\",\"title\":\"Less vertical clutter\",\"text\":\"Music is separated from podcasts, merch and similar artists. Each tab shows only what it promises, with no interruptions mid-scroll.\"}]},{\"kicker\":\"The redesign\",\"heading\":\"A structured artist page\",\"body\":[\"The redesign focuses on the mobile artist page. The single feed becomes a tab layout that organizes content into four clear sections, each reachable from the top of the page.\"],\"media\":[{\"src\":\"https://framerusercontent.com/images/PBUQ1TDPndG3AOWcYjZ1rX6Y2E.gif\",\"alt\":\"Walkthrough of the redesigned artist page\"}],\"link\":0},{\"kicker\":\"Validation \\xb7 Round 2\",\"heading\":\"Testing both redesigns against the original\",\"body\":['Four new participants, none of whom had seen the prototypes, completed the same tasks on three versions: the original, Redesign A and Redesign B. The prototypes weren\\'t fully functional, so the task changed from \"add songs to a playlist\" to \"find specific songs\", which tested navigation and discoverability directly.'],\"cards\":[{\"title\":\"Faster task completion\",\"text\":\"Participants found songs noticeably faster in both redesigns. Tabs removed the aimless scrolling that slowed them down in the original.\"},{\"title\":'\"Appears On\" found',\"text\":'In Round 1 one participant never found it. In Round 2 everyone found featured tracks quickly, and several described it as a \"new feature\", even though it was always there.'},{\"title\":\"Less mental effort\",\"text\":\"Participants spent less time getting oriented and navigated with more confidence, even while first exploring the tabs.\"},{\"title\":\"Unanimous preference\",\"text\":'All four chose the redesign when asked which version Spotify should use, calling it \"cleaner\", \"more organized\" and \"finally makes sense\".'}]},{\"kicker\":\"Lessons learned\",\"heading\":\"What I'm taking forward\",\"cards\":[{\"n\":\"01\",\"title\":\"Visibility is usability\",\"text\":'\"Appears On\" felt brand new to Round 2 participants, though it existed all along. A hidden feature and a missing feature are effectively the same; placement and labeling decide whether something gets used.'},{\"n\":\"02\",\"title\":\"Success means less effort, not new visuals\",\"text\":\"Participants praised fewer taps, clearer paths and less scrolling, not the look. The redesign changed how Spotify thinks more than how it looks.\"},{\"n\":\"03\",\"title\":\"Prototype fidelity shapes your insights\",\"text\":\"Because participants couldn't actually add songs, we got strong navigation data but little on error handling or playlist building. A higher-fidelity prototype would have surfaced those issues.\"},{\"n\":\"04\",\"title\":\"Familiarity can hide usability problems\",\"text\":\"Experienced users finished tasks the design made hard because they'd learned to work around it. It's worth watching for moments when users succeed for the wrong reasons.\"}]}]},\"canvas\":{\"path\":\"/canvasredesign\",\"next\":\"leyenda\",\"title\":\"Canvas Redesign\",\"tagline\":\"A to-do list and notifications students can rely on\",\"hero\":{\"src\":\"https://framerusercontent.com/images/sbeJJ1A3qEM16WlDZDPlRgsCtc8.webp\",\"alt\":\"Redesigned Canvas to-do list on an iPhone\"},\"meta\":[[\"Role\",\"UX Research, Interaction Design\"],[\"Method\",\"User interviews, usability testing\"],[\"Platform\",\"Canvas LMS, mobile + desktop\"],[\"Focus\",\"Assignment tracking, notifications, GPA visibility\"]],\"links\":[[\"To-do list prototype\",\"https://www.figma.com/proto/tAXWECPTlal2Tze5NCk7EG/High-Fidelity-Canvas-Redesign?node-id=61-24&t=0feAYYn5vyUqknyM-1&scaling=scale-down&content-scaling=fixed&page-id=0%3A1&starting-point-node-id=31%3A2&show-proto-sidebar=1\"],[\"Notifications prototype\",\"https://www.figma.com/proto/tAXWECPTlal2Tze5NCk7EG/High-Fidelity-Canvas-Redesign?node-id=522-1192&t=JbaQpNDbK0JBng1B-1&scaling=scale-down&content-scaling=fixed&page-id=0%3A1&starting-point-node-id=31%3A2&show-proto-sidebar=1\"]],\"intro\":[\"Canvas is the leading LMS in North America, yet in our experience and research it pushes students to work around it rather than with it.\",\"Undergraduates with heavy course loads have little control over how Canvas organizes tasks and sends alerts. They lean on outside tools and workarounds, and still miss deadlines while drowning in notifications. This project finds where students hit friction day to day and proposes targeted redesigns.\"],\"sections\":[{\"kicker\":\"Context\",\"heading\":\"Why it matters\",\"body\":[\"Canvas serves more than 30 million students across 8,000+ institutions, and 38% of K–12 students in the US use it too. It's where courses, communication, coursework and grades live. Despite that reach, students keep separate to-do apps, ignore notifications, or check each course page by hand just to stay on top of deadlines.\"],\"stats\":[[\"50%\",\"North American LMS market share\"],[\"88%\",\"of college students report academic stress\"],[\"30M+\",\"students served\"],[\"8,000+\",\"institutions\"]]},{\"kicker\":\"User research\",\"heading\":\"Three pain points\",\"rows\":[{\"label\":\"Assignment tracking\",\"title\":\"A to-do list students can't trust\",\"text\":\"Students say Canvas's to-do list \\\"doesn't ever show everything\\\", so many keep a separate app or paper planner. That adds mental load and raises the risk of missed deadlines.\",\"img\":\"https://framerusercontent.com/images/Fr1lm7w3r8jYQdfMcgaPBUtOs0.png\",\"stats\":[[\"90%\",\"of Canvas sessions spent just checking what's due\"],[\"3+\",\"views cross-checked to find every assignment\"]]},{\"label\":\"Notification controls\",\"title\":\"Notification overload\",\"text\":\"Students get an alert for every discussion reply in every course, with no way to prioritize on mobile. Desktop has per-course controls; the mobile app doesn't, so students either ignore everything or miss what matters.\",\"img\":\"https://framerusercontent.com/images/XpBtBviKypmOIBVe9TXqRmGw1w.png\",\"stats\":[[\"0\",\"per-course notification controls on mobile\"],[\"88%\",\"of college students report academic stress\"]]},{\"label\":\"Academic visibility\",\"title\":\"No overall GPA view\",\"text\":'Canvas shows grades per course but no overall GPA or \"what-if\" calculator. Students calculate by hand or use third-party tools, which adds stress and takes away a sense of control.',\"img\":\"https://framerusercontent.com/images/PxaYrUiMsKxc2RWIhcvwaAHoYMs.png\",\"stats\":[[\"50%\",\"of the higher-ed LMS market\"],[\"6M+\",\"users at peak, so any fix reaches a lot of people\"]]}]},{\"kicker\":\"Interviews\",\"heading\":\"What students told us\",\"stats\":[[\"3\",\"Undergraduate participants\"],[\"2\",\"Tasks: weekly planning, notifications\"],[\"3\",\"Pain points: tracking, alerts, navigation\"]],\"quotes\":[{\"who\":\"Participant 1\",\"meta\":\"4th year \\xb7 6 courses \\xb7 laptop, phone, tablet\",\"quote\":\"Notifications should only fire when something meaningful happens, not every time a due date gets adjusted.\",\"text\":\"Relied on the to-do list but kept cross-checking the dashboard, and once missed an assignment that showed in one view but not the other. Found that mobile has only a global notification toggle, and used the Notes app to fill the gaps.\"},{\"who\":\"Participant 2\",\"meta\":\"4th year \\xb7 4 courses \\xb7 laptop, phone\",\"quote\":\"I thought I'd be able to edit notifications inside each course. When I finally found the settings, you can only change everything at once.\",\"text\":\"Used both the Dashboard and Calendar to piece the week together, since neither was enough alone. Went through each course, then the overflow menu, then global settings, and never found per-course control.\"},{\"who\":\"Participant 3\",\"meta\":\"4th year \\xb7 4 courses \\xb7 mostly laptop\",\"quote\":\"You have to go through a maze to find due dates. A lot of courses are moving away from Canvas for that reason.\",\"text\":\"Went course by course and often left Canvas for Gradescope or course websites. Tracked due dates from memory and had missed assignments. Wanted to filter alerts by type (grades, assignments, announcements) rather than more volume controls.\"}]},{\"kicker\":\"Redesign \\xb7 To-do list\",\"heading\":\"See the week at a glance\",\"body\":[\"The to-do list now opens with a weekly progress bar, shows effort badges (High / Medium) on each assignment card, and puts a reminder bell right on the card.\"],\"media\":[{\"src\":\"https://framerusercontent.com/images/15ma18hdcM3napKUDHRAp7HsYY.gif\",\"alt\":\"Walkthrough of the redesigned to-do list\"}],\"link\":0,\"cards\":[{\"title\":\"Progress you can see\",\"text\":\"Students never knew how much work was left. The progress bar shows weekly completion at a glance.\"},{\"title\":\"One-tap reminders\",\"text\":\"Setting a reminder used to mean opening the assignment. With the bell on the card, it's a single tap without losing your place.\"},{\"title\":\"Help prioritizing\",\"text\":\"Canvas never showed how demanding a task is, but students said effort decides what they do first. The badges make that call faster.\"}]},{\"kicker\":\"Redesign \\xb7 Notifications\",\"heading\":\"Alerts that make sense\",\"body\":['Notifications are grouped by date, and readable course names replace raw section codes (\"COGS 127\" instead of \"COGS127_SP26_A00\"). A master toggle on each course\\'s Manage Alerts page turns all of its notifications on or off in one tap, and \"Reset to Default\" is now a secondary button so it\\'s harder to hit by accident.'],\"media\":[{\"src\":\"https://framerusercontent.com/images/wYycyerYNFvHL4QMbBhW9uvPs.gif\",\"alt\":\"Walkthrough of the redesigned notifications page\"}],\"link\":1,\"cards\":[{\"title\":\"Less overload\",\"text\":\"Students called the unfiltered feed overwhelming. Grouping by date adds structure and makes it easier to scan.\"},{\"title\":\"Controls where students look\",\"text\":\"In testing, participants looked for per-course controls inside each course, so the toggle now lives there.\"},{\"title\":\"Fewer accidental resets\",\"text\":'\"Save Changes\" and \"Reset to Default\" used to look the same, making destructive resets too easy to trigger.'}]},{\"kicker\":\"Validation \\xb7 Round 2\",\"heading\":\"Testing Design A against Design B\",\"stats\":[[\"3\",\"Returning and new participants\"],[\"2\",\"Features tested\"],[\"2\",\"Design variants per feature\"]],\"quotes\":[{\"who\":\"Participant 1\",\"meta\":\"4th year \\xb7 4 courses \\xb7 laptop, phone\",\"quote\":\"The bar is really helpful. I was always guessing how much I had left; seeing a percentage makes it feel more manageable.\",\"text\":\"Preferred Design A's horizontal progress bar and inline reminder bell, but used Design B's day-by-day filter through all seven days. Found long course codes a constant snag, and wanted Design A with B's day filter added.\"},{\"who\":\"Participant 2\",\"meta\":\"4th year \\xb7 6 courses \\xb7 laptop, phone, tablet\",\"quote\":\"When I tap Wednesday it only shows me Wednesday's stuff? Yes, that's exactly what I'd want.\",\"text\":\"Preferred Design B: the day filter cut overwhelm and the circular progress felt more motivating. Wanted a course filter neither design had, and found B's reminder bell harder to spot inside the card.\"},{\"who\":\"Participant 3\",\"meta\":\"4th year \\xb7 4 courses \\xb7 laptop, phone\",\"quote\":\"I like that this design makes saving changes clearer, instead of assuming the back button saves them.\",\"text\":\"Tested notifications only and preferred Design B throughout: grouping by date, timestamps, and checking off alerts once read. Suggested combining the to-do list and notifications to cut the friction between them.\"}]},{\"kicker\":\"Lessons learned\",\"heading\":\"Consistency, readability, control\",\"body\":[\"Canvas works around its users instead of with them, and students have quietly accepted that as normal. This project showed the bar for improvement doesn't have to be high: most of what participants asked for wasn't a new feature, but consistency, readability and control.\",\"When students can trust that assignments appear where they expect, set a reminder without leaving their list, and silence a course in one tap, they stop compensating for the system and start relying on it.\"]}]},\"gfx\":{\"path\":\"/gfx\",\"next\":\"spotify\",\"kind\":\"Showroom\",\"title\":\"Graphic Design\",\"tagline\":\"Apparel graphics, social art and logos\",\"hero\":{\"src\":\"https://framerusercontent.com/images/5x4OyX63TL7UkZ1he6vBXwfxiLY.webp\",\"alt\":\"Two Kobe Bryant apparel graphics\"},\"meta\":[[\"Role\",\"Freelance Graphic Designer\"],[\"Focus\",\"Merch graphics, social media, logos\"],[\"Tools\",\"Photoshop, Illustrator, Lightroom\"]],\"links\":[],\"intro\":[\"A showroom of my freelance graphic design work: graphics made for t-shirts, art for social media, and logos.\",\"Most of the apparel work is sports-inspired: vintage-style tees built from layered photography, bold type and textured grain.\"],\"sections\":[{\"kicker\":\"Apparel\",\"heading\":\"On the shirt\",\"body\":[\"Every graphic in this showroom was made to be printed. Here are a few of them on the tees they were designed for.\"],\"gallery\":[{\"src\":\"https://framerusercontent.com/images/xWfTORIlvKq6IHAGuutKPa3R5o.png?scale-down-to=1200\",\"alt\":\"81 Point Game graphic on a black tee\"},{\"src\":\"https://framerusercontent.com/images/8zyek0Za2DjyL1khNlj0PbTo.png?scale-down-to=1200\",\"alt\":\"Kobe Bryant graphic on a cream tee\"},{\"src\":\"https://framerusercontent.com/images/eHEgpvu5EMSHZcRMCsZ0SW34I.png?scale-down-to=1200\",\"alt\":\"Kobe Bryant Lakers graphic on a black tee\"}],\"galleryLayout\":\"tees\"},{\"kicker\":\"Merch graphics\",\"heading\":\"Print artwork\",\"gallery\":[{\"src\":\"https://framerusercontent.com/images/zW5gfg7HItjgLmCA6PGYsFW16TE.png?scale-down-to=1200\",\"alt\":\"Kobe Bryant 81-point game tribute graphic\"},{\"src\":\"https://framerusercontent.com/images/UfEc3aWcS0ay3uCFHTtln9NqNLM.png?scale-down-to=1200\",\"alt\":\"Kobe Bryant Lakers throwback graphic\"},{\"src\":\"https://framerusercontent.com/images/6lj4EM54ce6QMuDb5ex80t4CAHs.png?scale-down-to=1200\",\"alt\":\"Kobe Bryant dunk graphic\"},{\"src\":\"https://framerusercontent.com/images/ERuKdtMw14tgbx6vfnqSzTdcOEw.png?scale-down-to=1200\",\"alt\":\"Stephen Curry Golden State graphic\"},{\"src\":\"https://framerusercontent.com/images/eGGobiNRgZxFrbnzJSDqZDvBOk.png?scale-down-to=1200\",\"alt\":\"Kobe Bryant 'stone cold killer' graphic\"},{\"src\":\"https://framerusercontent.com/images/xFweQ8N93uuEGwDte4VNBow0Us.png?scale-down-to=1200\",\"alt\":\"Kobe Bryant Lakers number 24 graphic\"},{\"src\":\"https://framerusercontent.com/images/yx05gjYI3z55NXDrfkuy73smQ.png?scale-down-to=1200\",\"alt\":\"Los Angeles Dodgers graphic\"},{\"src\":\"https://framerusercontent.com/images/u3NbZETjXrb72P6AvPVqQ5QBc.png?scale-down-to=1200\",\"alt\":\"Tiger Woods and Charlie Woods graphic\"},{\"src\":\"https://framerusercontent.com/images/8ivEBj6a2tJc4ldQRbHpktx78.png?scale-down-to=1200\",\"alt\":\"Michael Jordan 'The Last Shot' graphic\"}],\"galleryLayout\":\"art\"},{\"kicker\":\"Social media\",\"heading\":\"Banners and posts\",\"gallery\":[{\"src\":\"https://framerusercontent.com/images/AYWTxckySddaAOTmYdJXf1xADMw.png?scale-down-to=1200\",\"alt\":\"GFXJAY social media banner\"}],\"galleryLayout\":\"wide\"},{\"id\":\"logos\",\"kicker\":\"Logos\",\"heading\":\"Logo design\",\"gallery\":[{\"src\":\"https://framerusercontent.com/images/SueAAQRUFsy0Oy9usbUrz1XhGRo.png?scale-down-to=1200\",\"alt\":\"Trolley of the Lost logo\"},{\"src\":\"https://framerusercontent.com/images/Ipc7a3V2ANoznKpR7PpiBJHNxjQ.png?scale-down-to=1200\",\"alt\":\"Leyenda Legal Group logo\"},{\"src\":\"https://framerusercontent.com/images/EG88cUKk8wBYoHexO1QxrTd9H0.png?scale-down-to=1200\",\"alt\":\"JbyG monogram\"},{\"src\":\"https://framerusercontent.com/images/3yMSvc1EUdvwHG8qmh3Tek7ubk.png?scale-down-to=1200\",\"alt\":\"Jewels by Grace wordmark in black\"},{\"src\":\"https://framerusercontent.com/images/NLwmg6emMbvruLrFOhFv75xfJbE.png?scale-down-to=1200\",\"alt\":\"Jewels by Grace wordmark in red\"},{\"src\":\"https://framerusercontent.com/images/gDaPO51sgpllBaWMcsHL9bT2Lw.png?scale-down-to=1200\",\"alt\":\"Jewels by Grace wordmark in gold\"},{\"src\":\"https://framerusercontent.com/images/F0G2ECRZWviKzcJU3EjKFvnZyQ.png?scale-down-to=1200\",\"alt\":\"Canvas logo\"}],\"galleryLayout\":\"logos\"}]},\"leyenda\":{\"path\":\"/leyendalegal\",\"next\":\"gfx\",\"title\":\"Leyenda Legal Group\",\"tagline\":\"A bilingual website built to turn visitors into clients\",\"hero\":{\"src\":\"https://framerusercontent.com/images/7ebeCaLcsimBZS8mNPlHLqIwMPA.webp\",\"alt\":\"Leyenda Legal Group website on a laptop and phone\"},\"meta\":[[\"Role\",\"UX Research, Interaction Design, Brand Strategy\"],[\"Client\",\"Leyenda Legal Group, Los Angeles\"],[\"Team\",\"Nosheen Ullah, Jalen Marcelino, An Truong, Raul Valadez\"],[\"Course\",\"COGS 187B Interaction Design Studio, UC San Diego\"]],\"links\":[[\"Mobile prototype\",\"https://www.figma.com/proto/NZwTEkYVzcryDSwND8AQyz/COGS187B-Team-17-Work?page-id=189%3A130&node-id=307-538&viewport=300%2C280%2C0.32&t=MSbPAoLJoPJ6tRO8-1&scaling=scale-down&content-scaling=fixed&starting-point-node-id=307%3A538\"]],\"intro\":[\"Leyenda Legal Group is a bilingual immigration law firm in the LA area. Many of its clients speak Spanish and are navigating complex legal situations with limited digital experience.\",\"The old website failed the people it was built for: no booking flow, no language toggle, and little reason to stay. We redesigned it from the ground up to build trust, surface the right information fast, and make it easy to take the next step.\"],\"sections\":[{\"kicker\":\"Objectives\",\"heading\":\"What we set out to change\",\"body\":[\"The original site saw almost no engagement beyond people looking up the address: no bookings, no form submissions. We set out to make it an active tool for winning clients, not a digital business card.\"],\"list\":[\"Increase consultation bookings with a clear, easy path to call or schedule\",\"Drive engagement through bilingual support, trust signals and prominent calls to action\",\"Reduce drop-off with navigation that gets people where they need to go within seconds\",\"Earn trust before a client ever picks up the phone\"],\"stats\":[[\"25+\",\"Screens designed, desktop and mobile\"],[\"20+\",\"Usability and structure changes\"],[\"5+\",\"Audience-focused changes, like a bilingual toggle on every page\"]]},{\"kicker\":\"Audiences\",\"heading\":\"Who we designed for\",\"cards\":[{\"n\":\"01\",\"title\":\"Immigrant clients\",\"text\":\"Spanish-dominant, less comfortable with technology, and anxious about sharing personal information online. Heard about Leyenda on 1020 AM radio and has never hired a lawyer. Needs: a bilingual toggle that defaults to Spanish, plain language with no jargon, visible privacy assurance before any form, and a document checklist for each service.\"},{\"n\":\"02\",\"title\":\"Families of immigrants\",\"text\":\"Bilingual and second-generation, managing a parent's immigration case after the family received a legal notice. Short on time and wants credibility fast. Needs: practice areas listed up front, the founder's credentials visible right away, quick booking with clear pricing, and a phone number as a fallback.\"},{\"n\":\"03\",\"title\":\"Non-immigration clients\",\"text\":\"English-dominant and referred by a friend after a car accident. Needs to confirm quickly that the firm handles personal injury before leaving. Needs: non-immigration services clearly featured, strong trust signals and testimonials, a professional look, and booking within one click.\"}]},{\"kicker\":\"Design challenges\",\"heading\":\"Before and after\",\"rows\":[{\"label\":\"Visual hierarchy\",\"title\":\"A human face and a clear path\",\"before\":\"Every element felt equally important, there was no call to action above the fold, and a courthouse photo made the firm look like a criminal-law practice rather than an immigration firm.\",\"text\":'The hero now features the attorney\\'s photo and mission statement to build trust right away, with \"Work with Us\" and \"View All Areas\" above the fold so every visitor has a next step.',\"img\":\"https://framerusercontent.com/images/iCuIFojoun13WaeLbWwlMvnK464.png\"},{\"label\":\"Navigation\",\"title\":\"Resources grouped, with context\",\"before\":\"Three of seven menu items (EOIR, USCIS and Privacy Policy) opened government websites with no explanation, leaving people confused and lost.\",\"text\":'Those links now sit under one \"Resources\" menu, with short pages that explain what each site is and what you can do there before linking out.',\"img\":\"https://framerusercontent.com/images/rOTDFBdfCoYVxoMVEkKkiPYxs.png\"},{\"label\":\"Practice areas\",\"title\":\"A scannable index plus visual cards\",\"before\":\"Twelve practice areas lived in one long, text-heavy list. People who knew what they wanted had to scroll past everything, and people exploring had nothing to catch their eye.\",\"text\":\"A quick index lets people jump straight to an area, and image cards with short descriptions serve those who want to browse. Both work on the same page.\",\"img\":\"https://framerusercontent.com/images/jeT7dpvIOrDfterfAR4mA09Pnw.png\"}]},{\"kicker\":\"The prototypes\",\"heading\":\"Mobile and desktop\",\"media\":[{\"src\":\"https://framerusercontent.com/images/QaZQjF731iWBzLqH4nHOm0cqMeo.gif\",\"alt\":\"Desktop prototype walkthrough\"},{\"src\":\"https://framerusercontent.com/images/mb4Zvt06nVtHGN0lj6YEYxRDXxc.gif\",\"alt\":\"Mobile prototype walkthrough\"}],\"mediaLayout\":\"pair\",\"link\":0},{\"kicker\":\"Lessons learned\",\"heading\":\"Listen more than you design\",\"body\":[\"This was my first project for a real client with real stakes. The biggest shift wasn't in the design itself; it was learning that a good process means listening more than designing.\",\"Jesse's context (who his clients are, where they come from, what worries them when they walk in) shaped nearly every decision about hierarchy, language and tone. A website is only as trustworthy as the understanding behind it.\"]}]}};const esc=s=>String(s??\"\").replace(/[&<>\"]/g,c=>({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\"})[c]);// images without a src render as labeled placeholders until screenshots are added\nSTUDIES.jewels={path:\"/jewelsbygrace\",next:\"spotify\",title:\"Jewels By Grace\",tagline:\"Custom storefront features for a one-of-a-kind jewelry brand\",hero:{src:\"https://framerusercontent.com/images/jPQQbSq0AM6gI6pa8lKfyMjkDg.webp\",alt:\"Design Your Charm Bracelet page on a laptop\"},meta:[[\"Role\",\"UI/UX Design & Development\"],[\"Timeline\",\"March 2025 – Present\"],[\"Platform\",\"Shopify\"],[\"Tools\",\"Figma, Shopify, Liquid, JavaScript, Playwright\"]],links:[[\"Visit jewelsbygrace.com\",\"https://jewelsbygrace.com\"]],intro:[\"Jewels By Grace is a Shopify-based jewelry brand specializing in vintage and one-of-a-kind pieces.\",\"I work on the store’s UI/UX design and front-end development on an ongoing basis, translating business goals into custom, production-ready storefront features that Shopify’s stock theme tools don’t support out of the box.\"],sections:[{kicker:\"The problem\",heading:\"One-of-a-kind pieces, stock tools\",body:[\"Every charm and bracelet in the catalog is one of a kind, each its own product or variant. The standard storefront wasn’t built for that.\"],cards:[{n:\"01\",title:\"No way to picture the finished bracelet\",text:\"Customers couldn’t see how charms would look together on a bracelet before buying. A static product grid doesn’t convey a build-your-own experience.\"},{n:\"02\",title:\"No home for editorial content\",text:\"There was no way to publish blog and editorial content with a template that matched the brand.\"}]},{kicker:\"Process\",heading:\"Design first, then prove it works\",list:[\"UX research and Figma prototyping before writing any code\",\"A custom Liquid section with vanilla JavaScript, refined over multiple rounds of real feedback\",\"Surveyed the real catalog to derive filtering rules instead of guessing\",\"Every feature verified with Playwright browser tests (drag, cart payloads, UI states) before shipping\"]},{kicker:\"Mock drafts\",heading:\"Early drafts of the builder\",body:[\"Mock drafts of the charm bracelet builder, made before the final product: placing charms on the bracelet, and the selections list with a running subtotal.\"],media:[{src:\"https://framerusercontent.com/images/Dvk9aKxNVxJqeYSdIERn2pjjiwc.webp\",alt:\"Draft builder with three charms placed on the bracelet\"},{src:\"https://framerusercontent.com/images/NEMrZsoA9pGzq7bXGjnTM3Ad7Qc.webp\",alt:\"Draft selections list with subtotal and Add Bracelet to Cart\"}],mediaLayout:\"pair\"},{kicker:\"Feature \\xb7 Bracelet builder\",heading:\"Drag-and-drop charm bracelet builder\",body:[\"Customers drag charms onto a photo of the bracelet and preview the result in real time, then add the whole design to their cart in one step.\"],media:[{src:\"https://framerusercontent.com/images/SzB2liDX0fwuZ78kIYMPz1gZgU.webp\",alt:\"Bracelet builder with the charm sticker sheet and filters\"},{src:\"https://framerusercontent.com/images/zjjBVwknUSSCQLva00e0woLifM.webp\",alt:\"Two charms placed on the bracelet, with selections and subtotal\"}],mediaLayout:\"pair\",cards:[{n:\"01\",title:\"Custom drag engine\",text:\"A pointer-based drag engine built from scratch, with a tap-to-place fallback.\"},{n:\"02\",title:\"A filterable “sticker sheet”\",text:\"Search and filter charms by metal, designer, diamond shape, carat weight, motif (tags auto-derived from product tags) and price range, with sorting and pagination.\"},{n:\"03\",title:\"Real-time subtotal\",text:\"The price updates as charms are added to or removed from the bracelet.\"},{n:\"04\",title:\"One order, one click\",text:\"The bracelet and every charm on it go into the cart together as a single order via Shopify’s Cart AJAX API.\"}]},{kicker:\"Feature \\xb7 Blog\",heading:\"A blog that matches the brand\",body:[\"A custom blog section gives the brand a home for editorial content: a custom “Bunny Mellon” blog template, dynamic hub pages for each category, and a central blog index page.\",\"The template wasn’t only for new posts: more than 70 of the brand’s existing blog posts were rebuilt on it, so the whole archive now shares one consistent design.\"],media:[{src:\"https://framerusercontent.com/images/sSlfevMDMnih2RVkGprwL7K4.webp\",alt:\"Our Blog index on jewelsbygrace.com, on mobile\"},{src:\"https://framerusercontent.com/images/hQcpBKzS0JqPdoT5Yu3NkUL8Cbg.webp\",alt:\"Bunny Mellon article template on mobile\"}],mediaLayout:\"pair\"},{kicker:\"Engineering details\",heading:\"Under the hood\",cards:[{title:\"Theme Editor double init\",text:\"Fixed a Theme Editor double-initialization bug that left an animation stuck.\"},{title:\"Dropdown stacking context\",text:\"Fixed a dropdown stacking-context bug caused by a position: sticky ancestor.\"},{title:\"Cleaner dragging\",text:\"Removed text selection highlighting during drag.\"}]},{kicker:\"Outcome\",heading:\"Live on the store\",body:[\"Both features are live on jewelsbygrace.com. Customers can design a bracelet from one-of-a-kind charms and check out in a single order, and the new blog template carries the brand’s editorial archive, including more than 70 existing posts rebuilt on it.\"],stats:[[\"70+\",\"Existing blog posts rebuilt on the new template\"],[\"1\",\"Order for the bracelet and every charm on it\"],[\"Mar 2025\",\"Ongoing design and development since\"]]}]};// empty image slot: a labeled frame until the real screenshot is added\nconst ph=m=>`<figure class=\"frame ph${m.tall?\" tall\":\"\"}\"><span class=\"mono\">Image placeholder &middot; ${esc(m.alt)}</span></figure>`;const ext=url=>`href=\"${esc(url)}\" target=\"_blank\" rel=\"noopener\"`;function render(id,backHref=\"/\",pathFor=s=>s.path,override){const s=override||STUDIES[id];if(!s)return\"\";const nxt=STUDIES[s.next];const sec=(x,i)=>{const parts=[];if(x.body)parts.push(`<div class=\"body\">${x.body.map(p=>`<p>${esc(p)}</p>`).join(\"\")}</div>`);if(x.list)parts.push(`<ul class=\"list\">${x.list.map(l=>`<li>${esc(l)}</li>`).join(\"\")}</ul>`);if(x.stats)parts.push(`<div class=\"stats\">${x.stats.map(([v,l])=>`<div class=\"stat\"><b>${esc(v)}</b><span>${esc(l)}</span></div>`).join(\"\")}</div>`);if(x.gallery&&x.gallery.length)parts.push(`<div class=\"gal ${x.galleryLayout||\"\"}\"${x.cols?` style=\"--cols:${+x.cols}\"`:\"\"}>${x.gallery.map(m=>{const cap=[m.title,m.tag,m.year].filter(Boolean);const fig=`<figure class=\"frame\"><img src=\"${esc(m.src)}\" alt=\"${esc(m.alt||m.title||\"\")}\" loading=\"lazy\" /></figure>`;const inner=fig+(cap.length&&x.captions!==false?`<figcaption class=\"mono cap\"><b>${esc(cap[0])}</b>${cap.slice(1).map(c=>` &middot; ${esc(c)}`).join(\"\")}</figcaption>`:\"\");return m.link?`<a class=\"piece\" href=\"${esc(m.link)}\">${inner}</a>`:`<div class=\"piece\">${inner}</div>`;}).join(\"\")}</div>`);if(x.media)parts.push(`<div class=\"media ${x.mediaLayout||\"\"}\">${x.media.map(m=>m.src?`<figure class=\"frame\"><img src=\"${esc(m.src)}\" alt=\"${esc(m.alt)}\" loading=\"lazy\" /></figure>`:ph(m)).join(\"\")}</div>`);if(x.link!==undefined&&s.links[x.link])parts.push(`<div><a class=\"cs-btn mono\" ${ext(s.links[x.link][1])}>${esc(s.links[x.link][0])} <span aria-hidden=\"true\">&#8599;</span></a></div>`);if(x.cards)parts.push(`<div class=\"cards\">${x.cards.map(c=>`<div class=\"card\">${c.n?`<span class=\"mono n\">${esc(c.n)}</span>`:\"\"}<h3>${esc(c.title)}</h3><p>${esc(c.text)}</p></div>`).join(\"\")}</div>`);if(x.compare)parts.push(`<div class=\"cmp\">${x.compare.map(c=>`<div class=\"card\"><img src=\"${esc(c.img)}\" alt=\"\" loading=\"lazy\" /><h3>${esc(c.name)}</h3><dl><dt class=\"mono\">Strengths</dt><dd>${esc(c.good)}</dd><dt class=\"mono\">Weaknesses</dt><dd>${esc(c.bad)}</dd><dt class=\"mono\">What we took</dt><dd>${esc(c.take)}</dd></dl></div>`).join(\"\")}</div>`);if(x.rows)parts.push(`<div class=\"rows\">${x.rows.map(r=>`<div class=\"row\"><figure class=\"frame\"><img src=\"${esc(r.img)}\" alt=\"${esc(r.title)}\" loading=\"lazy\" /></figure><div><span class=\"mono k\"><span class=\"dot\">&#9679;</span> ${esc(r.label)}</span><h3>${esc(r.title)}</h3>${r.before?`<div class=\"before\"><b>Before</b><p>${esc(r.before)}</p></div><div class=\"after\"><b>After</b><p>${esc(r.text)}</p></div>`:`<p>${esc(r.text)}</p>`}${r.stats?`<div class=\"mini\">${r.stats.map(([v,l])=>`<div><b>${esc(v)}</b><span>${esc(l)}</span></div>`).join(\"\")}</div>`:\"\"}</div></div>`).join(\"\")}</div>`);if(x.quotes)parts.push(`<div class=\"quotes\">${x.quotes.map(q=>`<blockquote><q>${esc(q.quote)}</q><div class=\"mono who\">${esc(q.who)} &middot; ${esc(q.meta)}</div><p>${esc(q.text)}</p></blockquote>`).join(\"\")}</div>`);return`<section class=\"cs-sec\"${x.id?` id=\"${esc(x.id)}\"`:\"\"}><div class=\"cs-sec-l\"><div><span class=\"mono k\"><span class=\"dot\">&#9679;</span> ${String(i+1).padStart(2,\"0\")} &middot; ${esc(x.kicker)}</span><h2>${esc(x.heading)}</h2></div></div><div class=\"cs-sec-r\">${parts.join(\"\")}</div></section>`;};return`<div class=\"cs-in\">\n  <div class=\"cs-top\"><a class=\"cs-back mono\" href=\"${esc(backHref)}\"><span aria-hidden=\"true\">&larr;</span> Back home</a><span class=\"mono cs-name\">Jalen Marcelino</span></div>\n  <header class=\"cs-head\">\n    <div class=\"cs-head-l\">\n      <span class=\"mono k\"><span class=\"dot\">&#9679;</span> ${esc(s.kind||\"Case study\")}</span>\n      <h1>${esc(s.title)}</h1>\n      <p class=\"cs-tag\">${esc(s.tagline)}</p>\n      <dl>${s.meta.map(([k,v])=>`<dt class=\"mono\">${esc(k)}</dt><dd>${esc(v)}</dd>`).join(\"\")}</dl>\n      ${s.links.length?`<div class=\"cs-links\">${s.links.map(([l,u])=>`<a class=\"cs-btn mono\" ${ext(u)}>${esc(l)} <span aria-hidden=\"true\">&#8599;</span></a>`).join(\"\")}</div>`:\"\"}\n    </div>\n    <div class=\"cs-head-r\">${s.intro.map((p,i)=>`<p${i?\"\":' class=\"cs-lead\"'}>${esc(p)}</p>`).join(\"\")}</div>\n  </header>\n  <div class=\"cs-hero\">${s.hero.src?`<img src=\"${esc(s.hero.src)}\" alt=\"${esc(s.hero.alt)}\" />`:ph(s.hero)}</div>\n  ${s.sections.map(sec).join(\"\\n  \")}\n  ${nxt?`<a class=\"cs-next\" href=\"${esc(pathFor(nxt))}\"><span class=\"mono k\">Next project</span><span class=\"t\">${esc(nxt.title)} <span aria-hidden=\"true\">&rarr;</span></span></a>`:\"\"}\n  <div class=\"cs-foot mono\"><a href=\"${esc(backHref)}\">&larr; Back home</a><span>&copy; Jalen Marcelino</span></div>\n</div>`;}/**\n * @framerIntrinsicWidth 1200\n * @framerIntrinsicHeight 4000\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight auto\n */// the Graphic Design showroom can be edited from the properties panel\nconst toPiece=p=>({src:p.image&&p.image.src||\"\",alt:p.image&&p.image.alt||p.title||\"\",title:p.title||\"\",tag:p.tag||\"\",year:p.year||\"\",link:p.link||\"\"});const GFX=STUDIES.gfx;const GFX_SECTIONS=GFX.sections.map(x=>({kicker:x.kicker,heading:x.heading,text:(x.body||[]).join(\"\\n\\n\"),layout:x.galleryLayout,pieces:x.gallery.map(m=>({image:{src:m.src,alt:m.alt},title:\"\",tag:\"\",year:\"\",link:\"\"}))}));function gfxFromProps(p){const secs=(p.gfxSections&&p.gfxSections.length?p.gfxSections:GFX_SECTIONS).map((x,i)=>({id:/logo/i.test(x.heading||x.kicker||\"\")?\"logos\":undefined,kicker:x.kicker||\"\",heading:x.heading||\"\",body:String(x.text||\"\").split(/\\n\\s*\\n/).map(t=>t.trim()).filter(Boolean),gallery:(x.pieces||[]).map(toPiece).filter(m=>m.src),galleryLayout:x.layout||\"art\",cols:x.columns||undefined,captions:p.gfxCaptions!==false}));return{...GFX,title:p.gfxTitle||GFX.title,tagline:p.gfxTagline??GFX.tagline,hero:p.gfxHero&&p.gfxHero.src?{src:p.gfxHero.src,alt:p.gfxHero.alt||\"Graphic design work\"}:GFX.hero,meta:String(p.gfxDetails||GFX.meta.map(([k,v])=>k+\": \"+v).join(\"\\n\")).split(\"\\n\").map(l=>l.split(\":\")).filter(a=>a.length>1&&a[0].trim()).map(([k,...v])=>[k.trim(),v.join(\":\").trim()]),intro:String(p.gfxIntro||GFX.intro.join(\"\\n\\n\")).split(/\\n\\s*\\n/).map(t=>t.trim()).filter(Boolean),sections:secs};}export default function CaseStudy(props){const{study=\"spotify\",backHref=\"/\",style}=props;const override=study===\"gfx\"?gfxFromProps(props):undefined;const mcols=props.gfxMobileColumns||2;return /*#__PURE__*/_jsxs(\"main\",{className:\"cs\",style:{...style,width:\"100%\",\"--mcols\":mcols},children:[/*#__PURE__*/_jsx(\"link\",{href:\"https://fonts.googleapis.com/css2?family=Geist:wght@400;600&family=Geist+Mono&display=swap\",rel:\"stylesheet\"}),/*#__PURE__*/_jsx(\"style\",{children:CSS}),/*#__PURE__*/_jsx(\"div\",{dangerouslySetInnerHTML:{__html:render(study,backHref||\"/\",undefined,override)}})]});}addPropertyControls(CaseStudy,{study:{type:ControlType.Enum,title:\"Study\",options:[\"spotify\",\"canvas\",\"leyenda\",\"gfx\",\"jewels\"],optionTitles:[\"Spotify Redesign\",\"Canvas Redesign\",\"Leyenda Legal Group\",\"Graphic Design\",\"Jewels By Grace\"],defaultValue:\"spotify\"},backHref:{type:ControlType.String,title:\"Back Link\",defaultValue:\"/\",description:'Where \"Back home\" goes'},gfxTitle:{type:ControlType.String,title:\"Title\",defaultValue:GFX.title,hidden:p=>p.study!==\"gfx\"},gfxTagline:{type:ControlType.String,title:\"Tagline\",defaultValue:GFX.tagline,hidden:p=>p.study!==\"gfx\"},gfxIntro:{type:ControlType.String,title:\"Intro\",displayTextArea:true,defaultValue:GFX.intro.join(\"\\n\\n\"),description:\"Blank line between paragraphs\",hidden:p=>p.study!==\"gfx\"},gfxDetails:{type:ControlType.String,title:\"Details\",displayTextArea:true,defaultValue:GFX.meta.map(([k,v])=>k+\": \"+v).join(\"\\n\"),description:\"One per line, as Label: value\",hidden:p=>p.study!==\"gfx\"},gfxHero:{type:ControlType.ResponsiveImage,title:\"Hero Image\",hidden:p=>p.study!==\"gfx\"},gfxCaptions:{type:ControlType.Boolean,title:\"Captions\",defaultValue:true,enabledTitle:\"Show\",disabledTitle:\"Hide\",hidden:p=>p.study!==\"gfx\"},gfxMobileColumns:{type:ControlType.Number,title:\"Phone Columns\",defaultValue:2,min:1,max:3,step:1,displayStepper:true,hidden:p=>p.study!==\"gfx\"},gfxSections:{type:ControlType.Array,title:\"Sections\",defaultValue:GFX_SECTIONS,hidden:p=>p.study!==\"gfx\",control:{type:ControlType.Object,controls:{kicker:{type:ControlType.String,title:\"Label\",defaultValue:\"New section\"},heading:{type:ControlType.String,title:\"Heading\",defaultValue:\"New section\"},text:{type:ControlType.String,title:\"Text\",displayTextArea:true,defaultValue:\"\"},layout:{type:ControlType.Enum,title:\"Layout\",options:[\"art\",\"tees\",\"logos\",\"wide\"],optionTitles:[\"Masonry\",\"Grid\",\"Logo tiles\",\"Full width\"],defaultValue:\"art\"},columns:{type:ControlType.Number,title:\"Columns\",defaultValue:3,min:1,max:5,step:1,displayStepper:true},pieces:{type:ControlType.Array,title:\"Pieces\",control:{type:ControlType.Object,controls:{image:{type:ControlType.ResponsiveImage,title:\"Image\"},title:{type:ControlType.String,title:\"Title\",defaultValue:\"\",placeholder:\"Optional caption\"},tag:{type:ControlType.String,title:\"Tag\",defaultValue:\"\",placeholder:\"e.g. T-shirt, Instagram\"},year:{type:ControlType.String,title:\"Year\",defaultValue:\"\",placeholder:\"e.g. 2024\"},link:{type:ControlType.Link,title:\"Link\"}}}}}}}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"CaseStudy\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./CaseStudy.map"],"mappings":"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"}