| Server | Status | Uptime |
|---|---|---|
| web-01 | OK | 99.9% |
| web-02 | OK | 99.7% |
| db-01 | Down | 95.2% |
Philosophy
An ashlar library.
An ashlar is a finely cut block of stone — small, regular, ready to assemble. Cathedrals are built from ashlars. So are walls.
ln-ashlar gives you the blocks. Tokens, mixins, components — small primitives, well-formed, predictable. You stack them into the building you actually need.
How
Token-driven. Spacing, color, radius, shadow — every value lives in --size-*, --color-*, --radius-*. Change one token, every consumer reacts. No hardcoded literals in components.
Recipe + application. Each pattern has two layers: a @mixin (the recipe) and a default selector (the application). Use the default, apply the recipe to your own semantic selector, or rebind the surface tokens. Three first-class paths.
Zero dependencies. Vanilla JS IIFE components, CustomEvent communication, MutationObserver auto-init. No framework, no runtime — drop the SCSS and JS into any project.
Themes are palette only. A theme rebinds vocabulary tokens at its own :root. It never restructures a component. Switching themes is a token swap, not a rewrite.
Why
A library should give you primitives and get out of the way. Most CSS frameworks give you a finished building — beautiful for one project, awkward for the next.
ln-ashlar gives you the stones. Stack them however your project needs. The stones are simple. The buildings can be as complicated as you want.
-
Components
18 -
JS Modules
10 -
SCSS Files
22 -
Demo Pages
14
Modal
Tabs
Content of the Overview tab. Tabs are synchronized with the URL hash.
Change the URL hash to #users to see.
Toggle — Collapsible
Progress
-
CPU — 72%
-
RAM — 45%
-
Disk — 89%
Toast Notifications
Upload
ln-ajax — AJAX Navigation
Component for AJAX navigation and form submission. Links and forms inside a data-ln-ajax container are automatically processed via fetch.
<div data-ln-ajax>
<a href="/users">Users</a>
<form method="POST" action="/users">...</form>
</div>
<!-- JSON response -->
{
"title": "Title",
"content": { "main": "<p>HTML</p>" },
"message": { "type": "success", "title": "OK", "body": "Saved!" }
}
| Attribute | Description |
|---|---|
data-ln-ajax | Container — all <a> and <form> inside are AJAX |
data-ln-ajax="false" | Exclude a specific element from AJAX processing |
CSRF token automatically from <meta name="csrf-token">. History pushState for links and GET forms.
Quick Integration
<link rel="stylesheet" href="dist/ln-ashlar.css">
<script src="dist/ln-ashlar.iife.js" defer></script>
<!-- Or as npm module -->
import 'ln-ashlar';
import 'ln-ashlar/dist/ln-ashlar.css';