From 3121b2bb12a9d28758af29fab2b3eb14aea89c18 Mon Sep 17 00:00:00 2001 From: Sushruth Sastry Date: Wed, 21 Jan 2026 13:30:57 -0800 Subject: [PATCH 01/15] feat(kql-lezer): make QueryExpression optional in Query rule --- .../src/grammar/plugins/rules/query.ts | 106 ++++++++++++------ 1 file changed, 71 insertions(+), 35 deletions(-) diff --git a/packages/kql-lezer/src/grammar/plugins/rules/query.ts b/packages/kql-lezer/src/grammar/plugins/rules/query.ts index 0552c2b..dffc6a9 100644 --- a/packages/kql-lezer/src/grammar/plugins/rules/query.ts +++ b/packages/kql-lezer/src/grammar/plugins/rules/query.ts @@ -1,46 +1,82 @@ -import { seq, many, ref, choice, optional, type RuleDef, kw } from "@fossiq/lezer-grammar-generator"; +import { + seq, + many, + ref, + choice, + optional, + type RuleDef, + kw, +} from "@fossiq/lezer-grammar-generator"; /** * Top-level query rules. */ export const queryRules: Record = { - Query: { - expression: seq( - many(choice(ref("LetStatement"), ref("SetStatement"), ref("DeclareQueryParametersStatement"))), - ref("QueryExpression") - ), - }, - - QueryExpression: { - expression: choice( - ref("PipelineExpression"), - ref("UnionExpression"), - ref("SearchExpression"), - ref("FindExpression") + Query: { + expression: seq( + many( + choice( + ref("LetStatement"), + ref("SetStatement"), + ref("DeclareQueryParametersStatement") ) - }, + ), + optional(ref("QueryExpression")) + ), + }, - UnionExpression: { - expression: seq( - kw("union"), - optional(ref("UnionParameters")), - ref("TableList") - ) - }, + QueryExpression: { + expression: choice( + ref("PipelineExpression"), + ref("UnionExpression"), + ref("SearchExpression"), + ref("FindExpression") + ), + }, + + UnionExpression: { + expression: seq( + kw("union"), + optional(ref("UnionParameters")), + ref("TableList") + ), + }, - SearchExpression: { - expression: seq( - kw("search"), - many(choice(ref("Identifier"), ref("String"), ref("Pipe"), ref("OpenParen"), ref("CloseParen"), kw("in"), kw("kind"), ref("Equals"))) - // TODO: Improve search grammar + SearchExpression: { + expression: seq( + kw("search"), + many( + choice( + ref("Identifier"), + ref("String"), + ref("Pipe"), + ref("OpenParen"), + ref("CloseParen"), + kw("in"), + kw("kind"), + ref("Equals") ) - }, + ) + // TODO: Improve search grammar + ), + }, - FindExpression: { - expression: seq( - kw("find"), - many(choice(ref("Identifier"), ref("String"), ref("Pipe"), ref("OpenParen"), ref("CloseParen"), kw("in"), kw("kind"), ref("Equals"))) - // TODO: Improve find grammar + FindExpression: { + expression: seq( + kw("find"), + many( + choice( + ref("Identifier"), + ref("String"), + ref("Pipe"), + ref("OpenParen"), + ref("CloseParen"), + kw("in"), + kw("kind"), + ref("Equals") ) - } -}; \ No newline at end of file + ) + // TODO: Improve find grammar + ), + }, +}; From c655d91c8e5a6759dc996cbcfa9af6f0a9c413a3 Mon Sep 17 00:00:00 2001 From: Sushruth Sastry Date: Wed, 21 Jan 2026 13:30:58 -0800 Subject: [PATCH 02/15] feat(ui): implement resizable layout and collapsible sidebar --- packages/ui/index.html | 4 +- packages/ui/public/index.html | 38 --- packages/ui/public/manifest.json | 4 +- packages/ui/src/App.tsx | 13 +- packages/ui/src/components/Layout.tsx | 54 ++- packages/ui/src/components/ResultsTable.tsx | 7 +- packages/ui/src/components/Sidebar.tsx | 174 ++++++---- packages/ui/src/contexts/SchemaContext.tsx | 3 + packages/ui/src/icons/index.ts | 42 ++- packages/ui/src/styles/theme.css | 349 ++++++++++++++++---- packages/ui/src/utils/emojiGenerator.ts | 123 +++++++ 11 files changed, 609 insertions(+), 202 deletions(-) delete mode 100644 packages/ui/public/index.html create mode 100644 packages/ui/src/utils/emojiGenerator.ts diff --git a/packages/ui/index.html b/packages/ui/index.html index 6d38c32..13833e7 100644 --- a/packages/ui/index.html +++ b/packages/ui/index.html @@ -21,11 +21,11 @@ Fossiq - KQL Query Explorer - - - - - - - Fossiq - KQL Query Explorer - - - -
- - - diff --git a/packages/ui/public/manifest.json b/packages/ui/public/manifest.json index ab37ed4..de153af 100644 --- a/packages/ui/public/manifest.json +++ b/packages/ui/public/manifest.json @@ -12,13 +12,13 @@ "categories": ["productivity", "utilities"], "icons": [ { - "src": "data:image/svg+xml,F", + "src": "data:image/svg+xml,", "sizes": "192x192", "type": "image/svg+xml", "purpose": "any" }, { - "src": "data:image/svg+xml,F", + "src": "data:image/svg+xml,", "sizes": "512x512", "type": "image/svg+xml", "purpose": "any maskable" diff --git a/packages/ui/src/App.tsx b/packages/ui/src/App.tsx index b81591b..d6f6dba 100644 --- a/packages/ui/src/App.tsx +++ b/packages/ui/src/App.tsx @@ -12,8 +12,7 @@ const STORAGE_KEY_RESULTS = "fossiq-results"; const AppContent: Component = () => { // Load persisted query and results from localStorage - const savedQuery = - localStorage.getItem(STORAGE_KEY_QUERY) || ""; + const savedQuery = localStorage.getItem(STORAGE_KEY_QUERY) || ""; const savedResults = (() => { try { const stored = localStorage.getItem(STORAGE_KEY_RESULTS); @@ -47,7 +46,6 @@ const AppContent: Component = () => { } }); - const handleRun = async () => { const connection = conn(); if (!connection) { @@ -116,8 +114,7 @@ const AppContent: Component = () => { } - > -
+ editorPane={
{ />
+ } + resultsPane={

Results {results().length > 0 && `(${results().length})`}

@@ -144,8 +143,8 @@ const AppContent: Component = () => {
-
- + } + /> ); }; diff --git a/packages/ui/src/components/Layout.tsx b/packages/ui/src/components/Layout.tsx index 0385073..a18226e 100644 --- a/packages/ui/src/components/Layout.tsx +++ b/packages/ui/src/components/Layout.tsx @@ -1,29 +1,73 @@ -import { Component } from "solid-js"; +import { Component, createSignal, JSX } from "solid-js"; import Header from "./Header"; import Sidebar from "./Sidebar"; import { useTheme } from "../hooks/useTheme"; interface LayoutProps { - // eslint-disable-next-line @typescript-eslint/no-explicit-any -- SolidJS children can be any renderable type - children?: any; // eslint-disable-next-line @typescript-eslint/no-explicit-any headerContent?: any; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + editorPane?: any; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + resultsPane?: any; } const Layout: Component = (props) => { const { theme, toggleTheme } = useTheme(); + const [sidebarCollapsed, setSidebarCollapsed] = createSignal(false); + const [resultsHeight, setResultsHeight] = createSignal(300); + const [isResizing, setIsResizing] = createSignal(false); const handleAddSource = () => { console.log("Add source clicked"); // TODO: Implement add source dialog }; + const handleMouseDown: JSX.EventHandler = (e) => { + e.preventDefault(); + setIsResizing(true); + + const startY = e.clientY; + const startHeight = resultsHeight(); + + const handleMouseMove = (moveEvent: MouseEvent) => { + const deltaY = startY - moveEvent.clientY; + const newHeight = Math.min(Math.max(startHeight + deltaY, 100), 600); + setResultsHeight(newHeight); + }; + + const handleMouseUp = () => { + setIsResizing(false); + document.removeEventListener("mousemove", handleMouseMove); + document.removeEventListener("mouseup", handleMouseUp); + }; + + document.addEventListener("mousemove", handleMouseMove); + document.addEventListener("mouseup", handleMouseUp); + }; + return (
{props.headerContent}
- {props.children} - +
+
+ setSidebarCollapsed(!sidebarCollapsed())} + /> + {props.editorPane} +
+
+
+
+ {props.resultsPane} +
); diff --git a/packages/ui/src/components/ResultsTable.tsx b/packages/ui/src/components/ResultsTable.tsx index 8b41a65..13cf0fc 100644 --- a/packages/ui/src/components/ResultsTable.tsx +++ b/packages/ui/src/components/ResultsTable.tsx @@ -104,7 +104,7 @@ const ResultsTable: Component = (props) => { return (
= (props) => { top: 0, "z-index": 1, background: "var(--bg-secondary)", + "box-shadow": "0 2px 4px rgba(0, 0, 0, 0.08)", }} > @@ -140,7 +141,7 @@ const ResultsTable: Component = (props) => { cursor: header.column.getCanSort() ? "pointer" : "default", - "border-bottom": "1px solid var(--border-color)", + "border-bottom": "2px solid var(--border-color)", "min-width": "100px", "max-width": `${MAX_COLUMN_WIDTH}px`, overflow: "hidden", @@ -165,7 +166,7 @@ const ResultsTable: Component = (props) => { {/* Spacer row for virtual scroll offset */} - {virtualItems().length > 0 && ( + {virtualItems().length > 0 && (virtualItems()[0]?.start ?? 0) > 0 && ( void; + collapsed?: boolean; + onToggleCollapse?: () => void; } -const Sidebar: Component = (_props) => { +const Sidebar: Component = (props) => { const { tables, addTable, @@ -54,77 +56,111 @@ const Sidebar: Component = (_props) => { }; return ( -
From 33ecf52a2703d5b2f9e6ee45e39846d1042b23a6 Mon Sep 17 00:00:00 2001 From: Sushruth Sastry Date: Wed, 21 Jan 2026 16:27:12 -0800 Subject: [PATCH 09/15] feat(ui): add row numbers to results table --- packages/ui/src/components/ResultsTable.tsx | 87 +++++++++++++++------ 1 file changed, 63 insertions(+), 24 deletions(-) diff --git a/packages/ui/src/components/ResultsTable.tsx b/packages/ui/src/components/ResultsTable.tsx index 4ec2f04..b82887f 100644 --- a/packages/ui/src/components/ResultsTable.tsx +++ b/packages/ui/src/components/ResultsTable.tsx @@ -44,8 +44,17 @@ const ResultsTable: Component = (props) => { // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Column definitions are generic for dynamic query results const columns = createMemo[]>(() => { if (!props.data || props.data.length === 0) return []; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const rowNumberColumn: ColumnDef = { + id: "rowNumber", + header: "#", + cell: (info) => info.row.index + 1, + enableSorting: false, + }; + const firstItem = props.data[0]; - return Object.keys(firstItem).map((key) => ({ + const dataColumns = Object.keys(firstItem).map((key) => ({ accessorKey: key, header: key, cell: (info) => { @@ -53,6 +62,8 @@ const ResultsTable: Component = (props) => { return typeof value === "bigint" ? String(value) : value; }, })); + + return [rowNumberColumn, ...dataColumns]; }); const table = createSolidTable({ @@ -164,20 +175,33 @@ const ResultsTable: Component = (props) => { {(header) => ( {flexRender( @@ -221,17 +245,32 @@ const ResultsTable: Component = (props) => { {(cell) => { const value = cell.getValue(); + const isRowNumber = cell.column.id === "rowNumber"; return ( handleCellClick(e, value)} + style={ + isRowNumber + ? { + padding: "0.5rem 0.5rem 0.5rem 1rem", + "white-space": "nowrap", + "text-align": "right", + color: "var(--text-secondary)", + "font-variant-numeric": "tabular-nums", + width: "50px", + "max-width": "50px", + } + : { + padding: "0.5rem 1rem", + "white-space": "nowrap", + overflow: "hidden", + "text-overflow": "ellipsis", + "max-width": `${MAX_COLUMN_WIDTH}px`, + cursor: "pointer", + } + } + onClick={(e) => + !isRowNumber && handleCellClick(e, value) + } title="" > {flexRender( From c4436ada23ba57f2788cdc8e398d18f65a3bea7f Mon Sep 17 00:00:00 2001 From: Sushruth Sastry Date: Wed, 21 Jan 2026 16:34:08 -0800 Subject: [PATCH 10/15] style(ui): update scrollbars to match macOS native look --- packages/ui/src/styles/theme.css | 55 ++++++++++++++++---------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/packages/ui/src/styles/theme.css b/packages/ui/src/styles/theme.css index 88dfa53..a10f5bc 100644 --- a/packages/ui/src/styles/theme.css +++ b/packages/ui/src/styles/theme.css @@ -846,51 +846,52 @@ p { } } -/* Scrollbars */ +/* Scrollbars - macOS-like minimal style */ ::-webkit-scrollbar { - width: 10px; - height: 10px; + width: 14px; + height: 14px; + background-color: transparent; } ::-webkit-scrollbar-track { - background: transparent; + background-color: transparent; } ::-webkit-scrollbar-thumb { - background-color: var(--border-color); - border-radius: 5px; - border: 2px solid transparent; - background-clip: padding-box; + background-color: rgba(0, 0, 0, 0.2); + border-radius: 7px; + border: 4px solid transparent; + background-clip: content-box; + min-height: 40px; } ::-webkit-scrollbar-thumb:hover { - background-color: var(--text-secondary); - background-clip: padding-box; + background-color: rgba(0, 0, 0, 0.35); } -/* Results table scrollbar styling - floating style */ -.results-table-container::-webkit-scrollbar { - width: 12px; - height: 12px; +::-webkit-scrollbar-corner { + background-color: transparent; } -.results-table-container::-webkit-scrollbar-track { - background: linear-gradient( - to right, - var(--border-color) 1px, - var(--bg-secondary) 1px - ); +/* Dark mode scrollbars */ +@media (prefers-color-scheme: dark) { + ::-webkit-scrollbar-thumb { + background-color: rgba(255, 255, 255, 0.2); + } + + ::-webkit-scrollbar-thumb:hover { + background-color: rgba(255, 255, 255, 0.35); + } } -.results-table-container::-webkit-scrollbar-thumb { - background-color: var(--text-secondary); - background-clip: padding-box; - border: 2px solid transparent; - border-left-width: 3px; +:root[data-theme="dark"] ::-webkit-scrollbar-thumb, +:root.theme-dark ::-webkit-scrollbar-thumb { + background-color: rgba(255, 255, 255, 0.2); } -.results-table-container::-webkit-scrollbar-thumb:hover { - background-color: var(--text-primary); +:root[data-theme="dark"] ::-webkit-scrollbar-thumb:hover, +:root.theme-dark ::-webkit-scrollbar-thumb:hover { + background-color: rgba(255, 255, 255, 0.35); } /* Focus states */ From 19c872688d8e3f61785104b305e843735c043cf8 Mon Sep 17 00:00:00 2001 From: Sushruth Sastry Date: Wed, 21 Jan 2026 16:38:11 -0800 Subject: [PATCH 11/15] style(ui): improve row numbering and remove status text --- packages/ui/src/App.tsx | 14 +------- packages/ui/src/components/ResultsTable.tsx | 37 +++------------------ 2 files changed, 6 insertions(+), 45 deletions(-) diff --git a/packages/ui/src/App.tsx b/packages/ui/src/App.tsx index e062db0..24e2ff2 100644 --- a/packages/ui/src/App.tsx +++ b/packages/ui/src/App.tsx @@ -27,7 +27,6 @@ const AppContent: Component = () => { const [results, setResults] = createSignal(savedResults); const [error, setError] = createSignal(null); const [isRunning, setIsRunning] = createSignal(false); - const [visibleRange, setVisibleRange] = createSignal({ start: 0, end: 0 }); const { conn } = useSchema(); // Persist query to localStorage when it changes @@ -137,17 +136,6 @@ const AppContent: Component = () => { }} >

Results {results().length > 0 && `(${results().length})`}

- 0}> - - Showing {visibleRange().start} to {visibleRange().end} of{" "} - {results().length} - -
@@ -161,7 +149,7 @@ const AppContent: Component = () => { Error: {error()} - + } /> diff --git a/packages/ui/src/components/ResultsTable.tsx b/packages/ui/src/components/ResultsTable.tsx index b82887f..cf13be0 100644 --- a/packages/ui/src/components/ResultsTable.tsx +++ b/packages/ui/src/components/ResultsTable.tsx @@ -1,11 +1,4 @@ -import { - Component, - For, - createMemo, - createSignal, - Show, - createEffect, -} from "solid-js"; +import { Component, For, createMemo, createSignal, Show } from "solid-js"; import { createSolidTable, getCoreRowModel, @@ -16,15 +9,9 @@ import { } from "@tanstack/solid-table"; import { createVirtualizer } from "@tanstack/solid-virtual"; -interface VisibleRange { - start: number; - end: number; -} - interface ResultsTableProps { // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Query results have dynamic schema based on user query data: any[]; - onRangeChange?: (range: VisibleRange) => void; } interface TooltipState { @@ -99,24 +86,6 @@ const ResultsTable: Component = (props) => { const virtualItems = () => rowVirtualizer.getVirtualItems(); const totalSize = () => rowVirtualizer.getTotalSize(); - createEffect(() => { - const items = virtualItems(); - if (props.onRangeChange) { - if (items.length > 0) { - // index is 0-based, so +1 for display - // We take the first and last item in the *rendered* list - // Note: virtualItems includes overscan, so this might be slightly wider than viewport - // but typically "showing X-Y" refers to what's loaded/rendered in these contexts. - // For strict viewport precision, we'd need more complex logic, but this is usually sufficient. - const start = items[0].index + 1; - const end = items[items.length - 1].index + 1; - props.onRangeChange({ start, end }); - } else { - props.onRangeChange({ start: 0, end: 0 }); - } - } - }); - const handleCellClick = (e: MouseEvent, value: unknown) => { const target = e.currentTarget as HTMLElement; const stringValue = String(value ?? ""); @@ -186,6 +155,8 @@ const ResultsTable: Component = (props) => { width: "50px", "min-width": "50px", "max-width": "50px", + "background-color": "var(--bg-secondary)", + color: "var(--text-secondary)", } : { padding: "0.5rem 1rem", @@ -258,6 +229,8 @@ const ResultsTable: Component = (props) => { "font-variant-numeric": "tabular-nums", width: "50px", "max-width": "50px", + "background-color": "var(--bg-secondary)", + "font-weight": "500", } : { padding: "0.5rem 1rem", From 3d0c6829a56ed6118fa82887748f5229ddd2d4fd Mon Sep 17 00:00:00 2001 From: Sushruth Sastry Date: Wed, 21 Jan 2026 16:41:35 -0800 Subject: [PATCH 12/15] fix(ui): remove custom scrollbars and stabilize column widths --- packages/ui/src/components/ResultsTable.tsx | 64 +++++++++++++++------ packages/ui/src/styles/theme.css | 48 +--------------- 2 files changed, 47 insertions(+), 65 deletions(-) diff --git a/packages/ui/src/components/ResultsTable.tsx b/packages/ui/src/components/ResultsTable.tsx index cf13be0..0af9937 100644 --- a/packages/ui/src/components/ResultsTable.tsx +++ b/packages/ui/src/components/ResultsTable.tsx @@ -38,17 +38,33 @@ const ResultsTable: Component = (props) => { header: "#", cell: (info) => info.row.index + 1, enableSorting: false, + size: 50, }; const firstItem = props.data[0]; - const dataColumns = Object.keys(firstItem).map((key) => ({ - accessorKey: key, - header: key, - cell: (info) => { - const value = info.getValue(); - return typeof value === "bigint" ? String(value) : value; - }, - })); + const dataColumns = Object.keys(firstItem).map((key) => { + // Simple heuristic for column width stability + const headerWidth = key.length * 10 + 20; // 10px per char + padding + const value = firstItem[key]; + const valueString = + value === null || value === undefined ? "" : String(value); + const valueWidth = valueString.length * 8 + 20; // Slightly narrower char width assumption for values + + const estimatedWidth = Math.min( + Math.max(headerWidth, valueWidth, 100), + 300 + ); + + return { + accessorKey: key, + header: key, + cell: (info) => { + const val = info.getValue(); + return typeof val === "bigint" ? String(val) : val; + }, + size: estimatedWidth, + } as ColumnDef; + }); return [rowNumberColumn, ...dataColumns]; }); @@ -128,7 +144,13 @@ const ResultsTable: Component = (props) => { } }} > - +
= (props) => { "white-space": "nowrap", "text-align": "right", "border-bottom": "2px solid var(--border-color)", - width: "50px", - "min-width": "50px", - "max-width": "50px", + width: `${header.column.getSize()}px`, + "min-width": `${header.column.getSize()}px`, "background-color": "var(--bg-secondary)", color: "var(--text-secondary)", } @@ -167,8 +188,8 @@ const ResultsTable: Component = (props) => { ? "pointer" : "default", "border-bottom": "2px solid var(--border-color)", - "min-width": "100px", - "max-width": `${MAX_COLUMN_WIDTH}px`, + width: `${header.column.getSize()}px`, + "min-width": `${header.column.getSize()}px`, overflow: "hidden", "text-overflow": "ellipsis", } @@ -195,7 +216,11 @@ const ResultsTable: Component = (props) => { {virtualItems().length > 0 && (virtualItems()[0]?.start ?? 0) > 0 && ( @@ -227,8 +252,8 @@ const ResultsTable: Component = (props) => { "text-align": "right", color: "var(--text-secondary)", "font-variant-numeric": "tabular-nums", - width: "50px", - "max-width": "50px", + width: `${cell.column.getSize()}px`, + "min-width": `${cell.column.getSize()}px`, "background-color": "var(--bg-secondary)", "font-weight": "500", } @@ -237,7 +262,8 @@ const ResultsTable: Component = (props) => { "white-space": "nowrap", overflow: "hidden", "text-overflow": "ellipsis", - "max-width": `${MAX_COLUMN_WIDTH}px`, + width: `${cell.column.getSize()}px`, + "min-width": `${cell.column.getSize()}px`, cursor: "pointer", } } @@ -267,6 +293,8 @@ const ResultsTable: Component = (props) => { totalSize() - (virtualItems()[virtualItems().length - 1]?.end ?? 0) }px`, + padding: 0, + border: "none", }} colspan={headerGroups()[0]?.headers.length || 1} /> diff --git a/packages/ui/src/styles/theme.css b/packages/ui/src/styles/theme.css index a10f5bc..fc9a021 100644 --- a/packages/ui/src/styles/theme.css +++ b/packages/ui/src/styles/theme.css @@ -846,53 +846,7 @@ p { } } -/* Scrollbars - macOS-like minimal style */ -::-webkit-scrollbar { - width: 14px; - height: 14px; - background-color: transparent; -} - -::-webkit-scrollbar-track { - background-color: transparent; -} - -::-webkit-scrollbar-thumb { - background-color: rgba(0, 0, 0, 0.2); - border-radius: 7px; - border: 4px solid transparent; - background-clip: content-box; - min-height: 40px; -} - -::-webkit-scrollbar-thumb:hover { - background-color: rgba(0, 0, 0, 0.35); -} - -::-webkit-scrollbar-corner { - background-color: transparent; -} - -/* Dark mode scrollbars */ -@media (prefers-color-scheme: dark) { - ::-webkit-scrollbar-thumb { - background-color: rgba(255, 255, 255, 0.2); - } - - ::-webkit-scrollbar-thumb:hover { - background-color: rgba(255, 255, 255, 0.35); - } -} - -:root[data-theme="dark"] ::-webkit-scrollbar-thumb, -:root.theme-dark ::-webkit-scrollbar-thumb { - background-color: rgba(255, 255, 255, 0.2); -} - -:root[data-theme="dark"] ::-webkit-scrollbar-thumb:hover, -:root.theme-dark ::-webkit-scrollbar-thumb:hover { - background-color: rgba(255, 255, 255, 0.35); -} +/* Scrollbars - Default Browser Style (Removed Customization) */ /* Focus states */ button:focus, From 4b23cd4e000bcca2b9dc66016c58298b7da325b1 Mon Sep 17 00:00:00 2001 From: Sushruth Sastry Date: Wed, 21 Jan 2026 16:45:22 -0800 Subject: [PATCH 13/15] style(ui): update favicon to dark stroke with white outline --- packages/ui/index.html | 4 ++-- packages/ui/public/manifest.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/ui/index.html b/packages/ui/index.html index 13833e7..88f05ad 100644 --- a/packages/ui/index.html +++ b/packages/ui/index.html @@ -21,11 +21,11 @@ Fossiq - KQL Query Explorer ", + "src": "data:image/svg+xml,", "sizes": "192x192", "type": "image/svg+xml", "purpose": "any" }, { - "src": "data:image/svg+xml,", + "src": "data:image/svg+xml,", "sizes": "512x512", "type": "image/svg+xml", "purpose": "any maskable" From b4a0ad11d8b2607562f01cfd4be75c4a4372e7a4 Mon Sep 17 00:00:00 2001 From: Sushruth Sastry Date: Wed, 21 Jan 2026 17:11:06 -0800 Subject: [PATCH 14/15] chore: lint fixes --- packages/ui/src/components/ResultsTable.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/ui/src/components/ResultsTable.tsx b/packages/ui/src/components/ResultsTable.tsx index 0af9937..a7fd2e2 100644 --- a/packages/ui/src/components/ResultsTable.tsx +++ b/packages/ui/src/components/ResultsTable.tsx @@ -25,11 +25,8 @@ const ResultsTable: Component = (props) => { const [tooltip, setTooltip] = createSignal(null); let parentRef: HTMLDivElement | undefined; - const MAX_COLUMN_WIDTH = 250; - // Dynamically generate columns based on the first item in data - // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Column definitions are generic for dynamic query results - const columns = createMemo[]>(() => { + const columns = createMemo[]>(() => { if (!props.data || props.data.length === 0) return []; // eslint-disable-next-line @typescript-eslint/no-explicit-any From 77eb8a211f1fe5c32cb38e3d90eafd6837ee4697 Mon Sep 17 00:00:00 2001 From: Sushruth Sastry Date: Wed, 21 Jan 2026 17:57:35 -0800 Subject: [PATCH 15/15] fix(build): correct turbo output paths for kql-lezer parser artifacts --- turbo.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/turbo.json b/turbo.json index c372315..bd94d96 100644 --- a/turbo.json +++ b/turbo.json @@ -10,9 +10,9 @@ "grammar.js", "bindings/**", "prebuilds/**", - "packages/kql-lezer/src/kql.grammar", - "packages/kql-lezer/src/parser.ts", - "packages/kql-lezer/src/parser.terms.ts", + "src/kql.grammar", + "src/parser.ts", + "src/parser.terms.ts", "!**/node_modules/**" ], "inputs": ["src/**", "package.json", "tsconfig.json", "turbo.json"]