trackhome-react 0.4.0 → 0.5.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.
Files changed (42) hide show
  1. package/README.md +4 -2
  2. package/dist/index.d.ts +8 -3
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +59 -474
  5. package/dist/index.js.map +1 -1
  6. package/dist/widgets/categorical.d.ts +6 -0
  7. package/dist/widgets/categorical.d.ts.map +1 -0
  8. package/dist/widgets/categorical.js +37 -0
  9. package/dist/widgets/categorical.js.map +1 -0
  10. package/dist/widgets/common.d.ts +42 -0
  11. package/dist/widgets/common.d.ts.map +1 -0
  12. package/dist/widgets/common.js +39 -0
  13. package/dist/widgets/common.js.map +1 -0
  14. package/dist/widgets/funnel.d.ts +3 -0
  15. package/dist/widgets/funnel.d.ts.map +1 -0
  16. package/dist/widgets/funnel.js +83 -0
  17. package/dist/widgets/funnel.js.map +1 -0
  18. package/dist/widgets/index.d.ts +4 -0
  19. package/dist/widgets/index.d.ts.map +1 -0
  20. package/dist/widgets/index.js +4 -0
  21. package/dist/widgets/index.js.map +1 -0
  22. package/dist/widgets/inputs.d.ts +32 -0
  23. package/dist/widgets/inputs.d.ts.map +1 -0
  24. package/dist/widgets/inputs.js +312 -0
  25. package/dist/widgets/inputs.js.map +1 -0
  26. package/dist/widgets/metric.d.ts +3 -0
  27. package/dist/widgets/metric.d.ts.map +1 -0
  28. package/dist/widgets/metric.js +15 -0
  29. package/dist/widgets/metric.js.map +1 -0
  30. package/dist/widgets/registry.d.ts +26 -0
  31. package/dist/widgets/registry.d.ts.map +1 -0
  32. package/dist/widgets/registry.js +53 -0
  33. package/dist/widgets/registry.js.map +1 -0
  34. package/dist/widgets/timeseries.d.ts +4 -0
  35. package/dist/widgets/timeseries.d.ts.map +1 -0
  36. package/dist/widgets/timeseries.js +34 -0
  37. package/dist/widgets/timeseries.js.map +1 -0
  38. package/dist/widgets/types.d.ts +87 -0
  39. package/dist/widgets/types.d.ts.map +1 -0
  40. package/dist/widgets/types.js +18 -0
  41. package/dist/widgets/types.js.map +1 -0
  42. package/package.json +2 -7
