Theme controller
Switch noodle and light/dark mode for a page, or scope a noodle to any element.
Scoped controls
data-mn-target points the controls at one element, so only it changes. Leave data-mn-target out to switch the whole page (and remember the choice).
New
<div class="mn-row">
<select class="mn-select mn-input-sm" data-mn-noodle-select data-mn-target="#demo-area" aria-label="Noodle for the demo area" style="width:auto">
<option value="mian">Mian</option>
<option value="yangchun">Yangchun</option>
<option value="linguine">Linguine</option>
<option value="penne">Penne</option>
<option value="chitarra">Chitarra</option>
<option value="shio">Shio</option>
<option value="spaghetti">Spaghetti</option>
<option value="bucatini">Bucatini</option>
<option value="hofun">Hofun</option>
<option value="hiyamugi">Hiyamugi</option>
<option value="ramyeon">Ramyeon</option>
<option value="fettuccine">Fettuccine</option>
<option value="lasagne">Lasagne</option>
<option value="pappardelle">Pappardelle</option>
<option value="paccheri">Paccheri</option>
<option value="farfalle">Farfalle</option>
<option value="yinzhen">Yinzhen</option>
<option value="quadretti">Quadretti</option>
<option value="acini">Acini di pepe</option>
<option value="kalguksu">Kalguksu</option>
<option value="sanuki">Sanuki</option>
<option value="hakata">Hakata</option>
<option value="ditalini">Ditalini</option>
<option value="juksing">Juksing</option>
<option value="kishimen">Kishimen</option>
<option value="lamian">LaMian</option>
<option value="somen">Somen</option>
<option value="capellini">Capellini</option>
<option value="longxu">Longxu</option>
<option value="misua">Misua</option>
<option value="bun">Bún</option>
<option value="kuzukiri">Kuzukiri</option>
<option value="sotanghon">Sotanghon</option>
<option value="harusame">Harusame</option>
<option value="fensi">Fensi</option>
<option value="tokoroten">Tokoroten</option>
<option value="nagashi">Nagashi</option>
<option value="liangfen">Liangfen</option>
<option value="dangmyeon">Dangmyeon</option>
<option value="woonsen">Woonsen</option>
<option value="shirataki">Shirataki</option>
<option value="chasoba">Cha Soba</option>
<option value="daoxiao">Daoxiao</option>
<option value="pici">Pici</option>
<option value="naengmyeon">Naengmyeon</option>
<option value="hoto">Hōtō</option>
<option value="ramen">Ramen</option>
<option value="biangbiang">Biangbiang</option>
<option value="maccheroni">Maccheroni</option>
<option value="rigatoni">Rigatoni</option>
<option value="fusilli">Fusilli</option>
<option value="jjajang">Jjajang</option>
<option value="laksa">Laksa</option>
<option value="soba">Soba</option>
<option value="tagliatelle">Tagliatelle</option>
<option value="tajarin">Tajarin</option>
<option value="mafaldine">Mafaldine</option>
<option value="corzetti">Corzetti</option>
<option value="inaniwa">Inaniwa</option>
<option value="yifu">Yifu</option>
<option value="udon">Udon</option>
<option value="gnocchi">Gnocchi</option>
<option value="cavatelli">Cavatelli</option>
<option value="orecchiette">Orecchiette</option>
<option value="mee">Mee</option>
<option value="mixian">Mixian</option>
<option value="pho">Pho</option>
</select>
<div class="mn-toggle-group" aria-label="Mode for the demo area">
<button data-mn-set-mode="light" data-mn-target="#demo-area"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"/></svg> Light</button>
<button data-mn-set-mode="dark" data-mn-target="#demo-area"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 14.5A8 8 0 0 1 9.5 4a8 8 0 1 0 10.5 10.5Z"/></svg> Dark</button>
<button data-mn-set-mode="auto" data-mn-target="#demo-area">Auto</button>
</div>
</div>
<div id="demo-area" data-noodle="mian" class="mn-card" style="margin-top:1rem;padding:1.25rem;background:var(--mn-bg)">
<div class="mn-row"><button class="mn-btn">Primary</button><button class="mn-btn mn-btn-outline">Outline</button><input class="mn-switch" type="checkbox" role="switch" checked aria-label="Example switch"><span class="mn-badge mn-badge-soft">New</span></div>
</div>Scoped noodles
Any element can carry its own noodle and mode.
udon
fensi
yinzhen
mee
<div class="mn-row" style="align-items:stretch">
<div data-noodle="udon" class="mn-card" style="padding:1rem;gap:.75rem;min-width:9rem;background:var(--mn-bg)">
<span class="mn-swatch"><i></i><i></i><i></i><i></i></span><strong style="text-transform:capitalize">udon</strong><button class="mn-btn mn-btn-sm">Button</button>
</div>
<div data-noodle="fensi" data-mode="dark" class="mn-card" style="padding:1rem;gap:.75rem;min-width:9rem;background:var(--mn-bg)">
<span class="mn-swatch"><i></i><i></i><i></i><i></i></span><strong style="text-transform:capitalize">fensi</strong><button class="mn-btn mn-btn-sm">Button</button>
</div>
<div data-noodle="yinzhen" class="mn-card" style="padding:1rem;gap:.75rem;min-width:9rem;background:var(--mn-bg)">
<span class="mn-swatch"><i></i><i></i><i></i><i></i></span><strong style="text-transform:capitalize">yinzhen</strong><button class="mn-btn mn-btn-sm">Button</button>
</div>
<div data-noodle="mee" data-mode="dark" class="mn-card" style="padding:1rem;gap:.75rem;min-width:9rem;background:var(--mn-bg)">
<span class="mn-swatch"><i></i><i></i><i></i><i></i></span><strong style="text-transform:capitalize">mee</strong><button class="mn-btn mn-btn-sm">Button</button>
</div>
</div>Installation
Everything ships in one stylesheet and one small script. There is nothing to import per component.
<link rel="stylesheet" href="https://mian.ro/dist/mian.css">
<script src="https://mian.ro/dist/mian.js" defer></script>Prefer to own the files? /r/theme-controller.json is a registry item with this component's CSS and example markup, ready to copy into your project with any tool that reads the open registry-item format.
Class reference
| Class / attribute | Description |
|---|---|
| data-noodle="…" · data-mode="light | dark" | On <html> for the page, or on any element to scope it. |
| select[data-mn-noodle-select] | A select that switches the page noodle. |
| data-mn-target="#id" | On any control: act on that element only, without persisting. |
| [data-mn-set-noodle] · [data-mn-set-mode] · [data-mn-toggle-mode] | Buttons. |
| Mian.setNoodle(id) · Mian.setMode(mode) | Script API; persisted in localStorage. |
| mn-swatch | A 4-colour preview of the current noodle. |
Accessibility
- Buttons report aria-pressed. Without data-mode the page follows the operating system.