{"version":3,"file":"box-model.cjs","sources":["../../src/util/box-model.ts"],"sourcesContent":["export interface StrictPadding {\n  paddingLeft: number;\n  paddingRight: number;\n  paddingTop: number;\n  paddingBottom: number;\n}\n\nexport interface Padding extends Partial<StrictPadding> {\n  paddingV?: number;\n  paddingH?: number;\n  padding?: number;\n}\n\nexport interface StrictMargin {\n  marginLeft: number;\n  marginRight: number;\n  marginTop: number;\n  marginBottom: number;\n}\n\nexport interface Margin extends Partial<StrictMargin> {\n  marginV?: number;\n  marginH?: number;\n  margin?: number;\n}\n\nconst keys = function (main) {\n  const allKeys = [\"\", \"V\", \"H\", \"Left\", \"Right\", \"Top\", \"Bottom\"];\n  return allKeys.map((d) => main + d);\n};\n\nconst keyRemover = (type) =>\n  function (obj) {\n    let o1 = obj;\n    for (let key of keys(type)) {\n      delete o1[key];\n    }\n    return o1;\n  };\n\nconst removeMargin = keyRemover(\"margin\");\nconst removePadding = keyRemover(\"padding\");\n\nfunction extractMargin<T extends object>(\n  obj: T & Margin,\n  remove = false,\n): StrictMargin {\n  /*\n  I'm really annoyed I can't find a third-party implementation\n  of this that covers edge cases...\n  This eventually is useful for a React version of the SVG \"margin convention\"\n  https://bl.ocks.org/mbostock/3019563\n  */\n  let {\n    marginLeft,\n    marginRight,\n    marginTop,\n    marginBottom,\n    marginV,\n    marginH,\n    margin,\n  } = obj;\n  if (margin == null) {\n    margin = 0;\n  }\n  if (marginV == null) {\n    marginV = margin;\n  }\n  if (marginH == null) {\n    marginH = margin;\n  }\n  if (marginLeft == null) {\n    marginLeft = marginH;\n  }\n  if (marginRight == null) {\n    marginRight = marginH;\n  }\n  if (marginTop == null) {\n    marginTop = marginV;\n  }\n  if (marginBottom == null) {\n    marginBottom = marginV;\n  }\n\n  if (remove) {\n    removeMargin(obj);\n  }\n\n  return { marginLeft, marginRight, marginTop, marginBottom };\n}\n\nfunction extractPadding<T>(obj: Padding & T, remove = false): StrictPadding {\n  /*\n  I'm really annoyed I can't find a third-party implementation\n  of this that covers edge cases...\n  This eventually is useful for a React version of the SVG \"padding convention\"\n  https://bl.ocks.org/mbostock/3019563\n  */\n  let {\n    paddingLeft,\n    paddingRight,\n    paddingTop,\n    paddingBottom,\n    paddingV,\n    paddingH,\n    padding,\n  } = obj;\n  if (padding == null) {\n    padding = 0;\n  }\n  if (paddingV == null) {\n    paddingV = padding;\n  }\n  if (paddingH == null) {\n    paddingH = padding;\n  }\n  if (paddingLeft == null) {\n    paddingLeft = paddingH;\n  }\n  if (paddingRight == null) {\n    paddingRight = paddingH;\n  }\n  if (paddingTop == null) {\n    paddingTop = paddingV;\n  }\n  if (paddingBottom == null) {\n    paddingBottom = paddingV;\n  }\n\n  if (remove) {\n    removePadding(obj);\n  }\n\n  return { paddingLeft, paddingRight, paddingTop, paddingBottom };\n}\n\nfunction expandMargin<T extends object>(obj: T & Margin): T & StrictMargin {\n  const margin = extractMargin(obj);\n  let o1 = { ...obj };\n  for (let key of [\"margin\", \"marginV\", \"marginH\"]) {\n    delete o1[key];\n  }\n  return { ...o1, ...margin };\n}\n\nfunction expandPadding<T extends object>(obj: T & Padding): T & StrictPadding {\n  const margin = extractPadding(obj);\n  let o1 = { ...obj };\n  for (let key of [\"padding\", \"paddingV\", \"paddingH\"]) {\n    delete o1[key];\n  }\n  return { ...o1, ...margin };\n}\n\nexport type InnerSizeProps = Padding & {\n  innerHeight?: number;\n  innerWidth?: number;\n  width?: number;\n  height?: number;\n};\n\nfunction expandInnerSize<T>(\n  obj: T & InnerSizeProps,\n  stripExtraKeys: boolean = true,\n): T & {\n  height?: number;\n  width?: number;\n} & StrictPadding {\n  const n = expandPadding(obj);\n  const { innerHeight, innerWidth, height, width, ...rest } = n;\n  if (innerHeight != null) {\n    if (n.height == null) {\n      n.height = innerHeight + n.paddingTop + n.paddingBottom;\n    }\n  }\n  if (innerWidth != null) {\n    if (n.width == null) {\n      n.width = innerWidth + n.paddingLeft + n.paddingRight;\n    }\n  }\n  if (stripExtraKeys) {\n    return removeInnerSize(n);\n  }\n  if (n.height != null) {\n    n.innerHeight ??= n.height - n.paddingTop - n.paddingBottom;\n  }\n  if (n.width != null) {\n    n.innerWidth ??= n.width - n.paddingLeft - n.paddingRight;\n  }\n\n  return n;\n}\n\nfunction removeInnerSize<T extends object>(obj: any) {\n  delete obj.innerHeight;\n  delete obj.innerWidth;\n  return obj;\n}\n\nexport {\n  extractMargin,\n  extractPadding,\n  expandMargin,\n  expandPadding,\n  expandInnerSize,\n  removeMargin,\n  removePadding,\n};\n"],"names":[],"mappings":"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"}