<?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: Prabhu Murthy</title>
    <description>The latest articles on DEV Community by Prabhu Murthy (@prabhuignoto).</description>
    <link>https://dev.to/prabhuignoto</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%2F470010%2F6f627835-313c-4f5d-90c1-29327b0da87e.png</url>
      <title>DEV Community: Prabhu Murthy</title>
      <link>https://dev.to/prabhuignoto</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/prabhuignoto"/>
    <language>en</language>
    <item>
      <title>React Chrono v3.0: Redefining Timeline Components for Modern React</title>
      <dc:creator>Prabhu Murthy</dc:creator>
      <pubDate>Wed, 15 Oct 2025 10:27:24 +0000</pubDate>
      <link>https://dev.to/prabhuignoto/react-chrono-v30-redefining-timeline-components-for-modern-react-4h86</link>
      <guid>https://dev.to/prabhuignoto/react-chrono-v30-redefining-timeline-components-for-modern-react-4h86</guid>
      <description>&lt;h1&gt;
  
  
  React Chrono v3.0: A Complete Evolution
&lt;/h1&gt;

&lt;p&gt;We're thrilled to announce &lt;strong&gt;React Chrono v3.0&lt;/strong&gt;, the most significant release in the library's history. After months of development and a complete architectural overhaul, v3.0 delivers enhanced performance, developer experience, and a rich set of new features while maintaining backward compatibility with your existing code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's New at a Glance
&lt;/h2&gt;

&lt;p&gt;React Chrono v3.0 introduces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎨 &lt;strong&gt;Zero-runtime CSS&lt;/strong&gt; with Vanilla Extract migration&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Comprehensive internationalization&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🎭 &lt;strong&gt;Google Fonts integration&lt;/strong&gt; with per-element font control&lt;/li&gt;
&lt;li&gt;🖼️ &lt;strong&gt;Fullscreen mode&lt;/strong&gt; with cross-browser support&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;Grouped configuration API&lt;/strong&gt; for better developer experience&lt;/li&gt;
&lt;li&gt;🎪 &lt;strong&gt;Enhanced dark mode&lt;/strong&gt; with 36 theme properties (13 new in v3.0)&lt;/li&gt;
&lt;li&gt;📌 &lt;strong&gt;Sticky toolbar&lt;/strong&gt; for always-accessible controls&lt;/li&gt;
&lt;li&gt;🔍 &lt;strong&gt;Advanced search&lt;/strong&gt; with configurable dimensions&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🏗️ Architectural Overhaul
&lt;/h2&gt;

&lt;h3&gt;
  
  
  From Styled-Components to Vanilla Extract
&lt;/h3&gt;

