ASTA is a monospace UI framework where every element aligns to a character grid to create interfaces that are rhythmic, intentional, and beautifully precise.
Lightweight. Performant. Unapologetically minimal. ASTA shines through simplicity.
ASTA means love, bright star, and sometimes beautiful goddess, a name that embodies the elegance, clarity, and quiet strength at the heart of this system.
Getting started with ASTA is simple. Include the CSS, JavaScript, and fonts in your project. Download or clone the repository from GitHub, or grab the core files you need directly from here.
Add these lines to your HTML <head> section:
<!-- Include ASTA CSS (includes font declarations) -->
<link rel="stylesheet" href="css/asta.min.css">
<!-- Include ASTA JS for interactive components -->
<script src="js/asta.min.js"></script>
Make sure you have the following directory structure:
your-project/
├── css/
│ └── asta.min.css
├── js/
│ └── asta.min.js
└── fonts/
├── JetBrainsMono-Regular.woff2
├── JetBrainsMono-Medium.woff2
├── JetBrainsMono-SemiBold.woff2
└── JetBrainsMono-ExtraBold.woff2
All components work with semantic HTML. No utility classes needed:
<!-- Form inputs work out of the box -->
<input type="text" id="demo-input" placeholder="Type something...">
<button id="demo-button" style="margin-top: 5px">Show in Modal</button>
<!-- Modal component -->
<div id="demo-modal" class="modal">
<div class="modal-backdrop" onclick="closeModal('demo-modal')"></div>
<div class="modal-content modal-info">
<div class="modal-header">
<h4>Your Message</h4>
<button class="modal-close" onclick="closeModal('demo-modal')">×</button>
</div>
<div class="modal-body">
<p id="demo-modal-text"></p>
</div>
<div class="modal-footer">
<button onclick="closeModal('demo-modal')">OK</button>
</div>
</div>
</div>
Customize ASTA using CSS custom properties:
:root {
--font-family: 'JetBrains Mono', monospace;
--font-size: 16px;
--line-height: 1.5rem;
--char-width: 1ch;
--border-thickness: 2px;
/* Light theme (default) */
--background-color: #ffffff;
--text-color: #000000;
}
That's it! All HTML elements are styled automatically. Explore the examples below to see what's available.
<h1>Heading 1</h1>
<h2>Heading 2</h2>
<h3>Heading 3</h3>
<h4>Heading 4</h4>
<h5>Heading 5</h5>
This is a regular paragraph with bold text and italic text. You can also use inline
code within paragraphs.
<p>This is a regular paragraph with <strong>bold text</strong> and <em>italic text</em>.
You can also use <code>inline code</code> within paragraphs.</p>
// Code block example
function hello() {
console.log("Hello, World!");
}
<pre>// Code block example
function hello() {
console.log("Hello, World!");
}</pre>
<hr>
<ul>
<li>First item</li>
<li>Second item</li>
<li>Third item</li>
</ul>
<ol>
<li>First step</li>
<li>Second step
<ol>
<li>Nested item</li>
<li>Another nested item</li>
</ol>
</li>
<li>Third step</li>
</ol>
<ul class="tree">
<li>Root
<ul>
<li>Branch A
<ul>
<li>Leaf 1</li>
<li>Leaf 2</li>
</ul>
</li>
<li>Branch B</li>
</ul>
</li>
</ul>
| ID | Name | Status |
|---|---|---|
| 001 | Project Alpha | Active |
| 002 | Project Beta | Pending |
<table>
<thead>
<tr>
<th class="width-min">ID</th>
<th class="width-auto">Name</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td>001</td>
<td>Project Alpha</td>
<td>Active</td>
</tr>
<tr>
<td>002</td>
<td>Project Beta</td>
<td>Pending</td>
</tr>
</tbody>
</table>
<form>
<label>
Text Input:
<input type="text" placeholder="Enter text...">
</label>
<label>
<input type="checkbox"> Checkbox option
</label>
<div class="radio-group">
<label>
<input type="radio" name="radio"> Radio option 1
</label>
<label>
<input type="radio" name="radio"> Radio option 2
</label>
</div>
<button type="submit">Submit</button>
<button type="reset">Reset</button>
</form>
A 12-column grid system using flexbox. Use .grid as the container and column classes
like .six.columns, .four.columns, etc. to control width.
<div class="grid">
<div class="six columns"><input type="text" placeholder="First Name"></div>
<div class="six columns"><input type="text" placeholder="Last Name"></div>
</div>
<div class="grid">
<div class="four columns"><button>Quarter 1</button></div>
<div class="four columns"><button>Quarter 2</button></div>
<div class="four columns"><button>Quarter 3</button></div>
</div>
<div class="grid">
<div class="six columns"><input type="text" placeholder="Main content"></div>
<div class="three columns"><button>Sidebar</button></div>
<div class="three columns"><button>Aside</button></div>
</div>
<!-- Using fractions -->
<div class="grid">
<div class="one-third column"><button>One-third</button></div>
<div class="two-thirds column"><button>Two-thirds</button></div>
</div>
<!-- Using offset -->
<div class="grid">
<div class="three columns"><button>Three</button></div>
<div class="three columns offset-by-six"><button>Three (offset by 6)</button></div>
</div>
Hidden content that appears when you click the summary.
<details>
<summary> Click to expand</summary>
<p>Hidden content that appears when you click the summary.</p>
</details>
<figure>
<img src="image.jpg" alt="Description">
<figcaption>Images automatically adjust padding to maintain grid alignment</figcaption>
</figure>
<figure>
<video poster="thumbnail.jpg" controls>
<source src="video.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>
<figcaption>Videos also maintain grid alignment with automatic padding adjustment</figcaption>
</figure>
╔═══════════════════════════════════════╗
║ ║
║ ░▒▓█ A S T A █▓▒░ ║
║ ║
║ ┌─────────────────────────────────┐ ║
║ │ ▓▓▓▒▒░░ DESIGN SYSTEM ░░▒▒▓▓▓ │ ║
║ │ ░░ Monospace Grid Magic ░░ │ ║
║ └─────────────────────────────────┘ ║
║ ║
║ █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ ║
║ █ ☇ Fast ☼ Clean ✦ Pure █ ║
║ █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█ ║
║ ║
╚═══════════════════════════════════════╝
<pre>
╔═══════════════════════════════════════╗
║ ║
║ ░▒▓█ A S T A █▓▒░ ║
║ ║
║ ┌─────────────────────────────────┐ ║
║ │ ▓▓▓▒▒░░ DESIGN SYSTEM ░░▒▒▓▓▓ │ ║
║ │ ░░ Monospace Grid Magic ░░ │ ║
║ └─────────────────────────────────┘ ║
║ ║
║ █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ ║
║ █ ☇ Fast ☼ Clean ✦ Pure █ ║
║ █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█ ║
║ ║
╚═══════════════════════════════════════╝
</pre>
<button onclick="openModal('info-modal')">Show Info Modal</button>
<div id="info-modal" class="modal">
<div class="modal-backdrop" onclick="closeModal('info-modal')"></div>
<div class="modal-content modal-info">
<div class="modal-header">
<h4>Information</h4>
<button class="modal-close" onclick="closeModal('info-modal')">×</button>
</div>
<div class="modal-body">
<p>This is an informational message.</p>
</div>
<div class="modal-footer">
<button onclick="closeModal('info-modal')">OK</button>
</div>
</div>
</div>
<button onclick="openModal('confirm-modal')">Show Confirmation Modal</button>
<div id="confirm-modal" class="modal">
<div class="modal-backdrop" onclick="closeModal('confirm-modal')"></div>
<div class="modal-content modal-confirm">
<div class="modal-header">
<h4>Confirm Action</h4>
<button class="modal-close" onclick="closeModal('confirm-modal')">×</button>
</div>
<div class="modal-body">
<p>Are you sure you want to proceed?</p>
</div>
<div class="modal-footer">
<button onclick="closeModal('confirm-modal')">Cancel</button>
<button onclick="closeModal('confirm-modal')">Confirm</button>
</div>
</div>
</div>
<button onclick="openModal('error-modal')">Show Error Modal</button>
<div id="error-modal" class="modal">
<div class="modal-backdrop" onclick="closeModal('error-modal')"></div>
<div class="modal-content modal-error">
<div class="modal-header">
<h4>Error</h4>
<button class="modal-close" onclick="closeModal('error-modal')">×</button>
</div>
<div class="modal-body">
<p>An error has occurred.</p>
</div>
<div class="modal-footer">
<button onclick="closeModal('error-modal')">Close</button>
</div>
</div>
</div>
<footer>
<p>© 2025 All rights reserved</p>
<p>
<a href="#about">About</a> |
<a href="https://github.com/anton-io/asta">GitHub</a> |
<a href="https://anton.io">Anton.io</a>
<a href="https://x.com/roldao">@Roldao</a>
</p>
</footer>