Overview
v0.1.1

Tsunami 津波

A quiet UI framework for back-office apps. Semantic HTML, data-* attributes and a little vanilla JS, with 53 components, Lucide icons and country flags, and no runtime dependencies.

Principles

Native first

Reach for dialog, popover, details and button first. A small vanilla script adds only what HTML cannot: theme, tabs, select, tree, table, journey and a few more.

Zero specificity

Every selector sits in @layer components and :where(), so your CSS overrides it right away.

Light / Dark

Themes switch through CSS custom properties, following the system or the user's choice, with no flash on load.

Thai + Latin

One self-hosted woff2 Google Sans for both Thai and Latin. Table numbers use tabular-nums.

ภาษาไทยกับ Latin ในบรรทัดเดียวกัน 1,234.50

Install

Load the files from jsDelivr, which serves each release tag of the GitHub repository. Load the script in <head> as a plain script, not type="module": it then applies the saved theme before the first paint, so there is no flash and no inline script to add.

<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Djirasak/tsunami-framework@v0.1.1/dist/tsunami.min.css">
<script src="https://cdn.jsdelivr.net/gh/Djirasak/tsunami-framework@v0.1.1/dist/tsunami.min.js"></script>

The fonts and flags load from the same tag, next to dist/. The libraries some components need come from the same place, for example @v0.1.1/dist/chart.min.js, loaded before the Tsunami script. The code editor is the exception: Monaco starts web workers, which a browser only runs from the page's own origin, so host dist/monaco/ yourself.

To host the files yourself, copy dist/, fonts/ and flags/ side by side and link dist/tsunami.min.css and dist/tsunami.min.js.

Example

Revenue
$12,840
+12.4% from last month
Orders
1,284
+3.1%
Refunds
18
+2 orders
New customers
342
Flat
Order Customer Status Total
#1042 Emma Wilson Paid $129.00
#1041 James Carter Pending $84.50
#1040 Olivia Brown Cancelled $246.00