&lt;p&gt;One of the most significant changes in v3.0 is the &lt;strong&gt;complete migration from styled-components to Vanilla Extract&lt;/strong&gt;. This migration brings substantial benefits to both performance and developer experience.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why Vanilla Extract?&lt;/strong&gt;&lt;br&gt;
Vanilla Extract generates static CSS at build time, resulting in zero runtime overhead. Your timeline components now load faster with smaller bundle sizes, while maintaining full TypeScript support and type-safe styling.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Performance improvements:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ &lt;strong&gt;Zero runtime&lt;/strong&gt; CSS-in-JS overhead&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Smaller bundle size&lt;/strong&gt; - no runtime style generation&lt;/li&gt;
&lt;li&gt;🚀 &lt;strong&gt;Faster initial render&lt;/strong&gt; - styles are pre-generated&lt;/li&gt;
&lt;li&gt;💪 &lt;strong&gt;Type-safe styles&lt;/strong&gt; - full TypeScript integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Before (styled-components):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TimelineCard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="s2"&gt;`
  background: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cardBgColor&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;;
  border-radius: 8px;
  padding: 1rem;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After (Vanilla Extract):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// timeline-card.css.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;style&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="s1"&gt;@vanilla-extract/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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;tokens&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="s1"&gt;../../styles/tokens&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;const&lt;/span&gt; &lt;span class="nx"&gt;card&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;style&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cardBackground&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;borderRadius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;medium&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;space&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&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;p&gt;The migration spans &lt;strong&gt;46+ CSS files&lt;/strong&gt; across the entire codebase, with styles organized into logical groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;src/styles/tokens/&lt;/code&gt; - Design tokens and theme variables&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/styles/sprinkles/&lt;/code&gt; - Utility-based styling system&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/styles/recipes/&lt;/code&gt; - Component variants and patterns&lt;/li&gt;
&lt;li&gt;Component-specific &lt;code&gt;*.css.ts&lt;/code&gt; files co-located with components&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Migration benefits for developers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All styles are type-checked at compile time&lt;/li&gt;
&lt;li&gt;IDE autocomplete for style properties&lt;/li&gt;
&lt;li&gt;Impossible to introduce invalid CSS&lt;/li&gt;
&lt;li&gt;Better refactoring support with TypeScript&lt;/li&gt;
&lt;li&gt;Improved debugging with static class names&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Unified Context Architecture
&lt;/h3&gt;

&lt;p&gt;v3.0 introduces a &lt;strong&gt;single optimized context provider&lt;/strong&gt; replacing multiple nested contexts, reducing re-renders and improving performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Old approach (multiple contexts):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TimelineStaticContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TimelineDynamicContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TimelineComputedContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* Component tree */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/TimelineComputedContext.Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/TimelineDynamicContext.Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/TimelineStaticContext.Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;New approach (unified context):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TimelineContextProvider&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* Component tree */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/TimelineContextProvider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The new context architecture organizes values into three logical groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Static Config&lt;/strong&gt; - Rarely changing configuration (theme, mode, layout settings)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic State&lt;/strong&gt; - Frequently changing state (activeItemIndex, slideshow state)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memoized Objects&lt;/strong&gt; - Computed values (handlers, derived state)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This results in &lt;strong&gt;fewer re-renders&lt;/strong&gt; and &lt;strong&gt;better performance&lt;/strong&gt; across the entire component tree.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ New Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🌐 Comprehensive Internationalization (i18n)
&lt;/h3&gt;

&lt;p&gt;v3.0 introduces a &lt;strong&gt;complete internationalization system&lt;/strong&gt; supporting &lt;strong&gt;60+ configurable text elements across 11 categories&lt;/strong&gt;, making React Chrono truly global-ready.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Full localization support&lt;/strong&gt;&lt;br&gt;
Every user-facing text in the timeline is now configurable, from navigation buttons to accessibility labels, search placeholders to keyboard help text.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Supported text categories:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigation controls (first, last, next, previous, play, pause)&lt;/li&gt;
&lt;li&gt;Search functionality (placeholder, results count, no results)&lt;/li&gt;
&lt;li&gt;Theme controls (dark mode, light mode, toggle theme)&lt;/li&gt;
&lt;li&gt;Layout modes (vertical, horizontal, alternating)&lt;/li&gt;
&lt;li&gt;Fullscreen (enter, exit, error messages)&lt;/li&gt;
&lt;li&gt;Quick jump navigation&lt;/li&gt;
&lt;li&gt;Content interactions (read more, show less, expand, collapse)&lt;/li&gt;
&lt;li&gt;Loading and status messages&lt;/li&gt;
&lt;li&gt;Accessibility labels (ARIA labels, screen reader text)&lt;/li&gt;
&lt;li&gt;View density controls&lt;/li&gt;
&lt;li&gt;Keyboard navigation help&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example - Spanish localization:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Chrono&lt;/span&gt;
  &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;i18n&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="na"&gt;texts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;navigation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ir al primer elemento&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;last&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ir al último elemento&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Siguiente elemento&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Elemento anterior&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;play&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Iniciar presentación&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;pause&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Pausar presentación&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;search&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Buscar en la línea de tiempo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;ariaLabel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Buscar contenido de la línea de tiempo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;clearLabel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Limpiar búsqueda&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;resultsCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;{current} de {total}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;noResults&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;No se encontraron resultados&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;darkMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Cambiar a modo oscuro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;lightMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Cambiar a modo claro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;accessibility&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;timelineNavigation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Navegación de línea de tiempo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;timelineItem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Elemento de línea de tiempo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;activeItem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Elemento activo de línea de tiempo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;itemPosition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Elemento {current} de {total}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;es&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ltr&lt;/span&gt;&lt;span class="dl"&gt;'&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;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Template string support:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The i18n system includes intelligent template string interpolation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Define template with placeholders&lt;/span&gt;
&lt;span class="nx"&gt;i18n&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;
  &lt;span class="na"&gt;texts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;search&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;resultsCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;{current} of {total}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;accessibility&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;itemPosition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Item {current} of {total}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}}&lt;/span&gt;

&lt;span class="c1"&gt;// Runtime: "3 of 15", "Item 5 of 20", etc.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Built-in utilities:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;mergeI18nConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;interpolateString&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="s1"&gt;@models/TimelineI18n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Merge custom config with defaults&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mergeI18nConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userConfig&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Interpolate template strings&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;interpolateString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;{current} of {total}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;current&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;total&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;// Result: "3 of 15"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🎭 Google Fonts Integration
&lt;/h3&gt;

&lt;p&gt;Dynamically load and apply Google Fonts with &lt;strong&gt;per-element font control&lt;/strong&gt; - set different weights, styles, and sizes for titles, card content, subtitles, and controls.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Granular typography control&lt;/strong&gt;&lt;br&gt;
Load a single Google Font family and configure different weights, styles, and sizes for each text element in your timeline.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Basic usage:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Chrono&lt;/span&gt;
  &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;style&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="na"&gt;googleFonts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;fontFamily&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Inter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;weights&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;700&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;swap&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;preconnect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&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;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Advanced - per-element configuration:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Chrono&lt;/span&gt;
  &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;style&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="na"&gt;googleFonts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;fontFamily&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Playfair Display&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bold&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// 700&lt;/span&gt;
          &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;normal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.5rem&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;cardTitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;semi-bold&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 600&lt;/span&gt;
          &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;italic&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.25rem&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;cardSubtitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;regular&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// 400&lt;/span&gt;
          &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;normal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1rem&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;cardText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="c1"&gt;// light&lt;/span&gt;
          &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;normal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0.95rem&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;controls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;medium&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// 500&lt;/span&gt;
          &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;normal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;swap&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;preconnect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&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;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Font loading features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatic preconnect to Google Fonts for faster loading&lt;/li&gt;
&lt;li&gt;Configurable &lt;code&gt;font-display&lt;/code&gt; strategy (&lt;code&gt;swap&lt;/code&gt;, &lt;code&gt;fallback&lt;/code&gt;, &lt;code&gt;optional&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Intelligent weight deduplication (only loads required weights)&lt;/li&gt;
&lt;li&gt;TypeScript-safe weight and style configuration&lt;/li&gt;
&lt;li&gt;Fallback font stack for better accessibility&lt;/li&gt;
&lt;li&gt;Support for both numeric (100-900) and named weights (&lt;code&gt;thin&lt;/code&gt;, &lt;code&gt;regular&lt;/code&gt;, &lt;code&gt;bold&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Generated CSS variables:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Google Fonts system automatically generates CSS variables for theming:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;--timeline-font-family&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"Inter"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;system-ui&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;sans-serif&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;--timeline-title-font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;700&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;--timeline-title-font-style&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;normal&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;--timeline-cardTitle-font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;600&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;--timeline-cardTitle-font-style&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;italic&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🖼️ Fullscreen Mode
&lt;/h3&gt;

&lt;p&gt;Experience timelines in immersive fullscreen mode with &lt;strong&gt;cross-browser support&lt;/strong&gt; (Chrome, Firefox, Safari, Edge).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Browser compatibility built-in&lt;/strong&gt;&lt;br&gt;
Fullscreen mode automatically handles vendor prefixes and browser-specific APIs, ensuring consistent behavior across all major browsers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Cross-browser support includes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Standard Fullscreen API&lt;/li&gt;
&lt;li&gt;WebKit prefixed API (Safari)&lt;/li&gt;
&lt;li&gt;Mozilla prefixed API (Firefox)&lt;/li&gt;
&lt;li&gt;MS prefixed API (Edge legacy)&lt;/li&gt;
&lt;li&gt;Automatic vendor prefix detection&lt;/li&gt;
&lt;li&gt;Feature detection for unsupported browsers&lt;/li&gt;
&lt;li&gt;Portal rendering to fullscreen element for overlays&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fullscreen-aware components:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Components like popover menus automatically detect fullscreen mode and portal to the correct container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Automatically portals to fullscreen element when active&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;portalContainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getFullscreenElement&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createPortal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;portalContainer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🎯 Grouped Configuration API
&lt;/h3&gt;

&lt;p&gt;Organize props into &lt;strong&gt;9 logical groups&lt;/strong&gt; for better discoverability and maintainability. The old flat API is still supported for backward compatibility.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Better developer experience&lt;/strong&gt;&lt;br&gt;
Props are now organized into intuitive groups: layout, interaction, content, display, media, animation, style, accessibility, and i18n.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Old API (still works):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Chrono&lt;/span&gt;
  &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;borderLessCards&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;disableNavOnKey&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;timelinePointDimension&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;parseDetailsAsHTML&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;mediaHeight&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;slideShow&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;slideItemDuration&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="si"&gt;}&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;strong&gt;New grouped API (recommended):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Chrono&lt;/span&gt;
  &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;display&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="na"&gt;borderless&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;pointShape&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;circle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;interaction&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="na"&gt;keyboardNavigation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;autoScroll&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;layout&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="na"&gt;pointSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cardWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;content&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="na"&gt;allowHTML&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;media&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="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cover&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;animation&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="na"&gt;slideshow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fade&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&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;strong&gt;Configuration groups:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;layout&lt;/code&gt;&lt;/strong&gt; - Sizing and positioning&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cardWidth&lt;/code&gt;, &lt;code&gt;cardHeight&lt;/code&gt;, &lt;code&gt;pointSize&lt;/code&gt;, &lt;code&gt;lineWidth&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;responsive.breakpoint&lt;/code&gt;, &lt;code&gt;positioning.cardPosition&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;interaction&lt;/code&gt;&lt;/strong&gt; - User interactions&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;keyboardNavigation&lt;/code&gt;, &lt;code&gt;pointClick&lt;/code&gt;, &lt;code&gt;autoScroll&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;focusOnLoad&lt;/code&gt;, &lt;code&gt;cardHover&lt;/code&gt;, &lt;code&gt;disabled&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;content&lt;/code&gt;&lt;/strong&gt; - Content handling&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;allowHTML&lt;/code&gt;, &lt;code&gt;readMore&lt;/code&gt;, &lt;code&gt;textOverlay&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dateFormat&lt;/code&gt;, &lt;code&gt;compactText&lt;/code&gt;, &lt;code&gt;semanticTags&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;display&lt;/code&gt;&lt;/strong&gt; - Visual appearance&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;borderless&lt;/code&gt;, &lt;code&gt;cardsDisabled&lt;/code&gt;, &lt;code&gt;pointsDisabled&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pointShape&lt;/code&gt;, &lt;code&gt;allCardsVisible&lt;/code&gt;, &lt;code&gt;scrollable&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;toolbar.enabled&lt;/code&gt;, &lt;code&gt;toolbar.position&lt;/code&gt;, &lt;code&gt;toolbar.sticky&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;media&lt;/code&gt;&lt;/strong&gt; - Media configuration&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;height&lt;/code&gt;, &lt;code&gt;align&lt;/code&gt;, &lt;code&gt;fit&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;animation&lt;/code&gt;&lt;/strong&gt; - Slideshow and animations&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;slideshow.enabled&lt;/code&gt;, &lt;code&gt;slideshow.duration&lt;/code&gt;, &lt;code&gt;slideshow.type&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;slideshow.autoStart&lt;/code&gt;, &lt;code&gt;slideshow.showProgress&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;style&lt;/code&gt;&lt;/strong&gt; - Custom styling&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;classNames&lt;/code&gt;, &lt;code&gt;fontSizes&lt;/code&gt;, &lt;code&gt;googleFonts&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;accessibility&lt;/code&gt;&lt;/strong&gt; - A11y and i18n&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;buttonTexts&lt;/code&gt;, &lt;code&gt;search&lt;/code&gt; labels&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;i18n&lt;/code&gt;&lt;/strong&gt; - Internationalization&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;texts&lt;/code&gt;, &lt;code&gt;locale&lt;/code&gt;, &lt;code&gt;direction&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;TypeScript autocomplete:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The grouped API provides excellent IDE autocomplete and type checking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Chrono&lt;/span&gt;
  &lt;span class="na"&gt;display&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="na"&gt;toolbar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;top&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bottom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// ✅ Type-safe&lt;/span&gt;
      &lt;span class="na"&gt;sticky&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;search&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;200px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;maxWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;400px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📌 Sticky Toolbar
&lt;/h3&gt;

&lt;p&gt;Pin the toolbar to the top or bottom of the viewport for &lt;strong&gt;always-accessible controls&lt;/strong&gt; during scrolling.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Chrono&lt;/span&gt;
  &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;display&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="na"&gt;toolbar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;top&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;sticky&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// 🆕 Sticky positioning&lt;/span&gt;
      &lt;span class="na"&gt;search&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;250px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;maxWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;400px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&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;The sticky toolbar maintains position during scroll, ensuring users always have access to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigation controls (first, previous, next, last)&lt;/li&gt;
&lt;li&gt;Slideshow controls (play, pause, stop)&lt;/li&gt;
&lt;li&gt;Dark mode toggle&lt;/li&gt;
&lt;li&gt;Layout switcher&lt;/li&gt;
&lt;li&gt;Search functionality&lt;/li&gt;
&lt;li&gt;Quick jump navigation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔍 Enhanced Search Configuration
&lt;/h3&gt;

&lt;p&gt;Fine-tune search input dimensions and positioning with &lt;strong&gt;granular width controls&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Chrono&lt;/span&gt;
  &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;display&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="na"&gt;toolbar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;search&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;200px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;// Default search section width&lt;/span&gt;
        &lt;span class="na"&gt;maxWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;400px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// Maximum expansion width&lt;/span&gt;
        &lt;span class="na"&gt;minWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;150px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// Minimum width&lt;/span&gt;
        &lt;span class="na"&gt;inputWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;180px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// Actual input field width&lt;/span&gt;
        &lt;span class="na"&gt;inputMaxWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;350px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// Maximum input expansion&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&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;strong&gt;Search features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time highlighting of matches&lt;/li&gt;
&lt;li&gt;Navigate between matches with Enter/Shift+Enter&lt;/li&gt;
&lt;li&gt;Results counter (&lt;code&gt;{current} of {total}&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Clear search button&lt;/li&gt;
&lt;li&gt;Configurable placeholder and ARIA labels (via i18n)&lt;/li&gt;
&lt;li&gt;Case-insensitive search&lt;/li&gt;
&lt;li&gt;Search across title, subtitle, and card content&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎪 Enhanced Dark Mode
&lt;/h3&gt;

&lt;p&gt;v3.0 introduces &lt;strong&gt;36 comprehensive theme properties&lt;/strong&gt; (including 13 new dark mode-specific properties) for complete customization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enhanced theme system:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Chrono&lt;/span&gt;
  &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;theme&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="na"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#3b82f6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;secondary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#1e40af&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c1"&gt;// Card theming&lt;/span&gt;
    &lt;span class="na"&gt;cardBgColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#1f2937&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cardForeColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#f3f4f6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c1"&gt;// Enhanced dark mode properties&lt;/span&gt;
    &lt;span class="na"&gt;iconColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#9ca3af&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;buttonHoverBgColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#374151&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;shadowColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rgba(0, 0, 0, 0.5)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;glowColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#3b82f6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c1"&gt;// Timeline elements&lt;/span&gt;
    &lt;span class="na"&gt;titleColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#f9fafb&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;titleColorActive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#3b82f6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cardTitleColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#e5e7eb&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cardSubtitleColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#9ca3af&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cardDetailsColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#d1d5db&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c1"&gt;// Interactive elements&lt;/span&gt;
    &lt;span class="na"&gt;focusRingColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#3b82f6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;borderColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#374151&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;darkMode&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="na"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;showToggle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;onThemeChange&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="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Theme changed:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;);&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;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Theme callback:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React to theme changes programmatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Chrono&lt;/span&gt;
  &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;darkMode&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="na"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;showToggle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;onThemeChange&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="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Persist preference&lt;/span&gt;
    &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;timeline-theme&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="c1"&gt;// Update app-level theme&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toggle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark-mode&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isDark&lt;/span&gt;&lt;span class="p"&gt;);&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;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🐛 Bug Fixes and Improvements
&lt;/h2&gt;

&lt;p&gt;v3.0 includes &lt;strong&gt;numerous bug fixes&lt;/strong&gt; and quality-of-life improvements based on community feedback:&lt;/p&gt;

&lt;h3&gt;
  
  
  Navigation and Slideshow
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Fixed slideshow media deadlock causing frozen animations&lt;/li&gt;
&lt;li&gt;✅ Resolved keyboard navigation conflicts with slideshow&lt;/li&gt;
&lt;li&gt;✅ Improved slideshow card scrolling behavior&lt;/li&gt;
&lt;li&gt;✅ Standardized icon dimensions across all controls&lt;/li&gt;
&lt;li&gt;✅ Fixed slideshow not respecting pause state&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Layout and Positioning
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Fixed popover positioning in fullscreen mode&lt;/li&gt;
&lt;li&gt;✅ Improved responsive breakpoint behavior for vertical alternating mode&lt;/li&gt;
&lt;li&gt;✅ Resolved nested timeline rendering issues&lt;/li&gt;
&lt;li&gt;✅ Fixed icon positioning in alternating mode&lt;/li&gt;
&lt;li&gt;✅ Better card remeasurement on text density changes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Styling and Theming
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Fixed theme color inheritance issues&lt;/li&gt;
&lt;li&gt;✅ Improved text overlay color handling&lt;/li&gt;
&lt;li&gt;✅ Better dark mode CSS variable support&lt;/li&gt;
&lt;li&gt;✅ Resolved horizontal timeline point sizing&lt;/li&gt;
&lt;li&gt;✅ Enhanced list and popover responsive styles&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Performance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Reduced unnecessary re-renders with optimized context&lt;/li&gt;
&lt;li&gt;✅ Improved bundle size with Vanilla Extract migration&lt;/li&gt;
&lt;li&gt;✅ Better lazy loading for media elements&lt;/li&gt;
&lt;li&gt;✅ Optimized font loading with preconnect&lt;/li&gt;
&lt;li&gt;✅ Faster initial render times&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📦 Migration Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For Existing Users
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Good news!&lt;/strong&gt; v3.0 maintains &lt;strong&gt;full backward compatibility&lt;/strong&gt;. Your existing code will continue to work without changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Immediate benefits (no code changes required):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ Faster performance (Vanilla Extract)&lt;/li&gt;
&lt;li&gt;📦 Smaller bundle size&lt;/li&gt;
&lt;li&gt;🐛 Bug fixes automatically applied&lt;/li&gt;
&lt;li&gt;🎨 Enhanced theming with new dark mode properties&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Recommended: Migrate to grouped API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While the old flat API still works, we recommend migrating to the new grouped API for better maintainability:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Migration example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before (v2.x)&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Chrono&lt;/span&gt;
  &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;borderLessCards&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;disableNavOnKey&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;timelinePointDimension&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;parseDetailsAsHTML&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;mediaHeight&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;slideShow&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;slideItemDuration&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;showProgressOnSlideshow&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;disableToolbar&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;toolbarPosition&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"top"&lt;/span&gt;
&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c1"&gt;// After (v3.0 - recommended)&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Chrono&lt;/span&gt;
  &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;display&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="na"&gt;borderless&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;toolbar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;top&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;interaction&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="na"&gt;keyboardNavigation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;layout&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="na"&gt;pointSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;content&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="na"&gt;allowHTML&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;media&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="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;animation&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="na"&gt;slideshow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;showProgress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&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;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Deprecated props mapping:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Old Prop (v2.x)&lt;/th&gt;
&lt;th&gt;New Prop (v3.0)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;borderLessCards&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;display.borderless&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;disableNavOnKey&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;interaction.keyboardNavigation&lt;/code&gt; (inverted)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;timelinePointDimension&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;layout.pointSize&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;parseDetailsAsHTML&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;content.allowHTML&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mediaHeight&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;media.height&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;slideShow&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;animation.slideshow.enabled&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;slideItemDuration&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;animation.slideshow.duration&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;disableToolbar&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;display.toolbar.enabled&lt;/code&gt; (inverted)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;toolbarPosition&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;display.toolbar.position&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;useReadMore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;content.readMore&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;highlightCardsOnHover&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;interaction.cardHover&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;buttonTexts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;accessibility.buttonTexts&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;TypeScript support:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All deprecated props are still typed and will show deprecation warnings with suggestions for new props:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// TypeScript will show:&lt;/span&gt;
&lt;span class="c1"&gt;// ⚠️ 'borderLessCards' is deprecated. Use 'display.borderless' instead.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  New Project Setup
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Installation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&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;react-chrono@latest
&lt;span class="c"&gt;# or&lt;/span&gt;
pnpm add react-chrono@latest
&lt;span class="c"&gt;# or&lt;/span&gt;
yarn add react-chrono@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Minimal setup:&lt;/strong&gt;&lt;br&gt;
&lt;/p&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;Chrono&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="s1"&gt;react-chrono&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;items&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="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;January 2024&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cardTitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Project Kickoff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cardDetailedText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Started the new initiative with the team&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;February 2024&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cardTitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;First Milestone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cardDetailedText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Completed initial design and architecture&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="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;Chrono&lt;/span&gt; &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"vertical"&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;p&gt;&lt;strong&gt;Recommended setup with new features:&lt;/strong&gt;&lt;br&gt;
&lt;/p&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;Chrono&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="s1"&gt;react-chrono&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;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...];&lt;/span&gt; &lt;span class="c1"&gt;// Your timeline items&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;Chrono&lt;/span&gt;
      &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"vertical"&lt;/span&gt;

      &lt;span class="c1"&gt;// Enhanced theming&lt;/span&gt;
      &lt;span class="na"&gt;theme&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="na"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#3b82f6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;cardBgColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#ffffff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;cardForeColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#1f2937&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;

      &lt;span class="c1"&gt;// Dark mode with toggle&lt;/span&gt;
      &lt;span class="na"&gt;darkMode&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="na"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;showToggle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;

      &lt;span class="c1"&gt;// Google Fonts&lt;/span&gt;
      &lt;span class="na"&gt;style&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="na"&gt;googleFonts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;fontFamily&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Inter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;weights&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;700&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;swap&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;

      &lt;span class="c1"&gt;// Sticky toolbar with search&lt;/span&gt;
      &lt;span class="na"&gt;display&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="na"&gt;toolbar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;top&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;sticky&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;search&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;250px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;maxWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;400px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;

      &lt;span class="c1"&gt;// Internationalization&lt;/span&gt;
      &lt;span class="na"&gt;i18n&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="na"&gt;texts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;search&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Search Timeline&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;

      &lt;span class="c1"&gt;// Enhanced interactions&lt;/span&gt;
      &lt;span class="na"&gt;interaction&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="na"&gt;keyboardNavigation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;autoScroll&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;cardHover&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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;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;
  
  
  🎯 What's Next
&lt;/h2&gt;

&lt;p&gt;We're committed to continuous improvement of React Chrono. Here's what's on the roadmap:&lt;/p&gt;

&lt;h3&gt;
  
  
  Upcoming Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🌍 Additional pre-built i18n locale packages (French, German, Spanish, Japanese)&lt;/li&gt;
&lt;li&gt;📱 Enhanced mobile gestures (swipe navigation)&lt;/li&gt;
&lt;li&gt;📊 Timeline data visualization modes (Gantt-style, density view)&lt;/li&gt;
&lt;li&gt;🎭 More animation presets for slideshow&lt;/li&gt;
&lt;li&gt;📸 Image gallery mode with lightbox&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Community
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;📚 Comprehensive Storybook documentation&lt;/li&gt;
&lt;li&gt;🎓 Video tutorials and guides&lt;/li&gt;
&lt;li&gt;🏗️ Real-world example projects&lt;/li&gt;
&lt;li&gt;💬 Community showcase gallery&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🙏 Acknowledgments
&lt;/h2&gt;

&lt;p&gt;React Chrono v3.0 is the result of months of work, feedback from the community, and contributions from developers worldwide. A special thanks to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All &lt;strong&gt;contributors&lt;/strong&gt; who submitted issues, PRs, and feedback&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Vanilla Extract team&lt;/strong&gt; for the excellent CSS-in-TypeScript framework&lt;/li&gt;
&lt;li&gt;Everyone using React Chrono in &lt;strong&gt;production applications&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📚 Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/prabhuignoto/react-chrono" rel="noopener noreferrer"&gt;react-chrono&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NPM:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/react-chrono" rel="noopener noreferrer"&gt;react-chrono&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Demo Site:&lt;/strong&gt; Run &lt;code&gt;pnpm dev&lt;/code&gt; for local demos&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 Get Started Today
&lt;/h2&gt;

&lt;p&gt;Upgrade to React Chrono v3.0 and experience the next generation of timeline components:&lt;br&gt;
&lt;/p&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;react-chrono@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can't wait to see what you build with React Chrono v3.0! If you have questions, feedback, or want to showcase your timeline, join us on &lt;a href="https://github.com/prabhuignoto/react-chrono/discussions" rel="noopener noreferrer"&gt;GitHub Discussions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Happy timeline building! 🎉&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 Feedback &amp;amp; Support
&lt;/h2&gt;

&lt;p&gt;We value your feedback and want to make React Chrono better for everyone. Here's how you can get help or contribute:&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Bug Reports &amp;amp; Feature Requests
&lt;/h3&gt;

&lt;p&gt;Found a bug or have an idea for a new feature?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Report issues:&lt;/strong&gt; &lt;a href="https://github.com/prabhuignoto/react-chrono/issues" rel="noopener noreferrer"&gt;GitHub Issues&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feature requests:&lt;/strong&gt; &lt;a href="https://github.com/prabhuignoto/react-chrono/discussions/categories/ideas" rel="noopener noreferrer"&gt;GitHub Discussions - Ideas&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💡 Questions &amp;amp; Help
&lt;/h3&gt;

&lt;p&gt;Need help using React Chrono?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ask questions:&lt;/strong&gt; &lt;a href="https://github.com/prabhuignoto/react-chrono/discussions/categories/q-a" rel="noopener noreferrer"&gt;GitHub Discussions - Q&amp;amp;A&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browse documentation:&lt;/strong&gt; &lt;a href="//./PROPS-REFERENCE.md"&gt;Props Reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check examples:&lt;/strong&gt; Run &lt;code&gt;pnpm dev&lt;/code&gt; to see live demos locally&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🤝 Contributing
&lt;/h3&gt;

&lt;p&gt;We welcome contributions from the community!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code contributions:&lt;/strong&gt; Check out open issues labeled &lt;a href="https://github.com/prabhuignoto/react-chrono/labels/good%20first%20issue" rel="noopener noreferrer"&gt;good first issue&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation:&lt;/strong&gt; Help improve our docs and examples&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing:&lt;/strong&gt; Add test coverage or report edge cases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spread the word:&lt;/strong&gt; Star the repo ⭐ and share with others&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See our &lt;a href="https://github.com/prabhuignoto/react-chrono/blob/master/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contributing Guidelines&lt;/a&gt; for more details.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌟 Show Your Support
&lt;/h3&gt;

&lt;p&gt;If React Chrono has been helpful in your projects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ &lt;strong&gt;Star the repository&lt;/strong&gt; on &lt;a href="https://github.com/prabhuignoto/react-chrono" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐦 &lt;strong&gt;Share your projects&lt;/strong&gt; using #ReactChrono on social media&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;Join the discussion&lt;/strong&gt; and help others in the community&lt;/li&gt;
&lt;li&gt;☕ &lt;strong&gt;Sponsor development&lt;/strong&gt; via &lt;a href="https://github.com/sponsors/prabhuignoto" rel="noopener noreferrer"&gt;GitHub Sponsors&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Thank you for using React Chrono! Your feedback drives our development and helps us build a better library for everyone. 🙏&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>react</category>
      <category>javascript</category>
    </item>
    <item>
      <title>🚀 React Chrono: Supercharge Your Timelines with Powerful New Features!</title>
      <dc:creator>Prabhu Murthy</dc:creator>
      <pubDate>Sun, 08 Jun 2025 13:54:25 +0000</pubDate>
      <link>https://dev.to/prabhuignoto/react-chrono-supercharge-your-timelines-with-powerful-new-features-4olg</link>
      <guid>https://dev.to/prabhuignoto/react-chrono-supercharge-your-timelines-with-powerful-new-features-4olg</guid>
      <description>&lt;p&gt;Hey developers! 👋&lt;/p&gt;

&lt;p&gt;Get ready to take your timeline experiences to the next level! We're thrilled to announce the latest release of &lt;strong&gt;React Chrono&lt;/strong&gt;, packed with a host of exciting new features, performance enhancements, and developer experience improvements. If you're building interactive, engaging timelines in your React applications, you're going to love these updates.&lt;/p&gt;

&lt;p&gt;React Chrono has always aimed to make beautiful, responsive timelines easy to create. With the new release, we've listened to your feedback and pushed the boundaries further. Let's dive into what's new!&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Enhanced Search Functionality: Find Events in a Flash
&lt;/h2&gt;

&lt;p&gt;Navigating through extensive timelines is now smoother and more intuitive than ever. Our revamped search functionality is designed for speed and usability.&lt;/p&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%2Fij27l82wy1s1ygffr3bg.png" 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%2Fij27l82wy1s1ygffr3bg.png" alt="search" width="800" height="67"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✨ &lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚀 &lt;strong&gt;Smart &amp;amp; Performant&lt;/strong&gt;: Search queries are debounced, ensuring a fluid experience without performance hiccups&lt;/li&gt;
&lt;li&gt;🔤 &lt;strong&gt;Case-Insensitive Matching&lt;/strong&gt;: Finds what users are looking for, regardless of casing
&lt;/li&gt;
&lt;li&gt;⌨️ &lt;strong&gt;Keyboard Navigation&lt;/strong&gt;: Easy cycling through search results using keyboard shortcuts&lt;/li&gt;
&lt;li&gt;💾 &lt;strong&gt;Persistent Search State&lt;/strong&gt;: Search query remains active during navigation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💻 Implementation Example
&lt;/h3&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;Chrono&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="s1"&gt;react-chrono&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="nx"&gt;myTimelineItems&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./items&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Your timeline items&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&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="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="na"&gt;style&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="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100%&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;95vh&lt;/span&gt;&lt;span class="dl"&gt;"&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;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Chrono&lt;/span&gt;
      &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;myTimelineItems&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"VERTICAL_ALTERNATING"&lt;/span&gt;
      &lt;span class="c1"&gt;// 🎯 Search is built into the toolbar by default!&lt;/span&gt;
      &lt;span class="c1"&gt;// No special props needed - just start typing in the search box&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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📋 &lt;strong&gt;Search Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔍 &lt;strong&gt;Built-in search box&lt;/strong&gt; in the timeline toolbar&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;150ms debounce&lt;/strong&gt; (with 500ms maxWait) for smooth performance &lt;/li&gt;
&lt;li&gt;🔤 &lt;strong&gt;Case-insensitive search&lt;/strong&gt; across titles and content&lt;/li&gt;
&lt;li&gt;⌨️ &lt;strong&gt;Keyboard navigation&lt;/strong&gt;: Enter to go to next result, Escape to clear search&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;Automatic highlighting&lt;/strong&gt; of matching timeline items&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes your timelines more accessible and user-friendly, especially for data-rich scenarios.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌙 Comprehensive Dark Mode Support: Style It Your Way
&lt;/h2&gt;

&lt;p&gt;Dark mode is no longer just a trend; it's a user expectation. React Chrono's new release introduces a vastly improved dark mode experience with deep customization.&lt;/p&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%2F0vfizwhcot1xkoqiq5k6.png" 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%2F0vfizwhcot1xkoqiq5k6.png" alt="dark-mode" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🎨 &lt;strong&gt;Enhanced Dark Mode Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎛️ &lt;strong&gt;15+ Configurable Properties&lt;/strong&gt;: Tailor every aspect of the dark theme&lt;/li&gt;
&lt;li&gt;🔄 &lt;strong&gt;Automatic System Preference Detection&lt;/strong&gt;: Seamlessly adapts to user's OS-level color scheme&lt;/li&gt;
&lt;li&gt;✨ &lt;strong&gt;Smooth Transitions&lt;/strong&gt;: Elegant animated transitions when switching themes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎨 Custom Dark Theme Example
&lt;/h3&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;Chrono&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Theme&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="s1"&gt;react-chrono&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="nx"&gt;myTimelineItems&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./items&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;customDarkTheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#00bfff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;// 🔵 Vibrant blue for accents&lt;/span&gt;
  &lt;span class="na"&gt;secondary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#888888&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;// 🔘 Lighter grey for secondary elements&lt;/span&gt;
  &lt;span class="na"&gt;cardBgColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#2c2c2c&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// 🌚 Darker card background&lt;/span&gt;
  &lt;span class="na"&gt;cardForeColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#f5f5f5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// 💡 Light text on cards&lt;/span&gt;
  &lt;span class="na"&gt;titleColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#00bfff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// 📝 Title color matching primary&lt;/span&gt;
  &lt;span class="na"&gt;titleColorActive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#ffffff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// ⭐ Active title color&lt;/span&gt;
  &lt;span class="na"&gt;iconColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#00bfff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;// 🎯 Icon accent color&lt;/span&gt;
  &lt;span class="c1"&gt;// ... and many more properties to explore!&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;App&lt;/span&gt; &lt;span class="o"&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="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="na"&gt;style&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="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100%&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;95vh&lt;/span&gt;&lt;span class="dl"&gt;"&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;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Chrono&lt;/span&gt;
      &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;myTimelineItems&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"VERTICAL_ALTERNATING"&lt;/span&gt;
      &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;customDarkTheme&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;     &lt;span class="c1"&gt;// 🎨 Apply your custom theme&lt;/span&gt;
      &lt;span class="na"&gt;enableDarkToggle&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;     &lt;span class="c1"&gt;// 🌙 Enable dark mode toggle 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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🖱️ Improved User Experience: Intuitive Interactions
&lt;/h2&gt;

&lt;p&gt;React Chrono's new release introduces several UX enhancements to make timeline interaction more intuitive and accessible:&lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;UX Enhancement Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⌨️ &lt;strong&gt;Enhanced Keyboard Navigation&lt;/strong&gt;: Navigate through timeline items using arrow keys for better accessibility&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;Smooth Scrolling&lt;/strong&gt;: Refined scrolling behavior with improved inertia and snap points&lt;/li&gt;
&lt;li&gt;📱 &lt;strong&gt;Responsive Controls&lt;/strong&gt;: Timeline controls automatically adapt to different screen sizes and orientations&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Tooltips &amp;amp; Visual Cues&lt;/strong&gt;: Helpful tooltips and visual indicators to guide users through interactions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎮 Customized Controls Example
&lt;/h3&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;Chrono&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="s1"&gt;react-chrono&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="nx"&gt;myTimelineItems&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./items&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;App&lt;/span&gt; &lt;span class="o"&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="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="na"&gt;style&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="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100%&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;95vh&lt;/span&gt;&lt;span class="dl"&gt;"&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;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Chrono&lt;/span&gt;
      &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;myTimelineItems&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"VERTICAL_ALTERNATING"&lt;/span&gt;
      &lt;span class="na"&gt;enableQuickJump&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;        &lt;span class="c1"&gt;// 🎯 Enable outline for easier navigation&lt;/span&gt;
      &lt;span class="na"&gt;disableNavOnKey&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;       &lt;span class="c1"&gt;// ⌨️ Enable keyboard navigation  &lt;/span&gt;
      &lt;span class="na"&gt;allowDynamicUpdate&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;     &lt;span class="c1"&gt;// 🔄 Allow dynamic updates to timeline&lt;/span&gt;
      &lt;span class="na"&gt;highlightCardsOnHover&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;// ✨ Highlight cards on mouse hover&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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These improvements make React Chrono timelines more accessible and user-friendly, resulting in a smoother experience across devices.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Advanced Animation System: Bring Your Timelines to Life
&lt;/h2&gt;

&lt;p&gt;Engage your users with smoother, more dynamic timeline presentations.&lt;/p&gt;

&lt;p&gt;🎭 &lt;strong&gt;Animation Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎨 &lt;strong&gt;Built-in Animation Types&lt;/strong&gt;: Choose from &lt;code&gt;reveal&lt;/code&gt;, &lt;code&gt;slide_in&lt;/code&gt;, and &lt;code&gt;slide_from_sides&lt;/code&gt; animations&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;Mode-Specific Defaults&lt;/strong&gt;: Animations are automatically optimized for different timeline modes:

&lt;ul&gt;
&lt;li&gt;📱 &lt;strong&gt;VERTICAL&lt;/strong&gt;: Uses &lt;code&gt;reveal&lt;/code&gt; animation with subtle scale and opacity transitions&lt;/li&gt;
&lt;li&gt;🔄 &lt;strong&gt;VERTICAL_ALTERNATING&lt;/strong&gt;: Uses &lt;code&gt;slide_from_sides&lt;/code&gt; with directional sliding effects&lt;/li&gt;
&lt;li&gt;➡️ &lt;strong&gt;HORIZONTAL&lt;/strong&gt;: Uses &lt;code&gt;slide_in&lt;/code&gt; animation with smooth top-to-bottom transitions&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;⏱️ &lt;strong&gt;Slideshow Integration&lt;/strong&gt;: Smooth 0.5s animation duration with ease-in-out timing&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎬 Slideshow Configuration Example
&lt;/h3&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;Chrono&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="s1"&gt;react-chrono&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="nx"&gt;myTimelineItems&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./items&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;App&lt;/span&gt; &lt;span class="o"&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="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="na"&gt;style&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="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100%&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;95vh&lt;/span&gt;&lt;span class="dl"&gt;"&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;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Chrono&lt;/span&gt;
      &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;myTimelineItems&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"VERTICAL_ALTERNATING"&lt;/span&gt;
      &lt;span class="na"&gt;slideShow&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;                    &lt;span class="c1"&gt;// 🎥 Enable slideshow mode&lt;/span&gt;
      &lt;span class="na"&gt;slideItemDuration&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;            &lt;span class="c1"&gt;// ⏰ 3 seconds per slide&lt;/span&gt;
      &lt;span class="na"&gt;slideShowType&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"slide_from_sides"&lt;/span&gt;    &lt;span class="c1"&gt;// 🎯 Optional: override default animation&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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📋 &lt;strong&gt;Animation Types Available:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎭 &lt;strong&gt;reveal&lt;/strong&gt;: Scale and fade-in effect (default for VERTICAL mode)&lt;/li&gt;
&lt;li&gt;↗️ &lt;strong&gt;slide_in&lt;/strong&gt;: Slide from top (default for HORIZONTAL mode) &lt;/li&gt;
&lt;li&gt;↔️ &lt;strong&gt;slide_from_sides&lt;/strong&gt;: Directional sliding (default for VERTICAL_ALTERNATING mode)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔗 Nested Timeline Support: For Complex Narratives
&lt;/h2&gt;

&lt;p&gt;Sometimes, a single layer isn't enough. React Chrono's new release introduces the ability to nest timelines within timeline cards, perfect for:&lt;/p&gt;

&lt;p&gt;📋 &lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📊 &lt;strong&gt;Detailed project breakdowns&lt;/strong&gt; (phases containing tasks)&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;In-depth historical accounts&lt;/strong&gt; (eras containing specific events)
&lt;/li&gt;
&lt;li&gt;📖 &lt;strong&gt;Multi-layered storytelling&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🌳 Nested Timeline Structure Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// In your items.ts or similar&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parentItems&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="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Q1 2025: Project Alpha Launch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cardDetailedText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Overview of the Project Alpha initiative and its successful launch.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// 🎯 Define nested timeline items using the 'items' property&lt;/span&gt;
    &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jan: Kick-off&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="na"&gt;cardDetailedText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Initial planning and team assembly.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Feb: Development Sprint 1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="na"&gt;cardDetailedText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Core features developed.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Mar: UAT &amp;amp; Launch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="na"&gt;cardDetailedText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User testing and go-live.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="c1"&gt;// ... more parent items&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="c1"&gt;// In your App.tsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Chrono&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="s1"&gt;react-chrono&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;App&lt;/span&gt; &lt;span class="o"&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="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="na"&gt;style&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="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100%&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;95vh&lt;/span&gt;&lt;span class="dl"&gt;"&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;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Chrono&lt;/span&gt;
      &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;parentItems&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"VERTICAL_ALTERNATING"&lt;/span&gt;
      &lt;span class="na"&gt;nestedCardHeight&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// 📏 Optional: control height of nested timeline cards&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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🚀 This powerful feature opens up new possibilities for presenting complex, hierarchical information. The nested timelines are automatically detected when timeline items contain an &lt;code&gt;items&lt;/code&gt; array property.&lt;/p&gt;




&lt;h2&gt;
  
  
  🖼️ Improved Media Handling: Better Alignment and Display
&lt;/h2&gt;

&lt;p&gt;Displaying images and videos in your timelines now offers more control over layout and presentation.&lt;/p&gt;

&lt;p&gt;🎨 &lt;strong&gt;Media Enhancement Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📐 &lt;strong&gt;Media Alignment&lt;/strong&gt;: Control how media content is positioned within timeline cards&lt;/li&gt;
&lt;li&gt;🖼️ &lt;strong&gt;Media Fit&lt;/strong&gt;: Configure how media content should fit within its container (similar to CSS object-fit)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📸 Media Configuration Example
&lt;/h3&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;Chrono&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="s1"&gt;react-chrono&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="nx"&gt;itemsWithMedia&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./itemsWithMedia&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Your items with media objects&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&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="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="na"&gt;style&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="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100%&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;95vh&lt;/span&gt;&lt;span class="dl"&gt;"&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;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Chrono&lt;/span&gt;
      &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;itemsWithMedia&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"VERTICAL"&lt;/span&gt;
      &lt;span class="na"&gt;mediaSettings&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="na"&gt;align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;center&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// 📍 'left', 'right', or 'center'&lt;/span&gt;
        &lt;span class="na"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cover&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;      &lt;span class="c1"&gt;// 🖼️ 'cover', 'contain', 'fill', or '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;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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📋 &lt;strong&gt;Available Options:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Alignment&lt;/strong&gt;: &lt;code&gt;left&lt;/code&gt; | &lt;code&gt;right&lt;/code&gt; | &lt;code&gt;center&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fit&lt;/strong&gt;: &lt;code&gt;cover&lt;/code&gt; | &lt;code&gt;contain&lt;/code&gt; | &lt;code&gt;fill&lt;/code&gt; | &lt;code&gt;none&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡️ Significant Performance Optimizations: Smooth Sailing for Large Datasets
&lt;/h2&gt;

&lt;p&gt;We've dived deep under the hood to make React Chrono faster and more memory-efficient, especially when dealing with a large number of timeline items.&lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;Performance Enhancements:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎯 &lt;strong&gt;Outline Virtualization&lt;/strong&gt;: Timeline outline items are virtualized to improve performance with many timeline points&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Memory Leak Fixes&lt;/strong&gt;: More robust cleanup of event listeners and internal states&lt;/li&gt;
&lt;li&gt;🔄 &lt;strong&gt;Optimized Re-renders&lt;/strong&gt;: Reduced unnecessary component updates&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Smaller Bundle Size&lt;/strong&gt;: Continued efforts to keep the library lean&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📊 Large Dataset Optimization Example
&lt;/h3&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;Chrono&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="s1"&gt;react-chrono&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="nx"&gt;veryLargeDataset&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./veryLargeDataset&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 1000+ items&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&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="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="na"&gt;style&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="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100%&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;95vh&lt;/span&gt;&lt;span class="dl"&gt;"&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;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Chrono&lt;/span&gt;
      &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;veryLargeDataset&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"VERTICAL"&lt;/span&gt;
      &lt;span class="na"&gt;scrollable&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="na"&gt;scrollbar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// 📜 Enable scrolling for long content&lt;/span&gt;
      &lt;span class="na"&gt;enableQuickJump&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;           &lt;span class="c1"&gt;// 🎯 Enable quick navigation for large datasets&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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎯 Users with extensive timelines will notice a significant improvement in responsiveness and load times, particularly in the timeline outline navigation.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Developer Experience Enhancements: Build Better, Faster
&lt;/h2&gt;

&lt;p&gt;We care about your productivity and the robustness of your applications.&lt;/p&gt;

&lt;p&gt;👨‍💻 &lt;strong&gt;Developer Experience Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📝 &lt;strong&gt;Enhanced TypeScript Support&lt;/strong&gt;: More comprehensive and accurate type definitions for props, theme objects, item models, and internal structures&lt;/li&gt;
&lt;li&gt;🔍 &lt;strong&gt;Better Autocompletion&lt;/strong&gt;: Improved IDE integration with better type checking and fewer runtime errors&lt;/li&gt;
&lt;li&gt;🚨 &lt;strong&gt;Improved Error Handling&lt;/strong&gt;: More descriptive error messages and graceful degradation when issues occur&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💻 TypeScript Integration Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;Chrono&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;TimelineItemModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;TimelineMode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Theme&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="s1"&gt;react-chrono&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// 🎯 Fully typed timeline items&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;typedItems&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TimelineItemModel&lt;/span&gt;&lt;span class="p"&gt;[]&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="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Event 1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cardTitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;My Card Title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cardSubtitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;A subtitle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cardDetailedText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Detailed information here...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;media&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IMAGE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://via.placeholder.com/300&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// 🔍 TypeScript will help ensure 'type' is a valid media type, etc.&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="c1"&gt;// ... more items&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;App&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt; &lt;span class="o"&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="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// 📝 Typed callback functions&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleItemSelected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;cardTitle&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;cardSubtitle&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;cardDetailedText&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="nl"&gt;index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Selected item:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100%&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;95vh&lt;/span&gt;&lt;span class="dl"&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Chrono&lt;/span&gt;
        &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;typedItems&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;VERTICAL_ALTERNATING&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;TimelineMode&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;onItemSelected&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleItemSelected&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// 🎯 Fully typed event handlers&lt;/span&gt;
        &lt;span class="nx"&gt;enableDarkToggle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;parseDetailsAsHTML&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&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="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📋 &lt;strong&gt;TypeScript Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔍 &lt;strong&gt;Better autocompletion&lt;/strong&gt; in your IDE&lt;/li&gt;
&lt;li&gt;🚨 &lt;strong&gt;Compile-time error detection&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;Comprehensive prop validation&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;Type-safe event handlers&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 Migrating to the Latest Release
&lt;/h2&gt;

&lt;p&gt;Upgrading is straightforward! React Chrono's new release maintains backward compatibility for most existing APIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  📦 Installation Steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Update your dependency:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&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;react-chrono@latest
   &lt;span class="c"&gt;# or&lt;/span&gt;
   yarn add react-chrono@latest
   &lt;span class="c"&gt;# or&lt;/span&gt;
   pnpm update react-chrono@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🎯 Enable New Features&lt;/strong&gt;: Most new features are opt-in via new props (as shown in the examples above). Your existing timelines should continue to work as before.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;📖 Review Documentation&lt;/strong&gt;: Check the updated documentation for any specific migration notes if you were using highly customized internal aspects.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ⚠️ Migration Notes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Backward Compatible&lt;/strong&gt;: Existing code should work without changes&lt;/li&gt;
&lt;li&gt;🆕 &lt;strong&gt;New Props&lt;/strong&gt;: All new features are opt-in via new props&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;TypeScript&lt;/strong&gt;: Enhanced type definitions may require minor type adjustments&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🏁 Get Started with React Chrono Today!
&lt;/h2&gt;

&lt;p&gt;React Chrono's latest release is more than just an update; it's a significant step forward in making timeline creation a joy for developers and a delight for users. With enhanced search, deep dark mode customization, intuitive user interactions, nested timelines, new animations, and massive performance gains, there's never been a better time to use React Chrono.&lt;/p&gt;

&lt;p&gt;We're incredibly excited to see what you build with these new capabilities! 🎉&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 Resources &amp;amp; Links
&lt;/h3&gt;

&lt;p&gt;📚 &lt;strong&gt;Documentation &amp;amp; Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🏠 &lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/prabhuignoto/react-chrono" rel="noopener noreferrer"&gt;https://github.com/prabhuignoto/react-chrono&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;strong&gt;Official Documentation&lt;/strong&gt;: &lt;a href="https://react-chrono.prabhumurthy.com/" rel="noopener noreferrer"&gt;https://react-chrono.prabhumurthy.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;NPM Package&lt;/strong&gt;: &lt;a href="https://www.npmjs.com/package/react-chrono" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/react-chrono&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💬 Community &amp;amp; Support
&lt;/h3&gt;

&lt;p&gt;Have feedback or built something cool? Share it with the community or open an issue on GitHub!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy Timeline Building!&lt;/strong&gt; 🚀✨&lt;/p&gt;




&lt;h3&gt;
  
  
  📝 Summary of New Features
&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;Enhanced Search&lt;/strong&gt; - Find timeline events instantly with intelligent search&lt;br&gt;&lt;br&gt;
🌙 &lt;strong&gt;Dark Mode&lt;/strong&gt; - Comprehensive theming with 15+ customizable properties&lt;br&gt;&lt;br&gt;
🖱️ &lt;strong&gt;Better UX&lt;/strong&gt; - Improved interactions, keyboard navigation, and accessibility&lt;br&gt;&lt;br&gt;
✨ &lt;strong&gt;Animations&lt;/strong&gt; - Three built-in animation types with mode-specific defaults&lt;br&gt;&lt;br&gt;
🔗 &lt;strong&gt;Nested Timelines&lt;/strong&gt; - Support for complex, hierarchical timeline structures&lt;br&gt;&lt;br&gt;
🖼️ &lt;strong&gt;Media Controls&lt;/strong&gt; - Better alignment and display options for images/videos&lt;br&gt;&lt;br&gt;
⚡ &lt;strong&gt;Performance&lt;/strong&gt; - Optimized rendering and virtualization for large datasets&lt;br&gt;&lt;br&gt;
🛠️ &lt;strong&gt;Developer Experience&lt;/strong&gt; - Enhanced TypeScript support and error handling&lt;/p&gt;




&lt;p&gt;&lt;em&gt;💡 Note: All prop names and configurations in examples are verified against the actual React Chrono source code. Always refer to the official documentation for the most up-to-date information.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>programming</category>
    </item>
    <item>
      <title>Announcing React-Chrono 2.0: Exciting New Features and Improvements</title>
      <dc:creator>Prabhu Murthy</dc:creator>
      <pubDate>Fri, 24 Mar 2023 13:10:13 +0000</pubDate>
      <link>https://dev.to/prabhuignoto/announcing-react-chrono-20-exciting-new-features-and-improvements-3onp</link>
      <guid>https://dev.to/prabhuignoto/announcing-react-chrono-20-exciting-new-features-and-improvements-3onp</guid>
      <description>&lt;p&gt;I'm thrilled to share with you all the launch of &lt;a href="https://github.com/prabhuignoto/react-chrono" rel="noopener noreferrer"&gt;🚀React-Chrono v2.0&lt;/a&gt;, which marks the most significant update since its initial release. React-Chrono is a versatile and adaptable timeline toolkit designed for React, enabling you to showcase events, stories, journeys, and other related content with ease.&lt;/p&gt;

&lt;p&gt;In the latest release, there are several new enhancements and improvements that improve the usability and customization of the library. Let's explore the details.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ Revamped Timeline Cards
&lt;/h2&gt;

&lt;p&gt;The timeline cards in React-Chrono 2.0 have undergone a complete overhaul based on user feedback and evolving design trends. The new timeline cards have been redesigned to improve readability and visual appeal, with enhancements to typography, spacing, and overall layout.&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%2F4jvrkjfqctsma9qir9nc.png" 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%2F4jvrkjfqctsma9qir9nc.png" alt="timeline_Card"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We have also added new features to the timeline cards, such as the ability to expand or minimize text with a single click. The new textOverlay mode enhances the look and feel of the cards by overlaying text on images or videos, making it easier to read and more visually appealing.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌒Dark Mode
&lt;/h2&gt;

&lt;p&gt;Dark mode has become increasingly popular, particularly in low-light environments. React-Chrono now includes this feature, allowing users to easily switch between light and dark modes depending on their preference.&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%2F06so5fvtjldsxed7mw08.png" 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%2F06so5fvtjldsxed7mw08.png" alt="dark_mode"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎨Theme Improvements
&lt;/h2&gt;

&lt;p&gt;Users now have greater control over the look and feel of their timelines. With new theming options, such as custom background colors and fonts, and improved existing options, it's easier than ever to achieve the desired consistency and aesthetic.&lt;/p&gt;

&lt;p&gt;The new theming options also make it easier to create a consistent design across multiple timelines, making it an ideal choice for designers or developers working on complex projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚡New Text Overlay Mode
&lt;/h2&gt;

&lt;p&gt;The new &lt;code&gt;textOverlay&lt;/code&gt; mode is a game-changer for displaying media-rich timelines. With this new feature, users can overlay text on images or videos, making it easier to read and more visually appealing.&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%2Fubpoltwdigmswohxxgfl.png" 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%2Fubpoltwdigmswohxxgfl.png" alt="text_overlay"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;New options have been added to expand or minimize text, which enables users to read longer descriptions with ease or hide them when they are not necessary.&lt;/p&gt;

&lt;h2&gt;
  
  
  📺Improved Slideshow Function
&lt;/h2&gt;

&lt;p&gt;The new version includes significant enhancements to the slideshow functionality. The progress bar has been further refined and improved to ensure greater accuracy and visual appeal, and additional slideshow types have been introduced to meet diverse needs.&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%2Fr3y6jc8bthp92zwyf321.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%2Fr3y6jc8bthp92zwyf321.gif" alt="slide_show"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The new slideshow types include autoplay, loop, and manual, making it easier to customize the slideshow experience to the user's preference.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌿Nested Timelines
&lt;/h2&gt;

&lt;p&gt;The most significant addition to library is the nested timelines feature. This new feature allows users to create nested timelines within the timeline cards, making it easier to display complex stories or journeys.&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%2Fyme4xy46zkc3e1smkep3.png" 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%2Fyme4xy46zkc3e1smkep3.png" alt="nested_timeline"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The nested timelines feature is fully data-driven, meaning that if a timeline item has an items collection or array inside, it will be automatically rendered as a nested timeline inside the timeline cards. This makes it easier to create complex timelines without having to manually code them. Checkout the &lt;a href="https://github.com/prabhuignoto/react-chrono#getting-started" rel="noopener noreferrer"&gt;getting started guide&lt;/a&gt; on how to build a basic timeline&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Customize Timeline Points
&lt;/h2&gt;

&lt;p&gt;One of the newest features is the ability to customize the shapes of timeline points. The timeline points are the circles that appear on the timeline to represent individual events or milestones.&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%2F7hikp5ec60fdr6jle8f1.png" 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%2F7hikp5ec60fdr6jle8f1.png" alt="custom_timeline_points"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By default, all timeline points in React-Chrono are circular. However, with the new &lt;code&gt;timelinePointShape&lt;/code&gt; prop, you can now choose from three different shapes: circle (default), diamond, and square. This feature provides greater flexibility for creating timelines with unique styles and visualizations.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️Improvements
&lt;/h2&gt;

&lt;p&gt;React-Chrono v2.0 represents a significant step forward in improving the user experience and accessibility for developers. To achieve this goal, i have rewritten and refactored certain aspects of the library to make it easier for contributors to get involved in the project and ensure better overall code quality.&lt;/p&gt;

&lt;p&gt;Additionally, i've made significant improvements to our &lt;a href="https://react-chrono.prabhumurthy.com/" rel="noopener noreferrer"&gt;documentation site&lt;/a&gt;, including the addition of new examples and tutorials. These changes are aimed at helping developers get started with React-Chrono more easily and customize it to their specific needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;React-Chrono v2.0&lt;/strong&gt; is a significant upgrade to the timeline library, offering several new features and improvements. With the redesigned timeline cards, new dark mode, improved theming, and new &lt;code&gt;textOverlay&lt;/code&gt; mode, the library now offers a more user-friendly and customizable experience.&lt;/p&gt;

&lt;p&gt;The addition of nested timelines makes it even more powerful and data-driven, making it an ideal choice for displaying complex stories or journeys. I hope you enjoy using React-Chrono 2.0 and look forward to your feedback.&lt;/p&gt;

&lt;p&gt;⭐ Github: &lt;a href="https://github.com/prabhuignoto/react-chrono/" rel="noopener noreferrer"&gt;https://github.com/prabhuignoto/react-chrono/&lt;/a&gt;&lt;br&gt;
🔧 Kitchen Sink: &lt;a href="https://react-chrono-kitchen-sink.prabhumurthy.com" rel="noopener noreferrer"&gt;https://react-chrono-kitchen-sink.prabhumurthy.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading! If you want to see more of my work, be sure to follow me on &lt;a href="https://github.com/prabhuignoto" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; and &lt;a href="https://twitter.com/prabhumurthy2" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>opensource</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Introducing react-visual-grid, a smart image grid component for React</title>
      <dc:creator>Prabhu Murthy</dc:creator>
      <pubDate>Mon, 05 Dec 2022 07:43:42 +0000</pubDate>
      <link>https://dev.to/prabhuignoto/how-to-build-image-grids-with-react-visual-grid-10fh</link>
      <guid>https://dev.to/prabhuignoto/how-to-build-image-grids-with-react-visual-grid-10fh</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;If you’ve ever used &lt;a href="https://www.pinterest.com/" rel="noopener noreferrer"&gt;Pinterest&lt;/a&gt;, you know just how useful image grids can be. Image grids let you showcase and present products, dishes, architecture, or anything else you can think of in an organized way that’s easy to follow and understand. In this post, we’ll walk through the steps of building your own image grid with the &lt;a href="https://github.com/prabhuignoto/react-visual-grid" rel="noopener noreferrer"&gt;react-visual-grid&lt;/a&gt; package.&lt;/p&gt;

&lt;h2&gt;
  
  
  🖼️ What is react-visual-grid?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/prabhuignoto/react-visual-grid" rel="noopener noreferrer"&gt;react-visual-grid&lt;/a&gt; is a library that allows developers to easily create image grids with React. It provides an intuitive and customizable interface for organizing images into 2 unique grid layouts. With its versatile API, developers can create grids with different image sizes, and configurations.&lt;/p&gt;

&lt;p&gt;Here are the main highlights of the library:&lt;/p&gt;

&lt;p&gt;🪟 Generate grids easily.&lt;br&gt;
➡️ Render images horizontally or vertically in a grid.&lt;br&gt;
⚡ Load thousands of images without worrying about performance.&lt;br&gt;
🎛️ UI controls for adjusting image sizes.&lt;br&gt;
💡 Resizable Grid&lt;br&gt;
📦 &lt;a href="https://bundlephobia.com/package/react-visual-grid@0.7.0" rel="noopener noreferrer"&gt;Lightweight&lt;/a&gt; (7kb gzipped)&lt;br&gt;
💪 Built with typescript.&lt;br&gt;
💡 Intuitive API&lt;/p&gt;
&lt;h2&gt;
  
  
  💡Why use react-visual-grid?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/prabhuignoto/react-visual-grid" rel="noopener noreferrer"&gt;react-visual-grid&lt;/a&gt; is built with performance in mind, allowing it to render large datasets quickly without slowing down your app.&lt;/p&gt;

&lt;p&gt;This makes it perfect for applications that require displaying a lot of images at once.&lt;/p&gt;

&lt;p&gt;The library provides an easy and smart solution for building image grids quickly and efficiently. With its performance benefits and styling options, developers can create grids that are both visually pleasing and highly performant.&lt;/p&gt;
&lt;h2&gt;
  
  
  🚀 Getting started with react-visual-grid
&lt;/h2&gt;

&lt;p&gt;To install react-visual-grid, simply run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install --save react-visual-grid
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or if you are using Yarn&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add react-visual-grid
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once installed, you can start building grids in your project. To do this, simply import the Grid component from react-visual-grid in the desired component where you'd like the grid to be rendered:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Grid } from react-visual-grid;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You're now ready to start building grids with react-visual-grid. Read on to learn more about how to configure and customize your grids.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔨 Building the Grid
&lt;/h2&gt;

&lt;p&gt;The vertical layout displays images from top to bottom, while the horizontal layout displays images from left to right. &lt;/p&gt;

&lt;p&gt;The library will automatically figure out the images that can be displayed depending on the width and height of the container and size of the image, so you won't have to worry about manually specifying how many images should be in each row or column. This makes it easier to create an image grid that looks great on all devices, regardless of their size and resolution.&lt;/p&gt;

&lt;p&gt;Here's an example of code that you can use to create an image grid with 20 images. The images will be loaded from the &lt;a href="https://picsum.photos/" rel="noopener noreferrer"&gt;Lorem Picsum&lt;/a&gt; service, and the code uses the vertical layout (default) to arrange the images from top to bottom.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Grid } from "react-visual-grid";

// generate random images using lorem picsum service
const images = Array.from({ length: 20 }, (_, i) =&amp;gt; ({
  src: `https://picsum.photos/id/${Math.round(Math.random() * 110)}/800/600`,
  alt: `Image ${i + 1}`,
}));

