import { DiffLineAnnotation, FileContents, FileDiffOptions, type SelectedLineRange } from "@pierre/diffs" import { ComponentProps } from "solid-js" export type DiffProps = FileDiffOptions & { before: FileContents after: FileContents annotations?: DiffLineAnnotation[] selectedLines?: SelectedLineRange | null commentedLines?: SelectedLineRange[] onRendered?: () => void class?: string classList?: ComponentProps<"div">["classList"] } const unsafeCSS = ` [data-diffs] { --diffs-bg: light-dark(var(--diffs-light-bg), var(--diffs-dark-bg)); --diffs-bg-buffer: var(--diffs-bg-buffer-override, light-dark( color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)), color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)))); --diffs-bg-hover: var(--diffs-bg-hover-override, light-dark( color-mix(in lab, var(--diffs-bg) 97%, var(--diffs-mixer)), color-mix(in lab, var(--diffs-bg) 91%, var(--diffs-mixer)))); --diffs-bg-context: var(--diffs-bg-context-override, light-dark( color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)), color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer)))); --diffs-bg-separator: var(--diffs-bg-separator-override, light-dark( color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)), color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer)))); --diffs-fg: light-dark(var(--diffs-light), var(--diffs-dark)); --diffs-fg-number: var(--diffs-fg-number-override, light-dark(color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)), color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)))); --diffs-deletion-base: var(--syntax-diff-delete); --diffs-addition-base: var(--syntax-diff-add); --diffs-modified-base: var(--syntax-diff-unknown); --diffs-bg-deletion: var(--diffs-bg-deletion-override, light-dark( color-mix(in lab, var(--diffs-bg) 98%, var(--diffs-deletion-base)), color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-deletion-base)))); --diffs-bg-deletion-number: var(--diffs-bg-deletion-number-override, light-dark( color-mix(in lab, var(--diffs-bg) 91%, var(--diffs-deletion-base)), color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-deletion-base)))); --diffs-bg-deletion-hover: var(--diffs-bg-deletion-hover-override, light-dark( color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base)), color-mix(in lab, var(--diffs-bg) 75%, var(--diffs-deletion-base)))); --diffs-bg-deletion-emphasis: var(--diffs-bg-deletion-emphasis-override, light-dark(rgb(from var(--diffs-deletion-base) r g b / 0.7), rgb(from var(--diffs-deletion-base) r g b / 0.1))); --diffs-bg-addition: var(--diffs-bg-addition-override, light-dark( color-mix(in lab, var(--diffs-bg) 98%, var(--diffs-addition-base)), color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-addition-base)))); --diffs-bg-addition-number: var(--diffs-bg-addition-number-override, light-dark( color-mix(in lab, var(--diffs-bg) 91%, var(--diffs-addition-base)), color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-addition-base)))); --diffs-bg-addition-hover: var(--diffs-bg-addition-hover-override, light-dark( color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base)), color-mix(in lab, var(--diffs-bg) 70%, var(--diffs-addition-base)))); --diffs-bg-addition-emphasis: var(--diffs-bg-addition-emphasis-override, light-dark(rgb(from var(--diffs-addition-base) r g b / 0.07), rgb(from var(--diffs-addition-base) r g b / 0.1))); --diffs-selection-base: var(--surface-warning-strong); --diffs-selection-border: var(--border-warning-base); --diffs-selection-number-fg: var(--text-on-warning-strong); --diffs-bg-selection: var(--diffs-bg-selection-override, color-mix(in oklch, var(--surface-warning-base) 65%, transparent)); --diffs-bg-selection-number: var(--diffs-bg-selection-number-override, color-mix(in oklch, var(--surface-warning-base) 85%, transparent)); --diffs-bg-selection-text: color-mix(in oklch, var(--surface-warning-strong) 20%, transparent); } [data-diffs] ::selection { background-color: var(--diffs-bg-selection-text); } [data-diffs] [data-comment-selected] { background-color: var(--diffs-bg-selection); } [data-diffs] [data-comment-selected] [data-column-number] { background-color: var(--diffs-bg-selection-number); color: var(--diffs-selection-number-fg); } [data-diffs] [data-selected-line] { background-color: var(--diffs-bg-selection); box-shadow: inset 2px 0 0 var(--diffs-selection-border); } [data-diffs] [data-selected-line] [data-column-number] { background-color: var(--diffs-bg-selection-number); color: var(--diffs-selection-number-fg); } [data-diffs-header], [data-diffs] { [data-separator-wrapper] { margin: 0 !important; border-radius: 0 !important; } [data-expand-button] { width: 6.5ch !important; height: 24px !important; justify-content: end !important; padding-left: 3ch !important; padding-inline: 1ch !important; } [data-separator-multi-button] { grid-template-rows: 10px 10px !important; [data-expand-button] { height: 12px !important; } } [data-separator-content] { height: 24px !important; } [data-column-number] { background-color: var(--background-stronger); } [data-code] { overflow-x: auto !important; } }` export function createDefaultOptions(style: FileDiffOptions["diffStyle"]) { return { theme: "OpenCode", themeType: "system", disableLineNumbers: false, overflow: "wrap", diffStyle: style ?? "unified", diffIndicators: "bars", disableBackground: false, expansionLineCount: 20, lineDiffType: style === "split" ? "word-alt" : "none", maxLineDiffLength: 1000, maxLineLengthForHighlighting: 1000, disableFileHeader: true, unsafeCSS, // hunkSeparators(hunkData: HunkData) { // const fragment = document.createDocumentFragment() // const numCol = document.createElement("div") // numCol.innerHTML = ` ` // numCol.dataset["slot"] = "diff-hunk-separator-line-number" // fragment.appendChild(numCol) // const contentCol = document.createElement("div") // contentCol.dataset["slot"] = "diff-hunk-separator-content" // const span = document.createElement("span") // span.dataset["slot"] = "diff-hunk-separator-content-span" // span.textContent = `${hunkData.lines} unmodified lines` // contentCol.appendChild(span) // fragment.appendChild(contentCol) // return fragment // }, } as const } export const styleVariables = { "--diffs-font-family": "var(--font-family-mono)", "--diffs-font-size": "var(--font-size-small)", "--diffs-line-height": "24px", "--diffs-tab-size": 2, "--diffs-font-features": "var(--font-family-mono--font-feature-settings)", "--diffs-header-font-family": "var(--font-family-sans)", "--diffs-gap-block": 0, "--diffs-min-number-column-width": "4ch", }