{"version":3,"file":"flooding-surface.cjs","sources":["../src/flooding-surface.ts"],"sourcesContent":["import { scaleLinear } from \"d3-scale\";\nimport { useContext, createElement } from \"react\";\nimport h from \"@macrostrat/hyper\";\nimport { path } from \"d3-path\";\nimport { ColumnContext, ColumnCtx, ColumnDivision } from \"./context\";\nimport { UUIDComponent } from \"./frame\";\n\nexport function FloodingSurface(props: any) {\n  const { scale, divisions } = useContext(ColumnContext);\n  const { offsetLeft = -90, lineWidth = 50, onClick } = props;\n  const floodingSurfaces = divisions.filter(\n    (d) => d.flooding_surface_order != null,\n  );\n  if (!floodingSurfaces.length) {\n    return null;\n  }\n  return h(\n    \"g.flooding-surface\",\n    null,\n    floodingSurfaces.map(function (d) {\n      const y = scale(d.bottom);\n      const x = offsetLeft;\n\n      return h(\"line.flooding-surface\", {\n        transform: `translate(${x} ${y})`,\n        onClick,\n        key: d.id,\n        strokeWidth: (6 - Math.abs(d.flooding_surface_order)) * 0.75,\n        stroke: d.flooding_surface_order >= 0 ? \"#ccc\" : \"#fcc\",\n        x1: 0,\n        x2: lineWidth,\n      });\n    }),\n  );\n}\n\nfunction range(start: number, end: number): number[] {\n  if (start === end) return [start];\n  return [start, ...range(start + 1, end)];\n}\n\ninterface TriangleBarsProps {\n  offsetLeft: number;\n  lineWidth: number;\n  order: number;\n  orders: number[];\n  minOrder: number;\n  maxOrder: number;\n}\n\nexport class TriangleBars extends UUIDComponent<TriangleBarsProps> {\n  constructor(props: TriangleBarsProps) {\n    super(props);\n    this.renderSurfaces = this.renderSurfaces.bind(this);\n  }\n\n  static contextType = ColumnContext;\n  static defaultProps = {\n    offsetLeft: -90,\n    lineWidth: 50,\n    order: 2,\n  };\n\n  // @ts-ignore\n  context: ColumnCtx<ColumnDivision>;\n\n  render() {\n    let { offsetLeft, lineWidth, order, orders, minOrder, maxOrder } =\n      this.props;\n    const { scale, zoom, divisions } = this.context;\n\n    if (orders == null && minOrder != null && maxOrder != null) {\n      orders = range(minOrder, maxOrder);\n    }\n\n    const [bottom, top] = scale.range();\n    if (orders == null && order != null) {\n      orders = [order];\n    }\n\n    orders.reverse();\n\n    const _ = path();\n\n    const zigZagLine = function (x0, x1, y, nzigs = 5, a = 2) {\n      //_.moveTo(start...)\n      const xs = scaleLinear().domain([0, nzigs]).range([x0, x1]);\n\n      _.lineTo(x0, y);\n\n      for (\n        let i = 0, end = nzigs, asc = 0 <= end;\n        asc ? i < end : i > end;\n        asc ? i++ : i--\n      ) {\n        const x_ = xs(i);\n        let y_ = y;\n        if (i % 2 === 1) {\n          y_ += a;\n        }\n        _.lineTo(x_, y_);\n      }\n\n      return _.lineTo(x1, y);\n    };\n\n    const btm = bottom - top;\n    _.moveTo(-lineWidth, 0);\n    zigZagLine(-lineWidth, lineWidth, btm, 16, 3);\n    zigZagLine(lineWidth, -lineWidth, 0, 16, 3);\n    _.closePath();\n\n    return h(\"g.triangle-bars\", [\n      h(\"defs\", [\n        createElement(\"clipPath\", { id: this.UUID }, [\n          h(\"path\", { d: _.toString(), key: this.UUID + \"-path\" }),\n        ]),\n      ]),\n      orders.map(this.renderSurfaces),\n    ]);\n  }\n\n  renderSurfaces(order, index) {\n    let d, i;\n    const { scale, zoom, divisions } = this.context;\n    const { offsetLeft, lineWidth } = this.props;\n    if (!divisions.length) {\n      return null;\n    }\n    const w = lineWidth / 2;\n    const ol = offsetLeft + lineWidth * 2 + 5;\n    const surfaces: SequenceStratSurface[] = [];\n\n    for (i = 0; i < divisions.length; i++) {\n      d = divisions[i];\n      const { surface_type, surface_order } = d;\n      if (surface_type == null || surface_order == null) {\n        continue;\n      }\n      if (!(surface_order <= order)) {\n        continue;\n      }\n      const height = scale(d.bottom);\n      if (surface_type === \"mfs\") {\n        surfaces.push([\"mfs\", height]);\n      }\n      if (surface_type === \"sb\") {\n        if (surfaces.length === 0) {\n          surfaces.push([\"sb\", height]);\n          continue;\n        }\n        const sz = surfaces.length - 1;\n        if (surfaces[sz][0] === \"sb\") {\n          surfaces[sz][1] = height;\n        } else {\n          surfaces.push([\"sb\", height]);\n        }\n      }\n    }\n\n    if (!surfaces.length) {\n      return null;\n    }\n\n    const _ = path();\n    let basalMFS = null;\n    let sequenceBoundary = null;\n    for (i = 0; i < surfaces.length; i++) {\n      const top = surfaces[i];\n      if (top[0] === \"mfs\" && basalMFS != null) {\n        _.moveTo(0, basalMFS[1]);\n        if (sequenceBoundary != null) {\n          _.lineTo(w, sequenceBoundary[1]);\n          _.lineTo(0, top[1]);\n          _.lineTo(-w, sequenceBoundary[1]);\n          _.closePath();\n        } else {\n          _.lineTo(w, top[1]);\n          _.lineTo(-w, top[1]);\n          _.closePath();\n        }\n        sequenceBoundary = null;\n        basalMFS = null;\n      }\n      if (top[0] === \"mfs\") {\n        basalMFS = top;\n      } else if (top[0] === \"sb\") {\n        sequenceBoundary = top;\n      }\n    }\n\n    return h(\n      `g.level-${order}`,\n      {\n        clipPath: `url(#${this.UUID})`,\n        transform: `translate(${-lineWidth * (2 + index) + ol})`,\n        key: this.UUID + \"-\" + order,\n      },\n      [h(\"path\", { d: _.toString(), key: this.UUID + \"-\" + order })],\n    );\n  }\n}\n\ntype SequenceStratSurface = [\"mfs\" | \"sb\", number];\n"],"names":["useContext","ColumnContext","h","UUIDComponent","path","scaleLinear","createElement"],"mappings":";;;;;;;;;;AAOO,SAAS,gBAAgB,OAAY;AAC1C,QAAM,EAAE,OAAO,cAAcA,MAAAA,WAAWC,OAAAA,aAAa;AACrD,QAAM,EAAE,aAAa,KAAK,YAAY,IAAI,YAAY;AACtD,QAAM,mBAAmB,UAAU;AAAA,IACjC,CAAC,MAAM,EAAE,0BAA0B;AAAA,EAAA;AAErC,MAAI,CAAC,iBAAiB,QAAQ;AAC5B,WAAO;AAAA,EACT;AACA,SAAOC,WAAAA;AAAAA,IACL;AAAA,IACA;AAAA,IACA,iBAAiB,IAAI,SAAU,GAAG;AAChC,YAAM,IAAI,MAAM,EAAE,MAAM;AACxB,YAAM,IAAI;AAEV,aAAOA,WAAAA,QAAE,yBAAyB;AAAA,QAChC,WAAW,aAAa,CAAC,IAAI,CAAC;AAAA,QAC9B;AAAA,QACA,KAAK,EAAE;AAAA,QACP,cAAc,IAAI,KAAK,IAAI,EAAE,sBAAsB,KAAK;AAAA,QACxD,QAAQ,EAAE,0BAA0B,IAAI,SAAS;AAAA,QACjD,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,CACL;AAAA,IACH,CAAC;AAAA,EAAA;AAEL;AAEA,SAAS,MAAM,OAAe,KAAuB;AACnD,MAAI,UAAU,IAAK,QAAO,CAAC,KAAK;AAChC,SAAO,CAAC,OAAO,GAAG,MAAM,QAAQ,GAAG,GAAG,CAAC;AACzC;AAWO,MAAM,qBAAqBC,MAAAA,cAAiC;AAAA,EACjE,YAAY,OAA0B;AACpC,UAAM,KAAK;AACX,SAAK,iBAAiB,KAAK,eAAe,KAAK,IAAI;AAAA,EACrD;AAAA,EAEA,OAAO,cAAcF,OAAAA;AAAAA,EACrB,OAAO,eAAe;AAAA,IACpB,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO;AAAA,EAAA;AAAA;AAAA,EAIT;AAAA,EAEA,SAAS;AACP,QAAI,EAAE,YAAY,WAAW,OAAO,QAAQ,UAAU,aACpD,KAAK;AACP,UAAM,EAAE,OAAO,MAAM,UAAA,IAAc,KAAK;AAExC,QAAI,UAAU,QAAQ,YAAY,QAAQ,YAAY,MAAM;AAC1D,eAAS,MAAM,UAAU,QAAQ;AAAA,IACnC;AAEA,UAAM,CAAC,QAAQ,GAAG,IAAI,MAAM,MAAA;AAC5B,QAAI,UAAU,QAAQ,SAAS,MAAM;AACnC,eAAS,CAAC,KAAK;AAAA,IACjB;AAEA,WAAO,QAAA;AAEP,UAAM,IAAIG,OAAAA,KAAA;AAEV,UAAM,aAAa,SAAU,IAAI,IAAI,GAAG,QAAQ,GAAG,IAAI,GAAG;AAExD,YAAM,KAAKC,QAAAA,cAAc,OAAO,CAAC,GAAG,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AAE1D,QAAE,OAAO,IAAI,CAAC;AAEd,eACM,IAAI,GAAG,MAAM,OAAO,MAAM,KAAK,KACnC,MAAM,IAAI,MAAM,IAAI,KACpB,MAAM,MAAM,KACZ;AACA,cAAM,KAAK,GAAG,CAAC;AACf,YAAI,KAAK;AACT,YAAI,IAAI,MAAM,GAAG;AACf,gBAAM;AAAA,QACR;AACA,UAAE,OAAO,IAAI,EAAE;AAAA,MACjB;AAEA,aAAO,EAAE,OAAO,IAAI,CAAC;AAAA,IACvB;AAEA,UAAM,MAAM,SAAS;AACrB,MAAE,OAAO,CAAC,WAAW,CAAC;AACtB,eAAW,CAAC,WAAW,WAAW,KAAK,IAAI,CAAC;AAC5C,eAAW,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC;AAC1C,MAAE,UAAA;AAEF,WAAOH,WAAAA,QAAE,mBAAmB;AAAA,MAC1BA,WAAAA,QAAE,QAAQ;AAAA,QACRI,MAAAA,cAAc,YAAY,EAAE,IAAI,KAAK,QAAQ;AAAA,UAC3CJ,mBAAE,QAAQ,EAAE,GAAG,EAAE,SAAA,GAAY,KAAK,KAAK,OAAO,QAAA,CAAS;AAAA,QAAA,CACxD;AAAA,MAAA,CACF;AAAA,MACD,OAAO,IAAI,KAAK,cAAc;AAAA,IAAA,CAC/B;AAAA,EACH;AAAA,EAEA,eAAe,OAAO,OAAO;AAC3B,QAAI,GAAG;AACP,UAAM,EAAE,OAAO,MAAM,UAAA,IAAc,KAAK;AACxC,UAAM,EAAE,YAAY,UAAA,IAAc,KAAK;AACvC,QAAI,CAAC,UAAU,QAAQ;AACrB,aAAO;AAAA,IACT;AACA,UAAM,IAAI,YAAY;AACtB,UAAM,KAAK,aAAa,YAAY,IAAI;AACxC,UAAM,WAAmC,CAAA;AAEzC,SAAK,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACrC,UAAI,UAAU,CAAC;AACf,YAAM,EAAE,cAAc,cAAA,IAAkB;AACxC,UAAI,gBAAgB,QAAQ,iBAAiB,MAAM;AACjD;AAAA,MACF;AACA,UAAI,EAAE,iBAAiB,QAAQ;AAC7B;AAAA,MACF;AACA,YAAM,SAAS,MAAM,EAAE,MAAM;AAC7B,UAAI,iBAAiB,OAAO;AAC1B,iBAAS,KAAK,CAAC,OAAO,MAAM,CAAC;AAAA,MAC/B;AACA,UAAI,iBAAiB,MAAM;AACzB,YAAI,SAAS,WAAW,GAAG;AACzB,mBAAS,KAAK,CAAC,MAAM,MAAM,CAAC;AAC5B;AAAA,QACF;AACA,cAAM,KAAK,SAAS,SAAS;AAC7B,YAAI,SAAS,EAAE,EAAE,CAAC,MAAM,MAAM;AAC5B,mBAAS,EAAE,EAAE,CAAC,IAAI;AAAA,QACpB,OAAO;AACL,mBAAS,KAAK,CAAC,MAAM,MAAM,CAAC;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,QAAQ;AACpB,aAAO;AAAA,IACT;AAEA,UAAM,IAAIE,OAAAA,KAAA;AACV,QAAI,WAAW;AACf,QAAI,mBAAmB;AACvB,SAAK,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACpC,YAAM,MAAM,SAAS,CAAC;AACtB,UAAI,IAAI,CAAC,MAAM,SAAS,YAAY,MAAM;AACxC,UAAE,OAAO,GAAG,SAAS,CAAC,CAAC;AACvB,YAAI,oBAAoB,MAAM;AAC5B,YAAE,OAAO,GAAG,iBAAiB,CAAC,CAAC;AAC/B,YAAE,OAAO,GAAG,IAAI,CAAC,CAAC;AAClB,YAAE,OAAO,CAAC,GAAG,iBAAiB,CAAC,CAAC;AAChC,YAAE,UAAA;AAAA,QACJ,OAAO;AACL,YAAE,OAAO,GAAG,IAAI,CAAC,CAAC;AAClB,YAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AACnB,YAAE,UAAA;AAAA,QACJ;AACA,2BAAmB;AACnB,mBAAW;AAAA,MACb;AACA,UAAI,IAAI,CAAC,MAAM,OAAO;AACpB,mBAAW;AAAA,MACb,WAAW,IAAI,CAAC,MAAM,MAAM;AAC1B,2BAAmB;AAAA,MACrB;AAAA,IACF;AAEA,WAAOF,WAAAA;AAAAA,MACL,WAAW,KAAK;AAAA,MAChB;AAAA,QACE,UAAU,QAAQ,KAAK,IAAI;AAAA,QAC3B,WAAW,aAAa,CAAC,aAAa,IAAI,SAAS,EAAE;AAAA,QACrD,KAAK,KAAK,OAAO,MAAM;AAAA,MAAA;AAAA,MAEzB,CAACA,mBAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,KAAK,KAAK,OAAO,MAAM,MAAA,CAAO,CAAC;AAAA,IAAA;AAAA,EAEjE;AACF;;;"}