@@ -0,0 +1,312 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Autosuggest inputs shared by every widget EditForm.
4
+ *
5
+ * Zero deps; each fetches /e/<key>/<uid>/suggest/* with a 150ms debounce.
6
+ * - AutosuggestInput — single value (event type / tag prefix)
7
+ * - TagsAutosuggestInput — multi value chips (tag filters)
8
+ */
9
+ import { useState, useEffect } from 'react';
10
+ function useDebounced(value, delayMs) {
11
+ const [debounced, setDebounced] = useState(value);
12
+ useEffect(() => {
13
+ const t = setTimeout(() => setDebounced(value), delayMs);
14
+ return () => clearTimeout(t);
15
+ }, [value, delayMs]);
16
+ return debounced;
17
+ }
18
+ export function AutosuggestInput({ endpoint, authKey, uid, suggestPath, value, onChange, placeholder, theme, inputStyle, }) {
19
+ const [text, setText] = useState(value);
20
+ const [open, setOpen] = useState(false);
21
+ const [highlight, setHighlight] = useState(0);
22
+ const [items, setItems] = useState([]);
23
+ const [loading, setLoading] = useState(false);
24
+ const debounced = useDebounced(text.trim(), 150);
25
+ useEffect(() => {
26
+ setText(value);
27
+ }, [value]);
28
+ useEffect(() => {
29
+ let cancelled = false;
30
+ if (!open || debounced.length === 0) {
31
+ setItems([]);
32
+ setLoading(false);
33
+ return;
34
+ }
35
+ setLoading(true);
36
+ const url = `${endpoint.replace(/\/$/, '')}/e/${authKey}/${uid}/suggest/${suggestPath}?q=${encodeURIComponent(debounced)}&limit=10`;
37
+ fetch(url)
38
+ .then((r) => (r.ok ? r.json() : Promise.reject(new Error(String(r.status)))))
39
+ .then((body) => {
40
+ if (cancelled)
41
+ return;
42
+ setItems(body.items ?? []);
43
+ setHighlight(0);
44
+ })
45
+ .catch(() => {
46
+ if (cancelled)
47
+ return;
48
+ setItems([]);
49
+ })
50
+ .finally(() => {
51
+ if (!cancelled)
52
+ setLoading(false);
53
+ });
54
+ return () => {
55
+ cancelled = true;
56
+ };
57
+ }, [endpoint, authKey, uid, suggestPath, debounced, open]);
58
+ const showItemCreate = text.trim().length > 0 && !items.some((it) => it.value === text.trim());
59
+ function commit(v) {
60
+ setText(v);
61
+ onChange(v);
62
+ setOpen(false);
63
+ }
64
+ function onKeyDown(e) {
65
+ const totalOptions = items.length + (showItemCreate ? 1 : 0);
66
+ if (e.key === 'ArrowDown' && totalOptions > 0) {
67
+ e.preventDefault();
68
+ setOpen(true);
69
+ setHighlight((h) => Math.min(h + 1, totalOptions - 1));
70
+ }
71
+ else if (e.key === 'ArrowUp' && totalOptions > 0) {
72
+ e.preventDefault();
73
+ setHighlight((h) => Math.max(h - 1, 0));
74
+ }
75
+ else if (e.key === 'Enter') {
76
+ if (open && totalOptions > 0) {
77
+ e.preventDefault();
78
+ if (highlight < items.length)
79
+ commit(items[highlight].value);
80
+ else
81
+ commit(text.trim());
82
+ }
83
+ }
84
+ else if (e.key === 'Escape') {
85
+ setOpen(false);
86
+ }
87
+ }
88
+ const dropdownBg = theme === 'dark' ? '#0f172a' : '#ffffff';
89
+ const dropdownBorder = theme === 'dark' ? '#334155' : '#cbd5e1';
90
+ const hoverBg = theme === 'dark' ? '#1e293b' : '#eef2ff';
91
+ const subText = theme === 'dark' ? '#94a3b8' : '#64748b';
92
+ return (_jsxs("div", { style: { position: 'relative' }, children: [_jsx("input", { style: inputStyle, value: text, onChange: (e) => {
93
+ setText(e.target.value);
94
+ onChange(e.target.value);
95
+ setOpen(true);
96
+ setHighlight(0);
97
+ }, onFocus: () => setOpen(true), onBlur: () => setTimeout(() => setOpen(false), 120), onKeyDown: onKeyDown, placeholder: placeholder, autoComplete: "off", spellCheck: false }), open && text.trim().length > 0 && (_jsxs("div", { style: {
98
+ position: 'absolute',
99
+ top: 'calc(100% + 2px)',
100
+ left: 0,
101
+ right: 0,
102
+ background: dropdownBg,
103
+ border: `1px solid ${dropdownBorder}`,
104
+ borderRadius: 6,
105
+ boxShadow: '0 8px 24px rgba(0,0,0,0.15)',
106
+ zIndex: 1100,
107
+ maxHeight: 240,
108
+ overflowY: 'auto',
109
+ fontSize: 12,
110
+ }, onMouseDown: (e) => e.preventDefault(), children: [loading && _jsx("div", { style: { padding: '8px 10px', color: subText }, children: "Searching\u2026" }), !loading && items.length === 0 && !showItemCreate && (_jsx("div", { style: { padding: '8px 10px', color: subText }, children: "No matches." })), items.map((it, i) => (_jsxs("div", { onMouseEnter: () => setHighlight(i), onMouseDown: (e) => {
111
+ e.preventDefault();
112
+ commit(it.value);
113
+ }, style: {
114
+ padding: '6px 10px',
115
+ cursor: 'pointer',
116
+ display: 'flex',
117
+ justifyContent: 'space-between',
118
+ gap: 8,
119
+ background: i === highlight ? hoverBg : 'transparent',
120
+ borderRadius: 4,
121
+ fontFamily: suggestPath === 'prefixes' ? 'monospace' : undefined,
122
+ }, children: [_jsx("span", { style: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }, children: it.value }), _jsx("span", { style: { color: subText, flexShrink: 0, fontVariantNumeric: 'tabular-nums' }, children: it.count.toLocaleString() })] }, it.value))), showItemCreate && (_jsxs("div", { onMouseEnter: () => setHighlight(items.length), onMouseDown: (e) => {
123
+ e.preventDefault();
124
+ commit(text.trim());
125
+ }, style: {
126
+ padding: '6px 10px',
127
+ cursor: 'pointer',
128
+ borderTop: `1px dashed ${dropdownBorder}`,
129
+ marginTop: items.length > 0 ? 4 : 0,
130
+ background: highlight === items.length ? hoverBg : 'transparent',
131
+ borderRadius: 4,
132
+ color: '#4f46e5',
133
+ fontStyle: 'italic',
134
+ }, children: ["Use \"", text.trim(), "\"", suggestPath === 'prefixes' ? ' (new prefix)' : ' (new)'] }))] }))] }));
135
+ }
136
+ export function TagsAutosuggestInput({ endpoint, authKey, uid, tags, onChange, placeholder, theme, inputStyle, inputId = 'tag-input-internal', }) {
137
+ const [text, setText] = useState('');
138
+ const [open, setOpen] = useState(false);
139
+ const [highlight, setHighlight] = useState(0);
140
+ const [items, setItems] = useState([]);
141
+ const [loading, setLoading] = useState(false);
142
+ const debounced = useDebounced(text.trim(), 150);
143
+ useEffect(() => {
144
+ let cancelled = false;
145
+ if (!open || debounced.length === 0) {
146
+ setItems([]);
147
+ setLoading(false);
148
+ return;
149
+ }
150
+ setLoading(true);
151
+ const url = `${endpoint.replace(/\/$/, '')}/e/${authKey}/${uid}/suggest/tags?q=${encodeURIComponent(debounced)}&limit=10`;
152
+ fetch(url)
153
+ .then((r) => (r.ok ? r.json() : Promise.reject(new Error(String(r.status)))))
154
+ .then((body) => {
155
+ if (cancelled)
156
+ return;
157
+ setItems(body.items ?? []);
158
+ setHighlight(0);
159
+ })
160
+ .catch(() => {
161
+ if (cancelled)
162
+ return;
163
+ setItems([]);
164
+ })
165
+ .finally(() => {
166
+ if (!cancelled)
167
+ setLoading(false);
168
+ });
169
+ return () => {
170
+ cancelled = true;
171
+ };
172
+ }, [endpoint, authKey, uid, debounced, open]);
173
+ function addTag(raw) {
174
+ const v = raw.trim();
175
+ if (!v)
176
+ return;
177
+ const next = Array.from(new Set([...tags, v]));
178
+ onChange(next);
179
+ setText('');
180
+ setItems([]);
181
+ setHighlight(0);
182
+ }
183
+ function removeTag(t) {
184
+ onChange(tags.filter((x) => x !== t));
185
+ }
186
+ function onKeyDown(e) {
187
+ const totalOptions = items.length + (text.trim().length > 0 && !items.some((it) => it.value === text.trim()) ? 1 : 0);
188
+ if (e.key === 'ArrowDown' && totalOptions > 0) {
189
+ e.preventDefault();
190
+ setOpen(true);
191
+ setHighlight((h) => Math.min(h + 1, totalOptions - 1));
192
+ }
193
+ else if (e.key === 'ArrowUp' && totalOptions > 0) {
194
+ e.preventDefault();
195
+ setHighlight((h) => Math.max(h - 1, 0));
196
+ }
197
+ else if (e.key === 'Enter' || e.key === ',') {
198
+ e.preventDefault();
199
+ if (open && totalOptions > 0) {
200
+ if (highlight < items.length)
201
+ addTag(items[highlight].value);
202
+ else
203
+ addTag(text.trim());
204
+ }
205
+ else {
206
+ addTag(text.trim());
207
+ }
208
+ }
209
+ else if (e.key === 'Backspace' && text === '' && tags.length > 0) {
210
+ removeTag(tags[tags.length - 1]);
211
+ }
212
+ else if (e.key === 'Escape') {
213
+ setOpen(false);
214
+ }
215
+ }
216
+ const dropdownBg = theme === 'dark' ? '#0f172a' : '#ffffff';
217
+ const dropdownBorder = theme === 'dark' ? '#334155' : '#cbd5e1';
218
+ const hoverBg = theme === 'dark' ? '#1e293b' : '#eef2ff';
219
+ const subText = theme === 'dark' ? '#94a3b8' : '#64748b';
220
+ const chipBg = theme === 'dark' ? '#334155' : '#e0e7ff';
221
+ const chipText = theme === 'dark' ? '#f1f5f9' : '#3730a3';
222
+ const showItemCreate = text.trim().length > 0 && !items.some((it) => it.value === text.trim());
223
+ return (_jsxs("div", { style: {
224
+ ...inputStyle,
225
+ display: 'flex',
226
+ flexWrap: 'wrap',
227
+ gap: 4,
228
+ alignItems: 'center',
229
+ padding: '4px 6px',
230
+ cursor: 'text',
231
+ minHeight: inputStyle.padding ?? 36,
232
+ }, onMouseDown: () => {
233
+ const i = document.getElementById(inputId);
234
+ if (i)
235
+ i.focus();
236
+ }, children: [tags.map((t) => (_jsxs("span", { style: {
237
+ display: 'inline-flex',
238
+ alignItems: 'center',
239
+ gap: 4,
240
+ background: chipBg,
241
+ color: chipText,
242
+ padding: '2px 4px 2px 8px',
243
+ borderRadius: 4,
244
+ fontSize: 11,
245
+ fontFamily: 'monospace',
246
+ }, children: [t, _jsx("button", { type: "button", onMouseDown: (e) => {
247
+ e.preventDefault();
248
+ e.stopPropagation();
249
+ removeTag(t);
250
+ }, style: {
251
+ border: 'none',
252
+ background: 'transparent',
253
+ color: chipText,
254
+ cursor: 'pointer',
255
+ fontSize: 13,
256
+ lineHeight: 1,
257
+ padding: '0 4px',
258
+ }, "aria-label": `Remove ${t}`, children: "\u00D7" })] }, t))), _jsxs("div", { style: { position: 'relative', flex: 1, minWidth: 80 }, children: [_jsx("input", { id: inputId, style: {
259
+ width: '100%',
260
+ background: 'transparent',
261
+ border: 'none',
262
+ outline: 'none',
263
+ color: 'inherit',
264
+ fontSize: 13,
265
+ padding: '4px 2px',
266
+ fontFamily: 'monospace',
267
+ }, value: text, onChange: (e) => {
268
+ const next = e.target.value.replace(/,/g, '');
269
+ setText(next);
270
+ setOpen(true);
271
+ setHighlight(0);
272
+ }, onFocus: () => setOpen(true), onBlur: () => setTimeout(() => setOpen(false), 120), onKeyDown: onKeyDown, placeholder: tags.length === 0 ? placeholder : '', autoComplete: "off", spellCheck: false }), open && text.trim().length > 0 && (_jsxs("div", { style: {
273
+ position: 'absolute',
274
+ top: 'calc(100% + 2px)',
275
+ left: 0,
276
+ right: 0,
277
+ background: dropdownBg,
278
+ border: `1px solid ${dropdownBorder}`,
279
+ borderRadius: 6,
280
+ boxShadow: '0 8px 24px rgba(0,0,0,0.15)',
281
+ zIndex: 1100,
282
+ maxHeight: 240,
283
+ overflowY: 'auto',
284
+ fontSize: 12,
285
+ }, onMouseDown: (e) => e.preventDefault(), children: [loading && _jsx("div", { style: { padding: '8px 10px', color: subText }, children: "Searching\u2026" }), !loading && items.length === 0 && !showItemCreate && (_jsx("div", { style: { padding: '8px 10px', color: subText }, children: "No matches." })), items.map((it, i) => (_jsxs("div", { onMouseEnter: () => setHighlight(i), onMouseDown: (e) => {
286
+ e.preventDefault();
287
+ addTag(it.value);
288
+ }, style: {
289
+ padding: '6px 10px',
290
+ cursor: 'pointer',
291
+ display: 'flex',
292
+ justifyContent: 'space-between',
293
+ gap: 8,
294
+ background: i === highlight ? hoverBg : 'transparent',
295
+ borderRadius: 4,
296
+ fontFamily: 'monospace',
297
+ }, children: [_jsx("span", { style: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }, children: it.value }), _jsx("span", { style: { color: subText, flexShrink: 0, fontVariantNumeric: 'tabular-nums' }, children: it.count.toLocaleString() })] }, it.value))), showItemCreate && (_jsxs("div", { onMouseEnter: () => setHighlight(items.length), onMouseDown: (e) => {
298
+ e.preventDefault();
299
+ addTag(text.trim());
300
+ }, style: {
301
+ padding: '6px 10px',
302
+ cursor: 'pointer',
303
+ borderTop: `1px dashed ${dropdownBorder}`,
304
+ marginTop: items.length > 0 ? 4 : 0,
305
+ background: highlight === items.length ? hoverBg : 'transparent',
306
+ borderRadius: 4,
307
+ color: '#4f46e5',
308
+ fontStyle: 'italic',
309
+ fontFamily: 'monospace',
310
+ }, children: ["Add \"", text.trim(), "\" (new tag)"] }))] }))] })] }));
311
+ }
312
+ //# sourceMappingURL=inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputs.js","sourceRoot":"","sources":["../../src/widgets/inputs.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { WidgetUI } from './types.js';
2
+ export declare const metricWidget: WidgetUI;
3
+ //# sourceMappingURL=metric.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metric.d.ts","sourceRoot":"","sources":["../../src/widgets/metric.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,eAAO,MAAM,YAAY,EAAE,QAwB1B,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ACCENT } from './types.js';
3
+ import { Field, EventTypeField } from './common.js';
4
+ export const metricWidget = {
5
+ meta: { value: 'metric', label: 'Metric', hint: 'Single big number (count over last N minutes)' },
6
+ defaultConfig: () => ({ minutes: 5 }),
7
+ Render: ({ data }) => {
8
+ // The metric resolver (realtime) returns a bare number; tolerate both that
9
+ // and a { count } object so a shape change never breaks the render.
10
+ const count = typeof data === 'number' ? data : (data?.count ?? 0);
11
+ return _jsx("div", { style: { fontSize: 28, fontWeight: 700, color: ACCENT }, children: count.toLocaleString() });
12
+ },
13
+ EditForm: ({ draft, update, ctx }) => (_jsxs(_Fragment, { children: [_jsx(Field, { label: "Window (minutes)", ctx: ctx, children: _jsx("input", { type: "number", min: 1, style: ctx.inputStyle, value: draft.minutes ?? 5, onChange: (e) => update({ minutes: Number(e.target.value) || 5 }) }) }), _jsx(EventTypeField, { draft: draft, update: update, ctx: ctx })] })),
14
+ };
15
+ //# sourceMappingURL=metric.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metric.js","sourceRoot":"","sources":["../../src/widgets/metric.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,CAAC,MAAM,YAAY,GAAa;IACpC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,+CAA+C,EAAE;IACjG,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACrC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;QACnB,2EAA2E;QAC3E,oEAAoE;QACpE,MAAM,KAAK,GACT,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,IAAkC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;QACtF,OAAO,cAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,YAAG,KAAK,CAAC,cAAc,EAAE,GAAO,CAAC;IACtG,CAAC;IACD,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CACpC,8BACE,KAAC,KAAK,IAAC,KAAK,EAAC,kBAAkB,EAAC,GAAG,EAAE,GAAG,YACtC,gBACE,IAAI,EAAC,QAAQ,EACb,GAAG,EAAE,CAAC,EACN,KAAK,EAAE,GAAG,CAAC,UAAU,EACrB,KAAK,EAAE,KAAK,CAAC,OAAO,IAAI,CAAC,EACzB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GACjE,GACI,EACR,KAAC,cAAc,IAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAI,IACzD,CACJ;CACF,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Widget UI registry — maps each kind to its self-contained module
3
+ * (metadata + defaults + renderer + edit form). Adding a widget kind = add a
4
+ * module and register it here; index.tsx never branches on kind.
5
+ *
6
+ * Typed as Record<WidgetKind, WidgetUI> so a kind missing a module is a
7
+ * compile error.
8
+ */
9
+ import type { WidgetUI, WidgetKind, Widget } from './types.js';
10
+ export declare const uiRegistry: Record<WidgetKind, WidgetUI>;
11
+ /** Ordered metadata for the kind <select>. */
12
+ export declare const WIDGET_KINDS: {
13
+ value: WidgetKind;
14
+ label: string;
15
+ hint: string;
16
+ }[];
17
+ /** Build a fresh widget of the given kind with common base + kind defaults. */
18
+ export declare function defaultWidget(kind: WidgetKind, partial?: Partial<Widget>): Widget;
19
+ /**
20
+ * Upgrade a legacy stored widget so old embed dashboards keep loading:
21
+ * - `unique_visitors` → `timeseries` + metric 'unique'
22
+ * - drop `funnelSlug`/`funnelId` (funnels now carry inline steps)
23
+ * - funnel widgets missing `steps` → empty array
24
+ */
25
+ export declare function normalizeWidget(raw: Widget): Widget;
26
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/widgets/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAO/D,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,QAAQ,CASnD,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,YAAY;;;;GAA2E,CAAC;AAErG,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAajF;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAWnD"}
@@ -0,0 +1,53 @@
1
+ import { DEFAULT_W, newId } from './types.js';
2
+ import { metricWidget } from './metric.js';
3
+ import { timeseriesWidget, areaWidget } from './timeseries.js';
4
+ import { barWidget, pieWidget, topEventsWidget, topTagsWidget } from './categorical.js';
5
+ import { funnelWidget } from './funnel.js';
6
+ export const uiRegistry = {
7
+ metric: metricWidget,
8
+ timeseries: timeseriesWidget,
9
+ area: areaWidget,
10
+ bar: barWidget,
11
+ pie: pieWidget,
12
+ top_events: topEventsWidget,
13
+ top_tags: topTagsWidget,
14
+ funnel: funnelWidget,
15
+ };
16
+ /** Ordered metadata for the kind <select>. */
17
+ export const WIDGET_KINDS = Object.keys(uiRegistry).map((k) => uiRegistry[k].meta);
18
+ /** Build a fresh widget of the given kind with common base + kind defaults. */
19
+ export function defaultWidget(kind, partial) {
20
+ const widget = {
21
+ id: newId(),
22
+ title: 'New widget',
23
+ kind,
24
+ tags: [],
25
+ layout: { x: 0, y: 0, w: DEFAULT_W, h: 4 },
26
+ ...uiRegistry[kind].defaultConfig(),
27
+ ...partial,
28
+ };
29
+ // Ensure kind is authoritative even if `partial` carried a different one.
30
+ widget.kind = kind;
31
+ return widget;
32
+ }
33
+ /**
34
+ * Upgrade a legacy stored widget so old embed dashboards keep loading:
35
+ * - `unique_visitors` → `timeseries` + metric 'unique'
36
+ * - drop `funnelSlug`/`funnelId` (funnels now carry inline steps)
37
+ * - funnel widgets missing `steps` → empty array
38
+ */
39
+ export function normalizeWidget(raw) {
40
+ const w = { ...raw };
41
+ delete w.funnelSlug;
42
+ delete w.funnelId;
43
+ if (w.kind === 'unique_visitors') {
44
+ w.kind = 'timeseries';
45
+ w.metric = 'unique';
46
+ }
47
+ if (w.kind === 'funnel' && !Array.isArray(w.steps))
48
+ w.steps = [];
49
+ if (!Array.isArray(w.tags))
50
+ w.tags = [];
51
+ return w;
52
+ }
53
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/widgets/registry.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,MAAM,UAAU,GAAiC;IACtD,MAAM,EAAE,YAAY;IACpB,UAAU,EAAE,gBAAgB;IAC5B,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,SAAS;IACd,UAAU,EAAE,eAAe;IAC3B,QAAQ,EAAE,aAAa;IACvB,MAAM,EAAE,YAAY;CACrB,CAAC;AAEF,8CAA8C;AAC9C,MAAM,CAAC,MAAM,YAAY,GAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAErG,+EAA+E;AAC/E,MAAM,UAAU,aAAa,CAAC,IAAgB,EAAE,OAAyB;IACvE,MAAM,MAAM,GAAW;QACrB,EAAE,EAAE,KAAK,EAAE;QACX,KAAK,EAAE,YAAY;QACnB,IAAI;QACJ,IAAI,EAAE,EAAE;QACR,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE;QAC1C,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE;QACnC,GAAG,OAAO;KACX,CAAC;IACF,0EAA0E;IAC1E,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,CAAC,GAAG,EAAE,GAAI,GAA6D,EAAE,CAAC;IAChF,OAAO,CAAC,CAAC,UAAU,CAAC;IACpB,OAAO,CAAC,CAAC,QAAQ,CAAC;IAClB,IAAK,CAAC,CAAC,IAAe,KAAK,iBAAiB,EAAE,CAAC;QAC7C,CAAC,CAAC,IAAI,GAAG,YAAY,CAAC;QACtB,CAAC,CAAC,MAAM,GAAG,QAAQ,CAAC;IACtB,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;IACjE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;IACxC,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { WidgetUI } from './types.js';
2
+ export declare const timeseriesWidget: WidgetUI;
3
+ export declare const areaWidget: WidgetUI;
4
+ //# sourceMappingURL=timeseries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeseries.d.ts","sourceRoot":"","sources":["../../src/widgets/timeseries.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAsC,MAAM,YAAY,CAAC;AA+C/E,eAAO,MAAM,gBAAgB,EAAE,QAK9B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,QAKxB,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { ACCENT } from './types.js';
3
+ import { Field, NoData, MetricField, EventTypeField } from './common.js';
4
+ function TimechartRender({ widget, data, theme }) {
5
+ const d = Array.isArray(data) ? data : [];
6
+ if (d.length === 0)
7
+ return _jsx(NoData, { theme: theme });
8
+ const max = Math.max(...d.map((p) => p.count), 1);
9
+ return (_jsx("div", { style: { display: 'flex', alignItems: 'flex-end', gap: 2, height: 80 }, children: d.slice(-30).map((p, i) => (_jsx("div", { title: `${p.ts.slice(0, 10)}: ${p.count}`, style: {
10
+ flex: 1,
11
+ height: `${(p.count / max) * 100}%`,
12
+ minHeight: 2,
13
+ background: ACCENT,
14
+ opacity: widget.kind === 'area' ? 0.6 : 1,
15
+ borderRadius: '2px 2px 0 0',
16
+ } }, i))) }));
17
+ }
18
+ function TimechartEditForm({ draft, update, ctx }) {
19
+ return (_jsxs(_Fragment, { children: [_jsx(Field, { label: "Bucket interval", ctx: ctx, children: _jsxs("select", { style: ctx.inputStyle, value: draft.bucket ?? '1 day', onChange: (e) => update({ bucket: e.target.value }), children: [_jsx("option", { value: "1 hour", children: "1 hour" }), _jsx("option", { value: "6 hours", children: "6 hours" }), _jsx("option", { value: "1 day", children: "1 day" }), _jsx("option", { value: "7 days", children: "7 days" })] }) }), _jsx(MetricField, { draft: draft, update: update, ctx: ctx }), _jsx(EventTypeField, { draft: draft, update: update, ctx: ctx })] }));
20
+ }
21
+ const timechartConfig = () => ({ bucket: '1 day', metric: 'count' });
22
+ export const timeseriesWidget = {
23
+ meta: { value: 'timeseries', label: 'Time series', hint: 'Line chart over time' },
24
+ defaultConfig: timechartConfig,
25
+ Render: TimechartRender,
26
+ EditForm: TimechartEditForm,
27
+ };
28
+ export const areaWidget = {
29
+ meta: { value: 'area', label: 'Area', hint: 'Filled area chart over time' },
30
+ defaultConfig: timechartConfig,
31
+ Render: TimechartRender,
32
+ EditForm: TimechartEditForm,
33
+ };
34
+ //# sourceMappingURL=timeseries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeseries.js","sourceRoot":"","sources":["../../src/widgets/timeseries.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Shared widget contract for the embed component.
3
+ *
4
+ * This package is published standalone (vendor-neutral, zero runtime deps
5
+ * beyond React), so it keeps its own copy of the widget shape rather than
6
+ * importing @trackhome/shared. The shape mirrors the server contract: a common
7
+ * base ({ id, title, kind, tags, layout }) plus kind-specific fields, with
8
+ * funnel steps stored INLINE on the widget.
9
+ */
10
+ import type React from 'react';
11
+ export type WidgetKind = 'metric' | 'timeseries' | 'area' | 'bar' | 'pie' | 'top_events' | 'top_tags' | 'funnel';
12
+ export type Theme = 'light' | 'dark';
13
+ export type Metric = 'count' | 'unique' | 'sum' | 'avg';
14
+ export interface FunnelStep {
15
+ type: string;
16
+ tags?: string[];
17
+ }
18
+ export interface WidgetLayout {
19
+ x: number;
20
+ y: number;
21
+ w: number;
22
+ h: number;
23
+ }
24
+ export interface Widget {
25
+ id: string;
26
+ title: string;
27
+ kind: WidgetKind;
28
+ tags: string[];
29
+ eventType?: string;
30
+ tagPrefix?: string;
31
+ bucket?: string;
32
+ metric?: Metric;
33
+ minutes?: number;
34
+ breakdown?: 'event_type' | 'tag';
35
+ steps?: FunnelStep[];
36
+ windowMinutes?: number;
37
+ filterTags?: string[];
38
+ layout?: WidgetLayout;
39
+ }
40
+ export interface EmbedConfig {
41
+ name: string;
42
+ widgets: Widget[];
43
+ theme?: Theme;
44
+ }
45
+ /** Width range in the 12-column grid. */
46
+ export declare const MIN_W = 2;
47
+ export declare const MAX_W = 12;
48
+ export declare const DEFAULT_W = 6;
49
+ export declare const ACCENT = "#4f46e5";
50
+ export declare function clampW(n: number): number;
51
+ export declare function newId(): string;
52
+ /** Context passed to every EditForm — endpoint info + themed input styles. */
53
+ export interface EditCtx {
54
+ endpoint: string;
55
+ authKey: string;
56
+ uid: string;
57
+ theme: Theme;
58
+ inputStyle: React.CSSProperties;
59
+ labelStyle: React.CSSProperties;
60
+ subLabelColor: string;
61
+ }
62
+ export interface RenderProps {
63
+ widget: Widget;
64
+ data: unknown;
65
+ theme: Theme;
66
+ }
67
+ export interface EditFormProps {
68
+ draft: Widget;
69
+ /** Merge a partial patch into the draft. */
70
+ update: (patch: Partial<Widget>) => void;
71
+ ctx: EditCtx;
72
+ }
73
+ /** One self-contained widget kind: metadata + factory + render + edit form. */
74
+ export interface WidgetUI {
75
+ meta: {
76
+ value: WidgetKind;
77
+ label: string;
78
+ hint: string;
79
+ };
80
+ /** Kind-specific config defaults (merged onto the common base). */
81
+ defaultConfig: () => Partial<Widget>;
82
+ Render: React.FC<RenderProps>;
83
+ EditForm: React.FC<EditFormProps>;
84
+ }
85
+ export declare function subTextColor(theme: Theme): string;
86
+ export declare function trackColor(theme: Theme): string;
87
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/widgets/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /** Width range in the 12-column grid. */
2
+ export const MIN_W = 2;
3
+ export const MAX_W = 12;
4
+ export const DEFAULT_W = 6;
5
+ export const ACCENT = '#4f46e5';
6
+ export function clampW(n) {
7
+ return Math.max(MIN_W, Math.min(MAX_W, Math.round(n)));
8
+ }
9
+ export function newId() {
10
+ return 'w_' + Math.random().toString(36).slice(2, 10) + Date.now().toString(36).slice(-4);
11
+ }
12
+ export function subTextColor(theme) {
13
+ return theme === 'dark' ? '#94a3b8' : '#64748b';
14
+ }
15
+ export function trackColor(theme) {
16
+ return theme === 'dark' ? '#334155' : '#f1f5f9';
17
+ }
18
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/widgets/types.ts"],"names":[],"mappings":"AA6DA,yCAAyC;AACzC,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC;AACvB,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;AACxB,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAE3B,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC;AAEhC,MAAM,UAAU,MAAM,CAAC,CAAS;IAC9B,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,KAAK;IACnB,OAAO,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5F,CAAC;AAmCD,MAAM,UAAU,YAAY,CAAC,KAAY;IACvC,OAAO,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAY;IACrC,OAAO,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC"}