const App = () =&amp;gt; {
  return &amp;lt;Grid images={images} width={900} height={1200} /&amp;gt;;
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we have seen how to create a simple grid, let's see how to create an image grid with a horizontal layout.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Grid } from "react-visual-grid";

const App = () =&amp;gt; {
  return (
    &amp;lt;Grid images={images} gridLayout="horizontal" width={1800} height={1200} /&amp;gt;
  );
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F593nrj4cnwe7vz22xxip.png" 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%2F593nrj4cnwe7vz22xxip.png" alt="default" width="800" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔍 Zoom levels &amp;amp; Image sizes
&lt;/h2&gt;

&lt;p&gt;There are three zoom levels that can be adjusted in react-visual-grid.&lt;/p&gt;

&lt;p&gt;By adjusting the zoom levels, you can create a unique look for your image grid. Whether you want your images to take up more space or be smaller and more subtle, react-visual-grid makes it easy to find the perfect balance. &lt;/p&gt;

&lt;p&gt;No matter what type of image grid you’re creating, being able to customize the zoom levels is an essential part of the process.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Grid } from "react-visual-grid";

const imageSizes= {
  "1X": {
    width: 120,
    height: 100,
  },
  "2X": {
    width: 200,
    height: 180,
  },
  "3X": {
    width: 320,
    height: 280,
  },
};

const App = () =&amp;gt; {
  return (
    &amp;lt;Grid images={images} gridLayout="horizontal" width={1800} height={1200} imageSizes={imageSizes} /&amp;gt;
  );
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Ff90fkrb5onrx84mjhsb5.png" 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%2Ff90fkrb5onrx84mjhsb5.png" alt="zoom" width="473" height="108"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ Resizable &amp;amp; Fullscreen
&lt;/h2&gt;

&lt;p&gt;The resizable grid feature is especially useful, as it will automatically adjust the number of images depending on the size of the grid. This ensures that your image grid looks great regardless of the size or shape of the container. &lt;/p&gt;

&lt;p&gt;Fullscreen capabilities are also available, allowing you to show more images on the grid. With fullscreen, your users will be able to easily view all the images without having to scroll through pages. Plus, they can also zoom in and out of the images, making it easier to see them in detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚡Performance &amp;amp; Virtualization
&lt;/h2&gt;

&lt;p&gt;When it comes to loading hundreds of images onto a web page, performance can quickly become an issue. Browsers have limited resources, and if the page contains too many images, it will take a long time to render them all.&lt;/p&gt;

&lt;p&gt;One way to help improve performance is by using &lt;a href="https://www.google.com/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=&amp;amp;cad=rja&amp;amp;uact=8&amp;amp;ved=2ahUKEwjV16-m--H7AhUJDLcAHcK-A6QQFnoECAwQAQ&amp;amp;url=https%3A%2F%2Fwww.kirupa.com%2Fhodgepodge%2Fui_virtualization.htm&amp;amp;usg=AOvVaw0mI2_ux0orXx0f5TmH9bjD" rel="noopener noreferrer"&gt;virtualization&lt;/a&gt;. This is a technique that only renders the visible images and puts the rest in an offscreen state. This reduces the strain on the browser, allowing it to render more quickly and efficiently.&lt;/p&gt;

&lt;p&gt;react-visual-grid has an in-built virtualization feature which makes building image grids easier and faster than ever before. This feature works by only rendering the images that are visible on the screen, leaving the rest in an offscreen state until they are needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎨 Theme
&lt;/h2&gt;

&lt;p&gt;One of the best features of react-visual-grid is its flexibility in customizing the component theme. With just a few simple tweaks, you can completely change the look and feel of your image grid. This allows you to give your grid a consistent, professional appearance that matches your website’s overall design.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Grid
  gridLayout="vertical"
  theme={{
    backgroundColor: "#000",
    controlBgColor: "#303030",
    controlBtnColor: "#595959",
    controlsBackDropColor: "rgba(0, 0, 0, 0.95)",
    thumbnailBgColor: "#202020",
  }}
/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/prabhuignoto/react-visual-grid" rel="noopener noreferrer"&gt;react-visual-grid&lt;/a&gt; is an incredibly powerful tool for building robust and visually appealing image grids. It provides a simple, lightweight solution for creating a wide range of different grid layouts.&lt;/p&gt;

&lt;p&gt;I really hope you enjoyed this post. Please feel free to open an issue in the Github repository or &lt;a href="https://twitter.com/prabhumurthy2" rel="noopener noreferrer"&gt;reach out to me&lt;/a&gt;, if you have any special queries about its usage or you have any suggestions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meta
&lt;/h2&gt;

&lt;p&gt;Prabhu Murthy – &lt;a href="https://twitter.com/prabhumurthy2" rel="noopener noreferrer"&gt;@prabhumurthy2&lt;/a&gt; – &lt;a href="mailto:prabhu.m.murthy@gmail.com"&gt;prabhu.m.murthy@gmail.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codesandbox.io/s/react-visual-grid-vertical-bn7yrf?file=/src/App.tsx" rel="noopener noreferrer"&gt;CodeSandbox Playground&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Distributed under the MIT license. See &lt;code&gt;LICENSE&lt;/code&gt; for more information.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/prabhuignoto/react-visual-grid" rel="noopener noreferrer"&gt;https://github.com/prabhuignoto/react-visual-grid&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>ux</category>
    </item>
    <item>
      <title>Building a draggable menu with react-float-menu</title>
      <dc:creator>Prabhu Murthy</dc:creator>
      <pubDate>Mon, 05 Sep 2022 13:15:43 +0000</pubDate>
      <link>https://dev.to/prabhuignoto/building-a-draggable-menu-in-react-5he0</link>
      <guid>https://dev.to/prabhuignoto/building-a-draggable-menu-in-react-5he0</guid>
      <description>&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%2F2nvre3ftyckqtlhlkuwo.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%2F2nvre3ftyckqtlhlkuwo.gif" alt="demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Menus are a crucial user interface (UI) control that have long&lt;br&gt;
been a staple of desktop and web applications.&lt;/p&gt;

&lt;p&gt;Menus have typically been static, and they bring a lot of efficiency to accessing contextual information. But should the menus always be static? why cant Menu's have some fun.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if the menu was draggable and the user had complete control over its placement on the screen?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But why do we need a draggable menu? I started this project&lt;br&gt;
because I wanted to build a menu that is easy to move around and&lt;br&gt;
lets users focus on what's important.&lt;/p&gt;

&lt;p&gt;For instance, you might want to maximize the screen area when working on a painting or drawing application. We can put all the painting tools in this menu and easily pull them out when we need them.&lt;/p&gt;

&lt;p&gt;In this article, we'll take a closer look at one such smart draggable menu library for React with a user-friendly API that can do exactly that.&lt;/p&gt;

&lt;p&gt;We'll learn about &lt;a href="https://github.com/prabhuignoto/react-float-menu" rel="noopener noreferrer"&gt;react-float-menu&lt;/a&gt;, understand its API, and see it in action.&lt;/p&gt;

&lt;p&gt;As its name suggests, you can easily drag the menu and place it &lt;br&gt;
wherever you like on the screen. The library is capable of more than just dragging, as we'll see in a second.&lt;/p&gt;



&lt;p&gt;Before we start using the library, let's go through and learn about some of its most important features.&lt;/p&gt;
&lt;h2&gt;
  
  
  ⭐ Starting position &amp;amp; Pinning
&lt;/h2&gt;

&lt;p&gt;The menu's starting point can be easily set to one of four predefined positions (&lt;code&gt;top left&lt;/code&gt;, &lt;code&gt;top right&lt;/code&gt;, &lt;code&gt;bottom left&lt;/code&gt;, &lt;code&gt;bottom right&lt;/code&gt;). You can also pin the menu. Pinning turns off the ability to drag, which could be useful in apps where you want to keep the menu in the same position.&lt;/p&gt;
&lt;h2&gt;
  
  
  ⭐ Custom shape and icon for the Menu head
&lt;/h2&gt;

&lt;p&gt;A menu head is the main part of react-float-menu that can be moved, and you can choose whether you want it to be square or round. The menu head shows a default icon, which can also be changed.&lt;/p&gt;
&lt;h2&gt;
  
  
  ⭐ Auto flip
&lt;/h2&gt;

&lt;p&gt;There are times when it's convenient to have the menu automatically flip for you, especially if it's on a screen edge where there isn't much room to show the menu downwards. This is especially the case when the menu is placed at the bottom of the screen.&lt;/p&gt;
&lt;h2&gt;
  
  
  ⭐ Auto positioning
&lt;/h2&gt;

&lt;p&gt;When the menu head is placed on the horizontal edges, the menu may also become hidden. The library offers the choice to automatically move and bring it to our focus.&lt;/p&gt;
&lt;h2&gt;
  
  
  ⭐ Sub menu
&lt;/h2&gt;

&lt;p&gt;Sub-menus work right out of the box. No extra property is needed. All we have to do to create a submenu is add a nested collection to an existing menu item.&lt;/p&gt;
&lt;h2&gt;
  
  
  ⭐ Theme
&lt;/h2&gt;

&lt;p&gt;The library allows for very precise themeing, and you are completely free to change the colors of the different elements of the menu.&lt;/p&gt;


&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;Let's get started by installing the library.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install react-float-menu or yarn add react-float-menu&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The article assumes that you already have everything set up and ready to go for development. If you don't know how to start, use &lt;a href="https://reactjs.org/docs/create-a-new-react-app.html" rel="noopener noreferrer"&gt;create-react-app&lt;/a&gt; or &lt;a href="https://vitejs.dev/" rel="noopener noreferrer"&gt;vite&lt;/a&gt; to get the react project off the ground.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Building the menu
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;react-float-menu&lt;/code&gt; is a data driven library. This means you need to pass a collection of menu items to build the menu. Let's see how to do that.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Menu
  items={[
    { name: "File" },
    { name: "Edit" },
    { name: "Add" }
  ]}
&amp;gt;&amp;lt;/Menu&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we've set up the basics, let's check out some of the other features. First, let's look at how to change the shape of the menu head and the main icon.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Menu
  items={[
    { name: "File" },
    { name: "Edit" },
    { name: "Add" }
  ]}
  shape="square"
&amp;gt;
  &amp;lt;span&amp;gt;💟&amp;lt;/span&amp;gt;
&amp;lt;/Menu&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We changed the shape of the menu head and changed the default icon with this new code. Now it's time to add some of the cool things we talked about before.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pinning &amp;amp; Start Position
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Menu
  items={[
    { name: "File" },
    { name: "Edit" },
    { name: "Add" },
  ]}
  startPosition="top left"
  pin
&amp;gt;
  &amp;lt;span&amp;gt;💟&amp;lt;/span&amp;gt;
&amp;lt;/Menu&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By setting the &lt;code&gt;pin&lt;/code&gt; prop, we have made the menu non draggable and, by using the &lt;code&gt;startPosition&lt;/code&gt; prop, we have placed it on the top left corner of the screen.&lt;/p&gt;

&lt;h4&gt;
  
  
  Auto flip &amp;amp; Positioning
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Menu
  items={[
    { name: "File" },
    { name: "Edit"  },
    { name: "Add" }
  ]}
  startPosition="top left"
  pin
  autoFlipMenu
  bringMenuToFocus
&amp;gt;
  &amp;lt;span&amp;gt;💟&amp;lt;/span&amp;gt;
&amp;lt;/Menu&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;autoFlipMenu&lt;/code&gt; automagically flips the menu vertically and brings it to the visible area of the browser. Similarly, &lt;code&gt;bringMenuToFocus&lt;/code&gt; moves the menu horizontally and brings it to the visible area of the browser.&lt;/p&gt;

&lt;h4&gt;
  
  
  Themeing
&lt;/h4&gt;

&lt;p&gt;With the theme prop, you can completely change the look and feel of the menu.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Menu
  items={[
    { name: "File" },
    { name: "Edit"  },
    { name: "Add" }
  ]}
  shape="square"
  startPosition="top left"
  pin
  autoFlipMenu
  bringMenuToFocus
  theme={{
    menuBackgroundColor: "#FFFFFF",
    menuItemHoverColor: "#318CE7",
    menuItemHoverTextColor: "#fff",
    primary: "#318CE7",
    secondary: "#FFFFFF",
  }}
&amp;gt;
  &amp;lt;PlusIcon /&amp;gt;
&amp;lt;/Menu&amp;gt;;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before we wrap up, let's take a look at one more cool feature. What if we also want the &lt;code&gt;menu items&lt;/code&gt; to have icons? It is as simple as adding an &lt;code&gt;icon&lt;/code&gt; property to the &lt;code&gt;items&lt;/code&gt; collection.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Menu
  items={[
    { name: "File", icon: &amp;lt;span&amp;gt;📁&amp;lt;/span&amp;gt; },
    {
      name: "Edit", icon: &amp;lt;span&amp;gt;📝&amp;lt;/span&amp;gt;,
      children: [{name: "Cut", icon: &amp;lt;span&amp;gt;✂️&amp;lt;/span&amp;gt;}]
    },
    { name: "Add", icon: &amp;lt;span&amp;gt;➕&amp;lt;/span&amp;gt; },
  ]}
  shape="square"
  startPosition="top left"
  pin
  autoFlipMenu
  bringMenuToFocus
  theme={{
    menuBackgroundColor: "#FFFFFF",
    menuItemHoverColor: "#318CE7",
    menuItemHoverTextColor: "#fff",
    primary: "#318CE7",
    secondary: "#FFFFFF",
  }}
&amp;gt;
&amp;lt;/Menu&amp;gt;;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice how we have added a submenu to the &lt;code&gt;Edit&lt;/code&gt; menu item. To add a submenu, all we need to do is pass an array of menu items to the &lt;code&gt;children&lt;/code&gt; property.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;items={[
    { name: "File", icon: &amp;lt;span&amp;gt;📁&amp;lt;/span&amp;gt; },
    {
      name: "Edit", icon: &amp;lt;span&amp;gt;📝&amp;lt;/span&amp;gt;,
      items: [{name: "Cut", icon: &amp;lt;span&amp;gt;✂️&amp;lt;/span&amp;gt;}]
    },
    { name: "Add", icon: &amp;lt;span&amp;gt;➕&amp;lt;/span&amp;gt; },
  ]}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After completing all the steps, the menu should look as follows.&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%2F1nvocems7wnse7ujosfh.png" 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%2F1nvocems7wnse7ujosfh.png" alt="demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can check out the menu for yourself in this &lt;a href="https://codesandbox.io/s/cocky-satoshi-hkm28g?file=/src/App.tsx" rel="noopener noreferrer"&gt;codesandbox&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The library's first release came out a few weeks back, and more important updates are on the way. Soon, things like improved accessibility and rendering custom content will be made available.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/prabhuignoto/react-float-menu" rel="noopener noreferrer"&gt;Github Project Page&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you liked this project, you might also like some of &lt;a href="https://github.com/prabhuignoto" rel="noopener noreferrer"&gt;my other open source work&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>typescript</category>
      <category>react</category>
    </item>
    <item>
      <title>Build smart wizards with react-wizardry</title>
      <dc:creator>Prabhu Murthy</dc:creator>
      <pubDate>Wed, 15 Jun 2022 16:56:28 +0000</pubDate>
      <link>https://dev.to/prabhuignoto/build-smart-wizards-with-react-wizardry-3pbo</link>
      <guid>https://dev.to/prabhuignoto/build-smart-wizards-with-react-wizardry-3pbo</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Wizards are an excellent way to collect information from users in a sequential manner.&lt;/p&gt;

&lt;p&gt;In this post, we'll look at how to build a multi-step wizard using the &lt;a href="https://github.com/prabhuignoto/react-wizardry" rel="noopener noreferrer"&gt;react-wizardry&lt;/a&gt; library.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/prabhuignoto/react-wizardry" rel="noopener noreferrer"&gt;react-wizardry&lt;/a&gt; is a brand new react library built with Typescript for building multi step forms with in built validations.&lt;/p&gt;

&lt;p&gt;Let’s get started by installing the library first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install react-wizardry
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ⚡Setting up the pages
&lt;/h2&gt;

&lt;p&gt;Pages are central to building multi step forms with &lt;a href="https://github.com/prabhuignoto/react-wizardry" rel="noopener noreferrer"&gt;react-wizardry&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Each &lt;code&gt;Page&lt;/code&gt; object represents a page in the wizard. Every &lt;code&gt;Page&lt;/code&gt; object has a &lt;code&gt;fields&lt;/code&gt; array that configures the input fields.&lt;/p&gt;

&lt;p&gt;Lets use the &lt;code&gt;pages&lt;/code&gt; prop to build the wizard&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Wizard
  pages={[
    {
      title: "Page 1",
      fields: [
        {
          label: "First Name",
          name: "firstName",
          type: "text",
        },
        {
          label: "Last Name",
          name: "lastName",
          type: "text"
        },
      ]
    },
    {
      title: "Page 2",
      fields: [
        {
          label: "Date of Birth",
          name: "dob",
          type: "date"
        },
      ]
    },
    {
      title: "Page 3",
      fields: [
        {
          name: "salary",
          label: "Salary",
          type: "number"
        },
      ]
    },
  ]}
/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The wizard has been configured with three pages. &lt;/p&gt;

&lt;p&gt;On page 1, there are two fields: first name and last name.&lt;/p&gt;

&lt;p&gt;Date of Birth is the only field on Page 2, and Salary is the only field on the final page. &lt;/p&gt;

&lt;p&gt;It's crucial to keep in mind that the pages are rendered in the order specified in the pages array.&lt;/p&gt;

&lt;p&gt;Let's see how the UI looks so far.&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%2Fhusy3mg3dlvrla4cyrs4.png" 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%2Fhusy3mg3dlvrla4cyrs4.png" alt="demo1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔠 Field Types
&lt;/h2&gt;

&lt;p&gt;The type property allows you to define the type of input field.&lt;/p&gt;

&lt;p&gt;11 different input types are supported by react-wizardy.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;text&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;phone&lt;/code&gt;, &lt;code&gt;number&lt;/code&gt;, &lt;code&gt;password&lt;/code&gt;, &lt;code&gt;textarea&lt;/code&gt;, &lt;code&gt;select&lt;/code&gt;, &lt;code&gt;checkbox&lt;/code&gt;, &lt;code&gt;datetime&lt;/code&gt;, &lt;code&gt;radio&lt;/code&gt;, and &lt;code&gt;file&lt;/code&gt; are the supported input types.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚠️ Marking a field as mandatory
&lt;/h2&gt;

&lt;p&gt;When building multi-step forms, it is important to collect some mandatory information before proceeding to the next step. In react-wizardry, this can be achieved via the &lt;code&gt;isRequired&lt;/code&gt; property.&lt;/p&gt;

&lt;p&gt;To make a field mandatory, all we need to do is set &lt;code&gt;isRequired&lt;/code&gt; to true for the field that you want the user to enter without fail.&lt;/p&gt;

&lt;p&gt;Let's make the &lt;code&gt;firstName&lt;/code&gt; field mandatory in our pages collection.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fields: [
  {
    label: "First Name",
    name: "firstName",
    type: "text"
    isRequired: true,
  },
  {
    label: "Last Name",
    name: "lastName",
    type: "text"
  }
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fzqoqysftlpt9dh6999i2.png" 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%2Fzqoqysftlpt9dh6999i2.png" alt="demo 2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mandatory fields are marked with a special red asterisk icon and the next button will be disabled. The next button will become enabled only when the value for the field is filled by the user.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ Field validations
&lt;/h2&gt;

&lt;p&gt;All supported input fields in react-wizardry already have in built validation. When a field is marked as &lt;code&gt;isRequired&lt;/code&gt;, validations are turned on by default. The component shows a nice error message right next to the field, and the messages go away when the user fixes the problem.&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%2F237uf1n59kn6bmudrmeq.png" 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%2F237uf1n59kn6bmudrmeq.png" alt="field description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎨 Themes
&lt;/h2&gt;

&lt;p&gt;The library has granular support for changing the colors of the different elements. Checkout the documentation for complete details.&lt;/p&gt;

&lt;p&gt;Here is an &lt;a href="https://codesandbox.io/s/react-wizardy-theme-hzf5bx" rel="noopener noreferrer"&gt;example&lt;/a&gt; of the wizard with the dark theme&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%2Fr01btibo6yl0wih57zhf.png" 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%2Fr01btibo6yl0wih57zhf.png" alt="themes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Apart from the concepts we looked at, &lt;a href="https://github.com/prabhuignoto/react-wizardry" rel="noopener noreferrer"&gt;react-wizardry&lt;/a&gt; offers features such as RTL, custom validation messages, and customizable stepper icons out of the box.&lt;/p&gt;

&lt;p&gt;Check out the documentation for more details and explore all the codesandbox samples &lt;a href="https://github.com/prabhuignoto/react-wizardry#codesandbox-examples" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;⭐ &lt;a href="https://github.com/prabhuignoto/react-wizardry" rel="noopener noreferrer"&gt;Star this project on Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you liked this post, you might also like my other &lt;a href="http://github.com/prabhuignoto" rel="noopener noreferrer"&gt;open source projects&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Follow me on &lt;a href="https://twitter.com/prabhumurthy2" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;, &lt;a href="http://github.com/prabhuignoto" rel="noopener noreferrer"&gt;Github&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Introducing react-creme, a new light weight UI component library for React</title>
      <dc:creator>Prabhu Murthy</dc:creator>
      <pubDate>Wed, 23 Feb 2022 14:00:02 +0000</pubDate>
      <link>https://dev.to/prabhuignoto/introducing-react-creme-a-new-light-weight-ui-component-library-for-react-5503</link>
      <guid>https://dev.to/prabhuignoto/introducing-react-creme-a-new-light-weight-ui-component-library-for-react-5503</guid>
      <description>&lt;h2&gt;
  
  
  ✨ What is react-creme
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/prabhuignoto/react-creme"&gt;react-creme&lt;/a&gt; is a brand new UI toolkit (aka component library) for React.&lt;/p&gt;

&lt;p&gt;With &lt;a href="https://github.com/prabhuignoto/react-creme/tree/master/packages/lib/components"&gt;40+ High quality UI components&lt;/a&gt;, react-creme comes with an exhaustive list of ready to use performant UI Elements for building apps of any shape and size.&lt;/p&gt;

&lt;p&gt;Weighing just &lt;a href="https://bundlephobia.com/package/react-creme"&gt;~43kb (minzipped size)&lt;/a&gt;, react-creme is light and we intend to keep it that way. The library has a very minimal dependency at the moment and the plan is to whittle down on external dependencies and make the lib completely independent in the future.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❓Why
&lt;/h2&gt;

&lt;p&gt;The goal was to build a lighter UI component library but at the same time provide a toolkit that is powerful, easy to setup and configure.&lt;/p&gt;

&lt;p&gt;The library exposes an intuitive API that is easier to understand and consistent across the components.&lt;/p&gt;

&lt;h2&gt;
  
  
  💪 Typescript
&lt;/h2&gt;

&lt;p&gt;The library has been written completely in typescript and the components have been strongly typed in a manner that is consistent with the standards.&lt;/p&gt;

&lt;h2&gt;
  
  
  ♿ Accessibility
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;react-creme&lt;/code&gt; takes accessibility seriously. All of the UI elements are accessibility complaint and the keyboard based navigation has been implemented to work seamlessly across all browsers.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎨 Themes
&lt;/h2&gt;

&lt;p&gt;react-creme comes with an inbuilt ThemeProvider that makes the whole themefication process easy and hassle free.&lt;/p&gt;

&lt;p&gt;The colors, font sizes, icon sizes can be customized quickly with ease.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚡Performance
&lt;/h2&gt;

&lt;p&gt;Components are light, robust and elements like List comes with the virtualization feature out of the box. Virtualization is currently supported on elements such as &lt;a href="https://react-creme.vercel.app/list"&gt;List&lt;/a&gt; and &lt;a href="https://react-creme.vercel.app/dropdown"&gt;Dropdown&lt;/a&gt;, but this will be soon introduced to components that deal with larger datasets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;react-creme&lt;/code&gt; is available for use from npm and you can install it via npm or yarn&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add react-creme
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install react-creme
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Button } from 'react-creme';
import 'react-creme/dist/react-creme.css';

const App = () =&amp;gt; {
  return &amp;lt;Button label="Save" onClick={()=&amp;gt;alert("Saved")} /&amp;gt;
};

export default App
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If all goes well you should have the button rendered and on clicking should alert you with the "Saved" message.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  How about a slider component ?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Slider} from 'react-creme';
import 'react-creme/dist/react-creme.css';

