@ponythewhite/base-context 1.0.1 → 1.0.4
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/CHANGELOG.md +18 -0
- package/dist/base-context-runtime/pyproject.toml +1 -1
- package/dist/base-context-runtime/src/rlm/mcp.py +39 -17
- package/dist/base-context-runtime/test/test_mcp.py +87 -1
- package/dist/base-context-runtime/uv.lock +1 -1
- package/dist/build-info.json +1 -1
- package/dist/bundle/{bundled-modules-TXUMJ2XQ.js → bundled-modules-R5EAJ62K.js} +2 -2
- package/dist/bundle/{chunk-S3INFPZZ.js → chunk-BV25CVRM.js} +378 -199
- package/dist/bundle/{chunk-V3L54UD6.js → chunk-XDJ56NJA.js} +26 -11
- package/dist/bundle/{cli-main-BYMSRPH6.js → cli-main-OUKN743U.js} +2 -2
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/{main-ODOYCEQC.js → main-QPCXSW6X.js} +2 -2
- package/dist/cli/daemon-ps.d.ts.map +1 -1
- package/dist/cli/daemon-ps.js +1 -0
- package/dist/cli/daemon-ps.js.map +1 -1
- package/dist/core/auth-storage.d.ts +4 -0
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +77 -19
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/kernel/bootstrap.d.ts.map +1 -1
- package/dist/core/kernel/bootstrap.js +5 -2
- package/dist/core/kernel/bootstrap.js.map +1 -1
- package/dist/core/mcp/mcp-manager.d.ts.map +1 -1
- package/dist/core/mcp/mcp-manager.js +2 -2
- package/dist/core/mcp/mcp-manager.js.map +1 -1
- package/dist/installer.mjs +5 -2
- package/dist/modes/daemon/daemon-supervisor-ownership.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-supervisor-ownership.js +16 -16
- package/dist/modes/daemon/daemon-supervisor-ownership.js.map +1 -1
- package/dist/modes/interactive/auth-flows.d.ts.map +1 -1
- package/dist/modes/interactive/auth-flows.js +7 -6
- package/dist/modes/interactive/auth-flows.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +3 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +3 -1
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/menu-panel.d.ts +1 -0
- package/dist/modes/interactive/components/menu-panel.d.ts.map +1 -1
- package/dist/modes/interactive/components/menu-panel.js +3 -0
- package/dist/modes/interactive/components/menu-panel.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +7 -5
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +2 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +58 -31
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-panel.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/menu-panel.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Component,\n\tContainer,\n\ttype Focusable,\n\tInput,\n\ttruncateToWidth,\n\tvisibleWidth,\n\twrapTextWithAnsi,\n} from \"@ponythewhite/base-context-tui\";\nimport { theme } from \"../theme/theme.js\";\n\ninterface MenuPanelOptions {\n\ttitle: string;\n\tsubtitle?: string;\n}\n\nexport interface MenuViewportProvider {\n\tgetRows?: () => number;\n}\n\ninterface MenuListOptions {\n\tcompact?: boolean | (() => boolean);\n}\n\ninterface MenuListLayoutOptions extends MenuViewportProvider {\n\tpreferredVisibleItems: number;\n\tminVisibleItems?: number;\n\ttotalItems?: number;\n\treservedRows: number;\n\tcomfortableItemRows: number;\n\tcompactItemRows?: number;\n\tscrollIndicatorRows?: number;\n\tcomfortableListPaddingRows?: number;\n\tcompactListPaddingRows?: number;\n}\n\nexport interface MenuListLayout {\n\tcompact: boolean;\n\tvisibleItems: number;\n}\n\nconst PANEL_PADDING_X = 2;\nconst PANEL_PADDING_Y = 1;\nconst FIELD_PADDING_X = 2;\nconst ROW_PADDING_X = 2;\nconst ROW_PADDING_Y = 1;\nconst ANSI_RESET = \"\\x1b[0m\";\n\nexport function getMenuPanelInnerWidth(width: number): number {\n\tconst safeWidth = Math.max(PANEL_PADDING_X * 2 + 1, width);\n\treturn Math.max(1, safeWidth - PANEL_PADDING_X * 2);\n}\n\ninterface FullWidthMenuComponent {\n\treadonly fillsMenuPanel: true;\n}\n\nfunction fillsMenuPanel(component: Component): component is Component & FullWidthMenuComponent {\n\treturn (component as { fillsMenuPanel?: unknown }).fillsMenuPanel === true;\n}\n\nfunction getViewportRows(getRows: (() => number) | undefined): number | undefined {\n\tconst rows = getRows?.();\n\tif (rows === undefined || !Number.isFinite(rows) || rows <= 0) {\n\t\treturn undefined;\n\t}\n\treturn Math.floor(rows);\n}\n\nfunction visibleItemCount(\n\trows: number,\n\toptions: {\n\t\tpreferredVisibleItems: number;\n\t\tminVisibleItems: number;\n\t\treservedRows: number;\n\t\titemRows: number;\n\t\tlistPaddingRows: number;\n\t\textraRows: number;\n\t},\n): number {\n\tconst capacityRows = Math.max(0, rows - options.reservedRows - options.listPaddingRows - options.extraRows);\n\tconst itemCapacity = Math.floor(capacityRows / options.itemRows);\n\treturn Math.max(options.minVisibleItems, Math.min(options.preferredVisibleItems, itemCapacity));\n}\n\nfunction listRowsUsed(options: {\n\treservedRows: number;\n\tlistPaddingRows: number;\n\tvisibleItems: number;\n\titemRows: number;\n\textraRows: number;\n}): number {\n\treturn options.reservedRows + options.listPaddingRows + options.extraRows + options.visibleItems * options.itemRows;\n}\n\nfunction scrollIndicatorRows(options: {\n\ttotalItems: number | undefined;\n\tvisibleItems: number;\n\tscrollIndicatorRows: number;\n}): number {\n\tif (options.totalItems === undefined || options.scrollIndicatorRows <= 0) {\n\t\treturn 0;\n\t}\n\treturn options.totalItems > options.visibleItems ? options.scrollIndicatorRows : 0;\n}\n\nfunction getLayoutCandidate(\n\trows: number,\n\toptions: MenuListLayoutOptions,\n\titemRows: number,\n\tlistPaddingRows: number,\n\tcompact: boolean,\n): MenuListLayout & { rowsUsed: number; fits: boolean } {\n\tconst minVisibleItems = options.minVisibleItems ?? 1;\n\tconst preferredVisibleItems = Math.max(minVisibleItems, options.preferredVisibleItems);\n\tconst visibleItemsWithoutScroll = visibleItemCount(rows, {\n\t\tpreferredVisibleItems,\n\t\tminVisibleItems,\n\t\treservedRows: options.reservedRows,\n\t\titemRows,\n\t\tlistPaddingRows,\n\t\textraRows: 0,\n\t});\n\tconst extraRows = scrollIndicatorRows({\n\t\ttotalItems: options.totalItems,\n\t\tvisibleItems: visibleItemsWithoutScroll,\n\t\tscrollIndicatorRows: options.scrollIndicatorRows ?? 0,\n\t});\n\tconst visibleItems =\n\t\textraRows > 0\n\t\t\t? visibleItemCount(rows, {\n\t\t\t\t\tpreferredVisibleItems,\n\t\t\t\t\tminVisibleItems,\n\t\t\t\t\treservedRows: options.reservedRows,\n\t\t\t\t\titemRows,\n\t\t\t\t\tlistPaddingRows,\n\t\t\t\t\textraRows,\n\t\t\t\t})\n\t\t\t: visibleItemsWithoutScroll;\n\tconst rowsUsed = listRowsUsed({\n\t\treservedRows: options.reservedRows,\n\t\tlistPaddingRows,\n\t\tvisibleItems,\n\t\titemRows,\n\t\textraRows,\n\t});\n\treturn {\n\t\tcompact,\n\t\tvisibleItems,\n\t\trowsUsed,\n\t\tfits: rowsUsed <= rows,\n\t};\n}\n\nexport function getMenuListLayout(options: MenuListLayoutOptions): MenuListLayout {\n\tconst minVisibleItems = options.minVisibleItems ?? 1;\n\tconst preferredVisibleItems = Math.max(minVisibleItems, options.preferredVisibleItems);\n\tconst rows = getViewportRows(options.getRows);\n\tif (rows === undefined) {\n\t\treturn { compact: false, visibleItems: preferredVisibleItems };\n\t}\n\n\tconst comfortableLayout = getLayoutCandidate(\n\t\trows,\n\t\toptions,\n\t\tMath.max(1, options.comfortableItemRows),\n\t\toptions.comfortableListPaddingRows ?? 1,\n\t\tfalse,\n\t);\n\tif (options.compactItemRows === undefined) {\n\t\treturn { compact: false, visibleItems: comfortableLayout.visibleItems };\n\t}\n\n\tconst compactLayout = getLayoutCandidate(\n\t\trows,\n\t\toptions,\n\t\tMath.max(1, options.compactItemRows),\n\t\toptions.compactListPaddingRows ?? 0,\n\t\ttrue,\n\t);\n\tif (compactLayout.fits && (!comfortableLayout.fits || compactLayout.visibleItems > comfortableLayout.visibleItems)) {\n\t\treturn { compact: true, visibleItems: compactLayout.visibleItems };\n\t}\n\tif (comfortableLayout.fits) {\n\t\treturn { compact: false, visibleItems: comfortableLayout.visibleItems };\n\t}\n\treturn compactLayout.rowsUsed <= comfortableLayout.rowsUsed\n\t\t? { compact: true, visibleItems: compactLayout.visibleItems }\n\t\t: { compact: false, visibleItems: comfortableLayout.visibleItems };\n}\n\nfunction paddedBackgroundLine(\n\ttext: string,\n\twidth: number,\n\tpaddingX: number,\n\tbackground: ((text: string) => string) | undefined,\n): string {\n\tconst innerWidth = Math.max(1, width - paddingX * 2);\n\tconst content = truncateToWidth(text, innerWidth, \"\");\n\tconst rightPadding = \" \".repeat(Math.max(0, innerWidth - visibleWidth(content)));\n\tconst contentSpan = \" \".repeat(paddingX) + content;\n\tconst trailingSpan = rightPadding + \" \".repeat(paddingX);\n\tif (!background) {\n\t\treturn contentSpan + trailingSpan;\n\t}\n\treturn applyBackground(contentSpan, background) + background(trailingSpan);\n}\n\nfunction applyBackground(text: string, background: (text: string) => string): string {\n\treturn text\n\t\t.split(ANSI_RESET)\n\t\t.map((segment) => background(segment))\n\t\t.join(ANSI_RESET);\n}\n\nfunction surfaceLine(text: string, width: number, paddingX = PANEL_PADDING_X): string {\n\treturn paddedBackgroundLine(text, width, paddingX, theme.getEditorBackgroundColor());\n}\n\nfunction surfaceWrappedLines(text: string, width: number, paddingX = PANEL_PADDING_X): string[] {\n\tconst innerWidth = Math.max(1, width - paddingX * 2);\n\treturn wrapTextWithAnsi(text, innerWidth).map((content) => surfaceLine(content, width, paddingX));\n}\n\nexport class MenuPanel extends Container {\n\tprivate title: string;\n\n\tconstructor(private readonly options: MenuPanelOptions) {\n\t\tsuper();\n\t\tthis.title = options.title;\n\t}\n\n\tsetTitle(title: string): void {\n\t\tthis.title = title;\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst safeWidth = Math.max(PANEL_PADDING_X * 2 + 1, width);\n\t\tconst innerWidth = getMenuPanelInnerWidth(width);\n\t\tconst lines: string[] = [];\n\n\t\tfor (let i = 0; i < PANEL_PADDING_Y; i++) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\t\tconst hasTitle = this.title.trim().length > 0;\n\t\tconst subtitle = this.options.subtitle?.trim();\n\t\tconst hasSubtitle = subtitle !== undefined && subtitle.length > 0;\n\t\tconst hasHeader = hasTitle || hasSubtitle;\n\t\tif (hasTitle) {\n\t\t\tlines.push(surfaceLine(theme.bold(theme.fg(\"text\", this.title)), safeWidth));\n\t\t}\n\t\tif (hasSubtitle) {\n\t\t\tlines.push(...surfaceWrappedLines(theme.fg(\"muted\", subtitle), safeWidth));\n\t\t}\n\t\tif (hasHeader) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\n\t\tfor (const child of this.children) {\n\t\t\tconst childLines = fillsMenuPanel(child) ? child.render(safeWidth) : child.render(innerWidth);\n\t\t\tfor (const line of childLines) {\n\t\t\t\tlines.push(fillsMenuPanel(child) ? line : surfaceLine(line, safeWidth));\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = 0; i < PANEL_PADDING_Y; i++) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\t\treturn lines;\n\t}\n}\n\nexport class MenuSearchInput implements Component, Focusable, FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\tprivate readonly input = new Input();\n\n\tconstructor(private readonly placeholder: string) {}\n\n\tget focused(): boolean {\n\t\treturn this.input.focused;\n\t}\n\n\tset focused(value: boolean) {\n\t\tthis.input.focused = value;\n\t}\n\n\tset onSubmit(handler: ((value: string) => void) | undefined) {\n\t\tthis.input.onSubmit = handler;\n\t}\n\n\tgetValue(): string {\n\t\treturn this.input.getValue();\n\t}\n\n\tgetCursor(): number {\n\t\treturn this.input.getCursor();\n\t}\n\n\tsetValue(value: string): void {\n\t\tthis.input.setValue(value);\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.input.handleInput(data);\n\t}\n\n\tinvalidate(): void {\n\t\tthis.input.invalidate();\n\t}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(FIELD_PADDING_X * 2 + 1, width);\n\t\tconst innerWidth = Math.max(1, safeWidth - FIELD_PADDING_X * 2);\n\t\tconst content =\n\t\t\tthis.getValue() === \"\" && !this.focused\n\t\t\t\t? theme.fg(\"dim\", this.placeholder)\n\t\t\t\t: this.stripInputPrompt(this.input.render(innerWidth + 2)[0] ?? \"\");\n\t\treturn [paddedBackgroundLine(content, safeWidth, FIELD_PADDING_X, theme.getEditorBackgroundColor())];\n\t}\n\n\tprivate stripInputPrompt(line: string): string {\n\t\treturn line.startsWith(\"> \") ? line.slice(2) : line;\n\t}\n}\n\ninterface MenuRowOptions {\n\tprimary: string;\n\tsecondary?: string;\n\tmeta?: string;\n\tselected: boolean;\n}\n\nexport class MenuRow implements Component, FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\n\tconstructor(private readonly options: MenuRowOptions) {}\n\n\tget selected(): boolean {\n\t\treturn this.options.selected;\n\t}\n\n\tinvalidate(): void {\n\t\t// Row render is derived from constructor options.\n\t}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\treturn [\n\t\t\t...this.renderPadding(safeWidth, this.selected),\n\t\t\t...this.renderContent(safeWidth),\n\t\t\t...this.renderPadding(safeWidth, this.selected),\n\t\t];\n\t}\n\n\trenderContent(width: number): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\tconst meta = this.options.meta ? theme.fg(\"muted\", this.options.meta) : \"\";\n\t\tconst secondary = this.options.secondary ? theme.fg(\"muted\", this.options.secondary) : \"\";\n\t\tconst primary = this.options.selected\n\t\t\t? theme.bold(theme.fg(\"text\", this.options.primary))\n\t\t\t: theme.fg(\"text\", this.options.primary);\n\t\tconst innerWidth = Math.max(1, safeWidth - ROW_PADDING_X * 2);\n\t\tconst metaWidth = visibleWidth(meta);\n\t\tconst gap = meta ? 2 : 0;\n\t\tconst primaryWidth = Math.max(1, innerWidth - metaWidth - gap);\n\t\tconst primaryText = truncateToWidth(primary, primaryWidth, \"\", true);\n\t\tconst primaryLine = meta ? primaryText + \" \".repeat(gap) + meta : primaryText;\n\t\tconst lines: string[] = [];\n\t\tlines.push(this.rowLine(primaryLine, safeWidth, this.selected));\n\t\tif (secondary) {\n\t\t\tlines.push(this.rowLine(truncateToWidth(secondary, innerWidth, \"\", true), safeWidth, this.selected));\n\t\t}\n\t\treturn lines;\n\t}\n\n\trenderPadding(width: number, selected: boolean): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\tconst lines: string[] = [];\n\t\tfor (let i = 0; i < ROW_PADDING_Y; i++) {\n\t\t\tlines.push(this.rowLine(\"\", safeWidth, selected));\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate rowLine(text: string, width: number, selected: boolean): string {\n\t\tconst background = selected ? theme.getSelectionBackgroundColor() : theme.getEditorBackgroundColor();\n\t\treturn paddedBackgroundLine(text, width, ROW_PADDING_X, background);\n\t}\n}\n\nexport class MenuList extends Container implements FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\n\tconstructor(private readonly options: MenuListOptions = {}) {\n\t\tsuper();\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tconst compact = this.isCompact();\n\t\tfor (let index = 0; index < this.children.length; index++) {\n\t\t\tconst child = this.children[index];\n\t\t\tif (child instanceof MenuRow) {\n\t\t\t\tif (compact) {\n\t\t\t\t\tlines.push(...child.renderContent(width));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst previousChild = this.children[index - 1];\n\t\t\t\tconst nextChild = this.children[index + 1];\n\t\t\t\tconst previousRow = previousChild instanceof MenuRow ? previousChild : undefined;\n\t\t\t\tconst nextRow = nextChild instanceof MenuRow ? nextChild : undefined;\n\t\t\t\tlines.push(...child.renderPadding(width, child.selected || previousRow?.selected === true));\n\t\t\t\tlines.push(...child.renderContent(width));\n\t\t\t\tif (!nextRow) {\n\t\t\t\t\tlines.push(...child.renderPadding(width, child.selected));\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst childLines = fillsMenuPanel(child)\n\t\t\t\t? child.render(width)\n\t\t\t\t: child.render(Math.max(1, width - PANEL_PADDING_X * 2));\n\t\t\tfor (const line of childLines) {\n\t\t\t\tlines.push(fillsMenuPanel(child) ? line : surfaceLine(line, width));\n\t\t\t}\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate isCompact(): boolean {\n\t\tconst compact = this.options.compact;\n\t\treturn typeof compact === \"function\" ? compact() : compact === true;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"menu-panel.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/menu-panel.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Component,\n\tContainer,\n\ttype Focusable,\n\tInput,\n\ttruncateToWidth,\n\tvisibleWidth,\n\twrapTextWithAnsi,\n} from \"@ponythewhite/base-context-tui\";\nimport { theme } from \"../theme/theme.js\";\n\ninterface MenuPanelOptions {\n\ttitle: string;\n\tsubtitle?: string;\n}\n\nexport interface MenuViewportProvider {\n\tgetRows?: () => number;\n}\n\ninterface MenuListOptions {\n\tcompact?: boolean | (() => boolean);\n}\n\ninterface MenuListLayoutOptions extends MenuViewportProvider {\n\tpreferredVisibleItems: number;\n\tminVisibleItems?: number;\n\ttotalItems?: number;\n\treservedRows: number;\n\tcomfortableItemRows: number;\n\tcompactItemRows?: number;\n\tscrollIndicatorRows?: number;\n\tcomfortableListPaddingRows?: number;\n\tcompactListPaddingRows?: number;\n}\n\nexport interface MenuListLayout {\n\tcompact: boolean;\n\tvisibleItems: number;\n}\n\nconst PANEL_PADDING_X = 2;\nconst PANEL_PADDING_Y = 1;\nconst FIELD_PADDING_X = 2;\nconst ROW_PADDING_X = 2;\nconst ROW_PADDING_Y = 1;\nconst ANSI_RESET = \"\\x1b[0m\";\n\nexport function getMenuPanelInnerWidth(width: number): number {\n\tconst safeWidth = Math.max(PANEL_PADDING_X * 2 + 1, width);\n\treturn Math.max(1, safeWidth - PANEL_PADDING_X * 2);\n}\n\ninterface FullWidthMenuComponent {\n\treadonly fillsMenuPanel: true;\n}\n\nfunction fillsMenuPanel(component: Component): component is Component & FullWidthMenuComponent {\n\treturn (component as { fillsMenuPanel?: unknown }).fillsMenuPanel === true;\n}\n\nfunction getViewportRows(getRows: (() => number) | undefined): number | undefined {\n\tconst rows = getRows?.();\n\tif (rows === undefined || !Number.isFinite(rows) || rows <= 0) {\n\t\treturn undefined;\n\t}\n\treturn Math.floor(rows);\n}\n\nfunction visibleItemCount(\n\trows: number,\n\toptions: {\n\t\tpreferredVisibleItems: number;\n\t\tminVisibleItems: number;\n\t\treservedRows: number;\n\t\titemRows: number;\n\t\tlistPaddingRows: number;\n\t\textraRows: number;\n\t},\n): number {\n\tconst capacityRows = Math.max(0, rows - options.reservedRows - options.listPaddingRows - options.extraRows);\n\tconst itemCapacity = Math.floor(capacityRows / options.itemRows);\n\treturn Math.max(options.minVisibleItems, Math.min(options.preferredVisibleItems, itemCapacity));\n}\n\nfunction listRowsUsed(options: {\n\treservedRows: number;\n\tlistPaddingRows: number;\n\tvisibleItems: number;\n\titemRows: number;\n\textraRows: number;\n}): number {\n\treturn options.reservedRows + options.listPaddingRows + options.extraRows + options.visibleItems * options.itemRows;\n}\n\nfunction scrollIndicatorRows(options: {\n\ttotalItems: number | undefined;\n\tvisibleItems: number;\n\tscrollIndicatorRows: number;\n}): number {\n\tif (options.totalItems === undefined || options.scrollIndicatorRows <= 0) {\n\t\treturn 0;\n\t}\n\treturn options.totalItems > options.visibleItems ? options.scrollIndicatorRows : 0;\n}\n\nfunction getLayoutCandidate(\n\trows: number,\n\toptions: MenuListLayoutOptions,\n\titemRows: number,\n\tlistPaddingRows: number,\n\tcompact: boolean,\n): MenuListLayout & { rowsUsed: number; fits: boolean } {\n\tconst minVisibleItems = options.minVisibleItems ?? 1;\n\tconst preferredVisibleItems = Math.max(minVisibleItems, options.preferredVisibleItems);\n\tconst visibleItemsWithoutScroll = visibleItemCount(rows, {\n\t\tpreferredVisibleItems,\n\t\tminVisibleItems,\n\t\treservedRows: options.reservedRows,\n\t\titemRows,\n\t\tlistPaddingRows,\n\t\textraRows: 0,\n\t});\n\tconst extraRows = scrollIndicatorRows({\n\t\ttotalItems: options.totalItems,\n\t\tvisibleItems: visibleItemsWithoutScroll,\n\t\tscrollIndicatorRows: options.scrollIndicatorRows ?? 0,\n\t});\n\tconst visibleItems =\n\t\textraRows > 0\n\t\t\t? visibleItemCount(rows, {\n\t\t\t\t\tpreferredVisibleItems,\n\t\t\t\t\tminVisibleItems,\n\t\t\t\t\treservedRows: options.reservedRows,\n\t\t\t\t\titemRows,\n\t\t\t\t\tlistPaddingRows,\n\t\t\t\t\textraRows,\n\t\t\t\t})\n\t\t\t: visibleItemsWithoutScroll;\n\tconst rowsUsed = listRowsUsed({\n\t\treservedRows: options.reservedRows,\n\t\tlistPaddingRows,\n\t\tvisibleItems,\n\t\titemRows,\n\t\textraRows,\n\t});\n\treturn {\n\t\tcompact,\n\t\tvisibleItems,\n\t\trowsUsed,\n\t\tfits: rowsUsed <= rows,\n\t};\n}\n\nexport function getMenuListLayout(options: MenuListLayoutOptions): MenuListLayout {\n\tconst minVisibleItems = options.minVisibleItems ?? 1;\n\tconst preferredVisibleItems = Math.max(minVisibleItems, options.preferredVisibleItems);\n\tconst rows = getViewportRows(options.getRows);\n\tif (rows === undefined) {\n\t\treturn { compact: false, visibleItems: preferredVisibleItems };\n\t}\n\n\tconst comfortableLayout = getLayoutCandidate(\n\t\trows,\n\t\toptions,\n\t\tMath.max(1, options.comfortableItemRows),\n\t\toptions.comfortableListPaddingRows ?? 1,\n\t\tfalse,\n\t);\n\tif (options.compactItemRows === undefined) {\n\t\treturn { compact: false, visibleItems: comfortableLayout.visibleItems };\n\t}\n\n\tconst compactLayout = getLayoutCandidate(\n\t\trows,\n\t\toptions,\n\t\tMath.max(1, options.compactItemRows),\n\t\toptions.compactListPaddingRows ?? 0,\n\t\ttrue,\n\t);\n\tif (compactLayout.fits && (!comfortableLayout.fits || compactLayout.visibleItems > comfortableLayout.visibleItems)) {\n\t\treturn { compact: true, visibleItems: compactLayout.visibleItems };\n\t}\n\tif (comfortableLayout.fits) {\n\t\treturn { compact: false, visibleItems: comfortableLayout.visibleItems };\n\t}\n\treturn compactLayout.rowsUsed <= comfortableLayout.rowsUsed\n\t\t? { compact: true, visibleItems: compactLayout.visibleItems }\n\t\t: { compact: false, visibleItems: comfortableLayout.visibleItems };\n}\n\nfunction paddedBackgroundLine(\n\ttext: string,\n\twidth: number,\n\tpaddingX: number,\n\tbackground: ((text: string) => string) | undefined,\n): string {\n\tconst innerWidth = Math.max(1, width - paddingX * 2);\n\tconst content = truncateToWidth(text, innerWidth, \"\");\n\tconst rightPadding = \" \".repeat(Math.max(0, innerWidth - visibleWidth(content)));\n\tconst contentSpan = \" \".repeat(paddingX) + content;\n\tconst trailingSpan = rightPadding + \" \".repeat(paddingX);\n\tif (!background) {\n\t\treturn contentSpan + trailingSpan;\n\t}\n\treturn applyBackground(contentSpan, background) + background(trailingSpan);\n}\n\nfunction applyBackground(text: string, background: (text: string) => string): string {\n\treturn text\n\t\t.split(ANSI_RESET)\n\t\t.map((segment) => background(segment))\n\t\t.join(ANSI_RESET);\n}\n\nfunction surfaceLine(text: string, width: number, paddingX = PANEL_PADDING_X): string {\n\treturn paddedBackgroundLine(text, width, paddingX, theme.getEditorBackgroundColor());\n}\n\nfunction surfaceWrappedLines(text: string, width: number, paddingX = PANEL_PADDING_X): string[] {\n\tconst innerWidth = Math.max(1, width - paddingX * 2);\n\treturn wrapTextWithAnsi(text, innerWidth).map((content) => surfaceLine(content, width, paddingX));\n}\n\nexport class MenuPanel extends Container {\n\tprivate title: string;\n\n\tconstructor(private readonly options: MenuPanelOptions) {\n\t\tsuper();\n\t\tthis.title = options.title;\n\t}\n\n\tsetTitle(title: string): void {\n\t\tthis.title = title;\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst safeWidth = Math.max(PANEL_PADDING_X * 2 + 1, width);\n\t\tconst innerWidth = getMenuPanelInnerWidth(width);\n\t\tconst lines: string[] = [];\n\n\t\tfor (let i = 0; i < PANEL_PADDING_Y; i++) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\t\tconst hasTitle = this.title.trim().length > 0;\n\t\tconst subtitle = this.options.subtitle?.trim();\n\t\tconst hasSubtitle = subtitle !== undefined && subtitle.length > 0;\n\t\tconst hasHeader = hasTitle || hasSubtitle;\n\t\tif (hasTitle) {\n\t\t\tlines.push(surfaceLine(theme.bold(theme.fg(\"text\", this.title)), safeWidth));\n\t\t}\n\t\tif (hasSubtitle) {\n\t\t\tlines.push(...surfaceWrappedLines(theme.fg(\"muted\", subtitle), safeWidth));\n\t\t}\n\t\tif (hasHeader) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\n\t\tfor (const child of this.children) {\n\t\t\tconst childLines = fillsMenuPanel(child) ? child.render(safeWidth) : child.render(innerWidth);\n\t\t\tfor (const line of childLines) {\n\t\t\t\tlines.push(fillsMenuPanel(child) ? line : surfaceLine(line, safeWidth));\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = 0; i < PANEL_PADDING_Y; i++) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\t\treturn lines;\n\t}\n}\n\nexport class MenuSearchInput implements Component, Focusable, FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\tprivate readonly input = new Input();\n\n\tconstructor(private readonly placeholder: string) {}\n\n\tget focused(): boolean {\n\t\treturn this.input.focused;\n\t}\n\n\tset focused(value: boolean) {\n\t\tthis.input.focused = value;\n\t}\n\n\tset onSubmit(handler: ((value: string) => void) | undefined) {\n\t\tthis.input.onSubmit = handler;\n\t}\n\n\tgetValue(): string {\n\t\treturn this.input.getValue();\n\t}\n\n\tgetCursor(): number {\n\t\treturn this.input.getCursor();\n\t}\n\n\tsetValue(value: string): void {\n\t\tthis.input.setValue(value);\n\t}\n\n\tsetMasked(masked: boolean): void {\n\t\tthis.input.setMasked(masked);\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.input.handleInput(data);\n\t}\n\n\tinvalidate(): void {\n\t\tthis.input.invalidate();\n\t}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(FIELD_PADDING_X * 2 + 1, width);\n\t\tconst innerWidth = Math.max(1, safeWidth - FIELD_PADDING_X * 2);\n\t\tconst content =\n\t\t\tthis.getValue() === \"\" && !this.focused\n\t\t\t\t? theme.fg(\"dim\", this.placeholder)\n\t\t\t\t: this.stripInputPrompt(this.input.render(innerWidth + 2)[0] ?? \"\");\n\t\treturn [paddedBackgroundLine(content, safeWidth, FIELD_PADDING_X, theme.getEditorBackgroundColor())];\n\t}\n\n\tprivate stripInputPrompt(line: string): string {\n\t\treturn line.startsWith(\"> \") ? line.slice(2) : line;\n\t}\n}\n\ninterface MenuRowOptions {\n\tprimary: string;\n\tsecondary?: string;\n\tmeta?: string;\n\tselected: boolean;\n}\n\nexport class MenuRow implements Component, FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\n\tconstructor(private readonly options: MenuRowOptions) {}\n\n\tget selected(): boolean {\n\t\treturn this.options.selected;\n\t}\n\n\tinvalidate(): void {\n\t\t// Row render is derived from constructor options.\n\t}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\treturn [\n\t\t\t...this.renderPadding(safeWidth, this.selected),\n\t\t\t...this.renderContent(safeWidth),\n\t\t\t...this.renderPadding(safeWidth, this.selected),\n\t\t];\n\t}\n\n\trenderContent(width: number): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\tconst meta = this.options.meta ? theme.fg(\"muted\", this.options.meta) : \"\";\n\t\tconst secondary = this.options.secondary ? theme.fg(\"muted\", this.options.secondary) : \"\";\n\t\tconst primary = this.options.selected\n\t\t\t? theme.bold(theme.fg(\"text\", this.options.primary))\n\t\t\t: theme.fg(\"text\", this.options.primary);\n\t\tconst innerWidth = Math.max(1, safeWidth - ROW_PADDING_X * 2);\n\t\tconst metaWidth = visibleWidth(meta);\n\t\tconst gap = meta ? 2 : 0;\n\t\tconst primaryWidth = Math.max(1, innerWidth - metaWidth - gap);\n\t\tconst primaryText = truncateToWidth(primary, primaryWidth, \"\", true);\n\t\tconst primaryLine = meta ? primaryText + \" \".repeat(gap) + meta : primaryText;\n\t\tconst lines: string[] = [];\n\t\tlines.push(this.rowLine(primaryLine, safeWidth, this.selected));\n\t\tif (secondary) {\n\t\t\tlines.push(this.rowLine(truncateToWidth(secondary, innerWidth, \"\", true), safeWidth, this.selected));\n\t\t}\n\t\treturn lines;\n\t}\n\n\trenderPadding(width: number, selected: boolean): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\tconst lines: string[] = [];\n\t\tfor (let i = 0; i < ROW_PADDING_Y; i++) {\n\t\t\tlines.push(this.rowLine(\"\", safeWidth, selected));\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate rowLine(text: string, width: number, selected: boolean): string {\n\t\tconst background = selected ? theme.getSelectionBackgroundColor() : theme.getEditorBackgroundColor();\n\t\treturn paddedBackgroundLine(text, width, ROW_PADDING_X, background);\n\t}\n}\n\nexport class MenuList extends Container implements FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\n\tconstructor(private readonly options: MenuListOptions = {}) {\n\t\tsuper();\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tconst compact = this.isCompact();\n\t\tfor (let index = 0; index < this.children.length; index++) {\n\t\t\tconst child = this.children[index];\n\t\t\tif (child instanceof MenuRow) {\n\t\t\t\tif (compact) {\n\t\t\t\t\tlines.push(...child.renderContent(width));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst previousChild = this.children[index - 1];\n\t\t\t\tconst nextChild = this.children[index + 1];\n\t\t\t\tconst previousRow = previousChild instanceof MenuRow ? previousChild : undefined;\n\t\t\t\tconst nextRow = nextChild instanceof MenuRow ? nextChild : undefined;\n\t\t\t\tlines.push(...child.renderPadding(width, child.selected || previousRow?.selected === true));\n\t\t\t\tlines.push(...child.renderContent(width));\n\t\t\t\tif (!nextRow) {\n\t\t\t\t\tlines.push(...child.renderPadding(width, child.selected));\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst childLines = fillsMenuPanel(child)\n\t\t\t\t? child.render(width)\n\t\t\t\t: child.render(Math.max(1, width - PANEL_PADDING_X * 2));\n\t\t\tfor (const line of childLines) {\n\t\t\t\tlines.push(fillsMenuPanel(child) ? line : surfaceLine(line, width));\n\t\t\t}\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate isCompact(): boolean {\n\t\tconst compact = this.options.compact;\n\t\treturn typeof compact === \"function\" ? compact() : compact === true;\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-panel.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/menu-panel.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Component,\n\tContainer,\n\ttype Focusable,\n\tInput,\n\ttruncateToWidth,\n\tvisibleWidth,\n\twrapTextWithAnsi,\n} from \"@ponythewhite/base-context-tui\";\nimport { theme } from \"../theme/theme.js\";\n\ninterface MenuPanelOptions {\n\ttitle: string;\n\tsubtitle?: string;\n}\n\nexport interface MenuViewportProvider {\n\tgetRows?: () => number;\n}\n\ninterface MenuListOptions {\n\tcompact?: boolean | (() => boolean);\n}\n\ninterface MenuListLayoutOptions extends MenuViewportProvider {\n\tpreferredVisibleItems: number;\n\tminVisibleItems?: number;\n\ttotalItems?: number;\n\treservedRows: number;\n\tcomfortableItemRows: number;\n\tcompactItemRows?: number;\n\tscrollIndicatorRows?: number;\n\tcomfortableListPaddingRows?: number;\n\tcompactListPaddingRows?: number;\n}\n\nexport interface MenuListLayout {\n\tcompact: boolean;\n\tvisibleItems: number;\n}\n\nconst PANEL_PADDING_X = 2;\nconst PANEL_PADDING_Y = 1;\nconst FIELD_PADDING_X = 2;\nconst ROW_PADDING_X = 2;\nconst ROW_PADDING_Y = 1;\nconst ANSI_RESET = \"\\x1b[0m\";\n\nexport function getMenuPanelInnerWidth(width: number): number {\n\tconst safeWidth = Math.max(PANEL_PADDING_X * 2 + 1, width);\n\treturn Math.max(1, safeWidth - PANEL_PADDING_X * 2);\n}\n\ninterface FullWidthMenuComponent {\n\treadonly fillsMenuPanel: true;\n}\n\nfunction fillsMenuPanel(component: Component): component is Component & FullWidthMenuComponent {\n\treturn (component as { fillsMenuPanel?: unknown }).fillsMenuPanel === true;\n}\n\nfunction getViewportRows(getRows: (() => number) | undefined): number | undefined {\n\tconst rows = getRows?.();\n\tif (rows === undefined || !Number.isFinite(rows) || rows <= 0) {\n\t\treturn undefined;\n\t}\n\treturn Math.floor(rows);\n}\n\nfunction visibleItemCount(\n\trows: number,\n\toptions: {\n\t\tpreferredVisibleItems: number;\n\t\tminVisibleItems: number;\n\t\treservedRows: number;\n\t\titemRows: number;\n\t\tlistPaddingRows: number;\n\t\textraRows: number;\n\t},\n): number {\n\tconst capacityRows = Math.max(0, rows - options.reservedRows - options.listPaddingRows - options.extraRows);\n\tconst itemCapacity = Math.floor(capacityRows / options.itemRows);\n\treturn Math.max(options.minVisibleItems, Math.min(options.preferredVisibleItems, itemCapacity));\n}\n\nfunction listRowsUsed(options: {\n\treservedRows: number;\n\tlistPaddingRows: number;\n\tvisibleItems: number;\n\titemRows: number;\n\textraRows: number;\n}): number {\n\treturn options.reservedRows + options.listPaddingRows + options.extraRows + options.visibleItems * options.itemRows;\n}\n\nfunction scrollIndicatorRows(options: {\n\ttotalItems: number | undefined;\n\tvisibleItems: number;\n\tscrollIndicatorRows: number;\n}): number {\n\tif (options.totalItems === undefined || options.scrollIndicatorRows <= 0) {\n\t\treturn 0;\n\t}\n\treturn options.totalItems > options.visibleItems ? options.scrollIndicatorRows : 0;\n}\n\nfunction getLayoutCandidate(\n\trows: number,\n\toptions: MenuListLayoutOptions,\n\titemRows: number,\n\tlistPaddingRows: number,\n\tcompact: boolean,\n): MenuListLayout & { rowsUsed: number; fits: boolean } {\n\tconst minVisibleItems = options.minVisibleItems ?? 1;\n\tconst preferredVisibleItems = Math.max(minVisibleItems, options.preferredVisibleItems);\n\tconst visibleItemsWithoutScroll = visibleItemCount(rows, {\n\t\tpreferredVisibleItems,\n\t\tminVisibleItems,\n\t\treservedRows: options.reservedRows,\n\t\titemRows,\n\t\tlistPaddingRows,\n\t\textraRows: 0,\n\t});\n\tconst extraRows = scrollIndicatorRows({\n\t\ttotalItems: options.totalItems,\n\t\tvisibleItems: visibleItemsWithoutScroll,\n\t\tscrollIndicatorRows: options.scrollIndicatorRows ?? 0,\n\t});\n\tconst visibleItems =\n\t\textraRows > 0\n\t\t\t? visibleItemCount(rows, {\n\t\t\t\t\tpreferredVisibleItems,\n\t\t\t\t\tminVisibleItems,\n\t\t\t\t\treservedRows: options.reservedRows,\n\t\t\t\t\titemRows,\n\t\t\t\t\tlistPaddingRows,\n\t\t\t\t\textraRows,\n\t\t\t\t})\n\t\t\t: visibleItemsWithoutScroll;\n\tconst rowsUsed = listRowsUsed({\n\t\treservedRows: options.reservedRows,\n\t\tlistPaddingRows,\n\t\tvisibleItems,\n\t\titemRows,\n\t\textraRows,\n\t});\n\treturn {\n\t\tcompact,\n\t\tvisibleItems,\n\t\trowsUsed,\n\t\tfits: rowsUsed <= rows,\n\t};\n}\n\nexport function getMenuListLayout(options: MenuListLayoutOptions): MenuListLayout {\n\tconst minVisibleItems = options.minVisibleItems ?? 1;\n\tconst preferredVisibleItems = Math.max(minVisibleItems, options.preferredVisibleItems);\n\tconst rows = getViewportRows(options.getRows);\n\tif (rows === undefined) {\n\t\treturn { compact: false, visibleItems: preferredVisibleItems };\n\t}\n\n\tconst comfortableLayout = getLayoutCandidate(\n\t\trows,\n\t\toptions,\n\t\tMath.max(1, options.comfortableItemRows),\n\t\toptions.comfortableListPaddingRows ?? 1,\n\t\tfalse,\n\t);\n\tif (options.compactItemRows === undefined) {\n\t\treturn { compact: false, visibleItems: comfortableLayout.visibleItems };\n\t}\n\n\tconst compactLayout = getLayoutCandidate(\n\t\trows,\n\t\toptions,\n\t\tMath.max(1, options.compactItemRows),\n\t\toptions.compactListPaddingRows ?? 0,\n\t\ttrue,\n\t);\n\tif (compactLayout.fits && (!comfortableLayout.fits || compactLayout.visibleItems > comfortableLayout.visibleItems)) {\n\t\treturn { compact: true, visibleItems: compactLayout.visibleItems };\n\t}\n\tif (comfortableLayout.fits) {\n\t\treturn { compact: false, visibleItems: comfortableLayout.visibleItems };\n\t}\n\treturn compactLayout.rowsUsed <= comfortableLayout.rowsUsed\n\t\t? { compact: true, visibleItems: compactLayout.visibleItems }\n\t\t: { compact: false, visibleItems: comfortableLayout.visibleItems };\n}\n\nfunction paddedBackgroundLine(\n\ttext: string,\n\twidth: number,\n\tpaddingX: number,\n\tbackground: ((text: string) => string) | undefined,\n): string {\n\tconst innerWidth = Math.max(1, width - paddingX * 2);\n\tconst content = truncateToWidth(text, innerWidth, \"\");\n\tconst rightPadding = \" \".repeat(Math.max(0, innerWidth - visibleWidth(content)));\n\tconst contentSpan = \" \".repeat(paddingX) + content;\n\tconst trailingSpan = rightPadding + \" \".repeat(paddingX);\n\tif (!background) {\n\t\treturn contentSpan + trailingSpan;\n\t}\n\treturn applyBackground(contentSpan, background) + background(trailingSpan);\n}\n\nfunction applyBackground(text: string, background: (text: string) => string): string {\n\treturn text\n\t\t.split(ANSI_RESET)\n\t\t.map((segment) => background(segment))\n\t\t.join(ANSI_RESET);\n}\n\nfunction surfaceLine(text: string, width: number, paddingX = PANEL_PADDING_X): string {\n\treturn paddedBackgroundLine(text, width, paddingX, theme.getEditorBackgroundColor());\n}\n\nfunction surfaceWrappedLines(text: string, width: number, paddingX = PANEL_PADDING_X): string[] {\n\tconst innerWidth = Math.max(1, width - paddingX * 2);\n\treturn wrapTextWithAnsi(text, innerWidth).map((content) => surfaceLine(content, width, paddingX));\n}\n\nexport class MenuPanel extends Container {\n\tprivate title: string;\n\n\tconstructor(private readonly options: MenuPanelOptions) {\n\t\tsuper();\n\t\tthis.title = options.title;\n\t}\n\n\tsetTitle(title: string): void {\n\t\tthis.title = title;\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst safeWidth = Math.max(PANEL_PADDING_X * 2 + 1, width);\n\t\tconst innerWidth = getMenuPanelInnerWidth(width);\n\t\tconst lines: string[] = [];\n\n\t\tfor (let i = 0; i < PANEL_PADDING_Y; i++) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\t\tconst hasTitle = this.title.trim().length > 0;\n\t\tconst subtitle = this.options.subtitle?.trim();\n\t\tconst hasSubtitle = subtitle !== undefined && subtitle.length > 0;\n\t\tconst hasHeader = hasTitle || hasSubtitle;\n\t\tif (hasTitle) {\n\t\t\tlines.push(surfaceLine(theme.bold(theme.fg(\"text\", this.title)), safeWidth));\n\t\t}\n\t\tif (hasSubtitle) {\n\t\t\tlines.push(...surfaceWrappedLines(theme.fg(\"muted\", subtitle), safeWidth));\n\t\t}\n\t\tif (hasHeader) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\n\t\tfor (const child of this.children) {\n\t\t\tconst childLines = fillsMenuPanel(child) ? child.render(safeWidth) : child.render(innerWidth);\n\t\t\tfor (const line of childLines) {\n\t\t\t\tlines.push(fillsMenuPanel(child) ? line : surfaceLine(line, safeWidth));\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = 0; i < PANEL_PADDING_Y; i++) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\t\treturn lines;\n\t}\n}\n\nexport class MenuSearchInput implements Component, Focusable, FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\tprivate readonly input = new Input();\n\n\tconstructor(private readonly placeholder: string) {}\n\n\tget focused(): boolean {\n\t\treturn this.input.focused;\n\t}\n\n\tset focused(value: boolean) {\n\t\tthis.input.focused = value;\n\t}\n\n\tset onSubmit(handler: ((value: string) => void) | undefined) {\n\t\tthis.input.onSubmit = handler;\n\t}\n\n\tgetValue(): string {\n\t\treturn this.input.getValue();\n\t}\n\n\tgetCursor(): number {\n\t\treturn this.input.getCursor();\n\t}\n\n\tsetValue(value: string): void {\n\t\tthis.input.setValue(value);\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.input.handleInput(data);\n\t}\n\n\tinvalidate(): void {\n\t\tthis.input.invalidate();\n\t}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(FIELD_PADDING_X * 2 + 1, width);\n\t\tconst innerWidth = Math.max(1, safeWidth - FIELD_PADDING_X * 2);\n\t\tconst content =\n\t\t\tthis.getValue() === \"\" && !this.focused\n\t\t\t\t? theme.fg(\"dim\", this.placeholder)\n\t\t\t\t: this.stripInputPrompt(this.input.render(innerWidth + 2)[0] ?? \"\");\n\t\treturn [paddedBackgroundLine(content, safeWidth, FIELD_PADDING_X, theme.getEditorBackgroundColor())];\n\t}\n\n\tprivate stripInputPrompt(line: string): string {\n\t\treturn line.startsWith(\"> \") ? line.slice(2) : line;\n\t}\n}\n\ninterface MenuRowOptions {\n\tprimary: string;\n\tsecondary?: string;\n\tmeta?: string;\n\tselected: boolean;\n}\n\nexport class MenuRow implements Component, FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\n\tconstructor(private readonly options: MenuRowOptions) {}\n\n\tget selected(): boolean {\n\t\treturn this.options.selected;\n\t}\n\n\tinvalidate(): void {\n\t\t// Row render is derived from constructor options.\n\t}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\treturn [\n\t\t\t...this.renderPadding(safeWidth, this.selected),\n\t\t\t...this.renderContent(safeWidth),\n\t\t\t...this.renderPadding(safeWidth, this.selected),\n\t\t];\n\t}\n\n\trenderContent(width: number): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\tconst meta = this.options.meta ? theme.fg(\"muted\", this.options.meta) : \"\";\n\t\tconst secondary = this.options.secondary ? theme.fg(\"muted\", this.options.secondary) : \"\";\n\t\tconst primary = this.options.selected\n\t\t\t? theme.bold(theme.fg(\"text\", this.options.primary))\n\t\t\t: theme.fg(\"text\", this.options.primary);\n\t\tconst innerWidth = Math.max(1, safeWidth - ROW_PADDING_X * 2);\n\t\tconst metaWidth = visibleWidth(meta);\n\t\tconst gap = meta ? 2 : 0;\n\t\tconst primaryWidth = Math.max(1, innerWidth - metaWidth - gap);\n\t\tconst primaryText = truncateToWidth(primary, primaryWidth, \"\", true);\n\t\tconst primaryLine = meta ? primaryText + \" \".repeat(gap) + meta : primaryText;\n\t\tconst lines: string[] = [];\n\t\tlines.push(this.rowLine(primaryLine, safeWidth, this.selected));\n\t\tif (secondary) {\n\t\t\tlines.push(this.rowLine(truncateToWidth(secondary, innerWidth, \"\", true), safeWidth, this.selected));\n\t\t}\n\t\treturn lines;\n\t}\n\n\trenderPadding(width: number, selected: boolean): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\tconst lines: string[] = [];\n\t\tfor (let i = 0; i < ROW_PADDING_Y; i++) {\n\t\t\tlines.push(this.rowLine(\"\", safeWidth, selected));\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate rowLine(text: string, width: number, selected: boolean): string {\n\t\tconst background = selected ? theme.getSelectionBackgroundColor() : theme.getEditorBackgroundColor();\n\t\treturn paddedBackgroundLine(text, width, ROW_PADDING_X, background);\n\t}\n}\n\nexport class MenuList extends Container implements FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\n\tconstructor(private readonly options: MenuListOptions = {}) {\n\t\tsuper();\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tconst compact = this.isCompact();\n\t\tfor (let index = 0; index < this.children.length; index++) {\n\t\t\tconst child = this.children[index];\n\t\t\tif (child instanceof MenuRow) {\n\t\t\t\tif (compact) {\n\t\t\t\t\tlines.push(...child.renderContent(width));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst previousChild = this.children[index - 1];\n\t\t\t\tconst nextChild = this.children[index + 1];\n\t\t\t\tconst previousRow = previousChild instanceof MenuRow ? previousChild : undefined;\n\t\t\t\tconst nextRow = nextChild instanceof MenuRow ? nextChild : undefined;\n\t\t\t\tlines.push(...child.renderPadding(width, child.selected || previousRow?.selected === true));\n\t\t\t\tlines.push(...child.renderContent(width));\n\t\t\t\tif (!nextRow) {\n\t\t\t\t\tlines.push(...child.renderPadding(width, child.selected));\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst childLines = fillsMenuPanel(child)\n\t\t\t\t? child.render(width)\n\t\t\t\t: child.render(Math.max(1, width - PANEL_PADDING_X * 2));\n\t\t\tfor (const line of childLines) {\n\t\t\t\tlines.push(fillsMenuPanel(child) ? line : surfaceLine(line, width));\n\t\t\t}\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate isCompact(): boolean {\n\t\tconst compact = this.options.compact;\n\t\treturn typeof compact === \"function\" ? compact() : compact === true;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"menu-panel.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/menu-panel.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Component,\n\tContainer,\n\ttype Focusable,\n\tInput,\n\ttruncateToWidth,\n\tvisibleWidth,\n\twrapTextWithAnsi,\n} from \"@ponythewhite/base-context-tui\";\nimport { theme } from \"../theme/theme.js\";\n\ninterface MenuPanelOptions {\n\ttitle: string;\n\tsubtitle?: string;\n}\n\nexport interface MenuViewportProvider {\n\tgetRows?: () => number;\n}\n\ninterface MenuListOptions {\n\tcompact?: boolean | (() => boolean);\n}\n\ninterface MenuListLayoutOptions extends MenuViewportProvider {\n\tpreferredVisibleItems: number;\n\tminVisibleItems?: number;\n\ttotalItems?: number;\n\treservedRows: number;\n\tcomfortableItemRows: number;\n\tcompactItemRows?: number;\n\tscrollIndicatorRows?: number;\n\tcomfortableListPaddingRows?: number;\n\tcompactListPaddingRows?: number;\n}\n\nexport interface MenuListLayout {\n\tcompact: boolean;\n\tvisibleItems: number;\n}\n\nconst PANEL_PADDING_X = 2;\nconst PANEL_PADDING_Y = 1;\nconst FIELD_PADDING_X = 2;\nconst ROW_PADDING_X = 2;\nconst ROW_PADDING_Y = 1;\nconst ANSI_RESET = \"\\x1b[0m\";\n\nexport function getMenuPanelInnerWidth(width: number): number {\n\tconst safeWidth = Math.max(PANEL_PADDING_X * 2 + 1, width);\n\treturn Math.max(1, safeWidth - PANEL_PADDING_X * 2);\n}\n\ninterface FullWidthMenuComponent {\n\treadonly fillsMenuPanel: true;\n}\n\nfunction fillsMenuPanel(component: Component): component is Component & FullWidthMenuComponent {\n\treturn (component as { fillsMenuPanel?: unknown }).fillsMenuPanel === true;\n}\n\nfunction getViewportRows(getRows: (() => number) | undefined): number | undefined {\n\tconst rows = getRows?.();\n\tif (rows === undefined || !Number.isFinite(rows) || rows <= 0) {\n\t\treturn undefined;\n\t}\n\treturn Math.floor(rows);\n}\n\nfunction visibleItemCount(\n\trows: number,\n\toptions: {\n\t\tpreferredVisibleItems: number;\n\t\tminVisibleItems: number;\n\t\treservedRows: number;\n\t\titemRows: number;\n\t\tlistPaddingRows: number;\n\t\textraRows: number;\n\t},\n): number {\n\tconst capacityRows = Math.max(0, rows - options.reservedRows - options.listPaddingRows - options.extraRows);\n\tconst itemCapacity = Math.floor(capacityRows / options.itemRows);\n\treturn Math.max(options.minVisibleItems, Math.min(options.preferredVisibleItems, itemCapacity));\n}\n\nfunction listRowsUsed(options: {\n\treservedRows: number;\n\tlistPaddingRows: number;\n\tvisibleItems: number;\n\titemRows: number;\n\textraRows: number;\n}): number {\n\treturn options.reservedRows + options.listPaddingRows + options.extraRows + options.visibleItems * options.itemRows;\n}\n\nfunction scrollIndicatorRows(options: {\n\ttotalItems: number | undefined;\n\tvisibleItems: number;\n\tscrollIndicatorRows: number;\n}): number {\n\tif (options.totalItems === undefined || options.scrollIndicatorRows <= 0) {\n\t\treturn 0;\n\t}\n\treturn options.totalItems > options.visibleItems ? options.scrollIndicatorRows : 0;\n}\n\nfunction getLayoutCandidate(\n\trows: number,\n\toptions: MenuListLayoutOptions,\n\titemRows: number,\n\tlistPaddingRows: number,\n\tcompact: boolean,\n): MenuListLayout & { rowsUsed: number; fits: boolean } {\n\tconst minVisibleItems = options.minVisibleItems ?? 1;\n\tconst preferredVisibleItems = Math.max(minVisibleItems, options.preferredVisibleItems);\n\tconst visibleItemsWithoutScroll = visibleItemCount(rows, {\n\t\tpreferredVisibleItems,\n\t\tminVisibleItems,\n\t\treservedRows: options.reservedRows,\n\t\titemRows,\n\t\tlistPaddingRows,\n\t\textraRows: 0,\n\t});\n\tconst extraRows = scrollIndicatorRows({\n\t\ttotalItems: options.totalItems,\n\t\tvisibleItems: visibleItemsWithoutScroll,\n\t\tscrollIndicatorRows: options.scrollIndicatorRows ?? 0,\n\t});\n\tconst visibleItems =\n\t\textraRows > 0\n\t\t\t? visibleItemCount(rows, {\n\t\t\t\t\tpreferredVisibleItems,\n\t\t\t\t\tminVisibleItems,\n\t\t\t\t\treservedRows: options.reservedRows,\n\t\t\t\t\titemRows,\n\t\t\t\t\tlistPaddingRows,\n\t\t\t\t\textraRows,\n\t\t\t\t})\n\t\t\t: visibleItemsWithoutScroll;\n\tconst rowsUsed = listRowsUsed({\n\t\treservedRows: options.reservedRows,\n\t\tlistPaddingRows,\n\t\tvisibleItems,\n\t\titemRows,\n\t\textraRows,\n\t});\n\treturn {\n\t\tcompact,\n\t\tvisibleItems,\n\t\trowsUsed,\n\t\tfits: rowsUsed <= rows,\n\t};\n}\n\nexport function getMenuListLayout(options: MenuListLayoutOptions): MenuListLayout {\n\tconst minVisibleItems = options.minVisibleItems ?? 1;\n\tconst preferredVisibleItems = Math.max(minVisibleItems, options.preferredVisibleItems);\n\tconst rows = getViewportRows(options.getRows);\n\tif (rows === undefined) {\n\t\treturn { compact: false, visibleItems: preferredVisibleItems };\n\t}\n\n\tconst comfortableLayout = getLayoutCandidate(\n\t\trows,\n\t\toptions,\n\t\tMath.max(1, options.comfortableItemRows),\n\t\toptions.comfortableListPaddingRows ?? 1,\n\t\tfalse,\n\t);\n\tif (options.compactItemRows === undefined) {\n\t\treturn { compact: false, visibleItems: comfortableLayout.visibleItems };\n\t}\n\n\tconst compactLayout = getLayoutCandidate(\n\t\trows,\n\t\toptions,\n\t\tMath.max(1, options.compactItemRows),\n\t\toptions.compactListPaddingRows ?? 0,\n\t\ttrue,\n\t);\n\tif (compactLayout.fits && (!comfortableLayout.fits || compactLayout.visibleItems > comfortableLayout.visibleItems)) {\n\t\treturn { compact: true, visibleItems: compactLayout.visibleItems };\n\t}\n\tif (comfortableLayout.fits) {\n\t\treturn { compact: false, visibleItems: comfortableLayout.visibleItems };\n\t}\n\treturn compactLayout.rowsUsed <= comfortableLayout.rowsUsed\n\t\t? { compact: true, visibleItems: compactLayout.visibleItems }\n\t\t: { compact: false, visibleItems: comfortableLayout.visibleItems };\n}\n\nfunction paddedBackgroundLine(\n\ttext: string,\n\twidth: number,\n\tpaddingX: number,\n\tbackground: ((text: string) => string) | undefined,\n): string {\n\tconst innerWidth = Math.max(1, width - paddingX * 2);\n\tconst content = truncateToWidth(text, innerWidth, \"\");\n\tconst rightPadding = \" \".repeat(Math.max(0, innerWidth - visibleWidth(content)));\n\tconst contentSpan = \" \".repeat(paddingX) + content;\n\tconst trailingSpan = rightPadding + \" \".repeat(paddingX);\n\tif (!background) {\n\t\treturn contentSpan + trailingSpan;\n\t}\n\treturn applyBackground(contentSpan, background) + background(trailingSpan);\n}\n\nfunction applyBackground(text: string, background: (text: string) => string): string {\n\treturn text\n\t\t.split(ANSI_RESET)\n\t\t.map((segment) => background(segment))\n\t\t.join(ANSI_RESET);\n}\n\nfunction surfaceLine(text: string, width: number, paddingX = PANEL_PADDING_X): string {\n\treturn paddedBackgroundLine(text, width, paddingX, theme.getEditorBackgroundColor());\n}\n\nfunction surfaceWrappedLines(text: string, width: number, paddingX = PANEL_PADDING_X): string[] {\n\tconst innerWidth = Math.max(1, width - paddingX * 2);\n\treturn wrapTextWithAnsi(text, innerWidth).map((content) => surfaceLine(content, width, paddingX));\n}\n\nexport class MenuPanel extends Container {\n\tprivate title: string;\n\n\tconstructor(private readonly options: MenuPanelOptions) {\n\t\tsuper();\n\t\tthis.title = options.title;\n\t}\n\n\tsetTitle(title: string): void {\n\t\tthis.title = title;\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst safeWidth = Math.max(PANEL_PADDING_X * 2 + 1, width);\n\t\tconst innerWidth = getMenuPanelInnerWidth(width);\n\t\tconst lines: string[] = [];\n\n\t\tfor (let i = 0; i < PANEL_PADDING_Y; i++) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\t\tconst hasTitle = this.title.trim().length > 0;\n\t\tconst subtitle = this.options.subtitle?.trim();\n\t\tconst hasSubtitle = subtitle !== undefined && subtitle.length > 0;\n\t\tconst hasHeader = hasTitle || hasSubtitle;\n\t\tif (hasTitle) {\n\t\t\tlines.push(surfaceLine(theme.bold(theme.fg(\"text\", this.title)), safeWidth));\n\t\t}\n\t\tif (hasSubtitle) {\n\t\t\tlines.push(...surfaceWrappedLines(theme.fg(\"muted\", subtitle), safeWidth));\n\t\t}\n\t\tif (hasHeader) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\n\t\tfor (const child of this.children) {\n\t\t\tconst childLines = fillsMenuPanel(child) ? child.render(safeWidth) : child.render(innerWidth);\n\t\t\tfor (const line of childLines) {\n\t\t\t\tlines.push(fillsMenuPanel(child) ? line : surfaceLine(line, safeWidth));\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = 0; i < PANEL_PADDING_Y; i++) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\t\treturn lines;\n\t}\n}\n\nexport class MenuSearchInput implements Component, Focusable, FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\tprivate readonly input = new Input();\n\n\tconstructor(private readonly placeholder: string) {}\n\n\tget focused(): boolean {\n\t\treturn this.input.focused;\n\t}\n\n\tset focused(value: boolean) {\n\t\tthis.input.focused = value;\n\t}\n\n\tset onSubmit(handler: ((value: string) => void) | undefined) {\n\t\tthis.input.onSubmit = handler;\n\t}\n\n\tgetValue(): string {\n\t\treturn this.input.getValue();\n\t}\n\n\tgetCursor(): number {\n\t\treturn this.input.getCursor();\n\t}\n\n\tsetValue(value: string): void {\n\t\tthis.input.setValue(value);\n\t}\n\n\tsetMasked(masked: boolean): void {\n\t\tthis.input.setMasked(masked);\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.input.handleInput(data);\n\t}\n\n\tinvalidate(): void {\n\t\tthis.input.invalidate();\n\t}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(FIELD_PADDING_X * 2 + 1, width);\n\t\tconst innerWidth = Math.max(1, safeWidth - FIELD_PADDING_X * 2);\n\t\tconst content =\n\t\t\tthis.getValue() === \"\" && !this.focused\n\t\t\t\t? theme.fg(\"dim\", this.placeholder)\n\t\t\t\t: this.stripInputPrompt(this.input.render(innerWidth + 2)[0] ?? \"\");\n\t\treturn [paddedBackgroundLine(content, safeWidth, FIELD_PADDING_X, theme.getEditorBackgroundColor())];\n\t}\n\n\tprivate stripInputPrompt(line: string): string {\n\t\treturn line.startsWith(\"> \") ? line.slice(2) : line;\n\t}\n}\n\ninterface MenuRowOptions {\n\tprimary: string;\n\tsecondary?: string;\n\tmeta?: string;\n\tselected: boolean;\n}\n\nexport class MenuRow implements Component, FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\n\tconstructor(private readonly options: MenuRowOptions) {}\n\n\tget selected(): boolean {\n\t\treturn this.options.selected;\n\t}\n\n\tinvalidate(): void {\n\t\t// Row render is derived from constructor options.\n\t}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\treturn [\n\t\t\t...this.renderPadding(safeWidth, this.selected),\n\t\t\t...this.renderContent(safeWidth),\n\t\t\t...this.renderPadding(safeWidth, this.selected),\n\t\t];\n\t}\n\n\trenderContent(width: number): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\tconst meta = this.options.meta ? theme.fg(\"muted\", this.options.meta) : \"\";\n\t\tconst secondary = this.options.secondary ? theme.fg(\"muted\", this.options.secondary) : \"\";\n\t\tconst primary = this.options.selected\n\t\t\t? theme.bold(theme.fg(\"text\", this.options.primary))\n\t\t\t: theme.fg(\"text\", this.options.primary);\n\t\tconst innerWidth = Math.max(1, safeWidth - ROW_PADDING_X * 2);\n\t\tconst metaWidth = visibleWidth(meta);\n\t\tconst gap = meta ? 2 : 0;\n\t\tconst primaryWidth = Math.max(1, innerWidth - metaWidth - gap);\n\t\tconst primaryText = truncateToWidth(primary, primaryWidth, \"\", true);\n\t\tconst primaryLine = meta ? primaryText + \" \".repeat(gap) + meta : primaryText;\n\t\tconst lines: string[] = [];\n\t\tlines.push(this.rowLine(primaryLine, safeWidth, this.selected));\n\t\tif (secondary) {\n\t\t\tlines.push(this.rowLine(truncateToWidth(secondary, innerWidth, \"\", true), safeWidth, this.selected));\n\t\t}\n\t\treturn lines;\n\t}\n\n\trenderPadding(width: number, selected: boolean): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\tconst lines: string[] = [];\n\t\tfor (let i = 0; i < ROW_PADDING_Y; i++) {\n\t\t\tlines.push(this.rowLine(\"\", safeWidth, selected));\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate rowLine(text: string, width: number, selected: boolean): string {\n\t\tconst background = selected ? theme.getSelectionBackgroundColor() : theme.getEditorBackgroundColor();\n\t\treturn paddedBackgroundLine(text, width, ROW_PADDING_X, background);\n\t}\n}\n\nexport class MenuList extends Container implements FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\n\tconstructor(private readonly options: MenuListOptions = {}) {\n\t\tsuper();\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tconst compact = this.isCompact();\n\t\tfor (let index = 0; index < this.children.length; index++) {\n\t\t\tconst child = this.children[index];\n\t\t\tif (child instanceof MenuRow) {\n\t\t\t\tif (compact) {\n\t\t\t\t\tlines.push(...child.renderContent(width));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst previousChild = this.children[index - 1];\n\t\t\t\tconst nextChild = this.children[index + 1];\n\t\t\t\tconst previousRow = previousChild instanceof MenuRow ? previousChild : undefined;\n\t\t\t\tconst nextRow = nextChild instanceof MenuRow ? nextChild : undefined;\n\t\t\t\tlines.push(...child.renderPadding(width, child.selected || previousRow?.selected === true));\n\t\t\t\tlines.push(...child.renderContent(width));\n\t\t\t\tif (!nextRow) {\n\t\t\t\t\tlines.push(...child.renderPadding(width, child.selected));\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst childLines = fillsMenuPanel(child)\n\t\t\t\t? child.render(width)\n\t\t\t\t: child.render(Math.max(1, width - PANEL_PADDING_X * 2));\n\t\t\tfor (const line of childLines) {\n\t\t\t\tlines.push(fillsMenuPanel(child) ? line : surfaceLine(line, width));\n\t\t\t}\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate isCompact(): boolean {\n\t\tconst compact = this.options.compact;\n\t\treturn typeof compact === \"function\" ? compact() : compact === true;\n\t}\n}\n"]}
|