"use client" import { memo, useRef } from "react" import type { DocPageLayout } from "@/lib/drive/doc-page-setup" import { DOCS_VERTICAL_RULER_WIDTH_PX } from "@/lib/drive/docs-page-layout-constants" import { docsPageLengthToScreen } from "@/lib/drive/docs-ruler-scale" import { buildVerticalRulerTicks } from "@/lib/drive/docs-ruler-math" import type { DocsRulerMarginSide } from "@/lib/drive/docs-ruler-margin-math" import { DocsRulerDownTriangleMarker, DocsRulerDraggableHandle, DocsRulerUpTriangleMarker, useRulerPointerDrag, } from "@/components/drive/richtext/docs-ruler-markers" function DocsVerticalRulerInner({ pageLayout, scale, editable, onMarginDragStart, onMarginDrag, onMarginDragEnd, }: { pageLayout: DocPageLayout scale: number editable?: boolean onMarginDragStart?: (side: DocsRulerMarginSide) => void onMarginDrag?: (side: DocsRulerMarginSide, pagePx: number, clientX: number, clientY: number) => void onMarginDragEnd?: () => void }) { const rulerRef = useRef(null) const pageHeight = pageLayout.heightPx const margins = pageLayout.marginsPx const scaledHeight = docsPageLengthToScreen(pageHeight, scale) const ticks = buildVerticalRulerTicks(pageHeight, margins.top, pageLayout.format.id) const s = (px: number) => docsPageLengthToScreen(px, scale) const topDrag = useRulerPointerDrag({ rulerRef, axis: "vertical", disabled: !editable, onDrag: (pagePx, clientX, clientY) => onMarginDrag?.("top", pagePx, clientX, clientY), onDragEnd: () => onMarginDragEnd?.(), }) const bottomDrag = useRulerPointerDrag({ rulerRef, axis: "vertical", disabled: !editable, onDrag: (pagePx, clientX, clientY) => onMarginDrag?.("bottom", 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} ))}
) } export const DocsVerticalRuler = memo(DocsVerticalRulerInner)