const App = () =&amp;gt; {
  return &amp;lt;Slider end={13} knobShape="square" knobSize={15} position="top" start={4} /&amp;gt;
};

export default App
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;You can checkout all the cool stuff you can have on a slider &lt;a href="https://react-creme.vercel.app/slider"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✨ &lt;a href="https://react-creme.vercel.app/"&gt;Explore All the Components&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚡What's coming next
&lt;/h2&gt;

&lt;p&gt;🌒 - Support for Dark mode has been under the works and will be released as part of the beta release.&lt;/p&gt;

&lt;p&gt;🌈 - More components&lt;/p&gt;

&lt;h2&gt;
  
  
  🛣️ Roadmap
&lt;/h2&gt;

&lt;p&gt;react-creme has been under development for the past few months and its currently in alpha stage. I expect the lib to move into beta stage in the coming weeks.&lt;/p&gt;

&lt;p&gt;Please feel free to add your comments / feedback. What you like, what you didn't like, what can be improved.&lt;/p&gt;

&lt;p&gt;If you liked this post, you might also like some of the other stuff i built on &lt;a href="https://github.com/prabhuignoto"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/prabhumurthy2"&gt;Follow me on Twitter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⭐&lt;a href="https://github.com/prabhuignoto/react-creme"&gt;Star this project on Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📃&lt;a href="https://react-creme.vercel.app/"&gt;react-creme doc site&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>typescript</category>
    </item>
    <item>
      <title>React-Chrono crosses 2000 🌟 on Github, ver 1.7 released with support for rendering custom content</title>
      <dc:creator>Prabhu Murthy</dc:creator>
      <pubDate>Tue, 10 Nov 2020 06:11:16 +0000</pubDate>
      <link>https://dev.to/prabhuignoto/react-chrono-crosses-2000-on-github-ver-1-7-released-with-support-for-rendering-custom-content-4m68</link>
      <guid>https://dev.to/prabhuignoto/react-chrono-crosses-2000-on-github-ver-1-7-released-with-support-for-rendering-custom-content-4m68</guid>
      <description>&lt;h2&gt;
  
  
  What is react-chrono
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/prabhuignoto/react-chrono" rel="noopener noreferrer"&gt;react-chrono&lt;/a&gt; is a modern Timeline component built for react. It comes with 3 different layouts and is highly customizable.&lt;/p&gt;

