<?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: Rahul Anand</title>
    <description>The latest articles on DEV Community by Rahul Anand (@rahulnsanand).</description>
    <link>https://dev.to/rahulnsanand</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%2F400367%2F7956f94c-df3c-42a0-94dc-882c629528a4.jpeg</url>
      <title>DEV Community: Rahul Anand</title>
      <link>https://dev.to/rahulnsanand</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rahulnsanand"/>
    <language>en</language>
    <item>
      <title>Luthor: A WYSIWYG React Text Editor for Performance and Control</title>
      <dc:creator>Rahul Anand</dc:creator>
      <pubDate>Thu, 12 Mar 2026 17:20:26 +0000</pubDate>
      <link>https://dev.to/rahulnsanand/luthor-a-wysiwyg-react-text-editor-for-performance-and-control-1m22</link>
      <guid>https://dev.to/rahulnsanand/luthor-a-wysiwyg-react-text-editor-for-performance-and-control-1m22</guid>
      <description>&lt;p&gt;I built Luthor to end the editor tradeoff: fast setup with lock-in, or full control that burns weeks before you ship anything real at scale.&lt;/p&gt;

&lt;p&gt;I just want to build my app! Not wonder what a toolbar icon should look like on the text editor.&lt;br&gt;
I wanted one ecosystem where I can ship fast, then go deep only when I actually need to.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://www.luthor.fyi" rel="noopener noreferrer"&gt;https://www.luthor.fyi&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Playground: &lt;a href="https://www.luthor.fyi/demo" rel="noopener noreferrer"&gt;https://www.luthor.fyi/demo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://www.luthor.fyi/docs/getting-started/index" rel="noopener noreferrer"&gt;https://www.luthor.fyi/docs/getting-started/index&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/lyfie-org/luthor" rel="noopener noreferrer"&gt;https://github.com/lyfie-org/luthor&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm (&lt;code&gt;@lyfie/luthor&lt;/code&gt;): &lt;a href="https://www.npmjs.com/package/@lyfie/luthor" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@lyfie/luthor&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm (&lt;code&gt;@lyfie/luthor-headless&lt;/code&gt;): &lt;a href="https://www.npmjs.com/package/@lyfie/luthor-headless" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@lyfie/luthor-headless&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The components that make Luthor
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Core - &lt;code&gt;@lyfie/luthor-headless&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Use this when you want full editor UI control.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;runtime dependencies: &lt;strong&gt;0&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;core engine and related packages are exposed via &lt;code&gt;peerDependencies&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;you choose exactly what to install and what to customize&lt;/li&gt;
&lt;li&gt;you build your own UI/UX, toolbar, behavior, and design-system integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This package is lean by design. Performant by intention.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Showoff - &lt;code&gt;@lyfie/luthor&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Use this when you want one-package-solution, shipping speed with polished defaults, this package does not bloat your application, it depends ONLY on Lexical packages and The Core &lt;code&gt;@lyfie/luthor-headless&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;includes the Lexical package set it needs under the hood&lt;/li&gt;
&lt;li&gt;gives you presets out of the box, just plug and play&lt;/li&gt;
&lt;li&gt;includes and exposes all extensibility of &lt;code&gt;@lyfie/luthor-headless&lt;/code&gt; under the hood&lt;/li&gt;
&lt;li&gt;still lets you move into deeper customization when needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the practical all-in-one lane.&lt;br&gt;&lt;br&gt;
QYSIQYG/WYSIWYG style, but without losing the escape hatch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance at a glance
&lt;/h2&gt;

&lt;p&gt;Both packages are built for fast, responsive editing in real apps.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@lyfie/luthor&lt;/code&gt; is intentionally super lightweight for a ready-to-ship WYSIWYG package.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@lyfie/luthor-headless&lt;/code&gt; is even more lightweight, since it keeps runtime dependencies at zero and relies on peer dependencies for composition.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tree-Shaking
&lt;/h2&gt;

