<?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: Yuriy Sountsov</title>
    <description>The latest articles on DEV Community by Yuriy Sountsov (@yuriysountsov).</description>
    <link>https://dev.to/yuriysountsov</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%2F335402%2Faebffeb5-0ecf-4fa7-aa32-105424bffc42.png</url>
      <title>DEV Community: Yuriy Sountsov</title>
      <link>https://dev.to/yuriysountsov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yuriysountsov"/>
    <language>en</language>
    <item>
      <title>Faster Content Modeling with Kimmel</title>
      <dc:creator>Yuriy Sountsov</dc:creator>
      <pubDate>Tue, 06 Apr 2021 20:39:28 +0000</pubDate>
      <link>https://dev.to/yuriysountsov/faster-content-modeling-with-kimmel-2bnk</link>
      <guid>https://dev.to/yuriysountsov/faster-content-modeling-with-kimmel-2bnk</guid>
      <description>&lt;h2&gt;
  
  
  Content modeling in Kontent
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://kontent.ai/"&gt;Kontent&lt;/a&gt; is a headless CMS platform that allows enterprises to &lt;a href="https://kontent.ai/solutions/reach-more-customers"&gt;reach more customers&lt;/a&gt;, &lt;a href="https://kontent.ai/solutions/unify-content-across-your-business"&gt;unify content across the business&lt;/a&gt;, and &lt;a href="https://docs.kontent.ai/tutorials/what-is-content-as-a-service"&gt;structure content for future content needs&lt;/a&gt;, all in one place. As a headless CMS, all content delivery is API-driven, so the same content can show up on any device or channel. 🧠&lt;/p&gt;

&lt;p&gt;What about content modeling? Modeling in Kontent is an art that has &lt;a href="https://docs.kontent.ai/tutorials/set-up-kontent/content-modeling"&gt;a dedicated space&lt;/a&gt; in the Kontent documentation. A successful content model can bring a project faster to release, make it easier to maintain, and satisfy future content needs beyond the initial requirements. Content models come in myriad forms, but largely involve &lt;a href="https://docs.kontent.ai/tutorials/assorted-items/dive-deeper-into-kentico-kontent/terminology#a-content-type"&gt;&lt;strong&gt;content types&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://docs.kontent.ai/tutorials/assorted-items/dive-deeper-into-kentico-kontent/terminology#a-content-type-snippet"&gt;&lt;strong&gt;content type snippets&lt;/strong&gt;&lt;/a&gt;, and &lt;a href="https://docs.kontent.ai/tutorials/assorted-items/dive-deeper-into-kentico-kontent/terminology#a-element"&gt;&lt;strong&gt;content type elements&lt;/strong&gt;&lt;/a&gt;. 🧩&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does content modeling need to be faster?
&lt;/h2&gt;

&lt;p&gt;The modern world is all about prototyping, iteration, and automation. Faster development, faster campaigns, faster release cycles, faster time to market. There are build and deployment pipelines, and AI-driven personalization algorithms. The faster you create your content model, the sooner downstream components can do their thing, thus making your colleagues happier and other teams in the company busier sooner. ⚡&lt;/p&gt;

&lt;p&gt;With faster content modeling, all stakeholders can feel more empowered to contribute their insights and ideas, because they know that the effort-to-reward ratio is elevated with a faster process. It also means that mistakes are less significant, and any issues in the content model can be resolved with less time lost. 💯&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zVHmDt64--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sz4ammqshxeaduv6v5qi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zVHmDt64--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sz4ammqshxeaduv6v5qi.png" alt="Kimmel interface" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Kimmel?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://kimmel.vercel.app/"&gt;Kimmel&lt;/a&gt; is an app where you can use Kontent Model Language (KML) to quickly scaffold content types. Kimmel contains three parts: writing, parsing, and deploying. Writing is done in the browser just like Kontent. Parsing is done on a server and deploying is how you move the model into Kontent so you can start working with content based on the model. ⌨&lt;/p&gt;

