Simple.css and Org-mode Feature Demo
9 min read
This post tests many of the HTML elements styled by Simple.css. It serves as both a visual showcase and a reference for writing rich blog posts with org-mode.
Table of Contents
Typography
All the standard typography elements are supported. This paragraph is plain body text set at Simple.css's default sizing.
Headings (this is h2)
Since the post title is already an h1, org * headings render as h2, ** as h3, and so on.
This is h3
Content under an h3 heading.
This is h4
Content under an h4 heading.
This is h5
Content under an h5 heading.
Inline formatting
Org-mode supports many inline styles that map to HTML elements:
- Bold text for strong emphasis
- Italic text for regular emphasis
- Underlined text for annotations
Inline codefor code referencesStrikethrough textfor deletions
For elements like <mark> and <kbd> where Org has no native equivalent, we defined custom macros at the top of this file (#+MACRO: kbd ...). This drastically cleans up your writing flow compared to writing raw HTML:
- Highlighted text using the
{{{mark(...)}}}macro - Keyboard shortcuts like Ctrl + C using the
{{{kbd(...)}}}macro
You can also combine org styles: bold italic, underlined italic.
Links
Here's a standard hyperlink. Links are styled with the accent color and have a hover effect that removes the underline.
Buttons
Simple.css styles <button> elements and links with the button class. You can just use inline HTML snippets for them safely inside paragraphs!
Lists
Unordered lists
A simple bulleted list:
- First item
- Second item
- Nested item A
- Nested item B
- Deeply nested item
- Third item
Ordered lists
A numbered list:
- Do this thing first
- Then do this thing
- Finally, do the other thing
- Sub-step one
- Sub-step two
Description lists
- Emacs
- An extensible, customizable, self-documenting text editor.
- Org-mode
- A document editing, formatting, and organizing mode.
- Simple.css
- A classless CSS framework for semantic HTML.
Blockquotes
Sometimes you want to quote someone:
Friends don't spy; true friendship is about privacy, too.
— Stephen King
Blockquotes can also contain multiple paragraphs:
The best way to predict the future is to invent it.
Every technology has its dark side, but it doesn't mean we should stop innovating.
— Alan Kay
Code blocks
Inline code like variable-name is useful, but sometimes you need a full code block.
Emacs Lisp
(defun hello-world ()
"Display a greeting message."
(interactive)
(message "Hello, %s!" user-full-name))
(global-set-key (kbd "C-c h") #'hello-world)
Python
def fibonacci(n: int) -> list[int]:
"""Generate the first n Fibonacci numbers."""
sequence = []
a, b = 0, 1
for _ in range(n):
sequence.append(a)
a, b = b, a + b
return sequence
if __name__ == "__main__":
print(fibonacci(10))
Shell
#!/bin/bash
# A simple script to greet users
NAME="${1:-World}"
echo "Hello, ${NAME}!"
for i in $(seq 1 5); do
echo " Count: $i"
done
# Testing a very long line to ensure code blocks have horizontal scroll functionality
find . -type f -name "*.org" -exec awk '/#\+BEGIN_SRC/ {src=1; next} /#\+END_SRC/ {src=0; next} src {print}' {} \; | grep -i "echo" | sort | uniq -c | sort -nr
CSS
body {
color: var(--text);
background: var(--bg);
font-size: 1.15rem;
line-height: 1.5;
margin: 0;
}
Tables
Tables are automatically styled with alternating row highlights:
| Name | Language | Year | Stars |
|---|---|---|---|
| Linux | C | 1991 | 180000 |
| Emacs | Emacs Lisp | 1976 | 4500 |
| Neovim | C / Lua | 2014 | 82000 |
| VS Code | TypeScript | 2015 | 165000 |
| Helix | Rust | 2021 | 34000 |
A larger table to test horizontal overflow:
| Editor | Language | Year | License | Platform | Plugin System | LSP Support | Treesitter | Primary Focus | Initial Release | Memory Footprint | Startup Time | Default Keybindings | Support |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Emacs | Emacs Lisp | 1976 | GPL-3.0 | Cross-platform | Yes (elisp) | Via eglot | Yes | Extensibility | 1976 | Medium-High | Slow | Emacs | Active |
| Neovim | C / Lua | 2014 | Apache-2.0 | Cross-platform | Yes (Lua) | Built-in | Built-in | Modern Vim | 2015 | Low | Very Fast | Vim | Active |
| VS Code | TypeScript | 2015 | MIT | Electron | Yes (JS/TS) | Built-in | Partial | Out-of-box exp | 2015 | High | Slow | IDE-like | Active |
| Helix | Rust | 2021 | MPL-2.0 | Terminal | Planned | Built-in | Built-in | Modal editing | 2021 | Very Low | Instant | Kakoune-inspired | Active |
| Zed | Rust | 2024 | GPL-3.0 | Native | Yes (Wasm) | Built-in | Built-in | Performance, Collab | 2024 | Low | Instant | VS Code-like | Active |
Images
Images are displayed full-width inside the main element. Simple.css styles <figure> with rounded corners and <figcaption> for captions.
You don't need raw HTML to apply classes, alternate text, or inline styles! You can use the powerfully native #+ATTR_HTML: directive:
Figure 1: A placeholder image demonstrating figure and caption support
Advanced Developer Features
Because you are using Org-mode to build this site, you have access to some incredible tools for technical writing that standard Markdown lacks.
Seamless Cross-Referencing
You can give any section a custom ID using Org properties, just like the Images section above using :CUSTOM_ID: images-section. You can then cleanly link to it from anywhere: Jump back up to the Images section.
Live Code Transclusion
Writing tutorials? Don't copy-paste your code; it goes out of date quickly! Just include the live file directly from your repository:
#+INCLUDE: "./path/to/script.sh" src bash
When org-grimoire builds your site, it will grab the live contents of that file and insert them exactly where the #+INCLUDE directive is.
Code Execution & Results (Org Babel)
You can tell Org to execute your code blocks during generation and embed the actual stdout into your blog. This is perfect for data science or technical blogs.
echo "Hello from Org Babel! The current date is: $(date '+%Y-%m-%d')"
uname -a | awk '{print "OS: "$1" "$3}'
Hello from Org Babel! The current date is: 2026-04-12 OS: Linux 6.6.87.2-microsoft-standard-WSL2
When Org-mode evaluates the block above, it will output both the source code and the exact results of the code execution underneath it.
HTML5 Native Tags (Aside, Details, Notice)
Org-mode by default exports most special blocks as <div> elements (e.g. <div class"aside">=). To use Simple.css's native styles for <aside> and <details>, you can either use raw HTML blocks, or add a small configuration to your Emacs init.el to output native tags:
(require 'ox-html)
(defun my-org-html-special-block-advice (orig-fn special-block contents info)
"Convert #+begin_aside, #+begin_details, #+begin_article, and #+begin_section into native HTML5 tags."
(let* ((block-type (org-element-property :type special-block))
(type (downcase block-type)))
(if (member type '("aside" "details" "article" "section"))
(format "<%s>\n%s\n</%s>\n" type (or contents "") type)
(funcall orig-fn special-block contents info))))
(advice-add 'org-html-special-block :around #'my-org-html-special-block-advice)
Details and Accordions
With the above configuration, you can use native org blocks for interactive details. You can provide the <summary> element using a small inline HTML snippet:
Click to expand: What is Simple.css?
Simple.css is a classless CSS framework that makes semantic HTML look good without adding any classes. Just write proper HTML and it handles the styling.
Click to expand: Why use classless CSS?
Classless CSS frameworks let you focus on content and semantics rather than worrying about styling classes. They're perfect for blogs, documentation, and personal sites.
If you prefer, you can still use raw HTML for accordion groups (where only one opens at a time) to access the name attribute:
FAQ 1: Is Simple.css responsive?
Yes! Simple.css is fully responsive and works great on mobile devices, tablets, and desktops.
FAQ 2: Does it support dark mode?
Absolutely. Simple.css automatically adapts to the user's OS-level dark mode preference using prefers-color-scheme.
FAQ 3: Can I customize it?
Yes, Simple.css uses CSS custom properties (variables) that you can override to change colors, fonts, and spacing.
Notice Boxes
You can use the native #+begin_notice block to create Simple.css notice boxes:
This is a notice box written with a native org special block. It's useful for calling out important snippets of information to your readers.
Aside
With the Emacs Lisp advice above, you can write native #+begin_aside blocks:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Horizontal Rules
You can separate sections with a horizontal rule:
Content continues after the rule.
Layout Containers
With the Emacs Lisp hook included above, you can also inject native <article> and <section> tags directly into your post!
Articles (Cards)
Simple.css styles the <article> element like a distinct "Card". It provides special typography for the first heading inside it (margin-top: 1rem).
Because standard Org structural headings (**) will break out of a special block, you must inject the heading manually using raw HTML if you want that specific typography!
Featured Insight
This entire block of text is enclosed in a native org special block called #+begin_article.
Notice how the heading now perfectly matches the Simple.css demo page!
Sections
Similarly, Simple.css styles the <section> element with thick top and bottom dividers and specifically tightened typography for the leading header.
A Major Divider
This text is wrapped inside a #+begin_section block.
You can use these to break very long tutorials into distinctly separated visual pieces, retaining perfect typography.