"use client" import { memo, useRef } from "react" import type { DocPageLayout } from "@/lib/drive/doc-page-setup" import { DOCS_HORIZONTAL_RULER_HEIGHT_PX } from "@/lib/drive/docs-page-layout-constants" import { docsPageLengthToScreen } from "@/lib/drive/docs-ruler-scale" import type { DocsParagraphIndents } from "@/lib/drive/use-docs-ruler-sync" import { buildHorizontalRulerTicks } from "@/lib/drive/docs-ruler-math" import type { DocsRulerMarginSide } from "@/lib/drive/docs-ruler-margin-math" import { DocsRulerDraggableHandle, DocsRulerFirstLineMarker, DocsRulerTriangleMarker, useRulerPointerDrag, } from "@/components/drive/richtext/docs-ruler-markers" function DocsHorizontalRulerInner({ pageLayout, scale, indents, editable, onMarginDragStart, onMarginDrag, onMarginDragEnd, }: { pageLayout: DocPageLayout scale: number indents: DocsParagraphIndents editable?: boolean onMarginDragStart?: (side: DocsRulerMarginSide) => void onMarginDrag?: (side: DocsRulerMarginSide, pagePx: number, clientX: number, clientY: number) => void onMarginDragEnd?: () => void }) { const rulerRef = useRef(null) const pageWidth = pageLayout.widthPx const margins = pageLayout.marginsPx const scaledWidth = docsPageLengthToScreen(pageWidth, scale) const ticks = buildHorizontalRulerTicks(pageWidth, pageLayout.format.id) const s = (px: number) => docsPageLengthToScreen(px, scale) const leftDrag = useRulerPointerDrag({ rulerRef, axis: "horizontal", disabled: !editable, onDrag: (pagePx, clientX, clientY) => onMarginDrag?.("left", pagePx, clientX, clientY), onDragEnd: () => onMarginDragEnd?.(), }) const rightDrag = useRulerPointerDrag({ rulerRef, axis: "horizontal", disabled: !editable, onDrag: (pagePx, clientX, clientY) => onMarginDrag?.("right", pagePx, clientX, clientY), onDragEnd: () => onMarginDragEnd?.(), }) const wrapMarginDown = (side: DocsRulerMarginSide, handler: (e: React.PointerEvent) => void) => (event: React.PointerEvent) => { onMarginDragStart?.(side) handler(event) } return (
{ticks.map((tick, index) => (
))} {ticks .filter((tick) => tick.major && tick.label != null) .map((tick) => ( {tick.label} ))} {Math.abs(indents.firstLinePx - indents.leftPx) > 1 ? ( ) : null}
) } export const DocsHorizontalRuler = memo(DocsHorizontalRulerInner)