Categories: CSSScriptWeb Design

Responsive CSS Chart Library For Web – Neo Charts

Neo Charts is a lightweight JavaScript chart library that renders all chart elements as DOM nodes styled with CSS.

It currently supports 9 chart types (column, bar, line, area, progress, waterfall, heatmap, treemap, and gauge) and uses ResizeObserver to keep charts responsive across container size changes.

More Features:

  • Multi-series support with grouped and stacked modes for column and bar charts.
  • Pixel-perfect sizing with integer pixel calculations and remainder distribution for crisp edges.
  • Entry animations with configurable stagger and smooth hover transitions.
  • Interactive tooltips on hover with bidirectional label sync for bar and waterfall charts.
  • Highlight mode that dims sibling items on hover.
  • Configurable color palette, gap spacing, gauge thickness, and label alignment.
  • Dark and light themes.

How To Use It:

1. Download neo-charts.js and neo-charts.css and load them in your HTML:

<link rel="stylesheet" href="neo-charts.css">
<script src="neo-charts.js"></script>

2. Add an empty div element to your page. The library will inject the DOM-based chart elements here.

<div class="server-load-chart"></div>

3. Initialize Neo Charts and create a column chart to display server CPU load

var myChart = neoCharts('.server-load-chart', {
    title: { text: 'Server CPU Load', align: 'left' },
    type: 'column',
    layout: { width: '100%', height: '300px' },
    data: {
      series: [{
        title: 'Node Alpha',
        values:[45, 82, 38, 91, 64],
        labels:['08:00', '09:00', '10:00', '11:00', '12:00'],
        color: ['#ff3d00'],
        suffix: '%'
      }]
    }
});

4. Configuration options.

  • type (string): Chart type. Accepts column, bar, line, area, progress, waterfall, heatmap, treemap, or gauge. Defaults to 'column'.
  • cssClass (string): An additional CSS class appended to the chart container. Defaults to ''.
  • highlight (boolean): Dims sibling chart items when the user hovers over one. For bar and waterfall charts, this syncs bidirectionally with the y-axis labels. Defaults to false.
  • animate (boolean): Runs staggered entry animations on initial render. Defaults to true.
  • legend (boolean): Displays a legend when the chart has multiple series. Defaults to true.
  • smooth (boolean): Applies Catmull-Rom spline interpolation to line and area charts. Defaults to false.
  • fit (boolean): Fits the chart tightly to its container bounds. Defaults to false.
  • gap (number): Gap in pixels between bars, columns, or treemap cells. Defaults to 2.
  • theme (string): Color theme. Accepts 'dark' or 'light'. Defaults to 'dark'.
  • gauge.thickness (number): Ring thickness in pixels for gauge charts. Defaults to 14.
  • gauge.valueFontSize (number): Font size in pixels for the gauge’s center value. Defaults to 48.
  • title.text (string): Chart title text. Defaults to 'Neo Charts'.
  • title.subtitle (string): Subtitle text rendered below the main title. Defaults to ''.
  • title.align (string): Horizontal alignment of the title block. Accepts 'left', 'center', or 'right'. Defaults to 'right'.
  • layout.width (string): Chart width as a CSS value (e.g., '100%' or '640px'). Defaults to '100%'.
  • layout.height (string): Chart height as a CSS value, or 'auto' to size based on content. Defaults to '300px'.
  • layout.lines.number (number): Number of guideline lines rendered across the plot area. Defaults to 4.
  • layout.lines.align (string): Position of guideline value labels. Accepts 'left' or 'right'. Defaults to 'right'.
  • data.render.margin (number): Additional spacing between chart items as a percentage. Defaults to 0.
  • data.render.stacked (boolean): Stacks multiple series for column and bar charts. Defaults to false.
  • data.render.threshold (array): Array of threshold line values to draw across the chart. Defaults to [].
  • data.series (array): Array of series objects. See the Series Object reference below. Defaults to [].
  • onClick (function): Callback fired when the user clicks a chart item. Receives an event data object and the native click event. Defaults to null.
  • onHover (function): Callback fired when the user moves the pointer over a chart item. Receives an event data object and the mouseover event. Defaults to null.
var myChart = neoCharts('.server-load-chart', {
    type: 'column',
    cssClass: '',
    title: {
      text: 'Neo Charts',
      subtitle: '',
      align: 'right'
    },
    layout: {
      width: '100%',
      height: '300px',
      lines: {
        number: 4,
        align: 'right'
      }
    },
    gap: 2,
    fit: false,
    gauge: {
      thickness: 14,
      valueFontSize: 48
    },
    highlight: false,
    animate: true,
    legend: true,
    smooth: false,
    theme: 'dark',
    onClick: null,
    onHover: null,
    data: {
      render: {
        empty: 'No data available.',
        stacked: false,
        threshold: []
      },
      series: []
    }
});

