Skip to content

Commit 1bf1c5d

Browse files
authored
add theme function (#26)
* add theme function * export default tooltip renderers * fix tests, export default renderer * use imports from index.js
1 parent 90fbd9b commit 1bf1c5d

File tree

6 files changed

+79
-70
lines changed

6 files changed

+79
-70
lines changed

demo/index.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ import { PostgreSQL, sql } from "@codemirror/lang-sql";
33
import { type EditorState, StateEffect, StateField } from "@codemirror/state";
44
import { keymap } from "@codemirror/view";
55
import { basicSetup, EditorView } from "codemirror";
6-
import { NodeSqlParser } from "../src/index.js";
7-
import { cteCompletionSource } from "../src/sql/cte-completion-source.js";
8-
import { sqlExtension } from "../src/sql/extension.js";
9-
import { DefaultSqlTooltipRenders } from "../src/sql/hover.js";
6+
import {
7+
cteCompletionSource,
8+
DefaultSqlTooltipRenders,
9+
NodeSqlParser,
10+
sqlExtension,
11+
} from "../src/index.js";
1012
import { type Schema, tableTooltipRenderer } from "./custom-renderers.js";
1113

1214
// Default SQL content for the demo

src/__tests__/index.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@ describe("index.ts exports", () => {
88
const sortedExports = Object.keys(exports).sort();
99
expect(sortedExports).toMatchInlineSnapshot(`
1010
[
11+
"DefaultSqlTooltipRenders",
1112
"NodeSqlParser",
1213
"SqlStructureAnalyzer",
1314
"cteCompletionSource",
15+
"defaultSqlHoverTheme",
1416
"sqlExtension",
1517
"sqlHover",
16-
"sqlHoverTheme",
1718
"sqlLinter",
1819
"sqlStructureGutter",
1920
]

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export type {
77
SqlHoverConfig,
88
SqlKeywordInfo,
99
} from "./sql/hover.js";
10-
export { sqlHover, sqlHoverTheme } from "./sql/hover.js";
10+
export { DefaultSqlTooltipRenders, defaultSqlHoverTheme, sqlHover } from "./sql/hover.js";
1111
export { NodeSqlParser } from "./sql/parser.js";
1212
export type { SqlStatement } from "./sql/structure-analyzer.js";
1313
export { SqlStructureAnalyzer } from "./sql/structure-analyzer.js";

src/sql/__tests__/hover-integration.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Completion } from "@codemirror/autocomplete";
22
import type { SQLNamespace } from "@codemirror/lang-sql";
33
import { describe, expect, it, vi } from "vitest";
4-
import { sqlHover, sqlHoverTheme } from "../hover.js";
4+
import { defaultSqlHoverTheme, sqlHover } from "../hover.js";
55
import { resolveNamespaceItem } from "../namespace-utils.js";
66

77
// Helper function to create completion objects
@@ -73,7 +73,7 @@ describe("Hover Integration Tests", () => {
7373

7474
it("should create hover theme without errors", () => {
7575
expect(() => {
76-
sqlHoverTheme();
76+
defaultSqlHoverTheme();
7777
}).not.toThrow();
7878
});
7979

src/sql/extension.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { Extension } from "@codemirror/state";
22
import { type SqlLinterConfig, sqlLinter } from "./diagnostics.js";
3-
import { type SqlHoverConfig, sqlHover, sqlHoverTheme } from "./hover.js";
3+
import { defaultSqlHoverTheme, type SqlHoverConfig, sqlHover } from "./hover.js";
44
import { type SqlGutterConfig, sqlStructureGutter } from "./structure-extension.js";
55

66
/**
@@ -68,7 +68,9 @@ export function sqlExtension(config: SqlExtensionConfig = {}): Extension[] {
6868

6969
if (enableHover) {
7070
extensions.push(sqlHover(hoverConfig));
71-
extensions.push(sqlHoverTheme());
71+
hoverConfig?.theme
72+
? extensions.push(hoverConfig.theme)
73+
: extensions.push(defaultSqlHoverTheme());
7274
}
7375

7476
return extensions;

src/sql/hover.ts

Lines changed: 64 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ export interface SqlHoverConfig {
125125
/** Custom renderer for column items */
126126
column?: (data: NamespaceTooltipData) => string;
127127
};
128+
/** Custom CSS theme for hover tooltips */
129+
theme?: Extension;
128130
}
129131

130132
/**
@@ -504,8 +506,51 @@ export const DefaultSqlTooltipRenders = {
504506
/**
505507
* Default CSS styles for hover tooltips
506508
*/
507-
export const sqlHoverTheme = (): Extension =>
508-
EditorView.theme({
509+
export const defaultSqlHoverTheme = (theme: "light" | "dark" = "light"): Extension => {
510+
// Theme-dependent color variables
511+
const lightTheme = {
512+
tooltipBg: "#ffffff",
513+
tooltipBorder: "#e5e7eb",
514+
tooltipText: "#374151",
515+
tooltipTypeBg: "#f3f4f6",
516+
tooltipTypeText: "#6b7280",
517+
tooltipChildren: "#6b7280",
518+
codeBg: "#f9fafb",
519+
codeText: "#1f2937",
520+
strong: "#111827",
521+
em: "#6b7280",
522+
header: "#111827",
523+
info: "#374151",
524+
related: "#374151",
525+
path: "#374151",
526+
example: "#374151",
527+
columns: "#374151",
528+
syntax: "#374151",
529+
};
530+
531+
const darkTheme = {
532+
tooltipBg: "#1f2937",
533+
tooltipBorder: "#374151",
534+
tooltipText: "#f9fafb",
535+
tooltipTypeBg: "#374151",
536+
tooltipTypeText: "#9ca3af",
537+
tooltipChildren: "#9ca3af",
538+
codeBg: "#374151",
539+
codeText: "#f3f4f6",
540+
strong: "#ffffff",
541+
em: "#9ca3af",
542+
header: "#ffffff",
543+
info: "#d1d5db",
544+
related: "#d1d5db",
545+
path: "#d1d5db",
546+
example: "#d1d5db",
547+
columns: "#d1d5db",
548+
syntax: "#d1d5db",
549+
};
550+
551+
const colors = theme === "dark" ? darkTheme : lightTheme;
552+
553+
return EditorView.theme({
509554
".cm-sql-hover-tooltip": {
510555
padding: "8px 12px",
511556
backgroundColor: "#ffffff",
@@ -516,112 +561,71 @@ export const sqlHoverTheme = (): Extension =>
516561
lineHeight: "1.4",
517562
maxWidth: "320px",
518563
fontFamily: "system-ui, -apple-system, sans-serif",
564+
color: colors.tooltipText,
519565
},
520566
".cm-sql-hover-tooltip .sql-hover-header": {
521567
marginBottom: "6px",
522568
display: "flex",
523569
alignItems: "center",
524570
gap: "6px",
571+
color: colors.header,
525572
},
526573
".cm-sql-hover-tooltip .sql-hover-type": {
527574
fontSize: "11px",
528575
padding: "2px 6px",
529-
backgroundColor: "#f3f4f6",
530-
color: "#6b7280",
576+
backgroundColor: colors.tooltipTypeBg,
577+
color: colors.tooltipTypeText,
531578
borderRadius: "4px",
532579
fontWeight: "500",
533580
},
534581
".cm-sql-hover-tooltip .sql-hover-description": {
535-
color: "#374151",
582+
color: colors.info,
536583
marginBottom: "8px",
537584
},
538585
".cm-sql-hover-tooltip .sql-hover-syntax": {
539586
marginBottom: "8px",
540-
color: "#374151",
587+
color: colors.syntax,
541588
},
542589
".cm-sql-hover-tooltip .sql-hover-example": {
543590
marginBottom: "4px",
544-
color: "#374151",
591+
color: colors.example,
545592
},
546593
".cm-sql-hover-tooltip .sql-hover-columns": {
547594
marginBottom: "4px",
548-
color: "#374151",
595+
color: colors.columns,
549596
},
550597
".cm-sql-hover-tooltip .sql-hover-related": {
551598
marginBottom: "4px",
552-
color: "#374151",
599+
color: colors.related,
553600
},
554601
".cm-sql-hover-tooltip .sql-hover-path": {
555602
marginBottom: "4px",
556-
color: "#374151",
603+
color: colors.path,
557604
},
558605
".cm-sql-hover-tooltip .sql-hover-info": {
559606
marginBottom: "4px",
560-
color: "#374151",
607+
color: colors.info,
561608
},
562609
".cm-sql-hover-tooltip .sql-hover-children": {
563610
marginBottom: "4px",
564-
color: "#6b7280",
611+
color: colors.tooltipChildren,
565612
fontSize: "12px",
566613
},
567614
".cm-sql-hover-tooltip code": {
568-
backgroundColor: "#f9fafb",
615+
backgroundColor: colors.codeBg,
569616
padding: "1px 4px",
570617
borderRadius: "3px",
571618
fontSize: "12px",
572619
fontFamily: "ui-monospace, 'SF Mono', 'Monaco', 'Cascadia Code', 'Roboto Mono', monospace",
573-
color: "#1f2937",
620+
color: colors.codeText,
574621
},
575622
".cm-sql-hover-tooltip strong": {
576623
fontWeight: "600",
577-
color: "#111827",
624+
color: colors.strong,
578625
},
579626
".cm-sql-hover-tooltip em": {
580627
fontStyle: "italic",
581-
color: "#6b7280",
582-
},
583-
// Dark theme support
584-
".cm-editor.cm-focused.cm-dark .cm-sql-hover-tooltip": {
585-
backgroundColor: "#1f2937",
586-
borderColor: "#374151",
587-
color: "#f9fafb",
588-
},
589-
".cm-editor.cm-focused.cm-dark .cm-sql-hover-tooltip .sql-hover-type": {
590-
backgroundColor: "#374151",
591-
color: "#9ca3af",
592-
},
593-
".cm-editor.cm-focused.cm-dark .cm-sql-hover-tooltip .sql-hover-description": {
594-
color: "#d1d5db",
595-
},
596-
".cm-editor.cm-focused.cm-dark .cm-sql-hover-tooltip .sql-hover-syntax": {
597-
color: "#d1d5db",
598-
},
599-
".cm-editor.cm-focused.cm-dark .cm-sql-hover-tooltip .sql-hover-example": {
600-
color: "#d1d5db",
601-
},
602-
".cm-editor.cm-focused.cm-dark .cm-sql-hover-tooltip .sql-hover-columns": {
603-
color: "#d1d5db",
604-
},
605-
".cm-editor.cm-focused.cm-dark .cm-sql-hover-tooltip .sql-hover-related": {
606-
color: "#d1d5db",
607-
},
608-
".cm-editor.cm-focused.cm-dark .cm-sql-hover-tooltip .sql-hover-path": {
609-
color: "#d1d5db",
610-
},
611-
".cm-editor.cm-focused.cm-dark .cm-sql-hover-tooltip .sql-hover-info": {
612-
color: "#d1d5db",
613-
},
614-
".cm-editor.cm-focused.cm-dark .cm-sql-hover-tooltip .sql-hover-children": {
615-
color: "#9ca3af",
616-
},
617-
".cm-editor.cm-focused.cm-dark .cm-sql-hover-tooltip code": {
618-
backgroundColor: "#374151",
619-
color: "#f3f4f6",
620-
},
621-
".cm-editor.cm-focused.cm-dark .cm-sql-hover-tooltip strong": {
622-
color: "#ffffff",
623-
},
624-
".cm-editor.cm-focused.cm-dark .cm-sql-hover-tooltip em": {
625-
color: "#9ca3af",
628+
color: colors.em,
626629
},
627630
});
631+
};

0 commit comments

Comments
 (0)