&lt;p&gt;Tree-shaking helps keep shipped code lean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;headless is especially tree-shake friendly because it is ESM and marks &lt;code&gt;sideEffects: false&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;preset package also tree-shakes JS imports, while stylesheet imports stay intentional&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Result: you can avoid dragging unnecessary editor code into production bundles, keeping your final build as lean as possible on the users browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features Developers Might Love (I know I do)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Writing + structure that feels solid
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;typography controls&lt;/li&gt;
&lt;li&gt;formatting essentials&lt;/li&gt;
&lt;li&gt;links, headings, alignment, and list workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpkha1xuiktuajuihc9cm.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpkha1xuiktuajuihc9cm.gif" alt="Typography and formatting" width="760" height="427"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fezcytj86m5nlcutv6hmz.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fezcytj86m5nlcutv6hmz.gif" alt="Links and structure" width="760" height="427"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkhy8fkcgprlyx5rsh582.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkhy8fkcgprlyx5rsh582.gif" alt="Lists and structure" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Productivity without friction
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;slash command center&lt;/li&gt;
&lt;li&gt;command workflows&lt;/li&gt;
&lt;li&gt;undo/redo and keyboard-first speed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzprn2dx4geg2c7zvqqt6.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzprn2dx4geg2c7zvqqt6.gif" alt="Slash commands" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5zm6cbau7bdh1pqtfao9.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5zm6cbau7bdh1pqtfao9.gif" alt="History and shortcuts" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Real product features, not just demo features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;embeds (image, iframe, YouTube)&lt;/li&gt;
&lt;li&gt;code blocks&lt;/li&gt;
&lt;li&gt;custom blocks and extension-level flexibility&lt;/li&gt;
&lt;li&gt;dark/light ready behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8efg0bzr6r89st2yxrur.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8efg0bzr6r89st2yxrur.gif" alt="Embeds and media" width="80" height="45"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ms7ki8d2v1jqbebej15.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ms7ki8d2v1jqbebej15.gif" alt="Code blocks" width="760" height="427"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fokffk64wfxlsloh7x0h3.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fokffk64wfxlsloh7x0h3.gif" alt="Custom blocks" width="760" height="427"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8xq9tqxpp56waglxok7d.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8xq9tqxpp56waglxok7d.gif" alt="Theme support" width="600" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Minimal Setup: Preset Lane
&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; @lyfie/luthor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ExtensiveEditor&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@lyfie/luthor&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@lyfie/luthor/styles.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ExtensiveEditor&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Start writing..."&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Minimal Setup: Headless Lane
&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; @lyfie/luthor-headless
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;lexical @lexical/code @lexical/link @lexical/list @lexical/markdown @lexical/react @lexical/rich-text @lexical/selection @lexical/table @lexical/utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;createEditorSystem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;RichText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;richTextExtension&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;boldExtension&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;italicExtension&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@lyfie/luthor-headless&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;extensions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;richTextExtension&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;boldExtension&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;italicExtension&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&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;Provider&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEditor&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createEditorSystem&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;extensions&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Toolbar&lt;/span&gt;&lt;span class="p"&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;commands&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;activeStates&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useEditor&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;commands&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toggleBold&lt;/span&gt;&lt;span class="p"&gt;?.()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;aria-pressed&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;activeStates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bold&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        Bold
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;commands&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toggleItalic&lt;/span&gt;&lt;span class="p"&gt;?.()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;aria-pressed&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;activeStates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;italic&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        Italic
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Provider&lt;/span&gt; &lt;span class="na"&gt;extensions&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;extensions&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Toolbar&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;RichText&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Write here..."&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Provider&lt;/span&gt;&lt;span class="p"&gt;&amp;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;
  
  
  Why Developers Stick With It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;clear split between preset workflow and headless workflow&lt;/li&gt;
&lt;li&gt;practical docs for getting started, presets, architecture, and API usage&lt;/li&gt;
&lt;li&gt;live playground to evaluate flows before integration&lt;/li&gt;
&lt;li&gt;feature depth that covers real product requirements, not just demos&lt;/li&gt;
&lt;li&gt;developer-first approach: open source, MIT, no paywalls&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Take
&lt;/h2&gt;

&lt;p&gt;If you want a clean editor stack with zero confusion:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;choose &lt;code&gt;@lyfie/luthor-headless&lt;/code&gt; for maximum UI/UX control and lean dependency strategy&lt;/li&gt;
&lt;li&gt;choose &lt;code&gt;@lyfie/luthor&lt;/code&gt; for all the built in presets for fast QYSIQYG/WYSIWYG plug and play shipping and built-in ergonomics (bonus: you get luthor-headless features within this package too, best of both worlds)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Either way, you stay in one ecosystem and scale without redoing everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Links (Again)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://www.luthor.fyi" rel="noopener noreferrer"&gt;https://www.luthor.fyi&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Playground: &lt;a href="https://www.luthor.fyi/demo" rel="noopener noreferrer"&gt;https://www.luthor.fyi/demo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://www.luthor.fyi/docs/getting-started/index" rel="noopener noreferrer"&gt;https://www.luthor.fyi/docs/getting-started/index&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/lyfie-org/luthor" rel="noopener noreferrer"&gt;https://github.com/lyfie-org/luthor&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm (&lt;code&gt;@lyfie/luthor&lt;/code&gt;): &lt;a href="https://www.npmjs.com/package/@lyfie/luthor" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@lyfie/luthor&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm (&lt;code&gt;@lyfie/luthor-headless&lt;/code&gt;): &lt;a href="https://www.npmjs.com/package/@lyfie/luthor-headless" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@lyfie/luthor-headless&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>lexical</category>
      <category>lowcode</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