5. Series Object Properties:

  • title (string): Series name, displayed in the legend and tooltip header.
  • values (number[]): Array of numeric data points. For gauge charts, pass [current, min, max].
  • labels (string[]): Array of label strings, one per data point.
  • outputValues (string[]): Custom display strings for tooltips and value labels (e.g., ['1.2K', '3.4M']). The library falls back to raw numeric values when this array is empty.
  • color (string[]): One color string for the whole series, or one per item. The library cycles through a 10-color built-in palette when this property is omitted: #3b82f6, #10b981, #f59e0b, #ef4444, #8b5cf6, #ec4899, #06b6d4, #f97316, #6366f1, #14b8a6.
  • prefix (string): String prepended to displayed values (e.g., '$').
  • suffix (string): String appended to displayed values (e.g., '%').
  • decimals (number): Decimal places shown in tooltips. Defaults to 3.

6. API methods.

// Merge newOptions with the original options and re-render the chart.
// Returns a new API object — reassign the variable after calling this.
chart = chart.update({
  data: {
    series: [{
      values: [500, 620, 480, 710]
    }]
  }
});

// Remove the chart from the DOM. Disconnects all event listeners,
// the ResizeObserver, and any active requestAnimationFrame loops.
// Call this before removing or reusing the container element.
chart.destroy();

// Access the DOM element that contains the rendered chart.
var container = chart.element;

7. Event callbacks:

// onClick fires when the user clicks any chart item.
// The data object exposes series and item metadata.
neoCharts('.click-chart', {
  type: 'bar',
  onClick: function(data, event) {
    // data.seriesIndex  — index of the clicked series
    // data.index        — index of the item within that series
    // data.value        — numeric value of the clicked item
    // data.label        — label string of the clicked item
    // data.seriesTitle  — title of the parent series
    // data.element      — the DOM element of the clicked item
    console.log('Selected:', data.label, '→', data.value);
  },
  data: {
    series: [{ values: [120, 95, 210], labels: ['Product A', 'Product B', 'Product C'] }]
  }
});
// onHover fires when the pointer enters a chart item.
// Use it to update external UI elements in sync with the chart.
neoCharts('.hover-chart', {
  type: 'column',
  onHover: function(data, event) {
    document.getElementById('tooltip-label').textContent = data.label + ': ' + data.value;
  },
  data: {
    series: [{ values: [55, 80, 65], labels: ['Mon', 'Tue', 'Wed'] }]
  }
});

FAQs:

Q: Does Neo Charts work with React or Vue?
A: Yes. In React, call neoCharts(containerRef.current, options) inside a useEffect hook and return chart.destroy as the cleanup function. In Vue 3, use onMounted to initialize and onBeforeUnmount to destroy.

Q: My column chart shows misaligned bars or fractional gaps. What’s wrong?
A: This typically happens when the container element reports a fractional clientWidth. Certain CSS Grid or Flexbox layouts compute sub-pixel widths. Set an explicit pixel width on the container element, or confirm that box-sizing: border-box applies to it and that no padding contributes a fractional value.

Q: Can I render multiple independent charts on the same page?
A: Yes. Each neoCharts() call operates on one container element, registers its own ResizeObserver, and stores its own state in the returned API object.

Q: Does the gauge type support multiple concentric rings?
A: The current version accepts one series per gauge chart. The first value in series[0].values is the current reading; the second and third are the minimum and maximum bounds.

The post Responsive CSS Chart Library For Web – Neo Charts appeared first on CSS Script.

rssfeeds-admin

Share
Published by
rssfeeds-admin

Recent Posts

Retired Detroit Police Sergeant Charged with Rape and Kidnapping

DETROIT, MI (WOWO) A retired Detroit police sergeant is facing multiple felony charges as authorities…

2 hours ago

Health Officials Warn of Measles Spread in Southeast Michigan

LANSING, MI (WOWO) Health officials in southeast Michigan are working to contain a confirmed measles…

2 hours ago

511,000+ End-of-Life Microsoft IIS Instances Exposed Online, Secure Now!

A massive attack surface involving outdated Microsoft Internet Information Services (IIS) servers. During Shadowserver’s daily…

2 hours ago

Mazda Data Breach Exposing Employee and Partner Records Via System Vulnerability

Mazda Motor Corporation has officially disclosed a security incident involving unauthorized external access to an…

2 hours ago

Indiana State Police Seize $500K in Meth During I-70 Stop

PUTNAM COUNTY, IND. (WOWO) A routine inspection on Interstate 70 led to a major drug…

3 hours ago

US 33 Construction Near Goshen Causing Traffic Delays

GOSHEN, IND. (WOWO) A new road construction project is underway in Elkhart County, with drivers…

3 hours ago

This website uses cookies.