@batchfy/codemirror-minimap 0.1.0 → 0.1.1
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/README.md +5 -0
- package/dist/Overlay.d.ts.map +1 -1
- package/dist/geometry.d.ts +130 -0
- package/dist/geometry.d.ts.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +321 -166
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
- package/src/Overlay.ts +151 -118
- package/src/geometry.ts +402 -0
- package/src/index.ts +39 -25
package/dist/index.js.map
CHANGED
|
@@ -1 +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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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/Config.ts","../src/LinesState.ts","../src/geometry.ts","../src/Overlay.ts","../src/linebasedstate.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 { 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 { BlockInfo, EditorView } from \"@codemirror/view\";\nimport { Scale } from \"./Config.js\";\nimport { LinesState, type Lines } from \"./LinesState.js\";\n\n/** Editor pixels that fit into a single minimap pixel. */\nexport const SCALE = Scale.PixelMultiplier * Scale.SizeRatio;\n\nconst clamp = (value: number, min: number, max: number) =>\n Math.min(Math.max(value, min), max);\n\nexport type LayoutInput = {\n /** Rows the minimap draws: one per line it lays out, folds collapsed. */\n rowCount: number;\n /** Height of one row. */\n lineHeight: number;\n paddingTop: number;\n paddingBottom: number;\n /** Height of the visible minimap. */\n height: number;\n /** Rows the editor currently shows on screen, inclusive. */\n firstVisibleRow: number;\n lastVisibleRow: number;\n /**\n * Rows a screenful holds when none of its lines wrap.\n *\n * How many rows are on screen right now swings with how much the lines on\n * it wrap: a screen of code holds many lines, a screen of prose few. This\n * count follows from the editor's height and its line height alone, so it\n * holds still while the document scrolls.\n */\n rowsPerScreen: number;\n};\n\nexport type Layout = {\n /** Height of every row plus the document padding. */\n contentHeight: number;\n /** How far the rows are scrolled up inside the visible minimap. */\n scrollTop: number;\n /** Position of the viewport overlay inside the visible minimap. */\n overlayTop: number;\n overlayHeight: number;\n /** Rows the minimap has to draw, carried through for the inverse. */\n rowCount: number;\n /**\n * Rows the document can scroll through if none of its lines wrap: the ones\n * past the first screenful.\n *\n * Wrapping puts fewer document lines on a screen than there are rows in it,\n * so the editor can carry on past this — `rowAtOverlayTop` covers the rest.\n */\n scrollableRows: number;\n /**\n * How far the overlay's top edge moves between the first row of the\n * document and the last, and so how far a drag has to travel to cross the\n * document. It is `overlayTravel / scrollableRows` per row, which is what\n * `rowAtOverlayTop` inverts.\n */\n overlayTravel: number;\n};\n\n/**\n * Places the rows and the viewport overlay together.\n *\n * The overlay marks lines, not pixels, so its position cannot be derived from\n * the editor's scroll offset: a wrapped line takes several rows of the editor\n * and one row of the minimap, so equal scroll fractions stop meaning equal\n * positions as soon as wrapping, folding or line-height variation enters the\n * document. Both halves are therefore anchored on the rows that are actually on\n * screen, which keeps the overlay on top of the content it stands for.\n *\n * The rows scroll in step with progress through the document, so the overlay\n * ends up where that progress says it should: at the top on the first row, at\n * the bottom on the last. Near either end, and whenever the rows have less to\n * give than the progress asks for, the rows stop and the overlay takes over the\n * remaining travel — covering its own rows always wins over sitting where the\n * scroll fraction would like it to.\n */\nexport function computeLayout(input: LayoutInput): Layout {\n const { rowCount, lineHeight, paddingTop, paddingBottom, height } = input;\n\n const lastRow = Math.max(0, rowCount - 1);\n const first = clamp(input.firstVisibleRow, 0, lastRow);\n const last = clamp(input.lastVisibleRow, first, lastRow);\n const visibleRows = last - first + 1;\n\n const contentHeight = paddingTop + paddingBottom + rowCount * lineHeight;\n const overlayHeight = Math.min(height, visibleRows * lineHeight);\n const rowTop = paddingTop + first * lineHeight;\n\n /**\n * Measured against a screenful of unwrapped lines rather than against the\n * rows that happen to be on screen. A denominator that moved with the\n * current wrapping would shrink as a screen of code scrolled into a screen\n * of wrapped prose, and the rows would slide backwards underneath an\n * overlay that had just moved forwards.\n */\n const scrollableRows = Math.max(0, rowCount - input.rowsPerScreen);\n const progress =\n scrollableRows <= 0 ? 0 : clamp(first / scrollableRows, 0, 1);\n\n const maxScroll = Math.max(0, contentHeight - height);\n const scrollTop = clamp(\n maxScroll * progress,\n Math.max(0, rowTop - (height - overlayHeight)),\n Math.min(maxScroll, rowTop),\n );\n\n /**\n * Measured against a screenful of rows rather than against the overlay's\n * current height, for the same reason `progress` is: an overlay shrunk by\n * the wrapping on screen right now would report a travel that the rows it\n * has to move over cannot back up, and a drag would run ahead of them.\n */\n const overlayTravel = Math.max(\n 0,\n Math.min(height, contentHeight) -\n paddingTop -\n paddingBottom -\n input.rowsPerScreen * lineHeight,\n );\n\n return {\n contentHeight,\n scrollTop,\n overlayTop: rowTop - scrollTop,\n overlayHeight,\n rowCount,\n scrollableRows,\n overlayTravel,\n };\n}\n\nexport type Geometry = Layout & {\n lineHeight: number;\n paddingTop: number;\n paddingBottom: number;\n /** Height of the visible minimap. */\n height: number;\n};\n\n/**\n * The part of the geometry that scrolling does not change.\n *\n * Everything here follows from the document's length, the theme's row height\n * and the size of the editor, so it holds still while the document moves under\n * the overlay. A drag can therefore measure it once at the outset instead of on\n * every report from the pointer — and the type is the argument that this is\n * safe, since a function given only these values cannot read the scroll\n * position it would be caching past.\n */\nexport type StableGeometry = Pick<\n Geometry,\n | \"paddingTop\"\n | \"lineHeight\"\n | \"rowCount\"\n | \"scrollableRows\"\n | \"overlayTravel\"\n>;\n\n/**\n * The row height the renderer measured, in minimap pixels.\n *\n * It comes from the computed style of a mock line, which only the renderer is\n * set up to measure, and it changes with the theme rather than with the scroll\n * position. Sharing the measurement lets the overlay lay itself out against the\n * exact grid the rows were drawn on instead of a second estimate of it.\n */\nconst rowHeights = new WeakMap<EditorView, number>();\n\nexport function setRowHeight(view: EditorView, canvasLineHeight: number) {\n const lineHeight = canvasLineHeight / Scale.PixelMultiplier;\n\n if (rowHeights.get(view) !== lineHeight) {\n rowHeights.set(view, lineHeight);\n measured.delete(view);\n }\n}\n\n/** Index of the row the minimap draws the given document position on. */\nexport function rowAtPos(lines: Lines, pos: number): number {\n let low = 0;\n let high = lines.length - 1;\n\n while (low < high) {\n const mid = Math.ceil((low + high) / 2);\n const line = lines[mid];\n\n if (line && line.length && line[0].from <= pos) {\n low = mid;\n } else {\n high = mid - 1;\n }\n }\n\n return Math.max(0, low);\n}\n\n/**\n * The line block at a vertical position, found by bisecting the document.\n *\n * `view.lineBlockAtHeight` answers this directly, but it refuses to run while\n * the editor is mid-update, which is when the minimap draws. Blocks are ordered\n * by height, so the same answer is reachable through `view.lineBlockAt`, which\n * carries no such restriction.\n */\nfunction lineBlockAtHeight(view: EditorView, height: number): BlockInfo {\n const { doc } = view.state;\n let low = 1;\n let high = doc.lines;\n\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n\n if (view.lineBlockAt(doc.line(mid).from).bottom <= height) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n\n return view.lineBlockAt(doc.line(low).from);\n}\n\n/** The rows the editor currently shows on screen, inclusive. */\nfunction visibleRows(view: EditorView): { first: number; last: number } {\n const lines = view.state.field(LinesState);\n const { top, bottom } = view.scrollDOM.getBoundingClientRect();\n const documentTop = view.documentTop;\n\n return {\n first: rowAtPos(lines, lineBlockAtHeight(view, top - documentTop).from),\n last: rowAtPos(lines, lineBlockAtHeight(view, bottom - documentTop).to),\n };\n}\n\n/**\n * The last geometry measured for a view, and what it was measured for.\n *\n * The overlay and the renderer both need the geometry and both run on every\n * update, so measuring it twice means paying twice for the three\n * `getBoundingClientRect` calls behind `view.dom`, `view.scrollDOM` and\n * `view.documentTop`, and for the two bisections of the height map. Handing\n * both of them the same token — the `ViewUpdate` or the scroll event they are\n * responding to — lets the second one reuse the first one's answer.\n */\nconst measured = new WeakMap<\n EditorView,\n { token: object; geometry: Geometry }\n>();\n\n/**\n * Where the minimap draws its rows and its overlay for the current state.\n *\n * `token` stands for the moment being drawn: anything measured for the same\n * token describes the same moment, so it is measured once. Callers with no\n * moment to name pass nothing and get a fresh measurement.\n */\nexport function readGeometry(view: EditorView, token?: object): Geometry {\n if (token) {\n const previous = measured.get(view);\n\n if (previous && previous.token === token) {\n return previous.geometry;\n }\n }\n\n const geometry = measureGeometry(view);\n\n if (token) {\n measured.set(view, { token, geometry });\n }\n\n return geometry;\n}\n\nfunction measureGeometry(view: EditorView): Geometry {\n const lineHeight =\n rowHeights.get(view) || view.defaultLineHeight / SCALE || 0;\n const paddingTop = view.documentPadding.top / SCALE;\n const paddingBottom = view.documentPadding.bottom / SCALE;\n const height = view.dom.getBoundingClientRect().height;\n const { first, last } = visibleRows(view);\n\n const layout = computeLayout({\n rowCount: view.state.field(LinesState).length,\n lineHeight,\n paddingTop,\n paddingBottom,\n height,\n firstVisibleRow: first,\n lastVisibleRow: last,\n rowsPerScreen: view.defaultLineHeight\n ? view.scrollDOM.clientHeight / view.defaultLineHeight\n : 0,\n });\n\n return { ...layout, lineHeight, paddingTop, paddingBottom, height };\n}\n\n/** The row drawn `y` pixels below the top of the visible minimap. */\nexport function rowAtY(geometry: Geometry, y: number): number {\n if (geometry.lineHeight <= 0) {\n return 0;\n }\n\n const offset = geometry.scrollTop + y - geometry.paddingTop;\n return Math.floor(offset / geometry.lineHeight);\n}\n\n/**\n * The row the editor would have to put at the top of its viewport for the\n * overlay to sit at `overlayTop`.\n *\n * This is the inverse of the placement `computeLayout` performs, so dragging\n * the overlay to a position and letting the layout put it back lands on the\n * same pixel. It cannot be read off `rowAtY`: the rows underneath the overlay\n * scroll as the overlay moves, so the row drawn at a position is not the row\n * that would be on screen were the overlay taken there.\n *\n * The answer carries its fraction. A whole number of rows is not enough to\n * reach the end of a document: the editor stops with the last line against the\n * foot of the viewport, which in general falls part-way through a row, and a\n * drag that could only name whole rows would stop short of it by that part and\n * need a jump to finish.\n */\nexport function rowAtOverlayTop(\n geometry: StableGeometry,\n overlayTop: number,\n): number {\n if (\n geometry.overlayTravel <= 0 ||\n geometry.scrollableRows <= 0 ||\n geometry.lineHeight <= 0\n ) {\n return 0;\n }\n\n const offset = overlayTop - geometry.paddingTop;\n\n /**\n * Past its travel the overlay is still moving, and the drag has to follow\n * it there.\n *\n * `scrollableRows` counts rows against a screenful of unwrapped lines, but\n * a screen of wrapped lines holds fewer document lines than it has rows,\n * so the editor can put rows past that one at the top of its viewport. The\n * layout already draws them: `progress` stops at 1, the rows stop\n * scrolling, and the overlay covers the remaining distance on its own, one\n * row height per row. Ending the inverse at `scrollableRows` instead left a\n * drag stuck a screenful's worth of wrapping short of the end, reachable\n * only by scrolling the editor itself.\n */\n if (offset >= geometry.overlayTravel) {\n return clamp(\n geometry.scrollableRows +\n (offset - geometry.overlayTravel) / geometry.lineHeight,\n 0,\n Math.max(0, geometry.rowCount - 1),\n );\n }\n\n const progress = clamp(offset / geometry.overlayTravel, 0, 1);\n\n return progress * geometry.scrollableRows;\n}\n\n/**\n * Scrolls the editor until `row` sits `offset` pixels down the viewport.\n *\n * `row` may name a point inside a row rather than the start of one, and the\n * fraction is taken against that row's own height so that it means the same\n * part of a wrapped line as of an unwrapped one. Scrolling to whole rows is\n * enough for a click, which is aiming at a line; a drag needs the fraction, or\n * it cannot follow the pointer through the last part of a row and stops short\n * of the end of the document.\n */\nexport function scrollToRow(view: EditorView, row: number, offset = 0) {\n const lines = view.state.field(LinesState);\n const wanted = clamp(row, 0, lines.length - 1);\n const index = Math.floor(wanted);\n const line = lines[index];\n\n if (!line || !line.length) {\n return;\n }\n\n const block = view.lineBlockAt(line[0].from);\n const withinRow = (wanted - index) * block.height;\n\n /**\n * Set outright rather than nudged by a difference from where the editor is\n * now. `lineBlockAt` measures from the top of the document, and the\n * document begins `paddingTop` into the scroller's content, so that sum is\n * already the position that puts the row against the top of the viewport.\n * Working it out as a difference meant reading the current scroll offset,\n * the scroller's box and the document's box — three measurements of the\n * present, to arrive somewhere that never depended on it. The scroller\n * clamps the result at both ends by itself.\n */\n view.scrollDOM.scrollTop =\n view.documentPadding.top + block.top + withinRow - offset;\n}\n","import { EditorView, ViewPlugin, ViewUpdate } from \"@codemirror/view\";\nimport { Config } from \"./Config.js\";\nimport {\n readGeometry,\n rowAtOverlayTop,\n rowAtY,\n scrollToRow,\n type StableGeometry,\n} from \"./geometry.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 // The minimap is a sibling of `.cm-content` inside the scroller, so\n // without this it inherits the caret the editor shows over text. It is\n // not text: clicking it jumps, and the overlay is dragged.\n cursor: \"default\",\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 cursor: \"grab\",\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 cursor: \"grabbing\",\n },\n },\n },\n});\n\nconst OverlayView = ViewPlugin.fromClass(\n class {\n private container: HTMLElement | undefined;\n private dom: HTMLElement | undefined;\n\n private _isDragging: boolean = false;\n /**\n * Where inside the overlay the drag took hold of it, as a fraction of\n * its height rather than a count of pixels down from its top.\n *\n * The overlay is sized to the lines on screen, so it shrinks as a drag\n * carries it from a screen of code into one of wrapped prose. A pixel\n * offset taken when it was tall goes on pointing at where its middle\n * used to be, which by the end of the document is somewhere below its\n * bottom edge — and the pointer would have to leave the minimap, often\n * the window, to put the overlay where it belongs. A fraction shrinks\n * with it and stays under the thumb.\n */\n private _dragAnchor: number | undefined;\n /** The last position the pointer reported, waiting for a frame. */\n private _dragPointerY: number | undefined;\n private _dragFrame: number | undefined;\n /**\n * Measured when the drag starts and kept for its duration. None of it\n * moves as the document scrolls, and `update` drops it so that anything\n * which does move it — an edit, a resize, a change of theme — is\n * measured again.\n */\n private _dragGeometry: StableGeometry | 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.position();\n }\n\n private remove() {\n // A minimap turned off or torn down mid-drag would otherwise leave\n // the whole page holding the dragging cursor.\n if (this._isDragging) {\n this.endDrag();\n }\n\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 // Anything that reaches an update may have changed the size of\n // the editor, the length of the document or the height of a\n // row, so a drag in progress measures them again.\n this._dragGeometry = undefined;\n\n this.computeShowOverlay();\n\n // Unconditionally, and not just on `geometryChanged`: the rows\n // are redrawn on every update, and an overlay that skipped one\n // would be left marking rows that have since moved under it.\n // The renderer runs first and measures the same update, so this\n // reads that measurement rather than taking its own.\n this.position(update);\n }\n }\n\n /**\n * Covers the rows the editor is showing. The renderer scrolls its rows\n * to the position the same geometry prescribes, so the overlay lands on\n * the drawn content whatever the document does with wrapping or folds.\n */\n public position(token?: object) {\n if (!this.dom) {\n return;\n }\n\n const { overlayTop, overlayHeight } = readGeometry(\n this.view,\n token,\n );\n this.dom.style.top = overlayTop + \"px\";\n this.dom.style.height = overlayHeight + \"px\";\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 /**\n * The minimap sits inside the scroller alongside `.cm-content`, so\n * a mousedown on it starts a native text selection that runs on for\n * as long as the button is held — which is what leaves the pointer\n * showing a caret through the whole drag, and what puts a selection\n * in the document that nobody asked for. Neither gesture here has\n * anything to do with selecting: one jumps, one drags.\n */\n event.preventDefault();\n\n // If target is the overlay start dragging\n const { clientY, target } = event;\n if (target === this.dom && this.dom) {\n const grabbed = this.dom.getBoundingClientRect();\n\n this._dragAnchor =\n grabbed.height > 0\n ? (clientY - grabbed.top) / grabbed.height\n : 0;\n this._isDragging = true;\n this.container.classList.add(\"cm-minimap-overlay-active\");\n\n // The pointer spends most of a drag off the overlay, and some\n // of it off the minimap altogether, where the rule on the\n // overlay no longer reaches it.\n document.body.style.cursor = \"grabbing\";\n return;\n }\n\n // A click anywhere else on the minimap centres the row underneath it\n const geometry = readGeometry(this.view);\n const y = clientY - this.container.getBoundingClientRect().top;\n\n scrollToRow(\n this.view,\n rowAtY(geometry, y),\n this.view.scrollDOM.clientHeight / 2,\n );\n }\n\n private onMouseUp(_event: MouseEvent) {\n // Stop dragging on mouseup\n if (this._isDragging) {\n this.endDrag();\n }\n }\n\n private endDrag() {\n if (this._dragFrame !== undefined) {\n cancelAnimationFrame(this._dragFrame);\n this._dragFrame = undefined;\n }\n\n this._dragAnchor = undefined;\n this._dragPointerY = undefined;\n this._dragGeometry = undefined;\n this._isDragging = false;\n this.container?.classList.remove(\"cm-minimap-overlay-active\");\n document.body.style.removeProperty(\"cursor\");\n }\n\n private onMouseMove(event: MouseEvent) {\n if (!this._isDragging || this._dragAnchor === undefined) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n this._dragPointerY = event.clientY;\n\n /**\n * At most one move per frame. A trackpad reports positions faster\n * than the screen can show them, and acting on each one means\n * reading the layout back immediately after the last one wrote to\n * it — the reading is what costs, and none of the extra readings\n * can reach the screen anyway.\n */\n if (this._dragFrame === undefined) {\n this._dragFrame = requestAnimationFrame(() => {\n this._dragFrame = undefined;\n this.dragToPointer();\n });\n }\n }\n\n private dragToPointer() {\n if (\n !this._isDragging ||\n this._dragAnchor === undefined ||\n this._dragPointerY === undefined ||\n !this.container ||\n !this.dom\n ) {\n return;\n }\n\n this._dragGeometry ??= readGeometry(this.view);\n\n /**\n * The overlay's drawn height, rather than a freshly computed one:\n * the anchor was taken against what is on the screen, the two rows\n * a frame of lag can cost are invisible at this scale, and reading\n * it is a single box where computing it means bisecting the height\n * map twice.\n */\n const overlayHeight = this.dom.getBoundingClientRect().height;\n const containerTop = this.container.getBoundingClientRect().top;\n\n const top =\n this._dragPointerY -\n this._dragAnchor * overlayHeight -\n containerTop;\n\n scrollToRow(this.view, rowAtOverlayTop(this._dragGeometry, top));\n }\n\n public destroy() {\n this.remove();\n }\n },\n {\n eventHandlers: {\n scroll(event) {\n requestAnimationFrame(() => this.position(event));\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 { 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 { readGeometry, setRowHeight } from \"./geometry.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(update);\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 /**\n * `token` names the moment being drawn, and is passed on to\n * `readGeometry` so that the overlay, which draws the same moment,\n * measures it only once between them.\n */\n render(token?: object) {\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 setRowHeight(this.view, lineHeight);\n\n let { startIndex, endIndex, offsetY } = this.canvasStartAndEndIndex(\n context,\n lineHeight,\n token,\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 token?: object,\n ) {\n const pTop = this.view.documentPadding.top / Scale.SizeRatio;\n const canvasHeight = context.canvas.height;\n\n /**\n * The rows are scrolled to wherever the overlay needs them: the two\n * are laid out together so that the overlay covers the rows the\n * editor is showing rather than an approximation of them.\n */\n const canvasTop =\n readGeometry(this.view, token).scrollTop *\n Scale.PixelMultiplier;\n\n if (lineHeight <= 0) {\n return { startIndex: 0, endIndex: 0, offsetY: 0 };\n }\n\n /**\n * The first row to draw is the one the top edge falls inside, not\n * the nearest one to it: rounding would leave every row up to half\n * a row away from where the overlay expects it, and by a different\n * amount at every scroll position. Whatever part of that row lies\n * above the edge goes into `offsetY`, which is why it may be\n * negative — the row is drawn from off the top of the canvas so the\n * rest of it lands exactly where the overlay marks it.\n */\n const startIndex = Math.max(\n 0,\n Math.floor((canvasTop - pTop) / lineHeight),\n );\n const offsetY = pTop + startIndex * lineHeight - canvasTop;\n const spaceForLines = Math.ceil(\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(event) {\n requestAnimationFrame(() => this.render(event));\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":["visibleRows","Theme","selections"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@batchfy/codemirror-minimap",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"author": {
|
|
5
5
|
"name": "Batchfy LLC",
|
|
6
6
|
"email": "batchfy@gmail.com"
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"scripts": {
|
|
31
31
|
"dev": "vite ./dev",
|
|
32
32
|
"build": "rollup -c && tsc -p tsconfig.build.json",
|
|
33
|
+
"prepare": "npm run build",
|
|
33
34
|
"test": "vitest run",
|
|
34
35
|
"test:watch": "vitest",
|
|
35
36
|
"bench": "vitest bench --run",
|