@batchfy/codemirror-minimap 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/Config.ts","../src/Overlay.ts","../src/linebasedstate.ts","../src/LinesState.ts","../src/diagnostics.ts","../src/selections.ts","../src/text.ts","../src/Gutters.ts","../src/index.ts"],"sourcesContent":["import { Facet, combineConfig } from \"@codemirror/state\";\nimport { DOMEventMap, EditorView } from \"@codemirror/view\";\nimport { MinimapConfig } from \"./index.js\";\nimport { Gutter } from \"./Gutters.js\";\n\ntype EventHandler<event extends keyof DOMEventMap> = (\n e: DOMEventMap[event],\n v: EditorView,\n) => void;\n\ntype Options = {\n /**\n * Controls whether the minimap should be hidden on mouseout.\n * Defaults to `false`.\n */\n autohide?: boolean;\n\n enabled: boolean;\n\n /**\n * Determines how to render text. Defaults to `characters`.\n */\n displayText?: \"blocks\" | \"characters\";\n\n /**\n * Attach event handlers to the minimap container element.\n */\n eventHandlers?: {\n [event in keyof DOMEventMap]?: EventHandler<event>;\n };\n\n /**\n * The overlay shows the portion of the file currently in the viewport.\n * Defaults to `always`.\n */\n showOverlay?: \"always\" | \"mouse-over\";\n\n /**\n * Enables a gutter to be drawn on the given line to the left\n * of the minimap, with the given color. Accepts all valid CSS\n * color values.\n */\n gutters?: Array<Gutter>;\n\n /**\n * Maximum width of the minimap in pixels. Defaults to `120`.\n *\n * This is an upper bound rather than a fixed size: when the editor is\n * narrow the minimap shrinks proportionally so that it never dominates\n * the viewport. A wider minimap shows more characters per line; it does\n * not change the size the text is rendered at.\n */\n width?: number;\n\n /**\n * Hides the editor's native scrollbar while the minimap is shown, since\n * the minimap and its viewport overlay already serve that role. Scrolling\n * itself is unaffected -- only the scrollbar's appearance is suppressed.\n * Defaults to `true`.\n *\n * Note that this hides the horizontal scrollbar too, as scrollbar\n * visibility cannot be controlled per axis. Horizontal overflow stays\n * discoverable through the minimap's shadow.\n */\n hideScrollbar?: boolean;\n};\n\nconst Scale = {\n // Multiply the number of canvas pixels\n PixelMultiplier: 2,\n // Downscale the editor contents by this ratio\n SizeRatio: 4,\n // Maximum width of the minimap in pixels\n MaxWidth: 120,\n} as const;\n\nconst Config = Facet.define<MinimapConfig | null, Required<Options>>({\n combine: (c) => {\n const configs: Array<Options> = [];\n for (const config of c) {\n if (!config) {\n continue;\n }\n\n const { create, gutters, ...rest } = config;\n\n configs.push({\n ...rest,\n enabled: true,\n gutters: gutters\n ? gutters.filter((v) => Object.keys(v).length > 0)\n : undefined,\n });\n }\n\n return combineConfig(configs, {\n enabled: configs.length > 0,\n displayText: \"characters\",\n eventHandlers: {},\n showOverlay: \"always\",\n gutters: [],\n autohide: false,\n width: Scale.MaxWidth,\n hideScrollbar: true,\n });\n },\n});\n\nexport { Config, Scale };\nexport type { Options };\n","import { EditorView, ViewPlugin, ViewUpdate } from \"@codemirror/view\";\nimport { Config, Scale } from \"./Config.js\";\nimport crelt from \"crelt\";\n\nconst Theme = EditorView.theme({\n \".cm-minimap-overlay-container\": {\n position: \"absolute\",\n top: 0,\n height: \"100%\",\n width: \"100%\",\n \"&.cm-minimap-overlay-mouse-over\": {\n opacity: 0,\n transition: \"visibility 0s linear 300ms, opacity 300ms\",\n },\n \"&.cm-minimap-overlay-mouse-over:hover\": {\n opacity: 1,\n transition: \"visibility 0s linear 0ms, opacity 300ms\",\n },\n \"&.cm-minimap-overlay-off\": {\n display: \"none\",\n },\n \"& .cm-minimap-overlay\": {\n background: \"rgb(121, 121, 121)\",\n opacity: \"0.2\",\n position: \"absolute\",\n right: 0,\n top: 0,\n width: \"100%\",\n transition: \"top 0s ease-in 0ms\",\n \"&:hover\": {\n opacity: \"0.3\",\n },\n },\n \"&.cm-minimap-overlay-active\": {\n opacity: 1,\n visibility: \"visible\",\n transition: \"visibility 0s linear 0ms, opacity 300ms\",\n \"& .cm-minimap-overlay\": {\n opacity: \"0.4\",\n },\n },\n },\n});\n\nconst SCALE = Scale.PixelMultiplier * Scale.SizeRatio;\n\nconst OverlayView = ViewPlugin.fromClass(\n class {\n private container: HTMLElement | undefined;\n private dom: HTMLElement | undefined;\n\n private _isDragging: boolean = false;\n private _dragStartY: number | undefined;\n\n // Bound once so that removeEventListener sees the same reference that\n // addEventListener was given; `.bind` at call time yields a new\n // function each call and the listener would never be detached.\n private readonly boundMouseDown = this.onMouseDown.bind(this);\n private readonly boundMouseUp = this.onMouseUp.bind(this);\n private readonly boundMouseMove = this.onMouseMove.bind(this);\n\n public constructor(private view: EditorView) {\n if (view.state.facet(Config).enabled) {\n this.create(view);\n }\n }\n\n private create(view: EditorView) {\n this.container = crelt(\"div\", {\n class: \"cm-minimap-overlay-container\",\n });\n this.dom = crelt(\"div\", { class: \"cm-minimap-overlay\" });\n this.container.appendChild(this.dom);\n\n // Attach event listeners for overlay\n this.container.addEventListener(\"mousedown\", this.boundMouseDown);\n window.addEventListener(\"mouseup\", this.boundMouseUp);\n window.addEventListener(\"mousemove\", this.boundMouseMove);\n\n // Attach the overlay elements to the minimap\n const inner = view.dom.querySelector(\".cm-minimap-inner\");\n if (inner) {\n inner.appendChild(this.container);\n }\n\n // Initially set overlay configuration styles, height, top\n this.computeShowOverlay();\n this.computeHeight();\n this.computeTop();\n }\n\n private remove() {\n if (this.container) {\n this.container.removeEventListener(\n \"mousedown\",\n this.boundMouseDown,\n );\n window.removeEventListener(\"mouseup\", this.boundMouseUp);\n window.removeEventListener(\"mousemove\", this.boundMouseMove);\n this.container.remove();\n }\n }\n\n update(update: ViewUpdate) {\n const prev = update.startState.facet(Config).enabled;\n const now = update.state.facet(Config).enabled;\n\n if (prev && !now) {\n this.remove();\n return;\n }\n\n if (!prev && now) {\n this.create(update.view);\n }\n\n if (now) {\n this.computeShowOverlay();\n\n if (update.geometryChanged) {\n this.computeHeight();\n this.computeTop();\n }\n }\n }\n\n public computeHeight() {\n if (!this.dom) {\n return;\n }\n\n const height = this.view.dom.clientHeight / SCALE;\n this.dom.style.height = height + \"px\";\n }\n\n public computeTop() {\n if (!this._isDragging && this.dom) {\n const { clientHeight, scrollHeight, scrollTop } =\n this.view.scrollDOM;\n\n const maxScrollTop = scrollHeight - clientHeight;\n const topForNonOverflowing = scrollTop / SCALE;\n\n const height = clientHeight / SCALE;\n const maxTop = clientHeight - height;\n let scrollRatio = scrollTop / maxScrollTop;\n if (isNaN(scrollRatio)) scrollRatio = 0;\n const topForOverflowing = maxTop * scrollRatio;\n\n const top = Math.min(topForOverflowing, topForNonOverflowing);\n this.dom.style.top = top + \"px\";\n }\n }\n\n public computeShowOverlay() {\n if (!this.container) {\n return;\n }\n\n const { showOverlay } = this.view.state.facet(Config);\n\n if (showOverlay === \"mouse-over\") {\n this.container.classList.add(\"cm-minimap-overlay-mouse-over\");\n } else {\n this.container.classList.remove(\n \"cm-minimap-overlay-mouse-over\",\n );\n }\n\n const { clientHeight, scrollHeight } = this.view.scrollDOM;\n if (clientHeight === scrollHeight) {\n this.container.classList.add(\"cm-minimap-overlay-off\");\n } else {\n this.container.classList.remove(\"cm-minimap-overlay-off\");\n }\n }\n\n private onMouseDown(event: MouseEvent) {\n if (!this.container) {\n return;\n }\n\n // Ignore right click\n if (event.button === 2) {\n return;\n }\n\n // If target is the overlay start dragging\n const { clientY, target } = event;\n if (target === this.dom) {\n this._dragStartY = event.clientY;\n this._isDragging = true;\n this.container.classList.add(\"cm-minimap-overlay-active\");\n return;\n }\n\n // Updates the scroll position of the EditorView based on the\n // position of the MouseEvent on the minimap canvas\n const { clientHeight, scrollHeight, scrollTop } =\n this.view.scrollDOM;\n const targetTop = (target as HTMLElement).getBoundingClientRect()\n .top;\n const deltaY = (clientY - targetTop) * SCALE;\n\n const scrollRatio = scrollTop / (scrollHeight - clientHeight);\n const visibleRange = clientHeight * SCALE - clientHeight;\n const visibleTop = visibleRange * scrollRatio;\n\n const top = Math.max(0, scrollTop - visibleTop);\n this.view.scrollDOM.scrollTop = top + deltaY - clientHeight / 2;\n }\n\n private onMouseUp(_event: MouseEvent) {\n // Stop dragging on mouseup\n if (this._isDragging && this.container) {\n this._dragStartY = undefined;\n this._isDragging = false;\n this.container.classList.remove(\"cm-minimap-overlay-active\");\n }\n }\n\n private onMouseMove(event: MouseEvent) {\n if (!this._isDragging || !this.dom) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n // Without an existing position, we're just beginning to drag.\n if (!this._dragStartY) {\n this._dragStartY = event.clientY;\n return;\n }\n\n const deltaY = event.clientY - this._dragStartY;\n const movingUp = deltaY < 0;\n const movingDown = deltaY > 0;\n\n // Update drag position for the next tick\n this._dragStartY = event.clientY;\n\n const canvasHeight = this.dom.getBoundingClientRect().height;\n const canvasAbsTop = this.dom.getBoundingClientRect().y;\n const canvasAbsBot = canvasAbsTop + canvasHeight;\n const canvasRelTopDouble = parseFloat(this.dom.style.top);\n\n const scrollPosition = this.view.scrollDOM.scrollTop;\n const editorHeight = this.view.scrollDOM.clientHeight;\n const contentHeight = this.view.scrollDOM.scrollHeight;\n\n const atTop = scrollPosition === 0;\n const atBottom =\n Math.round(scrollPosition) >=\n Math.round(contentHeight - editorHeight);\n\n // We allow over-dragging past the top/bottom, but the overlay just sticks\n // to the top or bottom of its range. These checks prevent us from immediately\n // moving the overlay when the drag changes direction. We should wait until\n // the cursor has returned to, and begun to pass the bottom/top of the range\n if (\n (atTop && movingUp) ||\n (atTop && event.clientY < canvasAbsTop)\n ) {\n return;\n }\n if (\n (atBottom && movingDown) ||\n (atBottom && event.clientY > canvasAbsBot)\n ) {\n return;\n }\n\n // Set view scroll directly\n const scrollHeight = this.view.scrollDOM.scrollHeight;\n const clientHeight = this.view.scrollDOM.clientHeight;\n\n const maxTopNonOverflowing = (scrollHeight - clientHeight) / SCALE;\n const maxTopOverflowing = clientHeight - clientHeight / SCALE;\n\n const change = canvasRelTopDouble + deltaY;\n\n /**\n * ScrollPosOverflowing is calculated by:\n * - Calculating the offset (change) relative to the total height of the container\n * - Multiplying by the maximum scrollTop position for the scroller\n * - The maximum scrollTop position for the scroller is the total scroll height minus the client height\n */\n const relativeToMax = change / maxTopOverflowing;\n const scrollPosOverflowing =\n (scrollHeight - clientHeight) * relativeToMax;\n\n const scrollPosNonOverflowing = change * SCALE;\n this.view.scrollDOM.scrollTop = Math.max(\n scrollPosOverflowing,\n scrollPosNonOverflowing,\n );\n\n // view.scrollDOM truncates if out of bounds. We need to mimic that behavior here with min/max guard\n const top = Math.min(\n Math.max(0, change),\n Math.min(maxTopOverflowing, maxTopNonOverflowing),\n );\n this.dom.style.top = top + \"px\";\n }\n\n public destroy() {\n this.remove();\n }\n },\n {\n eventHandlers: {\n scroll() {\n requestAnimationFrame(() => this.computeTop());\n },\n },\n },\n);\n\nexport const Overlay = [Theme, OverlayView];\n","import { EditorView } from \"@codemirror/view\";\n\n// TODO: renamed this file because something's weird with codemirror build\n\nexport abstract class LineBasedState<TValue> {\n protected map: Map<number, TValue>;\n protected view: EditorView;\n\n public constructor(view: EditorView) {\n this.map = new Map();\n this.view = view;\n }\n\n public get(lineNumber: number): TValue | undefined {\n return this.map.get(lineNumber);\n }\n\n protected set(lineNumber: number, value: TValue) {\n this.map.set(lineNumber, value);\n }\n}\n","import { foldEffect, foldedRanges, unfoldEffect } from \"@codemirror/language\";\nimport { StateField, EditorState, Transaction } from \"@codemirror/state\";\nimport { Config } from \"./Config.js\";\n\ntype Span = { from: number; to: number; folded: boolean };\ntype Line = Array<Span>;\ntype Lines = Array<Line>;\n\nfunction computeLinesState(state: EditorState): Lines {\n if (!state.facet(Config).enabled) {\n return [];\n }\n\n const lines: Lines = [];\n\n const lineCursor = state.doc.iterLines();\n const foldedRangeCursor = foldedRanges(state).iter();\n\n let textOffset = 0;\n lineCursor.next();\n\n while (!lineCursor.done) {\n const lineText = lineCursor.value;\n const from = textOffset;\n const to = from + lineText.length;\n\n // Iterate through folded ranges until we're at or past the current line\n while (foldedRangeCursor.value && foldedRangeCursor.to < from) {\n foldedRangeCursor.next();\n }\n const { from: foldFrom, to: foldTo } = foldedRangeCursor;\n\n const lineStartInFold = from >= foldFrom && from < foldTo;\n const lineEndsInFold = to > foldFrom && to <= foldTo;\n\n if (lineStartInFold) {\n const lastLine = lines.pop() ?? [];\n const lastRange = lastLine.pop();\n\n // If the last range is folded, we extend the folded range\n if (lastRange && lastRange.folded) {\n lastRange.to = foldTo;\n }\n\n // If we popped the last range, add it back\n if (lastRange) {\n lastLine.push(lastRange);\n }\n\n // If we didn't have a previous range, or the previous range wasn't folded add a new range\n if (!lastRange || !lastRange.folded) {\n lastLine.push({ from: foldFrom, to: foldTo, folded: true });\n }\n\n // If the line doesn't end in a fold, we add another token for the unfolded section\n if (!lineEndsInFold) {\n lastLine.push({ from: foldTo, to, folded: false });\n }\n\n lines.push(lastLine);\n } else if (lineEndsInFold) {\n lines.push([\n { from, to: foldFrom, folded: false },\n { from: foldFrom, to: foldTo, folded: true },\n ]);\n } else {\n lines.push([{ from, to, folded: false }]);\n }\n\n textOffset = to + 1;\n lineCursor.next();\n }\n\n return lines;\n}\n\nconst LinesState = StateField.define<Lines>({\n create: (state) => computeLinesState(state),\n update: (current, tr) => {\n if (foldsChanged([tr]) || tr.docChanged) {\n return computeLinesState(tr.state);\n }\n\n return current;\n },\n});\n\n/** Returns if the folds have changed in this update */\nfunction foldsChanged(transactions: readonly Transaction[]): boolean {\n return transactions.some((tr) =>\n tr.effects.some((ef) => ef.is(foldEffect) || ef.is(unfoldEffect)),\n );\n}\n\nexport { foldsChanged, LinesState };\nexport type { Lines };\n","import { EditorView, ViewUpdate } from \"@codemirror/view\";\nimport {\n Diagnostic,\n diagnosticCount,\n forEachDiagnostic,\n setDiagnosticsEffect,\n} from \"@codemirror/lint\";\n\nimport { LineBasedState } from \"./linebasedstate.js\";\nimport { DrawContext } from \"./types.js\";\nimport { Lines, LinesState, foldsChanged } from \"./LinesState.js\";\nimport { Config } from \"./Config.js\";\n\ntype Severity = Diagnostic[\"severity\"];\n\nexport class DiagnosticState extends LineBasedState<Severity> {\n private count: number | undefined = undefined;\n\n public constructor(view: EditorView) {\n super(view);\n }\n\n private shouldUpdate(update: ViewUpdate) {\n // If the minimap is disabled\n if (!update.state.facet(Config).enabled) {\n return false;\n }\n\n // If the doc changed\n if (update.docChanged) {\n return true;\n }\n\n // If the diagnostics changed\n for (const tr of update.transactions) {\n for (const ef of tr.effects) {\n if (ef.is(setDiagnosticsEffect)) {\n return true;\n }\n }\n }\n\n // If the folds changed\n if (foldsChanged(update.transactions)) {\n return true;\n }\n\n // If the minimap was previously hidden\n if (this.count === undefined) {\n return true;\n }\n\n return false;\n }\n\n public update(update: ViewUpdate) {\n if (!this.shouldUpdate(update)) {\n return;\n }\n\n this.map.clear();\n const lines = update.state.field(LinesState);\n this.count = diagnosticCount(update.state);\n\n forEachDiagnostic(update.state, (diagnostic, from, to) => {\n // Find the start and end lines for the diagnostic\n const lineStart = this.findLine(from, lines);\n const lineEnd = this.findLine(to, lines);\n\n // Populate each line in the range with the highest severity diagnostic\n let severity = diagnostic.severity;\n for (let i = lineStart; i <= lineEnd; i++) {\n const previous = this.get(i);\n if (previous) {\n severity = [severity, previous]\n .sort(this.sort.bind(this))\n .slice(0, 1)[0];\n }\n this.set(i, severity);\n }\n });\n }\n\n public drawLine(ctx: DrawContext, lineNumber: number) {\n const { context, lineHeight, offsetX, offsetY } = ctx;\n const severity = this.get(lineNumber);\n if (!severity) {\n return;\n }\n\n // Draw the full line width rectangle in the background\n context.globalAlpha = 0.65;\n context.beginPath();\n context.rect(\n offsetX,\n offsetY /* TODO Scaling causes anti-aliasing in rectangles */,\n context.canvas.width - offsetX,\n lineHeight,\n );\n context.fillStyle = this.color(severity);\n context.fill();\n\n // Restore full opacity, otherwise every layer drawn after this one --\n // including the text of every subsequent line -- inherits the fade.\n context.globalAlpha = 1;\n\n // Draw diagnostic range rectangle in the foreground\n // TODO: We need to update the state to have specific ranges\n // context.globalAlpha = 1;\n // context.beginPath();\n // context.rect(offsetX, offsetY, textWidth, lineHeight);\n // context.fillStyle = this.color(severity);\n // context.fill();\n }\n\n /**\n * Given a position and a set of line ranges, return\n * the line number the position falls within\n */\n private findLine(pos: number, lines: Lines) {\n const index = lines.findIndex((spans) => {\n const start = spans.slice(0, 1)[0];\n const end = spans.slice(-1)[0];\n\n if (!start || !end) {\n return false;\n }\n\n return start.from <= pos && pos <= end.to;\n });\n\n // Line numbers begin at 1\n return index + 1;\n }\n\n /**\n * Colors from @codemirror/lint\n * https://github.com/codemirror/lint/blob/e0671b43c02e72766ad1afe1579b7032fdcdb6c1/src/lint.ts#L597\n */\n private color(severity: Severity) {\n return severity === \"error\"\n ? \"#d11\"\n : severity === \"warning\"\n ? \"orange\"\n : \"#999\";\n }\n\n /** Sorts severity from most to least severe */\n private sort(a: Severity, b: Severity) {\n return this.score(b) - this.score(a);\n }\n\n /** Assigns a score to severity, with most severe being the highest */\n private score(s: Severity) {\n switch (s) {\n case \"error\": {\n return 3;\n }\n case \"warning\": {\n return 2;\n }\n default: {\n return 1;\n }\n }\n }\n}\n\nexport function diagnostics(view: EditorView): DiagnosticState {\n return new DiagnosticState(view);\n}\n","import { LineBasedState } from \"./linebasedstate.js\";\nimport { EditorView, ViewUpdate } from \"@codemirror/view\";\nimport { LinesState, foldsChanged } from \"./LinesState.js\";\nimport { DrawContext } from \"./types.js\";\nimport { Config } from \"./Config.js\";\n\ntype Selection = { from: number; to: number; extends: boolean };\ntype DrawInfo = { backgroundColor: string };\n\nexport class SelectionState extends LineBasedState<Array<Selection>> {\n private _drawInfo: DrawInfo | undefined;\n private _themeClasses: string;\n\n public constructor(view: EditorView) {\n super(view);\n\n this.getDrawInfo();\n this._themeClasses = view.dom.classList.value;\n }\n\n private shouldUpdate(update: ViewUpdate) {\n // If the minimap is disabled\n if (!update.state.facet(Config).enabled) {\n return false;\n }\n\n // If the doc changed\n if (update.docChanged) {\n return true;\n }\n\n // If the selection changed\n if (update.selectionSet) {\n return true;\n }\n\n // If the theme changed\n if (this._themeClasses !== this.view.dom.classList.value) {\n return true;\n }\n\n // If the folds changed\n if (foldsChanged(update.transactions)) {\n return true;\n }\n\n return false;\n }\n\n public update(update: ViewUpdate) {\n if (!this.shouldUpdate(update)) {\n return;\n }\n\n this.map.clear();\n\n /* If class list has changed, clear and recalculate the selection style */\n if (this._themeClasses !== this.view.dom.classList.value) {\n this._drawInfo = undefined;\n this._themeClasses = this.view.dom.classList.value;\n }\n\n const { ranges } = update.state.selection;\n\n let selectionIndex = 0;\n for (const [index, line] of update.state.field(LinesState).entries()) {\n const selections: Array<Selection> = [];\n\n let offset = 0;\n for (const span of line) {\n do {\n // We've already processed all selections\n if (selectionIndex >= ranges.length) {\n continue;\n }\n\n // The next selection begins after this span\n if (span.to < ranges[selectionIndex].from) {\n continue;\n }\n\n // Ignore 0-length selections\n if (\n ranges[selectionIndex].from ===\n ranges[selectionIndex].to\n ) {\n selectionIndex++;\n continue;\n }\n\n // Build the selection for the current span\n const range = ranges[selectionIndex];\n const selection = {\n from:\n offset +\n Math.max(span.from, range.from) -\n span.from,\n to: offset + Math.min(span.to, range.to) - span.from,\n extends: range.to > span.to,\n };\n\n const lastSelection = selections.slice(-1)[0];\n if (lastSelection && lastSelection.to === selection.from) {\n // The selection in this span may just be a continuation of the\n // selection in the previous span\n\n // Adjust `to` depending on if we're in a folded span\n let { to } = selection;\n if (span.folded && selection.extends) {\n to = selection.from + 1;\n } else if (span.folded && !selection.extends) {\n to = lastSelection.to;\n }\n\n selections[selections.length - 1] = {\n ...lastSelection,\n to,\n extends: selection.extends,\n };\n } else if (!span.folded) {\n // It's a new selection; if we're not in a folded span we\n // should push it onto the stack\n selections.push(selection);\n }\n\n // If the selection doesn't end in this span, break out of the loop\n if (selection.extends) {\n break;\n }\n\n // Otherwise, move to the next selection\n selectionIndex++;\n } while (\n selectionIndex < ranges.length &&\n span.to >= ranges[selectionIndex].from\n );\n\n offset += span.folded ? 1 : span.to - span.from;\n }\n\n // If we don't have any selections on this line, we don't need to store anything\n if (selections.length === 0) {\n continue;\n }\n\n // Lines are indexed beginning at 1 instead of 0\n const lineNumber = index + 1;\n this.map.set(lineNumber, selections);\n }\n }\n\n public drawLine(ctx: DrawContext, lineNumber: number) {\n const {\n context,\n lineHeight,\n charWidth,\n offsetX: startOffsetX,\n offsetY,\n } = ctx;\n const selections = this.get(lineNumber);\n if (!selections) {\n return;\n }\n\n for (const selection of selections) {\n const offsetX = startOffsetX + selection.from * charWidth;\n const textWidth = (selection.to - selection.from) * charWidth;\n const fullWidth = context.canvas.width - offsetX;\n\n if (selection.extends) {\n // Draw the full width rectangle in the background\n context.globalAlpha = 0.65;\n context.beginPath();\n context.rect(offsetX, offsetY, fullWidth, lineHeight);\n context.fillStyle = this.getDrawInfo().backgroundColor;\n context.fill();\n }\n\n // Draw text selection rectangle in the foreground\n context.globalAlpha = 1;\n context.beginPath();\n context.rect(offsetX, offsetY, textWidth, lineHeight);\n context.fillStyle = this.getDrawInfo().backgroundColor;\n context.fill();\n }\n }\n\n private getDrawInfo(): DrawInfo {\n if (this._drawInfo) {\n return this._drawInfo;\n }\n\n // Create a mock selection\n const mockToken = document.createElement(\"span\");\n mockToken.setAttribute(\"class\", \"cm-selectionBackground\");\n this.view.dom.appendChild(mockToken);\n\n // Get style information\n const style = window.getComputedStyle(mockToken);\n const result = { backgroundColor: style.backgroundColor };\n\n // Store the result for the next update\n this._drawInfo = result;\n this.view.dom.removeChild(mockToken);\n\n return result;\n }\n}\n\nexport function selections(view: EditorView): SelectionState {\n return new SelectionState(view);\n}\n","import { LineBasedState } from \"./linebasedstate.js\";\nimport { Highlighter, highlightTree } from \"@lezer/highlight\";\nimport { ChangedRange, Tree, TreeFragment } from \"@lezer/common\";\nimport { highlightingFor, language } from \"@codemirror/language\";\nimport { EditorView, ViewUpdate } from \"@codemirror/view\";\nimport { DrawContext } from \"./types.js\";\nimport { Config, Options, Scale } from \"./Config.js\";\nimport { LinesState, foldsChanged } from \"./LinesState.js\";\nimport crelt from \"crelt\";\nimport { ChangeSet, EditorState } from \"@codemirror/state\";\n\nconst NON_WHITESPACE = /\\S+/g;\n\ntype TagSpan = { text: string; tags: string };\ntype FontInfo = { color: string; font: string; lineHeight: number };\n\nexport class TextState extends LineBasedState<Array<TagSpan>> {\n private _previousTree: Tree | undefined;\n private _displayText: Required<Options>[\"displayText\"] | undefined;\n private _fontInfoMap: Map<string, FontInfo> = new Map();\n private _themeClasses: Set<string> | undefined;\n private _highlightingCallbackId: number | undefined;\n private _charWidthCache: { font: string; charWidth: number } | undefined;\n\n /**\n * Font metrics are derived from `getComputedStyle`, which is only correct\n * once the fonts they describe have actually loaded. A web font that\n * resolves after the first render would otherwise leave every cached\n * measurement stale for the lifetime of the view.\n */\n private readonly onFontsLoaded = () => {\n this._fontInfoMap.clear();\n this._charWidthCache = undefined;\n };\n\n public constructor(view: EditorView) {\n super(view);\n\n this._themeClasses = new Set(view.dom.classList.values());\n document.fonts?.addEventListener(\"loadingdone\", this.onFontsLoaded);\n\n if (view.state.facet(Config).enabled) {\n this.updateImpl(view.state);\n }\n }\n\n public destroy() {\n document.fonts?.removeEventListener(\"loadingdone\", this.onFontsLoaded);\n }\n\n private shouldUpdate(update: ViewUpdate, themeChanged: boolean) {\n // If the doc changed\n if (update.docChanged) {\n return true;\n }\n\n // If configuration settings changed\n if (update.state.facet(Config) !== update.startState.facet(Config)) {\n return true;\n }\n\n // If the theme changed\n if (themeChanged) {\n return true;\n }\n\n // If the folds changed\n if (foldsChanged(update.transactions)) {\n return true;\n }\n\n return false;\n }\n\n public update(update: ViewUpdate) {\n /**\n * `themeChanged` consumes the pending change: it records the current\n * classes as it compares them, so a second call in the same update\n * always reports \"unchanged\". Sample it once and pass the result down.\n */\n const themeChanged = this.themeChanged();\n\n if (!this.shouldUpdate(update, themeChanged)) {\n return;\n }\n\n if (this._highlightingCallbackId) {\n if (typeof window.requestIdleCallback !== \"undefined\") {\n cancelIdleCallback(this._highlightingCallbackId);\n } else {\n clearTimeout(this._highlightingCallbackId);\n }\n }\n\n this.updateImpl(update.state, update.changes, themeChanged);\n }\n\n private updateImpl(\n state: EditorState,\n changes?: ChangeSet,\n themeChanged = true,\n ) {\n this.map.clear();\n\n /* Store display text setting for rendering */\n this._displayText = state.facet(Config).displayText;\n\n /* If class list has changed, clear and recalculate the font info map */\n if (themeChanged) {\n this._fontInfoMap.clear();\n this._charWidthCache = undefined;\n }\n\n /* Incrementally parse the tree based on previous tree + changes */\n let treeFragments: ReadonlyArray<TreeFragment> | undefined = undefined;\n if (this._previousTree && changes) {\n const previousFragments = TreeFragment.addTree(this._previousTree);\n\n const changedRanges: Array<ChangedRange> = [];\n changes.iterChangedRanges((fromA, toA, fromB, toB) =>\n changedRanges.push({ fromA, toA, fromB, toB }),\n );\n\n treeFragments = TreeFragment.applyChanges(\n previousFragments,\n changedRanges,\n );\n }\n\n /* Parse the document into a lezer tree */\n const docToString = state.doc.toString();\n const parser = state.facet(language)?.parser;\n const tree = parser\n ? parser.parse(docToString, treeFragments)\n : undefined;\n this._previousTree = tree;\n\n /* Highlight the document, and store the text and tags for each line */\n const highlighter: Highlighter = {\n style: (tags) => highlightingFor(state, tags),\n };\n\n let highlights: Array<{ from: number; to: number; tags: string }> = [];\n\n if (tree) {\n /**\n * The viewport renders a few extra lines above and below the editor view. To approximate\n * the lines visible in the minimap, we multiply the lines in the viewport by the scale multipliers.\n *\n * Based on the current scroll position, the minimap may show a larger portion of lines above or\n * below the lines currently in the editor view. On a long document, when the scroll position is\n * near the top of the document, the minimap will show a small number of lines above the lines\n * in the editor view, and a large number of lines below the lines in the editor view.\n *\n * To approximate this ratio, we can use the viewport scroll percentage\n *\n * ┌─────────────────────┐\n * │ │\n * │ Extra viewport │\n * │ buffer │\n * ├─────────────────────┼───────┐\n * │ │Minimap│\n * │ │Gutter │\n * │ ├───────┤\n * │ Editor View │Scaled │\n * │ │View │\n * │ │Overlay│\n * │ ├───────┤\n * │ │ │\n * │ │ │\n * ├─────────────────────┼───────┘\n * │ │\n * │ Extra viewport │\n * │ buffer │\n * └─────────────────────┘\n *\n **/\n\n const vpLineTop = state.doc.lineAt(this.view.viewport.from).number;\n const vpLineBottom = state.doc.lineAt(this.view.viewport.to).number;\n const vpLineCount = vpLineBottom - vpLineTop;\n const vpScroll = vpLineTop / (state.doc.lines - vpLineCount);\n\n const { SizeRatio, PixelMultiplier } = Scale;\n const mmLineCount = vpLineCount * SizeRatio * PixelMultiplier;\n const mmLineRatio = vpScroll * mmLineCount;\n\n const mmLineTop = Math.max(1, Math.floor(vpLineTop - mmLineRatio));\n const mmLineBottom = Math.min(\n vpLineBottom + Math.floor(mmLineCount - mmLineRatio),\n state.doc.lines,\n );\n\n // Highlight the in-view lines synchronously\n highlightTree(\n tree,\n highlighter,\n (from, to, tags) => {\n highlights.push({ from, to, tags });\n },\n state.doc.line(mmLineTop).from,\n state.doc.line(mmLineBottom).to,\n );\n }\n\n // Update the map\n this.updateMapImpl(state, highlights, docToString);\n\n // Highlight the entire tree in an idle callback\n highlights = [];\n const highlightingCallback = () => {\n if (tree) {\n highlightTree(tree, highlighter, (from, to, tags) => {\n highlights.push({ from, to, tags });\n });\n this.updateMapImpl(state, highlights, docToString);\n this._highlightingCallbackId = undefined;\n }\n };\n this._highlightingCallbackId =\n typeof window.requestIdleCallback !== \"undefined\"\n ? requestIdleCallback(highlightingCallback)\n : setTimeout(highlightingCallback);\n }\n\n private updateMapImpl(\n state: EditorState,\n highlights: Array<{ from: number; to: number; tags: string }>,\n docToString: string,\n ) {\n this.map.clear();\n\n const highlightsIterator = highlights.values();\n let highlightPtr = highlightsIterator.next();\n\n for (const [index, line] of state.field(LinesState).entries()) {\n const spans: Array<TagSpan> = [];\n\n for (const span of line) {\n // Skip if it's a 0-length span\n if (span.from === span.to) {\n continue;\n }\n\n // Append a placeholder for a folded span\n if (span.folded) {\n spans.push({ text: \"…\", tags: \"\" });\n continue;\n }\n\n let position = span.from;\n while (\n !highlightPtr.done &&\n highlightPtr.value.from < span.to\n ) {\n const { from, to, tags } = highlightPtr.value;\n\n // Iterate until our highlight is over the current span\n if (to < position) {\n highlightPtr = highlightsIterator.next();\n continue;\n }\n\n // Append unstyled text before the highlight begins\n if (from > position) {\n spans.push({\n text: docToString.slice(position, from),\n tags: \"\",\n });\n }\n\n // A highlight may start before and extend beyond the current span\n const start = Math.max(from, span.from);\n const end = Math.min(to, span.to);\n\n // Append the highlighted text\n spans.push({ text: docToString.slice(start, end), tags });\n position = end;\n\n // If the highlight continues beyond this span, break from this loop\n if (to > end) {\n break;\n }\n\n // Otherwise, move to the next highlight\n highlightPtr = highlightsIterator.next();\n }\n\n // If there are remaining spans that did not get highlighted, append them unstyled\n if (position !== span.to) {\n spans.push({\n text: docToString.slice(position, span.to),\n tags: \"\",\n });\n }\n }\n\n // Lines are indexed beginning at 1 instead of 0\n const lineNumber = index + 1;\n this.map.set(lineNumber, spans);\n }\n }\n\n public measure(context: CanvasRenderingContext2D): {\n charWidth: number;\n lineHeight: number;\n } {\n const { color, font, lineHeight } = this.getFontInfo(\"\");\n\n // The canvas resets its state whenever it is resized, so these are\n // reapplied on every measure even when the metrics themselves are cached.\n context.textBaseline = \"ideographic\";\n context.fillStyle = color;\n context.font = font;\n\n if (this._charWidthCache?.font !== font) {\n this._charWidthCache = {\n font,\n charWidth: context.measureText(\"_\").width,\n };\n }\n\n return { charWidth: this._charWidthCache.charWidth, lineHeight };\n }\n\n public drawLine(ctx: DrawContext, lineNumber: number) {\n const line = this.get(lineNumber);\n if (!line) {\n return;\n }\n\n let { context, charWidth, lineHeight, offsetX, offsetY } = ctx;\n\n let prevInfo: FontInfo | undefined;\n context.textBaseline = \"ideographic\";\n\n for (const span of line) {\n const info = this.getFontInfo(span.tags);\n\n if (!prevInfo || prevInfo.color !== info.color) {\n context.fillStyle = info.color;\n }\n\n if (!prevInfo || prevInfo.font !== info.font) {\n context.font = info.font;\n }\n\n prevInfo = info;\n\n lineHeight = Math.max(lineHeight, info.lineHeight);\n\n switch (this._displayText) {\n case \"characters\": {\n // TODO: `fillText` takes up the majority of profiling time in `render`\n // Try speeding it up with `drawImage`\n // https://stackoverflow.com/questions/8237030/html5-canvas-faster-filltext-vs-drawimage/8237081\n\n context.fillText(span.text, offsetX, offsetY + lineHeight);\n offsetX += span.text.length * charWidth;\n break;\n }\n\n case \"blocks\": {\n // Shared regex, so reset the cursor that a previous span\n // may have left behind after breaking out of the loop.\n NON_WHITESPACE.lastIndex = 0;\n let start: RegExpExecArray | null;\n while ((start = NON_WHITESPACE.exec(span.text)) !== null) {\n const startX = offsetX + start.index * charWidth;\n let width =\n (NON_WHITESPACE.lastIndex - start.index) *\n charWidth;\n\n // Reached the edge of the minimap\n if (startX > context.canvas.width) {\n break;\n }\n\n // Limit width to edge of minimap\n if (startX + width > context.canvas.width) {\n width = context.canvas.width - startX;\n }\n\n // Scaled 2px buffer between lines\n const yBuffer = 2 / Scale.SizeRatio;\n const height = lineHeight - yBuffer;\n\n context.fillStyle = info.color;\n context.globalAlpha = 0.65; // Make the blocks a bit faded\n context.beginPath();\n context.rect(startX, offsetY, width, height);\n context.fill();\n }\n\n // Undo the fade so it cannot bleed into later layers.\n context.globalAlpha = 1;\n\n offsetX += span.text.length * charWidth;\n break;\n }\n }\n }\n }\n\n private getFontInfo(tags: string): FontInfo {\n const cached = this._fontInfoMap.get(tags);\n if (cached) {\n return cached;\n }\n\n // Create a mock token wrapped in a cm-line\n const mockToken = crelt(\"span\", { class: tags });\n const mockLine = crelt(\n \"div\",\n { class: \"cm-line\", style: \"display: none\" },\n mockToken,\n );\n this.view.contentDOM.appendChild(mockLine);\n\n // Get style information and store it\n const style = window.getComputedStyle(mockToken);\n const lineHeight = parseFloat(style.lineHeight) / Scale.SizeRatio;\n const result = {\n color: style.color,\n font: `${style.fontStyle} ${style.fontWeight} ${lineHeight}px ${style.fontFamily}`,\n lineHeight,\n };\n this._fontInfoMap.set(tags, result);\n\n // Clean up and return\n this.view.contentDOM.removeChild(mockLine);\n return result;\n }\n\n private themeChanged(): boolean {\n const previous = this._themeClasses;\n const now = new Set(this.view.dom.classList.values());\n this._themeClasses = now;\n\n if (!previous) {\n return true;\n }\n\n // Ignore certain classes being added/removed\n previous.delete(\"cm-focused\");\n now.delete(\"cm-focused\");\n\n if (previous.size !== now.size) {\n return true;\n }\n\n let containsAll = true;\n previous.forEach((theme) => {\n if (!now.has(theme)) {\n containsAll = false;\n }\n });\n\n return !containsAll;\n }\n}\n\nexport function text(view: EditorView): TextState {\n return new TextState(view);\n}\n","import { DrawContext } from \"./types.js\";\n\nconst GUTTER_WIDTH = 4;\n\ntype Line = number;\ntype Color = string;\nexport type Gutter = Record<Line, Color>;\n\n/**\n * Draws a gutter to the canvas context for the given line number\n */\nfunction drawLineGutter(\n gutter: Record<Line, Color>,\n ctx: DrawContext,\n lineNumber: number,\n) {\n const color = gutter[lineNumber];\n if (!color) {\n return;\n }\n\n ctx.context.fillStyle = color;\n ctx.context.globalAlpha = 1;\n ctx.context.beginPath();\n ctx.context.rect(ctx.offsetX, ctx.offsetY, GUTTER_WIDTH, ctx.lineHeight);\n ctx.context.fill();\n}\n\nexport { GUTTER_WIDTH, drawLineGutter };\n","import { Facet } from \"@codemirror/state\";\nimport { EditorView, ViewPlugin, ViewUpdate } from \"@codemirror/view\";\nimport { Overlay } from \"./Overlay.js\";\nimport { Config, Options, Scale } from \"./Config.js\";\nimport { DiagnosticState, diagnostics } from \"./diagnostics.js\";\nimport { SelectionState, selections } from \"./selections.js\";\nimport { TextState, text } from \"./text.js\";\nimport { LinesState } from \"./LinesState.js\";\nimport crelt from \"crelt\";\nimport { GUTTER_WIDTH, drawLineGutter } from \"./Gutters.js\";\n\nconst Theme = EditorView.theme({\n \"&\": {\n height: \"100%\",\n overflowY: \"auto\",\n },\n \"& .cm-minimap-gutter\": {\n borderRight: 0,\n flexShrink: 0,\n left: \"unset\",\n position: \"sticky\",\n right: 0,\n top: 0,\n },\n \"& .cm-minimap-autohide\": {\n opacity: 0.0,\n transition: \"opacity 0.3s\",\n },\n \"& .cm-minimap-autohide:hover\": {\n opacity: 1.0,\n },\n \"& .cm-minimap-inner\": {\n height: \"100%\",\n position: \"absolute\",\n right: 0,\n top: 0,\n overflowY: \"hidden\",\n \"& canvas\": {\n display: \"block\",\n },\n },\n \"& .cm-minimap-box-shadow\": {\n boxShadow: \"12px 0px 20px 5px #6c6c6c\",\n },\n // Suppresses the scrollbar's appearance only; the scroller keeps its\n // overflow, so wheel, trackpad, keyboard and programmatic scrolling all\n // continue to work.\n // Lives on the scroller rather than the editor root: `themeChanged`\n // fingerprints the root's class list, so toggling a class there would read\n // as a theme change and needlessly drop the font metric cache.\n \"& .cm-scroller.cm-minimap-hide-scrollbar\": {\n scrollbarWidth: \"none\",\n \"&::-webkit-scrollbar\": {\n display: \"none\",\n },\n },\n});\n\nconst HIDE_SCROLLBAR_CLASS = \"cm-minimap-hide-scrollbar\";\n\nconst WIDTH_RATIO = 6;\n\nconst minimapClass = ViewPlugin.fromClass(\n class {\n private dom: HTMLElement | undefined;\n private inner: HTMLElement | undefined;\n private canvas: HTMLCanvasElement | undefined;\n\n public text: TextState;\n public selection: SelectionState;\n public diagnostic: DiagnosticState;\n\n public constructor(private view: EditorView) {\n this.text = text(view);\n this.selection = selections(view);\n this.diagnostic = diagnostics(view);\n\n if (view.state.facet(showMinimap)) {\n this.create(view);\n }\n }\n\n private create(view: EditorView) {\n const config = view.state.facet(showMinimap);\n if (!config) {\n throw Error(\"Expected nonnull\");\n }\n\n this.inner = crelt(\"div\", { class: \"cm-minimap-inner\" });\n this.canvas = crelt(\"canvas\");\n\n this.dom = config.create(view).dom;\n this.dom.classList.add(\"cm-gutters\");\n this.dom.classList.add(\"cm-minimap-gutter\");\n\n this.inner.appendChild(this.canvas);\n this.dom.appendChild(this.inner);\n\n // For now let's keep this same behavior. We might want to change\n // this in the future and have the extension figure out how to mount.\n // Or expose some more generic right gutter api and use that\n this.view.scrollDOM.insertBefore(\n this.dom,\n this.view.contentDOM.nextSibling,\n );\n\n for (const key in this.view.state.facet(Config).eventHandlers) {\n const handler =\n this.view.state.facet(Config).eventHandlers[key];\n if (handler) {\n this.dom.addEventListener(key, (e) =>\n handler(e, this.view),\n );\n }\n }\n\n if (config.autohide) {\n this.dom.classList.add(\"cm-minimap-autohide\");\n }\n }\n\n private remove() {\n this.view.scrollDOM.classList.remove(HIDE_SCROLLBAR_CLASS);\n\n if (this.dom) {\n this.dom.remove();\n }\n }\n\n update(update: ViewUpdate) {\n const prev = update.startState.facet(showMinimap);\n const now = update.state.facet(showMinimap);\n\n if (prev && !now) {\n this.remove();\n return;\n }\n\n if (!prev && now) {\n this.create(update.view);\n }\n\n if (now) {\n this.text.update(update);\n this.selection.update(update);\n this.diagnostic.update(update);\n this.render();\n }\n }\n\n getWidth(): number {\n const maxWidth = this.view.state.facet(Config).width;\n const editorWidth = this.view.dom.clientWidth;\n\n // Shrink proportionally rather than letting the minimap take over\n // a narrow editor.\n if (editorWidth <= maxWidth * WIDTH_RATIO) {\n return maxWidth * (editorWidth / (maxWidth * WIDTH_RATIO));\n }\n\n return maxWidth;\n }\n\n render() {\n // If we don't have elements to draw to exit early\n if (!this.dom || !this.canvas || !this.inner) {\n return;\n }\n\n this.updateBoxShadow();\n this.view.scrollDOM.classList.toggle(\n HIDE_SCROLLBAR_CLASS,\n this.view.state.facet(Config).hideScrollbar,\n );\n\n const width = this.getWidth();\n const domHeight = this.view.dom.getBoundingClientRect().height;\n\n this.dom.style.width = width + \"px\";\n this.canvas.style.maxWidth = width + \"px\";\n this.inner.style.minHeight = domHeight + \"px\";\n this.canvas.style.height = domHeight + \"px\";\n\n /**\n * Assigning to `width`/`height` reallocates the backing buffer and\n * resets every canvas property, so only do it on an actual size\n * change. The reset doubles as the clear when it does happen.\n */\n const canvasWidth = width * Scale.PixelMultiplier;\n const canvasHeight = domHeight * Scale.PixelMultiplier;\n const resized =\n this.canvas.width !== canvasWidth ||\n this.canvas.height !== canvasHeight;\n\n if (resized) {\n this.canvas.width = canvasWidth;\n this.canvas.height = canvasHeight;\n }\n\n const context = this.canvas.getContext(\"2d\");\n if (!context) {\n return;\n }\n\n if (!resized) {\n context.clearRect(0, 0, canvasWidth, canvasHeight);\n }\n\n /**\n * Draw layers leave `globalAlpha` faded behind them. Resizing used\n * to reset it as a side effect of reallocating the canvas; now that\n * the resize is conditional, reset it explicitly instead.\n */\n context.globalAlpha = 1;\n\n /* We need to get the correct font dimensions before this to measure characters */\n const { charWidth, lineHeight } = this.text.measure(context);\n\n let { startIndex, endIndex, offsetY } = this.canvasStartAndEndIndex(\n context,\n lineHeight,\n );\n\n const gutters = this.view.state.facet(Config).gutters;\n const lineCount = this.view.state.field(LinesState).length;\n\n for (let i = startIndex; i < endIndex; i++) {\n if (i >= lineCount) break;\n\n const drawContext = {\n offsetX: 0,\n offsetY,\n context,\n lineHeight,\n charWidth,\n };\n\n if (gutters.length) {\n /* Small leading buffer */\n drawContext.offsetX += 2;\n\n for (const gutter of gutters) {\n drawLineGutter(gutter, drawContext, i + 1);\n drawContext.offsetX += GUTTER_WIDTH;\n }\n\n /* Small trailing buffer */\n drawContext.offsetX += 2;\n }\n\n this.text.drawLine(drawContext, i + 1);\n this.selection.drawLine(drawContext, i + 1);\n this.diagnostic.drawLine(drawContext, i + 1);\n\n offsetY += lineHeight;\n }\n\n context.restore();\n }\n\n private canvasStartAndEndIndex(\n context: CanvasRenderingContext2D,\n lineHeight: number,\n ) {\n const { top: rawTop, bottom: rawBottom } =\n this.view.documentPadding;\n const pTop = rawTop / Scale.SizeRatio;\n const pBottom = rawBottom / Scale.SizeRatio;\n\n const canvasHeight = context.canvas.height;\n const { clientHeight, scrollHeight, scrollTop } =\n this.view.scrollDOM;\n let scrollPercent = scrollTop / (scrollHeight - clientHeight);\n if (isNaN(scrollPercent)) {\n scrollPercent = 0;\n }\n\n const lineCount = this.view.state.field(LinesState).length;\n const totalHeight = pTop + pBottom + lineCount * lineHeight;\n\n const canvasTop = Math.max(\n 0,\n scrollPercent * (totalHeight - canvasHeight),\n );\n const offsetY = Math.max(0, pTop - canvasTop);\n\n const startIndex = Math.round(\n Math.max(0, canvasTop - pTop) / lineHeight,\n );\n const spaceForLines = Math.round(\n (canvasHeight - offsetY) / lineHeight,\n );\n\n return {\n startIndex,\n endIndex: startIndex + spaceForLines,\n offsetY,\n };\n }\n\n private updateBoxShadow() {\n if (!this.canvas) {\n return;\n }\n\n const { clientWidth, scrollWidth, scrollLeft } =\n this.view.scrollDOM;\n\n if (clientWidth + scrollLeft < scrollWidth) {\n this.canvas.classList.add(\"cm-minimap-box-shadow\");\n } else {\n this.canvas.classList.remove(\"cm-minimap-box-shadow\");\n }\n }\n\n destroy() {\n this.text.destroy();\n this.remove();\n }\n },\n {\n eventHandlers: {\n scroll() {\n requestAnimationFrame(() => this.render());\n },\n },\n provide: (plugin) => {\n return EditorView.scrollMargins.of((view) => {\n const width = view.plugin(plugin)?.getWidth();\n if (!width) {\n return null;\n }\n\n return { right: width };\n });\n },\n },\n);\n\nexport interface MinimapConfig extends Omit<Options, \"enabled\"> {\n /**\n * A function that creates the element that contains the minimap\n */\n create: (view: EditorView) => { dom: HTMLElement };\n}\n\n/**\n * Facet used to show a minimap in the right gutter of the editor using the\n * provided configuration.\n *\n * If you return `null`, a minimap will not be shown.\n */\nconst showMinimap = Facet.define<MinimapConfig | null, MinimapConfig | null>({\n combine: (c) => c.find((o) => o !== null) ?? null,\n enables: (f) => {\n return [\n [\n Config.compute([f], (s) => s.facet(f)),\n Theme,\n LinesState,\n minimapClass, // TODO, codemirror-ify this one better\n Overlay,\n ],\n ];\n },\n});\n\nexport { showMinimap };\n"],"names":["Theme","selections"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { EditorView } from "@codemirror/view";
2
+ export declare abstract class LineBasedState<TValue> {
3
+ protected map: Map<number, TValue>;
4
+ protected view: EditorView;
5
+ constructor(view: EditorView);
6
+ get(lineNumber: number): TValue | undefined;
7
+ protected set(lineNumber: number, value: TValue): void;
8
+ }
9
+ //# sourceMappingURL=linebasedstate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linebasedstate.d.ts","sourceRoot":"","sources":["../src/linebasedstate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI9C,8BAAsB,cAAc,CAAC,MAAM;IACvC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC;gBAER,IAAI,EAAE,UAAU;IAK5B,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIlD,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CAGlD"}
@@ -0,0 +1,20 @@
1
+ import { LineBasedState } from "./linebasedstate.js";
2
+ import { EditorView, ViewUpdate } from "@codemirror/view";
3
+ import { DrawContext } from "./types.js";
4
+ type Selection = {
5
+ from: number;
6
+ to: number;
7
+ extends: boolean;
8
+ };
9
+ export declare class SelectionState extends LineBasedState<Array<Selection>> {
10
+ private _drawInfo;
11
+ private _themeClasses;
12
+ constructor(view: EditorView);
13
+ private shouldUpdate;
14
+ update(update: ViewUpdate): void;
15
+ drawLine(ctx: DrawContext, lineNumber: number): void;
16
+ private getDrawInfo;
17
+ }
18
+ export declare function selections(view: EditorView): SelectionState;
19
+ export {};
20
+ //# sourceMappingURL=selections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selections.d.ts","sourceRoot":"","sources":["../src/selections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,KAAK,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAGhE,qBAAa,cAAe,SAAQ,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAChE,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,aAAa,CAAS;gBAEX,IAAI,EAAE,UAAU;IAOnC,OAAO,CAAC,YAAY;IA6Bb,MAAM,CAAC,MAAM,EAAE,UAAU;IAsGzB,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM;IAoCpD,OAAO,CAAC,WAAW;CAoBtB;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,CAE3D"}
package/dist/text.d.ts ADDED
@@ -0,0 +1,38 @@
1
+ import { LineBasedState } from "./linebasedstate.js";
2
+ import { EditorView, ViewUpdate } from "@codemirror/view";
3
+ import { DrawContext } from "./types.js";
4
+ type TagSpan = {
5
+ text: string;
6
+ tags: string;
7
+ };
8
+ export declare class TextState extends LineBasedState<Array<TagSpan>> {
9
+ private _previousTree;
10
+ private _displayText;
11
+ private _fontInfoMap;
12
+ private _themeClasses;
13
+ private _highlightingCallbackId;
14
+ private _charWidthCache;
15
+ /**
16
+ * Font metrics are derived from `getComputedStyle`, which is only correct
17
+ * once the fonts they describe have actually loaded. A web font that
18
+ * resolves after the first render would otherwise leave every cached
19
+ * measurement stale for the lifetime of the view.
20
+ */
21
+ private readonly onFontsLoaded;
22
+ constructor(view: EditorView);
23
+ destroy(): void;
24
+ private shouldUpdate;
25
+ update(update: ViewUpdate): void;
26
+ private updateImpl;
27
+ private updateMapImpl;
28
+ measure(context: CanvasRenderingContext2D): {
29
+ charWidth: number;
30
+ lineHeight: number;
31
+ };
32
+ drawLine(ctx: DrawContext, lineNumber: number): void;
33
+ private getFontInfo;
34
+ private themeChanged;
35
+ }
36
+ export declare function text(view: EditorView): TextState;
37
+ export {};
38
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAQzC,KAAK,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAG9C,qBAAa,SAAU,SAAQ,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzD,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,uBAAuB,CAAqB;IACpD,OAAO,CAAC,eAAe,CAAkD;IAEzE;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAG5B;gBAEiB,IAAI,EAAE,UAAU;IAW5B,OAAO;IAId,OAAO,CAAC,YAAY;IAwBb,MAAM,CAAC,MAAM,EAAE,UAAU;IAuBhC,OAAO,CAAC,UAAU;IAgIlB,OAAO,CAAC,aAAa;IA8Ed,OAAO,CAAC,OAAO,EAAE,wBAAwB,GAAG;QAC/C,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACtB;IAmBM,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM;IA+EpD,OAAO,CAAC,WAAW;IA8BnB,OAAO,CAAC,YAAY;CA0BvB;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,CAEhD"}
@@ -0,0 +1,8 @@
1
+ export type DrawContext = {
2
+ context: CanvasRenderingContext2D;
3
+ offsetY: number;
4
+ lineHeight: number;
5
+ charWidth: number;
6
+ offsetX: number;
7
+ };
8
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACtB,OAAO,EAAE,wBAAwB,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACnB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "@batchfy/codemirror-minimap",
3
+ "version": "0.1.0",
4
+ "author": {
5
+ "name": "Batchfy LLC",
6
+ "email": "batchfy@gmail.com"
7
+ },
8
+ "license": "MIT",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/batchfy/codemirror-minimap.git"
12
+ },
13
+ "type": "module",
14
+ "sideEffects": false,
15
+ "types": "./dist/index.d.ts",
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "default": "./dist/index.js"
20
+ },
21
+ "./package.json": "./package.json"
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "src"
26
+ ],
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "scripts": {
31
+ "dev": "vite ./dev",
32
+ "build": "rollup -c && tsc -p tsconfig.build.json",
33
+ "test": "vitest run",
34
+ "test:watch": "vitest",
35
+ "bench": "vitest bench --run",
36
+ "typecheck": "tsc --noEmit",
37
+ "lint": "eslint .",
38
+ "lint:fix": "eslint . --fix",
39
+ "format": "prettier --write .",
40
+ "format:check": "prettier --check .",
41
+ "ncu": "npx npm-check-updates"
42
+ },
43
+ "dependencies": {
44
+ "crelt": "^1.0.7"
45
+ },
46
+ "peerDependencies": {
47
+ "@codemirror/language": "^6.9.1",
48
+ "@codemirror/lint": "^6.4.2",
49
+ "@codemirror/state": "^6.3.1",
50
+ "@codemirror/view": "^6.21.3",
51
+ "@lezer/common": "^1.1.0",
52
+ "@lezer/highlight": "^1.1.6"
53
+ },
54
+ "devDependencies": {
55
+ "@codemirror/lang-javascript": "^6.2.5",
56
+ "@codemirror/language": "^6.12.4",
57
+ "@codemirror/lint": "^6.9.7",
58
+ "@codemirror/state": "^6.7.1",
59
+ "@codemirror/theme-one-dark": "^6.1.3",
60
+ "@codemirror/view": "^6.43.9",
61
+ "@eslint/js": "^10.0.1",
62
+ "@lezer/common": "^1.5.2",
63
+ "@lezer/highlight": "^1.2.3",
64
+ "codemirror": "^6.0.2",
65
+ "esbuild": "^0.28.2",
66
+ "eslint": "^10.9.0",
67
+ "eslint-config-prettier": "^10.1.8",
68
+ "jsdom": "^29.1.1",
69
+ "prettier": "^3.9.6",
70
+ "rollup": "^4.62.5",
71
+ "rollup-plugin-esbuild": "^6.2.1",
72
+ "typescript": "^6.0.3",
73
+ "typescript-eslint": "^8.67.0",
74
+ "vite": "^8.2.2",
75
+ "vitest": "^4.1.11"
76
+ }
77
+ }
package/src/Config.ts ADDED
@@ -0,0 +1,110 @@
1
+ import { Facet, combineConfig } from "@codemirror/state";
2
+ import { DOMEventMap, EditorView } from "@codemirror/view";
3
+ import { MinimapConfig } from "./index.js";
4
+ import { Gutter } from "./Gutters.js";
5
+
6
+ type EventHandler<event extends keyof DOMEventMap> = (
7
+ e: DOMEventMap[event],
8
+ v: EditorView,
9
+ ) => void;
10
+
11
+ type Options = {
12
+ /**
13
+ * Controls whether the minimap should be hidden on mouseout.
14
+ * Defaults to `false`.
15
+ */
16
+ autohide?: boolean;
17
+
18
+ enabled: boolean;
19
+
20
+ /**
21
+ * Determines how to render text. Defaults to `characters`.
22
+ */
23
+ displayText?: "blocks" | "characters";
24
+
25
+ /**
26
+ * Attach event handlers to the minimap container element.
27
+ */
28
+ eventHandlers?: {
29
+ [event in keyof DOMEventMap]?: EventHandler<event>;
30
+ };
31
+
32
+ /**
33
+ * The overlay shows the portion of the file currently in the viewport.
34
+ * Defaults to `always`.
35
+ */
36
+ showOverlay?: "always" | "mouse-over";
37
+
38
+ /**
39
+ * Enables a gutter to be drawn on the given line to the left
40
+ * of the minimap, with the given color. Accepts all valid CSS
41
+ * color values.
42
+ */
43
+ gutters?: Array<Gutter>;
44
+
45
+ /**
46
+ * Maximum width of the minimap in pixels. Defaults to `120`.
47
+ *
48
+ * This is an upper bound rather than a fixed size: when the editor is
49
+ * narrow the minimap shrinks proportionally so that it never dominates
50
+ * the viewport. A wider minimap shows more characters per line; it does
51
+ * not change the size the text is rendered at.
52
+ */
53
+ width?: number;
54
+
55
+ /**
56
+ * Hides the editor's native scrollbar while the minimap is shown, since
57
+ * the minimap and its viewport overlay already serve that role. Scrolling
58
+ * itself is unaffected -- only the scrollbar's appearance is suppressed.
59
+ * Defaults to `true`.
60
+ *
61
+ * Note that this hides the horizontal scrollbar too, as scrollbar
62
+ * visibility cannot be controlled per axis. Horizontal overflow stays
63
+ * discoverable through the minimap's shadow.
64
+ */
65
+ hideScrollbar?: boolean;
66
+ };
67
+
68
+ const Scale = {
69
+ // Multiply the number of canvas pixels
70
+ PixelMultiplier: 2,
71
+ // Downscale the editor contents by this ratio
72
+ SizeRatio: 4,
73
+ // Maximum width of the minimap in pixels
74
+ MaxWidth: 120,
75
+ } as const;
76
+
77
+ const Config = Facet.define<MinimapConfig | null, Required<Options>>({
78
+ combine: (c) => {
79
+ const configs: Array<Options> = [];
80
+ for (const config of c) {
81
+ if (!config) {
82
+ continue;
83
+ }
84
+
85
+ const { create, gutters, ...rest } = config;
86
+
87
+ configs.push({
88
+ ...rest,
89
+ enabled: true,
90
+ gutters: gutters
91
+ ? gutters.filter((v) => Object.keys(v).length > 0)
92
+ : undefined,
93
+ });
94
+ }
95
+
96
+ return combineConfig(configs, {
97
+ enabled: configs.length > 0,
98
+ displayText: "characters",
99
+ eventHandlers: {},
100
+ showOverlay: "always",
101
+ gutters: [],
102
+ autohide: false,
103
+ width: Scale.MaxWidth,
104
+ hideScrollbar: true,
105
+ });
106
+ },
107
+ });
108
+
109
+ export { Config, Scale };
110
+ export type { Options };
package/src/Gutters.ts ADDED
@@ -0,0 +1,29 @@
1
+ import { DrawContext } from "./types.js";
2
+
3
+ const GUTTER_WIDTH = 4;
4
+
5
+ type Line = number;
6
+ type Color = string;
7
+ export type Gutter = Record<Line, Color>;
8
+
9
+ /**
10
+ * Draws a gutter to the canvas context for the given line number
11
+ */
12
+ function drawLineGutter(
13
+ gutter: Record<Line, Color>,
14
+ ctx: DrawContext,
15
+ lineNumber: number,
16
+ ) {
17
+ const color = gutter[lineNumber];
18
+ if (!color) {
19
+ return;
20
+ }
21
+
22
+ ctx.context.fillStyle = color;
23
+ ctx.context.globalAlpha = 1;
24
+ ctx.context.beginPath();
25
+ ctx.context.rect(ctx.offsetX, ctx.offsetY, GUTTER_WIDTH, ctx.lineHeight);
26
+ ctx.context.fill();
27
+ }
28
+
29
+ export { GUTTER_WIDTH, drawLineGutter };