&lt;h3&gt;
  
  
  How Kimmel helps you, the marketer
&lt;/h3&gt;

&lt;p&gt;At the very start of the project, all stakeholders need to be involved in the content model. As a marketer, you can use Kimmel to quickly iterate some of your ideas on what the types should be and how they should relate. In Kimmel, you can quickly glance over everything described for the project so you can spot anything that is missing or unclear. Since KML is text-based, you can easily send it via email or chat to colleagues for review, or collaborate over a call. 🎉&lt;/p&gt;

&lt;h3&gt;
  
  
  How Kimmel helps you, the developer
&lt;/h3&gt;

&lt;p&gt;When it comes to development, having a strong content model helps the applications using it be simpler and easier to read. Quickly iterating a content model in Kimmel accelerates the time it takes to reach the application architecture step and reduces the time until deliverables are ready for review. Seeing the types and their relationships can also give you a preview of what UI components to create or what backend services will be needed. If there is a need for custom elements, then you will be able to allocate time to make those or import them from the &lt;a href="https://kentico.github.io/kontent-custom-element-samples/gallery/"&gt;Custom element sample gallery&lt;/a&gt;. 📦&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PHeomRJK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7syy35tim1ouhpof9o2s.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PHeomRJK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7syy35tim1ouhpof9o2s.gif" alt="Content modeling in Kimmel" width="880" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Content modeling in Kimmel
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Writing KML
&lt;/h3&gt;

&lt;p&gt;KML as a markup language is a shorthand for many of the same actions you can take in the Kontent interface when making content models. Its syntax is a of cross between YAML and TypeScript, but simplified for content modeling. First you describe a type like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Type My type
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, on each new line under this first one you describe the elements, which are called properties in KML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Type My type
  Date[] A date
  Text[] The title
  MultipleChoice[Awesome,Only amazing] How cool this is
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each property almost one-to-one corresponds to a Kontent element:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One major difference is that the multiple choice element is broken into two properties: &lt;code&gt;SingleChoice&lt;/code&gt; and &lt;code&gt;MultipleChoice&lt;/code&gt; to represent radio options and checkboxes, respectively.&lt;/li&gt;
&lt;li&gt;Linked types are referenced by name:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Type My type
    Date[] A date
    Text[] The title
    MultipleChoice[Awesome,Only amazing] How cool this is
    Type2[] A linked type

  Type2 My linked type
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Snippets use a special prefix:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Type My type
    Date[] A date
    Text[] The title
    MultipleChoice[Awesome,Only amazing] How cool this is
    Type2[] A linked type
    ...SnippetType

  Type2 My linked type

  SnippetType My snippet type
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Url slugs and other supporting elements are not supported yet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Properties can have options:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Type My type
  Date[*] A date
  Type2[1-3] A linked type

Type2 My linked type
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The * means that the property is required, and &lt;em&gt;1-3&lt;/em&gt; means that there is a minimum of 1 and a maximum of 3 items allowed in that property. 🧠&lt;/p&gt;

&lt;p&gt;Options can have details:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Type My type
  Text[words(60)] The title
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Writing &lt;em&gt;words(60)&lt;/em&gt; means that property can have a maximum of 60 words. Different properties have their own options and details.&lt;/p&gt;

&lt;p&gt;Using the Kimmel text editor, it is easy to write new properties and move them around between types. By clicking on a name, you can also see where else it shows up, all on one screen. 💻&lt;/p&gt;

&lt;h3&gt;
  
  
  Parsing KML
&lt;/h3&gt;

&lt;p&gt;Once you have some KML written, Kimmel automatically parses it and shows you a structure of what you wrote (in our favorite format, JSON). If there are no syntax issues, you can expand and collapse types to see their values and relationships. This is a preview of how the types will look once they are in Kontent and ready for content. 🏃‍♀️&lt;/p&gt;

