code.tsx 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { type FileContents, File, FileOptions, LineAnnotation } from "@pierre/diffs"
  2. import { ComponentProps, createEffect, createMemo, splitProps } from "solid-js"
  3. import { createDefaultOptions, styleVariables } from "../pierre"
  4. import { workerPool } from "../pierre/worker"
  5. export type CodeProps<T = {}> = FileOptions<T> & {
  6. file: FileContents
  7. annotations?: LineAnnotation<T>[]
  8. class?: string
  9. classList?: ComponentProps<"div">["classList"]
  10. }
  11. export function Code<T>(props: CodeProps<T>) {
  12. let container!: HTMLDivElement
  13. const [local, others] = splitProps(props, ["file", "class", "classList", "annotations"])
  14. const file = createMemo(
  15. () =>
  16. new File<T>(
  17. {
  18. ...createDefaultOptions<T>("unified"),
  19. ...others,
  20. },
  21. workerPool,
  22. ),
  23. )
  24. createEffect(() => {
  25. container.innerHTML = ""
  26. file().render({
  27. file: local.file,
  28. lineAnnotations: local.annotations,
  29. containerWrapper: container,
  30. })
  31. })
  32. return (
  33. <div
  34. data-component="code"
  35. style={styleVariables}
  36. classList={{
  37. ...(local.classList || {}),
  38. [local.class ?? ""]: !!local.class,
  39. }}
  40. ref={container}
  41. />
  42. )
  43. }