<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="pretty-atom-feed.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Guérilla.Studio</title>
  <subtitle>Independent web software, by a small team of cross-disciplinary web experts</subtitle>
  <link href="https://guerilla.studio/feed/feed.xml" rel="self" />
  <link href="https://guerilla.studio/" />
  <updated>2024-10-09T07:50:19Z</updated>
  <id>https://guerilla.studio/</id>
  <author>
    <name>Guérilla.Studio (Tixie &amp; Milia)</name>
  </author>
  <entry>
    <title>2024 Vanilla List’s state and what’s next</title>
    <link href="https://guerilla.studio/blog/2024-vanilla-list-state-and-whats-next/" />
    <updated>2024-10-09T07:50:19Z</updated>
    <id>https://guerilla.studio/blog/2024-vanilla-list-state-and-whats-next/</id>
    <content type="html">&lt;p&gt;As some of you may have noticed: &lt;a href=&quot;https://vanillalist.top&quot;&gt;Vanilla List&lt;/a&gt;—our index curating lightweight JavaScript plugins, is kinda in hiatus mode. I didn’t add any plugin/library since early 2023 and here were are, at the end of 2024.&lt;/p&gt;
&lt;p&gt;There are several reasons behind it.&lt;/p&gt;
&lt;h2&gt;It was painfull to manage&lt;/h2&gt;
&lt;p&gt;Adding plugins to the website is a very manual and time consuming task.&lt;br&gt;
Especially since I’m doing my best to curate only quality projects and take time to offer them a good presentation.&lt;/p&gt;
&lt;p&gt;The process for suggesting plugins is even more laborious.&lt;br&gt;
The (very kind) people suggesting plugins have to fork the project and send a Pull Request,
followed by several back-and-forths, until everything matches my quality criteria. Which is also draining for me.&lt;/p&gt;
&lt;h2&gt;A radical change or just life? 😁&lt;/h2&gt;
&lt;p&gt;At the end of 2023 I was stuck in bed during a tough recovery time. So to keep my mind busy on something else than physical pain I started working on a new version of the website (funny considering &lt;a href=&quot;https://tixie.name/logs/03-01-2021-11-21-am/&quot;&gt;the context&lt;/a&gt; of the last revamp).&lt;/p&gt;
&lt;p&gt;I had in mind to improve the plugin addition and suggestion aspects, along with adding more complex features I think would be useful to have.&lt;/p&gt;
&lt;p&gt;And while I was at it, also upgrade the entire stack the website is based on. This mainly includes upgrading to the next major version of the builder (&lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt;) and using some of its (at the time) bleeding edge features. Changing completely the framework was also on the table.&lt;/p&gt;
&lt;p&gt;All that included re-organizing and sanitizing how plugins were currently stored.&lt;br&gt;
So, it was making sense for me to keep the online version in a frozen state in the meantime to limit the amount of modifications I’d have to do when merging that new version.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What could possibly go wrong ahahah&lt;/strong&gt;… *&lt;em&gt;sigh&lt;/em&gt;* 🙄&lt;/p&gt;
&lt;p&gt;Well, I finally got out from recovery but burnout caught up with me, &lt;em&gt;big time&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;And unfortunately all that work completely stopped.&lt;/p&gt;
&lt;p&gt;I’ve spent basically all 2023 and 2024 trying to make things work in my life with burnout and other health issues.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;That’s why not much has changed for quite some time.&lt;/p&gt;
&lt;h2&gt;What now?&lt;/h2&gt;
&lt;p&gt;Until now this project is purely made on my free time (my previous employer used to allow some time for me to work on it since it was useful for the company, that’s not the case anymore).&lt;br&gt;
Needless to say that I always refused to monetize it in any way. It’s not in my values. Nothing is free but fuck the advertising economy.&lt;/p&gt;
&lt;p&gt;Recently some things have slightly evolved in a better direction:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I’m progressively recovering, enough to start working on tech projects a bit (I&#39;ve merged a few PR lately)&lt;/li&gt;
&lt;li&gt;And big news: I’m now “full-time” working independently in a smaller structure I’ve co-founded that is no other that Guérilla.Studio! (I talked that decision briefly at the end of 2023 in &lt;a href=&quot;https://tixie.name/logs/12-20-2023-1-04-end-of-a-chapter/&quot;&gt;a post&lt;/a&gt; on my personal blog).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Starting an adventure like that is certainly something big and time/energy/money consuming, but I’m surrounded by wonderful people and organisations that helped putting that into shape. (More info to come later)&lt;/p&gt;
&lt;p&gt;All this to say that I should have more time to finish Vanilla List’s new website (probably in 2025) and also fill it with plenty new plugins and libraries, either &lt;a href=&quot;https://github.com/GuerillaStudio/vanillalist/labels/plugin%20suggestion&quot;&gt;suggested&lt;/a&gt; or that &lt;a href=&quot;https://github.com/stars/TixieSalander/lists/vanilla-list-todo&quot;&gt;I’ve aggregated&lt;/a&gt; along the way.&lt;/p&gt;
&lt;p&gt;It still will depend of the variable amount of available energy or free time I’ll have (since I’m a big fan of having a roof, food everyday and things like that 😅).&lt;/p&gt;
&lt;h2&gt;How to help&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The project is not dead or looking for maintainer. I just need time.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I may in the future set up some kind of financial support through donations (GitHub sponsor for example), that would allow me to spend more time working on non-commercial open-source projects like Vanilla List. I’ll inform you when it will be in a more advanced state.&lt;/p&gt;
&lt;p&gt;In any case any feedbacks, ideas for Vanilla List are welcome and a &lt;a href=&quot;https://github.com/GuerillaStudio/vanillalist/discussions&quot;&gt;&amp;quot;Discussions&amp;quot; area&lt;/a&gt; on GitHub is now available if you want somewhere to post.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Aaaaand that’s about it.&lt;br&gt;
Thank you already if you have read everything until now 🫶&lt;/p&gt;
&lt;p&gt;&lt;em&gt;As sign of hope for the future, a preview of the future homepage&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://guerilla.studio/img/cRIDBvdm6i-560.avif 560w, https://guerilla.studio/img/cRIDBvdm6i-1120.avif 1120w, https://guerilla.studio/img/cRIDBvdm6i-1200.avif 1200w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://guerilla.studio/img/cRIDBvdm6i-560.webp 560w, https://guerilla.studio/img/cRIDBvdm6i-1120.webp 1120w, https://guerilla.studio/img/cRIDBvdm6i-1200.webp 1200w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://guerilla.studio/img/cRIDBvdm6i-560.png&quot; alt=&quot;Preview of the future homepage on a desktop sized screen&quot; width=&quot;1200&quot; height=&quot;675&quot; srcset=&quot;https://guerilla.studio/img/cRIDBvdm6i-560.png 560w, https://guerilla.studio/img/cRIDBvdm6i-1120.png 1120w, https://guerilla.studio/img/cRIDBvdm6i-1200.png 1200w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;&lt;i&gt;Thanks Hécate for fixing my typos&lt;/i&gt;🫶&lt;/small&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>The Mastodon media limitations final guide</title>
    <link href="https://guerilla.studio/blog/mastodon-media-upload-limits/" />
    <updated>2023-08-19T13:57:43Z</updated>
    <id>https://guerilla.studio/blog/mastodon-media-upload-limits/</id>
    <content type="html">&lt;h2&gt;File extensions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Images&lt;/strong&gt;: .jpg, .jpeg, .png, .gif, .webp, .heic, .heif, .avif&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Videos&lt;/strong&gt;: .webm, .mp4, .m4v, .mov&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Size, dimensions &amp;amp; FPS&lt;/h2&gt;
&lt;p&gt;So, it&#39;s divided in two parts since &lt;a href=&quot;https://github.com/mastodon/mastodon/pull/23726&quot;&gt;it&#39;s changing&lt;/a&gt; starting in version 4.2.0. &lt;br&gt;
&lt;sub&gt;(no it&#39;s not a &lt;a href=&quot;https://en.wikipedia.org/wiki/420_(cannabis_culture)&quot;&gt;weed joke&lt;/a&gt;, I&#39;ll stop you right here)&lt;/sub&gt;&lt;/p&gt;
&lt;h3&gt;Images&lt;/h3&gt;
&lt;h4&gt;Before v4.2.0&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Size: &lt;strong&gt;10 &lt;dfn&gt;&lt;abbr title=&quot;MegaBytes&quot;&gt;MB&lt;/abbr&gt;&lt;/dfn&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;dfn&gt;&lt;abbr title=&quot;What you can upload&quot;&gt;Upload limit&lt;/abbr&gt;&lt;/dfn&gt;: &lt;strong&gt;3840 × 2160 px&lt;/strong&gt; (4K)&lt;/li&gt;
&lt;li&gt;&lt;dfn&gt;&lt;abbr title=&quot;The maximum it&#39;s gonna be resize in&quot;&gt;Target dimensions&lt;/abbr&gt;&lt;/dfn&gt;: &lt;strong&gt;1920 × 1080 px&lt;/strong&gt; (1080p / Full HD)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Starting v4.2.0&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Size: &lt;strong&gt;16 &lt;dfn&gt;&lt;abbr title=&quot;MegaBytes&quot;&gt;MB&lt;/abbr&gt;&lt;/dfn&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;dfn&gt;&lt;abbr title=&quot;What you can upload&quot;&gt;Upload limit&lt;/abbr&gt;&lt;/dfn&gt;: &lt;strong&gt;7680 × 4320 px&lt;/strong&gt; (8K)&lt;/li&gt;
&lt;li&gt;&lt;dfn&gt;&lt;abbr title=&quot;The maximum it&#39;s gonna be resize in&quot;&gt;Target dimensions&lt;/abbr&gt;&lt;/dfn&gt;: &lt;strong&gt;3840 × 2160 px&lt;/strong&gt; (4K)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Videos&lt;/h3&gt;
&lt;h4&gt;Before v4.2.0&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Size: &lt;strong&gt;40 &lt;dfn&gt;&lt;abbr title=&quot;MegaBytes&quot;&gt;MB&lt;/abbr&gt;&lt;/dfn&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;dfn&gt;&lt;abbr title=&quot;What you can upload&quot;&gt;Upload limit&lt;/abbr&gt;&lt;/dfn&gt;: &lt;strong&gt;1920 × 1080 px&lt;/strong&gt; (1080p / Full HD)&lt;/li&gt;
&lt;li&gt;&lt;dfn&gt;&lt;abbr title=&quot;Frames Per Second, also called “Frame rate”&quot;&gt;FPS&lt;/abbr&gt;&lt;/dfn&gt; limit: &lt;strong&gt;60 FPS&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Starting v4.2.0&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Size: &lt;strong&gt;99 &lt;dfn&gt;&lt;abbr title=&quot;MegaBytes&quot;&gt;MB&lt;/abbr&gt;&lt;/dfn&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;dfn&gt;&lt;abbr title=&quot;What you can upload&quot;&gt;Upload limit&lt;/abbr&gt;&lt;/dfn&gt;: &lt;strong&gt;3840 × 2160 px&lt;/strong&gt; (4K)&lt;/li&gt;
&lt;li&gt;&lt;dfn&gt;&lt;abbr title=&quot;Frames Per Second, also called “Frame rate”&quot;&gt;FPS&lt;/abbr&gt;&lt;/dfn&gt; limit: &lt;strong&gt;120 FPS&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;How to know on which version you are&lt;/h3&gt;
&lt;p&gt;In case you&#39;re wondering:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Write your instance&#39;s address (mastodon.social, octodon.social or eldritch.cafe or for example) in your web browser&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;/about&lt;/code&gt; at the end to access the about page&lt;/li&gt;
&lt;li&gt;Scroll at the end where it&#39;s should displayed somewhere &lt;sub&gt;&lt;em&gt;(woaw thanks Tixie for this specific info lol)&lt;/em&gt;&lt;/sub&gt;&lt;br&gt;
&lt;br&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://guerilla.studio/img/0DAF4bUQIm-560.avif 560w, https://guerilla.studio/img/0DAF4bUQIm-1120.avif 1120w, https://guerilla.studio/img/0DAF4bUQIm-1424.avif 1424w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://guerilla.studio/img/0DAF4bUQIm-560.webp 560w, https://guerilla.studio/img/0DAF4bUQIm-1120.webp 1120w, https://guerilla.studio/img/0DAF4bUQIm-1424.webp 1424w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://guerilla.studio/img/0DAF4bUQIm-560.png&quot; alt=&quot;Bottom of mastodon.social/about page with the version (v4.2.0) circled&quot; width=&quot;1424&quot; height=&quot;1340&quot; srcset=&quot;https://guerilla.studio/img/0DAF4bUQIm-560.png 560w, https://guerilla.studio/img/0DAF4bUQIm-1120.png 1120w, https://guerilla.studio/img/0DAF4bUQIm-1424.png 1424w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&#39;s it, that&#39;s the &lt;s&gt;toot&lt;/s&gt; post. Hope it helped.&lt;/p&gt;
&lt;p&gt;I may improve it over time, so don&#39;t hesitate to give me feedbacks, searching into Mastodon&#39;s codebase is a pain in the ass already &lt;em&gt;(and I know what I&#39;m talking about, &lt;a href=&quot;https://www.linguee.com/english-french/translation/bread.html&quot;&gt;I&#39;m french&lt;/a&gt;)&lt;/em&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Welcome the beta of Placehold.in</title>
    <link href="https://guerilla.studio/blog/welcome-placeholdin-beta/" />
    <updated>2023-07-25T11:56:03Z</updated>
    <id>https://guerilla.studio/blog/welcome-placeholdin-beta/</id>
    <content type="html">&lt;p&gt;&lt;strong&gt;Now available at &lt;span aria-hidden=&quot;true&quot;&gt;→&lt;/span&gt; &lt;a href=&quot;https://placehold.in?from=guerillablog&quot;&gt;https://placehold.in&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Why?&lt;/h2&gt;
&lt;p&gt;For context, I was kind of pissed of after seen placehold.it being bought by placeholder.com (no big deal at this point, only had a search &amp;amp; replace urls in my ongoing projects)… and now placeholder.com have been being recently bought by some warehouse place renting (for the domain SEO ranking I guess 🙄).&lt;/p&gt;
&lt;p&gt;So I decided it was time to buid our own placeholder image generator to be independant of that.&lt;br&gt;
I talked about it with Milia and she ended up having a working prototype pretty quickly.&lt;/p&gt;
&lt;p&gt;For now it’s on beta because we didn’t had the time to make a proper landing page with branding &amp;amp; fancy things, so it’s very… minimalist.&lt;/p&gt;
&lt;p&gt;However the essential infos on how to use the service are here. And if you were using placeholder.com, our API is very similar so you shouldn’t be lost.&lt;/p&gt;
&lt;h2&gt;Features&lt;/h2&gt;
&lt;p&gt;It’s the kind without photos (unlike &lt;a href=&quot;https://picsum.photos/&quot;&gt;Lorem Picsum&lt;/a&gt;), with informations displayed to help debuging when you have to integrate optimized and responsive visuals:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;size&lt;/strong&gt; (&lt;code&gt;{width}&lt;/code&gt; or &lt;code&gt;{width}x{height}&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;format&lt;/strong&gt; (png, jpeg, svg, webp, avif and heif)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dpr&lt;/strong&gt; (inspired by &lt;a href=&quot;https://docs.imgix.com/apis/rendering/pixel-density/dpr&quot;&gt;imgix&#39;s dpr attribute&lt;/a&gt; if it can save you some time doing the calculation yourself)&lt;/li&gt;
&lt;li&gt;and even a &lt;strong&gt;light/dark mode&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All that to easily be sure the right image is showing when you want to.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://guerilla.studio/img/bnuhSK-Pz7-560.avif 560w, https://guerilla.studio/img/bnuhSK-Pz7-1120.avif 1120w, https://guerilla.studio/img/bnuhSK-Pz7-2240.avif 2240w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://guerilla.studio/img/bnuhSK-Pz7-560.webp 560w, https://guerilla.studio/img/bnuhSK-Pz7-1120.webp 1120w, https://guerilla.studio/img/bnuhSK-Pz7-2240.webp 2240w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://guerilla.studio/img/bnuhSK-Pz7-560.png&quot; alt=&quot;https://placehold.in/560x200@1x.svg/dark&quot; width=&quot;2240&quot; height=&quot;224&quot; srcset=&quot;https://guerilla.studio/img/bnuhSK-Pz7-560.png 560w, https://guerilla.studio/img/bnuhSK-Pz7-1120.png 1120w, https://guerilla.studio/img/bnuhSK-Pz7-2240.png 2240w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;would for example render this:&lt;br&gt;
&lt;br&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://guerilla.studio/img/VmWzHa5-kL-560.avif 560w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://guerilla.studio/img/VmWzHa5-kL-560.webp 560w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://guerilla.studio/img/VmWzHa5-kL-560.svg&quot; alt=&quot;example of image&quot; width=&quot;560&quot; height=&quot;200&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2&gt;Infrastructure&lt;/h2&gt;
&lt;p&gt;Behind we use &lt;a href=&quot;https://docs.netlify.com/configure-builds/on-demand-builders/&quot;&gt;Netlify’s On Demand Builders&lt;/a&gt; to generate images only when needed and cache them as long as possible (Netlify say 10000 cached max so depending of the usage, we’ll see if we need to put a caching CDN in the middle to help with the cache).&lt;/p&gt;
&lt;p&gt;Also that way we take avantage of Netlify’s CDN to make it fastly (and always) available pretty much anywhere is the world.&lt;/p&gt;
&lt;p&gt;And overall so far it cost me only a domain a year.&lt;/p&gt;
&lt;h2&gt;Improvements we&#39;re considering&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Adding JPEGXL (&lt;code&gt;.jxl&lt;/code&gt;). It&#39;s for now not suppored because it’s not packaged inside &lt;em&gt;libvips&lt;/em&gt; (the image processing library used) by default. That would require to make an extra step to compile our own version version libvips with libjxl. And then make &lt;a href=&quot;https://sharp.pixelplumbing.com&quot;&gt;sharp&lt;/a&gt; (the node package around libvips we use in the serverless function)&lt;/li&gt;
&lt;li&gt;Make an interactive version of the example URL (currently at the top of the landing) where visitors could enter their own values, have an preview displayed dynamically + a button to copy the URL in their clipboard&lt;/li&gt;
&lt;li&gt;Make interactive examples with &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; code on one side and result on the other, with toggles to showcase differents situations (browsers not handling a format, DPR changes, or viewport resizing)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;To conclude&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;First&lt;/strong&gt;, if you have sucessfully read everything: bravo! 😅&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Secondly&lt;/strong&gt;: This is still in beta because we want to be sure everything is working as expected. And potentially have a first wave of feedbacks to fix the more problematic problems.
So you are more than welcome to test it and reach us if you have any feedbacks, problems, ideas for things to improve, anything!&lt;/p&gt;
&lt;p&gt;Don’t Hesitate ❤️&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Accessibility and CSS customisation in Mastodon: The “Publish” button</title>
    <link href="https://guerilla.studio/blog/accessibility-css-customisation-mastodon-publish-button/" />
    <updated>2023-07-19T21:43:16Z</updated>
    <id>https://guerilla.studio/blog/accessibility-css-customisation-mastodon-publish-button/</id>
    <content type="html">&lt;p&gt;For context since its &lt;a href=&quot;https://github.com/mastodon/mastodon/releases/tag/v4.0.0&quot;&gt;v4.0&lt;/a&gt;, Mastodon changed the post button&#39;s label previously called “Toot” to “Publish” &lt;a href=&quot;https://mastodon.social/@Gargron/108352418240054955&quot;&gt;for clarity reasons&lt;/a&gt;. However many people were attached to that &lt;a href=&quot;https://mastodon.social/@Hbomberguy/146524&quot;&gt;historically funny&lt;/a&gt; label, and due to its limited customisability Mastodon wasn&#39;t allowing admins to setup a custom label for this button.&lt;br&gt;
&lt;br&gt;
At this time I&#39;ve seen many instance admins sharing a CSS hack to customize that label and reverse that change or just be creative. It was possible because Mastodon allows admins to apply additional custom CSS to their instance through their administration panel (Site Settings → Appearance).&lt;br&gt;
&lt;br&gt;
However I&#39;m not sure everyone knows the accessibility issue who come with: &lt;a href=&quot;https://en.wikipedia.org/wiki/Screen_reader&quot;&gt;screen readers&lt;/a&gt; will read (and speak) &lt;strong&gt;both of the labels&lt;/strong&gt;.&lt;br&gt;
&lt;br&gt;
Why? Let&#39;s start with taking common snippet I seen (found &lt;a href=&quot;https://ricard.dev/gists/2022-12-18/&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;https://github.com/mastodon/mastodon/issues/20751#issuecomment-1315329065&quot;&gt;here&lt;/a&gt; for example):&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.compose-form__publish-button-wrapper button&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-indent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; -9999px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.compose-form__publish-button-wrapper button::after&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Toot!&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-indent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; initial&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;The original label will be read by screen readers&lt;/h2&gt;
&lt;p&gt;Screen readers won&#39;t read(/speak) hidden content in a web page. And for being hidden its requires to match one of these conditions :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;contains a &lt;code&gt;display:none&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;contains a &lt;code&gt;visibility: hidden&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;take &lt;strong&gt;no space&lt;/strong&gt; in the page (this one is tricky I agree)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In our snippet, the first two conditions can&#39;t be used since it would hide completely the button. &lt;br&gt;
So the trick was to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Throw the text backward with &lt;code&gt;text-indent:-9999px&lt;/code&gt; (ew a magic number 🥴)&lt;/li&gt;
&lt;li&gt;Remove any-height to the text with line-height:0&lt;/li&gt;
&lt;li&gt;Use a &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements&quot;&gt;pseudo element&lt;/a&gt; (here ::after) to create a child element inside button and fill it with the custom label through the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/content&quot;&gt;content property&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With that made, our original label still being rendered, because even if it&#39;s thrown backward and its line-height reduced to 0, your text will still take some space:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;line-height: 0 won&#39;t hide text outside of its height&lt;/li&gt;
&lt;li&gt;the text still have a non-null width&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So there is a good chance that the original label will still be read by screen readers.&lt;/p&gt;
&lt;h2&gt;The content property is also read by screen readers&lt;/h2&gt;
&lt;p&gt;It&#39;s a misconception I&#39;ve encounter several time while talking to other developers. Maybe because since it&#39;s in CSS it shouldn&#39;t end up in the accessibility tree? Well &lt;strong&gt;it does&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I haven&#39;t made a test on all screen-readers myself, but &lt;a href=&quot;https://jhalabi.com/blog/before-after-accessibility&quot;&gt;someone did&lt;/a&gt; in 2017. I don&#39;t have more recent stats but since it&#39;s the behavior expected in &lt;a href=&quot;https://www.w3.org/TR/css-content-3/#accessibility&quot;&gt;the W3C specification&lt;/a&gt;, I think it&#39;s safe to imagine it&#39;s gonna be more adopted through the years.&lt;/p&gt;
&lt;h2&gt;What screen readers will probably end up reading&lt;/h2&gt;
&lt;p&gt;“Publish!Toot!” (or “Toot!Publish!” if &lt;code&gt;:before&lt;/code&gt; is used instead of &lt;code&gt;:after&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;I haven&#39;t figured a CSS-only way to either hide the original label for screen readers too or hide the custom label for screen readers only. If someone have an idea (and tested it), I would be happy to edit this post to share the solution!&lt;/p&gt;
&lt;h2&gt;To conclude&lt;/h2&gt;
&lt;p&gt;If you&#39;re a sighted user and wanna use this snippet just for yourself (with a browser extension like &lt;a href=&quot;https://en.wikipedia.org/wiki/Stylus_%28browser_extension%29&quot;&gt;Stylus&lt;/a&gt;), go for it, enjoy! &lt;br&gt;
However I wouldn&#39;t advise deploying that kind of hack instance-wide.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>How to make colored placeholder on Hugo</title>
    <link href="https://guerilla.studio/blog/make-colored-placeholder-hugo/" />
    <updated>2020-03-17T18:41:53Z</updated>
    <id>https://guerilla.studio/blog/make-colored-placeholder-hugo/</id>
    <content type="html">&lt;p&gt;While using &lt;a href=&quot;https://gohugo.io/&quot;&gt;Hugo&lt;/a&gt; as a static site generator, I&#39;ve found a way to generate a colored placeholder with a little trick.&lt;/p&gt;
&lt;p&gt;I used it on my &lt;a href=&quot;https://music.guerilla.studio/&quot;&gt;music sharing website&lt;/a&gt; for example:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://guerilla.studio/img/riDvltlOxm-560.webp 560w, https://guerilla.studio/img/riDvltlOxm-584.webp 584w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://guerilla.studio/img/riDvltlOxm-560.gif&quot; alt=&quot;colored placeholder example&quot; width=&quot;584&quot; height=&quot;551&quot; srcset=&quot;https://guerilla.studio/img/riDvltlOxm-560.gif 560w, https://guerilla.studio/img/riDvltlOxm-584.gif 584w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The trick is pretty simple in itself:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Firstly use the &lt;a href=&quot;https://gohugo.io/content-management/image-processing/&quot;&gt;Hugo&#39;s image processing&lt;/a&gt; to generate a version of your image resized at 1px by 1px (your image must be a &lt;a href=&quot;https://gohugo.io/content-management/page-resources/&quot;&gt;page resource&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Secondly generate a base64 version using the `base64Encode` function.&lt;/li&gt;
&lt;li&gt;Then add it as an inlined background-image using the base64 version prefixed by the media type. That way this image not gonna be an external resource and will be visible before your final image.&lt;/li&gt;
&lt;li&gt;Finally specify your image size to define a space for your placeholder to expand&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The final result will look at something like that:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;{{ $original := resources.Get &#39;/img/your-image.jpg&#39; }}
{{ $visual := $original.Resize &quot;x400&quot; }}
{{ $placeholder := $visual.Resize &quot;x1&quot; }}
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token value css language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token function&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data:{{ $placeholder.MediaType }};base64,{{ $placeholder.Content | base64Encode }}&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;{{ $visual.Permalink }}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;400&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;400&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To go a bit further, I can imagine a solution where you generate a placeholder of 50x50px and add a &lt;code&gt;background-size: cover&lt;/code&gt; in your css to have a blurred version for your placeholder.&lt;/p&gt;
&lt;p&gt;Don&#39;t hesitate to contact me if you use this trick on your own project. I&#39;m always curious of what can be done with it!&lt;/p&gt;
</content>
  </entry>
</feed>