{"items":[{"type":["h-entry"],"properties":{"like-of":["https://sweetfont.com"],"published":["2026-02-06T10:41:19.489Z"],"mp-slug":["10-41-19"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2026/02/06/10-41-19"]},"references":{"https://sweetfont.com":{"type":["h-entry"],"properties":{"url":["https://sweetfont.com"],"name":["Sweetfont \u0014 The sweetest way to find Google Fonts"],"summary":["Explore Google Fonts by personality, vibe, and style using interactive controls. Find your perfect typeface."],"featured":["https://sweetfont.com/og-image.png"],"content":[{"html":"<div class=\"pads-row\"> <div class=\"xy-pad-group\"> <div class=\"xy-pad-wrap\" id=\"pad-personality\"> <p class=\"xy-pad-labels\"> <span class=\"label-left\">Playful</span> <span class=\"label-right\">Formal</span> <span class=\"label-top\">Warm</span> <span class=\"label-bottom\">Futuristic</span> </p> </div> <p class=\"pad-title\">Flavor</p> </div> <div class=\"xy-pad-group\"> <div class=\"xy-pad-wrap\" id=\"pad-presence\"> <p class=\"xy-pad-labels\"> <span class=\"label-left\">Elegant</span> <span class=\"label-right\">Rugged</span> <span class=\"label-top\">Loud</span> <span class=\"label-bottom\">Quiet</span> </p> </div> <p class=\"pad-title\">Vibe</p> </div> </div>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://youtu.be/s8UXyOL7-N4"],"published":["2026-01-23T15:05:42.746Z"],"mp-slug":["03-05-42"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2026/01/23/03-05-42"]},"references":{"https://youtu.be/s8UXyOL7-N4":{"type":["h-entry"],"properties":{"url":["https://youtu.be/s8UXyOL7-N4"],"name":["- YouTube"],"content":[{"html":"<div></div>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://mastodon.social/@kethinov/115340787570739774"],"published":["2025-10-09T06:15:47.170Z"],"mp-slug":["06-15-47"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/10/09/06-15-47"]},"references":{"https://mastodon.social/@kethinov/115340787570739774":{"type":["h-entry"],"properties":{"url":["https://mastodon.social/@kethinov/115340787570739774"],"name":["Eric Newport (@kethinov@mastodon.social)"],"summary":["Attached: 1 image @slightlyoff@toot.cafe"],"featured":["https://files.mastodon.social/media_attachments/files/115/340/787/223/203/040/original/34c87d3457c06721.png"],"content":[{"html":"<body class=\"app-body theme-system custom-scrollbars no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://www.yankodesign.com/2025/10/01/the-tiny-workshop-that-conquered-britain-how-an-engineers-space-saving-genius-won-shed-of-the-year/?utm_source=rss&utm_medium=rss&utm_campaign=the-tiny-workshop-that-conquered-britain-how-an-engineers-space-saving-genius-won-shed-of-the-year"],"published":["2025-10-02T12:58:27.372Z"],"mp-slug":["12-58-27"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/10/02/12-58-27"]},"references":{"https://www.yankodesign.com/2025/10/01/the-tiny-workshop-that-conquered-britain-how-an-engineers-space-saving-genius-won-shed-of-the-year/?utm_source=rss&utm_medium=rss&utm_campaign=the-tiny-workshop-that-conquered-britain-how-an-engineers-space-saving-genius-won-shed-of-the-year":{"type":["h-entry"],"properties":{"url":["https://www.yankodesign.com/2025/10/01/the-tiny-workshop-that-conquered-britain-how-an-engineers-space-saving-genius-won-shed-of-the-year/?utm_source=rss&utm_medium=rss&utm_campaign=the-tiny-workshop-that-conquered-britain-how-an-engineers-space-saving-genius-won-shed-of-the-year"],"name":["The Tiny Workshop That Conquered Britain: How An Engineer\u0019s Space-Saving Genius Won Shed Of The Year"],"summary":["In a world where garden space comes at a premium, Mike Robinson proved that size doesn't matter when innovation takes center stage. The Plumstead engineer's creation, aptly named \"The Tiny Workshop,\"&hellip;"],"featured":["https://www.yankodesign.com/images/design_news/2025/09/tiny-workshop/tiny_workshop_yanko_design_01.jpg"],"content":[{"html":"<p class=\"site-content\"> <main id=\"content\" class=\"clearfix animated\"> <article id=\"post-580410\" class=\"post-580410 post type-post status-publish format-standard has-post-thumbnail hentry category-architecture tag-shed tag-tiny\"> <header class=\"wrapper entry-header page-header\"> </header> <div class=\"wrapper\"> <div class=\"grids\"> <div class=\"grid-8 column-1\"> <div class=\"single-box clearfix entry-content\"> <input class=\"jpibfi\" type=\"hidden\"><p><img class=\"alignnone size-full wp-image-580412\" src=\"https://www.yankodesign.com/images/design_news/2025/09/tiny-workshop/tiny_workshop_yanko_design_01.jpg\" alt width=\"1280\"></p>\n<p>In a world where garden space comes at a premium, Mike Robinson proved that size doesn&#x2019;t matter when innovation takes center stage. The Plumstead engineer&#x2019;s creation, aptly named &#x201C;The Tiny Workshop,&#x201D; has just claimed the coveted Cuprinol Shed of the Year 2025 title, demonstrating that brilliant design can triumph over grand scale.</p>\n<p>Robinson&#x2019;s journey began with a familiar problem: his compact courtyard garden needed storage and workspace, but conventional shed solutions would overwhelm the limited area. &#x201C;We needed a good bit of storage for the garden necessities,&#x201D; Robinson explained. &#x201C;Off-the-shelf options would have taken up too much room, so I went with a DIY design and build.&#x201D;</p>\n<p>Designer: Mike Robinson</p>\n<p><img class=\"lazyload alignnone size-full wp-image-580413\" src=\"https://www.yankodesign.com/images/design_news/2025/09/tiny-workshop/tiny_workshop_yanko_design_02.jpg\" alt width=\"1280\">\n</p>\n<p><img class=\"lazyload alignnone size-full wp-image-580414\" src=\"https://www.yankodesign.com/images/design_news/2025/09/tiny-workshop/tiny_workshop_yanko_design_03.jpg\" alt width=\"1280\"></p>\n<p>The solution he crafted over several weekends defies traditional shed expectations. Starting with two sets of heavy-duty steel shelving, Robinson bolted them together and clad the structure in wood painted with black ash outdoor paint. What emerged was a marvel of compact engineering that judges described as &#x201C;ingenious&#x201D; and &#x201C;like nothing we&#x2019;ve seen before in competition history.&#x201D;</p>\n<p>The Tiny Workshop&#x2019;s genius lies in its multifunctional design. Two ingenious flaps transform the unit&#x2019;s usability\u0014one drops down to create a work floor, while another flips up to provide weather protection. Inside, Robinson has maximized every inch with carefully planned drawers, shelves, and hooks that keep tools organized and accessible. Even the brackets holding old spanner handles were custom-designed using a 3D printer, providing both function and visual clues to the contents within.</p>\n<p><img class=\"lazyload alignnone size-full wp-image-580415\" src=\"https://www.yankodesign.com/images/design_news/2025/09/tiny-workshop/tiny_workshop_yanko_design_04.jpg\" alt width=\"1280\">\n</p>\n<p><img class=\"lazyload alignnone size-full wp-image-580416\" src=\"https://www.yankodesign.com/images/design_news/2025/09/tiny-workshop/tiny_workshop_yanko_design_05.jpg\" alt width=\"1280\"></p>\n<p>Perhaps most impressively, the structure features a living green roof that stores garden tools while creating habitat for wildlife. &#x201C;The green roof will come into its own in the next year or so,&#x201D; Robinson noted, &#x201C;and I&#x2019;m looking forward to seeing it come to life\u0014the shed really is the gift that keeps on giving.&#x201D;The workshop serves as a triple-duty toolshed, creative workspace, and storage solution for everything from garden necessities to children&#x2019;s games.</p>\n<p>Robinson describes it as &#x201C;a creative space where I can tinker and mend,&#x201D; embodying the traditional shed&#x2019;s role while pushing boundaries of what&#x2019;s possible in minimal space. Head judge Andrew Wilcox praised the design&#x2019;s return to practical roots: &#x201C;Traditionally, sheds have just been seen as somewhere to store your tools, or perhaps somewhere to potter and play\u0014The Tiny Workshop takes this seemingly basic concept and turns it into something so inspired but also still very practical.&#x201D; The &#xFFFD;1,000 prize recognizes more than clever carpentry; it celebrates the democratization of good design. In an era of increasing housing density and shrinking gardens, Robinson&#x2019;s creation offers hope that thoughtful planning can maximize utility without sacrificing aesthetics or function.</p>\n<p><img class=\"lazyload alignnone size-full wp-image-580417\" src=\"https://www.yankodesign.com/images/design_news/2025/09/tiny-workshop/tiny_workshop_yanko_design_06.jpg\" alt width=\"1280\"></p> </div> <section class=\"wrapper home-section featured-posts single-related-posts entries\"> <article class=\"grid-4 post-577790 post type-post status-publish format-standard has-post-thumbnail hentry category-accessories category-deals category-featured category-gadgets category-productdesign tag-foldable tag-mechanical-keyboard tag-shop tag-touchscreen\"> <figure class=\"entry-image\"> <a href=\"https://www.yankodesign.com/2025/09/23/welder-foldable-keyboard-blends-tactile-typing-with-touchscreen-magic/\"> <input class=\"jpibfi\" type=\"hidden\"><img width=\"690\" src=\"https://www.yankodesign.com/images/design_news/2025/09/welder-foldable-keyboard-blends-tactile-typing-with-touchscreen-magic/Welder_Folding_Mechanical_Keyboard_With_Smart_Touch_Screen_hero-690x518.jpg\" class=\"lazyload nopin wp-post-image\" alt> </a> </figure> </article> <article class=\"grid-4 post-575218 post type-post status-publish format-standard has-post-thumbnail hentry category-accessories category-deals category-featured category-productdesign tag-shop tag-tape-measure tag-titanium tag-tools\"> <figure class=\"entry-image\"> <a href=\"https://www.yankodesign.com/2025/09/03/discover-the-revolutionary-titanium-tape-measure-that-measures-up-to-anything/\"> <input class=\"jpibfi\" type=\"hidden\"><img width=\"690\" src=\"https://www.yankodesign.com/images/design_news/2025/08/discover-the-revolutionary-titanium-tape-measure-that-measures-up-to-anything/Revolutionary_Titanium_Tape_Measure_Redefining_Measurement_14-690x518.jpg\" class=\"lazyload nopin wp-post-image\" alt> </a> </figure> </article> <article class=\"grid-4 post-414268 post type-post status-publish format-standard has-post-thumbnail hentry category-architecture category-productdesign tag-christmas tag-interior-designs tag-tree\"> <figure class=\"entry-image\"> <a href=\"https://www.yankodesign.com/2022/12/24/30-unique-christmas-trees-for-the-holiday-season/\"> <input class=\"jpibfi\" type=\"hidden\"><img width=\"510\" src=\"https://www.yankodesign.com/images/design_news/2022/12/15-red-white-and-green-accent-pieces-that-evoke-the-christmas-charm/Christmas_red_white_green_8-510x314.jpg\" class=\"lazyload nopin wp-post-image\" alt> </a> </figure> </article> <article class=\"grid-4 post-556156 post type-post status-publish format-standard has-post-thumbnail hentry category-architecture tag-architecture-concept tag-architecture-design\"> <figure class=\"entry-image\"> <a href=\"https://www.yankodesign.com/2025/06/02/pininfarinas-atto-design-translates-automotive-fluidity-into-coastal-architecture/\"> <input class=\"jpibfi\" type=\"hidden\"><img width=\"510\" src=\"https://www.yankodesign.com/images/design_news/2025/06/pininfarinas-atto-design-translates-automotive-fluidity-into-coastal-architecture/Pininfarina_Rio_Fachada_A_E02-510x314.jpg\" class=\"lazyload nopin wp-post-image\" alt> </a> </figure> </article> <article class=\"grid-4 post-101644 post type-post status-publish format-standard has-post-thumbnail hentry category-architecture tag-architecture\"> <figure class=\"entry-image\"> <a href=\"https://www.yankodesign.com/2014/04/04/hong-kong-high-rise/\"> <input class=\"jpibfi\" type=\"hidden\"><img width=\"510\" src=\"https://www.yankodesign.com/images/design_news/2014/04/03/plexus_01-510x314.jpg\" class=\"lazyload nopin wp-post-image\" alt> </a> </figure> </article> <article class=\"grid-4 post-542448 post type-post status-publish format-standard has-post-thumbnail hentry category-architecture tag-glamping\"> <figure class=\"entry-image\"> <a href=\"https://www.yankodesign.com/2025/03/28/mirrored-glamping-tiny-retreat-offers-millionaire-style-minimalism-without-the-price-tag/\"> <input class=\"jpibfi\" type=\"hidden\"><img width=\"510\" src=\"https://www.yankodesign.com/images/design_news/2025/03/mirror-home/mirror_home_yanko_design_01-510x314.jpg\" class=\"lazyload nopin wp-post-image\" alt> </a> </figure> </article> </section> </div> </div> </div> </article> </main> </p>"}],"author":[{"type":["h-card"],"properties":{"url":"https://www.yankodesign.com/2025/10/01/the-tiny-workshop-that-conquered-britain-how-an-engineers-space-saving-genius-won-shed-of-the-year/?utm_source=rss&utm_medium=rss&utm_campaign=the-tiny-workshop-that-conquered-britain-how-an-engineers-space-saving-genius-won-shed-of-the-year","name":"Srishti Mitra"}}],"published":["2025-10-01T19:15:12.000Z"]}}}},{"type":["h-entry"],"properties":{"like-of":["https://sugardave.cloud/posts/astro/using-live-collection-for-webmentions"],"published":["2025-08-04T15:15:48.177Z"],"mp-slug":["03-15-48"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/08/04/03-15-48"]},"references":{"https://sugardave.cloud/posts/astro/using-live-collection-for-webmentions":{"type":["h-entry"],"properties":{"name":["Astro's Live Content Collection - Display Webmentions 🚀"],"url":["https://sugardave.cloud/posts/astro/using-live-collection-for-webmentions"],"author":["sugardave"],"published":["2025-07-23T00:00:00.000Z"],"syndication":["https://news.indieweb.org/en"],"summary":["Using Astro's live content collection to display webmentions for blog posts"],"content":[{"value":"Today I would like to speak about a new experimental feature available in Astro 5.10 and beyond: live content collections.  A live content collection allows you to fetch its data at runtime rather than build time, which is how a regular content collection would normally be used.\nContent Collections\nA well-known use case for a content collection is retrieving all the blog posts you have written and then rendering the matching post based on path processing in a “slug page”.  Anyone who has gone through the complete “Build your first Astro Blog” tutorial should be familiar with how that works.\nWhen running your Astro site in static mode, this requires all potential post paths to be either manually specified in the slug page or dynamically built using the getStaticPaths method.  In either case, these paths are created at build time and cannot be changed afterwards.  This is also true when you use server-side rendering (SSR), but the method for matching a path to a post is slightly different and not part of the goal of this post.\nThe important thing to realize is that all “regular” content collections need to have their matching paths resolved at build time for static sites and all the content must be present at build time when using either static builds or SSR.\nLive Content Collections\nWith live content collections, developers can take more control over how they obtain content for rendering.  One thing you cannot do with regular content collections is have them fetch their data on-demand when a page is requested.  Live content collections enable this.\nFor this site, I have been slowly integrating bits and pieces of interesting concepts from the IndieWeb.  One of these is “webmentions”.  Without going into too much detail, webmentions are based on microformats and enable disparate, unconnected sites and services to “mention” your content and for your site to be able to discover those mentions and process them how you see fit.\nImplementation\nI am using a custom content loader to fetch webmentions from Webmention.io.  I call it webmentionLoader because that seems appropriate.  I have defined a Webmention interface based on suggestions from Claude Sonnet 4.  This is a naive first pass, so I’m only going to show the parts that I actually needed to get this all to work:\nexport interface Webmention {\n  // Core webmention properties\n  id: string;\n  source: string; // URL of the page that mentions your content\n  target: string; // URL of your content being mentioned\n  targetPath: string; // Path of the target URL (for easier filtering)\n  ...\n}\nI also have a helper function to retrieve the webmentions for my domain.  An API key is generated for each site you add to Webmention.io.\nconst getMentionsHTML = async (apiKey: string) => {\n  const response = await fetch(\n    `https://webmention.io/api/mentions.html?token=${apiKey}`\n  );\n  if (!response.ok) {\n    throw new Error(`Failed to fetch webmentions: ${response.statusText}`);\n  }\n  return response.text();\n};\nThe actual live content loader function needs to return an object with three required properties:\n\nname: a string to represent the name of the loader\nloadCollection: an async function that will return the entire collection of data or a filtered set\nloadEntry: an async function that will return a single item in the collection based on a filter\n\nSince I want to customize the display of webmention data, I am using JSDOM to parse the HTML returned from the fetch in loadCollection.  Another thing to note is that since webmentions are a many-to-one relation with posts, loadEntry will never be used, so I am only returning an error indicating it is not supported.\nexport const webmentionLoader = ({\n  apiKey\n}: {\n  apiKey: string;\n}): LiveLoader<Webmention> => {\n  return {\n    name: 'webmention-loader',\n    loadCollection: async ({filter}) => {\n      const {targetPath} = filter || {targetPath: ''};\n      try {\n        const webmentions: Webmention[] = await getMentionsHTML(apiKey).then(\n          (html) => {\n            const dom = new JSDOM(html);\n            const doc = dom.window.document;\n            const mentions = Array.from(\n              doc.querySelectorAll('.h-entry.mention')\n            );\n            const items = mentions.map((element, index) => {\n              // construct a target path from the target URL\n              const target = element\n                .querySelector('.u-mention-of')\n                ?.getAttribute('href') as string;\n              const postPath = target ? new URL(target).pathname : '';\n              return {\n                id: `${postPath}:${index}`,\n                data: {\n                  author: {\n                    name: element.querySelector('.p-author')\n                      ?.textContent as string\n                  }\n                },\n                source: element\n                  .querySelector('.u-url')\n                  ?.getAttribute('href') as string,\n                target,\n                targetPath: postPath\n              };\n            });\n            if (targetPath) {\n              // Filter by targetPath if provided\n              return items.filter((item) => item.targetPath === targetPath);\n            }\n            return items;\n          }\n        );\n\n        return {\n          entries: webmentions.map((mention) => ({\n            id: mention.id,\n            data: mention\n          }))\n        };\n      } catch (error) {\n        return {\n          error: new Error(\n            `Failed to retrieve webmentions: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        };\n      }\n    },\n    // there can be multiple webmentions for the same target, so we will never use loadEntry\n    loadEntry: async () => {\n      return {\n        error: new Error(`webmentionLoader does not support loadEntry`)\n      };\n    }\n  };\n};\nNow, in my slug page I can handle blog posts as a regular content collection just like I’ve been doing and also grab any webmentions that match them.\n---\nimport type {CollectionEntry} from 'astro:content';\nimport type {LiveDataEntry} from 'astro';\nimport type {Webmention} from '@lib/webmentionLoader';\nimport {getCollection, getLiveCollection, render} from 'astro:content';\nimport MarkdownPostLayout from '@layouts/MarkdownPostLayout.astro';\n\ninterface Props {\n  post: CollectionEntry<'blog'>;\n  postMentions: LiveDataEntry<Webmention>[];\n}\n\nconst {\n  params: {slug},\n  url\n} = Astro;\nconst currentPath = url.pathname.endsWith('/')\n  ? url.pathname.slice(0, -1)\n  : url.pathname;\nconst [post] = (await getCollection('blog', ({id}) => {\n  return id === slug || id.startsWith(`${slug}/`);\n})) as Props['post'][];\nconst frontmatter = post?.data;\nconst {entries: webmentions, error} = await getLiveCollection('webmentions', {\n  targetPath: currentPath\n});\nconst postMentions: Props['postMentions'] = [];\n\nif (error) {\n  console.error(`Error fetching webmentions:, ${error}`);\n} else if (webmentions && webmentions.length > 0) {\n  postMentions.push(\n    ...(webmentions as LiveDataEntry<Webmention>[]).filter((mention) => {\n      const {source, target} = mention.data;\n      if (!target || !source) {\n        return false;\n      }\n      try {\n        const targetUrl = new URL(target);\n        return targetUrl.pathname === currentPath;\n      } catch {\n        return target === currentPath;\n      }\n    })\n  );\n}\nlet Content;\nif (post) {\n  ({Content} = await render(post));\n}\n\nexport const prerender = false;\n---\n\n<MarkdownPostLayout\n  frontmatter={frontmatter ?? {}}\n  mentions={postMentions.map((m) => m.data)}\n>\n  {Content && <Content />}\n</MarkdownPostLayout>\nIt may be a little messy, but it gets the job done.  If you want to see it in action, why not link to this page from your site and submit a mention to the handy manual submission form?  The source URL will be the page where you linked to this page and the target URL will be this page.  After a successful submission, reload this page and you should see it displayed above the footer.  Hopefully 😁\nWrapping Up\nAfter putting it all together, I can now retrieve and display webmentions associated with any blog post on sugardave.cloud, huzzah!  In the future, I hope to implement other appropriate webmention collections for my posts.  My next target is the u-in-reply-to type so I can see what others think about my posts.  Once I have that, I am sure I will have another blog post about that journey.","html":"  <p>Today I would like to speak about a new experimental feature available in Astro 5.10 and beyond: <a href=\"https://docs.astro.build/en/reference/experimental-flags/live-content-collections/\">live content collections</a>.  A live content collection allows you to fetch its data at runtime rather than build time, which is how a regular content collection would normally be used.</p>\n<h2 id=\"content-collections\">Content Collections</h2>\n<p>A well-known use case for a content collection is retrieving all the blog posts you have written and then rendering the matching post based on path processing in a “slug page”.  Anyone who has gone through the complete <a href=\"https://docs.astro.build/en/tutorial/0-introduction/\">“Build your first Astro Blog” tutorial</a> should be familiar with how that works.</p>\n<p>When running your Astro site in static mode, this requires all potential post paths to be either manually specified in the slug page or dynamically built using the <code>getStaticPaths</code> method.  In either case, these paths are created at build time and cannot be changed afterwards.  This is also true when you use server-side rendering (SSR), but the method for matching a path to a post is slightly different and not part of the goal of this post.</p>\n<p>The important thing to realize is that <strong>all</strong> “regular” content collections need to have their matching paths resolved at build time for static sites and all the content must be present at build time when using either static builds or SSR.</p>\n<h2 id=\"live-content-collections\">Live Content Collections</h2>\n<p>With live content collections, developers can take more control over how they obtain content for rendering.  One thing you cannot do with regular content collections is have them fetch their data on-demand when a page is requested.  Live content collections enable this.</p>\n<p>For this site, I have been slowly integrating bits and pieces of interesting concepts from <a href=\"https://indieweb.org/IndieWeb\">the IndieWeb</a>.  One of these is <a href=\"https://indieweb.org/Webmention\">“webmentions”</a>.  Without going into too much detail, webmentions are based on <a href=\"https://indieweb.org/microformats\">microformats</a> and enable disparate, unconnected sites and services to “mention” your content and for your site to be able to discover those mentions and process them how you see fit.</p>\n<h3 id=\"implementation\">Implementation</h3>\n<p>I am using a custom content loader to fetch webmentions from <a href=\"https://webmention.io/\">Webmention.io</a>.  I call it <code>webmentionLoader</code> because that seems appropriate.  I have defined a <code>Webmention</code> interface based on suggestions from Claude Sonnet 4.  This is a naive first pass, so I’m only going to show the parts that I actually needed to get this all to work:</p>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8;overflow-x:auto\" tabindex=\"0\" data-language=\"typescript\"><code><span class=\"line\"><span style=\"color:#F97583\">export</span><span style=\"color:#F97583\"> interface</span><span style=\"color:#B392F0\"> Webmention</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#6A737D\">  // Core webmention properties</span></span>\n<span class=\"line\"><span style=\"color:#FFAB70\">  id</span><span style=\"color:#F97583\">:</span><span style=\"color:#79B8FF\"> string</span><span style=\"color:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"color:#FFAB70\">  source</span><span style=\"color:#F97583\">:</span><span style=\"color:#79B8FF\"> string</span><span style=\"color:#E1E4E8\">; </span><span style=\"color:#6A737D\">// URL of the page that mentions your content</span></span>\n<span class=\"line\"><span style=\"color:#FFAB70\">  target</span><span style=\"color:#F97583\">:</span><span style=\"color:#79B8FF\"> string</span><span style=\"color:#E1E4E8\">; </span><span style=\"color:#6A737D\">// URL of your content being mentioned</span></span>\n<span class=\"line\"><span style=\"color:#FFAB70\">  targetPath</span><span style=\"color:#F97583\">:</span><span style=\"color:#79B8FF\"> string</span><span style=\"color:#E1E4E8\">; </span><span style=\"color:#6A737D\">// Path of the target URL (for easier filtering)</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">  ...</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">}</span></span></code></pre>\n<p>I also have a helper function to retrieve the webmentions for my domain.  An API key is generated for each site you add to Webmention.io.</p>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8;overflow-x:auto\" tabindex=\"0\" data-language=\"typescript\"><code><span class=\"line\"><span style=\"color:#F97583\">const</span><span style=\"color:#B392F0\"> getMentionsHTML</span><span style=\"color:#F97583\"> =</span><span style=\"color:#F97583\"> async</span><span style=\"color:#E1E4E8\"> (</span><span style=\"color:#FFAB70\">apiKey</span><span style=\"color:#F97583\">:</span><span style=\"color:#79B8FF\"> string</span><span style=\"color:#E1E4E8\">) </span><span style=\"color:#F97583\">=&gt;</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">  const</span><span style=\"color:#79B8FF\"> response</span><span style=\"color:#F97583\"> =</span><span style=\"color:#F97583\"> await</span><span style=\"color:#B392F0\"> fetch</span><span style=\"color:#E1E4E8\">(</span></span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">    `https://webmention.io/api/mentions.html?token=${</span><span style=\"color:#E1E4E8\">apiKey</span><span style=\"color:#9ECBFF\">}`</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  );</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">  if</span><span style=\"color:#E1E4E8\"> (</span><span style=\"color:#F97583\">!</span><span style=\"color:#E1E4E8\">response.ok) {</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">    throw</span><span style=\"color:#F97583\"> new</span><span style=\"color:#B392F0\"> Error</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">`Failed to fetch webmentions: ${</span><span style=\"color:#E1E4E8\">response</span><span style=\"color:#9ECBFF\">.</span><span style=\"color:#E1E4E8\">statusText</span><span style=\"color:#9ECBFF\">}`</span><span style=\"color:#E1E4E8\">);</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  }</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">  return</span><span style=\"color:#E1E4E8\"> response.</span><span style=\"color:#B392F0\">text</span><span style=\"color:#E1E4E8\">();</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">};</span></span></code></pre>\n<p>The actual live content loader function needs to return an object with three required properties:</p>\n<ul>\n<li><code>name</code>: a string to represent the name of the loader</li>\n<li><code>loadCollection</code>: an async function that will return the entire collection of data or a filtered set</li>\n<li><code>loadEntry</code>: an async function that will return a single item in the collection based on a filter</li>\n</ul>\n<p>Since I want to customize the display of webmention data, I am using <code>JSDOM</code> to parse the HTML returned from the fetch in <code>loadCollection</code>.  Another thing to note is that since webmentions are a many-to-one relation with posts, <code>loadEntry</code> will never be used, so I am only returning an error indicating it is not supported.</p>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8;overflow-x:auto\" tabindex=\"0\" data-language=\"typescript\"><code><span class=\"line\"><span style=\"color:#F97583\">export</span><span style=\"color:#F97583\"> const</span><span style=\"color:#B392F0\"> webmentionLoader</span><span style=\"color:#F97583\"> =</span><span style=\"color:#E1E4E8\"> ({</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  apiKey</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">}</span><span style=\"color:#F97583\">:</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#FFAB70\">  apiKey</span><span style=\"color:#F97583\">:</span><span style=\"color:#79B8FF\"> string</span><span style=\"color:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">})</span><span style=\"color:#F97583\">:</span><span style=\"color:#B392F0\"> LiveLoader</span><span style=\"color:#E1E4E8\">&lt;</span><span style=\"color:#B392F0\">Webmention</span><span style=\"color:#E1E4E8\">&gt; </span><span style=\"color:#F97583\">=&gt;</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">  return</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    name: </span><span style=\"color:#9ECBFF\">&#39;webmention-loader&#39;</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#B392F0\">    loadCollection</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#F97583\">async</span><span style=\"color:#E1E4E8\"> ({</span><span style=\"color:#FFAB70\">filter</span><span style=\"color:#E1E4E8\">}) </span><span style=\"color:#F97583\">=&gt;</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">      const</span><span style=\"color:#E1E4E8\"> {</span><span style=\"color:#79B8FF\">targetPath</span><span style=\"color:#E1E4E8\">} </span><span style=\"color:#F97583\">=</span><span style=\"color:#E1E4E8\"> filter </span><span style=\"color:#F97583\">||</span><span style=\"color:#E1E4E8\"> {targetPath: </span><span style=\"color:#9ECBFF\">&#39;&#39;</span><span style=\"color:#E1E4E8\">};</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">      try</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">        const</span><span style=\"color:#79B8FF\"> webmentions</span><span style=\"color:#F97583\">:</span><span style=\"color:#B392F0\"> Webmention</span><span style=\"color:#E1E4E8\">[] </span><span style=\"color:#F97583\">=</span><span style=\"color:#F97583\"> await</span><span style=\"color:#B392F0\"> getMentionsHTML</span><span style=\"color:#E1E4E8\">(apiKey).</span><span style=\"color:#B392F0\">then</span><span style=\"color:#E1E4E8\">(</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">          (</span><span style=\"color:#FFAB70\">html</span><span style=\"color:#E1E4E8\">) </span><span style=\"color:#F97583\">=&gt;</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">            const</span><span style=\"color:#79B8FF\"> dom</span><span style=\"color:#F97583\"> =</span><span style=\"color:#F97583\"> new</span><span style=\"color:#B392F0\"> JSDOM</span><span style=\"color:#E1E4E8\">(html);</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">            const</span><span style=\"color:#79B8FF\"> doc</span><span style=\"color:#F97583\"> =</span><span style=\"color:#E1E4E8\"> dom.window.document;</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">            const</span><span style=\"color:#79B8FF\"> mentions</span><span style=\"color:#F97583\"> =</span><span style=\"color:#E1E4E8\"> Array.</span><span style=\"color:#B392F0\">from</span><span style=\"color:#E1E4E8\">(</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">              doc.</span><span style=\"color:#B392F0\">querySelectorAll</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">&#39;.h-entry.mention&#39;</span><span style=\"color:#E1E4E8\">)</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">            );</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">            const</span><span style=\"color:#79B8FF\"> items</span><span style=\"color:#F97583\"> =</span><span style=\"color:#E1E4E8\"> mentions.</span><span style=\"color:#B392F0\">map</span><span style=\"color:#E1E4E8\">((</span><span style=\"color:#FFAB70\">element</span><span style=\"color:#E1E4E8\">, </span><span style=\"color:#FFAB70\">index</span><span style=\"color:#E1E4E8\">) </span><span style=\"color:#F97583\">=&gt;</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#6A737D\">              // construct a target path from the target URL</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">              const</span><span style=\"color:#79B8FF\"> target</span><span style=\"color:#F97583\"> =</span><span style=\"color:#E1E4E8\"> element</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">                .</span><span style=\"color:#B392F0\">querySelector</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">&#39;.u-mention-of&#39;</span><span style=\"color:#E1E4E8\">)</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">                ?.</span><span style=\"color:#B392F0\">getAttribute</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">&#39;href&#39;</span><span style=\"color:#E1E4E8\">) </span><span style=\"color:#F97583\">as</span><span style=\"color:#79B8FF\"> string</span><span style=\"color:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">              const</span><span style=\"color:#79B8FF\"> postPath</span><span style=\"color:#F97583\"> =</span><span style=\"color:#E1E4E8\"> target </span><span style=\"color:#F97583\">?</span><span style=\"color:#F97583\"> new</span><span style=\"color:#B392F0\"> URL</span><span style=\"color:#E1E4E8\">(target).pathname </span><span style=\"color:#F97583\">:</span><span style=\"color:#9ECBFF\"> &#39;&#39;</span><span style=\"color:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">              return</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">                id: </span><span style=\"color:#9ECBFF\">`${</span><span style=\"color:#E1E4E8\">postPath</span><span style=\"color:#9ECBFF\">}:${</span><span style=\"color:#E1E4E8\">index</span><span style=\"color:#9ECBFF\">}`</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">                data: {</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">                  author: {</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">                    name: element.</span><span style=\"color:#B392F0\">querySelector</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">&#39;.p-author&#39;</span><span style=\"color:#E1E4E8\">)</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">                      ?.textContent </span><span style=\"color:#F97583\">as</span><span style=\"color:#79B8FF\"> string</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">                  }</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">                },</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">                source: element</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">                  .</span><span style=\"color:#B392F0\">querySelector</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">&#39;.u-url&#39;</span><span style=\"color:#E1E4E8\">)</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">                  ?.</span><span style=\"color:#B392F0\">getAttribute</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">&#39;href&#39;</span><span style=\"color:#E1E4E8\">) </span><span style=\"color:#F97583\">as</span><span style=\"color:#79B8FF\"> string</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">                target,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">                targetPath: postPath</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">              };</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">            });</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">            if</span><span style=\"color:#E1E4E8\"> (targetPath) {</span></span>\n<span class=\"line\"><span style=\"color:#6A737D\">              // Filter by targetPath if provided</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">              return</span><span style=\"color:#E1E4E8\"> items.</span><span style=\"color:#B392F0\">filter</span><span style=\"color:#E1E4E8\">((</span><span style=\"color:#FFAB70\">item</span><span style=\"color:#E1E4E8\">) </span><span style=\"color:#F97583\">=&gt;</span><span style=\"color:#E1E4E8\"> item.targetPath </span><span style=\"color:#F97583\">===</span><span style=\"color:#E1E4E8\"> targetPath);</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">            }</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">            return</span><span style=\"color:#E1E4E8\"> items;</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">          }</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">        );</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#F97583\">        return</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">          entries: webmentions.</span><span style=\"color:#B392F0\">map</span><span style=\"color:#E1E4E8\">((</span><span style=\"color:#FFAB70\">mention</span><span style=\"color:#E1E4E8\">) </span><span style=\"color:#F97583\">=&gt;</span><span style=\"color:#E1E4E8\"> ({</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">            id: mention.id,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">            data: mention</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">          }))</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">        };</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">      } </span><span style=\"color:#F97583\">catch</span><span style=\"color:#E1E4E8\"> (error) {</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">        return</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">          error: </span><span style=\"color:#F97583\">new</span><span style=\"color:#B392F0\"> Error</span><span style=\"color:#E1E4E8\">(</span></span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">            `Failed to retrieve webmentions: ${</span><span style=\"color:#E1E4E8\">error</span><span style=\"color:#F97583\"> instanceof</span><span style=\"color:#B392F0\"> Error</span><span style=\"color:#F97583\"> ?</span><span style=\"color:#E1E4E8\"> error</span><span style=\"color:#9ECBFF\">.</span><span style=\"color:#E1E4E8\">message</span><span style=\"color:#F97583\"> :</span><span style=\"color:#9ECBFF\"> &#39;Unknown error&#39;}`</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">          )</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">        };</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">      }</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    },</span></span>\n<span class=\"line\"><span style=\"color:#6A737D\">    // there can be multiple webmentions for the same target, so we will never use loadEntry</span></span>\n<span class=\"line\"><span style=\"color:#B392F0\">    loadEntry</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#F97583\">async</span><span style=\"color:#E1E4E8\"> () </span><span style=\"color:#F97583\">=&gt;</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">      return</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">        error: </span><span style=\"color:#F97583\">new</span><span style=\"color:#B392F0\"> Error</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">`webmentionLoader does not support loadEntry`</span><span style=\"color:#E1E4E8\">)</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">      };</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    }</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  };</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">};</span></span></code></pre>\n<p>Now, in my slug page I can handle blog posts as a regular content collection just like I’ve been doing and also grab any webmentions that match them.</p>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8;overflow-x:auto\" tabindex=\"0\" data-language=\"typescript\"><code><span class=\"line\"><span style=\"color:#F97583\">---</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">import</span><span style=\"color:#F97583\"> type</span><span style=\"color:#E1E4E8\"> {CollectionEntry} </span><span style=\"color:#F97583\">from</span><span style=\"color:#9ECBFF\"> &#39;astro:content&#39;</span><span style=\"color:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">import</span><span style=\"color:#F97583\"> type</span><span style=\"color:#E1E4E8\"> {LiveDataEntry} </span><span style=\"color:#F97583\">from</span><span style=\"color:#9ECBFF\"> &#39;astro&#39;</span><span style=\"color:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">import</span><span style=\"color:#F97583\"> type</span><span style=\"color:#E1E4E8\"> {Webmention} </span><span style=\"color:#F97583\">from</span><span style=\"color:#9ECBFF\"> &#39;@lib/webmentionLoader&#39;</span><span style=\"color:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">import</span><span style=\"color:#E1E4E8\"> {getCollection, getLiveCollection, render} </span><span style=\"color:#F97583\">from</span><span style=\"color:#9ECBFF\"> &#39;astro:content&#39;</span><span style=\"color:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">import</span><span style=\"color:#E1E4E8\"> MarkdownPostLayout </span><span style=\"color:#F97583\">from</span><span style=\"color:#9ECBFF\"> &#39;@layouts/MarkdownPostLayout.astro&#39;</span><span style=\"color:#E1E4E8\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#F97583\">interface</span><span style=\"color:#B392F0\"> Props</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#FFAB70\">  post</span><span style=\"color:#F97583\">:</span><span style=\"color:#B392F0\"> CollectionEntry</span><span style=\"color:#E1E4E8\">&lt;</span><span style=\"color:#9ECBFF\">&#39;blog&#39;</span><span style=\"color:#E1E4E8\">&gt;;</span></span>\n<span class=\"line\"><span style=\"color:#FFAB70\">  postMentions</span><span style=\"color:#F97583\">:</span><span style=\"color:#B392F0\"> LiveDataEntry</span><span style=\"color:#E1E4E8\">&lt;</span><span style=\"color:#B392F0\">Webmention</span><span style=\"color:#E1E4E8\">&gt;[];</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">}</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#F97583\">const</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#FFAB70\">  params</span><span style=\"color:#E1E4E8\">: {</span><span style=\"color:#79B8FF\">slug</span><span style=\"color:#E1E4E8\">},</span></span>\n<span class=\"line\"><span style=\"color:#79B8FF\">  url</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">} </span><span style=\"color:#F97583\">=</span><span style=\"color:#E1E4E8\"> Astro;</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">const</span><span style=\"color:#79B8FF\"> currentPath</span><span style=\"color:#F97583\"> =</span><span style=\"color:#E1E4E8\"> url.pathname.</span><span style=\"color:#B392F0\">endsWith</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">&#39;/&#39;</span><span style=\"color:#E1E4E8\">)</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">  ?</span><span style=\"color:#E1E4E8\"> url.pathname.</span><span style=\"color:#B392F0\">slice</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#79B8FF\">0</span><span style=\"color:#E1E4E8\">, </span><span style=\"color:#F97583\">-</span><span style=\"color:#79B8FF\">1</span><span style=\"color:#E1E4E8\">)</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">  :</span><span style=\"color:#E1E4E8\"> url.pathname;</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">const</span><span style=\"color:#E1E4E8\"> [</span><span style=\"color:#79B8FF\">post</span><span style=\"color:#E1E4E8\">] </span><span style=\"color:#F97583\">=</span><span style=\"color:#E1E4E8\"> (</span><span style=\"color:#F97583\">await</span><span style=\"color:#B392F0\"> getCollection</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">&#39;blog&#39;</span><span style=\"color:#E1E4E8\">, ({</span><span style=\"color:#FFAB70\">id</span><span style=\"color:#E1E4E8\">}) </span><span style=\"color:#F97583\">=&gt;</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">  return</span><span style=\"color:#E1E4E8\"> id </span><span style=\"color:#F97583\">===</span><span style=\"color:#E1E4E8\"> slug </span><span style=\"color:#F97583\">||</span><span style=\"color:#E1E4E8\"> id.</span><span style=\"color:#B392F0\">startsWith</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">`${</span><span style=\"color:#E1E4E8\">slug</span><span style=\"color:#9ECBFF\">}/`</span><span style=\"color:#E1E4E8\">);</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">})) </span><span style=\"color:#F97583\">as</span><span style=\"color:#B392F0\"> Props</span><span style=\"color:#E1E4E8\">[</span><span style=\"color:#9ECBFF\">&#39;post&#39;</span><span style=\"color:#E1E4E8\">][];</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">const</span><span style=\"color:#79B8FF\"> frontmatter</span><span style=\"color:#F97583\"> =</span><span style=\"color:#E1E4E8\"> post?.data;</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">const</span><span style=\"color:#E1E4E8\"> {</span><span style=\"color:#FFAB70\">entries</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#79B8FF\">webmentions</span><span style=\"color:#E1E4E8\">, </span><span style=\"color:#79B8FF\">error</span><span style=\"color:#E1E4E8\">} </span><span style=\"color:#F97583\">=</span><span style=\"color:#F97583\"> await</span><span style=\"color:#B392F0\"> getLiveCollection</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">&#39;webmentions&#39;</span><span style=\"color:#E1E4E8\">, {</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  targetPath: currentPath</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">});</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">const</span><span style=\"color:#79B8FF\"> postMentions</span><span style=\"color:#F97583\">:</span><span style=\"color:#B392F0\"> Props</span><span style=\"color:#E1E4E8\">[</span><span style=\"color:#9ECBFF\">&#39;postMentions&#39;</span><span style=\"color:#E1E4E8\">] </span><span style=\"color:#F97583\">=</span><span style=\"color:#E1E4E8\"> [];</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#F97583\">if</span><span style=\"color:#E1E4E8\"> (error) {</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  console.</span><span style=\"color:#B392F0\">error</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">`Error fetching webmentions:, ${</span><span style=\"color:#E1E4E8\">error</span><span style=\"color:#9ECBFF\">}`</span><span style=\"color:#E1E4E8\">);</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">} </span><span style=\"color:#F97583\">else</span><span style=\"color:#F97583\"> if</span><span style=\"color:#E1E4E8\"> (webmentions </span><span style=\"color:#F97583\">&amp;&amp;</span><span style=\"color:#E1E4E8\"> webmentions.</span><span style=\"color:#79B8FF\">length</span><span style=\"color:#F97583\"> &gt;</span><span style=\"color:#79B8FF\"> 0</span><span style=\"color:#E1E4E8\">) {</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  postMentions.</span><span style=\"color:#B392F0\">push</span><span style=\"color:#E1E4E8\">(</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">    ...</span><span style=\"color:#E1E4E8\">(webmentions </span><span style=\"color:#F97583\">as</span><span style=\"color:#B392F0\"> LiveDataEntry</span><span style=\"color:#E1E4E8\">&lt;</span><span style=\"color:#B392F0\">Webmention</span><span style=\"color:#E1E4E8\">&gt;[]).</span><span style=\"color:#B392F0\">filter</span><span style=\"color:#E1E4E8\">((</span><span style=\"color:#FFAB70\">mention</span><span style=\"color:#E1E4E8\">) </span><span style=\"color:#F97583\">=&gt;</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">      const</span><span style=\"color:#E1E4E8\"> {</span><span style=\"color:#79B8FF\">source</span><span style=\"color:#E1E4E8\">, </span><span style=\"color:#79B8FF\">target</span><span style=\"color:#E1E4E8\">} </span><span style=\"color:#F97583\">=</span><span style=\"color:#E1E4E8\"> mention.data;</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">      if</span><span style=\"color:#E1E4E8\"> (</span><span style=\"color:#F97583\">!</span><span style=\"color:#E1E4E8\">target </span><span style=\"color:#F97583\">||</span><span style=\"color:#F97583\"> !</span><span style=\"color:#E1E4E8\">source) {</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">        return</span><span style=\"color:#79B8FF\"> false</span><span style=\"color:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">      }</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">      try</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">        const</span><span style=\"color:#79B8FF\"> targetUrl</span><span style=\"color:#F97583\"> =</span><span style=\"color:#F97583\"> new</span><span style=\"color:#B392F0\"> URL</span><span style=\"color:#E1E4E8\">(target);</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">        return</span><span style=\"color:#E1E4E8\"> targetUrl.pathname </span><span style=\"color:#F97583\">===</span><span style=\"color:#E1E4E8\"> currentPath;</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">      } </span><span style=\"color:#F97583\">catch</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">        return</span><span style=\"color:#E1E4E8\"> target </span><span style=\"color:#F97583\">===</span><span style=\"color:#E1E4E8\"> currentPath;</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">      }</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    })</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  );</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">}</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">let</span><span style=\"color:#E1E4E8\"> Content;</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">if</span><span style=\"color:#E1E4E8\"> (post) {</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  ({Content} </span><span style=\"color:#F97583\">=</span><span style=\"color:#F97583\"> await</span><span style=\"color:#B392F0\"> render</span><span style=\"color:#E1E4E8\">(post));</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">}</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#F97583\">export</span><span style=\"color:#F97583\"> const</span><span style=\"color:#79B8FF\"> prerender</span><span style=\"color:#F97583\"> =</span><span style=\"color:#79B8FF\"> false</span><span style=\"color:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">---</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#F97583\">&lt;</span><span style=\"color:#E1E4E8\">MarkdownPostLayout</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  frontmatter</span><span style=\"color:#F97583\">=</span><span style=\"color:#E1E4E8\">{frontmatter ?? {}}</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  mentions</span><span style=\"color:#F97583\">=</span><span style=\"color:#E1E4E8\">{postMentions.map((m) =&gt; m.data)}</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">&gt;</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  {Content </span><span style=\"color:#F97583\">&amp;&amp;</span><span style=\"color:#E1E4E8\"> &lt;</span><span style=\"color:#B392F0\">Content</span><span style=\"color:#E1E4E8\"> /&gt;}</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">&lt;/</span><span style=\"color:#E1E4E8\">MarkdownPostLayout</span><span style=\"color:#F97583\">&gt;</span></span></code></pre>\n<p>It may be a little messy, but it gets the job done.  If you want to see it in action, why not link to this page from your site and submit a mention to the handy <a href=\"https://webmention.io/sugardave.cloud/webmention\">manual submission form</a>?  The <code>source URL</code> will be the page where you linked to this page and the <code>target URL</code> will be this page.  After a successful submission, reload this page and you should see it displayed above the footer.  Hopefully 😁</p>\n<h2 id=\"wrapping-up\">Wrapping Up</h2>\n<p>After putting it all together, I can now retrieve and display webmentions associated with any blog post on <strong>sugardave.cloud</strong>, huzzah!  In the future, I hope to implement other appropriate webmention collections for my posts.  My next target is the <code>u-in-reply-to</code> type so I can see what others think about my posts.  Once I have that, I am sure I will have another blog post about that journey.</p>  "}]},"children":[{"type":["h-px"],"properties":{}}]}}},{"type":["h-entry"],"properties":{"like-of":["https://fosstodon.org/@ente/114562028846761783"],"published":["2025-06-18T10:35:11.177Z"],"mp-slug":["10-35-11"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/06/18/10-35-11"]},"references":{"https://fosstodon.org/@ente/114562028846761783":{"type":["h-entry"],"properties":{"url":["https://fosstodon.org/@ente/114562028846761783"],"name":["Ente (@ente@fosstodon.org)"],"summary":["Attached: 1 image Eruption on Mount Etna (Sicily) giving the illusion of a Phoenix in the sky. #Photography"],"featured":["https://cdn.fosstodon.org/media_attachments/files/114/562/021/494/836/601/original/2514eb20fc970b07.jpg"],"content":[{"html":"<body class=\"app-body theme-system no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://briefs.video/videos/introducing-webbed-sites/"],"published":["2025-05-29T08:32:20.870Z"],"mp-slug":["08-32-20"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/05/29/08-32-20"]},"references":{"https://briefs.video/videos/introducing-webbed-sites/":{"type":["h-entry"],"properties":{"url":["https://briefs.video/videos/introducing-webbed-sites/"],"name":["Introducing: Webbed Sites"],"summary":["A video from Webbed Briefs"],"featured":["https://briefs.video/assets/images/thumbnails/introducing-webbed-sites-card.png"],"content":[{"html":"<aside id=\"transcript\" class=\"transcript centered stack\"> <p>Introducing Webbed Sites: Everything you need to build and publish your website, without having to write a single line of code.</p>\n<p>Just paste your existing design into your Webbed Sites account. From there, your state of the art AI assistant, Martin, takes over.</p>\n<p>Martin was trained on a selected corpus of uncensored Hentai, Adolf Hitler\u0019s <strong>Mein Kampf</strong>, and the source code of <strong>Microsoft Frontpage 98</strong>. He knows everything a late middle-aged Java programmer knows about coding websites.</p>\n<p>In mere moments, Martin processes all your design assets, including your buttons, your links and your headings, and coverts them, magically, into <code>&lt;div&gt;</code>s.</p>\n<p>But not just <code>&lt;div&gt;</code>s, of course! There are also <code>&lt;div&gt;</code>s next to <code>&lt;div&gt;</code>s, <code>&lt;div&gt;</code>s inside other <code>&lt;div&gt;</code>s, and <code>&lt;div&gt;</code>s <em>outside</em> <code>&lt;div&gt;</code>s that have <code>&lt;div&gt;</code>s inside them. Our builder also has the capability for <code>&lt;div&gt;</code>s with nonconforming <code>href</code> attributes and <code>&lt;div&gt;</code>s with superfluous and incompatible <code>aria-label</code>s.</p>\n<p>Webbed Sites: The no code website building platform that really hopes you like&amp;</p>\n<p><code>&lt;div&gt;</code>s.</p> <p>Since launching Webbed Sites we&apos;ve received a lot of feedback. Firstly, I just want to thank everyone for taking the time to reach out. Your comments are highly valued and appreciated. And secondly, I just want to say we are deeply sorry. The accessibility of Webbed Sites is not where it should be right now and that&apos;s on us, the Webbed Sites team.</p>\n<p>We know we\u0019ve let you down, and it hurts. But please believe us when we say that we\u0019d never <em>deliberately</em> rush out an inaccessible release, to save time and money, at the expense of disabled web users. We just didn\u0019t deliberately <em>not</em> rush out a release, to save time and money, at the expense of disabled users, either. Disableds are a priority to us, and always have been. In fact, many of my wives are disabled. Some since before I even met them.</p>\n<p>I don&apos;t really know what else to say. It&apos;s not an excuse, of course, but please understand that we were under a lot of pressure and had very little time. Plus, of course, we had an enormous surfeit of&amp;</p>\n<p><code>&lt;div&gt;</code>s.</p> </aside>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://tilde.zone/@xandra/114547017410429628"],"published":["2025-05-22T09:13:05.937Z"],"mp-slug":["09-13-05"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/05/22/09-13-05"]},"references":{"https://tilde.zone/@xandra/114547017410429628":{"type":["h-entry"],"properties":{"url":["https://tilde.zone/@xandra/114547017410429628"],"name":["alexandra (@xandra@tilde.zone)"],"summary":["Attached: 1 image woo\u0014last looks (and fixes) on the print proof before final printing! IT\u0019S HAPPENING"],"featured":["https://media.tilde.zone/media_attachments/files/114/547/003/957/747/062/original/19d290d7fc702d2b.png"],"content":[{"html":"<body class=\"app-body flavour-glitch skin-default custom-scrollbars no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://dbushell.com/2025/05/07/glossary-web-component/"],"published":["2025-05-07T13:57:50.208Z"],"mp-slug":["01-57-50"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/05/07/01-57-50"]},"references":{"https://dbushell.com/2025/05/07/glossary-web-component/":{"type":["h-entry"],"properties":{"url":["https://dbushell.com/2025/05/07/glossary-web-component/"],"name":["Glossary Web Component"],"summary":["The one where I put the hypercard in the hyperlink"],"featured":["https://dbushell.com/images/articles/2025-05-07-glossary-web-component.png"],"content":[{"html":"<div class=\"Prose\"> <p>\n<time class=\"Time\"> Wednesday 7 <abbr>May</abbr>\n2025\n</time>\n</p> <p>I\u0019ve added a <strong>secret glossary</strong> to my blog! You might find it by hovering over special links. Don\u0019t tell anyone, it\u0019s a secret. At least until I can find a way to style the links without them being a distraction. Do I need to, or can they remain <glossary-term id=\"--term-easter-egg\"><a href=\"https://en.wikipedia.org/wiki/Easter_egg_(media)\">easter eggs?</a></glossary-term></p><h2 id=\"the-idea\">The Idea</h2><p>This project came about when <a href=\"https://dbushell.com/notes/2025-05-05T05:48Z/\">I noted concern</a> over my reliance on <glossary-term id=\"--term-mdn\"><a href=\"https://developer.mozilla.org\">MDN</a></glossary-term>. I always favour MDN over other sources. I\u0019m lazy. I feel guilty for not linking to the small web, the indie web, the weird web. At first I banned myself from linking to MDN. Later I mulled over the glossary idea. I think I\u0019ve solved it!</p><h2 id=\"the-implementation\">The Implementation</h2><p>I write my blog posts in <glossary-term id=\"--term-markdown\"><a href=\"https://daringfireball.net/projects/markdown/\">Markdown</a></glossary-term>. For new glossary terms I now link to a placeholder rather than an external source. For example:</p><pre id=\"pre-7ca5bb92\"><code><span class=\"line\"><span class=\"syntax-26f6a8db\">[</span><span class=\"syntax-1656d967\">React</span><span class=\"syntax-26f6a8db\">](</span><span class=\"syntax-f6e8cdf0\">/glossary/react.json</span><span class=\"syntax-26f6a8db\">)</span></span></code></pre><p>This references a <glossary-term id=\"--term-json\"><a href=\"https://www.json.org\">JSON</a></glossary-term> file that has the following format:</p><pre id=\"pre-1139173d\"><code><span class=\"line\"><span class=\"syntax-26f6a8db\">{</span></span>\n<span class=\"line\"><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"syntax-3deadb66\">&quot;</span><span class=\"syntax-3eeadcf9\">title</span><span class=\"syntax-3deadb66\">&quot;</span><span class=\"syntax-1656d967\">:</span><span class=\"space\"> </span><span class=\"syntax-6168685d\">&quot;</span><span class=\"syntax-e661ac3e\">React</span><span class=\"syntax-6168685d\">&quot;</span><span class=\"syntax-26f6a8db\">,</span></span>\n<span class=\"line\"><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"syntax-3deadb66\">&quot;</span><span class=\"syntax-3eeadcf9\">description</span><span class=\"syntax-3deadb66\">&quot;</span><span class=\"syntax-1656d967\">:</span><span class=\"space\"> </span><span class=\"syntax-6168685d\">&quot;</span><span class=\"syntax-e661ac3e\">A</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">legacy</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">JavaScript</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">framework</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">(turned</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">religion).</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">Favoured</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">by</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">tech</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">bros</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">and</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">famous</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">for</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">bloated</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">bundles</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">and</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">crippling</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">web</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">performance.</span><span class=\"syntax-6168685d\">&quot;</span><span class=\"syntax-26f6a8db\">,</span></span>\n<span class=\"line\"><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"syntax-3deadb66\">&quot;</span><span class=\"syntax-3eeadcf9\">links</span><span class=\"syntax-3deadb66\">&quot;</span><span class=\"syntax-1656d967\">:</span><span class=\"space\"> </span><span class=\"syntax-26f6a8db\">[</span></span>\n<span class=\"line\"><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"syntax-26f6a8db\">{</span></span>\n<span class=\"line\"><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"syntax-3deadb66\">&quot;</span><span class=\"syntax-3eeadcf9\">name</span><span class=\"syntax-3deadb66\">&quot;</span><span class=\"syntax-1656d967\">:</span><span class=\"space\"> </span><span class=\"syntax-6168685d\">&quot;</span><span class=\"syntax-e661ac3e\">JSX.lol</span><span class=\"syntax-6168685d\">&quot;</span><span class=\"syntax-26f6a8db\">,</span></span>\n<span class=\"line\"><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"syntax-3deadb66\">&quot;</span><span class=\"syntax-3eeadcf9\">title</span><span class=\"syntax-3deadb66\">&quot;</span><span class=\"syntax-1656d967\">:</span><span class=\"space\"> </span><span class=\"syntax-6168685d\">&quot;</span><span class=\"syntax-e661ac3e\">Does</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">anybody</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">actually</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">like</span><span class=\"space\"> </span><span class=\"syntax-e661ac3e\">React?</span><span class=\"syntax-6168685d\">&quot;</span><span class=\"syntax-26f6a8db\">,</span></span>\n<span class=\"line\"><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"syntax-3deadb66\">&quot;</span><span class=\"syntax-3eeadcf9\">url</span><span class=\"syntax-3deadb66\">&quot;</span><span class=\"syntax-1656d967\">:</span><span class=\"space\"> </span><span class=\"syntax-6168685d\">&quot;</span><span class=\"syntax-e661ac3e\">https://jsx.lol</span><span class=\"syntax-6168685d\">&quot;</span></span>\n<span class=\"line\"><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"syntax-26f6a8db\">},</span></span>\n<span class=\"line\"><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"syntax-26f6a8db\">{</span></span>\n<span class=\"line\"><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"syntax-3deadb66\">&quot;</span><span class=\"syntax-3eeadcf9\">name</span><span class=\"syntax-3deadb66\">&quot;</span><span class=\"syntax-1656d967\">:</span><span class=\"space\"> </span><span class=\"syntax-6168685d\">&quot;</span><span class=\"syntax-e661ac3e\">React</span><span class=\"syntax-6168685d\">&quot;</span><span class=\"syntax-26f6a8db\">,</span></span>\n<span class=\"line\"><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"syntax-3deadb66\">&quot;</span><span class=\"syntax-3eeadcf9\">url</span><span class=\"syntax-3deadb66\">&quot;</span><span class=\"syntax-1656d967\">:</span><span class=\"space\"> </span><span class=\"syntax-6168685d\">&quot;</span><span class=\"syntax-e661ac3e\">https://react.dev</span><span class=\"syntax-6168685d\">&quot;</span></span>\n<span class=\"line\"><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"syntax-26f6a8db\">}</span></span>\n<span class=\"line\"><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"syntax-26f6a8db\">]</span></span>\n<span class=\"line\"><span class=\"syntax-26f6a8db\">}</span></span></code></pre><p>My build script replaces the markdown link with a <glossary-term id=\"--term-web-component\"><a href=\"https://adactio.com/journal/20618\">web component</a></glossary-term>:</p><pre id=\"pre-5ba649c3\"><code><span class=\"line\"><span class=\"syntax-26f6a8db\">&lt;</span><span class=\"syntax-1656d967\">glossary-term</span><span class=\"space\"> </span><span class=\"syntax-4ddd3d58\">id</span><span class=\"syntax-1656d967\">=</span><span class=\"syntax-6168685d\">&quot;</span><span class=\"syntax-e661ac3e\">--term-react</span><span class=\"syntax-6168685d\">&quot;</span><span class=\"syntax-26f6a8db\">&gt;</span></span>\n<span class=\"line\"><span class=\"space\"> </span><span class=\"space\"> </span><span class=\"syntax-26f6a8db\">&lt;</span><span class=\"syntax-1656d967\">a</span><span class=\"space\"> </span><span class=\"syntax-4ddd3d58\">href</span><span class=\"syntax-1656d967\">=</span><span class=\"syntax-6168685d\">&quot;</span><span class=\"syntax-e661ac3e\">https://jsx.lol</span><span class=\"syntax-6168685d\">&quot;</span><span class=\"syntax-26f6a8db\">&gt;React&lt;/</span><span class=\"syntax-1656d967\">a</span><span class=\"syntax-26f6a8db\">&gt;</span></span>\n<span class=\"line\"><span class=\"syntax-26f6a8db\">&lt;/</span><span class=\"syntax-1656d967\">glossary-term</span><span class=\"syntax-26f6a8db\">&gt;</span></span></code></pre><p>The first link in the JSON is used as the canonical source.</p><p>HTML wrapped in a <glossary-term id=\"--term-custom-element\"><a href=\"https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_custom_elements\">custom element</a></glossary-term> is a perfect example of <glossary-term id=\"--term-progressive-enhancement\"><a href=\"https://piccalil.li/blog/its-about-time-i-tried-to-explain-what-progressive-enhancement-actually-is/\">progressive enhancement</a></glossary-term>. For unsupported browsers there is still an accessible link inside. For browsers that support the <glossary-term id=\"--term-popover\"><a href=\"https://frontendmasters.com/blog/using-the-popover-api-for-html-tooltips/\">Popover API</a></glossary-term> each <code>&lt;glossary-term&gt;</code> element is enhanced with a fancy popover.</p><p>If you\u0019ve missed every example so far here is the <glossary-term id=\"--term-react\"><a href=\"https://jsx.lol\">React</a></glossary-term> link.</p><p>I captured a screen recording of how it should appear:</p><figure class=\"Image\"><video width=\"450\" height=\"300\" src=\"/images/blog/2025/glossary-popover.mp4\"> <p><a href=\"https://dbushell.com/images/blog/2025/glossary-popover.mp4\">Download video.</a></p> </video></figure><p>The popover is activated by either <strong>hover</strong> or <strong>keyboard focus</strong>. The escape key can also dismiss them. For touchscreens I\u0019m going to test that live&amp;</p><p><del>[INSERT TEST RESULTS]</del></p><p><strong>Test results:</strong> it works fine. If you\u0019ve got one of those new Apple Pencils \u0014 the <em>new</em> new one, not the new <em>old</em> one \u0014 the hover effect is magical. Touch taps are taken straight to the canonical link. The popover might be open upon return. Maybe I should cancel the popover based on touch events to avoid confusion?</p><h2 id=\"failures\">Failures</h2><p>Initially I tried to use <glossary-term id=\"--term-anchor-positioning\"><a href=\"https://css-tricks.com/css-anchor-positioning-guide/\">CSS anchor positioning</a></glossary-term>.</p><p>I really tried. It left me in tears and I rage quit. It might be the most unintuitive, <em>doesn\u0019t work like it says</em>, infuriating web \u001cstandard\u001d ever. When anchoring a <code>popover</code> it\u0019s impossible to ensure elements stay inside the viewport (without JavaScript). Please prove me wrong!</p><p>I tried to get creative with <glossary-term id=\"--term-view-transition\"><a href=\"https://htmx.org/essays/view-transitions/\">view transitions</a></glossary-term> and failed. Safari had some pixel-shifting jank going on. I tried normal transitions with <code>allow-discrete</code> and <code>@starting-style</code> and failed. In an isolated demo it\u0019s all gravy but together this new CSS stuff doesn\u0019t plays nice. It\u0019s not all <glossary-term id=\"--term-baseline\"><a href=\"https://web.dev/baseline\">baseline</a></glossary-term> yet so let\u0019s hope it improves. &gt;\u001e</p><p>CSS anchors are Chrome and <glossary-term id=\"--term-chrome\"><a href=\"https://github.com/ungoogled-software/ungoogled-chromium\">Chrome derivatives</a></glossary-term> only right now. Safari Technical Preview claims to have support but <a href=\"https://www.theverge.com/news/659301/apple-executive-lied-under-oath-epic-alex-roman\">Apple lies under oath</a> so who knows?</p><p>Ultimately I gave up and used <glossary-term id=\"--term-javascript\"><a href=\"https://tc39.es\">JavaScript</a></glossary-term> to calculate position so I can support all browsers. I\u0019ll recharge morale and tackle a v2.0 at a later date.</p><p>I don\u0019t plan to immediately retrofit older blog posts with glossary links. Although that could be a quick find &amp; replace if I\u0019m careful. I\u0019m looking for positive feedback before I do. So let me know if you like it (or not). If no one hates it I\u0019ll plough ahead, because I like it. This glossary may just be the third incarnation of my <a href=\"https://dbushell.com/2024/01/24/cotton-coder/\">bookmarks blog</a>.</p><p>I\u0019m tempted to use a similar technique to create popover cards for <a href=\"https://dbushell.com/notes/\">linked notes</a>. They have more content so I need to consider that more.</p>\n</div>"}],"published":["2025-05-07T00:00:00.000Z"]}}}},{"type":["h-entry"],"properties":{"like-of":["https://hachyderm.io/@charliewilco/114435540754888601"],"published":["2025-05-02T07:28:20.955Z"],"mp-slug":["07-28-20"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/05/02/07-28-20"]},"references":{"https://hachyderm.io/@charliewilco/114435540754888601":{"type":["h-entry"],"properties":{"url":["https://hachyderm.io/@charliewilco/114435540754888601"],"name":["Charlie �\u000f (@charliewilco@hachyderm.io)"],"summary":["web components need a next.js they need something bigger than astro there has to be an application model for web components"],"content":[{"html":"<body class=\"app-body theme-default no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://mastodon.social/@davatron5000/114379441761385823"],"published":["2025-04-22T10:02:54.987Z"],"mp-slug":["10-02-54"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/04/22/10-02-54"]},"references":{"https://mastodon.social/@davatron5000/114379441761385823":{"type":["h-entry"],"properties":{"url":["https://mastodon.social/@davatron5000/114379441761385823"],"name":["Dave Rupert (@davatron5000@mastodon.social)"],"summary":["Final step of my Notion-to-Obsidian migration: Exporting 587 blog posts. Whew."],"content":[{"html":"<body class=\"app-body theme-system custom-scrollbars no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://velvetshark.com/ai-company-logos-that-look-like-buttholes"],"published":["2025-04-11T08:43:47.618Z"],"mp-slug":["08-43-47"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/04/11/08-43-47"]},"references":{"https://velvetshark.com/ai-company-logos-that-look-like-buttholes":{"type":["h-entry"],"properties":{"url":["https://velvetshark.com/ai-company-logos-that-look-like-buttholes"],"name":["Why do AI company logos look like buttholes?"],"summary":["A humorous exploration of the uncanny resemblance between AI company logos and human anatomy. Discover why circular, gradient-based designs dominate the AI industry, and what this design convergence&hellip;"],"featured":["https://velvetshark.com/images/ai-company-logos-that-look-like-buttholes/why-do-AI-company-logos-look-like-buttholes.png"],"content":[{"html":"<div><header class=\"BlogHero_wrapper__M743_\"></header><div class=\"postSlug_page__76f9S\"><div class=\"ImageWrapper_container__inCVa\"><img alt=\"AI company logos with suspicious circular designs\" width=\"1800\" srcset=\"https://velvetshark.com/_next/image?url=%2Fimages%2Fai-company-logos-that-look-like-buttholes%2Fwhy-do-AI-company-logos-look-like-buttholes.png&amp;w=1920&amp;q=75 1x, https://velvetshark.com/_next/image?url=%2Fimages%2Fai-company-logos-that-look-like-buttholes%2Fwhy-do-AI-company-logos-look-like-buttholes.png&amp;w=3840&amp;q=75 2x\" src=\"/_next/image?url=%2Fimages%2Fai-company-logos-that-look-like-buttholes%2Fwhy-do-AI-company-logos-look-like-buttholes.png&amp;w=3840&amp;q=75\"></div>\n<p>If you pay attention to AI company branding, you&apos;ll notice a pattern:</p>\n<ol>\n<li>Circular shape (often with a gradient)</li>\n<li>Central opening or focal point</li>\n<li>Radiating elements from the center</li>\n<li>Soft, organic curves</li>\n</ol>\n<p>Sound familiar? It should, because it&apos;s also an apt description of... well, you know.</p>\n<p>A butthole.</p>\n<h2>The circular AI logo epidemic</h2>\n<p>If you ever thought that AI company logos look like buttholes, you&apos;re not alone.</p>\n<p>FastCompany noticed this trend in 2023 and published an article about it, but (I could only presume) their editors and lawyers didn&apos;t let them title the article the way the wanted it to title, so it got published with a more safe for work title: <a href=\"https://www.fastcompany.com/90869029/ai-boom-logo-trend-swirling-hexagon\">The AI boom is creating a new logo trend: the swirling hexagon</a>. They also were careful not to mention anything anatomical.</p>\n<p>I don&apos;t have editors or lawyers, so let&apos;s take a closer look at some examples:</p>\n<h4>OpenAI&apos;s logo evolution</h4>\n<div class=\"ImageWrapper_container__inCVa\"><img alt=\"OpenAI&apos;s logo evolution\" width=\"1510\" srcset=\"https://velvetshark.com/_next/image?url=%2Fimages%2Fai-company-logos-that-look-like-buttholes%2Fopenai-logo-evolution.png&amp;w=1920&amp;q=75 1x, https://velvetshark.com/_next/image?url=%2Fimages%2Fai-company-logos-that-look-like-buttholes%2Fopenai-logo-evolution.png&amp;w=3840&amp;q=75 2x\" src=\"/_next/image?url=%2Fimages%2Fai-company-logos-that-look-like-buttholes%2Fopenai-logo-evolution.png&amp;w=3840&amp;q=75\"></div>\n<p>OpenAI&apos;s original logo was a simple, text-based mark. Then came the redesign: a perfect circle with a subtle gradient and central void.</p>\n<p><a href=\"https://openai.com/brand/\">OpenAI&apos;s official explanation</a> is a masterclass in corporate euphemism:</p>\n<p><em>&quot;The Blossom logo is more than just a visual symbol; it represents the core philosophy that guides our approach to design and innovation. At its heart, the logo captures the dynamic intersection between humanity and technology\u0014two forces that shape our world and inspire our work. The design embodies the fluidity and warmth of human-centered thinking through the use of circles, while right angles introduce the precision and structure that technology demands.&quot;</em></p>\n<p>Sure, Sam.</p>\n<p>Translation: &quot;We made a circular shape with some angles because it looked nice, then wrote flowery language to justify why our butthole-adjacent design is actually profound.&quot;</p>\n<p>The <strong>fluidity and warmth of human-centered thinking through the use of circles</strong> is perhaps the most elegant way anyone has ever described making a logo that resembles an anus.</p>\n<h4>The Big AI companies</h4>\n<div class=\"ImageWrapper_container__inCVa\"><img alt=\"Big AI companies logos\" width=\"1800\" srcset=\"https://velvetshark.com/_next/image?url=%2Fimages%2Fai-company-logos-that-look-like-buttholes%2Fbig-ai-companies-logos.png&amp;w=1920&amp;q=75 1x, https://velvetshark.com/_next/image?url=%2Fimages%2Fai-company-logos-that-look-like-buttholes%2Fbig-ai-companies-logos.png&amp;w=3840&amp;q=75 2x\" src=\"/_next/image?url=%2Fimages%2Fai-company-logos-that-look-like-buttholes%2Fbig-ai-companies-logos.png&amp;w=3840&amp;q=75\"></div>\n<p>Looking at the logos of the Big AI companies, you can see that they almost all of them have a circular or snowflake-like shape and a central opening.</p>\n<p>Only DeepSeek and DeepMind don&apos;t follow the trend. Interestingly, both are sea-related.</p>\n<h4>Smoking gun: Anthropic&apos;s Claude</h4>\n<p>Up until this point, the logos have been subtle. You might say that the logos are simply circular and there&apos;s not much more to it.</p>\n<p>But Anthropic&apos;s Claude takes it to the next level.</p>\n<p>Here&apos;s a side-by-side comparison with a drawing from Kurt Vonnegut&apos;s book &quot;Breakfast of Champions&quot;. I added Claude&apos;s logo below for easy comparison.</p>\n<div class=\"ImageWrapper_container__inCVa\"><img alt=\"Vonnegut vs Claude\" width=\"832\" srcset=\"https://velvetshark.com/_next/image?url=%2Fimages%2Fai-company-logos-that-look-like-buttholes%2FVonnegut-vs-Claude.png&amp;w=1080&amp;q=75 1x, https://velvetshark.com/_next/image?url=%2Fimages%2Fai-company-logos-that-look-like-buttholes%2FVonnegut-vs-Claude.png&amp;w=1920&amp;q=75 2x\" src=\"/_next/image?url=%2Fimages%2Fai-company-logos-that-look-like-buttholes%2FVonnegut-vs-Claude.png&amp;w=1920&amp;q=75\"></div>\n<p>Both the drawing and the description in the book are unambiguous. This is not just &quot;a circular shape with a gradient&quot; anymore, is it?</p>\n<h4>It&apos;s not just AI companies</h4>\n<p>Even traditional companies aren&apos;t immune. Here are a few notable or funny examples. But the percentage of AI company logos that look like buttholes is still significanly higher than than any other industry.</p>\n<div class=\"ImageWrapper_container__inCVa\"><img alt=\"Non-AI butthole logos\" width=\"1800\" srcset=\"https://velvetshark.com/_next/image?url=%2Fimages%2Fai-company-logos-that-look-like-buttholes%2Fnon-ai-logos.png&amp;w=1920&amp;q=75 1x, https://velvetshark.com/_next/image?url=%2Fimages%2Fai-company-logos-that-look-like-buttholes%2Fnon-ai-logos.png&amp;w=3840&amp;q=75 2x\" src=\"/_next/image?url=%2Fimages%2Fai-company-logos-that-look-like-buttholes%2Fnon-ai-logos.png&amp;w=3840&amp;q=75\"></div>\n<p>I especially like the Electrolux one. It&apos;s simple, memorable, and once you see a butt and bikini, you can&apos;t unsee it.</p>\n<h2>Why does this keep happening?</h2>\n<p>There are several factors at play:</p>\n<h4>Circular design psychology</h4>\n<p>Circles represent wholeness, completion, and infinity\u0014concepts that align with AI&apos;s promise. They&apos;re also friendly and non-threatening, qualities companies desperately want to project when selling potentially job-replacing technology.</p>\n<h4>Unintentional biomimicry</h4>\n<div class=\"ImageWrapper_container__inCVa\"><img alt=\"Face on Mars\" width=\"832\" srcset=\"https://velvetshark.com/_next/image?url=%2Fimages%2Fai-company-logos-that-look-like-buttholes%2Fface-on-mars.jpg&amp;w=1080&amp;q=75 1x, https://velvetshark.com/_next/image?url=%2Fimages%2Fai-company-logos-that-look-like-buttholes%2Fface-on-mars.jpg&amp;w=1920&amp;q=75 2x\" src=\"/_next/image?url=%2Fimages%2Fai-company-logos-that-look-like-buttholes%2Fface-on-mars.jpg&amp;w=1920&amp;q=75\"></div>\n<p>The human brain finds familiar patterns in random shapes (<a href=\"https://en.wikipedia.org/wiki/Pareidolia\">pareidolia</a>), like a face on Mars, taken by the Viking 1 orbiter and released by NASA in 1976.</p>\n<p>But sometimes, designers inadvertently recreate biological forms without realizing the... anatomical implications.</p>\n<h4>The copycat effect</h4>\n<p>Once a few major players adopted the circular sphincter aesthetic, everyone followed suit. Now we have an industry where standing out means looking exactly like everyone else&apos;s butthole.</p>\n<p>Basically, the same reason <a href=\"/why-do-brands-change-their-logos-and-look-like-everyone-else\">why so many brands change their logos and look like everyone else</a>.</p>\n<div class=\"ImageWrapper_container__inCVa\"><img alt=\"Tech and fashion logos using sans serif fonts\" width=\"2483\" srcset=\"https://velvetshark.com/_next/image?url=%2Fimages%2Fwhy-do-brands-change-their-logos-and-look-like-everyone-else%2F5fb51d96d2b8eae559c71d90_tech-fashion-logos-sans-serif.png&amp;w=3840&amp;q=75 1x\" src=\"/_next/image?url=%2Fimages%2Fwhy-do-brands-change-their-logos-and-look-like-everyone-else%2F5fb51d96d2b8eae559c71d90_tech-fashion-logos-sans-serif.png&amp;w=3840&amp;q=75\"></div>\n<h4>Design by committee</h4>\n<p>Another factor is how these logos are created. Important corporate decisions involve many stakeholders. The result is often the safest, most inoffensive option, the average of everyone&apos;s opinions. In design meetings at AI companies, conversations probably sound like:</p>\n<ul>\n<li>Can we make it more futuristic?</li>\n<li>It needs to feel advanced but approachable.</li>\n<li>Let&apos;s add a subtle gradient to convey intelligence.</li>\n</ul>\n<p>No single person suggests making a logo that resembles an anus, but when everyone&apos;s feedback gets incorporated, that&apos;s what often emerges. Risk aversion in corporate environments naturally pushes designs toward familiar, &quot;safe&quot; territory, which apparently means anatomical openings.</p>\n<h2>What this says about tech branding</h2>\n<p>This phenomenon reveals something deeper about the tech industry: the fear of standing out too much. Despite claims of innovation and disruption, there&apos;s tremendous pressure to look legitimate by conforming to established visual language.</p>\n<p>When OpenAI&apos;s sphincter-like logo became successful, it created a template that said, &quot;This is what serious AI looks like.&quot; Now, any new AI company that doesn&apos;t resemble a colorful anatomical opening risks being seen as unserious or unprofessional.</p>\n<h3>Tech design trends through history</h3>\n<p>This isn&apos;t the first time tech design has gone through a conformity phase. Consider these previous waves:</p>\n<ul>\n<li><strong>1990s-2000s: 3D and Glossy</strong> - Remember when every logo needed a drop shadow and a glassy shine? Apple&apos;s aqua interface set the standard.</li>\n<li><strong>2010-2013: Skeuomorphism</strong> - Digital designs mimicking physical objects, with stitched leather textures and realistic dials.</li>\n<li><strong>2013-2018: Flat Design</strong> - Reaction to skeuomorphism brought minimal, clean interfaces with bright colors and no shadows.</li>\n<li><strong>2018-2022: Neomorphism</strong> - Soft shadows and semi-flat design creating subtle, &quot;touchable&quot; interfaces.</li>\n<li><strong>2022-Present: The Butthole Era</strong> - Circular gradients with central focal points dominating AI branding.</li>\n</ul>\n<p>Each era started with innovations that were quickly copied until the industry reached saturation point and moved on to the next trend.</p>\n<div class=\"ImageWrapper_container__inCVa\"><img alt=\"Sans serif bags\" width=\"1600\" srcset=\"https://velvetshark.com/_next/image?url=%2Fimages%2Fwhy-do-brands-change-their-logos-and-look-like-everyone-else%2F5fbf32ea6160018ba6a9cb84_sans-serif-bags.jpg&amp;w=1920&amp;q=75 1x, https://velvetshark.com/_next/image?url=%2Fimages%2Fwhy-do-brands-change-their-logos-and-look-like-everyone-else%2F5fbf32ea6160018ba6a9cb84_sans-serif-bags.jpg&amp;w=3840&amp;q=75 2x\" src=\"/_next/image?url=%2Fimages%2Fwhy-do-brands-change-their-logos-and-look-like-everyone-else%2F5fbf32ea6160018ba6a9cb84_sans-serif-bags.jpg&amp;w=3840&amp;q=75\"></div>\n<div class=\"centered\"><p><em>Logos become increasingly interchangeable (one of the bags is real, but they all look the same)</em></p></div>\n<h2>Historic logo disasters: You&apos;re not alone</h2>\n<p>AI companies can take some comfort in knowing they&apos;re not the first to face unintended anatomical comparisons. Logo history is filled with disasters but to keep this consistent with the theme of the article, here&apos;s a couple of them.</p>\n<div class=\"ImageWrapper_container__inCVa\"><img alt=\"Logo disasters\" width=\"1800\" srcset=\"https://velvetshark.com/_next/image?url=%2Fimages%2Fai-company-logos-that-look-like-buttholes%2Fother-logo-disasters.png&amp;w=1920&amp;q=75 1x, https://velvetshark.com/_next/image?url=%2Fimages%2Fai-company-logos-that-look-like-buttholes%2Fother-logo-disasters.png&amp;w=3840&amp;q=75 2x\" src=\"/_next/image?url=%2Fimages%2Fai-company-logos-that-look-like-buttholes%2Fother-logo-disasters.png&amp;w=3840&amp;q=75\"></div>\n<ul>\n<li>Zune logo, when flipped, says something different. Maybe that&apos;s one of the reasons why iPod won?</li>\n<li>Brazilian Institute of Oriental Studies is a stylized pagoda sillhouetted against the setting sun. Or so the designers wanted it to look. The final result was much more... anatomical. They since changed it to something less suggestive.</li>\n</ul>\n<p>Maybe companies should have a panel of &quot;middle schoolers&quot; on their payroll to review logos before launch. They&apos;ll find every possible inappropriate interpretation with ruthless efficiency.</p>\n<h2>Breaking free from the butthole</h2>\n<p>For companies brave enough to differentiate, here are some alternatives:</p>\n<ol>\n<li><strong>Embrace sharp angles</strong> - geometric shapes with defined edges create a distinct visual identity</li>\n<li><strong>Use negative space creatively</strong> - think FedEx arrow, not biological openings</li>\n<li><strong>Avoid radial symmetry</strong> - not everything needs to be perfectly circular</li>\n<li><strong>Skip the gradient</strong> - flat design still works</li>\n<li><strong>Test with diverse audiences</strong> - if five different people independently say &quot;that looks like a butthole,&quot; it probably does (show it to teenagers if you want to uncover even the most subtle anatomical implications)</li>\n</ol>\n<h2>Conclusion</h2>\n<p>Does this mean AI companies should change their branding? Not necessarily. The familiarity clearly works in building trust. But perhaps the next wave of AI innovation could be accompanied by some visual innovation too.</p>\n<p>For companies looking to break the mold, consider these approaches that successful tech brands have used:</p>\n<ul>\n<li><strong>Embrace meaningful abstraction</strong> - Slack&apos;s hashtag-inspired logo communicates collaboration without circular clich&#xFFFD;s</li>\n<li><strong>Leverage letterforms</strong> - Netflix&apos;s simple &quot;N&quot; has become instantly recognizable without anatomical confusion</li>\n<li><strong>Tell a story</strong> - Stripe&apos;s distinctive parallel lines reflect payment flows moving seamlessly</li>\n<li><strong>Use distinctive color combinations</strong> - Twitch&apos;s purple branding stands out in a sea of blue tech logos</li>\n</ul>\n<p>The challenge for the next generation of AI companies isn&apos;t just technological - it&apos;s finding visual language that communicates innovation without resorting to the same tired sphincter-inspired patterns.</p>\n<p><strong>PS.</strong> <em>This post is meant to be humorous, but let&apos;s not pretend there isn&apos;t a serious point here about <a href=\"/why-do-brands-change-their-logos-and-look-like-everyone-else\">the depressing sameness in modern design</a>. No actual anuses were consulted during this research, though several designers were clearly thinking about them.</em></p></div></div>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://mastodon.social/@owa/114199424779247989"],"published":["2025-03-21T10:46:38.525Z"],"mp-slug":["10-46-38"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/03/21/10-46-38"]},"references":{"https://mastodon.social/@owa/114199424779247989":{"type":["h-entry"],"properties":{"url":["https://mastodon.social/@owa/114199424779247989"],"name":["Open Web Advocacy (@owa@mastodon.social)"],"summary":["1/10 =� The � https://open-web-advocacy.org/blog/uk-regulators-final-verdict--apples-browser-engine-ban-harms-competition/"],"content":[{"html":"<body class=\"app-body theme-system custom-scrollbars no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://fediverse.zachleat.com/@zachleat/114072799841101889"],"published":["2025-02-27T10:16:37.545Z"],"mp-slug":["10-16-37"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/02/27/10-16-37"]},"references":{"https://fediverse.zachleat.com/@zachleat/114072799841101889":{"type":["h-entry"],"properties":{"url":["https://fediverse.zachleat.com/@zachleat/114072799841101889"],"name":["Zach Leatherman :11ty: (@zachleat@zachleat.com)"],"summary":["Attached: 1 image automated themed screenshot border colors"],"featured":["https://cdn.masto.host/fediversezachleatcom/media_attachments/files/114/072/797/367/820/623/original/0550a7ace24fe33e.png"],"content":[{"html":"<body class=\"app-body theme-mastodon-light no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://mastodon.social/@Daojoan/114067260426518351"],"published":["2025-02-26T09:31:20.771Z"],"mp-slug":["09-31-20"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/02/26/09-31-20"]},"references":{"https://mastodon.social/@Daojoan/114067260426518351":{"type":["h-entry"],"properties":{"url":["https://mastodon.social/@Daojoan/114067260426518351"],"name":["JA Westenberg (@Daojoan@mastodon.social)"],"summary":["Why do we talk about walled gardens? That implies something beautiful, something worth defending. It conjures images of beautifully maintained flowerbeds protected from the outside world. But that\u0019s&hellip;"],"content":[{"html":"<body class=\"app-body theme-system custom-scrollbars no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://rabbit-rabbit.quest"],"published":["2025-02-17T15:01:25.403Z"],"mp-slug":["03-01-25"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/02/17/03-01-25"]},"references":{"https://rabbit-rabbit.quest":{"type":["h-entry"],"properties":{"url":["https://rabbit-rabbit.quest"],"name":["Rabbit Rabbit"],"summary":["Rabbit Rabbit is an alternative interpretation of Geohashing. Born out of the xkcd #426 comic strip, Geohashing is a game of spontaneous adventure generation played around the world since 2008. This&hellip;"],"content":[{"html":"<div class=\"content\"> <a href=\"#\" id=\"modal-close-btn\" class=\"close\"> <svg height=\"16\" width=\"12\"> <path/> </svg> </a> <p> <span class=\"highlight\">Rabbit Rabbit</span> is an alternative interpretation of <a href=\"https://geohashing.site/\">Geohashing</a>. Born out of the <a href=\"https://xkcd.com/426/\">xkcd #426</a> comic strip, Geohashing is a game of spontaneous adventure generation played around the world since 2008. </p> <p> This alternative to Geohashing is open to a wider audience offering a bikeable and a walkable mode. This was mainly possible by recalculating a grid splitting the globe into smaller cells. Consequently the travel distance is much shorter. The result is simple but exciting: the daily geohashing locations are more easily reachable for people who cannot use, or don&apos;t want to use, cars.<br> <span class=\"highlight\">Rabbit Rabbit</span> comes in two modes which differ in the size of their grid, <em>walkable</em> and <em>bikeable</em>. </p> <p> Last but not least, instead of the daily opening price of the Dow Jones to seed the algorithm, <span class=\"highlight\">Rabbit Rabbit</span> uses the most recent CO<sub>2</sub> readings of the <a href=\"https://gml.noaa.gov/ccgg/trends/gl_data.html\"> Global Monitoring Laboratory</a>. Specifically, the smoothed value of the estimated global daily trends. Read more about the <a href=\"https://gml.noaa.gov/ccgg/mbl/crvfit/crvfit.html\"> data fitting</a>. </p> <p> <strong>Go on a quest today and discover your local area.</strong> </p> <p class=\"tiny\"> In case code is your thing, Rabbit Rabbit is open source and available on <a href=\"https://git.chdorner.com/chdorner/rabbit-rabbit\">here</a>. </p> </div>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://shademap.app/"],"published":["2025-02-17T15:01:06.862Z"],"mp-slug":["03-01-06"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/02/17/03-01-06"]},"references":{"https://shademap.app/":{"type":["h-entry"],"properties":{"url":["https://shademap.app/"],"name":["Simulate sun shadows"],"summary":["Every mountain, building and tree shadow in the world simulated for any date and time"],"featured":["https://shademap.app/og-image.png"],"content":[{"html":"<body> <div id=\"root\"> <div> <img src=\"./logo-black.svg\" alt=\"Shade Map\"> <ul> <li>Shadowmap and sunmap a house or garden</li> <li>Shadow calculator, sun position, sun path and sun exposure</li> <li>Simulate shadows cast by buildings, trees and terrain in 3D</li> <li>Sunlight and shading for sunrise and sunset photos</li> <li>Prepare a shadow study, shadow analysis or solar analysis</li> <li>No need to install or buy Google Earth Pro. Works online</li> <li>Generate shadow accumulation and shadow accrual maps</li> </ul> </div> </div> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://dice.camp/@starhawk/113945849415768787"],"published":["2025-02-17T07:07:39.491Z"],"mp-slug":["07-07-39"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/02/17/07-07-39"]},"references":{"https://dice.camp/@starhawk/113945849415768787":{"type":["h-entry"],"properties":{"url":["https://dice.camp/@starhawk/113945849415768787"],"name":["Starhawk (@starhawk@dice.camp)"],"summary":["The Internet is mostly shit these days, but every once in a great while I stumble across an incredible, passion-project website. This one is hand-animated weird art and it is worth your time as a fun&hellip;"],"content":[{"html":"<body class=\"app-body theme-default no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://heatmap.news/technology/deepseek-ai-energy-demand"],"published":["2025-02-11T12:28:47.546Z"],"mp-slug":["12-28-47"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/02/11/12-28-47"]},"references":{"https://heatmap.news/technology/deepseek-ai-energy-demand":{"type":["h-entry"],"properties":{"url":["https://heatmap.news/technology/deepseek-ai-energy-demand"],"name":["What DeepSeek Means for AI Energy Demand"],"summary":["It\u0019s complicated!"],"featured":["https://heatmap.news/media-library/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpbWFnZSI6Imh0dHBzOi8vYXNzZXRzLnJibC5tcy81NjE3ODIxNS9vcmlnaW4uanBnIiwiZXhwaXJlc19hdCI6MTc2MDUwNjU5Mn0.bctc4qAimxY6rWQj7YZKBFJxfqBJ6Ii0JrAxxT0uMjI/image.jpg?width=1200&height=600&coordinates=0%2C100%2C0%2C100"],"content":[{"html":"<div class=\"body-description\"><p class=\"drop-caps\">It took the market about a week to catch up to the fact that the Chinese artificial intelligence firm DeepSeek had released an open-source AI model that rivaled those from prominent U.S. companies such as OpenAI and Anthropic \u0014 and that, most importantly, it had managed to do so much more cheaply and efficiently than its domestic competitors. The news cratered not only tech stocks such as Nvidia, but <a href=\"https://heatmap.news/sparks/deepseek-ge-vernova-oklo-constellation\"><u>energy stocks</u></a>, as well, leading <a href=\"https://www.fool.com/investing/2025/01/29/deepseek-and-ais-efficiency-era/#:~:text=We%20are%20seeing%20some,have%20maybe%20originally%20thought.\"><u>to assumptions</u></a> that investors thought more-energy efficient AI would reduce energy demand in the sector overall. </p><p>But will it really? While some in climate world <a href=\"https://billmckibben.substack.com/p/we-interrupt-the-ongoing-crisis-for\"><u>assumed the same</u></a> and celebrated the seemingly good news, many venture capitalists, AI proponents, and analysts quickly arrived at essentially the opposite conclusion \u0014 that <a href=\"https://x.com/garrytan/status/1883037020207153580\"><u>cheaper AI</u></a> will only lead to <a href=\"https://x.com/satyanadella/status/1883753899255046301\"><u>greater demand</u></a> for AI. The resulting unfettered proliferation of the technology across a wide array of industries could thus negate the energy efficiency gains, ultimately leading to a substantial net increase in data center power demand overall.</p><p>\u001cWith cost destruction comes proliferation,\u001d Susan Su, a climate investor at the venture capital firm Toba Capital, told me. \u001cPlus the fact that it\u0019s open source, I think, is a really, really big deal. It puts the power to expand and to deploy and to proliferate into billions of hands.\u001d</p><p>If you\u0019ve seen lots of chitchat about Jevons paradox of late, that\u0019s basically what this line of thinking boils down to. After Microsoft\u0019s CEO Satya Nadella responded to DeepSeek mania by <a href=\"https://x.com/satyanadella/status/1883753899255046301\"><u>posting the Wikipedia page</u></a> for this 19th century economic theory on X, many (myself included) got a quick crash course on its origins. The idea is that as technical efficiencies of the Victorian era made burning coal cheaper, demand for \u0014 and thus consumption of \u0014 coal actually increased.</p><p>While this is a distinct possibility in the AI space, it\u0019s by no means a guarantee. \u001cThis is very much, I think, an open question,\u001c energy expert Nat Bullard told me, with regards to whether DeepSeek-type models will spur a reduction or increase in energy demand. \u001cI sort of lean in both directions at once.\u001d Formerly the chief content officer at BloombergNEF and current co-founder of the AI startup Halcyon, a search and information platform for energy professionals, Bullard is personally excited for the greater efficiencies and optionality that new AI models can bring to his business. </p><p>But he warns that just because DeepSeek was cheap to train \u0014 the company claims it cost about $5.5 million, while domestic models cost hundreds of millions or even billions \u0014 doesn\u0019t mean that it\u0019s cheap or energy-efficient to operate. \u001cTraining more efficiently does not necessarily mean that you can run it that much more efficiently,\u001d Bullard told me. When a large language model answers a question or provides any type of output, it\u0019s said to be making an \u001cinference.\u001d And as Bullard explains, \u001cThat may mean, as we move into an era of more and more inference and not just training, then the [energy] impacts could be rather muted.\u001d </p><p>DeepSeek-R1, the name for the model that caused the investor freakout, is also a newer type of LLM that uses more energy in general. Up until literally a few days ago, when OpenAI <a href=\"https://openai.com/index/openai-o3-mini/\"><u>released o3-mini</u></a> for free, most casual users were probably interacting with so-called \u001cpretrained\u001d AI models. Fed on gobs of internet text, these LLMs spit out answers based primarily on prediction and pattern recognition. DeepSeek released a model like this, called V3, in September. But last year, more advanced <a href=\"https://heatmap.news/technology/openai-o1-energy\"><u>\u001creasoning\u001d models</u></a>, which can <a href=\"https://openai.com/index/introducing-openai-o1-preview/\"><u>\u001cthink,\u001d in some sense</u></a>, started blowing up. These models \u0014 which include o3-mini, the latest version of Anthropic\u0019s Claude, and the now infamous DeepSeek-R1 \u0014 have the ability to try out different strategies to arrive at the correct answer, recognize their mistakes, and improve their outputs, allowing for significant advancements in areas such as math and coding.</p><p>But all that artificial reasoning eats up a lot of energy. As Sasha Luccioni, the AI and climate lead at Hugging Face, which makes an open-source platform for AI projects, <a href=\"https://www.linkedin.com/posts/sashaluccioniphd_to-set-things-clear-about-deepseek-sustainability-activity-7290485358968881153-wGN6?utm_source=social_share_send&amp;utm_medium=member_desktop_web\"><u>wrote on LinkedIn</u></a>, \u001cTo set things clear about DeepSeek + sustainability: (it seems that) training is much shorter/cheaper/more efficient than traditional LLMs, *but* inference is longer/more expensive/less efficient because of the chain of thought aspect.\u001d Chain of thought refers to the reasoning process these newer models undertake. Luccioni wrote that she\u0019s currently working to evaluate the energy efficiency of both the DeepSeek V3 and R1 models. </p><p>Another factor that could influence energy demand is how fast domestic companies respond to the DeepSeek breakthrough with their own new and improved models. Amy Francetic, co-founder at Buoyant Ventures, doesn\u0019t think we\u0019ll have to wait long. \u001cOne effect of DeepSeek is that it will highly motivate all of the large LLMs in the U.S. to go faster,\u001d she told me. And because a lot of the big players are fundamentally constrained by energy availability, she\u0019s crossing her fingers that this means they\u0019ll work smarter, not harder. \u001cHopefully it causes them to find these similar efficiencies rather than just, you know, pouring more gasoline into a less fuel-efficient vehicle.\u001d</p><p>In her recent <a href=\"https://climatemoney.substack.com/p/what-deepseek-means-for-energy-and\"><u>Substack post</u></a>, Su described three possible futures when it comes to AI\u0019s role in the clean energy transition. The ideal is that AI demand scales slowly enough that nuclear and renewables scale with it. The least hopeful is that immediate, exponential growth in AI demand leads to a similar expansion of fossil fuels, locking in new dirty infrastructure for decades. \u001cI think that&apos;s already been happening,\u001d Su told me. And then there\u0019s the techno-optimist scenario, linked to <a href=\"https://www.technologyreview.com/2024/09/28/1104588/sorry-ai-wont-fix-climate-change/\"><u>figures like Sam Altman</u></a>, which Su doesn\u0019t put much stock in \u0014 that AI \u001cdrives the energy revolution\u001d by helping to create new energy technologies and efficiencies that more than offset the attendant increase in energy demand. </p><p>Which scenario predominates could also depend upon whether greater efficiencies, combined with the adoption of AI by smaller, more shallow-pocketed companies, leads to a change in the scale of data centers. \u001cThere\u0019s going to be a lot more people using AI. So maybe that means we don\u0019t need these huge, gigawatt data centers. Maybe we need a lot more smaller, megawatt-size data centers,\u001d Laura Katzman, a principal at Buoyant Ventures, told me. Katzman has conducted research for the firm on <a href=\"https://www.buoyant.vc/blog/greening-the-cloud-reducing-the-energy-intensity-of-ai\"><u>data center decarbonization</u></a>. </p><p>Smaller data centers with a subsequently smaller energy footprint could pair well with <a href=\"https://heatmap.news/technology/data-center-solar-microgrids\"><u>renewable-powered microgrids</u></a>, which are less practical and economically feasible for hyperscalers. That could be a big win for solar and wind plus battery storage, Katzman explained, but a boondoggle for companies such as Microsoft, which has <a href=\"https://heatmap.news/technology/microsoft-three-mile-island-nuclear\"><u>famously committed</u></a> to re-opening Pennsylvania\u0019s Three Mile Island nuclear plant to power its data centers. \u001cBecause of DeepSeek, the expected price of compute probably doesn\u0019t justify now turning back on some of these nuclear plants, or these other high-cost energy sources,\u001d Katzman told me.</p><p>Lastly, it remains to be seen what nascent applications cheaper models will open up. \u001cIf somebody, say, in the Philippines or Vietnam has an interest in applying this to their own decarbonization challenge, what would they come up with?\u001d Bullard pondered. \u001cI don\u0019t yet know what people would do with greater capability and lower costs and a different set of problems to solve for. And that\u0019s really exciting to me.\u001d</p><p>But even if the AI pessimists are right, and these newer models don\u0019t make AI ubiquitously useful for applications from <a href=\"https://www.businesswire.com/news/home/20200811005313/en/Atomwise-Raises-123-Million-in-Series-B-Financing-Co-Led-by-B-Capital-Group-and-Sanabil\"><u>new drug discovery</u></a> to <a href=\"https://www.hdata.com/\"><u>easier regulatory filing</u></a>, Su told me that in a certain sense, it doesn&apos;t matter much. \u001cIf there was a possibility that somebody had this type of power, and you could have it too, would you sit on the couch? Or would you arms race them? I think that is going to drive energy demand, irrespective of end utility.\u001d</p><p>As Su told me, \u001cI do not think there\u0019s actually a saturation point for this.\u001d</p></div>"}],"published":["2025-02-04T21:11:08.000Z"]}}}},{"type":["h-entry"],"properties":{"like-of":["https://web.dev/blog/baseline-scrollbar-props?hl=en"],"published":["2025-02-10T11:20:08.351Z"],"mp-slug":["11-20-08"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/02/10/11-20-08"]},"references":{"https://web.dev/blog/baseline-scrollbar-props?hl=en":{"type":["h-entry"],"properties":{"url":["https://web.dev/blog/baseline-scrollbar-props?hl=en"],"name":["CSS scrollbar-color and scrollbar-gutter are Baseline Newly available | Articles | web.dev"],"summary":["CSS scrollbar-color and scrollbar-gutter have landed in all major browser engines, making it Baseline Newly available."],"featured":["https://web.dev/static/blog/baseline-scrollbar-props/image/scrollbar-styling-baseline.png"],"content":[{"html":"<devsite-content> <article class=\"devsite-article\"> <devsite-feature-tooltip class=\"devsite-page-bookmark-tooltip nocontent\" id=\"devsite-collections-dropdown\"> <devsite-bookmark></devsite-bookmark> <p> Stay organized with collections </p> <p> Save and categorize content based on your preferences. </p> </devsite-feature-tooltip> <div class=\"devsite-article-body clearfix \"> <p class=\"wd-pubdates\"> Published: Feb 1, 2025\n</p> <aside class=\"success\"> <b>Celebration:</b> This web feature is available in all three major browser engines, and is <strong>Baseline Newly available</strong> as of December 11, 2024.\n</aside> <p><devsite-iframe><iframe src=\"https://web.dev/frame/blog/baseline-scrollbar-props/index_c0c2e1162f7b19187a4c7c53efdf17d4ea1892e1511b9f28120e2550012f2460.frame\" class=\"framebox inherit-locale\"></iframe></devsite-iframe>\n<devsite-iframe><iframe src=\"https://web.dev/frame/blog/baseline-scrollbar-props/index_3f03ae8562e31e75b8e8797931930eec16251788d0cc2f113fed0d56b9d7afe1.frame\" class=\"framebox inherit-locale\"></iframe></devsite-iframe></p> <p>With the <code>scrollbar-color</code> property you can change the colors used for scrollbars. You can specify the color of the thumb and the color track with it. Using <code>scrollbar-width</code> you can opt-in to a narrower scrollbar, or even to hide the scrollbar completely without affecting scrollability.</p> <p>Learn more about scrollbars and how to style them in <a href=\"https://developer.chrome.com/docs/css-ui/scrollbar-styling\">scrollbar styling</a>.</p> </div> <devsite-thumb-rating> </devsite-thumb-rating> </article> <devsite-content-footer class=\"nocontent\"> <p>Except as otherwise noted, the content of this page is licensed under the <a href=\"https://creativecommons.org/licenses/by/4.0/\">Creative Commons Attribution 4.0 License</a>, and code samples are licensed under the <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0 License</a>. For details, see the <a href=\"https://developers.google.com/site-policies\">Google Developers Site Policies</a>. Java is a registered trademark of Oracle and/or its affiliates.</p> <p>Last updated 2025-02-01 UTC.</p>\n</devsite-content-footer> <devsite-notification>\n</devsite-notification> <p class=\"devsite-content-data\"> <template class=\"devsite-content-data-template\"> [[[&quot;Easy to understand&quot;,&quot;easyToUnderstand&quot;,&quot;thumb-up&quot;],[&quot;Solved my problem&quot;,&quot;solvedMyProblem&quot;,&quot;thumb-up&quot;],[&quot;Other&quot;,&quot;otherUp&quot;,&quot;thumb-up&quot;]],[[&quot;Missing the information I need&quot;,&quot;missingTheInformationINeed&quot;,&quot;thumb-down&quot;],[&quot;Too complicated / too many steps&quot;,&quot;tooComplicatedTooManySteps&quot;,&quot;thumb-down&quot;],[&quot;Out of date&quot;,&quot;outOfDate&quot;,&quot;thumb-down&quot;],[&quot;Samples / code issue&quot;,&quot;samplesCodeIssue&quot;,&quot;thumb-down&quot;],[&quot;Other&quot;,&quot;otherDown&quot;,&quot;thumb-down&quot;]],[&quot;Last updated 2025-02-01 UTC.&quot;],[],[]] </template> </p> </devsite-content>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://somepx.itch.io"],"published":["2025-01-30T17:55:54.438Z"],"mp-slug":["05-55-54"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/01/30/05-55-54"]},"references":{"https://somepx.itch.io":{"type":["h-entry"],"properties":{"url":["https://somepx.itch.io"],"name":["somepx"],"summary":["a bold, boxy, 10px tall pixel font!a tiny, smallcaps, 6px tall pixel font!"],"featured":["https://img.itch.zone/aW1nLzEzNDcyNjU0LnBuZw==/508x254%23mb/%2FKebc9.png"],"content":[{"html":"<div class=\"game_grid_widget base_widget user_game_grid\"><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-absolute\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzEzNDcyNjU0LnBuZw==/315x250%23c/Coz3iN.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a bold, boxy, 10px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-ark\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE1NzI0MTgxLnBuZw==/315x250%23c/eeqH56.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a tiny, smallcaps, 6px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-compass\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE2MDQzMDgxLnBuZw==/315x250%23c/4YMO%2BK.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a classic, fantasy, 9px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-corset\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE2MDc2ODI2LnBuZw==/315x250%23c/L571fS.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">an elegant, cozy, 8px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-desert\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE3NTY3NzM5LnBuZw==/315x250%23c/vGDPqp.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a tiny, drowsy, sunny, 6px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-dust\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE5NTY1OTYyLnBuZw==/315x250%23c/nBngUc.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a small, sci-fi, futuristic, 7px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-fear\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE2MDc2ODUyLnBuZw==/315x250%23c/PkVVET.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a smallcaps, horror, 11px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-futile\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE2NTkyNDMzLnBuZw==/315x250%23c/rr7x45.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a big, bold, unique, 14px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-holotype\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzEzNDcyNzYxLnBuZw==/315x250%23c/CtXYoL.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a distinctive, premium, 9px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-hungry\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE2Njk1MTYyLnBuZw==/315x250%23c/oulgLe.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a playful, unique, monospace, 7px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-kobold\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE2OTkyNTg5LnBuZw==/315x250%23c/0dsK3g.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a classic, tiny, fantasy, 7px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-manticore\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE2MTY1MTE4LnBuZw==/315x250%23c/GKTPB%2F.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a strong, metal, horror, 14px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-mask\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE3NTQ0NzMzLnBuZw==/315x250%23c/B75f22.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a gigantic, modern, monospace, 17px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-memo\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE2NTkyMzQxLnBuZw==/315x250%23c/dZyPPH.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a wacky, distinctive, 9px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-more\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE1MTkyMzk0LnBuZw==/315x250%23c/Ia9nye.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a chunky, huge, comic, 15px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-nope\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE4Mjc2NTA0LnBuZw==/315x250%23c/oNkD5Q.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a clear, readable, 8px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-outflank\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE3MjMwMDU5LnBuZw==/315x250%23c/BflLKg.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a fantasy, arcane, 9px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-passage\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE2MDc3MjkxLnBuZw==/315x250%23c/4EHIbm.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a classic, fantasy, 7px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-quit\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE2MDE3ODY0LnBuZw==/315x250%23c/26KU5J.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a round, bold, 12px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-rude\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE2MTY0ODc5LnBuZw==/315x250%23c/6kqGC%2B.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a thin, elegant, 11px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/free-font-ruler\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE4Mzg4MTE4LnBuZw==/315x250%23c/xcevao.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a FREE 9px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-saga\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE2MDg5NTc3LnBuZw==/315x250%23c/ZL%2F1nj.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a medieval, fantasy, legendary, 8px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-salty\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE2MjM5Mzg5LnBuZw==/315x250%23c/DUJdR0.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a thick, all-purpose, 9px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-sins\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE5MDMxNjM1LnBuZw==/315x250%23c/PH2mRx.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a tiny, classic, stylish, 7px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-troll\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE2NTgwNjkyLnBuZw==/315x250%23c/Ty8%2Fzw.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a fantasy, ornate, 12px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-urban\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE2MDE1NDcxLnBuZw==/315x250%23c/G%2BGthe.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a big, bold, all-purpose, 20px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-vest\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE2MjUxMzQwLnBuZw==/315x250%23c/U8KPPY.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">an elegant, classic, serif, 9px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-xerxes\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE5NTIxMTU1LnBuZw==/315x250%23c/KV2RhH.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a bold, solid, rational, 10px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-ziplock\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE2MDQyMDA3LnBuZw==/315x250%23c/2J3h3h.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a round, cheerful, comic, 13px tall pixel font!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/free-font-yolk\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE2NTMyMDk2LnBuZw==/315x250%23c/1vzb30.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">a gift from the Fairy Queen!</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-axones\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE1ODI5NzA4LnBuZw==/315x250%23c/l04Eal.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">pixel font</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-candy\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE1ODI5NzIxLnBuZw==/315x250%23c/O6Jyw0.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">pixel font</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-dollhouse\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE1ODI5NzQxLnBuZw==/315x250%23c/N%2BO8h0.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">pixel font</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-empire\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE1ODI5NzQ3LnBuZw==/315x250%23c/U46u0%2B.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">pixel font</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-equipe\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE1ODI5NzQ5LnBuZw==/315x250%23c/q8e1fQ.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">pixel font</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-grandeur\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE1ODI5NzU5LnBuZw==/315x250%23c/Keyi6T.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">pixel font</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-match\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE1ODI5NzcxLnBuZw==/315x250%23c/VE4swJ.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">pixel font</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-rank\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE1ODI5Nzg5LnBuZw==/315x250%23c/HSl0TH.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">pixel font</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-smart\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE1ODI5ODEwLnBuZw==/315x250%23c/ZNvyGj.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">pixel font</p></div></div><div class=\"game_cell has_cover lazy_images\"><div class=\"game_thumb\"><a class=\"thumb_link game_link\" href=\"https://somepx.itch.io/pixel-font-voice\"><img width=\"315\" class=\"lazy_loaded\" src=\"https://img.itch.zone/aW1nLzE1ODI5ODMyLnBuZw==/315x250%23c/KBOMFw.png\"></a></div><div class=\"game_cell_data\"><p class=\"game_text\">pixel font</p></div></div></div>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://mastodon.social/@mdn/113901386762398350"],"published":["2025-01-28T06:49:04.935Z"],"mp-slug":["06-49-04"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/01/28/06-49-04"]},"references":{"https://mastodon.social/@mdn/113901386762398350":{"type":["h-entry"],"properties":{"url":["https://mastodon.social/@mdn/113901386762398350"],"name":["MDN Web Docs (@mdn@mastodon.social)"],"summary":["JavaScript's date object has been tricky for years, but that will change soon. The NEW Temporal API brings, < Easily handle time zones =� Precise date math =R Parse ISO strings without errors \u001b&hellip;"],"content":[{"html":"<body class=\"app-body theme-system custom-scrollbars no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://nokiadesignarchive.aalto.fi"],"published":["2025-01-20T10:15:23.544Z"],"mp-slug":["10-15-23"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/01/20/10-15-23"]},"references":{"https://nokiadesignarchive.aalto.fi":{"type":["h-entry"],"properties":{"url":["https://nokiadesignarchive.aalto.fi"],"name":["Nokia Design Archive"],"summary":["Exploring unseen concepts of design and opportunities of design-driven transformation and change"],"featured":["https://nokiadesignarchive.aalto.fi/images/preview--nokia-design-archive.jpg"],"content":[{"html":"<div class=\"content\"><p id=\"datapoint-count\" class=\"graph-control\"><span id=\"selected-count\"></span><b id=\"total-count\"></b> <span>entries</span></p><a id=\"link-aalto\" href=\"https://www.aalto.fi/en/nokia-design-archive\"><img src=\"./images/logo-aalto.png\" alt=\"Aalto University logo\" width=\"100\" height=\"auto\"></a></div>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["http://estacions.albertguillaumes.cat"],"published":["2025-01-16T10:32:04.032Z"],"mp-slug":["10-32-04"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/01/16/10-32-04"]},"references":{"http://estacions.albertguillaumes.cat":{"type":["h-entry"],"properties":{"url":["http://estacions.albertguillaumes.cat"],"name":["Estacions i intercanviadors"],"summary":["Una galeria de perspectives amb la topologia de diverses estacions de metro d'Europa."],"featured":["http://estacions.albertguillaumes.cat/img/barcelona/collblanc.png"],"content":[{"html":"<div class=\"row\" id=\"llista_com\"> <div class=\"col-12 d-none\" id=\"com_Alacant\"> <p>El TRAM d&apos;Alacant, el tren-tram propietat de la Generalitat Valenciana, disposa d&apos;un tram subterrani amb tres estacions al centre de la ciutat, totes elles diferents. Aquestes tres estacions disposen de les andanes al nivell -2, mentre que el nivell -1 est&#xFFFD; reservat als vest&#xFFFD;buls. Les estacions d&apos;Estels (Luceros) i Mercat tenen acc&#xFFFD;s directe als aparcaments subterranis situats sobre els t&#xFFFD;nels del TRAM.</p> </div> <div class=\"col-12 d-none\" id=\"com_Amsterdam\"> <p>Actualment el metro d&apos;Amsterdam t&#xFFFD; dos grups de l&#xFFFD;nies diferenciats. Per una banda hi ha la l&#xFFFD;nia Nord-Sud, inaugurada fa poc i per on hi discorren els trens de la l&#xFFFD;nia M52. Al tram central, la via est&#xFFFD; soterrada a una certa profunditat, amb un t&#xFFFD;nel independent per cada via. L&apos;altre grup de l&#xFFFD;nies est&#xFFFD; format pels serveis M50, M51, M53 i M54, que circulen majorit&#xFFFD;riament en superf&#xFFFD;cie, per vies paral&#xFFFD;leles als ferrocarrils neerlandesos. La part m&#xFFFD;s c&#xFFFD;ntrica d&apos;aquest grup de l&#xFFFD;nies est&#xFFFD; soterrada a poca profunditat. Aquestes estacions solen tenir una andana central al nivell -2 i un o dos vest&#xFFFD;buls al nivell -1. La resta d&apos;estacions de metro s&#xFFFD;n en superf&#xFFFD;cie o viaducte i tenen una andana central.</p> <p>Tenint en compte que la majoria de l&#xFFFD;nies circulen paral&#xFFFD;lelament al ferrocarril, els intercanviadors entre aquests dos mitjans de transprt s&#xFFFD;n r&#xFFFD;pids.</p> </div> <div class=\"col-12 d-none\" id=\"com_Anvers\"> <p>Anvers t&#xFFFD; premetro (tramvia soterrat) des de 1975. Un dels objectius era creuar el riu Escalda i fer arribar el tramvia al marge esquerre.</p> <p>La xarxa consta de dos grups de l&#xFFFD;nies. El primer grup el forma la l&#xFFFD;nia que comen&#xFFFD;a a Linkeroever, va al centre hist&#xFFFD;ric i continua a l&apos;Sportpaleis, amb un ramal a Plantin, tot formant un triangle prop de l&apos;estaci&#xFFFD; ferrovi&#xFFFD;ria. El segon t&#xFFFD;nel va ser obert el 2015, i va del centre hist&#xFFFD;ric cap a l&apos;est de la ciutat. La majoria d&apos;estacions encara no estan completades.</p> <p>Ara mateix hi ha un sol macrointercanviador format per l&apos;estaci&#xFFFD; ferrovi&#xFFFD;ria central i les estacions de premetro Astrid i Diamant. Entre aquestes dues estacions hi ha el triangle ferroviari esmentat abans i un aparcament subterrani de bicicletes. Com que els t&#xFFFD;nels estan constru&#xFFFD;ts amb est&#xFFFD;ndards de metro, les vies no es poden tallar i hi ha salts de molt&#xFFFD;. Per aquest motiu les andanes del t&#xFFFD;nel hist&#xFFFD;ric es troben en dos nivells tant a Astrid com a Diamant.</p> </div> <div class=\"col-12 d-none\" id=\"com_Barcelona\"> <p>Barcelona &#xFFFD;s la reina dels passadissos llargs. Fins el 1995, any en que es va inaugurar la L2, totes les estacions de correspond&#xFFFD;ncia tenien passadissos que superaven els 100 m, tret de Sagrera i Catalunya (aquest &#xFFFD;ltim per poc).</p> <p>Hi ha diversos motius que expliquen la construcci&#xFFFD; de passadissos tan llargs: per una banda hi ha la manca de planifciaci&#xFFFD; o la visi&#xFFFD; del metro com a l&#xFFFD;nies individuals i no com una xarxa colectiva: les estacions d&apos;Urquinaona de la L1 i la L4 es van obrir el 1932, per&#xFFFD; eren operades per companyies diferents. El passad&#xFFFD;s no es va obrir fins el 1973. L&apos;estaci&#xFFFD; de Pla&#xFFFD;a de Sants de la L5 es va intentar construir tan a prop com fos possible de l&apos;estaci&#xFFFD; de la L1, oberta 43 anys abans, per&#xFFFD; tot i aix&#xFFFD; els separen uns 150 m i les vies d&apos;ADIF. </p> <p>D&apos;altra banda, als anys 60 i 70 es va prerir que les estacions de correspond&#xFFFD;ncia estiguessin separades uns 100-150 m, de manera que constru&#xFFFD;nt accessos a cada extrem de l&apos;estaci&#xFFFD;, s&apos;incrementava l&apos;accessibilitat. Estacions com Verdaguer, Sants Estaci&#xFFFD; o Diagonal/Proven&#xFFFD;a en s&#xFFFD;n exemples.</p> <p>Els intercanviadors oberts a partir dels anys 80 solen tenir les l&#xFFFD;nies m&#xFFFD;s juntes. Amb la inaguraci&#xFFFD; de la L9, i a causa de la seva profunditat, hi ha un nou tipus de transbordament vertical, que sol unir els vest&#xFFFD;buls i les andanes de la L9 amb escales autom&#xFFFD;tiques o amb ascensors (aquests &#xFFFD;ltims quan estan a molta profunditat).</p> <p>Pel que fa a la topologia de les estacions, les estacions barcelonines solen ser senzilles: generalment al nivell -1 hi ha els vest&#xFFFD;buls (un o dos) i al nivell -2 hi ha andanes laterals, tot i que des del 2000 es prefereixen les andanes centrals. En cas que l&apos;estaci&#xFFFD; sigui d&apos;enlla&#xFFFD;, normalment es fa passant pel vest&#xFFFD;bul (sense passar per validadores, excepte si es canvia de companyia) i no directament de les andanes.</p> <p>Tot i aix&#xFFFD;, si hi ha un tipus cl&#xFFFD;ssic d&apos;estaci&#xFFFD; de Barcelona s&#xFFFD;n les estacions amb dues andanes laterals i una central. L&apos;objectiu era fer pujar els passatgers per les andanes laterala i fer-los baixar per la central (o al rev&#xFFFD;s), evitant aix&#xFFFD; el creuament dels viatgers que entren i surten. Aquest concepte es coneix com a <a href=\"https://ca.wikipedia.org/wiki/Soluci%C3%B3_Barcelona\"><em>soluci&#xFFFD; Barcelona</em></a>. Tot i que no va ser el primer metro en tenir una estaci&#xFFFD; amb aquesta configuraci&#xFFFD;, a Barcelona va ser com&#xFFFD; construir estacions d&apos;aquesta manera entre els anys 30 i els anys 50.</p> </div> <div class=\"col-12 d-none\" id=\"com_Berl&#xFFFD;n\"> <p>L&apos;U-Bahn i l&apos;S-Bahn s&#xFFFD;n les dues xarxes de metro de Berl&#xFFFD;n. La primera &#xFFFD;s propietat de la ciutat i la segona &#xFFFD;s dels ferrocarrils alemanys. L&apos;S-Bahn generalment circula en superf&#xFFFD;cie o en viaducte i l&apos;U-Bahn en t&#xFFFD;nel, tot i que no sempre &#xFFFD;s aix&#xFFFD;.</p> <p>Es pot dir que els t&#xFFFD;nels de les l&#xFFFD;nies m&#xFFFD;s antigues s&#xFFFD;n molt superficials, de manera que en moltes estacions, les escales dels accessos van directament a l&apos;andana. Les l&#xFFFD;nies construides despr&#xFFFD;s de la Primera Guerra Mundial solen ser una mica m&#xFFFD;s profundes, de manera que entre les andanes i el carrer hi ha espai per posar un nivell amb un vest&#xFFFD;bul.</p> <p>A Berl&#xFFFD;n hi predominen les estacions amb andanes centrals. Com que s&#xFFFD;n superficials i les andanes s&#xFFFD;n centrals, els intercanviadors solen ser bastant senzills i molt curts. Hi ha molts intercanviadors que tenen un disseny tipus sandwich.</p> </div> <div class=\"col-12 d-none\" id=\"com_Bilbao\"> <p>Tot i que el metro de Bilbao va ser inaugurat el 1995, una part del seu tra&#xFFFD;at ha estat reaprofitat d&apos;antigues l&#xFFFD;nies ferrovi&#xFFFD;ries d&apos;ample m&#xFFFD;tric, com la Bilbao - Plentzia. El metro de Bilbao &#xFFFD;s operat per dues operadores diferents: Metro Bilbao opera les l&#xFFFD;nies 1 i 2, mentre que Euskotren opera la l&#xFFFD;nia 3 juntament amb les l&#xFFFD;nies E1, E3 i E4 de rodalia, amb les quals comparteix vies.</p> <p>Degut a l&apos;orografia de la zona, i a la tipologia d&apos;estacions &#xFFFD;s molt variada. Les estacions del centre solen estar a bastanta profunditat, tant pel fet d&apos;haver de travessar el Nerbion per sota, com per haver de superar els turons amb forta pendent formats entre els meandres. Les estacions de la l&#xFFFD;nia de Plentzia solen ser en superf&#xFFFD;cie, ja que el tra&#xFFFD;at de l&apos;antic carrilet tamb&#xFFFD; ho era.</p> <p>En el cas de la l&#xFFFD;nia 3, s&apos;han aprofitat les antigues estacions de Bilbao-Aduana (Zazpikaleak/Casco Viejo) i Matiko, amndues de l&apos;antiga l&#xFFFD;nia Bilbao - Plentzia, si b&#xFFFD; el tra&#xFFFD;at entre aquestes estacions es fa a trav&#xFFFD;s d&apos;un t&#xFFFD;nel nou.</p> <p>Els tipus de transbordament s&#xFFFD;n bastant variats. En el cas d&apos;Ametzola i Lutxana, es pot transbordar molt r&#xFFFD;pidament segons el sentit en que es viatgi.</p> </div> <div class=\"col-12 d-none\" id=\"com_Boston\"> <p class=\"alert\"> L&apos;autor no ha estat mai a Boston. Tota la informaci&#xFFFD; ha estat treta a partir d&apos;esbossos d&apos;estacions de Wikimedia Commons, aix&#xFFFD; com de fotografies i v&#xFFFD;deos penjats a internet. </p> <p>Les quatre l&#xFFFD;nies que passen pel centre s&#xFFFD;n centenaries. Tres d&apos;aquestes van ser obertes com l&#xFFFD;nies de tramvia que discorrien en t&#xFFFD;nel pel centre de la ciutat. Dues d&apos;aquestes s&apos;han reconvertit en metro est&#xFFFD;ndard, de manera que la l&#xFFFD;nia verda &#xFFFD;s la &#xFFFD;nica que continua operant-se com un tramvia subterrani.</p> <p>L&apos;antiguitat de les estacions i el fet que inicialment algunes fossin l&#xFFFD;nies de tramvia, fa que la topologia d&apos;algunes estacions cridi l&apos;atenci&#xFFFD;. Per una banda, s&apos;observa que algunes estacions de la l&#xFFFD;nia taronja tenen les andanes esglaonades. A l&apos;estaci&#xFFFD; State cal sumar-hi que cada andana es troba en un nivell diferent.</p> <p>En general, les estacions s&#xFFFD;n molt superficials. Aix&#xFFFD; s&apos;observa a l&apos;estaci&#xFFFD; Downtown Crossing, on l&apos;andana de la l&#xFFFD;nia verda t&#xFFFD; una forma peculiar. El motiu d&apos;aix&#xFFFD; &#xFFFD;s que la via d&apos;anada discorria per sota d&apos;un carrer estret i la de tornada en passava per sota d&apos;un altre. La zona es va reurbanitzar fa unes quantes d&#xFFFD;cades, per&#xFFFD; el tra&#xFFFD;at dels t&#xFFFD;nels es mant&#xFFFD;.</p> <p>Tractant-se d&apos;una xarxa no planificada i que les l&#xFFFD;nies que van ser construides i operades per companyies diferents, crida l&apos;atenci&#xFFFD; que els transbordaments siguin curts.</p> </div> <div class=\"col-12 d-none\" id=\"com_Brussel&#xFFFD;les\"> <p>El metro de Brussel&#xFFFD;les &#xFFFD;s un metro ben planificat. Es va planificar a finals dels anys 60 i s&apos;han anat constru&#xFFFD;nt 4 l&#xFFFD;nies, de la seg&#xFFFD;ent manera: si el tram constru&#xFFFD;t no &#xFFFD;s gaire llarg, s&apos;obre com una l&#xFFFD;nia de premetro (tramvia subterrani), amb rampes que conecten el t&#xFFFD;nel amb la xarxa de tramvia en superf&#xFFFD;cie. Quan la construcci&#xFFFD; de la l&#xFFFD;nia est&#xFFFD; m&#xFFFD;s avan&#xFFFD;ada, es treuen les rampes d&apos;acc&#xFFFD;s i ja s&apos;explota com una l&#xFFFD;nia de metro, amb material m&#xFFFD;bil de metro. Actualment dues d&apos;aquestes l&#xFFFD;nes s&#xFFFD;n de metro <em>pur</em> (l&#xFFFD;nies 1/5 i 2/6) i dues s&#xFFFD;n de premetro (tramvies 3/4 i tramvia 7).</p> <p>Com que tota la xarxa s&apos;ha anat constru&#xFFFD;nt sobre el mateix pla, les estacions tamb&#xFFFD; estan ben dissenyades, atenent a les modificacions previstes sobre el pla. Aix&#xFFFD; doncs, gaireb&#xFFFD; tots els intercanviadors s&#xFFFD;n de transbordament curt: Beekkant i Gare du Midi s&#xFFFD;n cross-platform, Arts-Loi, Montgomery i Rogier s&#xFFFD;n tipus sandwich. Nom&#xFFFD;s fallen l&apos;estaci&#xFFFD; De Brouck&#xFFFD;re i la Gare Centrale, que tenen passadissos llargs.</p> <p>Les estacions solen tenir les andanes al nivell -2. El nivell -1 es reserva al vest&#xFFFD;bul. Les estacions de la l&#xFFFD;nia nord-sud (tramvies 3/4) estan construides amb la soluci&#xFFFD; Barcelona, amb embarcament per l&apos;andana central (excepte a Gare du Midi, on &#xFFFD;s al rev&#xFFFD;s)</p> <p>Per combatre el frau, fa uns deu anys es van comen&#xFFFD;ar a equipar les estacions amb torniquets (fins llavors hi havia un sistema d&apos;honor), per&#xFFFD; degut a la complexitat d&apos;algunes estacions c&#xFFFD;ntriques, no totes les estacions en tenen instal&#xFFFD;lades.</p> </div> <div class=\"col-12 d-none\" id=\"com_Bucarest\"> <p>El metro de Bucarest consta de 5 l&#xFFFD;nies, encara que les l&#xFFFD;nies M1 i M3 comparteixen vies en bona part del recorregut. El pla original dels anys 70 consistia en construir tres l&#xFFFD;nies: una est-oest (M3 i part sud de la M1), una nord-sud (M2) i una circular d&apos;uns 40 km de longitud.</p> <p>A difer&#xFFFD;ncia dels metros d&apos;altres pa&#xFFFD;sos de l&apos;&#xFFFD;rbita comunista, el de Bucarest no va ser construit a gran profunditat, sin&#xFFFD; constru&#xFFFD;t amb el m&#xFFFD;tode cut-and-cover. Les andanes de les estacions es troben generalment al nivell -1 o -2 i consten d&apos;andanes centrals, encara que algunes de la l&#xFFFD;nia M1 tenen andanes laterals.</p> </div> <div class=\"col-12 d-none\" id=\"com_Budapest\"> <p>Al metro de Budapest cal separar la l&#xFFFD;nia 1 de la resta de l&#xFFFD;nies. La l&#xFFFD;nia 1 va ser inaugurada el 1896, esdevenint aix&#xFFFD; la tercera ciutat europea en tenir metro, despr&#xFFFD;s de Londres i Glasgow. Tal i com passa amb els metros d&apos;aquesta &#xFFFD;poca, el g&#xFFFD;lib dels t&#xFFFD;nels &#xFFFD;s molt redu&#xFFFD;t. Els trens nom&#xFFFD;s fan 2,60 m d&apos;altura i 30 m de llarg. El t&#xFFFD;nel va ser constru&#xFFFD;t amb el m&#xFFFD;tode cut-and-over, de manera que les estacions s&#xFFFD;n molt superficials. Les estacions consten de dues andanes laterals.</p> <p>Les l&#xFFFD;nies 2 i 3 tenen estil m&#xFFFD;s sovi&#xFFFD;tic, si b&#xFFFD; l&apos;ornamentaci&#xFFFD; de les estacions no t&#xFFFD; res a veure. La l&#xFFFD;nia 4 &#xFFFD;s de construcci&#xFFFD; recent. En aquestes l&#xFFFD;nies, les vides discorren en dos t&#xFFFD;nels paral&#xFFFD;lels a for&#xFFFD;a profunditat. Les estacions consten d&apos;andanes centrals, en dues naus diferents, connectades a trav&#xFFFD;s d&apos;un sol tram llarg d&apos;escales mec&#xFFFD;nques fins a un vest&#xFFFD;bul situat a peu de carrer o a un pis sota terra. En cas que tinguin el vest&#xFFFD;bul subterrani, normalment en surten escalinates que porten directament a les andanes de tramvia.</p> <p>Als extrems de la l&#xFFFD;nia 3, les vies circulen en un sol t&#xFFFD;nel a poca profunditat. Les estacions disposen d&apos;un o dos vest&#xFFFD;buls al nivell -1 i de dues andanes laterals al nivell</p> <p>Els transbordaments difereixen molt entre estaci&#xFFFD; i estaci&#xFFFD;. A De&#xFFFD;k Ferenc T&#xFFFD;r i K&#xFFFD;klvin T&#xFFFD;r, els transbordaments s&#xFFFD;n bastant r&#xFFFD;pids, consistint de dos trams d&apos;escales separats per un passad&#xFFFD;s curt. En altres estacions, la topologia dep&#xFFFD;n bastant de la profunditat de cada l&#xFFFD;nia, tot i que a K&#xFFFD;leti p&#xFFFD;lyaudvar s&apos;ha de fer el transbordament passant pel vest&#xFFFD;bul.</p> </div> <div class=\"col-12 d-none\" id=\"com_Buenos Aires\"> <p class=\"alert\"> L&apos;autor no ha estat mai a Buenos Aires. Tota la informaci&#xFFFD; ha estat treta de licitacions d&apos;obres, fotografies i v&#xFFFD;deos penjats a internet. </p> <p>El Subte de Buenos Aires &#xFFFD;s el m&#xFFFD;s antic d&apos;Am&#xFFFD;rica del Sud. Consta de 6 l&#xFFFD;nies, 4 de les quals s&#xFFFD;n radials i m&#xFFFD;s o menys paral&#xFFFD;leles entre si (est-oest) i dues l&#xFFFD;nies transversals (nord-sud).</p> <p>El 100% de la xarxa &#xFFFD;s subterr&#xFFFD;nia i tret de la l&#xFFFD;nia H, que &#xFFFD;s de construcci&#xFFFD; recent, els t&#xFFFD;nels s&#xFFFD;n superficials. La majoria d&apos;estacions tenen andanes laterals, per&#xFFFD; aquelles que en algun moment han estat terminals poden tenir tamb&#xFFFD; andanes centrals.</p> <p>Al nivell inferior hi ha situades les andanes. Si hi ha espai suficient entre el carrer i les andanes, hi ha un vest&#xFFFD;bul en un nivell intermedi, comunicat per escalinates i escales autom&#xFFFD;tiques de pujada des del nivell andana. A les estacions m&#xFFFD;s superficials, els vest&#xFFFD;buls es troben al nivell de les andanes, fent impossible el canvi d&apos;andana sense passar pel carrer.</p> <p>Una particularitat del Subte &#xFFFD;s que els noms de les estacions s&#xFFFD;n indepedents per a cada l&#xFFFD;nia. Aix&#xFFFD; doncs, una mateixa estaci&#xFFFD; de correspond&#xFFFD;ncia t&#xFFFD; noms diferents per a cadascuna de les l&#xFFFD;nies que hi passen. Tamb&#xFFFD; passa la situaci&#xFFFD; contr&#xFFFD;ria: hi ha estacions amb el mateix nom en l&#xFFFD;nies diferents, que no tenen res a veure l&apos;una amb l&apos;altra (com Callao i Pueyrred&#xFFFD;n, noms presents a les l&#xFFFD;nies B i D).</p> </div> <div class=\"col-12 d-none\" id=\"com_Copenhaguen\"> <p>El metro de Copenhaguen &#xFFFD;s un metro modern. Com a tal, ha estat dissenyat pensat amb la usabilitat i la comoditat dels passatgers. La majoria d&apos;estacions subterr&#xFFFD;nies fan la mateixa pinta: vest&#xFFFD;bul al nivell -1, repl&#xFFFD; al nivell -2 i andana central al nivell -3. Del vest&#xFFFD;bul a les andanes nom&#xFFFD;s s&apos;hi pot anar amb escales mec&#xFFFD;niques o ascensor. Les de pujada estan separades de les de baixada.</p> <p>Els transbordaments es fan des del nivell vest&#xFFFD;bul a Kongens Nytorv i a Frederiksberg, per&#xFFFD; no a N&#xFFFD;rreport, on es fa des de l&apos;andana i el transbordament &#xFFFD;s gaireb&#xFFFD; directe fins a l&apos;S-tog i als trens regionals.</p> </div> <div class=\"col-12 d-none\" id=\"com_Frankfurt\"> <p>El metro de Frankfurt, tot i que oficialment se l&apos;anomena U-Bahn (l&apos;equivalent a un metro), t&#xFFFD;cnicament &#xFFFD;s un Stadtbahn (premetro o tramvia subterrani), encara que el material m&#xFFFD;bil i les andanes siguin de pis alt. Juntament amb l&apos;U-Bahn, l&apos;S-Bahn tamb&#xFFFD; forma part de la xarxa b&#xFFFD;sica de transport de la ciutat.</p> <p>Els principals intercanviadors de la ciutat permeten transbordaments r&#xFFFD;pids entre les diferents l&#xFFFD;nies ferrovi&#xFFFD;ries. Hi ha transbords tipus <em>sandwich</em> a tots els intercanviadors principals. Fins i tot, a l&apos;estaci&#xFFFD; Hauptwache, es permet fer un transbordament cross-platform entre l&apos;S-Bahn i les l&#xFFFD;nies U6 i U7 de l&apos;U-Bahn.</p> </div> <div class=\"col-12 d-none\" id=\"com_Glasgow\"> <p>El metro de Glasgow &#xFFFD;s un dels metros m&#xFFFD;s peculiars del m&#xFFFD;n. Va ser obert el 1896 com una l&#xFFFD;nia circular, impulsat per cable, igual que els tramvies de San Francisco. El metro es va renovar totalment entre 1977 i 1980, per canviar el sistema de tracci&#xFFFD;, construir cotxeres noves, recol&#xFFFD;locar estacions i reformar la resta d&apos;estacions a est&#xFFFD;ndards propis del segle XX.</p> <p>Abans de la remodelaci&#xFFFD; totes les estacions tenien una andana central bastant estreta. Des de l&apos;extrem de l&apos;andana en sortien unes escales que conduien cap al vest&#xFFFD;bul i la sortida. Les andanes permetien l&apos;aturada de trens de dos cotxes. Avui en dia es mant&#xFFFD; aquesta estructura en la majoria d&apos;estacions, encara que algunes han incorporat escales autom&#xFFFD;tiques entre el vest&#xFFFD;bul i el carrer. Les estacions m&#xFFFD;s transitades van ser renovades totalment: a Buchanan Street se li va afegir una andana lateral. St Enoch es va suprimir l&apos;andana central i se&apos;n van construir dues de laterals. L&apos;estaci&#xFFFD; Partick va ser constru&#xFFFD;da durant la renovaci&#xFFFD; del metro, per permetre un transbordament r&#xFFFD;pid amb ScotRail.</p> </div> <div class=\"col-12 d-none\" id=\"com_Hannover\"> <p>Hannover disposa d&apos;un sistema d&apos;<i>Stadtbahn</i>, que seria l&apos;equivalent d&apos;un pre-metro en altres pa&#xFFFD;sos: un tramvia que &#xFFFD;s subterrani al centre de la ciutat.</p> <p>Al centre disposa de tres t&#xFFFD;nels (A, B i C), que es creuen a l&apos;estaci&#xFFFD; de Kr&#xFFFD;pcke, una veritable obra civil. Entre Kr&#xFFFD;pcke i Aegidientorplatz les l&#xFFFD;nies B i C van sobreposades.</p> <p>El disseny de les estacions &#xFFFD;s senzill: estacions subterr&#xFFFD;nies amb un vest&#xFFFD;bul al nivell -1 i andanes laterals al nivell -2.</p> </div> <div class=\"col-12 d-none\" id=\"com_Li&#xFFFD;\"> <p>Les l&#xFFFD;nies englobades a la xarxa de metro de Li&#xFFFD; s&#xFFFD;n bastant diferents, tant hist&#xFFFD;ricament com t&#xFFFD;cnicament. La l&#xFFFD;nia A circula amb pneum&#xFFFD;tics i t&#xFFFD; conducci&#xFFFD; manual. Les l&#xFFFD;nies B i D tamb&#xFFFD; circulen amb pneum&#xFFFD;tics per&#xFFFD; tenen conducci&#xFFFD; autom&#xFFFD;tica (la B des del 2022 i la D des d&apos;origen). La l&#xFFFD;nia C aprofita el tra&#xFFFD;at d&apos;un antic funicular, i per poder circular per pendents de fins el 1760 (en un metro rarament se superen les rampes del 400) utilitza cremallera entre H&#xFFFD;tel de Ville i Croix Rousse.</p> <p>A les l&#xFFFD;nies A i B el metro circula molt superficialment, fins al punt que la l&#xFFFD;nia A creua el Roina per sobre, amagat dins del calaix del pont Morand. Les estacions d&apos;aquestes l&#xFFFD;nies solen constituir un sol nivell amb andanes laterals. Algunes estacions tenen un pas inferior que connecten els dos nivells. La l&#xFFFD;nia D circula lleugerament a una cota m&#xFFFD;s inferior que les l&#xFFFD;nies A i B, de manera que les andanes solen quedar a un nivell -2 i el vest&#xFFFD;bul al nivell -1. Aquesta situaci&#xFFFD; tamb&#xFFFD; es dona al tram oriental de la l&#xFFFD;nia A.</p> <p>A Li&#xFFFD; hi havia un sistema d&apos;honor fins fa una quinzena d&apos;anys. Tenint en compte que les estacions superficials solen tenir entrades secund&#xFFFD;ries, &#xFFFD;s normal veure diverses validadores al llarg de les andanes.</p> <p>Els transbordaments solen ser bastant eficients i curts: H&#xFFFD;tel de Ville, Saxe-Gambetta o Charpennes s&#xFFFD;n exemples bons. Els transbordaments metro-SNCF de Perrache i Part-Dieu tenen passadissos llargs.</p> </div> <div class=\"col-12 d-none\" id=\"com_Lisboa\"> <p>Actualment el metro de Lisboa t&#xFFFD; quatre l&#xFFFD;nies. Fins a mitjan anys 90 la xarxa estava formada per una sola l&#xFFFD;nia amb forma d&apos;Y. Aquesta l&#xFFFD;nia es va partir en tres i es va obrir la l&#xFFFD;nia vermella.</p> <p>Aix&#xFFFD; doncs, la totalitat dels intercanviadors metro-metro a Lisboa tenen menys de 25 anys. Pel que fa a la topologia de les estacions, hi ha bastanta varietat: a Baixa-Chiado i Campo Grande les andanes s&#xFFFD;n paral&#xFFFD;leles. A Saldanha, S&#xFFFD;o Sebasti&#xFFFD;o o Oriente s&apos;hi poden fer transbordaments r&#xFFFD;pids. En canvi, hi ha estacions com Alameda o Entre Campos on el transbordament &#xFFFD;s m&#xFFFD;s llarg.</p> <p>El disseny est&#xFFFD;ndard de les estacions construides abans de la Revoluci&#xFFFD; dels Clavells &#xFFFD;s de dues estacions amb andanes laterals al nivell -2 i un vest&#xFFFD;bul al nivell -1. Anys m&#xFFFD;s tard, s&apos;han ampliat les andanes fins aproximadament uns 100 m, equipant les estacions amb vest&#xFFFD;buls secundaris. Les estacions m&#xFFFD;s modernes solen tenir un vest&#xFFFD;bul i estan a m&#xFFFD;s profunditat.</p> </div> <div class=\"col-12 d-none\" id=\"com_Londres\"> <p>El metro de Londres, el m&#xFFFD;s antic del m&#xFFFD;n, consisteix en dues xarxes diferenciades: les <i>sub-surface lines</i> i les <i>deep tube lines</i>. &#xFFFD;s a dir: les l&#xFFFD;nies superficials i les profundes amb els t&#xFFFD;nels i trens de secci&#xFFFD; circular.</p> <p>Les <i>sub-surface lines</i> s&#xFFFD;n les hereves del Metropolitan Railway i del District Railway, les l&#xFFFD;nies originals superficials, construides amb el m&#xFFFD;tode cut-and-cover (al centre) o en superf&#xFFFD;cie (als suburbis) i operades amb locomotores de vapor. Les estacions consten d&apos;un edifici de viatgers i unes andanes situades al nivell -1, sempre que fos possible a l&apos;interior d&apos;una illa de cases. Les mes c&#xFFFD;ntriques tenien unes marquesines que cobrien la totalitat de les andanes (encara visibles a Paddington, Bayswater o Earl&apos;s Court). Amb l&apos;electrificaci&#xFFFD; de les l&#xFFFD;nies i l&apos;especulaci&#xFFFD; immobili&#xFFFD;ria, la majoria d&apos;estacions s&apos;han anat cobrint amb lloses de formig&#xFFFD;, essent les m&#xFFFD;s recents Gloucester Road o Mansion House a finals del s.XX.</p> <p>Les <i>deep tube lines</i>, van ser comen&#xFFFD;ades a dissenyar i construir a finals del s.XIX, quan els m&#xFFFD;todes constructius de t&#xFFFD;nels no estaven gaire desenvolupats, i ja van ser pensats per ser operats amb trens el&#xFFFD;ctrics. Es va optar per construir els t&#xFFFD;nels a aproximadament 20 m de profunditat. Les estacions consten d&apos;un edifici de viatgers, que connecten amb les andanes (normalment andanes centrals) mitjan&#xFFFD;ant dos o tres pous, en els quals hi ha ascensors de gran capacitat o escales de cargol. L&apos;any 1913 es va fer una prova per instal&#xFFFD;lar una s&#xFFFD;rie d&apos;escales autom&#xFFFD;tiques entre les andanes i la superf&#xFFFD;cie. Com que el resultat va ser positiu, es va decidir abandonar la construcci&#xFFFD; d&apos;estacions amb ascensors i progressivament es van anar modificant les estacions amb m&#xFFFD;s aflu&#xFFFD;ncia per encabir-hi escales autom&#xFFFD;tiques.</p> <p>El fet que inicialment cada l&#xFFFD;nia fos operada per una companyia ferrovi&#xFFFD;ria diferent, no garantia la possibilitat de transbordar sense sortir al carrer. Aix&#xFFFD; es va anar corregint despr&#xFFFD;s de la nacionalitzaci&#xFFFD; dels transports urbans.</p> <p>El flux de viatgers que mouen alguns intercanviadors ha obligat a crear galeries m&#xFFFD;s amplies i a que les estacions de transbordament tinguin passadissos unidireccionals i vest&#xFFFD;buls nom&#xFFFD;s d&apos;entrada o sortida, com a Oxford Circus o Victoria.</p> </div> <div class=\"col-12 d-none\" id=\"com_Madrid\"> <p>T&#xFFFD;cnicament, les l&#xFFFD;nies del metro de Madrid se subdivideixen en dos: les de g&#xFFFD;lib estret (1-5 i Ramal) i les de g&#xFFFD;lib ample (6-12). Les de g&#xFFFD;lib estret, les primeres en ser constru&#xFFFD;des, van ser inspirades amb el metro de Par&#xFFFD;s i per tant les estacions solen tenir andanes laterals al nivell -2 i un vest&#xFFFD;bul al nivell -1, tot i que en algunes estacions s&apos;han constru&#xFFFD;t vest&#xFFFD;buls secundaris aprofitant allargaments d&apos;andanes.</p> <p>Les primeres l&#xFFFD;nies de g&#xFFFD;lib ample van ser constru&#xFFFD;des amb la voluntat de ser m&#xFFFD;s espaioses. A m&#xFFFD;s a m&#xFFFD;s, tenen la caracter&#xFFFD;stica que circulen a m&#xFFFD;s profunditat, entre 15 i 25 m sota el nivell del carrer. Des del carrer fins les andanes hi pot haver entre 3 i 5 trams d&apos;escales autom&#xFFFD;tiques, amb un distribuidor d&apos;andana i el vest&#xFFFD;bul pel mig. Aix&#xFFFD; doncs, el temps d&apos;acc&#xFFFD;s a les andanes &#xFFFD;s molt m&#xFFFD;s llarg que en estacions de g&#xFFFD;libd estret.</p> <p>No obstant, des dels anys 90, s&apos;ha tendit a construir les noves estacions amb un disseny estandaritzat, on les vies no estan ubicades a tanta profunditat.</p> <p>Pel que fa a la tipologia de transbordaments, n&apos;hi ha de tot tipus. Comparant amb altres ciutats, hi ha un nombre elevat d&apos;estacions amb passadissos llargs, sense arribar al nivell de Barcelona.</p> <p>Possiblement destaquen els macro intercanviadors que s&apos;han anat constru&#xFFFD;nt en els pols de transport m&#xFFFD;s importants, permetent el transbordament entre metro, tren i sovint autob&#xFFFD;s interurb&#xFFFD;. L&apos;exemple m&#xFFFD;s clar &#xFFFD;s l&apos;estaci&#xFFFD; de Nuevos Ministerios, per&#xFFFD; Chamart&#xFFFD;n, Sol, Pr&#xFFFD;ncipe P&#xFFFD;o o Plaza de Castilla en s&#xFFFD;n altres exemples.</p> </div> <div class=\"col-12 d-none\" id=\"com_Marsella\"> <p>El metro de Marsella est&#xFFFD; format per dues l&#xFFFD;nies que s&apos;encreuen al centre de la ciutat a Saint-Charles i Castellane. Els tranbordaments en aquestes dues estacions s&#xFFFD;n molt senzills i curts, ja que a Saint-Charles les vies de les dues l&#xFFFD;nies s&#xFFFD;n paral&#xFFFD;leles i a Castellane s&apos;encreuen perpendicularment a molta proximitat.</p> <p>A Marsella es detecten tres tipus d&apos;estacions: les perif&#xFFFD;riques, que s&#xFFFD;n elevades (ex: Bougainville, Ste-Margueritte, La Rose); les subterr&#xFFFD;nies superficials, amb un vest&#xFFFD;bul al nivell -1 i andanes laterals al -2 (ex: Baille, P&#xFFFD;rier); i les profundes c&#xFFFD;ntriques, que solen tenir andanes centrals i un sol acc&#xFFFD;s al carrer que condueix al vest&#xFFFD;bul a trav&#xFFFD;s d&apos;unes escales autom&#xFFFD;tiques amb un desnivell d&apos;entre 15 i 20 m (ex: Cinq Avenues, Estrangin).</p> <p>L&apos;estaci&#xFFFD; de Noailles &#xFFFD;s curiosa perqu&#xFFFD; en construir-se l&apos;estaci&#xFFFD; de metro, es va desviar el tra&#xFFFD;at del tramvia subterrani. Actualment l&apos;antic t&#xFFFD;nel tramviari &#xFFFD;s un passad&#xFFFD;s i l&apos;antiga estaci&#xFFFD; &#xFFFD;s un vest&#xFFFD;bul.</p> </div> <div class=\"col-12 d-none\" id=\"com_Mil&#xFFFD;\"> <p>La l&#xFFFD;nia 1 del metro de Mil&#xFFFD; es caracteritza per ser la primera l&#xFFFD;nia de metro del m&#xFFFD;n en ser constru&#xFFFD;da amb pantalles de formig&#xFFFD; armat. La l&#xFFFD;nia 2 es va obrir quatre anys despr&#xFFFD;s i segueix les directrius marcades per la l&#xFFFD;nia 1. En l&apos;aspecte funcional, les estacions es caracteritzen per haver tingut en compte els fluxos interns de viatgers en el seu disseny, dotant d&apos;escales unidireccionals les estacions.</p> <p>Aquest mateix concepte es va mantenir en la construcci&#xFFFD; de les estacions de les l&#xFFFD;nies 3 i 5, si b&#xFFFD; l&apos;arquitectura de les estacions &#xFFFD;s bastant diferent. A les l&#xFFFD;nies 1 i 2 i en alguns trams de les l&#xFFFD;nies 3 i 5, les estacions estan formades per andanes laterals al nivell -2, que connecten amb el vest&#xFFFD;bul situat al nivell -1 a trav&#xFFFD;s d&apos;escales unidireccionals.</p> <p>Al tram central de la l&#xFFFD;nia 3 es va optar per fer un t&#xFFFD;nel amb les vies sobreposades, atenent a l&apos;estretor dels carrers. El resultat &#xFFFD;s un laberint d&apos;ascensors i de passadissos i escales unidireccionals combinats amb una deoraci&#xFFFD; peculiar de les estacions.</p> <p>Els transbordaments de les estacions solen ser molt curts, especialment a Loreto, Centrale, Cadorna i Repubblica. Els dos transbordaments amb passadissos llargs s&#xFFFD;n a l&apos;estaci&#xFFFD; de Lotto i a Porta Venezia.</p> </div> <div class=\"col-12 d-none\" id=\"com_Nova York\"> <p>El metro de Nova York combina una xarxa de trens elevats (a Brooklyn i el Bronx) amb xarxa subterr&#xFFFD;nia construida a la primera meitat del segle XX i localitzada en la seva major part a Manhattan. El canvi de Manhattan als altres districtes es fa mitjan&#xFFFD;ant t&#xFFFD;nels o b&#xFFFD; passant pels famosos ponts compartits amb vianants i tr&#xFFFD;nsit viari, com el Williamsburg Bridge o el Manhattan Bridge.</p> <p>Una de les caracter&#xFFFD;stiques del metro &#xFFFD;s que hi ha l&#xFFFD;nies expr&#xFFFD;s i l&#xFFFD;nies locals, de manera que un mateix t&#xFFFD;nel pot tenir 4 vies (2 per sentit i 2 per tipus de servei), circulant les expr&#xFFFD;s per les vies centrals i les locals per les vies laterals.</p> <p>La part elevada est&#xFFFD; formada per estacions situades sobre els carrers de la ciutat, a les quals s&apos;hi accedeix a trav&#xFFFD;s d&apos;escales situades a les voreres. A un nivell +1, sota el viaducte de les vies i al damunt de la cal&#xFFFD;ada hi ha els vest&#xFFFD;buls; i al nivell +2 hi ha andanes laterals cobertes parcialment per marquesines. Les estacions amb parada de trens expr&#xFFFD;s solen tenir dues andanes centrals.</p> <p>Les l&#xFFFD;nies subterr&#xFFFD;nies circulen a molt poca profunditat i es caracteritzen per tenir un munt de pilars d&apos;acer a l&apos;entrevia i a les andanes. Les estacions locals solen tenir les andanes laterals al nivell -1, incomunicades entre elles. Les estacions expr&#xFFFD;s tenen dues andanes centrals, permetent un transbordament <i>cross-platform</i> entre l&#xFFFD;nies expr&#xFFFD;s i locals. Solen estar al nivell -2, quedant el nivell -1 reservat al vest&#xFFFD;bul, des del qual s&apos;hi pot accedir a trav&#xFFFD;s de diferents accessos al carrer.</p> </div> <div class=\"col-12 d-none\" id=\"com_Par&#xFFFD;s\"> <p>El metro de Par&#xFFFD;s t&#xFFFD; els intercanviadors m&#xFFFD;s laber&#xFFFD;ntics d&apos;Europa.</p> <p>Gaireb&#xFFFD; tota la xarxa de metro va ser constru&#xFFFD;da abans de la Segona Guerra Mundial. Les estacions inaugurades a principis de segle, comptaven amb transbordaments bastant senzills, mitjanant passadissos bidireccionals. A partir de 1920 es van comen&#xFFFD;ar a instal&#xFFFD;lar <em>portillons automatiques</em> en algunes estacions. Els <em>portillons</em> s&#xFFFD;n portes que bloquegen l&apos;acc&#xFFFD;s a les andanes quan un tren entra a l&apos;estaci&#xFFFD; i es tornen a obrir un cop el tren surt, amb l&apos;objectiu que no hi hagi flux de passatgers entrant a les andanes i poder permetre un embarcament m&#xFFFD;s r&#xFFFD;pid. Per poder limitar l&apos;entrada a les andanes, per&#xFFFD; no la sortida, es van comen&#xFFFD;ar a construir passadissos unidireccionals. Arribats a aquest punt, moltes estacions es comencen a convertir en complexos laberints subterranis.</p> <p>A partir dels anys setanta es va comen&#xFFFD;ar a perfilar el que seria la xarxa del RER (els trens de rodalies), que va comportar la construcci&#xFFFD; o una remodelaci&#xFFFD; d&apos;estacions.</p> <p>Aprofitant que separaci&#xFFFD; entre estacions de metro cont&#xFFFD;gues &#xFFFD;s baixa i la densitat d&apos;estacions &#xFFFD;s brutal, en alguns casos es va aprofitar per ubicar les estacions de RER entre dues estacions de metro i connectant-les entre dues estacions. El cas m&#xFFFD;s extrem &#xFFFD;s que les estacions de St-Augustin, St-Lazare, Haussmann-St-Lazare, Havre-Caumartin, Auber i Op&#xFFFD;ra estan unides sota terra.</p> <p>L&apos;estaci&#xFFFD; t&#xFFFD;pica del metro de Par&#xFFFD;s consta d&apos;un vest&#xFFFD;bul al nivell -1 i de dues andanes laterals al nivell -2. Les terminals construides entre 1900 i la Primera Guerra Mundial solien tenir un bucle (com encara ho tenen molts tramvies europeus), de manera que era habitual que les estacions terminals tinguessin una nau amb les vies d&apos;arribada i una altra nau amb les vies de sortida.</p> </div> <div class=\"col-12 d-none\" id=\"com_Praga\"> <p>Les tres l&#xFFFD;nies del metro de Praga formen una xarxa radial i es creuen en tres estacions situades al centre de la ciutat. Gaireb&#xFFFD; tot el seu tra&#xFFFD;at &#xFFFD;s subterrani. La primera l&#xFFFD;nia que es va construir -la C- &#xFFFD;s la que circula m&#xFFFD;s arran de la superf&#xFFFD;cie, especialment al centre de la ciutat i a la part sud. Les l&#xFFFD;nies A i B circulen a m&#xFFFD;s profunditat.</p> <p>Les estacions m&#xFFFD;s profundes solen tenir una andana central al nivell m&#xFFFD;s inferior, que conecta mitjan&#xFFFD;ant unes llargues escales autom&#xFFFD;tiques amb el vest&#xFFFD;bul situat just sota el carrer. Algunes estacions tenen dos vest&#xFFFD;buls, un a cada extrem de l&apos;estaci&#xFFFD;.</p> <p>Les estacions superficials de la l&#xFFFD;nia C solen ser de dos tipus. Hi ha algunes estacions que tenen una configuraci&#xFFFD; semblant a les estacions profundes, excepte pel fet que les andanes no es troben a tanta profunditat. L&apos;altre tipus d&apos;estaci&#xFFFD; superficial consisteix en una andana central situada al nivell -1, comunicada per escales amb els vest&#xFFFD;buls edificats a nivell de carrer. Aquestes estacions solen tenir dos vest&#xFFFD;buls, un a cada extrem de l&apos;andana.</p> <p>Als intercanviadors de Mostek i Florenc, les dues l&#xFFFD;nies es troben a una profunditat considerable, de manera que les estacions queden conectades per un passad&#xFFFD;s no gaire llarg, situat a una cota interm&#xFFFD;dia entre les dues l&#xFFFD;nies. L&apos;estaci&#xFFFD; de Muzeum, en canvi, t&#xFFFD; la l&#xFFFD;nia C molt superficial i la A molt profunda. En aquest cas, hi ha una s&#xFFFD;rie d&apos;escales autom&#xFFFD;tiques llargues que conecten les dues l&#xFFFD;nies. La l&#xFFFD;nia A tamb&#xFFFD; t&#xFFFD; una altra nau amb escales autom&#xFFFD;tiques que condueixen directament al vest&#xFFFD;bul.</p> <p>&#xFFFD;s habitual que als vest&#xFFFD;buls de les estacions hi hagi botigues.</p> </div> <div class=\"col-12 d-none\" id=\"com_Roma\"> <p>El metro de Roma t&#xFFFD; poques l&#xFFFD;nies, considerant la magnitud de la ciutat. Fins fa pocs anys nom&#xFFFD;s hi havia dues l&#xFFFD;nies que s&apos;encreuaven a l&apos;estaci&#xFFFD; de Termini, que &#xFFFD;s l&apos;estaci&#xFFFD; central. Per aquest motiu, l&apos;estaci&#xFFFD; de Termini &#xFFFD;s la que carrega m&#xFFFD;s passatgers del metro de Roma, fent que sovint quedi col&#xFFFD;lapsada. L&apos;intercanviador t&#xFFFD; passadissos unidireccionals tant per fer el transbordament, com per entrar i sortir de l&apos;estaci&#xFFFD;. Fa uns quants anys es va haver de construir un segon passad&#xFFFD;s per comunicar la l&#xFFFD;nia A amb la B i poder alliberar el passad&#xFFFD;s existent per a passatgers que surten de la l&#xFFFD;nia A al carrer.</p> <p>L&apos;altre intercanvidador &#xFFFD;s San Giovanni. La l&#xFFFD;nia C hi va arribar el 2018, per&#xFFFD; el passad&#xFFFD;s amb la l&#xFFFD;nia A no est&#xFFFD; acabat. Per aquest motiu, cal passar pel vest&#xFFFD;bul, sortint i tornant a entrar per les validadores.</p> <p>Les estacions de la part sud de la l&#xFFFD;nia B van ser obertes als anys 50. Les estacions d&apos;aquest tram s&#xFFFD;n molt senzilles. En el cas del tram nord de la l&#xFFFD;nia B i tota la l&#xFFFD;nia A, la construcci&#xFFFD; &#xFFFD;s m&#xFFFD;s recent i les estacions s&apos;han constru&#xFFFD;t amb escales i passadissos unidireccionals.</p> </div> <div class=\"col-12 d-none\" id=\"com_Rotterdam\"> <p>El metro de Rotterdam t&#xFFFD; dues l&#xFFFD;nies, que fan 5 recorreguts en total, un d&apos;aquests arribant a ciutat ve&#xFFFD;na de La Haia. El disseny de les estacions &#xFFFD;s bastant simple. Les estacions solen tenir andanes laterals i s&apos;ha de passar per un vest&#xFFFD;bul situat a un nivell superior (en estacions subterr&#xFFFD;nies) o inferior (en cas d&apos;estar en viaducte).</p> <p>Als intercanviadors de Blaak i Beurs es va optar per fer un disseny tipus <em>sandwich</em>, sobreposant una l&#xFFFD;nia amb l&apos;altra. El resultat &#xFFFD;s un transbordament r&#xFFFD;pid i senzill.</p> </div> <div class=\"col-12 d-none\" id=\"com_S&#xFFFD;o Paulo\"> <p class=\"alert\"> L&apos;autor no ha estat mai a S&#xFFFD;o Paulo. Tota la informaci&#xFFFD; ha estat treta de licitacions d&apos;obres, Google Street View, fotografies i v&#xFFFD;deos penjats a internet. </p> <p>La metr&#xFFFD;poli de S&#xFFFD;o Paulo disposa d&apos;un servei de metro operat per tres companyies diferents. &#xFFFD;s un metro relativament nou (va ser obert el 1968, encara que algunes l&#xFFFD;nies aprofiten el tra&#xFFFD;at de ferrocarrils existents), amb un disseny de les estacions pensat per acollir grans fluxos de viatgers, ja que les composicions arriben als 200 m de llarg.</p> <p>Les estacions s&#xFFFD;n espaioses. En algunes d&apos;elles, com S&#xFFFD; o Luz (l&#xFFFD;nia 1) es va optar construir-les amb la soluci&#xFFFD; Barcelona per alleugerir els fluxos d&apos;entrada i sortida.</p> </div> <div class=\"col-12 d-none\" id=\"com_Saragossa\"> <p>Saragossa no disposa de metro, per&#xFFFD; la l&#xFFFD;nia de rodalia t&#xFFFD; un tram urb&#xFFFD; amb tres estacions subterr&#xFFFD;nies. Aquest tram urb&#xFFFD; estava construit parcialment en una rasa, per&#xFFFD; va ser cobert amb l&apos;arribada de la l&#xFFFD;nia d&apos;alta velocitat, que circula en paral&#xFFFD;lel a la l&#xFFFD;nia convencional.</p> <p>Totes les estacions disposen d&apos;edifici de viatgers amb m&#xFFFD;quines de venda i validadores, situades a nivell de carrer. Les andanes estan situades al nivell -1, just sota el carrer.</p> <p>En el cas de l&apos;estaci&#xFFFD; de Miraflores, l&apos;acc&#xFFFD;s es fa provisionalment des del nivell de vies fins a un descampat, ja que la urbanitzaci&#xFFFD; exterior no est&#xFFFD; acabada i no es pot fer &#xFFFD;s de l&apos;edifici de viatgers. Aquesta estaci&#xFFFD; tamb&#xFFFD; disposa d&apos;un pas inferior per creuar les vies.</p> <p>A l&apos;estaci&#xFFFD; de Goya es pot fer transbordament amb el tramvia, a la parada de Fern&#xFFFD;ndo el Cat&#xFFFD;lico. Per fer el transbordament cal travessar dos passos de vianants.</p> </div> <div class=\"col-12 d-none\" id=\"com_Val&#xFFFD;ncia\"> <p>El metro de Val&#xFFFD;ncia neix de la uni&#xFFFD; de diferents carrilets de via estreta que unien Val&#xFFFD;ncia amb els pobles de la rodalia. Es podria dir que el sistema &#xFFFD;s un h&#xFFFD;brid entre premetro i tren, ja que pel centre de la cituat funciona com un metro, per&#xFFFD; a la rodalia funciona com un tren, amb molts passos a nivell i trams de via &#xFFFD;nica.</p> <p>La major part de les estacions subterr&#xFFFD;nies consten de dues andanes laterals al nivell -2 i un o dos vest&#xFFFD;buls al nivell -1. Seguidament hi ha estacions particulars, especialment a les l&#xFFFD;nies 3 i 5. Bail&#xFFFD;n, Avinguda del Cid, &#xFFFD;ngel Guimer&#xFFFD; i Col&#xFFFD;n tenen andanes centrals. L&apos;estaci&#xFFFD; d&apos;Alameda disposa de 4 vies (dues per la l&#xFFFD;nia a Rafelbunyol i dues per la de Mar&#xFFFD;tim-Serrer&#xFFFD;a).</p> <p>L&apos;estaci&#xFFFD; de X&#xFFFD;tiva t&#xFFFD; una topologia diferent a totes les altres, ja que les andanes estan sobreposades. Aix&#xFFFD; es deu a que just al comen&#xFFFD;ament de l&apos;estaci&#xFFFD; pel costat Col&#xFFFD;n hi ha la bifurcaci&#xFFFD; de la l&#xFFFD;nia que va a Bail&#xFFFD;n i Jes&#xFFFD;s. Est&#xFFFD; constru&#xFFFD;t aix&#xFFFD; per evitar el creuament de trens al mateix nivell.</p> </div> <div class=\"col-12 d-none\" id=\"com_Vars&#xFFFD;via\"> <p>El metro t&#xFFFD; dues linies i la xarxa t&#xFFFD; forma de creu.</p> <p>La l&#xFFFD;nia 1 t&#xFFFD; dos tipus d&apos;estacions: les que tenen andanes laterals solen tenir el vest&#xFFFD;bul a nivell de carrer, mentre que les que tenen andana central solen tenir un vest&#xFFFD;bul en un nivell intermedi.</p> <p>Les estacions de la l&#xFFFD;nia 2 s&#xFFFD;n similars a les que tenen andana central de la l&#xFFFD;nia 1, amb la difer&#xFFFD;ncia que les andanes es troben a m&#xFFFD;s profunditat.</p> <p>Hi ha dos intercanviadors principals. A Zwi\u0019tokrzyska s&apos;hi encreuen les dues l&#xFFFD;nies de metro i el transbordament &#xFFFD;s tipus sandwich. Aproximadament mig quil&#xFFFD;metre m&#xFFFD;s al sud hi ha l&apos;altre intercanviador principal de la ciutat, format per l&apos;estaci&#xFFFD; central de tren, l&apos;estraci&#xFFFD; de rodalies Zr&#xFFFD;dmie[cie i l&apos;estaci&#xFFFD; de metro Centrum. Les dues primeres formen un complex subterrani for&#xFFFD;a gran, combinades amb unes galeries comercials. L&apos;estaci&#xFFFD; de rodalies est&#xFFFD; unida a la de metro a trav&#xFFFD;s d&apos;un curt cam&#xFFFD; pel carrer.</p> </div> <div class=\"col-12 d-none\" id=\"com_Viena\"> <p>Part de l&apos;actual xarxa de metro (U-Bahn) prov&#xFFFD; d&apos;una xarxa primitiva oberta el 1898, sonegut com a Stadtbahn, que fins la Primera Guerra Mundial va funcionar amb tracci&#xFFFD; a vapor. La major part del seu tra&#xFFFD;at era en superf&#xFFFD;cie o en viaducte, sempre segregat i sense passos a nivell. Per tant, es tractava d&apos;una xarxa de metro, si b&#xFFFD; operada amb material de metro lleuger.</p> <p>Durant els anys 60, el govern municipal va construir un parell de t&#xFFFD;nels per tramvies al voltant de la ciutat. Paral&#xFFFD;lelament, es debatia un pla de metros. Finalment, es va aprovar un pla b&#xFFFD;sic, en el que es reconvertiria l&apos;Stadtbahn en dues l&#xFFFD;nies de metro modernes (actuals U4 i U6), aix&#xFFFD; com tamb&#xFFFD; una l&#xFFFD;nia de tramvia subterr&#xFFFD;nia (actual U2), a part de la construcci&#xFFFD; des de zero de la l&#xFFFD;nia U1. En una segona fase es va planificar una l&#xFFFD;nia est-oest (U3), a m&#xFFFD;s del perllongament de la resta de l&#xFFFD;nies cap als suburbis. Actualment s&apos;est&#xFFFD; construint la l&#xFFFD;nia U5.</p> <p>La topologia de les estacions dep&#xFFFD;n del moment de la construcci&#xFFFD;. Les estacions no-subterr&#xFFFD;nies que formaven part de l&apos;Stadtbahn tenen andanes laterals i l&apos;entrada es fa per uns vest&#xFFFD;buls modernistes. Les estacions de l&apos;antic t&#xFFFD;nel tramviari de la U2 s&#xFFFD;n molt superficials i nom&#xFFFD;s tenen un sol nivell amb andanes laterals, que estan esglaonades. Les estacions construides a partir dels anys 70 solen tenir una andana central al nivell inferior, que es conecten amb el vest&#xFFFD;bul (que pot estar en un nivell superior o directament al carrer) a trav&#xFFFD;s d&apos;escales autom&#xFFFD;tiques o ascensors. La profunditat d&apos;aquestes estacions &#xFFFD;s variable, per&#xFFFD; al centre hist&#xFFFD;ric les estacions es troben a molta profunditat.</p> <p>Totes els intercanviadors han estat constru&#xFFFD;ts del 1970 en endavant i s&apos;han construit amb la idea de ser curts i eficients. Pr&#xFFFD;cticament totes les estacions s&#xFFFD;n aix&#xFFFD;, excepte Praterstern, que t&#xFFFD; un passad&#xFFFD;s llarg.</p> </div> <div class=\"col-12 d-none\" id=\"com_Oslo\"> <p>El metro d\u0019Oslo prov&#xFFFD; d\u0019una antiga xarxa de trens o tramvies suburbans consolidada al costat oest de la ciutat durant la primera meitat del segle XX i d\u0019un metro modern constru&#xFFFD;t a partir dels anys 60 a la part oriental de la ciutat, que van ser unificats de manera progressiva durant des dels anys 70 dels anys XX fins als anys 10 del segle XXI.</p> <p>El metro d\u0019Oslo &#xFFFD;s poc profund, i de fet, discorre en superf&#xFFFD;cie o en trams elevats en la seva major part. Les estacions situades en superf&#xFFFD;cie solen disposar de dues andanes laterals sense marquesina. Els accessos a les andanes s&#xFFFD;n lliures, sense validadores ni tanques i es fan directament des del nivell de carrer a trav&#xFFFD;s de rampes. En algun indret hi ha situat un quiosc de Narvesen que assumeix alhora la venda de bitllets i fa de botiga de conviv&#xFFFD;ncia.</p> <p>Les estacions subterr&#xFFFD;nies estan situades b&#xFFFD; al centre de la ciutat o als suburbis del nord-est. La majoria d\u0019estacions estan situades a poca profunditat i disposen de dues andanes laterals al nivell m&#xFFFD;s profund. Al nivell immediatament superior hi ha un vest&#xFFFD;bul que pot estar b&#xFFFD; a peu de carrer o pot ser subterrani. La connexi&#xFFFD; entre nivells es fa a trav&#xFFFD;s de rampes i tamb&#xFFFD; d\u0019escalinates. Com a norma general, no hi ha </p> <p>Hi ha unes quantes estacions que estan situades a bastanta profunditat: Roms&#xFFFD;s, Ellingsrud&#xFFFD;sen, Stortinget, Nydalen i Vestli. A les dues primeres nom&#xFFFD;s s\u0019hi pot accedir mitjan&#xFFFD;ant ascensors de gran capacitat que connecten el carrer amb el distribu&#xFFFD;dor, a m&#xFFFD;s d\u0019una rampa de m&#xFFFD;s de 200 m de llarg que tamb&#xFFFD; enllacen el carrer amb el nivell distribu&#xFFFD;dor.</p> </div> <div class=\"col-12 d-none\" id=\"com_G&#xFFFD;teborg\"> <p>El tramvia de G&#xFFFD;teborg t&#xFFFD; una estaci&#xFFFD; subterr&#xFFFD;nia. Hammarkullen est&#xFFFD; situada a molta profunditat, en un barri muntany&#xFFFD;s dels suburbis del nord-est de la ciutat. Les vies passen per un t&#xFFFD;nel bitub i la circulaci&#xFFFD; es fa per l\u0019esquerra, ja que l\u0019estaci&#xFFFD; disposa d\u0019andanes centrals i el material m&#xFFFD;bil nom&#xFFFD;s t&#xFFFD; portes al costat dret. Del nivell d\u0019andanes, en surt una galeria amb escales autom&#xFFFD;tiques i un ascensor inclinat, que desemboca al vest&#xFFFD;bul, situat a nivell de carrer.</p> </div> <div class=\"col-12 d-none\" id=\"com_Hamburg\"> <p>Hamburg disposa de dues xarxes de metro: l\u0019U-Bahn i l\u0019S-Bahn. L\u0019U-Bahn, que seria pr&#xFFFD;piament el metro, &#xFFFD;s un dels m&#xFFFD;s antics del m&#xFFFD;n. La primera l&#xFFFD;nia, circular va ser constru&#xFFFD;da tant trams elevats, en superf&#xFFFD;cie i en t&#xFFFD;nel a molt poca profunditat. Les conseq&#xFFFD;ents extensions tamb&#xFFFD; s\u0019han constru&#xFFFD;t alternant aquestes tres tipologies. Nom&#xFFFD;s destaca el tram central de la U2 i el ramal de la U4, que es van construir a gran profunditat.</p> <p>En general, les estacions subterr&#xFFFD;nies s&#xFFFD;n molt superficials i disposen d\u0019una andana central (lateral a les estacions originals de la U3). Sovint hi ha un nivell intermedi que fa de vest&#xFFFD;bul. Per la seva banda, les estacions elevades tenen un vest&#xFFFD;bul a nivell de carrer i una andana central o dues de laterals al nivell +1.</p> <p>Pel que fa a l\u0019S-Bahn, aquest aprofita trams de la xarxa ferrovi&#xFFFD;ria alemanya. Als anys 60 es va comen&#xFFFD;ar a construir el City S-Bahn, que &#xFFFD;s una l&#xFFFD;nia subterr&#xFFFD;nia pel centre de la ciutat. Totes aquestes estacions disposen de grans andanes centrals situades a un nivell -2, generalment amb vest&#xFFFD;buls situats al nivell -1, als extrems de les andanes.</p> <p>Pel que fa als intercanviadors, algunes han estat dissenyats per garantir un transbordament cross-transfer (Barmbek entre ramals de la U3, Wandsbek-Gartenstadt, Berliner Tor, Altona, Hauptbahnhof a l\u0019S-Bahn, Norderstedt Mitte), amb andanes paral&#xFFFD;leles (Ohlsdorf, Barmbek entre U-Bahn i S-Bahn, Hauptbahnhof S&#xFFFD;d, Elbbr&#xFFFD;cken) o amb transbordament directe per un sol tram d\u0019escales entre l&#xFFFD;nies situades a diferents nivells (Schlump, Jungfernstieg). </p> <p>Hi ha altres transbordaments que no tenen un disseny tan bo, com el llarg passad&#xFFFD;s entre Rathaus i Jungfernstieg, L&#xFFFD;becker Stra&#xFFFD;e o el transbordament pel carrer a Wandsbeker Chaussee, Dammtor / Stephansplatz o Sternschanze</p> </div> <div class=\"col-12 d-none\" id=\"com_Essen\"> <p>L\u0019Stadtbahn d\u0019Essen disposa de dues l&#xFFFD;nies troncals. Les que discorren per l\u0019estaci&#xFFFD; Rathaus s&#xFFFD;n tramvies purs, amb tramvies i andanes de pis baix. Les l&#xFFFD;nies que passen per Hirschlandplatz s&#xFFFD;n metros lleugers.</p> <p>Hi ha varietat entre la tipologia d\u0019estacions. Les estacions m&#xFFFD;s superficials solen tenir andanes laterals, mentre que les estacions de la l&#xFFFD;nia troncal de metro lleuger tenen andanes centrals, que estan situades a una profunditat considerable.</p> </div> <div class=\"col-12 d-none\" id=\"com_Dortmund\"> <p>L\u0019Stadtbahn de Dortmund est&#xFFFD; format per tres l&#xFFFD;nies troncals, que es troben al centre de la ciutat. Les que tenen el recorregut est-oest s\u0019operen amb material tramviari de pis baix, mentre que les altres dues s\u0019operen amb metros lleugers de pis alt.</p> <p>La majoria d\u0019estacions es troben a poca profunditat. Els vest&#xFFFD;buls de les estacions es troben b&#xFFFD; al nivell de carrer o en un nivell intermedi entre carrer i andana.</p> <p>A Dortmund tamb&#xFFFD; hi ha un sistema de monorail (H-Bahn) que serveix la Universitat T&#xFFFD;cnica de Dortmund (TU Dortmund). Est&#xFFFD; formada per dues l&#xFFFD;nies. El tra&#xFFFD;at &#xFFFD;s de via &#xFFFD;nica, per&#xFFFD; hi ha algunes estacions que tenen apartadors per permetre creuaments. Totes les estacions s&#xFFFD;n elevades o estan situades en superf&#xFFFD;cie.</p> </div> <div class=\"col-12 d-none\" id=\"com_Bochum\"> <p>L\u0019Stadtbahn de Bochum est&#xFFFD; format per una l&#xFFFD;nia nord-sud, a m&#xFFFD;s de diverses l&#xFFFD;nies de tramvia que discorren per trams subterranis al seu pas pel centre. La majoria d\u0019estacions de l\u0019Stadtbahn tenen andanes centrals i vest&#xFFFD;buls situats en un nivell intermedi entre el carrer i les andanes. En algunes estacions, les andanes estan situades a una profunditat superior, com a Rathaus Nord i a Hauptbahnhof.</p> </div> <div class=\"col-12 d-none\" id=\"com_M&#xFFFD;lheim\"> <p>Les estacions d\u0019Stadtbahn de M&#xFFFD;lheim s&#xFFFD;n diverses. Les estacions m&#xFFFD;s properes al casc antic i al Ruhr tenen les andanes a molta profunditat per tal que els t&#xFFFD;nels puguin passar el riu per sota. En canvi, la resta d\u0019estacions tenen una configuraci&#xFFFD; t&#xFFFD;pica de qualsevol xarxa d\u0019Stadtbahn d\u0019Alemanya, amb un vest&#xFFFD;bul al nivell -1 i andanes (laterals o centrals) al nivell -2.</p> </div> <div class=\"col-12 d-none\" id=\"com_Duisburg\"> <p>Totes les estacions de l\u0019Stadtbahn i del tramvia subterrani de Duisburg disposen d\u0019andanes centrals. Aquestes andanes solen estar al nivell -2, mentre que el nivell -1 est&#xFFFD; reservat als vest&#xFFFD;buls.</p> <p>Hi ha dues estacions particulars: Hauptbahnhof i K&#xFFFD;nig-Heinrich-Platz. En aquestes dues estacions hi conflueixen la l&#xFFFD;nia nord-sud i la est-oest. Les estacions disposen de dues andanes paral&#xFFFD;leles, sobreposades en dos nivells diferents (al -2 i al -3). Diferents combinacions d\u0019escales autom&#xFFFD;tiques i escalinates permeten transbordar, accedir i sortir de l\u0019estaci&#xFFFD;.</p> </div> <div class=\"col-12 d-none\" id=\"com_D&#xFFFD;sseldorf\"> <p>D&#xFFFD;sseldorf t&#xFFFD; dues l&#xFFFD;nies troncals d\u0019Stadtbahn (nord-sud i NO-SE), aix&#xFFFD; com una l&#xFFFD;nia troncal de tramvia subterrani. Les dues l&#xFFFD;nies d\u0019Stadtbahn comparteixen tra&#xFFFD;at entre l\u0019estaci&#xFFFD; central (Hauptbahnhof) i el centre (Heinrich-Heine-Allee) i les vies discorren en paral&#xFFFD;lel. A les dues estacions esmentades, les andanes que serveixen les quatre vies estan situades al mateix nivell, per&#xFFFD; a les dues estacions interm&#xFFFD;dies, les vies estan superposades, quedant la via en sentit nord al nivell superior.</p> <p>Per altra banda, la l&#xFFFD;nia de tramvia subterrani disposa d\u0019andanes baixes laterals al nivell -2 i un vest&#xFFFD;bul al nivell -1.</p> </div> <div class=\"col-12 d-none\" id=\"com_Tor&#xFFFD;\"> <p>Gaireb&#xFFFD; totes les estacions del metro de Tor&#xFFFD; segueixen un disseny est&#xFFFD;ndard format per dues andanes laterals al nivell -3, i un vest&#xFFFD;bul al nivell -1. La connexi&#xFFFD; entre el vest&#xFFFD;bul i les andanes es fa a trav&#xFFFD;s d\u0019una escala autom&#xFFFD;tica de pujada per andana, un ascensor o b&#xFFFD; a trav&#xFFFD;s de dues escalinates que van del nivell -3 al -2 i unes escales autom&#xFFFD;tiques i escalinates que van del -2 al -1.</p> <p>L\u0019estaci&#xFFFD; central de Porta Nuova t&#xFFFD; un disseny diferent: vest&#xFFFD;bul al nivell -1 i andanes al nivell -2, des de les quals s\u0019hi pot accedir a trav&#xFFFD;s d\u0019escales o per ascensor. Hi ha connexi&#xFFFD; directa des del vest&#xFFFD;bul del metro al vest&#xFFFD;bul original de l\u0019estaci&#xFFFD; ferrovi&#xFFFD;ria, actualment part d\u0019un centre comercial. </p> <p>L\u0019estaci&#xFFFD; de Porta Susa disposa de les andanes de metro al nivell -4, un distribu&#xFFFD;dor al -3 i un vest&#xFFFD;bul obert situat a dins de la gran nau de l\u0019estaci&#xFFFD; ferrovi&#xFFFD;ria. L\u0019estaci&#xFFFD; ferrovi&#xFFFD;ria, per la seva banda, est&#xFFFD; formada per tres nivells, on destaca la part oriental de l\u0019estaci&#xFFFD;, que cont&#xFFFD; una enorme marquesina amb sostre de vidre de 380 m de llarg per 30 m d\u0019ample. El nivell -2 cont&#xFFFD; l\u0019esmentat vest&#xFFFD;bul del metro i tamb&#xFFFD; les 4 andanes de la RFI. El nivell -1 cont&#xFFFD; els 4 passadissos on convergeixen tant els accessos a l\u0019estaci&#xFFFD; pel costat oest, com les escalinates, ascensors i escales autom&#xFFFD;tiques per accedir a les andanes. El nivell 0, juntament amb el nivell -1, cont&#xFFFD; espais comercials.</p> </div> <div class=\"col-12 d-none\" id=\"com_Lausana\"> <p>El metro de Lausana est&#xFFFD; format per un metro lleuger (m1) i per un metro amb pneum&#xFFFD;tics amb conducci&#xFFFD; autom&#xFFFD;tica (m2), el tra&#xFFFD;at del qual prov&#xFFFD; d\u0019un funicular que posteriorment fou convertit a cremallera.</p> <p>Les estacions de la l&#xFFFD;nia m1 s&#xFFFD;n subterr&#xFFFD;nies o estan a nivell de carrer. Algunes estacions nom&#xFFFD;s disposen d\u0019una andana lateral amb acc&#xFFFD;s directe al carrer, ja que el tra&#xFFFD;at &#xFFFD;s de via &#xFFFD;nica. Les estacions amb apartador solen tenir dues andanes. L\u0019estaci&#xFFFD; terminal de Renens CFF, es troba incorporada dins l\u0019estaci&#xFFFD; dels Ferrocarrils Federals Su&#xFFFD;ssos.</p> <p>Per altra banda, les estacions de la l&#xFFFD;nia m2 s&#xFFFD;n m&#xFFFD;s variades. Totes les estacions tenen andanes laterals, excepte Sallaz. Algunes tenen les andanes a nivell de carrer, com Ouchy o Grancy. Altres estan arran del nivell del carrer i s\u0019accedeix a trav&#xFFFD;s d\u0019una escalinata o una rampa, com D&#xFFFD;lices o CHUV.</p> <p>Finalment, algunes estacions tenen una configuraci&#xFFFD; molt particular a causa de l\u0019orografia del casc antic de la ciutat, particularment per la vall del Flon, profunda i estreta. L\u0019estaci&#xFFFD; de Flon es troba a la place de l\u0019Europe. L\u0019estaci&#xFFFD; de la m1 es troba al mateix nivell que la pla&#xFFFD;a, mentre que les estacions de la LEB (ferrocarril) i m2 es troben al nivell -2. Del nivell -2 en surten 5 ascensors que pugen fins l\u0019altura del Grand Pont, situat una vintena de metres m&#xFFFD;s amunt.</p> <p>De la mateixa manera, l\u0019estaci&#xFFFD; Riponne es troba a la vall del riu Flon. L\u0019estaci&#xFFFD; est&#xFFFD; situada a un nivell intermedi entre el carrer que segueix la vall i el pont Riponne. Quatre ascensors (dos per andana) comuniquen els tres nivells.</p> </div> <div class=\"col-12 d-none\" id=\"com_Porto\"> <p>El metro de Porto &#xFFFD;s un metro lleuger de nova construcci&#xFFFD;. Hi ha dues l&#xFFFD;nies troncals: una nord-sud i una altra est-oest, que t&#xFFFD; una part que segueix el tra&#xFFFD;at de les antigues l&#xFFFD;nies de via estreta que sortien de Trindade, que actualment fa d\u0019enlla&#xFFFD; entre les dues l&#xFFFD;nies troncals.</p> <p>Les estacions superficials tenen el disseny propi d\u0019una estaci&#xFFFD; de tramvia moderna, amb marquesines i passos de vianants als extrems de les andanes per canviar d\u0019andana o sortir de l\u0019estaci&#xFFFD;.</p> <p>Les estacions subterr&#xFFFD;nies tenen les andanes al nivell m&#xFFFD;s profund, per&#xFFFD; difereix l\u0019exist&#xFFFD;ncia de nivells intermedis i d\u0019on s\u0019ubica el vest&#xFFFD;bul.</p> </div> <div class=\"col-12 d-none\" id=\"com_Munic\"> El metro de Munic &#xFFFD;s un metro amb 8 serveis diferents, que s\u0019agrupen al centre i formen 3 l&#xFFFD;nies troncals, a m&#xFFFD;s d\u0019una l&#xFFFD;nia troncal est-oest d\u0019S-Bahn, que per la seva freq&#xFFFD;&#xFFFD;ncia de pas i prestacions es pot considerar de metro, igual que passa a Berl&#xFFFD;n i Hamburg. <p>La majoria d\u0019estacions disposen d\u0019andanes centrals situades al nivell -2 i d\u0019un vest&#xFFFD;bul en cada extrem de les andanes al nivell -1, malgrat que no hi hagi validadores f&#xFFFD;siques en cap estaci&#xFFFD;. En algunes estacions particulars, les andanes poden estar situades a m&#xFFFD;s profunditat, cosa que ha obligat a excavar galeries inclinades per a instal&#xFFFD;lar-hi escales autom&#xFFFD;tiques.</p> <p>Una de les caracter&#xFFFD;stiques del metro de Munic &#xFFFD;s l\u0019exist&#xFFFD;ncia de transbordaments cross-platforms en moltes estacions, amb l\u0019afegit que els horaris entre l&#xFFFD;nies tamb&#xFFFD; estan coordinats. Alguns exemples s&#xFFFD;n: Scheidplatz, Innsbrucker Ring o Neuperlach S&#xFFFD;d. A m&#xFFFD;s, aquelles estacions on s\u0019acaben els trams comuns o on s\u0019acaben els serveis parcials solen tenir tres o quatre vies, com Hauptbahnhof (U1-U2), M&#xFFFD;nchner Freiheit, Olympiazentrum, Kolumbusplatz, Fr&#xFFFD;ttmaning o Implerstra&#xFFFD;e. Algunes d\u0019aquestes estacions tenen ascensors que comuniquen directament les andanes amb el carrer.</p> <p>Les estacions m&#xFFFD;s c&#xFFFD;ntriques de l\u0019S-Bahn fan servir la soluci&#xFFFD; Barcelona. A Hauptbahnhof i a Karlsplatz s\u0019entra per l\u0019andana central i es baixa per les laterals, mentre que a Marienplatz, com que es troba en carrers estrets, les dues vies estan superposades: sempre es baixa del tren pel costat dret en sentit de la circulaci&#xFFFD; i s\u0019hi entra per les portes contr&#xFFFD;ries. Juntament als dos nivells destinats a l\u0019S-Bahn (-2 i -3) tamb&#xFFFD; hi ha l\u0019estaci&#xFFFD; del metro situada al nivell -4, on les dues andanes estan separades gaireb&#xFFFD; un centenar de metres, deixant l\u0019edifici de l\u0019Ajuntament entremig.</p> <p>En aquelles altres estacions de transbordament, el canvi entre l&#xFFFD;nies &#xFFFD;s directe a trav&#xFFFD;s d\u0019un tram d\u0019escales (Odeonsplatz, Hauptbahnhof, Sendlinger Tor) o passant pels vest&#xFFFD;buls, en el cas de la majoria de transbordaments entre U-Bahn i S-Bahn</p> </div> <div class=\"col-12 d-none\" id=\"com_Nuremberg\"> <p>El metro de Nuremberg disposa de tres l&#xFFFD;nies. Dues d\u0019aquestes, la U2 i la U3 comparteixen vies al tram central.</p> <p>El disseny de les estacions &#xFFFD;s bastant senzill. El metro funciona amb un sistema d\u0019honor (sense validadores que impedeixin el pas f&#xFFFD;sicament). Les andanes sempre es troben al nivell m&#xFFFD;s inferior de l\u0019estaci&#xFFFD;, que sol ser al nivell -1 o al -2 si es que l\u0019estaci&#xFFFD; disposa de vest&#xFFFD;bul al nivell -1, ja que en alguns casos s\u0019accedeix directament del carrer a l\u0019andana a trav&#xFFFD;s d\u0019escalinates o escales autom&#xFFFD;tiques. Totes les estacions disposen d\u0019ascensors.</p> <p>Les dues estacions de correspond&#xFFFD;ncia entre l&#xFFFD;nies de metro estan pensades per fer un transbordament r&#xFFFD;pid. A Hauptbahnhof, l\u0019estaci&#xFFFD; de la U1 est&#xFFFD; situada un nivell per sota de l\u0019estaci&#xFFFD; de la U2 i U3, i nom&#xFFFD;s fa falta passar per un tram d\u0019escales per canviar de l&#xFFFD;nia. A l\u0019estaci&#xFFFD; Pl&#xFFFD;rrer es garanteix un transbordament cross-platform en ambd&#xFFFD;s sentit, ja que les andandes d\u0019ambdues l&#xFFFD;nies estan sobreposades.</p> </div> <div class=\"col-12 d-none\" id=\"com_Stuttgart\"> <p>L\u0019Stadtbahn d\u0019Stuttgart &#xFFFD;s for&#xFFFD;a complex, per&#xFFFD; l\u0019operaci&#xFFFD; es pot simplificar en les l&#xFFFD;nies que travessen la vall i les que la ressegueixen. Fora del centre, la majoria d\u0019estacions s&#xFFFD;n parades simples amb andana alta i amb plataforma pr&#xFFFD;pia. Al centre de la ciutat, les estacions s&#xFFFD;n subterr&#xFFFD;nies i disposen d\u0019andanes laterals al nivell -2 i un vest&#xFFFD;bul o dos al nivell -1.</p> <p>Pel que fa a les estacions del tram central de l\u0019S-Bahn, totes tenen una andana central al nivell -2 i vest&#xFFFD;buls als extrems, situats en un nivell intermedi entre l\u0019andana i el carrer.</p> </div> <div class=\"col-12 d-none\" id=\"com_Lilla\"> <p>El metro de Lilla est&#xFFFD; format per dues l&#xFFFD;nies de VAL (vehicle autom&#xFFFD;tic lleuger, del franc&#xFFFD;s <em>v&#xFFFD;hicule automatique l&#xFFFD;ger</em>). Un VAL es caracteritza per tenir vehicles molt estrets i de curta longitud, que circulen a una freq&#xFFFD;&#xFFFD;ncia molt alta per poder absorbir tota la demanda. L&apos;estretor dels vehicles &#xFFFD;s una conseq&#xFFFD;&#xFFFD;ncia directa de no voler encarir la perforaci&#xFFFD; dels t&#xFFFD;nels durant la seva construcci&#xFFFD;.</p> <p>Inicialment el metro funcionava amb un sistema d&apos;honor (sense la barrera f&#xFFFD;sica dels torniquets), de manera que les estacions van ser dissenyades sense aquesta previsi&#xFFFD;. La posterior instal&#xFFFD;laci&#xFFFD; de les validadores fa que en algunes estacions nom&#xFFFD;s n&apos;hi hagi en algun dels accessos, mentre que altres estacions poden tenir una distribuci&#xFFFD; peculiar de les l&#xFFFD;nies de peatge.</p> <p>L&apos;estaci&#xFFFD; principal de la xarxa &#xFFFD;s Gare de Flandre, que &#xFFFD;s l&apos;estaci&#xFFFD; ferrovi&#xFFFD;ria central, a m&#xFFFD;s d&apos;una de les estacions comunes de les dues l&#xFFFD;nies de metro i la terminal de les dues l&#xFFFD;nies de tramvia, situada sota terra. Aquesta estaci&#xFFFD; proveeix un transbordament cross-platform entre les l&#xFFFD;nies de metro. A m&#xFFFD;s, el tranbordament entre metro i tramvia tamb&#xFFFD; &#xFFFD;s molt r&#xFFFD;pid. Com a curiositat, l&apos;estaci&#xFFFD; de tramvia t&#xFFFD; una andana exclusivament destinada a la baixada dels passatgers.</p> <p>L&apos;altra estaci&#xFFFD; d&apos;enlla&#xFFFD; entre les dues l&#xFFFD;nies de metro &#xFFFD;s Porte des Postes, que t&#xFFFD; les andanes de les dues l&#xFFFD;nies encreuades a diferent nivell, cosa que fa que el transbordament sigui r&#xFFFD;pid.</p> </div> <div class=\"col-12 d-none\" id=\"com_Palma\"> <p>El metro de Palma &#xFFFD;s de construcci&#xFFFD; recent. El tram m&#xFFFD;s proper al centre va ser constru&#xFFFD;t aprofitant el soterrament de la l&#xFFFD;nia Palma - Inca a l&apos;entrada a Ciutat. Entre l&apos;Estaci&#xFFFD; Intermodal de la pla&#xFFFD;a d&apos;Espanya fins a Son Costa - Son Fortesa, les vies del metro discorren en paral&#xFFFD;lel a les de la l&#xFFFD;nia ferrovi&#xFFFD;ria ja mencionada.</p> <p>L&apos;Estaci&#xFFFD; Intermodal t&#xFFFD; una funci&#xFFFD; autoexplicativa. Hi ha una estaci&#xFFFD; d&apos;autobusos subterr&#xFFFD;nia situada al costat de la platja de vies subterr&#xFFFD;nia. De fet, aquest intercanviador &#xFFFD;s el punt d&apos;inici de totes les l&#xFFFD;nies interurbanes amb inici a Palma, aix&#xFFFD; com la terminal ferrovi&#xFFFD;ria.</p> <p>Tant el tram com&#xFFFD; com el tram que discorre per sota de la Gran Via Asima estan construits a molt poca profunditat. De fet, les estacions situades en aquesta Gran Via tenen el mateix disseny, amb andanes i vest&#xFFFD;buls situats al nivell -1 i un pas inferior al nivell -2 equipat amb escales autom&#xFFFD;tiques i ascensors.</p> <p>L&apos;estaci&#xFFFD; de Son Sardina es troba en superficie i s&apos;hi pot fer enlla&#xFFFD; amb la l&#xFFFD;nia Palma - S&#xFFFD;ller. L&apos;estaci&#xFFFD; de la UIB, per la seva banda, disposa d&apos;un edifici de viatgers a nivell de carrer, encara que no allotja cap mena de depend&#xFFFD;ncia.</p> </div> <div class=\"col-12 d-none\" id=\"com_Brescia\"> <p>El metro de Brescia consta d\u0019una l&#xFFFD;nia autom&#xFFFD;tica oberta el 2013 que t&#xFFFD; forma de L. El material m&#xFFFD;bil &#xFFFD;s l\u0019autom&#xFFFD;tic d\u0019Ansaldobreda, tamb&#xFFFD; utilitzat a les l&#xFFFD;nies 4 i 5 de la ciutat ve&#xFFFD;na de Mil&#xFFFD;. La l&#xFFFD;nia circula a poca profunditat al tram nord, elevat i en super&#xFFFD;fice al tram est i una mica m&#xFFFD;s profund al tram central. S\u0019utilitza un sistema d\u0019honor, sense l&#xFFFD;nia de peatge f&#xFFFD;sica.</p> <p>Hi ha un prototip d\u0019estaci&#xFFFD; utilitzada en estacions una mica m&#xFFFD;s fondes, com Marconi, Ospedale, Bresciadue, Stazione FS o Volta. Aquestes disposen de dues andanes laterals al nivell -3. Cada andana comunica amb el vest&#xFFFD;bul situat al nivell -2 a trav&#xFFFD;s d\u0019un ascensor, unes escalinates i dues escales autom&#xFFFD;tiques situades en llocs diferents. Del vest&#xFFFD;bul en surt un ascensor que va directament al nivell de carrer, aix&#xFFFD; com un vol d\u0019escalinates i escales autom&#xFFFD;tiques que van a un nivell -1 que &#xFFFD;s intermedi. Entre el nivell -1 i el carrer hi sol haver unes escalinates. Exemples d\u0019estacions s&#xFFFD;n Marconi, Ospedale, Bresciadue o Volta.</p> <p>Les estacions menys profundes, situades al tram nord, solen tenir dues andanes laterals, cadascuna amb acc&#xFFFD;s directe al carrer.</p> <p>Les dues estacions elevades s&#xFFFD;n les &#xFFFD;niques que disposen d\u0019andana central.</p> </div> <div class=\"col-12 d-none\" id=\"com_Istanbul\"> <p>El metro d\u0019Istanbul &#xFFFD;s un metro modern, ja que exceptuant la l&#xFFFD;nia 1 i la 2, tota la xarxa ha estat constru&#xFFFD;da al segle XXI i actualment est&#xFFFD; en marxa l\u0019ampliaci&#xFFFD; de diverses l&#xFFFD;nies, aix&#xFFFD; com la construcci&#xFFFD; de noves tant al costat europeu com a l\u0019asi&#xFFFD;tic. Com a complement del metro hi ha els tramvies, que tenen l&#xFFFD;nia de peatge a cada parada; aix&#xFFFD; com els quatre funiculars que ajuden a superar els desnivells d\u0019aquesta ciutat. Quatre d\u0019ells s&#xFFFD;n completament subterranis.</p> <p>Les l&#xFFFD;nies de metro s&#xFFFD;n molt diferents entre elles. No nom&#xFFFD;s per les caracter&#xFFFD;stiques t&#xFFFD;cniques, com la llargada i tipus de trens, l\u0019automatitzaci&#xFFFD;, el nombre de vies o el sistema d\u0019electrificaci&#xFFFD;; sin&#xFFFD; pel m&#xFFFD;tode de construcci&#xFFFD; dels t&#xFFFD;nels i de les estacions, que afecta a la topologia. En general, totes les l&#xFFFD;nies discorren a gran profunditat. La mida dels passadissos, vest&#xFFFD;buls i andanes est&#xFFFD; adaptada a la demanda, encara que les dels suburbis estan sobredimensionades. Per aquest motiu, el temps d\u0019acc&#xFFFD;s i sortida sol ser elevat. La topologia dels transbordaments en molts casos s\u0019ha descuidat, cosa que ha resultat amb correspond&#xFFFD;ncies llargues, o per les quals s\u0019han de pujar molts nivells i tornar a baixar-los. A banda, els canvis de l&#xFFFD;nia no s&#xFFFD;n gratu&#xFFFD;ts (s\u0019ha de sortir de la zona de pagament d\u0019una l&#xFFFD;nia i entrar a l\u0019altra tornant a passar per les validadores).</p> <p>Exceptuant la l&#xFFFD;nia 1, que &#xFFFD;s la m&#xFFFD;s superficial, i la 6, que &#xFFFD;s de via &#xFFFD;nica (encara que les estacions tenen un apartador amb andana central), totes les l&#xFFFD;nies circulen en t&#xFFFD;nels bitub per profunditats entre els 20 i els 40 metres. Hi ha el cas extrem d\u0019alguna estaci&#xFFFD; situada a 77 m sota el nivell del carrer. La majoria d\u0019estacions disposen d\u0019andanes centrals, situades en naus diferents (excepte a les l&#xFFFD;nies 3 i 9, que tenen una andana central sense separaci&#xFFFD; f&#xFFFD;sica). Els vest&#xFFFD;buls estan situats al nivell immediatament superior a les andanes, excepte a la l&#xFFFD;nia 4, on estan situats al nivell -1. La comunicaci&#xFFFD; entre carrer i vest&#xFFFD;bul es fa a trav&#xFFFD;s de diferents vols d\u0019escales autom&#xFFFD;tiques i escalinates, a m&#xFFFD;s d\u0019ascensors. En algunes estacions nom&#xFFFD;s &#xFFFD;s possible accedir a les andanes a trav&#xFFFD;s d\u0019ascensors.</p> </div> <div class=\"col-12 d-none\" id=\"com_M&#xFFFD;laga\"> <p>El metro de M&#xFFFD;laga consta de dues l&#xFFFD;nies explotades amb material m&#xFFFD;bil de tramvia. La l&#xFFFD;nia 2 &#xFFFD;s completament subterr&#xFFFD;nia, per&#xFFFD; la l&#xFFFD;nia 1 circula com a tramvia amb plataforma pr&#xFFFD;pia al tram occidental. &#xFFFD;s un metro poc profund, constru&#xFFFD;t amb pantalles de formig&#xFFFD; o amb cut-and-cover. La majoria d\u0019estacions tenen andanes centrals al nivell -2 i un vest&#xFFFD;bul al nivell -1.</p> <p>El tram com&#xFFFD; de les l&#xFFFD;nies 1 i 2 &#xFFFD;s molt particular. Cada l&#xFFFD;nia circula per les seves pr&#xFFFD;pies vies, en dos nivells diferents. Entre les estacions de Guadalmedina i El Perchel hi ha un canvi de nivell de dues de les vies que est&#xFFFD; empla&#xFFFD;at en una corba i una contracorba. L\u0019estaci&#xFFFD; La Uni&#xFFFD;n de la l&#xFFFD;nia 1 tamb&#xFFFD; t&#xFFFD; les andanes situades en dos nivells, un per cada sentit. L\u0019estaci&#xFFFD; Atarazanas nom&#xFFFD;s t&#xFFFD; una sola andana.</p> </div> <div class=\"col-12 d-none\" id=\"com_Sevilla\"> <p>El metro de Sevilla disposa d\u0019una sola l&#xFFFD;nia que es va comen&#xFFFD;ar a construir als anys 70. S\u0019opera amb material tramviari.</p> <p>Al tram m&#xFFFD;s c&#xFFFD;ntric, on el t&#xFFFD;nel &#xFFFD;s bitub constru&#xFFFD;t amb tuneladora, les estacions tenen el vest&#xFFFD;bul al nivell -1 o -2, seguidament d\u0019un nivell intermedi i finalment una andana central al nivell m&#xFFFD;s baix, amb capacitat per a trens dobles. Les vies estan protegides amb portes d\u0019andana.</p> <p>El tram a l\u0019oest del Guadalquivir, combina trams amb t&#xFFFD;nel, viaducte i en superf&#xFFFD;cie. Excepte Ciudad Expo, que t&#xFFFD; una andana central al mateix nivell del carrer, la resta d\u0019estacions tenen andanes laterals i un vest&#xFFFD;bul situat a un nivell superior o inferior depenent de si estan en viaducte o no.</p> <p>Entre Nervi&#xFFFD;n i Cocheras, el metro circula a poca profunditat i totes les estacions tenen andanes laterals i un vest&#xFFFD;bul.</p> </div> <div class=\"col-12 d-none\" id=\"com_N&#xFFFD;pols\"> <p>El metro de N&#xFFFD;pols disposa de diverses l&#xFFFD;nies, totes molt diferents entre elles.</p> <p>La l&#xFFFD;nia 1 es va inaugurar el 1993. &#xFFFD;s una l&#xFFFD;nia que connecta el centre hist&#xFFFD;ric, situat arran de mar, amb la zona alta. Per guanyar cota, fa un bucle. Totes les estacions estan situades a molta profunditat, excepte el tram entre Colli Aminei i Piscinola. Les estacions solen tenir el vest&#xFFFD;bul al nivell -1 i es connecten a les andanes, situades al nivell m&#xFFFD;s inferior de tota l\u0019estaci&#xFFFD; de diferents formes. L\u0019estaci&#xFFFD; de Duomo disposa d\u0019ascensors de gran capacitat. La majoria d\u0019estacions superen aquest desnivell mitjan&#xFFFD;ant escales autom&#xFFFD;tiques, ja sigui de cop o en diversos vols.</p> <p>La l&#xFFFD;nia 2 &#xFFFD;s realment un t&#xFFFD;nel ferroviari que pertany a la xarxa ferrovi&#xFFFD;ria de l\u0019Estat. Inicialment fou electrificat mitjan&#xFFFD;ant tercer carril, tot i que actualment t&#xFFFD; caten&#xFFFD;ria. Les estacions de Montesanto i Cavour estan situades a bastanta profunditat. S\u0019hi accedeix des d\u0019un edifici de viatgers situat a nivell de carrer, des del qual en surten dos trams d\u0019escales autom&#xFFFD;tiques que van a un distribu&#xFFFD;dor situat a un nivell superior a les andanes, que s&#xFFFD;n laterals. Algunes altres estacions estan situades a l\u0019exterior i disposen de majestuosos edificis de viatgers, com Mergellina o Campi Flegrei. Sota la Piazza Garibaldi tamb&#xFFFD; hi ha una estaci&#xFFFD; annexa a la central, que fins fa pocs anys disposava de tres andanes i quatre vies, tot i que es van eliminar les vies laterals, es van ampliar les andanes laterals i es va deixar fora de servei l\u0019andana central.</p> <p>La l&#xFFFD;nia 6 est&#xFFFD; fora de servei des del 2013 i era una l&#xFFFD;nia amb un g&#xFFFD;lib molt estret. Els trens nom&#xFFFD;s feien 2,2 m d\u0019ample.</p> <p>La l&#xFFFD;nia Arcobaleno o l&#xFFFD;nia 11 &#xFFFD;s una l&#xFFFD;nia constru&#xFFFD;da amb pantalles de formig&#xFFFD;, amb estacions topol&#xFFFD;gicament semblants a les de les l&#xFFFD;nies 1 i 2 del metro de Mil&#xFFFD; o de la part sud de la l&#xFFFD;nia A del metro de Roma.</p> <p>Complementen la xarxa ferrovi&#xFFFD;ria de la ciutat el ferrocarril Circumvesuviana i el Circumflegrea, cadascuna amb diverses estacions subterr&#xFFFD;nies de poca profunditat, constru&#xFFFD;des amb m&#xFFFD;todes cut-and-cover o amb pantalles.</p> </div> <div class=\"col-12 d-none\" id=\"com_Rennes\"> <p>Rennes disposa de dues l&#xFFFD;nies de metro autom&#xFFFD;tiques. La l&#xFFFD;nia a &#xFFFD;s un VAL, com els del metro de Lilla o Tolosa de Llenguadoc, que tenen un g&#xFFFD;lib de 2,08 m. La topologia d\u0019aquestes estacions &#xFFFD;s for&#xFFFD;a variada. Totes les estacions tenen andanes laterals i sempre estan situades al nivell m&#xFFFD;s inferior. Algunes estacions tenen els vest&#xFFFD;buls al nivell -1, per&#xFFFD; d\u0019altres les tenen al nivell de carrer. Les estacions d\u0019Anatole France i de Jacques Cartier s&#xFFFD;n les m&#xFFFD;s profundes de la l&#xFFFD;nia. D\u0019altra banda, La Poterie i Pontchaillou s&#xFFFD;n estacions elevades.</p> <p>La l&#xFFFD;nia b es va inaugurar el 2023 i &#xFFFD;s un metro amb pneum&#xFFFD;tics que &#xFFFD;s guiat per un carril central. Tota la l&#xFFFD;nia &#xFFFD;s subterr&#xFFFD;nia excepte les tres situades al tram m&#xFFFD;s cap a l\u0019est, que estan en viaducte. Les estacions d\u0019aquesta l&#xFFFD;nia s&#xFFFD;n m&#xFFFD;s espaioses que les de la l&#xFFFD;nia a. Les andanes de les estacions subterr&#xFFFD;nies sempre estan al nivell inferior, sovint al -2 o al -3, i son prou llargues per acollir composicions de tres cotxes, encara que l\u0019explotaci&#xFFFD; normal nom&#xFFFD;s se\u0019n fa amb dos. El vest&#xFFFD;bul est&#xFFFD; al nivell -1.</p> <p>L\u0019estaci&#xFFFD; Sainte-Anne, una de les dues d\u0019enlla&#xFFFD;, t&#xFFFD; els itineraris d\u0019entrada, sortida i de correspond&#xFFFD;ncia no-sim&#xFFFD;trics. El vest&#xFFFD;bul est&#xFFFD; al nivell -1 i les andanes al nivell -4. Els nivells -2 i -3 actuen de distribu&#xFFFD;dors i de passadissos de correspond&#xFFFD;ncia.</p> </div> <div class=\"col-12 d-none\" id=\"com_Sant Sebasti&#xFFFD;\"> <p>Sant Sebasti&#xFFFD; disposa d\u0019una l&#xFFFD;nia de tren de via estreta anomenada Topo pels m&#xFFFD;ltiples t&#xFFFD;nels i indicada com a E2. Inicialment operada per una companyia privada, el 1982 va ser absorbida per l\u0019empresa p&#xFFFD;blica Euskotren Trena, que l\u0019opera actualment. Durant la d&#xFFFD;cada passada va ser parcialment reconstru&#xFFFD;da a est&#xFFFD;ndard de metro, amb via doble. Actualment s\u0019est&#xFFFD; construint un t&#xFFFD;nel sota el centre de Sant Sebasti&#xFFFD;, que substituir&#xFFFD; l\u0019estaci&#xFFFD; d\u0019Amara, on actualment el trens del Topo inverteixen la marxa.</p> <p>La topologia de les estacions &#xFFFD;s molt variada. Lugaritz, Anoeta i Herrera s&#xFFFD;n subterr&#xFFFD;nies i tenen dues andanes laterals al nivell -1 i un vest&#xFFFD;bul a peu de carrer. L\u0019estaci&#xFFFD; de Loiola est&#xFFFD; en viaducte, aix&#xFFFD; com la de Pasaia, per on la l&#xFFFD;nia ser&#xFFFD; desviada i soterrada pr&#xFFFD;ximament.</p> <p>L\u0019estaci&#xFFFD; d\u0019Intxaurrondo i la d\u0019Altza s&#xFFFD;n d\u0019un estil molt semblant a les del metro de Bilbao. Tenen andanes laterals al nivell m&#xFFFD;s inferior, d\u0019on en pengen uns altells que fan de vest&#xFFFD;bul. L\u0019acc&#xFFFD;s fins al carrer es fa a trav&#xFFFD;s d\u0019uns trams d\u0019escales.</p> </div> <div class=\"col-12 d-none\" id=\"com_Sofia\"> <p>El metro de Sofia est&#xFFFD; format per 4 l&#xFFFD;nies, tot i que s\u0019opera com si en fossin dues i mitja, ja que els trens de la l&#xFFFD;nia 2 continuen com a l&#xFFFD;nia 4 a l\u0019estaci&#xFFFD; d\u0019Obelya i viceversa, i la l&#xFFFD;nia 1 no deixa de ser un ramal de la 4.</p> <p>Tot i que el material m&#xFFFD;bil de les l&#xFFFD;nies 1, 2 i 4 &#xFFFD;s material sovi&#xFFFD;tic i rus, l\u0019est&#xFFFD;tica i la forma de les estacions &#xFFFD;s molt diferent als de metros constru&#xFFFD;ts en pa&#xFFFD;sos de l\u0019&#xFFFD;rbita de Moscou. En general, en gaireb&#xFFFD; totes les estacions, les andanes estan al nivell -2 i els vest&#xFFFD;buls al nivell -1. Les estacions del tram m&#xFFFD;s antic de la l&#xFFFD;nia 1 i 4 tenen una sola andana central, mentre que la resta d\u0019estacions tenen andanes laterals. La major part de les estacions tenen dos vest&#xFFFD;buls situats als extrems de les andanes. Les estacions del tram com&#xFFFD; de les l&#xFFFD;nies 1 i 4 estan equipades amb unes portes d\u0019andana low-cost.</p> <p>Les estacions de la l&#xFFFD;nia 3 tenen andanes laterals, que normalment se situen al nivell -2, i un o dos vest&#xFFFD;buls al nivell -1, a mode d\u0019altell sobre les andanes. Diverses escalinates o escales autom&#xFFFD;tiques connecten els vest&#xFFFD;buls amb les andanes. La major part dels accessos a les estacions tenen el seu equivalent amb ascensor.</p> </div> <div class=\"col-12 d-none\" id=\"com_Tolosa de Llenguadoc\"> <p>El metro de Tolosa est&#xFFFD; format per dues l&#xFFFD;nies que creen una xarxa amb forma de creu, amb intersecci&#xFFFD; a Jean Jaur&#xFFFD;s. Tant la l&#xFFFD;nia A com la l&#xFFFD;nia B s&#xFFFD;n autom&#xFFFD;tiques i funcionen amb tecnologia VAL, com els metros de Rennes i Lilla.</p> <p>Les estacions de la l&#xFFFD;nia A s&#xFFFD;n variades. Pel centre el t&#xFFFD;nel &#xFFFD;s bitub i transcorre a molta profunditat. A Capitole i Esquirol s\u0019ha d\u0019accedir a les andanes a trav&#xFFFD;s d\u0019unes escales autom&#xFFFD;tiques llargues. Les estacions que estan situades fora del centre de la ciutat tenen una topologia molt variada, amb les andanes laterals situades generalment al nivell -2 o -3 i el vest&#xFFFD;bul al nivell -1. Als trams m&#xFFFD;s perif&#xFFFD;rics hi ha seccions elevades.</p> <p>La majoria d\u0019estacions de la l&#xFFFD;nia B consten d\u0019andanes laterals al nivell -3, un distribu&#xFFFD;dor al nivell -2 i un vest&#xFFFD;bul al -1. Generalment la baixada a andanes es fa pel distribu&#xFFFD;dor del nivell -2 i la pujada cap al vest&#xFFFD;bul a trav&#xFFFD;s d\u0019una escala autom&#xFFFD;tica que el comunica directament des de cada andana, sense haver de parar a la planta -2.</p> <p>L\u0019intercanviador de Jean Jaur&#xFFFD;s est&#xFFFD; dissenyat de tal manera que els passadissos s&#xFFFD;n unidireccionals. Per canviar entre l&#xFFFD;nies de metro s\u0019ha de passar per una validadora, que nom&#xFFFD;s t&#xFFFD; utilitat estad&#xFFFD;stica i de control de fluxos, ja que el transbordament &#xFFFD;s gratu&#xFFFD;t amb tots els t&#xFFFD;tols de transbord.</p> </div> <div class=\"col-12 d-none\" id=\"com_Zuric\"> <p>El 1962 la ciutat de Zuric va renunciar en refer&#xFFFD;ndum al soterrament dels tramvies pel centre de la ciutat, en forma de premetro o d\u0019Stadtbahn alemany. El 1973, un altre refer&#xFFFD;ndum va tombar la construcci&#xFFFD; d\u0019una xarxa de metro. No obstant, un dels t&#xFFFD;nels que serviria primer com a ramal de la l&#xFFFD;nia 1 i despr&#xFFFD;s com a part de la l&#xFFFD;nia 2, ja havia estat constru&#xFFFD;t com a t&#xFFFD;nel per fer les proves del material m&#xFFFD;bil. El 1978 es va aprovar en refer&#xFFFD;ndum integrar el t&#xFFFD;nel com a part de la xarxa de tramvies, que no va entrar en marxa fins el 1986.</p> <p>Les estacions van ser constru&#xFFFD;des a bastanta profunditat, ja que es troben a una zona que fa de coll entre les valls del Limmat i del Glatt. Les andanes de les estacions s&#xFFFD;n centrals. Com que els tramvies de Zuric nom&#xFFFD;s tenen portes al costat dret, la circulaci&#xFFFD; dels tramvies pels t&#xFFFD;nels es fa per l\u0019esquerra. La comunicaci&#xFFFD; entre andanes i carrers es fa a trav&#xFFFD;s d\u0019un nivell intermedi o a trav&#xFFFD;s d\u0019un nivell inferior a les andanes. Des d\u0019aquest nivell en surten ascensors o un vol d\u0019escalinates amb escales autom&#xFFFD;tiques fins al carrer. </p></div> <div class=\"col-12 d-none\" id=\"com_Liverpool\"> <p>Merseyrail &#xFFFD;s la xarxa de trens suburbans gestionada per una autoritat metropolitana de Liverpool, i est&#xFFFD; operat per una empresa privada a trav&#xFFFD;s d\u0019una concessi&#xFFFD;. La xarxa consta de dues l&#xFFFD;nies d\u0019operaci&#xFFFD; directa. </p> <p>La Wirral Line connecta el centre de Liverpool amb la comarca de Wirral, situada al sud del riu Mersey, a trav&#xFFFD;s d\u0019un t&#xFFFD;nel obert l\u0019any 1886. Les dues estacions adjacents al riu (James Street i Hamilton Square) tenen situades les andanes a gran profunditat. La comunicaci&#xFFFD; entre el vest&#xFFFD;bul, situat a nivell de carrer i el nivell pre-andana es fa a trav&#xFFFD;s de tres ascensors de gran capacitat, a m&#xFFFD;s d\u0019escales d\u0019emerg&#xFFFD;ncia, que en el cas de Hamilton Square tamb&#xFFFD; es poden fer servir regularment. </p> <p>La Northern Line &#xFFFD;s una l&#xFFFD;nia nord-sud que es va crear el 1977, despr&#xFFFD;s d\u0019unir per t&#xFFFD;nel les l&#xFFFD;nies existents que sortien de les terminals d\u0019Exchange i Liverpool Central, al nord i al sud del centre, respectivament. Tamb&#xFFFD; als anys 70 es va modificar la terminal de la Wirral Line, que acabava en via doble a Liverpool Central, per convertir-se en un bucle d\u0019un sol sentit amb tres estacions repartides pel centre de Liverpool. Aquestes estacions es troben a for&#xFFFD;a profunditat. La comunicaci&#xFFFD; entre andanes, distribu&#xFFFD;dors i vest&#xFFFD;buls es fa a trav&#xFFFD;s de dos o tres vols d\u0019escales mec&#xFFFD;niques. Totes les estacions subterr&#xFFFD;nies s&#xFFFD;n accessibles a persones amb mobilitat redu&#xFFFD;da.</p> </div> <div class=\"col-12 d-none\" id=\"com_G&#xFFFD;nova\"> <p>G&#xFFFD;nova t&#xFFFD; una l&#xFFFD;nia de metro que recorre la ciutat en paral&#xFFFD;lel a la costa. A causa de la dif&#xFFFD;cil orografia de la ciutat, els m&#xFFFD;todes constructius de cada tram s&#xFFFD;n diferents, que han resultat en un tra&#xFFFD;at sinu&#xFFFD;s i amb estacions molt heterog&#xFFFD;nies.</p> <p>Les dues terminals, Brin i Brignole estan situades en viaducte. A m&#xFFFD;s, l\u0019estaci&#xFFFD; de metro de Brignole, est&#xFFFD; camuflada entre la platja de vies de l\u0019estaci&#xFFFD; ferrovi&#xFFFD;ria. </p> <p>L\u0019estaci&#xFFFD; de Dinegro &#xFFFD;s l\u0019&#xFFFD;nica constru&#xFFFD;da amb m&#xFFFD;tode cut-and-cover i &#xFFFD;s la m&#xFFFD;s superficial de la xarxa. El canvi d\u0019andana es fa per un pas inferior. Disposa de tres vies amb andana, a m&#xFFFD;s d\u0019altres vies que actuen com a tallers i cotxeres. </p> <p>Les estacions de Darsena i San Giorgio disposen d\u0019una andana central al nivell de vies i estan situades a menys profunditat que les de Sarzano-Sant\u0019Agostino i De Ferrari, que disposen d\u0019andanes laterals en dues galeries diferents. </p> <p>L\u0019estaci&#xFFFD; m&#xFFFD;s complexa de la xarxa &#xFFFD;s Principe: consta de l\u0019estaci&#xFFFD; de metro, l\u0019estaci&#xFFFD; subterr&#xFFFD;nia de la xarxa ferrovi&#xFFFD;ria estatal i l\u0019estaci&#xFFFD; ferrovi&#xFFFD;ria en superf&#xFFFD;cie. L\u0019estaci&#xFFFD; en superf&#xFFFD;cie est&#xFFFD; encaixada en trinxera entre muntanyes i disposa d\u0019una platja de 9 vies amb andana. Del pas inferior en surten passadissos que condueixen cap a un distribu&#xFFFD;dor que porta b&#xFFFD; a l\u0019estaci&#xFFFD; ferrovi&#xFFFD;ria subterr&#xFFFD;nia, de les quals nom&#xFFFD;s estan en servei una de les dues vies; o b&#xFFFD; cap a l\u0019estaci&#xFFFD; de metro a trav&#xFFFD;s d\u0019una s&#xFFFD;rie de passadissos. L\u0019estaci&#xFFFD; de metro disposa d\u0019un vest&#xFFFD;bul semisoterrat, que connecta amb l\u0019entresol, situat al nivell superior de l\u0019andana, a trav&#xFFFD;s d\u0019una escalinata. </p> </div> <div class=\"col-12 d-none\" id=\"com_Charleroi\"> <p>El premetro de Charleroi consta d&apos;una l&#xFFFD;nia circular que encercla el centre de la ciutat i tres ramals cap als suburbis i els pobles de la rodalia. La xarxa s&apos;explota com a quatre serveis radials, que comencen al bucle del centre.</p> <p>L&apos;anell central &#xFFFD;s una barreja de tramvia amb prioritat (entre Tirou i Gare Centrale) i una l&#xFFFD;nia segregada, majorit&#xFFFD;riament subterr&#xFFFD;nia, per&#xFFFD; amb un tram elevat entre Gare Centrale i Palais. El ramal de la l&#xFFFD;nia 4 funciona completament segregat i els tramvies circulen pel costat esquerre, mentre que la l&#xFFFD;nia 1 i 2 tamb&#xFFFD; est&#xFFFD; segregada entre el centre i P&#xFFFD;tria. Aquestes darreres l&#xFFFD;nies ciculen com a tramvia entre P&#xFFFD;tria i Monument, igual que la l&#xFFFD;nia 3 un cop passat Piges.</p> <p>Les estacions s&#xFFFD;n senzilles. Independentment de si s&#xFFFD;n en viaducte o en t&#xFFFD;nel, gaireb&#xFFFD; totes disposen d&apos;una andana central, a la qual s&apos;hi accedeix des d&apos;un acc&#xFFFD;s directe des del carrer, a vegades passant per un nivell intermedi.</p> <p>L&apos;estaci&#xFFFD; de Palais disposa de quatre vies, dues en servei, una tercera sense servei habitual i una quarta amb un servei passant que dirigeix a un bucle que inverteix la marxa de les l&#xFFFD;nies 2 i 3 de tramvia. L&apos;estaci&#xFFFD; Waterloo disposa de dues andanes i tres vies, per&#xFFFD; nom&#xFFFD;s est&#xFFFD; en funcionament l&apos;andana central.</p> </div> <div class=\"col-12 d-none\" id=\"com_Montreal\"> <p>El metro de Montreal consta d\u0019una xarxa de 4 l&#xFFFD;nies amb rodaments pneum&#xFFFD;tics. Gaireb&#xFFFD; la totalitat de la xarxa va ser constru&#xFFFD;da durant els anys 60, 70 i 80 i es caracteritza per ser un metro totalment subterrani, on sovint els t&#xFFFD;nels segueixen el tra&#xFFFD;at dels carrers, encara que no sigui una norma.</p> <p>Cada estaci&#xFFFD; disposa d\u0019una arquitectura i una decoraci&#xFFFD; diferent, de la mateixa manera que tamb&#xFFFD; hi ha vari&#xFFFD;ncia pel que fa a la fond&#xFFFD;ria de les estacions. No obstant, la majoria d\u0019estacions tenen dues andanes laterals de 500 peus de llarg (152,4 m) i tots els accessos disposen d\u0019edicles amb portes que protegeixen de les temperatures a l\u0019hivern. En alguns casos aquests edicles tamb&#xFFFD; allotgen els vest&#xFFFD;buls.</p> <p>Les estacions de correspond&#xFFFD;ncia entre l&#xFFFD;nies de metro tenen transbordaments l&#xFFFD;gics i r&#xFFFD;pids. Destaquen Snowdon i Lionel-Groulx, que disposen de dues andanes sobreposades on es pot fer transbordament cross-platform. A Berri-UQAM les andanes de les l&#xFFFD;nies verda i taronja es creuen a nivells contigus. A Jean-Talon, el transbordament entre les l&#xFFFD;nies taronja i blava tamb&#xFFFD; &#xFFFD;s curt, amb l\u0019afegit que les andanes estan sobreposades.</p> <p>Una caracter&#xFFFD;stica de Montreal &#xFFFD;s que al centre de la ciutat, les estacions de metro estan connectades directament amb la ciutat subterr&#xFFFD;nia anomenada R&#xFFFD;SO, que connecta les illes de cases per sota terra.</p> </div> <div class=\"col-12 d-none\" id=\"com_Ottawa\"> <p>El transport ferroviari d\u0019Ottawa (O-Train) consta d\u0019una l&#xFFFD;nia de metro lleuger est-oest anomenada Confederation Line, a la que s\u0019hi suma una segona l&#xFFFD;nia ferrovi&#xFFFD;ria nord-sud (Trillium Line) amb explotaci&#xFFFD; di&#xFFFD;sel.</p> <p>Tota la xarxa &#xFFFD;s en superf&#xFFFD;cie, exceptuant el tram central de la Confederation Line, que discorre a una profunditat d\u0019entre 17 i 25 metres sota terra. Les tres estacions subterr&#xFFFD;nies disposen d\u0019andanes laterals situades al nivell m&#xFFFD;s inferior, que connecten amb uns vest&#xFFFD;buls situats a un altell sobre les andanes. Cada estaci&#xFFFD; disposa de dos accessos independents, situats en cadascun dels extrems de les andanes, als quals s\u0019hi accedeix a trav&#xFFFD;s de diferents vols d\u0019escales.</p> <p>Les estacions del tram en superf&#xFFFD;cie poden estar situades a nivell de carrer, elevades o en trinxera i la majoria disposen d\u0019andanes laterals. Destaquen els intercanviadors entre metro lleuger i bus, com a Tunney\u0019s Pasture, Hurdman o Blair, que garanteixen un transbordament curt.</p> <p>Ottawa tamb&#xFFFD; disposa de diversos BRTs, alguns dels quals amb infraestructura completament segregada, incloent baixadors amb infraestructura semblant a les d\u0019estacions ferrovi&#xFFFD;ries, incloent escales autom&#xFFFD;tiques, ascensors i vest&#xFFFD;buls amb validadores.</p> </div> <div class=\"col-12 d-none\" id=\"com_Toronto\"> <p>El metro de Toronto disposa de tres l&#xFFFD;nies. La xarxa &#xFFFD;s molt superficial i en alguns trams va en superf&#xFFFD;cie.</p> <p>Una particularitat dels trams m&#xFFFD;s antics del metro de Toronto &#xFFFD;s que el tra&#xFFFD;at dels t&#xFFFD;nels va en paral&#xFFFD;lel amb els carrers, per&#xFFFD; despla&#xFFFD;ats unes desenes de metres cap a les illes de cases. A causa del m&#xFFFD;tode de construcci&#xFFFD; cut-and-cover en aquests trams, va caldre expropiar i enderrocar els edificis existents. Alguna d\u0019aquestes esplanades es van aprofitar per construir-hi intercanviadors que disposen d\u0019andanes per a tramvies i autobusos situats al voltant de l\u0019edifici de viatgers, que serveix alhora d\u0019acc&#xFFFD;s al metro. Totes les andanes d\u0019autobusos i tramvies es troben a la zona de pagament de l\u0019estaci&#xFFFD;, de manera que sempre s\u0019ha garantit un transbordament gratu&#xFFFD;t entre el metro i els mitjans de superf&#xFFFD;cie.</p> <p>Pel que fa als transbordaments entre l&#xFFFD;nies de metro, a Sheppard-Yonge, Bloor-Yonge i St. George es garanteix un transbordament directe a trav&#xFFFD;s d\u0019un sol vol d\u0019escales, mentre que a Spadina el transbordament es fa a trav&#xFFFD;s d\u0019un passad&#xFFFD;s de m&#xFFFD;s de 200 metres de llarg.</p> </div> <div class=\"col-12 d-none\" id=\"com_Calgary\"> <p>Calgary disposa d\u0019un metro lleuger anomenat C-Train. Al centre de la ciutat funciona com un tramvia, amb les estacions molt properes les unes a les altres, per&#xFFFD; als suburbis l\u0019espaiament entre estacions &#xFFFD;s superior i disposa de plataforma pr&#xFFFD;pia, encara que en algunes cru&#xFFFD;lles hi ha passos a nivell.</p> <p>Pel que fa a les estacions, nom&#xFFFD;s n\u0019hi ha una de subterr&#xFFFD;nia (Westbrook). Algunes altres estacions tenen acc&#xFFFD;s a les andanes a trav&#xFFFD;s de pas a nivell, mentre que en altres estacions es resol a trav&#xFFFD;s de passos superiors que condueixen a les andanes passant per vest&#xFFFD;buls amb sales d\u0019espera.</p> </div> <div class=\"col-12 d-none\" id=\"com_Vancouver\"> <p>L\u0019Skytrain de Vancouver est&#xFFFD; format per tres l&#xFFFD;nies de metro autom&#xFFFD;tic. La xarxa t&#xFFFD; una forma radial i nom&#xFFFD;s dues de les tres l&#xFFFD;nies arriben fins al downtown. Tal i com diu el nom, la majoria del metro &#xFFFD;s elevat, amb l\u0019excepci&#xFFFD; dels trams m&#xFFFD;s c&#xFFFD;ntrics.</p> <p>L\u0019Expo Line circula pel centre amb un t&#xFFFD;nel a dos nivells, amb les estacions situades a una profunditat considerable. La Canada Line &#xFFFD;s molt m&#xFFFD;s superficial i cada estaci&#xFFFD; disposa d\u0019una topologia diferent: Waterfront, Vancouver City Centre, Yaletown-Roundhouse i Olympic Village disposen d\u0019un vest&#xFFFD;bul al nivell -1 i d\u0019una andana central al nivell -2; King Edward t&#xFFFD; les andanes sobreposades i Oakridge i Langara tenen les andanes al nivell -1 connectades a trav&#xFFFD;s d\u0019un pas inferior.</p> <p>El principal intercanviador de la xarxa, Waterfront, &#xFFFD;s la terminal de les l&#xFFFD;nies Expo i Canada, a m&#xFFFD;s del tren de rodalies i del ferri a North Vancouver. El transbordament est&#xFFFD; mal resolt, ja que la Canada Line est&#xFFFD; en una zona de validadores a&#xFFFD;llada de la resta de l&#xFFFD;nies, a banda que la dist&#xFFFD;ncia entre aquesta l&#xFFFD;nia i el ferri &#xFFFD;s de 350 m.</p> </div> <div class=\"col-12 d-none\" id=\"com_Seattle\"> <p>Seattle disposa d\u0019una l&#xFFFD;nia de metro lleuger. Inicialment es va construir un t&#xFFFD;nel per a autobusos i troleibusos al centre de la ciutat, entre International District / Chinatown i Westlake, que va ser obert el 1990. Les estacions d\u0019aquest tram disposaven d\u0019andanes laterals al nivell -2 i de dos vest&#xFFFD;buls al nivell -1. Les andanes estaven espaiades suficientment per tal que un autob&#xFFFD;s pogu&#xFFFD;s avan&#xFFFD;ar-ne a un altre.</p> <p>L\u0019any 2005 va tancar el t&#xFFFD;nel per reconvertir-lo a metro lleuger, que es va obrir el 2009. Fins el 2019 hi va haver operaci&#xFFFD; mixta entre autob&#xFFFD;s i metro lleuger. El 2016 es va ampliar la xarxa cap al nord, obrint un tram de 4 estacions subterr&#xFFFD;nies i una d\u0019elevada. Les andanes de les estacions subterr&#xFFFD;nies es troben a una fond&#xFFFD;ria de m&#xFFFD;s de 20 metres i cadascuna disposa d\u0019una topologia diferent.</p> <p>Al costat sud tamb&#xFFFD; hi ha l\u0019estaci&#xFFFD; Beacon Field, a la qual nom&#xFFFD;s s\u0019hi pot accedir amb quatre ascensors de gran capacitat que baixen fins a les andanes, situades a una cinquantena de metres sota terra.</p> </div> <div class=\"col-12 d-none\" id=\"com_Estocolm\"> <p>Estocolm t&#xFFFD; tres l&#xFFFD;nies de metro troncals que travessen el centre de la ciutat i que es bifurquen en dos o tres ramals en cada extrem. La ciutat est&#xFFFD; formada per un arxip&#xFFFD;lag d\u0019illes. A causa de la complicada geografia i geologia, les l&#xFFFD;nies de metro combinen trams en superf&#xFFFD;cie, en viaducte, subterr&#xFFFD;nies superficials i subterr&#xFFFD;nies a gran profunditat.</p> <p>En general, la l&#xFFFD;nia verda, que fou la primera, &#xFFFD;s la m&#xFFFD;s superficial. Pel centre ho fa en t&#xFFFD;nels constru&#xFFFD;ts amb el m&#xFFFD;tode cut-and-cover, molt superficials, i als suburbis la l&#xFFFD;nia &#xFFFD;s elevada o en superf&#xFFFD;cie. La l&#xFFFD;nia vermella combina trams subterranis a molta profunditat (nord) i la combinaci&#xFFFD; de trams en superf&#xFFFD;cie i a gran profunditat (sud). La l&#xFFFD;nia blava circula a molta profunditat en gaireb&#xFFFD; tota la longitud.</p> <p>Pel que fa a les estacions, totes s&#xFFFD;n accessibles a PMR gr&#xFFFD;cies a la instal&#xFFFD;laci&#xFFFD; d\u0019ascensors. En general les estacions m&#xFFFD;s profundes tenen dues andanes centrals al nivell m&#xFFFD;s inferior (-2), que connecten amb els vest&#xFFFD;buls situats arran de superf&#xFFFD;cie (nivell -1) o en superf&#xFFFD;cie a trav&#xFFFD;s d\u0019un vol de 3 o 4 escales mec&#xFFFD;niques en paral&#xFFFD;lel, de llarg recorregut, a m&#xFFFD;s d\u0019un ascensor inclinat que tamb&#xFFFD; va en paral&#xFFFD;lel.</p> <p>Al tram Slussen \u0013 T-Centralen les vies de les l&#xFFFD;nies verdes i vermelles circulen en paral&#xFFFD;lel. Les vies es reposicionen les unes respecte les altres entre Gamla Stan i T-Centralen per garantir transbordaments cross-platform a les tres estacions d\u0019aquesta secci&#xFFFD;.</p> </div> <div class=\"col-12 d-none\" id=\"com_Leipzig\"> <p>Leipzig disposa d\u0019un passant ferroviari amb quatre estacions subterr&#xFFFD;nies, amb andanes centrals al nivell m&#xFFFD;s profund. Tot i que els t&#xFFFD;nels s&#xFFFD;n bitubs i han estat constru&#xFFFD;ts amb tuneladores, les estacions s\u0019han constru&#xFFFD;t amb cut-and-cover, exceptuant Hauptbahnhof, que es va construir en mina.</p> </div> <div class=\"col-12 d-none\" id=\"com_Karlsruhe\"> <p>Karlsruhe disposa d\u0019un sistema de tren-tram. L\u0019any 2021 va entrar en servei un t&#xFFFD;nel en forma de T que disposa de 6 estacions, una de les quals &#xFFFD;s doble. Totes les estacions disposen d\u0019andanes laterals situades al nivell -2, tret de Kongresszentrum, que les t&#xFFFD; al nivell -1. El nivell -1 de la resta d\u0019estacions est&#xFFFD; format per diversos vest&#xFFFD;buls, des dels quals hi convergeixen entre 1 i 3 accessos.</p> <p>Les andanes tenen la particularitat de tenir seccions amb diferents al&#xFFFD;&#xFFFD;ries, per poder ser compatible amb tot el material m&#xFFFD;bil.</p> </div> </div>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://front-end.social/@argyleink/113834229298080017"],"published":["2025-01-16T10:22:54.585Z"],"mp-slug":["10-22-54"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/01/16/10-22-54"]},"references":{"https://front-end.social/@argyleink/113834229298080017":{"type":["h-entry"],"properties":{"url":["https://front-end.social/@argyleink/113834229298080017"],"name":["Adam Argyle (@argyleink@front-end.social)"],"summary":["Attached: 3 images #CSS **`scroll-state()` container queries** in Chrome 133 ```css @container scroll-state(stuck: top) { & } ``` Read all about snapped, stuck and scrollable in this post:&hellip;"],"content":[{"html":"<body class=\"app-body theme-system no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://cartosvg.com"],"published":["2025-01-14T10:57:04.166Z"],"mp-slug":["10-57-04"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/01/14/10-57-04"]},"references":{"https://cartosvg.com":{"type":["h-entry"],"properties":{"url":["https://cartosvg.com"],"name":["Examples"],"summary":["CartoSVG uses SVG elements, which are interactive by nature.The maps are given depth through filters and rich styling possibilities.Just copy / paste the exported file into your HTML, and you're&hellip;"],"content":[{"html":"<div><div class=\"home-row homepage-container\"><p class=\"text-container\"><section class=\"text-block\"><p class=\"text-body\">CartoSVG uses SVG elements, which are interactive by nature.</p></section></p><p class=\"text-container\"><section class=\"text-block promo-2-desc\"><p class=\"text-body\">The maps are given depth through filters and rich styling possibilities.</p></section></p><p class=\"text-container\"><section class=\"text-block l-pad-top-2\"><p class=\"text-body\">Just copy / paste the exported file into your HTML, and you&apos;re done!</p></section></p><p class=\"text-container\"><section class=\"text-block l-pad-top-2\"><p class=\"text-body\">The final file size is made as small as possible using diverse optimization techniques, and compresses well.</p></section></p></div><p class=\"home-row\"><section><p>Here follows 4 examples built with CartoSVG. This entire page weights 470Ko, ~110 gzipped.</p><h2>La Bella Italia</h2><p>See the <a href=\"italia.html\">standalone example in the app </a>for more information</p><h2>Mercator projection</h2><p>See the <a href=\"mercator.html\">standalone example in the app </a>for more information</p><h2>USA Elections</h2><p>See the <a href=\"usa.html\">standalone example in the app </a>for more information</p><div class=\"example-map\"><svg id=\"dksegbzwd-\" width=\"650\" height=\"369\"><defs><pattern id=\"dksegbzwd--noise\" width=\"60\" height=\"60\"><path/></pattern><filter id=\"dksegbzwd--secondGlow\"><femorphology/><fecolormatrix type=\"matrix\"/><fegaussianblur/><fecomposite/><femorphology/><fecomponenttransfer><fefunca type=\"linear\"/></fecomponenttransfer><fegaussianblur/><fecolormatrix type=\"matrix\"/><fecomposite/><femerge><femergenode/><femergenode/></femerge></filter></defs><svg><g id=\"outline\"><path class=\"outline\"/></g><g id=\"United States of America ADM1\" class=\"choro\"><path id=\"Mississippi\" class=\"adm ssc-1-1\"/><path id=\"North Carolina\" class=\"adm ssc-1-2\"/><path id=\"Oklahoma\" class=\"adm ssc-1-1\"/><path id=\"Virginia\" class=\"adm ssc-1-5\"/><path id=\"West Virginia\" class=\"adm ssc-1-1\"/><path id=\"Louisiana\" class=\"adm ssc-1-1\"/><path id=\"Michigan\" class=\"adm ssc-1-4\"/><path id=\"Massachusetts\" class=\"adm ssc-1-4\"/><path id=\"Idaho\" class=\"adm ssc-1-1\"/><path id=\"Florida\" class=\"adm ssc-1-0\"/><path id=\"Nebraska\" class=\"adm ssc-1-1\"/><path id=\"Washington\" class=\"adm ssc-1-4\"/><path id=\"New Mexico\" class=\"adm ssc-1-4\"/><path id=\"South Dakota\" class=\"adm ssc-1-1\"/><path id=\"Texas\" class=\"adm ssc-1-1\"/><path id=\"California\" class=\"adm ssc-1-4\"/><path id=\"Alabama\" class=\"adm ssc-1-1\"/><path id=\"Georgia\" class=\"adm ssc-1-1\"/><path id=\"Pennsylvania\" class=\"adm ssc-1-4\"/><path id=\"Missouri\" class=\"adm ssc-1-1\"/><path id=\"Colorado\" class=\"adm ssc-1-5\"/><path id=\"Utah\" class=\"adm ssc-1-1\"/><path id=\"Tennessee\" class=\"adm ssc-1-1\"/><path id=\"Wyoming\" class=\"adm ssc-1-1\"/><path id=\"New York\" class=\"adm ssc-1-4\"/><path id=\"Kansas\" class=\"adm ssc-1-1\"/><path id=\"Alaska\" class=\"adm ssc-1-1\"/><path id=\"Nevada\" class=\"adm ssc-1-3\"/><path id=\"Illinois\" class=\"adm ssc-1-4\"/><path id=\"Vermont\" class=\"adm ssc-1-4\"/><path id=\"Montana\" class=\"adm ssc-1-1\"/><path id=\"Iowa\" class=\"adm ssc-1-5\"/><path id=\"South Carolina\" class=\"adm ssc-1-1\"/><path id=\"New Hampshire\" class=\"adm ssc-1-5\"/><path id=\"Arizona\" class=\"adm ssc-1-1\"/><path id=\"District of Columbia\" class=\"adm ssc-1-6\"/><path id=\"New Jersey\" class=\"adm ssc-1-4\"/><path id=\"Maryland\" class=\"adm ssc-1-4\"/><path id=\"Maine\" class=\"adm ssc-1-4\"/><path id=\"Hawaii\" class=\"adm ssc-1-4\"/><path id=\"Delaware\" class=\"adm ssc-1-4\"/><path id=\"Rhode Island\" class=\"adm ssc-1-4\"/><path id=\"Kentucky\" class=\"adm ssc-1-1\"/><path id=\"Ohio\" class=\"adm ssc-1-0\"/><path id=\"Wisconsin\" class=\"adm ssc-1-4\"/><path id=\"Oregon\" class=\"adm ssc-1-4\"/><path id=\"North Dakota\" class=\"adm ssc-1-1\"/><path id=\"Arkansas\" class=\"adm ssc-1-1\"/><path id=\"Indiana\" class=\"adm ssc-1-1\"/><path id=\"Minnesota\" class=\"adm ssc-1-4\"/><path id=\"Connecticut\" class=\"adm ssc-1-4\"/></g><g id=\"United States of America-img\" class=\"country-img\"/><g id=\"svg-map-legend\"><g id=\"United States of America ADM1-legend-group\"><text id=\"United States of America ADM1-legend-title\"><tspan id=\"United States of America ADM1-legend-title-0\">Political</tspan><tspan id=\"United States of America ADM1-legend-title-1\">party</tspan></text><g><path/><text>Light Democrat</text></g><g><path/><text>Democrat</text></g><g><path/><text>Heavy Democrat</text></g><g><path/><text>Light Republican</text></g><g><path/><text>Republican</text></g><g><path/><text>Undecided</text></g></g></g></svg><rect id=\"frame\" width=\"650\" height=\"369\"/></svg></div><h2>Ukraine population</h2><p>See the <a href=\"ukraine.html\">standalone example in the app </a>for more information</p></section></p></div>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://www.mshr.app"],"published":["2025-01-14T10:55:02.161Z"],"mp-slug":["10-55-02"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/01/14/10-55-02"]},"references":{"https://www.mshr.app":{"type":["h-entry"],"properties":{"url":["https://www.mshr.app"],"name":["CSS mesh gradients"],"summary":["A collection of 732 vanilla CSS mesh gradients free for you to use in any of your projects. Browse our generated meshes or create your own custom mesh with our App."],"content":[{"html":"<div><div class=\"max-w-3xl w-full flex flex-col gap-4 mx-auto px-4 py-4 lg:py-10 text-center text-base font-normal\"><p>A collection of 732 vanilla CSS mesh gradients free for you to use in any of your projects. Browse our generated meshes or create your own custom mesh with our <a class=\"underline text-accent-500\" href=\"/create/new\">App</a>.</p></div></div>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://developer.chrome.com/docs/css-ui/css-field-sizing"],"published":["2025-01-14T10:52:29.842Z"],"mp-slug":["10-52-29"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2025/01/14/10-52-29"]},"references":{"https://developer.chrome.com/docs/css-ui/css-field-sizing":{"type":["h-entry"],"properties":{"url":["https://developer.chrome.com/docs/css-ui/css-field-sizing"],"name":["CSS field-sizing | Chrome for Developers"],"summary":["One line of code for auto sizing elements with editable content."],"content":[{"html":"<div><devsite-feature-tooltip class=\"devsite-page-bookmark-tooltip nocontent\" id=\"devsite-collections-dropdown\"> <devsite-bookmark></devsite-bookmark> <p> Stay organized with collections </p> <p> Save and categorize content based on your preferences. </p> </devsite-feature-tooltip><div class=\"devsite-article-body clearfix \"> <p>One line of code for auto sizing elements with editable content.</p> <p>Without <code>field-sizing</code>, to create a well-sized input field you had to either\nguess at an average size of a text field input or use JavaScript to count\ncharacters and increase the element height or width as the user entered text. In\nother words, it wasn&apos;t easy, and it was error prone when trying to follow the\ncontent that a user had entered into an input.</p> <video class=\"center\" width=\"1242\" height=\"698\"> <source src=\"/static/docs/css-ui/css-field-sizing/media/field-sizing-problem.mp4\" type=\"video/mp4\">\n</video> <p>With <code>field-sizing</code>, you need one line of CSS to enable sizing based on the\ncontent. This content based sizing style also works for more than a textarea!</p>\n<devsite-code><pre class=\"devsite-click-to-copy\"><code><span class=\"devsite-syntax-nt\">textarea</span><span class=\"devsite-syntax-o\">,</span><span class=\"devsite-syntax-w\"> </span><span class=\"devsite-syntax-nt\">select</span><span class=\"devsite-syntax-o\">,</span><span class=\"devsite-syntax-w\"> </span><span class=\"devsite-syntax-nt\">input</span><span class=\"devsite-syntax-w\"> </span><span class=\"devsite-syntax-p\">{</span>\n<span class=\"devsite-syntax-w\"> </span><span class=\"devsite-syntax-n\">field-sizing</span><span class=\"devsite-syntax-p\">:</span><span class=\"devsite-syntax-w\"> </span><span class=\"devsite-syntax-k\">content</span><span class=\"devsite-syntax-p\">;</span>\n<span class=\"devsite-syntax-p\">}</span>\n</code></pre></devsite-code>\n<video class=\"center\" width=\"1242\" height=\"698\"> <source src=\"/static/docs/css-ui/css-field-sizing/media/field-sizing-fixed.mp4\" type=\"video/mp4\">\n</video> <p> <div class=\"dcc-browser-compat\"> <p>Browser Support</p> <ul> <li> <img alt=\"Chrome: 123.\" src=\"data:image/svg+xml,%3Csvg xmlns=&apos;http://www.w3.org/2000/svg&apos; width=&apos;24&apos; height=&apos;24&apos; viewBox=&apos;-10 -10 276 276&apos;%3E%3ClinearGradient id=&apos;a&apos; x1=&apos;145&apos; x2=&apos;34&apos; y1=&apos;253&apos; y2=&apos;61&apos; gradientUnits=&apos;userSpaceOnUse&apos;%3E%3Cstop offset=&apos;0&apos; stop-color=&apos;%231e8e3e&apos;/%3E%3Cstop offset=&apos;1&apos; stop-color=&apos;%2334a853&apos;/%3E%3C/linearGradient%3E%3ClinearGradient id=&apos;b&apos; x1=&apos;111&apos; x2=&apos;222&apos; y1=&apos;254&apos; y2=&apos;62&apos; gradientUnits=&apos;userSpaceOnUse&apos;%3E%3Cstop offset=&apos;0&apos; stop-color=&apos;%23fcc934&apos;/%3E%3Cstop offset=&apos;1&apos; stop-color=&apos;%23fbbc04&apos;/%3E%3C/linearGradient%3E%3ClinearGradient id=&apos;c&apos; x1=&apos;17&apos; x2=&apos;239&apos; y1=&apos;80&apos; y2=&apos;80&apos; gradientUnits=&apos;userSpaceOnUse&apos;%3E%3Cstop offset=&apos;0&apos; stop-color=&apos;%23d93025&apos;/%3E%3Cstop offset=&apos;1&apos; stop-color=&apos;%23ea4335&apos;/%3E%3C/linearGradient%3E%3Ccircle cx=&apos;128&apos; cy=&apos;128&apos; r=&apos;64&apos; fill=&apos;%23fff&apos;/%3E%3Cpath fill=&apos;url(%23a)&apos; d=&apos;M96 183a64 64 0 0 1-23-23L17 64a128 128 0 0 0 111 192l55-96a64 64 0 0 1-87 23Z&apos;/%3E%3Cpath fill=&apos;url(%23b)&apos; d=&apos;M192 128a64 64 0 0 1-9 32l-55 96A128 128 0 0 0 239 64H128a64 64 0 0 1 64 64Z&apos;/%3E%3Ccircle cx=&apos;128&apos; cy=&apos;128&apos; r=&apos;52&apos; fill=&apos;%231a73e8&apos;/%3E%3Cpath fill=&apos;url(%23c)&apos; d=&apos;M96 73a64 64 0 0 1 32-9h111a128 128 0 0 0-222 0l56 96a64 64 0 0 1 23-87Z&apos;/%3E%3C/svg%3E\"> <span> 123 </span> </li> <li> <img alt=\"Edge: 123.\" src=\"data:image/svg+xml,%3Csvg xmlns=&apos;http://www.w3.org/2000/svg&apos; xmlns:xlink=&apos;http://www.w3.org/1999/xlink&apos; width=&apos;24&apos; height=&apos;24&apos; viewBox=&apos;0 0 27600 27600&apos;%3E%3ClinearGradient id=&apos;A&apos; gradientUnits=&apos;userSpaceOnUse&apos;/%3E%3ClinearGradient id=&apos;B&apos; x1=&apos;6870&apos; x2=&apos;24704&apos; y1=&apos;18705&apos; y2=&apos;18705&apos; xlink:href=&apos;%23A&apos;%3E%3Cstop offset=&apos;0&apos; stop-color=&apos;%230c59a4&apos;/%3E%3Cstop offset=&apos;1&apos; stop-color=&apos;%23114a8b&apos;/%3E%3C/linearGradient%3E%3ClinearGradient id=&apos;C&apos; x1=&apos;16272&apos; x2=&apos;5133&apos; y1=&apos;10968&apos; y2=&apos;23102&apos; xlink:href=&apos;%23A&apos;%3E%3Cstop offset=&apos;0&apos; stop-color=&apos;%231b9de2&apos;/%3E%3Cstop offset=&apos;.16&apos; stop-color=&apos;%231595df&apos;/%3E%3Cstop offset=&apos;.67&apos; stop-color=&apos;%230680d7&apos;/%3E%3Cstop offset=&apos;1&apos; stop-color=&apos;%230078d4&apos;/%3E%3C/linearGradient%3E%3CradialGradient id=&apos;D&apos; cx=&apos;16720&apos; cy=&apos;18747&apos; r=&apos;9538&apos; xlink:href=&apos;%23A&apos;%3E%3Cstop offset=&apos;.72&apos; stop-opacity=&apos;0&apos;/%3E%3Cstop offset=&apos;.95&apos; stop-opacity=&apos;.53&apos;/%3E%3Cstop offset=&apos;1&apos;/%3E%3C/radialGradient%3E%3CradialGradient id=&apos;E&apos; cx=&apos;7130&apos; cy=&apos;19866&apos; r=&apos;14324&apos; gradientTransform=&apos;matrix(.14843 -.98892 .79688 .1196 -8759 25542)&apos; xlink:href=&apos;%23A&apos;%3E%3Cstop offset=&apos;.76&apos; stop-opacity=&apos;0&apos;/%3E%3Cstop offset=&apos;.95&apos; stop-opacity=&apos;.5&apos;/%3E%3Cstop offset=&apos;1&apos;/%3E%3C/radialGradient%3E%3CradialGradient id=&apos;F&apos; cx=&apos;2523&apos; cy=&apos;4680&apos; r=&apos;20243&apos; gradientTransform=&apos;matrix(-.03715 .99931 -2.12836 -.07913 13579 3530)&apos; xlink:href=&apos;%23A&apos;%3E%3Cstop offset=&apos;0&apos; stop-color=&apos;%2335c1f1&apos;/%3E%3Cstop offset=&apos;.11&apos; stop-color=&apos;%2334c1ed&apos;/%3E%3Cstop offset=&apos;.23&apos; stop-color=&apos;%232fc2df&apos;/%3E%3Cstop offset=&apos;.31&apos; stop-color=&apos;%232bc3d2&apos;/%3E%3Cstop offset=&apos;.67&apos; stop-color=&apos;%2336c752&apos;/%3E%3C/radialGradient%3E%3CradialGradient id=&apos;G&apos; cx=&apos;24247&apos; cy=&apos;7758&apos; r=&apos;9734&apos; gradientTransform=&apos;matrix(.28109 .95968 -.78353 .22949 24510 -16292)&apos; xlink:href=&apos;%23A&apos;%3E%3Cstop offset=&apos;0&apos; stop-color=&apos;%2366eb6e&apos;/%3E%3Cstop offset=&apos;1&apos; stop-color=&apos;%2366eb6e&apos; stop-opacity=&apos;0&apos;/%3E%3C/radialGradient%3E%3Cpath id=&apos;H&apos; d=&apos;M24105 20053a9345 9345 0 01-1053 472 10202 10202 0 01-3590 646c-4732 0-8855-3255-8855-7432 0-1175 680-2193 1643-2729-4280 180-5380 4640-5380 7253 0 7387 6810 8137 8276 8137 791 0 1984-230 2704-456l130-44a12834 12834 0 006660-5282c220-350-168-757-535-565z&apos;/%3E%3Cpath id=&apos;I&apos; d=&apos;M11571 25141a7913 7913 0 01-2273-2137 8145 8145 0 01-1514-4740 8093 8093 0 013093-6395 8082 8082 0 011373-859c312-148 846-414 1554-404a3236 3236 0 012569 1297 3184 3184 0 01636 1866c0-21 2446-7960-8005-7960-4390 0-8004 4166-8004 7820 0 2319 538 4170 1212 5604a12833 12833 0 007684 6757 12795 12795 0 003908 610c1414 0 2774-233 4045-656a7575 7575 0 01-6278-803z&apos;/%3E%3Cpath id=&apos;J&apos; d=&apos;M16231 15886c-80 105-330 250-330 566 0 260 170 512 472 723 1438 1003 4149 868 4156 868a5954 5954 0 003027-839 6147 6147 0 001133-850 6180 6180 0 001910-4437c26-2242-796-3732-1133-4392-2120-4141-6694-6525-11668-6525-7011 0-12703 5635-12798 12620 47-3654 3679-6605 7996-6605 350 0 2346 34 4200 1007 1634 858 2490 1894 3086 2921 618 1067 728 2415 728 2952s-271 1333-780 1990z&apos;/%3E%3Cuse fill=&apos;url(%23B)&apos; xlink:href=&apos;%23H&apos;/%3E%3Cuse fill=&apos;url(%23D)&apos; opacity=&apos;.35&apos; xlink:href=&apos;%23H&apos;/%3E%3Cuse fill=&apos;url(%23C)&apos; xlink:href=&apos;%23I&apos;/%3E%3Cuse fill=&apos;url(%23E)&apos; opacity=&apos;.4&apos; xlink:href=&apos;%23I&apos;/%3E%3Cuse fill=&apos;url(%23F)&apos; xlink:href=&apos;%23J&apos;/%3E%3Cuse fill=&apos;url(%23G)&apos; xlink:href=&apos;%23J&apos;/%3E%3C/svg%3E\"> <span> 123 </span> </li> <li> <img alt=\"Firefox: not supported.\" src=\"data:image/svg+xml,%3Csvg xmlns=&apos;http://www.w3.org/2000/svg&apos; width=&apos;24&apos; height=&apos;24&apos; viewBox=&apos;0 0 512 512&apos;%3E%3Cdefs%3E%3CradialGradient id=&apos;ff-b&apos; cx=&apos;428.5&apos; cy=&apos;55.1&apos; r=&apos;501&apos; gradientUnits=&apos;userSpaceOnUse&apos;%3E%3Cstop offset=&apos;.1&apos; stop-color=&apos;%23ffbd4f&apos;/%3E%3Cstop offset=&apos;.2&apos; stop-color=&apos;%23ffac31&apos;/%3E%3Cstop offset=&apos;.3&apos; stop-color=&apos;%23ff9d17&apos;/%3E%3Cstop offset=&apos;.3&apos; stop-color=&apos;%23ff980e&apos;/%3E%3Cstop offset=&apos;.4&apos; stop-color=&apos;%23ff563b&apos;/%3E%3Cstop offset=&apos;.5&apos; stop-color=&apos;%23ff3750&apos;/%3E%3Cstop offset=&apos;.7&apos; stop-color=&apos;%23f5156c&apos;/%3E%3Cstop offset=&apos;.8&apos; stop-color=&apos;%23eb0878&apos;/%3E%3Cstop offset=&apos;.9&apos; stop-color=&apos;%23e50080&apos;/%3E%3C/radialGradient%3E%3CradialGradient id=&apos;ff-c&apos; cx=&apos;245.4&apos; cy=&apos;259.9&apos; r=&apos;501&apos; gradientUnits=&apos;userSpaceOnUse&apos;%3E%3Cstop offset=&apos;.3&apos; stop-color=&apos;%23960e18&apos;/%3E%3Cstop offset=&apos;.3&apos; stop-color=&apos;%23b11927&apos; stop-opacity=&apos;.7&apos;/%3E%3Cstop offset=&apos;.4&apos; stop-color=&apos;%23db293d&apos; stop-opacity=&apos;.3&apos;/%3E%3Cstop offset=&apos;.5&apos; stop-color=&apos;%23f5334b&apos; stop-opacity=&apos;.1&apos;/%3E%3Cstop offset=&apos;.5&apos; stop-color=&apos;%23ff3750&apos; stop-opacity=&apos;0&apos;/%3E%3C/radialGradient%3E%3CradialGradient id=&apos;ff-d&apos; cx=&apos;305.8&apos; cy=&apos;-58.6&apos; r=&apos;363&apos; gradientUnits=&apos;userSpaceOnUse&apos;%3E%3Cstop offset=&apos;.1&apos; stop-color=&apos;%23fff44f&apos;/%3E%3Cstop offset=&apos;.3&apos; stop-color=&apos;%23ffdc3e&apos;/%3E%3Cstop offset=&apos;.5&apos; stop-color=&apos;%23ff9d12&apos;/%3E%3Cstop offset=&apos;.5&apos; stop-color=&apos;%23ff980e&apos;/%3E%3C/radialGradient%3E%3CradialGradient id=&apos;ff-e&apos; cx=&apos;190&apos; cy=&apos;390.8&apos; r=&apos;238.6&apos; gradientUnits=&apos;userSpaceOnUse&apos;%3E%3Cstop offset=&apos;.3&apos; stop-color=&apos;%233a8ee6&apos;/%3E%3Cstop offset=&apos;.5&apos; stop-color=&apos;%235c79f0&apos;/%3E%3Cstop offset=&apos;.7&apos; stop-color=&apos;%239059ff&apos;/%3E%3Cstop offset=&apos;1&apos; stop-color=&apos;%23c139e6&apos;/%3E%3C/radialGradient%3E%3CradialGradient id=&apos;ff-f&apos; cx=&apos;252.2&apos; cy=&apos;201.3&apos; r=&apos;126.5&apos; gradientTransform=&apos;matrix(1 0 0 1 -48 31)&apos; gradientUnits=&apos;userSpaceOnUse&apos;%3E%3Cstop offset=&apos;.2&apos; stop-color=&apos;%239059ff&apos; stop-opacity=&apos;0&apos;/%3E%3Cstop offset=&apos;.3&apos; stop-color=&apos;%238c4ff3&apos; stop-opacity=&apos;.1&apos;/%3E%3Cstop offset=&apos;.8&apos; stop-color=&apos;%237716a8&apos; stop-opacity=&apos;.5&apos;/%3E%3Cstop offset=&apos;1&apos; stop-color=&apos;%236e008b&apos; stop-opacity=&apos;.6&apos;/%3E%3C/radialGradient%3E%3CradialGradient id=&apos;ff-g&apos; cx=&apos;239.1&apos; cy=&apos;34.6&apos; r=&apos;171.6&apos; gradientUnits=&apos;userSpaceOnUse&apos;%3E%3Cstop offset=&apos;0&apos; stop-color=&apos;%23ffe226&apos;/%3E%3Cstop offset=&apos;.1&apos; stop-color=&apos;%23ffdb27&apos;/%3E%3Cstop offset=&apos;.3&apos; stop-color=&apos;%23ffc82a&apos;/%3E%3Cstop offset=&apos;.5&apos; stop-color=&apos;%23ffa930&apos;/%3E%3Cstop offset=&apos;.7&apos; stop-color=&apos;%23ff7e37&apos;/%3E%3Cstop offset=&apos;.8&apos; stop-color=&apos;%23ff7139&apos;/%3E%3C/radialGradient%3E%3CradialGradient id=&apos;ff-h&apos; cx=&apos;374&apos; cy=&apos;-74.3&apos; r=&apos;732.2&apos; gradientUnits=&apos;userSpaceOnUse&apos;%3E%3Cstop offset=&apos;.1&apos; stop-color=&apos;%23fff44f&apos;/%3E%3Cstop offset=&apos;.5&apos; stop-color=&apos;%23ff980e&apos;/%3E%3Cstop offset=&apos;.6&apos; stop-color=&apos;%23ff5634&apos;/%3E%3Cstop offset=&apos;.7&apos; stop-color=&apos;%23ff3647&apos;/%3E%3Cstop offset=&apos;.9&apos; stop-color=&apos;%23e31587&apos;/%3E%3C/radialGradient%3E%3CradialGradient id=&apos;ff-i&apos; cx=&apos;304.6&apos; cy=&apos;7.1&apos; r=&apos;536.4&apos; gradientTransform=&apos;rotate(84 303 4)&apos; gradientUnits=&apos;userSpaceOnUse&apos;%3E%3Cstop offset=&apos;0&apos; stop-color=&apos;%23fff44f&apos;/%3E%3Cstop offset=&apos;.1&apos; stop-color=&apos;%23ffe847&apos;/%3E%3Cstop offset=&apos;.2&apos; stop-color=&apos;%23ffc830&apos;/%3E%3Cstop offset=&apos;.3&apos; stop-color=&apos;%23ff980e&apos;/%3E%3Cstop offset=&apos;.4&apos; stop-color=&apos;%23ff8b16&apos;/%3E%3Cstop offset=&apos;.5&apos; stop-color=&apos;%23ff672a&apos;/%3E%3Cstop offset=&apos;.6&apos; stop-color=&apos;%23ff3647&apos;/%3E%3Cstop offset=&apos;.7&apos; stop-color=&apos;%23e31587&apos;/%3E%3C/radialGradient%3E%3CradialGradient id=&apos;ff-j&apos; cx=&apos;235&apos; cy=&apos;98.1&apos; r=&apos;457.1&apos; gradientUnits=&apos;userSpaceOnUse&apos;%3E%3Cstop offset=&apos;.1&apos; stop-color=&apos;%23fff44f&apos;/%3E%3Cstop offset=&apos;.5&apos; stop-color=&apos;%23ff980e&apos;/%3E%3Cstop offset=&apos;.6&apos; stop-color=&apos;%23ff5634&apos;/%3E%3Cstop offset=&apos;.7&apos; stop-color=&apos;%23ff3647&apos;/%3E%3Cstop offset=&apos;.9&apos; stop-color=&apos;%23e31587&apos;/%3E%3C/radialGradient%3E%3CradialGradient id=&apos;ff-k&apos; cx=&apos;355.7&apos; cy=&apos;124.9&apos; r=&apos;500.3&apos; gradientUnits=&apos;userSpaceOnUse&apos;%3E%3Cstop offset=&apos;.1&apos; stop-color=&apos;%23fff44f&apos;/%3E%3Cstop offset=&apos;.2&apos; stop-color=&apos;%23ffe141&apos;/%3E%3Cstop offset=&apos;.5&apos; stop-color=&apos;%23ffaf1e&apos;/%3E%3Cstop offset=&apos;.6&apos; stop-color=&apos;%23ff980e&apos;/%3E%3C/radialGradient%3E%3ClinearGradient id=&apos;ff-a&apos; x1=&apos;446.9&apos; y1=&apos;76.8&apos; x2=&apos;47.9&apos; y2=&apos;461.8&apos; gradientUnits=&apos;userSpaceOnUse&apos;%3E%3Cstop offset=&apos;.1&apos; stop-color=&apos;%23fff44f&apos;/%3E%3Cstop offset=&apos;.1&apos; stop-color=&apos;%23ffe847&apos;/%3E%3Cstop offset=&apos;.2&apos; stop-color=&apos;%23ffc830&apos;/%3E%3Cstop offset=&apos;.4&apos; stop-color=&apos;%23ff980e&apos;/%3E%3Cstop offset=&apos;.4&apos; stop-color=&apos;%23ff8b16&apos;/%3E%3Cstop offset=&apos;.5&apos; stop-color=&apos;%23ff672a&apos;/%3E%3Cstop offset=&apos;.5&apos; stop-color=&apos;%23ff3647&apos;/%3E%3Cstop offset=&apos;.7&apos; stop-color=&apos;%23e31587&apos;/%3E%3C/linearGradient%3E%3ClinearGradient id=&apos;ff-l&apos; x1=&apos;442.1&apos; y1=&apos;74.8&apos; x2=&apos;102.6&apos; y2=&apos;414.3&apos; gradientUnits=&apos;userSpaceOnUse&apos;%3E%3Cstop offset=&apos;.2&apos; stop-color=&apos;%23fff44f&apos; stop-opacity=&apos;.8&apos;/%3E%3Cstop offset=&apos;.3&apos; stop-color=&apos;%23fff44f&apos; stop-opacity=&apos;.6&apos;/%3E%3Cstop offset=&apos;.5&apos; stop-color=&apos;%23fff44f&apos; stop-opacity=&apos;.2&apos;/%3E%3Cstop offset=&apos;.6&apos; stop-color=&apos;%23fff44f&apos; stop-opacity=&apos;0&apos;/%3E%3C/linearGradient%3E%3C/defs%3E%3Cpath d=&apos;M479 166c-11-25-32-52-49-60a249 249 0 0 1 25 73c-27-68-73-95-111-155a255 255 0 0 1-8-14 44 44 0 0 1-4-9 1 1 0 0 0 0-1 1 1 0 0 0-1 0c-60 35-81 101-83 134a120 120 0 0 0-66 25 71 71 0 0 0-6-5 111 111 0 0 1-1-58c-25 11-44 29-58 44-9-12-9-52-8-60l-8 4a175 175 0 0 0-24 21 210 210 0 0 0-22 26 203 203 0 0 0-32 73l-1 2-2 15a229 229 0 0 0-4 34v1a240 240 0 0 0 477 40l1-9c5-41 0-84-15-121zM202 355l3 1-3-1zm55-145zm198-31z&apos; fill=&apos;url(%23ff-a)&apos;/%3E%3Cpath d=&apos;M479 166c-11-25-32-52-49-60 14 26 22 53 25 72v1a207 207 0 0 1-206 279c-113-3-212-87-231-197-3-17 0-26 2-40-2 11-3 14-4 34v1a240 240 0 0 0 477 40l1-9c5-41 0-84-15-121z&apos; fill=&apos;url(%23ff-b)&apos;/%3E%3Cpath d=&apos;M479 166c-11-25-32-52-49-60 14 26 22 53 25 72v1a207 207 0 0 1-206 279c-113-3-212-87-231-197-3-17 0-26 2-40-2 11-3 14-4 34v1a240 240 0 0 0 477 40l1-9c5-41 0-84-15-121z&apos; fill=&apos;url(%23ff-c)&apos;/%3E%3Cpath d=&apos;m362 195 1 1a130 130 0 0 0-22-29C266 92 322 5 331 0c-60 35-81 101-83 134l9-1c45 0 84 25 105 62z&apos; fill=&apos;url(%23ff-d)&apos;/%3E%3Cpath d=&apos;M257 210c-1 6-22 26-29 26-68 0-80 41-80 41 3 35 28 64 57 79l4 2 7 3a107 107 0 0 0 31 6c120 6 143-143 57-186 22-4 45 5 58 14-21-37-60-62-105-62l-9 1a120 120 0 0 0-66 25l17 16c16 16 58 33 58 35z&apos; fill=&apos;url(%23ff-e)&apos;/%3E%3Cpath d=&apos;M257 210c-1 6-22 26-29 26-68 0-80 41-80 41 3 35 28 64 57 79l4 2 7 3a107 107 0 0 0 31 6c120 6 143-143 57-186 22-4 45 5 58 14-21-37-60-62-105-62l-9 1a120 120 0 0 0-66 25l17 16c16 16 58 33 58 35z&apos; fill=&apos;url(%23ff-f)&apos;/%3E%3Cpath d=&apos;m171 151 5 3a111 111 0 0 1-1-58c-25 11-44 29-58 44 1 0 36 0 54 11z&apos; fill=&apos;url(%23ff-g)&apos;/%3E%3Cpath d=&apos;M18 261a242 242 0 0 0 231 197 207 207 0 0 0 206-279c8 56-20 110-64 146-86 71-169 43-186 31l-3-1c-50-24-71-70-67-110-42 0-57-35-57-35s38-28 89-4c46 22 90 4 90 4 0-2-42-19-58-35l-17-16a71 71 0 0 0-6-5l-5-3c-18-11-52-11-54-11-9-12-9-51-8-60l-8 4a175 175 0 0 0-24 21 210 210 0 0 0-22 26 203 203 0 0 0-32 73c0 1-9 38-5 57z&apos; fill=&apos;url(%23ff-h)&apos;/%3E%3Cpath d=&apos;M341 167a130 130 0 0 1 22 29 46 46 0 0 1 4 3c55 50 26 121 24 126 44-36 72-90 64-146-27-68-73-95-111-155a255 255 0 0 1-8-14 44 44 0 0 1-4-9 1 1 0 0 0 0-1 1 1 0 0 0-1 0c-9 5-65 92 10 167z&apos; fill=&apos;url(%23ff-i)&apos;/%3E%3Cpath d=&apos;M367 199a46 46 0 0 0-4-3l-1-1c-13-9-36-18-58-15 86 44 63 193-57 187a107 107 0 0 1-31-6 131 131 0 0 1-11-5c17 12 99 39 186-31 2-5 31-76-24-126z&apos; fill=&apos;url(%23ff-j)&apos;/%3E%3Cpath d=&apos;M148 277s12-41 80-41c7 0 28-20 29-26s-44 18-90-4c-51-24-89 4-89 4s15 35 57 35c-4 40 16 85 67 110l3 1c-29-15-54-44-57-79z&apos; fill=&apos;url(%23ff-k)&apos;/%3E%3Cpath d=&apos;M479 166c-11-25-32-52-49-60a249 249 0 0 1 25 73c-27-68-73-95-111-155a255 255 0 0 1-8-14 44 44 0 0 1-4-9 1 1 0 0 0 0-1 1 1 0 0 0-1 0c-60 35-81 101-83 134l9-1c45 0 84 25 105 62-13-9-36-18-58-14 86 43 63 192-57 186a107 107 0 0 1-31-6 131 131 0 0 1-11-5l-3-1 3 1c-29-15-54-44-57-79 0 0 12-41 80-41 7 0 28-20 29-26 0-2-42-19-58-35l-17-16a71 71 0 0 0-6-5 111 111 0 0 1-1-58c-25 11-44 29-58 44-9-12-9-52-8-60l-8 4a175 175 0 0 0-24 21 210 210 0 0 0-22 26 203 203 0 0 0-32 73l-1 2-2 15a279 279 0 0 0-4 34v1a240 240 0 0 0 477 40l1-9c5-41 0-84-15-121zm-24 13z&apos; fill=&apos;url(%23ff-l)&apos;/%3E%3C/svg%3E\"> <span> x </span> </li> <li> <img alt=\"Safari: not supported.\" src=\"data:image/svg+xml,%3Csvg xmlns=&apos;http://www.w3.org/2000/svg&apos; xmlns:xlink=&apos;http://www.w3.org/1999/xlink&apos; width=&apos;24&apos; height=&apos;24&apos; viewBox=&apos;195 190 135 135&apos;%3E%3Cdefs%3E%3ClinearGradient id=&apos;s-a&apos; x1=&apos;132.6&apos; x2=&apos;134.4&apos; y1=&apos;111.7&apos; y2=&apos;-105.3&apos; xlink:href=&apos;%23s-b&apos;%3E%3Cstop offset=&apos;0&apos; stop-color=&apos;%23d2d2d2&apos; /%3E%3Cstop offset=&apos;.5&apos; stop-color=&apos;%23f2f2f2&apos; /%3E%3Cstop offset=&apos;1&apos; stop-color=&apos;%23fff&apos; /%3E%3C/linearGradient%3E%3ClinearGradient id=&apos;s-b&apos; gradientUnits=&apos;userSpaceOnUse&apos; /%3E%3ClinearGradient id=&apos;s-c&apos; x1=&apos;65.4&apos; x2=&apos;67.4&apos; y1=&apos;115.7&apos; y2=&apos;17.1&apos; xlink:href=&apos;%23s-b&apos;%3E%3Cstop offset=&apos;0&apos; stop-color=&apos;%23005ad5&apos; /%3E%3Cstop offset=&apos;.2&apos; stop-color=&apos;%230875f0&apos; /%3E%3Cstop offset=&apos;.3&apos; stop-color=&apos;%23218cee&apos; /%3E%3Cstop offset=&apos;.6&apos; stop-color=&apos;%2327a5f3&apos; /%3E%3Cstop offset=&apos;.8&apos; stop-color=&apos;%2325aaf2&apos; /%3E%3Cstop offset=&apos;1&apos; stop-color=&apos;%2321aaef&apos; /%3E%3C/linearGradient%3E%3ClinearGradient id=&apos;s-d&apos; x1=&apos;158.7&apos; x2=&apos;176.3&apos; y1=&apos;96.7&apos; y2=&apos;79.5&apos; xlink:href=&apos;%23s-b&apos;%3E%3Cstop offset=&apos;0&apos; stop-color=&apos;%23c72e24&apos; /%3E%3Cstop offset=&apos;1&apos; stop-color=&apos;%23fd3b2f&apos; /%3E%3C/linearGradient%3E%3CradialGradient id=&apos;s-i&apos; cx=&apos;-69.9&apos; cy=&apos;69.3&apos; r=&apos;54&apos; gradientTransform=&apos;matrix(.9 -.01 .04 2.72 -9 -120)&apos; xlink:href=&apos;%23s-b&apos;%3E%3Cstop offset=&apos;0&apos; stop-color=&apos;%2324a5f3&apos; stop-opacity=&apos;0&apos; /%3E%3Cstop offset=&apos;1&apos; stop-color=&apos;%231e8ceb&apos; /%3E%3C/radialGradient%3E%3CradialGradient id=&apos;s-j&apos; cx=&apos;109.3&apos; cy=&apos;13.8&apos; r=&apos;93.1&apos; gradientTransform=&apos;matrix(-.02 1.1 -1.04 -.02 137 -115)&apos; xlink:href=&apos;%23s-b&apos;%3E%3Cstop offset=&apos;0&apos; stop-opacity=&apos;0&apos; /%3E%3Cstop offset=&apos;1&apos; stop-color=&apos;%235488d6&apos; stop-opacity=&apos;0&apos; /%3E%3Cstop offset=&apos;1&apos; stop-color=&apos;%235d96eb&apos; /%3E%3C/radialGradient%3E%3C/defs%3E%3Crect width=&apos;220&apos; height=&apos;220&apos; x=&apos;22&apos; y=&apos;-107&apos; fill=&apos;url(%23s-a)&apos; ry=&apos;49&apos; transform=&apos;matrix(.57 0 0 .57 187 256)&apos; /%3E%3Cg transform=&apos;translate(194 190)&apos;%3E%3Ccircle cx=&apos;67.8&apos; cy=&apos;67.7&apos; fill=&apos;url(%23s-c)&apos; paint-order=&apos;stroke fill markers&apos; r=&apos;54&apos; /%3E%3Ccircle cx=&apos;-69.9&apos; cy=&apos;69.3&apos; fill=&apos;url(%23s-i)&apos; transform=&apos;translate(138 -2)&apos; r=&apos;54&apos; /%3E%3C/g%3E%3Cellipse cx=&apos;120&apos; cy=&apos;14.2&apos; fill=&apos;url(%23s-j)&apos; rx=&apos;93.1&apos; ry=&apos;93.7&apos; transform=&apos;matrix(.58 0 0 .58 192 250)&apos; /%3E%3Cg transform=&apos;matrix(.58 0 0 .57 197 182)&apos;%3E%3Cpath fill=&apos;%23cac7c8&apos; d=&apos;M46 192h1l72-48-7-9-66 57Z&apos; /%3E%3Cpath fill=&apos;%23fbfffc&apos; d=&apos;M46 191v1l66-57-7-9-59 65Z&apos; /%3E%3Cpath fill=&apos;url(%23s-d)&apos; d=&apos;m119 144-7-9 66-57-59 66Z&apos; /%3E%3Cpath fill=&apos;%23fb645c&apos; d=&apos;m105 126 7 9 66-57-1-1-72 49Z&apos; /%3E%3C/g%3E%3Cpath stroke=&apos;%23fff&apos; stroke-linecap=&apos;round&apos; stroke-miterlimit=&apos;1&apos; stroke-width=&apos;1.3&apos; d=&apos;m287 278 3-2m-12-17 8-2m-8-3h4m-4-13 8 2m-8 3h4m-1-13 7 3m-4-11 7 4m-2-11 6 6m0-12 6 7m1-11 4 6m4-10 3 7m5-9 2 7m15-7-1 7m10-5-3 7m11-4-4 7m11-2-5 6m16 7-7 4m10 4-7 3m10 6-8 1m8 16-8-2m5 10-7-3m4 11-7-4m2 11-6-5m0 11-5-6m-2 11-4-7m-4 11-3-8m-6 10-1-8m-16 8 2-8m-10 5 3-7m-11 4 4-7m-11 2 5-6m-8 3 3-3m4 8 2-3m5 8 2-4m6 7 1-4m8 5v-4m8 4v-4m9 3-1-4m9 1-2-4m9 0-2-4m9-2-3-3m8-4-3-2m8-5-4-2m7-6-4-1m5-8h-4m4-8h-4m3-9-4 1m1-9-4 2m-1-9-3 2m-2-9-3 3m-4-8-2 3m-5-8-2 4m-6-6-1 3m-8-5v4m-8-4v4m-9-2 1 3m-9 0 2 3m-9 1 2 3m-9 2 3 3m-8 4 3 2m-8 5 4 2m-7 6 4 1m-4 25 4-1m-2 5 7-3m-6 7 4-2m-2 6 7-4m-13-21h8m41-41v-8m0 99v-8m49-42h-8&apos; transform=&apos;translate(-65 8)&apos; /%3E%3C/svg%3E\"> <span> x </span> </li> </ul> <p><a href=\"https://developer.mozilla.org/docs/Web/CSS/field-sizing\">Source</a></p> </div> </p> <p><a href=\"https://drafts.csswg.org/css-ui/#field-sizing\">Specification</a> |\n<a href=\"https://github.com/tkent-google/explainers/blob/main/form-sizing.md\">Explainer</a>\n</p> <h3 id=\"like_short_form_videos\">Like short form videos?</h3> <p><a href=\"https://twitter.com/wesbos/status/1735729524069827044\">Wes Bos</a> and\n<a href=\"https://twitter.com/jh3yy/status/1735719206715297956\">Jhey</a> each have a great\nvideo on Twitter introducing you to <code>field-sizing</code>.</p> <h2 id=\"which_elements_are_affected_by_field-sizing\">Which elements are affected by field-sizing?</h2> <p>Here is a list of\n<a href=\"https://developer.mozilla.org/docs/Web/HTML/Element/form\"><code>&lt;form&gt;</code></a> elements\nthat <code>field-sizing</code> works on, with a summary of the effects it has on each.</p> <h3 id=\"textarea\"><a href=\"https://developer.mozilla.org/docs/Web/HTML/Element/textarea\"><code>&lt;textarea&gt;</code></a></h3> <p>The input collapses down to a <code>min-inline-size</code> or to fit the placeholder.</p> <p>As users type, the input grows in the inline direction until it reaches a\nmaximum inline size, at which point text will wrap and the block size of the\ninput grows to fit the new line.</p> <h3 id=\"select_and_select_multiple\"><a href=\"https://developer.mozilla.org/docs/Web/HTML/Element/select\"><code>&lt;select&gt;</code></a> and <a href=\"https://developer.mozilla.org/docs/Web/HTML/Attributes/multiple\"><code>&lt;select multiple&gt;</code></a></h3> <p>The select element shrinks to fit the selected option.</p> <p>A select with the <code>multiple</code> attribute grows to fit the widest option and to be\nas tall as needed to fit the number of options.</p> <h3 id=\"input_typetext_input_typeemail_and_input_typenumber\"><a href=\"https://developer.mozilla.org/docs/Web/HTML/Element/input/text\"><code>&lt;input type=&quot;text&quot;&gt;</code></a>, <a href=\"https://developer.mozilla.org/docs/Web/HTML/Element/input/email\"><code>&lt;input type=&quot;email&quot;&gt;</code></a> and <a href=\"https://developer.mozilla.org/docs/Web/HTML/Element/input/number\"><code>&lt;input type=&quot;number&quot;&gt;</code></a></h3> <p>The input collapses down to a <code>min-inline-size</code> or to fit the placeholder.</p> <p>As users type, the input grows in the inline direction until it reaches a\n<code>max-inline-size</code>, at which point overflow clips the input value.</p> <h3 id=\"input_typefile\"><a href=\"https://developer.mozilla.org/docs/Web/HTML/Element/input/file\"><code>&lt;input type=&quot;file&quot;&gt;</code></a></h3> <p>The input collapses down to the button and the prefilled filename text.</p> <p>Upon uploading a file, the input becomes as wide as the button plus the filename\ntext.</p> <h2 id=\"seeing_testing_and_comparing_results\">Seeing, testing, and comparing results</h2> <p>Here is an interactive and minimal example of the before and after behaviors of\neach form element, as affected by <code>field-sizing</code>.</p> <figure class=\"no-margin\"> <figcaption class=\"caption\"> <a href=\"https://codepen.io/web-dot-dev/pen/poYmRvp\">Try it on Codepen</a> </figcaption>\n</figure> <h3 id=\"looking_closer\">Looking closer</h3> <p>When using a\n<a href=\"https://developer.mozilla.org/docs/Web/HTML/Attributes/placeholder\"><code>[placeholder]</code></a>,\nthe placeholder becomes the content. This was mentioned previously but called out\nhere, as it is important to know when styling a form. A long or short\nplaceholder will change the intrinsic size of inputs with <code>field-sizing:\ncontent</code>.</p> <figure class=\"no-margin\"> <figcaption class=\"caption\"> <a href=\"https://codepen.io/web-dot-dev/pen/RwdmKWW\">Try it on Codepen</a> </figcaption>\n</figure> <h2 id=\"empty_and_overflowing_style_handling\">Empty and overflowing style handling</h2> <p>Using <code>field-sizing</code> does mean you have to do some additional work. <a href=\"https://ishadeed.com/\">Ahmad\nShadeed</a> calls it &quot;<a href=\"https://ishadeed.com/article/defensive-css/\">defensive\nCSS</a>,&quot; where the goal is not\nnecessarily to spell out exactly how something should behave or look, rather to\nprotect it from getting into an undesirable visual state. Previously, inputs had\na fair amount of fixed sizes, but after applying <code>field-sizing: content</code>, the\ninputs can become much too small or much too large.</p> <p>The following styles are a good starting point. They help the elements not\ncollapse into too small of a box and also, in the case of <code>textarea</code>, not grow\ntoo large.</p>\n<devsite-code><pre class=\"devsite-click-to-copy\"><code><span class=\"devsite-syntax-nt\">textarea</span><span class=\"devsite-syntax-w\"> </span><span class=\"devsite-syntax-p\">{</span>\n<span class=\"devsite-syntax-w\"> </span><span class=\"devsite-syntax-k\">min-block-size</span><span class=\"devsite-syntax-p\">:</span><span class=\"devsite-syntax-w\"> </span><span class=\"devsite-syntax-mf\">3.5</span><span class=\"devsite-syntax-n\">rlh</span><span class=\"devsite-syntax-p\">;</span>\n<span class=\"devsite-syntax-w\"> </span><span class=\"devsite-syntax-k\">min-inline-size</span><span class=\"devsite-syntax-p\">:</span><span class=\"devsite-syntax-w\"> </span><span class=\"devsite-syntax-mi\">20</span><span class=\"devsite-syntax-kt\">ch</span><span class=\"devsite-syntax-p\">;</span>\n<span class=\"devsite-syntax-w\"> </span><span class=\"devsite-syntax-k\">max-inline-size</span><span class=\"devsite-syntax-p\">:</span><span class=\"devsite-syntax-w\"> </span><span class=\"devsite-syntax-mi\">50</span><span class=\"devsite-syntax-kt\">ch</span><span class=\"devsite-syntax-p\">;</span>\n<span class=\"devsite-syntax-p\">}</span> <span class=\"devsite-syntax-nt\">select</span><span class=\"devsite-syntax-w\"> </span><span class=\"devsite-syntax-p\">{</span>\n<span class=\"devsite-syntax-w\"> </span><span class=\"devsite-syntax-k\">min-inline-size</span><span class=\"devsite-syntax-p\">:</span><span class=\"devsite-syntax-w\"> </span><span class=\"devsite-syntax-mi\">5</span><span class=\"devsite-syntax-kt\">ch</span><span class=\"devsite-syntax-p\">;</span>\n<span class=\"devsite-syntax-w\"> </span><span class=\"devsite-syntax-k\">min-block-size</span><span class=\"devsite-syntax-p\">:</span><span class=\"devsite-syntax-w\"> </span><span class=\"devsite-syntax-mf\">1.5</span><span class=\"devsite-syntax-n\">lh</span><span class=\"devsite-syntax-p\">;</span>\n<span class=\"devsite-syntax-p\">}</span> <span class=\"devsite-syntax-nt\">input</span><span class=\"devsite-syntax-w\"> </span><span class=\"devsite-syntax-p\">{</span>\n<span class=\"devsite-syntax-w\"> </span><span class=\"devsite-syntax-k\">min-inline-size</span><span class=\"devsite-syntax-p\">:</span><span class=\"devsite-syntax-w\"> </span><span class=\"devsite-syntax-mi\">7</span><span class=\"devsite-syntax-kt\">ch</span><span class=\"devsite-syntax-p\">;</span>\n<span class=\"devsite-syntax-p\">}</span>\n</code></pre></devsite-code>\n<p>This CSS uses relative units for the sizing. The new\n<a href=\"https://developer.mozilla.org/docs/Learn/CSS/Building_blocks/Values_and_units\"><code>lh</code></a>\nunit is perfect for the block sizes and\n<a href=\"https://developer.mozilla.org/docs/Learn/CSS/Building_blocks/Values_and_units\"><code>ch</code></a>\nworks well for the inline sizes.</p> <h2 id=\"what_is_the_default_value_of_field-sizing\">What is the default value of field-sizing?</h2> <p>The default value of <code>field-sizing</code> is <code>fixed</code>, and it only accepts the two\nvalues of <code>fixed</code> or <code>content</code>.</p> </div></div>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://toot.cafe/@tomayac/113446179350621117"],"published":["2024-11-08T09:22:10.182Z"],"mp-slug":["09-22-10"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/11/08/09-22-10"]},"references":{"https://toot.cafe/@tomayac/113446179350621117":{"type":["h-entry"],"properties":{"url":["https://toot.cafe/@tomayac/113446179350621117"],"name":["Thomas Steiner :chrome"],"summary":["Finally more options for styling the `` element, for example, to animate its opening. @bramus@front-end.social's article has all the details: https://developer.chrome.com/blog/styling-details. >�"],"content":[{"html":"<body class=\"app-body theme-default no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://front-end.social/@zeldman/113396308709565733"],"published":["2024-10-30T13:40:33.318Z"],"mp-slug":["01-40-33"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/10/30/01-40-33"]},"references":{"https://front-end.social/@zeldman/113396308709565733":{"type":["h-entry"],"properties":{"url":["https://front-end.social/@zeldman/113396308709565733"],"name":["zeldman (@zeldman@front-end.social)"],"summary":["\u001cHTML Forms have powerful validation mechanisms, but they are heavily underused. In fact, not many people even know much about them. Is this because of some flaw in their design? Let\u0019s explore.\u001d&hellip;"],"content":[{"html":"<body class=\"app-body theme-system no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://smarthomescene.com/diy/diy-the-smallest-bluetooth-proxy-with-esp32-c3-supermini/"],"published":["2024-10-29T13:01:02.290Z"],"mp-slug":["01-01-02"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/10/29/01-01-02"]},"references":{}},{"type":["h-entry"],"properties":{"like-of":["https://floss.social/@downey/113387242711741163"],"published":["2024-10-29T08:00:13.043Z"],"mp-slug":["08-00-13"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/10/29/08-00-13"]},"references":{"https://floss.social/@downey/113387242711741163":{"type":["h-entry"],"properties":{"url":["https://floss.social/@downey/113387242711741163"],"name":["Michael Downey =� (@downey@floss.social)"],"summary":["No, dear website, {task} is not \"better using the app\"."],"content":[{"html":"<body class=\"app-body theme-default no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://www.nytimes.com/2024/10/17/climate/carbon-fires-forests-global-warming.html#commentsContainer"],"published":["2024-10-23T12:42:48.169Z"],"mp-slug":["12-42-48"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/10/23/12-42-48"]},"references":{}},{"type":["h-entry"],"properties":{"like-of":["https://www.jvt.me/posts/2024/10/15/slashes/?utm_medium=rss&utm_source=rss"],"published":["2024-10-15T14:25:59.025Z"],"mp-slug":["02-25-59"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/10/15/02-25-59"]},"references":{"https://www.jvt.me/posts/2024/10/15/slashes/":{"type":["h-entry"],"properties":{"name":["Creating a /slashes page"],"featured":["https://www.jvt.me/img/profile.jpg"],"content":[{"value":"Last week I found out that Robb Knight has a site called called Slash Pages, which details common top-level URLs that are found at /<name>.I'd found out about this as someone had started contributing a /salary page section, and looking at both my own site, and the list of pages that have already been collected, I thought I'd create my own /slashes page.I'll also be adding a few new options to the upstream Slash Pages site to add some things I've been doing too.","html":"<p>Last week I found out that <span class=\"h-card\"><a class=\"u-url\" href=\"https://rknight.me\">Robb Knight</a></span> has a site called called <a href=\"https://slashpages.net/\">Slash Pages</a>, which details common top-level URLs that are found at <code>/&lt;name></code>.</p><p>I'd found out about this as <a href=\"https://github.com/rknightuk/slashpages/pull/6\">someone had started contributing a /salary page section</a>, and looking at both my own site, and the list of pages that have already been collected, I thought I'd create my own <a href=\"/slashes/\">/slashes page</a>.</p><p>I'll also be adding a few new options to the upstream <a href=\"https://slashpages.net/\">Slash Pages</a> site to add some things I've been doing too.</p>"}],"url":["https://www.jvt.me/posts/2024/10/15/slashes/"],"summary":["Creating a collection of all the /slash pages I have across my site."],"uid":["https://www.jvt.me/posts/2024/10/15/slashes/"],"author":[{"value":"Jamie Tanna","type":["h-card"],"properties":{"photo":["https://www.jvt.me/img/profile.png"],"name":["Jamie Tanna"],"url":["https://www.jvt.me"]}}],"published":["2024-10-15T14:08:53+01:00"],"updated":["2024-10-15T14:08:53+01:00"],"category":["www.jvt.me"]},"children":[{"value":"Robb Knight","type":["h-card"],"properties":{"url":["https://rknight.me"],"name":["Robb Knight"]}}]}}},{"type":["h-entry"],"properties":{"like-of":["https://beeps.website/blog/2024-10-09-why-govuk-exit-this-page-doesnt-use-escape/"],"published":["2024-10-15T09:52:51.890Z"],"mp-slug":["09-52-51"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/10/15/09-52-51"]},"references":{"https://beeps.website/blog/2024-10-09-why-govuk-exit-this-page-doesnt-use-escape/":{"type":["h-entry"],"properties":{"url":["https://beeps.website/blog/2024-10-09-why-govuk-exit-this-page-doesnt-use-escape/"],"name":["Why GOV.UK's Exit this Page component doesn't use the Escape key"],"summary":["A very specific question, answered very longwindedly."],"featured":["https://v1.screenshot.11ty.dev/https%3A%2F%2Fbeeps.website%2Fblog%2F2024-10-09-why-govuk-exit-this-page-doesnt-use-escape%2Fopengraph%2F/opengraph/_1728556120/"],"content":[{"html":"<div class=\"kimGrid_column kimGrid_column-full defiant:kimGrid_column-twoThirds\"> <div class=\"kimCallout\">\n<p class=\"kimBody\"><strong>Content warning:</strong> This blog post references domestic abuse and violence but doesn\u0019t go into specific detail.</p>\n<p class=\"kimBody\">I\u0019m not an expert in that topic <em>at all</em>, so I may not use the preferred terminology in all instances. Sorry.</p>\n</div>\n<p class=\"kimBody\">Last year (oh how time flies), we launched the <a href=\"https://design-system.service.gov.uk/components/exit-this-page/\" class=\"kimLink\">GOV.UK Design System\u0019s Exit this Page component</a>, or EtP for short.</p>\n<picture> <source type=\"image/webp\" srcset=\"https://beeps.website/images/-6SGpmSnGw-300.webp 300w, https://beeps.website/images/-6SGpmSnGw-600.webp 600w, https://beeps.website/images/-6SGpmSnGw-900.webp 900w, https://beeps.website/images/-6SGpmSnGw-1164.webp 1164w\" sizes=\"(min-width: 768px) 66vi, 100vi\"><img src=\"/images/-6SGpmSnGw-1164.webp\" width=\"1164\" alt=\"A large red button with &apos;Exit this page&apos; written on it in plain white text.\"></picture>\n<p class=\"kimBody\">On the surface, it\u0019s a simple component. It\u0019s a big red button that sticks to the top of the screen. If you click it, you\u0019re taken away to BBC Weather.</p>\n<p class=\"kimBody\">But it does so much more.</p>\n<p class=\"kimBody\">If you press the <kbd class=\"kimKeyboard\">&#xFFFD; Shift</kbd> key on your keyboard three times, you get a visual indicator that you are activating the button. Upon the third press, the page you\u0019re on is blanked out and you\u0019re redirected away to&amp; well, BBC Weather again.</p>\n<p class=\"kimBody\">It\u0019s intended to be a safety tool. A way for people in unstable, potentially violent, domestic situations to quickly leave the page.</p>\n<p class=\"kimBody\">But one question that comes up a lot is&amp;</p> <p class=\"kimBody\">It\u0019s a decent question. Many other implementations of buttons like this exist, and of the ones that provide a keyboard shortcut, they almost universally use the Escape key: <kbd class=\"kimKeyboard\">Esc</kbd>.</p>\n<p class=\"kimBody\">And it\u0019s literally called Escape. Why wouldn\u0019t you use it for an escape function?</p>\n<p class=\"kimBody\">Basically, it doesn\u0019t quite work like that. There was a veritable rabbit hole of barriers that ultimately led us towards using a different key.</p>\n<figure class=\"kimCharacter kimCharacter-ash\"> <figcaption class=\"kimCharacter_cite\"> <img class=\"kimCharacter_image\" src=\"/images/ash/mzhI8Wi18g-150.webp\" width=\"150\" alt=\"An amphimorpho looking to the side in puzzlement, with a paw on its chin in thought.\"> </figcaption> <blockquote class=\"kimCharacter_speech\">\n<p class=\"kimBody\">Do rabbit holes normally have barriers, actually?</p>\n</blockquote> </figure>\n<h3 id=\"1.-escape-stops-the-browser-from-loading-pages\" class=\"kimHeading-m\">1. Escape stops the browser from loading pages</h3>\n<p class=\"kimBody\">In virtually all browsers, pressing Escape while a webpage is loading stops the loading process.</p>\n<p class=\"kimBody\">This is literally the last thing we want to happen for a feature whose sole job is to load a different page from the one you\u0019re on.</p>\n<p class=\"kimBody\">If we had used Escape, it would be too easy for a user to accidentally cancel the redirection process and end up stuck on the current page, and that\u0019d be a bit naff.</p> <p class=\"kimBody\">In addition to cancelling loading, we found that the Escape key was used by too many other functions to reliably work for exiting the page.</p>\n<p class=\"kimBody\">For example, Escape is also used to exit fullscreen media (and on macOS, fullscreen apps), close modal dialogs and popovers (including those generated by native input controls), cancel a dragging interaction, clear a text input, and dismiss notifications.</p>\n<p class=\"kimBody\">Assistive technologies may also use the Escape key for functionality, and it is also used as part of keyboard shortcuts.</p>\n<p class=\"kimBody\">All of these take priority over the page\u0019s JavaScript, which often meant needing to press the Escape key more than the requisite three times, creating confusion as to whether the function actually worked as advertised.</p>\n<p class=\"kimBody\">In the case of macOS and fullscreen apps, it even involved having to wait for the re-windowing animation to finish before the page could begin to intercept Escape key presses again. Very not ideal.</p> <p class=\"kimBody\">Do you remember popup ads? When you\u0019d open up a website and immediately a new window would open purely to shove advertising in your face?</p>\n<p class=\"kimBody\">How about autoplaying audio and videos? Or when pages begged you to stay when you tried to close them? Or those immediate \u001cdo you want notifications from us?\u001d dialogs?</p>\n<p class=\"kimBody\">These are all the result of people exploiting JavaScript\u0019s mostly-unrestricted ability to do stuff, usually to try and make money.</p>\n<p class=\"kimBody\">As a result of advertising people being bastards, more and more of what the web platform can do is now being locked behind the requirement of <a href=\"https://developer.mozilla.org/en-US/docs/Glossary/Transient_activation\" class=\"kimLink\">transient activation</a>\u0014that is, the browser will refuse to run pieces of JavaScript unless it is <em>certain</em> that some manner of user interaction took place with the intention of running it.</p>\n<p class=\"kimBody\">Browsers use a few different heuristics to determine user interaction, including touches, mouse movements, and key presses. If it detects one of these that seems human enough, it will allow transiently activated code to run for a short period afterwards.</p>\n<figure class=\"kimCharacter kimCharacter-ash\"> <figcaption class=\"kimCharacter_cite\"> <img class=\"kimCharacter_image\" src=\"/images/ash/hwK5Ig77-0-150.webp\" width=\"150\" alt=\"An amphimorpho looking alarmed and grimacing.\"> </figcaption> <blockquote class=\"kimCharacter_speech\">\n<p class=\"kimBody\">This can have some unfortunate ramifications on accessibility.</p>\n<p class=\"kimBody\">As we\u0019ve recently learned on the GOV.UK Design System team, webpage interactions made by some assistive software (in this case, Dragon NaturallySpeaking) are not considered user interactions for the purposes of transient activation, so some JavaScript code will either not work or will work inconsistently for users of that software.</p>\n</blockquote> </figure>\n<p class=\"kimBody\">Redirecting the user away to another page via JavaScript is one such function that requires user interaction before it will run.</p>\n<p class=\"kimBody\">And <kbd class=\"kimKeyboard\">Esc</kbd> is <a href=\"https://html.spec.whatwg.org/multipage/interaction.html#user-activation-processing-model:activation-triggering-input-event\" class=\"kimLink\">the <em>only</em> keyboard key that doesn\u0019t count as user interaction</a> for the purposes of transient activation.</p>\n<p class=\"kimBody\">This meant that if a user tried to use the EtP shortcut immediately after a page loaded, or after a short period having not interacted with the page (for example, if they were busy reading it), the redirection just wouldn\u0019t work. Totally doubleplus ungood.</p> <p class=\"kimBody\">With adequate evidence that Escape wouldn\u0019t work for us, we started looking at other non-typing keys we could use.</p>\n<p class=\"kimBody\">Testing with the Control key (<kbd class=\"kimKeyboard\">\u0003 Ctrl</kbd>) worked much better, avoiding virtually all of the pitfalls of Escape, but there were still a few cons to it.</p>\n<p class=\"kimBody\">Control conflicted with VoiceOver\u0019s default configuration\u0014where pressing Control mutes VoiceOver.</p>\n<p class=\"kimBody\">Control was also the only key of those we were considering that wasn\u0019t in a physically consistent location on different UK keyboards: While on standalone keyboards the key tends to appear in the far bottom-left, on laptops it is commonly offset inwards to make room for an additional function key.</p>\n<p class=\"kimBody\">This innocuous difference had the potential to slow down a user\u0019s ability to quickly activate the shortcut, especially if they were using unfamiliar hardware.</p>\n<p class=\"kimBody\">The Alt or Option keys (<kbd class=\"kimKeyboard\">&#xFFFD; Alt</kbd> or <kbd class=\"kimKeyboard\">% Option</kbd>), by comparison, were more problematic.</p>\n<p class=\"kimBody\">Most obviously: It\u0019s named differently on different systems. Guidance and help documentation would get rather more verbose if we had to constantly call it Alt, Option, Opt, the key with <kbd class=\"kimKeyboard\">%</kbd> on it, and so on in every instance.</p>\n<p class=\"kimBody\">The key\u0019s use for typing letters with diacritics and other \u0018alt codes\u0019 meant that the keypresses reported to the browser weren\u0019t always aligned with what physical keys the user had actually pressed, meaning we couldn\u0019t be reliably sure if the user was intending to exit the page or not.</p>\n<p class=\"kimBody\">Alt/Option, like Escape, also had the issue of being utilised by some browser- and system-level functions, such as a shortcut to access application menus.</p>\n<p class=\"kimBody\">In Chromium browsers on Windows, for example, pressing Alt would move keyboard focus out of the webpage and to the browser UI\u0014completely removing the user from the webpage context. This prevented subsequent key presses from being detected, and obviously made EtP functionality not work at all.</p> <p class=\"kimBody\">So we landed on <kbd class=\"kimKeyboard\">&#xFFFD; Shift</kbd>. Shift works more consistently than Escape did, but still has a bunch of caveats:</p>\n<ul class=\"kimList kimList-bulleted\">\n<li>Its use during normal typing meant needing to be careful about which presses actually counted towards activation.</li>\n<li>Pressing Shift three times requires many more presses if the Sticky Keys accessibility features is active. I found that it took between 6 and 9 presses with Windows Sticky Keys, depending on speed, and 9 presses with macOS Sticky Keys.</li>\n<li>macOS\u0019s Slow Keys feature still takes three presses, but they have to be spread across a period of a few seconds to avoid activating the \u0018latching\u0019 functionality.</li>\n<li><a href=\"https://github.com/FreedomScientific/standards-support/issues/699\" class=\"kimLink\">The JAWS screen reader in Chromium would register the first Shift keypress twice</a>, though this has potentially been fixed since.</li>\n<li>Using Shift means that the shortcut is available on touch device\u0019s virtual keyboards. However, these keyboards tend to behave unpredictably compared to their hardware equivalents. I wrote up <a href=\"https://github.com/alphagov/govuk-frontend/issues/4095\" class=\"kimLink\">a massive bug report just about how the Shift key behaves on iOS</a>, part of which subsequently became <a href=\"https://bugs.webkit.org/show_bug.cgi?id=273681\" class=\"kimLink\">a bug report</a>.</li>\n</ul>\n<p class=\"kimBody\">Despite these shortfalls, Shift was ultimately the least flawed of the choices presented to us, with most of its issues being fairly minor and none of them being showstopping.</p> <p class=\"kimBody\">So that\u0019s where we are now.</p>\n<p class=\"kimBody\">In some ways, this is an unfortunate case of technology and web standards working against what would be the ideal user experience. <kbd class=\"kimKeyboard\">Esc</kbd> <em>would</em> be the ideal key to use, but it has too many caveats to work consistently.</p>\n<p class=\"kimBody\">We looked into opening the redirection page in a new tab and automatically closing the previous tab, as some similar tools do, but user research found that this often caused confusion (\u0018Why doesn\u0019t the back button work?\u0019, \u0018Where did my work go?\u0019) and doing that is also subject to transient activation requirements.</p>\n<p class=\"kimBody\">We would\u0019ve also liked to have had the button overwrite or erase the user\u0019s recent browser history, but we can\u0019t do that either. (And for good reason!)</p>\n<p class=\"kimBody\">Ultimately, we had to land on the philosophy of doing better, but not aiming for perfection. We could never write a piece of JavaScript that could prevent domestic violence, prying surveillance, or controlling relationships\u0014we can only do what we can do.</p>\n<p class=\"kimBody\">No one has complained about us using Shift instead of Escape, nor have we received any bug reports about it not working, but it certainly raises an eyebrow when folks hear about it for the first time&amp;</p>\n<p class=\"kimBody\">As for the other major question we get&amp;</p> <p class=\"kimBody\">As civil servants, we didn\u0019t want to link to a news service as that could lead to claims of political bias.</p>\n<p class=\"kimBody\">I also argued (a lot) against linking to the Google homepage\u0014despite this being ridiculously common\u0014because&amp; who actually uses the Google homepage? Google search is right there in your URL bar.</p>\n<p class=\"kimBody\">Even if you do go to Google\u0019s homepage, the first action you normally take once there is to leave Google\u0019s homepage.</p>\n<p class=\"kimBody\">If you walked in on someone and they were nervously staring at Google\u0019s homepage, you\u0019d be suspicious as hell.</p>\n<p class=\"kimBody\">BBC Weather\u0019s homepage is a content-rich page. Users have a reason to be looking at it and to be looking for an extended period of time. It may even default to the user\u0019s location, displaying significantly more personalised content in the process, which is surely less suspicious than a blank, generic search form.</p> <p class=\"kimBody-s\"> Thought this was neat? Why not <a href=\"https://beeps.website/blog/2024-10-09-why-govuk-exit-this-page-doesnt-use-escape/\">share a link to this page</a>? </p> </div>"}],"published":["2024-10-09T00:00:00.000Z"]}}}},{"type":["h-entry"],"properties":{"like-of":["https://front-end.social/@keithjgrant/113286756123288212"],"published":["2024-10-11T14:33:06.690Z"],"mp-slug":["02-33-06"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/10/11/02-33-06"]},"references":{"https://front-end.social/@keithjgrant/113286756123288212":{"type":["h-entry"],"properties":{"url":["https://front-end.social/@keithjgrant/113286756123288212"],"name":["Keith J Grant (@keithjgrant@front-end.social)"],"summary":["Attached: 1 image We just threw a 7-ender! >L #curling"],"featured":["https://cdn.masto.host/frontendsocial/media_attachments/files/113/286/752/644/620/046/original/43d4213cfbbada04.jpg"],"content":[{"html":"<body class=\"app-body theme-system no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://mstdn.social/@rysiek/113243932147763182"],"published":["2024-10-07T09:37:45.613Z"],"mp-slug":["09-37-45"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/10/07/09-37-45"]},"references":{"https://mstdn.social/@rysiek/113243932147763182":{"type":["h-entry"],"properties":{"url":["https://mstdn.social/@rysiek/113243932147763182"],"name":["MichaB \"rysiek\" Wozniak �"],"summary":["As I am seeing some Medium links in my timeline today, and Medium is pretty annoying (pop-overs and all). So reminder that you can just replace: > medium.com &with: > scribe.rip In any Medium link and&hellip;"],"content":[{"html":"<body class=\"app-body theme-default no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://dice.camp/@miriamrobern/113228532711715509"],"published":["2024-10-02T06:02:49.171Z"],"mp-slug":["06-02-49"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/10/02/06-02-49"]},"references":{"https://dice.camp/@miriamrobern/113228532711715509":{"type":["h-entry"],"properties":{"url":["https://dice.camp/@miriamrobern/113228532711715509"],"name":["Miriam \"Scary Username\" Robern (@miriamrobern@dice.camp)"],"summary":["Attached: 1 image OMFG this. #ai #meta #metaAI #aiart #chatgpt"],"featured":["https://cdn.masto.host/dicecamp/media_attachments/files/113/228/523/234/959/494/original/fe03a06e08e07b05.png"],"content":[{"html":"<body class=\"app-body theme-default no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://fediverse.zachleat.com/@zachleat/113209829620153665"],"published":["2024-09-27T14:44:20.260Z"],"mp-slug":["02-44-20"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/09/27/02-44-20"]},"references":{"https://fediverse.zachleat.com/@zachleat/113209829620153665":{"type":["h-entry"],"properties":{"url":["https://fediverse.zachleat.com/@zachleat/113209829620153665"],"name":["Zach Leatherman :11ty: (@zachleat@zachleat.com)"],"summary":["If your JavaScript framework doesn\u0019t support web components, it doesn\u0019t support the web platform."],"content":[{"html":"<body class=\"app-body theme-mastodon-light no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://alvaromontoro.com/blog/68063/bad-css-dad-jokes-ii"],"published":["2024-09-26T10:14:33.730Z"],"mp-slug":["10-14-33"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/09/26/10-14-33"]},"references":{"https://alvaromontoro.com/blog/68063/bad-css-dad-jokes-ii":{"type":["h-entry"],"properties":{"url":["https://alvaromontoro.com/blog/68063/bad-css-dad-jokes-ii"],"name":["Bad CSS-Dad Jokes (II)"],"summary":["After the terrible reception great success of my first post with Bad CSS-Dad Jokes, I am here to torture entertain you with more terrible amazing CSS jokes. Enjoy! :: Blog post at Alvaro Montoro's&hellip;"],"featured":["https://alvaromontoro.com/images/blog/bad-dad-jokes-2-0.webp"],"content":[{"html":"<div><div class=\"article-content\"> <p class=\"joke\">What is CSS Developers&apos; favorite car?<br>A <code>vw</code>.</p> <p class=\"joke\">How does a <code>&lt;div&gt;</code> dance?<br>It makes its border <code>groove</code>.</p> <p><img src=\"/images/blog/bad-dad-jokes-2-1.webp\" alt=\"CSS Break dance\"></p> <p>Wait... you haven&apos;t heard the news about randomization in CSS? Check my other (serious) <a href=\"https://alvaromontoro.com/blog/68062/new-values-and-functions-in-CSS\">post with some interesting features and functions arriving in CSS</a> &#x2014;hopefully one day soon.</p> <p class=\"joke\">Why do Mobile Developers go to McDonald&apos;s?<br> Because they like their hamburger menu.</p> <p class=\"joke\">How do Web Developers make a component hot?<br> They turn it 90 degrees.</p> <p class=\"joke\">What is blue and not too heavy?<br> <code>LightBlue</code></p> <p>And its even &quot;terribler&quot; and nerdier version:</p> <p class=\"joke\">What is blue and not too heavy?<br> <code>#ADD8E6</code></p> <figure> <img src=\"/images/blog/bad-dad-jokes-2-2.webp\" alt=\"What is blue and not too heavy? LightBlue\"> <figcaption>This image background is LightBlue</figcaption> </figure> <p class=\"joke\">Why did the last <code>&lt;div&gt;</code> blush?<br> Because it was next to its parent&apos;s <code>bottom</code>.</p> <p class=\"joke\">Why did the <code>&lt;video&gt;</code> element fail the test?<br> Because it didn&apos;t have a <code>:cue</code>.</p> <p class=\"joke\">CSS custom properties are in the <code>:root</code> of all evil (websites)</p> <p class=\"joke\"><code>&lt;input type=&quot;hidden&quot;&gt;</code> <br> hide-and-seek champion since 1995.</p> <figure> <img src=\"/images/blog/bad-dad-jokes-2-3.webp\" alt> <figcaption>I need a t-shirt with this :p</figcaption> </figure> <p>Fun fact: the type hidden was added to the HTML specification in 1995. This is mostly useless information, but now you know it.</p> <p class=\"joke\">Why didn&apos;t IE11 talk to other browsers?<br> Because it didn&apos;t know how to <code>&lt;dialog&gt;</code>.</p> <p>Another trivia fun fact: Chrome supported <code>&lt;dialog&gt;</code> since 2012! But it didn&apos;t become a full part of the standard until 2022. IE&apos;s end of life was June 2022, so that browser never implemented the <code>&lt;dialog&gt;</code> element.</p> <p class=\"joke\">Why are CSS Developers so optimistic?<br> They can never see a glass half <code>:empty</code>.</p> <p> <img src=\"/images/blog/bad-dad-jokes-2-4.webp\" alt> </p> <p class=\"joke\">Why did the <code>::before</code> pseudo-element not show up at its high school reunion?<br> Because it wasn&apos;t contented.</p> <p class=\"joke\">Why did the linear gradient fail the test?<br> Because it couldn&apos;t make the curve.</p> <p class=\"joke\">What&apos;s SVG&apos;s favorite TV host?<br> Doctor Fill.</p> <p class=\"joke\">Why do CSS developers only go to national masquerades?<br> Because masks can&apos;t go outside the borders.</p> <p>This one is not 100% true. We can make a mask apply outside of the element borders by setting <code>mask-clip: no-clip</code>.</p> <p class=\"joke\">Why did the SVG file go to the dentist?<br> It lost a fill-ing.</p> <p> <img src=\"/images/blog/bad-dad-jokes-2-5.webp\" alt> </p> <p class=\"joke\">Why did the <code>&lt;img&gt;</code> tag go to jail?<br> It was iframed.</p> <p class=\"joke\">What element shows <code>::before</code> after <code>::after</code>?<br> A dictionary.</p> </div><footer> <p> Article originally published on <time>September 23, 2024</time> </p> </footer></div>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://front-end.social/@bramus/113192802274531981"],"published":["2024-09-24T19:46:39.263Z"],"mp-slug":["07-46-39"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/09/24/07-46-39"]},"references":{"https://front-end.social/@bramus/113192802274531981":{"type":["h-entry"],"properties":{"url":["https://front-end.social/@bramus/113192802274531981"],"name":["Bramus (@bramus@front-end.social)"],"summary":["Attached: 1 image Something to add to your CSS reset from now on: ``` :root { interpolate-size: allow-keywords; } ``` It enables things like transitions from `height: 0` to `height: auto`.&hellip;"],"featured":["https://cdn.masto.host/frontendsocial/media_attachments/files/113/192/800/068/802/496/small/584e1829c2091c91.png"],"content":[{"html":"<body class=\"app-body theme-default no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://mastodon.social/@brad_frost/113192784039854930"],"published":["2024-09-24T16:27:13.848Z"],"mp-slug":["04-27-13"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/09/24/04-27-13"]},"references":{"https://mastodon.social/@brad_frost/113192784039854930":{"type":["h-entry"],"properties":{"url":["https://mastodon.social/@brad_frost/113192784039854930"],"name":["brad_frost (@brad_frost@mastodon.social)"],"summary":["Now that social media is scattered, I think it's finally time to set up an Indie Web-esque \"post (even short stuff) on my own site and automatically post it to Mastodon, Threads, et al. I've got a&hellip;"],"content":[{"html":"<body class=\"app-body theme-system no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://front-end.social/@mxbck/113101104768024484"],"published":["2024-09-08T18:08:51.088Z"],"mp-slug":["06-08-51"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/09/08/06-08-51"]},"references":{"https://front-end.social/@mxbck/113101104768024484":{"type":["h-entry"],"properties":{"url":["https://front-end.social/@mxbck/113101104768024484"],"name":["Max B�ck (@mxbck@front-end.social)"],"summary":["\u000f\u000f New post: Remember when the code in your editor was exactly the same code delivered to the browser? Now there's usually a build process in between, and that can get ... complicated. Do we still&hellip;"],"content":[{"html":"<body class=\"app-body theme-default no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://mastodon.social/@Daojoan/112980995791841731"],"published":["2024-08-19T10:07:13.818Z"],"mp-slug":["10-07-13"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/08/19/10-07-13"]},"references":{"https://mastodon.social/@Daojoan/112980995791841731":{"type":["h-entry"],"properties":{"url":["https://mastodon.social/@Daojoan/112980995791841731"],"name":["Joan Westenberg (@Daojoan@mastodon.social)"],"summary":["Attached: 1 image If anyone\u0019s wondering what the dude who sang \u001cchocolate rain\u001d is up to these days, he\u0019s dropping absolute bangers about housing and he\u0019s fucking right"],"featured":["https://files.mastodon.social/media_attachments/files/112/980/995/680/625/701/original/02e11d4478f3f48c.jpeg"],"content":[{"html":"<body class=\"app-body theme-system no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://toot.cafe/@slightlyoff/112656920041897216"],"published":["2024-06-23T09:13:48.250Z"],"mp-slug":["09-13-48"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/06/23/09-13-48"]},"references":{"https://toot.cafe/@slightlyoff/112656920041897216":{"type":["h-entry"],"properties":{"url":["https://toot.cafe/@slightlyoff/112656920041897216"],"name":["Alex Russell (@slightlyoff@toot.cafe)"],"summary":["Processing JS, e.g., is at least 3x more expensive per byte than HTML and CSS. That means that you can afford three times as much declarative content given a constant latency budget. Including network&hellip;"],"content":[{"html":"<body class=\"app-body theme-default no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://typetura.social/@scott/112632899898395667"],"published":["2024-06-18T09:11:29.939Z"],"mp-slug":["09-11-29"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/06/18/09-11-29"]},"references":{"https://typetura.social/@scott/112632899898395667":{"type":["h-entry"],"properties":{"url":["https://typetura.social/@scott/112632899898395667"],"name":["Scott Kellum :typetura"],"summary":["Do you use `font-smoothing: antialiased` in your CSS? I\u0019ve got some NEWS for you. MacOS Mojave made this the default in 2018. Also text rendering on Windows heavily relies on subpixel antialiasing. I&hellip;"],"content":[{"html":"<body class=\"app-body theme-mastodon-light no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://wa.rner.me/2024/06/02/firstweek-on-my.html"],"published":["2024-06-03T08:28:31.920Z"],"mp-slug":["08-28-31"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/06/03/08-28-31"]},"references":{}},{"type":["h-entry"],"properties":{"like-of":["https://smashingmagazine.com/2024/05/naming-best-practices/"],"published":["2024-05-24T12:47:52.920Z"],"mp-slug":["12-47-52"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/05/24/12-47-52"]},"references":{"https://smashingmagazine.com/2024/05/naming-best-practices/":{"type":["h-entry"],"properties":{"url":["https://smashingmagazine.com/2024/05/naming-best-practices/"],"name":["Best Practices For Naming Design Tokens, Components, Variables, And More \u0014 Smashing Magazine"],"summary":["How can we get better at naming? This post is dedicated to naming conventions, tips, and real-world examples that help you name things in a robust and flexible way."],"featured":["https://files.smashing.media/articles/naming-best-practices/naming-good-practices-opt.png"],"content":[{"html":"<div class=\"c-garfield-the-cat\"><p class=\"c-garfield-summary\"><section class=\"article__summary\"><span id=\"article__start\" class=\"summary__heading\"></span>How can we get better at naming? This post is dedicated to naming conventions, tips, and real-world examples that help you name things in a robust and flexible way.</section></p><p><strong>Naming is hard</strong>. As designers and developers, we often struggle finding the right name \u0014 for a design token, colors, UI components, HTML classes, and variables. Sometimes, the names we choose are <strong>too generic</strong>, so it\u0019s difficult to understand what exactly is meant. And sometimes they are <strong>too specific</strong>, leaving little room for flexibility and re-use.</p><p>In this post, we want to <strong>get to the bottom of this</strong> and explore how we can make naming more straightforward. How do we choose the right names? And which naming conventions work best? Let\u0019s take a closer look.</p><h2 id=\"inspiration-for-naming\">Inspiration For Naming</h2><p>If you\u0019re looking for some inspiration for naming HTML classes, CSS properties, or JavaScript functions, <a href=\"https://classnames.paulrobertlloyd.com/\">Classnames</a> is a wonderful resource jam-packed with ideas that get you <strong>thinking outside the box</strong>.</p><figure><a href=\"https://classnames.paulrobertlloyd.com/\"><img width=\"800\" srcset=\"https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/naming-best-practices/classnames-opt.png 400w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/naming-best-practices/classnames-opt.png 800w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/naming-best-practices/classnames-opt.png 1200w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/naming-best-practices/classnames-opt.png 1600w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/naming-best-practices/classnames-opt.png 2000w\" src=\"https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/naming-best-practices/classnames-opt.png\" sizes=\"100vw\" alt=\"Classnames\"></a><figcaption class=\"op-vertical-bottom\"><a href=\"https://classnames.paulrobertlloyd.com/\">Classnames</a> provides thematically grouped lists of words you can use for naming. (<a href=\"https://files.smashing.media/articles/naming-best-practices/classnames-opt.png\">Large preview</a>)</figcaption></figure><p>The site provides thematically grouped lists of words perfect for naming. You\u0019ll find terms to describe different kinds of behavior, likeness between things, order, grouping, and association, but also <strong>themed collections of words</strong> that wouldn\u0019t instantly come to one\u0019s mind when it comes to code, among them words from nature, art, theater, music, architecture, fashion, and publishing.</p><h2 id=\"naming-conventions\">Naming Conventions</h2><p>What makes a good name? Javier Cuello summarized a set of <a href=\"https://goodpractices.design/guidelines/naming\">naming best practices</a> that help you name your <strong>layers, groups and components</strong> in a consistent and scalable way.</p><figure><a href=\"https://goodpractices.design/guidelines/naming\"><img width=\"800\" srcset=\"https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/naming-best-practices/naming-good-practices-opt.png 400w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/naming-best-practices/naming-good-practices-opt.png 800w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/naming-best-practices/naming-good-practices-opt.png 1200w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/naming-best-practices/naming-good-practices-opt.png 1600w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/naming-best-practices/naming-good-practices-opt.png 2000w\" src=\"https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/naming-best-practices/naming-good-practices-opt.png\" sizes=\"100vw\" alt=\"Naming Good Practices\"></a><figcaption class=\"op-vertical-bottom\">Javier Cuello explores <a href=\"https://goodpractices.design/guidelines/naming\">what makes an effective name</a>. (<a href=\"https://files.smashing.media/articles/naming-best-practices/naming-good-practices-opt.png\">Large preview</a>)</figcaption></figure><p>As Javier points out, a good name has a logical structure, is short, meaningful, and known by everyone, and not related to visual properties. He shares <strong>do\u0019s and don\u0019ts</strong> to illustrate how to achieve that and also takes a closer look at all the fine little details you need to consider when naming sizes, colors, groups, layers, and components.</p><h2 id=\"design-tokens-naming-playbook\">Design Tokens Naming Playbook</h2><p>How do you name and manage design tokens? To enhance your design tokens naming skills, Romina Kavcic created an interactive <a href=\"https://thedesignsystem.guide/design-tokens-naming-playbook\">Design Tokens Naming Playbook</a>. It covers everything from <strong>different approaches to naming structure</strong> to creating searchable databases, running naming workshops, and automation.</p><figure><a href=\"https://thedesignsystem.guide/design-tokens-naming-playbook\"><img width=\"800\" srcset=\"https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/naming-best-practices/naming-playbook-opt.png 400w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/naming-best-practices/naming-playbook-opt.png 800w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/naming-best-practices/naming-playbook-opt.png 1200w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/naming-best-practices/naming-playbook-opt.png 1600w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/naming-best-practices/naming-playbook-opt.png 2000w\" src=\"https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/naming-best-practices/naming-playbook-opt.png\" sizes=\"100vw\" alt=\"Design Tokens Naming Playbook\"></a><figcaption class=\"op-vertical-bottom\">The <a href=\"https://thedesignsystem.guide/design-tokens-naming-playbook\">Design Tokens Naming Playbook</a> is a wonderful resource for experimenting with names. (<a href=\"https://files.smashing.media/articles/naming-best-practices/naming-playbook-opt.png\">Large preview</a>)</figcaption></figure><p>The playbook also features a <strong>naming playground</strong> where you can play with names simply by dragging and dropping. For more visual examples, also be sure to check out the <a href=\"https://www.figma.com/community/file/1372570473193150221/design-tokens-naming-playbook\">Figma template</a>. It includes components for all categories, allowing you to experiment with different naming structures.</p><h2 id=\"flexible-design-token-taxonomy\">Flexible Design Token Taxonomy</h2><p>How to build a flexible design token taxonomy that works across different products? That was the challenge that the team at Intuit faced. The parent company of products such as Mailchimp, Quickbooks, TurboTax, and Mint developed a <strong>flexible token system</strong> that goes beyond the brand theme to serve as the foundational system for a wide array of products.</p><figure><a href=\"https://medium.com/@NateBaldwin/creating-a-flexible-design-token-taxonomy-for-intuits-design-system-81c8ff55c59b\"><img width=\"800\" srcset=\"https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/naming-best-practices/token-taxonomy-opt.png 400w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/naming-best-practices/token-taxonomy-opt.png 800w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/naming-best-practices/token-taxonomy-opt.png 1200w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/naming-best-practices/token-taxonomy-opt.png 1600w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/naming-best-practices/token-taxonomy-opt.png 2000w\" src=\"https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/naming-best-practices/token-taxonomy-opt.png\" sizes=\"100vw\" alt=\"Creating a flexible design token taxonomy for Intuit\u0019s Design System\"></a><figcaption class=\"op-vertical-bottom\">Nate Baldwin shares insights into <a href=\"https://medium.com/@NateBaldwin/creating-a-flexible-design-token-taxonomy-for-intuits-design-system-81c8ff55c59b\">Intuit\u0019s flexible design token taxonomy</a>. (<a href=\"https://files.smashing.media/articles/naming-best-practices/token-taxonomy-opt.png\">Large preview</a>)</figcaption></figure><p>Nate Baldwin wrote a <a href=\"https://medium.com/@NateBaldwin/creating-a-flexible-design-token-taxonomy-for-intuits-design-system-81c8ff55c59b\">case study</a> in which he shares valuable insights into the making of <strong>Intuit\u0019s design token taxonomy</strong>. It dives deeper into the pain points of the old taxonomy system, the criteria they defined for the new system, and how it was created. Lots of takeaways for building your own robust and flexible token taxonomy are guaranteed.</p><h2 id=\"naming-colors\">Naming Colors</h2><p>When you\u0019re creating a color system, you need names for all its facets and uses. Names that everyone on the team can make sense of. But how to achieve that? How do you <strong>bring logic to a subjective topic</strong> like color? Jess Satell, Staff Content Designer for Adobe\u0019s Spectrum Design System, shares <a href=\"https://adobe.design/stories/design-for-scale/naming-colors-in-design-systems\">how they master the challenge</a>.</p><figure><a href=\"https://adobe.design/stories/design-for-scale/naming-colors-in-design-systems\"><img width=\"800\" srcset=\"https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/naming-best-practices/naming-colors-opt.png 400w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/naming-best-practices/naming-colors-opt.png 800w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/naming-best-practices/naming-colors-opt.png 1200w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/naming-best-practices/naming-colors-opt.png 1600w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/naming-best-practices/naming-colors-opt.png 2000w\" src=\"https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/naming-best-practices/naming-colors-opt.png\" sizes=\"100vw\" alt=\"Naming Colors In Design Systems\"></a><figcaption class=\"op-vertical-bottom\">Jess Sattell explains <a href=\"https://adobe.design/stories/design-for-scale/naming-colors-in-design-systems\">how language brings logic to a subjective topic like color</a>. (<a href=\"https://files.smashing.media/articles/naming-best-practices/naming-colors-opt.png\">Large preview</a>)</figcaption></figure><p>As Jess explains, the Spectrum color nomenclature uses a combination of color family classifier (e.g., blue or gray) paired with an incremental brightness value scale (50\u0013900) to name colors in a way that is not only logical for everyone involved but also <strong>scalable and flexible</strong> as the system grows.</p><p>Another handy little helper when it comes to naming colors is <a href=\"https://parrot.color.pizza/\">Color Parrot</a>. The Twitter bot is capable of naming and identifying the colors in any given image. Just mention the bot in a reply, and it will respond with a color palette.</p><p>Looking at what other people call similar things is a great way to start when you\u0019re <strong>struggling with naming</strong>. And what better source could there be than other design systems? Before you end up in the design system rabbit hole, Iain Bean did the research for you and created the <a href=\"https://component.gallery/components/\">Component Gallery</a>.</p><figure><a href=\"https://component.gallery/components/\"><img width=\"800\" srcset=\"https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/naming-best-practices/component-gallery-opt.png 400w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/naming-best-practices/component-gallery-opt.png 800w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/naming-best-practices/component-gallery-opt.png 1200w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/naming-best-practices/component-gallery-opt.png 1600w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/naming-best-practices/component-gallery-opt.png 2000w\" src=\"https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/naming-best-practices/component-gallery-opt.png\" sizes=\"100vw\" alt=\"The Component Gallery\"></a><figcaption class=\"op-vertical-bottom\"><a href=\"https://component.gallery/components/\">The Component Gallery</a> collects interface components from real-world design systems. (<a href=\"https://files.smashing.media/articles/naming-best-practices/component-gallery-opt.png\">Large preview</a>)</figcaption></figure><p>The Component Gallery is a collection of interface components from real-world design systems. It <strong>includes plenty of examples</strong> for more than 50 UI components \u0014 from accordion to visually hidden \u0014 and also lists other names that the UI components go by. A fantastic resource \u0014 not only with regards to naming.</p><h2 id=\"variables-taxonomy-map\">Variables Taxonomy Map</h2><p>A wonderful example of naming guidelines for a complex multi-brand, multi-themed design system comes from the Vodafone UK Design System team. Their <a href=\"https://www.figma.com/community/file/1339950482183709250/vodafone-uk-variables-taxonomy-map\">Variables Taxonomy Map</a> breaks down the <strong>anatomy and categorization of a design token</strong> into a well-orchestrated system of collections.</p><figure><a href=\"https://www.figma.com/community/file/1339950482183709250/vodafone-uk-variables-taxonomy-map\"><img width=\"800\" srcset=\"https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/naming-best-practices/variables-taxonomy-opt.png 400w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/naming-best-practices/variables-taxonomy-opt.png 800w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/naming-best-practices/variables-taxonomy-opt.png 1200w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/naming-best-practices/variables-taxonomy-opt.png 1600w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/naming-best-practices/variables-taxonomy-opt.png 2000w\" src=\"https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/naming-best-practices/variables-taxonomy-opt.png\" sizes=\"100vw\" alt=\"Variables Taxonomy Map\"></a><figcaption class=\"op-vertical-bottom\"><a href=\"https://www.figma.com/community/file/1339950482183709250/vodafone-uk-variables-taxonomy-map\">Vodafone\u0019s Variables Taxonomy Map</a> accommodates a complex multi-brand, multi-themed design system. (<a href=\"https://files.smashing.media/articles/naming-best-practices/variables-taxonomy-opt.png\">Large preview</a>)</figcaption></figure><p>The map illustrates four collections required to support the system and connections between tokens \u0014 <strong>from brand and primitives to semantics and pages</strong>. It builds on top of <a href=\"https://medium.com/eightshapes-llc/naming-tokens-in-design-systems-9e86c7444676\">Nathan Curtis\u0019 work on naming design tokens</a> and enables everyone to gather insight about where a token is used and what it represents, just from its name.</p><p>If you want to explore more approaches to naming design tokens, Vitaly compiled a <a href=\"https://www.linkedin.com/posts/vitalyfriedman_ux-design-activity-7173228980534243328-fHeA?utm_source=share&amp;utm_medium=member_desktop\">list of useful Figma kits and resources</a> that are worth checking out.</p><h2 id=\"design-token-names-inventory\">Design Token Names Inventory</h2><p>Romina Kavcic created a handy little resource that is bound to give your design token naming workflow a power boost. The <a href=\"https://www.linkedin.com/posts/rominakavcic_figma-designsystem-designtokens-activity-7114585552716185601-bBoR/\">Design Token Names Inventory spreadsheet</a> not only makes it easy to <strong>ensure consistent naming</strong> but also syncs directly to Figma.</p><figure><a href=\"https://www.linkedin.com/posts/rominakavcic_figma-designsystem-designtokens-activity-7114585552716185601-bBoR/\"><img width=\"800\" srcset=\"https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/naming-best-practices/token-names-inventory-opt.png 400w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/naming-best-practices/token-names-inventory-opt.png 800w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/naming-best-practices/token-names-inventory-opt.png 1200w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/naming-best-practices/token-names-inventory-opt.png 1600w, https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/naming-best-practices/token-names-inventory-opt.png 2000w\" src=\"https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/naming-best-practices/token-names-inventory-opt.png\" sizes=\"100vw\" alt=\"Design Token Names Inventory Spreadsheet\"></a><figcaption class=\"op-vertical-bottom\">The <a href=\"https://www.linkedin.com/posts/rominakavcic_figma-designsystem-designtokens-activity-7114585552716185601-bBoR/\">Design Token Names Inventory spreadsheet</a> automatically syncs to Figma. (<a href=\"https://files.smashing.media/articles/naming-best-practices/token-names-inventory-opt.png\">Large preview</a>)</figcaption></figure><p>The spreadsheet has a simple structure with four levels to give you a bird\u0019s-eye view of all your design tokens. You can easily add rows, themes, and modes without losing track and <strong>filter your tokens</strong>. And while the spreadsheet itself is already a great solution to keep everyone involved on the same page, it plays out its real strength in combination with the <a href=\"https://docs.sheetssync.app/\">Google Spreadsheets plugin</a> or the <a href=\"https://data.to.design/?trk=public_post-text\">Kernel plugin</a>. Once installed, the changes you make in the spreadsheet are reflected in Figma. A real timesaver!</p><h2 id=\"want-to-dive-deeper\">Want To Dive Deeper?</h2><p>We hope these resources will come in handy as you tackle naming. If you\u0019d like to dive deeper into design tokens, components, and design systems, we have a few friendly <strong>online workshops</strong> and <strong>SmashingConfs</strong> coming up:</p><p>We\u0019d be absolutely delighted to welcome you to one of our special Smashing experiences \u0014 be it online or in person!</p></div>"}],"published":["0000-05-23T09:00:00.000Z"]}}}},{"type":["h-entry"],"properties":{"like-of":["https://typetura.social/@scott/112397536211218435"],"published":["2024-05-07T09:16:13.718Z"],"mp-slug":["09-16-13"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/05/07/09-16-13"]},"references":{"https://typetura.social/@scott/112397536211218435":{"type":["h-entry"],"properties":{"url":["https://typetura.social/@scott/112397536211218435"],"name":["Scott Kellum :typetura"],"summary":["Always reject the cookies, even if it costs a few more clicks."],"content":[{"html":"<body class=\"app-body theme-mastodon-light no-reduce-motion\"> </body>"}]}}}},{"type":["h-entry"],"properties":{"like-of":["https://adactio.com/links/21109"],"published":["2024-05-07T09:14:46.813Z"],"mp-slug":["09-14-46"],"visibility":["visible"],"post-status":["published"],"url":["https://grant.codes/2024/05/07/09-14-46"]},"references":{"https://adactio.com/links/21109":{"type":["h-entry"],"properties":{"url":["https://adactio.com/links/21109"],"name":["Web Components from early 2024 � Chris Burnell"],"summary":["Some lovely HTML web components\u0014perfect for progressive enhancement!"],"featured":["https://adactio.com/images/photo-300.jpg"],"content":[{"html":"<div><main>\n<div class=\"h-entry\"> <div class=\"e-content\"> <p>Some lovely <a href=\"https://adactio.com/journal/20618\">HTML web components</a>\u0014perfect for progressive enhancement!</p> </div> <a href=\"https://chrisburnell.com/note/early-2024-web-components/\"><img src=\"https://chrisburnell.com/og-images/note-early-2024-web-components.png\" alt=\"Web Components from early 2024 &#xFFFD; Chris Burnell\"></a> <p>\n<a href=\"/links/21108\">Older &#xBB;</a>\n</p> <a class=\"u-bridgy-fed\" href=\"https://fed.brid.gy/\"></a>\n</div>\n<article class=\"h-entry\"> <div class=\"e-content\"> <blockquote> <p>As a self-initiated learner, being able to view source brought to mind the experience of a slow walk through someone else\u0019s map.</p> <p>This ability to \u001cobserve\u001d software makes HTML special to work with.</p>\n</blockquote> </div> </article><article class=\"h-entry\"> <div class=\"e-content\"> <p>This is a good description of the appeal of <a href=\"https://adactio.com/journal/20618\">HTML web components</a>:</p> <blockquote> <p>WC lifecycles are <em>crazy simple</em>: you register the component with <code>customElements.define</code> and it\u0019s off to the races. Just write a class and the browser will take care of elements appearing and disappearing for you, regardless of whether they came from a full reload, a fetch request, or\u0014god forbid\u0014a <code>document.write</code>. The syntax looks great in markup, too: no more having to decorate with <code>js-something</code> classes or data attributes, you just wrap your shit in a custom element called <code>something-controller</code> and everyone can see what you\u0019re up to. Since I\u0019m firmly in camp \u001cprogressively enhance or go home\u001d this fits me like a glove, and I also have great hopes for Web Components improving the poor state of pulling in epic dependencies like date pickers or text editors.</p>\n</blockquote> </div> </article><article class=\"h-entry\"> <div class=\"e-content\"> <p>The power of interoperability:</p> <blockquote> <p>Web components won\u0019t take web development by storm, or show us the One True Way to build websites. They don\u0019t need to dethrone JavaScript frameworks. We probably won\u0019t even all learn how to write them!</p> <p>What web components <em>will</em> do \u0014 at least, I hope \u0014 is let us collectively build a rich ecosystem of dynamic components that work with any web stack. No more silos. That\u0019s the web component success story.</p>\n</blockquote> </div> </article><article class=\"h-entry\"> <div class=\"e-content\"> <p>Lots of new features landing in Safari, and it&#x2019;s worth paying attention to the new icon requirements now that <a href=\"https://adactio.com/journal/20520\">websites can be added to the dock</a>:</p> <blockquote> <p>To provide the best user experience on macOS, supply at least one opaque, full-bleed <code>maskable</code> square icon in the web app manifest, either as SVG (any size) or high resolution bitmap (1024&#xFFFD;1024). </p>\n</blockquote> </div> </article><article class=\"h-entry\"> <div class=\"e-content\"> <p>Here&#x2019;s the video of <a href=\"https://adactio.com/articles/20638\">the talk I gave</a> in Nuremberg recently.</p> </div> </article><article class=\"h-entry\"> <p class=\"p-description\">\nThe `details` element is like the TL;DR of markup.\n</p> <footer> </footer> </article> <article class=\"h-entry\"> <p class=\"p-description\">\nThe World Wide Web is a mashup.\n</p> <footer> </footer> </article> <article class=\"h-entry\"> <p class=\"p-description\">\nExtending the wheel, instead of reinventing it.\n</p> <footer> </footer> </article> <article class=\"h-entry\"> <p class=\"p-description\">\nA difference of opinion regarding what the core features of custom elements should be.\n</p> <footer> </footer> </article> <article class=\"h-entry\"> <p class=\"p-description\">\nA little fix for Safari.\n</p> <footer> </footer> </article> </main><aside> <div class=\"box\"> <p>This is the plain vanilla look.</p> </div>\n<h3>Search</h3> <ul>\n<li>Peruse the <a href=\"/links/archive/\">links archive</a></li>\n<li>Browse the <a href=\"/links/tags/\">link tags</a></li>\n</ul> <div class=\"box\"> <p>You can subscribe to the <a href=\"/links/rss\"><abbr>RSS</abbr> feed of links</a>.</p> </div> </aside></div>"}]}}}}]}