&lt;p&gt;Please follow the below post for a detailed getting started guide.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/prabhuignoto" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F470010%2F6f627835-313c-4f5d-90c1-29327b0da87e.png" alt="prabhuignoto"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/prabhuignoto/flexible-timeline-component-for-react-21gd" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Introducing react-chrono - A flexible Timeline component for React&lt;/h2&gt;
      &lt;h3&gt;Prabhu Murthy ・ Sep 18 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#react&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#typescript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Whats new
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Custom rendering&lt;/strong&gt;: The component now supports rendering custom content in the Timeline cards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessiblity&lt;/strong&gt;: With 1.7 both the general accessiblity and the keyboard accessibility of the component has been greatly improved.&lt;/li&gt;
&lt;li&gt;Ability to flip the layout(RTL). A new prop added to flip the layout on both &lt;code&gt;VERTICAL&lt;/code&gt; and &lt;code&gt;VERTICAL_ALTERNATING&lt;/code&gt; modes.&lt;/li&gt;
&lt;li&gt;New scrollable option to allow free scrolling on &lt;code&gt;VERTICAL&lt;/code&gt; and &lt;code&gt;VERTICAL_ALTERNATING&lt;/code&gt; modes.&lt;/li&gt;
&lt;li&gt;New option to position the card in &lt;code&gt;HORIZONTAL&lt;/code&gt; mode.&lt;/li&gt;
&lt;li&gt;The latest version also includes bug fixes and various UX improvements.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Custom rendering
&lt;/h2&gt;

