@inkindcards/semantic-layer 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.
@@ -0,0 +1,198 @@
1
+ 'use strict';
2
+
3
+ var chunkY3A3T45C_cjs = require('./chunk-Y3A3T45C.cjs');
4
+ var react = require('react');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ var containerStyle = {
8
+ fontFamily: "system-ui, -apple-system, sans-serif",
9
+ border: "1px solid #e5e7eb",
10
+ borderRadius: "8px",
11
+ overflow: "hidden",
12
+ maxHeight: "400px",
13
+ display: "flex",
14
+ flexDirection: "column"
15
+ };
16
+ var searchStyle = {
17
+ padding: "8px 12px",
18
+ border: "none",
19
+ borderBottom: "1px solid #e5e7eb",
20
+ fontSize: "14px",
21
+ outline: "none",
22
+ width: "100%",
23
+ boxSizing: "border-box"
24
+ };
25
+ var listStyle = {
26
+ overflowY: "auto",
27
+ flex: 1
28
+ };
29
+ var categoryHeaderStyle = {
30
+ padding: "8px 12px",
31
+ fontSize: "11px",
32
+ fontWeight: 600,
33
+ textTransform: "uppercase",
34
+ letterSpacing: "0.05em",
35
+ color: "#6b7280",
36
+ backgroundColor: "#f9fafb",
37
+ position: "sticky",
38
+ top: 0
39
+ };
40
+ var itemStyle = {
41
+ padding: "8px 12px",
42
+ cursor: "pointer",
43
+ display: "flex",
44
+ flexDirection: "column",
45
+ gap: "2px",
46
+ borderBottom: "1px solid #f3f4f6"
47
+ };
48
+ var selectedItemStyle = {
49
+ ...itemStyle,
50
+ backgroundColor: "#eff6ff"
51
+ };
52
+ function MetricPicker({
53
+ onSelect,
54
+ fieldTypes,
55
+ selectedIds = [],
56
+ searchPlaceholder = "Search metrics and dimensions...",
57
+ className
58
+ }) {
59
+ const { fields, categories, isLoading, error } = chunkY3A3T45C_cjs.useMetrics();
60
+ const [search, setSearch] = react.useState("");
61
+ const filtered = react.useMemo(() => {
62
+ let result = fields;
63
+ if (fieldTypes) {
64
+ result = result.filter((f) => fieldTypes.includes(f.type));
65
+ }
66
+ if (search) {
67
+ const q = search.toLowerCase();
68
+ result = result.filter(
69
+ (f) => f.displayName.toLowerCase().includes(q) || f.description.toLowerCase().includes(q) || f.name.toLowerCase().includes(q)
70
+ );
71
+ }
72
+ return result;
73
+ }, [fields, fieldTypes, search]);
74
+ const grouped = react.useMemo(() => {
75
+ const map = /* @__PURE__ */ new Map();
76
+ for (const field of filtered) {
77
+ const list = map.get(field.category) || [];
78
+ list.push(field);
79
+ map.set(field.category, list);
80
+ }
81
+ return map;
82
+ }, [filtered]);
83
+ const selectedSet = react.useMemo(() => new Set(selectedIds), [selectedIds]);
84
+ if (isLoading) {
85
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "12px", color: "#6b7280" }, children: "Loading catalog..." });
86
+ }
87
+ if (error) {
88
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "12px", color: "#ef4444" }, children: error });
89
+ }
90
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: containerStyle, className, children: [
91
+ /* @__PURE__ */ jsxRuntime.jsx(
92
+ "input",
93
+ {
94
+ type: "text",
95
+ value: search,
96
+ onChange: (e) => setSearch(e.target.value),
97
+ placeholder: searchPlaceholder,
98
+ style: searchStyle
99
+ }
100
+ ),
101
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: listStyle, children: [
102
+ Array.from(grouped.entries()).map(([category, categoryFields]) => /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
103
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: categoryHeaderStyle, children: category }),
104
+ categoryFields.map((field) => /* @__PURE__ */ jsxRuntime.jsxs(
105
+ "div",
106
+ {
107
+ style: selectedSet.has(field.id) ? selectedItemStyle : itemStyle,
108
+ onClick: () => onSelect(field),
109
+ children: [
110
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "14px", fontWeight: 500, color: "#111827" }, children: field.displayName }),
111
+ field.description && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "12px", color: "#6b7280" }, children: field.description })
112
+ ]
113
+ },
114
+ field.id
115
+ ))
116
+ ] }, category)),
117
+ grouped.size === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "12px", color: "#6b7280", textAlign: "center" }, children: "No fields found" })
118
+ ] })
119
+ ] });
120
+ }
121
+ var tableContainerStyle = {
122
+ fontFamily: "system-ui, -apple-system, sans-serif",
123
+ border: "1px solid #e5e7eb",
124
+ borderRadius: "8px",
125
+ overflow: "auto",
126
+ maxHeight: "500px"
127
+ };
128
+ var tableStyle = {
129
+ width: "100%",
130
+ borderCollapse: "collapse",
131
+ fontSize: "14px"
132
+ };
133
+ var thStyle = {
134
+ padding: "10px 12px",
135
+ textAlign: "left",
136
+ fontWeight: 600,
137
+ fontSize: "12px",
138
+ color: "#6b7280",
139
+ backgroundColor: "#f9fafb",
140
+ borderBottom: "1px solid #e5e7eb",
141
+ position: "sticky",
142
+ top: 0,
143
+ whiteSpace: "nowrap"
144
+ };
145
+ var tdStyle = {
146
+ padding: "8px 12px",
147
+ borderBottom: "1px solid #f3f4f6",
148
+ color: "#111827",
149
+ whiteSpace: "nowrap"
150
+ };
151
+ var numberTdStyle = {
152
+ ...tdStyle,
153
+ textAlign: "right",
154
+ fontVariantNumeric: "tabular-nums"
155
+ };
156
+ function formatValue(value, dataType, formatNumbers) {
157
+ if (value === null || value === void 0) return "\u2014";
158
+ if (dataType === "number" && typeof value === "number" && formatNumbers) {
159
+ return value.toLocaleString(void 0, { maximumFractionDigits: 2 });
160
+ }
161
+ return String(value);
162
+ }
163
+ function ResultsTable({
164
+ data,
165
+ className,
166
+ maxRows = 100,
167
+ formatNumbers = true
168
+ }) {
169
+ if (!data || data.columns.length === 0) {
170
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "12px", color: "#6b7280", textAlign: "center" }, children: "No data to display" });
171
+ }
172
+ const displayRows = data.rows.slice(0, maxRows);
173
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: tableContainerStyle, className, children: [
174
+ /* @__PURE__ */ jsxRuntime.jsxs("table", { style: tableStyle, children: [
175
+ /* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsx("tr", { children: data.columns.map((col) => /* @__PURE__ */ jsxRuntime.jsx("th", { style: thStyle, children: col.label }, col.key)) }) }),
176
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: displayRows.map((row, i) => /* @__PURE__ */ jsxRuntime.jsx("tr", { children: data.columns.map((col) => /* @__PURE__ */ jsxRuntime.jsx(
177
+ "td",
178
+ {
179
+ style: col.dataType === "number" ? numberTdStyle : tdStyle,
180
+ children: formatValue(row[col.key], col.dataType, formatNumbers)
181
+ },
182
+ col.key
183
+ )) }, i)) })
184
+ ] }),
185
+ data.totalRows > maxRows && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { padding: "8px 12px", fontSize: "12px", color: "#6b7280", textAlign: "center" }, children: [
186
+ "Showing ",
187
+ maxRows,
188
+ " of ",
189
+ data.totalRows,
190
+ " rows"
191
+ ] })
192
+ ] });
193
+ }
194
+
195
+ exports.MetricPicker = MetricPicker;
196
+ exports.ResultsTable = ResultsTable;
197
+ //# sourceMappingURL=components.cjs.map
198
+ //# sourceMappingURL=components.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/metric-picker.tsx","../src/components/results-table.tsx"],"names":["useMetrics","useState","useMemo","jsx","jsxs"],"mappings":"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","file":"components.cjs","sourcesContent":["import React, { useState, useMemo } from \"react\";\nimport type { SemanticField, FieldType } from \"../types\";\nimport { useMetrics } from \"../react/hooks\";\n\nexport interface MetricPickerProps {\n onSelect: (field: SemanticField) => void;\n /** Filter to only show certain field types. Default: all. */\n fieldTypes?: FieldType[];\n /** Currently selected field IDs (for visual highlighting). */\n selectedIds?: string[];\n /** Placeholder text for the search input. */\n searchPlaceholder?: string;\n /** Custom class name for the root container. */\n className?: string;\n}\n\nconst containerStyle: React.CSSProperties = {\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n border: \"1px solid #e5e7eb\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n maxHeight: \"400px\",\n display: \"flex\",\n flexDirection: \"column\",\n};\n\nconst searchStyle: React.CSSProperties = {\n padding: \"8px 12px\",\n border: \"none\",\n borderBottom: \"1px solid #e5e7eb\",\n fontSize: \"14px\",\n outline: \"none\",\n width: \"100%\",\n boxSizing: \"border-box\",\n};\n\nconst listStyle: React.CSSProperties = {\n overflowY: \"auto\",\n flex: 1,\n};\n\nconst categoryHeaderStyle: React.CSSProperties = {\n padding: \"8px 12px\",\n fontSize: \"11px\",\n fontWeight: 600,\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n color: \"#6b7280\",\n backgroundColor: \"#f9fafb\",\n position: \"sticky\",\n top: 0,\n};\n\nconst itemStyle: React.CSSProperties = {\n padding: \"8px 12px\",\n cursor: \"pointer\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"2px\",\n borderBottom: \"1px solid #f3f4f6\",\n};\n\nconst selectedItemStyle: React.CSSProperties = {\n ...itemStyle,\n backgroundColor: \"#eff6ff\",\n};\n\n/**\n * A searchable, categorized picker for metrics and dimensions.\n * Fetches the catalog from the gateway automatically.\n */\nexport function MetricPicker({\n onSelect,\n fieldTypes,\n selectedIds = [],\n searchPlaceholder = \"Search metrics and dimensions...\",\n className,\n}: MetricPickerProps) {\n const { fields, categories, isLoading, error } = useMetrics();\n const [search, setSearch] = useState(\"\");\n\n const filtered = useMemo(() => {\n let result = fields;\n if (fieldTypes) {\n result = result.filter((f) => fieldTypes.includes(f.type));\n }\n if (search) {\n const q = search.toLowerCase();\n result = result.filter(\n (f) =>\n f.displayName.toLowerCase().includes(q) ||\n f.description.toLowerCase().includes(q) ||\n f.name.toLowerCase().includes(q),\n );\n }\n return result;\n }, [fields, fieldTypes, search]);\n\n const grouped = useMemo(() => {\n const map = new Map<string, SemanticField[]>();\n for (const field of filtered) {\n const list = map.get(field.category) || [];\n list.push(field);\n map.set(field.category, list);\n }\n return map;\n }, [filtered]);\n\n const selectedSet = useMemo(() => new Set(selectedIds), [selectedIds]);\n\n if (isLoading) {\n return <div style={{ padding: \"12px\", color: \"#6b7280\" }}>Loading catalog...</div>;\n }\n\n if (error) {\n return <div style={{ padding: \"12px\", color: \"#ef4444\" }}>{error}</div>;\n }\n\n return (\n <div style={containerStyle} className={className}>\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={searchPlaceholder}\n style={searchStyle}\n />\n <div style={listStyle}>\n {Array.from(grouped.entries()).map(([category, categoryFields]) => (\n <div key={category}>\n <div style={categoryHeaderStyle}>{category}</div>\n {categoryFields.map((field) => (\n <div\n key={field.id}\n style={selectedSet.has(field.id) ? selectedItemStyle : itemStyle}\n onClick={() => onSelect(field)}\n >\n <span style={{ fontSize: \"14px\", fontWeight: 500, color: \"#111827\" }}>\n {field.displayName}\n </span>\n {field.description && (\n <span style={{ fontSize: \"12px\", color: \"#6b7280\" }}>\n {field.description}\n </span>\n )}\n </div>\n ))}\n </div>\n ))}\n {grouped.size === 0 && (\n <div style={{ padding: \"12px\", color: \"#6b7280\", textAlign: \"center\" }}>\n No fields found\n </div>\n )}\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport type { QueryResult } from \"../types\";\n\nexport interface ResultsTableProps {\n data: QueryResult | null;\n /** Custom class name for the root container. */\n className?: string;\n /** Max rows to display. Default: 100. */\n maxRows?: number;\n /** Format numbers with locale string. Default: true. */\n formatNumbers?: boolean;\n}\n\nconst tableContainerStyle: React.CSSProperties = {\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n border: \"1px solid #e5e7eb\",\n borderRadius: \"8px\",\n overflow: \"auto\",\n maxHeight: \"500px\",\n};\n\nconst tableStyle: React.CSSProperties = {\n width: \"100%\",\n borderCollapse: \"collapse\",\n fontSize: \"14px\",\n};\n\nconst thStyle: React.CSSProperties = {\n padding: \"10px 12px\",\n textAlign: \"left\",\n fontWeight: 600,\n fontSize: \"12px\",\n color: \"#6b7280\",\n backgroundColor: \"#f9fafb\",\n borderBottom: \"1px solid #e5e7eb\",\n position: \"sticky\",\n top: 0,\n whiteSpace: \"nowrap\",\n};\n\nconst tdStyle: React.CSSProperties = {\n padding: \"8px 12px\",\n borderBottom: \"1px solid #f3f4f6\",\n color: \"#111827\",\n whiteSpace: \"nowrap\",\n};\n\nconst numberTdStyle: React.CSSProperties = {\n ...tdStyle,\n textAlign: \"right\",\n fontVariantNumeric: \"tabular-nums\",\n};\n\nfunction formatValue(value: unknown, dataType: string, formatNumbers: boolean): string {\n if (value === null || value === undefined) return \"—\";\n if (dataType === \"number\" && typeof value === \"number\" && formatNumbers) {\n return value.toLocaleString(undefined, { maximumFractionDigits: 2 });\n }\n return String(value);\n}\n\n/**\n * A simple data table that renders a QueryResult.\n * Handles formatting numbers, truncating rows, and sticky headers.\n */\nexport function ResultsTable({\n data,\n className,\n maxRows = 100,\n formatNumbers = true,\n}: ResultsTableProps) {\n if (!data || data.columns.length === 0) {\n return (\n <div style={{ padding: \"12px\", color: \"#6b7280\", textAlign: \"center\" }}>\n No data to display\n </div>\n );\n }\n\n const displayRows = data.rows.slice(0, maxRows);\n\n return (\n <div style={tableContainerStyle} className={className}>\n <table style={tableStyle}>\n <thead>\n <tr>\n {data.columns.map((col) => (\n <th key={col.key} style={thStyle}>\n {col.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {displayRows.map((row, i) => (\n <tr key={i}>\n {data.columns.map((col) => (\n <td\n key={col.key}\n style={col.dataType === \"number\" ? numberTdStyle : tdStyle}\n >\n {formatValue(row[col.key], col.dataType, formatNumbers)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n {data.totalRows > maxRows && (\n <div style={{ padding: \"8px 12px\", fontSize: \"12px\", color: \"#6b7280\", textAlign: \"center\" }}>\n Showing {maxRows} of {data.totalRows} rows\n </div>\n )}\n </div>\n );\n}\n"]}
@@ -0,0 +1,36 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { S as SemanticField, F as FieldType, Q as QueryResult } from './types-Ds_6aDEw.cjs';
3
+
4
+ interface MetricPickerProps {
5
+ onSelect: (field: SemanticField) => void;
6
+ /** Filter to only show certain field types. Default: all. */
7
+ fieldTypes?: FieldType[];
8
+ /** Currently selected field IDs (for visual highlighting). */
9
+ selectedIds?: string[];
10
+ /** Placeholder text for the search input. */
11
+ searchPlaceholder?: string;
12
+ /** Custom class name for the root container. */
13
+ className?: string;
14
+ }
15
+ /**
16
+ * A searchable, categorized picker for metrics and dimensions.
17
+ * Fetches the catalog from the gateway automatically.
18
+ */
19
+ declare function MetricPicker({ onSelect, fieldTypes, selectedIds, searchPlaceholder, className, }: MetricPickerProps): react_jsx_runtime.JSX.Element;
20
+
21
+ interface ResultsTableProps {
22
+ data: QueryResult | null;
23
+ /** Custom class name for the root container. */
24
+ className?: string;
25
+ /** Max rows to display. Default: 100. */
26
+ maxRows?: number;
27
+ /** Format numbers with locale string. Default: true. */
28
+ formatNumbers?: boolean;
29
+ }
30
+ /**
31
+ * A simple data table that renders a QueryResult.
32
+ * Handles formatting numbers, truncating rows, and sticky headers.
33
+ */
34
+ declare function ResultsTable({ data, className, maxRows, formatNumbers, }: ResultsTableProps): react_jsx_runtime.JSX.Element;
35
+
36
+ export { MetricPicker, type MetricPickerProps, ResultsTable, type ResultsTableProps };
@@ -0,0 +1,36 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { S as SemanticField, F as FieldType, Q as QueryResult } from './types-Ds_6aDEw.js';
3
+
4
+ interface MetricPickerProps {
5
+ onSelect: (field: SemanticField) => void;
6
+ /** Filter to only show certain field types. Default: all. */
7
+ fieldTypes?: FieldType[];
8
+ /** Currently selected field IDs (for visual highlighting). */
9
+ selectedIds?: string[];
10
+ /** Placeholder text for the search input. */
11
+ searchPlaceholder?: string;
12
+ /** Custom class name for the root container. */
13
+ className?: string;
14
+ }
15
+ /**
16
+ * A searchable, categorized picker for metrics and dimensions.
17
+ * Fetches the catalog from the gateway automatically.
18
+ */
19
+ declare function MetricPicker({ onSelect, fieldTypes, selectedIds, searchPlaceholder, className, }: MetricPickerProps): react_jsx_runtime.JSX.Element;
20
+
21
+ interface ResultsTableProps {
22
+ data: QueryResult | null;
23
+ /** Custom class name for the root container. */
24
+ className?: string;
25
+ /** Max rows to display. Default: 100. */
26
+ maxRows?: number;
27
+ /** Format numbers with locale string. Default: true. */
28
+ formatNumbers?: boolean;
29
+ }
30
+ /**
31
+ * A simple data table that renders a QueryResult.
32
+ * Handles formatting numbers, truncating rows, and sticky headers.
33
+ */
34
+ declare function ResultsTable({ data, className, maxRows, formatNumbers, }: ResultsTableProps): react_jsx_runtime.JSX.Element;
35
+
36
+ export { MetricPicker, type MetricPickerProps, ResultsTable, type ResultsTableProps };
@@ -0,0 +1,195 @@
1
+ import { useMetrics } from './chunk-NJ4IJBV3.js';
2
+ import { useState, useMemo } from 'react';
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+
5
+ var containerStyle = {
6
+ fontFamily: "system-ui, -apple-system, sans-serif",
7
+ border: "1px solid #e5e7eb",
8
+ borderRadius: "8px",
9
+ overflow: "hidden",
10
+ maxHeight: "400px",
11
+ display: "flex",
12
+ flexDirection: "column"
13
+ };
14
+ var searchStyle = {
15
+ padding: "8px 12px",
16
+ border: "none",
17
+ borderBottom: "1px solid #e5e7eb",
18
+ fontSize: "14px",
19
+ outline: "none",
20
+ width: "100%",
21
+ boxSizing: "border-box"
22
+ };
23
+ var listStyle = {
24
+ overflowY: "auto",
25
+ flex: 1
26
+ };
27
+ var categoryHeaderStyle = {
28
+ padding: "8px 12px",
29
+ fontSize: "11px",
30
+ fontWeight: 600,
31
+ textTransform: "uppercase",
32
+ letterSpacing: "0.05em",
33
+ color: "#6b7280",
34
+ backgroundColor: "#f9fafb",
35
+ position: "sticky",
36
+ top: 0
37
+ };
38
+ var itemStyle = {
39
+ padding: "8px 12px",
40
+ cursor: "pointer",
41
+ display: "flex",
42
+ flexDirection: "column",
43
+ gap: "2px",
44
+ borderBottom: "1px solid #f3f4f6"
45
+ };
46
+ var selectedItemStyle = {
47
+ ...itemStyle,
48
+ backgroundColor: "#eff6ff"
49
+ };
50
+ function MetricPicker({
51
+ onSelect,
52
+ fieldTypes,
53
+ selectedIds = [],
54
+ searchPlaceholder = "Search metrics and dimensions...",
55
+ className
56
+ }) {
57
+ const { fields, categories, isLoading, error } = useMetrics();
58
+ const [search, setSearch] = useState("");
59
+ const filtered = useMemo(() => {
60
+ let result = fields;
61
+ if (fieldTypes) {
62
+ result = result.filter((f) => fieldTypes.includes(f.type));
63
+ }
64
+ if (search) {
65
+ const q = search.toLowerCase();
66
+ result = result.filter(
67
+ (f) => f.displayName.toLowerCase().includes(q) || f.description.toLowerCase().includes(q) || f.name.toLowerCase().includes(q)
68
+ );
69
+ }
70
+ return result;
71
+ }, [fields, fieldTypes, search]);
72
+ const grouped = useMemo(() => {
73
+ const map = /* @__PURE__ */ new Map();
74
+ for (const field of filtered) {
75
+ const list = map.get(field.category) || [];
76
+ list.push(field);
77
+ map.set(field.category, list);
78
+ }
79
+ return map;
80
+ }, [filtered]);
81
+ const selectedSet = useMemo(() => new Set(selectedIds), [selectedIds]);
82
+ if (isLoading) {
83
+ return /* @__PURE__ */ jsx("div", { style: { padding: "12px", color: "#6b7280" }, children: "Loading catalog..." });
84
+ }
85
+ if (error) {
86
+ return /* @__PURE__ */ jsx("div", { style: { padding: "12px", color: "#ef4444" }, children: error });
87
+ }
88
+ return /* @__PURE__ */ jsxs("div", { style: containerStyle, className, children: [
89
+ /* @__PURE__ */ jsx(
90
+ "input",
91
+ {
92
+ type: "text",
93
+ value: search,
94
+ onChange: (e) => setSearch(e.target.value),
95
+ placeholder: searchPlaceholder,
96
+ style: searchStyle
97
+ }
98
+ ),
99
+ /* @__PURE__ */ jsxs("div", { style: listStyle, children: [
100
+ Array.from(grouped.entries()).map(([category, categoryFields]) => /* @__PURE__ */ jsxs("div", { children: [
101
+ /* @__PURE__ */ jsx("div", { style: categoryHeaderStyle, children: category }),
102
+ categoryFields.map((field) => /* @__PURE__ */ jsxs(
103
+ "div",
104
+ {
105
+ style: selectedSet.has(field.id) ? selectedItemStyle : itemStyle,
106
+ onClick: () => onSelect(field),
107
+ children: [
108
+ /* @__PURE__ */ jsx("span", { style: { fontSize: "14px", fontWeight: 500, color: "#111827" }, children: field.displayName }),
109
+ field.description && /* @__PURE__ */ jsx("span", { style: { fontSize: "12px", color: "#6b7280" }, children: field.description })
110
+ ]
111
+ },
112
+ field.id
113
+ ))
114
+ ] }, category)),
115
+ grouped.size === 0 && /* @__PURE__ */ jsx("div", { style: { padding: "12px", color: "#6b7280", textAlign: "center" }, children: "No fields found" })
116
+ ] })
117
+ ] });
118
+ }
119
+ var tableContainerStyle = {
120
+ fontFamily: "system-ui, -apple-system, sans-serif",
121
+ border: "1px solid #e5e7eb",
122
+ borderRadius: "8px",
123
+ overflow: "auto",
124
+ maxHeight: "500px"
125
+ };
126
+ var tableStyle = {
127
+ width: "100%",
128
+ borderCollapse: "collapse",
129
+ fontSize: "14px"
130
+ };
131
+ var thStyle = {
132
+ padding: "10px 12px",
133
+ textAlign: "left",
134
+ fontWeight: 600,
135
+ fontSize: "12px",
136
+ color: "#6b7280",
137
+ backgroundColor: "#f9fafb",
138
+ borderBottom: "1px solid #e5e7eb",
139
+ position: "sticky",
140
+ top: 0,
141
+ whiteSpace: "nowrap"
142
+ };
143
+ var tdStyle = {
144
+ padding: "8px 12px",
145
+ borderBottom: "1px solid #f3f4f6",
146
+ color: "#111827",
147
+ whiteSpace: "nowrap"
148
+ };
149
+ var numberTdStyle = {
150
+ ...tdStyle,
151
+ textAlign: "right",
152
+ fontVariantNumeric: "tabular-nums"
153
+ };
154
+ function formatValue(value, dataType, formatNumbers) {
155
+ if (value === null || value === void 0) return "\u2014";
156
+ if (dataType === "number" && typeof value === "number" && formatNumbers) {
157
+ return value.toLocaleString(void 0, { maximumFractionDigits: 2 });
158
+ }
159
+ return String(value);
160
+ }
161
+ function ResultsTable({
162
+ data,
163
+ className,
164
+ maxRows = 100,
165
+ formatNumbers = true
166
+ }) {
167
+ if (!data || data.columns.length === 0) {
168
+ return /* @__PURE__ */ jsx("div", { style: { padding: "12px", color: "#6b7280", textAlign: "center" }, children: "No data to display" });
169
+ }
170
+ const displayRows = data.rows.slice(0, maxRows);
171
+ return /* @__PURE__ */ jsxs("div", { style: tableContainerStyle, className, children: [
172
+ /* @__PURE__ */ jsxs("table", { style: tableStyle, children: [
173
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { children: data.columns.map((col) => /* @__PURE__ */ jsx("th", { style: thStyle, children: col.label }, col.key)) }) }),
174
+ /* @__PURE__ */ jsx("tbody", { children: displayRows.map((row, i) => /* @__PURE__ */ jsx("tr", { children: data.columns.map((col) => /* @__PURE__ */ jsx(
175
+ "td",
176
+ {
177
+ style: col.dataType === "number" ? numberTdStyle : tdStyle,
178
+ children: formatValue(row[col.key], col.dataType, formatNumbers)
179
+ },
180
+ col.key
181
+ )) }, i)) })
182
+ ] }),
183
+ data.totalRows > maxRows && /* @__PURE__ */ jsxs("div", { style: { padding: "8px 12px", fontSize: "12px", color: "#6b7280", textAlign: "center" }, children: [
184
+ "Showing ",
185
+ maxRows,
186
+ " of ",
187
+ data.totalRows,
188
+ " rows"
189
+ ] })
190
+ ] });
191
+ }
192
+
193
+ export { MetricPicker, ResultsTable };
194
+ //# sourceMappingURL=components.js.map
195
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/metric-picker.tsx","../src/components/results-table.tsx"],"names":["jsx","jsxs"],"mappings":";;;;AAgBA,IAAM,cAAA,GAAsC;AAAA,EAC1C,UAAA,EAAY,sCAAA;AAAA,EACZ,MAAA,EAAQ,mBAAA;AAAA,EACR,YAAA,EAAc,KAAA;AAAA,EACd,QAAA,EAAU,QAAA;AAAA,EACV,SAAA,EAAW,OAAA;AAAA,EACX,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe;AACjB,CAAA;AAEA,IAAM,WAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,UAAA;AAAA,EACT,MAAA,EAAQ,MAAA;AAAA,EACR,YAAA,EAAc,mBAAA;AAAA,EACd,QAAA,EAAU,MAAA;AAAA,EACV,OAAA,EAAS,MAAA;AAAA,EACT,KAAA,EAAO,MAAA;AAAA,EACP,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,SAAA,GAAiC;AAAA,EACrC,SAAA,EAAW,MAAA;AAAA,EACX,IAAA,EAAM;AACR,CAAA;AAEA,IAAM,mBAAA,GAA2C;AAAA,EAC/C,OAAA,EAAS,UAAA;AAAA,EACT,QAAA,EAAU,MAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,aAAA,EAAe,WAAA;AAAA,EACf,aAAA,EAAe,QAAA;AAAA,EACf,KAAA,EAAO,SAAA;AAAA,EACP,eAAA,EAAiB,SAAA;AAAA,EACjB,QAAA,EAAU,QAAA;AAAA,EACV,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,SAAA,GAAiC;AAAA,EACrC,OAAA,EAAS,UAAA;AAAA,EACT,MAAA,EAAQ,SAAA;AAAA,EACR,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK,KAAA;AAAA,EACL,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,iBAAA,GAAyC;AAAA,EAC7C,GAAG,SAAA;AAAA,EACH,eAAA,EAAiB;AACnB,CAAA;AAMO,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAc,EAAC;AAAA,EACf,iBAAA,GAAoB,kCAAA;AAAA,EACpB;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAY,SAAA,EAAW,KAAA,KAAU,UAAA,EAAW;AAC5D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,EAAE,CAAA;AAEvC,EAAA,MAAM,QAAA,GAAW,QAAQ,MAAM;AAC7B,IAAA,IAAI,MAAA,GAAS,MAAA;AACb,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAA,GAAS,MAAA,CAAO,OAAO,CAAC,CAAA,KAAM,WAAW,QAAA,CAAS,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,IAC3D;AACA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,CAAA,GAAI,OAAO,WAAA,EAAY;AAC7B,MAAA,MAAA,GAAS,MAAA,CAAO,MAAA;AAAA,QACd,CAAC,MACC,CAAA,CAAE,WAAA,CAAY,aAAY,CAAE,QAAA,CAAS,CAAC,CAAA,IACtC,CAAA,CAAE,YAAY,WAAA,EAAY,CAAE,SAAS,CAAC,CAAA,IACtC,EAAE,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC;AAAA,OACnC;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAA,EAAQ,UAAA,EAAY,MAAM,CAAC,CAAA;AAE/B,EAAA,MAAM,OAAA,GAAU,QAAQ,MAAM;AAC5B,IAAA,MAAM,GAAA,uBAAU,GAAA,EAA6B;AAC7C,IAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,MAAA,MAAM,OAAO,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,QAAQ,KAAK,EAAC;AACzC,MAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AACf,MAAA,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,QAAA,EAAU,IAAI,CAAA;AAAA,IAC9B;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,WAAA,GAAc,QAAQ,MAAM,IAAI,IAAI,WAAW,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAErE,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBAAO,GAAA,CAAC,SAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU,EAAG,QAAA,EAAA,oBAAA,EAAkB,CAAA;AAAA,EAC9E;AAEA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBAAO,GAAA,CAAC,SAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,EACnE;AAEA,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EAAgB,SAAA,EAC1B,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,MAAA;AAAA,QACP,UAAU,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACzC,WAAA,EAAa,iBAAA;AAAA,QACb,KAAA,EAAO;AAAA;AAAA,KACT;AAAA,oBACA,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,SAAA,EACT,QAAA,EAAA;AAAA,MAAA,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,QAAA,EAAU,cAAc,CAAA,qBAC3D,IAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,mBAAA,EAAsB,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,QAC1C,cAAA,CAAe,GAAA,CAAI,CAAC,KAAA,qBACnB,IAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,OAAO,WAAA,CAAY,GAAA,CAAI,KAAA,CAAM,EAAE,IAAI,iBAAA,GAAoB,SAAA;AAAA,YACvD,OAAA,EAAS,MAAM,QAAA,CAAS,KAAK,CAAA;AAAA,YAE7B,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,SAAA,EAAU,EAChE,QAAA,EAAA,KAAA,CAAM,WAAA,EACT,CAAA;AAAA,cACC,KAAA,CAAM,WAAA,oBACL,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU,EAC/C,QAAA,EAAA,KAAA,CAAM,WAAA,EACT;AAAA;AAAA,WAAA;AAAA,UAVG,KAAA,CAAM;AAAA,SAad;AAAA,OAAA,EAAA,EAjBO,QAkBV,CACD,CAAA;AAAA,MACA,OAAA,CAAQ,IAAA,KAAS,CAAA,oBAChB,GAAA,CAAC,SAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,SAAA,EAAW,QAAA,IAAY,QAAA,EAAA,iBAAA,EAExE;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AChJA,IAAM,mBAAA,GAA2C;AAAA,EAC/C,UAAA,EAAY,sCAAA;AAAA,EACZ,MAAA,EAAQ,mBAAA;AAAA,EACR,YAAA,EAAc,KAAA;AAAA,EACd,QAAA,EAAU,MAAA;AAAA,EACV,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,UAAA,GAAkC;AAAA,EACtC,KAAA,EAAO,MAAA;AAAA,EACP,cAAA,EAAgB,UAAA;AAAA,EAChB,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,OAAA,GAA+B;AAAA,EACnC,OAAA,EAAS,WAAA;AAAA,EACT,SAAA,EAAW,MAAA;AAAA,EACX,UAAA,EAAY,GAAA;AAAA,EACZ,QAAA,EAAU,MAAA;AAAA,EACV,KAAA,EAAO,SAAA;AAAA,EACP,eAAA,EAAiB,SAAA;AAAA,EACjB,YAAA,EAAc,mBAAA;AAAA,EACd,QAAA,EAAU,QAAA;AAAA,EACV,GAAA,EAAK,CAAA;AAAA,EACL,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,OAAA,GAA+B;AAAA,EACnC,OAAA,EAAS,UAAA;AAAA,EACT,YAAA,EAAc,mBAAA;AAAA,EACd,KAAA,EAAO,SAAA;AAAA,EACP,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,aAAA,GAAqC;AAAA,EACzC,GAAG,OAAA;AAAA,EACH,SAAA,EAAW,OAAA;AAAA,EACX,kBAAA,EAAoB;AACtB,CAAA;AAEA,SAAS,WAAA,CAAY,KAAA,EAAgB,QAAA,EAAkB,aAAA,EAAgC;AACrF,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,QAAA;AAClD,EAAA,IAAI,QAAA,KAAa,QAAA,IAAY,OAAO,KAAA,KAAU,YAAY,aAAA,EAAe;AACvE,IAAA,OAAO,MAAM,cAAA,CAAe,MAAA,EAAW,EAAE,qBAAA,EAAuB,GAAG,CAAA;AAAA,EACrE;AACA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAMO,SAAS,YAAA,CAAa;AAAA,EAC3B,IAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA,GAAU,GAAA;AAAA,EACV,aAAA,GAAgB;AAClB,CAAA,EAAsB;AACpB,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AACtC,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,SAAA,EAAW,QAAA,EAAS,EAAG,QAAA,EAAA,oBAAA,EAExE,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,GAAG,OAAO,CAAA;AAE9C,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,qBAAqB,SAAA,EAC/B,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,UAAA,EACZ,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,WACC,QAAA,kBAAAA,GAAAA,CAAC,QACE,QAAA,EAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,GAAA,qBACjBA,GAAAA,CAAC,IAAA,EAAA,EAAiB,OAAO,OAAA,EACtB,QAAA,EAAA,GAAA,CAAI,SADE,GAAA,CAAI,GAEb,CACD,CAAA,EACH,CAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,OAAA,EAAA,EACE,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,qBACrBA,GAAAA,CAAC,QACE,QAAA,EAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,wBACjBA,GAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,KAAA,EAAO,GAAA,CAAI,QAAA,KAAa,QAAA,GAAW,aAAA,GAAgB,OAAA;AAAA,UAElD,sBAAY,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,EAAG,GAAA,CAAI,UAAU,aAAa;AAAA,SAAA;AAAA,QAHjD,GAAA,CAAI;AAAA,OAKZ,CAAA,EAAA,EARM,CAST,CACD,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,IACC,KAAK,SAAA,GAAY,OAAA,oBAChBC,IAAAA,CAAC,SAAI,KAAA,EAAO,EAAE,OAAA,EAAS,UAAA,EAAY,UAAU,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,SAAA,EAAW,UAAS,EAAG,QAAA,EAAA;AAAA,MAAA,UAAA;AAAA,MACnF,OAAA;AAAA,MAAQ,MAAA;AAAA,MAAK,IAAA,CAAK,SAAA;AAAA,MAAU;AAAA,KAAA,EACvC;AAAA,GAAA,EAEJ,CAAA;AAEJ","file":"components.js","sourcesContent":["import React, { useState, useMemo } from \"react\";\nimport type { SemanticField, FieldType } from \"../types\";\nimport { useMetrics } from \"../react/hooks\";\n\nexport interface MetricPickerProps {\n onSelect: (field: SemanticField) => void;\n /** Filter to only show certain field types. Default: all. */\n fieldTypes?: FieldType[];\n /** Currently selected field IDs (for visual highlighting). */\n selectedIds?: string[];\n /** Placeholder text for the search input. */\n searchPlaceholder?: string;\n /** Custom class name for the root container. */\n className?: string;\n}\n\nconst containerStyle: React.CSSProperties = {\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n border: \"1px solid #e5e7eb\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n maxHeight: \"400px\",\n display: \"flex\",\n flexDirection: \"column\",\n};\n\nconst searchStyle: React.CSSProperties = {\n padding: \"8px 12px\",\n border: \"none\",\n borderBottom: \"1px solid #e5e7eb\",\n fontSize: \"14px\",\n outline: \"none\",\n width: \"100%\",\n boxSizing: \"border-box\",\n};\n\nconst listStyle: React.CSSProperties = {\n overflowY: \"auto\",\n flex: 1,\n};\n\nconst categoryHeaderStyle: React.CSSProperties = {\n padding: \"8px 12px\",\n fontSize: \"11px\",\n fontWeight: 600,\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n color: \"#6b7280\",\n backgroundColor: \"#f9fafb\",\n position: \"sticky\",\n top: 0,\n};\n\nconst itemStyle: React.CSSProperties = {\n padding: \"8px 12px\",\n cursor: \"pointer\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"2px\",\n borderBottom: \"1px solid #f3f4f6\",\n};\n\nconst selectedItemStyle: React.CSSProperties = {\n ...itemStyle,\n backgroundColor: \"#eff6ff\",\n};\n\n/**\n * A searchable, categorized picker for metrics and dimensions.\n * Fetches the catalog from the gateway automatically.\n */\nexport function MetricPicker({\n onSelect,\n fieldTypes,\n selectedIds = [],\n searchPlaceholder = \"Search metrics and dimensions...\",\n className,\n}: MetricPickerProps) {\n const { fields, categories, isLoading, error } = useMetrics();\n const [search, setSearch] = useState(\"\");\n\n const filtered = useMemo(() => {\n let result = fields;\n if (fieldTypes) {\n result = result.filter((f) => fieldTypes.includes(f.type));\n }\n if (search) {\n const q = search.toLowerCase();\n result = result.filter(\n (f) =>\n f.displayName.toLowerCase().includes(q) ||\n f.description.toLowerCase().includes(q) ||\n f.name.toLowerCase().includes(q),\n );\n }\n return result;\n }, [fields, fieldTypes, search]);\n\n const grouped = useMemo(() => {\n const map = new Map<string, SemanticField[]>();\n for (const field of filtered) {\n const list = map.get(field.category) || [];\n list.push(field);\n map.set(field.category, list);\n }\n return map;\n }, [filtered]);\n\n const selectedSet = useMemo(() => new Set(selectedIds), [selectedIds]);\n\n if (isLoading) {\n return <div style={{ padding: \"12px\", color: \"#6b7280\" }}>Loading catalog...</div>;\n }\n\n if (error) {\n return <div style={{ padding: \"12px\", color: \"#ef4444\" }}>{error}</div>;\n }\n\n return (\n <div style={containerStyle} className={className}>\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={searchPlaceholder}\n style={searchStyle}\n />\n <div style={listStyle}>\n {Array.from(grouped.entries()).map(([category, categoryFields]) => (\n <div key={category}>\n <div style={categoryHeaderStyle}>{category}</div>\n {categoryFields.map((field) => (\n <div\n key={field.id}\n style={selectedSet.has(field.id) ? selectedItemStyle : itemStyle}\n onClick={() => onSelect(field)}\n >\n <span style={{ fontSize: \"14px\", fontWeight: 500, color: \"#111827\" }}>\n {field.displayName}\n </span>\n {field.description && (\n <span style={{ fontSize: \"12px\", color: \"#6b7280\" }}>\n {field.description}\n </span>\n )}\n </div>\n ))}\n </div>\n ))}\n {grouped.size === 0 && (\n <div style={{ padding: \"12px\", color: \"#6b7280\", textAlign: \"center\" }}>\n No fields found\n </div>\n )}\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport type { QueryResult } from \"../types\";\n\nexport interface ResultsTableProps {\n data: QueryResult | null;\n /** Custom class name for the root container. */\n className?: string;\n /** Max rows to display. Default: 100. */\n maxRows?: number;\n /** Format numbers with locale string. Default: true. */\n formatNumbers?: boolean;\n}\n\nconst tableContainerStyle: React.CSSProperties = {\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n border: \"1px solid #e5e7eb\",\n borderRadius: \"8px\",\n overflow: \"auto\",\n maxHeight: \"500px\",\n};\n\nconst tableStyle: React.CSSProperties = {\n width: \"100%\",\n borderCollapse: \"collapse\",\n fontSize: \"14px\",\n};\n\nconst thStyle: React.CSSProperties = {\n padding: \"10px 12px\",\n textAlign: \"left\",\n fontWeight: 600,\n fontSize: \"12px\",\n color: \"#6b7280\",\n backgroundColor: \"#f9fafb\",\n borderBottom: \"1px solid #e5e7eb\",\n position: \"sticky\",\n top: 0,\n whiteSpace: \"nowrap\",\n};\n\nconst tdStyle: React.CSSProperties = {\n padding: \"8px 12px\",\n borderBottom: \"1px solid #f3f4f6\",\n color: \"#111827\",\n whiteSpace: \"nowrap\",\n};\n\nconst numberTdStyle: React.CSSProperties = {\n ...tdStyle,\n textAlign: \"right\",\n fontVariantNumeric: \"tabular-nums\",\n};\n\nfunction formatValue(value: unknown, dataType: string, formatNumbers: boolean): string {\n if (value === null || value === undefined) return \"—\";\n if (dataType === \"number\" && typeof value === \"number\" && formatNumbers) {\n return value.toLocaleString(undefined, { maximumFractionDigits: 2 });\n }\n return String(value);\n}\n\n/**\n * A simple data table that renders a QueryResult.\n * Handles formatting numbers, truncating rows, and sticky headers.\n */\nexport function ResultsTable({\n data,\n className,\n maxRows = 100,\n formatNumbers = true,\n}: ResultsTableProps) {\n if (!data || data.columns.length === 0) {\n return (\n <div style={{ padding: \"12px\", color: \"#6b7280\", textAlign: \"center\" }}>\n No data to display\n </div>\n );\n }\n\n const displayRows = data.rows.slice(0, maxRows);\n\n return (\n <div style={tableContainerStyle} className={className}>\n <table style={tableStyle}>\n <thead>\n <tr>\n {data.columns.map((col) => (\n <th key={col.key} style={thStyle}>\n {col.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {displayRows.map((row, i) => (\n <tr key={i}>\n {data.columns.map((col) => (\n <td\n key={col.key}\n style={col.dataType === \"number\" ? numberTdStyle : tdStyle}\n >\n {formatValue(row[col.key], col.dataType, formatNumbers)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n {data.totalRows > maxRows && (\n <div style={{ padding: \"8px 12px\", fontSize: \"12px\", color: \"#6b7280\", textAlign: \"center\" }}>\n Showing {maxRows} of {data.totalRows} rows\n </div>\n )}\n </div>\n );\n}\n"]}
package/dist/index.cjs ADDED
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ var chunk4RECQ22F_cjs = require('./chunk-4RECQ22F.cjs');
4
+
5
+
6
+
7
+ Object.defineProperty(exports, "SemanticLayerClient", {
8
+ enumerable: true,
9
+ get: function () { return chunk4RECQ22F_cjs.SemanticLayerClient; }
10
+ });
11
+ Object.defineProperty(exports, "SemanticLayerError", {
12
+ enumerable: true,
13
+ get: function () { return chunk4RECQ22F_cjs.SemanticLayerError; }
14
+ });
15
+ //# sourceMappingURL=index.cjs.map
16
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
@@ -0,0 +1,48 @@
1
+ import * as _supabase_auth_js from '@supabase/auth-js';
2
+ import { SupabaseClient, Session } from '@supabase/supabase-js';
3
+ import { c as SemanticLayerConfig, M as MetadataResponse, S as SemanticField, P as PivotConfig, Q as QueryResult, b as SimpleQueryInput } from './types-Ds_6aDEw.cjs';
4
+ export { d as AggregationType, A as AuthState, D as DataType, a as FieldCategory, F as FieldType, e as PivotField, f as QueryColumn, T as TimeGrain } from './types-Ds_6aDEw.cjs';
5
+
6
+ declare class SemanticLayerClient {
7
+ private supabase;
8
+ private metadataCache;
9
+ private metadataCacheTime;
10
+ private readonly CACHE_TTL_MS;
11
+ constructor(config: SemanticLayerConfig);
12
+ /** Access the underlying Supabase client (for auth operations). */
13
+ getSupabaseClient(): SupabaseClient;
14
+ signInWithGoogle(redirectTo?: string): Promise<_supabase_auth_js.OAuthResponse>;
15
+ signOut(): Promise<{
16
+ error: _supabase_auth_js.AuthError | null;
17
+ }>;
18
+ getSession(): Promise<Session | null>;
19
+ onAuthStateChange(callback: (event: string, session: Session | null) => void): {
20
+ data: {
21
+ subscription: _supabase_auth_js.Subscription;
22
+ };
23
+ };
24
+ /**
25
+ * Fetch the curated catalog of metrics and dimensions from the gateway.
26
+ * Results are cached for 5 minutes.
27
+ */
28
+ getMetadata(forceRefresh?: boolean): Promise<MetadataResponse>;
29
+ /** Get only metrics from the catalog. */
30
+ getMetrics(): Promise<SemanticField[]>;
31
+ /** Get only dimensions (including time dimensions) from the catalog. */
32
+ getDimensions(): Promise<SemanticField[]>;
33
+ /** Find a field by name or id. */
34
+ getField(nameOrId: string): Promise<SemanticField | undefined>;
35
+ /** Execute a query using the full PivotConfig format. */
36
+ query(config: PivotConfig): Promise<QueryResult>;
37
+ /**
38
+ * Execute a query using the simplified input format.
39
+ * Automatically resolves metric/dimension names to full field objects.
40
+ */
41
+ simpleQuery(input: SimpleQueryInput): Promise<QueryResult>;
42
+ }
43
+ declare class SemanticLayerError extends Error {
44
+ code: string;
45
+ constructor(message: string, code: string);
46
+ }
47
+
48
+ export { MetadataResponse, PivotConfig, QueryResult, SemanticField, SemanticLayerClient, SemanticLayerConfig, SemanticLayerError, SimpleQueryInput };
@@ -0,0 +1,48 @@
1
+ import * as _supabase_auth_js from '@supabase/auth-js';
2
+ import { SupabaseClient, Session } from '@supabase/supabase-js';
3
+ import { c as SemanticLayerConfig, M as MetadataResponse, S as SemanticField, P as PivotConfig, Q as QueryResult, b as SimpleQueryInput } from './types-Ds_6aDEw.js';
4
+ export { d as AggregationType, A as AuthState, D as DataType, a as FieldCategory, F as FieldType, e as PivotField, f as QueryColumn, T as TimeGrain } from './types-Ds_6aDEw.js';
5
+
6
+ declare class SemanticLayerClient {
7
+ private supabase;
8
+ private metadataCache;
9
+ private metadataCacheTime;
10
+ private readonly CACHE_TTL_MS;
11
+ constructor(config: SemanticLayerConfig);
12
+ /** Access the underlying Supabase client (for auth operations). */
13
+ getSupabaseClient(): SupabaseClient;
14
+ signInWithGoogle(redirectTo?: string): Promise<_supabase_auth_js.OAuthResponse>;
15
+ signOut(): Promise<{
16
+ error: _supabase_auth_js.AuthError | null;
17
+ }>;
18
+ getSession(): Promise<Session | null>;
19
+ onAuthStateChange(callback: (event: string, session: Session | null) => void): {
20
+ data: {
21
+ subscription: _supabase_auth_js.Subscription;
22
+ };
23
+ };
24
+ /**
25
+ * Fetch the curated catalog of metrics and dimensions from the gateway.
26
+ * Results are cached for 5 minutes.
27
+ */
28
+ getMetadata(forceRefresh?: boolean): Promise<MetadataResponse>;
29
+ /** Get only metrics from the catalog. */
30
+ getMetrics(): Promise<SemanticField[]>;
31
+ /** Get only dimensions (including time dimensions) from the catalog. */
32
+ getDimensions(): Promise<SemanticField[]>;
33
+ /** Find a field by name or id. */
34
+ getField(nameOrId: string): Promise<SemanticField | undefined>;
35
+ /** Execute a query using the full PivotConfig format. */
36
+ query(config: PivotConfig): Promise<QueryResult>;
37
+ /**
38
+ * Execute a query using the simplified input format.
39
+ * Automatically resolves metric/dimension names to full field objects.
40
+ */
41
+ simpleQuery(input: SimpleQueryInput): Promise<QueryResult>;
42
+ }
43
+ declare class SemanticLayerError extends Error {
44
+ code: string;
45
+ constructor(message: string, code: string);
46
+ }
47
+
48
+ export { MetadataResponse, PivotConfig, QueryResult, SemanticField, SemanticLayerClient, SemanticLayerConfig, SemanticLayerError, SimpleQueryInput };
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { SemanticLayerClient, SemanticLayerError } from './chunk-IQARBGJP.js';
2
+ //# sourceMappingURL=index.js.map
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}