Sr. Content Developer at Microsoft, working remotely in PA, TechBash conference organizer, former Microsoft MVP, Husband, Dad and Geek.
147723 stories
·
33 followers

Three Plug-N-Play CSS Libraries

1 Share

For probably over a decade, when I wanted to make a demo/site look nice and didn't really care about making it unique, I'd go to Bootstrap. Bootstrap had a nice, clean look and as I was usually employing it for demos, or admin screens, I didn't care if it looked like every other Bootstrap site. While Bootstrap was mostly simple, it's also wordy as heck. Bootstrap has an insane love affair with div tags and even a simple Bootstrap page feels like the line number goes up 4X. Again, that's fine, but I found myself wishing for something a bit simpler. That's where the frameworks I'm sharing today come in. For the most part, these libraries require little to no work on your part. You add a CSS library (or two), and everything just gets better. You can optionally update your markup a bit, but in general, these libraries are great for the "I don't care, just make it nice and clean" approach that works great for demos and POCs.

As an example of what I would not consider to be "plug-n-play", is the excellent Shoelace library, which requires you to use web components to make use of the library. I really like Shoelace, but the options I'm sharing below are even simpler to use.

To demonstrate what these libraries do out of the box, I'll use this HTML as a template:

<html>
	<head>
	</head>
	
	<body>
		<h1>Sample Page</h1>
		
		<p>
			This is some content. There is other content like my content, but this is my content.
		</p>
		
		<form>
			<p>
			<label for="name">Your Name:</label>
			<input type="text" id="name">
			</p>
			<p>
			<label for="email">Your Email:</label>
			<input type="text" id="email">
			</p>
			<p>
				<label for="comments">Your Comments:</label>
				<textarea id="comments"></textarea>
			</p>
			<p>
				<input type="submit">
			</p>
		</form>
		
		<h2>Cats</h2>
		<table>
			<thead>
				<tr>
					<th>Name</th>
					<th>Gender</th>
					<th>Age (Years)</th>
				</tr>
			</thead>
			<tbody>
				<tr>
					<td>Luna</td><td>Female</td><td>13</td>
				</tr>
				<tr>
					<td>Grace</td><td>Female</td><td>12</td>
				</tr>
				<tr>
					<td>Pig</td><td>Female</td><td>10</td>
				</tr>
				<tr>
					<td>Zelda</td><td>Female</td><td>2</td>
				</tr>
				<tr>
					<td>Wednesday</td><td>Female</td><td>1</td>
				</tr>
			</tbody>
		</table>
	</body>
</html>

It's got a few headers, text, a form, and a table. For comparison's sake with the libraries below, here's how this is rendered:

See the Pen CSS PNP - Milligram by Raymond Camden (@cfjedimaster) on CodePen.

Milligram

First one up is also the simplest, Milligram. The most difficult thing about using it is remembering that it has 2 "L"s in the name, not one. Thanks go to Todd Sharp for sharing this one. Installation is really simple for this library, three CSS links:

<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/milligram/1.4.1/milligram.css">

After that, there's nothing else to do. Customization options exist, for example, changing the type of button, but there's not much else to it. Here's an example of my default HTML template using the library:

See the Pen CSS PNP - Miligram by Raymond Camden (@cfjedimaster) on CodePen.

One thing you'll notice is a lack of padding on the sides. In the past I've added a quick body style with padding, but if you look at the docs for their grid system, you can see that wrapping the content with <div class="container"> is enough to add padding and center the content. I've made that tweak below:

See the Pen CSS PNP - Milligram (2) by Raymond Camden (@cfjedimaster) on CodePen.

All in all, a good update with just two lines of code added.

Simple.css

Next up is an option I found about a month or so ago and it's currently my favorite, Simple.css. Like Milligram, you simply drop in a CSS link:

<!-- Minified version -->
<link rel="stylesheet" href="https://cdn.simplecss.org/simple.min.css">

There's both a minified and un-minified version. Here's our default HTML with the library applied:

See the Pen CSS PNP - Naked by Raymond Camden (@cfjedimaster) on CodePen.

Gorgeous. Notice it has dark mode support built-in, but if you want, you can force one mode only. There are a few additional things you can do if you want some additional formatting, for example, adding a header or footer will get you a nicely formatted, well, header and footer. In the embed below, I wrapped the h1 on top:

<header>
<h1>Sample Page</h1>
</header>		

And added a footer:

<footer>
    <p>Copy &copy; 2026 Raymond Camden</p>
