JSFiddle - React, Tailwind, and code Playground

by Vladymyr Shevchuk

HTML

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>ColumnChart</title>
    <link rel="stylesheet" type="text/css" href="style.css" />
  </head>

  <body>
    <div class="dashboard__charts">
      <div id="orders" class="dashboard__chart_orders">

      </div>
      <div id="sales" class="dashboard__chart_sales">

      </div>
      <div id="customers" class="dashboard__chart_customers">

      </div>
    </div>

    <script type="module">
      /* import ColumnChart from './index.js'; */

      const ordersData = [];
      const salesData = [ 30, 40, 20, 80, 35, 15 ];
      const customersData = [ 100, 90, 80, 35, 90, 25 ];

      const ordersChart = new ColumnChart({
        data: ordersData,
        label: 'orders',
        value: 344,
        link: '#'
      });

      const salesChart = new ColumnChart({
        data: salesData,
        label: 'sales',
        value: '$243,437'
      });

      const customersChart = new ColumnChart({
        data: customersData,
        label: 'customers',
        value: 321
      });
      
      // console.log(ordersChart);
      // console.log(salesChart);
      // console.log(customersChart);

      orders.append(ordersChart.element);
      sales.append(salesChart.element);
      customers.append(customersChart.element);
    </script>
  </body>
</html>

CSS

/* Component styles */
@import url('https://fonts.googleapis.com/css?family=Source+Sans+Pro&display=swap');

body {
  font-family: 'Source Sans Pro', sans-serif;
}

:root {
  --blue: #109cf1;
  --dark-blue: #334d6e;
  --light-blue: #cfebfc;
  --middle-blue: #9fd7f9;
  --yellow: #ffb946;
  --red: #f7685b;
  --green: #2ed47a;
  --purple: #885af8;
  --black: #192a3e;
  --table-black: #323c47;
  --table-grey: #707683;
  --grey: #90a0b7;
  --grey-light: #c2cfe0;
  --grey-extra-light: #eff1f4;
  --grey-skeleton: #f5f6f8;
  --grey-middle: #e0e4eb;
  --white: #ffffff;
}

.dashboard__charts {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-gap: 24px;
  --chart-height: 50;
}

.dashboard__chart_orders {
  --chart-column-color: var(--yellow);
}

.dashboard__chart_sales {
  --chart-column-color: var(--green);
}

.dashboard__chart_customers {
  --chart-column-color: var(--purple);
}

/* ColumnChart styles */
.column-chart__chart {
  width: 100%;
  height: calc(var(--chart-height) * 1px);
  display: flex;
  flex-direction: row;
  justify-content: space-between;
  align-items: flex-end;
}

.column-chart__chart div {
  height: calc(var(--value) * 1px);
  background-color: var(--chart-column-color);
  min-width: 1px;
  flex-grow: 1;
  margin: 0 0 0 1px;
  cursor: pointer;
}

.column-chart__chart div:first-child {
  margin: 0;
}

.column-chart__chart div.is-hovered {
  opacity: 1;
}

.column-chart__chart.has-hovered div:not(.is-hovered) {
  opacity: 0.5;
}

.column-chart__container {
  max-width: 100%;
  position: relative;
}

.column-chart {
  padding: 16px 26px 24px;
  background: var(--white);
  box-shadow: 0 6px 18px rgba(0, 0, 0, 0.06);
  border-radius: 4px;
  border-left: 2px solid var(--chart-column-color);
  position: relative;
}

.column-chart__title {
  font-size: 16px;
  line-height: 20px;
  color: var(--grey);
  display: flex;
  flex-direction: row;
  justify-content: space-between;
  margin-bottom: 8px;
}

.column-chart__link {
  color: var(--blue);
 ...

JavaScript

class ColumnChart {
  element; // HTMLElement;

  constructor(obj) {
    this.data = obj.data;
    this.label = obj.label;
    this.value = obj.value;
    this.link = obj.link;

    this.render();
    this.initEventListeners();
    this.renderLink();
  }

  initEventListeners() {}

  render() {
    const element = document.createElement("div");
    element.className = "column-chart"
    element.innerHTML = `
    <div class="column-chart__title">
    Total orders
    <a href="/sales" class="column-chart__link">View all</a>
  </div>
  <div class="column-chart__container">
    <div class="column-chart__header">344</div>
    <div class="column-chart__chart">
      <div style="--value:28" data-tooltip="<div><small>15 янв. 2020 г.</small></div><strong>11</strong>"></div>
      <div style="--value:28" data-tooltip="<div><small>16 янв. 2020 г.</small></div><strong>11</strong>"></div>
      <div style="--value:23" data-tooltip="<div><small>17 янв. 2020 г.</small></div><strong>9</strong>"></div>
      <div style="--value:7" data-tooltip="<div><small>18 янв. 2020 г.</small></div><strong>3</strong>"></div>
      <div style="--value:34" data-tooltip="<div><small>19 янв. 2020 г.</small></div><strong>13</strong>"></div>
      <div style="--value:36" data-tooltip="<div><small>20 янв. 2020 г.</small></div><strong>14</strong>"></div>
      <div style="--value:39" data-tooltip="<div><small>21 янв. 2020 г.</small></div><strong>15</strong>"></div>
      <div style="--value:7" data-tooltip="<div><small>22 янв. 2020 г.</small></div><strong>3</strong>"></div>
      <div style="--value:34" data-tooltip="<div><small>23 янв. 2020 г.</small></div><strong>13</strong>"></div>
      <div style="--value:42" data-tooltip="<div><small>24 янв. 2020 г.</small></div><strong>16</strong>"></div>
      <div style="--value:42" data-tooltip="<div><small>25 янв. 2020 г.</small></div><strong>16</strong>"></div>
      <div style="--value:7" data-tooltip="<div><small>26 янв. 2020...