@singapore-editor/minimap 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.
Files changed (56) hide show
  1. package/README.md +29 -0
  2. package/dist/assets/minimap.worker-i4S59IOV.js +1616 -0
  3. package/dist/assets/minimap.worker-i4S59IOV.js.map +1 -0
  4. package/dist/color.d.ts +11 -0
  5. package/dist/color.d.ts.map +1 -0
  6. package/dist/color.js +83 -0
  7. package/dist/color.js.map +1 -0
  8. package/dist/decorationMerge.d.ts +10 -0
  9. package/dist/decorationMerge.d.ts.map +1 -0
  10. package/dist/decorationMerge.js +65 -0
  11. package/dist/decorationMerge.js.map +1 -0
  12. package/dist/index.d.ts +4 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +3 -0
  15. package/dist/layout.d.ts +43 -0
  16. package/dist/layout.d.ts.map +1 -0
  17. package/dist/layout.js +137 -0
  18. package/dist/layout.js.map +1 -0
  19. package/dist/minimap.worker.d.ts +2 -0
  20. package/dist/minimap.worker.d.ts.map +1 -0
  21. package/dist/minimapCharRenderer.d.ts +13 -0
  22. package/dist/minimapCharRenderer.d.ts.map +1 -0
  23. package/dist/minimapCharRendererFactory.d.ts +14 -0
  24. package/dist/minimapCharRendererFactory.d.ts.map +1 -0
  25. package/dist/minimapCharSheet.d.ts +15 -0
  26. package/dist/minimapCharSheet.d.ts.map +1 -0
  27. package/dist/minimapCharSheet.js +24 -0
  28. package/dist/minimapCharSheet.js.map +1 -0
  29. package/dist/options.d.ts +3 -0
  30. package/dist/options.d.ts.map +1 -0
  31. package/dist/options.js +65 -0
  32. package/dist/options.js.map +1 -0
  33. package/dist/plugin.d.ts +4 -0
  34. package/dist/plugin.d.ts.map +1 -0
  35. package/dist/plugin.js +415 -0
  36. package/dist/plugin.js.map +1 -0
  37. package/dist/raster.d.ts +10 -0
  38. package/dist/raster.d.ts.map +1 -0
  39. package/dist/renderer.d.ts +58 -0
  40. package/dist/renderer.d.ts.map +1 -0
  41. package/dist/sectionHeaders.d.ts +13 -0
  42. package/dist/sectionHeaders.d.ts.map +1 -0
  43. package/dist/style.css +97 -0
  44. package/dist/types.d.ts +211 -0
  45. package/dist/types.d.ts.map +1 -0
  46. package/dist/types.js +11 -0
  47. package/dist/types.js.map +1 -0
  48. package/dist/viewportGeometry.d.ts +28 -0
  49. package/dist/viewportGeometry.d.ts.map +1 -0
  50. package/dist/viewportGeometry.js +22 -0
  51. package/dist/viewportGeometry.js.map +1 -0
  52. package/dist/workerClient.d.ts +131 -0
  53. package/dist/workerClient.d.ts.map +1 -0
  54. package/dist/workerClient.js +1337 -0
  55. package/dist/workerClient.js.map +1 -0
  56. package/package.json +50 -0