&lt;p&gt;Kimmel includes a toggle called &lt;strong&gt;Strict&lt;/strong&gt; which switches parsing between &lt;em&gt;Strict&lt;/em&gt; mode and &lt;em&gt;Loose&lt;/em&gt; mode. Strict mode produces an error if there is any issue with the structure that the KML represents: an undescribed linked type, a snippet inside a snippet, et cetera. Loose mode tries to fix some types of issues, and can be useful when you're quickly jotting down KML and wish to see the parsed result. 🧪&lt;/p&gt;

&lt;h3&gt;
  
  
  Deploying KML
&lt;/h3&gt;

&lt;p&gt;The last step is deploying to Kontent. By clicking &lt;code&gt;Deploy to Kontent&lt;/code&gt; and providing a Management API key, all of the KML is added to the key's project as new types. Once the model is deployed, you can start making content based on the model! 🎢&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--V_1MMAPZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rqn6fsixci1oqy4oakjy.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V_1MMAPZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rqn6fsixci1oqy4oakjy.jpg" alt="Building in progress" width="880" height="587"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Photo by &lt;a href="https://unsplash.com/@danist07?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;贝莉儿 DANIST&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/toy-construction-set?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;
&lt;/h6&gt;

&lt;h2&gt;
  
  
  Modeling common scenarios with Kimmel
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Blog
&lt;/h3&gt;

&lt;p&gt;A blog is a common content channel that easily decomposes to a complex content model. At the very top, you might have a name, featured posts, and information on social profiles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Blog Blog
  Text[characters(60),*] Name
  Post[1+] Featured posts
  Social[1+] Social profiles

Social
  Text[*] URL
  Asset[images] Icon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The name is required and limited to 60 characters. We do not want long blog names! There is always at least one (read as "one plus") featured post, and the same for social profiles. 📱&lt;/p&gt;

&lt;p&gt;Posts have some useful properties, like a title, teaser, authors, a header image, categories, and, of course, the body:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Post Blog post
  Text[characters(80),*] Title
  Text[*] Teaser
  Person[1+,*] Authors
  CreditedImage[1,*] Header
  Category[1+] Category
  RichText[p,b,i,a,ul,images,h2,*] Body
    Product

CreditedImage
  Asset[images,*] Header
  Person[1+,*] Authors

Category
  Text[words(3)] Name
  MultipleChoice[Highlight] Options
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The header image is more than just an asset: it also includes information about the authors or photographers of the image. The body allows a few common styles, images, and one component, product. This represents a callout of an external product that the authors reference in their copy. 🎁&lt;/p&gt;

&lt;p&gt;The last two types represent a person and a product. Both of them can have a single photo asset and descriptions with limited styles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Person
  Text[words(3),*] Name
  Text[] URL
  Asset[1,images] Photo
  SingleChoice[Contributor,Associate,Owner] Position
  RichText[p,a,words(30)] Short biography
  RichText[p,a,words(60)] Biography
  Social[] Social profiles

Product
  Text[*] Name
  Number[*] Price
  Number[*] Discount
  Text[*] Store name
  Asset[1,images,*] Photo
  RichText[p,a,words(60)] Description
  Text[*] URL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only the person's name is required; everything else is optional! Contrast that with product, where only the description is optional. ⚖&lt;/p&gt;

&lt;p&gt;With these types, you can create rich blog content with room for expansion down the line: more components in the posts' rich text, or wider restrictions for different copy. 🎉&lt;/p&gt;

&lt;h3&gt;
  
  
  Billboard
&lt;/h3&gt;

