{"version":3,"file":"column-box.cjs","sources":["../../src/util/column-box.ts"],"sourcesContent":["import h from \"@macrostrat/hyper\";\nimport { forwardRef, ForwardedRef } from \"react\";\nimport { useContext } from \"react\";\nimport { ColumnContext } from \"../context\";\nimport classNames from \"classnames\";\nimport { Box } from \"@macrostrat/ui-components\";\nimport { path } from \"d3-path\";\nimport type { Path } from \"d3-path\";\n\n// This could be merged with ColumnSVG\nexport function ColumnBox(props: any) {\n  const { offsetTop, absolutePosition, className, ...rest } = props;\n  const { pixelsPerMeter, zoom } = useContext(ColumnContext);\n\n  const marginTop = offsetTop * pixelsPerMeter * zoom;\n  let pos: any = { marginTop };\n  if (absolutePosition) {\n    pos = {\n      position: \"absolute\",\n      top: marginTop,\n    };\n  }\n\n  return h(Box, {\n    className: classNames(\"column-box\", className),\n    ...pos,\n    ...rest,\n  });\n}\n\nexport interface ClippableRectProps {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  /** Draw a zig-zag (torn) edge on the top, e.g. for a clipped unit. */\n  overflowTop?: boolean;\n  /** Draw a zig-zag (torn) edge on the bottom. */\n  overflowBottom?: boolean;\n  [key: string]: any;\n}\n\n/**\n * A rectangular column box rendered as an SVG `<path>`, with optional zig-zag\n * (torn) top/bottom edges for content clipped to a range. It always renders a\n * `path` (a plain rectangle when neither edge overflows), so the element type\n * never changes as clip state toggles — this keeps React from remounting the\n * node during age-window animations, which is essential for smooth transitions.\n *\n * Presentational only: it applies whatever `className` it is given. Callers in\n * CSS-module contexts should pass the already-resolved class name.\n */\nexport const ClippableRect = forwardRef(function ClippableRect(\n  props: ClippableRectProps,\n  ref: ForwardedRef<SVGPathElement>,\n) {\n  const {\n    x,\n    y,\n    width,\n    height,\n    overflowTop = false,\n    overflowBottom = false,\n    ...rest\n  } = props;\n  const d = zigZagBoxPath(x, y, width, height, overflowTop, overflowBottom);\n  return h(\"path\", { d, ref, ...rest });\n});\n\nexport function zigZagBoxPath(\n  x,\n  y,\n  width,\n  height,\n  top: boolean,\n  bottom: boolean,\n) {\n  const d = path();\n\n  const x1 = x + width;\n  // Start path at the top\n  d.moveTo(x, y);\n  if (top) {\n    drawZigZagAtConstantHeight(d, x, x1, y);\n  } else {\n    d.lineTo(x1, y);\n  }\n  const yBottom = y + height;\n  d.lineTo(x1, yBottom);\n  // Draw the bottom\n  if (bottom) {\n    drawZigZagAtConstantHeight(d, x1, x, yBottom);\n  } else {\n    d.lineTo(x, yBottom);\n  }\n  // Draw the left edge\n  d.closePath();\n\n  // Now render the path;\n  return d.toString();\n}\n\nexport function drawZigZagAtConstantHeight(d: Path, x0, x1, y) {\n  const zigZagWidth = 10;\n  const zigZagHeight = 4;\n\n  const deltaX = x1 - x0;\n  const width = Math.abs(deltaX);\n\n  const nZigZags = Math.floor(width / zigZagWidth - 0.5);\n  const _zigZagWidth = width / (nZigZags + 0.5);\n\n  let dy = zigZagHeight / 2;\n  // Each zig-zag consists of a short outward motion\n  let dx = _zigZagWidth / 4;\n\n  let cx = x0;\n  let cy = y;\n\n  if (deltaX < 0) {\n    dx = -dx;\n    dy = -dy;\n  }\n\n  const doZigZag = (last = false) => {\n    cx += dx;\n    cy -= dy;\n    d.lineTo(cx, cy);\n    let scalar = last ? 1 : 2;\n    cx += dx * scalar;\n    cy += dy * scalar;\n    d.lineTo(cx, cy);\n    cx += dx;\n    cy -= dy;\n  };\n\n  d.lineTo(x0, y);\n\n  // Move to the offset\n  //d.lineTo(cx, y);\n  // Draw the zig-zags\n  for (let i = 0; i < nZigZags; i++) {\n    doZigZag();\n  }\n  // Draw the last half zig-zag\n  doZigZag(true);\n  // Draw to the edge\n  d.lineTo(x1, y);\n}\n"],"names":["useContext","ColumnContext","h","Box","classNames","forwardRef","ClippableRect","path"],"mappings":";;;;;;;;;;;AAUO,SAAS,UAAU,OAAY;AACpC,QAAM,EAAE,WAAW,kBAAkB,WAAW,GAAG,SAAS;AAC5D,QAAM,EAAE,gBAAgB,SAASA,MAAAA,WAAWC,OAAAA,aAAa;AAEzD,QAAM,YAAY,YAAY,iBAAiB;AAC/C,MAAI,MAAW,EAAE,UAAA;AACjB,MAAI,kBAAkB;AACpB,UAAM;AAAA,MACJ,UAAU;AAAA,MACV,KAAK;AAAA,IAAA;AAAA,EAET;AAEA,SAAOC,WAAAA,QAAEC,aAAAA,KAAK;AAAA,IACZ,WAAWC,oBAAAA,QAAW,cAAc,SAAS;AAAA,IAC7C,GAAG;AAAA,IACH,GAAG;AAAA,EAAA,CACJ;AACH;AAwBO,MAAM,gBAAgBC,MAAAA,WAAW,SAASC,eAC/C,OACA,KACA;AACA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,GAAG;AAAA,EAAA,IACD;AACJ,QAAM,IAAI,cAAc,GAAG,GAAG,OAAO,QAAQ,aAAa,cAAc;AACxE,SAAOJ,WAAAA,QAAE,QAAQ,EAAE,GAAG,KAAK,GAAG,MAAM;AACtC,CAAC;AAEM,SAAS,cACd,GACA,GACA,OACA,QACA,KACA,QACA;AACA,QAAM,IAAIK,OAAAA,KAAA;AAEV,QAAM,KAAK,IAAI;AAEf,IAAE,OAAO,GAAG,CAAC;AACb,MAAI,KAAK;AACP,+BAA2B,GAAG,GAAG,IAAI,CAAC;AAAA,EACxC,OAAO;AACL,MAAE,OAAO,IAAI,CAAC;AAAA,EAChB;AACA,QAAM,UAAU,IAAI;AACpB,IAAE,OAAO,IAAI,OAAO;AAEpB,MAAI,QAAQ;AACV,+BAA2B,GAAG,IAAI,GAAG,OAAO;AAAA,EAC9C,OAAO;AACL,MAAE,OAAO,GAAG,OAAO;AAAA,EACrB;AAEA,IAAE,UAAA;AAGF,SAAO,EAAE,SAAA;AACX;AAEO,SAAS,2BAA2B,GAAS,IAAI,IAAI,GAAG;AAC7D,QAAM,cAAc;AACpB,QAAM,eAAe;AAErB,QAAM,SAAS,KAAK;AACpB,QAAM,QAAQ,KAAK,IAAI,MAAM;AAE7B,QAAM,WAAW,KAAK,MAAM,QAAQ,cAAc,GAAG;AACrD,QAAM,eAAe,SAAS,WAAW;AAEzC,MAAI,KAAK,eAAe;AAExB,MAAI,KAAK,eAAe;AAExB,MAAI,KAAK;AACT,MAAI,KAAK;AAET,MAAI,SAAS,GAAG;AACd,SAAK,CAAC;AACN,SAAK,CAAC;AAAA,EACR;AAEA,QAAM,WAAW,CAAC,OAAO,UAAU;AACjC,UAAM;AACN,UAAM;AACN,MAAE,OAAO,IAAI,EAAE;AACf,QAAI,SAAS,OAAO,IAAI;AACxB,UAAM,KAAK;AACX,UAAM,KAAK;AACX,MAAE,OAAO,IAAI,EAAE;AACf,UAAM;AACN,UAAM;AAAA,EACR;AAEA,IAAE,OAAO,IAAI,CAAC;AAKd,WAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,aAAA;AAAA,EACF;AAEA,WAAS,IAAI;AAEb,IAAE,OAAO,IAAI,CAAC;AAChB;;;;;"}