@pierre/diffs 1.1.0-beta.4 → 1.1.0-beta.5

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 (51) hide show
  1. package/dist/constants.d.ts +2 -1
  2. package/dist/constants.d.ts.map +1 -1
  3. package/dist/constants.js +2 -1
  4. package/dist/constants.js.map +1 -1
  5. package/dist/highlighter/languages/constants.d.ts +3 -1
  6. package/dist/highlighter/languages/constants.d.ts.map +1 -1
  7. package/dist/highlighter/languages/constants.js +2 -1
  8. package/dist/highlighter/languages/constants.js.map +1 -1
  9. package/dist/highlighter/languages/registerCustomLanguage.d.ts +12 -0
  10. package/dist/highlighter/languages/registerCustomLanguage.d.ts.map +1 -0
  11. package/dist/highlighter/languages/registerCustomLanguage.js +21 -0
  12. package/dist/highlighter/languages/registerCustomLanguage.js.map +1 -0
  13. package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
  14. package/dist/highlighter/languages/resolveLanguage.js +4 -3
  15. package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
  16. package/dist/index.d.ts +5 -4
  17. package/dist/index.js +5 -4
  18. package/dist/react/jsx.d.ts +1 -1
  19. package/dist/react/jsx.d.ts.map +1 -1
  20. package/dist/react/types.js +0 -1
  21. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  22. package/dist/renderers/DiffHunksRenderer.js +10 -6
  23. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  24. package/dist/style.js +1 -1
  25. package/dist/style.js.map +1 -1
  26. package/dist/types.d.ts +3 -1
  27. package/dist/types.d.ts.map +1 -1
  28. package/dist/utils/getFiletypeFromFileName.d.ts +2 -1
  29. package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
  30. package/dist/utils/getFiletypeFromFileName.js +14 -4
  31. package/dist/utils/getFiletypeFromFileName.js.map +1 -1
  32. package/dist/utils/iterateOverDiff.d.ts +2 -0
  33. package/dist/utils/iterateOverDiff.d.ts.map +1 -1
  34. package/dist/utils/iterateOverDiff.js +7 -5
  35. package/dist/utils/iterateOverDiff.js.map +1 -1
  36. package/dist/utils/renderDiffWithHighlighter.d.ts +2 -1
  37. package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
  38. package/dist/utils/renderDiffWithHighlighter.js +3 -2
  39. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  40. package/dist/utils/setLanguageOverride.d.ts +2 -1
  41. package/dist/utils/setLanguageOverride.d.ts.map +1 -1
  42. package/dist/utils/setLanguageOverride.js.map +1 -1
  43. package/dist/worker/WorkerPoolManager.d.ts +1 -1
  44. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  45. package/dist/worker/WorkerPoolManager.js +3 -2
  46. package/dist/worker/WorkerPoolManager.js.map +1 -1
  47. package/dist/worker/worker-portable.js +29 -11
  48. package/dist/worker/worker-portable.js.map +1 -1
  49. package/dist/worker/worker.js +17 -8
  50. package/dist/worker/worker.js.map +1 -1
  51. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DiffHunksRenderer.js","names":["DEFAULT_RENDER_RANGE: RenderRange","options: BaseDiffOptions","onRenderUpdate?: () => unknown","workerManager?: WorkerPoolManager | undefined","options","options: RenderDiffOptions","additionsAST: ElementContent[] | undefined","deletionsAST: ElementContent[] | undefined","unifiedAST: ElementContent[] | undefined","hunkData: HunkData[]","separatorContext: PushSeparatorContext","pendingSplitMissing: 'additions' | 'deletions' | undefined","lastHunkIndex: number | undefined","deletionSpan: AnnotationSpan","additionSpan: AnnotationSpan"],"sources":["../../src/renderers/DiffHunksRenderer.ts"],"sourcesContent":["import type { ElementContent, Element as HASTElement } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport { DEFAULT_EXPANDED_REGION, DEFAULT_THEMES } from '../constants';\nimport { areLanguagesAttached } from '../highlighter/languages/areLanguagesAttached';\nimport {\n getHighlighterIfLoaded,\n getSharedHighlighter,\n} from '../highlighter/shared_highlighter';\nimport { areThemesAttached } from '../highlighter/themes/areThemesAttached';\nimport type {\n AnnotationLineMap,\n AnnotationSpan,\n BaseDiffOptions,\n DiffLineAnnotation,\n DiffsHighlighter,\n ExpansionDirections,\n FileDiffMetadata,\n HunkData,\n HunkExpansionRegion,\n HunkSeparators,\n RenderDiffOptions,\n RenderDiffResult,\n RenderRange,\n RenderedDiffASTCache,\n SupportedLanguages,\n ThemeTypes,\n ThemedDiffResult,\n} from '../types';\nimport { areRenderRangesEqual } from '../utils/areRenderRangesEqual';\nimport { areThemesEqual } from '../utils/areThemesEqual';\nimport { createAnnotationElement } from '../utils/createAnnotationElement';\nimport { createEmptyRowBuffer } from '../utils/createEmptyRowBuffer';\nimport { createFileHeaderElement } from '../utils/createFileHeaderElement';\nimport { createNoNewlineElement } from '../utils/createNoNewlineElement';\nimport { createPreElement } from '../utils/createPreElement';\nimport { createSeparator } from '../utils/createSeparator';\nimport { getFiletypeFromFileName } from '../utils/getFiletypeFromFileName';\nimport { getHighlighterOptions } from '../utils/getHighlighterOptions';\nimport { getHunkSeparatorSlotName } from '../utils/getHunkSeparatorSlotName';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { getTotalLineCountFromHunks } from '../utils/getTotalLineCountFromHunks';\nimport { createBufferElement, createHastElement } from '../utils/hast_utils';\nimport { isDefaultRenderRange } from '../utils/isDefaultRenderRange';\nimport { iterateOverDiff } from '../utils/iterateOverDiff';\nimport { renderDiffWithHighlighter } from '../utils/renderDiffWithHighlighter';\nimport type { WorkerPoolManager } from '../worker';\n\ninterface PushLineWithAnnotation {\n deletionLine?: ElementContent;\n additionLine?: ElementContent;\n\n unifiedAST?: ElementContent[];\n deletionsAST?: ElementContent[];\n additionsAST?: ElementContent[];\n\n unifiedSpan?: AnnotationSpan;\n deletionSpan?: AnnotationSpan;\n additionSpan?: AnnotationSpan;\n}\n\nconst DEFAULT_RENDER_RANGE: RenderRange = {\n startingLine: 0,\n totalLines: Infinity,\n bufferBefore: 0,\n bufferAfter: 0,\n};\n\ninterface GetRenderOptionsReturn {\n options: RenderDiffOptions;\n forceRender: boolean;\n}\n\ninterface PushSeparatorProps {\n hunkIndex: number;\n collapsedLines: number;\n rangeSize: number;\n hunkSpecs: string | undefined;\n isFirstHunk: boolean;\n isLastHunk: boolean;\n isExpandable: boolean;\n}\n\ninterface PushSeparatorContext {\n expansionLineCount: number;\n hunkSeparators: HunkSeparators;\n unifiedAST: ElementContent[];\n deletionsAST: ElementContent[];\n additionsAST: ElementContent[];\n hunkData: HunkData[];\n}\n\ntype OptionsWithDefaults = Required<\n Omit<BaseDiffOptions, 'lang' | 'unsafeCSS'>\n>;\n\nexport interface HunksRenderResult {\n additionsAST: ElementContent[] | undefined;\n deletionsAST: ElementContent[] | undefined;\n unifiedAST: ElementContent[] | undefined;\n hunkData: HunkData[];\n css: string;\n preNode: HASTElement;\n headerElement: HASTElement | undefined;\n totalLines: number;\n themeStyles: string;\n baseThemeType: 'light' | 'dark' | undefined;\n}\n\nlet instanceId = -1;\n\nexport class DiffHunksRenderer<LAnnotation = undefined> {\n readonly __id: string = `diff-hunks-renderer:${++instanceId}`;\n\n private highlighter: DiffsHighlighter | undefined;\n private diff: FileDiffMetadata | undefined;\n\n private expandedHunks = new Map<number, HunkExpansionRegion>();\n\n private deletionAnnotations: AnnotationLineMap<LAnnotation> = {};\n private additionAnnotations: AnnotationLineMap<LAnnotation> = {};\n\n private computedLang: SupportedLanguages = 'text';\n private renderCache: RenderedDiffASTCache | undefined;\n\n constructor(\n public options: BaseDiffOptions = { theme: DEFAULT_THEMES },\n private onRenderUpdate?: () => unknown,\n private workerManager?: WorkerPoolManager | undefined\n ) {\n if (workerManager?.isWorkingPool() !== true) {\n this.highlighter = areThemesAttached(options.theme ?? DEFAULT_THEMES)\n ? getHighlighterIfLoaded()\n : undefined;\n }\n }\n\n cleanUp(): void {\n this.highlighter = undefined;\n this.diff = undefined;\n this.renderCache = undefined;\n this.workerManager?.cleanUpPendingTasks(this);\n this.workerManager = undefined;\n this.onRenderUpdate = undefined;\n }\n\n recycle(): void {\n this.highlighter = undefined;\n this.diff = undefined;\n this.renderCache = undefined;\n this.workerManager?.cleanUpPendingTasks(this);\n }\n\n setOptions(options: BaseDiffOptions): void {\n this.options = options;\n }\n\n private mergeOptions(options: Partial<BaseDiffOptions>) {\n this.options = { ...this.options, ...options };\n }\n\n setThemeType(themeType: ThemeTypes): void {\n if (this.getOptionsWithDefaults().themeType === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n }\n\n expandHunk(index: number, direction: ExpansionDirections): void {\n const { expansionLineCount } = this.getOptionsWithDefaults();\n const region = {\n ...(this.expandedHunks.get(index) ?? {\n fromStart: 0,\n fromEnd: 0,\n }),\n };\n if (direction === 'up' || direction === 'both') {\n region.fromStart += expansionLineCount;\n }\n if (direction === 'down' || direction === 'both') {\n region.fromEnd += expansionLineCount;\n }\n this.expandedHunks.set(index, region);\n }\n\n getExpandedHunk(hunkIndex: number): HunkExpansionRegion {\n return this.expandedHunks.get(hunkIndex) ?? DEFAULT_EXPANDED_REGION;\n }\n\n getExpandedHunksMap(): Map<number, HunkExpansionRegion> {\n return this.expandedHunks;\n }\n\n setLineAnnotations(lineAnnotations: DiffLineAnnotation<LAnnotation>[]): void {\n this.additionAnnotations = {};\n this.deletionAnnotations = {};\n for (const annotation of lineAnnotations) {\n const map = ((): AnnotationLineMap<LAnnotation> => {\n switch (annotation.side) {\n case 'deletions':\n return this.deletionAnnotations;\n case 'additions':\n return this.additionAnnotations;\n }\n })();\n const arr = map[annotation.lineNumber] ?? [];\n map[annotation.lineNumber] = arr;\n arr.push(annotation);\n }\n }\n\n getOptionsWithDefaults(): OptionsWithDefaults {\n const {\n diffIndicators = 'bars',\n diffStyle = 'split',\n disableBackground = false,\n disableFileHeader = false,\n disableLineNumbers = false,\n disableVirtualizationBuffers = false,\n expandUnchanged = false,\n expansionLineCount = 100,\n hunkSeparators = 'line-info',\n lineDiffType = 'word-alt',\n maxLineDiffLength = 1000,\n overflow = 'scroll',\n theme = DEFAULT_THEMES,\n themeType = 'system',\n tokenizeMaxLineLength = 1000,\n useCSSClasses = false,\n } = this.options;\n return {\n diffIndicators,\n diffStyle,\n disableBackground,\n disableFileHeader,\n disableLineNumbers,\n disableVirtualizationBuffers,\n expandUnchanged,\n expansionLineCount,\n hunkSeparators,\n lineDiffType,\n maxLineDiffLength,\n overflow,\n theme: this.workerManager?.getDiffRenderOptions().theme ?? theme,\n themeType,\n tokenizeMaxLineLength,\n useCSSClasses,\n };\n }\n\n async initializeHighlighter(): Promise<DiffsHighlighter> {\n this.highlighter = await getSharedHighlighter(\n getHighlighterOptions(this.computedLang, this.options)\n );\n return this.highlighter;\n }\n\n hydrate(diff: FileDiffMetadata | undefined): void {\n if (diff == null) {\n return;\n }\n this.diff = diff;\n const { options } = this.getRenderOptions(diff);\n let cache = this.workerManager?.getDiffResultCache(diff);\n if (cache != null && !areRenderOptionsEqual(options, cache.options)) {\n cache = undefined;\n }\n this.renderCache ??= {\n diff,\n // NOTE(amadeus): If we're hydrating, we can assume there was\n // pre-rendered HTML, otherwise one should not be hydrating\n highlighted: true,\n options,\n result: cache?.result,\n renderRange: undefined,\n };\n if (\n this.workerManager?.isWorkingPool() === true &&\n this.renderCache.result == null\n ) {\n this.workerManager.highlightDiffAST(this, this.diff);\n } else {\n void this.asyncHighlight(diff).then(({ result, options }) => {\n this.onHighlightSuccess(diff, result, options);\n });\n }\n }\n\n private getRenderOptions(diff: FileDiffMetadata): GetRenderOptionsReturn {\n const options: RenderDiffOptions = (() => {\n if (this.workerManager?.isWorkingPool() === true) {\n return this.workerManager.getDiffRenderOptions();\n }\n const { theme, tokenizeMaxLineLength, lineDiffType } =\n this.getOptionsWithDefaults();\n return { theme, tokenizeMaxLineLength, lineDiffType };\n })();\n this.getOptionsWithDefaults();\n const { renderCache } = this;\n if (renderCache?.result == null) {\n return { options, forceRender: true };\n }\n if (\n diff !== renderCache.diff ||\n !areRenderOptionsEqual(options, renderCache.options)\n ) {\n return { options, forceRender: true };\n }\n return { options, forceRender: false };\n }\n\n renderDiff(\n diff: FileDiffMetadata | undefined = this.renderCache?.diff,\n renderRange: RenderRange = DEFAULT_RENDER_RANGE\n ): HunksRenderResult | undefined {\n if (diff == null) {\n return undefined;\n }\n const { expandUnchanged = false } = this.options;\n const cache = this.workerManager?.getDiffResultCache(diff);\n if (cache != null && this.renderCache == null) {\n this.renderCache = {\n diff,\n highlighted: true,\n renderRange: undefined,\n ...cache,\n };\n }\n const { options, forceRender } = this.getRenderOptions(diff);\n this.renderCache ??= {\n diff,\n highlighted: false,\n options,\n result: undefined,\n renderRange: undefined,\n };\n if (this.workerManager?.isWorkingPool() === true) {\n if (\n this.renderCache.result == null ||\n (!this.renderCache.highlighted &&\n !areRenderRangesEqual(this.renderCache.renderRange, renderRange))\n ) {\n this.renderCache.result = this.workerManager.getPlainDiffAST(\n diff,\n renderRange.startingLine,\n renderRange.totalLines,\n // If we aren't using a windowed render, then we need to render\n // everything\n isDefaultRenderRange(renderRange)\n ? true\n : expandUnchanged\n ? true\n : this.expandedHunks\n );\n this.renderCache.renderRange = renderRange;\n }\n if (\n // We should only attempt to kick off the worker highlighter if there\n // are lines to render\n renderRange.totalLines > 0 &&\n (!this.renderCache.highlighted || forceRender)\n ) {\n this.workerManager.highlightDiffAST(this, diff);\n }\n } else {\n this.computedLang = diff.lang ?? getFiletypeFromFileName(diff.name);\n const hasThemes =\n this.highlighter != null && areThemesAttached(options.theme);\n const hasLangs =\n this.highlighter != null && areLanguagesAttached(this.computedLang);\n\n // If we have any semblance of a highlighter with the correct theme(s)\n // attached, we can kick off some form of rendering. If we don't have\n // the correct language, then we can render plain text and after kick off\n // an async job to get the highlighted AST\n if (\n this.highlighter != null &&\n hasThemes &&\n (forceRender ||\n (!this.renderCache.highlighted && hasLangs) ||\n this.renderCache.result == null)\n ) {\n const { result, options } = this.renderDiffWithHighlighter(\n diff,\n this.highlighter,\n !hasLangs\n );\n this.renderCache = {\n diff,\n options,\n highlighted: hasLangs,\n result,\n renderRange: undefined,\n };\n }\n\n // If we get in here it means we'll have to kick off an async highlight\n // process which will involve initializing the highlighter with new themes\n // and languages\n if (!hasThemes || !hasLangs) {\n void this.asyncHighlight(diff).then(({ result, options }) => {\n this.onHighlightSuccess(diff, result, options);\n });\n }\n }\n return this.renderCache.result != null\n ? this.processDiffResult(\n this.renderCache.diff,\n renderRange,\n this.renderCache.result\n )\n : undefined;\n }\n\n async asyncRender(\n diff: FileDiffMetadata,\n renderRange: RenderRange = DEFAULT_RENDER_RANGE\n ): Promise<HunksRenderResult> {\n const { result } = await this.asyncHighlight(diff);\n return this.processDiffResult(diff, renderRange, result);\n }\n\n private createPreElement(\n split: boolean,\n totalLines: number,\n themeStyles: string,\n baseThemeType: 'light' | 'dark' | undefined\n ): HASTElement {\n const {\n diffIndicators,\n disableBackground,\n disableLineNumbers,\n overflow,\n themeType,\n } = this.getOptionsWithDefaults();\n return createPreElement({\n diffIndicators,\n disableBackground,\n disableLineNumbers,\n overflow,\n themeStyles,\n split,\n themeType: baseThemeType ?? themeType,\n totalLines,\n });\n }\n\n private async asyncHighlight(\n diff: FileDiffMetadata\n ): Promise<RenderDiffResult> {\n this.computedLang = diff.lang ?? getFiletypeFromFileName(diff.name);\n const hasThemes =\n this.highlighter != null &&\n areThemesAttached(this.options.theme ?? DEFAULT_THEMES);\n const hasLangs =\n this.highlighter != null && areLanguagesAttached(this.computedLang);\n // If we don't have the required langs or themes, then we need to\n // initialize the highlighter to load the appropriate languages and themes\n if (this.highlighter == null || !hasThemes || !hasLangs) {\n this.highlighter = await this.initializeHighlighter();\n }\n return this.renderDiffWithHighlighter(diff, this.highlighter);\n }\n\n private renderDiffWithHighlighter(\n diff: FileDiffMetadata,\n highlighter: DiffsHighlighter,\n forcePlainText = false\n ): RenderDiffResult {\n const { options } = this.getRenderOptions(diff);\n const result = renderDiffWithHighlighter(diff, highlighter, options, {\n forcePlainText,\n expandedHunks: forcePlainText ? true : undefined,\n });\n return { result, options };\n }\n\n onHighlightSuccess(\n diff: FileDiffMetadata,\n result: ThemedDiffResult,\n options: RenderDiffOptions\n ): void {\n // If renderCache was blown away, we can assume we've run cleanUp()\n if (this.renderCache == null) {\n return;\n }\n const triggerRenderUpdate =\n this.renderCache.diff !== diff ||\n !this.renderCache.highlighted ||\n !areRenderOptionsEqual(this.renderCache.options, options);\n\n this.renderCache = {\n diff,\n options,\n highlighted: true,\n result,\n renderRange: undefined,\n };\n if (triggerRenderUpdate) {\n this.onRenderUpdate?.();\n }\n }\n\n onHighlightError(error: unknown): void {\n console.error(error);\n }\n\n private processDiffResult(\n fileDiff: FileDiffMetadata,\n renderRange: RenderRange,\n { code, themeStyles, baseThemeType }: ThemedDiffResult\n ): HunksRenderResult {\n const {\n diffStyle,\n disableFileHeader,\n disableVirtualizationBuffers,\n expandUnchanged,\n expansionLineCount,\n hunkSeparators,\n } = this.getOptionsWithDefaults();\n\n this.diff = fileDiff;\n const unified = diffStyle === 'unified';\n\n let additionsAST: ElementContent[] | undefined = [];\n let deletionsAST: ElementContent[] | undefined = [];\n let unifiedAST: ElementContent[] | undefined = [];\n\n const hunkData: HunkData[] = [];\n const { additionLines, deletionLines } = code;\n const separatorContext: PushSeparatorContext = {\n hunkSeparators,\n additionsAST,\n deletionsAST,\n unifiedAST,\n expansionLineCount,\n hunkData,\n };\n const trailingRangeSize = (() => {\n const lastHunk = fileDiff.hunks.at(-1);\n if (\n lastHunk == null ||\n fileDiff.isPartial ||\n fileDiff.additionLines.length === 0 ||\n fileDiff.deletionLines.length === 0\n ) {\n return 0;\n }\n const additionRemaining =\n fileDiff.additionLines.length -\n (lastHunk.additionLineIndex + lastHunk.additionCount);\n const deletionRemaining =\n fileDiff.deletionLines.length -\n (lastHunk.deletionLineIndex + lastHunk.deletionCount);\n if (additionRemaining !== deletionRemaining) {\n throw new Error(\n `DiffHunksRenderer.processDiffResult: trailing context mismatch (additions=${additionRemaining}, deletions=${deletionRemaining}) for ${fileDiff.name}`\n );\n }\n return Math.min(additionRemaining, deletionRemaining);\n })();\n\n let pendingSplitSpanSize = 0;\n let pendingSplitMissing: 'additions' | 'deletions' | undefined;\n let lastHunkIndex: number | undefined;\n\n function flushSplitSpan() {\n if (pendingSplitSpanSize <= 0 || pendingSplitMissing == null) {\n pendingSplitSpanSize = 0;\n pendingSplitMissing = undefined;\n return;\n }\n if (pendingSplitMissing === 'additions') {\n additionsAST?.push(createEmptyRowBuffer(pendingSplitSpanSize));\n } else {\n deletionsAST?.push(createEmptyRowBuffer(pendingSplitSpanSize));\n }\n pendingSplitSpanSize = 0;\n pendingSplitMissing = undefined;\n }\n\n function pushSeparators(props: PushSeparatorProps) {\n // NOTE(amadeus): This should technically never apply,\n // but just in case...\n flushSplitSpan();\n if (diffStyle === 'unified') {\n pushSeparator('unified', props, separatorContext);\n } else {\n pushSeparator('deletions', props, separatorContext);\n pushSeparator('additions', props, separatorContext);\n }\n }\n\n iterateOverDiff({\n diff: fileDiff,\n diffStyle,\n startingLine: renderRange.startingLine,\n totalLines: renderRange.totalLines,\n expandedHunks: expandUnchanged ? true : this.expandedHunks,\n callback: ({\n hunkIndex,\n hunk,\n collapsedBefore,\n collapsedAfter,\n unifiedDeletionLineIndex,\n unifiedAdditionLineIndex,\n splitLineIndex,\n additionLineIndex,\n deletionLineIndex,\n additionLineNumber,\n deletionLineNumber,\n type,\n noEOFCRAddition,\n noEOFCRDeletion,\n }) => {\n if (diffStyle === 'split') {\n if (lastHunkIndex != null && lastHunkIndex !== hunkIndex) {\n flushSplitSpan();\n }\n if (type !== 'change') {\n flushSplitSpan();\n }\n }\n lastHunkIndex = hunkIndex;\n\n if (collapsedBefore > 0) {\n pushSeparators({\n hunkIndex,\n collapsedLines: collapsedBefore,\n rangeSize: Math.max(hunk?.collapsedBefore ?? 0, 0),\n hunkSpecs: hunk?.hunkSpecs,\n isFirstHunk: hunkIndex === 0,\n isLastHunk: false,\n isExpandable: !fileDiff.isPartial,\n });\n }\n\n const lineIndex =\n diffStyle === 'unified'\n ? (unifiedDeletionLineIndex ?? unifiedAdditionLineIndex)\n : splitLineIndex;\n\n if (lineIndex == null) {\n const errorMessage =\n 'DiffHunksRenderer.processDiffResult: iterateOverDiff, no valid line index';\n console.error(errorMessage, { file: fileDiff.name });\n throw new Error(errorMessage);\n }\n\n if (diffStyle === 'unified') {\n const deletionLine =\n additionLineIndex != null\n ? undefined\n : deletionLineIndex != null\n ? deletionLines[deletionLineIndex]\n : undefined;\n const additionLine =\n additionLineIndex != null\n ? additionLines[additionLineIndex]\n : undefined;\n\n if (deletionLine == null && additionLine == null) {\n const errorMessage =\n 'DiffHunksRenderer.processDiffResult: deletionLine and additionLine are null, something is wrong';\n console.error(errorMessage, { file: fileDiff.name });\n throw new Error(errorMessage);\n }\n\n pushLineWithAnnotation({\n deletionLine,\n additionLine,\n unifiedAST,\n unifiedSpan: this.getAnnotations(\n 'unified',\n deletionLineNumber,\n additionLineNumber,\n hunkIndex,\n lineIndex\n ),\n });\n } else {\n const deletionLine =\n deletionLineIndex != null\n ? deletionLines[deletionLineIndex]\n : undefined;\n const additionLine =\n additionLineIndex != null\n ? additionLines[additionLineIndex]\n : undefined;\n\n if (deletionLine == null && additionLine == null) {\n const errorMessage =\n 'DiffHunksRenderer.processDiffResult: deletionLine and additionLine are null, something is wrong';\n console.error(errorMessage, { file: fileDiff.name });\n throw new Error(errorMessage);\n }\n\n const missingSide =\n deletionLine == null\n ? 'deletions'\n : additionLine == null\n ? 'additions'\n : undefined;\n if (missingSide != null) {\n if (\n pendingSplitMissing != null &&\n pendingSplitMissing !== missingSide\n ) {\n // NOTE(amadeus): If we see this error, we might need to bring back: flushSplitSpan();\n throw new Error(\n 'DiffHunksRenderer.processDiffResult: iterateOverDiff, invalid pending splits'\n );\n }\n pendingSplitMissing = missingSide;\n pendingSplitSpanSize++;\n }\n\n const annotationSpans = this.getAnnotations(\n 'split',\n deletionLineNumber,\n additionLineNumber,\n hunkIndex,\n lineIndex\n );\n if (annotationSpans != null && pendingSplitSpanSize > 0) {\n flushSplitSpan();\n }\n pushLineWithAnnotation({\n additionLine,\n deletionLine,\n deletionsAST,\n additionsAST,\n ...annotationSpans,\n });\n }\n\n if (noEOFCRDeletion || noEOFCRAddition) {\n const noEOFType =\n type === 'context' || type === 'context-expanded'\n ? 'context'\n : deletionLineIndex != null\n ? 'change-deletion'\n : 'change-addition';\n if (noEOFCRDeletion) {\n if (diffStyle === 'unified') {\n unifiedAST?.push(createNoNewlineElement(noEOFType));\n } else {\n deletionsAST?.push(createNoNewlineElement('change-deletion'));\n if (!noEOFCRAddition) {\n additionsAST?.push(createEmptyRowBuffer(1));\n }\n }\n }\n if (noEOFCRAddition) {\n if (diffStyle === 'unified') {\n unifiedAST?.push(createNoNewlineElement('change-addition'));\n } else {\n additionsAST?.push(createNoNewlineElement('change-addition'));\n if (!noEOFCRDeletion) {\n deletionsAST?.push(createEmptyRowBuffer(1));\n }\n }\n }\n }\n\n if (collapsedAfter > 0) {\n pushSeparators({\n hunkIndex: type === 'context-expanded' ? hunkIndex : hunkIndex + 1,\n collapsedLines: collapsedAfter,\n rangeSize: trailingRangeSize,\n hunkSpecs: undefined,\n isFirstHunk: false,\n isLastHunk: true,\n isExpandable: !fileDiff.isPartial,\n });\n }\n },\n });\n\n if (diffStyle === 'split') {\n flushSplitSpan();\n }\n\n const totalLines = Math.max(\n getTotalLineCountFromHunks(fileDiff.hunks),\n fileDiff.additionLines.length ?? 0,\n fileDiff.deletionLines.length ?? 0\n );\n\n // Some specialized logic to set our AST lists to be undefinable under\n // certain conditions\n // * If the type of change is a full addition or a full deletion, we don't\n // want to show a split view as that creates wasted space\n // * We'll do some further refinement below if necessary with list length,\n // but first we need to inject buffers if we are virtualized before we can\n // do the length check\n additionsAST =\n !unified && fileDiff.type !== 'deleted' ? additionsAST : undefined;\n deletionsAST =\n !unified && fileDiff.type !== 'new' ? deletionsAST : undefined;\n unifiedAST = unified ? unifiedAST : undefined;\n\n if (!disableVirtualizationBuffers) {\n if (renderRange.bufferBefore > 0) {\n const element = createBufferElement('before', renderRange.bufferBefore);\n unifiedAST?.unshift(element);\n deletionsAST?.unshift(element);\n additionsAST?.unshift(element);\n }\n if (renderRange.bufferAfter > 0) {\n const element = createBufferElement('after', renderRange.bufferAfter);\n unifiedAST?.push(element);\n deletionsAST?.push(element);\n additionsAST?.push(element);\n }\n }\n\n // If any of our arrays are empty, lets null them out to optimize rendering\n if (unifiedAST?.length === 0) {\n unifiedAST = undefined;\n }\n if (deletionsAST?.length === 0) {\n deletionsAST = undefined;\n }\n if (additionsAST?.length === 0) {\n additionsAST = undefined;\n }\n\n const preNode = this.createPreElement(\n deletionsAST != null && additionsAST != null,\n totalLines,\n themeStyles,\n baseThemeType\n );\n\n return {\n additionsAST,\n deletionsAST,\n unifiedAST,\n hunkData,\n preNode,\n themeStyles,\n baseThemeType,\n headerElement: !disableFileHeader\n ? this.renderHeader(this.diff, themeStyles, baseThemeType)\n : undefined,\n totalLines,\n // FIXME\n css: '',\n };\n }\n\n renderFullAST(\n result: HunksRenderResult,\n children: ElementContent[] = []\n ): HASTElement {\n if (result.unifiedAST != null) {\n children.push(\n createHastElement({\n tagName: 'code',\n children: result.unifiedAST,\n properties: {\n 'data-code': '',\n 'data-unified': '',\n },\n })\n );\n }\n if (result.deletionsAST != null) {\n children.push(\n createHastElement({\n tagName: 'code',\n children: result.deletionsAST,\n properties: {\n 'data-code': '',\n 'data-deletions': '',\n },\n })\n );\n }\n if (result.additionsAST != null) {\n children.push(\n createHastElement({\n tagName: 'code',\n children: result.additionsAST,\n properties: {\n 'data-code': '',\n 'data-additions': '',\n },\n })\n );\n }\n return { ...result.preNode, children };\n }\n\n renderFullHTML(\n result: HunksRenderResult,\n tempChildren: ElementContent[] = []\n ): string {\n return toHtml(this.renderFullAST(result, tempChildren));\n }\n\n renderPartialHTML(\n children: ElementContent[],\n columnType?: 'unified' | 'deletions' | 'additions'\n ): string {\n if (columnType == null) {\n return toHtml(children);\n }\n return toHtml(\n createHastElement({\n tagName: 'code',\n children,\n properties: {\n 'data-code': '',\n [`data-${columnType}`]: '',\n },\n })\n );\n }\n\n private getAnnotations(\n type: 'unified',\n deletionLineNumber: number | undefined,\n additionLineNumber: number | undefined,\n hunkIndex: number,\n lineIndex: number\n ): AnnotationSpan | undefined;\n private getAnnotations(\n type: 'split',\n deletionLineNumber: number | undefined,\n additionLineNumber: number | undefined,\n hunkIndex: number,\n lineIndex: number\n ): { deletionSpan: AnnotationSpan; additionSpan: AnnotationSpan } | undefined;\n private getAnnotations(\n type: 'unified' | 'split',\n deletionLineNumber: number | undefined,\n additionLineNumber: number | undefined,\n hunkIndex: number,\n lineIndex: number\n ):\n | AnnotationSpan\n | { deletionSpan: AnnotationSpan; additionSpan: AnnotationSpan }\n | undefined {\n const deletionSpan: AnnotationSpan = {\n type: 'annotation',\n hunkIndex,\n lineIndex,\n annotations: [],\n };\n if (deletionLineNumber != null) {\n for (const anno of this.deletionAnnotations[deletionLineNumber] ?? []) {\n deletionSpan.annotations.push(getLineAnnotationName(anno));\n }\n }\n const additionSpan: AnnotationSpan = {\n type: 'annotation',\n hunkIndex,\n lineIndex,\n annotations: [],\n };\n if (additionLineNumber != null) {\n for (const anno of this.additionAnnotations[additionLineNumber] ?? []) {\n (type === 'unified' ? deletionSpan : additionSpan).annotations.push(\n getLineAnnotationName(anno)\n );\n }\n }\n if (type === 'unified') {\n if (deletionSpan.annotations.length > 0) {\n return deletionSpan;\n }\n return undefined;\n }\n if (\n additionSpan.annotations.length === 0 &&\n deletionSpan.annotations.length === 0\n ) {\n return undefined;\n }\n return { deletionSpan, additionSpan };\n }\n\n private renderHeader(\n diff: FileDiffMetadata,\n themeStyles: string,\n baseThemeType: 'light' | 'dark' | undefined\n ): HASTElement {\n const { themeType } = this.getOptionsWithDefaults();\n return createFileHeaderElement({\n fileOrDiff: diff,\n themeStyles,\n themeType: baseThemeType ?? themeType,\n });\n }\n}\n\nfunction areRenderOptionsEqual(\n optionsA: RenderDiffOptions,\n optionsB: RenderDiffOptions\n): boolean {\n return (\n areThemesEqual(optionsA.theme, optionsB.theme) &&\n optionsA.tokenizeMaxLineLength === optionsB.tokenizeMaxLineLength &&\n optionsA.lineDiffType === optionsB.lineDiffType\n );\n}\n\nfunction getModifiedLinesString(lines: number) {\n return `${lines} unmodified line${lines > 1 ? 's' : ''}`;\n}\n\nfunction pushLineWithAnnotation({\n deletionLine,\n additionLine,\n unifiedAST,\n additionsAST,\n deletionsAST,\n unifiedSpan,\n deletionSpan,\n additionSpan,\n}: PushLineWithAnnotation) {\n if (unifiedAST != null) {\n if (deletionLine != null) {\n unifiedAST.push(deletionLine);\n } else if (additionLine != null) {\n unifiedAST.push(additionLine);\n }\n if (unifiedSpan != null) {\n unifiedAST.push(createAnnotationElement(unifiedSpan));\n }\n } else if (deletionsAST != null && additionsAST != null) {\n if (deletionLine != null) {\n deletionsAST.push(deletionLine);\n }\n if (additionLine != null) {\n additionsAST.push(additionLine);\n }\n if (deletionSpan != null) {\n deletionsAST.push(createAnnotationElement(deletionSpan));\n }\n if (additionSpan != null) {\n additionsAST.push(createAnnotationElement(additionSpan));\n }\n }\n}\n\nfunction pushSeparator(\n type: 'additions' | 'deletions' | 'unified',\n {\n hunkIndex,\n collapsedLines,\n rangeSize,\n hunkSpecs,\n isFirstHunk,\n isLastHunk,\n isExpandable,\n }: PushSeparatorProps,\n {\n expansionLineCount,\n hunkSeparators,\n unifiedAST,\n deletionsAST,\n additionsAST,\n hunkData,\n }: PushSeparatorContext\n) {\n if (collapsedLines <= 0) {\n return;\n }\n const linesAST =\n type === 'unified'\n ? unifiedAST\n : type === 'deletions'\n ? deletionsAST\n : additionsAST;\n\n if (hunkSeparators === 'metadata') {\n if (hunkSpecs != null) {\n linesAST.push(\n createSeparator({\n type: 'metadata',\n content: hunkSpecs,\n isFirstHunk,\n isLastHunk,\n })\n );\n }\n return;\n }\n if (hunkSeparators === 'simple') {\n if (hunkIndex > 0) {\n linesAST.push(\n createSeparator({ type: 'simple', isFirstHunk, isLastHunk: false })\n );\n }\n return;\n }\n const slotName = getHunkSeparatorSlotName(type, hunkIndex);\n const chunked = rangeSize > expansionLineCount;\n const expandIndex = isExpandable ? hunkIndex : undefined;\n linesAST.push(\n createSeparator({\n type: hunkSeparators,\n content: getModifiedLinesString(collapsedLines),\n expandIndex,\n chunked,\n slotName,\n isFirstHunk,\n isLastHunk,\n })\n );\n hunkData.push({\n slotName,\n hunkIndex,\n lines: collapsedLines,\n type,\n expandable: isExpandable\n ? { up: !isFirstHunk, down: !isLastHunk, chunked }\n : undefined,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA6DA,MAAMA,uBAAoC;CACxC,cAAc;CACd,YAAY;CACZ,cAAc;CACd,aAAa;CACd;AA2CD,IAAI,aAAa;AAEjB,IAAa,oBAAb,MAAwD;CACtD,AAAS,OAAe,uBAAuB,EAAE;CAEjD,AAAQ;CACR,AAAQ;CAER,AAAQ,gCAAgB,IAAI,KAAkC;CAE9D,AAAQ,sBAAsD,EAAE;CAChE,AAAQ,sBAAsD,EAAE;CAEhE,AAAQ,eAAmC;CAC3C,AAAQ;CAER,YACE,AAAOC,UAA2B,EAAE,OAAO,gBAAgB,EAC3D,AAAQC,gBACR,AAAQC,eACR;EAHO;EACC;EACA;AAER,MAAI,eAAe,eAAe,KAAK,KACrC,MAAK,cAAc,kBAAkB,QAAQ,SAAS,eAAe,GACjE,wBAAwB,GACxB;;CAIR,UAAgB;AACd,OAAK,cAAc;AACnB,OAAK,OAAO;AACZ,OAAK,cAAc;AACnB,OAAK,eAAe,oBAAoB,KAAK;AAC7C,OAAK,gBAAgB;AACrB,OAAK,iBAAiB;;CAGxB,UAAgB;AACd,OAAK,cAAc;AACnB,OAAK,OAAO;AACZ,OAAK,cAAc;AACnB,OAAK,eAAe,oBAAoB,KAAK;;CAG/C,WAAW,SAAgC;AACzC,OAAK,UAAU;;CAGjB,AAAQ,aAAa,SAAmC;AACtD,OAAK,UAAU;GAAE,GAAG,KAAK;GAAS,GAAG;GAAS;;CAGhD,aAAa,WAA6B;AACxC,MAAI,KAAK,wBAAwB,CAAC,cAAc,UAC9C;AAEF,OAAK,aAAa,EAAE,WAAW,CAAC;;CAGlC,WAAW,OAAe,WAAsC;EAC9D,MAAM,EAAE,uBAAuB,KAAK,wBAAwB;EAC5D,MAAM,SAAS,EACb,GAAI,KAAK,cAAc,IAAI,MAAM,IAAI;GACnC,WAAW;GACX,SAAS;GACV,EACF;AACD,MAAI,cAAc,QAAQ,cAAc,OACtC,QAAO,aAAa;AAEtB,MAAI,cAAc,UAAU,cAAc,OACxC,QAAO,WAAW;AAEpB,OAAK,cAAc,IAAI,OAAO,OAAO;;CAGvC,gBAAgB,WAAwC;AACtD,SAAO,KAAK,cAAc,IAAI,UAAU,IAAI;;CAG9C,sBAAwD;AACtD,SAAO,KAAK;;CAGd,mBAAmB,iBAA0D;AAC3E,OAAK,sBAAsB,EAAE;AAC7B,OAAK,sBAAsB,EAAE;AAC7B,OAAK,MAAM,cAAc,iBAAiB;GACxC,MAAM,aAA6C;AACjD,YAAQ,WAAW,MAAnB;KACE,KAAK,YACH,QAAO,KAAK;KACd,KAAK,YACH,QAAO,KAAK;;OAEd;GACJ,MAAM,MAAM,IAAI,WAAW,eAAe,EAAE;AAC5C,OAAI,WAAW,cAAc;AAC7B,OAAI,KAAK,WAAW;;;CAIxB,yBAA8C;EAC5C,MAAM,EACJ,iBAAiB,QACjB,YAAY,SACZ,oBAAoB,OACpB,oBAAoB,OACpB,qBAAqB,OACrB,+BAA+B,OAC/B,kBAAkB,OAClB,qBAAqB,KACrB,iBAAiB,aACjB,eAAe,YACf,oBAAoB,KACpB,WAAW,UACX,QAAQ,gBACR,YAAY,UACZ,wBAAwB,KACxB,gBAAgB,UACd,KAAK;AACT,SAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,OAAO,KAAK,eAAe,sBAAsB,CAAC,SAAS;GAC3D;GACA;GACA;GACD;;CAGH,MAAM,wBAAmD;AACvD,OAAK,cAAc,MAAM,qBACvB,sBAAsB,KAAK,cAAc,KAAK,QAAQ,CACvD;AACD,SAAO,KAAK;;CAGd,QAAQ,MAA0C;AAChD,MAAI,QAAQ,KACV;AAEF,OAAK,OAAO;EACZ,MAAM,EAAE,YAAY,KAAK,iBAAiB,KAAK;EAC/C,IAAI,QAAQ,KAAK,eAAe,mBAAmB,KAAK;AACxD,MAAI,SAAS,QAAQ,CAAC,sBAAsB,SAAS,MAAM,QAAQ,CACjE,SAAQ;AAEV,OAAK,gBAAgB;GACnB;GAGA,aAAa;GACb;GACA,QAAQ,OAAO;GACf,aAAa;GACd;AACD,MACE,KAAK,eAAe,eAAe,KAAK,QACxC,KAAK,YAAY,UAAU,KAE3B,MAAK,cAAc,iBAAiB,MAAM,KAAK,KAAK;MAEpD,CAAK,KAAK,eAAe,KAAK,CAAC,MAAM,EAAE,QAAQ,yBAAc;AAC3D,QAAK,mBAAmB,MAAM,QAAQC,UAAQ;IAC9C;;CAIN,AAAQ,iBAAiB,MAAgD;EACvE,MAAMC,iBAAoC;AACxC,OAAI,KAAK,eAAe,eAAe,KAAK,KAC1C,QAAO,KAAK,cAAc,sBAAsB;GAElD,MAAM,EAAE,OAAO,uBAAuB,iBACpC,KAAK,wBAAwB;AAC/B,UAAO;IAAE;IAAO;IAAuB;IAAc;MACnD;AACJ,OAAK,wBAAwB;EAC7B,MAAM,EAAE,gBAAgB;AACxB,MAAI,aAAa,UAAU,KACzB,QAAO;GAAE;GAAS,aAAa;GAAM;AAEvC,MACE,SAAS,YAAY,QACrB,CAAC,sBAAsB,SAAS,YAAY,QAAQ,CAEpD,QAAO;GAAE;GAAS,aAAa;GAAM;AAEvC,SAAO;GAAE;GAAS,aAAa;GAAO;;CAGxC,WACE,OAAqC,KAAK,aAAa,MACvD,cAA2B,sBACI;AAC/B,MAAI,QAAQ,KACV;EAEF,MAAM,EAAE,kBAAkB,UAAU,KAAK;EACzC,MAAM,QAAQ,KAAK,eAAe,mBAAmB,KAAK;AAC1D,MAAI,SAAS,QAAQ,KAAK,eAAe,KACvC,MAAK,cAAc;GACjB;GACA,aAAa;GACb,aAAa;GACb,GAAG;GACJ;EAEH,MAAM,EAAE,SAAS,gBAAgB,KAAK,iBAAiB,KAAK;AAC5D,OAAK,gBAAgB;GACnB;GACA,aAAa;GACb;GACA,QAAQ;GACR,aAAa;GACd;AACD,MAAI,KAAK,eAAe,eAAe,KAAK,MAAM;AAChD,OACE,KAAK,YAAY,UAAU,QAC1B,CAAC,KAAK,YAAY,eACjB,CAAC,qBAAqB,KAAK,YAAY,aAAa,YAAY,EAClE;AACA,SAAK,YAAY,SAAS,KAAK,cAAc,gBAC3C,MACA,YAAY,cACZ,YAAY,YAGZ,qBAAqB,YAAY,GAC7B,OACA,kBACE,OACA,KAAK,cACZ;AACD,SAAK,YAAY,cAAc;;AAEjC,OAGE,YAAY,aAAa,MACxB,CAAC,KAAK,YAAY,eAAe,aAElC,MAAK,cAAc,iBAAiB,MAAM,KAAK;SAE5C;AACL,QAAK,eAAe,KAAK,QAAQ,wBAAwB,KAAK,KAAK;GACnE,MAAM,YACJ,KAAK,eAAe,QAAQ,kBAAkB,QAAQ,MAAM;GAC9D,MAAM,WACJ,KAAK,eAAe,QAAQ,qBAAqB,KAAK,aAAa;AAMrE,OACE,KAAK,eAAe,QACpB,cACC,eACE,CAAC,KAAK,YAAY,eAAe,YAClC,KAAK,YAAY,UAAU,OAC7B;IACA,MAAM,EAAE,QAAQ,uBAAY,KAAK,0BAC/B,MACA,KAAK,aACL,CAAC,SACF;AACD,SAAK,cAAc;KACjB;KACA;KACA,aAAa;KACb;KACA,aAAa;KACd;;AAMH,OAAI,CAAC,aAAa,CAAC,SACjB,CAAK,KAAK,eAAe,KAAK,CAAC,MAAM,EAAE,QAAQ,yBAAc;AAC3D,SAAK,mBAAmB,MAAM,QAAQD,UAAQ;KAC9C;;AAGN,SAAO,KAAK,YAAY,UAAU,OAC9B,KAAK,kBACH,KAAK,YAAY,MACjB,aACA,KAAK,YAAY,OAClB,GACD;;CAGN,MAAM,YACJ,MACA,cAA2B,sBACC;EAC5B,MAAM,EAAE,WAAW,MAAM,KAAK,eAAe,KAAK;AAClD,SAAO,KAAK,kBAAkB,MAAM,aAAa,OAAO;;CAG1D,AAAQ,iBACN,OACA,YACA,aACA,eACa;EACb,MAAM,EACJ,gBACA,mBACA,oBACA,UACA,cACE,KAAK,wBAAwB;AACjC,SAAO,iBAAiB;GACtB;GACA;GACA;GACA;GACA;GACA;GACA,WAAW,iBAAiB;GAC5B;GACD,CAAC;;CAGJ,MAAc,eACZ,MAC2B;AAC3B,OAAK,eAAe,KAAK,QAAQ,wBAAwB,KAAK,KAAK;EACnE,MAAM,YACJ,KAAK,eAAe,QACpB,kBAAkB,KAAK,QAAQ,SAAS,eAAe;EACzD,MAAM,WACJ,KAAK,eAAe,QAAQ,qBAAqB,KAAK,aAAa;AAGrE,MAAI,KAAK,eAAe,QAAQ,CAAC,aAAa,CAAC,SAC7C,MAAK,cAAc,MAAM,KAAK,uBAAuB;AAEvD,SAAO,KAAK,0BAA0B,MAAM,KAAK,YAAY;;CAG/D,AAAQ,0BACN,MACA,aACA,iBAAiB,OACC;EAClB,MAAM,EAAE,YAAY,KAAK,iBAAiB,KAAK;AAK/C,SAAO;GAAE,QAJM,0BAA0B,MAAM,aAAa,SAAS;IACnE;IACA,eAAe,iBAAiB,OAAO;IACxC,CAAC;GACe;GAAS;;CAG5B,mBACE,MACA,QACA,SACM;AAEN,MAAI,KAAK,eAAe,KACtB;EAEF,MAAM,sBACJ,KAAK,YAAY,SAAS,QAC1B,CAAC,KAAK,YAAY,eAClB,CAAC,sBAAsB,KAAK,YAAY,SAAS,QAAQ;AAE3D,OAAK,cAAc;GACjB;GACA;GACA,aAAa;GACb;GACA,aAAa;GACd;AACD,MAAI,oBACF,MAAK,kBAAkB;;CAI3B,iBAAiB,OAAsB;AACrC,UAAQ,MAAM,MAAM;;CAGtB,AAAQ,kBACN,UACA,aACA,EAAE,MAAM,aAAa,iBACF;EACnB,MAAM,EACJ,WACA,mBACA,8BACA,iBACA,oBACA,mBACE,KAAK,wBAAwB;AAEjC,OAAK,OAAO;EACZ,MAAM,UAAU,cAAc;EAE9B,IAAIE,eAA6C,EAAE;EACnD,IAAIC,eAA6C,EAAE;EACnD,IAAIC,aAA2C,EAAE;EAEjD,MAAMC,WAAuB,EAAE;EAC/B,MAAM,EAAE,eAAe,kBAAkB;EACzC,MAAMC,mBAAyC;GAC7C;GACA;GACA;GACA;GACA;GACA;GACD;EACD,MAAM,2BAA2B;GAC/B,MAAM,WAAW,SAAS,MAAM,GAAG,GAAG;AACtC,OACE,YAAY,QACZ,SAAS,aACT,SAAS,cAAc,WAAW,KAClC,SAAS,cAAc,WAAW,EAElC,QAAO;GAET,MAAM,oBACJ,SAAS,cAAc,UACtB,SAAS,oBAAoB,SAAS;GACzC,MAAM,oBACJ,SAAS,cAAc,UACtB,SAAS,oBAAoB,SAAS;AACzC,OAAI,sBAAsB,kBACxB,OAAM,IAAI,MACR,6EAA6E,kBAAkB,cAAc,kBAAkB,QAAQ,SAAS,OACjJ;AAEH,UAAO,KAAK,IAAI,mBAAmB,kBAAkB;MACnD;EAEJ,IAAI,uBAAuB;EAC3B,IAAIC;EACJ,IAAIC;EAEJ,SAAS,iBAAiB;AACxB,OAAI,wBAAwB,KAAK,uBAAuB,MAAM;AAC5D,2BAAuB;AACvB,0BAAsB;AACtB;;AAEF,OAAI,wBAAwB,YAC1B,eAAc,KAAK,qBAAqB,qBAAqB,CAAC;OAE9D,eAAc,KAAK,qBAAqB,qBAAqB,CAAC;AAEhE,0BAAuB;AACvB,yBAAsB;;EAGxB,SAAS,eAAe,OAA2B;AAGjD,mBAAgB;AAChB,OAAI,cAAc,UAChB,eAAc,WAAW,OAAO,iBAAiB;QAC5C;AACL,kBAAc,aAAa,OAAO,iBAAiB;AACnD,kBAAc,aAAa,OAAO,iBAAiB;;;AAIvD,kBAAgB;GACd,MAAM;GACN;GACA,cAAc,YAAY;GAC1B,YAAY,YAAY;GACxB,eAAe,kBAAkB,OAAO,KAAK;GAC7C,WAAW,EACT,WACA,MACA,iBACA,gBACA,0BACA,0BACA,gBACA,mBACA,mBACA,oBACA,oBACA,MACA,iBACA,sBACI;AACJ,QAAI,cAAc,SAAS;AACzB,SAAI,iBAAiB,QAAQ,kBAAkB,UAC7C,iBAAgB;AAElB,SAAI,SAAS,SACX,iBAAgB;;AAGpB,oBAAgB;AAEhB,QAAI,kBAAkB,EACpB,gBAAe;KACb;KACA,gBAAgB;KAChB,WAAW,KAAK,IAAI,MAAM,mBAAmB,GAAG,EAAE;KAClD,WAAW,MAAM;KACjB,aAAa,cAAc;KAC3B,YAAY;KACZ,cAAc,CAAC,SAAS;KACzB,CAAC;IAGJ,MAAM,YACJ,cAAc,YACT,4BAA4B,2BAC7B;AAEN,QAAI,aAAa,MAAM;KACrB,MAAM,eACJ;AACF,aAAQ,MAAM,cAAc,EAAE,MAAM,SAAS,MAAM,CAAC;AACpD,WAAM,IAAI,MAAM,aAAa;;AAG/B,QAAI,cAAc,WAAW;KAC3B,MAAM,eACJ,qBAAqB,OACjB,SACA,qBAAqB,OACnB,cAAc,qBACd;KACR,MAAM,eACJ,qBAAqB,OACjB,cAAc,qBACd;AAEN,SAAI,gBAAgB,QAAQ,gBAAgB,MAAM;MAChD,MAAM,eACJ;AACF,cAAQ,MAAM,cAAc,EAAE,MAAM,SAAS,MAAM,CAAC;AACpD,YAAM,IAAI,MAAM,aAAa;;AAG/B,4BAAuB;MACrB;MACA;MACA;MACA,aAAa,KAAK,eAChB,WACA,oBACA,oBACA,WACA,UACD;MACF,CAAC;WACG;KACL,MAAM,eACJ,qBAAqB,OACjB,cAAc,qBACd;KACN,MAAM,eACJ,qBAAqB,OACjB,cAAc,qBACd;AAEN,SAAI,gBAAgB,QAAQ,gBAAgB,MAAM;MAChD,MAAM,eACJ;AACF,cAAQ,MAAM,cAAc,EAAE,MAAM,SAAS,MAAM,CAAC;AACpD,YAAM,IAAI,MAAM,aAAa;;KAG/B,MAAM,cACJ,gBAAgB,OACZ,cACA,gBAAgB,OACd,cACA;AACR,SAAI,eAAe,MAAM;AACvB,UACE,uBAAuB,QACvB,wBAAwB,YAGxB,OAAM,IAAI,MACR,+EACD;AAEH,4BAAsB;AACtB;;KAGF,MAAM,kBAAkB,KAAK,eAC3B,SACA,oBACA,oBACA,WACA,UACD;AACD,SAAI,mBAAmB,QAAQ,uBAAuB,EACpD,iBAAgB;AAElB,4BAAuB;MACrB;MACA;MACA;MACA;MACA,GAAG;MACJ,CAAC;;AAGJ,QAAI,mBAAmB,iBAAiB;KACtC,MAAM,YACJ,SAAS,aAAa,SAAS,qBAC3B,YACA,qBAAqB,OACnB,oBACA;AACR,SAAI,gBACF,KAAI,cAAc,UAChB,aAAY,KAAK,uBAAuB,UAAU,CAAC;UAC9C;AACL,oBAAc,KAAK,uBAAuB,kBAAkB,CAAC;AAC7D,UAAI,CAAC,gBACH,eAAc,KAAK,qBAAqB,EAAE,CAAC;;AAIjD,SAAI,gBACF,KAAI,cAAc,UAChB,aAAY,KAAK,uBAAuB,kBAAkB,CAAC;UACtD;AACL,oBAAc,KAAK,uBAAuB,kBAAkB,CAAC;AAC7D,UAAI,CAAC,gBACH,eAAc,KAAK,qBAAqB,EAAE,CAAC;;;AAMnD,QAAI,iBAAiB,EACnB,gBAAe;KACb,WAAW,SAAS,qBAAqB,YAAY,YAAY;KACjE,gBAAgB;KAChB,WAAW;KACX,WAAW;KACX,aAAa;KACb,YAAY;KACZ,cAAc,CAAC,SAAS;KACzB,CAAC;;GAGP,CAAC;AAEF,MAAI,cAAc,QAChB,iBAAgB;EAGlB,MAAM,aAAa,KAAK,IACtB,2BAA2B,SAAS,MAAM,EAC1C,SAAS,cAAc,UAAU,GACjC,SAAS,cAAc,UAAU,EAClC;AASD,iBACE,CAAC,WAAW,SAAS,SAAS,YAAY,eAAe;AAC3D,iBACE,CAAC,WAAW,SAAS,SAAS,QAAQ,eAAe;AACvD,eAAa,UAAU,aAAa;AAEpC,MAAI,CAAC,8BAA8B;AACjC,OAAI,YAAY,eAAe,GAAG;IAChC,MAAM,UAAU,oBAAoB,UAAU,YAAY,aAAa;AACvE,gBAAY,QAAQ,QAAQ;AAC5B,kBAAc,QAAQ,QAAQ;AAC9B,kBAAc,QAAQ,QAAQ;;AAEhC,OAAI,YAAY,cAAc,GAAG;IAC/B,MAAM,UAAU,oBAAoB,SAAS,YAAY,YAAY;AACrE,gBAAY,KAAK,QAAQ;AACzB,kBAAc,KAAK,QAAQ;AAC3B,kBAAc,KAAK,QAAQ;;;AAK/B,MAAI,YAAY,WAAW,EACzB,cAAa;AAEf,MAAI,cAAc,WAAW,EAC3B,gBAAe;AAEjB,MAAI,cAAc,WAAW,EAC3B,gBAAe;EAGjB,MAAM,UAAU,KAAK,iBACnB,gBAAgB,QAAQ,gBAAgB,MACxC,YACA,aACA,cACD;AAED,SAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA,eAAe,CAAC,oBACZ,KAAK,aAAa,KAAK,MAAM,aAAa,cAAc,GACxD;GACJ;GAEA,KAAK;GACN;;CAGH,cACE,QACA,WAA6B,EAAE,EAClB;AACb,MAAI,OAAO,cAAc,KACvB,UAAS,KACP,kBAAkB;GAChB,SAAS;GACT,UAAU,OAAO;GACjB,YAAY;IACV,aAAa;IACb,gBAAgB;IACjB;GACF,CAAC,CACH;AAEH,MAAI,OAAO,gBAAgB,KACzB,UAAS,KACP,kBAAkB;GAChB,SAAS;GACT,UAAU,OAAO;GACjB,YAAY;IACV,aAAa;IACb,kBAAkB;IACnB;GACF,CAAC,CACH;AAEH,MAAI,OAAO,gBAAgB,KACzB,UAAS,KACP,kBAAkB;GAChB,SAAS;GACT,UAAU,OAAO;GACjB,YAAY;IACV,aAAa;IACb,kBAAkB;IACnB;GACF,CAAC,CACH;AAEH,SAAO;GAAE,GAAG,OAAO;GAAS;GAAU;;CAGxC,eACE,QACA,eAAiC,EAAE,EAC3B;AACR,SAAO,OAAO,KAAK,cAAc,QAAQ,aAAa,CAAC;;CAGzD,kBACE,UACA,YACQ;AACR,MAAI,cAAc,KAChB,QAAO,OAAO,SAAS;AAEzB,SAAO,OACL,kBAAkB;GAChB,SAAS;GACT;GACA,YAAY;IACV,aAAa;KACZ,QAAQ,eAAe;IACzB;GACF,CAAC,CACH;;CAiBH,AAAQ,eACN,MACA,oBACA,oBACA,WACA,WAIY;EACZ,MAAMC,eAA+B;GACnC,MAAM;GACN;GACA;GACA,aAAa,EAAE;GAChB;AACD,MAAI,sBAAsB,KACxB,MAAK,MAAM,QAAQ,KAAK,oBAAoB,uBAAuB,EAAE,CACnE,cAAa,YAAY,KAAK,sBAAsB,KAAK,CAAC;EAG9D,MAAMC,eAA+B;GACnC,MAAM;GACN;GACA;GACA,aAAa,EAAE;GAChB;AACD,MAAI,sBAAsB,KACxB,MAAK,MAAM,QAAQ,KAAK,oBAAoB,uBAAuB,EAAE,CACnE,EAAC,SAAS,YAAY,eAAe,cAAc,YAAY,KAC7D,sBAAsB,KAAK,CAC5B;AAGL,MAAI,SAAS,WAAW;AACtB,OAAI,aAAa,YAAY,SAAS,EACpC,QAAO;AAET;;AAEF,MACE,aAAa,YAAY,WAAW,KACpC,aAAa,YAAY,WAAW,EAEpC;AAEF,SAAO;GAAE;GAAc;GAAc;;CAGvC,AAAQ,aACN,MACA,aACA,eACa;EACb,MAAM,EAAE,cAAc,KAAK,wBAAwB;AACnD,SAAO,wBAAwB;GAC7B,YAAY;GACZ;GACA,WAAW,iBAAiB;GAC7B,CAAC;;;AAIN,SAAS,sBACP,UACA,UACS;AACT,QACE,eAAe,SAAS,OAAO,SAAS,MAAM,IAC9C,SAAS,0BAA0B,SAAS,yBAC5C,SAAS,iBAAiB,SAAS;;AAIvC,SAAS,uBAAuB,OAAe;AAC7C,QAAO,GAAG,MAAM,kBAAkB,QAAQ,IAAI,MAAM;;AAGtD,SAAS,uBAAuB,EAC9B,cACA,cACA,YACA,cACA,cACA,aACA,cACA,gBACyB;AACzB,KAAI,cAAc,MAAM;AACtB,MAAI,gBAAgB,KAClB,YAAW,KAAK,aAAa;WACpB,gBAAgB,KACzB,YAAW,KAAK,aAAa;AAE/B,MAAI,eAAe,KACjB,YAAW,KAAK,wBAAwB,YAAY,CAAC;YAE9C,gBAAgB,QAAQ,gBAAgB,MAAM;AACvD,MAAI,gBAAgB,KAClB,cAAa,KAAK,aAAa;AAEjC,MAAI,gBAAgB,KAClB,cAAa,KAAK,aAAa;AAEjC,MAAI,gBAAgB,KAClB,cAAa,KAAK,wBAAwB,aAAa,CAAC;AAE1D,MAAI,gBAAgB,KAClB,cAAa,KAAK,wBAAwB,aAAa,CAAC;;;AAK9D,SAAS,cACP,MACA,EACE,WACA,gBACA,WACA,WACA,aACA,YACA,gBAEF,EACE,oBACA,gBACA,YACA,cACA,cACA,YAEF;AACA,KAAI,kBAAkB,EACpB;CAEF,MAAM,WACJ,SAAS,YACL,aACA,SAAS,cACP,eACA;AAER,KAAI,mBAAmB,YAAY;AACjC,MAAI,aAAa,KACf,UAAS,KACP,gBAAgB;GACd,MAAM;GACN,SAAS;GACT;GACA;GACD,CAAC,CACH;AAEH;;AAEF,KAAI,mBAAmB,UAAU;AAC/B,MAAI,YAAY,EACd,UAAS,KACP,gBAAgB;GAAE,MAAM;GAAU;GAAa,YAAY;GAAO,CAAC,CACpE;AAEH;;CAEF,MAAM,WAAW,yBAAyB,MAAM,UAAU;CAC1D,MAAM,UAAU,YAAY;CAC5B,MAAM,cAAc,eAAe,YAAY;AAC/C,UAAS,KACP,gBAAgB;EACd,MAAM;EACN,SAAS,uBAAuB,eAAe;EAC/C;EACA;EACA;EACA;EACA;EACD,CAAC,CACH;AACD,UAAS,KAAK;EACZ;EACA;EACA,OAAO;EACP;EACA,YAAY,eACR;GAAE,IAAI,CAAC;GAAa,MAAM,CAAC;GAAY;GAAS,GAChD;EACL,CAAC"}
1
+ {"version":3,"file":"DiffHunksRenderer.js","names":["DEFAULT_RENDER_RANGE: RenderRange","options: BaseDiffOptions","onRenderUpdate?: () => unknown","workerManager?: WorkerPoolManager | undefined","options","options: RenderDiffOptions","additionsAST: ElementContent[] | undefined","deletionsAST: ElementContent[] | undefined","unifiedAST: ElementContent[] | undefined","hunkData: HunkData[]","separatorContext: PushSeparatorContext","pendingSplitMissing: 'additions' | 'deletions' | undefined","lastHunkIndex: number | undefined","deletionSpan: AnnotationSpan","additionSpan: AnnotationSpan"],"sources":["../../src/renderers/DiffHunksRenderer.ts"],"sourcesContent":["import type { ElementContent, Element as HASTElement } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport {\n DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n DEFAULT_EXPANDED_REGION,\n DEFAULT_THEMES,\n} from '../constants';\nimport { areLanguagesAttached } from '../highlighter/languages/areLanguagesAttached';\nimport {\n getHighlighterIfLoaded,\n getSharedHighlighter,\n} from '../highlighter/shared_highlighter';\nimport { areThemesAttached } from '../highlighter/themes/areThemesAttached';\nimport type {\n AnnotationLineMap,\n AnnotationSpan,\n BaseDiffOptions,\n DiffLineAnnotation,\n DiffsHighlighter,\n ExpansionDirections,\n FileDiffMetadata,\n HunkData,\n HunkExpansionRegion,\n HunkSeparators,\n RenderDiffOptions,\n RenderDiffResult,\n RenderRange,\n RenderedDiffASTCache,\n SupportedLanguages,\n ThemeTypes,\n ThemedDiffResult,\n} from '../types';\nimport { areRenderRangesEqual } from '../utils/areRenderRangesEqual';\nimport { areThemesEqual } from '../utils/areThemesEqual';\nimport { createAnnotationElement } from '../utils/createAnnotationElement';\nimport { createEmptyRowBuffer } from '../utils/createEmptyRowBuffer';\nimport { createFileHeaderElement } from '../utils/createFileHeaderElement';\nimport { createNoNewlineElement } from '../utils/createNoNewlineElement';\nimport { createPreElement } from '../utils/createPreElement';\nimport { createSeparator } from '../utils/createSeparator';\nimport { getFiletypeFromFileName } from '../utils/getFiletypeFromFileName';\nimport { getHighlighterOptions } from '../utils/getHighlighterOptions';\nimport { getHunkSeparatorSlotName } from '../utils/getHunkSeparatorSlotName';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { getTotalLineCountFromHunks } from '../utils/getTotalLineCountFromHunks';\nimport { createBufferElement, createHastElement } from '../utils/hast_utils';\nimport { isDefaultRenderRange } from '../utils/isDefaultRenderRange';\nimport { iterateOverDiff } from '../utils/iterateOverDiff';\nimport { renderDiffWithHighlighter } from '../utils/renderDiffWithHighlighter';\nimport type { WorkerPoolManager } from '../worker';\n\ninterface PushLineWithAnnotation {\n deletionLine?: ElementContent;\n additionLine?: ElementContent;\n\n unifiedAST?: ElementContent[];\n deletionsAST?: ElementContent[];\n additionsAST?: ElementContent[];\n\n unifiedSpan?: AnnotationSpan;\n deletionSpan?: AnnotationSpan;\n additionSpan?: AnnotationSpan;\n}\n\nconst DEFAULT_RENDER_RANGE: RenderRange = {\n startingLine: 0,\n totalLines: Infinity,\n bufferBefore: 0,\n bufferAfter: 0,\n};\n\ninterface GetRenderOptionsReturn {\n options: RenderDiffOptions;\n forceRender: boolean;\n}\n\ninterface PushSeparatorProps {\n hunkIndex: number;\n collapsedLines: number;\n rangeSize: number;\n hunkSpecs: string | undefined;\n isFirstHunk: boolean;\n isLastHunk: boolean;\n isExpandable: boolean;\n}\n\ninterface PushSeparatorContext {\n expansionLineCount: number;\n hunkSeparators: HunkSeparators;\n unifiedAST: ElementContent[];\n deletionsAST: ElementContent[];\n additionsAST: ElementContent[];\n hunkData: HunkData[];\n}\n\ntype OptionsWithDefaults = Required<\n Omit<BaseDiffOptions, 'lang' | 'unsafeCSS'>\n>;\n\nexport interface HunksRenderResult {\n additionsAST: ElementContent[] | undefined;\n deletionsAST: ElementContent[] | undefined;\n unifiedAST: ElementContent[] | undefined;\n hunkData: HunkData[];\n css: string;\n preNode: HASTElement;\n headerElement: HASTElement | undefined;\n totalLines: number;\n themeStyles: string;\n baseThemeType: 'light' | 'dark' | undefined;\n}\n\nlet instanceId = -1;\n\nexport class DiffHunksRenderer<LAnnotation = undefined> {\n readonly __id: string = `diff-hunks-renderer:${++instanceId}`;\n\n private highlighter: DiffsHighlighter | undefined;\n private diff: FileDiffMetadata | undefined;\n\n private expandedHunks = new Map<number, HunkExpansionRegion>();\n\n private deletionAnnotations: AnnotationLineMap<LAnnotation> = {};\n private additionAnnotations: AnnotationLineMap<LAnnotation> = {};\n\n private computedLang: SupportedLanguages = 'text';\n private renderCache: RenderedDiffASTCache | undefined;\n\n constructor(\n public options: BaseDiffOptions = { theme: DEFAULT_THEMES },\n private onRenderUpdate?: () => unknown,\n private workerManager?: WorkerPoolManager | undefined\n ) {\n if (workerManager?.isWorkingPool() !== true) {\n this.highlighter = areThemesAttached(options.theme ?? DEFAULT_THEMES)\n ? getHighlighterIfLoaded()\n : undefined;\n }\n }\n\n cleanUp(): void {\n this.highlighter = undefined;\n this.diff = undefined;\n this.renderCache = undefined;\n this.workerManager?.cleanUpPendingTasks(this);\n this.workerManager = undefined;\n this.onRenderUpdate = undefined;\n }\n\n recycle(): void {\n this.highlighter = undefined;\n this.diff = undefined;\n this.renderCache = undefined;\n this.workerManager?.cleanUpPendingTasks(this);\n }\n\n setOptions(options: BaseDiffOptions): void {\n this.options = options;\n }\n\n private mergeOptions(options: Partial<BaseDiffOptions>) {\n this.options = { ...this.options, ...options };\n }\n\n setThemeType(themeType: ThemeTypes): void {\n if (this.getOptionsWithDefaults().themeType === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n }\n\n expandHunk(index: number, direction: ExpansionDirections): void {\n const { expansionLineCount } = this.getOptionsWithDefaults();\n const region = {\n ...(this.expandedHunks.get(index) ?? {\n fromStart: 0,\n fromEnd: 0,\n }),\n };\n if (direction === 'up' || direction === 'both') {\n region.fromStart += expansionLineCount;\n }\n if (direction === 'down' || direction === 'both') {\n region.fromEnd += expansionLineCount;\n }\n this.expandedHunks.set(index, region);\n }\n\n getExpandedHunk(hunkIndex: number): HunkExpansionRegion {\n return this.expandedHunks.get(hunkIndex) ?? DEFAULT_EXPANDED_REGION;\n }\n\n getExpandedHunksMap(): Map<number, HunkExpansionRegion> {\n return this.expandedHunks;\n }\n\n setLineAnnotations(lineAnnotations: DiffLineAnnotation<LAnnotation>[]): void {\n this.additionAnnotations = {};\n this.deletionAnnotations = {};\n for (const annotation of lineAnnotations) {\n const map = ((): AnnotationLineMap<LAnnotation> => {\n switch (annotation.side) {\n case 'deletions':\n return this.deletionAnnotations;\n case 'additions':\n return this.additionAnnotations;\n }\n })();\n const arr = map[annotation.lineNumber] ?? [];\n map[annotation.lineNumber] = arr;\n arr.push(annotation);\n }\n }\n\n getOptionsWithDefaults(): OptionsWithDefaults {\n const {\n diffIndicators = 'bars',\n diffStyle = 'split',\n disableBackground = false,\n disableFileHeader = false,\n disableLineNumbers = false,\n disableVirtualizationBuffers = false,\n expandUnchanged = false,\n collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n expansionLineCount = 100,\n hunkSeparators = 'line-info',\n lineDiffType = 'word-alt',\n maxLineDiffLength = 1000,\n overflow = 'scroll',\n theme = DEFAULT_THEMES,\n themeType = 'system',\n tokenizeMaxLineLength = 1000,\n useCSSClasses = false,\n } = this.options;\n return {\n diffIndicators,\n diffStyle,\n disableBackground,\n disableFileHeader,\n disableLineNumbers,\n disableVirtualizationBuffers,\n expandUnchanged,\n collapsedContextThreshold,\n expansionLineCount,\n hunkSeparators,\n lineDiffType,\n maxLineDiffLength,\n overflow,\n theme: this.workerManager?.getDiffRenderOptions().theme ?? theme,\n themeType,\n tokenizeMaxLineLength,\n useCSSClasses,\n };\n }\n\n async initializeHighlighter(): Promise<DiffsHighlighter> {\n this.highlighter = await getSharedHighlighter(\n getHighlighterOptions(this.computedLang, this.options)\n );\n return this.highlighter;\n }\n\n hydrate(diff: FileDiffMetadata | undefined): void {\n if (diff == null) {\n return;\n }\n this.diff = diff;\n const { options } = this.getRenderOptions(diff);\n let cache = this.workerManager?.getDiffResultCache(diff);\n if (cache != null && !areRenderOptionsEqual(options, cache.options)) {\n cache = undefined;\n }\n this.renderCache ??= {\n diff,\n // NOTE(amadeus): If we're hydrating, we can assume there was\n // pre-rendered HTML, otherwise one should not be hydrating\n highlighted: true,\n options,\n result: cache?.result,\n renderRange: undefined,\n };\n if (\n this.workerManager?.isWorkingPool() === true &&\n this.renderCache.result == null\n ) {\n this.workerManager.highlightDiffAST(this, this.diff);\n } else {\n void this.asyncHighlight(diff).then(({ result, options }) => {\n this.onHighlightSuccess(diff, result, options);\n });\n }\n }\n\n private getRenderOptions(diff: FileDiffMetadata): GetRenderOptionsReturn {\n const options: RenderDiffOptions = (() => {\n if (this.workerManager?.isWorkingPool() === true) {\n return this.workerManager.getDiffRenderOptions();\n }\n const { theme, tokenizeMaxLineLength, lineDiffType } =\n this.getOptionsWithDefaults();\n return { theme, tokenizeMaxLineLength, lineDiffType };\n })();\n this.getOptionsWithDefaults();\n const { renderCache } = this;\n if (renderCache?.result == null) {\n return { options, forceRender: true };\n }\n if (\n diff !== renderCache.diff ||\n !areRenderOptionsEqual(options, renderCache.options)\n ) {\n return { options, forceRender: true };\n }\n return { options, forceRender: false };\n }\n\n renderDiff(\n diff: FileDiffMetadata | undefined = this.renderCache?.diff,\n renderRange: RenderRange = DEFAULT_RENDER_RANGE\n ): HunksRenderResult | undefined {\n if (diff == null) {\n return undefined;\n }\n const { expandUnchanged = false, collapsedContextThreshold } =\n this.getOptionsWithDefaults();\n const cache = this.workerManager?.getDiffResultCache(diff);\n if (cache != null && this.renderCache == null) {\n this.renderCache = {\n diff,\n highlighted: true,\n renderRange: undefined,\n ...cache,\n };\n }\n const { options, forceRender } = this.getRenderOptions(diff);\n this.renderCache ??= {\n diff,\n highlighted: false,\n options,\n result: undefined,\n renderRange: undefined,\n };\n if (this.workerManager?.isWorkingPool() === true) {\n if (\n this.renderCache.result == null ||\n (!this.renderCache.highlighted &&\n !areRenderRangesEqual(this.renderCache.renderRange, renderRange))\n ) {\n this.renderCache.result = this.workerManager.getPlainDiffAST(\n diff,\n renderRange.startingLine,\n renderRange.totalLines,\n // If we aren't using a windowed render, then we need to render\n // everything\n isDefaultRenderRange(renderRange)\n ? true\n : expandUnchanged\n ? true\n : this.expandedHunks,\n collapsedContextThreshold\n );\n this.renderCache.renderRange = renderRange;\n }\n if (\n // We should only attempt to kick off the worker highlighter if there\n // are lines to render\n renderRange.totalLines > 0 &&\n (!this.renderCache.highlighted || forceRender)\n ) {\n this.workerManager.highlightDiffAST(this, diff);\n }\n } else {\n this.computedLang = diff.lang ?? getFiletypeFromFileName(diff.name);\n const hasThemes =\n this.highlighter != null && areThemesAttached(options.theme);\n const hasLangs =\n this.highlighter != null && areLanguagesAttached(this.computedLang);\n\n // If we have any semblance of a highlighter with the correct theme(s)\n // attached, we can kick off some form of rendering. If we don't have\n // the correct language, then we can render plain text and after kick off\n // an async job to get the highlighted AST\n if (\n this.highlighter != null &&\n hasThemes &&\n (forceRender ||\n (!this.renderCache.highlighted && hasLangs) ||\n this.renderCache.result == null)\n ) {\n const { result, options } = this.renderDiffWithHighlighter(\n diff,\n this.highlighter,\n !hasLangs\n );\n this.renderCache = {\n diff,\n options,\n highlighted: hasLangs,\n result,\n renderRange: undefined,\n };\n }\n\n // If we get in here it means we'll have to kick off an async highlight\n // process which will involve initializing the highlighter with new themes\n // and languages\n if (!hasThemes || !hasLangs) {\n void this.asyncHighlight(diff).then(({ result, options }) => {\n this.onHighlightSuccess(diff, result, options);\n });\n }\n }\n return this.renderCache.result != null\n ? this.processDiffResult(\n this.renderCache.diff,\n renderRange,\n this.renderCache.result\n )\n : undefined;\n }\n\n async asyncRender(\n diff: FileDiffMetadata,\n renderRange: RenderRange = DEFAULT_RENDER_RANGE\n ): Promise<HunksRenderResult> {\n const { result } = await this.asyncHighlight(diff);\n return this.processDiffResult(diff, renderRange, result);\n }\n\n private createPreElement(\n split: boolean,\n totalLines: number,\n themeStyles: string,\n baseThemeType: 'light' | 'dark' | undefined\n ): HASTElement {\n const {\n diffIndicators,\n disableBackground,\n disableLineNumbers,\n overflow,\n themeType,\n } = this.getOptionsWithDefaults();\n return createPreElement({\n diffIndicators,\n disableBackground,\n disableLineNumbers,\n overflow,\n themeStyles,\n split,\n themeType: baseThemeType ?? themeType,\n totalLines,\n });\n }\n\n private async asyncHighlight(\n diff: FileDiffMetadata\n ): Promise<RenderDiffResult> {\n this.computedLang = diff.lang ?? getFiletypeFromFileName(diff.name);\n const hasThemes =\n this.highlighter != null &&\n areThemesAttached(this.options.theme ?? DEFAULT_THEMES);\n const hasLangs =\n this.highlighter != null && areLanguagesAttached(this.computedLang);\n // If we don't have the required langs or themes, then we need to\n // initialize the highlighter to load the appropriate languages and themes\n if (this.highlighter == null || !hasThemes || !hasLangs) {\n this.highlighter = await this.initializeHighlighter();\n }\n return this.renderDiffWithHighlighter(diff, this.highlighter);\n }\n\n private renderDiffWithHighlighter(\n diff: FileDiffMetadata,\n highlighter: DiffsHighlighter,\n forcePlainText = false\n ): RenderDiffResult {\n const { options } = this.getRenderOptions(diff);\n const { collapsedContextThreshold } = this.getOptionsWithDefaults();\n const result = renderDiffWithHighlighter(diff, highlighter, options, {\n forcePlainText,\n expandedHunks: forcePlainText ? true : undefined,\n collapsedContextThreshold,\n });\n return { result, options };\n }\n\n onHighlightSuccess(\n diff: FileDiffMetadata,\n result: ThemedDiffResult,\n options: RenderDiffOptions\n ): void {\n // If renderCache was blown away, we can assume we've run cleanUp()\n if (this.renderCache == null) {\n return;\n }\n const triggerRenderUpdate =\n this.renderCache.diff !== diff ||\n !this.renderCache.highlighted ||\n !areRenderOptionsEqual(this.renderCache.options, options);\n\n this.renderCache = {\n diff,\n options,\n highlighted: true,\n result,\n renderRange: undefined,\n };\n if (triggerRenderUpdate) {\n this.onRenderUpdate?.();\n }\n }\n\n onHighlightError(error: unknown): void {\n console.error(error);\n }\n\n private processDiffResult(\n fileDiff: FileDiffMetadata,\n renderRange: RenderRange,\n { code, themeStyles, baseThemeType }: ThemedDiffResult\n ): HunksRenderResult {\n const {\n diffStyle,\n disableFileHeader,\n disableVirtualizationBuffers,\n expandUnchanged,\n expansionLineCount,\n collapsedContextThreshold,\n hunkSeparators,\n } = this.getOptionsWithDefaults();\n\n this.diff = fileDiff;\n const unified = diffStyle === 'unified';\n\n let additionsAST: ElementContent[] | undefined = [];\n let deletionsAST: ElementContent[] | undefined = [];\n let unifiedAST: ElementContent[] | undefined = [];\n\n const hunkData: HunkData[] = [];\n const { additionLines, deletionLines } = code;\n const separatorContext: PushSeparatorContext = {\n hunkSeparators,\n additionsAST,\n deletionsAST,\n unifiedAST,\n expansionLineCount,\n hunkData,\n };\n const trailingRangeSize = (() => {\n const lastHunk = fileDiff.hunks.at(-1);\n if (\n lastHunk == null ||\n fileDiff.isPartial ||\n fileDiff.additionLines.length === 0 ||\n fileDiff.deletionLines.length === 0\n ) {\n return 0;\n }\n const additionRemaining =\n fileDiff.additionLines.length -\n (lastHunk.additionLineIndex + lastHunk.additionCount);\n const deletionRemaining =\n fileDiff.deletionLines.length -\n (lastHunk.deletionLineIndex + lastHunk.deletionCount);\n if (additionRemaining !== deletionRemaining) {\n throw new Error(\n `DiffHunksRenderer.processDiffResult: trailing context mismatch (additions=${additionRemaining}, deletions=${deletionRemaining}) for ${fileDiff.name}`\n );\n }\n return Math.min(additionRemaining, deletionRemaining);\n })();\n\n let pendingSplitSpanSize = 0;\n let pendingSplitMissing: 'additions' | 'deletions' | undefined;\n let lastHunkIndex: number | undefined;\n\n function flushSplitSpan() {\n if (pendingSplitSpanSize <= 0 || pendingSplitMissing == null) {\n pendingSplitSpanSize = 0;\n pendingSplitMissing = undefined;\n return;\n }\n if (pendingSplitMissing === 'additions') {\n additionsAST?.push(createEmptyRowBuffer(pendingSplitSpanSize));\n } else {\n deletionsAST?.push(createEmptyRowBuffer(pendingSplitSpanSize));\n }\n pendingSplitSpanSize = 0;\n pendingSplitMissing = undefined;\n }\n\n function pushSeparators(props: PushSeparatorProps) {\n // NOTE(amadeus): This should technically never apply,\n // but just in case...\n flushSplitSpan();\n if (diffStyle === 'unified') {\n pushSeparator('unified', props, separatorContext);\n } else {\n pushSeparator('deletions', props, separatorContext);\n pushSeparator('additions', props, separatorContext);\n }\n }\n\n iterateOverDiff({\n diff: fileDiff,\n diffStyle,\n startingLine: renderRange.startingLine,\n totalLines: renderRange.totalLines,\n expandedHunks: expandUnchanged ? true : this.expandedHunks,\n collapsedContextThreshold,\n callback: ({\n hunkIndex,\n hunk,\n collapsedBefore,\n collapsedAfter,\n unifiedDeletionLineIndex,\n unifiedAdditionLineIndex,\n splitLineIndex,\n additionLineIndex,\n deletionLineIndex,\n additionLineNumber,\n deletionLineNumber,\n type,\n noEOFCRAddition,\n noEOFCRDeletion,\n }) => {\n if (diffStyle === 'split') {\n if (lastHunkIndex != null && lastHunkIndex !== hunkIndex) {\n flushSplitSpan();\n }\n if (type !== 'change') {\n flushSplitSpan();\n }\n }\n lastHunkIndex = hunkIndex;\n\n if (collapsedBefore > 0) {\n pushSeparators({\n hunkIndex,\n collapsedLines: collapsedBefore,\n rangeSize: Math.max(hunk?.collapsedBefore ?? 0, 0),\n hunkSpecs: hunk?.hunkSpecs,\n isFirstHunk: hunkIndex === 0,\n isLastHunk: false,\n isExpandable: !fileDiff.isPartial,\n });\n }\n\n const lineIndex =\n diffStyle === 'unified'\n ? (unifiedDeletionLineIndex ?? unifiedAdditionLineIndex)\n : splitLineIndex;\n\n if (lineIndex == null) {\n const errorMessage =\n 'DiffHunksRenderer.processDiffResult: iterateOverDiff, no valid line index';\n console.error(errorMessage, { file: fileDiff.name });\n throw new Error(errorMessage);\n }\n\n if (diffStyle === 'unified') {\n const deletionLine =\n additionLineIndex != null\n ? undefined\n : deletionLineIndex != null\n ? deletionLines[deletionLineIndex]\n : undefined;\n const additionLine =\n additionLineIndex != null\n ? additionLines[additionLineIndex]\n : undefined;\n\n if (deletionLine == null && additionLine == null) {\n const errorMessage =\n 'DiffHunksRenderer.processDiffResult: deletionLine and additionLine are null, something is wrong';\n console.error(errorMessage, { file: fileDiff.name });\n throw new Error(errorMessage);\n }\n\n pushLineWithAnnotation({\n deletionLine,\n additionLine,\n unifiedAST,\n unifiedSpan: this.getAnnotations(\n 'unified',\n deletionLineNumber,\n additionLineNumber,\n hunkIndex,\n lineIndex\n ),\n });\n } else {\n const deletionLine =\n deletionLineIndex != null\n ? deletionLines[deletionLineIndex]\n : undefined;\n const additionLine =\n additionLineIndex != null\n ? additionLines[additionLineIndex]\n : undefined;\n\n if (deletionLine == null && additionLine == null) {\n const errorMessage =\n 'DiffHunksRenderer.processDiffResult: deletionLine and additionLine are null, something is wrong';\n console.error(errorMessage, { file: fileDiff.name });\n throw new Error(errorMessage);\n }\n\n const missingSide =\n deletionLine == null\n ? 'deletions'\n : additionLine == null\n ? 'additions'\n : undefined;\n if (missingSide != null) {\n if (\n pendingSplitMissing != null &&\n pendingSplitMissing !== missingSide\n ) {\n // NOTE(amadeus): If we see this error, we might need to bring back: flushSplitSpan();\n throw new Error(\n 'DiffHunksRenderer.processDiffResult: iterateOverDiff, invalid pending splits'\n );\n }\n pendingSplitMissing = missingSide;\n pendingSplitSpanSize++;\n }\n\n const annotationSpans = this.getAnnotations(\n 'split',\n deletionLineNumber,\n additionLineNumber,\n hunkIndex,\n lineIndex\n );\n if (annotationSpans != null && pendingSplitSpanSize > 0) {\n flushSplitSpan();\n }\n pushLineWithAnnotation({\n additionLine,\n deletionLine,\n deletionsAST,\n additionsAST,\n ...annotationSpans,\n });\n }\n\n if (noEOFCRDeletion || noEOFCRAddition) {\n const noEOFType =\n type === 'context' || type === 'context-expanded'\n ? 'context'\n : deletionLineIndex != null\n ? 'change-deletion'\n : 'change-addition';\n if (noEOFCRDeletion) {\n if (diffStyle === 'unified') {\n unifiedAST?.push(createNoNewlineElement(noEOFType));\n } else {\n deletionsAST?.push(createNoNewlineElement('change-deletion'));\n if (!noEOFCRAddition) {\n additionsAST?.push(createEmptyRowBuffer(1));\n }\n }\n }\n if (noEOFCRAddition) {\n if (diffStyle === 'unified') {\n unifiedAST?.push(createNoNewlineElement('change-addition'));\n } else {\n additionsAST?.push(createNoNewlineElement('change-addition'));\n if (!noEOFCRDeletion) {\n deletionsAST?.push(createEmptyRowBuffer(1));\n }\n }\n }\n }\n\n if (collapsedAfter > 0) {\n pushSeparators({\n hunkIndex: type === 'context-expanded' ? hunkIndex : hunkIndex + 1,\n collapsedLines: collapsedAfter,\n rangeSize: trailingRangeSize,\n hunkSpecs: undefined,\n isFirstHunk: false,\n isLastHunk: true,\n isExpandable: !fileDiff.isPartial,\n });\n }\n },\n });\n\n if (diffStyle === 'split') {\n flushSplitSpan();\n }\n\n const totalLines = Math.max(\n getTotalLineCountFromHunks(fileDiff.hunks),\n fileDiff.additionLines.length ?? 0,\n fileDiff.deletionLines.length ?? 0\n );\n\n // Some specialized logic to set our AST lists to be undefinable under\n // certain conditions\n // * If the type of change is a full addition or a full deletion, we don't\n // want to show a split view as that creates wasted space\n // * We'll do some further refinement below if necessary with list length,\n // but first we need to inject buffers if we are virtualized before we can\n // do the length check\n additionsAST =\n !unified && fileDiff.type !== 'deleted' ? additionsAST : undefined;\n deletionsAST =\n !unified && fileDiff.type !== 'new' ? deletionsAST : undefined;\n unifiedAST = unified ? unifiedAST : undefined;\n\n if (!disableVirtualizationBuffers) {\n if (renderRange.bufferBefore > 0) {\n const element = createBufferElement('before', renderRange.bufferBefore);\n unifiedAST?.unshift(element);\n deletionsAST?.unshift(element);\n additionsAST?.unshift(element);\n }\n if (renderRange.bufferAfter > 0) {\n const element = createBufferElement('after', renderRange.bufferAfter);\n unifiedAST?.push(element);\n deletionsAST?.push(element);\n additionsAST?.push(element);\n }\n }\n\n // If any of our arrays are empty, lets null them out to optimize rendering\n if (unifiedAST?.length === 0) {\n unifiedAST = undefined;\n }\n if (deletionsAST?.length === 0) {\n deletionsAST = undefined;\n }\n if (additionsAST?.length === 0) {\n additionsAST = undefined;\n }\n\n const preNode = this.createPreElement(\n deletionsAST != null && additionsAST != null,\n totalLines,\n themeStyles,\n baseThemeType\n );\n\n return {\n additionsAST,\n deletionsAST,\n unifiedAST,\n hunkData,\n preNode,\n themeStyles,\n baseThemeType,\n headerElement: !disableFileHeader\n ? this.renderHeader(this.diff, themeStyles, baseThemeType)\n : undefined,\n totalLines,\n // FIXME\n css: '',\n };\n }\n\n renderFullAST(\n result: HunksRenderResult,\n children: ElementContent[] = []\n ): HASTElement {\n if (result.unifiedAST != null) {\n children.push(\n createHastElement({\n tagName: 'code',\n children: result.unifiedAST,\n properties: {\n 'data-code': '',\n 'data-unified': '',\n },\n })\n );\n }\n if (result.deletionsAST != null) {\n children.push(\n createHastElement({\n tagName: 'code',\n children: result.deletionsAST,\n properties: {\n 'data-code': '',\n 'data-deletions': '',\n },\n })\n );\n }\n if (result.additionsAST != null) {\n children.push(\n createHastElement({\n tagName: 'code',\n children: result.additionsAST,\n properties: {\n 'data-code': '',\n 'data-additions': '',\n },\n })\n );\n }\n return { ...result.preNode, children };\n }\n\n renderFullHTML(\n result: HunksRenderResult,\n tempChildren: ElementContent[] = []\n ): string {\n return toHtml(this.renderFullAST(result, tempChildren));\n }\n\n renderPartialHTML(\n children: ElementContent[],\n columnType?: 'unified' | 'deletions' | 'additions'\n ): string {\n if (columnType == null) {\n return toHtml(children);\n }\n return toHtml(\n createHastElement({\n tagName: 'code',\n children,\n properties: {\n 'data-code': '',\n [`data-${columnType}`]: '',\n },\n })\n );\n }\n\n private getAnnotations(\n type: 'unified',\n deletionLineNumber: number | undefined,\n additionLineNumber: number | undefined,\n hunkIndex: number,\n lineIndex: number\n ): AnnotationSpan | undefined;\n private getAnnotations(\n type: 'split',\n deletionLineNumber: number | undefined,\n additionLineNumber: number | undefined,\n hunkIndex: number,\n lineIndex: number\n ): { deletionSpan: AnnotationSpan; additionSpan: AnnotationSpan } | undefined;\n private getAnnotations(\n type: 'unified' | 'split',\n deletionLineNumber: number | undefined,\n additionLineNumber: number | undefined,\n hunkIndex: number,\n lineIndex: number\n ):\n | AnnotationSpan\n | { deletionSpan: AnnotationSpan; additionSpan: AnnotationSpan }\n | undefined {\n const deletionSpan: AnnotationSpan = {\n type: 'annotation',\n hunkIndex,\n lineIndex,\n annotations: [],\n };\n if (deletionLineNumber != null) {\n for (const anno of this.deletionAnnotations[deletionLineNumber] ?? []) {\n deletionSpan.annotations.push(getLineAnnotationName(anno));\n }\n }\n const additionSpan: AnnotationSpan = {\n type: 'annotation',\n hunkIndex,\n lineIndex,\n annotations: [],\n };\n if (additionLineNumber != null) {\n for (const anno of this.additionAnnotations[additionLineNumber] ?? []) {\n (type === 'unified' ? deletionSpan : additionSpan).annotations.push(\n getLineAnnotationName(anno)\n );\n }\n }\n if (type === 'unified') {\n if (deletionSpan.annotations.length > 0) {\n return deletionSpan;\n }\n return undefined;\n }\n if (\n additionSpan.annotations.length === 0 &&\n deletionSpan.annotations.length === 0\n ) {\n return undefined;\n }\n return { deletionSpan, additionSpan };\n }\n\n private renderHeader(\n diff: FileDiffMetadata,\n themeStyles: string,\n baseThemeType: 'light' | 'dark' | undefined\n ): HASTElement {\n const { themeType } = this.getOptionsWithDefaults();\n return createFileHeaderElement({\n fileOrDiff: diff,\n themeStyles,\n themeType: baseThemeType ?? themeType,\n });\n }\n}\n\nfunction areRenderOptionsEqual(\n optionsA: RenderDiffOptions,\n optionsB: RenderDiffOptions\n): boolean {\n return (\n areThemesEqual(optionsA.theme, optionsB.theme) &&\n optionsA.tokenizeMaxLineLength === optionsB.tokenizeMaxLineLength &&\n optionsA.lineDiffType === optionsB.lineDiffType\n );\n}\n\nfunction getModifiedLinesString(lines: number) {\n return `${lines} unmodified line${lines > 1 ? 's' : ''}`;\n}\n\nfunction pushLineWithAnnotation({\n deletionLine,\n additionLine,\n unifiedAST,\n additionsAST,\n deletionsAST,\n unifiedSpan,\n deletionSpan,\n additionSpan,\n}: PushLineWithAnnotation) {\n if (unifiedAST != null) {\n if (deletionLine != null) {\n unifiedAST.push(deletionLine);\n } else if (additionLine != null) {\n unifiedAST.push(additionLine);\n }\n if (unifiedSpan != null) {\n unifiedAST.push(createAnnotationElement(unifiedSpan));\n }\n } else if (deletionsAST != null && additionsAST != null) {\n if (deletionLine != null) {\n deletionsAST.push(deletionLine);\n }\n if (additionLine != null) {\n additionsAST.push(additionLine);\n }\n if (deletionSpan != null) {\n deletionsAST.push(createAnnotationElement(deletionSpan));\n }\n if (additionSpan != null) {\n additionsAST.push(createAnnotationElement(additionSpan));\n }\n }\n}\n\nfunction pushSeparator(\n type: 'additions' | 'deletions' | 'unified',\n {\n hunkIndex,\n collapsedLines,\n rangeSize,\n hunkSpecs,\n isFirstHunk,\n isLastHunk,\n isExpandable,\n }: PushSeparatorProps,\n {\n expansionLineCount,\n hunkSeparators,\n unifiedAST,\n deletionsAST,\n additionsAST,\n hunkData,\n }: PushSeparatorContext\n) {\n if (collapsedLines <= 0) {\n return;\n }\n const linesAST =\n type === 'unified'\n ? unifiedAST\n : type === 'deletions'\n ? deletionsAST\n : additionsAST;\n\n if (hunkSeparators === 'metadata') {\n if (hunkSpecs != null) {\n linesAST.push(\n createSeparator({\n type: 'metadata',\n content: hunkSpecs,\n isFirstHunk,\n isLastHunk,\n })\n );\n }\n return;\n }\n if (hunkSeparators === 'simple') {\n if (hunkIndex > 0) {\n linesAST.push(\n createSeparator({ type: 'simple', isFirstHunk, isLastHunk: false })\n );\n }\n return;\n }\n const slotName = getHunkSeparatorSlotName(type, hunkIndex);\n const chunked = rangeSize > expansionLineCount;\n const expandIndex = isExpandable ? hunkIndex : undefined;\n linesAST.push(\n createSeparator({\n type: hunkSeparators,\n content: getModifiedLinesString(collapsedLines),\n expandIndex,\n chunked,\n slotName,\n isFirstHunk,\n isLastHunk,\n })\n );\n hunkData.push({\n slotName,\n hunkIndex,\n lines: collapsedLines,\n type,\n expandable: isExpandable\n ? { up: !isFirstHunk, down: !isLastHunk, chunked }\n : undefined,\n });\n}\n"],"mappings":"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"}
package/dist/style.js CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region src/style.css
2
- var style_default = "@layer base, theme, unsafe;\n\n@layer base {\n :host {\n --diffs-bg: #fff;\n --diffs-fg: #000;\n --diffs-font-fallback:\n 'SF Mono', Monaco, Consolas, 'Ubuntu Mono', 'Liberation Mono',\n 'Courier New', monospace;\n --diffs-header-font-fallback:\n system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue',\n 'Noto Sans', 'Liberation Sans', Arial, sans-serif;\n\n --diffs-mixer: light-dark(black, white);\n --diffs-gap-fallback: 8px;\n\n /*\n // Available CSS Color Overrides\n --diffs-bg-buffer-override\n --diffs-bg-hover-override\n --diffs-bg-context-override\n --diffs-bg-separator-override\n\n --diffs-fg-number-override\n --diffs-fg-number-addition-override\n --diffs-fg-number-deletion-override\n\n --diffs-deletion-color-override\n --diffs-addition-color-override\n --diffs-modified-color-override\n\n --diffs-bg-deletion-override\n --diffs-bg-deletion-number-override\n --diffs-bg-deletion-hover-override\n --diffs-bg-deletion-emphasis-override\n\n --diffs-bg-addition-override\n --diffs-bg-addition-number-override\n --diffs-bg-addition-hover-override\n --diffs-bg-addition-emphasis-override\n\n // Line Selection Color Overrides (for enableLineSelection)\n --diffs-selection-color-override\n --diffs-bg-selection-override\n --diffs-bg-selection-number-override\n --diffs-bg-selection-background-override\n --diffs-bg-selection-number-background-override\n\n // Available CSS Layout Overrides\n --diffs-gap-inline\n --diffs-gap-block\n --diffs-gap-style\n --diffs-tab-size\n */\n\n color-scheme: light dark;\n display: block;\n font-family: var(\n --diffs-header-font-family,\n var(--diffs-header-font-fallback)\n );\n font-size: var(--diffs-font-size, 13px);\n line-height: var(--diffs-line-height, 20px);\n font-feature-settings: var(--diffs-font-features);\n }\n\n /* NOTE(mdo): Some semantic HTML elements (e.g. `pre`, `code`) have default\n * user-agent styles. These must be overridden to use our custom styles. */\n pre,\n code,\n [data-error-wrapper] {\n isolation: isolate;\n margin: 0;\n padding: 0;\n display: block;\n outline: none;\n font-family: var(--diffs-font-family, var(--diffs-font-fallback));\n }\n\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n [data-icon-sprite] {\n display: none;\n }\n\n /* NOTE(mdo): Headers and separators are within pre/code, so we need to reset\n * their font-family explicitly. */\n [data-diffs-header],\n [data-separator] {\n font-family: var(\n --diffs-header-font-family,\n var(--diffs-header-font-fallback)\n );\n }\n\n [data-file-info] {\n padding: 10px;\n font-weight: 700;\n color: var(--fg);\n /* NOTE(amadeus): we cannot use 'in oklch' because current versions of cursor\n * and vscode use an older build of chrome that appears to have a bug with\n * color-mix and 'in oklch', so use 'in lab' instead */\n background-color: color-mix(in lab, var(--bg) 98%, var(--fg));\n border-block: 1px solid color-mix(in lab, var(--bg) 95%, var(--fg));\n }\n\n [data-diffs-header],\n [data-diffs],\n [data-error-wrapper] {\n --diffs-bg: light-dark(var(--diffs-light-bg), var(--diffs-dark-bg));\n /* NOTE(amadeus): we cannot use 'in oklch' because current versions of cursor\n * and vscode use an older build of chrome that appears to have a bug with\n * color-mix and 'in oklch', so use 'in lab' instead */\n --diffs-bg-buffer: var(\n --diffs-bg-buffer-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer))\n )\n );\n --diffs-bg-hover: var(\n --diffs-bg-hover-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 97%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 91%, var(--diffs-mixer))\n )\n );\n --diffs-bg-context: var(\n --diffs-bg-context-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer))\n )\n );\n --diffs-bg-separator: var(\n --diffs-bg-separator-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer))\n )\n );\n\n --diffs-fg: light-dark(var(--diffs-light), var(--diffs-dark));\n --diffs-fg-number: var(\n --diffs-fg-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)),\n color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg))\n )\n );\n\n --diffs-deletion-base: var(\n --diffs-deletion-color-override,\n light-dark(\n var(\n --diffs-light-deletion-color,\n var(--diffs-deletion-color, rgb(255, 0, 0))\n ),\n var(\n --diffs-dark-deletion-color,\n var(--diffs-deletion-color, rgb(255, 0, 0))\n )\n )\n );\n --diffs-addition-base: var(\n --diffs-addition-color-override,\n light-dark(\n var(\n --diffs-light-addition-color,\n var(--diffs-addition-color, rgb(0, 255, 0))\n ),\n var(\n --diffs-dark-addition-color,\n var(--diffs-addition-color, rgb(0, 255, 0))\n )\n )\n );\n --diffs-modified-base: var(\n --diffs-modified-color-override,\n light-dark(\n var(\n --diffs-light-modified-color,\n var(--diffs-modified-color, rgb(0, 0, 255))\n ),\n var(\n --diffs-dark-modified-color,\n var(--diffs-modified-color, rgb(0, 0, 255))\n )\n )\n );\n\n /* NOTE(amadeus): we cannot use 'in oklch' because current versions of cursor\n * and vscode use an older build of chrome that appears to have a bug with\n * color-mix and 'in oklch', so use 'in lab' instead */\n --diffs-bg-deletion: var(\n --diffs-bg-deletion-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-deletion-base)),\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base))\n )\n );\n --diffs-bg-deletion-number: var(\n --diffs-bg-deletion-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 91%, var(--diffs-deletion-base)),\n color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-deletion-base))\n )\n );\n --diffs-bg-deletion-hover: var(\n --diffs-bg-deletion-hover-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base)),\n color-mix(in lab, var(--diffs-bg) 75%, var(--diffs-deletion-base))\n )\n );\n --diffs-bg-deletion-emphasis: var(\n --diffs-bg-deletion-emphasis-override,\n light-dark(\n rgb(from var(--diffs-deletion-base) r g b / 0.15),\n rgb(from var(--diffs-deletion-base) r g b / 0.2)\n )\n );\n\n --diffs-bg-addition: var(\n --diffs-bg-addition-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-addition-base)),\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base))\n )\n );\n --diffs-bg-addition-number: var(\n --diffs-bg-addition-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 91%, var(--diffs-addition-base)),\n color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-addition-base))\n )\n );\n --diffs-bg-addition-hover: var(\n --diffs-bg-addition-hover-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base)),\n color-mix(in lab, var(--diffs-bg) 70%, var(--diffs-addition-base))\n )\n );\n --diffs-bg-addition-emphasis: var(\n --diffs-bg-addition-emphasis-override,\n light-dark(\n rgb(from var(--diffs-addition-base) r g b / 0.15),\n rgb(from var(--diffs-addition-base) r g b / 0.2)\n )\n );\n\n --diffs-selection-base: var(--diffs-modified-base);\n --diffs-selection-number-fg: light-dark(\n color-mix(in lab, var(--diffs-selection-base) 65%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-selection-base) 75%, var(--diffs-mixer))\n );\n --diffs-bg-selection: var(\n --diffs-bg-selection-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 82%, var(--diffs-selection-base)),\n color-mix(in lab, var(--diffs-bg) 75%, var(--diffs-selection-base))\n )\n );\n --diffs-bg-selection-number: var(\n --diffs-bg-selection-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 75%, var(--diffs-selection-base)),\n color-mix(in lab, var(--diffs-bg) 60%, var(--diffs-selection-base))\n )\n );\n\n background-color: var(--diffs-bg);\n color: var(--diffs-fg);\n }\n\n [data-diffs] {\n /* This feels a bit crazy to me... so I need to think about it a bit more... */\n --diffs-grid-number-column-width: minmax(min-content, max-content);\n --diffs-code-grid: var(--diffs-grid-number-column-width) 1fr;\n\n [data-column-content] span {\n color: light-dark(\n var(--diffs-token-light, var(--diffs-light)),\n var(--diffs-token-dark, var(--diffs-dark))\n );\n font-weight: var(--diffs-token-light-font-weight, inherit);\n font-style: var(--diffs-token-light-font-style, inherit);\n -webkit-text-decoration: var(--diffs-token-light-text-decoration, inherit);\n text-decoration: var(--diffs-token-light-text-decoration, inherit);\n }\n }\n\n /* Since span is a pretty innocuous selector, we need to make sure we don't\n * apply tokenized BG colors to diff-spans */\n [data-column-content] span:not([data-diff-span]) {\n background-color: light-dark(\n var(--diffs-token-light-bg, inherit),\n var(--diffs-token-dark-bg, inherit)\n );\n }\n\n [data-column-content] {\n background-color: var(--diffs-line-bg, 'transparent');\n grid-column: 2 / 3;\n }\n\n [data-diffs][data-dehydrated] {\n --diffs-code-grid: var(--diffs-grid-number-column-width) minmax(0, 1fr);\n }\n\n @media (prefers-color-scheme: dark) {\n [data-diffs-header],\n [data-diffs] {\n color-scheme: dark;\n }\n\n [data-diffs] [data-column-content] span {\n font-weight: var(--diffs-token-dark-font-weight, inherit);\n font-style: var(--diffs-token-dark-font-style, inherit);\n -webkit-text-decoration: var(--diffs-token-dark-text-decoration, inherit);\n text-decoration: var(--diffs-token-dark-text-decoration, inherit);\n }\n }\n\n [data-diffs-header][data-theme-type='light'],\n [data-diffs][data-theme-type='light'] {\n color-scheme: light;\n }\n\n [data-diffs][data-theme-type='light'] [data-column-content] span {\n font-weight: var(--diffs-token-light-font-weight, inherit);\n font-style: var(--diffs-token-light-font-style, inherit);\n -webkit-text-decoration: var(--diffs-token-light-text-decoration, inherit);\n text-decoration: var(--diffs-token-light-text-decoration, inherit);\n }\n\n [data-diffs-header][data-theme-type='dark'],\n [data-diffs][data-theme-type='dark'] {\n color-scheme: dark;\n }\n\n [data-diffs][data-theme-type='dark'] [data-column-content] span {\n font-weight: var(--diffs-token-dark-font-weight, inherit);\n font-style: var(--diffs-token-dark-font-style, inherit);\n -webkit-text-decoration: var(--diffs-token-dark-text-decoration, inherit);\n text-decoration: var(--diffs-token-dark-text-decoration, inherit);\n }\n\n [data-type='split'][data-overflow='wrap'] {\n display: grid;\n grid-auto-flow: dense;\n grid-template-columns: repeat(2, var(--diffs-code-grid));\n }\n\n [data-type='split'][data-overflow='scroll'] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 2px;\n }\n\n [data-code] {\n display: block;\n display: grid;\n grid-auto-flow: dense;\n grid-template-columns: var(--diffs-code-grid);\n overflow: scroll clip;\n overscroll-behavior-x: none;\n tab-size: var(--diffs-tab-size, 2);\n align-self: flex-start;\n padding-top: var(--diffs-gap-block, var(--diffs-gap-fallback));\n padding-bottom: max(\n 0px,\n calc(var(--diffs-gap-block, var(--diffs-gap-fallback)) - 6px)\n );\n }\n\n [data-code]::-webkit-scrollbar {\n width: 0;\n height: 6px;\n }\n\n [data-code]::-webkit-scrollbar-track {\n background: transparent;\n }\n\n [data-code]::-webkit-scrollbar-thumb {\n background-color: transparent;\n border: 1px solid transparent;\n background-clip: content-box;\n border-radius: 3px;\n }\n\n [data-diffs]:hover [data-code]::-webkit-scrollbar-thumb {\n background-color: var(--diffs-bg-context);\n }\n\n [data-code]::-webkit-scrollbar-corner {\n background-color: transparent;\n }\n\n /*\n * If we apply these rules globally it will mean that webkit will opt into the\n * standards compliant version of custom css scrollbars, which we do not want\n * because the custom stuff will look better\n */\n @supports (-moz-appearance: none) {\n [data-code] {\n scrollbar-width: thin;\n scrollbar-color: var(--diffs-bg-context) transparent;\n padding-bottom: var(--diffs-gap-block, var(--diffs-gap-fallback));\n }\n }\n\n [data-diffs][data-type='split'][data-overflow='wrap'] {\n padding-block: var(--diffs-gap-block, var(--diffs-gap-fallback));\n }\n\n [data-diffs-header] ~ [data-diffs] [data-code],\n [data-diffs-header] ~ [data-diffs][data-overflow='wrap'] {\n padding-top: 0;\n }\n\n [data-type='split'][data-overflow='wrap'] [data-code] {\n display: contents;\n }\n\n [data-line-annotation],\n [data-no-newline],\n [data-line] {\n position: relative;\n display: grid;\n grid-template-columns: subgrid;\n grid-column: 1 / 3;\n }\n\n [data-line-annotation][data-selected-line] {\n background-color: unset;\n\n &::before {\n content: '';\n position: sticky;\n top: 0;\n left: 0;\n display: block;\n border-right: var(--diffs-gap-style, 1px solid var(--diffs-bg));\n background-color: var(--diffs-bg-selection-number);\n }\n\n [data-annotation-content] {\n background-color: var(--diffs-bg-selection);\n }\n }\n\n [data-interactive-lines] [data-line] {\n cursor: pointer;\n }\n\n [data-buffer] {\n display: grid;\n grid-column: 1 / 3;\n grid-template-columns: subgrid;\n -webkit-user-select: none;\n user-select: none;\n /* We multiply by 1.414 (√2) to better approximate the diagonal repeat distance */\n background-image: repeating-linear-gradient(\n -45deg,\n transparent,\n transparent calc(3px * 1.414),\n var(--diffs-bg-buffer) calc(3px * 1.414),\n var(--diffs-bg-buffer) calc(4px * 1.414)\n );\n min-height: 1lh;\n /* lol not sure this is worth it… */\n /* position: sticky; */\n /* left: 0; */\n /* width: var(--diffs-column-width, auto); */\n /* background-attachment: fixed; */\n\n &::before,\n &::after {\n content: '';\n display: block;\n }\n\n &::before {\n box-sizing: content-box;\n padding-left: 2ch;\n padding-right: 1ch;\n border-left: 4px solid transparent;\n border-right: 1px solid transparent;\n min-width: var(\n --diffs-min-number-column-width,\n var(--diffs-min-number-column-width-default, 3ch)\n );\n }\n }\n\n [data-separator] {\n grid-column: span 2;\n }\n\n [data-separator='metadata'],\n [data-separator]:empty {\n min-height: 4px;\n background-color: var(--diffs-bg-separator);\n display: grid;\n grid-template-columns: subgrid;\n }\n\n [data-separator-wrapper] {\n -webkit-user-select: none;\n user-select: none;\n fill: currentColor;\n overflow: hidden;\n }\n\n [data-separator='metadata'] [data-separator-wrapper] {\n grid-column: 2 / 3;\n width: var(--diffs-column-content-width);\n position: sticky;\n left: var(--diffs-column-number-width);\n padding: 4px 1ch;\n }\n\n [data-separator='line-info'] {\n margin-block: var(--diffs-gap-block, var(--diffs-gap-fallback));\n }\n\n [data-separator='line-info'][data-separator-first] {\n margin-top: 0;\n }\n\n [data-separator='line-info'][data-separator-last] {\n margin-bottom: 0;\n }\n\n [data-separator='line-info'] [data-separator-wrapper] {\n position: relative;\n display: flex;\n align-items: center;\n gap: 2px;\n width: auto;\n width: calc(var(--diffs-column-width) - var(--diffs-gap-fallback));\n border-radius: 6px;\n }\n\n [data-overflow='scroll']\n [data-separator='line-info']\n [data-separator-wrapper] {\n position: sticky;\n }\n\n @media (pointer: fine) {\n [data-separator-wrapper][data-separator-multi-button] {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n grid-template-rows: 15px 15px;\n\n [data-expand-button] {\n height: 15px;\n }\n }\n\n [data-type='split']\n [data-additions]\n [data-separator-wrapper][data-separator-multi-button] {\n grid-template-columns: minmax(0, 1fr) auto;\n }\n\n [data-type='split'] [data-additions] [data-expand-button] {\n grid-column: 2;\n }\n\n [data-type='split'] [data-additions] [data-separator-content] {\n grid-column: 1;\n }\n }\n\n [data-expand-button],\n [data-separator-content] {\n display: flex;\n align-items: center;\n background-color: var(--diffs-bg-separator);\n }\n\n [data-expand-button] {\n justify-content: center;\n flex-shrink: 0;\n cursor: pointer;\n width: 32px;\n height: 32px;\n opacity: 0.65;\n }\n\n [data-hover-slot] {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n display: flex;\n justify-content: flex-end;\n }\n\n @media (pointer: fine) {\n [data-expand-button]:hover {\n opacity: 1;\n }\n\n /* FIXME(amadeus): We need to figure out how/when to apply hover effects in\n * a more performant way because it'll trigger layout/paint re-calcs\n * probably when we dont want them... */\n [data-line]:hover {\n z-index: 2;\n }\n }\n\n [data-expand-down] [data-icon] {\n transform: scaleY(-1);\n }\n\n [data-separator-content] {\n flex: 1 1 auto;\n padding: 0 1ch;\n height: 32px;\n opacity: 0.65;\n overflow: hidden;\n justify-content: flex-start;\n\n grid-column: 2;\n grid-row: 1 / -1;\n }\n\n [data-unmodified-lines] {\n display: block;\n overflow: hidden;\n min-width: 0;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 0 1 auto;\n }\n\n [data-type='split'] [data-additions] [data-separator-content] {\n justify-content: flex-end;\n }\n\n [data-type='file']\n [data-code]\n [data-separator='line-info']\n [data-separator-wrapper] {\n margin-left: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n margin-right: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n width: calc(\n var(--diffs-column-width) -\n (var(--diffs-gap-inline, var(--diffs-gap-fallback)) * 2)\n );\n }\n\n [data-type='split']\n [data-deletions]\n [data-separator='line-info']\n [data-separator-wrapper] {\n margin-left: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n [data-type='file'][data-overflow='scroll'],\n [data-type='split'][data-overflow='scroll'] {\n [data-deletions] [data-separator='line-info'] [data-separator-wrapper] {\n left: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n }\n }\n\n [data-type='split']\n [data-additions]\n [data-separator='line-info']\n [data-separator-wrapper] {\n margin-right: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n flex-direction: row-reverse;\n }\n\n [data-type='split'][data-overflow='scroll']\n [data-additions]\n [data-separator='line-info']\n [data-separator-wrapper] {\n left: 0;\n }\n\n [data-line] {\n background-color: var(--diffs-bg);\n color: var(--diffs-fg);\n }\n\n [data-type='split'][data-overflow='wrap'] [data-deletions] {\n [data-line-annotation],\n [data-buffer],\n [data-line],\n [data-separator],\n [data-virtualized-buffer],\n [data-no-newline] {\n margin-right: 1px;\n grid-column: 1 / 3;\n }\n }\n\n [data-line-annotation] {\n min-height: var(--diffs-annotation-min-height, 0);\n background-color: var(--diffs-bg-context);\n z-index: 3;\n }\n\n [data-type='split'][data-overflow='wrap'] [data-additions] {\n [data-line-annotation],\n [data-buffer],\n [data-line],\n [data-separator],\n [data-virtualized-buffer],\n [data-no-newline] {\n margin-left: 1px;\n grid-column: 3 / 5;\n }\n }\n\n [data-separator='custom'] {\n display: grid;\n grid-template-columns: subgrid;\n }\n\n [data-column-content],\n [data-column-number] {\n position: relative;\n padding-inline: 1ch;\n }\n\n [data-indicators='classic'] [data-column-content] {\n padding-inline-start: 2ch;\n }\n\n [data-indicators='classic'] {\n [data-line-type='change-addition'] [data-column-content]::before,\n [data-line-type='change-deletion'] [data-column-content]::before {\n display: inline-block;\n width: 1ch;\n height: 1lh;\n position: absolute;\n top: 0;\n left: 0;\n -webkit-user-select: none;\n user-select: none;\n }\n\n [data-line-type='change-addition'] [data-column-content]::before {\n content: '+';\n color: var(--diffs-addition-base);\n }\n\n [data-line-type='change-deletion'] [data-column-content]::before {\n content: '-';\n color: var(--diffs-deletion-base);\n }\n }\n\n [data-indicators='bars'] {\n [data-line-type='change-deletion'],\n [data-line-type='change-addition'] {\n [data-column-number]::before {\n content: '';\n display: block;\n width: 4px;\n height: 100%;\n position: absolute;\n top: 0;\n left: 0;\n -webkit-user-select: none;\n user-select: none;\n contain: strict;\n }\n }\n\n [data-line-type='change-deletion'] [data-column-number]::before {\n background-image: linear-gradient(\n 0deg,\n var(--diffs-bg-deletion) 50%,\n var(--diffs-deletion-base) 50%\n );\n background-repeat: repeat;\n background-size: 2px 2px;\n background-size: calc(1lh / round(1lh / 2px)) calc(1lh / round(1lh / 2px));\n }\n\n [data-line-type='change-addition'] [data-column-number]::before {\n background-color: var(--diffs-addition-base);\n }\n }\n\n [data-overflow='wrap'] [data-column-content],\n [data-overflow='wrap'] [data-annotation-content] {\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n [data-overflow='scroll'] [data-column-content] {\n white-space: pre;\n min-height: 1lh;\n }\n\n [data-column-number] {\n grid-column: 1 / 2;\n box-sizing: content-box;\n text-align: right;\n -webkit-user-select: none;\n user-select: none;\n background-color: var(--diffs-bg);\n color: var(--diffs-fg-number);\n z-index: 1;\n min-width: var(\n --diffs-min-number-column-width,\n var(--diffs-min-number-column-width-default, 3ch)\n );\n padding-left: 2ch;\n border-right: var(--diffs-gap-style, 1px solid var(--diffs-bg));\n }\n\n [data-overflow='scroll'] [data-column-number] {\n position: sticky;\n left: 0;\n }\n\n [data-disable-line-numbers] {\n &[data-indicators='bars'] [data-column-number] {\n min-width: 4px;\n border-right: var(--diffs-gap-style, 1px solid var(--diffs-bg));\n }\n\n [data-column-number],\n [data-buffer]::before {\n min-width: 0;\n padding: 0;\n }\n\n [data-line-number-content] {\n display: none;\n }\n\n [data-hover-slot] {\n right: unset;\n left: 0;\n justify-content: flex-start;\n }\n\n &[data-indicators='bars'] [data-hover-slot] {\n /* Using 5px here because theres a 1px separator after the bar */\n left: 5px;\n }\n }\n\n [data-interactive-line-numbers] [data-column-number] {\n cursor: pointer;\n }\n\n [data-diff-span] {\n border-radius: 3px;\n -webkit-box-decoration-break: clone;\n box-decoration-break: clone;\n }\n\n [data-line-type='change-addition'] {\n [data-column-number] {\n color: var(\n --diffs-fg-number-addition-override,\n var(--diffs-addition-base)\n );\n }\n\n [data-diff-span] {\n background-color: var(--diffs-bg-addition-emphasis);\n }\n }\n\n [data-line-type='change-deletion'] {\n [data-column-number] {\n color: var(\n --diffs-fg-number-deletion-override,\n var(--diffs-deletion-base)\n );\n }\n\n [data-diff-span] {\n background-color: var(--diffs-bg-deletion-emphasis);\n }\n }\n\n [data-background] [data-line-type='change-addition'] {\n --diffs-line-bg: var(--diffs-bg-addition);\n\n [data-column-number] {\n background-color: var(--diffs-bg-addition-number);\n }\n }\n\n [data-background] [data-line-type='change-deletion'] {\n --diffs-line-bg: var(--diffs-bg-deletion);\n\n [data-column-number] {\n background-color: var(--diffs-bg-deletion-number);\n }\n }\n\n [data-line-type='context-expanded'] {\n --diffs-line-bg: var(--diffs-bg-context);\n\n [data-column-number] {\n background-color: var(--diffs-bg-context);\n }\n }\n\n /* By wrapping hovers in a pointer: fine, we ensure that mobile devices don't\n * require a double click */\n @media (pointer: fine) {\n [data-line]:hover:not([data-selected-line]) {\n [data-column-number],\n [data-column-content] {\n background-color: var(--diffs-bg-hover);\n }\n }\n\n [data-background] [data-line]:hover:not([data-selected-line]) {\n &[data-line-type='change-deletion'] [data-column-number],\n &[data-line-type='change-deletion'] [data-column-content] {\n background-color: var(--diffs-bg-deletion-hover);\n }\n\n &[data-line-type='change-addition'] [data-column-number],\n &[data-line-type='change-addition'] [data-column-content] {\n background-color: var(--diffs-bg-addition-hover);\n }\n }\n }\n\n [data-diffs-header] {\n position: relative;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n gap: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n min-height: calc(\n 1lh + (var(--diffs-gap-block, var(--diffs-gap-fallback)) * 3)\n );\n padding-inline: 16px;\n top: 0;\n z-index: 2;\n }\n\n [data-header-content] {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n min-width: 0;\n white-space: nowrap;\n }\n\n [data-header-content] [data-prev-name],\n [data-header-content] [data-title] {\n direction: rtl;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n white-space: nowrap;\n }\n\n [data-prev-name] {\n opacity: 0.7;\n }\n\n [data-rename-icon] {\n fill: currentColor;\n flex-shrink: 0;\n flex-grow: 0;\n }\n\n [data-diffs-header] [data-metadata] {\n display: flex;\n align-items: center;\n gap: 1ch;\n white-space: nowrap;\n }\n\n [data-diffs-header] [data-additions-count] {\n font-family: var(--diffs-font-family, var(--diffs-font-fallback));\n color: var(--diffs-addition-base);\n }\n\n [data-diffs-header] [data-deletions-count] {\n font-family: var(--diffs-font-family, var(--diffs-font-fallback));\n color: var(--diffs-deletion-base);\n }\n\n [data-no-newline] {\n -webkit-user-select: none;\n user-select: none;\n\n [data-column-content] {\n opacity: 0.6;\n }\n }\n\n [data-annotation-content] {\n position: relative;\n grid-column: 2 / -1;\n width: var(--diffs-column-content-width, auto);\n align-self: flex-start;\n z-index: 2;\n height: 100%;\n }\n\n /* Sticky positioning has a composite costs, so we should _only_ pay it if we\n * need to */\n [data-overflow='scroll'] [data-annotation-content] {\n position: sticky;\n left: var(--diffs-column-number-width, 0);\n }\n\n /* Undo some of the stuff that the 'pre' tag does */\n [data-annotation-slot] {\n text-wrap-mode: wrap;\n word-break: normal;\n white-space-collapse: collapse;\n }\n\n [data-change-icon] {\n fill: currentColor;\n flex-shrink: 0;\n }\n\n [data-change-icon='change'],\n [data-change-icon='rename-pure'],\n [data-change-icon='rename-changed'] {\n color: var(--diffs-modified-base);\n }\n\n [data-change-icon='new'] {\n color: var(--diffs-addition-base);\n }\n\n [data-change-icon='deleted'] {\n color: var(--diffs-deletion-base);\n }\n\n [data-change-icon='file'] {\n opacity: 0.6;\n }\n\n /* Line selection highlighting */\n [data-line-type='context'][data-selected-line] {\n [data-column-number] {\n color: var(--diffs-selection-number-fg);\n background-color: var(--diffs-bg-selection-number);\n }\n\n [data-column-content] {\n background-color: var(--diffs-bg-selection);\n }\n }\n\n [data-line-type='context-expanded'],\n [data-line-type='change-addition'],\n [data-line-type='change-deletion'] {\n &[data-selected-line] {\n [data-column-content] {\n background-color: light-dark(\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 82%,\n var(--diffs-selection-base)\n ),\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 75%,\n var(--diffs-selection-base)\n )\n );\n }\n\n [data-column-number] {\n color: var(--diffs-selection-number-fg);\n background-color: light-dark(\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 75%,\n var(--diffs-selection-base)\n ),\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 60%,\n var(--diffs-selection-base)\n )\n );\n }\n }\n }\n\n [data-error-wrapper] {\n overflow: auto;\n padding: var(--diffs-gap-block, var(--diffs-gap-fallback))\n var(--diffs-gap-inline, var(--diffs-gap-fallback));\n max-height: 400px;\n scrollbar-width: none;\n\n [data-error-message] {\n font-weight: bold;\n font-size: 18px;\n color: var(--diffs-deletion-base);\n }\n\n [data-error-stack] {\n color: var(--diffs-fg-number);\n }\n }\n\n [data-virtualized-buffer] {\n /* for blanking debugging purposes */\n /* background-color: red; */\n grid-column: 1 / 3;\n }\n}\n";
2
+ var style_default = "@layer base, theme, unsafe;\n\n@layer base {\n :host {\n --diffs-bg: #fff;\n --diffs-fg: #000;\n --diffs-font-fallback:\n 'SF Mono', Monaco, Consolas, 'Ubuntu Mono', 'Liberation Mono',\n 'Courier New', monospace;\n --diffs-header-font-fallback:\n system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue',\n 'Noto Sans', 'Liberation Sans', Arial, sans-serif;\n\n --diffs-mixer: light-dark(black, white);\n --diffs-gap-fallback: 8px;\n\n /*\n // Available CSS Color Overrides\n --diffs-bg-buffer-override\n --diffs-bg-hover-override\n --diffs-bg-context-override\n --diffs-bg-separator-override\n\n --diffs-fg-number-override\n --diffs-fg-number-addition-override\n --diffs-fg-number-deletion-override\n\n --diffs-deletion-color-override\n --diffs-addition-color-override\n --diffs-modified-color-override\n\n --diffs-bg-deletion-override\n --diffs-bg-deletion-number-override\n --diffs-bg-deletion-hover-override\n --diffs-bg-deletion-emphasis-override\n\n --diffs-bg-addition-override\n --diffs-bg-addition-number-override\n --diffs-bg-addition-hover-override\n --diffs-bg-addition-emphasis-override\n\n // Line Selection Color Overrides (for enableLineSelection)\n --diffs-selection-color-override\n --diffs-bg-selection-override\n --diffs-bg-selection-number-override\n --diffs-bg-selection-background-override\n --diffs-bg-selection-number-background-override\n\n // Available CSS Layout Overrides\n --diffs-gap-inline\n --diffs-gap-block\n --diffs-gap-style\n --diffs-tab-size\n */\n\n color-scheme: light dark;\n display: block;\n font-family: var(\n --diffs-header-font-family,\n var(--diffs-header-font-fallback)\n );\n font-size: var(--diffs-font-size, 13px);\n line-height: var(--diffs-line-height, 20px);\n font-feature-settings: var(--diffs-font-features);\n }\n\n /* NOTE(mdo): Some semantic HTML elements (e.g. `pre`, `code`) have default\n * user-agent styles. These must be overridden to use our custom styles. */\n pre,\n code,\n [data-error-wrapper] {\n isolation: isolate;\n margin: 0;\n padding: 0;\n display: block;\n outline: none;\n font-family: var(--diffs-font-family, var(--diffs-font-fallback));\n }\n\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n [data-icon-sprite] {\n display: none;\n }\n\n /* NOTE(mdo): Headers and separators are within pre/code, so we need to reset\n * their font-family explicitly. */\n [data-diffs-header],\n [data-separator] {\n font-family: var(\n --diffs-header-font-family,\n var(--diffs-header-font-fallback)\n );\n }\n\n [data-file-info] {\n padding: 10px;\n font-weight: 700;\n color: var(--fg);\n /* NOTE(amadeus): we cannot use 'in oklch' because current versions of cursor\n * and vscode use an older build of chrome that appears to have a bug with\n * color-mix and 'in oklch', so use 'in lab' instead */\n background-color: color-mix(in lab, var(--bg) 98%, var(--fg));\n border-block: 1px solid color-mix(in lab, var(--bg) 95%, var(--fg));\n }\n\n [data-diffs-header],\n [data-diffs],\n [data-error-wrapper] {\n --diffs-bg: light-dark(var(--diffs-light-bg), var(--diffs-dark-bg));\n /* NOTE(amadeus): we cannot use 'in oklch' because current versions of cursor\n * and vscode use an older build of chrome that appears to have a bug with\n * color-mix and 'in oklch', so use 'in lab' instead */\n --diffs-bg-buffer: var(\n --diffs-bg-buffer-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer))\n )\n );\n --diffs-bg-hover: var(\n --diffs-bg-hover-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 97%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 91%, var(--diffs-mixer))\n )\n );\n --diffs-bg-context: var(\n --diffs-bg-context-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer))\n )\n );\n --diffs-bg-separator: var(\n --diffs-bg-separator-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer))\n )\n );\n\n --diffs-fg: light-dark(var(--diffs-light), var(--diffs-dark));\n --diffs-fg-number: var(\n --diffs-fg-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)),\n color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg))\n )\n );\n\n --diffs-deletion-base: var(\n --diffs-deletion-color-override,\n light-dark(\n var(\n --diffs-light-deletion-color,\n var(--diffs-deletion-color, rgb(255, 0, 0))\n ),\n var(\n --diffs-dark-deletion-color,\n var(--diffs-deletion-color, rgb(255, 0, 0))\n )\n )\n );\n --diffs-addition-base: var(\n --diffs-addition-color-override,\n light-dark(\n var(\n --diffs-light-addition-color,\n var(--diffs-addition-color, rgb(0, 255, 0))\n ),\n var(\n --diffs-dark-addition-color,\n var(--diffs-addition-color, rgb(0, 255, 0))\n )\n )\n );\n --diffs-modified-base: var(\n --diffs-modified-color-override,\n light-dark(\n var(\n --diffs-light-modified-color,\n var(--diffs-modified-color, rgb(0, 0, 255))\n ),\n var(\n --diffs-dark-modified-color,\n var(--diffs-modified-color, rgb(0, 0, 255))\n )\n )\n );\n\n /* NOTE(amadeus): we cannot use 'in oklch' because current versions of cursor\n * and vscode use an older build of chrome that appears to have a bug with\n * color-mix and 'in oklch', so use 'in lab' instead */\n --diffs-bg-deletion: var(\n --diffs-bg-deletion-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-deletion-base)),\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base))\n )\n );\n --diffs-bg-deletion-number: var(\n --diffs-bg-deletion-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 91%, var(--diffs-deletion-base)),\n color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-deletion-base))\n )\n );\n --diffs-bg-deletion-hover: var(\n --diffs-bg-deletion-hover-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base)),\n color-mix(in lab, var(--diffs-bg) 75%, var(--diffs-deletion-base))\n )\n );\n --diffs-bg-deletion-emphasis: var(\n --diffs-bg-deletion-emphasis-override,\n light-dark(\n rgb(from var(--diffs-deletion-base) r g b / 0.15),\n rgb(from var(--diffs-deletion-base) r g b / 0.2)\n )\n );\n\n --diffs-bg-addition: var(\n --diffs-bg-addition-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-addition-base)),\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base))\n )\n );\n --diffs-bg-addition-number: var(\n --diffs-bg-addition-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 91%, var(--diffs-addition-base)),\n color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-addition-base))\n )\n );\n --diffs-bg-addition-hover: var(\n --diffs-bg-addition-hover-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base)),\n color-mix(in lab, var(--diffs-bg) 70%, var(--diffs-addition-base))\n )\n );\n --diffs-bg-addition-emphasis: var(\n --diffs-bg-addition-emphasis-override,\n light-dark(\n rgb(from var(--diffs-addition-base) r g b / 0.15),\n rgb(from var(--diffs-addition-base) r g b / 0.2)\n )\n );\n\n --diffs-selection-base: var(--diffs-modified-base);\n --diffs-selection-number-fg: light-dark(\n color-mix(in lab, var(--diffs-selection-base) 65%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-selection-base) 75%, var(--diffs-mixer))\n );\n --diffs-bg-selection: var(\n --diffs-bg-selection-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 82%, var(--diffs-selection-base)),\n color-mix(in lab, var(--diffs-bg) 75%, var(--diffs-selection-base))\n )\n );\n --diffs-bg-selection-number: var(\n --diffs-bg-selection-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 75%, var(--diffs-selection-base)),\n color-mix(in lab, var(--diffs-bg) 60%, var(--diffs-selection-base))\n )\n );\n\n background-color: var(--diffs-bg);\n color: var(--diffs-fg);\n }\n\n [data-diffs] {\n /* This feels a bit crazy to me... so I need to think about it a bit more... */\n --diffs-grid-number-column-width: minmax(min-content, max-content);\n --diffs-code-grid: var(--diffs-grid-number-column-width) 1fr;\n\n [data-column-content] span {\n color: light-dark(\n var(--diffs-token-light, var(--diffs-light)),\n var(--diffs-token-dark, var(--diffs-dark))\n );\n font-weight: var(--diffs-token-light-font-weight, inherit);\n font-style: var(--diffs-token-light-font-style, inherit);\n -webkit-text-decoration: var(--diffs-token-light-text-decoration, inherit);\n text-decoration: var(--diffs-token-light-text-decoration, inherit);\n }\n }\n\n /* Since span is a pretty innocuous selector, we need to make sure we don't\n * apply tokenized BG colors to diff-spans */\n [data-column-content] span:not([data-diff-span]) {\n background-color: light-dark(\n var(--diffs-token-light-bg, inherit),\n var(--diffs-token-dark-bg, inherit)\n );\n }\n\n [data-column-content] {\n background-color: var(--diffs-line-bg, 'transparent');\n grid-column: 2 / 3;\n }\n\n [data-diffs][data-dehydrated] {\n --diffs-code-grid: var(--diffs-grid-number-column-width) minmax(0, 1fr);\n }\n\n @media (prefers-color-scheme: dark) {\n [data-diffs-header],\n [data-diffs] {\n color-scheme: dark;\n }\n\n [data-diffs] [data-column-content] span {\n font-weight: var(--diffs-token-dark-font-weight, inherit);\n font-style: var(--diffs-token-dark-font-style, inherit);\n -webkit-text-decoration: var(--diffs-token-dark-text-decoration, inherit);\n text-decoration: var(--diffs-token-dark-text-decoration, inherit);\n }\n }\n\n [data-diffs-header][data-theme-type='light'],\n [data-diffs][data-theme-type='light'] {\n color-scheme: light;\n }\n\n [data-diffs][data-theme-type='light'] [data-column-content] span {\n font-weight: var(--diffs-token-light-font-weight, inherit);\n font-style: var(--diffs-token-light-font-style, inherit);\n -webkit-text-decoration: var(--diffs-token-light-text-decoration, inherit);\n text-decoration: var(--diffs-token-light-text-decoration, inherit);\n }\n\n [data-diffs-header][data-theme-type='dark'],\n [data-diffs][data-theme-type='dark'] {\n color-scheme: dark;\n }\n\n [data-diffs][data-theme-type='dark'] [data-column-content] span {\n font-weight: var(--diffs-token-dark-font-weight, inherit);\n font-style: var(--diffs-token-dark-font-style, inherit);\n -webkit-text-decoration: var(--diffs-token-dark-text-decoration, inherit);\n text-decoration: var(--diffs-token-dark-text-decoration, inherit);\n }\n\n [data-type='split'][data-overflow='wrap'] {\n display: grid;\n grid-auto-flow: dense;\n grid-template-columns: repeat(2, var(--diffs-code-grid));\n }\n\n [data-type='split'][data-overflow='scroll'] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 2px;\n }\n\n [data-code] {\n display: block;\n display: grid;\n grid-auto-flow: dense;\n grid-template-columns: var(--diffs-code-grid);\n overflow: scroll clip;\n overscroll-behavior-x: none;\n tab-size: var(--diffs-tab-size, 2);\n align-self: flex-start;\n padding-top: var(--diffs-gap-block, var(--diffs-gap-fallback));\n padding-bottom: max(\n 0px,\n calc(var(--diffs-gap-block, var(--diffs-gap-fallback)) - 6px)\n );\n }\n\n [data-code]::-webkit-scrollbar {\n width: 0;\n height: 6px;\n }\n\n [data-code]::-webkit-scrollbar-track {\n background: transparent;\n }\n\n [data-code]::-webkit-scrollbar-thumb {\n background-color: transparent;\n border: 1px solid transparent;\n background-clip: content-box;\n border-radius: 3px;\n }\n\n [data-diffs]:hover [data-code]::-webkit-scrollbar-thumb {\n background-color: var(--diffs-bg-context);\n }\n\n [data-code]::-webkit-scrollbar-corner {\n background-color: transparent;\n }\n\n /*\n * If we apply these rules globally it will mean that webkit will opt into the\n * standards compliant version of custom css scrollbars, which we do not want\n * because the custom stuff will look better\n */\n @supports (-moz-appearance: none) {\n [data-code] {\n scrollbar-width: thin;\n scrollbar-color: var(--diffs-bg-context) transparent;\n padding-bottom: var(--diffs-gap-block, var(--diffs-gap-fallback));\n }\n }\n\n [data-diffs][data-type='split'][data-overflow='wrap'] {\n padding-block: var(--diffs-gap-block, var(--diffs-gap-fallback));\n }\n\n [data-diffs-header] ~ [data-diffs] [data-code],\n [data-diffs-header] ~ [data-diffs][data-overflow='wrap'] {\n padding-top: 0;\n }\n\n [data-type='split'][data-overflow='wrap'] [data-code] {\n display: contents;\n }\n\n [data-line-annotation],\n [data-no-newline],\n [data-line] {\n position: relative;\n display: grid;\n grid-template-columns: subgrid;\n grid-column: 1 / 3;\n }\n\n [data-line-annotation][data-selected-line] {\n background-color: unset;\n\n &::before {\n content: '';\n position: sticky;\n top: 0;\n left: 0;\n display: block;\n border-right: var(--diffs-gap-style, 1px solid var(--diffs-bg));\n background-color: var(--diffs-bg-selection-number);\n }\n\n [data-annotation-content] {\n background-color: var(--diffs-bg-selection);\n }\n }\n\n [data-interactive-lines] [data-line] {\n cursor: pointer;\n }\n\n [data-buffer] {\n display: grid;\n grid-column: 1 / 3;\n grid-template-columns: subgrid;\n -webkit-user-select: none;\n user-select: none;\n /* We multiply by 1.414 (√2) to better approximate the diagonal repeat distance */\n background-image: repeating-linear-gradient(\n -45deg,\n transparent,\n transparent calc(3px * 1.414),\n var(--diffs-bg-buffer) calc(3px * 1.414),\n var(--diffs-bg-buffer) calc(4px * 1.414)\n );\n min-height: 1lh;\n /* lol not sure this is worth it… */\n /* position: sticky; */\n /* left: 0; */\n /* width: var(--diffs-column-width, auto); */\n /* background-attachment: fixed; */\n\n &::before,\n &::after {\n content: '';\n display: block;\n }\n\n &::before {\n box-sizing: content-box;\n padding-left: 2ch;\n padding-right: 1ch;\n border-left: 4px solid transparent;\n border-right: 1px solid transparent;\n min-width: var(\n --diffs-min-number-column-width,\n var(--diffs-min-number-column-width-default, 3ch)\n );\n }\n }\n\n [data-separator] {\n grid-column: span 2;\n }\n\n [data-separator='metadata'],\n [data-separator]:empty {\n min-height: 4px;\n background-color: var(--diffs-bg-separator);\n display: grid;\n grid-template-columns: subgrid;\n }\n\n [data-separator-wrapper] {\n -webkit-user-select: none;\n user-select: none;\n fill: currentColor;\n overflow: hidden;\n }\n\n [data-separator='metadata'] [data-separator-wrapper] {\n grid-column: 2 / 3;\n width: var(--diffs-column-content-width);\n position: sticky;\n left: var(--diffs-column-number-width);\n padding: 4px 1ch;\n }\n\n [data-separator='line-info'] {\n margin-block: var(--diffs-gap-block, var(--diffs-gap-fallback));\n }\n\n [data-separator='line-info'][data-separator-first] {\n margin-top: 0;\n }\n\n [data-separator='line-info'][data-separator-last] {\n margin-bottom: 0;\n }\n\n [data-separator='line-info'] [data-separator-wrapper] {\n position: relative;\n display: flex;\n align-items: center;\n gap: 2px;\n width: auto;\n width: calc(var(--diffs-column-width) - var(--diffs-gap-fallback));\n border-radius: 6px;\n }\n\n [data-overflow='scroll']\n [data-separator='line-info']\n [data-separator-wrapper] {\n position: sticky;\n }\n\n @media (pointer: fine) {\n [data-separator-wrapper][data-separator-multi-button] {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n grid-template-rows: 15px 15px;\n\n [data-expand-button] {\n height: 15px;\n }\n }\n\n [data-type='split']\n [data-additions]\n [data-separator-wrapper][data-separator-multi-button] {\n grid-template-columns: minmax(0, 1fr) auto;\n }\n\n [data-type='split'] [data-additions] [data-expand-button] {\n grid-column: 2;\n }\n\n [data-type='split'] [data-additions] [data-separator-content] {\n grid-column: 1;\n }\n }\n\n [data-expand-button],\n [data-separator-content] {\n display: flex;\n align-items: center;\n background-color: var(--diffs-bg-separator);\n }\n\n [data-expand-button] {\n justify-content: center;\n flex-shrink: 0;\n cursor: pointer;\n width: 32px;\n height: 32px;\n opacity: 0.65;\n }\n\n [data-hover-slot] {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n display: flex;\n justify-content: flex-end;\n }\n\n @media (pointer: fine) {\n [data-expand-button]:hover {\n opacity: 1;\n }\n\n /* FIXME(amadeus): We need to figure out how/when to apply hover effects in\n * a more performant way because it'll trigger layout/paint re-calcs\n * probably when we dont want them... */\n [data-line]:hover {\n z-index: 2;\n }\n }\n\n [data-expand-down] [data-icon] {\n transform: scaleY(-1);\n }\n\n [data-separator-content] {\n flex: 1 1 auto;\n padding: 0 1ch;\n height: 32px;\n opacity: 0.65;\n overflow: hidden;\n justify-content: flex-start;\n\n grid-column: 2;\n grid-row: 1 / -1;\n }\n\n [data-unmodified-lines] {\n display: block;\n overflow: hidden;\n min-width: 0;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 0 1 auto;\n }\n\n [data-type='split'] [data-additions] [data-separator-content] {\n justify-content: flex-end;\n }\n\n [data-type='file']\n [data-code]\n [data-separator='line-info']\n [data-separator-wrapper] {\n margin-left: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n margin-right: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n width: calc(\n var(--diffs-column-width) -\n (var(--diffs-gap-inline, var(--diffs-gap-fallback)) * 2)\n );\n }\n\n [data-type='split']\n [data-deletions]\n [data-separator='line-info']\n [data-separator-wrapper] {\n margin-left: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n [data-type='file'][data-overflow='scroll'],\n [data-type='split'][data-overflow='scroll'] {\n [data-deletions] [data-separator='line-info'] [data-separator-wrapper] {\n left: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n }\n }\n\n [data-type='split']\n [data-additions]\n [data-separator='line-info']\n [data-separator-wrapper] {\n margin-right: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n flex-direction: row-reverse;\n }\n\n [data-type='split'][data-overflow='scroll']\n [data-additions]\n [data-separator='line-info']\n [data-separator-wrapper] {\n left: 0;\n }\n\n [data-line] {\n background-color: var(--diffs-bg);\n color: var(--diffs-fg);\n }\n\n [data-type='split'][data-overflow='wrap'] [data-deletions] {\n [data-line-annotation],\n [data-buffer],\n [data-line],\n [data-separator],\n [data-virtualized-buffer],\n [data-no-newline] {\n margin-right: 1px;\n grid-column: 1 / 3;\n }\n }\n\n [data-line-annotation] {\n min-height: var(--diffs-annotation-min-height, 0);\n background-color: var(--diffs-bg-context);\n z-index: 3;\n }\n\n [data-type='split'][data-overflow='wrap'] [data-additions] {\n [data-line-annotation],\n [data-buffer],\n [data-line],\n [data-separator],\n [data-virtualized-buffer],\n [data-no-newline] {\n margin-left: 1px;\n grid-column: 3 / 5;\n }\n }\n\n [data-separator='custom'] {\n display: grid;\n grid-template-columns: subgrid;\n }\n\n [data-column-content],\n [data-column-number] {\n position: relative;\n padding-inline: 1ch;\n }\n\n [data-indicators='classic'] [data-column-content] {\n padding-inline-start: 2ch;\n }\n\n [data-indicators='classic'] {\n [data-line-type='change-addition'] [data-column-content]::before,\n [data-line-type='change-deletion'] [data-column-content]::before {\n display: inline-block;\n width: 1ch;\n height: 1lh;\n position: absolute;\n top: 0;\n left: 0;\n -webkit-user-select: none;\n user-select: none;\n }\n\n [data-line-type='change-addition'] [data-column-content]::before {\n content: '+';\n color: var(--diffs-addition-base);\n }\n\n [data-line-type='change-deletion'] [data-column-content]::before {\n content: '-';\n color: var(--diffs-deletion-base);\n }\n }\n\n [data-indicators='bars'] {\n [data-line-type='change-deletion'],\n [data-line-type='change-addition'] {\n [data-column-number]::before {\n content: '';\n display: block;\n width: 4px;\n height: 100%;\n position: absolute;\n top: 0;\n left: 0;\n -webkit-user-select: none;\n user-select: none;\n contain: strict;\n }\n }\n\n [data-line-type='change-deletion'] [data-column-number]::before {\n background-image: linear-gradient(\n 0deg,\n var(--diffs-bg-deletion) 50%,\n var(--diffs-deletion-base) 50%\n );\n background-repeat: repeat;\n background-size: 2px 2px;\n background-size: calc(1lh / round(1lh / 2px)) calc(1lh / round(1lh / 2px));\n }\n\n [data-line-type='change-addition'] [data-column-number]::before {\n background-color: var(--diffs-addition-base);\n }\n }\n\n [data-overflow='wrap'] [data-column-content],\n [data-overflow='wrap'] [data-annotation-content] {\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n [data-overflow='scroll'] [data-column-content] {\n white-space: pre;\n min-height: 1lh;\n }\n\n [data-column-number] {\n grid-column: 1 / 2;\n box-sizing: content-box;\n text-align: right;\n -webkit-user-select: none;\n user-select: none;\n background-color: var(--diffs-bg);\n color: var(--diffs-fg-number);\n z-index: 1;\n min-width: var(\n --diffs-min-number-column-width,\n var(--diffs-min-number-column-width-default, 3ch)\n );\n padding-left: 2ch;\n border-right: var(--diffs-gap-style, 1px solid var(--diffs-bg));\n }\n\n [data-overflow='scroll'] [data-column-number] {\n position: sticky;\n left: 0;\n }\n\n [data-disable-line-numbers] {\n &[data-indicators='bars'] [data-column-number] {\n min-width: 4px;\n border-right: var(--diffs-gap-style, 1px solid var(--diffs-bg));\n }\n\n [data-column-number],\n [data-buffer]::before {\n min-width: 0;\n padding: 0;\n }\n\n [data-line-number-content] {\n display: none;\n }\n\n [data-hover-slot] {\n right: unset;\n left: 0;\n justify-content: flex-start;\n }\n\n &[data-indicators='bars'] [data-hover-slot] {\n /* Using 5px here because theres a 1px separator after the bar */\n left: 5px;\n }\n }\n\n [data-interactive-line-numbers] [data-column-number] {\n cursor: pointer;\n }\n\n [data-diff-span] {\n border-radius: 3px;\n -webkit-box-decoration-break: clone;\n box-decoration-break: clone;\n }\n\n [data-line-type='change-addition'] {\n [data-column-number] {\n color: var(\n --diffs-fg-number-addition-override,\n var(--diffs-addition-base)\n );\n }\n\n [data-diff-span] {\n background-color: var(--diffs-bg-addition-emphasis);\n }\n }\n\n [data-line-type='change-deletion'] {\n [data-column-number] {\n color: var(\n --diffs-fg-number-deletion-override,\n var(--diffs-deletion-base)\n );\n }\n\n [data-diff-span] {\n background-color: var(--diffs-bg-deletion-emphasis);\n }\n }\n\n [data-background] [data-line-type='change-addition'] {\n --diffs-line-bg: var(--diffs-bg-addition);\n\n [data-column-number] {\n background-color: var(--diffs-bg-addition-number);\n }\n }\n\n [data-background] [data-line-type='change-deletion'] {\n --diffs-line-bg: var(--diffs-bg-deletion);\n\n [data-column-number] {\n background-color: var(--diffs-bg-deletion-number);\n }\n }\n\n /* By wrapping hovers in a pointer: fine, we ensure that mobile devices don't\n * require a double click */\n @media (pointer: fine) {\n [data-line]:hover:not([data-selected-line]) {\n [data-column-number],\n [data-column-content] {\n background-color: var(--diffs-bg-hover);\n }\n }\n\n [data-background] [data-line]:hover:not([data-selected-line]) {\n &[data-line-type='change-deletion'] [data-column-number],\n &[data-line-type='change-deletion'] [data-column-content] {\n background-color: var(--diffs-bg-deletion-hover);\n }\n\n &[data-line-type='change-addition'] [data-column-number],\n &[data-line-type='change-addition'] [data-column-content] {\n background-color: var(--diffs-bg-addition-hover);\n }\n }\n }\n\n [data-diffs-header] {\n position: relative;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n gap: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n min-height: calc(\n 1lh + (var(--diffs-gap-block, var(--diffs-gap-fallback)) * 3)\n );\n padding-inline: 16px;\n top: 0;\n z-index: 2;\n }\n\n [data-header-content] {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n min-width: 0;\n white-space: nowrap;\n }\n\n [data-header-content] [data-prev-name],\n [data-header-content] [data-title] {\n direction: rtl;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n white-space: nowrap;\n }\n\n [data-prev-name] {\n opacity: 0.7;\n }\n\n [data-rename-icon] {\n fill: currentColor;\n flex-shrink: 0;\n flex-grow: 0;\n }\n\n [data-diffs-header] [data-metadata] {\n display: flex;\n align-items: center;\n gap: 1ch;\n white-space: nowrap;\n }\n\n [data-diffs-header] [data-additions-count] {\n font-family: var(--diffs-font-family, var(--diffs-font-fallback));\n color: var(--diffs-addition-base);\n }\n\n [data-diffs-header] [data-deletions-count] {\n font-family: var(--diffs-font-family, var(--diffs-font-fallback));\n color: var(--diffs-deletion-base);\n }\n\n [data-no-newline] {\n -webkit-user-select: none;\n user-select: none;\n\n [data-column-content] {\n opacity: 0.6;\n }\n }\n\n [data-annotation-content] {\n position: relative;\n grid-column: 2 / -1;\n width: var(--diffs-column-content-width, auto);\n align-self: flex-start;\n z-index: 2;\n height: 100%;\n }\n\n /* Sticky positioning has a composite costs, so we should _only_ pay it if we\n * need to */\n [data-overflow='scroll'] [data-annotation-content] {\n position: sticky;\n left: var(--diffs-column-number-width, 0);\n }\n\n /* Undo some of the stuff that the 'pre' tag does */\n [data-annotation-slot] {\n text-wrap-mode: wrap;\n word-break: normal;\n white-space-collapse: collapse;\n }\n\n [data-change-icon] {\n fill: currentColor;\n flex-shrink: 0;\n }\n\n [data-change-icon='change'],\n [data-change-icon='rename-pure'],\n [data-change-icon='rename-changed'] {\n color: var(--diffs-modified-base);\n }\n\n [data-change-icon='new'] {\n color: var(--diffs-addition-base);\n }\n\n [data-change-icon='deleted'] {\n color: var(--diffs-deletion-base);\n }\n\n [data-change-icon='file'] {\n opacity: 0.6;\n }\n\n /* Line selection highlighting */\n [data-line-type='context'][data-selected-line] {\n [data-column-number] {\n color: var(--diffs-selection-number-fg);\n background-color: var(--diffs-bg-selection-number);\n }\n\n [data-column-content] {\n background-color: var(--diffs-bg-selection);\n }\n }\n\n [data-line-type='change-addition'],\n [data-line-type='change-deletion'] {\n &[data-selected-line] {\n [data-column-content] {\n background-color: light-dark(\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 82%,\n var(--diffs-selection-base)\n ),\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 75%,\n var(--diffs-selection-base)\n )\n );\n }\n\n [data-column-number] {\n color: var(--diffs-selection-number-fg);\n background-color: light-dark(\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 75%,\n var(--diffs-selection-base)\n ),\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 60%,\n var(--diffs-selection-base)\n )\n );\n }\n }\n }\n\n [data-error-wrapper] {\n overflow: auto;\n padding: var(--diffs-gap-block, var(--diffs-gap-fallback))\n var(--diffs-gap-inline, var(--diffs-gap-fallback));\n max-height: 400px;\n scrollbar-width: none;\n\n [data-error-message] {\n font-weight: bold;\n font-size: 18px;\n color: var(--diffs-deletion-base);\n }\n\n [data-error-stack] {\n color: var(--diffs-fg-number);\n }\n }\n\n [data-virtualized-buffer] {\n /* for blanking debugging purposes */\n /* background-color: red; */\n grid-column: 1 / 3;\n }\n}\n";
3
3
 
4
4
  //#endregion
5
5
  export { style_default as default };
package/dist/style.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"style.js","names":[],"sources":["../src/style.css"],"sourcesContent":["@layer base, theme, unsafe;\n\n@layer base {\n :host {\n --diffs-bg: #fff;\n --diffs-fg: #000;\n --diffs-font-fallback:\n 'SF Mono', Monaco, Consolas, 'Ubuntu Mono', 'Liberation Mono',\n 'Courier New', monospace;\n --diffs-header-font-fallback:\n system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue',\n 'Noto Sans', 'Liberation Sans', Arial, sans-serif;\n\n --diffs-mixer: light-dark(black, white);\n --diffs-gap-fallback: 8px;\n\n /*\n // Available CSS Color Overrides\n --diffs-bg-buffer-override\n --diffs-bg-hover-override\n --diffs-bg-context-override\n --diffs-bg-separator-override\n\n --diffs-fg-number-override\n --diffs-fg-number-addition-override\n --diffs-fg-number-deletion-override\n\n --diffs-deletion-color-override\n --diffs-addition-color-override\n --diffs-modified-color-override\n\n --diffs-bg-deletion-override\n --diffs-bg-deletion-number-override\n --diffs-bg-deletion-hover-override\n --diffs-bg-deletion-emphasis-override\n\n --diffs-bg-addition-override\n --diffs-bg-addition-number-override\n --diffs-bg-addition-hover-override\n --diffs-bg-addition-emphasis-override\n\n // Line Selection Color Overrides (for enableLineSelection)\n --diffs-selection-color-override\n --diffs-bg-selection-override\n --diffs-bg-selection-number-override\n --diffs-bg-selection-background-override\n --diffs-bg-selection-number-background-override\n\n // Available CSS Layout Overrides\n --diffs-gap-inline\n --diffs-gap-block\n --diffs-gap-style\n --diffs-tab-size\n */\n\n color-scheme: light dark;\n display: block;\n font-family: var(\n --diffs-header-font-family,\n var(--diffs-header-font-fallback)\n );\n font-size: var(--diffs-font-size, 13px);\n line-height: var(--diffs-line-height, 20px);\n font-feature-settings: var(--diffs-font-features);\n }\n\n /* NOTE(mdo): Some semantic HTML elements (e.g. `pre`, `code`) have default\n * user-agent styles. These must be overridden to use our custom styles. */\n pre,\n code,\n [data-error-wrapper] {\n isolation: isolate;\n margin: 0;\n padding: 0;\n display: block;\n outline: none;\n font-family: var(--diffs-font-family, var(--diffs-font-fallback));\n }\n\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n [data-icon-sprite] {\n display: none;\n }\n\n /* NOTE(mdo): Headers and separators are within pre/code, so we need to reset\n * their font-family explicitly. */\n [data-diffs-header],\n [data-separator] {\n font-family: var(\n --diffs-header-font-family,\n var(--diffs-header-font-fallback)\n );\n }\n\n [data-file-info] {\n padding: 10px;\n font-weight: 700;\n color: var(--fg);\n /* NOTE(amadeus): we cannot use 'in oklch' because current versions of cursor\n * and vscode use an older build of chrome that appears to have a bug with\n * color-mix and 'in oklch', so use 'in lab' instead */\n background-color: color-mix(in lab, var(--bg) 98%, var(--fg));\n border-block: 1px solid color-mix(in lab, var(--bg) 95%, var(--fg));\n }\n\n [data-diffs-header],\n [data-diffs],\n [data-error-wrapper] {\n --diffs-bg: light-dark(var(--diffs-light-bg), var(--diffs-dark-bg));\n /* NOTE(amadeus): we cannot use 'in oklch' because current versions of cursor\n * and vscode use an older build of chrome that appears to have a bug with\n * color-mix and 'in oklch', so use 'in lab' instead */\n --diffs-bg-buffer: var(\n --diffs-bg-buffer-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer))\n )\n );\n --diffs-bg-hover: var(\n --diffs-bg-hover-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 97%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 91%, var(--diffs-mixer))\n )\n );\n --diffs-bg-context: var(\n --diffs-bg-context-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer))\n )\n );\n --diffs-bg-separator: var(\n --diffs-bg-separator-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer))\n )\n );\n\n --diffs-fg: light-dark(var(--diffs-light), var(--diffs-dark));\n --diffs-fg-number: var(\n --diffs-fg-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)),\n color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg))\n )\n );\n\n --diffs-deletion-base: var(\n --diffs-deletion-color-override,\n light-dark(\n var(\n --diffs-light-deletion-color,\n var(--diffs-deletion-color, rgb(255, 0, 0))\n ),\n var(\n --diffs-dark-deletion-color,\n var(--diffs-deletion-color, rgb(255, 0, 0))\n )\n )\n );\n --diffs-addition-base: var(\n --diffs-addition-color-override,\n light-dark(\n var(\n --diffs-light-addition-color,\n var(--diffs-addition-color, rgb(0, 255, 0))\n ),\n var(\n --diffs-dark-addition-color,\n var(--diffs-addition-color, rgb(0, 255, 0))\n )\n )\n );\n --diffs-modified-base: var(\n --diffs-modified-color-override,\n light-dark(\n var(\n --diffs-light-modified-color,\n var(--diffs-modified-color, rgb(0, 0, 255))\n ),\n var(\n --diffs-dark-modified-color,\n var(--diffs-modified-color, rgb(0, 0, 255))\n )\n )\n );\n\n /* NOTE(amadeus): we cannot use 'in oklch' because current versions of cursor\n * and vscode use an older build of chrome that appears to have a bug with\n * color-mix and 'in oklch', so use 'in lab' instead */\n --diffs-bg-deletion: var(\n --diffs-bg-deletion-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-deletion-base)),\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base))\n )\n );\n --diffs-bg-deletion-number: var(\n --diffs-bg-deletion-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 91%, var(--diffs-deletion-base)),\n color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-deletion-base))\n )\n );\n --diffs-bg-deletion-hover: var(\n --diffs-bg-deletion-hover-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base)),\n color-mix(in lab, var(--diffs-bg) 75%, var(--diffs-deletion-base))\n )\n );\n --diffs-bg-deletion-emphasis: var(\n --diffs-bg-deletion-emphasis-override,\n light-dark(\n rgb(from var(--diffs-deletion-base) r g b / 0.15),\n rgb(from var(--diffs-deletion-base) r g b / 0.2)\n )\n );\n\n --diffs-bg-addition: var(\n --diffs-bg-addition-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-addition-base)),\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base))\n )\n );\n --diffs-bg-addition-number: var(\n --diffs-bg-addition-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 91%, var(--diffs-addition-base)),\n color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-addition-base))\n )\n );\n --diffs-bg-addition-hover: var(\n --diffs-bg-addition-hover-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base)),\n color-mix(in lab, var(--diffs-bg) 70%, var(--diffs-addition-base))\n )\n );\n --diffs-bg-addition-emphasis: var(\n --diffs-bg-addition-emphasis-override,\n light-dark(\n rgb(from var(--diffs-addition-base) r g b / 0.15),\n rgb(from var(--diffs-addition-base) r g b / 0.2)\n )\n );\n\n --diffs-selection-base: var(--diffs-modified-base);\n --diffs-selection-number-fg: light-dark(\n color-mix(in lab, var(--diffs-selection-base) 65%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-selection-base) 75%, var(--diffs-mixer))\n );\n --diffs-bg-selection: var(\n --diffs-bg-selection-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 82%, var(--diffs-selection-base)),\n color-mix(in lab, var(--diffs-bg) 75%, var(--diffs-selection-base))\n )\n );\n --diffs-bg-selection-number: var(\n --diffs-bg-selection-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 75%, var(--diffs-selection-base)),\n color-mix(in lab, var(--diffs-bg) 60%, var(--diffs-selection-base))\n )\n );\n\n background-color: var(--diffs-bg);\n color: var(--diffs-fg);\n }\n\n [data-diffs] {\n /* This feels a bit crazy to me... so I need to think about it a bit more... */\n --diffs-grid-number-column-width: minmax(min-content, max-content);\n --diffs-code-grid: var(--diffs-grid-number-column-width) 1fr;\n\n [data-column-content] span {\n color: light-dark(\n var(--diffs-token-light, var(--diffs-light)),\n var(--diffs-token-dark, var(--diffs-dark))\n );\n font-weight: var(--diffs-token-light-font-weight, inherit);\n font-style: var(--diffs-token-light-font-style, inherit);\n text-decoration: var(--diffs-token-light-text-decoration, inherit);\n }\n }\n\n /* Since span is a pretty innocuous selector, we need to make sure we don't\n * apply tokenized BG colors to diff-spans */\n [data-column-content] span:not([data-diff-span]) {\n background-color: light-dark(\n var(--diffs-token-light-bg, inherit),\n var(--diffs-token-dark-bg, inherit)\n );\n }\n\n [data-column-content] {\n background-color: var(--diffs-line-bg, 'transparent');\n grid-column: 2 / 3;\n }\n\n [data-diffs][data-dehydrated] {\n --diffs-code-grid: var(--diffs-grid-number-column-width) minmax(0, 1fr);\n }\n\n @media (prefers-color-scheme: dark) {\n [data-diffs-header],\n [data-diffs] {\n color-scheme: dark;\n }\n\n [data-diffs] [data-column-content] span {\n font-weight: var(--diffs-token-dark-font-weight, inherit);\n font-style: var(--diffs-token-dark-font-style, inherit);\n text-decoration: var(--diffs-token-dark-text-decoration, inherit);\n }\n }\n\n [data-diffs-header][data-theme-type='light'],\n [data-diffs][data-theme-type='light'] {\n color-scheme: light;\n }\n\n [data-diffs][data-theme-type='light'] [data-column-content] span {\n font-weight: var(--diffs-token-light-font-weight, inherit);\n font-style: var(--diffs-token-light-font-style, inherit);\n text-decoration: var(--diffs-token-light-text-decoration, inherit);\n }\n\n [data-diffs-header][data-theme-type='dark'],\n [data-diffs][data-theme-type='dark'] {\n color-scheme: dark;\n }\n\n [data-diffs][data-theme-type='dark'] [data-column-content] span {\n font-weight: var(--diffs-token-dark-font-weight, inherit);\n font-style: var(--diffs-token-dark-font-style, inherit);\n text-decoration: var(--diffs-token-dark-text-decoration, inherit);\n }\n\n [data-type='split'][data-overflow='wrap'] {\n display: grid;\n grid-auto-flow: dense;\n grid-template-columns: repeat(2, var(--diffs-code-grid));\n }\n\n [data-type='split'][data-overflow='scroll'] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 2px;\n }\n\n [data-code] {\n display: block;\n display: grid;\n grid-auto-flow: dense;\n grid-template-columns: var(--diffs-code-grid);\n overflow: scroll clip;\n overscroll-behavior-x: none;\n tab-size: var(--diffs-tab-size, 2);\n align-self: flex-start;\n padding-top: var(--diffs-gap-block, var(--diffs-gap-fallback));\n padding-bottom: max(\n 0px,\n calc(var(--diffs-gap-block, var(--diffs-gap-fallback)) - 6px)\n );\n }\n\n [data-code]::-webkit-scrollbar {\n width: 0;\n height: 6px;\n }\n\n [data-code]::-webkit-scrollbar-track {\n background: transparent;\n }\n\n [data-code]::-webkit-scrollbar-thumb {\n background-color: transparent;\n border: 1px solid transparent;\n background-clip: content-box;\n border-radius: 3px;\n }\n\n [data-diffs]:hover [data-code]::-webkit-scrollbar-thumb {\n background-color: var(--diffs-bg-context);\n }\n\n [data-code]::-webkit-scrollbar-corner {\n background-color: transparent;\n }\n\n /*\n * If we apply these rules globally it will mean that webkit will opt into the\n * standards compliant version of custom css scrollbars, which we do not want\n * because the custom stuff will look better\n */\n @supports (-moz-appearance: none) {\n [data-code] {\n scrollbar-width: thin;\n scrollbar-color: var(--diffs-bg-context) transparent;\n padding-bottom: var(--diffs-gap-block, var(--diffs-gap-fallback));\n }\n }\n\n [data-diffs][data-type='split'][data-overflow='wrap'] {\n padding-block: var(--diffs-gap-block, var(--diffs-gap-fallback));\n }\n\n [data-diffs-header] ~ [data-diffs] [data-code],\n [data-diffs-header] ~ [data-diffs][data-overflow='wrap'] {\n padding-top: 0;\n }\n\n [data-type='split'][data-overflow='wrap'] [data-code] {\n display: contents;\n }\n\n [data-line-annotation],\n [data-no-newline],\n [data-line] {\n position: relative;\n display: grid;\n grid-template-columns: subgrid;\n grid-column: 1 / 3;\n }\n\n [data-line-annotation][data-selected-line] {\n background-color: unset;\n\n &::before {\n content: '';\n position: sticky;\n top: 0;\n left: 0;\n display: block;\n border-right: var(--diffs-gap-style, 1px solid var(--diffs-bg));\n background-color: var(--diffs-bg-selection-number);\n }\n\n [data-annotation-content] {\n background-color: var(--diffs-bg-selection);\n }\n }\n\n [data-interactive-lines] [data-line] {\n cursor: pointer;\n }\n\n [data-buffer] {\n display: grid;\n grid-column: 1 / 3;\n grid-template-columns: subgrid;\n user-select: none;\n /* We multiply by 1.414 (√2) to better approximate the diagonal repeat distance */\n background-image: repeating-linear-gradient(\n -45deg,\n transparent,\n transparent calc(3px * 1.414),\n var(--diffs-bg-buffer) calc(3px * 1.414),\n var(--diffs-bg-buffer) calc(4px * 1.414)\n );\n min-height: 1lh;\n /* lol not sure this is worth it… */\n /* position: sticky; */\n /* left: 0; */\n /* width: var(--diffs-column-width, auto); */\n /* background-attachment: fixed; */\n\n &::before,\n &::after {\n content: '';\n display: block;\n }\n\n &::before {\n box-sizing: content-box;\n padding-left: 2ch;\n padding-right: 1ch;\n border-left: 4px solid transparent;\n border-right: 1px solid transparent;\n min-width: var(\n --diffs-min-number-column-width,\n var(--diffs-min-number-column-width-default, 3ch)\n );\n }\n }\n\n [data-separator] {\n grid-column: span 2;\n }\n\n [data-separator='metadata'],\n [data-separator]:empty {\n min-height: 4px;\n background-color: var(--diffs-bg-separator);\n display: grid;\n grid-template-columns: subgrid;\n }\n\n [data-separator-wrapper] {\n user-select: none;\n fill: currentColor;\n overflow: hidden;\n }\n\n [data-separator='metadata'] [data-separator-wrapper] {\n grid-column: 2 / 3;\n width: var(--diffs-column-content-width);\n position: sticky;\n left: var(--diffs-column-number-width);\n padding: 4px 1ch;\n }\n\n [data-separator='line-info'] {\n margin-block: var(--diffs-gap-block, var(--diffs-gap-fallback));\n }\n\n [data-separator='line-info'][data-separator-first] {\n margin-top: 0;\n }\n\n [data-separator='line-info'][data-separator-last] {\n margin-bottom: 0;\n }\n\n [data-separator='line-info'] [data-separator-wrapper] {\n position: relative;\n display: flex;\n align-items: center;\n gap: 2px;\n width: auto;\n width: calc(var(--diffs-column-width) - var(--diffs-gap-fallback));\n border-radius: 6px;\n }\n\n [data-overflow='scroll']\n [data-separator='line-info']\n [data-separator-wrapper] {\n position: sticky;\n }\n\n @media (pointer: fine) {\n [data-separator-wrapper][data-separator-multi-button] {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n grid-template-rows: 15px 15px;\n\n [data-expand-button] {\n height: 15px;\n }\n }\n\n [data-type='split']\n [data-additions]\n [data-separator-wrapper][data-separator-multi-button] {\n grid-template-columns: minmax(0, 1fr) auto;\n }\n\n [data-type='split'] [data-additions] [data-expand-button] {\n grid-column: 2;\n }\n\n [data-type='split'] [data-additions] [data-separator-content] {\n grid-column: 1;\n }\n }\n\n [data-expand-button],\n [data-separator-content] {\n display: flex;\n align-items: center;\n background-color: var(--diffs-bg-separator);\n }\n\n [data-expand-button] {\n justify-content: center;\n flex-shrink: 0;\n cursor: pointer;\n width: 32px;\n height: 32px;\n opacity: 0.65;\n }\n\n [data-hover-slot] {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n display: flex;\n justify-content: flex-end;\n }\n\n @media (pointer: fine) {\n [data-expand-button]:hover {\n opacity: 1;\n }\n\n /* FIXME(amadeus): We need to figure out how/when to apply hover effects in\n * a more performant way because it'll trigger layout/paint re-calcs\n * probably when we dont want them... */\n [data-line]:hover {\n z-index: 2;\n }\n }\n\n [data-expand-down] [data-icon] {\n transform: scaleY(-1);\n }\n\n [data-separator-content] {\n flex: 1 1 auto;\n padding: 0 1ch;\n height: 32px;\n opacity: 0.65;\n overflow: hidden;\n justify-content: flex-start;\n\n grid-column: 2;\n grid-row: 1 / -1;\n }\n\n [data-unmodified-lines] {\n display: block;\n overflow: hidden;\n min-width: 0;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 0 1 auto;\n }\n\n [data-type='split'] [data-additions] [data-separator-content] {\n justify-content: flex-end;\n }\n\n [data-type='file']\n [data-code]\n [data-separator='line-info']\n [data-separator-wrapper] {\n margin-left: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n margin-right: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n width: calc(\n var(--diffs-column-width) -\n (var(--diffs-gap-inline, var(--diffs-gap-fallback)) * 2)\n );\n }\n\n [data-type='split']\n [data-deletions]\n [data-separator='line-info']\n [data-separator-wrapper] {\n margin-left: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n [data-type='file'][data-overflow='scroll'],\n [data-type='split'][data-overflow='scroll'] {\n [data-deletions] [data-separator='line-info'] [data-separator-wrapper] {\n left: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n }\n }\n\n [data-type='split']\n [data-additions]\n [data-separator='line-info']\n [data-separator-wrapper] {\n margin-right: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n flex-direction: row-reverse;\n }\n\n [data-type='split'][data-overflow='scroll']\n [data-additions]\n [data-separator='line-info']\n [data-separator-wrapper] {\n left: 0;\n }\n\n [data-line] {\n background-color: var(--diffs-bg);\n color: var(--diffs-fg);\n }\n\n [data-type='split'][data-overflow='wrap'] [data-deletions] {\n [data-line-annotation],\n [data-buffer],\n [data-line],\n [data-separator],\n [data-virtualized-buffer],\n [data-no-newline] {\n margin-right: 1px;\n grid-column: 1 / 3;\n }\n }\n\n [data-line-annotation] {\n min-height: var(--diffs-annotation-min-height, 0);\n background-color: var(--diffs-bg-context);\n z-index: 3;\n }\n\n [data-type='split'][data-overflow='wrap'] [data-additions] {\n [data-line-annotation],\n [data-buffer],\n [data-line],\n [data-separator],\n [data-virtualized-buffer],\n [data-no-newline] {\n margin-left: 1px;\n grid-column: 3 / 5;\n }\n }\n\n [data-separator='custom'] {\n display: grid;\n grid-template-columns: subgrid;\n }\n\n [data-column-content],\n [data-column-number] {\n position: relative;\n padding-inline: 1ch;\n }\n\n [data-indicators='classic'] [data-column-content] {\n padding-inline-start: 2ch;\n }\n\n [data-indicators='classic'] {\n [data-line-type='change-addition'] [data-column-content]::before,\n [data-line-type='change-deletion'] [data-column-content]::before {\n display: inline-block;\n width: 1ch;\n height: 1lh;\n position: absolute;\n top: 0;\n left: 0;\n user-select: none;\n }\n\n [data-line-type='change-addition'] [data-column-content]::before {\n content: '+';\n color: var(--diffs-addition-base);\n }\n\n [data-line-type='change-deletion'] [data-column-content]::before {\n content: '-';\n color: var(--diffs-deletion-base);\n }\n }\n\n [data-indicators='bars'] {\n [data-line-type='change-deletion'],\n [data-line-type='change-addition'] {\n [data-column-number]::before {\n content: '';\n display: block;\n width: 4px;\n height: 100%;\n position: absolute;\n top: 0;\n left: 0;\n user-select: none;\n contain: strict;\n }\n }\n\n [data-line-type='change-deletion'] [data-column-number]::before {\n background-image: linear-gradient(\n 0deg,\n var(--diffs-bg-deletion) 50%,\n var(--diffs-deletion-base) 50%\n );\n background-repeat: repeat;\n background-size: 2px 2px;\n background-size: calc(1lh / round(1lh / 2px)) calc(1lh / round(1lh / 2px));\n }\n\n [data-line-type='change-addition'] [data-column-number]::before {\n background-color: var(--diffs-addition-base);\n }\n }\n\n [data-overflow='wrap'] [data-column-content],\n [data-overflow='wrap'] [data-annotation-content] {\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n [data-overflow='scroll'] [data-column-content] {\n white-space: pre;\n min-height: 1lh;\n }\n\n [data-column-number] {\n grid-column: 1 / 2;\n box-sizing: content-box;\n text-align: right;\n user-select: none;\n background-color: var(--diffs-bg);\n color: var(--diffs-fg-number);\n z-index: 1;\n min-width: var(\n --diffs-min-number-column-width,\n var(--diffs-min-number-column-width-default, 3ch)\n );\n padding-left: 2ch;\n border-right: var(--diffs-gap-style, 1px solid var(--diffs-bg));\n }\n\n [data-overflow='scroll'] [data-column-number] {\n position: sticky;\n left: 0;\n }\n\n [data-disable-line-numbers] {\n &[data-indicators='bars'] [data-column-number] {\n min-width: 4px;\n border-right: var(--diffs-gap-style, 1px solid var(--diffs-bg));\n }\n\n [data-column-number],\n [data-buffer]::before {\n min-width: 0;\n padding: 0;\n }\n\n [data-line-number-content] {\n display: none;\n }\n\n [data-hover-slot] {\n right: unset;\n left: 0;\n justify-content: flex-start;\n }\n\n &[data-indicators='bars'] [data-hover-slot] {\n /* Using 5px here because theres a 1px separator after the bar */\n left: 5px;\n }\n }\n\n [data-interactive-line-numbers] [data-column-number] {\n cursor: pointer;\n }\n\n [data-diff-span] {\n border-radius: 3px;\n box-decoration-break: clone;\n }\n\n [data-line-type='change-addition'] {\n [data-column-number] {\n color: var(\n --diffs-fg-number-addition-override,\n var(--diffs-addition-base)\n );\n }\n\n [data-diff-span] {\n background-color: var(--diffs-bg-addition-emphasis);\n }\n }\n\n [data-line-type='change-deletion'] {\n [data-column-number] {\n color: var(\n --diffs-fg-number-deletion-override,\n var(--diffs-deletion-base)\n );\n }\n\n [data-diff-span] {\n background-color: var(--diffs-bg-deletion-emphasis);\n }\n }\n\n [data-background] [data-line-type='change-addition'] {\n --diffs-line-bg: var(--diffs-bg-addition);\n\n [data-column-number] {\n background-color: var(--diffs-bg-addition-number);\n }\n }\n\n [data-background] [data-line-type='change-deletion'] {\n --diffs-line-bg: var(--diffs-bg-deletion);\n\n [data-column-number] {\n background-color: var(--diffs-bg-deletion-number);\n }\n }\n\n [data-line-type='context-expanded'] {\n --diffs-line-bg: var(--diffs-bg-context);\n\n [data-column-number] {\n background-color: var(--diffs-bg-context);\n }\n }\n\n /* By wrapping hovers in a pointer: fine, we ensure that mobile devices don't\n * require a double click */\n @media (pointer: fine) {\n [data-line]:hover:not([data-selected-line]) {\n [data-column-number],\n [data-column-content] {\n background-color: var(--diffs-bg-hover);\n }\n }\n\n [data-background] [data-line]:hover:not([data-selected-line]) {\n &[data-line-type='change-deletion'] [data-column-number],\n &[data-line-type='change-deletion'] [data-column-content] {\n background-color: var(--diffs-bg-deletion-hover);\n }\n\n &[data-line-type='change-addition'] [data-column-number],\n &[data-line-type='change-addition'] [data-column-content] {\n background-color: var(--diffs-bg-addition-hover);\n }\n }\n }\n\n [data-diffs-header] {\n position: relative;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n gap: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n min-height: calc(\n 1lh + (var(--diffs-gap-block, var(--diffs-gap-fallback)) * 3)\n );\n padding-inline: 16px;\n top: 0;\n z-index: 2;\n }\n\n [data-header-content] {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n min-width: 0;\n white-space: nowrap;\n }\n\n [data-header-content] [data-prev-name],\n [data-header-content] [data-title] {\n direction: rtl;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n white-space: nowrap;\n }\n\n [data-prev-name] {\n opacity: 0.7;\n }\n\n [data-rename-icon] {\n fill: currentColor;\n flex-shrink: 0;\n flex-grow: 0;\n }\n\n [data-diffs-header] [data-metadata] {\n display: flex;\n align-items: center;\n gap: 1ch;\n white-space: nowrap;\n }\n\n [data-diffs-header] [data-additions-count] {\n font-family: var(--diffs-font-family, var(--diffs-font-fallback));\n color: var(--diffs-addition-base);\n }\n\n [data-diffs-header] [data-deletions-count] {\n font-family: var(--diffs-font-family, var(--diffs-font-fallback));\n color: var(--diffs-deletion-base);\n }\n\n [data-no-newline] {\n user-select: none;\n\n [data-column-content] {\n opacity: 0.6;\n }\n }\n\n [data-annotation-content] {\n position: relative;\n grid-column: 2 / -1;\n width: var(--diffs-column-content-width, auto);\n align-self: flex-start;\n z-index: 2;\n height: 100%;\n }\n\n /* Sticky positioning has a composite costs, so we should _only_ pay it if we\n * need to */\n [data-overflow='scroll'] [data-annotation-content] {\n position: sticky;\n left: var(--diffs-column-number-width, 0);\n }\n\n /* Undo some of the stuff that the 'pre' tag does */\n [data-annotation-slot] {\n text-wrap-mode: wrap;\n word-break: normal;\n white-space-collapse: collapse;\n }\n\n [data-change-icon] {\n fill: currentColor;\n flex-shrink: 0;\n }\n\n [data-change-icon='change'],\n [data-change-icon='rename-pure'],\n [data-change-icon='rename-changed'] {\n color: var(--diffs-modified-base);\n }\n\n [data-change-icon='new'] {\n color: var(--diffs-addition-base);\n }\n\n [data-change-icon='deleted'] {\n color: var(--diffs-deletion-base);\n }\n\n [data-change-icon='file'] {\n opacity: 0.6;\n }\n\n /* Line selection highlighting */\n [data-line-type='context'][data-selected-line] {\n [data-column-number] {\n color: var(--diffs-selection-number-fg);\n background-color: var(--diffs-bg-selection-number);\n }\n\n [data-column-content] {\n background-color: var(--diffs-bg-selection);\n }\n }\n\n [data-line-type='context-expanded'],\n [data-line-type='change-addition'],\n [data-line-type='change-deletion'] {\n &[data-selected-line] {\n [data-column-content] {\n background-color: light-dark(\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 82%,\n var(--diffs-selection-base)\n ),\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 75%,\n var(--diffs-selection-base)\n )\n );\n }\n\n [data-column-number] {\n color: var(--diffs-selection-number-fg);\n background-color: light-dark(\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 75%,\n var(--diffs-selection-base)\n ),\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 60%,\n var(--diffs-selection-base)\n )\n );\n }\n }\n }\n\n [data-error-wrapper] {\n overflow: auto;\n padding: var(--diffs-gap-block, var(--diffs-gap-fallback))\n var(--diffs-gap-inline, var(--diffs-gap-fallback));\n max-height: 400px;\n scrollbar-width: none;\n\n [data-error-message] {\n font-weight: bold;\n font-size: 18px;\n color: var(--diffs-deletion-base);\n }\n\n [data-error-stack] {\n color: var(--diffs-fg-number);\n }\n }\n\n [data-virtualized-buffer] {\n /* for blanking debugging purposes */\n /* background-color: red; */\n grid-column: 1 / 3;\n }\n}\n"],"mappings":";oBAAA"}
1
+ {"version":3,"file":"style.js","names":[],"sources":["../src/style.css"],"sourcesContent":["@layer base, theme, unsafe;\n\n@layer base {\n :host {\n --diffs-bg: #fff;\n --diffs-fg: #000;\n --diffs-font-fallback:\n 'SF Mono', Monaco, Consolas, 'Ubuntu Mono', 'Liberation Mono',\n 'Courier New', monospace;\n --diffs-header-font-fallback:\n system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue',\n 'Noto Sans', 'Liberation Sans', Arial, sans-serif;\n\n --diffs-mixer: light-dark(black, white);\n --diffs-gap-fallback: 8px;\n\n /*\n // Available CSS Color Overrides\n --diffs-bg-buffer-override\n --diffs-bg-hover-override\n --diffs-bg-context-override\n --diffs-bg-separator-override\n\n --diffs-fg-number-override\n --diffs-fg-number-addition-override\n --diffs-fg-number-deletion-override\n\n --diffs-deletion-color-override\n --diffs-addition-color-override\n --diffs-modified-color-override\n\n --diffs-bg-deletion-override\n --diffs-bg-deletion-number-override\n --diffs-bg-deletion-hover-override\n --diffs-bg-deletion-emphasis-override\n\n --diffs-bg-addition-override\n --diffs-bg-addition-number-override\n --diffs-bg-addition-hover-override\n --diffs-bg-addition-emphasis-override\n\n // Line Selection Color Overrides (for enableLineSelection)\n --diffs-selection-color-override\n --diffs-bg-selection-override\n --diffs-bg-selection-number-override\n --diffs-bg-selection-background-override\n --diffs-bg-selection-number-background-override\n\n // Available CSS Layout Overrides\n --diffs-gap-inline\n --diffs-gap-block\n --diffs-gap-style\n --diffs-tab-size\n */\n\n color-scheme: light dark;\n display: block;\n font-family: var(\n --diffs-header-font-family,\n var(--diffs-header-font-fallback)\n );\n font-size: var(--diffs-font-size, 13px);\n line-height: var(--diffs-line-height, 20px);\n font-feature-settings: var(--diffs-font-features);\n }\n\n /* NOTE(mdo): Some semantic HTML elements (e.g. `pre`, `code`) have default\n * user-agent styles. These must be overridden to use our custom styles. */\n pre,\n code,\n [data-error-wrapper] {\n isolation: isolate;\n margin: 0;\n padding: 0;\n display: block;\n outline: none;\n font-family: var(--diffs-font-family, var(--diffs-font-fallback));\n }\n\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n [data-icon-sprite] {\n display: none;\n }\n\n /* NOTE(mdo): Headers and separators are within pre/code, so we need to reset\n * their font-family explicitly. */\n [data-diffs-header],\n [data-separator] {\n font-family: var(\n --diffs-header-font-family,\n var(--diffs-header-font-fallback)\n );\n }\n\n [data-file-info] {\n padding: 10px;\n font-weight: 700;\n color: var(--fg);\n /* NOTE(amadeus): we cannot use 'in oklch' because current versions of cursor\n * and vscode use an older build of chrome that appears to have a bug with\n * color-mix and 'in oklch', so use 'in lab' instead */\n background-color: color-mix(in lab, var(--bg) 98%, var(--fg));\n border-block: 1px solid color-mix(in lab, var(--bg) 95%, var(--fg));\n }\n\n [data-diffs-header],\n [data-diffs],\n [data-error-wrapper] {\n --diffs-bg: light-dark(var(--diffs-light-bg), var(--diffs-dark-bg));\n /* NOTE(amadeus): we cannot use 'in oklch' because current versions of cursor\n * and vscode use an older build of chrome that appears to have a bug with\n * color-mix and 'in oklch', so use 'in lab' instead */\n --diffs-bg-buffer: var(\n --diffs-bg-buffer-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer))\n )\n );\n --diffs-bg-hover: var(\n --diffs-bg-hover-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 97%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 91%, var(--diffs-mixer))\n )\n );\n --diffs-bg-context: var(\n --diffs-bg-context-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer))\n )\n );\n --diffs-bg-separator: var(\n --diffs-bg-separator-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer))\n )\n );\n\n --diffs-fg: light-dark(var(--diffs-light), var(--diffs-dark));\n --diffs-fg-number: var(\n --diffs-fg-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)),\n color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg))\n )\n );\n\n --diffs-deletion-base: var(\n --diffs-deletion-color-override,\n light-dark(\n var(\n --diffs-light-deletion-color,\n var(--diffs-deletion-color, rgb(255, 0, 0))\n ),\n var(\n --diffs-dark-deletion-color,\n var(--diffs-deletion-color, rgb(255, 0, 0))\n )\n )\n );\n --diffs-addition-base: var(\n --diffs-addition-color-override,\n light-dark(\n var(\n --diffs-light-addition-color,\n var(--diffs-addition-color, rgb(0, 255, 0))\n ),\n var(\n --diffs-dark-addition-color,\n var(--diffs-addition-color, rgb(0, 255, 0))\n )\n )\n );\n --diffs-modified-base: var(\n --diffs-modified-color-override,\n light-dark(\n var(\n --diffs-light-modified-color,\n var(--diffs-modified-color, rgb(0, 0, 255))\n ),\n var(\n --diffs-dark-modified-color,\n var(--diffs-modified-color, rgb(0, 0, 255))\n )\n )\n );\n\n /* NOTE(amadeus): we cannot use 'in oklch' because current versions of cursor\n * and vscode use an older build of chrome that appears to have a bug with\n * color-mix and 'in oklch', so use 'in lab' instead */\n --diffs-bg-deletion: var(\n --diffs-bg-deletion-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-deletion-base)),\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base))\n )\n );\n --diffs-bg-deletion-number: var(\n --diffs-bg-deletion-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 91%, var(--diffs-deletion-base)),\n color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-deletion-base))\n )\n );\n --diffs-bg-deletion-hover: var(\n --diffs-bg-deletion-hover-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base)),\n color-mix(in lab, var(--diffs-bg) 75%, var(--diffs-deletion-base))\n )\n );\n --diffs-bg-deletion-emphasis: var(\n --diffs-bg-deletion-emphasis-override,\n light-dark(\n rgb(from var(--diffs-deletion-base) r g b / 0.15),\n rgb(from var(--diffs-deletion-base) r g b / 0.2)\n )\n );\n\n --diffs-bg-addition: var(\n --diffs-bg-addition-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-addition-base)),\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base))\n )\n );\n --diffs-bg-addition-number: var(\n --diffs-bg-addition-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 91%, var(--diffs-addition-base)),\n color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-addition-base))\n )\n );\n --diffs-bg-addition-hover: var(\n --diffs-bg-addition-hover-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base)),\n color-mix(in lab, var(--diffs-bg) 70%, var(--diffs-addition-base))\n )\n );\n --diffs-bg-addition-emphasis: var(\n --diffs-bg-addition-emphasis-override,\n light-dark(\n rgb(from var(--diffs-addition-base) r g b / 0.15),\n rgb(from var(--diffs-addition-base) r g b / 0.2)\n )\n );\n\n --diffs-selection-base: var(--diffs-modified-base);\n --diffs-selection-number-fg: light-dark(\n color-mix(in lab, var(--diffs-selection-base) 65%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-selection-base) 75%, var(--diffs-mixer))\n );\n --diffs-bg-selection: var(\n --diffs-bg-selection-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 82%, var(--diffs-selection-base)),\n color-mix(in lab, var(--diffs-bg) 75%, var(--diffs-selection-base))\n )\n );\n --diffs-bg-selection-number: var(\n --diffs-bg-selection-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 75%, var(--diffs-selection-base)),\n color-mix(in lab, var(--diffs-bg) 60%, var(--diffs-selection-base))\n )\n );\n\n background-color: var(--diffs-bg);\n color: var(--diffs-fg);\n }\n\n [data-diffs] {\n /* This feels a bit crazy to me... so I need to think about it a bit more... */\n --diffs-grid-number-column-width: minmax(min-content, max-content);\n --diffs-code-grid: var(--diffs-grid-number-column-width) 1fr;\n\n [data-column-content] span {\n color: light-dark(\n var(--diffs-token-light, var(--diffs-light)),\n var(--diffs-token-dark, var(--diffs-dark))\n );\n font-weight: var(--diffs-token-light-font-weight, inherit);\n font-style: var(--diffs-token-light-font-style, inherit);\n text-decoration: var(--diffs-token-light-text-decoration, inherit);\n }\n }\n\n /* Since span is a pretty innocuous selector, we need to make sure we don't\n * apply tokenized BG colors to diff-spans */\n [data-column-content] span:not([data-diff-span]) {\n background-color: light-dark(\n var(--diffs-token-light-bg, inherit),\n var(--diffs-token-dark-bg, inherit)\n );\n }\n\n [data-column-content] {\n background-color: var(--diffs-line-bg, 'transparent');\n grid-column: 2 / 3;\n }\n\n [data-diffs][data-dehydrated] {\n --diffs-code-grid: var(--diffs-grid-number-column-width) minmax(0, 1fr);\n }\n\n @media (prefers-color-scheme: dark) {\n [data-diffs-header],\n [data-diffs] {\n color-scheme: dark;\n }\n\n [data-diffs] [data-column-content] span {\n font-weight: var(--diffs-token-dark-font-weight, inherit);\n font-style: var(--diffs-token-dark-font-style, inherit);\n text-decoration: var(--diffs-token-dark-text-decoration, inherit);\n }\n }\n\n [data-diffs-header][data-theme-type='light'],\n [data-diffs][data-theme-type='light'] {\n color-scheme: light;\n }\n\n [data-diffs][data-theme-type='light'] [data-column-content] span {\n font-weight: var(--diffs-token-light-font-weight, inherit);\n font-style: var(--diffs-token-light-font-style, inherit);\n text-decoration: var(--diffs-token-light-text-decoration, inherit);\n }\n\n [data-diffs-header][data-theme-type='dark'],\n [data-diffs][data-theme-type='dark'] {\n color-scheme: dark;\n }\n\n [data-diffs][data-theme-type='dark'] [data-column-content] span {\n font-weight: var(--diffs-token-dark-font-weight, inherit);\n font-style: var(--diffs-token-dark-font-style, inherit);\n text-decoration: var(--diffs-token-dark-text-decoration, inherit);\n }\n\n [data-type='split'][data-overflow='wrap'] {\n display: grid;\n grid-auto-flow: dense;\n grid-template-columns: repeat(2, var(--diffs-code-grid));\n }\n\n [data-type='split'][data-overflow='scroll'] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 2px;\n }\n\n [data-code] {\n display: block;\n display: grid;\n grid-auto-flow: dense;\n grid-template-columns: var(--diffs-code-grid);\n overflow: scroll clip;\n overscroll-behavior-x: none;\n tab-size: var(--diffs-tab-size, 2);\n align-self: flex-start;\n padding-top: var(--diffs-gap-block, var(--diffs-gap-fallback));\n padding-bottom: max(\n 0px,\n calc(var(--diffs-gap-block, var(--diffs-gap-fallback)) - 6px)\n );\n }\n\n [data-code]::-webkit-scrollbar {\n width: 0;\n height: 6px;\n }\n\n [data-code]::-webkit-scrollbar-track {\n background: transparent;\n }\n\n [data-code]::-webkit-scrollbar-thumb {\n background-color: transparent;\n border: 1px solid transparent;\n background-clip: content-box;\n border-radius: 3px;\n }\n\n [data-diffs]:hover [data-code]::-webkit-scrollbar-thumb {\n background-color: var(--diffs-bg-context);\n }\n\n [data-code]::-webkit-scrollbar-corner {\n background-color: transparent;\n }\n\n /*\n * If we apply these rules globally it will mean that webkit will opt into the\n * standards compliant version of custom css scrollbars, which we do not want\n * because the custom stuff will look better\n */\n @supports (-moz-appearance: none) {\n [data-code] {\n scrollbar-width: thin;\n scrollbar-color: var(--diffs-bg-context) transparent;\n padding-bottom: var(--diffs-gap-block, var(--diffs-gap-fallback));\n }\n }\n\n [data-diffs][data-type='split'][data-overflow='wrap'] {\n padding-block: var(--diffs-gap-block, var(--diffs-gap-fallback));\n }\n\n [data-diffs-header] ~ [data-diffs] [data-code],\n [data-diffs-header] ~ [data-diffs][data-overflow='wrap'] {\n padding-top: 0;\n }\n\n [data-type='split'][data-overflow='wrap'] [data-code] {\n display: contents;\n }\n\n [data-line-annotation],\n [data-no-newline],\n [data-line] {\n position: relative;\n display: grid;\n grid-template-columns: subgrid;\n grid-column: 1 / 3;\n }\n\n [data-line-annotation][data-selected-line] {\n background-color: unset;\n\n &::before {\n content: '';\n position: sticky;\n top: 0;\n left: 0;\n display: block;\n border-right: var(--diffs-gap-style, 1px solid var(--diffs-bg));\n background-color: var(--diffs-bg-selection-number);\n }\n\n [data-annotation-content] {\n background-color: var(--diffs-bg-selection);\n }\n }\n\n [data-interactive-lines] [data-line] {\n cursor: pointer;\n }\n\n [data-buffer] {\n display: grid;\n grid-column: 1 / 3;\n grid-template-columns: subgrid;\n user-select: none;\n /* We multiply by 1.414 (√2) to better approximate the diagonal repeat distance */\n background-image: repeating-linear-gradient(\n -45deg,\n transparent,\n transparent calc(3px * 1.414),\n var(--diffs-bg-buffer) calc(3px * 1.414),\n var(--diffs-bg-buffer) calc(4px * 1.414)\n );\n min-height: 1lh;\n /* lol not sure this is worth it… */\n /* position: sticky; */\n /* left: 0; */\n /* width: var(--diffs-column-width, auto); */\n /* background-attachment: fixed; */\n\n &::before,\n &::after {\n content: '';\n display: block;\n }\n\n &::before {\n box-sizing: content-box;\n padding-left: 2ch;\n padding-right: 1ch;\n border-left: 4px solid transparent;\n border-right: 1px solid transparent;\n min-width: var(\n --diffs-min-number-column-width,\n var(--diffs-min-number-column-width-default, 3ch)\n );\n }\n }\n\n [data-separator] {\n grid-column: span 2;\n }\n\n [data-separator='metadata'],\n [data-separator]:empty {\n min-height: 4px;\n background-color: var(--diffs-bg-separator);\n display: grid;\n grid-template-columns: subgrid;\n }\n\n [data-separator-wrapper] {\n user-select: none;\n fill: currentColor;\n overflow: hidden;\n }\n\n [data-separator='metadata'] [data-separator-wrapper] {\n grid-column: 2 / 3;\n width: var(--diffs-column-content-width);\n position: sticky;\n left: var(--diffs-column-number-width);\n padding: 4px 1ch;\n }\n\n [data-separator='line-info'] {\n margin-block: var(--diffs-gap-block, var(--diffs-gap-fallback));\n }\n\n [data-separator='line-info'][data-separator-first] {\n margin-top: 0;\n }\n\n [data-separator='line-info'][data-separator-last] {\n margin-bottom: 0;\n }\n\n [data-separator='line-info'] [data-separator-wrapper] {\n position: relative;\n display: flex;\n align-items: center;\n gap: 2px;\n width: auto;\n width: calc(var(--diffs-column-width) - var(--diffs-gap-fallback));\n border-radius: 6px;\n }\n\n [data-overflow='scroll']\n [data-separator='line-info']\n [data-separator-wrapper] {\n position: sticky;\n }\n\n @media (pointer: fine) {\n [data-separator-wrapper][data-separator-multi-button] {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n grid-template-rows: 15px 15px;\n\n [data-expand-button] {\n height: 15px;\n }\n }\n\n [data-type='split']\n [data-additions]\n [data-separator-wrapper][data-separator-multi-button] {\n grid-template-columns: minmax(0, 1fr) auto;\n }\n\n [data-type='split'] [data-additions] [data-expand-button] {\n grid-column: 2;\n }\n\n [data-type='split'] [data-additions] [data-separator-content] {\n grid-column: 1;\n }\n }\n\n [data-expand-button],\n [data-separator-content] {\n display: flex;\n align-items: center;\n background-color: var(--diffs-bg-separator);\n }\n\n [data-expand-button] {\n justify-content: center;\n flex-shrink: 0;\n cursor: pointer;\n width: 32px;\n height: 32px;\n opacity: 0.65;\n }\n\n [data-hover-slot] {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n display: flex;\n justify-content: flex-end;\n }\n\n @media (pointer: fine) {\n [data-expand-button]:hover {\n opacity: 1;\n }\n\n /* FIXME(amadeus): We need to figure out how/when to apply hover effects in\n * a more performant way because it'll trigger layout/paint re-calcs\n * probably when we dont want them... */\n [data-line]:hover {\n z-index: 2;\n }\n }\n\n [data-expand-down] [data-icon] {\n transform: scaleY(-1);\n }\n\n [data-separator-content] {\n flex: 1 1 auto;\n padding: 0 1ch;\n height: 32px;\n opacity: 0.65;\n overflow: hidden;\n justify-content: flex-start;\n\n grid-column: 2;\n grid-row: 1 / -1;\n }\n\n [data-unmodified-lines] {\n display: block;\n overflow: hidden;\n min-width: 0;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 0 1 auto;\n }\n\n [data-type='split'] [data-additions] [data-separator-content] {\n justify-content: flex-end;\n }\n\n [data-type='file']\n [data-code]\n [data-separator='line-info']\n [data-separator-wrapper] {\n margin-left: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n margin-right: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n width: calc(\n var(--diffs-column-width) -\n (var(--diffs-gap-inline, var(--diffs-gap-fallback)) * 2)\n );\n }\n\n [data-type='split']\n [data-deletions]\n [data-separator='line-info']\n [data-separator-wrapper] {\n margin-left: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n [data-type='file'][data-overflow='scroll'],\n [data-type='split'][data-overflow='scroll'] {\n [data-deletions] [data-separator='line-info'] [data-separator-wrapper] {\n left: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n }\n }\n\n [data-type='split']\n [data-additions]\n [data-separator='line-info']\n [data-separator-wrapper] {\n margin-right: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n flex-direction: row-reverse;\n }\n\n [data-type='split'][data-overflow='scroll']\n [data-additions]\n [data-separator='line-info']\n [data-separator-wrapper] {\n left: 0;\n }\n\n [data-line] {\n background-color: var(--diffs-bg);\n color: var(--diffs-fg);\n }\n\n [data-type='split'][data-overflow='wrap'] [data-deletions] {\n [data-line-annotation],\n [data-buffer],\n [data-line],\n [data-separator],\n [data-virtualized-buffer],\n [data-no-newline] {\n margin-right: 1px;\n grid-column: 1 / 3;\n }\n }\n\n [data-line-annotation] {\n min-height: var(--diffs-annotation-min-height, 0);\n background-color: var(--diffs-bg-context);\n z-index: 3;\n }\n\n [data-type='split'][data-overflow='wrap'] [data-additions] {\n [data-line-annotation],\n [data-buffer],\n [data-line],\n [data-separator],\n [data-virtualized-buffer],\n [data-no-newline] {\n margin-left: 1px;\n grid-column: 3 / 5;\n }\n }\n\n [data-separator='custom'] {\n display: grid;\n grid-template-columns: subgrid;\n }\n\n [data-column-content],\n [data-column-number] {\n position: relative;\n padding-inline: 1ch;\n }\n\n [data-indicators='classic'] [data-column-content] {\n padding-inline-start: 2ch;\n }\n\n [data-indicators='classic'] {\n [data-line-type='change-addition'] [data-column-content]::before,\n [data-line-type='change-deletion'] [data-column-content]::before {\n display: inline-block;\n width: 1ch;\n height: 1lh;\n position: absolute;\n top: 0;\n left: 0;\n user-select: none;\n }\n\n [data-line-type='change-addition'] [data-column-content]::before {\n content: '+';\n color: var(--diffs-addition-base);\n }\n\n [data-line-type='change-deletion'] [data-column-content]::before {\n content: '-';\n color: var(--diffs-deletion-base);\n }\n }\n\n [data-indicators='bars'] {\n [data-line-type='change-deletion'],\n [data-line-type='change-addition'] {\n [data-column-number]::before {\n content: '';\n display: block;\n width: 4px;\n height: 100%;\n position: absolute;\n top: 0;\n left: 0;\n user-select: none;\n contain: strict;\n }\n }\n\n [data-line-type='change-deletion'] [data-column-number]::before {\n background-image: linear-gradient(\n 0deg,\n var(--diffs-bg-deletion) 50%,\n var(--diffs-deletion-base) 50%\n );\n background-repeat: repeat;\n background-size: 2px 2px;\n background-size: calc(1lh / round(1lh / 2px)) calc(1lh / round(1lh / 2px));\n }\n\n [data-line-type='change-addition'] [data-column-number]::before {\n background-color: var(--diffs-addition-base);\n }\n }\n\n [data-overflow='wrap'] [data-column-content],\n [data-overflow='wrap'] [data-annotation-content] {\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n [data-overflow='scroll'] [data-column-content] {\n white-space: pre;\n min-height: 1lh;\n }\n\n [data-column-number] {\n grid-column: 1 / 2;\n box-sizing: content-box;\n text-align: right;\n user-select: none;\n background-color: var(--diffs-bg);\n color: var(--diffs-fg-number);\n z-index: 1;\n min-width: var(\n --diffs-min-number-column-width,\n var(--diffs-min-number-column-width-default, 3ch)\n );\n padding-left: 2ch;\n border-right: var(--diffs-gap-style, 1px solid var(--diffs-bg));\n }\n\n [data-overflow='scroll'] [data-column-number] {\n position: sticky;\n left: 0;\n }\n\n [data-disable-line-numbers] {\n &[data-indicators='bars'] [data-column-number] {\n min-width: 4px;\n border-right: var(--diffs-gap-style, 1px solid var(--diffs-bg));\n }\n\n [data-column-number],\n [data-buffer]::before {\n min-width: 0;\n padding: 0;\n }\n\n [data-line-number-content] {\n display: none;\n }\n\n [data-hover-slot] {\n right: unset;\n left: 0;\n justify-content: flex-start;\n }\n\n &[data-indicators='bars'] [data-hover-slot] {\n /* Using 5px here because theres a 1px separator after the bar */\n left: 5px;\n }\n }\n\n [data-interactive-line-numbers] [data-column-number] {\n cursor: pointer;\n }\n\n [data-diff-span] {\n border-radius: 3px;\n box-decoration-break: clone;\n }\n\n [data-line-type='change-addition'] {\n [data-column-number] {\n color: var(\n --diffs-fg-number-addition-override,\n var(--diffs-addition-base)\n );\n }\n\n [data-diff-span] {\n background-color: var(--diffs-bg-addition-emphasis);\n }\n }\n\n [data-line-type='change-deletion'] {\n [data-column-number] {\n color: var(\n --diffs-fg-number-deletion-override,\n var(--diffs-deletion-base)\n );\n }\n\n [data-diff-span] {\n background-color: var(--diffs-bg-deletion-emphasis);\n }\n }\n\n [data-background] [data-line-type='change-addition'] {\n --diffs-line-bg: var(--diffs-bg-addition);\n\n [data-column-number] {\n background-color: var(--diffs-bg-addition-number);\n }\n }\n\n [data-background] [data-line-type='change-deletion'] {\n --diffs-line-bg: var(--diffs-bg-deletion);\n\n [data-column-number] {\n background-color: var(--diffs-bg-deletion-number);\n }\n }\n\n /* By wrapping hovers in a pointer: fine, we ensure that mobile devices don't\n * require a double click */\n @media (pointer: fine) {\n [data-line]:hover:not([data-selected-line]) {\n [data-column-number],\n [data-column-content] {\n background-color: var(--diffs-bg-hover);\n }\n }\n\n [data-background] [data-line]:hover:not([data-selected-line]) {\n &[data-line-type='change-deletion'] [data-column-number],\n &[data-line-type='change-deletion'] [data-column-content] {\n background-color: var(--diffs-bg-deletion-hover);\n }\n\n &[data-line-type='change-addition'] [data-column-number],\n &[data-line-type='change-addition'] [data-column-content] {\n background-color: var(--diffs-bg-addition-hover);\n }\n }\n }\n\n [data-diffs-header] {\n position: relative;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n gap: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n min-height: calc(\n 1lh + (var(--diffs-gap-block, var(--diffs-gap-fallback)) * 3)\n );\n padding-inline: 16px;\n top: 0;\n z-index: 2;\n }\n\n [data-header-content] {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n min-width: 0;\n white-space: nowrap;\n }\n\n [data-header-content] [data-prev-name],\n [data-header-content] [data-title] {\n direction: rtl;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n white-space: nowrap;\n }\n\n [data-prev-name] {\n opacity: 0.7;\n }\n\n [data-rename-icon] {\n fill: currentColor;\n flex-shrink: 0;\n flex-grow: 0;\n }\n\n [data-diffs-header] [data-metadata] {\n display: flex;\n align-items: center;\n gap: 1ch;\n white-space: nowrap;\n }\n\n [data-diffs-header] [data-additions-count] {\n font-family: var(--diffs-font-family, var(--diffs-font-fallback));\n color: var(--diffs-addition-base);\n }\n\n [data-diffs-header] [data-deletions-count] {\n font-family: var(--diffs-font-family, var(--diffs-font-fallback));\n color: var(--diffs-deletion-base);\n }\n\n [data-no-newline] {\n user-select: none;\n\n [data-column-content] {\n opacity: 0.6;\n }\n }\n\n [data-annotation-content] {\n position: relative;\n grid-column: 2 / -1;\n width: var(--diffs-column-content-width, auto);\n align-self: flex-start;\n z-index: 2;\n height: 100%;\n }\n\n /* Sticky positioning has a composite costs, so we should _only_ pay it if we\n * need to */\n [data-overflow='scroll'] [data-annotation-content] {\n position: sticky;\n left: var(--diffs-column-number-width, 0);\n }\n\n /* Undo some of the stuff that the 'pre' tag does */\n [data-annotation-slot] {\n text-wrap-mode: wrap;\n word-break: normal;\n white-space-collapse: collapse;\n }\n\n [data-change-icon] {\n fill: currentColor;\n flex-shrink: 0;\n }\n\n [data-change-icon='change'],\n [data-change-icon='rename-pure'],\n [data-change-icon='rename-changed'] {\n color: var(--diffs-modified-base);\n }\n\n [data-change-icon='new'] {\n color: var(--diffs-addition-base);\n }\n\n [data-change-icon='deleted'] {\n color: var(--diffs-deletion-base);\n }\n\n [data-change-icon='file'] {\n opacity: 0.6;\n }\n\n /* Line selection highlighting */\n [data-line-type='context'][data-selected-line] {\n [data-column-number] {\n color: var(--diffs-selection-number-fg);\n background-color: var(--diffs-bg-selection-number);\n }\n\n [data-column-content] {\n background-color: var(--diffs-bg-selection);\n }\n }\n\n [data-line-type='change-addition'],\n [data-line-type='change-deletion'] {\n &[data-selected-line] {\n [data-column-content] {\n background-color: light-dark(\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 82%,\n var(--diffs-selection-base)\n ),\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 75%,\n var(--diffs-selection-base)\n )\n );\n }\n\n [data-column-number] {\n color: var(--diffs-selection-number-fg);\n background-color: light-dark(\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 75%,\n var(--diffs-selection-base)\n ),\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 60%,\n var(--diffs-selection-base)\n )\n );\n }\n }\n }\n\n [data-error-wrapper] {\n overflow: auto;\n padding: var(--diffs-gap-block, var(--diffs-gap-fallback))\n var(--diffs-gap-inline, var(--diffs-gap-fallback));\n max-height: 400px;\n scrollbar-width: none;\n\n [data-error-message] {\n font-weight: bold;\n font-size: 18px;\n color: var(--diffs-deletion-base);\n }\n\n [data-error-stack] {\n color: var(--diffs-fg-number);\n }\n }\n\n [data-virtualized-buffer] {\n /* for blanking debugging purposes */\n /* background-color: red; */\n grid-column: 1 / 3;\n }\n}\n"],"mappings":";oBAAA"}
package/dist/types.d.ts CHANGED
@@ -261,7 +261,7 @@ interface FileDiffMetadata {
261
261
  */
262
262
  cacheKey?: string;
263
263
  }
264
- type SupportedLanguages = BundledLanguage | "text" | "ansi";
264
+ type SupportedLanguages = BundledLanguage | "text" | "ansi" | (string & {});
265
265
  type HunkLineType = "context" | "expanded" | "addition" | "deletion" | "metadata";
266
266
  type ThemeTypes = "system" | "light" | "dark";
267
267
  type HunkSeparators = "simple" | "metadata" | "line-info" | "custom";
@@ -283,6 +283,7 @@ interface BaseDiffOptions extends BaseCodeOptions {
283
283
  disableBackground?: boolean;
284
284
  hunkSeparators?: HunkSeparators;
285
285
  expandUnchanged?: boolean;
286
+ collapsedContextThreshold?: number;
286
287
  lineDiffType?: LineDiffTypes;
287
288
  maxLineDiffLength?: number;
288
289
  expansionLineCount?: number;
@@ -403,6 +404,7 @@ interface ForcePlainTextOptions {
403
404
  startingLine?: number;
404
405
  totalLines?: number;
405
406
  expandedHunks?: Map<number, HunkExpansionRegion> | true;
407
+ collapsedContextThreshold?: number;
406
408
  }
407
409
  interface RenderFileOptions {
408
410
  theme: DiffsThemeNames | Record<"dark" | "light", DiffsThemeNames>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { ExtensionFormatMap, SupportedLanguages } from "../types.js";
2
2
 
3
3
  //#region src/utils/getFiletypeFromFileName.d.ts
4
+ declare const CUSTOM_EXTENSION_TO_FILE_FORMAT: Map<string, SupportedLanguages>;
4
5
  declare const EXTENSION_TO_FILE_FORMAT: ExtensionFormatMap;
5
6
  declare function getFiletypeFromFileName(fileName: string): SupportedLanguages;
6
7
  declare function extendFileFormatMap(map: ExtensionFormatMap): void;
7
8
  //#endregion
8
- export { EXTENSION_TO_FILE_FORMAT, extendFileFormatMap, getFiletypeFromFileName };
9
+ export { CUSTOM_EXTENSION_TO_FILE_FORMAT, EXTENSION_TO_FILE_FORMAT, extendFileFormatMap, getFiletypeFromFileName };
9
10
  //# sourceMappingURL=getFiletypeFromFileName.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getFiletypeFromFileName.d.ts","names":["EXTENSION_TO_FILE_FORMAT: ExtensionFormatMap"],"sources":["../../src/utils/getFiletypeFromFileName.ts"],"sourcesContent":[],"mappings":";;;cAEaA,0BAA0B;iBA0UvB,uBAAA,oBAA2C;AA1U9CA,iBA8VG,mBAAA,CA9VuB,GAAA,EA8VE,kBA9VF,CAAA,EAAA,IAAA"}
1
+ {"version":3,"file":"getFiletypeFromFileName.d.ts","names":["CUSTOM_EXTENSION_TO_FILE_FORMAT: Map<string, SupportedLanguages>","EXTENSION_TO_FILE_FORMAT: ExtensionFormatMap"],"sources":["../../src/utils/getFiletypeFromFileName.ts"],"sourcesContent":[],"mappings":";;;cAEaA,iCAAiC,YAAY;cAG7CC,0BAA0B;AAH1BD,iBA6UG,uBAAA,CA7U0C,QAAA,EAAA,MAAA,CAAA,EA6UC,kBA7Ub;AAGjCC,iBAsWG,mBAAA,CAtWuB,GAAA,EAsWE,kBAtWF,CAAA,EAAA,IAAA"}