<?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: Daria Filozop</title>
    <description>The latest articles on DEV Community by Daria Filozop (@daria_filozop_bfe6aa68940).</description>
    <link>https://dev.to/daria_filozop_bfe6aa68940</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%2F3263895%2F8d57a746-f792-4bb3-8b9f-3b2987855dfc.jpg</url>
      <title>DEV Community: Daria Filozop</title>
      <link>https://dev.to/daria_filozop_bfe6aa68940</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/daria_filozop_bfe6aa68940"/>
    <language>en</language>
    <item>
      <title>#CodePenChallange: Colorful Way of Data Presentation Using Data Viz Library</title>
      <dc:creator>Daria Filozop</dc:creator>
      <pubDate>Fri, 20 Feb 2026 15:01:09 +0000</pubDate>
      <link>https://dev.to/daria_filozop_bfe6aa68940/codepenchallange-colorful-way-of-data-presentation-using-data-viz-library-2d9b</link>
      <guid>https://dev.to/daria_filozop_bfe6aa68940/codepenchallange-colorful-way-of-data-presentation-using-data-viz-library-2d9b</guid>
      <description>&lt;p&gt;Just realized it had been a long time since I'd posted any interesting demos. So, I checked this month’s &lt;a href="https://codepen.io/challenges/2026/february/1" rel="noopener noreferrer"&gt;#CodePenChallenge&lt;/a&gt;, and that’s where I’ve found my inspiration. I decided to create something bright and vivid, a small experiment where color isn’t just a decoration, but the data itself. Sounds interesting? Then I’m sure you’re gonna like what comes next.&lt;/p&gt;

&lt;p&gt;So, I’m happy to present you Colors Cheatsheet, powered by &lt;a href="https://www.webdatarocks.com/demos/js/pivot-table-demo/" rel="noopener noreferrer"&gt;WebDataRocks pivot table library&lt;/a&gt;, featuring dynamic styling, custom cell rendering, and a rainbow-glass UI effect.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For better experience I recommend opening it in a &lt;a href="https://codepen.io/webdatarocks/pen/yyJQwmG" rel="noopener noreferrer"&gt;new tab&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;