&lt;p&gt;Kimmel, like Kontent, is not limited to web content models. A billboard, or a non-web screen, is a good example of a channel outside of websites. Billboards typically have rotating ads with transitions between each one. At the top is the billboard itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Billboard Billboard
  Ad[1+,*] Ads
  Transition[1] Default transition
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is no name or other external information because the billboard is presented without a user context: it could be by a highway, at a bus station, or in a shopping mall, so only the ads are presented. Ads and transitions represent just enough content for an editor or an integration to compose a billboard experience:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ad
  Asset[images,1,*] Content
  Number[*] Duration in seconds
  SingleChoice[Preferred,High,Medium,Low,Filler,*] Priority
  Transition[1] Custom transition

Transition
  Text[words(5),*] Name
  RichText[p,b,i,a] Description
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You may have an integration to expose the model to a reseller using a custom presentation where they can configure their ads any way they want. This means that transitions need a name to distinguish them, but a description is optional. 🏷&lt;/p&gt;

&lt;h3&gt;
  
  
  Todo list
&lt;/h3&gt;

&lt;p&gt;Lastly, we can consider a classic content model example: a todo list. A todo list is structured into projects and each project has any number of todo items in a hierarchy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TodoList Todo list
  Project[1+,*] Projects

Project
  Text[*] Name
  RichText[p,a,b,i] Notes
  TodoItem[] Todo items
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are no restrictions on the number of todo items in a project. Each todo item has reminders and todo tasks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TodoItem Todo item
  RichText[p,a,b,i,*] Content
  Date[] Due date
  Text[] Comment
  Reminder[] Reminders
  SingleChoice[Not started,In progress,Completed] Status
  SingleChoice[Red,Blue,Green,Orange,Yellow,Purple] Label
  TodoItem[] Todo items
  TodoTask[] Tasks

Reminder
  SingleChoice[Email,Text message,App] Type
MultipleChoice[Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday,*] Days
  Date[*] Time
  SingleChoice[Once,Weekly,*] Frequency
  Number[] Maximum times

TodoTask
  RichText[p,a,b,i,*] Content
  MultipleChoice[Highlight,Optional] Options
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since todo items can link to other todo items, this model contains "closed chains", which are measured in the &lt;code&gt;stats&lt;/code&gt; of KML:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;em&gt;TodoItem&amp;gt;TodoItem&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Project&amp;gt;TodoItem&amp;gt;TodoItem&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;TodoList&amp;gt;Project&amp;gt;TodoItem&amp;gt;TodoItem&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Faster and faster
&lt;/h2&gt;

&lt;p&gt;Kimmel promises to accelerate content modeling, simplify the content pipeline, and improve analytics on your content model. This ensures a strong foundation for the rest of the project, so that both marketers and developers can benefit and future changes can be prototyped. 🚅&lt;/p&gt;

&lt;p&gt;Let me know down below if you have any questions or would like to start a discussion!&lt;/p&gt;

</description>
      <category>kontent</category>
      <category>contentmodeling</category>
      <category>headless</category>
      <category>cms</category>
    </item>
    <item>
      <title>Xpand your Xperience with Xpandable Sections</title>
      <dc:creator>Yuriy Sountsov</dc:creator>
      <pubDate>Mon, 05 Apr 2021 15:44:39 +0000</pubDate>
      <link>https://dev.to/yuriysountsov/xpand-your-xperience-with-xpandable-sections-4i4</link>
      <guid>https://dev.to/yuriysountsov/xpand-your-xperience-with-xpandable-sections-4i4</guid>
      <description>&lt;h2&gt;
  
  
  Sections in Kentico Xperience 13
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://xperience.io/"&gt;Kentico Xperience 13&lt;/a&gt; is a modern digital experience platform aimed at content management, digital marketing, and commerce projects. It can be deployed on-premises or &lt;a href="https://xperience.io/product/platform/cloud"&gt;in the cloud&lt;/a&gt; to &lt;a href="https://xperience.io/product"&gt;deliver engaging, personalized experiences&lt;/a&gt;, &lt;a href="https://xperience.io/product/digital-marketing"&gt;create remarkable digital touchpoints&lt;/a&gt;, &lt;a href="https://xperience.io/product/platform/mvc-development"&gt;build solutions using a modern .NET MVC platform&lt;/a&gt;, and &lt;a href="https://xperience.io/product/integrations"&gt;integrate with the tools you need&lt;/a&gt;. 👑&lt;/p&gt;

