feat(sidebar): add indentation and font size settings

This commit is contained in:
Domye authored and GitHub committed 2026-08-15 14:44:35 +08:00
1 parent 98df975614
commit 745483cd6c
16 files changed
+164 -13

No files matched your search

@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
import { alignedCommentLeadingWidth, alignedSidebarCommentLabelWidths, canTreeNodeShowExpander, sidebarTreeNaturalContentWidth, sidebarTreeNodeComment, trailingCommentAvailableWidth, treeLabelWidthClass, usesFullWidthTreeLabel } from "@/lib/sidebar/sidebarTreeItemLayout";
import { alignedCommentLeadingWidth, alignedSidebarCommentLabelWidths, canTreeNodeShowExpander, sidebarTreeNaturalContentWidth, sidebarTreeNodeComment, trailingCommentAvailableWidth, treeItemPaddingLeft, treeLabelWidthClass, usesFullWidthTreeLabel } from "@/lib/sidebar/sidebarTreeItemLayout";
import type { TreeNode } from "@/types/database";
describe("sidebar tree item layout", () => {
@@ -91,4 +91,16 @@ describe("sidebar tree item layout", () => {
it("returns zero when no tree row uses natural width", () => {
expect(sidebarTreeNaturalContentWidth([{ depth: 2, label: "commented", usesNaturalWidth: false }], (text) => text.length * 7)).toBe(0);
});
it("applies a configurable per-depth indent to rows and natural-width measurement", () => {
// Default keeps the historical 16px per level.
expect(treeItemPaddingLeft(2)).toBe("40px");
expect(treeItemPaddingLeft(2, 24)).toBe("56px");
expect(treeItemPaddingLeft(0, 24)).toBe("8px");
const items = [{ depth: 4, label: "nested", usesNaturalWidth: true, trailingWidth: 20 }];
const measure = (text: string) => text.length * 7;
expect(sidebarTreeNaturalContentWidth(items, measure, 16)).toBe(4 * 16 + 8 + 54 + "nested".length * 7 + 20);
expect(sidebarTreeNaturalContentWidth(items, measure, 32)).toBe(4 * 32 + 8 + 54 + "nested".length * 7 + 20);
});
});
@@ -63,6 +63,8 @@ export const EDITOR_SETTINGS_DRAFT_KEYS = [
"updateNotificationsEnabled",
"sidebarObjectInfoMode",
"sidebarAllowHorizontalScroll",
"sidebarIndent",
"sidebarFontSize",
"sidebarHiddenTablePrefixes",
"exportBatchSize",
"exportRowLimitEnabled",
@@ -167,6 +167,8 @@ export const SETTINGS_SEARCH_DEFINITIONS: readonly SettingsSearchDefinition[] =
{ id: "navigation-open-database-on-single-click", category: "navigation", titleKey: "settings.sidebarOpenDatabaseOnSingleClick", descriptionKey: "settings.sidebarOpenDatabaseOnSingleClickDescription", targetId: "navigation" },
{ id: "navigation-tabs-restore", category: "navigation", titleKey: "settings.openTabsRestoreMode", descriptionKey: "settings.openTabsRestoreModeDescription", targetId: "navigation" },
{ id: "navigation-sidebar-scroll", category: "navigation", titleKey: "settings.sidebarAllowHorizontalScroll", descriptionKey: "settings.sidebarAllowHorizontalScrollDescription", targetId: "navigation" },
{ id: "navigation-sidebar-indent", category: "navigation", titleKey: "settings.sidebarIndent", descriptionKey: "settings.sidebarIndentDescription", targetId: "navigation" },
{ id: "navigation-sidebar-font-size", category: "navigation", titleKey: "settings.sidebarFontSize", descriptionKey: "settings.sidebarFontSizeDescription", targetId: "navigation" },
{ id: "navigation-hidden-tables", category: "navigation", titleKey: "settings.sidebarHiddenTablePrefixes", descriptionKey: "settings.sidebarHiddenTablePrefixesDescription", targetId: "navigation" },
{ id: "navigation-table-page-size", category: "navigation", titleKey: "settings.sidebarTablePageSize", descriptionKey: "settings.sidebarTablePageSizeDescription", targetId: "navigation" },
{ id: "navigation-disconnect-tabs", category: "navigation", titleKey: "settings.disconnectTabHandlingMode", descriptionKey: "settings.disconnectTabHandlingModeDescription", targetId: "navigation" },
@@ -63,8 +63,10 @@ const pinnableTypes: Set<TreeNodeType> = new Set([
const commentTypes: Set<TreeNodeType> = new Set(["connection", "schema", "table", "view", "materialized_view", "column", "mongo-collection", "vector-collection", "elasticsearch-index"]);
export function treeItemPaddingLeft(depth: number): string {
return `${depth * 16 + 8}px`;
export const SIDEBAR_INDENT_DEFAULT_PX = 16;
export function treeItemPaddingLeft(depth: number, indentPx = SIDEBAR_INDENT_DEFAULT_PX): string {
return `${depth * indentPx + 8}px`;
}
export const trailingCommentGapPx = 8;
@@ -97,11 +99,11 @@ export interface SidebarTreeNaturalWidthItem {
// Right padding, expander/icon widths and the two flex gaps before the label.
const sidebarTreeRowChromeWidth = 54;
export function sidebarTreeNaturalContentWidth(items: readonly SidebarTreeNaturalWidthItem[], measureText: (text: string) => number): number {
export function sidebarTreeNaturalContentWidth(items: readonly SidebarTreeNaturalWidthItem[], measureText: (text: string) => number, indentPx = SIDEBAR_INDENT_DEFAULT_PX): number {
let width = 0;
for (const item of items) {
if (!item.usesNaturalWidth) continue;
const paddingLeft = item.depth * 16 + 8;
const paddingLeft = item.depth * indentPx + 8;
width = Math.max(width, Math.ceil(paddingLeft + sidebarTreeRowChromeWidth + measureText(item.label) + (item.trailingWidth ?? 0)));
}
return width;