&lt;iframe height="600" src="https://codepen.io/webdatarocks/embed/yyJQwmG?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Connecting WebDataRocks 📦&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Firstly, include WebDataRocks library:&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;link href="https://cdn.webdatarocks.com/latest/webdatarocks.min.css" rel="stylesheet" /&amp;gt;
&amp;lt;script src="https://cdn.webdatarocks.com/latest/webdatarocks.toolbar.min.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src="https://cdn.webdatarocks.com/latest/webdatarocks.js"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then create its container with a heading which we’ll style in the future:&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;div class="container"&amp;gt;
  &amp;lt;h3&amp;gt;🎨 Colors Cheatsheet 🎨&amp;lt;/h3&amp;gt;
  &amp;lt;div id="pivotContainer"&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Initializing the Pivot Table 🚀&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now let’s render the pivot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const pivot = new WebDataRocks({
  container: "#pivotContainer",
  customizeCell: customizeCellFunction,
  width: 800,
  report: {
    dataSource: {
      data: getData()
    },
    slice: {
      columns: [
        { uniqueName: "colorName" },
        { uniqueName: "family" },
        { uniqueName: "hex" },
        { uniqueName: "rgb" },
        { uniqueName: "hue" },
        { uniqueName: "saturation" },
        { uniqueName: "lightness" }
      ]
    },
    options: {
      grid: {
        type: "flat",
        showGrandTotals: "off"
      }
    }
  }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We’re using a flat grid layout here, displaying clean, easy-to-read data.&lt;/p&gt;

&lt;p&gt;By including hue, saturation, and lightness alongside HEX and RGB, we’re not just showing how a color looks, but also how it’s structured mathematically. It actually helps to understand colors more deeply, connecting what we see on the screen with the values behind it.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Smart Cell Customization 🎯&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now comes the fun part.&lt;/p&gt;

&lt;p&gt;Instead of displaying color names just as plain text, we bring them to life by filling each cell with the color it represents.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function customizeCellFunction(cell, data) {
  if (
    data &amp;amp;&amp;amp;
    data.type !== "header" &amp;amp;&amp;amp;
    data.hierarchy &amp;amp;&amp;amp;
    data.hierarchy.uniqueName === "colorName"
  ) {
    const textColor = data.recordId;
    cell.style["color"] = textColor;
    cell.style["background-color"] = data.label;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Header Coloring 🧩&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To improve readability and visual grouping, we color-code headers by category:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const headerColors = {
  colorName: "crimson",
  family: "orange",
  hex: "gold",
  rgb: "limegreen",
  hue: "dodgerblue",
  saturation: "blue",
  lightness: "indigo"
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Designing the Rainbow Glass UI 🌈&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For our demo topic, we definitely need appropriate customization, so let’s apply a rainbow background with a glass effect here.&lt;/p&gt;

&lt;p&gt;As a first step, create a rainbow gradient on the background:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;body {
  background: linear-gradient(
    135deg,
    crimson 0%,
    orange 16.66%,
    gold 33.33%,
    limegreen 50%,
    dodgerblue 66.66%,
    indigo 83.33%,
    mediumpurple 100%
  );
  background-attachment: fixed;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then wrap the pivot in a semi-transparent container to create the glass effect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.container {
  max-width: 1000px;
  margin: 0 auto;
  background: rgba(255, 255, 255, 0.95);
  border-radius: 15px;
  box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
  backdrop-filter: blur(10px);
  padding: 30px;
  border: 2px solid rgba(255, 255, 255, 0.2);
  position: relative;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Moreover, to add some kind of visual depth, add a glowing animated border:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.container::before {
  content: "";
  position: absolute;
  top: -2px;
  left: -2px;
  right: -2px;
  bottom: -2px;
  background: linear-gradient(
    45deg,
    crimson,
    orange,
    gold,
    limegreen,
    dodgerblue,
    blue,
    indigo,
    crimson
  );
  z-index: -1;
  border-radius: 17px;
  animation: sparkle 3s ease-in-out infinite;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And as I promised, it’s time for customizing the heading:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;h3 {
    text-align: center;
    margin: 0 0 30px 0;
    font-size: 2.5em;
    font-weight: bold;
    background: linear-gradient(
        135deg,
        crimson,
        orange,
        gold,
        limegreen,
        dodgerblue,
        indigo,
        mediumpurple
    );
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
    background-clip: text;
    text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1);
    letter-spacing: 2px;
    text-transform: uppercase;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Now, happy to announce that our Colors Cheatsheet is ready for use! Check it and let the colors guide you. &lt;/p&gt;

&lt;p&gt;As always, I’d love to hear your feedback, any thoughts on improving this project, or ideas for the next ones.&lt;/p&gt;

</description>
      <category>codepen</category>
      <category>coding</category>
      <category>tutorial</category>
      <category>data</category>
    </item>
    <item>
      <title>Entering the Upside Down of Pivot Grid: A Stranger Things Data-Viz Tutorial</title>
      <dc:creator>Daria Filozop</dc:creator>
      <pubDate>Mon, 15 Dec 2025 12:41:26 +0000</pubDate>
      <link>https://dev.to/daria_filozop_bfe6aa68940/entering-the-upside-down-of-pivot-grid-a-stranger-things-data-viz-tutorial-4db7</link>
      <guid>https://dev.to/daria_filozop_bfe6aa68940/entering-the-upside-down-of-pivot-grid-a-stranger-things-data-viz-tutorial-4db7</guid>
      <description>&lt;p&gt;Hi!&lt;/p&gt;

&lt;p&gt;No, it’s not another holiday project, but the subject is just as captivating. I’m sure most of you have been binge-watching “Stranger Things” season 5, and I’m not the exception. This mysterious, 1980s-style story inspired me to create a data-viz project in its style. So keep reading, I promise it’s going to be pretty interesting!&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tech Stack ⚙️&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No doubt, for a project like this, I should have an appropriate dataset, so I found &lt;a href="https://www.kaggle.com/datasets/thedevastator/stranger-things-episode-ratings" rel="noopener noreferrer"&gt;“Stranger Things Episode Ratings”&lt;/a&gt; on Kaggle. It’s intriguing to find out what the most highly rated episode is per season and throughout the whole series, right? For visualizing this entire dataset in a table format, &lt;a href="https://www.webdatarocks.com/" rel="noopener noreferrer"&gt;WebDataRocks&lt;/a&gt; will assist us. It’s pretty intuitive to use and offers numerous customization options.&lt;br&gt;
So, let’s step into the Upside Down of this dataset 🔦&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Adding WebDataRocks Library and Styles in HTML 📦&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As an initial step, we should load styles and the container of WebDataRocks:&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;link id="wdr-theme" href="https://cdn.webdatarocks.com/latest/theme/stripedteal/webdatarocks.min.css" rel="stylesheet" /&amp;gt;
&amp;lt;script src="https://cdn.webdatarocks.com/latest/webdatarocks.toolbar.min.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src="https://cdn.webdatarocks.com/latest/webdatarocks.js"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Moreover, here I will use the built-in theme “Striped-Teal.” (By the way, WebDataRocks suggests &lt;a href="https://www.webdatarocks.com/doc/js/changing-report-themes/" rel="noopener noreferrer"&gt;six more themes&lt;/a&gt; and allows creating your own)&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Initializing the Pivot Table 🚀&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, we need to render the pivot table for future display of data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var pivot = new WebDataRocks({
  container: "wdr-component",
  width: "100%",
  height: 490,
  report: {
    dataSource: { data: getData() },
    options: {
      grid: { showTotals: "off", showGrandTotals: "off" }
    }
  }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For fetching the data, as you see, we call the &lt;em&gt;getData()&lt;/em&gt; function, so let’s get it done now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function getData() {
  return [
    {
      index: {caption: "index", type: "number"},
      Episode_Number: {caption: "Episode Number", type: "number"},
      Title: {caption: "Title", type: "string" },
      Image_url: {caption: "Image_url", type: "string"},
      Year: {caption: "Year", type: "string"},
      Description: {caption: "Description", type: "string"},
      Genre: {caption: "Genre", type: "string"},
      Runtime: {caption: "Runtime", type: "string"},
      Rating: {caption: "Rating", type: "number"}
    }
...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, I guess we don’t need that much information, which is stored in the dataset, so let’s display only the most important one. To achieve it, we need to add the &lt;a href="https://www.webdatarocks.com/api/slice-object/" rel="noopener noreferrer"&gt;Slice Object&lt;/a&gt; to the pivot component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var pivot = new WebDataRocks({
…
  report: {
    dataSource: { data: getData() },
   slice: {
      rows: [
        {uniqueName: "Episode_Number"},
        {uniqueName: "Year"},
        {uniqueName: "Title"},
        {uniqueName: "Runtime"}
      ],
      columns: [
        {uniqueName: "Measures"}
      ],
      measures: [
        {uniqueName: "Rating" , aggregation: "sum"}
      ],
      expands: {expandAll: true}
    },
…
  }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, I’ve decided to display only the &lt;strong&gt;Episode Number&lt;/strong&gt;, &lt;strong&gt;Year&lt;/strong&gt;, &lt;strong&gt;Title&lt;/strong&gt;, and &lt;strong&gt;Runtime&lt;/strong&gt;. Moreover, for convenience, let’s display the &lt;strong&gt;Episode Number&lt;/strong&gt; in ascending order. That means that it will go from the first episode to the newest one, and here sorting in WebDataRocks will help us make it easy. All we need to do is call the &lt;em&gt;sort&lt;/em&gt; and set it to &lt;em&gt;asc&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{uniqueName: "Episode_Number", sort: "asc"},
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Conditional Formatting 🖌️&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Okay, but it would be perfect somehow to highlight the most rated episodes, wouldn’t it? So, let’s do it by using &lt;a href="https://www.webdatarocks.com/doc/js/conditional-formatting/" rel="noopener noreferrer"&gt;conditional formatting in WebDataRocks&lt;/a&gt;!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   conditions: [
      {
        formula: "#value &amp;gt;= 9",
        measure: "Rating",
        format: {
          backgroundColor: "#007A6E",
          color: "#FFFFFF",
          fontFamily: "Arial",
          fontSize: "12px"
        }
      }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By using the code snippet above, we will highlight episodes with a rating of 9 or higher.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Styling the Heading 🎨&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At first, I wanted so much to recreate the heading in the same style as “Stranger Things” has: font, colors, structure, etc. And I think I achieved it! Let’s take a closer look.&lt;/p&gt;

&lt;p&gt;As usual, start with an easy &lt;em&gt;div&lt;/em&gt; element in your HTML:&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;h2 id="title"&amp;gt;Stranger Things Episode Rating&amp;lt;/h2&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we center our text and give it a dark cinematic background:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;body {
  height: 100%;
  padding: 30px;
  margin: 0;
  display: grid;
  place-items: center;
  background: #100d08;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To create something similar to the well-known “Stranger Things” red glowing, we should set these changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;h2 {
  margin: 0 0 20px 0;
  font-family: "Benguiat Bold", "Times New Roman", serif; // Typical Stranger Things font
  font-size: 2.5rem;
  font-weight: bold;
  text-align: center;
  margin-bottom: 2rem;

 /* neon outlight */
  color: #000;
  text-shadow: 0 0 5px #ff0000;
  -webkit-text-stroke: 2px #ff0000;
  text-stroke: 2px #ff0000;

  position: relative;
  z-index: 500;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Upside Down World Effect 🔮&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And here’s the time for actual magic, and I guess the main feature of this project: Upside Down World’s version of the demo! Being more precise, there will be a button, clicking on which will move the user to those mysterious and scary dimensions.&lt;/p&gt;

&lt;p&gt;At the beginning, let’s simply add a button that will be responsible for these transitions.&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;button id="toggle-spotlight" title="Turn the light off"&amp;gt;⬇️ Go to the Upside Down&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next step is to add our future spotlight effect wrapper:&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;div id="wrapper"&amp;gt;
  &amp;lt;div class="spotlight off"&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;div id="wdr-component"&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now time to edit CSS code, here is applied all changed styles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;h2 {
  font-family: "Benguiat Bold", serif;
  font-size: 2.5rem;
  color: #000;
  text-shadow: 0 0 5px #ff0000;
  -webkit-text-stroke: 2px #ff0000;
}
h2.upside-down {
  transform: rotate(180deg);
  text-shadow: 0 0 5px #ff4444;
  -webkit-text-stroke: 2px #ff4444;
}
.spotlight {
  position: absolute;
  inset: 0;
  background-image: radial-gradient(
    circle at var(--clientX,50%) var(--clientY,50%),
    transparent 6em,
    black 8em
  );
}
.spotlight.off {
  opacity: 0;
}
#toggle-spotlight {
  position: absolute; top: 1rem; left: 1rem;
  background: #880808; color: #fff;
  padding: 8px 14px; border-radius: 8px;
  cursor: pointer;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, complete the project with a bit of JavaScript that will actually make our styles flip from one world to another:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;toggleBtn.addEventListener("click", () =&amp;gt; {
  spotlightEnabled = !spotlightEnabled;
  spotlight.classList.toggle("off", !spotlightEnabled);
  title.classList.toggle("upside-down", spotlightEnabled);

  if (spotlightEnabled) {
    themeLink.href = lightBlueTheme;
    toggleBtn.textContent = "🚲 Go back";
    toggleBtn.title = "Light up the grid";
  } else {
    themeLink.href = defaultTheme;
    toggleBtn.textContent = "⬇️ Go to the Upside Down";
    toggleBtn.title = "Turn the light off";
  }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, the last adjustments, with this code, we will make our lighter move:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wrapper.addEventListener("mousemove", (e) =&amp;gt; {
  const rect = wrapper.getBoundingClientRect();
  const x = e.clientX - rect.left;
  const y = e.clientY - rect.top;
  wrapper.style.setProperty("--clientX", x + "px");
  wrapper.style.setProperty("--clientY", y + "px");
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Results ✅&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And that’s it, you’ve just walked through a full Stranger Things–themed data visualization with a dynamic Upside Down effect, custom styling, conditional formatting, and interactive spotlight movement.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For better experience I recommend opening it in a &lt;a href="https://codepen.io/webdatarocks/pen/ByKyozm" rel="noopener noreferrer"&gt;new tab&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;

&lt;iframe height="600" src="https://codepen.io/webdatarocks/embed/ByKyozm?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;I’d love to hear what you think! Did you enjoy the transition to the Upside Down? Any ideas for improvements?&lt;br&gt;
And tell me, are you also counting down the days to the Season 5 finale on December 31?&lt;/p&gt;

</description>
      <category>data</category>
      <category>showdev</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Building a Snowy Weather Dashboard with Free Pivot Grid Library</title>
      <dc:creator>Daria Filozop</dc:creator>
      <pubDate>Tue, 09 Dec 2025 14:05:52 +0000</pubDate>
      <link>https://dev.to/daria_filozop_bfe6aa68940/building-a-snowy-weather-dashboard-with-free-pivot-grid-library-267n</link>
      <guid>https://dev.to/daria_filozop_bfe6aa68940/building-a-snowy-weather-dashboard-with-free-pivot-grid-library-267n</guid>
      <description>&lt;p&gt;Hi!&lt;/p&gt;

&lt;p&gt;Have you seen snow this year yet? My city was full of it yesterday, and it actually inspired me to create a new project! Moreover, this week’s &lt;a href="https://codepen.io/challenges/2025/december/1" rel="noopener noreferrer"&gt;#CodePen Challenge&lt;/a&gt; is about snow. No intrigue, today I’ll tell you how I developed a visualization of the &lt;a href="https://www.kaggle.com/datasets/emmanuelfwerr/london-weather-data" rel="noopener noreferrer"&gt;“London Weather Data”&lt;/a&gt; dataset using free web pivot table component (WebDataRocks) and a snow effect. Sounds interesting? Then grab a warm coffee and let’s dive in!&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Including WebDataRocks Library and HTML Container 🖥️&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First, add the necessary CSS and JS files to load WebDataRocks and its Toolbar:&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;link href="https://cdn.webdatarocks.com/latest/theme/lightblue/webdatarocks.min.css" rel="stylesheet" /&amp;gt;
&amp;lt;script src="https://cdn.webdatarocks.com/latest/webdatarocks.toolbar.min.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src="https://cdn.webdatarocks.com/latest/webdatarocks.js"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, setting up a container for a pivot table in the HTML part with some instructions for future features:&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;main&amp;gt;
  &amp;lt;h2&amp;gt;The most snowy days in London&amp;lt;/h2&amp;gt;
  &amp;lt;p&amp;gt;Click on a cell to see the snow effect!&amp;lt;/p&amp;gt;
  &amp;lt;div id="wdr-component"&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/main&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Initializing Pivot Table ⚙️&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For rendering a pivot table, we need to initialize WebDataRocks. This code snippet can achieve it, including the &lt;em&gt;&lt;a href="https://www.webdatarocks.com/api/slice-object/" rel="noopener noreferrer"&gt;slice object&lt;/a&gt;&lt;/em&gt;, where we set what data we want to be displayed on the screen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var pivot = new WebDataRocks({
    container: "wdr-component",
    width: 700,
    report: {
        dataSource: { data: getData() },
        slice: {
            rows: [{ uniqueName: "date" }],
            columns: [{ uniqueName: "Measures" }],
            measures: [
                { uniqueName: "max_temp", format: "temp" },
                { uniqueName: "min_temp", format: "temp" },
                { uniqueName: "precipitation", format: "precipitation" },
                { uniqueName: "snow_depth", sort: "desc", format: "snow_depth" }
            ]
        },
        options: {
            grid: { showTotals: "off", showGrandTotals: "off" },
            showAggregationLabels: false
        }
    }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Specifying Format Object 📝&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Additionally, within the formats section, you can specify which currency symbol will appear next to the value. To provide users with a better understanding of the data, I added a &lt;strong&gt;temperature&lt;/strong&gt; field in degrees Celsius, &lt;strong&gt;precipitation&lt;/strong&gt; in millimeters, and &lt;strong&gt;snow depth&lt;/strong&gt; in centimeters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;report: {
    formats: [
                { name: "temp", currencySymbol: " °C", textAlign: "right" },
                { name: "precipitation", currencySymbol: " mm", textAlign: "right" },
                { name: "snow_depth", currencySymbol: " cm", textAlign: "right" }
            ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For sure, it’s not the only property that can be set for &lt;em&gt;Format Object&lt;/em&gt;, more info about it can be found in &lt;a href="https://www.webdatarocks.com/api/number-format-object/" rel="noopener noreferrer"&gt;its docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Enable Sorting 🔀&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I guess it is a perfect idea to sort all our data in descending order, so at the moment of just opening the demo, we’ll instantly see the snowiest day of London's history. Using &lt;a href="https://www.webdatarocks.com/doc/js/sorting/" rel="noopener noreferrer"&gt;sorting in WebDataRocks&lt;/a&gt; is quite intuitive, as you only need to specify the field and direction, and the component handles the rest automatically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var pivot = new WebDataRocks({
…
    report: {


            sorting: {
                column: {
                    type: "desc",
                    tuple: [],
                    measure: "snow_depth"
        }
…
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Styling for Winter Vibe ❄️&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Okay, our display of data is ready, but I want to add more winter atmosphere, and here styling will help us. By adjusting colors, backgrounds, and headers, we can create a frosty look that evokes the feeling of cold London mornings, right on the dashboard.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Snow Effect ☃️&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And here’s the last but not least feature of this demo: snow effect! &lt;br&gt;
To add even more cozy and magical winter atmosphere, let’s make it so that when the user clicks on any pivot table cell, snowflakes will fall. Think, will there be a lot of complex code? No, no, all we need to do is add &lt;em&gt;letItSnow()&lt;/em&gt; function, that shows the snowflake container for a couple of seconds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function letItSnow() {
    console.log(true);
    const snowflakeArea = document.querySelector(".snowflake-area");

    if (snowflakeArea) {
        snowflakeArea.style.display = "block";
        snowflakeArea.style.visibility = "visible";

        setTimeout(() =&amp;gt; {
            snowflakeArea.style.display = "none";
        }, 10000);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Define this function on cell click in our pivot container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var pivot = new WebDataRocks({
    container: "wdr-component",
    width: 700,
    cellclick: letItSnow,
…
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, in the HTML file place a separate container with snowflakes, I will use this emoji: ❄️&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;div class="snowflake-area"&amp;gt;
    &amp;lt;div class="snowflake"&amp;gt;❄️&amp;lt;/div&amp;gt;
    &amp;lt;div class="snowflake"&amp;gt;❄️&amp;lt;/div&amp;gt;
    &amp;lt;div class="snowflake"&amp;gt;❄️&amp;lt;/div&amp;gt;
    &amp;lt;div class="snowflake"&amp;gt;❄️&amp;lt;/div&amp;gt;
    &amp;lt;div class="snowflake"&amp;gt;❄️&amp;lt;/div&amp;gt;
    &amp;lt;div class="snowflake"&amp;gt;❄️&amp;lt;/div&amp;gt;
    &amp;lt;div class="snowflake"&amp;gt;❄️&amp;lt;/div&amp;gt;
    &amp;lt;div class="snowflake"&amp;gt;❄️&amp;lt;/div&amp;gt;
    &amp;lt;div class="snowflake"&amp;gt;❄️&amp;lt;/div&amp;gt;
    &amp;lt;div class="snowflake"&amp;gt;❄️&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To make it even more snowy, just add more &lt;em&gt;div&lt;/em&gt; with class “snowflake”&lt;/p&gt;

&lt;p&gt;And the final touch is the CSS code for creating the effect of snowflakes falling out of the top of the screen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.snowflake-area {
    display: none;
}

.snowflake {
    position: absolute;
    top: -5%;
    font-size: 2rem;
    animation: fall linear infinite;
    opacity: 0.8;
}

@keyframes fall {
    0% {
        transform: translateY(0) rotate(0deg);
    }
    100% {
        transform: translateY(100vh) rotate(360deg);
    }
}

.snowflake:nth-child(1) {
    left: 10%;
    animation-duration: 5s;
}
.snowflake:nth-child(2) {
    left: 20%;
    animation-duration: 3s;
    font-size: 1.5rem;
}
…
.snowflake:nth-child(10) {
    left: 95%;
    animation-duration: 4s;
    font-size: 2.3rem;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Results 🎉&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And that’s it, our little winter-themed data adventure is complete! Actually, it’s always surprising how even the simplest visuals can turn raw data into a bright and interesting story.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For better experience I recommend opening it in a &lt;a href="https://codepen.io/webdatarocks/pen/ogxaddb" rel="noopener noreferrer"&gt;new tab&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;

&lt;iframe height="600" src="https://codepen.io/webdatarocks/embed/ogxaddb?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;I hope this brief tutorial inspires you to create your own winter visualizations.&lt;br&gt;
If you have ideas for improvements or suggestions for the next project, feel free to leave a comment. I’d love to hear your feedback!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>coding</category>
      <category>codepen</category>
      <category>frontend</category>
    </item>
    <item>
      <title>CodePen #Challenge Halloween Time: Building a Pivot Table with Horror Movies using WebDataRocks</title>
      <dc:creator>Daria Filozop</dc:creator>
      <pubDate>Thu, 16 Oct 2025 13:43:24 +0000</pubDate>
      <link>https://dev.to/daria_filozop_bfe6aa68940/codepen-challenge-halloween-time-building-a-pivot-table-with-horror-movies-using-webdatarocks-2m94</link>
      <guid>https://dev.to/daria_filozop_bfe6aa68940/codepen-challenge-halloween-time-building-a-pivot-table-with-horror-movies-using-webdatarocks-2m94</guid>
      <description>&lt;p&gt;Hi guys!&lt;/p&gt;

&lt;p&gt;I continue to experiment with data visualization, and this time, I didn’t spend a long time thinking about the topic for my project; the #CodePenChallenge helped me with that. They posted this month's challenge, which is called &lt;a href="https://codepen.io/challenges/2025/october" rel="noopener noreferrer"&gt;Halloween Time&lt;/a&gt;, and I decided that it’s a perfect topic! Who doesn’t love spooky Halloween atmosphere? And in addition to it, it’s an ideal opportunity to practice time formatting in WebDataRocks!&lt;/p&gt;

&lt;p&gt;So, no intrigue with a tech stack, because this time I’m going to use WebDataRocks. It’s completely free, lightweight, super easy to set up, and perfect for quickly creating pivot tables right in the browser.&lt;/p&gt;

&lt;p&gt;For the dataset, I’ve chosen &lt;a href="https://www.kaggle.com/datasets/shreyanshverma27/imdb-horror-chilling-movie-dataset" rel="noopener noreferrer"&gt;IMDb Horror: Chilling Movie Dataset&lt;/a&gt;. I guess it's perfect for our topic, as it lists the most popular Horror Movies and their durations.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Preparing the Data 📊&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First, I included all needed fields using the &lt;em&gt;getData()&lt;/em&gt; function. Also, defined specific types for each field, for example, the year field was set as a string to avoid unexpected calculations (I think here summing up years doesn’t make much sense).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function getData() {
    return [
        {
            "Movie Title": {
                caption: "Movie Title",
                type: "string"
            },
            "Movie Year": {
                caption: "Movie Year",
                type: "string"
            },
            Runtime: {
                caption: "Runtime",
                type: "time"
            },
            Genre: {
                caption: "Genre",
                type: "string"
            },
            Rating: {
                caption: "Rating",
                type: "number"
            },
            Director: {
                caption: "Director",
                type: "string"
            },
            Votes: {
                caption: "Votes",
                type: "string"
            },
            Gross: {
                caption: "Gross",
                type: "string"
            }
        },
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Settup 🔧&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then, I created a basic HTML project and added WebDataRocks via CDN:&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;link href="https://cdn.webdatarocks.com/latest/theme/dark/webdatarocks.css" rel="stylesheet" /&amp;gt;
&amp;lt;script src="https://cdn.webdatarocks.com/latest/webdatarocks.toolbar.min.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src="https://cdn.webdatarocks.com/latest/webdatarocks.js"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is all you need to get started, no heavy frameworks, just a pivot table ready for customization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Rendering the Pivot Table 💻&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The next step is to render it in a pivot table using WebDataRocks. To do this, I added a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; in my HTML where the pivot table will appear:&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;div id="wdr-component"&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I decided that I want to include not all information from the dataset, so I initialized WebDataRocks and in the slice mentioned, only the needed columns by writing these lines of code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const pivot = new WebDataRocks({
    container: "#wdr-component",
    width: 700,
    report: {
        dataSource: {
            type: "json",
            data: getData()
        },
        slice: {
            rows: [
                {
                    uniqueName: "Movie Title"
                },
                {
                    uniqueName: "Movie Year",
                    aggregation: "sum"
                },
                {
                    uniqueName: "Runtime",
                    aggregation: "sum",
                    sort: "desc"
                },
                {
                    uniqueName: "Rating",
                    aggregation: "sum"
                }
            ]
        },
…
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Highlighting Top-Rated Movie 🎃&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Using WebDataRocks’ conditional formatting, I highlighted all movies with a rating higher than 7 in orange. This makes it easy to spot top horrors instantly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        conditions: [
            {
                formula: "#value &amp;gt; 7",
                measure: "Rating",
                format: {
                    backgroundColor: "#eb5e28",
                    color: "#FFFFFF",
                    fontFamily: "Arial",
                    fontSize: "12px"
                }
            }
        ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Time Format&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Notice that the Runtime column is of type time. In the dataset, it is stored in seconds, but WebDataRocks automatically converts it into a readable &lt;em&gt;HH:MM:SS&lt;/em&gt; format. Everyone’s used to this time format, so it’s incredibly convenient when working with durations or comparing movie lengths. &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Halloween Styling 👻&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After all, it’s Halloween, so let’s create an appropriate design for our dashboard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;body {
    position: relative;
    height: 100vh;
    margin: 0;
    display: grid;
    place-items: center;
    background: #232023;
    font-family: "Nunito", sans-serif;
}

h2 {
    color: #403d39;
    margin: 0 0 15px 0;
    text-align: center;
}

span {
    color: #eb5e28;
}

section {
    background-color: #ccc5b9;
    padding: 20px;
    border-radius: 10px;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can experiment even more with that, change fonts, play with colors, or add a spooky effect.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Results 💡&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And here it is! My fully-Halloween customized pivot table with top horror movies is ready: &lt;/p&gt;

&lt;p&gt;&lt;em&gt;For better experience I recommend opening it in a &lt;a href="https://codepen.io/webdatarocks/pen/raxmqKx" rel="noopener noreferrer"&gt;new tab&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;

&lt;iframe height="600" src="https://codepen.io/webdatarocks/embed/raxmqKx?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;Now it’s 100% easier for me to choose what to watch this weekend. If you’re trying to do something similar with WebDataRocks, feel free to ask any questions in the comments, and I will be happy to help. &lt;/p&gt;

&lt;p&gt;You can also suggest the next topic for my pivot table experiment. I’d like to hear what you think!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>coding</category>
      <category>codepen</category>
    </item>
    <item>
      <title>Svelte + Flexmonster Pivot: Building an Interactive Dashboard of World Happiness</title>
      <dc:creator>Daria Filozop</dc:creator>
      <pubDate>Tue, 12 Aug 2025 09:17:52 +0000</pubDate>
      <link>https://dev.to/daria_filozop_bfe6aa68940/svelte-flexmonster-pivot-pivot-building-an-interactive-dashboard-of-world-happiness-5344</link>
      <guid>https://dev.to/daria_filozop_bfe6aa68940/svelte-flexmonster-pivot-pivot-building-an-interactive-dashboard-of-world-happiness-5344</guid>
      <description>&lt;p&gt;Hi guys!&lt;/p&gt;

&lt;p&gt;Recently, I was thinking about what new project I could create and ended up scrolling through Kaggle in search of a new interesting dataset. And actually, I found it! When I saw its caption, I understood—that’s it. Okay, I’m not gonna keep long intrigues. It’s &lt;a href="https://www.kaggle.com/datasets/jainaru/world-happiness-report-2024-yearly-updated" rel="noopener noreferrer"&gt;the World Happiness Report—2024&lt;/a&gt;. I think it’s quite interesting data to explore because I’ve always been curious about which country people are the happiest in and which position in this rating is my own country.&lt;/p&gt;

&lt;p&gt;As for the tech stack, I used Svelte. It’s a pretty new framework that is actively developing and gaining popularity nowadays. I did some brief research and found that it compiles your code at build time, making it much faster. Also, the community admires its readability, because it has a familiar structure based on HTML, CSS, and JavaScript. Since Svelte is similar to React, which I had experience using before, I thought it would be a good idea to try it out. As well, I was curious to see whether it’s really that good or just hype from the community. By the way, what do you think about Svelte rapidly gaining popularity? Have you tried it already? Would really appreciate your thoughts on it.&lt;/p&gt;

&lt;p&gt;For data visualization, I’ve chosen Flexmonster. It’s a pivot grid library that helps conveniently organize and display your data. Moreover, Flexmonster recently announced its &lt;a href="https://www.flexmonster.com/blog/web-development/svelte-pivot-table-new-integration/" rel="noopener noreferrer"&gt;integration with Svelte&lt;/a&gt;, making it easier to start.&lt;/p&gt;

&lt;p&gt;As a result, I want to get an interactive report based on Svelte and the World Happiness Report 2024 data.&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%2Fgnwd9dd9jowk2ip2uawh.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%2Fgnwd9dd9jowk2ip2uawh.png" alt="Flexmonster Pivot Table" width="800" height="394"&gt;&lt;/a&gt;&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%2Frppnpn0y7ltjspki68fy.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%2Frppnpn0y7ltjspki68fy.png" alt="Flexmonster Charts" width="800" height="366"&gt;&lt;/a&gt;&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%2Fg59yq9uu81cc29p1i2j6.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%2Fg59yq9uu81cc29p1i2j6.png" alt="Flexmonster Charts Top 10" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To achieve it, I took the next steps.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Setting up the project 🔧&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Firstly, you need to create a Svelte project. I was doing it using the command line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx sv create fm-svelte-app
cd fm-svelte-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then get Flexmonster for your project:&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 svelte-flexmonster --save-exact
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Note.&lt;/em&gt; Don’t forget to import Flexmonster styles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import "flexmonster/flexmonster.css";
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now, after these two easy steps, we can start coding!&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Building the Pivot Table 🔢&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Next step is to add the &lt;code&gt;&amp;lt;Flexmonster&amp;gt;&lt;/code&gt; component to &lt;code&gt;App.svelte&lt;/code&gt; file for rendering the pivot table:&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;Flexmonster
  toolbar={true}
  report={{
    dataSource: {
      type: "csv",
      filename: "/World-happiness-report-2024.csv"
    },
    ...
  }}
/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, you can see I enabled the Toolbar. You can also set its value to false if it’s more convenient for you to work without it.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Setting fields to display 📝&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I think this is quite an essential step in the whole project, because now it’s the time to decide which fields to use and how to display them. In my project, I grouped countries by regions and presented them this way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rows: [
  { uniqueName: "Regional indicator" },
  { uniqueName: "Country name", sorting: "CountrySorting" }
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For measures, I wanted to display all the main info from the dataset, so I’ve chosen these parameters: Ladder score, Log GDP per capita, Social support, Healthy life expectancy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;measures: [
  { uniqueName: "Ladder score", aggregation: "average" },
  { uniqueName: "Log GDP per capita", aggregation: "average" },
  { uniqueName: "Social support", aggregation: "average" },
  { uniqueName: "Healthy life expectancy", aggregation: "average" }
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why not only the Ladder score? It shows how happy people are (they rate their life wellbeing from 0 to 10), but it doesn’t explain why they feel that way. I thought it would be better to analyze which factors impact the level of happiness, so I’ve chosen three more (Log GDP per capita, Social support, and Healthy life expectancy).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Log GDP per capita&lt;/strong&gt; measures the average income of people in a country,&lt;br&gt;
&lt;strong&gt;Social support&lt;/strong&gt; shows whether people have relatives or friends to count on in difficult times.&lt;br&gt;
&lt;strong&gt;Healthy life expectancy&lt;/strong&gt; displays the average number of years a newborn can live in good health, without major illness or disability.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Numbers Formatting 📐&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here, I’ve noticed that some numbers in the dataset are five or more digits, which makes the data difficult to read and analyze. So, I formatted all numeric values to show exactly three digits after the decimal point:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;formats: [
  {
    name: "",
    decimalPlaces: 3
  }
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By the way, Flexmonster has many number formatting options; you can read more about them &lt;a href="https://www.flexmonster.com/doc/number-formatting/" rel="noopener noreferrer"&gt;on this documentation page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Sorting by Ladder Score 📈&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Also, I wanted to structure the whole data more, so I sorted all rows in descending order by Ladder Score. You can easily achieve it by writing this code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sorting: {
    column: {
        type: "desc",
        tuple: [],
        measure: {
            uniqueName: "Ladder score",
            aggregation: "average"
        }
    }

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

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Customizing Ladder Score with Emojis 😃&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, to make the dashboard look better, I decided to add emojis depending on the ladder score for each country:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function customizeCell(cell: any, data: any) {
    if (data.type !== "value")
        return;

    if (!data.measure || data.measure.uniqueName !== "Ladder score") return;

    const score = data.value;

    let emoji = "";

    if (score &amp;gt;= 7) {
        emoji = "😃";
    } else if (score &amp;gt;= 5) {
        emoji = "😊";
    } else if (score &amp;gt;= 4) {
        emoji = "😐";
    } else {
        emoji = "😢";
    }

    cell.text = cell.text + emoji;

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

&lt;/div&gt;



&lt;p&gt;And don’t forget about adding the &lt;code&gt;customizeCell&lt;/code&gt; function to &lt;code&gt;&amp;lt;Flexmonster&amp;gt;&lt;/code&gt; component:&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;Flexmonster
  toolbar={true}
  report={{
    dataSource: {
      type: "csv",
      filename: "/World-happiness-report-2024.csv"
    },
    ...
  }}
  customizeCell={customizeCell}
/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 7: Adding Charts 📊&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now it’s time for charts! Using them, I displayed information about the Ladder score in every country. Also, I decided to add to the filter values the top 10 happiest countries (You can do the same with the least happy countries, just by changing &lt;code&gt;desc&lt;/code&gt; to &lt;code&gt;asc&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;slice: {
  rows: [{
    uniqueName: "Country name",
    sort: "desc",
    filter: {
      query: {
        top: 10,
        measure: "Ladder score"
      }
    }
  }],
  columns: [{ uniqueName: "[Measures]" }],
  measures: [
    { uniqueName: "Ladder score", aggregation: "average", format: "averageNumber" }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As I’m using Flexmonster built-in charts, there’s no need to integrate other libraries; adding these lines is enough:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;options: {
  viewType: "charts",
  chart: {
    type: "bar",
    showDataLabels: true
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But if you prefer other charts, Flexmonster integrates with Highcharts, amCharts, Google Charts, and so on. You can learn more about &lt;a href="https://www.flexmonster.com/doc/available-tutorials-charts/" rel="noopener noreferrer"&gt;integration options with other charting libraries&lt;/a&gt; in the docs.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 8: Customization and Styling 🎨&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And here’s, honestly, my favourite part of every project — styling! &lt;/p&gt;

&lt;p&gt;First things first, import into your &lt;code&gt;App.svelte&lt;/code&gt; file your main css file, where you plan to set all customization settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import "./styles.css";
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I decided to do this project quite simple, but modern at the same time.I added borders to the grid, added some spacing, and chose a light gradient background to match the mood of the project. Nothing really complex and easy to do.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My results 🏆&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This project was a great way for me to explore Svelte and its integration with Flexmonster. It was also quite enjoyable working with this dataset, learning which countries are the happiest in the world and analyzing how they may achieve this.&lt;/p&gt;

&lt;p&gt;If you want to look closer at my project, I’ve shared it &lt;a href="https://github.com/filozopdasha/world-happiness-report-2024" rel="noopener noreferrer"&gt;on my GitHub&lt;/a&gt;. Also, in the README, you can find a GIF showing the result.&lt;/p&gt;

&lt;p&gt;Hope this article inspired you to experiment more with new tools and data visualization libraries.&lt;/p&gt;

&lt;p&gt;I would also appreciate your thoughts and feedback. Feel free to ask any questions in the comments!&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>svelte</category>
      <category>analytics</category>
      <category>webdev</category>
    </item>
    <item>
      <title>CodePen #Challenge: Visualizing McDonald’s Menu with Free Pivot Grid Library 👩🏼‍💻📊🍔</title>
      <dc:creator>Daria Filozop</dc:creator>
      <pubDate>Fri, 20 Jun 2025 10:07:40 +0000</pubDate>
      <link>https://dev.to/daria_filozop_bfe6aa68940/codepen-challenge-visualizing-mcdonalds-menu-with-free-pivot-grid-library-4nec</link>
      <guid>https://dev.to/daria_filozop_bfe6aa68940/codepen-challenge-visualizing-mcdonalds-menu-with-free-pivot-grid-library-4nec</guid>
      <description>&lt;p&gt;Hi guys!&lt;/p&gt;

&lt;p&gt;I am a Software Engineering student and a beginner developer. I decided to create this blog to share my journey of learning and developing my professional skills. Now, I usually spend a lot of time doing my uni projects, but sometimes I just want to take a break from all that and try something a bit more fun and unusual.  And recently, I discovered &lt;a href="https://codepen.io/challenges" rel="noopener noreferrer"&gt;#CodePenChallenges&lt;/a&gt;. I think it's a great opportunity to develop your professional skills and experiment with new technologies. &lt;/p&gt;

&lt;p&gt;Every week, CodePen posts a topic - and the rest is up to your imagination. You can create an animation, webpage, mini game, or literally anything. So, this month I decided to give it a try.&lt;/p&gt;

&lt;p&gt;I’ve chosen a recent challenge with a Food topic. Lately, I’ve been exploring different types of data visualization, so I tried to find an interesting dataset. After a bit of searching, I found the &lt;a href="https://www.kaggle.com/code/kathakaliseth/mcdonald-s-menu-comparative-nutrition-values/notebook" rel="noopener noreferrer"&gt;McDonald's Menu - Comparative Nutrition Values dataset&lt;/a&gt;. ​​McDonald's is pretty much everywhere, and hey, who doesn't love their burgers? I thought it'd be fun to turn their menu data into an insightful visual report.&lt;/p&gt;

&lt;p&gt;As a main tool, I’ve chosen &lt;a href="https://www.webdatarocks.com/doc/react/intro/" rel="noopener noreferrer"&gt;WebDataRocks&lt;/a&gt; - a free pivot grid library, because it’s easy to use, free, and perfect for quickly creating interactive pivot tables with prebuilt functional and different customization options.&lt;/p&gt;

&lt;p&gt;So in this article, I'll walk you through my workflow for this Codepen Challenge and show you how to create a pivot table. Sounds intriguing? Let’s take a look!&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: JS code ⚙️&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So first, I loaded the entire McDonald’s menu dataset, and only then did I realize how easy it is to get lost there (never expected McDonald’s to have that many meals). That’s why I decided to simplify things from the start and display only selected categories in the JavaScript pivot grid.&lt;/p&gt;

&lt;p&gt;For example, in code, I limited the categories like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;            {
                uniqueName: "Category",
                filter: {
                    members: [
                        "Category.Breakfast",
                        "Category.Beef &amp;amp; Pork",
                        "Category.Chicken &amp;amp; Fish"
                    ]
                }
            },
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;By doing this, I filtered the dataset before it was even loaded into the pivot table. So, instead of a long list of every McDonald’s item from the dataset, users immediately see only the needed and prechosen information.&lt;/p&gt;

&lt;p&gt;For more details about filtering in WebDataRocks, you can check the &lt;a href="https://www.webdatarocks.com/doc/js/fields-filtering/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Also, by default, WebDataRocks uses a compact layout form, but I am more used to Excel, so I chose &lt;a href="https://www.webdatarocks.com/doc/js/forms/" rel="noopener noreferrer"&gt;the classic layout&lt;/a&gt;, which shows sub-levels of hierarchies, one by one, in separate columns. &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: CSS code 🎨&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For better styling of my JavaScript pivot table example, I import the “Quicksand” font and customize the background with burger emojis. To achieve this, you first need to import the chosen font:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@import url("https://fonts.googleapis.com/css2?family=Quicksand:wght@300..700&amp;amp;display=swap");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then specify it in the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;body {
    font-family: "Quicksand", serif;
    background-image: url("data:image/svg+xml,&amp;lt;svg xmlns='http://www.w3.org/2000/svg' width='32' height='32'&amp;gt;&amp;lt;text x='0' y='24' font-size='24'&amp;gt;🍔&amp;lt;/text&amp;gt;&amp;lt;/svg&amp;gt;");
    height: 100vh;
    margin: 20px;
    background: #ffd700;
    display: flex;
    flex-direction: column;
    align-items: center;
    background-repeat: repeat;
    background-size: 64px 64px;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, WebDataRocks has &lt;a href="https://www.webdatarocks.com/doc/js/changing-report-themes/" rel="noopener noreferrer"&gt;built-in themes&lt;/a&gt;, which are ready-to-use CSS files, so I decided to use the orange one. You can do it easily by adding to your HTML code:&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;link href="https://cdn.webdatarocks.com/latest/theme/orange/webdatarocks.css" rel="stylesheet" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My result of the challenge: ✅&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This Codepen Challenge was such a fun and interesting experience for me. Now you can easily check the energy and nutrient content of your favorite burger. My demo is ready for you to try out! &lt;/p&gt;

&lt;p&gt;&lt;em&gt;For better experience I recommend opening it in a &lt;a href="https://codepen.io/webdatarocks/pen/azzPobE" rel="noopener noreferrer"&gt;new tab&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/webdatarocks/embed/azzPobE?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;I would really appreciate your feedback and any thoughts.&lt;/p&gt;

&lt;p&gt;Also, if you have any questions about how to add a JS pivot table to your web application, feel free to ask me in the comments or send a DM. I’ll be happy to help!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>codepen</category>
      <category>javascript</category>
      <category>css</category>
    </item>
  </channel>
</rss>