</footer>

And here's how that renders:

See the Pen CSS PNP - Simple.css by Raymond Camden (@cfjedimaster) on CodePen.

Oat

Last up is an option that literally came to my attention three or four hours ago (and when I realized this was a good third option, it motivated this post), Oat. As an aside, the link there (in case you don't click) is https://oat.ink/. I don't think I've ever seen a .ink TLD before. Unlike the other two options, this one requires one CSS and one JavaScript library:

<link rel="stylesheet" href="https://unpkg.com/@knadh/oat/oat.min.css">
<script src="https://unpkg.com/@knadh/oat/oat.min.js" defer></script>

Initially, this looks a lot like Milligram, including the lack of spacing:

See the Pen CSS PNP - Naked by Raymond Camden (@cfjedimaster) on CodePen.

As with Milligram, and heck, using the same HTML, you can quickly fix this with their grid system by wrapping your content with <div class="container">. Their docs demonstrate all the various modifications the library adds to a page, including a few web components you get via the JavaScript library, for example, here's a basic tabs component:

<ot-tabs>
  <div role="tablist">
    <button role="tab">Account</button>
    <button role="tab">Password</button>
    <button role="tab">Notifications</button>
  </div>
  <div role="tabpanel">
    <h3>Account Settings</h3>
    <p>Manage your account information here.</p>
  </div>
  <div role="tabpanel">
    <h3>Password Settings</h3>
    <p>Change your password here.</p>
  </div>
  <div role="tabpanel">
    <h3>Notification Settings</h3>
    <p>Configure your notification preferences.</p>
  </div>
</ot-tabs>

As one more example, I added tabs to the page, the grid system, and added dark mode support by including data-theme="dark" to the body tag:

See the Pen CSS PNP - Oak by Raymond Camden (@cfjedimaster) on CodePen.

More?

If any of yall know of more options like this, I'd love to hear about them. Just drop me a comment below. As I mentioned, Simple.css is my favorite now, but I'm going to give Oat a try in the next demo I build.

CC0 licensed photo by Umesh Balayar from the WordPress Photo Directory.

Read the whole story
alvinashcraft
2 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

Condensed views on Kanban and Sprint boards

1 Share

One of the challenges teams face when working with large boards or displaying multiple fields on work item cards is limited screen space. This became even more noticeable with the rollout of the New Boards hub, which introduced additional spacing and padding for improved readability. While this enhances clarity, it can also reduce the number of cards visible at once.

For example, if a work item contains a dozen or more tags and several custom fields, a single card can easily consume a significant portion of your vertical space. In Delivery Plans, we addressed this challenge with the condensed view option, where only the work item Id and title are displayed.

We’re excited to bring the same condensed view capability to both the Kanban and Sprint board pages. With a single click, you can now toggle between the standard card layout and a more compact view that shows only titles.

Before…

before image

After…

after image

As you can see, the condensed view allows you to see significantly more cards on the screen at once, making it easier to scan, triage, and manage large backlogs.

This feature is rolling out as part of the current release and is expected to reach all organizations by early March.

The post Condensed views on Kanban and Sprint boards appeared first on Azure DevOps Blog.

Read the whole story
alvinashcraft
3 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

🖼️ Local Image Embeddings in .NET — CLIP + ONNX

1 Share

⚠ This blog post was created with the help of AI tools. Yes, I used a bit of magic from language models to organize my thoughts and automate the boring parts, but the geeky fun and the 🤖 in C# are 100% mine.

Hi 👋

If you’ve used ElBruno.LocalEmbeddings for text embeddings, you’re going to love the new image capabilities. I asked several friends about this, and they challenge me to give it a try, so here it is:

ElBruno.LocalEmbeddings.ImageEmbeddings a library brings CLIP-based multimodal embeddings to .NET — fully local.

It is powered by ONNX Runtime, and ready for image search and image RAG workflows. In this post, I’ll show you:

  • How to download the required CLIP models
  • A tiny “hello image embeddings” sample in C#
  • The two image samples included in the repo: ImageRagSimple and ImageRagChat

Here is the RAGChat using images as a source:

Let’s dive in! 🚀

Note: Right now, the auto-download feature as part of the library is Work-In-Progress, as these models are big. I’m working on the .NET library that do this (see roadmap), but I think so far with the download scripts we are OK.


📦 The Library: Image Embeddings (CLIP)

The image embedding library is built on top of OpenAI’s CLIP model (Contrastive Language–Image Pretraining). It uses two ONNX models:

  • Text encoder → embeds natural language queries
  • Vision encoder → embeds images

Both embeddings live in the same vector space, which means text-to-image and image-to-image search works with simple cosine similarity.


⬇ Download the CLIP Models

CLIP requires four files:

  • text_model.onnx
  • vision_model.onnx
  • vocab.json
  • merges.txt

We provide scripts that download the correct files from Hugging Face.

Windows (PowerShell)

./scripts/download_clip_models.ps1

Linux / macOS (Bash)

chmod +x scripts/download_clip_models.sh
./scripts/download_clip_models.sh

These scripts download the models to:

./scripts/clip-models

✅ Basic Usage — Minimal C# Example

Here’s the simplest possible flow using the new library:

using ElBruno.LocalEmbeddings.ImageEmbeddings;
string modelDir = "./scripts/clip-models";
string imageDir = "./samples/images";
string textModelPath = Path.Combine(modelDir, "text_model.onnx");
string visionModelPath = Path.Combine(modelDir, "vision_model.onnx");
string vocabPath = Path.Combine(modelDir, "vocab.json");
string mergesPath = Path.Combine(modelDir, "merges.txt");
using var textEncoder = new ClipTextEncoder(textModelPath, vocabPath, mergesPath);
using var imageEncoder = new ClipImageEncoder(visionModelPath);
var searchEngine = new ImageSearchEngine(imageEncoder, textEncoder);
searchEngine.IndexImages(imageDir);
var results = searchEngine.SearchByText("a cat", topK: 3);
foreach (var (imagePath, score) in results)
{
Console.WriteLine($"{Path.GetFileName(imagePath)} → {score:F4}");
}

That’s it: index images → run text query → get ranked results.


🧪 Sample 1: ImageRagSimple

ImageRagSimple is the most minimal sample. It demonstrates the core flow:

  1. Load CLIP text + vision models
  2. Index all images in a folder
  3. Run a few hardcoded text queries

This is the best sample to read if you want to understand the library usage with minimal noise.


💬 Sample 2: ImageRagChat

ImageRagChat builds on the same engine but adds a polished CLI experience using Spectre.Console. It supports:

  • Live text-to-image search
  • Image-to-image search with image:<path>
  • A readable, interactive UI

Commands inside the app:

  • Type any text → search images
  • Type image: path/to/image.jpg → image-to-image search
  • Type exit → quit

🧭 Which Sample Should You Start With?

SampleBest ForNotes
ImageRagSimpleLearning the library APIStraight-line demo, no UI
ImageRagChatInteractive exploration(Better) UX + Chat mode

🎬 Video Walkthrough (Coming Soon)

Recorded a short video demo that walks through the library and both samples!


📚 Resources

Happy coding!

Greetings

El Bruno

More posts in my blog ElBruno.com.

More info in https://beacons.ai/elbruno




Read the whole story
alvinashcraft
4 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

JetBrains Rider Settings for Presentations

1 Share

I speak at conferences and user groups and I often use JetBrains Rider for my presentations and demos. While at CodeMash 2026, I noticed a presenter using JetBrains Rider and “missing” some of the features that I like to use when I am presenting. I walked him through some of the settings that I change when I am presenting and thought “I should blog about this.”

Like most blog posts, this is an opinionated list of settings and plugins that I use when presenting with JetBrains Rider. Your mileage may vary and you may find other settings and plugins that work better for you when presenting. The important thing is to find what works best for you when presenting and to have fun presenting with JetBrains Rider.

Plugins

There are many plugins available for JetBrains Rider, these are two that I use when presenting … in no particular order :smile:.

Window Arranger

Window Arranger

This plugin helps you easily switch between projects, arrange project windows, and resize them to various predefined dimensions. You can align windows horizontally or vertically, maximize, and position them to the left, right, top, or bottom, improving workspace organization and productivity.

When the plugin is installed and enabled, you will see a “Window” like icon next to the project branch, highlighted in red, like this:

Window Arranger Icon

When you click on the icon, you will see a menu with the different options to arrange the windows.

Window Arranger Drop Down Menu

Key Promoter X

Key Promoter X

The Key Promoter X helps you to learn essential shortcuts while you are working. When you use the mouse on a button inside the IDE, the Key Promoter X shows you the keyboard shortcut that you should have used instead.

This provides an easy way to learn how to replace tedious mouse work with keyboard keys and helps to transition to a faster, mouse free development. The Key Promoter X tool window shows you a hit-list of the mouse actions you use the most and directly provides you with the shortcut you can use instead. For buttons that don’t have a shortcut, the Key Promoter X prompts you with the possibility to directly create one.

Here is an example of the Key Promoter X showing a keyboard shortcut (F9) for the Toggle Breakpoint action when I click on the red dot in the gutter to set a breakpoint:

Key Promoter X

Bundled Plugins

This plugins are bundled with JetBrains Rider and I enable them when I am presenting.

Keymaps

I use these mostly because of muscle memory, being a long time user of Visual Studio and ReSharper. Plus, as a bonus, it allows me to show the keyboard shortcuts that most of the attendees of the presentation are used to.

  • ReSharper Keymap
  • Visual Studio 2022 Keymap
  • Visual Studio Keymap

Others

  • Terminal: I use the terminal a lot when presenting and this plugin allows me to have a terminal window inside of JetBrains Rider and not have to jump to the operating system terminal.
  • Database Tools and SQL: I use this plugin when I am presenting database related topics and it allows me to connect to databases and run SQL queries inside of JetBrains Rider.

Settings

For the settings, I use the default settings for the most part, but there are a few settings that I change when I am presenting. These settings are mostly related to the appearance of the IDE and the editor.

Appearance and Behavior

In the Appearance section, the only “non-default” setting that I change is the Presentation Mode Zoom level, which I set to 175%. This setting is used when you enter presentation mode which I will cover in more detail in the Tool Windows / IDE Features > Appearance section below. This setting allows me to make the text and the UI elements larger when I am presenting, which makes it easier for the attendees to see what I am doing on the screen.

Appearance & Behavior > Presentation Assistant

There used to be a plugin called Presentation Assistant that would show the keyboard shortcuts on the screen when you used them. This plugin is no longer available because it was replaced by built-in features. These settings in the built-in Presentation Assistant help you to make the keyboard shortcuts more visible when presenting.

Navigate to Settings > Appearance & Behavior > Presentation Assistant and review the following settings:

  • Check Show action names and shortcuts in popups to show the action names and shortcuts in popups when you use them.
  • Assign the Keymaps you would like the Presentation Assistant to show when you use the keyboard shortcuts. I use the Keymaps of ReSharper Keymap and Visual Studio 2022 Keymap when presenting.

My settings look like this:

Presentation Assistant Settings

Editor

Editor > General

I change the following settings in Settings > Editor > General when I am presenting:

Editor > General > Mouse Control
  • Check the Change font size with Ctrl+Mouse Wheel in: and select All editors to allow me to quickly adjust the font size if I need to during a presentation.
  • Check the More code fragments with drag and drop to allow me to easily move code around when I am presenting.
Editor > General > Soft Wraps

This setting is more of a preference, but I like to check the Soft-wrap these files: and add *.md; *.txt; *.rst; *.adoc to allow me to easily read markdown files and other text files when I am presenting.

Editor > General > Appearance
  • Check the Show line numbers: and set it to Absolute so I can reference line numbers when I am presenting and attendees can easily follow along.
Editor > General > Code Folding

These are more of a preference, and depending on the type of presentation I am giving, I may check or uncheck these settings. My default settings are:

Show code folding arrows is checked and set to On mouse hover.

Fold by default is checked for the following:

  • General > File header
  • General > Imports
  • Android > String references
  • JSON > Show key count in folded JSON
  • Markdown > Collapse front matter
  • Markdown > Collapse links
  • Markdown > Collapse table of contents
  • XML > HTML ‘style’ attribute
  • XML > XML Entities
  • XML > Data URIs
  • YAML > Limit folded keys and values to 20 characters
  • .NET > Preprocessor regions
  • C/C++ > Conditionally non-compiled code
  • F# > F# hash directives blocks

Editor > Font

Now this setting has a lot of personal preferences, but the two settings that I use when presenting are:

  • Font: I also use a Mono spaced font when presenting and coding so I really don’t have to change this setting when I am presenting. I use JetBrainsMono Nerd Font Mono, but you can use any Mono spaced font that you like.
  • Font size is usually set to 13 and line height is set to 1.0 when I am presenting. However, this will be adjusted based on the size of the room and the size of the screen that I am presenting on. I usually start with these settings and then adjust them as needed during the presentation. I’ll cover this is more detail in the Important Keyboard Shortcuts and Tool Windows / IDE Features section below.

Tool Windows / IDE Features

Tool Windows

These are available via shortcuts and via the View > Tool Windows menu. I use these tool windows when I am presenting to show different aspects of the IDE and to help me navigate through the code and the project. Some of the tool windows I use when presenting are:

  • Explorer: CTRL+ALT+L or View > Tool Windows > Explorer to show the project structure and files when I am presenting.
  • Database: CTRL+\+S or View > Tool Windows > Database to show the database connections and queries when I am presenting.
  • TODO: CTRL+\+T or View > Tool Windows > TODO to show the TODO items in the code when I am presenting.

Appearance

These are available via shortcuts and via the View > Appearance menu. I use these appearance features when I am presenting to show reduce distractions and to help me navigate through the code and the project.

Appearance Menu

Some of the appearance features I use when presenting are:

Appearance > Presentation Mode

When I am ready to start presenting, I enter the presentation mode by going to View > Appearance > Enter Presentation Mode. This will hide all the tool windows and the menu bar and will make the editor take up the entire screen. This is a great way to focus on the code and the presentation without any distractions.

It’s going to be a little hard to see in the screenshot, but when you enter presentation mode, the menu bar and the tool windows are hidden and the editor takes up the entire screen. This screenshot is at a 1920x1440 resolution, so you can see that the editor is taking up the entire screen with just the code window, and there are no distractions.

Presentation Mode

While in presentation mode, you can still access the tool windows and the menu bar by using the shortcuts or by moving your mouse to the top of the screen to show the menu bar and the tool windows. This allows you to quickly access the features of the IDE without having to exit presentation mode.

Presentation Mode with Menu Bar

You’ll also notice, that in the upper right corner of menu bar, there is a clock with the current time. This is a great way to keep track of time during a presentation and to make sure that you are staying on schedule. Plus, there is a Presentation Mode indicator next to the clock, so you can easily exit presentation mode.

Appearance > Presentation Assistant

Choose the Presentation Assistant option from the View > Appearance menu to show the keyboard shortcuts on the screen when you use them. This is a great way to show the attendees what keyboard shortcuts you are using during a presentation and to help them learn the shortcuts as well.

Presentation Assistant

You can see in the screenshot above that I pressed CTRL+ALT+S to open the settings and the Presentation Assistant is showing the keyboard shortcut on the screen. This is a great way to show the attendees what keyboard shortcuts you are using during a presentation and to help them learn the shortcuts as well. Especially, if you forget to mention the keyboard shortcut that you are using during a presentation.

Important Keyboard Shortcuts

You can find all the keyboard shortcuts in the Settings > Keymap section, but here are some of the important keyboard shortcuts that I use when presenting, besides the typical CUT, COPY, PASTE shortcuts.

These shortcuts are with the Visual Studio 2022 Keymap, but you can use the shortcuts from the Keymap that you are using when presenting.

General

Action Shortcut Description
Build Solution CTRL+SHIFT+B Build the entire solution.
Increase Font Size CTRL+Mouse Wheel Up Increase the font size.
Increase Font Size in All Editors CTRL+SHIFT+. Increase the font size in all editors.
Decrease Font Size in All Editors CTRL+SHIFT+, Decrease the font size in all editors.
Code Completion CTRL+SPACE Show code completion suggestions.
Action Shortcut Description
Go to File CTRL+SHIFT+T Go to a file in the project.
Search Everywhere CTRL+T or CTRL+, Search for anything in the IDE.
Go to Line CTRL+G Go to a specific line in the editor.

Wrap Up

As I mentioned at the beginning of this post, these are just some of the settings and plugins that I use when presenting with JetBrains Rider. There are many other settings and plugins that you can use when presenting with JetBrains Rider, so I encourage you to explore the settings and plugins and find what works best for you when presenting.

References

Read the whole story
alvinashcraft
4 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

Apple introduces a new video podcast experience on Apple Podcasts

1 Share
Apple today announced a transformative update coming to Apple Podcasts this spring that will bring advanced video podcast capabilities to the app.

Read the whole story
alvinashcraft
3 hours ago
reply
Pennsylvania, USA
Share this story
Delete

Using curiosity to decenter

1 Share
Although I don't write much about psychology, I've recently become fascinated by a technique I learned, similar to cognitive decentering but with a slight variation. The technique works quite well, though I'm still refining it and understanding it. So this is a brief sketch of the idea. At a future point, I might unpack this in a more researched way, but for now, this is the napkin sketch.

Read the whole story
alvinashcraft
3 hours ago
reply
Pennsylvania, USA
Share this story
Delete
Next Page of Stories