&lt;p&gt;Kentico Xperience 13 includes a &lt;a href="https://xperience.io/product/content-management/page-builder"&gt;WYSIWYG page builder&lt;/a&gt; that structures page content into editable areas with sections, and sections into widget zones with widgets. Typically sections are created by developers to suit different layouts: two columns, three columns, a column and a CTA box, or any other presentation. Once defined in code, the sections are available in the page builder for marketers to use. 🖼&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--c0miHed8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ris8zd6t5563s4uf87mi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--c0miHed8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ris8zd6t5563s4uf87mi.png" alt="Kentico Xperience 13 page builder" width="880" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, if there is a layout that a marketer wishes to have, they must go to the developers and describe their use case, from which the developers will need to prioritize a sprint to make it happen. This takes time and effort, delaying both the marketer and the developers' work and causing friction in the content pipeline. 😠&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter no-code xpandable sections
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/yuriys-kentico/Kentico.Xperience.AspNetCore.XpandableSection"&gt;Xpandable section&lt;/a&gt; is a way to avoid that friction. It is a section which allows a marketer to define how many and in which shape the section's widget zones are. It can be two columns, three columns, or a Sierpinski triangle of zones - there are no limits! 🚀&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ijY1xzkO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ajlexlw8j6hdr8uafb74.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ijY1xzkO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ajlexlw8j6hdr8uafb74.gif" alt="Xpandable section in action" width="880" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The marketer can change the direction of a group of widget zones, switching from horizontal to vertical, and can also name zones for easy identification. 🎉&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yADVwkuH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/moc4ojxyiq14291tx0i4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yADVwkuH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/moc4ojxyiq14291tx0i4.gif" alt="Changing direction and naming zones" width="447" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For styling, the direction, name, depth, and index of each widget zone show up as HTML classes, so targeting a specific zone or group of zones becomes straightforward. 💯&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FLyRAbSD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sjhk6f0c2rnt087lgiso.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FLyRAbSD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sjhk6f0c2rnt087lgiso.gif" alt="Writing styles targeting zones" width="880" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The section comes in a &lt;a href="https://www.nuget.org/packages/KenticoXperience.AspNetCore.XpandableSection"&gt;NuGet package&lt;/a&gt; (a shareable package of code) that a developer can install to your Kentico Xperience 13 project and then it becomes available in the page builder. After this one-time installation, no further developer assistance is needed. 👍&lt;/p&gt;

&lt;p&gt;The possibilities xtend beyond the horizon! ☀&lt;/p&gt;

&lt;p&gt;Let me know down below if you have any questions or would like to start a discussion!&lt;/p&gt;

</description>
      <category>kentico</category>
      <category>xperience</category>
      <category>wysiwyg</category>
      <category>nocode</category>
    </item>
    <item>
      <title>Kontent ♥ Svelte ♥ Custom elements</title>
      <dc:creator>Yuriy Sountsov</dc:creator>
      <pubDate>Wed, 24 Feb 2021 18:02:12 +0000</pubDate>
      <link>https://dev.to/yuriysountsov/kontent-svelte-custom-elements-5565</link>
      <guid>https://dev.to/yuriysountsov/kontent-svelte-custom-elements-5565</guid>
      <description>&lt;h6&gt;
  
  
  Photo by &lt;a href="https://unsplash.com/@clemhlrdt?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Clément Hélardot&lt;/a&gt; on &lt;a href="https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;
&lt;/h6&gt;