package/dist/layout.js ADDED
@@ -0,0 +1,137 @@
1
+ import { Constants } from "./minimapCharSheet.js";
2
+ import { RenderMinimap } from "./types.js";
3
+ function computeRenderLayout(options) {
4
+ const pixelRatio = Math.max(1, options.metrics.devicePixelRatio);
5
+ const height = Math.max(0, options.viewport.minimapHeight);
6
+ const baseCharHeight = options.minimap.renderCharacters ? Constants.BASE_CHAR_HEIGHT : Constants.BASE_CHAR_HEIGHT + 1;
7
+ const configuredScale = pixelRatio >= 2 ? Math.round(options.minimap.scale * 2) : options.minimap.scale;
8
+ const baseCanvasInnerHeight = Math.floor(pixelRatio * height);
9
+ const fitted = computeFittedScale({
10
+ baseCharHeight,
11
+ canvasInnerHeight: baseCanvasInnerHeight,
12
+ configuredScale,
13
+ height,
14
+ lineCount: options.lineCount,
15
+ minimap: (options.viewport.visibleEnd - options.viewport.visibleStart) * baseCharHeight * configuredScale > baseCanvasInnerHeight ? {
16
+ ...options.minimap,
17
+ size: "fill"
18
+ } : options.minimap,
19
+ pixelRatio,
20
+ rowHeight: options.metrics.rowHeight
21
+ });
22
+ const width = computeMinimapWidth({
23
+ charWidth: fitted.scale / pixelRatio / fitted.widthMultiplier,
24
+ maxColumn: options.minimap.maxColumn,
25
+ viewportWidth: options.viewport.clientWidth + Math.max(0, options.viewport.reservedWidth),
26
+ characterWidth: options.metrics.characterWidth
27
+ });
28
+ const baseCanvasInnerWidth = Math.floor(pixelRatio * width);
29
+ return {
30
+ width,
31
+ height,
32
+ canvasInnerWidth: Math.floor(baseCanvasInnerWidth * fitted.widthMultiplier),
33
+ canvasInnerHeight: fitted.heightIsEditorHeight ? Math.ceil(Math.max(baseCanvasInnerHeight, fitted.documentMinimapHeight)) : baseCanvasInnerHeight,
34
+ canvasOuterWidth: baseCanvasInnerWidth / pixelRatio,
35
+ canvasOuterHeight: baseCanvasInnerHeight / pixelRatio,
36
+ lineHeight: fitted.lineHeight,
37
+ charWidth: Constants.BASE_CHAR_WIDTH * fitted.scale,
38
+ scale: fitted.scale,
39
+ isSampling: fitted.isSampling,
40
+ heightIsEditorHeight: fitted.heightIsEditorHeight,
41
+ renderMinimap: options.minimap.enabled ? options.minimap.renderCharacters ? RenderMinimap.Text : RenderMinimap.Blocks : RenderMinimap.None
42
+ };
43
+ }
44
+ function computeFrameLayout(options) {
45
+ const { renderLayout: layout, viewport, realLineCount } = options;
46
+ const pixelRatio = layout.canvasInnerHeight / Math.max(1, layout.canvasOuterHeight);
47
+ const documentLineHeight = layout.isSampling ? layout.height / Math.max(1, realLineCount) : layout.lineHeight / pixelRatio;
48
+ const start = Math.min(realLineCount, Math.max(0, viewport.visibleStart));
49
+ const visibleCount = Math.min(realLineCount, Math.max(start, viewport.visibleEnd)) - start;
50
+ const linesFitting = layout.height / documentLineHeight;
51
+ const travel = Math.max(0, realLineCount - linesFitting);
52
+ const progress = start / Math.max(1, realLineCount - visibleCount);
53
+ const documentStart = Math.min(start, travel * progress);
54
+ const rasterStart = layout.isSampling ? 0 : documentStart;
55
+ const startLineNumber = Math.floor(rasterStart) + 1;
56
+ const startLineFraction = rasterStart - Math.floor(rasterStart);
57
+ return {
58
+ scrollTop: viewport.scrollTop,
59
+ scrollHeight: viewport.scrollHeight,
60
+ sliderNeeded: visibleCount < realLineCount,
61
+ documentLineHeight,
62
+ sliderLineHeight: travel > 0 ? Math.max(0, layout.height - visibleCount * documentLineHeight) / Math.max(1, realLineCount - visibleCount) : documentLineHeight,
63
+ documentStart,
64
+ sliderTop: (start - documentStart) * documentLineHeight,
65
+ sliderHeight: Math.min(layout.height, visibleCount * documentLineHeight),
66
+ topPaddingLineCount: 0,
67
+ startLineNumber,
68
+ startLineFraction,
69
+ endLineNumber: Math.min(options.lineCount, startLineNumber + Math.ceil(layout.canvasInnerHeight / layout.lineHeight + startLineFraction) - 1)
70
+ };
71
+ }
72
+ /** Inverse of slider placement, including a proportional raster's moving origin. */
73
+ function documentLineForSliderY(frame, y) {
74
+ if (frame.sliderLineHeight <= 0) return 0;
75
+ return y / frame.sliderLineHeight;
76
+ }
77
+ /** Mounted rows include overscan. Continuations still identify a visible document line. */
78
+ function visibleDocumentLineRange(snapshot, viewport) {
79
+ let start = Infinity;
80
+ let end = 0;
81
+ const wrapped = new Set(snapshot.visibleRows.filter((row) => row.source === "document" && !row.firstWrapSegment).map((row) => row.bufferRow));
82
+ for (const row of snapshot.visibleRows) {
83
+ if (row.source !== "document") continue;
84
+ if (row.top + row.height <= viewport.scrollTop) continue;
85
+ if (row.top >= viewport.scrollTop + viewport.clientHeight) continue;
86
+ const clippedStart = Math.max(0, (viewport.scrollTop - row.top) / row.height);
87
+ const clippedEnd = Math.min(1, (viewport.scrollTop + viewport.clientHeight - row.top) / row.height);
88
+ start = Math.min(start, row.bufferRow + (wrapped.has(row.bufferRow) ? 0 : clippedStart));
89
+ end = Math.max(end, row.bufferRow + (wrapped.has(row.bufferRow) ? 1 : clippedEnd));
90
+ }
91
+ if (start !== Infinity) return {
92
+ start,
93
+ end
94
+ };
95
+ const nearest = snapshot.visibleRows.find((row) => row.source === "document");
96
+ const anchor = Math.min(Math.max(0, snapshot.lineCount - 1), nearest?.bufferRow ?? 0);
97
+ return {
98
+ start: anchor,
99
+ end: anchor
100
+ };
101
+ }
102
+ function computeFittedScale(options) {
103
+ const lineHeight = options.baseCharHeight * options.configuredScale;
104
+ if (options.minimap.size === "proportional") return fittedScale(options.configuredScale, lineHeight, 1, false, false, 0);
105
+ const desiredRatio = options.lineCount / Math.max(1, options.canvasInnerHeight);
106
+ if (desiredRatio > 1) return fittedScale(1, 1, 1, true, true, options.canvasInnerHeight);
107
+ if (options.minimap.size === "fit") {
108
+ const documentHeight = Math.ceil(options.lineCount * lineHeight);
109
+ if (documentHeight <= options.canvasInnerHeight) return fittedScale(options.configuredScale, lineHeight, 1, false, false, documentHeight);
110
+ }
111
+ const maxScale = options.configuredScale + 1;
112
+ const fillLineHeight = Math.min(options.rowHeight * options.pixelRatio, Math.max(1, Math.floor(1 / desiredRatio)));
113
+ const scale = Math.min(maxScale, Math.max(1, Math.floor(fillLineHeight / options.baseCharHeight)));
114
+ const widthMultiplier = scale > options.configuredScale ? Math.min(2, scale / options.configuredScale) : 1;
115
+ const typicalViewportLineCount = options.height / Math.max(1, options.rowHeight);
116
+ return fittedScale(scale, fillLineHeight, widthMultiplier, false, true, Math.ceil(Math.max(typicalViewportLineCount, options.lineCount) * fillLineHeight));
117
+ }
118
+ function fittedScale(scale, lineHeight, widthMultiplier, isSampling, heightIsEditorHeight, documentMinimapHeight) {
119
+ return {
120
+ scale,
121
+ lineHeight,
122
+ widthMultiplier,
123
+ isSampling,
124
+ heightIsEditorHeight,
125
+ documentMinimapHeight
126
+ };
127
+ }
128
+ function computeMinimapWidth(options) {
129
+ const availableWidth = Math.max(0, options.viewportWidth);
130
+ const minimapMaxWidth = Math.floor(options.maxColumn * options.charWidth);
131
+ const proportionalWidth = Math.floor((availableWidth - 2) * options.charWidth / (options.characterWidth + options.charWidth));
132
+ return Math.min(minimapMaxWidth, Math.max(0, proportionalWidth) + 2 + 8);
133
+ }
134
+ //#endregion
135
+ export { computeFrameLayout, computeRenderLayout, documentLineForSliderY, visibleDocumentLineRange };
136
+
137
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","names":[],"sources":["../src/layout.ts"],"sourcesContent":["import type { EditorViewSnapshot, EditorViewportSnapshot } from '@singapore-editor/core/extensions'\nimport { Constants } from './minimapCharSheet'\nimport type {\n MinimapMetrics,\n MinimapRenderLayout,\n MinimapViewport,\n ResolvedMinimapOptions,\n} from './types'\nimport { RenderMinimap } from './types'\n\nexport const MINIMAP_GUTTER_WIDTH = 2\nexport const MINIMAP_RIGHT_GUTTER_WIDTH = 8\n\nexport type MinimapFrameLayout = {\n readonly scrollTop: number\n readonly scrollHeight: number\n readonly sliderNeeded: boolean\n readonly sliderLineHeight: number\n readonly documentLineHeight: number\n readonly documentStart: number\n readonly sliderTop: number\n readonly sliderHeight: number\n readonly topPaddingLineCount: number\n readonly startLineNumber: number\n readonly startLineFraction: number\n readonly endLineNumber: number\n}\n\nexport function computeRenderLayout(options: {\n readonly minimap: ResolvedMinimapOptions\n readonly metrics: MinimapMetrics\n readonly viewport: MinimapViewport\n readonly lineCount: number\n}): MinimapRenderLayout {\n const pixelRatio = Math.max(1, options.metrics.devicePixelRatio)\n const height = Math.max(0, options.viewport.minimapHeight)\n const baseCharHeight = options.minimap.renderCharacters\n ? Constants.BASE_CHAR_HEIGHT\n : Constants.BASE_CHAR_HEIGHT + 1\n const configuredScale =\n pixelRatio >= 2 ? Math.round(options.minimap.scale * 2) : options.minimap.scale\n const baseCanvasInnerHeight = Math.floor(pixelRatio * height)\n const fitted = computeFittedScale({\n baseCharHeight,\n canvasInnerHeight: baseCanvasInnerHeight,\n configuredScale,\n height,\n lineCount: options.lineCount,\n // A collapsed span can exceed the proportional raster's document coverage.\n minimap:\n (options.viewport.visibleEnd - options.viewport.visibleStart) *\n baseCharHeight *\n configuredScale >\n baseCanvasInnerHeight\n ? { ...options.minimap, size: 'fill' }\n : options.minimap,\n pixelRatio,\n rowHeight: options.metrics.rowHeight,\n })\n const layoutCharWidth = fitted.scale / pixelRatio / fitted.widthMultiplier\n const width = computeMinimapWidth({\n charWidth: layoutCharWidth,\n maxColumn: options.minimap.maxColumn,\n viewportWidth: options.viewport.clientWidth + Math.max(0, options.viewport.reservedWidth),\n characterWidth: options.metrics.characterWidth,\n })\n const baseCanvasInnerWidth = Math.floor(pixelRatio * width)\n const canvasInnerWidth = Math.floor(baseCanvasInnerWidth * fitted.widthMultiplier)\n const canvasInnerHeight = fitted.heightIsEditorHeight\n ? Math.ceil(Math.max(baseCanvasInnerHeight, fitted.documentMinimapHeight))\n : baseCanvasInnerHeight\n\n return {\n width,\n height,\n canvasInnerWidth,\n canvasInnerHeight,\n canvasOuterWidth: baseCanvasInnerWidth / pixelRatio,\n canvasOuterHeight: baseCanvasInnerHeight / pixelRatio,\n lineHeight: fitted.lineHeight,\n charWidth: Constants.BASE_CHAR_WIDTH * fitted.scale,\n scale: fitted.scale,\n isSampling: fitted.isSampling,\n heightIsEditorHeight: fitted.heightIsEditorHeight,\n renderMinimap: options.minimap.enabled\n ? options.minimap.renderCharacters\n ? RenderMinimap.Text\n : RenderMinimap.Blocks\n : RenderMinimap.None,\n }\n}\n\nexport function computeFrameLayout(options: {\n readonly renderLayout: MinimapRenderLayout\n readonly metrics: MinimapMetrics\n readonly viewport: MinimapViewport\n readonly lineCount: number\n readonly realLineCount: number\n readonly previous: MinimapFrameLayout | null\n}): MinimapFrameLayout {\n const { renderLayout: layout, viewport, realLineCount } = options\n const pixelRatio = layout.canvasInnerHeight / Math.max(1, layout.canvasOuterHeight)\n const documentLineHeight = layout.isSampling\n ? layout.height / Math.max(1, realLineCount)\n : layout.lineHeight / pixelRatio\n const start = Math.min(realLineCount, Math.max(0, viewport.visibleStart))\n const end = Math.min(realLineCount, Math.max(start, viewport.visibleEnd))\n const visibleCount = end - start\n const linesFitting = layout.height / documentLineHeight\n const travel = Math.max(0, realLineCount - linesFitting)\n const progress = start / Math.max(1, realLineCount - visibleCount)\n const documentStart = Math.min(start, travel * progress)\n const rasterStart = layout.isSampling ? 0 : documentStart\n const startLineNumber = Math.floor(rasterStart) + 1\n const startLineFraction = rasterStart - Math.floor(rasterStart)\n return {\n scrollTop: viewport.scrollTop,\n scrollHeight: viewport.scrollHeight,\n sliderNeeded: visibleCount < realLineCount,\n documentLineHeight,\n sliderLineHeight:\n travel > 0\n ? Math.max(0, layout.height - visibleCount * documentLineHeight) /\n Math.max(1, realLineCount - visibleCount)\n : documentLineHeight,\n documentStart,\n sliderTop: (start - documentStart) * documentLineHeight,\n sliderHeight: Math.min(layout.height, visibleCount * documentLineHeight),\n topPaddingLineCount: 0,\n startLineNumber,\n startLineFraction,\n endLineNumber: Math.min(\n options.lineCount,\n startLineNumber +\n Math.ceil(layout.canvasInnerHeight / layout.lineHeight + startLineFraction) -\n 1,\n ),\n }\n}\n\n/** Zero-based document line at a CSS pixel in the rendered minimap. */\nexport function documentLineAtY(frame: MinimapFrameLayout, y: number): number {\n return frame.documentStart + y / frame.documentLineHeight\n}\n\n/** Inverse of slider placement, including a proportional raster's moving origin. */\nexport function documentLineForSliderY(frame: MinimapFrameLayout, y: number): number {\n if (frame.sliderLineHeight <= 0) return 0\n return y / frame.sliderLineHeight\n}\n\n/** Mounted rows include overscan. Continuations still identify a visible document line. */\nexport function visibleDocumentLineRange(\n snapshot: Pick<EditorViewSnapshot, 'visibleRows' | 'lineCount'>,\n viewport: EditorViewportSnapshot,\n): { readonly start: number; readonly end: number } {\n let start = Infinity\n let end = 0\n const wrapped = new Set(\n snapshot.visibleRows\n .filter((row) => row.source === 'document' && !row.firstWrapSegment)\n .map((row) => row.bufferRow),\n )\n for (const row of snapshot.visibleRows) {\n if (row.source !== 'document') continue\n if (row.top + row.height <= viewport.scrollTop) continue\n if (row.top >= viewport.scrollTop + viewport.clientHeight) continue\n const clippedStart = Math.max(0, (viewport.scrollTop - row.top) / row.height)\n const clippedEnd = Math.min(\n 1,\n (viewport.scrollTop + viewport.clientHeight - row.top) / row.height,\n )\n start = Math.min(start, row.bufferRow + (wrapped.has(row.bufferRow) ? 0 : clippedStart))\n end = Math.max(end, row.bufferRow + (wrapped.has(row.bufferRow) ? 1 : clippedEnd))\n }\n if (start !== Infinity) return { start, end }\n const nearest = snapshot.visibleRows.find((row) => row.source === 'document')\n const anchor = Math.min(Math.max(0, snapshot.lineCount - 1), nearest?.bufferRow ?? 0)\n return { start: anchor, end: anchor }\n}\n\nexport function yForLineNumber(\n frame: Pick<MinimapFrameLayout, 'startLineNumber' | 'topPaddingLineCount'>,\n lineNumber: number,\n minimapLineHeight: number,\n): number {\n return (lineNumber - frame.startLineNumber + frame.topPaddingLineCount) * minimapLineHeight\n}\n\nfunction computeFittedScale(options: {\n readonly minimap: ResolvedMinimapOptions\n readonly baseCharHeight: number\n readonly canvasInnerHeight: number\n readonly configuredScale: number\n readonly height: number\n readonly pixelRatio: number\n readonly rowHeight: number\n readonly lineCount: number\n}): {\n readonly scale: number\n readonly lineHeight: number\n readonly widthMultiplier: number\n readonly isSampling: boolean\n readonly heightIsEditorHeight: boolean\n readonly documentMinimapHeight: number\n} {\n const lineHeight = options.baseCharHeight * options.configuredScale\n if (options.minimap.size === 'proportional') {\n return fittedScale(options.configuredScale, lineHeight, 1, false, false, 0)\n }\n\n const desiredRatio = options.lineCount / Math.max(1, options.canvasInnerHeight)\n if (desiredRatio > 1) return fittedScale(1, 1, 1, true, true, options.canvasInnerHeight)\n\n if (options.minimap.size === 'fit') {\n const documentHeight = Math.ceil(options.lineCount * lineHeight)\n if (documentHeight <= options.canvasInnerHeight) {\n return fittedScale(options.configuredScale, lineHeight, 1, false, false, documentHeight)\n }\n }\n\n const maxScale = options.configuredScale + 1\n const fillLineHeight = Math.min(\n options.rowHeight * options.pixelRatio,\n Math.max(1, Math.floor(1 / desiredRatio)),\n )\n const scale = Math.min(maxScale, Math.max(1, Math.floor(fillLineHeight / options.baseCharHeight)))\n const widthMultiplier =\n scale > options.configuredScale ? Math.min(2, scale / options.configuredScale) : 1\n const typicalViewportLineCount = options.height / Math.max(1, options.rowHeight)\n return fittedScale(\n scale,\n fillLineHeight,\n widthMultiplier,\n false,\n true,\n Math.ceil(Math.max(typicalViewportLineCount, options.lineCount) * fillLineHeight),\n )\n}\n\nfunction fittedScale(\n scale: number,\n lineHeight: number,\n widthMultiplier: number,\n isSampling: boolean,\n heightIsEditorHeight: boolean,\n documentMinimapHeight: number,\n) {\n return {\n scale,\n lineHeight,\n widthMultiplier,\n isSampling,\n heightIsEditorHeight,\n documentMinimapHeight,\n }\n}\n\nfunction computeMinimapWidth(options: {\n readonly charWidth: number\n readonly maxColumn: number\n readonly viewportWidth: number\n readonly characterWidth: number\n}): number {\n const availableWidth = Math.max(0, options.viewportWidth)\n const minimapMaxWidth = Math.floor(options.maxColumn * options.charWidth)\n const proportionalWidth = Math.floor(\n ((availableWidth - 2) * options.charWidth) / (options.characterWidth + options.charWidth),\n )\n return Math.min(\n minimapMaxWidth,\n Math.max(0, proportionalWidth) + MINIMAP_GUTTER_WIDTH + MINIMAP_RIGHT_GUTTER_WIDTH,\n )\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=minimap.worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimap.worker.d.ts","sourceRoot":"","sources":["../src/minimap.worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import type { RGBA8 } from './types';
2
+ export declare class MinimapCharRenderer {
3
+ readonly scale: number;
4
+ private readonly charDataNormal;
5
+ private readonly charDataLight;
6
+ constructor(charData: Uint8ClampedArray, scale: number);
7
+ renderChar(target: ImageData, dx: number, dy: number, chCode: number, color: RGBA8, foregroundAlpha: number, backgroundColor: RGBA8, backgroundAlpha: number, fontScale: number, useLighterFont: boolean, force1pxHeight: boolean): void;
8
+ blockRenderChar(target: ImageData, dx: number, dy: number, color: RGBA8, foregroundAlpha: number, backgroundColor: RGBA8, backgroundAlpha: number, force1pxHeight: boolean): void;
9
+ private renderCharData;
10
+ private renderTransparentCharData;
11
+ private static soften;
12
+ }
13
+ //# sourceMappingURL=minimapCharRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimapCharRenderer.d.ts","sourceRoot":"","sources":["../src/minimapCharRenderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC,qBAAa,mBAAmB;aAMZ,KAAK,EAAE,MAAM;IAL/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmB;IAClD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmB;gBAG/C,QAAQ,EAAE,iBAAiB,EACX,KAAK,EAAE,MAAM;IAMxB,UAAU,CACf,MAAM,EAAE,SAAS,EACjB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,KAAK,EACtB,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,OAAO,EACvB,cAAc,EAAE,OAAO,GACtB,IAAI;IAqBA,eAAe,CACpB,MAAM,EAAE,SAAS,EACjB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,KAAK,EACtB,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,OAAO,GACtB,IAAI;IAwBP,OAAO,CAAC,cAAc;IAyBtB,OAAO,CAAC,yBAAyB;IAkBjC,OAAO,CAAC,MAAM,CAAC,MAAM;CAMtB"}
@@ -0,0 +1,14 @@
1
+ import { MinimapCharRenderer } from './minimapCharRenderer';
2
+ /**
3
+ * Creates minimap character renderers by sampling a normal canvas once and
4
+ * downsampling the glyph data for tiny minimap text rendering.
5
+ */
6
+ export declare class MinimapCharRendererFactory {
7
+ private static lastCreated?;
8
+ private static lastFontFamily?;
9
+ static create(scale: number, fontFamily: string): MinimapCharRenderer;
10
+ static createSampleData(fontFamily: string): ImageData;
11
+ static createFromSampleData(source: Uint8ClampedArray, scale: number): MinimapCharRenderer;
12
+ private static downsample;
13
+ }
14
+ //# sourceMappingURL=minimapCharRendererFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimapCharRendererFactory.d.ts","sourceRoot":"","sources":["../src/minimapCharRendererFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAG3D;;;GAGG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAqB;IAChD,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAQ;WAExB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,mBAAmB;WAe9D,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS;WAsB/C,oBAAoB,CAChC,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,MAAM,GACZ,mBAAmB;IAYtB,OAAO,CAAC,MAAM,CAAC,UAAU;CAqB1B"}
@@ -0,0 +1,15 @@
1
+ export declare const enum Constants {
2
+ START_CH_CODE = 32,
3
+ END_CH_CODE = 126,
4
+ UNKNOWN_CODE = 65533,
5
+ CHAR_COUNT = 96,
6
+ SAMPLED_CHAR_HEIGHT = 16,
7
+ SAMPLED_CHAR_WIDTH = 10,
8
+ BASE_CHAR_HEIGHT = 2,
9
+ BASE_CHAR_WIDTH = 1,
10
+ RGBA_CHANNELS_CNT = 4,
11
+ RGBA_SAMPLED_ROW_WIDTH = 3840
12
+ }
13
+ export declare const allCharCodes: ReadonlyArray<number>;
14
+ export declare const getCharIndex: (chCode: number, fontScale: number) => number;
15
+ //# sourceMappingURL=minimapCharSheet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimapCharSheet.d.ts","sourceRoot":"","sources":["../src/minimapCharSheet.ts"],"names":[],"mappings":"AAAA,0BAAkB,SAAS;IACzB,aAAa,KAAK;IAClB,WAAW,MAAM;IACjB,YAAY,QAAQ;IACpB,UAAU,KAAkC;IAC5C,mBAAmB,KAAK;IACxB,kBAAkB,KAAK;IACvB,gBAAgB,IAAI;IACpB,eAAe,IAAI;IACnB,iBAAiB,IAAI;IACrB,sBAAsB,OAAsD;CAC7E;AAED,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,MAAM,CAQ3C,CAAA;AAEJ,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,EAAE,WAAW,MAAM,KAAG,MAKhE,CAAA"}
@@ -0,0 +1,24 @@
1
+ //#region src/minimapCharSheet.ts
2
+ var Constants = /* @__PURE__ */ function(Constants) {
3
+ Constants[Constants["START_CH_CODE"] = 32] = "START_CH_CODE";
4
+ Constants[Constants["END_CH_CODE"] = 126] = "END_CH_CODE";
5
+ Constants[Constants["UNKNOWN_CODE"] = 65533] = "UNKNOWN_CODE";
6
+ Constants[Constants["CHAR_COUNT"] = 96] = "CHAR_COUNT";
7
+ Constants[Constants["SAMPLED_CHAR_HEIGHT"] = 16] = "SAMPLED_CHAR_HEIGHT";
8
+ Constants[Constants["SAMPLED_CHAR_WIDTH"] = 10] = "SAMPLED_CHAR_WIDTH";
9
+ Constants[Constants["BASE_CHAR_HEIGHT"] = 2] = "BASE_CHAR_HEIGHT";
10
+ Constants[Constants["BASE_CHAR_WIDTH"] = 1] = "BASE_CHAR_WIDTH";
11
+ Constants[Constants["RGBA_CHANNELS_CNT"] = 4] = "RGBA_CHANNELS_CNT";
12
+ Constants[Constants["RGBA_SAMPLED_ROW_WIDTH"] = 3840] = "RGBA_SAMPLED_ROW_WIDTH";
13
+ return Constants;
14
+ }({});
15
+ (() => {
16
+ const values = [];
17
+ for (let index = 32; index <= 126; index += 1) values.push(index);
18
+ values.push(65533);
19
+ return values;
20
+ })();
21
+ //#endregion
22
+ export { Constants };
23
+
24
+ //# sourceMappingURL=minimapCharSheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimapCharSheet.js","names":[],"sources":["../src/minimapCharSheet.ts"],"sourcesContent":["export const enum Constants {\n START_CH_CODE = 32,\n END_CH_CODE = 126,\n UNKNOWN_CODE = 65533,\n CHAR_COUNT = END_CH_CODE - START_CH_CODE + 2,\n SAMPLED_CHAR_HEIGHT = 16,\n SAMPLED_CHAR_WIDTH = 10,\n BASE_CHAR_HEIGHT = 2,\n BASE_CHAR_WIDTH = 1,\n RGBA_CHANNELS_CNT = 4,\n RGBA_SAMPLED_ROW_WIDTH = RGBA_CHANNELS_CNT * CHAR_COUNT * SAMPLED_CHAR_WIDTH,\n}\n\nexport const allCharCodes: ReadonlyArray<number> = (() => {\n const values: number[] = []\n for (let index = Constants.START_CH_CODE; index <= Constants.END_CH_CODE; index += 1) {\n values.push(index)\n }\n\n values.push(Constants.UNKNOWN_CODE)\n return values\n})()\n\nexport const getCharIndex = (chCode: number, fontScale: number): number => {\n const index = chCode - Constants.START_CH_CODE\n if (index >= 0 && index <= Constants.CHAR_COUNT) return index\n if (fontScale <= 2) return (index + Constants.CHAR_COUNT) % Constants.CHAR_COUNT\n return Constants.CHAR_COUNT - 1\n}\n"],"mappings":";AAAA,IAAkB,YAAX,yBAAA,WAAA;CACL,UAAA,UAAA,mBAAA,MAAA;CACA,UAAA,UAAA,iBAAA,OAAA;CACA,UAAA,UAAA,kBAAA,SAAA;CACA,UAAA,UAAA,gBAAA,MAAA;CACA,UAAA,UAAA,yBAAA,MAAA;CACA,UAAA,UAAA,wBAAA,MAAA;CACA,UAAA,UAAA,sBAAA,KAAA;CACA,UAAA,UAAA,qBAAA,KAAA;CACA,UAAA,UAAA,uBAAA,KAAA;CACA,UAAA,UAAA,4BAAA,QAAA;;AACF,EAAA,CAAA,CAAA;OAE0D;CACxD,MAAM,SAAmB,CAAC;CAC1B,KAAK,IAAI,QAAA,IAAiC,SAAA,KAAgC,SAAS,GACjF,OAAO,KAAK,KAAK;CAGnB,OAAO,KAAA,KAA2B;CAClC,OAAO;AACT,EAAA,CAAG"}
@@ -0,0 +1,3 @@
1
+ import type { EditorMinimapOptions, ResolvedMinimapOptions } from './types';
2
+ export declare function resolveMinimapOptions(options?: EditorMinimapOptions): ResolvedMinimapOptions;
3
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAA;AAoB3E,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,oBAAyB,GAAG,sBAAsB,CA8ChG"}
@@ -0,0 +1,65 @@
1
+ //#region src/options.ts
2
+ var DEFAULT_MINIMAP_OPTIONS = {
3
+ enabled: true,
4
+ autohide: "none",
5
+ side: "right",
6
+ size: "proportional",
7
+ showSlider: "mouseover",
8
+ renderCharacters: true,
9
+ maxColumn: 120,
10
+ scale: 1,
11
+ showRegionSectionHeaders: true,
12
+ showMarkSectionHeaders: true,
13
+ markSectionHeaderRegex: "\\bMARK:\\s*(?<separator>-?)\\s*(?<label>.*)$",
14
+ sectionHeaderFontSize: 9,
15
+ sectionHeaderLetterSpacing: 1
16
+ };
17
+ function resolveMinimapOptions(options = {}) {
18
+ return {
19
+ enabled: typeof options.enabled === "boolean" ? options.enabled : DEFAULT_MINIMAP_OPTIONS.enabled,
20
+ autohide: stringSet(options.autohide, DEFAULT_MINIMAP_OPTIONS.autohide, [
21
+ "none",
22
+ "mouseover",
23
+ "scroll"
24
+ ]),
25
+ side: stringSet(options.side, DEFAULT_MINIMAP_OPTIONS.side, ["left", "right"]),
26
+ size: stringSet(options.size, DEFAULT_MINIMAP_OPTIONS.size, [
27
+ "proportional",
28
+ "fill",
29
+ "fit"
30
+ ]),
31
+ showSlider: stringSet(options.showSlider, DEFAULT_MINIMAP_OPTIONS.showSlider, ["always", "mouseover"]),
32
+ renderCharacters: typeof options.renderCharacters === "boolean" ? options.renderCharacters : DEFAULT_MINIMAP_OPTIONS.renderCharacters,
33
+ maxColumn: clampedInteger(options.maxColumn, DEFAULT_MINIMAP_OPTIONS.maxColumn, 1, 1e4),
34
+ scale: clampedInteger(options.scale, DEFAULT_MINIMAP_OPTIONS.scale, 1, 3),
35
+ showRegionSectionHeaders: typeof options.showRegionSectionHeaders === "boolean" ? options.showRegionSectionHeaders : DEFAULT_MINIMAP_OPTIONS.showRegionSectionHeaders,
36
+ showMarkSectionHeaders: typeof options.showMarkSectionHeaders === "boolean" ? options.showMarkSectionHeaders : DEFAULT_MINIMAP_OPTIONS.showMarkSectionHeaders,
37
+ markSectionHeaderRegex: validRegexSource(options.markSectionHeaderRegex, DEFAULT_MINIMAP_OPTIONS.markSectionHeaderRegex),
38
+ sectionHeaderFontSize: clampedFloat(options.sectionHeaderFontSize, DEFAULT_MINIMAP_OPTIONS.sectionHeaderFontSize, 4, 32),
39
+ sectionHeaderLetterSpacing: clampedFloat(options.sectionHeaderLetterSpacing, DEFAULT_MINIMAP_OPTIONS.sectionHeaderLetterSpacing, 0, 5)
40
+ };
41
+ }
42
+ function stringSet(value, fallback, values) {
43
+ return typeof value === "string" && values.includes(value) ? value : fallback;
44
+ }
45
+ function clampedInteger(value, fallback, min, max) {
46
+ if (typeof value !== "number" || !Number.isFinite(value)) return fallback;
47
+ return Math.min(max, Math.max(min, Math.floor(value)));
48
+ }
49
+ function clampedFloat(value, fallback, min, max) {
50
+ if (typeof value !== "number" || !Number.isFinite(value)) return fallback;
51
+ return Math.min(max, Math.max(min, value));
52
+ }
53
+ function validRegexSource(value, fallback) {
54
+ if (typeof value !== "string") return fallback;
55
+ try {
56
+ new RegExp(value, "d");
57
+ return value;
58
+ } catch {
59
+ return fallback;
60
+ }
61
+ }
62
+ //#endregion
63
+ export { resolveMinimapOptions };
64
+
65
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","names":[],"sources":["../src/options.ts"],"sourcesContent":["import type { EditorMinimapOptions, ResolvedMinimapOptions } from './types'\n\nconst DEFAULT_MARK_SECTION_HEADER_REGEX = '\\\\bMARK:\\\\s*(?<separator>-?)\\\\s*(?<label>.*)$'\n\nconst DEFAULT_MINIMAP_OPTIONS: ResolvedMinimapOptions = {\n enabled: true,\n autohide: 'none',\n side: 'right',\n size: 'proportional',\n showSlider: 'mouseover',\n renderCharacters: true,\n maxColumn: 120,\n scale: 1,\n showRegionSectionHeaders: true,\n showMarkSectionHeaders: true,\n markSectionHeaderRegex: DEFAULT_MARK_SECTION_HEADER_REGEX,\n sectionHeaderFontSize: 9,\n sectionHeaderLetterSpacing: 1,\n}\n\nexport function resolveMinimapOptions(options: EditorMinimapOptions = {}): ResolvedMinimapOptions {\n return {\n enabled:\n typeof options.enabled === 'boolean' ? options.enabled : DEFAULT_MINIMAP_OPTIONS.enabled,\n autohide: stringSet(options.autohide, DEFAULT_MINIMAP_OPTIONS.autohide, [\n 'none',\n 'mouseover',\n 'scroll',\n ]),\n side: stringSet(options.side, DEFAULT_MINIMAP_OPTIONS.side, ['left', 'right']),\n size: stringSet(options.size, DEFAULT_MINIMAP_OPTIONS.size, ['proportional', 'fill', 'fit']),\n showSlider: stringSet(options.showSlider, DEFAULT_MINIMAP_OPTIONS.showSlider, [\n 'always',\n 'mouseover',\n ]),\n renderCharacters:\n typeof options.renderCharacters === 'boolean'\n ? options.renderCharacters\n : DEFAULT_MINIMAP_OPTIONS.renderCharacters,\n maxColumn: clampedInteger(options.maxColumn, DEFAULT_MINIMAP_OPTIONS.maxColumn, 1, 10000),\n scale: clampedInteger(options.scale, DEFAULT_MINIMAP_OPTIONS.scale, 1, 3),\n showRegionSectionHeaders:\n typeof options.showRegionSectionHeaders === 'boolean'\n ? options.showRegionSectionHeaders\n : DEFAULT_MINIMAP_OPTIONS.showRegionSectionHeaders,\n showMarkSectionHeaders:\n typeof options.showMarkSectionHeaders === 'boolean'\n ? options.showMarkSectionHeaders\n : DEFAULT_MINIMAP_OPTIONS.showMarkSectionHeaders,\n markSectionHeaderRegex: validRegexSource(\n options.markSectionHeaderRegex,\n DEFAULT_MINIMAP_OPTIONS.markSectionHeaderRegex,\n ),\n sectionHeaderFontSize: clampedFloat(\n options.sectionHeaderFontSize,\n DEFAULT_MINIMAP_OPTIONS.sectionHeaderFontSize,\n 4,\n 32,\n ),\n sectionHeaderLetterSpacing: clampedFloat(\n options.sectionHeaderLetterSpacing,\n DEFAULT_MINIMAP_OPTIONS.sectionHeaderLetterSpacing,\n 0,\n 5,\n ),\n }\n}\n\nfunction stringSet<T extends string>(value: unknown, fallback: T, values: readonly T[]): T {\n return typeof value === 'string' && values.includes(value as T) ? (value as T) : fallback\n}\n\nfunction clampedInteger(value: unknown, fallback: number, min: number, max: number): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) return fallback\n return Math.min(max, Math.max(min, Math.floor(value)))\n}\n\nfunction clampedFloat(value: unknown, fallback: number, min: number, max: number): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) return fallback\n return Math.min(max, Math.max(min, value))\n}\n\nfunction validRegexSource(value: unknown, fallback: string): string {\n if (typeof value !== 'string') return fallback\n\n try {\n new RegExp(value, 'd')\n return value\n } catch {\n return fallback\n }\n}\n"],"mappings":";AAIA,IAAM,0BAAkD;CACtD,SAAS;CACT,UAAU;CACV,MAAM;CACN,MAAM;CACN,YAAY;CACZ,kBAAkB;CAClB,WAAW;CACX,OAAO;CACP,0BAA0B;CAC1B,wBAAwB;CACxB,wBAAwB;CACxB,uBAAuB;CACvB,4BAA4B;AAC9B;AAEA,SAAgB,sBAAsB,UAAgC,CAAC,GAA2B;CAChG,OAAO;EACL,SACE,OAAO,QAAQ,YAAY,YAAY,QAAQ,UAAU,wBAAwB;EACnF,UAAU,UAAU,QAAQ,UAAU,wBAAwB,UAAU;GACtE;GACA;GACA;EACF,CAAC;EACD,MAAM,UAAU,QAAQ,MAAM,wBAAwB,MAAM,CAAC,QAAQ,OAAO,CAAC;EAC7E,MAAM,UAAU,QAAQ,MAAM,wBAAwB,MAAM;GAAC;GAAgB;GAAQ;EAAK,CAAC;EAC3F,YAAY,UAAU,QAAQ,YAAY,wBAAwB,YAAY,CAC5E,UACA,WACF,CAAC;EACD,kBACE,OAAO,QAAQ,qBAAqB,YAChC,QAAQ,mBACR,wBAAwB;EAC9B,WAAW,eAAe,QAAQ,WAAW,wBAAwB,WAAW,GAAG,GAAK;EACxF,OAAO,eAAe,QAAQ,OAAO,wBAAwB,OAAO,GAAG,CAAC;EACxE,0BACE,OAAO,QAAQ,6BAA6B,YACxC,QAAQ,2BACR,wBAAwB;EAC9B,wBACE,OAAO,QAAQ,2BAA2B,YACtC,QAAQ,yBACR,wBAAwB;EAC9B,wBAAwB,iBACtB,QAAQ,wBACR,wBAAwB,sBAC1B;EACA,uBAAuB,aACrB,QAAQ,uBACR,wBAAwB,uBACxB,GACA,EACF;EACA,4BAA4B,aAC1B,QAAQ,4BACR,wBAAwB,4BACxB,GACA,CACF;CACF;AACF;AAEA,SAAS,UAA4B,OAAgB,UAAa,QAAyB;CACzF,OAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAU,IAAK,QAAc;AACnF;AAEA,SAAS,eAAe,OAAgB,UAAkB,KAAa,KAAqB;CAC1F,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG,OAAO;CACjE,OAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC;AACvD;AAEA,SAAS,aAAa,OAAgB,UAAkB,KAAa,KAAqB;CACxF,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG,OAAO;CACjE,OAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC3C;AAEA,SAAS,iBAAiB,OAAgB,UAA0B;CAClE,IAAI,OAAO,UAAU,UAAU,OAAO;CAEtC,IAAI;EACF,IAAI,OAAO,OAAO,GAAG;EACrB,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF"}
@@ -0,0 +1,4 @@
1
+ import type { EditorPlugin } from '@singapore-editor/core/extensions';
2
+ import type { EditorMinimapOptions } from './types';
3
+ export declare function createMinimapPlugin(options?: EditorMinimapOptions): EditorPlugin;
4
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAOV,YAAY,EAMb,MAAM,mCAAmC,CAAA;AAQ1C,OAAO,KAAK,EAAE,oBAAoB,EAA0B,MAAM,SAAS,CAAA;AAI3E,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,YAAY,CAmBpF"}