&lt;p&gt;To insert custom content, just pass the blocked elements between the Chrono tags.&lt;/p&gt;

&lt;p&gt;Each div element is automatically converted into a timeline item and inserted into the timeline card. The items collection is completely optional and custom rendering is supported on all 3 modes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &amp;lt;Chrono
    &lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"VERTICAL_ALTERNATING"&lt;/span&gt;
    scrollable
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &amp;lt;div&amp;gt;
      &amp;lt;div &lt;span class="nv"&gt;style&lt;/span&gt;&lt;span class="o"&gt;={{&lt;/span&gt;width: &lt;span class="s2"&gt;"250px"&lt;/span&gt;, height: &lt;span class="s2"&gt;"250px"&lt;/span&gt;&lt;span class="o"&gt;}}&amp;gt;&lt;/span&gt;
        &amp;lt;img &lt;span class="nv"&gt;style&lt;/span&gt;&lt;span class="o"&gt;={{&lt;/span&gt;maxWidth:  &lt;span class="s2"&gt;"100%"&lt;/span&gt;, maxHeight:  &lt;span class="s2"&gt;"100%"&lt;/span&gt;&lt;span class="o"&gt;}}&lt;/span&gt;  &lt;span class="nv"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://cdn.tutsplus.com/net/uploads/2013/08/github-collab-retina-preview.gif"&lt;/span&gt;/&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div&amp;gt;
      &amp;lt;h3&amp;gt;This is a List&amp;lt;/h3&amp;gt;
      &amp;lt;ul&amp;gt;
        &amp;lt;li&amp;gt;Item 1&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Item 2&amp;lt;/li&amp;gt;
      &amp;lt;/ul&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div&amp;gt;
      &amp;lt;h3&amp;gt;Dunkirk&amp;lt;/h3&amp;gt;
      &amp;lt;p&amp;gt;
        The Battle of Dunkirk &lt;span class="o"&gt;(&lt;/span&gt;French: Bataille de Dunkerque&lt;span class="o"&gt;)&lt;/span&gt; was fought &lt;span class="k"&gt;in &lt;/span&gt;Dunkirk &lt;span class="o"&gt;(&lt;/span&gt;Dunkerque&lt;span class="o"&gt;)&lt;/span&gt;, France, during the Second World War, between the Allies and Nazi Germany.
      &amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div &lt;span class="nv"&gt;style&lt;/span&gt;&lt;span class="o"&gt;={{&lt;/span&gt;margin: &lt;span class="s2"&gt;"1rem"&lt;/span&gt;&lt;span class="o"&gt;}}&amp;gt;&lt;/span&gt;
      &amp;lt;h3&amp;gt;Table&amp;lt;/h3&amp;gt;
      &amp;lt;table&amp;gt;
        &amp;lt;thead&amp;gt;
          &amp;lt;&lt;span class="nb"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &amp;lt;td&amp;gt;Column  1&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;Column  2&amp;lt;/td&amp;gt;
          &amp;lt;/tr&amp;gt;
        &amp;lt;/thead&amp;gt;
        &amp;lt;tbody&amp;gt;
          &amp;lt;&lt;span class="nb"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &amp;lt;td&amp;gt;Value 1&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;Value 2&amp;lt;/td&amp;gt;
          &amp;lt;/tr&amp;gt;
          &amp;lt;&lt;span class="nb"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &amp;lt;td&amp;gt;Value 5&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;Value 6&amp;lt;/td&amp;gt;
          &amp;lt;/tr&amp;gt;
        &amp;lt;/tbody&amp;gt;
      &amp;lt;/table&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/Chrono&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fi%2Fsdiyk5zdx35rftiqn5ok.png" 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%2Fi%2Fsdiyk5zdx35rftiqn5ok.png" alt="custom"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The items collection will also work nicely with any custom content that is passed. The following snippet sets the the title and cardTitle for the custom contents.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  const items &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
    &lt;span class="o"&gt;{&lt;/span&gt;title: &lt;span class="s2"&gt;"Timeline title 1"&lt;/span&gt;, cardTitle:  &lt;span class="s2"&gt;"Card Title 1"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="o"&gt;{&lt;/span&gt;title: &lt;span class="s2"&gt;"Timeline title 2"&lt;/span&gt;, cardTitle:  &lt;span class="s2"&gt;"Card Title 2"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &amp;lt;Chrono &lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"VERTICAL"&lt;/span&gt; &lt;span class="nv"&gt;items&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;items&lt;span class="o"&gt;}&amp;gt;&lt;/span&gt;
    &amp;lt;div&amp;gt;
      &amp;lt;p&amp;gt;Lorem Ipsum. Lorem Ipsum. Lorem Ipsum&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div&amp;gt;
      &amp;lt;img &lt;span class="nv"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;url to  a nice image"&lt;/span&gt; /&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/Chrono&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Flip layout
&lt;/h2&gt;

&lt;p&gt;A new prop added to flip the layout in &lt;code&gt;VERTICAL&lt;/code&gt; and &lt;code&gt;VERTICAL_ALTERNATING&lt;/code&gt; modes. This will be useful for react apps that use RTL(right to left) rendering.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &amp;lt;Chrono
    &lt;span class="nv"&gt;items&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;items&lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"VERTICAL"&lt;/span&gt;
    flipLayout
  /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fi%2Fx8ej2fafuugk3lv1wyx9.png" 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%2Fi%2Fx8ej2fafuugk3lv1wyx9.png" alt="flip"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Scrollable
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;scrollable&lt;/code&gt; enables free scrolling on &lt;code&gt;VERTICAL&lt;/code&gt; and &lt;code&gt;VERTICAL_ALTERNATING&lt;/code&gt; modes.The scrollbars are hidden by default. To enable scrollbars set &lt;code&gt;scrollbar:true&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &amp;lt;Chrono
    &lt;span class="nv"&gt;items&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;items&lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"VERTICAL"&lt;/span&gt;
    &lt;span class="nv"&gt;scrollable&lt;/span&gt;&lt;span class="o"&gt;={{&lt;/span&gt;scrollbar:  &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="o"&gt;}}&lt;/span&gt;
  /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fi%2Frvuka08n04kvl5i8ymho.png" 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%2Fi%2Frvuka08n04kvl5i8ymho.png" alt="scrollbar"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Card positioning in Horizontal Mode
&lt;/h2&gt;

&lt;p&gt;Now the cards can be positioned to either &lt;code&gt;TOP&lt;/code&gt; or &lt;code&gt;BOTTOM&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &amp;lt;Chrono
    &lt;span class="nv"&gt;items&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;items&lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"HORIZONTAL"&lt;/span&gt;
    &lt;span class="nv"&gt;cardPositionHorizontal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"TOP"&lt;/span&gt;
  /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fi%2Fuqqlgiperzp0bk8xhuz1.png" 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%2Fi%2Fuqqlgiperzp0bk8xhuz1.png" alt="cardposition"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 CodeSandbox Examples
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://codesandbox.io/s/keen-shannon-gtjwn?file=/src/App.js" rel="noopener noreferrer"&gt;Horizontal Basic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codesandbox.io/s/react-chrono-vertical-basic-0rm1o?file=/src/App.js" rel="noopener noreferrer"&gt;Vertical basic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codesandbox.io/s/react-chrono-tree-text-1fcs3?file=/src/App.js" rel="noopener noreferrer"&gt;Vertical Alternating&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🙏 Thank You
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/prabhuignoto/react-chrono" rel="noopener noreferrer"&gt;react-chrono&lt;/a&gt; achieved a major milestone of crossing 2000 stars on Github. I would like to thank everyone who supported the project so far and also those who shared their honest feedback. The new release is the result of those great feedbacks, ideas and suggestions.&lt;/p&gt;

&lt;p&gt;Follow me on Twitter &lt;a href="https://twitter.com/prabhumurthy2" rel="noopener noreferrer"&gt;@prabhumurthy2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also check out some of my other work here &lt;a href="https://www.prabhumurthy.com" rel="noopener noreferrer"&gt;prabhumurthy.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>React-Chrono 1.3 out with support for images and videos</title>
      <dc:creator>Prabhu Murthy</dc:creator>
      <pubDate>Tue, 20 Oct 2020 18:33:36 +0000</pubDate>
      <link>https://dev.to/prabhuignoto/react-chrono-1-3-out-with-support-for-images-and-videos-ko7</link>
      <guid>https://dev.to/prabhuignoto/react-chrono-1-3-out-with-support-for-images-and-videos-ko7</guid>
      <description>&lt;h2&gt;
  
  
  What is react-chrono
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/prabhuignoto/react-chrono"&gt;react-chrono&lt;/a&gt; is a flexible timeline component built for React.&lt;br&gt;
Please follow this &lt;a href="https://dev.to/prabhuignoto/flexible-timeline-component-for-react-21gd"&gt;link&lt;/a&gt; for a detailed introduction and getting started guide that i had posted earlier.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/prabhuignoto"&gt;
        prabhuignoto
      &lt;/a&gt; / &lt;a href="https://github.com/prabhuignoto/react-chrono"&gt;
        react-chrono
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Modern Timeline component for React
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  ✨Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🚥 Render timelines in three different modes (Horizontal, Vertical, Tree).&lt;/li&gt;
&lt;li&gt;🌲  With Tree mode, layout the timeline cards vertically in a tree like fashion.&lt;/li&gt;
&lt;li&gt;📺  Auto play the timeline with slideshow mode.&lt;/li&gt;
&lt;li&gt;🖼️  Display Images &amp;amp; Videos in the timeline with ease.&lt;/li&gt;
&lt;li&gt;⌨  Keyboard accessible.&lt;/li&gt;
&lt;li&gt;⚡  Data driven API.&lt;/li&gt;
&lt;li&gt;🎨  Customize colors with ease.&lt;/li&gt;
&lt;li&gt;💪  Built with &lt;a href="https://www.typescriptlang.org/"&gt;Typescript&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;🎨  Styled with &lt;a href="https://emotion.sh"&gt;emotion&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🌟 Whats new in 1.3
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
Embed images and videos in the timeline with ease.&lt;/li&gt;
&lt;li&gt;Revamped navigation control.&lt;/li&gt;
&lt;li&gt;Improved slideshow experience.&lt;/li&gt;
&lt;li&gt;Overall UX enhancements.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Horizontal
&lt;/h2&gt;

&lt;p&gt;Horizontal is the default mode of the component.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--run34g5_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/sc8vnc9x0vok79ado2wa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--run34g5_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/sc8vnc9x0vok79ado2wa.png" alt="horizontal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Vertical
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r7uos76g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xf5z1c41poj52iw7zb4j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r7uos76g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xf5z1c41poj52iw7zb4j.png" alt="vertical-basic"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tree
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a1TsTc-B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/egxcpco3mqc4e59vzv6u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a1TsTc-B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/egxcpco3mqc4e59vzv6u.png" alt="app-tree"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Images
&lt;/h2&gt;

&lt;p&gt;Both images and videos can be easily embedded in the timeline. The component is smart enough to automatically hide/disable the images and videos when they are not in the visible area of the containing element.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HIwtw2SW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dzaxaqd22qryfrnp0enp.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HIwtw2SW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dzaxaqd22qryfrnp0enp.gif" alt="media"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Slideshow
&lt;/h2&gt;

&lt;p&gt;Slideshow now shows a decreasing progressbar indicating the timeleft on a timeline card. The Slideshow can be quickly paused by hovering over the active item. The slideshow automatically resumes when unhovered from the timeline card.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7zG_FHSf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0no1lvkmdiwxf12gqhwh.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7zG_FHSf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0no1lvkmdiwxf12gqhwh.gif" alt="Untitled Project7"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 CodeSandbox Examples
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://codesandbox.io/s/condescending-swirles-xodxo?file=/src/App.js"&gt;Horizontal Basic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codesandbox.io/s/react-chrono-tree-text-xtksq"&gt;Tree&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codesandbox.io/s/react-chrono-tree-image-uh2nz"&gt;Tree with Images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codesandbox.io/s/react-chrono-tree-text-slide-zytpi?file=/src/App.js"&gt;Vertical basic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codesandbox.io/s/react-chrono-tree-horizontal-wdqk3"&gt;Vertical mode with Mixed content&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/prabhuignoto"&gt;
        prabhuignoto
      &lt;/a&gt; / &lt;a href="https://github.com/prabhuignoto/react-chrono"&gt;
        react-chrono
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Modern Timeline component for React
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Thank you for taking the time to read this post and if you have any feedbacks or suggestions, please leave in your comments below.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>showdev</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Smart-Tagz - Input tags component for Vue</title>
      <dc:creator>Prabhu Murthy</dc:creator>
      <pubDate>Mon, 28 Sep 2020 19:40:15 +0000</pubDate>
      <link>https://dev.to/prabhuignoto/smart-tagz-a-input-tags-component-built-for-vue-3-5c75</link>
      <guid>https://dev.to/prabhuignoto/smart-tagz-a-input-tags-component-built-for-vue-3-5c75</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qPtnStkb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/o8u1ndx4zamypuk43ceo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qPtnStkb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/o8u1ndx4zamypuk43ceo.png" alt="app-home"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;Autosuggest&lt;/strong&gt; - Supports Autosuggest with easy keyboard selection.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Editable Tags&lt;/strong&gt; - Tags can be edited inline by double clicking on the tag.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Create tags on Paste&lt;/strong&gt; - Paste string with delimiters of your choice and the component will auto create the tags for you.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Easy tag deletion&lt;/strong&gt; - Delete tags easily with delete or backspace.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Quick delete&lt;/strong&gt; - Quickly delete all tags with CTRL + A, DEL or BACKSPACE.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Support for custom color schemes&lt;/strong&gt; - easy color scheme customization.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Composition API&lt;/strong&gt; - Built using the latest Composition API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn &lt;span class="nb"&gt;install &lt;/span&gt;smart-tagz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Getting started
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  &amp;lt;smart-tagz
    autosuggest
    editable
    &lt;span class="nv"&gt;inputPlaceholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Select Countries ..."&lt;/span&gt;
    :sources&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sources"&lt;/span&gt;
    :allowPaste&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"{delimiter: ','}"&lt;/span&gt;
    :allowDuplicates&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"false"&lt;/span&gt;
    :maxTags&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"20"&lt;/span&gt;
    :defaultTags&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"['United Kingdom', 'Uruguay', 'Uzbekistan']"&lt;/span&gt;
  /&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script&amp;gt;
import &lt;span class="o"&gt;{&lt;/span&gt; SmartTagz &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s2"&gt;"smart-tagz"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
import &lt;span class="s2"&gt;"smart-tagz/dist/smart-tagz.css"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nb"&gt;export &lt;/span&gt;default &lt;span class="o"&gt;{&lt;/span&gt;
  name: &lt;span class="s2"&gt;"Basic"&lt;/span&gt;,
  components: &lt;span class="o"&gt;{&lt;/span&gt;
    SmartTagz,
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  💡 Autosuggest
&lt;/h4&gt;

&lt;p&gt;Setting up autosuggest just got lot easier. Configure the datasources and you are good to go.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&amp;lt;smart-tagz autosuggest :sources&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sources"&lt;/span&gt; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ucnFNFwN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/t80u767mv2z9q600ldoz.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ucnFNFwN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/t80u767mv2z9q600ldoz.gif" alt="1"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  ✏ Easy edit
&lt;/h4&gt;

&lt;p&gt;With the &lt;code&gt;edit&lt;/code&gt; mode enabled, double click a tag to make changes to your tags easily.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&amp;lt;smart-tagz editable /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aom_P71T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ryo4w7vgfbgpvldnnb93.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aom_P71T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ryo4w7vgfbgpvldnnb93.gif" alt="2"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  🧹Quick delete
&lt;/h4&gt;

&lt;p&gt;sometimes it's better to just quickly clear all the tags and start from scratch. with &lt;code&gt;quick delete&lt;/code&gt; mode, you can select all the tags at once and clear them.&lt;/p&gt;

&lt;p&gt;press CTRL + A to select all tags and use DEL key to clear the tags.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&amp;lt;smart-tagz quick-delete /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZPZwcc2Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vkcxlt2zacttlzrtd498.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZPZwcc2Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vkcxlt2zacttlzrtd498.gif" alt="3"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  🔒 Readonly Tags
&lt;/h4&gt;

&lt;p&gt;In readonly mode new tags cannot be added and default tags if set cannot be deleted.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&amp;lt;smart-tagz read-only /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--72fmKLwL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/scakh5rze36r5kg1cxq0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--72fmKLwL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/scakh5rze36r5kg1cxq0.png" alt="23"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  🌈 Theme support
&lt;/h4&gt;

&lt;p&gt;Customize colors with ease.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&amp;lt;smart-tagz
  :theme&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"{
    primary: '#545454',
    background: '#bdbdbd',
    tagTextColor: '#fff',
  }"&lt;/span&gt;
/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pNo4RHVC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7rb7u0e5v1c2jg2au9sv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pNo4RHVC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7rb7u0e5v1c2jg2au9sv.png" alt="23"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The component comes with many more features. Please visit the demo site to play with all the features.&lt;/p&gt;
&lt;h3&gt;
  
  
  📺 &lt;a href="https://smart-tagz.vercel.app/"&gt;https://smart-tagz.vercel.app/&lt;/a&gt;
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/prabhuignoto"&gt;
        prabhuignoto
      &lt;/a&gt; / &lt;a href="https://github.com/prabhuignoto/smart-tagz"&gt;
        smart-tagz
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Smart input tags for Vue
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Feedback and contributions are Welcome.&lt;/p&gt;

</description>
      <category>vue</category>
      <category>showdev</category>
      <category>javascript</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Introducing vue-float-menu, A Smart floating Menu for Vue 3.</title>
      <dc:creator>Prabhu Murthy</dc:creator>
      <pubDate>Mon, 21 Sep 2020 15:41:27 +0000</pubDate>
      <link>https://dev.to/prabhuignoto/introducing-vue-float-menu-a-smart-floating-menu-for-vue-3-5egb</link>
      <guid>https://dev.to/prabhuignoto/introducing-vue-float-menu-a-smart-floating-menu-for-vue-3-5egb</guid>
      <description>&lt;h2&gt;
  
  
  vue-float-menu
&lt;/h2&gt;

&lt;p&gt;I've been pretty excited about the Vue 3 release lately and was thinking about writing a new component library for Vue 3.&lt;/p&gt;

&lt;p&gt;I was badly in need of a draggable floating menu for some of my projects. Although there are some great projects on github targeting Vue 2, I could not find one that could satisfy some of my UX &amp;amp; functional needs.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vue-float-menu&lt;/code&gt; is an attempt to create such a flexible menu that can be easily dragged around on the screen with support for sub menus.&lt;/p&gt;

&lt;p&gt;Please feel free to send in any feedbacks you have regarding the project or any issues you face while trying out.&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%2Fi%2Fzgye9qzr8v47w9fbkh6z.png" 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%2Fi%2Fzgye9qzr8v47w9fbkh6z.png" alt="app-home"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⚡ &lt;a href="https://stackblitz.com/edit/vue-mkrnwq?file=src/App.vue" rel="noopener noreferrer"&gt;Edit on Stackblitz&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⭐ &lt;a href="https://github.com/prabhuignoto/float-menu/stargazers" rel="noopener noreferrer"&gt;Star this Project&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/prabhuignoto" rel="noopener noreferrer"&gt;
        prabhuignoto
      &lt;/a&gt; / &lt;a href="https://github.com/prabhuignoto/vue-float-menu" rel="noopener noreferrer"&gt;
        vue-float-menu
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🎈Customizable floating menu for Vue
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;✅ &lt;strong&gt;Draggable Menu Handle&lt;/strong&gt; - Drag and easily place the Menu anywhere on screen.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Smart Menu&lt;/strong&gt; - Detects the top &amp;amp; bottom edges of the screen and flips the menu automatically.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Smart Placement&lt;/strong&gt; - The Menu head automatically adjusts itself and always stays inside the viewport.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Nested Menus&lt;/strong&gt; - Support for Nested menus up to any levels.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Composition API&lt;/strong&gt; - Built using the latest Composition API from Vue 3.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙ Installation
&lt;/h2&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

yarn &lt;span class="nb"&gt;install &lt;/span&gt;vue-float-menu


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

&lt;/div&gt;
&lt;h2&gt;
  
  
  🚀 Getting Started
&lt;/h2&gt;

&lt;p&gt;float-menu has some great defaults. Please check the props list for details on all available options.&lt;/p&gt;

&lt;p&gt;The following snippet sets the default position of the menu as &lt;code&gt;top left&lt;/code&gt; and default menu direction as &lt;code&gt;bottom&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

  &amp;lt;float-menu
    &lt;span class="nv"&gt;position&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"top left"&lt;/span&gt;
    :dimension&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"50"&lt;/span&gt;
    :menu&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"menuData"&lt;/span&gt;
    menu-direction&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bottom"&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &amp;lt;BoxIcon /&amp;gt;
  &amp;lt;/float-menu&amp;gt;


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

&lt;/div&gt;
&lt;h2&gt;
  
  
  📺 Demo
&lt;/h2&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%2Fi%2Fg9ezs62zuaba1m32rzgy.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%2Fi%2Fg9ezs62zuaba1m32rzgy.gif" alt="demo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Props
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prop&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;dimension&lt;/td&gt;
&lt;td&gt;number&lt;/td&gt;
&lt;td&gt;dimension of the Menu Head &lt;code&gt;width x height&lt;/code&gt; in pixels.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;position&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Initial position of the Menu Head. can be any one of the values &lt;code&gt;top left&lt;/code&gt;, &lt;code&gt;top right&lt;/code&gt;, &lt;code&gt;bottom left&lt;/code&gt;, &lt;code&gt;bottom right&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fixed&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;Disables dragging and the Menu will be fixed. use the &lt;code&gt;position&lt;/code&gt; prop to fix the menu position&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;menu-orientation&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Set's the Menu's orientation. can be &lt;code&gt;top&lt;/code&gt; or &lt;code&gt;bottom&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;menu-dimension&lt;/td&gt;
&lt;td&gt;Object&lt;/td&gt;
&lt;td&gt;Set's the &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;minimum&lt;/code&gt; height of the Menu.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;menu-data&lt;/td&gt;
&lt;td&gt;Object&lt;/td&gt;
&lt;td&gt;Array data to generate the nested menu's.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;on-selected&lt;/td&gt;
&lt;td&gt;Function&lt;/td&gt;
&lt;td&gt;Hook that is called on selection.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;flip-on-edges&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;Flips the Menu content automatically, when there is no space to display nested menus.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Dimension
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;dimension&lt;/code&gt; prop can be used to set the width and height of the menu head. The prop takes a single number value to set the height and width of the Menu Head.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

  &amp;lt;float-menu :dimension&lt;span class="o"&gt;=&lt;/span&gt;50&amp;gt;
    &amp;lt;BoxIcon /&amp;gt;
  &amp;lt;/float-menu&amp;gt;


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

&lt;/div&gt;
&lt;h3&gt;
  
  
  Position
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;position&lt;/code&gt; prop can be used to set the initial position of the Menu Head. The prop can accept any one of the following values.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;top left&lt;/code&gt; (default)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;top right&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bottom left&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bottom right&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

  &amp;lt;float-menu :dimension&lt;span class="o"&gt;=&lt;/span&gt;50 &lt;span class="nv"&gt;position&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bottom right"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &amp;lt;BoxIcon /&amp;gt;
  &amp;lt;/float-menu&amp;gt;


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

&lt;/div&gt;
&lt;h3&gt;
  
  
  Fixed position
&lt;/h3&gt;

&lt;p&gt;To disable dragging and to fix the position statically, set &lt;code&gt;fixed&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt;. This prop is disabled by default. Use this prop along with the &lt;code&gt;position&lt;/code&gt; prop to set the desired position.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

  &amp;lt;float-menu :dimension&lt;span class="o"&gt;=&lt;/span&gt;50 &lt;span class="nv"&gt;position&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bottom right"&lt;/span&gt; fixed&amp;gt;
    &amp;lt;BoxIcon /&amp;gt;
  &amp;lt;/float-menu&amp;gt;


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

&lt;/div&gt;
&lt;h3&gt;
  
  
  Menu orientation
&lt;/h3&gt;

&lt;p&gt;sets the default orientation of the menu. can be set to either &lt;code&gt;top&lt;/code&gt; or &lt;code&gt;bottom&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

  &amp;lt;float-menu :dimension&lt;span class="o"&gt;=&lt;/span&gt;50 &lt;span class="nv"&gt;position&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bottom right"&lt;/span&gt; menu-orientation&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bottom"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &amp;lt;BoxIcon /&amp;gt;
  &amp;lt;/float-menu&amp;gt;


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

&lt;/div&gt;
&lt;h3&gt;
  
  
  Menu head dimension
&lt;/h3&gt;

&lt;p&gt;prop to set the &lt;code&gt;height&lt;/code&gt; and &lt;code&gt;width&lt;/code&gt; of the menu.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

  &amp;lt;float-menu
    :dimension&lt;span class="o"&gt;=&lt;/span&gt;50
    :menu-dimension&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"{height: 400, width: 300}"&lt;/span&gt;
    &lt;span class="nv"&gt;position&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bottom right"&lt;/span&gt;
    menu-orientation&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bottom"&lt;/span&gt;
    &amp;lt;BoxIcon /&amp;gt;
  &amp;lt;/float-menu&amp;gt;


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

&lt;/div&gt;
&lt;h3&gt;
  
  
  Populating Menu
&lt;/h3&gt;

&lt;p&gt;Use the &lt;code&gt;menu-data&lt;/code&gt; prop to create Simple or Nested menus of your liking. &lt;code&gt;menu-data&lt;/code&gt; takes an array of &lt;code&gt;MenuItem&lt;/code&gt; type&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;List of MenuItem properties&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;property&lt;/th&gt;
&lt;th&gt;description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;name&lt;/td&gt;
&lt;td&gt;display name of the menu item.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;id&lt;/td&gt;
&lt;td&gt;unique id of each menu item. this is auto generated by the component.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;selected&lt;/td&gt;
&lt;td&gt;flag to highlight a sub-menu selection.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;showSubMenu&lt;/td&gt;
&lt;td&gt;flag to show/hide the sub-menu.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;subMenu&lt;/td&gt;
&lt;td&gt;data for the sub-menu&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Here we create a simple Menu structure with 3 Menu items with no sub menus.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

const menuData &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
  &lt;span class="o"&gt;{&lt;/span&gt; name: &lt;span class="s2"&gt;"New"&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;{&lt;/span&gt;
    name: &lt;span class="s2"&gt;"Edit"&lt;/span&gt;,
    subMenu: &lt;span class="o"&gt;{&lt;/span&gt;
      name: &lt;span class="s2"&gt;"edit-items"&lt;/span&gt;,
      items: &lt;span class="o"&gt;[{&lt;/span&gt; name: &lt;span class="s2"&gt;"Copy"&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt; name: &lt;span class="s2"&gt;"Paste"&lt;/span&gt; &lt;span class="o"&gt;}]&lt;/span&gt;,
    &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;{&lt;/span&gt;
    name: &lt;span class="s2"&gt;"Open Recent"&lt;/span&gt;,
    subMenu: &lt;span class="o"&gt;{&lt;/span&gt;
      name: &lt;span class="s2"&gt;"recent-items"&lt;/span&gt;,
      items: &lt;span class="o"&gt;[{&lt;/span&gt; name: &lt;span class="s2"&gt;"Document 1"&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt; name: &lt;span class="s2"&gt;"Document 2"&lt;/span&gt; &lt;span class="o"&gt;}]&lt;/span&gt;,
    &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;span class="o"&gt;]&lt;/span&gt;


&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;

  &amp;lt;float-menu
    :dimension&lt;span class="o"&gt;=&lt;/span&gt;50
    :menu-dimension&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"{height: 400, width: 300}"&lt;/span&gt;
    :menu-data&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"menuData"&lt;/span&gt;
    &lt;span class="nv"&gt;position&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bottom right"&lt;/span&gt;
    menu-orientation&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bottom"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &amp;lt;BoxIcon /&amp;gt;
  &amp;lt;/float-menu&amp;gt;


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

&lt;/div&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%2Fi%2Fq71x745jb4qle38832nl.png" 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%2Fi%2Fq71x745jb4qle38832nl.png" alt="example1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  on-select
&lt;/h3&gt;

&lt;p&gt;hook for the menu item selection event.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

  &amp;lt;float-menu
    :dimension&lt;span class="o"&gt;=&lt;/span&gt;50
    &lt;span class="nv"&gt;position&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bottom right"&lt;/span&gt;
    :menu-dimension&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"{height: 400, width: 300}"&lt;/span&gt;
    :menu-data&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"{items: [{name: 'File'}, {name: 'Open'}]}"&lt;/span&gt;
    on-select&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"handleSelection"&lt;/span&gt;
    menu-orientation&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bottom"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &amp;lt;BoxIcon /&amp;gt;
  &amp;lt;/float-menu&amp;gt;


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

&lt;/div&gt;
&lt;h3&gt;
  
  
  Auto flip on edges
&lt;/h3&gt;

&lt;p&gt;setting this prop &lt;code&gt;flips&lt;/code&gt; the menu content on the right edges of the screen. This is useful you have nested menus of many levels.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

  &amp;lt;float-menu
    :dimension&lt;span class="o"&gt;=&lt;/span&gt;50
    &lt;span class="nv"&gt;position&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bottom right"&lt;/span&gt;
    flip-on-edges
    on-select&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"handleSelection"&lt;/span&gt;
    menu-orientation&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bottom"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &amp;lt;BoxIcon /&amp;gt;
  &amp;lt;/float-menu&amp;gt;


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

&lt;/div&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%2Fi%2Fv38ne68ixl7ir6pq3ee0.png" 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%2Fi%2Fv38ne68ixl7ir6pq3ee0.png" alt="flip"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Custom icon
&lt;/h3&gt;

&lt;p&gt;To customize the Menu Icon, simply pass any content in between the &lt;code&gt;float-menu&lt;/code&gt; tags. Here we render a custom icon.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

  &amp;lt;float-menu
    :dimension&lt;span class="o"&gt;=&lt;/span&gt;50
    :menu-data&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"menuData"&lt;/span&gt;
    menu-orientation&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bottom"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &amp;lt;BoxIcon /&amp;gt;
  &amp;lt;/float-menu&amp;gt;


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

&lt;/div&gt;

&lt;p&gt;and here we render a custom text inside the Menu handle&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

  &amp;lt;float-menu
    :dimension&lt;span class="o"&gt;=&lt;/span&gt;50
    :menu-data&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"menuData"&lt;/span&gt;
    menu-orientation&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bottom"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    Click
  &amp;lt;/float-menu&amp;gt;


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

&lt;/div&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%2Fi%2Fy3no4g46f831l0jvfuvo.png" 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%2Fi%2Fy3no4g46f831l0jvfuvo.png" alt="example2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔨 Built with
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.tovue"&gt;Vue.JS&lt;/a&gt; - The Component is written in Vue + &lt;a href="https://dev.totypescript"&gt;Typescript&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📄 Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The project uses &lt;a href="https://dev.tovite"&gt;vite&lt;/a&gt; instead of &lt;a class="mentioned-user" href="https://dev.to/vue"&gt;@vue&lt;/a&gt;/cli. I choose vite for speed and i also believe &lt;a href="https://dev.tovite"&gt;vite&lt;/a&gt; will be the future.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Meta
&lt;/h2&gt;

&lt;p&gt;Prabhu Murthy – &lt;a href="https://twitter.com/prabhumurthy2" rel="noopener noreferrer"&gt;@prabhumurthy2&lt;/a&gt; – &lt;a href="mailto:prabhu.m.murthy@gmail.com"&gt;prabhu.m.murthy@gmail.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.prabhumurthy.com" rel="noopener noreferrer"&gt;https://www.prabhumurthy.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Distributed under the MIT license. See &lt;code&gt;LICENSE&lt;/code&gt; for more information.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/prabhuignoto/float-menu" rel="noopener noreferrer"&gt;https://github.com/prabhuignoto/float-menu&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you like this project, show some love. ⭐ &lt;a href="https://github.com/prabhuignoto/float-menu/stargazers" rel="noopener noreferrer"&gt;Star this Project&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vue</category>
      <category>webdev</category>
      <category>typescript</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Introducing react-chrono - A flexible Timeline component for React</title>
      <dc:creator>Prabhu Murthy</dc:creator>
      <pubDate>Fri, 18 Sep 2020 17:01:12 +0000</pubDate>
      <link>https://dev.to/prabhuignoto/flexible-timeline-component-for-react-21gd</link>
      <guid>https://dev.to/prabhuignoto/flexible-timeline-component-for-react-21gd</guid>
      <description>&lt;p&gt;Introducing &lt;strong&gt;react-chrono&lt;/strong&gt;, a flexible timeline component built for React.&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%2Fi%2Fg3i40kmmhbncabzvadgh.png" 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%2Fi%2Fg3i40kmmhbncabzvadgh.png" alt="app-home"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/prabhuignoto/react-chrono" rel="noopener noreferrer"&gt;Fork this Repository&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://react-chrono.vercel.app/" rel="noopener noreferrer"&gt;Demos&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/prabhuignoto" rel="noopener noreferrer"&gt;
        prabhuignoto
      &lt;/a&gt; / &lt;a href="https://github.com/prabhuignoto/react-chrono" rel="noopener noreferrer"&gt;
        react-chrono
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🕑 Modern Timeline Component for React
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;✅ &lt;strong&gt;Modes&lt;/strong&gt; - Render timelines in three unique modes &lt;code&gt;horizontal&lt;/code&gt;, &lt;code&gt;vertical&lt;/code&gt; or &lt;code&gt;tree&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Tree&lt;/strong&gt; - Use the &lt;code&gt;Tree&lt;/code&gt; mode to layout timeline cards vertically in a tree like fashion.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Slideshow&lt;/strong&gt; - Auto play the timeline in &lt;code&gt;slideshow&lt;/code&gt; mode.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Keyboard Support&lt;/strong&gt; - Navigate the timelines using UP , DOWN keys in &lt;code&gt;vertical&lt;/code&gt; or &lt;code&gt;tree&lt;/code&gt; mode. In &lt;code&gt;horizontal&lt;/code&gt; mode LEFT , RIGHT keys can be used.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Custom theme&lt;/strong&gt; - Customize the colors using the &lt;code&gt;theme&lt;/code&gt; prop&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn &lt;span class="nb"&gt;install &lt;/span&gt;react-chrono
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🚀 Getting Started
&lt;/h2&gt;

&lt;p&gt;Please make sure you wrap the component in a container that has a &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt;. When no &lt;code&gt;mode&lt;/code&gt; is specified, the component defaults to &lt;code&gt;HORIZONTAL&lt;/code&gt; mode.&lt;/p&gt;

&lt;p&gt;Use the &lt;code&gt;items&lt;/code&gt; prop to create the timeline. Each Timeline item have the following properties.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;title&lt;/code&gt;, &lt;code&gt;contentTitle&lt;/code&gt;, &lt;code&gt;contentText&lt;/code&gt;, &lt;code&gt;contentDetailedText&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Here is an example Timeline with minimal settings.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  const items &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[{&lt;/span&gt;
    title: &lt;span class="s2"&gt;"May 1940"&lt;/span&gt;,
    contentTitle: &lt;span class="s2"&gt;"Dunkirk"&lt;/span&gt;,
    contentText:&lt;span class="s2"&gt;"Men of the British Expeditionary Force (BEF) wade out to a destroyer during the evacuation from Dunkirk."&lt;/span&gt;,
    contentDetailedText: &lt;span class="s2"&gt;"On 10 May 1940, Hitler began his long-awaited offensive in the west..."&lt;/span&gt;,
  &lt;span class="o"&gt;}&lt;/span&gt;, ...]&lt;span class="p"&gt;;&lt;/span&gt;

  &amp;lt;div &lt;span class="nv"&gt;style&lt;/span&gt;&lt;span class="o"&gt;={{&lt;/span&gt; width: &lt;span class="s2"&gt;"500px"&lt;/span&gt;, height: &lt;span class="s2"&gt;"400px"&lt;/span&gt; &lt;span class="o"&gt;}}&amp;gt;&lt;/span&gt;
    &amp;lt;chrono &lt;span class="nv"&gt;items&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;items&lt;span class="o"&gt;}&lt;/span&gt; /&amp;gt;
  &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fi%2Fg3i40kmmhbncabzvadgh.png" 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%2Fi%2Fg3i40kmmhbncabzvadgh.png" alt="app-home"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Vertical
&lt;/h3&gt;

&lt;p&gt;To render the timeline vertically use the &lt;code&gt;VERTICAL&lt;/code&gt; mode&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &amp;lt;div &lt;span class="nv"&gt;style&lt;/span&gt;&lt;span class="o"&gt;={{&lt;/span&gt; width: &lt;span class="s2"&gt;"500px"&lt;/span&gt;, height: &lt;span class="s2"&gt;"950px"&lt;/span&gt; &lt;span class="o"&gt;}}&amp;gt;&lt;/span&gt;
    &amp;lt;chrono
      &lt;span class="nv"&gt;items&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;items&lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"VERTICAL"&lt;/span&gt;
    /&amp;gt;
  &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fi%2Fvupx8hqds7skb4kjvec2.png" 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%2Fi%2Fvupx8hqds7skb4kjvec2.png" alt="vertical"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tree
&lt;/h3&gt;

&lt;p&gt;In &lt;code&gt;Tree&lt;/code&gt; mode the timeline is rendered vertically with cards alternating between left and right sides.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &amp;lt;div &lt;span class="nv"&gt;style&lt;/span&gt;&lt;span class="o"&gt;={{&lt;/span&gt; width: &lt;span class="s2"&gt;"500px"&lt;/span&gt;, height: &lt;span class="s2"&gt;"950px"&lt;/span&gt; &lt;span class="o"&gt;}}&amp;gt;&lt;/span&gt;
    &amp;lt;chrono
      &lt;span class="nv"&gt;items&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;items&lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"TREE"&lt;/span&gt;
    /&amp;gt;
  &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fi%2Fdzvozf43ywfbwu5aetgq.png" 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%2Fi%2Fdzvozf43ywfbwu5aetgq.png" alt="app-tree"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Slideshow
&lt;/h3&gt;

&lt;p&gt;Play the timeline automatically with the &lt;code&gt;slideShow&lt;/code&gt; mode.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &amp;lt;div &lt;span class="nv"&gt;style&lt;/span&gt;&lt;span class="o"&gt;={{&lt;/span&gt; width: &lt;span class="s2"&gt;"500px"&lt;/span&gt;, height: &lt;span class="s2"&gt;"950px"&lt;/span&gt; &lt;span class="o"&gt;}}&amp;gt;&lt;/span&gt;
    &amp;lt;chrono
      &lt;span class="nv"&gt;items&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;items&lt;span class="o"&gt;}&lt;/span&gt;
      slideShow
    /&amp;gt;
  &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fi%2F5gvptdl8oymyv0fizd90.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%2Fi%2F5gvptdl8oymyv0fizd90.gif" alt="demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it on CodeSandbox!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codesandbox.io/s/react-chrono-bg56e?fontsize=14&amp;amp;hidenavigation=1&amp;amp;theme=dark" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodesandbox.io%2Fstatic%2Fimg%2Fplay-codesandbox.svg" alt="Edit react-chrono"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Props
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;description&lt;/th&gt;
&lt;th&gt;default&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;mode&lt;/td&gt;
&lt;td&gt;sets the layout for the timeline component. can be &lt;code&gt;HORIZONTAL&lt;/code&gt;, &lt;code&gt;VERTICAL&lt;/code&gt; or &lt;code&gt;TREE&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HORIZONTAL&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;items&lt;/td&gt;
&lt;td&gt;collection of timeline items&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;disableNavOnKey&lt;/td&gt;
&lt;td&gt;disables keyboard navigation&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;slideShow&lt;/td&gt;
&lt;td&gt;starts the timeline in slideshow mode&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;slideItemDuration&lt;/td&gt;
&lt;td&gt;The amount of delay in &lt;code&gt;ms&lt;/code&gt; for the timeline points in &lt;code&gt;slideshow&lt;/code&gt; mode&lt;/td&gt;
&lt;td&gt;2500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;titlePosition&lt;/td&gt;
&lt;td&gt;sets the position of the title in &lt;code&gt;HORIZONTAL&lt;/code&gt; mode. can be &lt;code&gt;TOP&lt;/code&gt; or &lt;code&gt;BOTTOM&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TOP&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;itemWidth&lt;/td&gt;
&lt;td&gt;width of the timeline section in &lt;code&gt;HORIZONTAL&lt;/code&gt; mode&lt;/td&gt;
&lt;td&gt;320&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Mode
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;react-chrono&lt;/code&gt; supports three modes &lt;code&gt;HORIZONTAL&lt;/code&gt;, &lt;code&gt;VERTICAL&lt;/code&gt; and &lt;code&gt;TREE&lt;/code&gt;. The mode prop can be used to define the orientation of the cards.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keyboard Navigation &amp;amp; Disabling it
&lt;/h3&gt;

&lt;p&gt;The timeline by default can be navigated via keyboard.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For &lt;code&gt;HORIZONTAL&lt;/code&gt; mode use your LEFT RIGHT arrow keys for navigation.&lt;/li&gt;
&lt;li&gt;For &lt;code&gt;VERTICAL&lt;/code&gt; or &lt;code&gt;TREE&lt;/code&gt; mode, the timeline can be navigated via the UP DOWN arrow keys.&lt;/li&gt;
&lt;li&gt;To easily jump to the first item or the last item in the timeline, use HOME or END key.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The keyboard navigation can be completely disabled by setting the &lt;code&gt;disableNavOnKey&lt;/code&gt; to true.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &amp;lt;chrono &lt;span class="nv"&gt;items&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;items&lt;span class="o"&gt;}&lt;/span&gt; disableNavOnKey /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Slideshow Mode
&lt;/h3&gt;

&lt;p&gt;Slideshow can be enabled by setting the &lt;code&gt;slideShow&lt;/code&gt; prop to true. You can also set an optional &lt;code&gt;slideItemDuration&lt;/code&gt; that sets the time delay between cards.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &amp;lt;chrono &lt;span class="nv"&gt;items&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;items&lt;span class="o"&gt;}&lt;/span&gt; slideShow &lt;span class="nv"&gt;slideItemDuration&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;4500&lt;span class="o"&gt;}&lt;/span&gt; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Title Position
&lt;/h3&gt;

&lt;p&gt;This setting only applies for the &lt;code&gt;HORIZONTAL&lt;/code&gt; mode. The prop &lt;code&gt;titlePosition&lt;/code&gt; sets the position of the individual titles to either &lt;code&gt;TOP&lt;/code&gt; or &lt;code&gt;BOTTOM&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &amp;lt;chrono &lt;span class="nv"&gt;items&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;items&lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="nv"&gt;titlePosition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"BOTTOM"&lt;/span&gt; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Item Width
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;itemWidth&lt;/code&gt; prop can be used to set the width of each individual timeline sections. This setting is applicable only for the &lt;code&gt;HORIZONTAL&lt;/code&gt; mode.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built with
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.toreact"&gt;ReactJS&lt;/a&gt; - The Component is written in React and &lt;a href="https://dev.totypescript"&gt;Typescript&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Meta
&lt;/h2&gt;

&lt;p&gt;Prabhu Murthy – &lt;a href="https://twitter.com/prabhumurthy2" rel="noopener noreferrer"&gt;@prabhumurthy2&lt;/a&gt; – &lt;a href="mailto:prabhu.m.murthy@gmail.com"&gt;prabhu.m.murthy@gmail.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Distributed under the MIT license. See &lt;code&gt;LICENSE&lt;/code&gt; for more information.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/prabhuignoto/react-chrono" rel="noopener noreferrer"&gt;https://github.com/prabhuignoto/react-chrono&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>typescript</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