&lt;h1&gt;
  
  
  The power of Kontent
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets-us-01.kc-usercontent.com%2Fad858591-7c5b-00e9-52c1-796f3aebc535%2F9cb36347-1f14-400f-a802-dff06c9c7b47%2FCaaSPublishEverywhere.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets-us-01.kc-usercontent.com%2Fad858591-7c5b-00e9-52c1-796f3aebc535%2F9cb36347-1f14-400f-a802-dff06c9c7b47%2FCaaSPublishEverywhere.gif" alt="An animation of your content being published in many places at once."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kontent.ai/" rel="noopener noreferrer"&gt;Kontent&lt;/a&gt; is a headless CMS platform that allows enterprises to &lt;a href="https://kontent.ai/solutions/reach-more-customers" rel="noopener noreferrer"&gt;reach more customers&lt;/a&gt;, &lt;a href="https://kontent.ai/solutions/unify-content-across-your-business" rel="noopener noreferrer"&gt;unify content across the business&lt;/a&gt;, and &lt;a href="https://docs.kontent.ai/tutorials/what-is-content-as-a-service" rel="noopener noreferrer"&gt;structure content for future content needs&lt;/a&gt;, all in one place. As a headless CMS, all content delivery is API-driven, so the same content can show up on any device or channel. 🧠&lt;/p&gt;

&lt;p&gt;But what is content? How do you define content? Kontent solves this by creating a reliable structure of &lt;a href="https://docs.kontent.ai/tutorials/manage-kontent/content-modeling/create-and-delete-content-types" rel="noopener noreferrer"&gt;items composed of elements&lt;/a&gt;. The elements range from plain text to dates to tags to lists of references to other items. Nearly anything can be modeled by combining these elements like LEGO pieces to represent a website, a training manual, a sport directory, you name it. ✨&lt;/p&gt;

&lt;p&gt;With great power comes great exploration, and it sometimes happens that you want to model something outside of the known elements. Some examples are geolocation, a video, or a structured list of items. Kontent provides a way to model these and other types of content using &lt;a href="https://docs.kontent.ai/tutorials/develop-apps/integrate/content-editing-extensions" rel="noopener noreferrer"&gt;custom elements&lt;/a&gt;. 🎉&lt;/p&gt;

&lt;p&gt;Custom elements run on a host of your choice and only need a browser SDK to communicate with Kontent. This way they have their own UI and their own behavior, and give you freedom to model any content. We will come back to custom elements later... ⌚&lt;/p&gt;

&lt;h1&gt;
  
  
  The power of Svelte
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsvelte.dev%2Fsvelte-logo-horizontal.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsvelte.dev%2Fsvelte-logo-horizontal.svg" alt="Svelte logo."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/" rel="noopener noreferrer"&gt;Svelte&lt;/a&gt; is a state-of-the-art JavaScript application compiler that takes a lot of boilerplate out of writing browser apps so that you can focus on the reactive user experience. To learn more about Svelte check out &lt;a href="https://svelte.dev/tutorial/" rel="noopener noreferrer"&gt;the tutorial&lt;/a&gt; for a rundown of the basics. 🎓&lt;/p&gt;

