A place to cache linked articles (think custom and personal wayback machine)
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

index.html 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang="fr">
  4. <!-- Has to be within the first 1024 bytes, hence before the <title>
  5. See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
  6. <meta charset="utf-8">
  7. <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
  8. <!-- The viewport meta is quite crowded and we are responsible for that.
  9. See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
  10. <meta name="viewport" content="width=device-width,initial-scale=1">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>Redesign: Wants and Needs (archive) — David Larlet</title>
  13. <meta name="description" content="Publication mise en cache pour en conserver une trace.">
  14. <!-- That good ol' feed, subscribe :). -->
  15. <link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
  16. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  17. <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
  18. <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
  19. <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
  20. <link rel="manifest" href="/static/david/icons2/site.webmanifest">
  21. <link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
  22. <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
  23. <meta name="msapplication-TileColor" content="#f0f0ea">
  24. <meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
  25. <meta name="theme-color" content="#f0f0ea">
  26. <!-- Documented, feel free to shoot an email. -->
  27. <link rel="stylesheet" href="/static/david/css/style_2020-06-19.css">
  28. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  29. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  30. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  31. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  32. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  33. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  34. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  35. <script type="text/javascript">
  36. function toggleTheme(themeName) {
  37. document.documentElement.classList.toggle(
  38. 'forced-dark',
  39. themeName === 'dark'
  40. )
  41. document.documentElement.classList.toggle(
  42. 'forced-light',
  43. themeName === 'light'
  44. )
  45. }
  46. const selectedTheme = localStorage.getItem('theme')
  47. if (selectedTheme !== 'undefined') {
  48. toggleTheme(selectedTheme)
  49. }
  50. </script>
  51. <meta name="robots" content="noindex, nofollow">
  52. <meta content="origin-when-cross-origin" name="referrer">
  53. <!-- Canonical URL for SEO purposes -->
  54. <link rel="canonical" href="https://frankchimero.com/blog/2020/wants-and-needs/">
  55. <body class="remarkdown h1-underline h2-underline h3-underline hr-center ul-star pre-tick">
  56. <article>
  57. <header>
  58. <h1>Redesign: Wants and Needs</h1>
  59. </header>
  60. <nav>
  61. <p class="center">
  62. <a href="/david/" title="Aller à l’accueil">🏠</a> •
  63. <a href="https://frankchimero.com/blog/2020/wants-and-needs/" title="Lien vers le contenu original">Source originale</a>
  64. </p>
  65. </nav>
  66. <hr>
  67. <main>
  68. <p>Let’s oversimplify for a bit to help get down some goals for the site redesign.</p>
  69. <h3 id="the-website-spectrum">The website spectrum</h3>
  70. <p>Websites sit on a design spectrum. On one end are applications, with their conditional logic, states, and flows—they’re software. The design challenge here is to create designs that support everything the product could contain and become. Google Maps in the browser is probably the most purely appy application I can imagine, but any design system supporting variable content and conditional states is going to be pretty appy and have exponential complexity.</p>
  71. <p>Large systems, unknowableness, and unseeableness come together in the same carriage. When this joins up with a designer’s natural desire for control and comprehensiveness, it creates fertile ground for unwarranted impostor syndrome—playing the right game by the wrong rules. (If this line of thinking is interesting to you, give Robin Rendle’s <a href="https://www.robinrendle.com/essays/systems-mistakes-and-the-sea">Systems, Mistakes, and the Sea</a> a read.) More on this in a bit.</p>
  72. <p>On the other end of the design spectrum are documents; sweet, modest documents with their pleasing knowableness and clear edges. They only need to achieve readability with hierarchy and layout—they’re writing and records. The design challenge is to make it look like what it is, because the content is all there in front of you. If you’re looking for a purely documenty document website, I’d nominate blog-based personal websites as the platonic example.</p>
  73. <h3 id="hiding-in-docs">Hiding in docs</h3>
  74. <p>I love personal sites because you can get your head around what you’re doing. Their design challenges are primarily typographic—what are the typefaces, how do we use them to express hierarchy, how is the text block set to support reading, where do those text blocks go on the page, and how does that layout change across viewports? These challenges exist in the design of apps, but the approach is haunted by hidden complexity. When designing a document, you can check and see how your choices hold up. It’s 1:1, without much need to project decisions out into the fog of complexity.</p>
  75. <p>I’ve redesigned my site a lot in the last decade. A <em>lot</em>. Too much and too frequently, most certainly. The stated reason was to practice using new methods (trying CSS grid, taking a new typeface for a spin, and so on). But that isn’t the full story. Too often, I’d redesign because I needed to feel capable at my job, which required a design challenge that wouldn’t drive me nuts. The simplicity of redesigning my personal site became a way to hide from the crazy-making and humbling (humiliating?) complexity of systems design. The redesigns were a happy little bubble of sensibility and control, a way to practice and use technology at work without feeling trapped.</p>
  76. <p>For better or worse, I am a document lover. All of my best intentions to try new digital tools eventually devolve to their most stable ur-forms of text files and spreadsheets. I think back to what hooked me on the web in 1996—our expectations are so often defined by our first loves. The primitive parts of me will always want websites to be editable documents with legible, marked up text on servers. I began making websites when mastery seemed so possible that people called themselves “webmasters.” Those expectations are laughable now.</p>
  77. <p>This is the context where I fell in love with design and the web. It is a love story, but it is also a ghost story.</p>
  78. <h3 id="carving-out-a-space">Carving out a space</h3>
  79. <p>Still, personal websites are personal before they are anything else. You can carve out a space in whatever shape you’d like, even one of a ghost. I anticipate this personal site redesign to follow a path back to basics. Here is where I’d like to end up:</p>
  80. <ul>
  81. <li><strong>Good fit</strong>: Make it look like what it is—a place to write and keep records. A collection of documents. Website as filing cabinet.</li>
  82. <li><strong>Modest elegance</strong>: Think elevated defaultness. Premium vanilla ice cream, top shelf ingredients used modestly and well. Tight focus on typography for better reading and suggestion of craft and quality. No tacky razzle-dazzle.</li>
  83. <li><strong>Feeling of lightness</strong>: Simple design, clear patterns, shallow hierarchy. As little javascript as possible, preferably none. Clear markup, no junk. The inside of the site looks like the outside.</li>
  84. <li><strong>Whim</strong>: Achieve all of the above without being austere or over-serious. Have some fun. Smile a bit. No black turtleneck design.</li>
  85. </ul>
  86. </main>
  87. </article>
  88. <hr>
  89. <footer>
  90. <p>
  91. <a href="/david/" title="Aller à l’accueil">🏠</a> •
  92. <a href="/david/log/" title="Accès au flux RSS">🤖</a> •
  93. <a href="http://larlet.com" title="Go to my English profile" data-instant>🇨🇦</a> •
  94. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">📮</a> •
  95. <abbr title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">🧚</abbr>
  96. </p>
  97. <template id="theme-selector">
  98. <form>
  99. <fieldset>
  100. <legend>Thème</legend>
  101. <label>
  102. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  103. </label>
  104. <label>
  105. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  106. </label>
  107. <label>
  108. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  109. </label>
  110. </fieldset>
  111. </form>
  112. </template>
  113. </footer>
  114. <script type="text/javascript">
  115. function loadThemeForm(templateName) {
  116. const themeSelectorTemplate = document.querySelector(templateName)
  117. const form = themeSelectorTemplate.content.firstElementChild
  118. themeSelectorTemplate.replaceWith(form)
  119. form.addEventListener('change', (e) => {
  120. const chosenColorScheme = e.target.value
  121. localStorage.setItem('theme', chosenColorScheme)
  122. toggleTheme(chosenColorScheme)
  123. })
  124. const selectedTheme = localStorage.getItem('theme')
  125. if (selectedTheme && selectedTheme !== 'undefined') {
  126. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  127. }
  128. }
  129. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  130. window.addEventListener('load', () => {
  131. let hasDarkRules = false
  132. for (const styleSheet of Array.from(document.styleSheets)) {
  133. let mediaRules = []
  134. for (const cssRule of styleSheet.cssRules) {
  135. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  136. continue
  137. }
  138. // WARNING: Safari does not have/supports `conditionText`.
  139. if (cssRule.conditionText) {
  140. if (cssRule.conditionText !== prefersColorSchemeDark) {
  141. continue
  142. }
  143. } else {
  144. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  145. continue
  146. }
  147. }
  148. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  149. }
  150. // WARNING: do not try to insert a Rule to a styleSheet you are
  151. // currently iterating on, otherwise the browser will be stuck
  152. // in a infinite loop…
  153. for (const mediaRule of mediaRules) {
  154. styleSheet.insertRule(mediaRule.cssText)
  155. hasDarkRules = true
  156. }
  157. }
  158. if (hasDarkRules) {
  159. loadThemeForm('#theme-selector')
  160. }
  161. })
  162. </script>
  163. </body>
  164. </html>