@inkindcards/semantic-layer 2.3.0 → 2.4.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.
- package/dist/components.cjs +1136 -202
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.cts +30 -2
- package/dist/components.d.ts +30 -2
- package/dist/components.js +1133 -203
- package/dist/components.js.map +1 -1
- package/package.json +1 -1
package/dist/components.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/metric-picker.tsx","../src/components/results-table.tsx","../src/components/data-catalog.tsx","../src/components/admin-dashboard.tsx","../src/components/inspectable.tsx","../src/components/field-matcher.ts","../src/components/prompt-generator.ts","../src/components/data-inspector.tsx"],"names":["jsx","jsxs","useState","useMemo","rootStyle","headingStyle","subStyle","tableStyle","thStyle","tdStyle","badgeStyle","emptyStyle","useCallback","useContext","useEffect","Fragment","selectStyle"],"mappings":"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","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","import React, { useState, useMemo, useCallback } from \"react\";\nimport { useMetrics } from \"../react/hooks\";\nimport type { SemanticField } from \"../types\";\n\nexport interface DataCatalogProps {\n className?: string;\n /** Show a \"copy name\" button for each field. Default: true. */\n showCopyButton?: boolean;\n /** Filter to only show certain field types. */\n fieldTypes?: Array<\"metric\" | \"dimension\" | \"time_dimension\">;\n}\n\nconst rootStyle: React.CSSProperties = {\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n maxWidth: 960,\n margin: \"0 auto\",\n padding: 24,\n};\n\nconst headingStyle: React.CSSProperties = {\n fontSize: 24, fontWeight: 700, color: \"#111827\", margin: \"0 0 4px\",\n};\n\nconst subStyle: React.CSSProperties = {\n fontSize: 14, color: \"#6b7280\", margin: \"0 0 20px\",\n};\n\nconst searchBarStyle: React.CSSProperties = {\n display: \"flex\", gap: 8, marginBottom: 20,\n};\n\nconst searchInput: React.CSSProperties = {\n flex: 1, padding: \"10px 14px\", fontSize: 14, border: \"1px solid #d1d5db\",\n borderRadius: 8, outline: \"none\", boxSizing: \"border-box\",\n};\n\nconst filterBtn = (active: boolean): React.CSSProperties => ({\n padding: \"8px 14px\", fontSize: 13, fontWeight: 500, borderRadius: 6,\n border: \"1px solid \" + (active ? \"#3b82f6\" : \"#d1d5db\"),\n backgroundColor: active ? \"#eff6ff\" : \"#fff\",\n color: active ? \"#1d4ed8\" : \"#374151\",\n cursor: \"pointer\",\n});\n\nconst categoryStyle: React.CSSProperties = {\n marginBottom: 24,\n};\n\nconst categoryHeader: React.CSSProperties = {\n fontSize: 13, fontWeight: 600, textTransform: \"uppercase\", letterSpacing: \"0.05em\",\n color: \"#6b7280\", marginBottom: 8, paddingBottom: 6, borderBottom: \"1px solid #e5e7eb\",\n};\n\nconst fieldCard: React.CSSProperties = {\n display: \"flex\", justifyContent: \"space-between\", alignItems: \"flex-start\",\n padding: \"10px 12px\", borderRadius: 6, marginBottom: 4,\n backgroundColor: \"#fafafa\", border: \"1px solid #f3f4f6\",\n};\n\nconst fieldNameStyle: React.CSSProperties = {\n fontSize: 15, fontWeight: 600, color: \"#111827\",\n};\n\nconst fieldDescStyle: React.CSSProperties = {\n fontSize: 13, color: \"#6b7280\", marginTop: 2,\n};\n\nconst codeName: React.CSSProperties = {\n fontSize: 12, color: \"#6366f1\", fontFamily: \"monospace\", marginTop: 2,\n};\n\nconst badgeStyle = (type: string): React.CSSProperties => ({\n display: \"inline-block\", padding: \"2px 8px\", fontSize: 11, fontWeight: 600,\n borderRadius: 9999, whiteSpace: \"nowrap\",\n backgroundColor: type === \"metric\" ? \"#eff6ff\" : type === \"time_dimension\" ? \"#f0fdf4\" : \"#f3f4f6\",\n color: type === \"metric\" ? \"#1d4ed8\" : type === \"time_dimension\" ? \"#15803d\" : \"#6b7280\",\n});\n\nconst copyBtn: React.CSSProperties = {\n padding: \"4px 8px\", fontSize: 11, fontWeight: 500, color: \"#6366f1\",\n backgroundColor: \"#eef2ff\", border: \"1px solid #c7d2fe\", borderRadius: 4,\n cursor: \"pointer\", whiteSpace: \"nowrap\",\n};\n\nconst statsBar: React.CSSProperties = {\n display: \"flex\", gap: 16, marginBottom: 16, fontSize: 14,\n};\n\nconst statItem: React.CSSProperties = {\n display: \"flex\", alignItems: \"center\", gap: 4, color: \"#6b7280\",\n};\n\nconst statNum: React.CSSProperties = { fontWeight: 700, color: \"#111827\" };\n\nconst emptyStyle: React.CSSProperties = {\n padding: 40, textAlign: \"center\", color: \"#9ca3af\", fontSize: 14,\n};\n\ntype TypeFilter = \"all\" | \"metric\" | \"dimension\" | \"time_dimension\";\n\nexport function DataCatalog({ className, showCopyButton = true, fieldTypes }: DataCatalogProps) {\n const { fields, metrics, dimensions, isLoading, error } = useMetrics();\n const [search, setSearch] = useState(\"\");\n const [typeFilter, setTypeFilter] = useState<TypeFilter>(\"all\");\n const [copiedField, setCopiedField] = useState<string | null>(null);\n\n const filtered = useMemo(() => {\n let result = fields;\n if (fieldTypes) result = result.filter((f) => (fieldTypes as string[]).includes(f.type));\n if (typeFilter !== \"all\") result = result.filter((f) => f.type === typeFilter);\n if (search) {\n const q = search.toLowerCase();\n result = result.filter((f) =>\n f.displayName.toLowerCase().includes(q) ||\n f.name.toLowerCase().includes(q) ||\n f.description.toLowerCase().includes(q) ||\n f.category.toLowerCase().includes(q)\n );\n }\n return result;\n }, [fields, fieldTypes, typeFilter, search]);\n\n const grouped = useMemo(() => {\n const map = new Map<string, SemanticField[]>();\n for (const f of filtered) {\n const list = map.get(f.category) || [];\n list.push(f);\n map.set(f.category, list);\n }\n return map;\n }, [filtered]);\n\n const handleCopy = useCallback(async (name: string) => {\n try {\n await navigator.clipboard.writeText(name);\n setCopiedField(name);\n setTimeout(() => setCopiedField(null), 1500);\n } catch {\n // Clipboard API not available in some iframes\n }\n }, []);\n\n if (isLoading) return <div style={{ ...rootStyle, ...emptyStyle }}>Loading data catalog...</div>;\n if (error) return <div style={{ ...rootStyle, padding: 24, color: \"#ef4444\" }}>{error}</div>;\n\n const timeDims = fields.filter((f) => f.type === \"time_dimension\");\n\n return (\n <div style={rootStyle} className={className}>\n <h1 style={headingStyle}>Data Catalog</h1>\n <p style={subStyle}>Browse available metrics and dimensions from the semantic layer</p>\n\n <div style={statsBar}>\n <div style={statItem}><span style={statNum}>{metrics.length}</span> metrics</div>\n <div style={statItem}><span style={statNum}>{dimensions.length - timeDims.length}</span> dimensions</div>\n <div style={statItem}><span style={statNum}>{timeDims.length}</span> time dimensions</div>\n </div>\n\n <div style={searchBarStyle}>\n <input\n style={searchInput}\n placeholder=\"Search by name, description, or category...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n <button style={filterBtn(typeFilter === \"all\")} onClick={() => setTypeFilter(\"all\")}>All</button>\n <button style={filterBtn(typeFilter === \"metric\")} onClick={() => setTypeFilter(\"metric\")}>Metrics</button>\n <button style={filterBtn(typeFilter === \"dimension\")} onClick={() => setTypeFilter(\"dimension\")}>Dimensions</button>\n <button style={filterBtn(typeFilter === \"time_dimension\")} onClick={() => setTypeFilter(\"time_dimension\")}>Time</button>\n </div>\n\n {Array.from(grouped.entries()).map(([category, categoryFields]) => (\n <div key={category} style={categoryStyle}>\n <div style={categoryHeader}>{category} ({categoryFields.length})</div>\n {categoryFields.map((f) => (\n <div key={f.id} style={fieldCard}>\n <div style={{ flex: 1 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <span style={fieldNameStyle}>{f.displayName}</span>\n <span style={badgeStyle(f.type)}>{f.type}</span>\n </div>\n {f.description && <div style={fieldDescStyle}>{f.description}</div>}\n <div style={codeName}>{f.name}</div>\n </div>\n {showCopyButton && (\n <button style={copyBtn} onClick={() => handleCopy(f.name)}>\n {copiedField === f.name ? \"Copied!\" : \"Copy name\"}\n </button>\n )}\n </div>\n ))}\n </div>\n ))}\n\n {grouped.size === 0 && (\n <div style={emptyStyle}>\n {search ? \"No fields match your search.\" : \"No data available. The gateway may not be configured yet.\"}\n </div>\n )}\n </div>\n );\n}\n","import React, { useState, useCallback, useMemo } from \"react\";\nimport { useAdminFields, useAdminRoles, useAdminUsers } from \"../react/admin-hooks\";\nimport { useAuth } from \"../react/hooks\";\nimport type { CuratedField, AccessRole, UserRoleAssignment } from \"../types\";\n\nexport interface AdminDashboardProps {\n className?: string;\n}\n\n// ─── Shared styles ────────────────────────────────────────────────────────────\n\nconst rootStyle: React.CSSProperties = {\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n maxWidth: 960,\n margin: \"0 auto\",\n padding: 24,\n};\n\nconst headingStyle: React.CSSProperties = {\n fontSize: 24, fontWeight: 700, color: \"#111827\", margin: \"0 0 4px\",\n};\n\nconst subStyle: React.CSSProperties = {\n fontSize: 14, color: \"#6b7280\", margin: \"0 0 20px\",\n};\n\nconst tabBarStyle: React.CSSProperties = {\n display: \"flex\", gap: 0, borderBottom: \"1px solid #e5e7eb\", marginBottom: 24,\n};\n\nconst tabBase: React.CSSProperties = {\n padding: \"10px 20px\", fontSize: 14, fontWeight: 500, cursor: \"pointer\",\n background: \"none\", border: \"none\", borderBottom: \"2px solid transparent\",\n color: \"#6b7280\",\n};\n\nconst tabActive: React.CSSProperties = {\n ...tabBase, color: \"#111827\", borderBottomColor: \"#3b82f6\",\n};\n\nconst tableStyle: React.CSSProperties = {\n width: \"100%\", borderCollapse: \"collapse\", fontSize: 14,\n};\n\nconst thStyle: React.CSSProperties = {\n padding: \"10px 12px\", textAlign: \"left\", fontWeight: 600, fontSize: 12,\n color: \"#6b7280\", backgroundColor: \"#f9fafb\", borderBottom: \"1px solid #e5e7eb\",\n};\n\nconst tdStyle: React.CSSProperties = {\n padding: \"8px 12px\", borderBottom: \"1px solid #f3f4f6\", color: \"#111827\",\n};\n\nconst btnPrimary: React.CSSProperties = {\n padding: \"8px 16px\", fontSize: 14, fontWeight: 500, color: \"#fff\",\n backgroundColor: \"#3b82f6\", border: \"none\", borderRadius: 6, cursor: \"pointer\",\n};\n\nconst btnDanger: React.CSSProperties = {\n ...btnPrimary, backgroundColor: \"#ef4444\",\n};\n\nconst btnSecondary: React.CSSProperties = {\n ...btnPrimary, backgroundColor: \"#fff\", color: \"#374151\",\n border: \"1px solid #d1d5db\",\n};\n\nconst inputStyle: React.CSSProperties = {\n padding: \"6px 10px\", fontSize: 14, border: \"1px solid #d1d5db\",\n borderRadius: 6, width: \"100%\", boxSizing: \"border-box\",\n};\n\nconst selectStyle: React.CSSProperties = { ...inputStyle, width: \"auto\" };\n\nconst cardStyle: React.CSSProperties = {\n border: \"1px solid #e5e7eb\", borderRadius: 8, padding: 16, marginBottom: 16,\n backgroundColor: \"#fff\",\n};\n\nconst errorBanner: React.CSSProperties = {\n padding: \"10px 14px\", backgroundColor: \"#fef2f2\", color: \"#b91c1c\",\n borderRadius: 6, fontSize: 14, marginBottom: 16,\n};\n\nconst badgeStyle: React.CSSProperties = {\n display: \"inline-block\", padding: \"2px 8px\", fontSize: 11, fontWeight: 600,\n borderRadius: 9999, backgroundColor: \"#eff6ff\", color: \"#1d4ed8\",\n};\n\nconst badgeGreen: React.CSSProperties = { ...badgeStyle, backgroundColor: \"#f0fdf4\", color: \"#15803d\" };\nconst badgeGray: React.CSSProperties = { ...badgeStyle, backgroundColor: \"#f3f4f6\", color: \"#6b7280\" };\n\nconst checkboxStyle: React.CSSProperties = { width: 16, height: 16, cursor: \"pointer\" };\n\nconst emptyStyle: React.CSSProperties = {\n padding: 24, textAlign: \"center\", color: \"#9ca3af\", fontSize: 14,\n};\n\n// ─── Fields Tab ───────────────────────────────────────────────────────────────\n\nfunction FieldsTab() {\n const { fields, isLoading, error, createField, updateField, deleteField } = useAdminFields();\n const [showAdd, setShowAdd] = useState(false);\n const [newName, setNewName] = useState(\"\");\n const [newType, setNewType] = useState<string>(\"metric\");\n const [newDisplay, setNewDisplay] = useState(\"\");\n const [newDesc, setNewDesc] = useState(\"\");\n const [actionError, setActionError] = useState<string | null>(null);\n\n const handleAdd = useCallback(async () => {\n if (!newName.trim()) return;\n setActionError(null);\n try {\n await createField({\n field_name: newName.trim(),\n field_type: newType,\n display_name: newDisplay.trim() || undefined,\n description: newDesc.trim() || undefined,\n });\n setNewName(\"\"); setNewDisplay(\"\"); setNewDesc(\"\"); setShowAdd(false);\n } catch (err) {\n setActionError(err instanceof Error ? err.message : \"Failed to create field\");\n }\n }, [newName, newType, newDisplay, newDesc, createField]);\n\n const handleToggle = useCallback(async (f: CuratedField) => {\n try { await updateField({ id: f.id, is_active: !f.is_active }); }\n catch (err) { setActionError(err instanceof Error ? err.message : \"Failed to update\"); }\n }, [updateField]);\n\n const handleDelete = useCallback(async (id: number) => {\n if (!confirm(\"Delete this field? This also removes it from all roles.\")) return;\n try { await deleteField(id); }\n catch (err) { setActionError(err instanceof Error ? err.message : \"Failed to delete\"); }\n }, [deleteField]);\n\n if (isLoading) return <div style={emptyStyle}>Loading fields...</div>;\n if (error) return <div style={errorBanner}>{error}</div>;\n\n return (\n <div>\n {actionError && <div style={errorBanner}>{actionError}</div>}\n\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: 16 }}>\n <span style={{ fontSize: 14, color: \"#6b7280\" }}>{fields.length} curated field{fields.length !== 1 ? \"s\" : \"\"}</span>\n <button style={btnPrimary} onClick={() => setShowAdd(!showAdd)}>\n {showAdd ? \"Cancel\" : \"+ Add field\"}\n </button>\n </div>\n\n {showAdd && (\n <div style={cardStyle}>\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr auto 1fr\", gap: 8, marginBottom: 8 }}>\n <input style={inputStyle} placeholder=\"field_name (from dbt)\" value={newName} onChange={(e) => setNewName(e.target.value)} />\n <select style={selectStyle} value={newType} onChange={(e) => setNewType(e.target.value)}>\n <option value=\"metric\">metric</option>\n <option value=\"dimension\">dimension</option>\n <option value=\"time_dimension\">time_dimension</option>\n </select>\n <input style={inputStyle} placeholder=\"Display name (optional)\" value={newDisplay} onChange={(e) => setNewDisplay(e.target.value)} />\n </div>\n <div style={{ display: \"flex\", gap: 8 }}>\n <input style={{ ...inputStyle, flex: 1 }} placeholder=\"Description (optional)\" value={newDesc} onChange={(e) => setNewDesc(e.target.value)} onKeyDown={(e) => e.key === \"Enter\" && handleAdd()} />\n <button style={btnPrimary} onClick={handleAdd}>Save</button>\n </div>\n </div>\n )}\n\n <table style={tableStyle}>\n <thead>\n <tr>\n <th style={thStyle}>Field Name</th>\n <th style={thStyle}>Type</th>\n <th style={thStyle}>Display Name</th>\n <th style={thStyle}>Active</th>\n <th style={{ ...thStyle, textAlign: \"right\" }}>Actions</th>\n </tr>\n </thead>\n <tbody>\n {fields.map((f) => (\n <tr key={f.id}>\n <td style={tdStyle}><code style={{ fontSize: 13 }}>{f.field_name}</code></td>\n <td style={tdStyle}>\n <span style={f.field_type === \"metric\" ? badgeStyle : f.field_type === \"time_dimension\" ? badgeGreen : badgeGray}>\n {f.field_type}\n </span>\n </td>\n <td style={tdStyle}>{f.display_name || <span style={{ color: \"#9ca3af\" }}>—</span>}</td>\n <td style={tdStyle}>\n <input type=\"checkbox\" checked={f.is_active} onChange={() => handleToggle(f)} style={checkboxStyle} />\n </td>\n <td style={{ ...tdStyle, textAlign: \"right\" }}>\n <button style={{ ...btnDanger, padding: \"4px 10px\", fontSize: 12 }} onClick={() => handleDelete(f.id)}>Delete</button>\n </td>\n </tr>\n ))}\n {fields.length === 0 && (\n <tr><td colSpan={5} style={emptyStyle}>No curated fields yet. Add fields to start restricting access.</td></tr>\n )}\n </tbody>\n </table>\n </div>\n );\n}\n\n// ─── Roles Tab ────────────────────────────────────────────────────────────────\n\nfunction RolesTab() {\n const { roles, isLoading, error, createRole, deleteRole, setRoleFields } = useAdminRoles();\n const { fields } = useAdminFields();\n const [showAdd, setShowAdd] = useState(false);\n const [newName, setNewName] = useState(\"\");\n const [newDesc, setNewDesc] = useState(\"\");\n const [editingRole, setEditingRole] = useState<number | null>(null);\n const [actionError, setActionError] = useState<string | null>(null);\n\n const handleAdd = useCallback(async () => {\n if (!newName.trim()) return;\n setActionError(null);\n try {\n await createRole({ name: newName.trim(), description: newDesc.trim() || undefined });\n setNewName(\"\"); setNewDesc(\"\"); setShowAdd(false);\n } catch (err) {\n setActionError(err instanceof Error ? err.message : \"Failed to create role\");\n }\n }, [newName, newDesc, createRole]);\n\n const handleDelete = useCallback(async (id: number) => {\n if (!confirm(\"Delete this role? Users assigned to it will lose this role's access.\")) return;\n try { await deleteRole(id); }\n catch (err) { setActionError(err instanceof Error ? err.message : \"Failed to delete\"); }\n }, [deleteRole]);\n\n const getFieldIds = (role: AccessRole): Set<number> =>\n new Set((role.role_field_access || []).map((rfa) => rfa.curated_field_id));\n\n const handleToggleField = useCallback(async (role: AccessRole, fieldId: number) => {\n const current = getFieldIds(role);\n if (current.has(fieldId)) current.delete(fieldId);\n else current.add(fieldId);\n setActionError(null);\n try { await setRoleFields(role.id, Array.from(current)); }\n catch (err) { setActionError(err instanceof Error ? err.message : \"Failed to update\"); }\n }, [setRoleFields]);\n\n if (isLoading) return <div style={emptyStyle}>Loading roles...</div>;\n if (error) return <div style={errorBanner}>{error}</div>;\n\n return (\n <div>\n {actionError && <div style={errorBanner}>{actionError}</div>}\n\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: 16 }}>\n <span style={{ fontSize: 14, color: \"#6b7280\" }}>{roles.length} role{roles.length !== 1 ? \"s\" : \"\"}</span>\n <button style={btnPrimary} onClick={() => setShowAdd(!showAdd)}>\n {showAdd ? \"Cancel\" : \"+ Add role\"}\n </button>\n </div>\n\n {showAdd && (\n <div style={cardStyle}>\n <div style={{ display: \"flex\", gap: 8 }}>\n <input style={{ ...inputStyle, flex: 1 }} placeholder=\"Role name\" value={newName} onChange={(e) => setNewName(e.target.value)} />\n <input style={{ ...inputStyle, flex: 2 }} placeholder=\"Description (optional)\" value={newDesc} onChange={(e) => setNewDesc(e.target.value)} onKeyDown={(e) => e.key === \"Enter\" && handleAdd()} />\n <button style={btnPrimary} onClick={handleAdd}>Save</button>\n </div>\n </div>\n )}\n\n {roles.map((role) => {\n const assignedIds = getFieldIds(role);\n const isEditing = editingRole === role.id;\n\n return (\n <div key={role.id} style={cardStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: isEditing ? 12 : 0 }}>\n <div>\n <strong style={{ fontSize: 16 }}>{role.name}</strong>\n {role.is_default && <span style={{ ...badgeGreen, marginLeft: 8 }}>default</span>}\n <span style={{ ...badgeGray, marginLeft: 8 }}>{assignedIds.size} field{assignedIds.size !== 1 ? \"s\" : \"\"}</span>\n {role.description && <div style={{ fontSize: 13, color: \"#6b7280\", marginTop: 2 }}>{role.description}</div>}\n </div>\n <div style={{ display: \"flex\", gap: 8 }}>\n <button style={btnSecondary} onClick={() => setEditingRole(isEditing ? null : role.id)}>\n {isEditing ? \"Done\" : \"Edit fields\"}\n </button>\n {!role.is_default && (\n <button style={{ ...btnDanger, padding: \"6px 12px\", fontSize: 12 }} onClick={() => handleDelete(role.id)}>Delete</button>\n )}\n </div>\n </div>\n\n {isEditing && fields.length > 0 && (\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(auto-fill, minmax(240px, 1fr))\", gap: 4 }}>\n {fields.filter((f) => f.is_active).map((f) => (\n <label key={f.id} style={{ display: \"flex\", alignItems: \"center\", gap: 8, padding: \"4px 0\", fontSize: 13, cursor: \"pointer\" }}>\n <input type=\"checkbox\" checked={assignedIds.has(f.id)} onChange={() => handleToggleField(role, f.id)} style={checkboxStyle} />\n <span>{f.display_name || f.field_name}</span>\n <span style={f.field_type === \"metric\" ? badgeStyle : badgeGray}>{f.field_type}</span>\n </label>\n ))}\n </div>\n )}\n\n {isEditing && fields.length === 0 && (\n <div style={emptyStyle}>No curated fields defined yet. Add fields in the Fields tab first.</div>\n )}\n </div>\n );\n })}\n\n {roles.length === 0 && <div style={emptyStyle}>No roles defined.</div>}\n </div>\n );\n}\n\n// ─── Users Tab ────────────────────────────────────────────────────────────────\n\nfunction UsersTab() {\n const { users, isLoading, error, assignUserRole, removeUserRole } = useAdminUsers();\n const { roles } = useAdminRoles();\n const [showAdd, setShowAdd] = useState(false);\n const [newEmail, setNewEmail] = useState(\"\");\n const [newRoleId, setNewRoleId] = useState<number>(0);\n const [newIsAdmin, setNewIsAdmin] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n\n const handleAdd = useCallback(async () => {\n if (!newEmail.trim() || !newRoleId) return;\n setActionError(null);\n try {\n await assignUserRole({ email: newEmail.trim().toLowerCase(), role_id: newRoleId, is_admin: newIsAdmin });\n setNewEmail(\"\"); setNewIsAdmin(false); setShowAdd(false);\n } catch (err) {\n setActionError(err instanceof Error ? err.message : \"Failed to assign role\");\n }\n }, [newEmail, newRoleId, newIsAdmin, assignUserRole]);\n\n const handleRemove = useCallback(async (u: UserRoleAssignment) => {\n if (!confirm(`Remove ${u.email} from this role?`)) return;\n try { await removeUserRole({ email: u.email, role_id: u.role_id }); }\n catch (err) { setActionError(err instanceof Error ? err.message : \"Failed to remove\"); }\n }, [removeUserRole]);\n\n const grouped = useMemo(() => {\n const map = new Map<string, UserRoleAssignment[]>();\n for (const u of users) {\n const list = map.get(u.email) || [];\n list.push(u);\n map.set(u.email, list);\n }\n return map;\n }, [users]);\n\n if (isLoading) return <div style={emptyStyle}>Loading users...</div>;\n if (error) return <div style={errorBanner}>{error}</div>;\n\n return (\n <div>\n {actionError && <div style={errorBanner}>{actionError}</div>}\n\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: 16 }}>\n <span style={{ fontSize: 14, color: \"#6b7280\" }}>{grouped.size} user{grouped.size !== 1 ? \"s\" : \"\"} with role assignments</span>\n <button style={btnPrimary} onClick={() => setShowAdd(!showAdd)}>\n {showAdd ? \"Cancel\" : \"+ Assign user\"}\n </button>\n </div>\n\n {showAdd && (\n <div style={cardStyle}>\n <div style={{ display: \"flex\", gap: 8, marginBottom: 8 }}>\n <input style={{ ...inputStyle, flex: 1 }} placeholder=\"Email (e.g. name@inkind.com)\" value={newEmail} onChange={(e) => setNewEmail(e.target.value)} />\n <select style={selectStyle} value={newRoleId} onChange={(e) => setNewRoleId(Number(e.target.value))}>\n <option value={0}>Select role...</option>\n {roles.map((r) => <option key={r.id} value={r.id}>{r.name}</option>)}\n </select>\n </div>\n <div style={{ display: \"flex\", gap: 8, alignItems: \"center\" }}>\n <label style={{ display: \"flex\", alignItems: \"center\", gap: 6, fontSize: 13, cursor: \"pointer\" }}>\n <input type=\"checkbox\" checked={newIsAdmin} onChange={(e) => setNewIsAdmin(e.target.checked)} style={checkboxStyle} />\n Admin access\n </label>\n <div style={{ flex: 1 }} />\n <button style={btnPrimary} onClick={handleAdd}>Assign</button>\n </div>\n </div>\n )}\n\n {Array.from(grouped.entries()).map(([email, assignments]) => (\n <div key={email} style={cardStyle}>\n <div>\n <strong style={{ fontSize: 14 }}>{email}</strong>\n {assignments.some((a) => a.is_admin) && <span style={{ ...badgeGreen, marginLeft: 8 }}>admin</span>}\n </div>\n <div style={{ display: \"flex\", gap: 6, marginTop: 8, flexWrap: \"wrap\" }}>\n {assignments.map((a) => (\n <span key={a.id} style={{ display: \"inline-flex\", alignItems: \"center\", gap: 4, ...badgeStyle }}>\n {a.access_roles?.name || `role #${a.role_id}`}\n <button\n onClick={() => handleRemove(a)}\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", color: \"#6b7280\", fontSize: 14, padding: 0, lineHeight: 1 }}\n title=\"Remove role\"\n >\n ×\n </button>\n </span>\n ))}\n </div>\n </div>\n ))}\n\n {grouped.size === 0 && (\n <div style={emptyStyle}>\n No user role assignments yet. Users without an explicit role get the default role's access.\n </div>\n )}\n </div>\n );\n}\n\n// ─── Main Dashboard ───────────────────────────────────────────────────────────\n\ntype Tab = \"fields\" | \"roles\" | \"users\";\n\nexport function AdminDashboard({ className }: AdminDashboardProps) {\n const { isAuthenticated, isLoading: authLoading } = useAuth();\n const [tab, setTab] = useState<Tab>(\"fields\");\n const [initError, setInitError] = useState<string | null>(null);\n\n if (authLoading) return <div style={{ ...rootStyle, ...emptyStyle }}>Loading...</div>;\n if (!isAuthenticated) return <div style={{ ...rootStyle, ...emptyStyle }}>Sign in to access the admin dashboard.</div>;\n\n return (\n <div style={rootStyle} className={className}>\n <h1 style={headingStyle}>Semantic Layer Admin</h1>\n <p style={subStyle}>Manage curated fields, roles, and user access</p>\n\n {initError && <div style={errorBanner}>{initError}</div>}\n\n <div style={tabBarStyle}>\n {([\"fields\", \"roles\", \"users\"] as Tab[]).map((t) => (\n <button key={t} style={tab === t ? tabActive : tabBase} onClick={() => { setTab(t); setInitError(null); }}>\n {t.charAt(0).toUpperCase() + t.slice(1)}\n </button>\n ))}\n </div>\n\n {tab === \"fields\" && <FieldsTab />}\n {tab === \"roles\" && <RolesTab />}\n {tab === \"users\" && <UsersTab />}\n </div>\n );\n}\n","import React, { createContext, useContext, useEffect, useId, useRef, useState, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport interface InspectableEntry {\n id: string;\n label: string;\n currentSource: string;\n columns: string[];\n sampleValues: Record<string, unknown>[];\n element: HTMLElement | null;\n}\n\nexport interface InspectableRegistryValue {\n entries: Map<string, InspectableEntry>;\n register: (entry: InspectableEntry) => void;\n unregister: (id: string) => void;\n inspectActive: boolean;\n setInspectActive: (active: boolean) => void;\n selectedId: string | null;\n setSelectedId: (id: string | null) => void;\n}\n\nexport const InspectableRegistryContext = createContext<InspectableRegistryValue | null>(null);\n\nexport function InspectableRegistry({ children }: { children: React.ReactNode }) {\n const [entries, setEntries] = useState<Map<string, InspectableEntry>>(new Map());\n const [inspectActive, setInspectActive] = useState(false);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n\n const register = useCallback((entry: InspectableEntry) => {\n setEntries((prev) => {\n const next = new Map(prev);\n next.set(entry.id, entry);\n return next;\n });\n }, []);\n\n const unregister = useCallback((id: string) => {\n setEntries((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n setSelectedId((prev) => (prev === id ? null : prev));\n }, []);\n\n const value: InspectableRegistryValue = {\n entries,\n register,\n unregister,\n inspectActive,\n setInspectActive,\n selectedId,\n setSelectedId,\n };\n\n return (\n <InspectableRegistryContext.Provider value={value}>\n {children}\n </InspectableRegistryContext.Provider>\n );\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────────\n\n/**\n * Computes the bounding rect of all child elements of a `display: contents`\n * wrapper (which has no box of its own).\n */\nfunction getChildrenBounds(el: HTMLElement): DOMRect | null {\n const children = el.children;\n if (children.length === 0) return null;\n let top = Infinity, left = Infinity, bottom = -Infinity, right = -Infinity;\n for (let i = 0; i < children.length; i++) {\n const r = children[i].getBoundingClientRect();\n if (r.width === 0 && r.height === 0) continue;\n top = Math.min(top, r.top);\n left = Math.min(left, r.left);\n bottom = Math.max(bottom, r.bottom);\n right = Math.max(right, r.right);\n }\n if (top === Infinity) return null;\n return new DOMRect(left, top, right - left, bottom - top);\n}\n\n// ─── Inspectable wrapper ───────────────────────────────────────────────────────\n\nexport interface InspectableProps {\n /** Human-readable label for this component (e.g., \"Revenue Chart\"). */\n label: string;\n /** Describes where data currently comes from (e.g., \"hardcoded array\", \"API /revenue\"). */\n currentSource?: string;\n /** The current data powering this component -- used to infer columns and sample values. */\n data?: Record<string, unknown>[];\n /** Explicit column names. If omitted, inferred from the first item in data. */\n columns?: string[];\n children: React.ReactNode;\n}\n\n/**\n * Wraps a data-bound component and registers it with the DataInspector overlay.\n * Uses `display: contents` so the wrapper is invisible to CSS layout — charts,\n * grids, and flex items render exactly as if Inspectable were not there.\n * The inspect-mode highlight is rendered via a React portal into document.body,\n * positioned with getBoundingClientRect().\n */\nexport function Inspectable({\n label,\n currentSource = \"unknown\",\n data,\n columns,\n children,\n}: InspectableProps) {\n const registry = useContext(InspectableRegistryContext);\n const id = useId();\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [rect, setRect] = useState<DOMRect | null>(null);\n\n // Stable ref so the registration effect can call register/unregister\n // without depending on the (unstable) context value object.\n const registryRef = useRef(registry);\n registryRef.current = registry;\n\n const inferredColumns = columns ?? (data?.[0] ? Object.keys(data[0]) : []);\n const sampleValues = data?.slice(0, 3) ?? [];\n const columnsKey = inferredColumns.join(\",\");\n\n useEffect(() => {\n const reg = registryRef.current;\n if (!reg) return;\n\n reg.register({\n id,\n label,\n currentSource,\n columns: columnsKey.split(\",\").filter(Boolean),\n sampleValues,\n element: wrapperRef.current,\n });\n\n return () => reg.unregister(id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id, label, currentSource, columnsKey]);\n\n const inspectActive = registry?.inspectActive ?? false;\n\n // Continuously measure child bounds while inspect mode is active\n useEffect(() => {\n if (!inspectActive || !wrapperRef.current) {\n setRect(null);\n return;\n }\n\n const measure = () => {\n if (wrapperRef.current) {\n setRect(getChildrenBounds(wrapperRef.current));\n }\n };\n\n measure();\n window.addEventListener(\"scroll\", measure, true);\n window.addEventListener(\"resize\", measure);\n const interval = setInterval(measure, 300);\n\n return () => {\n window.removeEventListener(\"scroll\", measure, true);\n window.removeEventListener(\"resize\", measure);\n clearInterval(interval);\n };\n }, [inspectActive]);\n\n if (!registry) {\n console.warn(\n `[SemanticLayer] <Inspectable label=\"${label}\"> has no <DataInspector> ancestor. ` +\n `Make sure <DataInspector> wraps your app content, not self-closing: ` +\n `<DataInspector>{children}</DataInspector>`\n );\n return <>{children}</>;\n }\n\n const isSelected = registry.selectedId === id;\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n registry.setSelectedId(isSelected ? null : id);\n };\n\n return (\n <div ref={wrapperRef} style={{ display: \"contents\" }}>\n {children}\n {registry.inspectActive && rect && createPortal(\n <div\n onClick={handleClick}\n style={{\n position: \"fixed\",\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n zIndex: 9999,\n cursor: \"pointer\",\n outline: isSelected\n ? \"2px solid #3b82f6\"\n : \"2px dashed #93c5fd\",\n outlineOffset: 2,\n borderRadius: 4,\n transition: \"outline 0.15s ease\",\n background: isSelected ? \"rgba(59,130,246,0.05)\" : \"transparent\",\n pointerEvents: \"auto\",\n }}\n >\n <div\n style={{\n position: \"absolute\",\n top: -10,\n left: 4,\n fontSize: 10,\n fontWeight: 600,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: \"#fff\",\n backgroundColor: isSelected ? \"#3b82f6\" : \"#93c5fd\",\n padding: \"1px 6px\",\n borderRadius: 3,\n pointerEvents: \"none\",\n whiteSpace: \"nowrap\",\n }}\n >\n {label}\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n}\n","import type { SemanticField } from \"../types\";\n\nexport type MatchConfidence = \"exact\" | \"fuzzy\" | \"manual\";\n\nexport interface FieldMatch {\n column: string;\n suggestedField: SemanticField | null;\n confidence: MatchConfidence;\n}\n\nexport interface ChartAnalysis {\n dimensionColumns: string[];\n metricColumns: string[];\n}\n\nconst AGG_PREFIXES = [\"total_\", \"sum_\", \"avg_\", \"count_\", \"min_\", \"max_\", \"num_\"];\nconst NOISE_SUFFIXES = [\"_name\", \"_id\", \"_value\", \"_val\", \"_amt\", \"_amount\"];\n\nfunction camelToSnake(s: string): string {\n return s.replace(/([a-z0-9])([A-Z])/g, \"$1_$2\").toLowerCase();\n}\n\nfunction normalize(s: string): string {\n let result = camelToSnake(s).toLowerCase().trim();\n for (const prefix of AGG_PREFIXES) {\n if (result.startsWith(prefix) && result.length > prefix.length) {\n result = result.slice(prefix.length);\n break;\n }\n }\n for (const suffix of NOISE_SUFFIXES) {\n if (result.endsWith(suffix) && result.length > suffix.length) {\n result = result.slice(0, -suffix.length);\n break;\n }\n }\n return result;\n}\n\nfunction matchExact(column: string, catalog: SemanticField[]): SemanticField | null {\n const lower = column.toLowerCase();\n return catalog.find((f) => f.name.toLowerCase() === lower) ?? null;\n}\n\nfunction matchNormalized(column: string, catalog: SemanticField[]): SemanticField | null {\n const norm = normalize(column);\n return catalog.find((f) => normalize(f.name) === norm) ?? null;\n}\n\nfunction matchDisplayName(column: string, catalog: SemanticField[]): SemanticField | null {\n const lower = normalize(column).replace(/_/g, \" \");\n if (lower.length < 3) return null;\n\n return (\n catalog.find((f) => f.displayName.toLowerCase().includes(lower)) ??\n catalog.find((f) => f.description.toLowerCase().includes(lower)) ??\n null\n );\n}\n\n/**\n * Best-effort match of a single column name against the catalog.\n */\nexport function matchField(column: string, catalog: SemanticField[]): { field: SemanticField | null; confidence: MatchConfidence } {\n const exact = matchExact(column, catalog);\n if (exact) return { field: exact, confidence: \"exact\" };\n\n const normalized = matchNormalized(column, catalog);\n if (normalized) return { field: normalized, confidence: \"fuzzy\" };\n\n const display = matchDisplayName(column, catalog);\n if (display) return { field: display, confidence: \"fuzzy\" };\n\n return { field: null, confidence: \"manual\" };\n}\n\n/**\n * Match an array of column names against the semantic layer field catalog.\n * Uses three layers: exact name match, normalized match, then display name match.\n */\nexport function matchFields(columns: string[], catalog: SemanticField[]): FieldMatch[] {\n return columns.map((column) => {\n const { field, confidence } = matchField(column, catalog);\n return { column, suggestedField: field, confidence };\n });\n}\n\n/**\n * Analyze chart data to classify columns as dimensions (string/date values)\n * or metrics (numeric values). Used by the inspector modal to build the\n * query builder UI instead of a flat column-to-field mapping.\n */\nexport function analyzeChartData(\n columns: string[],\n sampleValues: Record<string, unknown>[],\n): ChartAnalysis {\n const dimensionColumns: string[] = [];\n const metricColumns: string[] = [];\n\n for (const col of columns) {\n const values = sampleValues\n .map((row) => row[col])\n .filter((v) => v !== null && v !== undefined);\n\n if (values.length === 0) {\n dimensionColumns.push(col);\n continue;\n }\n\n const numericCount = values.filter((v) => typeof v === \"number\" || (typeof v === \"string\" && !isNaN(Number(v)) && v.trim() !== \"\")).length;\n const isNumeric = numericCount / values.length > 0.5;\n\n if (isNumeric) {\n metricColumns.push(col);\n } else {\n dimensionColumns.push(col);\n }\n }\n\n return { dimensionColumns, metricColumns };\n}\n","import type { SemanticField, TimeGrain } from \"../types\";\n\nexport interface FieldMapping {\n column: string;\n field: SemanticField | null;\n}\n\nexport interface DimensionMapping {\n column: string;\n field: SemanticField;\n}\n\nexport interface MigrationConfig {\n componentLabel: string;\n dimensions: DimensionMapping[];\n metrics: SemanticField[];\n grain: TimeGrain | null;\n originalMetricColumns: string[];\n}\n\n/**\n * Generate a ready-to-paste Lovable prompt that tells the AI how to migrate\n * a component from hardcoded data to a useSemanticQuery() call.\n *\n * Understands the distinction between dimensions (groupBy) and metrics (values),\n * and produces correct query config with data reshaping instructions.\n */\nexport function generateMigrationPrompt(config: MigrationConfig): string {\n const { componentLabel, dimensions, metrics, grain, originalMetricColumns } = config;\n\n if (dimensions.length === 0 && metrics.length === 0) {\n return `Replace the sample/hardcoded data in the \"${componentLabel}\" component with live data from the semantic layer using useSemanticQuery. Use the DataCatalog to find the right field names.`;\n }\n\n const parts: string[] = [\n `Replace the sample/hardcoded data in the \"${componentLabel}\" component with a useSemanticQuery call using:`,\n \"\",\n ];\n\n if (metrics.length > 0) {\n parts.push(` metrics: [${metrics.map((m) => `'${m.name}'`).join(\", \")}]`);\n }\n\n if (dimensions.length > 0) {\n const groupBy = dimensions.map((d) => d.field.name);\n parts.push(` groupBy: [${groupBy.map((n) => `'${n}'`).join(\", \")}]`);\n }\n\n if (grain) {\n parts.push(` grain: '${grain}'`);\n }\n\n parts.push(\"\");\n\n // Explain query result shape\n const sampleRow: string[] = [];\n for (const d of dimensions) {\n sampleRow.push(`${d.field.name}: \"...\"`);\n }\n for (const m of metrics) {\n sampleRow.push(`${m.name}: 1234`);\n }\n\n parts.push(\"The query returns rows like:\");\n parts.push(` { ${sampleRow.join(\", \")} }`);\n parts.push(\"\");\n\n // Explain how to map to the chart's expected format\n parts.push(\"Map to the chart's expected format:\");\n for (const d of dimensions) {\n parts.push(` X-axis / category: \"${d.field.name}\" (was \"${d.column}\" in the hardcoded data)`);\n }\n\n if (metrics.length > 0 && originalMetricColumns.length > 0) {\n parts.push(` Series / values: each metric (${metrics.map((m) => `\"${m.name}\"`).join(\", \")}) becomes a line/area/bar in the chart`);\n parts.push(` (replaces the old columns: ${originalMetricColumns.map((c) => `\"${c}\"`).join(\", \")})`);\n }\n\n parts.push(\"\");\n parts.push(\n \"Remove the old hardcoded/sample data and any fetch logic it used. \" +\n \"Use the data, isLoading, and error values from useSemanticQuery to render the component. \" +\n \"Show a loading spinner while isLoading is true. Show an error message if error is not null.\",\n );\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Legacy prompt generator for backwards compatibility.\n * Converts flat column-to-field mappings into the new MigrationConfig format.\n */\nexport function generateMigrationPromptLegacy(\n componentLabel: string,\n mappings: FieldMapping[],\n): string {\n const resolved = mappings.filter((m) => m.field !== null) as Array<{\n column: string;\n field: SemanticField;\n }>;\n\n const dimensions: DimensionMapping[] = resolved\n .filter((m) => m.field.type === \"dimension\" || m.field.type === \"time_dimension\")\n .map((m) => ({ column: m.column, field: m.field }));\n\n const metricFields = resolved\n .filter((m) => m.field.type === \"metric\")\n .map((m) => m.field);\n\n const hasTime = dimensions.some((d) => d.field.type === \"time_dimension\");\n\n return generateMigrationPrompt({\n componentLabel,\n dimensions,\n metrics: metricFields,\n grain: hasTime ? \"month\" : null,\n originalMetricColumns: resolved\n .filter((m) => m.field.type === \"metric\")\n .map((m) => m.column),\n });\n}\n","import React, { useState, useMemo, useCallback, useEffect, useContext } from \"react\";\nimport { InspectableRegistry, InspectableRegistryContext } from \"./inspectable\";\nimport type { InspectableEntry } from \"./inspectable\";\nimport { analyzeChartData, matchField } from \"./field-matcher\";\nimport { generateMigrationPrompt } from \"./prompt-generator\";\nimport type { DimensionMapping, MigrationConfig } from \"./prompt-generator\";\nimport type { SemanticField, TimeGrain } from \"../types\";\nimport { useMetrics } from \"../react/hooks\";\n\nexport interface DataInspectorProps {\n children: React.ReactNode;\n}\n\n/**\n * Dev-mode overlay that wraps your app in an InspectableRegistry and provides\n * a floating toggle + inspector modal for data migration.\n * Renders the registry context so <Inspectable> children can register.\n */\nexport function DataInspector({ children }: DataInspectorProps) {\n return (\n <InspectableRegistry>\n <InspectorOverlay />\n {children}\n </InspectableRegistry>\n );\n}\n\n// ─── Internal overlay ──────────────────────────────────────────────────────────\n\nfunction InspectorOverlay() {\n const registry = useContext(InspectableRegistryContext);\n if (!registry) return null;\n\n const { inspectActive, setInspectActive, selectedId, setSelectedId, entries } = registry;\n\n useEffect(() => {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.ctrlKey && e.shiftKey && e.key === \"I\") {\n e.preventDefault();\n setInspectActive(!inspectActive);\n }\n }\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [inspectActive, setInspectActive]);\n\n const selectedEntry = selectedId ? entries.get(selectedId) ?? null : null;\n\n return (\n <>\n <ToggleButton\n active={inspectActive}\n count={entries.size}\n onToggle={() => {\n setInspectActive(!inspectActive);\n if (inspectActive) setSelectedId(null);\n }}\n />\n {selectedEntry && (\n <InspectorModal\n entry={selectedEntry}\n onClose={() => setSelectedId(null)}\n />\n )}\n </>\n );\n}\n\n// ─── Toggle button ─────────────────────────────────────────────────────────────\n\nfunction ToggleButton({\n active,\n count,\n onToggle,\n}: {\n active: boolean;\n count: number;\n onToggle: () => void;\n}) {\n return (\n <button\n onClick={onToggle}\n title={active ? \"Exit inspect mode (Ctrl+Shift+I)\" : \"Enter inspect mode (Ctrl+Shift+I)\"}\n style={{\n position: \"fixed\",\n bottom: 20,\n right: 20,\n zIndex: 99999,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"8px 16px\",\n fontSize: 13,\n fontWeight: 600,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: active ? \"#fff\" : \"#374151\",\n backgroundColor: active ? \"#3b82f6\" : \"#fff\",\n border: `1px solid ${active ? \"#2563eb\" : \"#d1d5db\"}`,\n borderRadius: 999,\n cursor: \"pointer\",\n boxShadow: \"0 2px 8px rgba(0,0,0,0.12)\",\n transition: \"all 0.15s ease\",\n }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n {active ? \"Inspecting\" : \"Inspect Data\"}\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minWidth: 18,\n height: 18,\n fontSize: 11,\n fontWeight: 700,\n borderRadius: 999,\n backgroundColor: active ? \"rgba(255,255,255,0.25)\" : \"#e5e7eb\",\n color: active ? \"#fff\" : \"#6b7280\",\n padding: \"0 5px\",\n }}\n >\n {count}\n </span>\n </button>\n );\n}\n\n// ─── Inspector modal ───────────────────────────────────────────────────────────\n\nfunction InspectorModal({\n entry,\n onClose,\n}: {\n entry: InspectableEntry;\n onClose: () => void;\n}) {\n const { fields: catalog, error: catalogError, isLoading: catalogLoading } = useMetrics();\n\n const analysis = useMemo(\n () => analyzeChartData(entry.columns, entry.sampleValues),\n [entry.columns, entry.sampleValues],\n );\n\n const dimensions = catalog.filter((f) => f.type === \"dimension\" || f.type === \"time_dimension\");\n const metrics = catalog.filter((f) => f.type === \"metric\");\n\n // Auto-match dimension columns to catalog fields\n const initialDimMappings = useMemo(() => {\n const map = new Map<string, SemanticField | null>();\n for (const col of analysis.dimensionColumns) {\n const { field } = matchField(col, dimensions);\n map.set(col, field);\n }\n return map;\n }, [analysis.dimensionColumns, dimensions]);\n\n const [dimMappings, setDimMappings] = useState<Map<string, SemanticField | null>>(initialDimMappings);\n useEffect(() => { setDimMappings(initialDimMappings); }, [initialDimMappings]);\n\n // Selected metrics (user picks from catalog)\n const [selectedMetrics, setSelectedMetrics] = useState<SemanticField[]>([]);\n\n // Grain\n const hasTimeDim = Array.from(dimMappings.values()).some((f) => f?.type === \"time_dimension\");\n const [grain, setGrain] = useState<TimeGrain | \"\">(\"month\");\n\n const [copied, setCopied] = useState(false);\n\n const handleDimChange = useCallback((col: string, field: SemanticField | null) => {\n setDimMappings((prev) => {\n const next = new Map(prev);\n next.set(col, field);\n return next;\n });\n }, []);\n\n const handleToggleMetric = useCallback((field: SemanticField) => {\n setSelectedMetrics((prev) =>\n prev.some((m) => m.name === field.name)\n ? prev.filter((m) => m.name !== field.name)\n : [...prev, field],\n );\n }, []);\n\n const handleGenerate = useCallback(async () => {\n const resolvedDims: DimensionMapping[] = [];\n for (const [col, field] of dimMappings) {\n if (field) resolvedDims.push({ column: col, field });\n }\n\n const migrationConfig: MigrationConfig = {\n componentLabel: entry.label,\n dimensions: resolvedDims,\n metrics: selectedMetrics,\n grain: hasTimeDim && grain ? (grain as TimeGrain) : null,\n originalMetricColumns: analysis.metricColumns,\n };\n\n const prompt = generateMigrationPrompt(migrationConfig);\n try {\n await navigator.clipboard.writeText(prompt);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n const ta = document.createElement(\"textarea\");\n ta.value = prompt;\n document.body.appendChild(ta);\n ta.select();\n document.execCommand(\"copy\");\n document.body.removeChild(ta);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n }, [entry, dimMappings, selectedMetrics, grain, hasTimeDim, analysis.metricColumns]);\n\n const canGenerate = selectedMetrics.length > 0 || Array.from(dimMappings.values()).some(Boolean);\n\n return (\n <>\n <div onClick={onClose} style={backdropStyle} />\n <div style={modalStyle}>\n <div style={modalHeaderStyle}>\n <div>\n <div style={{ fontSize: 16, fontWeight: 700, color: \"#111827\" }}>{entry.label}</div>\n <div style={{ fontSize: 12, color: \"#6b7280\", marginTop: 2 }}>\n Source: {entry.currentSource}\n </div>\n </div>\n <button onClick={onClose} style={closeBtnStyle}>×</button>\n </div>\n\n <div style={{ overflow: \"auto\", flex: 1 }}>\n {/* Data preview */}\n {entry.sampleValues.length > 0 && (\n <div style={sectionStyle}>\n <div style={sectionTitleStyle}>Current Data Preview</div>\n <div style={{ overflow: \"auto\" }}>\n <table style={previewTableStyle}>\n <thead>\n <tr>\n {entry.columns.map((col) => (\n <th key={col} style={previewThStyle}>{col}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {entry.sampleValues.map((row, i) => (\n <tr key={i}>\n {entry.columns.map((col) => (\n <td key={col} style={previewTdStyle}>\n {row[col] === null || row[col] === undefined ? \"—\" : String(row[col])}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Auto-detection summary */}\n <div style={{ marginTop: 8, fontSize: 11, color: \"#9ca3af\" }}>\n Detected: {analysis.dimensionColumns.length} dimension column{analysis.dimensionColumns.length !== 1 ? \"s\" : \"\"} ({analysis.dimensionColumns.join(\", \") || \"none\"})\n {\" · \"}{analysis.metricColumns.length} value column{analysis.metricColumns.length !== 1 ? \"s\" : \"\"} ({analysis.metricColumns.join(\", \") || \"none\"})\n </div>\n </div>\n )}\n\n {/* Catalog status */}\n {catalog.length === 0 && (\n <div style={{ ...sectionStyle, textAlign: \"center\" }}>\n <div style={{ fontSize: 12, color: \"#9ca3af\" }}>\n {catalogLoading\n ? \"Loading catalog...\"\n : catalogError\n ? `Error loading catalog: ${catalogError}`\n : \"No semantic layer catalog available. Connect to the gateway to enable smart matching.\"}\n </div>\n </div>\n )}\n\n {/* Dimensions (Group By) */}\n {catalog.length > 0 && (\n <div style={sectionStyle}>\n <div style={sectionTitleStyle}>Dimensions (Group By)</div>\n <div style={{ fontSize: 11, color: \"#9ca3af\", marginBottom: 8 }}>\n What categories define the rows? (X-axis, grouping)\n </div>\n {analysis.dimensionColumns.length === 0 ? (\n <div style={{ fontSize: 12, color: \"#9ca3af\", fontStyle: \"italic\" }}>\n No dimension columns detected in the data.\n </div>\n ) : (\n <table style={{ width: \"100%\", borderCollapse: \"collapse\", fontSize: 13 }}>\n <thead>\n <tr>\n <th style={mappingThStyle}>Current Column</th>\n <th style={mappingThStyle}>Sample Values</th>\n <th style={mappingThStyle}>Semantic Layer Dimension</th>\n </tr>\n </thead>\n <tbody>\n {analysis.dimensionColumns.map((col) => {\n const sampleVals = entry.sampleValues\n .map((row) => row[col])\n .filter((v) => v !== null && v !== undefined)\n .slice(0, 4)\n .map(String);\n return (\n <tr key={col}>\n <td style={mappingTdStyle}>\n <code style={{ fontSize: 12, color: \"#6366f1\", fontFamily: \"monospace\" }}>{col}</code>\n </td>\n <td style={{ ...mappingTdStyle, fontSize: 11, color: \"#9ca3af\" }}>\n {sampleVals.join(\", \")}{sampleVals.length >= 4 ? \", ...\" : \"\"}\n </td>\n <td style={mappingTdStyle}>\n <select\n value={dimMappings.get(col)?.name ?? \"\"}\n onChange={(e) => {\n const field = dimensions.find((f) => f.name === e.target.value) ?? null;\n handleDimChange(col, field);\n }}\n style={selectStyle}\n >\n <option value=\"\">-- select dimension --</option>\n {dimensions.map((f) => (\n <option key={f.name} value={f.name}>\n {f.displayName} ({f.type}) — {f.name}\n </option>\n ))}\n </select>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n )}\n\n {/* Grain picker */}\n {hasTimeDim && (\n <div style={{ marginTop: 10, display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <label style={{ fontSize: 12, fontWeight: 600, color: \"#374151\" }}>Time Grain:</label>\n <select\n value={grain}\n onChange={(e) => setGrain(e.target.value as TimeGrain | \"\")}\n style={{ ...selectStyle, width: \"auto\" }}\n >\n <option value=\"day\">Day</option>\n <option value=\"week\">Week</option>\n <option value=\"month\">Month</option>\n <option value=\"quarter\">Quarter</option>\n <option value=\"year\">Year</option>\n </select>\n </div>\n )}\n </div>\n )}\n\n {/* Metrics (Values) */}\n {catalog.length > 0 && (\n <div style={sectionStyle}>\n <div style={sectionTitleStyle}>Metrics (Values)</div>\n <div style={{ fontSize: 11, color: \"#9ca3af\", marginBottom: 8 }}>\n Which metrics should be queried? These become the series/values in the chart.\n {analysis.metricColumns.length > 0 && (\n <span> (replaces: {analysis.metricColumns.join(\", \")})</span>\n )}\n </div>\n {metrics.length === 0 ? (\n <div style={{ fontSize: 12, color: \"#9ca3af\", fontStyle: \"italic\" }}>\n No metrics available in the catalog.\n </div>\n ) : (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4, maxHeight: 200, overflow: \"auto\" }}>\n {metrics.map((m) => {\n const isSelected = selectedMetrics.some((s) => s.name === m.name);\n return (\n <label\n key={m.name}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"4px 8px\",\n borderRadius: 4,\n cursor: \"pointer\",\n backgroundColor: isSelected ? \"#eff6ff\" : \"transparent\",\n border: isSelected ? \"1px solid #bfdbfe\" : \"1px solid transparent\",\n fontSize: 12,\n }}\n >\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={() => handleToggleMetric(m)}\n style={{ margin: 0 }}\n />\n <span style={{ fontWeight: 500, color: \"#111827\" }}>{m.displayName}</span>\n <code style={{ fontSize: 10, color: \"#6366f1\", fontFamily: \"monospace\" }}>{m.name}</code>\n {m.category && (\n <span style={{ marginLeft: \"auto\", fontSize: 10, color: \"#9ca3af\" }}>{m.category}</span>\n )}\n </label>\n );\n })}\n </div>\n )}\n\n {selectedMetrics.length > 0 && (\n <div style={{ marginTop: 8, fontSize: 11, color: \"#6b7280\" }}>\n Selected: {selectedMetrics.map((m) => m.displayName).join(\", \")}\n </div>\n )}\n </div>\n )}\n\n {/* Preview of the query */}\n {canGenerate && (\n <div style={sectionStyle}>\n <div style={sectionTitleStyle}>Query Preview</div>\n <pre style={{\n fontSize: 11,\n fontFamily: \"monospace\",\n backgroundColor: \"#f9fafb\",\n border: \"1px solid #e5e7eb\",\n borderRadius: 6,\n padding: \"8px 12px\",\n whiteSpace: \"pre-wrap\",\n color: \"#374151\",\n margin: 0,\n }}>\n {`useSemanticQuery({${selectedMetrics.length > 0 ? `\\n metrics: [${selectedMetrics.map((m) => `'${m.name}'`).join(\", \")}],` : \"\"}${\n Array.from(dimMappings.values()).some(Boolean)\n ? `\\n groupBy: [${Array.from(dimMappings.values()).filter(Boolean).map((f) => `'${f!.name}'`).join(\", \")}],`\n : \"\"\n }${hasTimeDim && grain ? `\\n grain: '${grain}',` : \"\"}\n})`}\n </pre>\n </div>\n )}\n </div>\n\n {/* Generate button */}\n <div style={{ padding: \"12px 20px\", borderTop: \"1px solid #e5e7eb\" }}>\n <button\n onClick={handleGenerate}\n disabled={!canGenerate}\n style={{\n ...generateBtnStyle,\n opacity: canGenerate ? 1 : 0.5,\n cursor: canGenerate ? \"pointer\" : \"not-allowed\",\n }}\n >\n {copied ? \"Copied to clipboard!\" : \"Generate Migration Prompt\"}\n </button>\n </div>\n </div>\n </>\n );\n}\n\n// ─── Styles ────────────────────────────────────────────────────────────────────\n\nconst backdropStyle: React.CSSProperties = {\n position: \"fixed\",\n inset: 0,\n backgroundColor: \"rgba(0,0,0,0.3)\",\n zIndex: 100000,\n};\n\nconst modalStyle: React.CSSProperties = {\n position: \"fixed\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 100001,\n width: \"min(700px, 90vw)\",\n maxHeight: \"85vh\",\n backgroundColor: \"#fff\",\n borderRadius: 12,\n boxShadow: \"0 8px 30px rgba(0,0,0,0.2)\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n};\n\nconst modalHeaderStyle: React.CSSProperties = {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"flex-start\",\n padding: \"16px 20px\",\n borderBottom: \"1px solid #e5e7eb\",\n};\n\nconst closeBtnStyle: React.CSSProperties = {\n background: \"none\",\n border: \"none\",\n fontSize: 22,\n color: \"#6b7280\",\n cursor: \"pointer\",\n padding: \"0 4px\",\n lineHeight: 1,\n};\n\nconst sectionStyle: React.CSSProperties = {\n padding: \"12px 20px\",\n};\n\nconst sectionTitleStyle: React.CSSProperties = {\n fontSize: 11,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n color: \"#6b7280\",\n marginBottom: 4,\n};\n\nconst previewTableStyle: React.CSSProperties = {\n width: \"100%\",\n borderCollapse: \"collapse\",\n fontSize: 12,\n};\n\nconst previewThStyle: React.CSSProperties = {\n padding: \"4px 8px\",\n textAlign: \"left\",\n fontWeight: 600,\n color: \"#374151\",\n backgroundColor: \"#f9fafb\",\n borderBottom: \"1px solid #e5e7eb\",\n whiteSpace: \"nowrap\",\n};\n\nconst previewTdStyle: React.CSSProperties = {\n padding: \"4px 8px\",\n color: \"#6b7280\",\n borderBottom: \"1px solid #f3f4f6\",\n whiteSpace: \"nowrap\",\n maxWidth: 150,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n};\n\nconst mappingThStyle: React.CSSProperties = {\n padding: \"6px 8px\",\n textAlign: \"left\",\n fontWeight: 600,\n fontSize: 11,\n color: \"#6b7280\",\n borderBottom: \"1px solid #e5e7eb\",\n};\n\nconst mappingTdStyle: React.CSSProperties = {\n padding: \"6px 8px\",\n borderBottom: \"1px solid #f3f4f6\",\n verticalAlign: \"middle\",\n};\n\nconst selectStyle: React.CSSProperties = {\n width: \"100%\",\n padding: \"4px 6px\",\n fontSize: 12,\n border: \"1px solid #d1d5db\",\n borderRadius: 4,\n backgroundColor: \"#fff\",\n color: \"#111827\",\n};\n\nconst generateBtnStyle: React.CSSProperties = {\n width: \"100%\",\n padding: \"10px 16px\",\n fontSize: 14,\n fontWeight: 600,\n color: \"#fff\",\n backgroundColor: \"#3b82f6\",\n border: \"none\",\n borderRadius: 8,\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/metric-picker.tsx","../src/components/results-table.tsx","../src/components/data-catalog.tsx","../src/components/admin-dashboard.tsx","../src/components/inspectable.tsx","../src/components/field-matcher.ts","../src/components/prompt-generator.ts","../src/components/report-prompt-generator.ts","../src/components/data-inspector.tsx"],"names":["jsx","jsxs","useState","useMemo","rootStyle","headingStyle","subStyle","tableStyle","thStyle","tdStyle","badgeStyle","emptyStyle","useCallback","useContext","useEffect","Fragment","useRef","selectStyle","inputStyle"],"mappings":"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","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","import React, { useState, useMemo, useCallback } from \"react\";\nimport { useMetrics } from \"../react/hooks\";\nimport type { SemanticField } from \"../types\";\n\nexport interface DataCatalogProps {\n className?: string;\n /** Show a \"copy name\" button for each field. Default: true. */\n showCopyButton?: boolean;\n /** Filter to only show certain field types. */\n fieldTypes?: Array<\"metric\" | \"dimension\" | \"time_dimension\">;\n}\n\nconst rootStyle: React.CSSProperties = {\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n maxWidth: 960,\n margin: \"0 auto\",\n padding: 24,\n};\n\nconst headingStyle: React.CSSProperties = {\n fontSize: 24, fontWeight: 700, color: \"#111827\", margin: \"0 0 4px\",\n};\n\nconst subStyle: React.CSSProperties = {\n fontSize: 14, color: \"#6b7280\", margin: \"0 0 20px\",\n};\n\nconst searchBarStyle: React.CSSProperties = {\n display: \"flex\", gap: 8, marginBottom: 20,\n};\n\nconst searchInput: React.CSSProperties = {\n flex: 1, padding: \"10px 14px\", fontSize: 14, border: \"1px solid #d1d5db\",\n borderRadius: 8, outline: \"none\", boxSizing: \"border-box\",\n};\n\nconst filterBtn = (active: boolean): React.CSSProperties => ({\n padding: \"8px 14px\", fontSize: 13, fontWeight: 500, borderRadius: 6,\n border: \"1px solid \" + (active ? \"#3b82f6\" : \"#d1d5db\"),\n backgroundColor: active ? \"#eff6ff\" : \"#fff\",\n color: active ? \"#1d4ed8\" : \"#374151\",\n cursor: \"pointer\",\n});\n\nconst categoryStyle: React.CSSProperties = {\n marginBottom: 24,\n};\n\nconst categoryHeader: React.CSSProperties = {\n fontSize: 13, fontWeight: 600, textTransform: \"uppercase\", letterSpacing: \"0.05em\",\n color: \"#6b7280\", marginBottom: 8, paddingBottom: 6, borderBottom: \"1px solid #e5e7eb\",\n};\n\nconst fieldCard: React.CSSProperties = {\n display: \"flex\", justifyContent: \"space-between\", alignItems: \"flex-start\",\n padding: \"10px 12px\", borderRadius: 6, marginBottom: 4,\n backgroundColor: \"#fafafa\", border: \"1px solid #f3f4f6\",\n};\n\nconst fieldNameStyle: React.CSSProperties = {\n fontSize: 15, fontWeight: 600, color: \"#111827\",\n};\n\nconst fieldDescStyle: React.CSSProperties = {\n fontSize: 13, color: \"#6b7280\", marginTop: 2,\n};\n\nconst codeName: React.CSSProperties = {\n fontSize: 12, color: \"#6366f1\", fontFamily: \"monospace\", marginTop: 2,\n};\n\nconst badgeStyle = (type: string): React.CSSProperties => ({\n display: \"inline-block\", padding: \"2px 8px\", fontSize: 11, fontWeight: 600,\n borderRadius: 9999, whiteSpace: \"nowrap\",\n backgroundColor: type === \"metric\" ? \"#eff6ff\" : type === \"time_dimension\" ? \"#f0fdf4\" : \"#f3f4f6\",\n color: type === \"metric\" ? \"#1d4ed8\" : type === \"time_dimension\" ? \"#15803d\" : \"#6b7280\",\n});\n\nconst copyBtn: React.CSSProperties = {\n padding: \"4px 8px\", fontSize: 11, fontWeight: 500, color: \"#6366f1\",\n backgroundColor: \"#eef2ff\", border: \"1px solid #c7d2fe\", borderRadius: 4,\n cursor: \"pointer\", whiteSpace: \"nowrap\",\n};\n\nconst statsBar: React.CSSProperties = {\n display: \"flex\", gap: 16, marginBottom: 16, fontSize: 14,\n};\n\nconst statItem: React.CSSProperties = {\n display: \"flex\", alignItems: \"center\", gap: 4, color: \"#6b7280\",\n};\n\nconst statNum: React.CSSProperties = { fontWeight: 700, color: \"#111827\" };\n\nconst emptyStyle: React.CSSProperties = {\n padding: 40, textAlign: \"center\", color: \"#9ca3af\", fontSize: 14,\n};\n\ntype TypeFilter = \"all\" | \"metric\" | \"dimension\" | \"time_dimension\";\n\nexport function DataCatalog({ className, showCopyButton = true, fieldTypes }: DataCatalogProps) {\n const { fields, metrics, dimensions, isLoading, error } = useMetrics();\n const [search, setSearch] = useState(\"\");\n const [typeFilter, setTypeFilter] = useState<TypeFilter>(\"all\");\n const [copiedField, setCopiedField] = useState<string | null>(null);\n\n const filtered = useMemo(() => {\n let result = fields;\n if (fieldTypes) result = result.filter((f) => (fieldTypes as string[]).includes(f.type));\n if (typeFilter !== \"all\") result = result.filter((f) => f.type === typeFilter);\n if (search) {\n const q = search.toLowerCase();\n result = result.filter((f) =>\n f.displayName.toLowerCase().includes(q) ||\n f.name.toLowerCase().includes(q) ||\n f.description.toLowerCase().includes(q) ||\n f.category.toLowerCase().includes(q)\n );\n }\n return result;\n }, [fields, fieldTypes, typeFilter, search]);\n\n const grouped = useMemo(() => {\n const map = new Map<string, SemanticField[]>();\n for (const f of filtered) {\n const list = map.get(f.category) || [];\n list.push(f);\n map.set(f.category, list);\n }\n return map;\n }, [filtered]);\n\n const handleCopy = useCallback(async (name: string) => {\n try {\n await navigator.clipboard.writeText(name);\n setCopiedField(name);\n setTimeout(() => setCopiedField(null), 1500);\n } catch {\n // Clipboard API not available in some iframes\n }\n }, []);\n\n if (isLoading) return <div style={{ ...rootStyle, ...emptyStyle }}>Loading data catalog...</div>;\n if (error) return <div style={{ ...rootStyle, padding: 24, color: \"#ef4444\" }}>{error}</div>;\n\n const timeDims = fields.filter((f) => f.type === \"time_dimension\");\n\n return (\n <div style={rootStyle} className={className}>\n <h1 style={headingStyle}>Data Catalog</h1>\n <p style={subStyle}>Browse available metrics and dimensions from the semantic layer</p>\n\n <div style={statsBar}>\n <div style={statItem}><span style={statNum}>{metrics.length}</span> metrics</div>\n <div style={statItem}><span style={statNum}>{dimensions.length - timeDims.length}</span> dimensions</div>\n <div style={statItem}><span style={statNum}>{timeDims.length}</span> time dimensions</div>\n </div>\n\n <div style={searchBarStyle}>\n <input\n style={searchInput}\n placeholder=\"Search by name, description, or category...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n <button style={filterBtn(typeFilter === \"all\")} onClick={() => setTypeFilter(\"all\")}>All</button>\n <button style={filterBtn(typeFilter === \"metric\")} onClick={() => setTypeFilter(\"metric\")}>Metrics</button>\n <button style={filterBtn(typeFilter === \"dimension\")} onClick={() => setTypeFilter(\"dimension\")}>Dimensions</button>\n <button style={filterBtn(typeFilter === \"time_dimension\")} onClick={() => setTypeFilter(\"time_dimension\")}>Time</button>\n </div>\n\n {Array.from(grouped.entries()).map(([category, categoryFields]) => (\n <div key={category} style={categoryStyle}>\n <div style={categoryHeader}>{category} ({categoryFields.length})</div>\n {categoryFields.map((f) => (\n <div key={f.id} style={fieldCard}>\n <div style={{ flex: 1 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <span style={fieldNameStyle}>{f.displayName}</span>\n <span style={badgeStyle(f.type)}>{f.type}</span>\n </div>\n {f.description && <div style={fieldDescStyle}>{f.description}</div>}\n <div style={codeName}>{f.name}</div>\n </div>\n {showCopyButton && (\n <button style={copyBtn} onClick={() => handleCopy(f.name)}>\n {copiedField === f.name ? \"Copied!\" : \"Copy name\"}\n </button>\n )}\n </div>\n ))}\n </div>\n ))}\n\n {grouped.size === 0 && (\n <div style={emptyStyle}>\n {search ? \"No fields match your search.\" : \"No data available. The gateway may not be configured yet.\"}\n </div>\n )}\n </div>\n );\n}\n","import React, { useState, useCallback, useMemo } from \"react\";\nimport { useAdminFields, useAdminRoles, useAdminUsers } from \"../react/admin-hooks\";\nimport { useAuth } from \"../react/hooks\";\nimport type { CuratedField, AccessRole, UserRoleAssignment } from \"../types\";\n\nexport interface AdminDashboardProps {\n className?: string;\n}\n\n// ─── Shared styles ────────────────────────────────────────────────────────────\n\nconst rootStyle: React.CSSProperties = {\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n maxWidth: 960,\n margin: \"0 auto\",\n padding: 24,\n};\n\nconst headingStyle: React.CSSProperties = {\n fontSize: 24, fontWeight: 700, color: \"#111827\", margin: \"0 0 4px\",\n};\n\nconst subStyle: React.CSSProperties = {\n fontSize: 14, color: \"#6b7280\", margin: \"0 0 20px\",\n};\n\nconst tabBarStyle: React.CSSProperties = {\n display: \"flex\", gap: 0, borderBottom: \"1px solid #e5e7eb\", marginBottom: 24,\n};\n\nconst tabBase: React.CSSProperties = {\n padding: \"10px 20px\", fontSize: 14, fontWeight: 500, cursor: \"pointer\",\n background: \"none\", border: \"none\", borderBottom: \"2px solid transparent\",\n color: \"#6b7280\",\n};\n\nconst tabActive: React.CSSProperties = {\n ...tabBase, color: \"#111827\", borderBottomColor: \"#3b82f6\",\n};\n\nconst tableStyle: React.CSSProperties = {\n width: \"100%\", borderCollapse: \"collapse\", fontSize: 14,\n};\n\nconst thStyle: React.CSSProperties = {\n padding: \"10px 12px\", textAlign: \"left\", fontWeight: 600, fontSize: 12,\n color: \"#6b7280\", backgroundColor: \"#f9fafb\", borderBottom: \"1px solid #e5e7eb\",\n};\n\nconst tdStyle: React.CSSProperties = {\n padding: \"8px 12px\", borderBottom: \"1px solid #f3f4f6\", color: \"#111827\",\n};\n\nconst btnPrimary: React.CSSProperties = {\n padding: \"8px 16px\", fontSize: 14, fontWeight: 500, color: \"#fff\",\n backgroundColor: \"#3b82f6\", border: \"none\", borderRadius: 6, cursor: \"pointer\",\n};\n\nconst btnDanger: React.CSSProperties = {\n ...btnPrimary, backgroundColor: \"#ef4444\",\n};\n\nconst btnSecondary: React.CSSProperties = {\n ...btnPrimary, backgroundColor: \"#fff\", color: \"#374151\",\n border: \"1px solid #d1d5db\",\n};\n\nconst inputStyle: React.CSSProperties = {\n padding: \"6px 10px\", fontSize: 14, border: \"1px solid #d1d5db\",\n borderRadius: 6, width: \"100%\", boxSizing: \"border-box\",\n};\n\nconst selectStyle: React.CSSProperties = { ...inputStyle, width: \"auto\" };\n\nconst cardStyle: React.CSSProperties = {\n border: \"1px solid #e5e7eb\", borderRadius: 8, padding: 16, marginBottom: 16,\n backgroundColor: \"#fff\",\n};\n\nconst errorBanner: React.CSSProperties = {\n padding: \"10px 14px\", backgroundColor: \"#fef2f2\", color: \"#b91c1c\",\n borderRadius: 6, fontSize: 14, marginBottom: 16,\n};\n\nconst badgeStyle: React.CSSProperties = {\n display: \"inline-block\", padding: \"2px 8px\", fontSize: 11, fontWeight: 600,\n borderRadius: 9999, backgroundColor: \"#eff6ff\", color: \"#1d4ed8\",\n};\n\nconst badgeGreen: React.CSSProperties = { ...badgeStyle, backgroundColor: \"#f0fdf4\", color: \"#15803d\" };\nconst badgeGray: React.CSSProperties = { ...badgeStyle, backgroundColor: \"#f3f4f6\", color: \"#6b7280\" };\n\nconst checkboxStyle: React.CSSProperties = { width: 16, height: 16, cursor: \"pointer\" };\n\nconst emptyStyle: React.CSSProperties = {\n padding: 24, textAlign: \"center\", color: \"#9ca3af\", fontSize: 14,\n};\n\n// ─── Fields Tab ───────────────────────────────────────────────────────────────\n\nfunction FieldsTab() {\n const { fields, isLoading, error, createField, updateField, deleteField } = useAdminFields();\n const [showAdd, setShowAdd] = useState(false);\n const [newName, setNewName] = useState(\"\");\n const [newType, setNewType] = useState<string>(\"metric\");\n const [newDisplay, setNewDisplay] = useState(\"\");\n const [newDesc, setNewDesc] = useState(\"\");\n const [actionError, setActionError] = useState<string | null>(null);\n\n const handleAdd = useCallback(async () => {\n if (!newName.trim()) return;\n setActionError(null);\n try {\n await createField({\n field_name: newName.trim(),\n field_type: newType,\n display_name: newDisplay.trim() || undefined,\n description: newDesc.trim() || undefined,\n });\n setNewName(\"\"); setNewDisplay(\"\"); setNewDesc(\"\"); setShowAdd(false);\n } catch (err) {\n setActionError(err instanceof Error ? err.message : \"Failed to create field\");\n }\n }, [newName, newType, newDisplay, newDesc, createField]);\n\n const handleToggle = useCallback(async (f: CuratedField) => {\n try { await updateField({ id: f.id, is_active: !f.is_active }); }\n catch (err) { setActionError(err instanceof Error ? err.message : \"Failed to update\"); }\n }, [updateField]);\n\n const handleDelete = useCallback(async (id: number) => {\n if (!confirm(\"Delete this field? This also removes it from all roles.\")) return;\n try { await deleteField(id); }\n catch (err) { setActionError(err instanceof Error ? err.message : \"Failed to delete\"); }\n }, [deleteField]);\n\n if (isLoading) return <div style={emptyStyle}>Loading fields...</div>;\n if (error) return <div style={errorBanner}>{error}</div>;\n\n return (\n <div>\n {actionError && <div style={errorBanner}>{actionError}</div>}\n\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: 16 }}>\n <span style={{ fontSize: 14, color: \"#6b7280\" }}>{fields.length} curated field{fields.length !== 1 ? \"s\" : \"\"}</span>\n <button style={btnPrimary} onClick={() => setShowAdd(!showAdd)}>\n {showAdd ? \"Cancel\" : \"+ Add field\"}\n </button>\n </div>\n\n {showAdd && (\n <div style={cardStyle}>\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr auto 1fr\", gap: 8, marginBottom: 8 }}>\n <input style={inputStyle} placeholder=\"field_name (from dbt)\" value={newName} onChange={(e) => setNewName(e.target.value)} />\n <select style={selectStyle} value={newType} onChange={(e) => setNewType(e.target.value)}>\n <option value=\"metric\">metric</option>\n <option value=\"dimension\">dimension</option>\n <option value=\"time_dimension\">time_dimension</option>\n </select>\n <input style={inputStyle} placeholder=\"Display name (optional)\" value={newDisplay} onChange={(e) => setNewDisplay(e.target.value)} />\n </div>\n <div style={{ display: \"flex\", gap: 8 }}>\n <input style={{ ...inputStyle, flex: 1 }} placeholder=\"Description (optional)\" value={newDesc} onChange={(e) => setNewDesc(e.target.value)} onKeyDown={(e) => e.key === \"Enter\" && handleAdd()} />\n <button style={btnPrimary} onClick={handleAdd}>Save</button>\n </div>\n </div>\n )}\n\n <table style={tableStyle}>\n <thead>\n <tr>\n <th style={thStyle}>Field Name</th>\n <th style={thStyle}>Type</th>\n <th style={thStyle}>Display Name</th>\n <th style={thStyle}>Active</th>\n <th style={{ ...thStyle, textAlign: \"right\" }}>Actions</th>\n </tr>\n </thead>\n <tbody>\n {fields.map((f) => (\n <tr key={f.id}>\n <td style={tdStyle}><code style={{ fontSize: 13 }}>{f.field_name}</code></td>\n <td style={tdStyle}>\n <span style={f.field_type === \"metric\" ? badgeStyle : f.field_type === \"time_dimension\" ? badgeGreen : badgeGray}>\n {f.field_type}\n </span>\n </td>\n <td style={tdStyle}>{f.display_name || <span style={{ color: \"#9ca3af\" }}>—</span>}</td>\n <td style={tdStyle}>\n <input type=\"checkbox\" checked={f.is_active} onChange={() => handleToggle(f)} style={checkboxStyle} />\n </td>\n <td style={{ ...tdStyle, textAlign: \"right\" }}>\n <button style={{ ...btnDanger, padding: \"4px 10px\", fontSize: 12 }} onClick={() => handleDelete(f.id)}>Delete</button>\n </td>\n </tr>\n ))}\n {fields.length === 0 && (\n <tr><td colSpan={5} style={emptyStyle}>No curated fields yet. Add fields to start restricting access.</td></tr>\n )}\n </tbody>\n </table>\n </div>\n );\n}\n\n// ─── Roles Tab ────────────────────────────────────────────────────────────────\n\nfunction RolesTab() {\n const { roles, isLoading, error, createRole, deleteRole, setRoleFields } = useAdminRoles();\n const { fields } = useAdminFields();\n const [showAdd, setShowAdd] = useState(false);\n const [newName, setNewName] = useState(\"\");\n const [newDesc, setNewDesc] = useState(\"\");\n const [editingRole, setEditingRole] = useState<number | null>(null);\n const [actionError, setActionError] = useState<string | null>(null);\n\n const handleAdd = useCallback(async () => {\n if (!newName.trim()) return;\n setActionError(null);\n try {\n await createRole({ name: newName.trim(), description: newDesc.trim() || undefined });\n setNewName(\"\"); setNewDesc(\"\"); setShowAdd(false);\n } catch (err) {\n setActionError(err instanceof Error ? err.message : \"Failed to create role\");\n }\n }, [newName, newDesc, createRole]);\n\n const handleDelete = useCallback(async (id: number) => {\n if (!confirm(\"Delete this role? Users assigned to it will lose this role's access.\")) return;\n try { await deleteRole(id); }\n catch (err) { setActionError(err instanceof Error ? err.message : \"Failed to delete\"); }\n }, [deleteRole]);\n\n const getFieldIds = (role: AccessRole): Set<number> =>\n new Set((role.role_field_access || []).map((rfa) => rfa.curated_field_id));\n\n const handleToggleField = useCallback(async (role: AccessRole, fieldId: number) => {\n const current = getFieldIds(role);\n if (current.has(fieldId)) current.delete(fieldId);\n else current.add(fieldId);\n setActionError(null);\n try { await setRoleFields(role.id, Array.from(current)); }\n catch (err) { setActionError(err instanceof Error ? err.message : \"Failed to update\"); }\n }, [setRoleFields]);\n\n if (isLoading) return <div style={emptyStyle}>Loading roles...</div>;\n if (error) return <div style={errorBanner}>{error}</div>;\n\n return (\n <div>\n {actionError && <div style={errorBanner}>{actionError}</div>}\n\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: 16 }}>\n <span style={{ fontSize: 14, color: \"#6b7280\" }}>{roles.length} role{roles.length !== 1 ? \"s\" : \"\"}</span>\n <button style={btnPrimary} onClick={() => setShowAdd(!showAdd)}>\n {showAdd ? \"Cancel\" : \"+ Add role\"}\n </button>\n </div>\n\n {showAdd && (\n <div style={cardStyle}>\n <div style={{ display: \"flex\", gap: 8 }}>\n <input style={{ ...inputStyle, flex: 1 }} placeholder=\"Role name\" value={newName} onChange={(e) => setNewName(e.target.value)} />\n <input style={{ ...inputStyle, flex: 2 }} placeholder=\"Description (optional)\" value={newDesc} onChange={(e) => setNewDesc(e.target.value)} onKeyDown={(e) => e.key === \"Enter\" && handleAdd()} />\n <button style={btnPrimary} onClick={handleAdd}>Save</button>\n </div>\n </div>\n )}\n\n {roles.map((role) => {\n const assignedIds = getFieldIds(role);\n const isEditing = editingRole === role.id;\n\n return (\n <div key={role.id} style={cardStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: isEditing ? 12 : 0 }}>\n <div>\n <strong style={{ fontSize: 16 }}>{role.name}</strong>\n {role.is_default && <span style={{ ...badgeGreen, marginLeft: 8 }}>default</span>}\n <span style={{ ...badgeGray, marginLeft: 8 }}>{assignedIds.size} field{assignedIds.size !== 1 ? \"s\" : \"\"}</span>\n {role.description && <div style={{ fontSize: 13, color: \"#6b7280\", marginTop: 2 }}>{role.description}</div>}\n </div>\n <div style={{ display: \"flex\", gap: 8 }}>\n <button style={btnSecondary} onClick={() => setEditingRole(isEditing ? null : role.id)}>\n {isEditing ? \"Done\" : \"Edit fields\"}\n </button>\n {!role.is_default && (\n <button style={{ ...btnDanger, padding: \"6px 12px\", fontSize: 12 }} onClick={() => handleDelete(role.id)}>Delete</button>\n )}\n </div>\n </div>\n\n {isEditing && fields.length > 0 && (\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(auto-fill, minmax(240px, 1fr))\", gap: 4 }}>\n {fields.filter((f) => f.is_active).map((f) => (\n <label key={f.id} style={{ display: \"flex\", alignItems: \"center\", gap: 8, padding: \"4px 0\", fontSize: 13, cursor: \"pointer\" }}>\n <input type=\"checkbox\" checked={assignedIds.has(f.id)} onChange={() => handleToggleField(role, f.id)} style={checkboxStyle} />\n <span>{f.display_name || f.field_name}</span>\n <span style={f.field_type === \"metric\" ? badgeStyle : badgeGray}>{f.field_type}</span>\n </label>\n ))}\n </div>\n )}\n\n {isEditing && fields.length === 0 && (\n <div style={emptyStyle}>No curated fields defined yet. Add fields in the Fields tab first.</div>\n )}\n </div>\n );\n })}\n\n {roles.length === 0 && <div style={emptyStyle}>No roles defined.</div>}\n </div>\n );\n}\n\n// ─── Users Tab ────────────────────────────────────────────────────────────────\n\nfunction UsersTab() {\n const { users, isLoading, error, assignUserRole, removeUserRole } = useAdminUsers();\n const { roles } = useAdminRoles();\n const [showAdd, setShowAdd] = useState(false);\n const [newEmail, setNewEmail] = useState(\"\");\n const [newRoleId, setNewRoleId] = useState<number>(0);\n const [newIsAdmin, setNewIsAdmin] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n\n const handleAdd = useCallback(async () => {\n if (!newEmail.trim() || !newRoleId) return;\n setActionError(null);\n try {\n await assignUserRole({ email: newEmail.trim().toLowerCase(), role_id: newRoleId, is_admin: newIsAdmin });\n setNewEmail(\"\"); setNewIsAdmin(false); setShowAdd(false);\n } catch (err) {\n setActionError(err instanceof Error ? err.message : \"Failed to assign role\");\n }\n }, [newEmail, newRoleId, newIsAdmin, assignUserRole]);\n\n const handleRemove = useCallback(async (u: UserRoleAssignment) => {\n if (!confirm(`Remove ${u.email} from this role?`)) return;\n try { await removeUserRole({ email: u.email, role_id: u.role_id }); }\n catch (err) { setActionError(err instanceof Error ? err.message : \"Failed to remove\"); }\n }, [removeUserRole]);\n\n const grouped = useMemo(() => {\n const map = new Map<string, UserRoleAssignment[]>();\n for (const u of users) {\n const list = map.get(u.email) || [];\n list.push(u);\n map.set(u.email, list);\n }\n return map;\n }, [users]);\n\n if (isLoading) return <div style={emptyStyle}>Loading users...</div>;\n if (error) return <div style={errorBanner}>{error}</div>;\n\n return (\n <div>\n {actionError && <div style={errorBanner}>{actionError}</div>}\n\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: 16 }}>\n <span style={{ fontSize: 14, color: \"#6b7280\" }}>{grouped.size} user{grouped.size !== 1 ? \"s\" : \"\"} with role assignments</span>\n <button style={btnPrimary} onClick={() => setShowAdd(!showAdd)}>\n {showAdd ? \"Cancel\" : \"+ Assign user\"}\n </button>\n </div>\n\n {showAdd && (\n <div style={cardStyle}>\n <div style={{ display: \"flex\", gap: 8, marginBottom: 8 }}>\n <input style={{ ...inputStyle, flex: 1 }} placeholder=\"Email (e.g. name@inkind.com)\" value={newEmail} onChange={(e) => setNewEmail(e.target.value)} />\n <select style={selectStyle} value={newRoleId} onChange={(e) => setNewRoleId(Number(e.target.value))}>\n <option value={0}>Select role...</option>\n {roles.map((r) => <option key={r.id} value={r.id}>{r.name}</option>)}\n </select>\n </div>\n <div style={{ display: \"flex\", gap: 8, alignItems: \"center\" }}>\n <label style={{ display: \"flex\", alignItems: \"center\", gap: 6, fontSize: 13, cursor: \"pointer\" }}>\n <input type=\"checkbox\" checked={newIsAdmin} onChange={(e) => setNewIsAdmin(e.target.checked)} style={checkboxStyle} />\n Admin access\n </label>\n <div style={{ flex: 1 }} />\n <button style={btnPrimary} onClick={handleAdd}>Assign</button>\n </div>\n </div>\n )}\n\n {Array.from(grouped.entries()).map(([email, assignments]) => (\n <div key={email} style={cardStyle}>\n <div>\n <strong style={{ fontSize: 14 }}>{email}</strong>\n {assignments.some((a) => a.is_admin) && <span style={{ ...badgeGreen, marginLeft: 8 }}>admin</span>}\n </div>\n <div style={{ display: \"flex\", gap: 6, marginTop: 8, flexWrap: \"wrap\" }}>\n {assignments.map((a) => (\n <span key={a.id} style={{ display: \"inline-flex\", alignItems: \"center\", gap: 4, ...badgeStyle }}>\n {a.access_roles?.name || `role #${a.role_id}`}\n <button\n onClick={() => handleRemove(a)}\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", color: \"#6b7280\", fontSize: 14, padding: 0, lineHeight: 1 }}\n title=\"Remove role\"\n >\n ×\n </button>\n </span>\n ))}\n </div>\n </div>\n ))}\n\n {grouped.size === 0 && (\n <div style={emptyStyle}>\n No user role assignments yet. Users without an explicit role get the default role's access.\n </div>\n )}\n </div>\n );\n}\n\n// ─── Main Dashboard ───────────────────────────────────────────────────────────\n\ntype Tab = \"fields\" | \"roles\" | \"users\";\n\nexport function AdminDashboard({ className }: AdminDashboardProps) {\n const { isAuthenticated, isLoading: authLoading } = useAuth();\n const [tab, setTab] = useState<Tab>(\"fields\");\n const [initError, setInitError] = useState<string | null>(null);\n\n if (authLoading) return <div style={{ ...rootStyle, ...emptyStyle }}>Loading...</div>;\n if (!isAuthenticated) return <div style={{ ...rootStyle, ...emptyStyle }}>Sign in to access the admin dashboard.</div>;\n\n return (\n <div style={rootStyle} className={className}>\n <h1 style={headingStyle}>Semantic Layer Admin</h1>\n <p style={subStyle}>Manage curated fields, roles, and user access</p>\n\n {initError && <div style={errorBanner}>{initError}</div>}\n\n <div style={tabBarStyle}>\n {([\"fields\", \"roles\", \"users\"] as Tab[]).map((t) => (\n <button key={t} style={tab === t ? tabActive : tabBase} onClick={() => { setTab(t); setInitError(null); }}>\n {t.charAt(0).toUpperCase() + t.slice(1)}\n </button>\n ))}\n </div>\n\n {tab === \"fields\" && <FieldsTab />}\n {tab === \"roles\" && <RolesTab />}\n {tab === \"users\" && <UsersTab />}\n </div>\n );\n}\n","import React, { createContext, useContext, useEffect, useId, useRef, useState, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport interface InspectableEntry {\n id: string;\n label: string;\n currentSource: string;\n columns: string[];\n sampleValues: Record<string, unknown>[];\n element: HTMLElement | null;\n}\n\nexport type ModalTab = \"migrate\" | \"build\";\n\nexport interface InspectableRegistryValue {\n entries: Map<string, InspectableEntry>;\n register: (entry: InspectableEntry) => void;\n unregister: (id: string) => void;\n inspectActive: boolean;\n setInspectActive: (active: boolean) => void;\n selectedId: string | null;\n setSelectedId: (id: string | null) => void;\n modalTab: ModalTab | null;\n setModalTab: (tab: ModalTab | null) => void;\n}\n\nexport const InspectableRegistryContext = createContext<InspectableRegistryValue | null>(null);\n\nexport function InspectableRegistry({ children }: { children: React.ReactNode }) {\n const [entries, setEntries] = useState<Map<string, InspectableEntry>>(new Map());\n const [inspectActive, setInspectActive] = useState(false);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [modalTab, setModalTab] = useState<ModalTab | null>(null);\n\n const register = useCallback((entry: InspectableEntry) => {\n setEntries((prev) => {\n const next = new Map(prev);\n next.set(entry.id, entry);\n return next;\n });\n }, []);\n\n const unregister = useCallback((id: string) => {\n setEntries((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n setSelectedId((prev) => (prev === id ? null : prev));\n }, []);\n\n const value: InspectableRegistryValue = {\n entries,\n register,\n unregister,\n inspectActive,\n setInspectActive,\n selectedId,\n setSelectedId,\n modalTab,\n setModalTab,\n };\n\n return (\n <InspectableRegistryContext.Provider value={value}>\n {children}\n </InspectableRegistryContext.Provider>\n );\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────────\n\n/**\n * Computes the bounding rect of all child elements of a `display: contents`\n * wrapper (which has no box of its own).\n */\nfunction getChildrenBounds(el: HTMLElement): DOMRect | null {\n const children = el.children;\n if (children.length === 0) return null;\n let top = Infinity, left = Infinity, bottom = -Infinity, right = -Infinity;\n for (let i = 0; i < children.length; i++) {\n const r = children[i].getBoundingClientRect();\n if (r.width === 0 && r.height === 0) continue;\n top = Math.min(top, r.top);\n left = Math.min(left, r.left);\n bottom = Math.max(bottom, r.bottom);\n right = Math.max(right, r.right);\n }\n if (top === Infinity) return null;\n return new DOMRect(left, top, right - left, bottom - top);\n}\n\n// ─── Inspectable wrapper ───────────────────────────────────────────────────────\n\nexport interface InspectableProps {\n /** Human-readable label for this component (e.g., \"Revenue Chart\"). */\n label: string;\n /** Describes where data currently comes from (e.g., \"hardcoded array\", \"API /revenue\"). */\n currentSource?: string;\n /** The current data powering this component -- used to infer columns and sample values. */\n data?: Record<string, unknown>[];\n /** Explicit column names. If omitted, inferred from the first item in data. */\n columns?: string[];\n children: React.ReactNode;\n}\n\n/**\n * Wraps a data-bound component and registers it with the DataInspector overlay.\n * Uses `display: contents` so the wrapper is invisible to CSS layout — charts,\n * grids, and flex items render exactly as if Inspectable were not there.\n * The inspect-mode highlight is rendered via a React portal into document.body,\n * positioned with getBoundingClientRect().\n */\nexport function Inspectable({\n label,\n currentSource = \"unknown\",\n data,\n columns,\n children,\n}: InspectableProps) {\n const registry = useContext(InspectableRegistryContext);\n const id = useId();\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [rect, setRect] = useState<DOMRect | null>(null);\n\n // Stable ref so the registration effect can call register/unregister\n // without depending on the (unstable) context value object.\n const registryRef = useRef(registry);\n registryRef.current = registry;\n\n const inferredColumns = columns ?? (data?.[0] ? Object.keys(data[0]) : []);\n const sampleValues = data?.slice(0, 3) ?? [];\n const columnsKey = inferredColumns.join(\",\");\n\n useEffect(() => {\n const reg = registryRef.current;\n if (!reg) return;\n\n reg.register({\n id,\n label,\n currentSource,\n columns: columnsKey.split(\",\").filter(Boolean),\n sampleValues,\n element: wrapperRef.current,\n });\n\n return () => reg.unregister(id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id, label, currentSource, columnsKey]);\n\n const inspectActive = registry?.inspectActive ?? false;\n\n // Continuously measure child bounds while inspect mode is active\n useEffect(() => {\n if (!inspectActive || !wrapperRef.current) {\n setRect(null);\n return;\n }\n\n const measure = () => {\n if (wrapperRef.current) {\n setRect(getChildrenBounds(wrapperRef.current));\n }\n };\n\n measure();\n window.addEventListener(\"scroll\", measure, true);\n window.addEventListener(\"resize\", measure);\n const interval = setInterval(measure, 300);\n\n return () => {\n window.removeEventListener(\"scroll\", measure, true);\n window.removeEventListener(\"resize\", measure);\n clearInterval(interval);\n };\n }, [inspectActive]);\n\n if (!registry) {\n console.warn(\n `[SemanticLayer] <Inspectable label=\"${label}\"> has no <DataInspector> ancestor. ` +\n `Make sure <DataInspector> wraps your app content, not self-closing: ` +\n `<DataInspector>{children}</DataInspector>`\n );\n return <>{children}</>;\n }\n\n const isSelected = registry.selectedId === id;\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n registry.setSelectedId(isSelected ? null : id);\n };\n\n return (\n <div ref={wrapperRef} style={{ display: \"contents\" }}>\n {children}\n {registry.inspectActive && rect && createPortal(\n <div\n onClick={handleClick}\n style={{\n position: \"fixed\",\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n zIndex: 9999,\n cursor: \"pointer\",\n outline: isSelected\n ? \"2px solid #3b82f6\"\n : \"2px dashed #93c5fd\",\n outlineOffset: 2,\n borderRadius: 4,\n transition: \"outline 0.15s ease\",\n background: isSelected ? \"rgba(59,130,246,0.05)\" : \"transparent\",\n pointerEvents: \"auto\",\n }}\n >\n <div\n style={{\n position: \"absolute\",\n top: -10,\n left: 4,\n fontSize: 10,\n fontWeight: 600,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: \"#fff\",\n backgroundColor: isSelected ? \"#3b82f6\" : \"#93c5fd\",\n padding: \"1px 6px\",\n borderRadius: 3,\n pointerEvents: \"none\",\n whiteSpace: \"nowrap\",\n }}\n >\n {label}\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n}\n","import type { SemanticField } from \"../types\";\n\nexport type MatchConfidence = \"exact\" | \"fuzzy\" | \"manual\";\n\nexport interface FieldMatch {\n column: string;\n suggestedField: SemanticField | null;\n confidence: MatchConfidence;\n}\n\nexport interface ChartAnalysis {\n dimensionColumns: string[];\n metricColumns: string[];\n}\n\nconst AGG_PREFIXES = [\"total_\", \"sum_\", \"avg_\", \"count_\", \"min_\", \"max_\", \"num_\"];\nconst NOISE_SUFFIXES = [\"_name\", \"_id\", \"_value\", \"_val\", \"_amt\", \"_amount\"];\n\nfunction camelToSnake(s: string): string {\n return s.replace(/([a-z0-9])([A-Z])/g, \"$1_$2\").toLowerCase();\n}\n\nfunction normalize(s: string): string {\n let result = camelToSnake(s).toLowerCase().trim();\n for (const prefix of AGG_PREFIXES) {\n if (result.startsWith(prefix) && result.length > prefix.length) {\n result = result.slice(prefix.length);\n break;\n }\n }\n for (const suffix of NOISE_SUFFIXES) {\n if (result.endsWith(suffix) && result.length > suffix.length) {\n result = result.slice(0, -suffix.length);\n break;\n }\n }\n return result;\n}\n\nfunction matchExact(column: string, catalog: SemanticField[]): SemanticField | null {\n const lower = column.toLowerCase();\n return catalog.find((f) => f.name.toLowerCase() === lower) ?? null;\n}\n\nfunction matchNormalized(column: string, catalog: SemanticField[]): SemanticField | null {\n const norm = normalize(column);\n return catalog.find((f) => normalize(f.name) === norm) ?? null;\n}\n\nfunction matchDisplayName(column: string, catalog: SemanticField[]): SemanticField | null {\n const lower = normalize(column).replace(/_/g, \" \");\n if (lower.length < 3) return null;\n\n return (\n catalog.find((f) => f.displayName.toLowerCase().includes(lower)) ??\n catalog.find((f) => f.description.toLowerCase().includes(lower)) ??\n null\n );\n}\n\n/**\n * Best-effort match of a single column name against the catalog.\n */\nexport function matchField(column: string, catalog: SemanticField[]): { field: SemanticField | null; confidence: MatchConfidence } {\n const exact = matchExact(column, catalog);\n if (exact) return { field: exact, confidence: \"exact\" };\n\n const normalized = matchNormalized(column, catalog);\n if (normalized) return { field: normalized, confidence: \"fuzzy\" };\n\n const display = matchDisplayName(column, catalog);\n if (display) return { field: display, confidence: \"fuzzy\" };\n\n return { field: null, confidence: \"manual\" };\n}\n\n/**\n * Match an array of column names against the semantic layer field catalog.\n * Uses three layers: exact name match, normalized match, then display name match.\n */\nexport function matchFields(columns: string[], catalog: SemanticField[]): FieldMatch[] {\n return columns.map((column) => {\n const { field, confidence } = matchField(column, catalog);\n return { column, suggestedField: field, confidence };\n });\n}\n\n/**\n * Analyze chart data to classify columns as dimensions (string/date values)\n * or metrics (numeric values). Used by the inspector modal to build the\n * query builder UI instead of a flat column-to-field mapping.\n */\nexport function analyzeChartData(\n columns: string[],\n sampleValues: Record<string, unknown>[],\n): ChartAnalysis {\n const dimensionColumns: string[] = [];\n const metricColumns: string[] = [];\n\n for (const col of columns) {\n const values = sampleValues\n .map((row) => row[col])\n .filter((v) => v !== null && v !== undefined);\n\n if (values.length === 0) {\n dimensionColumns.push(col);\n continue;\n }\n\n const numericCount = values.filter((v) => typeof v === \"number\" || (typeof v === \"string\" && !isNaN(Number(v)) && v.trim() !== \"\")).length;\n const isNumeric = numericCount / values.length > 0.5;\n\n if (isNumeric) {\n metricColumns.push(col);\n } else {\n dimensionColumns.push(col);\n }\n }\n\n return { dimensionColumns, metricColumns };\n}\n","import type { SemanticField, TimeGrain } from \"../types\";\n\nexport interface FieldMapping {\n column: string;\n field: SemanticField | null;\n}\n\nexport interface DimensionMapping {\n column: string;\n field: SemanticField;\n}\n\nexport interface MigrationConfig {\n componentLabel: string;\n dimensions: DimensionMapping[];\n metrics: SemanticField[];\n grain: TimeGrain | null;\n originalMetricColumns: string[];\n}\n\n/**\n * Generate a ready-to-paste Lovable prompt that tells the AI how to migrate\n * a component from hardcoded data to a useSemanticQuery() call.\n *\n * Understands the distinction between dimensions (groupBy) and metrics (values),\n * and produces correct query config with data reshaping instructions.\n */\nexport function generateMigrationPrompt(config: MigrationConfig): string {\n const { componentLabel, dimensions, metrics, grain, originalMetricColumns } = config;\n\n if (dimensions.length === 0 && metrics.length === 0) {\n return `Replace the sample/hardcoded data in the \"${componentLabel}\" component with live data from the semantic layer using useSemanticQuery. Use the DataCatalog to find the right field names.`;\n }\n\n const parts: string[] = [\n `Replace the sample/hardcoded data in the \"${componentLabel}\" component with a useSemanticQuery call using:`,\n \"\",\n ];\n\n if (metrics.length > 0) {\n parts.push(` metrics: [${metrics.map((m) => `'${m.name}'`).join(\", \")}]`);\n }\n\n if (dimensions.length > 0) {\n const groupBy = dimensions.map((d) => d.field.name);\n parts.push(` groupBy: [${groupBy.map((n) => `'${n}'`).join(\", \")}]`);\n }\n\n if (grain) {\n parts.push(` grain: '${grain}'`);\n }\n\n parts.push(\"\");\n\n // Explain query result shape\n const sampleRow: string[] = [];\n for (const d of dimensions) {\n sampleRow.push(`${d.field.name}: \"...\"`);\n }\n for (const m of metrics) {\n sampleRow.push(`${m.name}: 1234`);\n }\n\n parts.push(\"The query returns rows like:\");\n parts.push(` { ${sampleRow.join(\", \")} }`);\n parts.push(\"\");\n\n // Explain how to map to the chart's expected format\n parts.push(\"Map to the chart's expected format:\");\n for (const d of dimensions) {\n parts.push(` X-axis / category: \"${d.field.name}\" (was \"${d.column}\" in the hardcoded data)`);\n }\n\n if (metrics.length > 0 && originalMetricColumns.length > 0) {\n parts.push(` Series / values: each metric (${metrics.map((m) => `\"${m.name}\"`).join(\", \")}) becomes a line/area/bar in the chart`);\n parts.push(` (replaces the old columns: ${originalMetricColumns.map((c) => `\"${c}\"`).join(\", \")})`);\n }\n\n parts.push(\"\");\n parts.push(\n \"Remove the old hardcoded/sample data and any fetch logic it used. \" +\n \"Use the data, isLoading, and error values from useSemanticQuery to render the component. \" +\n \"Show a loading spinner while isLoading is true. Show an error message if error is not null.\",\n );\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Legacy prompt generator for backwards compatibility.\n * Converts flat column-to-field mappings into the new MigrationConfig format.\n */\nexport function generateMigrationPromptLegacy(\n componentLabel: string,\n mappings: FieldMapping[],\n): string {\n const resolved = mappings.filter((m) => m.field !== null) as Array<{\n column: string;\n field: SemanticField;\n }>;\n\n const dimensions: DimensionMapping[] = resolved\n .filter((m) => m.field.type === \"dimension\" || m.field.type === \"time_dimension\")\n .map((m) => ({ column: m.column, field: m.field }));\n\n const metricFields = resolved\n .filter((m) => m.field.type === \"metric\")\n .map((m) => m.field);\n\n const hasTime = dimensions.some((d) => d.field.type === \"time_dimension\");\n\n return generateMigrationPrompt({\n componentLabel,\n dimensions,\n metrics: metricFields,\n grain: hasTime ? \"month\" : null,\n originalMetricColumns: resolved\n .filter((m) => m.field.type === \"metric\")\n .map((m) => m.column),\n });\n}\n","import type { SemanticField, TimeGrain } from \"../types\";\n\n// ─── Types ──────────────────────────────────────────────────────────────────────\n\nexport type WidgetType = \"line\" | \"bar\" | \"area\" | \"pie\" | \"table\" | \"kpi\";\n\nexport type DashboardLayout = \"single\" | \"two-column\" | \"dashboard\";\n\nexport interface WidgetConfig {\n id: string;\n title: string;\n type: WidgetType;\n metrics: SemanticField[];\n groupBy: SemanticField[];\n grain: TimeGrain | null;\n comparisonMetric?: SemanticField;\n}\n\nexport type TimePreset = \"12m\" | \"6m\" | \"3m\" | \"1m\" | \"1w\" | \"1d\";\n\nexport const TIME_PRESET_LABELS: Record<TimePreset, string> = {\n \"12m\": \"12 months\",\n \"6m\": \"6 months\",\n \"3m\": \"3 months\",\n \"1m\": \"1 month\",\n \"1w\": \"1 week\",\n \"1d\": \"1 day\",\n};\n\nexport interface SharedFilter {\n dimension: SemanticField;\n label: string;\n timePreset?: TimePreset | null;\n}\n\nexport interface ReportConfig {\n dashboardTitle: string;\n layout: DashboardLayout;\n widgets: WidgetConfig[];\n sharedFilters: SharedFilter[];\n}\n\n// ─── Color palette ──────────────────────────────────────────────────────────────\n\nconst PALETTE = [\n \"#3b82f6\", \"#10b981\", \"#f59e0b\", \"#ef4444\", \"#8b5cf6\",\n \"#ec4899\", \"#06b6d4\", \"#84cc16\", \"#f97316\", \"#6366f1\",\n];\n\n// ─── Prompt generator ───────────────────────────────────────────────────────────\n\nexport function generateReportPrompt(config: ReportConfig): string {\n const { dashboardTitle, layout, widgets, sharedFilters } = config;\n\n if (widgets.length === 0) {\n return `Create a new dashboard page called \"${dashboardTitle}\". Use @inkindcards/semantic-layer to connect to live data. Start by adding a DataCatalog so the user can browse available metrics and dimensions.`;\n }\n\n const parts: string[] = [];\n\n parts.push(`Create a dashboard page called \"${dashboardTitle}\" using the @inkindcards/semantic-layer SDK to query live data from the dbt Semantic Layer.`);\n parts.push(\"\");\n\n // ── Setup ───────────────────────────────────────────────────────────────────\n parts.push(\"## Setup\");\n parts.push(\"\");\n parts.push(\"Install dependencies if not already present:\");\n parts.push(\" npm install @inkindcards/semantic-layer recharts\");\n parts.push(\"\");\n parts.push(\"Imports needed:\");\n parts.push(\"```tsx\");\n parts.push(`import { useSemanticQuery } from \"@inkindcards/semantic-layer/react\";`);\n\n const chartTypes = new Set(widgets.map((w) => w.type));\n const rechartsImports: string[] = [\"ResponsiveContainer\", \"Tooltip\", \"Legend\"];\n if (chartTypes.has(\"line\")) rechartsImports.push(\"LineChart\", \"Line\", \"XAxis\", \"YAxis\", \"CartesianGrid\");\n if (chartTypes.has(\"bar\")) rechartsImports.push(\"BarChart\", \"Bar\", \"XAxis\", \"YAxis\", \"CartesianGrid\");\n if (chartTypes.has(\"area\")) rechartsImports.push(\"AreaChart\", \"Area\", \"XAxis\", \"YAxis\", \"CartesianGrid\");\n if (chartTypes.has(\"pie\")) rechartsImports.push(\"PieChart\", \"Pie\", \"Cell\");\n const unique = [...new Set(rechartsImports)];\n if (unique.length > 3) {\n parts.push(`import { ${unique.join(\", \")} } from \"recharts\";`);\n }\n parts.push(\"```\");\n parts.push(\"\");\n\n // ── Shared filters ──────────────────────────────────────────────────────────\n if (sharedFilters.length > 0) {\n parts.push(\"## Shared Filters\");\n parts.push(\"\");\n parts.push(\"Create state variables for cross-widget filtering. Render a filter bar at the top of the dashboard with a select/dropdown for each filter. All useSemanticQuery calls below should include the `filters` object so every widget responds to filter changes.\");\n parts.push(\"\");\n parts.push(\"```tsx\");\n for (const f of sharedFilters) {\n parts.push(`const [filter_${sanitize(f.dimension.name)}, setFilter_${sanitize(f.dimension.name)}] = useState<string[]>([]);`);\n }\n parts.push(\"\");\n parts.push(\"const filters: Record<string, string[]> = {\");\n for (const f of sharedFilters) {\n parts.push(` \"${f.dimension.name}\": filter_${sanitize(f.dimension.name)},`);\n }\n parts.push(\"};\");\n parts.push(\"```\");\n parts.push(\"\");\n const timeFilters = sharedFilters.filter((f) => f.dimension.type === \"time_dimension\" && f.timePreset);\n const dimFilters = sharedFilters.filter((f) => f.dimension.type !== \"time_dimension\" || !f.timePreset);\n\n if (timeFilters.length > 0) {\n parts.push(\"For time filters, compute a date range relative to today:\");\n for (const f of timeFilters) {\n parts.push(` - \"${f.dimension.name}\": default to the last ${TIME_PRESET_LABELS[f.timePreset!]}. Compute a start date (e.g. \\`new Date(); startDate.setMonth(startDate.getMonth() - N)\\`) and pass it as a filter value. Include preset buttons (${Object.values(TIME_PRESET_LABELS).join(\", \")}) so the user can switch ranges.`);\n }\n parts.push(\"\");\n }\n\n if (dimFilters.length > 0) {\n parts.push(\"For each dimension filter dropdown, query the distinct values of the dimension using useSemanticQuery with that dimension as a groupBy and any single metric, then populate the dropdown options from the returned rows.\");\n parts.push(\"\");\n }\n }\n\n // ── Layout ──────────────────────────────────────────────────────────────────\n parts.push(\"## Layout\");\n parts.push(\"\");\n parts.push(layoutInstructions(layout, widgets));\n parts.push(\"\");\n\n // ── Color palette ───────────────────────────────────────────────────────────\n parts.push(\"## Color Palette\");\n parts.push(\"\");\n parts.push(`Use this consistent color palette for all charts: ${PALETTE.slice(0, 6).map((c) => `\\`${c}\\``).join(\", \")}. Assign colors to metrics in order so the same metric has the same color everywhere.`);\n parts.push(\"\");\n\n // ── Widgets ─────────────────────────────────────────────────────────────────\n parts.push(\"## Widgets\");\n parts.push(\"\");\n\n for (let i = 0; i < widgets.length; i++) {\n const w = widgets[i];\n parts.push(`### ${i + 1}. ${w.title} (${widgetLabel(w.type)})`);\n parts.push(\"\");\n parts.push(widgetPrompt(w, sharedFilters.length > 0, i));\n parts.push(\"\");\n }\n\n // ── Styling guidance ────────────────────────────────────────────────────────\n parts.push(\"## Styling\");\n parts.push(\"\");\n parts.push(\"- Use a clean, modern design with rounded corners (border-radius: 12px) and subtle shadows on each card.\");\n parts.push(\"- Background: white cards on a light gray page (#f9fafb).\");\n parts.push(\"- Use system-ui / -apple-system font stack, 14px base size.\");\n parts.push(\"- Each widget should be wrapped in a card with a title header, padding 20px, and a subtle 1px border (#e5e7eb).\");\n parts.push(\"- Show a shimmer/skeleton loading state while isLoading is true.\");\n parts.push(\"- Show a styled error banner if error is not null.\");\n parts.push(\"- Format numbers with Intl.NumberFormat: use commas for large numbers, currency format for revenue/dollar metrics, percentage format for rate metrics.\");\n parts.push(\"- Charts should fill their container width using ResponsiveContainer with height 300px.\");\n parts.push(\"- On mobile (< 768px), stack everything in a single column.\");\n parts.push(\"\");\n\n return parts.join(\"\\n\");\n}\n\n// ─── Per-widget prompt builders ─────────────────────────────────────────────────\n\nfunction widgetPrompt(w: WidgetConfig, hasFilters: boolean, index: number): string {\n const lines: string[] = [];\n const metricsArr = w.metrics.map((m) => `'${m.name}'`).join(\", \");\n const groupByArr = w.groupBy.map((d) => `'${d.name}'`).join(\", \");\n\n lines.push(\"Query:\");\n lines.push(\"```tsx\");\n lines.push(`const { data, isLoading, error } = useSemanticQuery({`);\n if (w.metrics.length > 0) lines.push(` metrics: [${metricsArr}],`);\n if (w.groupBy.length > 0) lines.push(` groupBy: [${groupByArr}],`);\n if (w.grain) lines.push(` grain: '${w.grain}',`);\n if (hasFilters) lines.push(` filters,`);\n lines.push(`});`);\n lines.push(\"```\");\n lines.push(\"\");\n\n switch (w.type) {\n case \"line\":\n case \"area\": {\n const ChartTag = w.type === \"line\" ? \"LineChart\" : \"AreaChart\";\n const SeriesTag = w.type === \"line\" ? \"Line\" : \"Area\";\n const xField = w.groupBy[0];\n lines.push(`Render a ${ChartTag} inside a ResponsiveContainer (height 300).`);\n if (xField) lines.push(`X-axis: \"${xField.name}\" (label: \"${xField.displayName}\").`);\n lines.push(`Add a ${SeriesTag} for each metric:`);\n for (let i = 0; i < w.metrics.length; i++) {\n const m = w.metrics[i];\n lines.push(` - dataKey=\"${m.name}\" name=\"${m.displayName}\" stroke=\"${PALETTE[i % PALETTE.length]}\"${w.type === \"area\" ? ` fill=\"${PALETTE[i % PALETTE.length]}\" fillOpacity={0.15}` : \"\"}`);\n }\n lines.push(\"Include CartesianGrid (strokeDasharray='3 3'), Tooltip, and Legend.\");\n break;\n }\n case \"bar\": {\n const xField = w.groupBy[0];\n lines.push(\"Render a BarChart inside a ResponsiveContainer (height 300).\");\n if (xField) lines.push(`X-axis: \"${xField.name}\" (label: \"${xField.displayName}\").`);\n lines.push(\"Add a Bar for each metric:\");\n for (let i = 0; i < w.metrics.length; i++) {\n const m = w.metrics[i];\n lines.push(` - dataKey=\"${m.name}\" name=\"${m.displayName}\" fill=\"${PALETTE[i % PALETTE.length]}\" radius={[4,4,0,0]}`);\n }\n lines.push(\"Include CartesianGrid (strokeDasharray='3 3'), Tooltip, and Legend.\");\n break;\n }\n case \"pie\": {\n const m = w.metrics[0];\n const dim = w.groupBy[0];\n lines.push(\"Render a PieChart inside a ResponsiveContainer (height 300).\");\n if (m && dim) {\n lines.push(`Pie dataKey=\"${m.name}\" nameKey=\"${dim.name}\". Label each slice with the dimension value and percentage.`);\n }\n lines.push(`Use Cell components to apply these fill colors in order: ${PALETTE.slice(0, 6).map((c) => `\"${c}\"`).join(\", \")}.`);\n lines.push(\"Include Tooltip and Legend.\");\n break;\n }\n case \"table\": {\n lines.push(\"Render a styled data table with:\");\n lines.push(\" - Sticky header row with a light gray background.\");\n lines.push(\" - Sortable columns (click header to toggle asc/desc).\");\n lines.push(\" - Zebra-striped rows for readability.\");\n const allFields = [...w.groupBy, ...w.metrics];\n if (allFields.length > 0) {\n lines.push(\"Columns:\");\n for (const f of allFields) {\n const align = f.type === \"metric\" ? \"right-aligned, number-formatted\" : \"left-aligned\";\n lines.push(` - \"${f.displayName}\" (key: \"${f.name}\") — ${align}`);\n }\n }\n break;\n }\n case \"kpi\": {\n const m = w.metrics[0];\n lines.push(\"Render a KPI card showing:\");\n if (m) {\n lines.push(` - Large formatted number for \"${m.displayName}\" (key: \"${m.name}\").`);\n lines.push(` - Use Intl.NumberFormat with appropriate style (currency for revenue/dollar fields, decimal otherwise).`);\n lines.push(` - Subtitle label: \"${m.displayName}\".`);\n }\n if (w.comparisonMetric) {\n lines.push(` - Below the main number, show a comparison badge for \"${w.comparisonMetric.displayName}\" with a green up-arrow or red down-arrow indicating positive/negative change.`);\n }\n if (w.grain && w.groupBy.length > 0) {\n lines.push(` - Query with grain '${w.grain}' and take the most recent period's value. Optionally show a sparkline of the trend.`);\n } else {\n lines.push(\" - Query without groupBy to get the aggregate total.\");\n }\n break;\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n// ─── Layout instructions ────────────────────────────────────────────────────────\n\nfunction layoutInstructions(layout: DashboardLayout, widgets: WidgetConfig[]): string {\n const kpiCount = widgets.filter((w) => w.type === \"kpi\").length;\n const chartCount = widgets.filter((w) => w.type !== \"kpi\" && w.type !== \"table\").length;\n const tableCount = widgets.filter((w) => w.type === \"table\").length;\n\n switch (layout) {\n case \"single\":\n return \"Stack all widgets in a single column, full width. Use a flex column with gap 24px.\";\n case \"two-column\":\n return \"Use a CSS grid with `grid-template-columns: repeat(2, 1fr)` and gap 24px. KPI cards can be smaller — place up to 3 per row using `grid-template-columns: repeat(auto-fill, minmax(200px, 1fr))` in a sub-grid. Tables span full width (`grid-column: 1 / -1`).\";\n case \"dashboard\":\n return [\n \"Use a dashboard layout with three zones:\",\n kpiCount > 0\n ? ` 1. **KPI row** at the top: ${kpiCount} KPI card(s) in a horizontal flex row with gap 16px, equal width.`\n : \" 1. **KPI row**: (none configured — skip this zone).\",\n chartCount > 0\n ? ` 2. **Charts zone**: ${chartCount} chart(s) in a 2-column CSS grid (gap 24px). If only 1 chart, span full width.`\n : \" 2. **Charts zone**: (none configured).\",\n tableCount > 0\n ? ` 3. **Table zone** at the bottom: full-width data table(s), stacked.`\n : \" 3. **Table zone**: (none configured).\",\n ].join(\"\\n\");\n }\n}\n\n// ─── Widget type labels ─────────────────────────────────────────────────────────\n\nfunction widgetLabel(type: WidgetType): string {\n const labels: Record<WidgetType, string> = {\n line: \"Line Chart\",\n bar: \"Bar Chart\",\n area: \"Area Chart\",\n pie: \"Pie / Donut Chart\",\n table: \"Data Table\",\n kpi: \"KPI Card\",\n };\n return labels[type];\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────────\n\nfunction sanitize(name: string): string {\n return name.replace(/[^a-zA-Z0-9_]/g, \"_\");\n}\n\n// ─── Lovable Build with URL ─────────────────────────────────────────────────────\n\nconst LOVABLE_CHAR_LIMIT = 50_000;\n\nexport function isRunningInIframe(): boolean {\n try {\n return window.self !== window.top;\n } catch {\n return true;\n }\n}\n\nexport function canOpenInLovable(prompt: string): boolean {\n return prompt.length <= LOVABLE_CHAR_LIMIT;\n}\n\nexport function openInLovable(prompt: string): void {\n const encoded = encodeURIComponent(prompt);\n const url = `https://lovable.dev/?autosubmit=true#prompt=${encoded}`;\n window.open(url, \"_blank\", \"noopener\");\n}\n","import React, { useState, useMemo, useCallback, useEffect, useContext, useRef } from \"react\";\nimport { InspectableRegistry, InspectableRegistryContext } from \"./inspectable\";\nimport type { InspectableEntry, ModalTab } from \"./inspectable\";\nimport { analyzeChartData, matchField } from \"./field-matcher\";\nimport { generateMigrationPrompt } from \"./prompt-generator\";\nimport type { DimensionMapping, MigrationConfig } from \"./prompt-generator\";\nimport {\n generateReportPrompt,\n canOpenInLovable,\n openInLovable,\n isRunningInIframe,\n TIME_PRESET_LABELS,\n} from \"./report-prompt-generator\";\nimport type {\n WidgetConfig,\n WidgetType,\n DashboardLayout,\n SharedFilter,\n ReportConfig,\n TimePreset,\n} from \"./report-prompt-generator\";\nimport type { SemanticField, TimeGrain } from \"../types\";\nimport { useMetrics } from \"../react/hooks\";\n\nexport interface DataInspectorProps {\n children: React.ReactNode;\n}\n\n/**\n * Dev-mode overlay that wraps your app in an InspectableRegistry and provides\n * a floating toggle + unified modal for data migration and report building.\n * Renders the registry context so <Inspectable> children can register.\n */\nexport function DataInspector({ children }: DataInspectorProps) {\n return (\n <InspectableRegistry>\n <InspectorOverlay />\n {children}\n </InspectableRegistry>\n );\n}\n\n// ─── Internal overlay ──────────────────────────────────────────────────────────\n\nfunction InspectorOverlay() {\n const registry = useContext(InspectableRegistryContext);\n if (!registry) return null;\n\n const {\n inspectActive, setInspectActive,\n selectedId, setSelectedId,\n entries,\n modalTab, setModalTab,\n } = registry;\n\n useEffect(() => {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.ctrlKey && e.shiftKey && e.key === \"I\") {\n e.preventDefault();\n setInspectActive(!inspectActive);\n }\n }\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [inspectActive, setInspectActive]);\n\n // When an Inspectable is selected, open to Migrate tab\n useEffect(() => {\n if (selectedId) setModalTab(\"migrate\");\n }, [selectedId, setModalTab]);\n\n const selectedEntry = selectedId ? entries.get(selectedId) ?? null : null;\n\n const handleClose = useCallback(() => {\n setModalTab(null);\n setSelectedId(null);\n }, [setModalTab, setSelectedId]);\n\n const handleToggle = useCallback(() => {\n if (modalTab) {\n handleClose();\n setInspectActive(false);\n } else {\n setModalTab(\"build\");\n setInspectActive(true);\n }\n }, [modalTab, handleClose, setModalTab, setInspectActive]);\n\n const handleTabChange = useCallback((tab: ModalTab) => {\n setModalTab(tab);\n if (tab === \"build\") setSelectedId(null);\n }, [setModalTab, setSelectedId]);\n\n return (\n <>\n <ToggleButton\n active={inspectActive}\n modalOpen={modalTab !== null}\n count={entries.size}\n onToggle={handleToggle}\n />\n {modalTab && (\n <UnifiedModal\n tab={modalTab}\n onTabChange={handleTabChange}\n entry={selectedEntry}\n onClose={handleClose}\n />\n )}\n </>\n );\n}\n\n// ─── Toggle button ─────────────────────────────────────────────────────────────\n\nfunction ToggleButton({\n active,\n modalOpen,\n count,\n onToggle,\n}: {\n active: boolean;\n modalOpen: boolean;\n count: number;\n onToggle: () => void;\n}) {\n const lit = active || modalOpen;\n return (\n <button\n onClick={onToggle}\n title={lit ? \"Close data tools (Ctrl+Shift+I)\" : \"Open data tools (Ctrl+Shift+I)\"}\n style={{\n position: \"fixed\",\n bottom: 20,\n right: 20,\n zIndex: 99999,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"8px 16px\",\n fontSize: 13,\n fontWeight: 600,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: lit ? \"#fff\" : \"#374151\",\n backgroundColor: lit ? \"#3b82f6\" : \"#fff\",\n border: `1px solid ${lit ? \"#2563eb\" : \"#d1d5db\"}`,\n borderRadius: 999,\n cursor: \"pointer\",\n boxShadow: \"0 2px 8px rgba(0,0,0,0.12)\",\n transition: \"all 0.15s ease\",\n }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n {lit ? \"Active\" : \"Data Tools\"}\n {count > 0 && (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minWidth: 18,\n height: 18,\n fontSize: 11,\n fontWeight: 700,\n borderRadius: 999,\n backgroundColor: lit ? \"rgba(255,255,255,0.25)\" : \"#e5e7eb\",\n color: lit ? \"#fff\" : \"#6b7280\",\n padding: \"0 5px\",\n }}\n >\n {count}\n </span>\n )}\n </button>\n );\n}\n\n// ─── Unified modal ─────────────────────────────────────────────────────────────\n\nfunction UnifiedModal({\n tab,\n onTabChange,\n entry,\n onClose,\n}: {\n tab: ModalTab;\n onTabChange: (tab: ModalTab) => void;\n entry: InspectableEntry | null;\n onClose: () => void;\n}) {\n const [dragPos, setDragPos] = useState<{ x: number; y: number } | null>(null);\n const dragRef = useRef<{ startX: number; startY: number; origX: number; origY: number } | null>(null);\n const modalRef = useRef<HTMLDivElement>(null);\n\n const handleHeaderMouseDown = useCallback((e: React.MouseEvent<HTMLDivElement>) => {\n if ((e.target as HTMLElement).closest(\"button\")) return;\n e.preventDefault();\n const modal = modalRef.current;\n if (!modal) return;\n const rect = modal.getBoundingClientRect();\n dragRef.current = { startX: e.clientX, startY: e.clientY, origX: rect.left, origY: rect.top };\n\n const onMove = (ev: MouseEvent) => {\n if (!dragRef.current) return;\n const dx = ev.clientX - dragRef.current.startX;\n const dy = ev.clientY - dragRef.current.startY;\n setDragPos({ x: dragRef.current.origX + dx, y: dragRef.current.origY + dy });\n };\n const onUp = () => {\n dragRef.current = null;\n document.removeEventListener(\"mousemove\", onMove);\n document.removeEventListener(\"mouseup\", onUp);\n };\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n }, []);\n\n const positionStyle: React.CSSProperties = dragPos\n ? { position: \"fixed\", top: dragPos.y, left: dragPos.x, transform: \"none\" }\n : { position: \"fixed\", top: \"50%\", left: \"50%\", transform: \"translate(-50%, -50%)\" };\n\n return (\n <>\n <div onClick={onClose} style={backdropStyle} />\n <div ref={modalRef} style={{ ...modalStyle, ...positionStyle }}>\n {/* Header with tabs — drag handle */}\n <div\n onMouseDown={handleHeaderMouseDown}\n style={{ ...modalHeaderStyle, cursor: dragRef.current ? \"grabbing\" : \"grab\" }}\n >\n <div style={{ display: \"flex\", gap: 0 }}>\n <TabButton label=\"Migrate\" active={tab === \"migrate\"} onClick={() => onTabChange(\"migrate\")} />\n <TabButton label=\"Build\" active={tab === \"build\"} onClick={() => onTabChange(\"build\")} />\n </div>\n <button onClick={onClose} style={closeBtnStyle}>×</button>\n </div>\n\n {/* Tab content */}\n {tab === \"migrate\" ? (\n <MigrateTab entry={entry} onClose={onClose} />\n ) : (\n <BuildTab />\n )}\n </div>\n </>\n );\n}\n\nfunction TabButton({ label, active, onClick }: { label: string; active: boolean; onClick: () => void }) {\n return (\n <button\n onClick={onClick}\n style={{\n padding: \"8px 20px\",\n fontSize: 13,\n fontWeight: 600,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: active ? \"#3b82f6\" : \"#6b7280\",\n backgroundColor: \"transparent\",\n border: \"none\",\n borderBottom: active ? \"2px solid #3b82f6\" : \"2px solid transparent\",\n cursor: \"pointer\",\n transition: \"all 0.15s ease\",\n }}\n >\n {label}\n </button>\n );\n}\n\n// ─── Migrate tab (existing inspector) ───────────────────────────────────────────\n\nfunction MigrateTab({\n entry,\n onClose: _onClose,\n}: {\n entry: InspectableEntry | null;\n onClose: () => void;\n}) {\n const { fields: catalog, error: catalogError, isLoading: catalogLoading } = useMetrics();\n\n if (!entry) {\n return (\n <div style={{ flex: 1, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", padding: 40 }}>\n <div style={{ textAlign: \"center\", color: \"#9ca3af\" }}>\n <div style={{ fontSize: 14, fontWeight: 500, marginBottom: 8 }}>No component selected</div>\n <div style={{ fontSize: 12 }}>\n Enable inspect mode (Ctrl+Shift+I) then click on a data component to map it to the semantic layer.\n </div>\n </div>\n </div>\n );\n }\n\n return <MigrateTabContent entry={entry} catalog={catalog} catalogError={catalogError} catalogLoading={catalogLoading} />;\n}\n\nfunction MigrateTabContent({\n entry,\n catalog,\n catalogError,\n catalogLoading,\n}: {\n entry: InspectableEntry;\n catalog: SemanticField[];\n catalogError: string | null;\n catalogLoading: boolean;\n}) {\n const analysis = useMemo(\n () => analyzeChartData(entry.columns, entry.sampleValues),\n [entry.columns, entry.sampleValues],\n );\n\n const dimensions = catalog.filter((f) => f.type === \"dimension\" || f.type === \"time_dimension\");\n const metrics = catalog.filter((f) => f.type === \"metric\");\n\n const initialDimMappings = useMemo(() => {\n const map = new Map<string, SemanticField | null>();\n for (const col of analysis.dimensionColumns) {\n const { field } = matchField(col, dimensions);\n map.set(col, field);\n }\n return map;\n }, [analysis.dimensionColumns, dimensions]);\n\n const [dimMappings, setDimMappings] = useState<Map<string, SemanticField | null>>(initialDimMappings);\n useEffect(() => { setDimMappings(initialDimMappings); }, [initialDimMappings]);\n\n const [selectedMetrics, setSelectedMetrics] = useState<SemanticField[]>([]);\n const hasTimeDim = Array.from(dimMappings.values()).some((f) => f?.type === \"time_dimension\");\n const [grain, setGrain] = useState<TimeGrain | \"\">(\"month\");\n const [copied, setCopied] = useState(false);\n\n const handleDimChange = useCallback((col: string, field: SemanticField | null) => {\n setDimMappings((prev) => { const next = new Map(prev); next.set(col, field); return next; });\n }, []);\n\n const handleToggleMetric = useCallback((field: SemanticField) => {\n setSelectedMetrics((prev) =>\n prev.some((m) => m.name === field.name) ? prev.filter((m) => m.name !== field.name) : [...prev, field],\n );\n }, []);\n\n const handleGenerate = useCallback(async () => {\n const resolvedDims: DimensionMapping[] = [];\n for (const [col, field] of dimMappings) {\n if (field) resolvedDims.push({ column: col, field });\n }\n const migrationConfig: MigrationConfig = {\n componentLabel: entry.label,\n dimensions: resolvedDims,\n metrics: selectedMetrics,\n grain: hasTimeDim && grain ? (grain as TimeGrain) : null,\n originalMetricColumns: analysis.metricColumns,\n };\n const prompt = generateMigrationPrompt(migrationConfig);\n await copyToClipboard(prompt);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [entry, dimMappings, selectedMetrics, grain, hasTimeDim, analysis.metricColumns]);\n\n const canGenerate = selectedMetrics.length > 0 || Array.from(dimMappings.values()).some(Boolean);\n\n return (\n <>\n <div style={{ overflow: \"auto\", flex: 1 }}>\n {/* Component info */}\n <div style={sectionStyle}>\n <div style={{ fontSize: 15, fontWeight: 700, color: \"#111827\" }}>{entry.label}</div>\n <div style={{ fontSize: 12, color: \"#6b7280\", marginTop: 2 }}>Source: {entry.currentSource}</div>\n </div>\n\n {/* Data preview */}\n {entry.sampleValues.length > 0 && (\n <div style={sectionStyle}>\n <div style={sectionTitleStyle}>Current Data Preview</div>\n <div style={{ overflow: \"auto\" }}>\n <table style={previewTableStyle}>\n <thead>\n <tr>{entry.columns.map((col) => <th key={col} style={previewThStyle}>{col}</th>)}</tr>\n </thead>\n <tbody>\n {entry.sampleValues.map((row, i) => (\n <tr key={i}>\n {entry.columns.map((col) => (\n <td key={col} style={previewTdStyle}>\n {row[col] === null || row[col] === undefined ? \"\\u2014\" : String(row[col])}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <div style={{ marginTop: 8, fontSize: 11, color: \"#9ca3af\" }}>\n Detected: {analysis.dimensionColumns.length} dimension column{analysis.dimensionColumns.length !== 1 ? \"s\" : \"\"} ({analysis.dimensionColumns.join(\", \") || \"none\"})\n {\" \\u00b7 \"}{analysis.metricColumns.length} value column{analysis.metricColumns.length !== 1 ? \"s\" : \"\"} ({analysis.metricColumns.join(\", \") || \"none\"})\n </div>\n </div>\n )}\n\n {/* Catalog status */}\n {catalog.length === 0 && (\n <div style={{ ...sectionStyle, textAlign: \"center\" as const }}>\n <div style={{ fontSize: 12, color: \"#9ca3af\" }}>\n {catalogLoading\n ? \"Loading catalog...\"\n : catalogError\n ? `Error loading catalog: ${catalogError}`\n : \"No semantic layer catalog available. Connect to the gateway to enable smart matching.\"}\n </div>\n </div>\n )}\n\n {/* Dimensions */}\n {catalog.length > 0 && (\n <div style={sectionStyle}>\n <div style={sectionTitleStyle}>Dimensions (Group By)</div>\n <div style={{ fontSize: 11, color: \"#9ca3af\", marginBottom: 8 }}>What categories define the rows?</div>\n {analysis.dimensionColumns.length === 0 ? (\n <div style={{ fontSize: 12, color: \"#9ca3af\", fontStyle: \"italic\" }}>No dimension columns detected.</div>\n ) : (\n <table style={{ width: \"100%\", borderCollapse: \"collapse\" as const, fontSize: 13 }}>\n <thead>\n <tr>\n <th style={mappingThStyle}>Current Column</th>\n <th style={mappingThStyle}>Sample Values</th>\n <th style={mappingThStyle}>Semantic Layer Dimension</th>\n </tr>\n </thead>\n <tbody>\n {analysis.dimensionColumns.map((col) => {\n const sampleVals = entry.sampleValues.map((row) => row[col]).filter((v) => v !== null && v !== undefined).slice(0, 4).map(String);\n return (\n <tr key={col}>\n <td style={mappingTdStyle}><code style={{ fontSize: 12, color: \"#6366f1\", fontFamily: \"monospace\" }}>{col}</code></td>\n <td style={{ ...mappingTdStyle, fontSize: 11, color: \"#9ca3af\" }}>{sampleVals.join(\", \")}{sampleVals.length >= 4 ? \", ...\" : \"\"}</td>\n <td style={mappingTdStyle}>\n <select\n value={dimMappings.get(col)?.name ?? \"\"}\n onChange={(e) => { const f = dimensions.find((d) => d.name === e.target.value) ?? null; handleDimChange(col, f); }}\n style={selectStyle}\n >\n <option value=\"\">-- select dimension --</option>\n {dimensions.map((f) => <option key={f.name} value={f.name}>{f.displayName} ({f.type}) \\u2014 {f.name}</option>)}\n </select>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n )}\n {hasTimeDim && (\n <div style={{ marginTop: 10, display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <label style={{ fontSize: 12, fontWeight: 600, color: \"#374151\" }}>Time Grain:</label>\n <select value={grain} onChange={(e) => setGrain(e.target.value as TimeGrain | \"\")} style={{ ...selectStyle, width: \"auto\" }}>\n <option value=\"day\">Day</option>\n <option value=\"week\">Week</option>\n <option value=\"month\">Month</option>\n <option value=\"quarter\">Quarter</option>\n <option value=\"year\">Year</option>\n </select>\n </div>\n )}\n </div>\n )}\n\n {/* Metrics */}\n {catalog.length > 0 && (\n <div style={sectionStyle}>\n <div style={sectionTitleStyle}>Metrics (Values)</div>\n <div style={{ fontSize: 11, color: \"#9ca3af\", marginBottom: 8 }}>\n Which metrics should be queried?\n {analysis.metricColumns.length > 0 && <span> (replaces: {analysis.metricColumns.join(\", \")})</span>}\n </div>\n {metrics.length === 0 ? (\n <div style={{ fontSize: 12, color: \"#9ca3af\", fontStyle: \"italic\" }}>No metrics available.</div>\n ) : (\n <div style={{ display: \"flex\", flexDirection: \"column\" as const, gap: 4, maxHeight: 200, overflow: \"auto\" }}>\n {metrics.map((m) => {\n const isSel = selectedMetrics.some((s) => s.name === m.name);\n return (\n <label key={m.name} style={{ display: \"flex\", alignItems: \"center\", gap: 8, padding: \"4px 8px\", borderRadius: 4, cursor: \"pointer\", backgroundColor: isSel ? \"#eff6ff\" : \"transparent\", border: isSel ? \"1px solid #bfdbfe\" : \"1px solid transparent\", fontSize: 12 }}>\n <input type=\"checkbox\" checked={isSel} onChange={() => handleToggleMetric(m)} style={{ margin: 0 }} />\n <span style={{ fontWeight: 500, color: \"#111827\" }}>{m.displayName}</span>\n <code style={{ fontSize: 10, color: \"#6366f1\", fontFamily: \"monospace\" }}>{m.name}</code>\n {m.category && <span style={{ marginLeft: \"auto\", fontSize: 10, color: \"#9ca3af\" }}>{m.category}</span>}\n </label>\n );\n })}\n </div>\n )}\n {selectedMetrics.length > 0 && (\n <div style={{ marginTop: 8, fontSize: 11, color: \"#6b7280\" }}>Selected: {selectedMetrics.map((m) => m.displayName).join(\", \")}</div>\n )}\n </div>\n )}\n\n {/* Query preview */}\n {canGenerate && (\n <div style={sectionStyle}>\n <div style={sectionTitleStyle}>Query Preview</div>\n <pre style={codePreviewStyle}>\n {`useSemanticQuery({${selectedMetrics.length > 0 ? `\\n metrics: [${selectedMetrics.map((m) => `'${m.name}'`).join(\", \")}],` : \"\"}${Array.from(dimMappings.values()).some(Boolean) ? `\\n groupBy: [${Array.from(dimMappings.values()).filter(Boolean).map((f) => `'${f!.name}'`).join(\", \")}],` : \"\"}${hasTimeDim && grain ? `\\n grain: '${grain}',` : \"\"}\\n})`}\n </pre>\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div style={{ padding: \"12px 20px\", borderTop: \"1px solid #e5e7eb\" }}>\n <button onClick={handleGenerate} disabled={!canGenerate} style={{ ...primaryBtnStyle, width: \"100%\", opacity: canGenerate ? 1 : 0.5, cursor: canGenerate ? \"pointer\" : \"not-allowed\" }}>\n {copied ? \"Copied to clipboard!\" : \"Generate Migration Prompt\"}\n </button>\n </div>\n </>\n );\n}\n\n// ─── Build tab ──────────────────────────────────────────────────────────────────\n\nlet _nextWidgetId = 1;\nfunction nextWidgetId(): string {\n return `w${_nextWidgetId++}`;\n}\n\nconst WIDGET_TYPES: { type: WidgetType; label: string; icon: string }[] = [\n { type: \"kpi\", label: \"KPI\", icon: \"#\" },\n { type: \"line\", label: \"Line\", icon: \"\\u2571\" },\n { type: \"bar\", label: \"Bar\", icon: \"\\u2581\\u2583\\u2585\" },\n { type: \"area\", label: \"Area\", icon: \"\\u25e2\" },\n { type: \"pie\", label: \"Pie\", icon: \"\\u25d4\" },\n { type: \"table\", label: \"Table\", icon: \"\\u2637\" },\n];\n\nfunction BuildTab() {\n const { fields: catalog, isLoading: catalogLoading } = useMetrics();\n\n const allMetrics = useMemo(() => catalog.filter((f) => f.type === \"metric\"), [catalog]);\n const allDimensions = useMemo(() => {\n const dims = catalog.filter((f) => f.type === \"dimension\" || f.type === \"time_dimension\");\n return dims.sort((a, b) => {\n if (a.name === \"metric_time\") return -1;\n if (b.name === \"metric_time\") return 1;\n return 0;\n });\n }, [catalog]);\n\n const [dashboardTitle, setDashboardTitle] = useState(\"Dashboard\");\n const [layout, setLayout] = useState<DashboardLayout>(\"dashboard\");\n const [widgets, setWidgets] = useState<WidgetConfig[]>([]);\n const [sharedFilters, setSharedFilters] = useState<SharedFilter[]>([]);\n const [catalogSearch, setCatalogSearch] = useState(\"\");\n const [copied, setCopied] = useState(false);\n const [lovableSent, setLovableSent] = useState(false);\n const [previewOpen, setPreviewOpen] = useState(false);\n\n const [catalogWidth, setCatalogWidth] = useState(220);\n const catalogDragRef = useRef<{ startX: number; startW: number } | null>(null);\n\n const inIframe = useMemo(() => isRunningInIframe(), []);\n\n const handleCatalogDragStart = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n catalogDragRef.current = { startX: e.clientX, startW: catalogWidth };\n const onMove = (ev: MouseEvent) => {\n if (!catalogDragRef.current) return;\n const delta = ev.clientX - catalogDragRef.current.startX;\n setCatalogWidth(Math.max(160, Math.min(400, catalogDragRef.current.startW + delta)));\n };\n const onUp = () => {\n catalogDragRef.current = null;\n document.removeEventListener(\"mousemove\", onMove);\n document.removeEventListener(\"mouseup\", onUp);\n };\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n }, [catalogWidth]);\n\n // ── Widget CRUD ─────────────────────────────────────────────────────────\n const addWidget = useCallback((type: WidgetType) => {\n const isTimeSeries = type === \"line\" || type === \"area\" || type === \"kpi\";\n const metricTime = allDimensions.find((d) => d.name === \"metric_time\");\n setWidgets((prev) => [...prev, {\n id: nextWidgetId(),\n title: `${WIDGET_TYPES.find((t) => t.type === type)?.label ?? \"Widget\"} ${prev.length + 1}`,\n type,\n metrics: [],\n groupBy: isTimeSeries && metricTime ? [metricTime] : [],\n grain: isTimeSeries && metricTime ? \"month\" as TimeGrain : null,\n }]);\n }, [allDimensions]);\n\n const removeWidget = useCallback((id: string) => {\n setWidgets((prev) => prev.filter((w) => w.id !== id));\n }, []);\n\n const updateWidget = useCallback((id: string, patch: Partial<WidgetConfig>) => {\n setWidgets((prev) => prev.map((w) => w.id === id ? { ...w, ...patch } : w));\n }, []);\n\n const duplicateWidget = useCallback((id: string) => {\n setWidgets((prev) => {\n const source = prev.find((w) => w.id === id);\n if (!source) return prev;\n const copy: WidgetConfig = {\n ...source,\n id: nextWidgetId(),\n title: `${source.title} (2)`,\n metrics: [...source.metrics],\n groupBy: [...source.groupBy],\n };\n const idx = prev.findIndex((w) => w.id === id);\n return [...prev.slice(0, idx + 1), copy, ...prev.slice(idx + 1)];\n });\n }, []);\n\n // ── Shared filters ──────────────────────────────────────────────────────\n const addFilter = useCallback((dim: SemanticField) => {\n if (sharedFilters.some((f) => f.dimension.name === dim.name)) return;\n setSharedFilters((prev) => [...prev, {\n dimension: dim,\n label: dim.displayName,\n timePreset: dim.type === \"time_dimension\" ? \"12m\" : null,\n }]);\n }, [sharedFilters]);\n\n const removeFilter = useCallback((name: string) => {\n setSharedFilters((prev) => prev.filter((f) => f.dimension.name !== name));\n }, []);\n\n const updateFilterPreset = useCallback((name: string, preset: TimePreset) => {\n setSharedFilters((prev) => prev.map((f) =>\n f.dimension.name === name ? { ...f, timePreset: preset } : f\n ));\n }, []);\n\n // ── Catalog field add to widget ─────────────────────────────────────────\n const addFieldToWidget = useCallback((widgetId: string, field: SemanticField) => {\n setWidgets((prev) => prev.map((w) => {\n if (w.id !== widgetId) return w;\n if (field.type === \"metric\") {\n if (w.metrics.some((m) => m.name === field.name)) return w;\n return { ...w, metrics: [...w.metrics, field] };\n } else {\n if (w.groupBy.some((d) => d.name === field.name)) return w;\n return { ...w, groupBy: [...w.groupBy, field] };\n }\n }));\n }, []);\n\n const removeFieldFromWidget = useCallback((widgetId: string, fieldName: string, role: \"metric\" | \"groupBy\") => {\n setWidgets((prev) => prev.map((w) => {\n if (w.id !== widgetId) return w;\n if (role === \"metric\") return { ...w, metrics: w.metrics.filter((m) => m.name !== fieldName) };\n return { ...w, groupBy: w.groupBy.filter((d) => d.name !== fieldName) };\n }));\n }, []);\n\n // ── Prompt generation ───────────────────────────────────────────────────\n const reportConfig: ReportConfig = useMemo(() => ({\n dashboardTitle,\n layout,\n widgets,\n sharedFilters,\n }), [dashboardTitle, layout, widgets, sharedFilters]);\n\n const prompt = useMemo(() => generateReportPrompt(reportConfig), [reportConfig]);\n const canGenerate = widgets.length > 0 && widgets.some((w) => w.metrics.length > 0);\n const canLovable = canGenerate && canOpenInLovable(prompt);\n\n const handleCopy = useCallback(async () => {\n await copyToClipboard(prompt);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [prompt]);\n\n const handleLovable = useCallback(async () => {\n if (inIframe) {\n await copyToClipboard(prompt);\n setLovableSent(true);\n setTimeout(() => setLovableSent(false), 3000);\n } else {\n openInLovable(prompt);\n setLovableSent(true);\n setTimeout(() => setLovableSent(false), 3000);\n }\n }, [prompt, inIframe]);\n\n // ── Filtered catalog ────────────────────────────────────────────────────\n const filteredMetrics = useMemo(() => {\n const q = catalogSearch.toLowerCase();\n if (!q) return allMetrics;\n return allMetrics.filter((f) => f.displayName.toLowerCase().includes(q) || f.name.toLowerCase().includes(q) || f.description.toLowerCase().includes(q));\n }, [allMetrics, catalogSearch]);\n\n const filteredDimensions = useMemo(() => {\n const q = catalogSearch.toLowerCase();\n if (!q) return allDimensions;\n return allDimensions.filter((f) => f.displayName.toLowerCase().includes(q) || f.name.toLowerCase().includes(q) || f.description.toLowerCase().includes(q));\n }, [allDimensions, catalogSearch]);\n\n // ── Render ──────────────────────────────────────────────────────────────\n return (\n <>\n <div style={{ overflow: \"auto\", flex: 1, display: \"flex\", flexDirection: \"column\" as const }}>\n {/* Title + layout controls */}\n <div style={{ ...sectionStyle, display: \"flex\", gap: 12, alignItems: \"center\", flexWrap: \"wrap\" as const }}>\n <input\n value={dashboardTitle}\n onChange={(e) => setDashboardTitle(e.target.value)}\n placeholder=\"Dashboard title\"\n style={{ ...inputStyle, flex: 1, minWidth: 160, fontSize: 15, fontWeight: 700 }}\n />\n <div style={{ display: \"flex\", gap: 4 }}>\n {([\"single\", \"two-column\", \"dashboard\"] as DashboardLayout[]).map((l) => (\n <button\n key={l}\n onClick={() => setLayout(l)}\n style={{\n padding: \"4px 10px\",\n fontSize: 11,\n fontWeight: 600,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n borderRadius: 4,\n border: layout === l ? \"1px solid #3b82f6\" : \"1px solid #d1d5db\",\n backgroundColor: layout === l ? \"#eff6ff\" : \"#fff\",\n color: layout === l ? \"#3b82f6\" : \"#6b7280\",\n cursor: \"pointer\",\n }}\n >\n {l === \"single\" ? \"1-Col\" : l === \"two-column\" ? \"2-Col\" : \"Dashboard\"}\n </button>\n ))}\n </div>\n </div>\n\n <div style={{ display: \"flex\", flex: 1, minHeight: 0 }}>\n {/* Left: Catalog browser (resizable) */}\n <div style={{ width: catalogWidth, borderRight: \"1px solid #e5e7eb\", overflow: \"auto\", flexShrink: 0 }}>\n <div style={{ padding: \"8px 12px\" }}>\n <input\n value={catalogSearch}\n onChange={(e) => setCatalogSearch(e.target.value)}\n placeholder=\"Search fields...\"\n style={{ ...inputStyle, width: \"100%\", fontSize: 12 }}\n />\n </div>\n\n {catalogLoading ? (\n <div style={{ padding: 12, fontSize: 12, color: \"#9ca3af\" }}>Loading catalog...</div>\n ) : (\n <>\n {/* Metrics */}\n <div style={{ padding: \"4px 12px\" }}>\n <div style={{ ...sectionTitleStyle, marginBottom: 4 }}>Metrics ({filteredMetrics.length})</div>\n {filteredMetrics.map((f) => (\n <CatalogChip key={f.name} field={f} widgets={widgets} onAddToWidget={addFieldToWidget} />\n ))}\n {filteredMetrics.length === 0 && <div style={{ fontSize: 11, color: \"#9ca3af\", padding: \"4px 0\" }}>None found</div>}\n </div>\n\n {/* Dimensions — metric_time pinned first via sort */}\n <div style={{ padding: \"4px 12px\" }}>\n <div style={{ ...sectionTitleStyle, marginBottom: 4 }}>Dimensions ({filteredDimensions.length})</div>\n {filteredDimensions.map((f) => (\n <CatalogChip\n key={f.name}\n field={f}\n widgets={widgets}\n onAddToWidget={addFieldToWidget}\n onAddAsFilter={addFilter}\n suffix={f.name === \"metric_time\" ? \" (recommended)\" : undefined}\n />\n ))}\n {filteredDimensions.length === 0 && <div style={{ fontSize: 11, color: \"#9ca3af\", padding: \"4px 0\" }}>None found</div>}\n </div>\n </>\n )}\n </div>\n\n {/* Resize handle */}\n <div\n onMouseDown={handleCatalogDragStart}\n style={{\n width: 4,\n cursor: \"col-resize\",\n backgroundColor: \"transparent\",\n flexShrink: 0,\n position: \"relative\" as const,\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.backgroundColor = \"#d1d5db\"; }}\n onMouseLeave={(e) => { (e.currentTarget as HTMLElement).style.backgroundColor = \"transparent\"; }}\n />\n\n {/* Right: Dashboard canvas */}\n <div style={{ flex: 1, overflow: \"auto\", padding: \"12px 16px\" }}>\n {widgets.length === 0 ? (\n <div style={{ textAlign: \"center\" as const, padding: \"40px 20px\", color: \"#9ca3af\" }}>\n <div style={{ fontSize: 14, fontWeight: 500, marginBottom: 12 }}>\n Compose your dashboard\n </div>\n <div style={{ fontSize: 12, marginBottom: 20 }}>\n Add widgets below, then pick metrics and dimensions from the catalog on the left.\n </div>\n <AddWidgetBar onAdd={addWidget} />\n </div>\n ) : (\n <>\n {widgets.map((w) => (\n <WidgetCard\n key={w.id}\n widget={w}\n onUpdate={updateWidget}\n onRemove={removeWidget}\n onDuplicate={duplicateWidget}\n onRemoveField={removeFieldFromWidget}\n allDimensions={allDimensions}\n />\n ))}\n <AddWidgetBar onAdd={addWidget} />\n\n {/* Shared filters */}\n <div style={{ marginTop: 16, padding: \"12px 0\", borderTop: \"1px solid #f3f4f6\" }}>\n <div style={sectionTitleStyle}>Shared Filters</div>\n <div style={{ fontSize: 11, color: \"#9ca3af\", marginBottom: 8 }}>\n Dimensions that filter all widgets together. Add from the catalog sidebar.\n </div>\n {sharedFilters.length === 0 ? (\n <div style={{ fontSize: 12, color: \"#d1d5db\", fontStyle: \"italic\" }}>None added yet</div>\n ) : (\n <div style={{ display: \"flex\", flexDirection: \"column\" as const, gap: 8 }}>\n {sharedFilters.map((f) => (\n <div key={f.dimension.name}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <span style={chipStyle}>\n {f.label}\n <button onClick={() => removeFilter(f.dimension.name)} style={chipRemoveStyle}>×</button>\n </span>\n </div>\n {f.dimension.type === \"time_dimension\" && (\n <div style={{ display: \"flex\", gap: 4, marginTop: 4, marginLeft: 4 }}>\n {(Object.keys(TIME_PRESET_LABELS) as TimePreset[]).map((p) => (\n <button\n key={p}\n onClick={() => updateFilterPreset(f.dimension.name, p)}\n style={{\n padding: \"2px 8px\",\n fontSize: 10,\n fontWeight: 600,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n borderRadius: 999,\n border: f.timePreset === p ? \"1px solid #3b82f6\" : \"1px solid #e5e7eb\",\n backgroundColor: f.timePreset === p ? \"#eff6ff\" : \"#fff\",\n color: f.timePreset === p ? \"#3b82f6\" : \"#9ca3af\",\n cursor: \"pointer\",\n transition: \"all 0.1s\",\n }}\n >\n {TIME_PRESET_LABELS[p]}\n </button>\n ))}\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Prompt preview */}\n {canGenerate && (\n <div style={{ marginTop: 12 }}>\n <button\n onClick={() => setPreviewOpen(!previewOpen)}\n style={{ fontSize: 11, fontWeight: 600, color: \"#6b7280\", background: \"none\", border: \"none\", cursor: \"pointer\", padding: 0, fontFamily: \"system-ui, -apple-system, sans-serif\" }}\n >\n {previewOpen ? \"\\u25BC\" : \"\\u25B6\"} Prompt Preview\n </button>\n {previewOpen && (\n <pre style={{ ...codePreviewStyle, marginTop: 8, maxHeight: 200, overflow: \"auto\", fontSize: 10 }}>\n {prompt}\n </pre>\n )}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n\n {/* Footer with dual buttons */}\n <div style={{ padding: \"12px 20px\", borderTop: \"1px solid #e5e7eb\", display: \"flex\", gap: 10 }}>\n <button\n onClick={handleCopy}\n disabled={!canGenerate}\n style={{\n ...secondaryBtnStyle,\n flex: 1,\n opacity: canGenerate ? 1 : 0.5,\n cursor: canGenerate ? \"pointer\" : \"not-allowed\",\n }}\n >\n {copied ? \"Copied!\" : \"Copy Prompt\"}\n </button>\n <button\n onClick={handleLovable}\n disabled={!canLovable}\n title={canGenerate && !canLovable ? \"Prompt exceeds 50,000 character limit for direct send\" : undefined}\n style={{\n ...primaryBtnStyle,\n flex: 1.5,\n opacity: canLovable ? 1 : 0.4,\n cursor: canLovable ? \"pointer\" : \"not-allowed\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n }}\n >\n {lovableSent\n ? (inIframe ? \"Copied! Paste into Lovable chat\" : \"Opening Lovable...\")\n : (inIframe ? \"Send to Lovable \\u2764\\ufe0f\" : \"Build in Lovable \\u2764\\ufe0f\")}\n {!lovableSent && !inIframe && (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M7 17L17 7\" />\n <path d=\"M7 7h10v10\" />\n </svg>\n )}\n </button>\n </div>\n </>\n );\n}\n\n// ─── Catalog chip ───────────────────────────────────────────────────────────────\n\nfunction CatalogChip({\n field,\n widgets,\n onAddToWidget,\n onAddAsFilter,\n suffix,\n}: {\n field: SemanticField;\n widgets: WidgetConfig[];\n onAddToWidget: (widgetId: string, field: SemanticField) => void;\n onAddAsFilter?: (dim: SemanticField) => void;\n suffix?: string;\n}) {\n const [menuOpen, setMenuOpen] = useState(false);\n const typeIcon = field.type === \"metric\" ? \"\\u2581\" : field.type === \"time_dimension\" ? \"\\u25f7\" : \"\\u2022\";\n const typeColor = field.type === \"metric\" ? \"#10b981\" : field.type === \"time_dimension\" ? \"#f59e0b\" : \"#6366f1\";\n\n return (\n <div style={{ position: \"relative\" as const }}>\n <button\n onClick={() => {\n if (widgets.length === 1) {\n onAddToWidget(widgets[0].id, field);\n } else if (widgets.length > 1) {\n setMenuOpen(!menuOpen);\n }\n }}\n title={`${field.displayName}\\n${field.description}`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n width: \"100%\",\n textAlign: \"left\" as const,\n padding: \"3px 6px\",\n fontSize: 11,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: \"#374151\",\n backgroundColor: \"transparent\",\n border: \"none\",\n borderRadius: 3,\n cursor: widgets.length > 0 ? \"pointer\" : \"default\",\n opacity: widgets.length > 0 ? 1 : 0.6,\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.backgroundColor = \"#f3f4f6\"; }}\n onMouseLeave={(e) => { (e.currentTarget as HTMLElement).style.backgroundColor = \"transparent\"; }}\n >\n <span style={{ color: typeColor, fontSize: 10, flexShrink: 0 }}>{typeIcon}</span>\n <span style={{ overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" as const }}>\n {field.displayName}{suffix && <span style={{ color: \"#9ca3af\", fontWeight: 400 }}>{suffix}</span>}\n </span>\n </button>\n\n {/* Target widget picker dropdown */}\n {menuOpen && widgets.length > 1 && (\n <div style={{ position: \"absolute\" as const, left: 0, top: \"100%\", zIndex: 10, backgroundColor: \"#fff\", border: \"1px solid #e5e7eb\", borderRadius: 6, boxShadow: \"0 4px 12px rgba(0,0,0,0.1)\", minWidth: 160, padding: \"4px 0\" }}>\n {widgets.map((w) => (\n <button\n key={w.id}\n onClick={() => { onAddToWidget(w.id, field); setMenuOpen(false); }}\n style={{ display: \"block\", width: \"100%\", textAlign: \"left\" as const, padding: \"4px 10px\", fontSize: 11, fontFamily: \"system-ui, -apple-system, sans-serif\", border: \"none\", backgroundColor: \"transparent\", cursor: \"pointer\", color: \"#374151\" }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.backgroundColor = \"#f3f4f6\"; }}\n onMouseLeave={(e) => { (e.currentTarget as HTMLElement).style.backgroundColor = \"transparent\"; }}\n >\n {w.title}\n </button>\n ))}\n {onAddAsFilter && (\n <>\n <div style={{ borderTop: \"1px solid #e5e7eb\", margin: \"4px 0\" }} />\n <button\n onClick={() => { onAddAsFilter(field); setMenuOpen(false); }}\n style={{ display: \"block\", width: \"100%\", textAlign: \"left\" as const, padding: \"4px 10px\", fontSize: 11, fontFamily: \"system-ui, -apple-system, sans-serif\", border: \"none\", backgroundColor: \"transparent\", cursor: \"pointer\", color: \"#6b7280\", fontStyle: \"italic\" }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.backgroundColor = \"#f3f4f6\"; }}\n onMouseLeave={(e) => { (e.currentTarget as HTMLElement).style.backgroundColor = \"transparent\"; }}\n >\n + Add as shared filter\n </button>\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ─── Add widget bar ─────────────────────────────────────────────────────────────\n\nfunction AddWidgetBar({ onAdd }: { onAdd: (type: WidgetType) => void }) {\n return (\n <div style={{ display: \"flex\", gap: 6, justifyContent: \"center\", padding: \"8px 0\", flexWrap: \"wrap\" as const }}>\n {WIDGET_TYPES.map((wt) => (\n <button\n key={wt.type}\n onClick={() => onAdd(wt.type)}\n style={{\n display: \"flex\",\n flexDirection: \"column\" as const,\n alignItems: \"center\",\n gap: 2,\n padding: \"6px 12px\",\n fontSize: 10,\n fontWeight: 600,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: \"#6b7280\",\n backgroundColor: \"#fff\",\n border: \"1px dashed #d1d5db\",\n borderRadius: 6,\n cursor: \"pointer\",\n transition: \"all 0.1s\",\n minWidth: 56,\n }}\n onMouseEnter={(e) => { const el = e.currentTarget as HTMLElement; el.style.borderColor = \"#3b82f6\"; el.style.color = \"#3b82f6\"; }}\n onMouseLeave={(e) => { const el = e.currentTarget as HTMLElement; el.style.borderColor = \"#d1d5db\"; el.style.color = \"#6b7280\"; }}\n >\n <span style={{ fontSize: 16, lineHeight: 1 }}>{wt.icon}</span>\n {wt.label}\n </button>\n ))}\n </div>\n );\n}\n\n// ─── Widget card ────────────────────────────────────────────────────────────────\n\nfunction WidgetCard({\n widget,\n onUpdate,\n onRemove,\n onDuplicate,\n onRemoveField,\n allDimensions,\n}: {\n widget: WidgetConfig;\n onUpdate: (id: string, patch: Partial<WidgetConfig>) => void;\n onRemove: (id: string) => void;\n onDuplicate: (id: string) => void;\n onRemoveField: (widgetId: string, fieldName: string, role: \"metric\" | \"groupBy\") => void;\n allDimensions: SemanticField[];\n}) {\n const [collapsed, setCollapsed] = useState(false);\n const hasTimeDim = widget.groupBy.some((d) => d.type === \"time_dimension\");\n\n return (\n <div style={{ border: \"1px solid #e5e7eb\", borderRadius: 8, marginBottom: 10, backgroundColor: \"#fff\" }}>\n {/* Card header */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, padding: \"8px 12px\", borderBottom: collapsed ? \"none\" : \"1px solid #f3f4f6\" }}>\n <button onClick={() => setCollapsed(!collapsed)} style={{ background: \"none\", border: \"none\", cursor: \"pointer\", padding: 0, fontSize: 10, color: \"#9ca3af\" }}>\n {collapsed ? \"\\u25B6\" : \"\\u25BC\"}\n </button>\n <input\n value={widget.title}\n onChange={(e) => onUpdate(widget.id, { title: e.target.value })}\n style={{ ...inputStyle, flex: 1, fontSize: 13, fontWeight: 600, padding: \"2px 4px\" }}\n />\n {/* Type switcher */}\n <div style={{ display: \"flex\", gap: 2 }}>\n {WIDGET_TYPES.map((wt) => (\n <button\n key={wt.type}\n onClick={() => onUpdate(widget.id, { type: wt.type })}\n title={wt.label}\n style={{\n width: 24,\n height: 24,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 12,\n borderRadius: 4,\n border: widget.type === wt.type ? \"1px solid #3b82f6\" : \"1px solid transparent\",\n backgroundColor: widget.type === wt.type ? \"#eff6ff\" : \"transparent\",\n color: widget.type === wt.type ? \"#3b82f6\" : \"#9ca3af\",\n cursor: \"pointer\",\n }}\n >\n {wt.icon}\n </button>\n ))}\n </div>\n <button onClick={() => onDuplicate(widget.id)} style={{ background: \"none\", border: \"none\", cursor: \"pointer\", fontSize: 12, color: \"#d1d5db\", padding: \"0 2px\" }} title=\"Duplicate widget\">⎘</button>\n <button onClick={() => onRemove(widget.id)} style={{ background: \"none\", border: \"none\", cursor: \"pointer\", fontSize: 14, color: \"#d1d5db\", padding: \"0 2px\" }} title=\"Remove widget\">×</button>\n </div>\n\n {/* Card body */}\n {!collapsed && (\n <div style={{ padding: \"8px 12px\" }}>\n {/* Metrics */}\n <div style={{ marginBottom: 8 }}>\n <div style={{ fontSize: 10, fontWeight: 600, color: \"#6b7280\", textTransform: \"uppercase\" as const, letterSpacing: \"0.05em\", marginBottom: 4 }}>Metrics</div>\n {widget.metrics.length === 0 ? (\n <div style={{ fontSize: 11, color: \"#d1d5db\", fontStyle: \"italic\" }}>Click a metric in the catalog to add</div>\n ) : (\n <div style={{ display: \"flex\", gap: 4, flexWrap: \"wrap\" as const }}>\n {widget.metrics.map((m) => (\n <span key={m.name} style={{ ...chipStyle, backgroundColor: \"#ecfdf5\", borderColor: \"#a7f3d0\", color: \"#065f46\" }}>\n {m.displayName}\n <button onClick={() => onRemoveField(widget.id, m.name, \"metric\")} style={chipRemoveStyle}>×</button>\n </span>\n ))}\n </div>\n )}\n </div>\n\n {/* Group By */}\n <div style={{ marginBottom: 8 }}>\n <div style={{ fontSize: 10, fontWeight: 600, color: \"#6b7280\", textTransform: \"uppercase\" as const, letterSpacing: \"0.05em\", marginBottom: 4 }}>Group By</div>\n {widget.groupBy.length === 0 ? (\n <div style={{ fontSize: 11, color: \"#d1d5db\", fontStyle: \"italic\" }}>Click a dimension in the catalog to add</div>\n ) : (\n <div style={{ display: \"flex\", gap: 4, flexWrap: \"wrap\" as const }}>\n {widget.groupBy.map((d) => (\n <span key={d.name} style={{ ...chipStyle, backgroundColor: \"#eef2ff\", borderColor: \"#c7d2fe\", color: \"#3730a3\" }}>\n {d.displayName}\n <button onClick={() => onRemoveField(widget.id, d.name, \"groupBy\")} style={chipRemoveStyle}>×</button>\n </span>\n ))}\n </div>\n )}\n </div>\n\n {/* Time grain */}\n {hasTimeDim && (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <span style={{ fontSize: 10, fontWeight: 600, color: \"#6b7280\", textTransform: \"uppercase\" as const }}>Grain</span>\n <select\n value={widget.grain ?? \"\"}\n onChange={(e) => onUpdate(widget.id, { grain: (e.target.value || null) as TimeGrain | null })}\n style={{ ...selectStyle, width: \"auto\", fontSize: 11 }}\n >\n <option value=\"\">None</option>\n <option value=\"day\">Day</option>\n <option value=\"week\">Week</option>\n <option value=\"month\">Month</option>\n <option value=\"quarter\">Quarter</option>\n <option value=\"year\">Year</option>\n </select>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ─── Clipboard helper ───────────────────────────────────────────────────────────\n\nasync function copyToClipboard(text: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n const ta = document.createElement(\"textarea\");\n ta.value = text;\n document.body.appendChild(ta);\n ta.select();\n document.execCommand(\"copy\");\n document.body.removeChild(ta);\n }\n}\n\n// ─── Shared styles ──────────────────────────────────────────────────────────────\n\nconst backdropStyle: React.CSSProperties = {\n position: \"fixed\",\n inset: 0,\n backgroundColor: \"rgba(0,0,0,0.3)\",\n zIndex: 100000,\n};\n\nconst modalStyle: React.CSSProperties = {\n zIndex: 100001,\n width: \"min(900px, 95vw)\",\n height: \"85vh\",\n maxHeight: \"85vh\",\n backgroundColor: \"#fff\",\n borderRadius: 12,\n boxShadow: \"0 8px 30px rgba(0,0,0,0.2)\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n};\n\nconst modalHeaderStyle: React.CSSProperties = {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: \"0 20px\",\n borderBottom: \"1px solid #e5e7eb\",\n};\n\nconst closeBtnStyle: React.CSSProperties = {\n background: \"none\",\n border: \"none\",\n fontSize: 22,\n color: \"#6b7280\",\n cursor: \"pointer\",\n padding: \"0 4px\",\n lineHeight: 1,\n};\n\nconst sectionStyle: React.CSSProperties = {\n padding: \"12px 20px\",\n};\n\nconst sectionTitleStyle: React.CSSProperties = {\n fontSize: 10,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n color: \"#6b7280\",\n marginBottom: 4,\n};\n\nconst previewTableStyle: React.CSSProperties = {\n width: \"100%\",\n borderCollapse: \"collapse\",\n fontSize: 12,\n};\n\nconst previewThStyle: React.CSSProperties = {\n padding: \"4px 8px\",\n textAlign: \"left\",\n fontWeight: 600,\n color: \"#374151\",\n backgroundColor: \"#f9fafb\",\n borderBottom: \"1px solid #e5e7eb\",\n whiteSpace: \"nowrap\",\n};\n\nconst previewTdStyle: React.CSSProperties = {\n padding: \"4px 8px\",\n color: \"#6b7280\",\n borderBottom: \"1px solid #f3f4f6\",\n whiteSpace: \"nowrap\",\n maxWidth: 150,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n};\n\nconst mappingThStyle: React.CSSProperties = {\n padding: \"6px 8px\",\n textAlign: \"left\",\n fontWeight: 600,\n fontSize: 11,\n color: \"#6b7280\",\n borderBottom: \"1px solid #e5e7eb\",\n};\n\nconst mappingTdStyle: React.CSSProperties = {\n padding: \"6px 8px\",\n borderBottom: \"1px solid #f3f4f6\",\n verticalAlign: \"middle\",\n};\n\nconst selectStyle: React.CSSProperties = {\n padding: \"4px 6px\",\n fontSize: 12,\n border: \"1px solid #d1d5db\",\n borderRadius: 4,\n backgroundColor: \"#fff\",\n color: \"#111827\",\n};\n\nconst inputStyle: React.CSSProperties = {\n padding: \"4px 8px\",\n fontSize: 12,\n border: \"1px solid #d1d5db\",\n borderRadius: 4,\n backgroundColor: \"#fff\",\n color: \"#111827\",\n outline: \"none\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n};\n\nconst codePreviewStyle: React.CSSProperties = {\n fontSize: 11,\n fontFamily: \"monospace\",\n backgroundColor: \"#f9fafb\",\n border: \"1px solid #e5e7eb\",\n borderRadius: 6,\n padding: \"8px 12px\",\n whiteSpace: \"pre-wrap\",\n color: \"#374151\",\n margin: 0,\n};\n\nconst primaryBtnStyle: React.CSSProperties = {\n padding: \"10px 16px\",\n fontSize: 14,\n fontWeight: 600,\n color: \"#fff\",\n backgroundColor: \"#3b82f6\",\n border: \"none\",\n borderRadius: 8,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n};\n\nconst secondaryBtnStyle: React.CSSProperties = {\n padding: \"10px 16px\",\n fontSize: 14,\n fontWeight: 600,\n color: \"#374151\",\n backgroundColor: \"#fff\",\n border: \"1px solid #d1d5db\",\n borderRadius: 8,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n};\n\nconst chipStyle: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 4,\n padding: \"2px 8px\",\n fontSize: 11,\n fontWeight: 500,\n borderRadius: 999,\n border: \"1px solid #e5e7eb\",\n backgroundColor: \"#f9fafb\",\n color: \"#374151\",\n};\n\nconst chipRemoveStyle: React.CSSProperties = {\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 12,\n color: \"#9ca3af\",\n padding: 0,\n lineHeight: 1,\n};\n"]}
|