@bonnard/react 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/dashboard.js CHANGED
@@ -1,4 +1,4 @@
1
- import { a as BarChart, i as LineChart, n as PieChart, o as BigValue, r as AreaChart, t as DataTable, u as useBonnard } from "./data-table-DQKxzbS3.js";
1
+ import { a as BarChart, i as LineChart, n as PieChart, o as BigValue, r as AreaChart, t as DataTable, u as useBonnard } from "./data-table-CkOo6s_V.js";
2
2
  import { useCallback, useEffect, useRef, useState } from "react";
3
3
  import DOMPurify from "isomorphic-dompurify";
4
4
  import matter from "gray-matter";
@@ -798,10 +798,21 @@ function SectionRenderer({ section, queryStates }) {
798
798
  queryStates
799
799
  }, i))
800
800
  });
801
- return /* @__PURE__ */ jsx(ComponentRenderer, {
801
+ const isBigValue = section.component.type === "BigValue";
802
+ const inner = /* @__PURE__ */ jsx(ComponentRenderer, {
802
803
  component: section.component,
803
804
  queryStates
804
805
  });
806
+ if (isBigValue) return inner;
807
+ return /* @__PURE__ */ jsx("div", {
808
+ style: {
809
+ borderRadius: "var(--bon-radius, 8px)",
810
+ border: "1px solid var(--bon-border)",
811
+ backgroundColor: "var(--bon-bg-card)",
812
+ padding: 16
813
+ },
814
+ children: inner
815
+ });
805
816
  }
806
817
  function ComponentRenderer({ component, queryStates }) {
807
818
  const { type, props } = component;
@@ -265,7 +265,10 @@ function formatAxisLabel(val) {
265
265
  /** ECharts y-axis formatter — compact numbers */
266
266
  function axisValueFormatter(val) {
267
267
  if (Math.abs(val) >= 1e6) return `${(val / 1e6).toFixed(1)}M`;
268
- if (Math.abs(val) >= 1e3) return `${(val / 1e3).toFixed(0)}K`;
268
+ if (Math.abs(val) >= 1e3) {
269
+ const k = val / 1e3;
270
+ return k % 1 === 0 ? `${k}K` : `${k.toFixed(1)}K`;
271
+ }
269
272
  return String(val);
270
273
  }
271
274
  /** Convert snake_case or camelCase field names to Title Case */
@@ -316,6 +319,21 @@ function BigValue({ data, value, title, fmt }) {
316
319
  //#endregion
317
320
  //#region src/lib/build-series.ts
318
321
  /**
322
+ * Pure data transformation: splits flat query results into multi-series datasets.
323
+ *
324
+ * Four cases:
325
+ * | y columns | series prop | Result |
326
+ * |-----------|-------------|-------------------------------|
327
+ * | Single | None | 1 dataset (current behavior) |
328
+ * | Single | Set | N datasets (per series value) |
329
+ * | Multiple | None | N datasets (per y column) |
330
+ * | Multiple | Set | N*M datasets |
331
+ */
332
+ /** Strip view/cube prefix and convert snake_case to Title Case for legend labels */
333
+ function humanizeField(name) {
334
+ return (name.includes(".") ? name.slice(name.indexOf(".") + 1) : name).replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
335
+ }
336
+ /**
319
337
  * Build multi-series datasets from flat query data.
320
338
  *
321
339
  * @param data - Flat array of row objects from query
@@ -328,11 +346,17 @@ function buildSeries(data, x, y, series) {
328
346
  labels: [],
329
347
  datasets: []
330
348
  };
349
+ const firstX = String(data[0][x] ?? "");
350
+ if (/^\d{4}-\d{2}-\d{2}/.test(firstX)) data = [...data].sort((a, b) => {
351
+ const aVal = String(a[x] ?? "");
352
+ const bVal = String(b[x] ?? "");
353
+ return aVal.localeCompare(bVal);
354
+ });
331
355
  const yColumns = y.split(",").map((col) => col.trim()).filter(Boolean);
332
356
  if (!series) return {
333
357
  labels: data.map((row) => String(row[x] ?? "")),
334
358
  datasets: yColumns.map((col) => ({
335
- name: col,
359
+ name: humanizeField(col),
336
360
  values: data.map((row) => {
337
361
  const val = row[col];
338
362
  return val == null ? null : Number(val);
@@ -362,7 +386,7 @@ function buildSeries(data, x, y, series) {
362
386
  }
363
387
  const datasets = [];
364
388
  for (const sk of seriesKeys) for (const col of yColumns) {
365
- const name = yColumns.length === 1 ? sk : `${sk} - ${col}`;
389
+ const name = yColumns.length === 1 ? sk : `${sk} - ${humanizeField(col)}`;
366
390
  const values = xValues.map((xRaw) => {
367
391
  const row = lookup.get(`${xRaw}\0${sk}`);
368
392
  if (!row) return null;
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { a as BarChart, c as PALETTES, i as LineChart, l as BonnardContext, n as PieChart, o as BigValue, r as AreaChart, s as CHART_COLORS, t as DataTable, u as useBonnard } from "./data-table-DQKxzbS3.js";
1
+ import { a as BarChart, c as PALETTES, i as LineChart, l as BonnardContext, n as PieChart, o as BigValue, r as AreaChart, s as CHART_COLORS, t as DataTable, u as useBonnard } from "./data-table-CkOo6s_V.js";
2
2
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  import { createClient } from "@bonnard/sdk";
@@ -1 +1 @@
1
- {"version":3,"file":"build-series.d.ts","sourceRoot":"","sources":["../../src/lib/build-series.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,aAAa;IAC5B,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,4BAA4B;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,6BAA6B;IAC7B,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,MAAM,CAAC,EAAE,MAAM,GACd,iBAAiB,CAmEnB"}
1
+ {"version":3,"file":"build-series.d.ts","sourceRoot":"","sources":["../../src/lib/build-series.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,MAAM,WAAW,aAAa;IAC5B,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,4BAA4B;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,6BAA6B;IAC7B,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,MAAM,CAAC,EAAE,MAAM,GACd,iBAAiB,CA+EnB"}
@@ -1 +1 @@
1
- {"version":3,"file":"chart-theme.d.ts","sourceRoot":"","sources":["../../src/theme/chart-theme.ts"],"names":[],"mappings":"AAKA,sCAAsC;AACtC,eAAO,MAAM,QAAQ;;;;;CAuBX,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,QAAQ,CAAC;AAGhD,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAAqB,CAAC;AAEhE,8BAA8B;AAC9B,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,OAAO,EAAE;QACP,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AA0BD,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,CAE/D;AAED,iDAAiD;AACjD,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB;;;;;;;;;;oBAQhC,MAAM,EAAE,WAAW,OAAO,QAAQ,WAAW,SAAS,OAAO,QAAQ;QAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE;EAWrI;AAED,gDAAgD;AAChD,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB;;;;;;;;;;;;;;EAWlD;AAED,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAQvD;AAED,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAGtD;AAED,4CAA4C;AAC5C,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAQhD;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,CAKzE;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAgBnD;AAED,iDAAiD;AACjD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAItD;AAED,gEAAgE;AAChE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKtD"}
1
+ {"version":3,"file":"chart-theme.d.ts","sourceRoot":"","sources":["../../src/theme/chart-theme.ts"],"names":[],"mappings":"AAKA,sCAAsC;AACtC,eAAO,MAAM,QAAQ;;;;;CAuBX,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,QAAQ,CAAC;AAGhD,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAAqB,CAAC;AAEhE,8BAA8B;AAC9B,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,OAAO,EAAE;QACP,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AA0BD,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,CAE/D;AAED,iDAAiD;AACjD,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB;;;;;;;;;;oBAQhC,MAAM,EAAE,WAAW,OAAO,QAAQ,WAAW,SAAS,OAAO,QAAQ;QAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE;EAWrI;AAED,gDAAgD;AAChD,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB;;;;;;;;;;;;;;EAWlD;AAED,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAQvD;AAED,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAGtD;AAED,4CAA4C;AAC5C,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAQhD;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,CAKzE;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAgBnD;AAED,iDAAiD;AACjD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQtD;AAED,gEAAgE;AAChE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKtD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bonnard/react",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Bonnard embedded analytics — React charts, dashboards, and hooks",
5
5
  "repository": {
6
6
  "type": "git",
@@ -47,7 +47,7 @@
47
47
  "isomorphic-dompurify": "^2.0.0"
48
48
  },
49
49
  "devDependencies": {
50
- "@bonnard/sdk": "^0.2.0",
50
+ "@bonnard/sdk": "^0.3.0",
51
51
  "@types/react": "^19.0.0",
52
52
  "tsdown": "^0.12.5",
53
53
  "typescript": "^5.5.0"