<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Ydesign Blog</title>
        <link>https://ydesign.dev/en/blog</link>
        <description>Ydesign Blog</description>
        <lastBuildDate>Sun, 24 Mar 2024 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Ydesign SDK v1.0 Officially Released 🎉]]></title>
            <link>https://ydesign.dev/en/blog/ydesign-sdk-v1</link>
            <guid>https://ydesign.dev/en/blog/ydesign-sdk-v1</guid>
            <pubDate>Sun, 24 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Hi everyone, this is BingheMori. After nearly two years of development and polishing, I'm thrilled to announce: Ydesign SDK v1.0 is officially released! 🎉]]></description>
            <content:encoded><![CDATA[<p>Hi everyone, this is <strong>BingheMori</strong>. After nearly two years of development and polishing, <strong>I'm thrilled to announce: Ydesign SDK v1.0 is officially released!</strong> 🎉</p>
<p>Starting from this version, we'll strictly follow Semantic Versioning (SemVer), so your upgrades become more stable and predictable.</p>
<p><em>Of course, don't put blind faith in modern frontend — assume every upgrade might still surprise you in new ways.</em> 😅</p>
<h2 class="anchor anchorTargetStickyNavbar_paSG" id="what-is-ydesign-sdk">What is Ydesign SDK?<a href="https://ydesign.dev/en/blog/ydesign-sdk-v1#what-is-ydesign-sdk" class="hash-link" aria-label="Direct link to What is Ydesign SDK?" title="Direct link to What is Ydesign SDK?" translate="no">​</a></h2>
<p><strong>Ydesign SDK</strong> is a collection of <strong>JavaScript modules, component libraries, and React components</strong> for building "Canva-style online design editors". It's already being used in production by multiple companies and indie developers.</p>
<p>Typical scenarios where Ydesign SDK fits:</p>
<ol>
<li class=""><strong>Design &amp; social media apps</strong> — posters, covers, business cards, video thumbnails</li>
<li class=""><strong>Print-on-demand &amp; product customization</strong> — self-service designs for T-shirts, mugs, tote bags, phone cases</li>
<li class=""><strong>E-commerce &amp; online storefronts</strong> — let buyers customize product artwork, generate marketing assets</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_paSG" id="the-story-behind-it">The Story Behind It<a href="https://ydesign.dev/en/blog/ydesign-sdk-v1#the-story-behind-it" class="hash-link" aria-label="Direct link to The Story Behind It" title="Direct link to The Story Behind It" translate="no">​</a></h2>
<p>I've been following the online design / canvas editor space for a long time. Over the past few years I worked on several products in positions similar to <a href="https://www.canva.com/" target="_blank" rel="noopener noreferrer" class="">canva.com</a> — some were direct competitors, some were just "self-service design" modules inside a bigger product, but the underlying implementation was strikingly similar.</p>
<p>After a while it hit me: <strong>the experience I've accumulated over these years is already enough to build one myself.</strong> Instead of rebuilding this kind of editor from scratch for someone else every time, I might as well crystallize the capability and build one for <strong>myself</strong>.</p>
<p>But the hard part isn't shipping the app. If the goal were a consumer-facing "Canva clone", most of the energy would go into marketing, user acquisition, and differentiation — a lane that's already crowded with competitors. I almost abandoned the idea.</p>
<p>After a lot of thinking, a better angle emerged: <strong>instead of a C-end Canva competitor, build a developer-facing B2B product.</strong> Abstract "building a canvas editor" into a JS SDK so other developers can plug a fully-featured canvas editor into their own business. This direction matches my strengths — I've spent years writing frameworks and tools, and I have a pretty good sense of what kind of APIs and docs actually feel good to use (I hope).</p>
<p>Ydesign SDK was born out of that.</p>
<p>Huge thanks to my partner along the way, <strong><a href="https://github.com/Klchan-me" target="_blank" rel="noopener noreferrer" class="">Klchan-me</a></strong> (former senior engineer at Tencent, co-founder of LingxiGuangnian) — from architecture, performance, to engineering standards, walking this road together.</p>
<h2 class="anchor anchorTargetStickyNavbar_paSG" id="quick-start">Quick Start<a href="https://ydesign.dev/en/blog/ydesign-sdk-v1#quick-start" class="hash-link" aria-label="Direct link to Quick Start" title="Direct link to Quick Start" translate="no">​</a></h2>
<p>Ydesign SDK targets developers, so make sure you (or someone on your team) has an engineer who understands why <code>0.1 + 0.2 !== 0.3</code> 😉.</p>
<p>If reading docs while coding feels tedious, you can also clone the <a href="https://github.com/liaojunhao/react-fabric-editor" target="_blank" rel="noopener noreferrer" class=""><code>apps/demo</code></a> example project in the repo and run it out of the box.</p>
<h3 class="anchor anchorTargetStickyNavbar_paSG" id="install">Install<a href="https://ydesign.dev/en/blog/ydesign-sdk-v1#install" class="hash-link" aria-label="Direct link to Install" title="Direct link to Install" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Kjsu theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_UAhT"><pre tabindex="0" class="prism-code language-bash codeBlock_yObO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_VzHu"><span class="token-line" style="color:#393A34"><span class="token plain">npm install @ydesign/react-editor</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_paSG" id="bootstrapping-an-editor-in-react">Bootstrapping an editor in React<a href="https://ydesign.dev/en/blog/ydesign-sdk-v1#bootstrapping-an-editor-in-react" class="hash-link" aria-label="Direct link to Bootstrapping an editor in React" title="Direct link to Bootstrapping an editor in React" translate="no">​</a></h3>
<p>The snippet below isn't the most minimal, but it's a <strong>copy-paste-ready starting template</strong> you can gradually adapt to your business:</p>
<div class="language-tsx codeBlockContainer_Kjsu theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_UAhT"><pre tabindex="0" class="prism-code language-tsx codeBlock_yObO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_VzHu"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">React</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'react'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">ReactDOM</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'react-dom/client'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">DesignEditorContainer</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">SidePanelWrap</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">WorkspaceWrap</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">SidePanel</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> createStore </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@ydesign/react-editor'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">Toolbar</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@ydesign/react-editor/toolbar'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">Workspace</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@ydesign/react-editor/canvas/workspace'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">ZoomButtons</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@ydesign/react-editor/toolbar/zoom-buttons'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Don't forget the editor styles</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@ydesign/react-editor/style.css'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> store </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createStore</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Get one from the console: https://ydesign.com/cabinet/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  key</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'LICENSE_KEY'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// A paid license allows you to hide the backlink,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// but keeping it visible is a great way to support the Ydesign project.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  showCredit</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">store</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">addPage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:#d73a49">App</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> store </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">DesignEditorContainer</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f"> width</span><span class="token tag script language-javascript operator" style="color:#393A34">:</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript string" style="color:#e3116c">'100vw'</span><span class="token tag script language-javascript punctuation" style="color:#393A34">,</span><span class="token tag script language-javascript" style="color:#00009f"> height</span><span class="token tag script language-javascript operator" style="color:#393A34">:</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript string" style="color:#e3116c">'100vh'</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">SidePanelWrap</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">SidePanel</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">store</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">store</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">SidePanelWrap</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">WorkspaceWrap</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Toolbar</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">store</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">store</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Workspace</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">store</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">store</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">ZoomButtons</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">store</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">store</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">WorkspaceWrap</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">DesignEditorContainer</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Make sure there's a container with id `root` and an explicit size on the page</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> root </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token maybe-class-name">ReactDOM</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">createRoot</span><span class="token punctuation" style="color:#393A34">(</span><span class="token dom variable" style="color:#36acaa">document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getElementById</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'root'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">root</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">render</span><span class="token punctuation" style="color:#393A34">(</span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">App</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">store</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">store</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>If you don't even want to write those few lines, there's an even more minimal entry point:</p>
<div class="language-tsx codeBlockContainer_Kjsu theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_UAhT"><pre tabindex="0" class="prism-code language-tsx codeBlock_yObO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_VzHu"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> createDesignEditorApp </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@ydesign/react-editor'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@ydesign/react-editor/style.css'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> store </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createDesignEditorApp</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  container</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token dom variable" style="color:#36acaa">document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getElementById</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'root'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  key</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'LICENSE_KEY'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_paSG" id="commercialization">Commercialization<a href="https://ydesign.dev/en/blog/ydesign-sdk-v1#commercialization" class="hash-link" aria-label="Direct link to Commercialization" title="Direct link to Commercialization" translate="no">​</a></h2>
<p>As of today, Ydesign is still an <strong>independent project maintained by a small team</strong>.</p>
<p>From the very first line of code, it took roughly three months to reach a "proof of concept"; another six months or so to round out the core capabilities, ship the first public release, and put the website live; and a lot of time after that iterating on real customer feedback. Through this process we've developed an increasingly clear answer to "what kind of design SDK developers actually want".</p>
<p>Beyond SDK licensing itself, Ydesign also offers <strong>customization, on-premise deployment, and full source-code licensing</strong> as commercial services — but these naturally don't scale the same way a standard product does, so we won't put our main focus on them. <strong>Making the SDK itself great, and improving its DX</strong>, is always our top priority.</p>
<p>If your team is evaluating a similar solution, feel free to reach out — we'd love to chat.</p>
<h2 class="anchor anchorTargetStickyNavbar_paSG" id="whats-next">What's Next?<a href="https://ydesign.dev/en/blog/ydesign-sdk-v1#whats-next" class="hash-link" aria-label="Direct link to What's Next?" title="Direct link to What's Next?" translate="no">​</a></h2>
<p>We believe demand in this space will keep growing, and we've already seen new competitors entering. There's still plenty on our backlog worth doing, mainly in these directions:</p>
<ol>
<li class=""><strong>Official release of <code>@ydesign/vue-editor</code></strong> — so the Vue 3 ecosystem gets full parity with the React version, with JSON fully interoperable between the two.</li>
<li class=""><strong>Animation / video export</strong> — static image, PDF, and SVG export are already supported; animation and video export are on the roadmap.</li>
<li class=""><strong>More export formats</strong> — print-ready PDF, HTML, high-resolution SVG, etc.</li>
<li class=""><strong>Extending the <a class="" href="https://ydesign.dev/en/docs/cloud-render">cloud rendering API</a></strong> — solving performance and consistency for large files, high-resolution output, and batch rendering.</li>
<li class=""><strong>Continuously expanding AI capabilities</strong> — smart background removal, one-click layout, AI image generation, one-click variations, and more.</li>
<li class=""><strong>Collaborative editing</strong> — CRDT-based real-time multi-user collaboration.</li>
<li class=""><strong>PPTX presentation editing</strong> — import <code>.pptx</code> files, edit page by page, export back to <code>.pptx</code>, turning Ydesign into "PowerPoint in the browser". Built on top of the multi-page scene (<code>SceneHandler</code>) capability.</li>
</ol>
<p>For the full roadmap, see the <a class="" href="https://ydesign.dev/en/roadmap">Roadmap page</a>. You're also welcome to vote and discuss on GitHub Discussions.</p>
<p>Alongside the SDK, we also maintain an internal showcase app called <strong>Ydesign Studio</strong> — to demonstrate what the SDK is capable of, and as our own dogfooding playground. It was originally positioned as a "forever free, no-login, no-paywall" tool. But as we plan to integrate some expensive capabilities (e.g. image background removal), Ydesign Studio may also introduce a limited paywall — we're still thinking through how to keep the "minimum friction" experience while making it sustainable.</p>
<blockquote>
<p><strong>If Ydesign has been helpful to you, giving us a Star on the <a href="https://github.com/liaojunhao/react-fabric-editor" target="_blank" rel="noopener noreferrer" class="">GitHub repo</a> is the best kind of support.</strong></p>
</blockquote>]]></content:encoded>
            <category>Ydesign</category>
            <category>Release notes</category>
            <category>Canvas engine</category>
            <category>React</category>
            <category>Architecture</category>
            <category>Design editor</category>
        </item>
    </channel>
</rss>