<?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: silverbirder</title>
    <description>The latest articles on DEV Community by silverbirder (@silver_birder).</description>
    <link>https://dev.to/silver_birder</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%2F195028%2Fdca37df9-4bb7-40ed-863e-03ee23c42d5f.JPG</url>
      <title>DEV Community: silverbirder</title>
      <link>https://dev.to/silver_birder</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/silver_birder"/>
    <language>en</language>
    <item>
      <title>New Storybook Addon: Range Controls – stress-test your UI with sliders</title>
      <dc:creator>silverbirder</dc:creator>
      <pubDate>Sat, 16 Aug 2025 12:26:47 +0000</pubDate>
      <link>https://dev.to/silver_birder/new-storybook-addon-range-controls-stress-test-your-ui-with-sliders-54md</link>
      <guid>https://dev.to/silver_birder/new-storybook-addon-range-controls-stress-test-your-ui-with-sliders-54md</guid>
      <description>&lt;p&gt;Hi everyone 👋  &lt;/p&gt;

&lt;p&gt;I built a new addon for Storybook called &lt;strong&gt;Range Controls&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
It lets you adjust story args (strings, numbers, and arrays) with sliders — making it easier to stress-test layouts and catch edge cases.  &lt;/p&gt;
&lt;h2&gt;
  
  
  🚀 Motivation
&lt;/h2&gt;

&lt;p&gt;I often used Storybook’s built-in &lt;code&gt;argTypes&lt;/code&gt; with &lt;code&gt;type: "range"&lt;/code&gt; sliders to check design variations.&lt;br&gt;&lt;br&gt;
That works great for primitives (strings, numbers), but for more complex structures — like &lt;strong&gt;arrays of nested objects&lt;/strong&gt; (e.g. tags inside a card) — I found myself writing the same boilerplate code again and again.  &lt;/p&gt;

&lt;p&gt;This addon was created to reduce that overhead and make it simpler to configure sliders for &lt;strong&gt;strings, numbers, and arrays&lt;/strong&gt;.  &lt;/p&gt;
&lt;h2&gt;
  
  
  🎨 Demo
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Card List&lt;/th&gt;
&lt;th&gt;Range Controls Panel&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img alt="storybook-addon-range-control-card-list" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Ffdd75e0a-dbd3-44ea-9315-d9ca86aa3ab7" width="760" height="429"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img alt="storybook-addon-range-control-panel" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F25255efe-39c1-4861-841c-d7a0644d172f" width="2940" height="1663"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;👉 Live Demo: &lt;a href="https://develop--689dd119bb72c220c0ddb738.chromatic.com/" rel="noopener noreferrer"&gt;Chromatic preview&lt;/a&gt;  &lt;/p&gt;
&lt;h2&gt;
  
  
  📦 Installation
