I read this on recommendation of an Incomparable episode. The whole time, I was thinking about how a parent could treat their daughters in this manner. The saddest part is that this is probably the most realistic part of it.
I want to write more. I feel that in order to do that I need to schedule more time for it to happen.
Fabulous Friday Folks!
I cleaned all the stuff out of my Drafts.app inbox. I feel light and filled with 100 possibilities. Maybe more!
I think I’m going to start some of this next week. I have a couple of adjustments that I’m thinking about for the website.
One of the changes of note was the inclusion of render hooks for callouts included in v0.132.0. This is coupled with the enhancements in v0.134 makes it more compatible with GitHub, Obsidian, and Typora.
The whole goal of this is to have markdown text like the following
> [!NOTE]
> Useful information that users should know, even when skimming content.
generate HTML and have the browser render into the following example
In case there is an error with processing the markdown, I’ve placed a static version of the HTML in this document below.
I wanted to implement this because I sometimes play around with Obsidian and I really enjoy OtΓ‘vio’s plugin to publish to Micro.blog. With this, I can have the website follow the behavior of reading mode in Obsidian. I started writing this post in December of 2024. I ran into some issues along the way, but I kept coming back to this. At this point, some of the references are no longer available. My desire for writing in a way where I would use this functionality is no longer there.
But, it’s cool, and I know that there might be someone out there who can use this.
If you have any questions or suggestions, feel free to email me.
Resources
I’m leaning heavily on the resources that I’ve found on the internet. I want to take a moment to recognize their work and others can get it directly from the source.
This is where I got the final design for the admonitions from. I decided to make some changes so that it matches the style that I wanted to go for. At beginning of this project, the build system I was using did not allows for sass.
Creating the callout
Diagrams help me think of the overall structure as a combination of different blocks.
When it comes to designing, I like to take inspiration from what is already available. I spent a lot of time goofing off researching how other people have implemented this and tried static version of those in my theme to see what I liked and didn’t like. Sometimes this takes up a lot of time as I try to understand why the original authors make certain decisions. Is it a technical or design choice that makes someone use <blockquote> or <div> for the final product?
This article about pullquotes better articulates why I use <aside> instead of <blockquote>. I have seen people use <figure>, but choose not to because I feel that figures are an essential part of the document while <aside> is additive.
I also went with a <header> inside of the admonition in the hopes that I’ll better understand how the different pieces come together. In addition, I used the <h3> tag to meet up with the heading convention that I’ve been using. I see the callouts as section of the document that contains information
I placed the content in a <div> for logistics and styling.
Iconic Icons
For the <svg>, I took some time to understand how they work in HTML and Hugo. I was already in the process of adding SVG icons to the site to make it stand out more. SVG stands for Scalable Vector Graphics. They are text representation of a graphic that we can embed within the document for the browser to render.
These are some that popular sites where you can get SVGs.
If you are into reading more about SVGs, there is a free book on SVG that I’m thinking about adding to the list.
Static Structure
The resulting static HTML that I created to do my color styling looks similar to the following.
<asideclass="admonition note"><headerclass="admonition-header"><svgxmlns="http://www.w3.org/2000/svg"width="24"height="24"viewBox="0 0 24 24"fill="none"stroke="currentColor"stroke-width="2"stroke-linecap="round"stroke-linejoin="round"class="icon icon-tabler icons-tabler-outline icon-tabler-note"><pathstroke="none"d="M0 0h24v24H0z"fill="none"/><pathd="M13 20l7 -7"/><pathd="M13 20v-6a1 1 0 0 1 1 -1h6v-7a2 2 0 0 0 -2 -2h-12a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h7"/></svg><h3>Note</h3></header><divclass="admonition-content"> Useful information that users should know, even when skimming content.
</div></aside>
Styles and colors
For the initial implementation, I wanted to get the 5 states defined in the GitHub documentation which are note, tip, important, warning, and caution. This took longer than it should because I was having trouble deciding on what icon I should use for note and important because of the different samples I was pulling from contradict.
I placed static copies of the HTML in a page with the first line changed to the corresponding type as the class.
For example, the class for tip would look like this:
<asideclass="admonition tip">
I then created a separate CSS file and linked it in the site header. I’m hoping that it will make things easier to find and modify styles in the future2. Since I’m working from Jinyi’s code as my base, I start off with the basic admonition and a note.
I define the default color for the admonitions to be the accent color of my site with a default value in case someone takes this file and attempts to use it by itself.
This is where the magic happens and we start seeing the Cascade portion of CSS. This makes the forefront/currentColor --admonition-color. This is used in fonts and any svgs that are in the header.
I started with the example from the blockquote/alert documentation and I was really happy to know that it worked correctly by simply creating the file and putting the sample code in. Making the changes to the HTML tags was also pretty straight forward.
Create a dictionary to match which image goes to a specific image. Jinyi used the icon set from font-awesome so the names are not an exact match. I started off with just the basics and add info because I was working on this late at night and couldn’t remember if it was info or important that was part of the five initial alerts.
Look in the dictionary for the alert type that was given by the user. If the alert type isn’t there, it will use info as the default. I decided that if I don’t have an icon in mind, I want it to show up as information to be given to the user.
This specifies the path to the SVG that we’re going to use. I had attempted to use the method from Ronoe to load image from the assert directory but I didn’t understand the code at this point in time. I used a different variable for the file name because I didn’t want to confuse myself later on.
Hugo loads the contents of the partial if it exist and puts it in the output. It’s a safe guard in case I add an image to the icons dictionary but don’t upload the file. In addition, there was a change to the templating system introduced in v0.146.0 that renamed partial to _partial. Be aware of that when implementing this on your own.
If the title isn’t there, we use the alert type for the heading. All the examples that I’ve seen also include the step of sending it through i18n for internationalization. One thing I noticed, is that it capitalized the alert properly before I created the associated translation file. I might just leave it that way because I’m currently the only one using this theme.
If there isn’t an alert, text is processed as if it was a normal <blockquote> element.
Further callout options
After the initial creation of the render hook, I took some time away from the project. Some of the people that create content that I enjoy use Obsidian on a regular basis for writing and the ever growing list of what that application can do. Someone pointed out that there is a Callout Manager and the default has more than the list that I originally created. Other tools also have a wider assortment. I added a couple more to the dictionary, but I noticed that this would get tedious to add keys that would go to the same value. For example, in my list info and important use the same image.
So, after a little bit of trial and error, I was able to put together the following code block
{{- /* Define a list of keys that should share the same icon */ -}}{{$keys:=slice"important""warning""error"}}{{-range$keys}}{{- /* Merge each key into the dictionary with the same icon value */ -}}{{-$icons=merge$icons(dict."exclamation-circle.svg")}}{{-end}}
Creates a small dictionary with the key and the name of the image. Then it merges that dictionary with the icon dictionary and saves it.
I’m still a beginner at the go programming language and I don’t know if this is saving by value or reference. I also don’t know if this is more performant than having a longer dictionary with all the values. I’m hoping that the comments and this article helps me remember this the next time I want to add something.
Making it a little more accessible
During this development process, I noticed that one example would load the SVG and add aria-hidden="true" to make screen readers skip over the image without alternative text. I edited the SVG files that I use to have this additional line and played with the idea of adding aria-labelledby but I don’t have a way of reliably setting it and don’t know how this would improve the user experience.
I feel the next step that I would like to pursue is to get get the colors to work better in the dark mode of my theme. I don’t feel that the contrast is good enough for warning and I’m thinking about moving to CSS colors such as blue or rebeccapurple instead of hexidecimal values. I’ve already done one like the following
I’d also like to adjust the alignment of the icons. I don’t know if this is because I took the examples from different icons that are sized differently or if having the icon outside of the <h3> is causing more issues than it’s worth.
As always, I appreciate any feed back and I hope this article finds you well.
By the time I got ready to publish this article, the site was no longer available. I’m hoping that it’s just a temporary shutdown until this person has the domain refreshed. ↩︎
I have had to stop myself a couple times from trying to find the best way to deliver the HTML/CSS for this feature. Should I have separate files with style rules that I might not use or put it inline and worry that I might have an article that use dozens of these things? I feel shipping is more important. ↩︎
I’ve scheduled a big post at 2:30. I’m just so happy to have finished it. I’m going to leave the house so that I don’t constantly hit the refresh button.
I use Fastmail for my mail service and it was nice that it was mentioned in this article. I'm going to have to add reviewing my post about BIMI to my list of things to do.
Email authentication is evolving, and Ed25519 DKIM keys promise clear advantages over traditional RSA: smaller keys, faster verification, and stronger cryptographic guarantees. But those benefits only matter if mailbox providers actually support the standard. To find out, Red Sift analyzed DKIM behavior across major email platforms to answer critical questions for email administrators: can Ed25519 keys be deployed safely today without risking authentication failures?
Unfortunately, I’m still at a place where I can justify registering a trademark so that people can see my picture in their email.
I like coming across articles where people use technology to make things better.
Back in January (how has it been two months already!?), I was working on the UML diagrams for my Kindle Display post and realized I had no idea how to make them accessible for screen readers.
This one was sitting in my drafts folder for a while. I’ve got a couple of these that deserve to be shared.
I miss the days where I thought something like this was only for the super paranoid.
Tor is an overlay network that was specifically designed to protect the privacy of its users. The Tor Network uses multiple layers of encryption and relays in order to protect a person’s location and other potential identifiers, such as an IP address.
Its name comes from the acronym for The Onion Router, a routing system using multiple layers that can get peeled off at each step, like an onion π§
*[IP]: Internet Protocol