&lt;p&gt;The best way to deliver a good user experience is to be extremely fast. But why repeat what has already been well said by the creator himself? Just give this a watch: 👀&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/AdNJ3fydeao"&gt;
&lt;/iframe&gt;
&lt;br&gt;
Along with Svelte comes &lt;a href="https://sapper.svelte.dev/" rel="noopener noreferrer"&gt;Sapper&lt;/a&gt;, an easy way to create static sites running Svelte. Sapper can also quickly deploy to &lt;a href="https://vercel.com/" rel="noopener noreferrer"&gt;Vercel&lt;/a&gt;, a modern app host with unlimited deployments. 🔮&lt;/p&gt;
&lt;h1&gt;
  
  
  By their powers combined...
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.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%2F7zgca6okjklvy7ch8ooj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F7zgca6okjklvy7ch8ooj.gif" alt="A heart with gears symbolizing the combination of Kontent and Svelte."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With Svelte, we have a way to rapidly create Kontent custom elements. While Svelte takes away the application boilerplate, there is still some boilerplate needed to make custom elements work - initialization, converting a rich object to a string value, reacting to changes in the context (e.g. we want to disable the element when the Kontent item is also disabled), and keeping up with &lt;a href="https://docs.kontent.ai/tutorials/introducing-new-and-improved-ui" rel="noopener noreferrer"&gt;the improving UI&lt;/a&gt;. 🤔&lt;/p&gt;
&lt;h4&gt;
  
  
  Introducing &lt;a href="https://www.npmjs.com/package/kontent-custom-element-app" rel="noopener noreferrer"&gt;&lt;code&gt;kontent-custom-element-app&lt;/code&gt;&lt;/a&gt;. 🎆
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;kontent-custom-element-app&lt;/code&gt; (KCEA for short) is a tool that maintains a template to make Kontent custom elements in Svelte as easy as a &lt;code&gt;.svelte&lt;/code&gt; component in the &lt;code&gt;src/routes/elements&lt;/code&gt; directory using &lt;code&gt;&amp;lt;CustomElement /&amp;gt;&lt;/code&gt; to wrap the component's HTML. 🌯&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;CustomElement&lt;/span&gt; &lt;span class="na"&gt;bind&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="na"&gt;bind&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;config&lt;/span&gt; &lt;span class="na"&gt;bind&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  // Inputs and values here...
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;CustomElement&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;KCEA comes with one starter custom element showing different ways to store custom values. It bundles four types of content: &lt;em&gt;text&lt;/em&gt;, &lt;em&gt;number&lt;/em&gt;, &lt;em&gt;date&lt;/em&gt;, and  &lt;em&gt;object&lt;/em&gt;: 🎭&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F7gb92qg8vigd48s42gzd.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F7gb92qg8vigd48s42gzd.gif" alt="An animation of the starter element in action."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;KCEA also optionally installs two sample custom elements that show more possibilities: &lt;em&gt;color&lt;/em&gt; and &lt;em&gt;list&lt;/em&gt;. ⚡&lt;/p&gt;

&lt;h1&gt;
  
  
  Would you like to know more?
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.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%2Firiv9tf8kn37kglc50q8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Firiv9tf8kn37kglc50q8.jpg" alt="A secret door inside a bookshelf."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Photo by &lt;a href="https://unsplash.com/@usinglight?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Stefan Steinbauer&lt;/a&gt; on &lt;a href="https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;
&lt;/h6&gt;

&lt;p&gt;KCEA comes with some bonus features!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VERCEL&lt;/strong&gt; - The template is already set up for deployment to Vercel. Just install the &lt;a href="https://vercel.com/download" rel="noopener noreferrer"&gt;Vercel CLI&lt;/a&gt; and then run &lt;code&gt;vercel&lt;/code&gt; in the root of the app. Follow the prompts and you'll be good to share the element outside of &lt;em&gt;localhost&lt;/em&gt;! 🌍&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TYPESCRIPT&lt;/strong&gt; - The template is also set up for TypeScript, and supports type annotation in components. It will evolve TypeScript support alongside Svelte's TypeScript support. It is a best practice to type &lt;code&gt;value&lt;/code&gt; and &lt;code&gt;config&lt;/code&gt; within your custom elements. 💪&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UPDATES&lt;/strong&gt; - When you update with &lt;code&gt;npm i kontent-custom-element-app&lt;/code&gt;, the tool will update template files that have not been changed, and let you know which ones have so you can merge changes manually. An example of what that looks like: 🔍
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  File at 'C:\ ... \src\routes\_layout.svelte' has been modified.
  Please manually merge changes from '_layout.svelte' into '_layout.svelte.new' and remove the '.new' extension.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;USEFUL STUFF&lt;/strong&gt; - &lt;code&gt;&amp;lt;CustomElement /&amp;gt;&lt;/code&gt; has two named slots: &lt;code&gt;loading&lt;/code&gt; and &lt;code&gt;invalid&lt;/code&gt;. They let you pass in anything that you want to show when the element is loading (between page load and custom element initialization) and when the element's route is visited outside of Kontent. KCEA comes with the components &lt;code&gt;&amp;lt;Loading /&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;Invalid /&amp;gt;&lt;/code&gt; to make these slots painless. KCEA also installs the following optional helpful things: 👍

