{"version":3,"file":"layout.cjs","sources":["../../src/context/layout.ts"],"sourcesContent":["import { scaleLinear, scaleOrdinal } from \"d3-scale\";\nimport { Component, createContext } from \"react\";\nimport h from \"@macrostrat/hyper\";\nimport {\n  ColumnContext,\n  useColumnDivisions,\n  ColumnCtx,\n  ColumnDivision,\n} from \"./column\";\nimport { useContext, useMemo, useCallback } from \"react\";\nimport { ReactNode } from \"react\";\n\n//# This isn't really used yet...\n\nexport interface ColumnLayoutCtx<\n  T extends ColumnDivision,\n> extends ColumnCtx<T> {\n  width: number;\n  grainSizes?: string[];\n  grainsizeScale?: (d: string) => number;\n  xScale: any;\n  widthForDivision: (d: ColumnDivision) => number;\n}\n\nconst ColumnLayoutContext = createContext<ColumnLayoutCtx<ColumnDivision>>({\n  scale: scaleLinear(),\n  scaleClamped: scaleLinear().clamp(true),\n  width: 0,\n  divisions: [],\n  grainSizes: [],\n  grainsizeScale: (d) => 40,\n  xScale: null,\n  widthForDivision: (d) => 0,\n  pixelsPerMeter: 1,\n  zoom: 1,\n});\n\nexport interface ColumnLayoutProviderProps<\n  T extends ColumnDivision,\n> extends Partial<ColumnCtx<T>> {\n  grainSizes?: string[];\n  grainsizeScale?: (d: string) => number;\n  width: number;\n  // @deprecated\n  xScale?: any;\n  children?: ReactNode;\n}\n\nfunction ColumnLayoutProvider<T extends ColumnDivision>({\n  children,\n  width,\n  grainSizes = [],\n  grainsizeScale = (d) => 40,\n  xScale,\n}: ColumnLayoutProviderProps<T>) {\n  const ctx = useContext(ColumnContext);\n  return h(\n    ColumnLayoutContext.Provider,\n    {\n      value: {\n        ...ctx,\n        width,\n        grainSizes,\n        grainsizeScale,\n        xScale,\n        widthForDivision: (d) => width,\n      },\n    },\n    children,\n  );\n}\n\nexport interface CrossAxisLayoutProviderProps {\n  width: number;\n  domain: number[];\n  range?: number[];\n  children?: ReactNode;\n}\n\nclass CrossAxisLayoutProvider extends Component<CrossAxisLayoutProviderProps> {\n  static contextType = ColumnContext;\n  declare context: ColumnCtx<ColumnDivision>;\n  render() {\n    let { domain, range, width, children } = this.props;\n    if (range == null) {\n      range = [0, width];\n    }\n    const xScale = scaleLinear().domain(domain).range(range);\n    return h(ColumnLayoutProvider, {\n      ...this.context,\n      xScale,\n      width,\n      children,\n    });\n  }\n}\n\nexport type GrainsizeLayoutProps = {\n  grainSizes: string[];\n  children?: ReactNode;\n  width?: number;\n  grainsizeScaleStart?: number;\n  grainsizeScaleRange?: [number, number];\n  tickPositions?: number[];\n};\n\nfunction GrainsizeLayoutProvider({\n  width,\n  grainSizes = [\"ms\", \"s\", \"vf\", \"f\", \"m\", \"c\", \"vc\", \"p\"],\n  grainsizeScaleStart = 50,\n  grainsizeScaleRange,\n  tickPositions,\n  children,\n}: GrainsizeLayoutProps) {\n  /**\n  Right now this provides a ColumnLayoutContext\n  but it could be reworked to provide a\n  separate \"GrainsizeLayoutContext\" if that seemed\n  appropriate.\n  */\n\n  if (grainsizeScaleRange == null) {\n    console.warn(\n      \"GrainsizeLayoutProvider: grainsizeScaleStart and width are deprecated in favor of grainsizeScaleRange\",\n    );\n  }\n\n  grainsizeScaleRange ??= [grainsizeScaleStart, width];\n  const divisions = useColumnDivisions();\n\n  const grainsizeScale: any = useMemo(() => {\n    const scale = scaleLinear()\n      .domain([0, grainSizes.length - 1])\n      .range(grainsizeScaleRange);\n\n    tickPositions ??= grainSizes.map((d, i) => scale(i));\n\n    return scaleOrdinal().domain(grainSizes).range(tickPositions);\n  }, [grainSizes, grainsizeScaleRange, tickPositions]);\n\n  // This function should probably be moved up a level\n  const grainsizeForDivision = useCallback(\n    (division) => {\n      let ix = divisions.indexOf(division);\n      // Search backwards through divisions\n      while (ix > 0) {\n        const { grainsize } = divisions[ix];\n        if (grainsize != null) {\n          return grainsize;\n        }\n        ix -= 1;\n      }\n    },\n    [divisions],\n  );\n\n  const widthForDivision = useCallback(\n    (division) => {\n      if (division == null) {\n        return width;\n      }\n      return grainsizeScale(grainsizeForDivision(division));\n    },\n    [grainsizeForDivision, grainsizeScale, width],\n  );\n\n  // This is slow to run each iteration\n  return h(\n    ColumnLayoutProvider,\n    {\n      width,\n      grainSizes,\n      grainsizeScale,\n      grainsizeScaleStart,\n      grainsizeScaleRange,\n      grainsizeForDivision,\n      widthForDivision,\n    } as any,\n    children,\n  );\n}\n\nexport function useColumnLayout() {\n  const ctx = useContext(ColumnLayoutContext);\n  if (ctx == null) {\n    throw new Error(\n      \"useColumnLayout must be used within a ColumnLayoutProvider\",\n    );\n  }\n  return ctx;\n}\n\nexport {\n  ColumnLayoutContext,\n  ColumnLayoutProvider,\n  CrossAxisLayoutProvider,\n  GrainsizeLayoutProvider,\n};\n"],"names":["createContext","scaleLinear","useContext","ColumnContext","h","Component","useColumnDivisions","useMemo","scaleOrdinal","useCallback"],"mappings":"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"}