@matthieumordrel/chart-studio 0.1.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.
Files changed (160) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +371 -0
  3. package/dist/core/chart-capabilities.d.ts +60 -0
  4. package/dist/core/chart-capabilities.d.ts.map +1 -0
  5. package/dist/core/chart-capabilities.js +55 -0
  6. package/dist/core/chart-capabilities.js.map +1 -0
  7. package/dist/core/colors.d.ts +25 -0
  8. package/dist/core/colors.d.ts.map +1 -0
  9. package/dist/core/colors.js +55 -0
  10. package/dist/core/colors.js.map +1 -0
  11. package/dist/core/config-utils.d.ts +43 -0
  12. package/dist/core/config-utils.d.ts.map +1 -0
  13. package/dist/core/config-utils.js +81 -0
  14. package/dist/core/config-utils.js.map +1 -0
  15. package/dist/core/date-utils.d.ts +29 -0
  16. package/dist/core/date-utils.d.ts.map +1 -0
  17. package/dist/core/date-utils.js +59 -0
  18. package/dist/core/date-utils.js.map +1 -0
  19. package/dist/core/define-chart-schema.d.ts +105 -0
  20. package/dist/core/define-chart-schema.d.ts.map +1 -0
  21. package/dist/core/define-chart-schema.js +45 -0
  22. package/dist/core/define-chart-schema.js.map +1 -0
  23. package/dist/core/formatting.d.ts +47 -0
  24. package/dist/core/formatting.d.ts.map +1 -0
  25. package/dist/core/formatting.js +397 -0
  26. package/dist/core/formatting.js.map +1 -0
  27. package/dist/core/index.d.ts +17 -0
  28. package/dist/core/index.d.ts.map +1 -0
  29. package/dist/core/index.js +13 -0
  30. package/dist/core/index.js.map +1 -0
  31. package/dist/core/infer-columns.d.ts +6 -0
  32. package/dist/core/infer-columns.d.ts.map +1 -0
  33. package/dist/core/infer-columns.js +513 -0
  34. package/dist/core/infer-columns.js.map +1 -0
  35. package/dist/core/metric-utils.d.ts +43 -0
  36. package/dist/core/metric-utils.d.ts.map +1 -0
  37. package/dist/core/metric-utils.js +142 -0
  38. package/dist/core/metric-utils.js.map +1 -0
  39. package/dist/core/pipeline-data-points.d.ts +23 -0
  40. package/dist/core/pipeline-data-points.d.ts.map +1 -0
  41. package/dist/core/pipeline-data-points.js +236 -0
  42. package/dist/core/pipeline-data-points.js.map +1 -0
  43. package/dist/core/pipeline-helpers.d.ts +38 -0
  44. package/dist/core/pipeline-helpers.d.ts.map +1 -0
  45. package/dist/core/pipeline-helpers.js +98 -0
  46. package/dist/core/pipeline-helpers.js.map +1 -0
  47. package/dist/core/pipeline.d.ts +70 -0
  48. package/dist/core/pipeline.d.ts.map +1 -0
  49. package/dist/core/pipeline.js +157 -0
  50. package/dist/core/pipeline.js.map +1 -0
  51. package/dist/core/types.d.ts +1109 -0
  52. package/dist/core/types.d.ts.map +1 -0
  53. package/dist/core/types.js +15 -0
  54. package/dist/core/types.js.map +1 -0
  55. package/dist/core/use-chart-options.d.ts +66 -0
  56. package/dist/core/use-chart-options.d.ts.map +1 -0
  57. package/dist/core/use-chart-options.js +5 -0
  58. package/dist/core/use-chart-options.js.map +1 -0
  59. package/dist/core/use-chart-resolvers.d.ts +14 -0
  60. package/dist/core/use-chart-resolvers.d.ts.map +1 -0
  61. package/dist/core/use-chart-resolvers.js +42 -0
  62. package/dist/core/use-chart-resolvers.js.map +1 -0
  63. package/dist/core/use-chart.d.ts +47 -0
  64. package/dist/core/use-chart.d.ts.map +1 -0
  65. package/dist/core/use-chart.js +266 -0
  66. package/dist/core/use-chart.js.map +1 -0
  67. package/dist/index.d.ts +36 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +36 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/ui/chart-axis-ticks.d.ts +35 -0
  72. package/dist/ui/chart-axis-ticks.d.ts.map +1 -0
  73. package/dist/ui/chart-axis-ticks.js +80 -0
  74. package/dist/ui/chart-axis-ticks.js.map +1 -0
  75. package/dist/ui/chart-canvas.d.ts +22 -0
  76. package/dist/ui/chart-canvas.d.ts.map +1 -0
  77. package/dist/ui/chart-canvas.js +338 -0
  78. package/dist/ui/chart-canvas.js.map +1 -0
  79. package/dist/ui/chart-context.d.ts +89 -0
  80. package/dist/ui/chart-context.d.ts.map +1 -0
  81. package/dist/ui/chart-context.js +129 -0
  82. package/dist/ui/chart-context.js.map +1 -0
  83. package/dist/ui/chart-date-range-badge.d.ts +14 -0
  84. package/dist/ui/chart-date-range-badge.d.ts.map +1 -0
  85. package/dist/ui/chart-date-range-badge.js +31 -0
  86. package/dist/ui/chart-date-range-badge.js.map +1 -0
  87. package/dist/ui/chart-date-range-panel.d.ts +25 -0
  88. package/dist/ui/chart-date-range-panel.d.ts.map +1 -0
  89. package/dist/ui/chart-date-range-panel.js +126 -0
  90. package/dist/ui/chart-date-range-panel.js.map +1 -0
  91. package/dist/ui/chart-date-range.d.ts +14 -0
  92. package/dist/ui/chart-date-range.d.ts.map +1 -0
  93. package/dist/ui/chart-date-range.js +38 -0
  94. package/dist/ui/chart-date-range.js.map +1 -0
  95. package/dist/ui/chart-debug.d.ts +10 -0
  96. package/dist/ui/chart-debug.d.ts.map +1 -0
  97. package/dist/ui/chart-debug.js +127 -0
  98. package/dist/ui/chart-debug.js.map +1 -0
  99. package/dist/ui/chart-dropdown.d.ts +35 -0
  100. package/dist/ui/chart-dropdown.d.ts.map +1 -0
  101. package/dist/ui/chart-dropdown.js +77 -0
  102. package/dist/ui/chart-dropdown.js.map +1 -0
  103. package/dist/ui/chart-filters-panel.d.ts +19 -0
  104. package/dist/ui/chart-filters-panel.d.ts.map +1 -0
  105. package/dist/ui/chart-filters-panel.js +47 -0
  106. package/dist/ui/chart-filters-panel.js.map +1 -0
  107. package/dist/ui/chart-filters.d.ts +12 -0
  108. package/dist/ui/chart-filters.d.ts.map +1 -0
  109. package/dist/ui/chart-filters.js +27 -0
  110. package/dist/ui/chart-filters.js.map +1 -0
  111. package/dist/ui/chart-group-by-selector.d.ts +8 -0
  112. package/dist/ui/chart-group-by-selector.d.ts.map +1 -0
  113. package/dist/ui/chart-group-by-selector.js +20 -0
  114. package/dist/ui/chart-group-by-selector.js.map +1 -0
  115. package/dist/ui/chart-metric-panel.d.ts +18 -0
  116. package/dist/ui/chart-metric-panel.d.ts.map +1 -0
  117. package/dist/ui/chart-metric-panel.js +119 -0
  118. package/dist/ui/chart-metric-panel.js.map +1 -0
  119. package/dist/ui/chart-metric-selector.d.ts +10 -0
  120. package/dist/ui/chart-metric-selector.d.ts.map +1 -0
  121. package/dist/ui/chart-metric-selector.js +28 -0
  122. package/dist/ui/chart-metric-selector.js.map +1 -0
  123. package/dist/ui/chart-select.d.ts +25 -0
  124. package/dist/ui/chart-select.d.ts.map +1 -0
  125. package/dist/ui/chart-select.js +36 -0
  126. package/dist/ui/chart-select.js.map +1 -0
  127. package/dist/ui/chart-source-switcher.d.ts +16 -0
  128. package/dist/ui/chart-source-switcher.d.ts.map +1 -0
  129. package/dist/ui/chart-source-switcher.js +32 -0
  130. package/dist/ui/chart-source-switcher.js.map +1 -0
  131. package/dist/ui/chart-time-bucket-selector.d.ts +9 -0
  132. package/dist/ui/chart-time-bucket-selector.d.ts.map +1 -0
  133. package/dist/ui/chart-time-bucket-selector.js +26 -0
  134. package/dist/ui/chart-time-bucket-selector.js.map +1 -0
  135. package/dist/ui/chart-toolbar-overflow.d.ts +29 -0
  136. package/dist/ui/chart-toolbar-overflow.d.ts.map +1 -0
  137. package/dist/ui/chart-toolbar-overflow.js +110 -0
  138. package/dist/ui/chart-toolbar-overflow.js.map +1 -0
  139. package/dist/ui/chart-toolbar.d.ts +45 -0
  140. package/dist/ui/chart-toolbar.d.ts.map +1 -0
  141. package/dist/ui/chart-toolbar.js +45 -0
  142. package/dist/ui/chart-toolbar.js.map +1 -0
  143. package/dist/ui/chart-type-selector.d.ts +8 -0
  144. package/dist/ui/chart-type-selector.d.ts.map +1 -0
  145. package/dist/ui/chart-type-selector.js +23 -0
  146. package/dist/ui/chart-type-selector.js.map +1 -0
  147. package/dist/ui/chart-x-axis-selector.d.ts +8 -0
  148. package/dist/ui/chart-x-axis-selector.d.ts.map +1 -0
  149. package/dist/ui/chart-x-axis-selector.js +15 -0
  150. package/dist/ui/chart-x-axis-selector.js.map +1 -0
  151. package/dist/ui/index.d.ts +25 -0
  152. package/dist/ui/index.d.ts.map +1 -0
  153. package/dist/ui/index.js +24 -0
  154. package/dist/ui/index.js.map +1 -0
  155. package/dist/ui/theme.css +62 -0
  156. package/dist/ui/toolbar-types.d.ts +43 -0
  157. package/dist/ui/toolbar-types.d.ts.map +1 -0
  158. package/dist/ui/toolbar-types.js +51 -0
  159. package/dist/ui/toolbar-types.js.map +1 -0
  160. package/package.json +76 -0
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Time bucket selector — premium custom dropdown.
3
+ * Only renders when the X-axis is a date column.
4
+ */
5
+ /** Custom dropdown to select time granularity. */
6
+ export declare function ChartTimeBucketSelector({ className }: {
7
+ className?: string;
8
+ }): import("react/jsx-runtime").JSX.Element | null;
9
+ //# sourceMappingURL=chart-time-bucket-selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-time-bucket-selector.d.ts","sourceRoot":"","sources":["../../src/ui/chart-time-bucket-selector.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,kDAAkD;AAClD,wBAAgB,uBAAuB,CAAC,EAAC,SAAS,EAAC,EAAE;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,kDAkBxE"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * Time bucket selector — premium custom dropdown.
4
+ * Only renders when the X-axis is a date column.
5
+ */
6
+ import { CHART_TYPE_CONFIG } from '../core/chart-capabilities.js';
7
+ import { useChartContext } from './chart-context.js';
8
+ import { ChartSelect } from './chart-select.js';
9
+ /** Labels for each time bucket. */
10
+ const BUCKET_LABELS = {
11
+ day: 'Day',
12
+ week: 'Week',
13
+ month: 'Month',
14
+ quarter: 'Quarter',
15
+ year: 'Year',
16
+ };
17
+ /** Custom dropdown to select time granularity. */
18
+ export function ChartTimeBucketSelector({ className }) {
19
+ const { chartType, isTimeSeries, timeBucket, setTimeBucket, availableTimeBuckets } = useChartContext();
20
+ if (!isTimeSeries || !CHART_TYPE_CONFIG[chartType].supportsTimeBucketing || availableTimeBuckets.length === 0) {
21
+ return null;
22
+ }
23
+ const options = availableTimeBuckets.map((bucket) => ({ value: bucket, label: BUCKET_LABELS[bucket] }));
24
+ return (_jsx(ChartSelect, { value: timeBucket, options: options, onChange: setTimeBucket, ariaLabel: "Time granularity", className: className }));
25
+ }
26
+ //# sourceMappingURL=chart-time-bucket-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-time-bucket-selector.js","sourceRoot":"","sources":["../../src/ui/chart-time-bucket-selector.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AAEH,OAAO,EAAC,iBAAiB,EAAC,MAAM,+BAA+B,CAAA;AAE/D,OAAO,EAAC,eAAe,EAAC,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAA;AAE7C,mCAAmC;AACnC,MAAM,aAAa,GAA+B;IAChD,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;CACb,CAAA;AAED,kDAAkD;AAClD,MAAM,UAAU,uBAAuB,CAAC,EAAC,SAAS,EAAuB;IACvE,MAAM,EAAC,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,oBAAoB,EAAC,GAAG,eAAe,EAAE,CAAA;IAEpG,IAAI,CAAC,YAAY,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,qBAAqB,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9G,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,MAAoB,CAAC,EAAC,CAAC,CAAC,CAAA;IAEnH,OAAO,CACL,KAAC,WAAW,IACV,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAC,kBAAkB,EAC5B,SAAS,EAAE,SAAS,GACpB,CACH,CAAA;AACH,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Overflow menu for toolbar controls — Notion-inspired configuration panel.
3
+ *
4
+ * Renders an ellipsis button that opens a panel with all non-pinned controls.
5
+ * Simple controls (selects, toggle buttons) render inline in rows.
6
+ * Complex controls (metric, filters, date range) show as clickable rows that
7
+ * navigate to a full-page detail view within the panel (Notion-style drill-down).
8
+ */
9
+ import type { ControlId } from './toolbar-types.js';
10
+ /**
11
+ * Props for ChartToolbarOverflow.
12
+ *
13
+ * @property pinned - Controls shown outside the overflow (excluded from menu)
14
+ * @property hidden - Controls completely hidden everywhere
15
+ * @property className - Additional CSS classes
16
+ */
17
+ type ChartToolbarOverflowProps = {
18
+ pinned: ReadonlySet<ControlId>;
19
+ hidden: ReadonlySet<ControlId>;
20
+ className?: string;
21
+ };
22
+ /**
23
+ * Ellipsis overflow menu with Notion-style drill-down navigation.
24
+ * Main view shows all controls. Clicking a complex control replaces
25
+ * the panel content with that control's detail page + back button.
26
+ */
27
+ export declare function ChartToolbarOverflow({ pinned, hidden, className }: ChartToolbarOverflowProps): import("react/jsx-runtime").JSX.Element | null;
28
+ export {};
29
+ //# sourceMappingURL=chart-toolbar-overflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-toolbar-overflow.d.ts","sourceRoot":"","sources":["../../src/ui/chart-toolbar-overflow.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,OAAO,KAAK,EAAC,SAAS,EAAiB,MAAM,oBAAoB,CAAA;AAMjE;;;;;;GAMG;AACH,KAAK,yBAAyB,GAAG;IAC/B,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,CAAA;IAC9B,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,CAAA;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAC,EAAE,yBAAyB,kDAgE1F"}
@@ -0,0 +1,110 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * Overflow menu for toolbar controls — Notion-inspired configuration panel.
4
+ *
5
+ * Renders an ellipsis button that opens a panel with all non-pinned controls.
6
+ * Simple controls (selects, toggle buttons) render inline in rows.
7
+ * Complex controls (metric, filters, date range) show as clickable rows that
8
+ * navigate to a full-page detail view within the panel (Notion-style drill-down).
9
+ */
10
+ import { useRef, useState } from 'react';
11
+ import { ArrowLeft, ChevronRight, Ellipsis, Eraser } from 'lucide-react';
12
+ import { getMetricLabel } from '../core/metric-utils.js';
13
+ import { useChartContext } from './chart-context.js';
14
+ import { ChartDropdownPanel } from './chart-dropdown.js';
15
+ import { ChartDateRangePanel, resolvePresetLabel } from './chart-date-range-panel.js';
16
+ import { ChartFiltersPanel } from './chart-filters-panel.js';
17
+ import { ChartMetricPanel } from './chart-metric-panel.js';
18
+ import { CONTROL_IDS, CONTROL_REGISTRY, SECTIONS } from './toolbar-types.js';
19
+ /** Controls that drill-down into a detail page instead of rendering inline. */
20
+ const COMPLEX_CONTROLS = new Set(['metric', 'filters', 'dateRange']);
21
+ /**
22
+ * Ellipsis overflow menu with Notion-style drill-down navigation.
23
+ * Main view shows all controls. Clicking a complex control replaces
24
+ * the panel content with that control's detail page + back button.
25
+ */
26
+ export function ChartToolbarOverflow({ pinned, hidden, className }) {
27
+ const [isOpen, setIsOpen] = useState(false);
28
+ /** null = main menu, ControlId = detail page for that control */
29
+ const [activePage, setActivePage] = useState(null);
30
+ const triggerRef = useRef(null);
31
+ // Collect overflow controls (not pinned, not hidden) grouped by section
32
+ const sectionGroups = SECTIONS.map((section) => {
33
+ const controls = CONTROL_IDS.filter((id) => {
34
+ if (pinned.has(id) || hidden.has(id))
35
+ return false;
36
+ return CONTROL_REGISTRY[id].section === section.id;
37
+ });
38
+ return { section, controls };
39
+ }).filter((g) => g.controls.length > 0);
40
+ if (sectionGroups.length === 0)
41
+ return null;
42
+ const handleClose = () => {
43
+ setIsOpen(false);
44
+ setActivePage(null);
45
+ };
46
+ const handleToggle = () => {
47
+ if (isOpen) {
48
+ handleClose();
49
+ return;
50
+ }
51
+ setIsOpen(true);
52
+ };
53
+ return (_jsxs("div", { className: className, children: [_jsx("button", { ref: triggerRef, onClick: handleToggle, className: `inline-flex h-7 w-7 items-center justify-center rounded-md border transition-colors ${isOpen
54
+ ? 'border-primary/50 bg-primary/10 text-primary'
55
+ : 'border-border bg-background text-muted-foreground hover:bg-muted hover:text-foreground'}`, "aria-label": "Chart settings", children: _jsx(Ellipsis, { className: "h-4 w-4" }) }), _jsx(ChartDropdownPanel, { isOpen: isOpen, onClose: handleClose, triggerRef: triggerRef, align: "right", width: 320, repositionKey: activePage ?? 'main', className: "flex min-h-[280px] max-h-[min(480px,80vh)] flex-col", children: activePage === null ? (_jsx(MainMenu, { sectionGroups: sectionGroups, onNavigate: setActivePage })) : (_jsx(DetailPage, { controlId: activePage, onBack: () => setActivePage(null) })) })] }));
56
+ }
57
+ // ---------------------------------------------------------------------------
58
+ // Main menu view
59
+ // ---------------------------------------------------------------------------
60
+ /** Main menu showing all controls organized by section. */
61
+ function MainMenu({ sectionGroups, onNavigate, }) {
62
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "border-b border-border px-4 py-3", children: [_jsx("div", { className: "text-xs font-semibold text-foreground", children: "Chart configuration" }), _jsx("div", { className: "mt-0.5 text-[10px] text-muted-foreground", children: "Customize how your data is displayed" })] }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto overscroll-contain p-2", onWheel: (e) => e.stopPropagation(), children: sectionGroups.map(({ section, controls }, groupIdx) => (_jsxs("div", { children: [groupIdx > 0 && _jsx("div", { className: "mx-2 my-1.5 border-t border-border" }), _jsxs("div", { className: "px-2 pb-1 pt-2", children: [_jsx("div", { className: "mb-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: section.label }), _jsx("div", { className: "space-y-1", children: controls.map((id) => COMPLEX_CONTROLS.has(id) ? (_jsx(ComplexControlRow, { controlId: id, onNavigate: () => onNavigate(id) }, id)) : (_jsx(SimpleControlRow, { controlId: id }, id))) })] })] }, section.id))) })] }));
63
+ }
64
+ // ---------------------------------------------------------------------------
65
+ // Detail page view (drill-down)
66
+ // ---------------------------------------------------------------------------
67
+ /** Full-page detail view for a complex control, with back navigation. */
68
+ function DetailPage({ controlId, onBack }) {
69
+ const entry = CONTROL_REGISTRY[controlId];
70
+ const { filters, clearAllFilters } = useChartContext();
71
+ const filterActiveCount = controlId === 'filters' ? [...filters.values()].reduce((sum, set) => sum + set.size, 0) : 0;
72
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex items-center gap-2 border-b border-border px-3 py-2.5", children: [_jsx("button", { onClick: onBack, className: "inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground", "aria-label": "Back", children: _jsx(ArrowLeft, { className: "h-3.5 w-3.5" }) }), controlId === 'filters' ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "min-w-0 flex-1 truncate text-xs font-semibold text-foreground", children: [filterActiveCount > 0 && (_jsxs("span", { className: "text-muted-foreground", children: [filterActiveCount, " filter", filterActiveCount !== 1 ? 's' : '', " active \u00B7", ' '] })), "Filters"] }), filterActiveCount > 0 && (_jsx("button", { onClick: () => clearAllFilters(), className: "shrink-0 rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground", "aria-label": "Clear all filters", children: _jsx(Eraser, { className: "h-3.5 w-3.5" }) }))] })) : (_jsx("div", { className: "text-xs font-semibold text-foreground", children: entry.label }))] }), _jsxs("div", { className: "min-h-0 flex-1 overflow-y-auto overscroll-contain p-3", onWheel: (e) => e.stopPropagation(), children: [controlId === 'metric' && _jsx(ChartMetricPanel, {}), controlId === 'filters' && _jsx(ChartFiltersPanel, { showHeader: false }), controlId === 'dateRange' && _jsx(ChartDateRangePanel, {})] })] }));
73
+ }
74
+ // ---------------------------------------------------------------------------
75
+ // Control rows
76
+ // ---------------------------------------------------------------------------
77
+ /**
78
+ * A simple control row — label on the left, component on the right.
79
+ * Used for selects and toggle buttons that work inline without popovers.
80
+ */
81
+ function SimpleControlRow({ controlId }) {
82
+ const entry = CONTROL_REGISTRY[controlId];
83
+ const Component = entry.component;
84
+ return (_jsxs("div", { className: "flex items-center gap-3 rounded-lg px-1 py-1.5", children: [_jsx("div", { className: "shrink-0 text-xs text-muted-foreground", children: entry.label }), _jsx("div", { className: "ml-auto flex min-w-0 items-center", children: _jsx(Component, {}) })] }));
85
+ }
86
+ /**
87
+ * A clickable row for complex controls — navigates to detail page on click.
88
+ * Shows the control label, current value summary, and a chevron.
89
+ */
90
+ function ComplexControlRow({ controlId, onNavigate, }) {
91
+ const entry = CONTROL_REGISTRY[controlId];
92
+ return (_jsxs("button", { onClick: onNavigate, className: "flex w-full items-center gap-3 rounded-lg px-2 py-2 text-left transition-colors hover:bg-muted/50", children: [_jsx("div", { className: "shrink-0 text-xs text-muted-foreground", children: entry.label }), _jsx("div", { className: "ml-auto truncate text-xs text-foreground", children: _jsx(ControlSummary, { controlId: controlId }) }), _jsx(ChevronRight, { className: "h-3 w-3 shrink-0 text-muted-foreground" })] }));
93
+ }
94
+ /** Summary text for a complex control in the main menu. */
95
+ function ControlSummary({ controlId }) {
96
+ const { metric, columns, filters, dateRangeFilter } = useChartContext();
97
+ switch (controlId) {
98
+ case 'metric':
99
+ return _jsx("span", { children: getMetricLabel(metric, columns) });
100
+ case 'filters': {
101
+ const count = [...filters.values()].reduce((sum, set) => sum + set.size, 0);
102
+ return _jsx("span", { children: count > 0 ? `${count} active` : 'None' });
103
+ }
104
+ case 'dateRange':
105
+ return _jsx("span", { children: resolvePresetLabel(dateRangeFilter) });
106
+ default:
107
+ return null;
108
+ }
109
+ }
110
+ //# sourceMappingURL=chart-toolbar-overflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-toolbar-overflow.js","sourceRoot":"","sources":["../../src/ui/chart-toolbar-overflow.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Composable, configurable toolbar with pinned controls and an ellipsis
3
+ * overflow menu — inspired by Notion's clean database view toolbar.
4
+ *
5
+ * Default behavior: the date range stays pinned so the active time window is
6
+ * always visible, while the remaining controls live inside the overflow menu.
7
+ * Developers can pin additional controls to the toolbar row and hide others.
8
+ *
9
+ * @example
10
+ * ```tsx
11
+ * // Date range pinned by default, everything else in overflow
12
+ * <ChartToolbar />
13
+ *
14
+ * // Pin chart type and group-by to the toolbar row
15
+ * <ChartToolbar pinned={['chartType', 'groupBy']} />
16
+ *
17
+ * // Hide time bucket and x-axis entirely
18
+ * <ChartToolbar hidden={['timeBucket', 'xAxis']} />
19
+ *
20
+ * // Combine both
21
+ * <ChartToolbar pinned={['chartType', 'metric']} hidden={['source']} />
22
+ * ```
23
+ */
24
+ import type { ControlId } from './toolbar-types.js';
25
+ /**
26
+ * Props for ChartToolbar.
27
+ *
28
+ * @property className - Additional CSS classes for the toolbar container
29
+ * @property pinned - Control IDs to always show in the toolbar row (outside the overflow menu)
30
+ * @property hidden - Control IDs to completely hide (not in toolbar, not in overflow)
31
+ */
32
+ type ChartToolbarProps = {
33
+ className?: string;
34
+ pinned?: readonly ControlId[];
35
+ hidden?: readonly ControlId[];
36
+ };
37
+ /**
38
+ * Composable toolbar with pinned controls and an ellipsis overflow menu.
39
+ *
40
+ * Controls are rendered in registry order. Each sub-component still
41
+ * auto-hides when not relevant (e.g. time bucket only shows for date X-axis).
42
+ */
43
+ export declare function ChartToolbar({ className, pinned, hidden, }: ChartToolbarProps): import("react/jsx-runtime").JSX.Element;
44
+ export {};
45
+ //# sourceMappingURL=chart-toolbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-toolbar.d.ts","sourceRoot":"","sources":["../../src/ui/chart-toolbar.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAA;AAKjD;;;;;;GAMG;AACH,KAAK,iBAAiB,GAAG;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,SAAS,SAAS,EAAE,CAAA;IAC7B,MAAM,CAAC,EAAE,SAAS,SAAS,EAAE,CAAA;CAC9B,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,MAAgC,EAChC,MAAW,GACZ,EAAE,iBAAiB,2CAoBnB"}
@@ -0,0 +1,45 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Composable, configurable toolbar with pinned controls and an ellipsis
4
+ * overflow menu — inspired by Notion's clean database view toolbar.
5
+ *
6
+ * Default behavior: the date range stays pinned so the active time window is
7
+ * always visible, while the remaining controls live inside the overflow menu.
8
+ * Developers can pin additional controls to the toolbar row and hide others.
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * // Date range pinned by default, everything else in overflow
13
+ * <ChartToolbar />
14
+ *
15
+ * // Pin chart type and group-by to the toolbar row
16
+ * <ChartToolbar pinned={['chartType', 'groupBy']} />
17
+ *
18
+ * // Hide time bucket and x-axis entirely
19
+ * <ChartToolbar hidden={['timeBucket', 'xAxis']} />
20
+ *
21
+ * // Combine both
22
+ * <ChartToolbar pinned={['chartType', 'metric']} hidden={['source']} />
23
+ * ```
24
+ */
25
+ import { useMemo } from 'react';
26
+ import { ChartToolbarOverflow } from './chart-toolbar-overflow.js';
27
+ import { CONTROL_IDS, CONTROL_REGISTRY } from './toolbar-types.js';
28
+ const DEFAULT_PINNED_CONTROLS = ['dateRange'];
29
+ /**
30
+ * Composable toolbar with pinned controls and an ellipsis overflow menu.
31
+ *
32
+ * Controls are rendered in registry order. Each sub-component still
33
+ * auto-hides when not relevant (e.g. time bucket only shows for date X-axis).
34
+ */
35
+ export function ChartToolbar({ className, pinned = DEFAULT_PINNED_CONTROLS, hidden = [], }) {
36
+ const pinnedSet = useMemo(() => new Set(pinned), [pinned]);
37
+ const hiddenSet = useMemo(() => new Set(hidden), [hidden]);
38
+ // Pinned controls in registry order
39
+ const pinnedControls = CONTROL_IDS.filter((id) => pinnedSet.has(id) && !hiddenSet.has(id));
40
+ return (_jsxs("div", { className: `flex items-start justify-between gap-2 ${className ?? ''}`, children: [_jsx("div", { className: "flex min-w-0 flex-1 flex-wrap items-center gap-2", children: pinnedControls.map((id) => {
41
+ const Component = CONTROL_REGISTRY[id].component;
42
+ return _jsx(Component, {}, id);
43
+ }) }), _jsx(ChartToolbarOverflow, { pinned: pinnedSet, hidden: hiddenSet, className: "shrink-0 self-start" })] }));
44
+ }
45
+ //# sourceMappingURL=chart-toolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-toolbar.js","sourceRoot":"","sources":["../../src/ui/chart-toolbar.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAC,OAAO,EAAC,MAAM,OAAO,CAAA;AAC7B,OAAO,EAAC,oBAAoB,EAAC,MAAM,6BAA6B,CAAA;AAEhE,OAAO,EAAC,WAAW,EAAE,gBAAgB,EAAC,MAAM,oBAAoB,CAAA;AAEhE,MAAM,uBAAuB,GAAG,CAAC,WAAW,CAAyC,CAAA;AAerF;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,SAAS,EACT,MAAM,GAAG,uBAAuB,EAChC,MAAM,GAAG,EAAE,GACO;IAClB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAE1D,oCAAoC;IACpC,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IAE1F,OAAO,CACL,eAAK,SAAS,EAAE,0CAA0C,SAAS,IAAI,EAAE,EAAE,aAEzE,cAAK,SAAS,EAAC,kDAAkD,YAC9D,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;oBACzB,MAAM,SAAS,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC,SAAS,CAAA;oBAChD,OAAO,KAAC,SAAS,MAAM,EAAE,CAAI,CAAA;gBAC/B,CAAC,CAAC,GACE,EAEN,KAAC,oBAAoB,IAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAC,qBAAqB,GAAG,IAC1F,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Chart type selector — inline toggle buttons for bar/line/area/pie/donut.
3
+ */
4
+ /** Inline toggle buttons to select the chart type. */
5
+ export declare function ChartTypeSelector({ className }: {
6
+ className?: string;
7
+ }): import("react/jsx-runtime").JSX.Element | null;
8
+ //# sourceMappingURL=chart-type-selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-type-selector.d.ts","sourceRoot":"","sources":["../../src/ui/chart-type-selector.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAcH,sDAAsD;AACtD,wBAAgB,iBAAiB,CAAC,EAAC,SAAS,EAAC,EAAE;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,kDA+BlE"}
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useChartContext } from './chart-context.js';
3
+ /** Labels for each chart type. */
4
+ const CHART_TYPE_LABELS = {
5
+ bar: 'Bar',
6
+ line: 'Line',
7
+ area: 'Area',
8
+ pie: 'Pie',
9
+ donut: 'Donut',
10
+ };
11
+ /** Inline toggle buttons to select the chart type. */
12
+ export function ChartTypeSelector({ className }) {
13
+ const { chartType, setChartType, availableChartTypes } = useChartContext();
14
+ if (availableChartTypes.length <= 1)
15
+ return null;
16
+ return (_jsx("div", { className: `inline-flex items-center rounded-lg border border-border/50 bg-muted/50 p-0.5 shadow-sm ${className ?? ''}`, role: "tablist", "aria-label": "Chart type", children: availableChartTypes.map((type) => {
17
+ const isActive = type === chartType;
18
+ return (_jsx("button", { role: "tab", "aria-selected": isActive, onClick: () => setChartType(type), className: `rounded-md px-2.5 py-1 text-xs font-medium transition-all ${isActive
19
+ ? 'bg-background text-foreground shadow-sm'
20
+ : 'text-muted-foreground hover:bg-background/50 hover:text-foreground'}`, children: CHART_TYPE_LABELS[type] }, type));
21
+ }) }));
22
+ }
23
+ //# sourceMappingURL=chart-type-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-type-selector.js","sourceRoot":"","sources":["../../src/ui/chart-type-selector.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAC,eAAe,EAAC,MAAM,oBAAoB,CAAA;AAElD,kCAAkC;AAClC,MAAM,iBAAiB,GAA8B;IACnD,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,KAAK,EAAE,OAAO;CACf,CAAA;AAED,sDAAsD;AACtD,MAAM,UAAU,iBAAiB,CAAC,EAAC,SAAS,EAAuB;IACjE,MAAM,EAAC,SAAS,EAAE,YAAY,EAAE,mBAAmB,EAAC,GAAG,eAAe,EAAE,CAAA;IAExE,IAAI,mBAAmB,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAEhD,OAAO,CACL,cACE,SAAS,EAAE,2FAA2F,SAAS,IAAI,EAAE,EAAE,EACvH,IAAI,EAAC,SAAS,gBACH,YAAY,YAEtB,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAChC,MAAM,QAAQ,GAAG,IAAI,KAAK,SAAS,CAAA;YACnC,OAAO,CACL,iBAEE,IAAI,EAAC,KAAK,mBACK,QAAQ,EACvB,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EACjC,SAAS,EAAE,6DACT,QAAQ;oBACN,CAAC,CAAC,yCAAyC;oBAC3C,CAAC,CAAC,oEACN,EAAE,YAED,iBAAiB,CAAC,IAAI,CAAC,IAVnB,IAAI,CAWF,CACV,CAAA;QACH,CAAC,CAAC,GACE,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * X-axis selector — premium custom dropdown for choosing which column drives the X-axis.
3
+ */
4
+ /** Custom dropdown to select the X-axis column. */
5
+ export declare function ChartXAxisSelector({ className }: {
6
+ className?: string;
7
+ }): import("react/jsx-runtime").JSX.Element | null;
8
+ //# sourceMappingURL=chart-x-axis-selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-x-axis-selector.d.ts","sourceRoot":"","sources":["../../src/ui/chart-x-axis-selector.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAKH,mDAAmD;AACnD,wBAAgB,kBAAkB,CAAC,EAAC,SAAS,EAAC,EAAE;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,kDAgBnE"}
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * X-axis selector — premium custom dropdown for choosing which column drives the X-axis.
4
+ */
5
+ import { useChartContext } from './chart-context.js';
6
+ import { ChartSelect } from './chart-select.js';
7
+ /** Custom dropdown to select the X-axis column. */
8
+ export function ChartXAxisSelector({ className }) {
9
+ const { xAxisId, setXAxis, availableXAxes } = useChartContext();
10
+ if (availableXAxes.length <= 1)
11
+ return null;
12
+ const options = availableXAxes.map((col) => ({ value: col.id, label: `X-axis: ${col.label}` }));
13
+ return (_jsx(ChartSelect, { value: xAxisId ?? '', options: options, onChange: (v) => setXAxis(v), ariaLabel: "X-axis", className: className }));
14
+ }
15
+ //# sourceMappingURL=chart-x-axis-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-x-axis-selector.js","sourceRoot":"","sources":["../../src/ui/chart-x-axis-selector.tsx"],"names":[],"mappings":";AAAA;;GAEG;AAEH,OAAO,EAAC,eAAe,EAAC,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAA;AAE7C,mDAAmD;AACnD,MAAM,UAAU,kBAAkB,CAAC,EAAC,SAAS,EAAuB;IAClE,MAAM,EAAC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAC,GAAG,eAAe,EAAE,CAAA;IAE7D,IAAI,cAAc,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAE3C,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAC,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,GAAG,CAAC,KAAK,EAAE,EAAC,CAAC,CAAC,CAAA;IAE7F,OAAO,CACL,KAAC,WAAW,IACV,KAAK,EAAE,OAAO,IAAI,EAAE,EACpB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAC5B,SAAS,EAAC,QAAQ,EAClB,SAAS,EAAE,SAAS,GACpB,CACH,CAAA;AACH,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * UI exports for chart-studio.
3
+ *
4
+ * Composable React components that consume the useChart hook via context.
5
+ * Use `<Chart>` as the root provider, then compose any combination of controls.
6
+ */
7
+ export { Chart, useChartContext, useTypedChartContext } from './chart-context.js';
8
+ export { ChartCanvas } from './chart-canvas.js';
9
+ export { ChartToolbar } from './chart-toolbar.js';
10
+ export { ChartToolbarOverflow } from './chart-toolbar-overflow.js';
11
+ export type { ControlId } from './toolbar-types.js';
12
+ export { ChartSourceSwitcher } from './chart-source-switcher.js';
13
+ export { ChartTypeSelector } from './chart-type-selector.js';
14
+ export { ChartGroupBySelector } from './chart-group-by-selector.js';
15
+ export { ChartTimeBucketSelector } from './chart-time-bucket-selector.js';
16
+ export { ChartMetricSelector } from './chart-metric-selector.js';
17
+ export { ChartMetricPanel } from './chart-metric-panel.js';
18
+ export { ChartXAxisSelector } from './chart-x-axis-selector.js';
19
+ export { ChartDateRange } from './chart-date-range.js';
20
+ export { ChartDateRangeBadge } from './chart-date-range-badge.js';
21
+ export { ChartDateRangePanel } from './chart-date-range-panel.js';
22
+ export { ChartFilters } from './chart-filters.js';
23
+ export { ChartFiltersPanel } from './chart-filters-panel.js';
24
+ export { ChartDebug } from './chart-debug.js';
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAC,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAC,MAAM,oBAAoB,CAAA;AAC/E,OAAO,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAC,oBAAoB,EAAC,MAAM,6BAA6B,CAAA;AAChE,YAAY,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAC,mBAAmB,EAAC,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAC,oBAAoB,EAAC,MAAM,8BAA8B,CAAA;AACjE,OAAO,EAAC,uBAAuB,EAAC,MAAM,iCAAiC,CAAA;AACvE,OAAO,EAAC,mBAAmB,EAAC,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAC,gBAAgB,EAAC,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAC,kBAAkB,EAAC,MAAM,4BAA4B,CAAA;AAC7D,OAAO,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAC,mBAAmB,EAAC,MAAM,6BAA6B,CAAA;AAC/D,OAAO,EAAC,mBAAmB,EAAC,MAAM,6BAA6B,CAAA;AAC/D,OAAO,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * UI exports for chart-studio.
3
+ *
4
+ * Composable React components that consume the useChart hook via context.
5
+ * Use `<Chart>` as the root provider, then compose any combination of controls.
6
+ */
7
+ export { Chart, useChartContext, useTypedChartContext } from './chart-context.js';
8
+ export { ChartCanvas } from './chart-canvas.js';
9
+ export { ChartToolbar } from './chart-toolbar.js';
10
+ export { ChartToolbarOverflow } from './chart-toolbar-overflow.js';
11
+ export { ChartSourceSwitcher } from './chart-source-switcher.js';
12
+ export { ChartTypeSelector } from './chart-type-selector.js';
13
+ export { ChartGroupBySelector } from './chart-group-by-selector.js';
14
+ export { ChartTimeBucketSelector } from './chart-time-bucket-selector.js';
15
+ export { ChartMetricSelector } from './chart-metric-selector.js';
16
+ export { ChartMetricPanel } from './chart-metric-panel.js';
17
+ export { ChartXAxisSelector } from './chart-x-axis-selector.js';
18
+ export { ChartDateRange } from './chart-date-range.js';
19
+ export { ChartDateRangeBadge } from './chart-date-range-badge.js';
20
+ export { ChartDateRangePanel } from './chart-date-range-panel.js';
21
+ export { ChartFilters } from './chart-filters.js';
22
+ export { ChartFiltersPanel } from './chart-filters-panel.js';
23
+ export { ChartDebug } from './chart-debug.js';
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAC,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAC,MAAM,oBAAoB,CAAA;AAC/E,OAAO,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAC,oBAAoB,EAAC,MAAM,6BAA6B,CAAA;AAEhE,OAAO,EAAC,mBAAmB,EAAC,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAC,oBAAoB,EAAC,MAAM,8BAA8B,CAAA;AACjE,OAAO,EAAC,uBAAuB,EAAC,MAAM,iCAAiC,CAAA;AACvE,OAAO,EAAC,mBAAmB,EAAC,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAC,gBAAgB,EAAC,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAC,kBAAkB,EAAC,MAAM,4BAA4B,CAAA;AAC7D,OAAO,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAC,mBAAmB,EAAC,MAAM,6BAA6B,CAAA;AAC/D,OAAO,EAAC,mBAAmB,EAAC,MAAM,6BAA6B,CAAA;AAC/D,OAAO,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1,62 @@
1
+ @source "./";
2
+
3
+ @theme inline {
4
+ --color-background: hsl(var(--cs-background));
5
+ --color-foreground: hsl(var(--cs-foreground));
6
+ --color-card: hsl(var(--cs-card));
7
+ --color-card-foreground: hsl(var(--cs-card-foreground));
8
+ --color-popover: hsl(var(--cs-popover));
9
+ --color-popover-foreground: hsl(var(--cs-popover-foreground));
10
+ --color-primary: hsl(var(--cs-primary));
11
+ --color-primary-foreground: hsl(var(--cs-primary-foreground));
12
+ --color-muted: hsl(var(--cs-muted));
13
+ --color-muted-foreground: hsl(var(--cs-muted-foreground));
14
+ --color-border: hsl(var(--cs-border));
15
+ --color-input: hsl(var(--cs-input));
16
+ --color-ring: hsl(var(--cs-ring));
17
+ }
18
+
19
+ :root {
20
+ color-scheme: light;
21
+ --cs-background: var(--background, 220 16% 97.5%);
22
+ --cs-foreground: var(--foreground, 224 71% 4%);
23
+ --cs-card: var(--card, 0 0% 100%);
24
+ --cs-card-foreground: var(--card-foreground, 224 71% 4%);
25
+ --cs-popover: var(--popover, 0 0% 100%);
26
+ --cs-popover-foreground: var(--popover-foreground, 224 71% 4%);
27
+ --cs-primary: var(--primary, 245 72% 57%);
28
+ --cs-primary-foreground: var(--primary-foreground, 0 0% 100%);
29
+ --cs-muted: var(--muted, 220 14% 93.5%);
30
+ --cs-muted-foreground: var(--muted-foreground, 220 9% 46%);
31
+ --cs-border: var(--border, 220 13% 90%);
32
+ --cs-input: var(--input, 220 13% 90%);
33
+ --cs-ring: var(--ring, 245 72% 57%);
34
+ --cs-chart-1: 245 72% 57%;
35
+ --cs-chart-2: 271 72% 55%;
36
+ --cs-chart-3: 330 68% 54%;
37
+ --cs-chart-4: 170 65% 38%;
38
+ --cs-chart-5: 30 90% 54%;
39
+ }
40
+
41
+ :root[data-theme='dark'],
42
+ .dark {
43
+ color-scheme: dark;
44
+ --cs-background: var(--background, 228 25% 7%);
45
+ --cs-foreground: var(--foreground, 220 15% 93%);
46
+ --cs-card: var(--card, 228 22% 10%);
47
+ --cs-card-foreground: var(--card-foreground, 220 15% 93%);
48
+ --cs-popover: var(--popover, 228 20% 12%);
49
+ --cs-popover-foreground: var(--popover-foreground, 220 15% 93%);
50
+ --cs-primary: var(--primary, 245 80% 67%);
51
+ --cs-primary-foreground: var(--primary-foreground, 0 0% 100%);
52
+ --cs-muted: var(--muted, 228 16% 14%);
53
+ --cs-muted-foreground: var(--muted-foreground, 220 10% 54%);
54
+ --cs-border: var(--border, 228 14% 15%);
55
+ --cs-input: var(--input, 228 14% 18%);
56
+ --cs-ring: var(--ring, 245 80% 67%);
57
+ --cs-chart-1: 245 85% 70%;
58
+ --cs-chart-2: 271 82% 68%;
59
+ --cs-chart-3: 190 85% 55%;
60
+ --cs-chart-4: 155 72% 50%;
61
+ --cs-chart-5: 38 90% 62%;
62
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Toolbar control identifiers and registry.
3
+ *
4
+ * Each control has an ID, a label (for the overflow menu), a section
5
+ * (for grouping in the overflow panel), and the React component to render.
6
+ *
7
+ * @property CONTROL_IDS - All valid control identifier strings
8
+ * @property ControlId - Union type of all valid control identifiers
9
+ * @property ControlEntry - Registry entry for a single toolbar control
10
+ * @property CONTROL_REGISTRY - Ordered mapping of ControlId → ControlEntry
11
+ */
12
+ import type { ComponentType } from 'react';
13
+ /** All valid toolbar control identifiers. */
14
+ export declare const CONTROL_IDS: readonly ["source", "xAxis", "chartType", "groupBy", "timeBucket", "metric", "filters", "dateRange"];
15
+ /** Union type of all valid toolbar control identifiers. */
16
+ export type ControlId = (typeof CONTROL_IDS)[number];
17
+ /** Section label for grouping controls in the overflow panel. */
18
+ export type ControlSection = 'data' | 'visualization' | 'filters';
19
+ /**
20
+ * Registry entry for a single toolbar control.
21
+ *
22
+ * @property label - Human-readable label for the overflow menu
23
+ * @property section - Section grouping in the overflow panel
24
+ * @property component - React component to render
25
+ */
26
+ export type ControlEntry = {
27
+ label: string;
28
+ section: ControlSection;
29
+ component: ComponentType<{
30
+ className?: string;
31
+ }>;
32
+ };
33
+ /**
34
+ * Ordered registry of all toolbar controls.
35
+ * Controls render in this order both pinned and inside the overflow menu.
36
+ */
37
+ export declare const CONTROL_REGISTRY: Record<ControlId, ControlEntry>;
38
+ /** Section metadata for the overflow panel. */
39
+ export declare const SECTIONS: Array<{
40
+ id: ControlSection;
41
+ label: string;
42
+ }>;
43
+ //# sourceMappingURL=toolbar-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbar-types.d.ts","sourceRoot":"","sources":["../../src/ui/toolbar-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,OAAO,CAAA;AAUxC,6CAA6C;AAC7C,eAAO,MAAM,WAAW,sGASd,CAAA;AAEV,2DAA2D;AAC3D,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAEpD,iEAAiE;AACjE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,eAAe,GAAG,SAAS,CAAA;AAEjE;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,cAAc,CAAA;IACvB,SAAS,EAAE,aAAa,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC,CAAA;CAC/C,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,SAAS,EAAE,YAAY,CAS5D,CAAA;AAED,+CAA+C;AAC/C,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAI/D,CAAA"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Toolbar control identifiers and registry.
3
+ *
4
+ * Each control has an ID, a label (for the overflow menu), a section
5
+ * (for grouping in the overflow panel), and the React component to render.
6
+ *
7
+ * @property CONTROL_IDS - All valid control identifier strings
8
+ * @property ControlId - Union type of all valid control identifiers
9
+ * @property ControlEntry - Registry entry for a single toolbar control
10
+ * @property CONTROL_REGISTRY - Ordered mapping of ControlId → ControlEntry
11
+ */
12
+ import { ChartDateRange } from './chart-date-range.js';
13
+ import { ChartFilters } from './chart-filters.js';
14
+ import { ChartGroupBySelector } from './chart-group-by-selector.js';
15
+ import { ChartMetricSelector } from './chart-metric-selector.js';
16
+ import { ChartSourceSwitcher } from './chart-source-switcher.js';
17
+ import { ChartTimeBucketSelector } from './chart-time-bucket-selector.js';
18
+ import { ChartTypeSelector } from './chart-type-selector.js';
19
+ import { ChartXAxisSelector } from './chart-x-axis-selector.js';
20
+ /** All valid toolbar control identifiers. */
21
+ export const CONTROL_IDS = [
22
+ 'source',
23
+ 'xAxis',
24
+ 'chartType',
25
+ 'groupBy',
26
+ 'timeBucket',
27
+ 'metric',
28
+ 'filters',
29
+ 'dateRange',
30
+ ];
31
+ /**
32
+ * Ordered registry of all toolbar controls.
33
+ * Controls render in this order both pinned and inside the overflow menu.
34
+ */
35
+ export const CONTROL_REGISTRY = {
36
+ source: { label: 'Data source', section: 'data', component: ChartSourceSwitcher },
37
+ xAxis: { label: 'X-axis', section: 'data', component: ChartXAxisSelector },
38
+ chartType: { label: 'Chart type', section: 'visualization', component: ChartTypeSelector },
39
+ groupBy: { label: 'Group by', section: 'visualization', component: ChartGroupBySelector },
40
+ timeBucket: { label: 'Time bucket', section: 'visualization', component: ChartTimeBucketSelector },
41
+ metric: { label: 'Metric', section: 'visualization', component: ChartMetricSelector },
42
+ filters: { label: 'Filters', section: 'filters', component: ChartFilters },
43
+ dateRange: { label: 'Date range', section: 'filters', component: ChartDateRange },
44
+ };
45
+ /** Section metadata for the overflow panel. */
46
+ export const SECTIONS = [
47
+ { id: 'data', label: 'Data' },
48
+ { id: 'visualization', label: 'Visualization' },
49
+ { id: 'filters', label: 'Filters' },
50
+ ];
51
+ //# sourceMappingURL=toolbar-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbar-types.js","sourceRoot":"","sources":["../../src/ui/toolbar-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAC,oBAAoB,EAAC,MAAM,8BAA8B,CAAA;AACjE,OAAO,EAAC,mBAAmB,EAAC,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAC,mBAAmB,EAAC,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAC,uBAAuB,EAAC,MAAM,iCAAiC,CAAA;AACvE,OAAO,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAC,kBAAkB,EAAC,MAAM,4BAA4B,CAAA;AAE7D,6CAA6C;AAC7C,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,QAAQ;IACR,OAAO;IACP,WAAW;IACX,SAAS;IACT,YAAY;IACZ,QAAQ;IACR,SAAS;IACT,WAAW;CACH,CAAA;AAqBV;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAoC;IAC/D,MAAM,EAAE,EAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,mBAAmB,EAAC;IAC/E,KAAK,EAAE,EAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAC;IACxE,SAAS,EAAE,EAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,iBAAiB,EAAC;IACxF,OAAO,EAAE,EAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,oBAAoB,EAAC;IACvF,UAAU,EAAE,EAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,uBAAuB,EAAC;IAChG,MAAM,EAAE,EAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,mBAAmB,EAAC;IACnF,OAAO,EAAE,EAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAC;IACxE,SAAS,EAAE,EAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAC;CAChF,CAAA;AAED,+CAA+C;AAC/C,MAAM,CAAC,MAAM,QAAQ,GAA+C;IAClE,EAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAC;IAC3B,EAAC,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAC;IAC7C,EAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAC;CAClC,CAAA"}