&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;&amp;lt;Filter /&amp;gt;&lt;/code&gt; component, which is a filtering text input with autocomplete and other features.&lt;/li&gt;
&lt;li&gt;An &lt;code&gt;&amp;lt;ObjectTile /&amp;gt;&lt;/code&gt; component, which is styled to match asset references in Kontent and helps make custom elements blend into the Kontent UI.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;localStorage&lt;/code&gt; store to reactively store values in the browser's local storage.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;translate&lt;/code&gt; store to separate translations from the custom element presentation.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;property&lt;/code&gt; action to remove some boilerplate around CSS variables on HTML nodes.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;THE KONSERVATORY&lt;/strong&gt; - If you want some inspiration, the author maintains a site with many KCEA custom elements at &lt;a href="https://kentico-kontent-konservatory.vercel.app/elements" rel="noopener noreferrer"&gt;The Konservatory&lt;/a&gt;. The Konservatory itself runs on KCEA and thus hosts both a gallery and the elements themselves, showing how KCEA can be a base for more routes and more possibilities! 🤩&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  TL;DR Quickstart
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fxrx8xpxaaz8pt41r26hu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fxrx8xpxaaz8pt41r26hu.jpg" alt="A spirinter preparing to run."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Photo by &lt;a href="https://unsplash.com/@bradencollum?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Braden Collum&lt;/a&gt; on &lt;a href="https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;
&lt;/h6&gt;

&lt;p&gt;In an empty folder for the app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm init kontent-custom-element-app -n custom-element -s -r
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Want a basic custom element component to start with? Go to the &lt;code&gt;src/routes/elements&lt;/code&gt; directory and add this in a &lt;code&gt;.svelte&lt;/code&gt; file:&lt;/p&gt;

&lt;p&gt;
  Script, markup, and style code
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  import &lt;span class="si"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fade&lt;/span&gt; &lt;span class="si"&gt;}&lt;/span&gt; from "svelte/transition";

  import CustomElement from "../../shared/components/customElement/customElement.svelte";
  import Invalid from "../../shared/components/customElement/invalid.svelte";
  import Loading from "../../shared/components/loading.svelte";

  let value: string = "";
  let disabled: boolean;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&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;CustomElement&lt;/span&gt; &lt;span class="na"&gt;bind&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="na"&gt;bind&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;disabled&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="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"group column root"&lt;/span&gt; &lt;span class="na"&gt;transition&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;fade&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;input&lt;/span&gt;
      &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"input"&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&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;"Type here..."&lt;/span&gt;
      &lt;span class="na"&gt;bind&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;disabled&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="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;div&lt;/span&gt; &lt;span class="na"&gt;slot&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"loading"&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;Loading&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;slot&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"invalid"&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;Invalid&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;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;CustomElement&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;style&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  .root &lt;span class="si"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;background&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;linear&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nf"&gt;gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="mi"&gt;135&lt;/span&gt;&lt;span class="nx"&gt;deg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nf"&gt;hsl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;98&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nf"&gt;hsl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="o"&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;border&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="nx"&gt;em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="si"&gt;}&lt;/span&gt;

  input &lt;span class="si"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;style&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;/p&gt;

&lt;p&gt;Let me know down below if you have any questions or would like to start a discussion!&lt;/p&gt;

</description>
      <category>kontent</category>
      <category>svelte</category>
      <category>webdev</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