&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;--save-dev&lt;/span&gt; storybook-addon-range-controls
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;.storybook/main.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;addons&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@storybook/addon-docs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;storybook-addon-range-controls&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ⚡ Usage Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;range&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;min&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;step&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;likes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;min&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;999&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;array&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;min&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;defaultItem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`tag-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🙏 Feedback
&lt;/h2&gt;

&lt;p&gt;I’d love to hear your thoughts:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the API design clear enough?
&lt;/li&gt;
&lt;li&gt;Would this be useful in your Storybook workflow?
&lt;/li&gt;
&lt;li&gt;Any missing features you’d expect?
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Links:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.npmjs.com/package/storybook-addon-range-controls" rel="noopener noreferrer"&gt;npm&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/silverbirder/storybook-addon-range-controls" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for checking it out! 🚀  &lt;/p&gt;

</description>
      <category>storybook</category>
      <category>react</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Introduction to the Writing Efficiency Tool: AI Ghostwriter</title>
      <dc:creator>silverbirder</dc:creator>
      <pubDate>Sat, 15 Jul 2023 05:19:37 +0000</pubDate>
      <link>https://dev.to/silver_birder/introduction-to-the-writing-efficiency-tool-ai-ghostwriter-1m5e</link>
      <guid>https://dev.to/silver_birder/introduction-to-the-writing-efficiency-tool-ai-ghostwriter-1m5e</guid>
      <description>&lt;p&gt;Recently, I, silverbirder, have been hooked on Beard Papa's baked cheesecake puffs.&lt;br&gt;
As someone who struggles with writing, I developed a Chrome extension called "AI Ghostwriter" that allows AI to write text on my behalf.Today, I will introduce this handy tool. It is available on the Chrome Web Store. If you're interested, please download it from the link below! It's free! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://chrome.google.com/webstore/detail/ai-ghostwriter/hpcokeldeijnfmbbbjkedhnedjjbjmoa"&gt;https://chrome.google.com/webstore/detail/ai-ghostwriter/hpcokeldeijnfmbbbjkedhnedjjbjmoa&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges in Writing Articles
&lt;/h2&gt;

&lt;p&gt;When writing articles, I often struggle with the following issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Due to a lack of vocabulary, my writing tends to be monotonous.&lt;/li&gt;
&lt;li&gt;I'm not good at using punctuation, which makes my writing hard to read.&lt;/li&gt;
&lt;li&gt;I'm not good at coming up with titles (specifically for blogs).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Despite these challenges, I somehow managed to write articles.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Advent of ChatGPT
&lt;/h4&gt;

&lt;p&gt;Since the advent of ChatGPT, my article writing process has significantly changed. Specifically, I started passing my articles to ChatGPT for proofreading and for help with coming up with blog titles.&lt;br&gt;
However, I felt that &lt;strong&gt;constantly copying and pasting text into ChatGPT was time-consuming&lt;/strong&gt;, so I started looking for a more efficient method. As a result, I ended up developing AI Ghostwriter. This has further streamlined my article writing process.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is AI Ghostwriter?
&lt;/h2&gt;

&lt;p&gt;AI Ghostwriter is a Chrome extension that uses ChatGPT to assist writers in their writing tasks and improve their quality. It is a tool that can perform various actions on text selected in the browser, solving all problems in writing. The mechanism is very simple. It simply requests the selected text in the parameter-specified state of the &lt;a href="https://platform.openai.com/docs/api-reference/chat/create"&gt;OpenAI API&lt;/a&gt; and displays the response in the side panel. Seeing is believing, so let's introduce a demo video. Click on the image below to play the demo video. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/silverbirder/video/upload/c_scale,w_640/v1689335147/silver-birder.github.io/blog/ai_ghost_writer_demo.gif"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tQLY-PPm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/silverbirder/video/upload/c_scale%2Cw_640/v1689335147/silver-birder.github.io/blog/ai_ghost_writer_demo.gif" alt="AI Ghostwriter DEMO" width="640" height="389"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Below are the steps to operate AI Ghostwriter introduced in the demo video. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on AI Ghostwriter in the upper right corner to open the side panel &lt;/li&gt;
&lt;li&gt;Select text on the browser &lt;/li&gt;
&lt;li&gt;Right-click to open the contextmenu, and click on actions such as proofreading&lt;/li&gt;
&lt;li&gt;Comments from AI Ghostwriter will be displayed in the side panel&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The actions in the context menu can be customized freely. Originally, the actions in the context menu were fixed, but they were made customizable to increase flexibility. You can register the parameters to set for the OpenAI API for each action on the options page. It's as shown in the image below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F-o5eS-B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://storage.googleapis.com/zenn-user-upload/c5b3449bc608-20230715.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F-o5eS-B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://storage.googleapis.com/zenn-user-upload/c5b3449bc608-20230715.png" alt="Options Page" width="800" height="582"&gt;&lt;/a&gt; &lt;em&gt;Chrome Extension Options Page&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This allows you to assist your writing according to your own preferences. In other words, &lt;strong&gt;you can create your own actions and achieve more efficient writing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I have prepared the following three actions by default:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Proofreading&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generate title&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generate following text&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the comments from the AI are not quite right, you might want to tweak the text of the content parameters a bit. Also, actions like translation and summarization might be useful. Please take advantage of these features and experience a more efficient writing experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other Features
&lt;/h2&gt;

&lt;p&gt;In addition to the above, we also provide the following features for user convenience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multilingual Support&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;We support both English and Japanese.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feedback Link&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;We have set up a link to receive feedback from users.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prevention of Misoperation&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;We prevent misoperation through Chrome notifications in cases where the API token is undefined or the side panel is not open.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stop Generation&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;We have prepared a button to stop actions in order to stop unnecessary generation processes.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shortcut Key Setup&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;We have set it up so that the side panel can be opened with a shortcut key.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>chatgpt</category>
      <category>chrome</category>
      <category>extensions</category>
      <category>writing</category>
    </item>
    <item>
      <title>If you're writing in Markdown, I recommend Rocket, an SSG that uses WebComponents!</title>
      <dc:creator>silverbirder</dc:creator>
      <pubDate>Fri, 24 Dec 2021 14:49:07 +0000</pubDate>
      <link>https://dev.to/silver_birder/if-youre-writing-in-markdown-i-recommend-rocket-an-ssg-that-uses-webcomponents-6ca</link>
      <guid>https://dev.to/silver_birder/if-youre-writing-in-markdown-i-recommend-rocket-an-ssg-that-uses-webcomponents-6ca</guid>
      <description>&lt;p&gt;※ This article is an English translation by Deepl of a Japanese article at &lt;a href="https://silver-birder.github.io/blog/contents/intro_rocket/"&gt;https://silver-birder.github.io/blog/contents/intro_rocket/&lt;/a&gt; .&lt;/p&gt;

&lt;p&gt;Do you write your blogs and documents in Markdown?&lt;br&gt;
Have you ever felt the frustration of wanting to focus on writing but not being able to get the itch to do so with just Markdown?&lt;/p&gt;

&lt;p&gt;If so, I recommend Rocket, a static site generator (henceforth called SSG) that seamlessly integrates Markdown and WebComponents.&lt;/p&gt;
&lt;h2&gt;
  
  
  target audience
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;People who want to focus on writing (e.g. blogging).

&lt;ul&gt;
&lt;li&gt;People who use Markdown for writing&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;People who publish their written content in SSG&lt;/li&gt;
&lt;li&gt;People who want to reduce the cost of SSG migration as much as possible&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  What is Markdown, anyway?
&lt;/h2&gt;

&lt;p&gt;Markdown is used in many services such as Qiita, Zenn, Hatena blog, and so on (called "writing services"), and also in README.md for Git repository.&lt;/p&gt;

&lt;p&gt;What is the purpose of Markdown?&lt;/p&gt;

&lt;p&gt;The following is a quote from &lt;a href="https://daringfireball.net/projects/markdown/"&gt;Daring Fireball: Markdown&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Markdown is a text-to-HTML conversion tool for web writers. Markdown allows you to write using an easy-to-read, easy-to-write plain text format, then convert it to structurally valid XHTML (or HTML).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Markdown is a PlainText to HTML conversion tool developed for &lt;strong&gt;Web writers&lt;/strong&gt;.&lt;br&gt;
It is also important for Markdown to be &lt;strong&gt;easy to write and read&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A web writer is someone who writes content for the web, such as blog posts or online advertising text.&lt;br&gt;
Markdown is a tool for writing.&lt;/p&gt;

&lt;p&gt;Markdown is a tool for writing, so using it for blog posts and Git repository documentation is a good fit.&lt;br&gt;
On the other hand, using Markdown as a kind of data file for its structural features, or using Markdown for applications such as shopping or games, defeats the purpose.&lt;/p&gt;
&lt;h2&gt;
  
  
  Markdown and HTML
&lt;/h2&gt;

&lt;p&gt;Markdown has a notation (syntax) for headings, bullets, tables, and so on.&lt;br&gt;
You can use these notations to write articles in a structured way.&lt;/p&gt;

&lt;p&gt;What if you don't find the notation you want in your writing?&lt;/p&gt;

&lt;p&gt;This is from &lt;a href="https://daringfireball.net/projects/markdown/syntax"&gt;Daring Fireball: Markdown Syntax Documentation&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For any markup that is not covered by Markdown's syntax, you simply use HTML itself. there's no need to preface it or delimit it For any markup that is not covered by Markdown's syntax, you simply use HTML itself.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can use HTML in Markdown. If you try to write HTML in Markdown, a writing service, you will probably be able to use it.&lt;/p&gt;

&lt;p&gt;Given that the purpose of Markdown is to convert to HTML, I think it makes sense that HTML can be used.&lt;br&gt;
However, &lt;strong&gt;use of HTML makes reading and writing a bit worse, so heavy use of it should be avoided&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  HTML is not enough.
&lt;/h2&gt;

&lt;p&gt;As you will see when you use the writing service, it provides roughly the following features&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Embedded content.

&lt;ul&gt;
&lt;li&gt;When you write a URL, it will display the description, title, and images.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Table of Contents (TOC) generation

&lt;ul&gt;
&lt;li&gt;Generates a table of contents by collecting the headings of the text.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These features make the content you write easier to read and improve the efficiency of your writing.&lt;br&gt;
As a matter of course, such features do not exist in Markdown.&lt;br&gt;
Markdown only defines a notation, so we don't want to extend Markdown's functionality.&lt;/p&gt;

&lt;p&gt;However, as you write, you will &lt;strong&gt;inevitably&lt;/strong&gt; want those features.&lt;br&gt;
Even without those features, I can use Markdown notation to display embedded content, and I can generate a table of contents manually.&lt;br&gt;
However, it's inefficient to manually update the table of contents every time there are more headings, when you should be concentrating on writing.&lt;/p&gt;

&lt;p&gt;What should we do about this inefficiency?&lt;/p&gt;
&lt;h3&gt;
  
  
  Extend the functionality of the Markdown to HTML conversion process.
&lt;/h3&gt;

&lt;p&gt;In the Markdown to HTML conversion process, we can extend features such as embedded content and table of contents generation.&lt;br&gt;
I'll use the table of contents generation as an example, because I think it's easier to understand if we talk about it in concrete terms.&lt;/p&gt;

&lt;p&gt;For the sake of clarity, I'll write the conversion process myself, but originally, I'm assuming Hugo, GatsbyJS, MDX, etc.&lt;/p&gt;

&lt;p&gt;I'll refer to &lt;a href="https://jsprimer.net/use-case/nodecli/md-to-html/"&gt;Markdown to HTML - JavaScript Primer #jsprimer&lt;/a&gt; as it was just easy to understand.&lt;/p&gt;

&lt;p&gt;Let's assume that Markdown and the transform.js for the conversion process are as follows&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt; &lt;span class="na"&gt;--&lt;/span&gt; &lt;span class="na"&gt;README.md&lt;/span&gt; &lt;span class="na"&gt;--&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="gh"&gt;# Header1&lt;/span&gt;
Hello, World
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// transform.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;marked&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;marked&lt;/span&gt;&lt;span class="dl"&gt;'&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;markdown&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;README.md&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;encoding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf-8&lt;/span&gt;&lt;span class="dl"&gt;'&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;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;marked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;transform.js is very simple: it just converts README.md to html and outputs it to the standard output.&lt;br&gt;
Let's run it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;node transform.js
&amp;lt;h1 &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"header1"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;Header1&amp;lt;/h1
&amp;lt;p&amp;gt;Hello, World&amp;lt;/p&amp;gt;.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As expected, HTML has been output. The next step is to generate a table of contents.&lt;br&gt;
In Hatena Blog, if you write the marker &lt;code&gt;[:contents]&lt;/code&gt;, the table of contents will be generated there.&lt;br&gt;
As a digression, there is a tool called &lt;a href="https://github.com/remarkjs/remark"&gt;remark&lt;/a&gt; that will convert the contents to Markdown.&lt;/p&gt;

&lt;p&gt;Here is a sample code to generate a table of contents.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt; &lt;span class="na"&gt;--&lt;/span&gt; &lt;span class="na"&gt;README.md&lt;/span&gt; &lt;span class="na"&gt;--&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
[:contents]

&lt;span class="gh"&gt;# Header1&lt;/span&gt;
Hello, World
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// transform.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;marked&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;marked&lt;/span&gt;&lt;span class="dl"&gt;'&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;markdown&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;README.md&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;encoding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf-8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;reMarkdown&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;markdown&lt;/span&gt;
             &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\[&lt;/span&gt;&lt;span class="sr"&gt;:contents&lt;/span&gt;&lt;span class="se"&gt;\]&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;div id="toc"&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Header1&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&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;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;marked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reMarkdown&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I think it's very silly code, but it does what I want it to say, so it's fine.&lt;br&gt;
Let's run it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;node transform.js
&amp;lt;div &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"toc"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Header1&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;h1 &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"header1"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;Header1&amp;lt;/h1&amp;gt;
&amp;lt;p&amp;gt;Hello, World&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As expected, a Markdown table of contents has been generated.&lt;br&gt;
This is a simple example, but as we extend the functionality, more processing will be done in transform.js, and more markers will be written in README.md.&lt;/p&gt;

&lt;p&gt;Extending functionality to the transformation process like this has the advantage of letting the transformation process take care of the functionality.&lt;br&gt;
However, it also means that Markdown is dependent on the conversion process.&lt;br&gt;
This incurs a &lt;strong&gt;migration cost&lt;/strong&gt; when migrating to a different conversion process.&lt;/p&gt;

&lt;p&gt;Also, it's a bit uncomfortable to bury markers in Markdown itself that are not in &lt;strong&gt;Markdown notation or HTML&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Suggestion 2: Use WebComponents to extend the functionality.
&lt;/h3&gt;

&lt;p&gt;WebComponents is a web standard technology that allows you to customize HTML elements (Custom Elements).&lt;br&gt;
For example, let's say you have developed an HTML element, &lt;code&gt;&amp;lt;generate-toc&amp;gt;&lt;/code&gt;, for generating a table of contents using WebComponents.&lt;br&gt;
Let's say this HTML element is just WebComponents that collects all the heading text and displays it as bullets.&lt;/p&gt;

&lt;p&gt;The Markdown image would look something like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt; &lt;span class="na"&gt;--&lt;/span&gt; &lt;span class="na"&gt;README.md&lt;/span&gt; &lt;span class="na"&gt;--&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;generate-toc&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="gh"&gt;# Header1&lt;/span&gt;
Hello, World
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you convert this Markdown into any HTML (even with transform.js), you will get the following result&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;generate-toc&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"header1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Header1&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Hello, World&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since Markdown allows HTML, &lt;code&gt;&amp;lt;generate-toc /&amp;gt;&lt;/code&gt; will be output as HTML as is.&lt;br&gt;
If this is not the case, browsers will not be able to identify &lt;code&gt;generate-toc&lt;/code&gt;. Therefore, you need to load the code that defines &lt;code&gt;generate-toc&lt;/code&gt;, i.e. WebComponents.&lt;br&gt;
For example, you can load the following code&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;script&amp;gt;&lt;/span&gt;
  &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;GenerateToc&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;HTMLElement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;super&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;shadow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;attachShadow&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;open&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="nx"&gt;shadow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;div id="toc"&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Header1&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;customElements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;generate-toc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;GenerateToc&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that the browser can identify &lt;code&gt;generate-toc&lt;/code&gt;, the table of contents will be displayed as expected.&lt;/p&gt;

&lt;p&gt;The advantage of using WebComponents is that it is &lt;strong&gt;independent on the conversion process and dependent on WebComponents&lt;/strong&gt;. There is absolutely nothing wrong with relying on standard browser technologies.&lt;br&gt;
Even if you migrate the conversion process, the same behavior can be achieved with WebComponents code.&lt;/p&gt;

&lt;p&gt;Also, as a restatement, the following text in Markdown does not violate the Markdown specification&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt; &lt;span class="na"&gt;--&lt;/span&gt; &lt;span class="na"&gt;README.md&lt;/span&gt; &lt;span class="na"&gt;--&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;generate-toc&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="gh"&gt;# Header1&lt;/span&gt;
Hello, World
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Considering the purpose and specification of Markdown and the web platform, I think the combination of Markdown and WebComponents is a good match.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finally, Rocket is here!
&lt;/h2&gt;

&lt;p&gt;Sorry for the wait, but Rocket is finally here.&lt;/p&gt;

&lt;p&gt;Rocket is an SSG that allows seamless integration of Markdown and WebComponents.&lt;br&gt;
There is a project to support the development of web standard technologies called Modern Web, and &lt;a href="https://rocket.modern-web.dev/"&gt;rocket&lt;/a&gt; is a subproject of that project.&lt;br&gt;
Other sub-projects are &lt;a href="https://modern-web.dev/docs/test-runner/overview/"&gt;test runner&lt;/a&gt; and &lt;a href="https://modern-web.dev/docs/dev-server/%20overview/"&gt;development server&lt;/a&gt;, &lt;a href="https://modern-web.dev/"&gt;modern-web&lt;/a&gt; for &lt;a href="https://open-wc.org/"&gt;development server&lt;/a&gt;, and &lt;a href="https://open-wc.org/"&gt;open-wc&lt;/a&gt; for WebComponents development, testing, and linter.&lt;/p&gt;

&lt;p&gt;Some examples of Rocket include.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://modern-web.dev/"&gt;https://modern-web.dev/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rocket.modern-web.dev/"&gt;https://rocket.modern-web.dev/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://open-wc.org/"&gt;https://open-wc.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apolloelements.dev/"&gt;https://apolloelements.dev/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rocket is technically a Wrapper for an SSG called Eleventy.&lt;br&gt;
Eleventy converts Markdown to HTML, and Rocket mixes Eleventy with Modern Web technologies (WebComponents, TestRunner, DevServer).&lt;/p&gt;
&lt;h3&gt;
  
  
  What is Modern Web?
&lt;/h3&gt;

&lt;p&gt;When developing with Javascript, there are a lot of tools to deal with: Babel transpilers, ESLint linters, Jest testers, Webpack builders, and so on.&lt;br&gt;
Developers know that the complexity of these tools leads to a decrease in agility when they should be focusing on development.&lt;/p&gt;

&lt;p&gt;Therefore, the Modern Web aims to reduce the complexity of development by using Web standard technologies such as WebComponents and ESModules.&lt;/p&gt;

&lt;p&gt;There are also test runners like JSDOM that do not test by mocking the browser API, but by using the browser that is running.&lt;/p&gt;

&lt;p&gt;Modern Web supports the development of such web standard technologies.&lt;/p&gt;
&lt;h2&gt;
  
  
  Features of Rocket
&lt;/h2&gt;

&lt;p&gt;On &lt;a href="https://rocket.modern-web.dev/"&gt;Rocket's home page&lt;/a&gt;, you can find six features of Rocket.&lt;br&gt;
However, I think I should explain the integration of Markdown and WebComponents in the flow of this article, so I will only introduce the following one feature and skip the others.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Meta Framework

&lt;ul&gt;
&lt;li&gt;Build on top of giants like Eleventy, Rollup, and Modern Web.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I think Rocket's appeal lies in the fact that it rides on the shoulders of giants like Eleventy, Rollup (which I hadn't talked about), and Modern Web.&lt;/p&gt;

&lt;p&gt;You may be thinking, "Why do I need Rocket when I can just use Eleventy to convert Markdown to HTML and load WebComponents? Who needs Rocket? In fact, I think those two are enough.&lt;/p&gt;

&lt;p&gt;However, if you have a project support called Modern Web, your development agility will be improved.&lt;br&gt;
Specifically, it provides automatic reloads for Markdown and Javascript changes, &lt;a href="https://www.11ty.dev/docs/plugins/image/"&gt;Eleventy's image conversion process&lt;/a&gt;, &lt;a href="https://dev.tohttps://"&gt;Markdown link checking&lt;/a&gt; rocket.modern-web.dev/docs/tools/check-html-links/).&lt;br&gt;
Well, it's not essential and Eleventy and WebComponents are fine, but I'll use Rocket.&lt;/p&gt;
&lt;h2&gt;
  
  
  Markdown Javascript
&lt;/h2&gt;

&lt;p&gt;Let's talk about the integration of Markdown and WebComponents.&lt;/p&gt;

&lt;p&gt;Rocket has a feature called Markdown Javascript. It internally uses a library called MDJS.&lt;br&gt;
Here is an InfoQ article about MDJS, if you want to read it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.infoq.com/jp/news/2020/08/mdjs-markdown-web-%20components/"&gt;New MDJS markup language adds JavaScript to Markdown for interactive documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Markdown Javascript allows you to write Javascript into Markdown, with the ability to run it interactively.&lt;br&gt;
For example, let's say you wrote the following Markdown&lt;/p&gt;

&lt;p&gt;｀｀｀js script&lt;br&gt;
console.log('Hello, World');&lt;br&gt;
｀｀｀&lt;/p&gt;

&lt;p&gt;When you write this and run it in Rocket, you will see &lt;code&gt;Hello, World&lt;/code&gt; on the console screen of your browser's development tool.&lt;br&gt;
You can also apply this to define WebComponents.&lt;/p&gt;

&lt;p&gt;｀｀｀js script&lt;br&gt;
class MyDiv extends HTMLElement {&lt;br&gt;
  constructor() {&lt;br&gt;
    super();&lt;br&gt;
    const shadow = this.attachShadow({mode: 'open'});&lt;br&gt;
    shadow.innerHTML = &lt;code&gt;Hello, World&lt;/code&gt;;&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;customElements.define('my-div', MyDiv);&lt;br&gt;
｀｀｀&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;my-div&amp;gt;&amp;lt;/my-div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you run this in Rocket, you will see &lt;code&gt;Hello World&lt;/code&gt; on the screen.&lt;br&gt;
As you can see, you can define WebComponents on Markdown and execute it interactively, so you can use WebComponents &lt;strong&gt;immediately&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is fine if you are using disposable WebComponents, but there are times when you need to use them all the time.&lt;br&gt;
In such a case, it is good to define WebComponents in the common place.&lt;br&gt;
If you write WebComponents in the script header of Numjucks, you can use the defined WebComponents from any Markdown.&lt;/p&gt;
&lt;h3&gt;
  
  
  Support for Bare Import
&lt;/h3&gt;

&lt;p&gt;Rocket uses Modern Web's &lt;a href="https://modern-web.dev/docs/dev-server/overview/"&gt;Development Server&lt;/a&gt; internally. The development server has support for &lt;a href="https://modern-web.dev/blog/introducing-modern-web/#highlights-1"&gt;Bare Import&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here is an example of Bare Import.&lt;br&gt;
Assuming you have installed &lt;code&gt;npm install canvas-confetti&lt;/code&gt; beforehand, the following Markdown will be executed by &lt;code&gt;confetti()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;｀｀｀js script&lt;br&gt;
import confetti from 'canvas-confetti';&lt;br&gt;
confetti();&lt;br&gt;
｀｀｀&lt;/p&gt;

&lt;p&gt;As you can see, you can use Bare to specify relative or absolute paths without being aware of them.&lt;/p&gt;
&lt;h3&gt;
  
  
  Using libraries from the WebComponents community
&lt;/h3&gt;

&lt;p&gt;If you don't want to write your own WebComponents, you can use one of the following WebComponents community sites that looks good.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.webcomponents.org/"&gt;webcomponents.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, let's say you want to use a WebComponents called &lt;a href="https://www.webcomponents.org/element/emoji-picker-element"&gt;emoji-picker-element&lt;/a&gt;. emoji-picker-element element resembles the UI of an emoji keyboard, which can be displayed by pressing command + control + space key on a Mac.&lt;/p&gt;

&lt;p&gt;The usage is simple.&lt;br&gt;
To use it, simply install it with &lt;code&gt;npm install emoji-picker-element&lt;/code&gt; as before, and then you can use &lt;code&gt;&amp;lt;emoji-picker-element&amp;gt;&lt;/code&gt; by writing the following Markdown.&lt;/p&gt;

&lt;p&gt;｀｀｀js script&lt;br&gt;
import 'emoji-picker-element';&lt;br&gt;
｀｀｀&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;emoji-picker&amp;gt;&amp;lt;/emoji-picker&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Advertising
&lt;/h2&gt;

&lt;p&gt;An introductory book about WebComponents is available on Amazon for 500 yen.&lt;br&gt;
It doesn't write about Rocket this time, but it mentions the testing of &lt;a href="https://open-wc.org/"&gt;open-wc&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.amazon.co.jp/gp/product/B08CY2QCFV/"&gt;My First Introduction to Web Components: From 4 Basic Features to Related Libraries&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have also created my portfolio page in Rocket. This blog is also written in Markdown. Please check it out if you like.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://silver-birder.github.io/"&gt;silverbirder's page&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;The Markdown file of this blog is &lt;a href="https://github.com/Silver-birder/Silver-birder.github.io/blob/main/docs/blog/contents/intro_rocket.md"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  In closing
&lt;/h2&gt;

&lt;p&gt;I'm sorry that the introduction of Rocket is so far behind. It may have been too long a preamble.&lt;br&gt;
I hope it will be of some help to someone.&lt;/p&gt;

</description>
      <category>webcomponents</category>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
