<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tosiiko</title>
    <description>The latest articles on DEV Community by Tosiiko (@tosiiko).</description>
    <link>https://dev.to/tosiiko</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3959814%2Fa5789435-8504-4051-b206-0620d67a1c58.png</url>
      <title>DEV Community: Tosiiko</title>
      <link>https://dev.to/tosiiko</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tosiiko"/>
    <language>en</language>
    <item>
      <title>npm i @tosiiko/mdl</title>
      <dc:creator>Tosiiko</dc:creator>
      <pubDate>Sat, 30 May 2026 10:44:07 +0000</pubDate>
      <link>https://dev.to/tosiiko/npm-i-tosiikomdl-280n</link>
      <guid>https://dev.to/tosiiko/npm-i-tosiikomdl-280n</guid>
      <description>&lt;p&gt;The parser is written in Rust using pulldown-cmark for Markdown. It ships as a prebuilt binary via npm so no Rust toolchain is needed.&lt;/p&gt;

&lt;p&gt;npm: &lt;a href="https://www.npmjs.com/package/@tosiiko/mdl/v/0.1.2" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@tosiiko/mdl/v/0.1.2&lt;/a&gt;&lt;br&gt;
VS Code: &lt;a href="https://marketplace.visualstudio.com/items?itemName=MDLLanguageSupport.mdl-language" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=MDLLanguageSupport.mdl-language&lt;/a&gt;&lt;br&gt;
GitHub: &lt;a href="https://github.com/tosiiko/mdl-code" rel="noopener noreferrer"&gt;https://github.com/tosiiko/mdl-code&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>rust</category>
      <category>showdev</category>
      <category>frontend</category>
    </item>
    <item>
      <title>I built MDL — a tiny authoring language so you never write raw HTML again</title>
      <dc:creator>Tosiiko</dc:creator>
      <pubDate>Sat, 30 May 2026 10:35:39 +0000</pubDate>
      <link>https://dev.to/tosiiko/i-built-mdl-a-tiny-authoring-language-so-you-never-write-raw-html-again-1mkf</link>
      <guid>https://dev.to/tosiiko/i-built-mdl-a-tiny-authoring-language-so-you-never-write-raw-html-again-1mkf</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Every web project starts the same way. You open a blank file and start typing angle brackets.&lt;/p&gt;

&lt;p&gt;HTML is fine. But writing it by hand is noisy, repetitive, and forces you to think about tags instead of content.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;MDL (Markdown Language) is a tiny authoring language that compiles to clean, semantic HTML.&lt;/p&gt;

&lt;p&gt;The idea is three rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.mdl&lt;/code&gt; files handle structure and content&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.css&lt;/code&gt; files handle layout and design&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.js&lt;/code&gt; files handle logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You never write a single HTML tag.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it looks like
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;page:
  hero:
    ## Sign in
    Welcome back.

  form@id(loginForm)@submit(handleLogin):
    field:
      label:
        Email
      .input@type(email)@id(email)@required

    actions:
      .btn-primary@id(loginBtn)(Sign in)
      .btn-ghost@click(handleForgot)(Forgot password?)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That compiles to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;main&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mdl-page"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mdl-hero"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Sign in&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Welcome back.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mdl-form"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"loginForm"&lt;/span&gt; &lt;span class="na"&gt;data-mdl-on-submit=&lt;/span&gt;&lt;span class="s"&gt;"handleLogin"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mdl-field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mdl-label"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Email&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mdl-input"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mdl-actions"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mdl-btn-primary"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"loginBtn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Sign in&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mdl-btn-ghost"&lt;/span&gt; &lt;span class="na"&gt;data-mdl-on-click=&lt;/span&gt;&lt;span class="s"&gt;"handleForgot"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Forgot password?&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clean, semantic HTML. No divs you didn't ask for. No inline styles. Every element has a predictable &lt;code&gt;.mdl-*&lt;/code&gt; class that CSS can target.&lt;/p&gt;

&lt;h2&gt;
  
  
  How CSS and JS talk to it
&lt;/h2&gt;

&lt;p&gt;CSS targets &lt;code&gt;.mdl-*&lt;/code&gt; classes directly. No configuration needed.&lt;/p&gt;

&lt;p&gt;JS uses standard DOM APIs. The &lt;code&gt;@id()&lt;/code&gt; attribute compiles to a real HTML &lt;code&gt;id&lt;/code&gt;. The &lt;code&gt;@submit()&lt;/code&gt; and &lt;code&gt;@click()&lt;/code&gt; attributes wire events to functions in your external JS file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// scripts/auth.js&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleLogin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;
  &lt;span class="c1"&gt;// your logic here&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No framework. No runtime. No magic. Just the platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @tosiiko/mdl
mdl &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI is a prebuilt Rust binary. Fast, no dependencies, works on Mac, Linux, and Windows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;npm — &lt;a href="https://www.npmjs.com/package/@tosiiko/mdl/v/0.1.2" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@tosiiko/mdl/v/0.1.2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;VS Code extension — &lt;a href="https://marketplace.visualstudio.com/items?itemName=MDLLanguageSupport.mdl-language" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=MDLLanguageSupport.mdl-language&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub — &lt;a href="https://github.com/tosiiko/mdl-code" rel="noopener noreferrer"&gt;https://github.com/tosiiko/mdl-code&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Would love to hear what you think.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>rust</category>
      <category>css</category>
    </item>
  </channel>
</rss>
