@manzanohq/charts 0.1.1

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.
@@ -0,0 +1,60 @@
1
+ var n=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var l=(o,t,i)=>t in o?n(o,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):o[t]=i;var m=(o,t,i,r)=>{for(var a=r>1?void 0:r?p(t,i):t,e=o.length-1,s;e>=0;e--)(s=o[e])&&(a=(r?s(t,i,a):s(a))||a);return r&&a&&n(t,i,a),a};var d=(o,t,i)=>l(o,typeof t!="symbol"?t+"":t,i);import{css as c}from"lit";import h from"@manzanohq/components/dist/styles/component.styles.js";var b=[h,c`
2
+ :host {
3
+ display: block;
4
+ position: relative;
5
+ width: 100%;
6
+ }
7
+
8
+ .chart-container {
9
+ position: relative;
10
+ width: 100%;
11
+ height: 100%;
12
+ }
13
+
14
+ canvas {
15
+ display: block;
16
+ }
17
+
18
+ .chart-tooltip {
19
+ position: absolute;
20
+ pointer-events: none;
21
+ opacity: 0;
22
+ transition: opacity 150ms ease, transform 150ms ease;
23
+ z-index: 10;
24
+ }
25
+
26
+ .chart-tooltip.visible {
27
+ opacity: 1;
28
+ }
29
+
30
+ .chart-tooltip__inner {
31
+ background: var(--mz-color-gray-900, #1c1915);
32
+ color: var(--mz-color-gray-50, #faf9f7);
33
+ padding: 6px 10px;
34
+ border-radius: var(--mz-radius-md, 0.5rem);
35
+ font-family: var(--mz-font-sans, sans-serif);
36
+ font-size: var(--mz-font-size-xs, 0.75rem);
37
+ line-height: 1.4;
38
+ box-shadow: 0 4px 12px rgb(28 25 21 / 0.15);
39
+ max-width: 200px;
40
+ }
41
+
42
+ .chart-tooltip__title {
43
+ font-weight: 600;
44
+ margin-bottom: 2px;
45
+ }
46
+
47
+ .chart-tooltip__item {
48
+ display: flex;
49
+ align-items: center;
50
+ gap: 6px;
51
+ }
52
+
53
+ .chart-tooltip__swatch {
54
+ width: 8px;
55
+ height: 8px;
56
+ border-radius: 2px;
57
+ flex-shrink: 0;
58
+ }
59
+ `];export{m as a,d as b,b as c};
60
+ //# sourceMappingURL=chunk.J4CSMRZB.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/chart.styles.ts"],
4
+ "sourcesContent": ["import { css } from 'lit';\nimport componentStyles from '@manzanohq/components/dist/styles/component.styles.js';\n\nexport default [\n componentStyles,\n css`\n :host {\n display: block;\n position: relative;\n width: 100%;\n }\n\n .chart-container {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n canvas {\n display: block;\n }\n\n .chart-tooltip {\n position: absolute;\n pointer-events: none;\n opacity: 0;\n transition: opacity 150ms ease, transform 150ms ease;\n z-index: 10;\n }\n\n .chart-tooltip.visible {\n opacity: 1;\n }\n\n .chart-tooltip__inner {\n background: var(--mz-color-gray-900, #1c1915);\n color: var(--mz-color-gray-50, #faf9f7);\n padding: 6px 10px;\n border-radius: var(--mz-radius-md, 0.5rem);\n font-family: var(--mz-font-sans, sans-serif);\n font-size: var(--mz-font-size-xs, 0.75rem);\n line-height: 1.4;\n box-shadow: 0 4px 12px rgb(28 25 21 / 0.15);\n max-width: 200px;\n }\n\n .chart-tooltip__title {\n font-weight: 600;\n margin-bottom: 2px;\n }\n\n .chart-tooltip__item {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .chart-tooltip__swatch {\n width: 8px;\n height: 8px;\n border-radius: 2px;\n flex-shrink: 0;\n }\n `\n];\n"],
5
+ "mappings": "gVAAA,OAAS,OAAAA,MAAW,MACpB,OAAOC,MAAqB,wDAE5B,IAAOC,EAAQ,CACbD,EACAD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA2DF",
6
+ "names": ["css", "componentStyles", "chart_styles_default"]
7
+ }
package/cdn/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export { MzChart } from './chart.component.js';
2
+ export type { MzChartType, ChartData, ChartOptions, ChartClickDetail } from './chart.types.js';
3
+ //# sourceMappingURL=index.d.ts.map
package/cdn/index.js ADDED
@@ -0,0 +1,2 @@
1
+ import{a as t}from"./chunks/chunk.DVUTXYD4.js";import"./chunks/chunk.J4CSMRZB.js";export{t as MzChart};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,59 @@
1
+ import { PropertyValues } from 'lit';
2
+ import { ManzanoElement } from '@manzanohq/components/dist/internal/manzano-element.js';
3
+ import { Chart } from 'chart.js';
4
+ import type { ChartData, ChartOptions } from 'chart.js';
5
+ import type { MzChartType } from './chart.types.js';
6
+ /**
7
+ * @tag mz-chart
8
+ * @summary Chart.js wrapper with Manzano theming, shadow DOM support, and responsive resize.
9
+ *
10
+ * @event mz-chart-click - Fires when a data point is clicked. Detail: ChartClickDetail
11
+ */
12
+ export declare class MzChart extends ManzanoElement {
13
+ static styles: import("lit").CSSResult[];
14
+ /** The type of chart to render. */
15
+ type: MzChartType;
16
+ /** Chart.js data object — { labels, datasets }. */
17
+ data: ChartData;
18
+ /** Chart.js options object (merged with Manzano defaults). */
19
+ options: ChartOptions;
20
+ private canvas;
21
+ private tooltipEl;
22
+ private tooltipVisible;
23
+ private chart;
24
+ private resizeObserver;
25
+ private themeObserver;
26
+ firstUpdated(_changedProps: PropertyValues): void;
27
+ disconnectedCallback(): void;
28
+ /** Returns the underlying Chart.js instance for advanced use cases. */
29
+ getChartInstance(): Chart | null;
30
+ /** Force the chart to re-render. */
31
+ updateChart(): void;
32
+ handleDataChange(): void;
33
+ handleTypeChange(): void;
34
+ handleOptionsChange(): void;
35
+ private readThemeColor;
36
+ private readThemeFont;
37
+ /** Read palette colors from the current theme. */
38
+ private getPaletteColors;
39
+ /** Add alpha to a hex or CSS color string. */
40
+ private withAlpha;
41
+ /**
42
+ * Apply Manzano theme colors to datasets that don't already have user-specified colors.
43
+ * Returns a deep-ish copy so we don't mutate the user's original data object.
44
+ */
45
+ private applyThemeColors;
46
+ /** Build the merged Chart.js options with Manzano defaults. */
47
+ private buildOptions;
48
+ /** Simple deep merge of two objects (b overrides a). */
49
+ private deepMerge;
50
+ /** Custom tooltip rendered inside shadow DOM. */
51
+ private handleExternalTooltip;
52
+ private createChart;
53
+ private destroyChart;
54
+ private recreateChart;
55
+ private setupResizeObserver;
56
+ private setupThemeObserver;
57
+ render(): import("lit").TemplateResult<1>;
58
+ }
59
+ //# sourceMappingURL=chart.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart.component.d.ts","sourceRoot":"","sources":["../src/chart.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,cAAc,EAAE,MAAM,KAAK,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,wDAAwD,CAAC;AAExF,OAAO,EAAE,KAAK,EAAiB,MAAM,UAAU,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAA6B,MAAM,UAAU,CAAC;AACnF,OAAO,KAAK,EAAE,WAAW,EAAoB,MAAM,kBAAkB,CAAC;AAQtE;;;;;GAKG;AACH,qBAAa,OAAQ,SAAQ,cAAc;IACzC,OAAgB,MAAM,4BAAU;IAEhC,mCAAmC;IACN,IAAI,EAAE,WAAW,CAAS;IAEvD,mDAAmD;IACnB,IAAI,EAAE,SAAS,CAAgC;IAE/E,8DAA8D;IAC9B,OAAO,EAAE,YAAY,CAAM;IAE1C,OAAO,CAAC,MAAM,CAAqB;IAC3B,OAAO,CAAC,SAAS,CAAkB;IAEnD,OAAO,CAAC,cAAc,CAAS;IAExC,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,aAAa,CAAiC;IAE7C,YAAY,CAAC,aAAa,EAAE,cAAc;IAO1C,oBAAoB;IAS7B,uEAAuE;IACvE,gBAAgB,IAAI,KAAK,GAAG,IAAI;IAIhC,oCAAoC;IACpC,WAAW;IAOX,gBAAgB;IAOhB,gBAAgB;IAKhB,mBAAmB;IAInB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,aAAa;IAIrB,kDAAkD;IAClD,OAAO,CAAC,gBAAgB;IAIxB,8CAA8C;IAC9C,OAAO,CAAC,SAAS;IAYjB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAoDxB,+DAA+D;IAC/D,OAAO,CAAC,YAAY;IA2FpB,wDAAwD;IACxD,OAAO,CAAC,SAAS;IAmBjB,iDAAiD;IAEjD,OAAO,CAAC,qBAAqB;IAuC7B,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,kBAAkB;IAUjB,MAAM;CAQhB"}
@@ -0,0 +1,336 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __decorateClass = (decorators, target, key, kind) => {
4
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
5
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
6
+ if (decorator = decorators[i])
7
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
8
+ if (kind && result) __defProp(target, key, result);
9
+ return result;
10
+ };
11
+ import { html } from "lit";
12
+ import { property, query, state } from "lit/decorators.js";
13
+ import { ManzanoElement } from "@manzanohq/components/dist/internal/manzano-element.js";
14
+ import { watch } from "@manzanohq/components/dist/internal/watch.js";
15
+ import { Chart, registerables } from "chart.js";
16
+ import styles from "./chart.styles.js";
17
+ Chart.register(...registerables);
18
+ const PALETTE_KEYS = ["primary", "danger", "success", "warning", "neutral"];
19
+ class MzChart extends ManzanoElement {
20
+ constructor() {
21
+ super(...arguments);
22
+ this.type = "bar";
23
+ this.data = { labels: [], datasets: [] };
24
+ this.options = {};
25
+ this.tooltipVisible = false;
26
+ this.chart = null;
27
+ this.resizeObserver = null;
28
+ this.themeObserver = null;
29
+ }
30
+ firstUpdated(_changedProps) {
31
+ super.firstUpdated(_changedProps);
32
+ this.createChart();
33
+ this.setupResizeObserver();
34
+ this.setupThemeObserver();
35
+ }
36
+ disconnectedCallback() {
37
+ super.disconnectedCallback();
38
+ this.destroyChart();
39
+ this.resizeObserver?.disconnect();
40
+ this.resizeObserver = null;
41
+ this.themeObserver?.disconnect();
42
+ this.themeObserver = null;
43
+ }
44
+ /** Returns the underlying Chart.js instance for advanced use cases. */
45
+ getChartInstance() {
46
+ return this.chart;
47
+ }
48
+ /** Force the chart to re-render. */
49
+ updateChart() {
50
+ if (this.chart) {
51
+ this.chart.update();
52
+ }
53
+ }
54
+ handleDataChange() {
55
+ if (!this.chart) return;
56
+ this.chart.data = this.applyThemeColors(this.data);
57
+ this.chart.update();
58
+ }
59
+ handleTypeChange() {
60
+ this.recreateChart();
61
+ }
62
+ handleOptionsChange() {
63
+ this.recreateChart();
64
+ }
65
+ readThemeColor(name) {
66
+ return getComputedStyle(this).getPropertyValue(`--mz-color-${name}`).trim();
67
+ }
68
+ readThemeFont() {
69
+ return getComputedStyle(this).getPropertyValue("--mz-font-sans").trim() || "sans-serif";
70
+ }
71
+ /** Read palette colors from the current theme. */
72
+ getPaletteColors() {
73
+ return PALETTE_KEYS.map((key) => this.readThemeColor(key)).filter(Boolean);
74
+ }
75
+ /** Add alpha to a hex or CSS color string. */
76
+ withAlpha(color, alpha) {
77
+ const hex = color.replace(/^#/, "");
78
+ if (/^[0-9a-f]{6}$/i.test(hex)) {
79
+ const r = parseInt(hex.slice(0, 2), 16);
80
+ const g = parseInt(hex.slice(2, 4), 16);
81
+ const b = parseInt(hex.slice(4, 6), 16);
82
+ return `rgba(${r}, ${g}, ${b}, ${alpha})`;
83
+ }
84
+ return color;
85
+ }
86
+ /**
87
+ * Apply Manzano theme colors to datasets that don't already have user-specified colors.
88
+ * Returns a deep-ish copy so we don't mutate the user's original data object.
89
+ */
90
+ applyThemeColors(data) {
91
+ const palette = this.getPaletteColors();
92
+ if (palette.length === 0) return data;
93
+ const surfaceColor = this.readThemeColor("surface") || "#ffffff";
94
+ const isPieType = this.type === "pie" || this.type === "doughnut" || this.type === "polarArea";
95
+ const isLineType = this.type === "line" || this.type === "radar";
96
+ const datasets = (data.datasets ?? []).map((ds, i) => {
97
+ const themed = { ...ds };
98
+ if (isPieType) {
99
+ if (!ds.backgroundColor) {
100
+ const numPoints = Array.isArray(ds.data) ? ds.data.length : 0;
101
+ themed.backgroundColor = Array.from({ length: numPoints }, (_, j) => palette[j % palette.length]);
102
+ }
103
+ if (!ds.borderColor) {
104
+ themed.borderColor = surfaceColor;
105
+ }
106
+ if (ds.borderWidth === void 0) {
107
+ themed.borderWidth = 2;
108
+ }
109
+ } else if (isLineType) {
110
+ const color = palette[i % palette.length];
111
+ if (!ds.borderColor) {
112
+ themed.borderColor = color;
113
+ }
114
+ if (!ds.backgroundColor) {
115
+ themed.backgroundColor = this.withAlpha(color, 0.12);
116
+ }
117
+ if (ds.pointBackgroundColor === void 0) {
118
+ themed.pointBackgroundColor = color;
119
+ }
120
+ } else {
121
+ const color = palette[i % palette.length];
122
+ if (!ds.backgroundColor) {
123
+ themed.backgroundColor = color;
124
+ }
125
+ if (!ds.borderColor) {
126
+ themed.borderColor = color;
127
+ }
128
+ }
129
+ return themed;
130
+ });
131
+ return { ...data, datasets };
132
+ }
133
+ /** Build the merged Chart.js options with Manzano defaults. */
134
+ buildOptions() {
135
+ const textColor = this.readThemeColor("text") || "#1c1915";
136
+ const textSecondary = this.readThemeColor("text-secondary") || "#79726b";
137
+ const borderColor = this.readThemeColor("border") || "#d5d1cb";
138
+ const fontFamily = this.readThemeFont();
139
+ const defaults = {
140
+ responsive: true,
141
+ maintainAspectRatio: true,
142
+ animation: {
143
+ duration: 300,
144
+ easing: "easeOutQuart"
145
+ },
146
+ font: {
147
+ family: fontFamily,
148
+ size: 12
149
+ },
150
+ color: textSecondary,
151
+ plugins: {
152
+ legend: {
153
+ labels: {
154
+ color: textColor,
155
+ font: { family: fontFamily },
156
+ boxWidth: 10,
157
+ boxHeight: 10,
158
+ useBorderRadius: true,
159
+ borderRadius: 2,
160
+ padding: 16,
161
+ generateLabels: (chart) => {
162
+ const defaults2 = Chart.defaults.plugins.legend.labels.generateLabels(chart);
163
+ return defaults2.map((label) => ({
164
+ ...label,
165
+ fillStyle: label.strokeStyle || label.fillStyle
166
+ }));
167
+ }
168
+ }
169
+ },
170
+ tooltip: {
171
+ enabled: false,
172
+ external: (context) => this.handleExternalTooltip(context)
173
+ }
174
+ },
175
+ scales: this.type === "pie" || this.type === "doughnut" ? {} : this.type === "radar" || this.type === "polarArea" ? {
176
+ r: {
177
+ ticks: {
178
+ color: textSecondary,
179
+ font: { family: fontFamily },
180
+ backdropColor: "transparent"
181
+ },
182
+ grid: { color: borderColor },
183
+ angleLines: { color: borderColor },
184
+ pointLabels: { color: textSecondary, font: { family: fontFamily } }
185
+ }
186
+ } : {
187
+ x: {
188
+ ticks: { color: textSecondary, font: { family: fontFamily } },
189
+ grid: { color: borderColor },
190
+ border: { color: borderColor }
191
+ },
192
+ y: {
193
+ ticks: { color: textSecondary, font: { family: fontFamily } },
194
+ grid: { color: borderColor },
195
+ border: { color: borderColor }
196
+ }
197
+ },
198
+ onClick: (_event, elements) => {
199
+ if (elements.length === 0) return;
200
+ const el = elements[0];
201
+ const dataset = this.chart?.data.datasets[el.datasetIndex];
202
+ const value = Array.isArray(dataset?.data) ? dataset.data[el.index] : void 0;
203
+ const labels = this.chart?.data.labels;
204
+ const label = Array.isArray(labels) ? String(labels[el.index] ?? "") : "";
205
+ this.emit("mz-chart-click", {
206
+ detail: {
207
+ datasetIndex: el.datasetIndex,
208
+ index: el.index,
209
+ value: typeof value === "number" ? value : value?.y ?? 0,
210
+ label
211
+ }
212
+ });
213
+ }
214
+ };
215
+ return this.deepMerge(defaults, this.options);
216
+ }
217
+ /** Simple deep merge of two objects (b overrides a). */
218
+ deepMerge(a, b) {
219
+ const result = { ...a };
220
+ for (const key of Object.keys(b)) {
221
+ if (b[key] !== null && typeof b[key] === "object" && !Array.isArray(b[key]) && a[key] !== null && typeof a[key] === "object" && !Array.isArray(a[key])) {
222
+ result[key] = this.deepMerge(a[key], b[key]);
223
+ } else {
224
+ result[key] = b[key];
225
+ }
226
+ }
227
+ return result;
228
+ }
229
+ /** Custom tooltip rendered inside shadow DOM. */
230
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
231
+ handleExternalTooltip(context) {
232
+ const { tooltip } = context;
233
+ if (tooltip.opacity === 0) {
234
+ this.tooltipVisible = false;
235
+ return;
236
+ }
237
+ const tooltipEl = this.tooltipEl;
238
+ if (!tooltipEl) return;
239
+ tooltipEl.style.left = `${tooltip.caretX}px`;
240
+ tooltipEl.style.top = `${tooltip.caretY}px`;
241
+ tooltipEl.style.transform = "translate(-50%, calc(-100% - 8px))";
242
+ let titleHtml = "";
243
+ if (tooltip.title?.length) {
244
+ titleHtml = `<div class="chart-tooltip__title">${tooltip.title.join(", ")}</div>`;
245
+ }
246
+ const bodyLines = tooltip.body?.map((b) => b.lines) ?? [];
247
+ const colors = tooltip.labelColors ?? [];
248
+ const itemsHtml = bodyLines.map((lines, i) => {
249
+ const color = colors[i]?.backgroundColor ?? "#888";
250
+ const bgStr = typeof color === "object" ? "#888" : String(color);
251
+ return lines.map(
252
+ (line) => `<div class="chart-tooltip__item">
253
+ <span class="chart-tooltip__swatch" style="background:${bgStr}"></span>
254
+ <span>${line}</span>
255
+ </div>`
256
+ ).join("");
257
+ }).join("");
258
+ tooltipEl.innerHTML = `<div class="chart-tooltip__inner">${titleHtml}${itemsHtml}</div>`;
259
+ this.tooltipVisible = true;
260
+ }
261
+ createChart() {
262
+ if (!this.canvas) return;
263
+ const ctx = this.canvas.getContext("2d");
264
+ if (!ctx) return;
265
+ this.chart = new Chart(ctx, {
266
+ type: this.type,
267
+ data: this.applyThemeColors(this.data),
268
+ options: this.buildOptions()
269
+ });
270
+ }
271
+ destroyChart() {
272
+ if (this.chart) {
273
+ this.chart.destroy();
274
+ this.chart = null;
275
+ }
276
+ }
277
+ recreateChart() {
278
+ this.destroyChart();
279
+ this.createChart();
280
+ }
281
+ setupResizeObserver() {
282
+ this.resizeObserver = new ResizeObserver(() => {
283
+ this.chart?.resize();
284
+ });
285
+ this.resizeObserver.observe(this);
286
+ }
287
+ setupThemeObserver() {
288
+ this.themeObserver = new MutationObserver(() => {
289
+ this.recreateChart();
290
+ });
291
+ this.themeObserver.observe(document.documentElement, {
292
+ attributes: true,
293
+ attributeFilter: ["data-theme"]
294
+ });
295
+ }
296
+ render() {
297
+ return html`
298
+ <div class="chart-container">
299
+ <canvas></canvas>
300
+ <div class="chart-tooltip ${this.tooltipVisible ? "visible" : ""}"></div>
301
+ </div>
302
+ `;
303
+ }
304
+ }
305
+ MzChart.styles = styles;
306
+ __decorateClass([
307
+ property({ reflect: true })
308
+ ], MzChart.prototype, "type", 2);
309
+ __decorateClass([
310
+ property({ attribute: false })
311
+ ], MzChart.prototype, "data", 2);
312
+ __decorateClass([
313
+ property({ attribute: false })
314
+ ], MzChart.prototype, "options", 2);
315
+ __decorateClass([
316
+ query("canvas")
317
+ ], MzChart.prototype, "canvas", 2);
318
+ __decorateClass([
319
+ query(".chart-tooltip")
320
+ ], MzChart.prototype, "tooltipEl", 2);
321
+ __decorateClass([
322
+ state()
323
+ ], MzChart.prototype, "tooltipVisible", 2);
324
+ __decorateClass([
325
+ watch("data")
326
+ ], MzChart.prototype, "handleDataChange", 1);
327
+ __decorateClass([
328
+ watch("type")
329
+ ], MzChart.prototype, "handleTypeChange", 1);
330
+ __decorateClass([
331
+ watch("options")
332
+ ], MzChart.prototype, "handleOptionsChange", 1);
333
+ export {
334
+ MzChart
335
+ };
336
+ //# sourceMappingURL=chart.component.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/chart.component.ts"],
4
+ "sourcesContent": ["import { html, PropertyValues } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { ManzanoElement } from '@manzanohq/components/dist/internal/manzano-element.js';\nimport { watch } from '@manzanohq/components/dist/internal/watch.js';\nimport { Chart, registerables } from 'chart.js';\nimport type { ChartData, ChartOptions, ChartEvent, ActiveElement } from 'chart.js';\nimport type { MzChartType, ChartClickDetail } from './chart.types.js';\nimport styles from './chart.styles.js';\n\nChart.register(...registerables);\n\n// Manzano palette colors for automatic dataset coloring\nconst PALETTE_KEYS = ['primary', 'danger', 'success', 'warning', 'neutral'] as const;\n\n/**\n * @tag mz-chart\n * @summary Chart.js wrapper with Manzano theming, shadow DOM support, and responsive resize.\n *\n * @event mz-chart-click - Fires when a data point is clicked. Detail: ChartClickDetail\n */\nexport class MzChart extends ManzanoElement {\n static override styles = styles;\n\n /** The type of chart to render. */\n @property({ reflect: true }) type: MzChartType = 'bar';\n\n /** Chart.js data object \u2014 { labels, datasets }. */\n @property({ attribute: false }) data: ChartData = { labels: [], datasets: [] };\n\n /** Chart.js options object (merged with Manzano defaults). */\n @property({ attribute: false }) options: ChartOptions = {};\n\n @query('canvas') private canvas!: HTMLCanvasElement;\n @query('.chart-tooltip') private tooltipEl!: HTMLDivElement;\n\n @state() private tooltipVisible = false;\n\n private chart: Chart | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private themeObserver: MutationObserver | null = null;\n\n override firstUpdated(_changedProps: PropertyValues) {\n super.firstUpdated(_changedProps);\n this.createChart();\n this.setupResizeObserver();\n this.setupThemeObserver();\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.destroyChart();\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.themeObserver?.disconnect();\n this.themeObserver = null;\n }\n\n /** Returns the underlying Chart.js instance for advanced use cases. */\n getChartInstance(): Chart | null {\n return this.chart;\n }\n\n /** Force the chart to re-render. */\n updateChart() {\n if (this.chart) {\n this.chart.update();\n }\n }\n\n @watch('data')\n handleDataChange() {\n if (!this.chart) return;\n this.chart.data = this.applyThemeColors(this.data);\n this.chart.update();\n }\n\n @watch('type')\n handleTypeChange() {\n this.recreateChart();\n }\n\n @watch('options')\n handleOptionsChange() {\n this.recreateChart();\n }\n\n private readThemeColor(name: string): string {\n return getComputedStyle(this).getPropertyValue(`--mz-color-${name}`).trim();\n }\n\n private readThemeFont(): string {\n return getComputedStyle(this).getPropertyValue('--mz-font-sans').trim() || 'sans-serif';\n }\n\n /** Read palette colors from the current theme. */\n private getPaletteColors(): string[] {\n return PALETTE_KEYS.map(key => this.readThemeColor(key)).filter(Boolean);\n }\n\n /** Add alpha to a hex or CSS color string. */\n private withAlpha(color: string, alpha: number): string {\n // Handle hex colors\n const hex = color.replace(/^#/, '');\n if (/^[0-9a-f]{6}$/i.test(hex)) {\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n }\n return color;\n }\n\n /**\n * Apply Manzano theme colors to datasets that don't already have user-specified colors.\n * Returns a deep-ish copy so we don't mutate the user's original data object.\n */\n private applyThemeColors(data: ChartData): ChartData {\n const palette = this.getPaletteColors();\n if (palette.length === 0) return data;\n\n const surfaceColor = this.readThemeColor('surface') || '#ffffff';\n const isPieType = this.type === 'pie' || this.type === 'doughnut' || this.type === 'polarArea';\n const isLineType = this.type === 'line' || this.type === 'radar';\n\n const datasets = (data.datasets ?? []).map((ds, i) => {\n const themed = { ...ds };\n\n if (isPieType) {\n // Pie/doughnut/polarArea: each segment gets a color from the palette\n if (!ds.backgroundColor) {\n const numPoints = Array.isArray(ds.data) ? ds.data.length : 0;\n themed.backgroundColor = Array.from({ length: numPoints }, (_, j) => palette[j % palette.length]);\n }\n if (!ds.borderColor) {\n themed.borderColor = surfaceColor;\n }\n if ((ds as unknown as Record<string, unknown>).borderWidth === undefined) {\n (themed as unknown as Record<string, unknown>).borderWidth = 2;\n }\n } else if (isLineType) {\n // Line/radar: border color from palette, transparent fill\n const color = palette[i % palette.length];\n if (!ds.borderColor) {\n themed.borderColor = color;\n }\n if (!ds.backgroundColor) {\n themed.backgroundColor = this.withAlpha(color, 0.12);\n }\n if ((ds as unknown as Record<string, unknown>).pointBackgroundColor === undefined) {\n (themed as unknown as Record<string, unknown>).pointBackgroundColor = color;\n }\n } else {\n // Bar/scatter/bubble: solid color from palette\n const color = palette[i % palette.length];\n if (!ds.backgroundColor) {\n themed.backgroundColor = color;\n }\n if (!ds.borderColor) {\n themed.borderColor = color;\n }\n }\n\n return themed;\n });\n\n return { ...data, datasets };\n }\n\n /** Build the merged Chart.js options with Manzano defaults. */\n private buildOptions(): ChartOptions {\n const textColor = this.readThemeColor('text') || '#1c1915';\n const textSecondary = this.readThemeColor('text-secondary') || '#79726b';\n const borderColor = this.readThemeColor('border') || '#d5d1cb';\n const fontFamily = this.readThemeFont();\n\n const defaults: ChartOptions = {\n responsive: true,\n maintainAspectRatio: true,\n animation: {\n duration: 300,\n easing: 'easeOutQuart'\n },\n font: {\n family: fontFamily,\n size: 12\n },\n color: textSecondary,\n plugins: {\n legend: {\n labels: {\n color: textColor,\n font: { family: fontFamily },\n boxWidth: 10,\n boxHeight: 10,\n useBorderRadius: true,\n borderRadius: 2,\n padding: 16,\n generateLabels: (chart) => {\n const defaults = Chart.defaults.plugins.legend.labels.generateLabels!(chart);\n return defaults.map(label => ({\n ...label,\n fillStyle: label.strokeStyle || label.fillStyle\n }));\n }\n }\n },\n tooltip: {\n enabled: false,\n external: (context) => this.handleExternalTooltip(context)\n }\n },\n scales: this.type === 'pie' || this.type === 'doughnut'\n ? {}\n : this.type === 'radar' || this.type === 'polarArea'\n ? {\n r: {\n ticks: {\n color: textSecondary,\n font: { family: fontFamily },\n backdropColor: 'transparent'\n },\n grid: { color: borderColor },\n angleLines: { color: borderColor },\n pointLabels: { color: textSecondary, font: { family: fontFamily } }\n }\n }\n : {\n x: {\n ticks: { color: textSecondary, font: { family: fontFamily } },\n grid: { color: borderColor },\n border: { color: borderColor }\n },\n y: {\n ticks: { color: textSecondary, font: { family: fontFamily } },\n grid: { color: borderColor },\n border: { color: borderColor }\n }\n },\n onClick: (_event: ChartEvent, elements: ActiveElement[]) => {\n if (elements.length === 0) return;\n const el = elements[0];\n const dataset = this.chart?.data.datasets[el.datasetIndex];\n const value = Array.isArray(dataset?.data) ? dataset.data[el.index] : undefined;\n const labels = this.chart?.data.labels;\n const label = Array.isArray(labels) ? String(labels[el.index] ?? '') : '';\n\n this.emit<ChartClickDetail>('mz-chart-click', {\n detail: {\n datasetIndex: el.datasetIndex,\n index: el.index,\n value: typeof value === 'number' ? value : (value as unknown as Record<string, number>)?.y ?? 0,\n label\n }\n });\n }\n };\n\n return this.deepMerge(defaults, this.options);\n }\n\n /** Simple deep merge of two objects (b overrides a). */\n private deepMerge(a: Record<string, unknown>, b: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = { ...a };\n for (const key of Object.keys(b)) {\n if (\n b[key] !== null &&\n typeof b[key] === 'object' &&\n !Array.isArray(b[key]) &&\n a[key] !== null &&\n typeof a[key] === 'object' &&\n !Array.isArray(a[key])\n ) {\n result[key] = this.deepMerge(a[key] as Record<string, unknown>, b[key] as Record<string, unknown>);\n } else {\n result[key] = b[key];\n }\n }\n return result;\n }\n\n /** Custom tooltip rendered inside shadow DOM. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private handleExternalTooltip(context: { tooltip: any }) {\n const { tooltip } = context;\n\n if (tooltip.opacity === 0) {\n this.tooltipVisible = false;\n return;\n }\n\n // Position\n const tooltipEl = this.tooltipEl;\n if (!tooltipEl) return;\n\n tooltipEl.style.left = `${tooltip.caretX}px`;\n tooltipEl.style.top = `${tooltip.caretY}px`;\n tooltipEl.style.transform = 'translate(-50%, calc(-100% - 8px))';\n\n // Build content\n let titleHtml = '';\n if (tooltip.title?.length) {\n titleHtml = `<div class=\"chart-tooltip__title\">${tooltip.title.join(', ')}</div>`;\n }\n\n const bodyLines: string[][] = tooltip.body?.map((b: { lines: string[] }) => b.lines) ?? [];\n const colors: { backgroundColor: string }[] = tooltip.labelColors ?? [];\n const itemsHtml = bodyLines.map((lines: string[], i: number) => {\n const color = colors[i]?.backgroundColor ?? '#888';\n const bgStr = typeof color === 'object' ? '#888' : String(color);\n return lines.map((line: string) =>\n `<div class=\"chart-tooltip__item\">\n <span class=\"chart-tooltip__swatch\" style=\"background:${bgStr}\"></span>\n <span>${line}</span>\n </div>`\n ).join('');\n }).join('');\n\n tooltipEl.innerHTML = `<div class=\"chart-tooltip__inner\">${titleHtml}${itemsHtml}</div>`;\n this.tooltipVisible = true;\n }\n\n private createChart() {\n if (!this.canvas) return;\n\n const ctx = this.canvas.getContext('2d');\n if (!ctx) return;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.chart = new Chart(ctx, {\n type: this.type,\n data: this.applyThemeColors(this.data),\n options: this.buildOptions()\n } as any);\n }\n\n private destroyChart() {\n if (this.chart) {\n this.chart.destroy();\n this.chart = null;\n }\n }\n\n private recreateChart() {\n this.destroyChart();\n this.createChart();\n }\n\n private setupResizeObserver() {\n this.resizeObserver = new ResizeObserver(() => {\n this.chart?.resize();\n });\n this.resizeObserver.observe(this);\n }\n\n private setupThemeObserver() {\n this.themeObserver = new MutationObserver(() => {\n this.recreateChart();\n });\n this.themeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme']\n });\n }\n\n override render() {\n return html`\n <div class=\"chart-container\">\n <canvas></canvas>\n <div class=\"chart-tooltip ${this.tooltipVisible ? 'visible' : ''}\"></div>\n </div>\n `;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["defaults"]
7
+ }
@@ -0,0 +1,8 @@
1
+ import { MzChart } from './chart.component.js';
2
+ export * from './chart.component.js';
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'mz-chart': MzChart;
6
+ }
7
+ }
8
+ //# sourceMappingURL=chart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart.d.ts","sourceRoot":"","sources":["../src/chart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,cAAc,sBAAsB,CAAC;AAIrC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,OAAO,CAAC;KACrB;CACF"}
package/dist/chart.js ADDED
@@ -0,0 +1,4 @@
1
+ import { MzChart } from "./chart.component.js";
2
+ export * from "./chart.component.js";
3
+ MzChart.define("mz-chart");
4
+ //# sourceMappingURL=chart.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/chart.ts"],
4
+ "sourcesContent": ["import { MzChart } from './chart.component.js';\n\nexport * from './chart.component.js';\n\nMzChart.define('mz-chart');\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'mz-chart': MzChart;\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,eAAe;AAExB,cAAc;AAEd,QAAQ,OAAO,UAAU;",
6
+ "names": []
7
+ }
@@ -0,0 +1,3 @@
1
+ declare const _default: import("lit").CSSResult[];
2
+ export default _default;
3
+ //# sourceMappingURL=chart.styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart.styles.d.ts","sourceRoot":"","sources":["../src/chart.styles.ts"],"names":[],"mappings":";AAGA,wBA6DE"}
@@ -0,0 +1,68 @@
1
+ import { css } from "lit";
2
+ import componentStyles from "@manzanohq/components/dist/styles/component.styles.js";
3
+ var chart_styles_default = [
4
+ componentStyles,
5
+ css`
6
+ :host {
7
+ display: block;
8
+ position: relative;
9
+ width: 100%;
10
+ }
11
+
12
+ .chart-container {
13
+ position: relative;
14
+ width: 100%;
15
+ height: 100%;
16
+ }
17
+
18
+ canvas {
19
+ display: block;
20
+ }
21
+
22
+ .chart-tooltip {
23
+ position: absolute;
24
+ pointer-events: none;
25
+ opacity: 0;
26
+ transition: opacity 150ms ease, transform 150ms ease;
27
+ z-index: 10;
28
+ }
29
+
30
+ .chart-tooltip.visible {
31
+ opacity: 1;
32
+ }
33
+
34
+ .chart-tooltip__inner {
35
+ background: var(--mz-color-gray-900, #1c1915);
36
+ color: var(--mz-color-gray-50, #faf9f7);
37
+ padding: 6px 10px;
38
+ border-radius: var(--mz-radius-md, 0.5rem);
39
+ font-family: var(--mz-font-sans, sans-serif);
40
+ font-size: var(--mz-font-size-xs, 0.75rem);
41
+ line-height: 1.4;
42
+ box-shadow: 0 4px 12px rgb(28 25 21 / 0.15);
43
+ max-width: 200px;
44
+ }
45
+
46
+ .chart-tooltip__title {
47
+ font-weight: 600;
48
+ margin-bottom: 2px;
49
+ }
50
+
51
+ .chart-tooltip__item {
52
+ display: flex;
53
+ align-items: center;
54
+ gap: 6px;
55
+ }
56
+
57
+ .chart-tooltip__swatch {
58
+ width: 8px;
59
+ height: 8px;
60
+ border-radius: 2px;
61
+ flex-shrink: 0;
62
+ }
63
+ `
64
+ ];
65
+ export {
66
+ chart_styles_default as default
67
+ };
68
+ //# sourceMappingURL=chart.styles.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/chart.styles.ts"],
4
+ "sourcesContent": ["import { css } from 'lit';\nimport componentStyles from '@manzanohq/components/dist/styles/component.styles.js';\n\nexport default [\n componentStyles,\n css`\n :host {\n display: block;\n position: relative;\n width: 100%;\n }\n\n .chart-container {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n canvas {\n display: block;\n }\n\n .chart-tooltip {\n position: absolute;\n pointer-events: none;\n opacity: 0;\n transition: opacity 150ms ease, transform 150ms ease;\n z-index: 10;\n }\n\n .chart-tooltip.visible {\n opacity: 1;\n }\n\n .chart-tooltip__inner {\n background: var(--mz-color-gray-900, #1c1915);\n color: var(--mz-color-gray-50, #faf9f7);\n padding: 6px 10px;\n border-radius: var(--mz-radius-md, 0.5rem);\n font-family: var(--mz-font-sans, sans-serif);\n font-size: var(--mz-font-size-xs, 0.75rem);\n line-height: 1.4;\n box-shadow: 0 4px 12px rgb(28 25 21 / 0.15);\n max-width: 200px;\n }\n\n .chart-tooltip__title {\n font-weight: 600;\n margin-bottom: 2px;\n }\n\n .chart-tooltip__item {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .chart-tooltip__swatch {\n width: 8px;\n height: 8px;\n border-radius: 2px;\n flex-shrink: 0;\n }\n `\n];\n"],
5
+ "mappings": "AAAA,SAAS,WAAW;AACpB,OAAO,qBAAqB;AAE5B,IAAO,uBAAQ;AAAA,EACb;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2DF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,13 @@
1
+ import type { ChartData, ChartOptions } from 'chart.js';
2
+ /** Supported chart types */
3
+ export type MzChartType = 'bar' | 'line' | 'pie' | 'doughnut' | 'radar' | 'polarArea' | 'scatter' | 'bubble';
4
+ /** Re-export Chart.js types under Manzano names */
5
+ export type { ChartData, ChartOptions };
6
+ /** Detail payload for mz-chart-click events */
7
+ export interface ChartClickDetail {
8
+ datasetIndex: number;
9
+ index: number;
10
+ value: number;
11
+ label: string;
12
+ }
13
+ //# sourceMappingURL=chart.types.d.ts.map