{"version":3,"file":"index.mjs","sources":["../src/helpers/use-isomorphic-layout-effect.ts","../src/layout-service/layout-service.ts","../src/helpers/string.ts","../src/helpers/array.ts","../src/helpers/platform.ts","../src/sash/sash.ts","../src/split-view/split-view.ts","../src/pane-view/pane-view.ts","../src/allotment.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect } from \"react\";\n\nconst useIsomorphicLayoutEffect =\n  typeof window !== \"undefined\" &&\n  typeof window.document !== \"undefined\" &&\n  typeof window.document.createElement !== \"undefined\"\n    ? useLayoutEffect\n    : useEffect;\n\nexport default useIsomorphicLayoutEffect;\n","export class LayoutService {\n  private _size!: number;\n\n  public getSize() {\n    return this._size;\n  }\n\n  public setSize(size: number) {\n    this._size = size;\n  }\n}\n","/**\n * Checks if `string` ends with the given target string.\n */\nexport function endsWith(string: string, target: string): boolean {\n  const length = string.length;\n\n  const position = length - target.length;\n\n  return position >= 0 && string.slice(position, length) === target;\n}\n","/**\n * Pushes an element to the start of the array, if found.\n */\nexport function pushToStart<T>(arr: T[], value: T): void {\n  const index = arr.indexOf(value);\n\n  if (index > -1) {\n    arr.splice(index, 1);\n    arr.unshift(value);\n  }\n}\n\n/**\n * Pushes an element to the end of the array, if found.\n */\nexport function pushToEnd<T>(arr: T[], value: T): void {\n  const index = arr.indexOf(value);\n\n  if (index > -1) {\n    arr.splice(index, 1);\n    arr.push(value);\n  }\n}\n\n/**\n * Returns an array containing an arithmetic progression.\n *\n * @param start Specifies the range’s initial value. The start is inclusive (included in the returned array)\n * @param stop The stop value is exclusive; it is not included in the result\n * @param step If step is positive, the last element is the largest start + i * step less than stop; if step is negative, the last element is the smallest start + i * step greater than stop\n */\nexport function range(start: number, stop: number, step: number = 1): number[] {\n  const n = Math.max(0, Math.ceil((stop - start) / step));\n  const range = new Array(n);\n\n  let i = -1;\n\n  while (++i < n) {\n    range[i] = start + i * step;\n  }\n\n  return range;\n}\n","let _isIOS = false;\nlet _isMacintosh = false;\nlet _userAgent: string | undefined = undefined;\n\ninterface INavigator {\n  maxTouchPoints?: number;\n  userAgent: string;\n}\n\ndeclare const navigator: INavigator;\n\n// Web environment\nif (typeof navigator === \"object\") {\n  _userAgent = navigator.userAgent;\n  _isMacintosh = _userAgent.indexOf(\"Macintosh\") >= 0;\n  _isIOS =\n    (_userAgent.indexOf(\"Macintosh\") >= 0 ||\n      _userAgent.indexOf(\"iPad\") >= 0 ||\n      _userAgent.indexOf(\"iPhone\") >= 0) &&\n    !!navigator.maxTouchPoints &&\n    navigator.maxTouchPoints > 0;\n}\n\nexport const isIOS = _isIOS;\nexport const isMacintosh = _isMacintosh;\n","import EventEmitter from \"eventemitter3\";\nimport debounce from \"lodash.debounce\";\n\nimport { Disposable } from \"../helpers/disposable\";\nimport { isIOS, isMacintosh } from \"../helpers/platform\";\nimport styles from \"./sash.module.css\";\n\nexport interface SashOptions {\n  /** Whether a sash is horizontal or vertical. */\n  readonly orientation: Orientation;\n\n  /** The width or height of a vertical or horizontal sash, respectively. */\n  readonly size?: number;\n}\n\nexport interface SashEvent {\n  startX: number;\n  currentX: number;\n  startY: number;\n  currentY: number;\n}\n\nexport enum Orientation {\n  Vertical = \"VERTICAL\",\n  Horizontal = \"HORIZONTAL\",\n}\n\nexport enum SashState {\n  /** Disable any UI interaction. */\n  Disabled = \"DISABLED\",\n\n  /**\n   * Allow dragging down or to the right, depending on the sash orientation.\n   *\n   * Some OSs allow customizing the mouse cursor differently whenever\n   * some resizable component can't be any smaller, but can be larger.\n   */\n  Minimum = \"MINIMUM\",\n\n  /**\n   * Allow dragging up or to the left, depending on the sash orientation.\n   *\n   * Some OSs allow customizing the mouse cursor differently whenever\n   * some resizable component can't be any larger, but can be smaller.\n   */\n  Maximum = \"MAXIMUM\",\n\n  /** Enable dragging. */\n  Enabled = \"ENABLED\",\n}\n\nlet globalSize = isIOS ? 20 : 8;\n\nexport interface SashLayoutProvider {}\n\n/** A vertical sash layout provider provides position and height for a sash. */\nexport interface VerticalSashLayoutProvider extends SashLayoutProvider {\n  getVerticalSashLeft(sash: Sash): number;\n  getVerticalSashTop?(sash: Sash): number;\n  getVerticalSashHeight?(sash: Sash): number;\n}\n\n/** A horizontal sash layout provider provides position and width for a sash. */\nexport interface HorizontalSashLayoutProvider extends SashLayoutProvider {\n  getHorizontalSashTop(sash: Sash): number;\n  getHorizontalSashLeft?(sash: Sash): number;\n  getHorizontalSashWidth?(sash: Sash): number;\n}\n\n/**\n * The {@link Sash} is the UI component which allows the user to resize other\n * components. It's usually an invisible horizontal or vertical line which, when\n * hovered, becomes highlighted and can be dragged along the perpendicular dimension\n * to its direction.\n */\nexport class Sash extends EventEmitter implements Disposable {\n  private el: HTMLElement;\n  private layoutProvider: SashLayoutProvider;\n  private orientation!: Orientation;\n  private size: number;\n  private hoverDelay = 300;\n  private hoverDelayer = debounce(\n    (el) => el.classList.add(\"sash-hover\", styles.hover),\n    this.hoverDelay,\n  );\n\n  private _state: SashState = SashState.Enabled;\n  get state(): SashState {\n    return this._state;\n  }\n\n  /**\n   * The state of a sash defines whether it can be interacted with by the user\n   * as well as what mouse cursor to use, when hovered.\n   */\n  set state(state: SashState) {\n    if (this._state === state) {\n      return;\n    }\n\n    this.el.classList.toggle(styles.disabled, state === SashState.Disabled);\n    this.el.classList.toggle(\"sash-disabled\", state === SashState.Disabled);\n    this.el.classList.toggle(styles.minimum, state === SashState.Minimum);\n    this.el.classList.toggle(\"sash-minimum\", state === SashState.Minimum);\n    this.el.classList.toggle(styles.maximum, state === SashState.Maximum);\n    this.el.classList.toggle(\"sash-maximum\", state === SashState.Maximum);\n\n    this._state = state;\n\n    this.emit(\"enablementChange\", state);\n  }\n\n  /**\n   * Create a new vertical sash.\n   *\n   * @param container A DOM node to append the sash to.\n   * @param verticalLayoutProvider A vertical layout provider.\n   * @param options The options.\n   */\n  constructor(\n    container: HTMLElement,\n    layoutProvider: VerticalSashLayoutProvider,\n    options: SashOptions,\n  );\n\n  /**\n   * Create a new horizontal sash.\n   *\n   * @param container A DOM node to append the sash to.\n   * @param horizontalLayoutProvider A horizontal layout provider.\n   * @param options The options.\n   */\n  constructor(\n    container: HTMLElement,\n    layoutProvider: HorizontalSashLayoutProvider,\n    options: SashOptions,\n  );\n  constructor(\n    container: HTMLElement,\n    layoutProvider: SashLayoutProvider,\n    options: SashOptions,\n  ) {\n    super();\n\n    this.el = document.createElement(\"div\");\n    this.el.classList.add(\"sash\", styles.sash);\n    this.el.dataset.testid = \"sash\";\n    container.append(this.el);\n\n    if (isMacintosh) {\n      this.el.classList.add(\"sash-mac\", styles.mac);\n    }\n\n    this.el.addEventListener(\"pointerdown\", this.onPointerStart);\n    this.el.addEventListener(\"dblclick\", this.onPointerDoublePress);\n    this.el.addEventListener(\"mouseenter\", this.onMouseEnter);\n    this.el.addEventListener(\"mouseleave\", this.onMouseLeave);\n\n    if (typeof options.size === \"number\") {\n      this.size = options.size;\n\n      if (options.orientation === Orientation.Vertical) {\n        this.el.style.width = `${this.size}px`;\n      } else {\n        this.el.style.height = `${this.size}px`;\n      }\n    } else {\n      this.size = globalSize;\n\n      // onDidChangeGlobalSize.on(\"onDidChangeGlobalSize\", (size) => {\n      //   this.size = size;\n      //   this.layout();\n      // });\n    }\n\n    this.layoutProvider = layoutProvider;\n\n    this.orientation = options.orientation ?? Orientation.Vertical;\n\n    if (this.orientation === Orientation.Horizontal) {\n      this.el.classList.add(\"sash-horizontal\", styles.horizontal);\n      this.el.classList.remove(\"sash-vertical\", styles.vertical);\n    } else {\n      this.el.classList.remove(\"sash-horizontal\", styles.horizontal);\n      this.el.classList.add(\"sash-vertical\", styles.vertical);\n    }\n    setTimeout(() => {\n      this.layout();\n    });\n  }\n\n  private onPointerStart = (event: PointerEvent) => {\n    const startX = event.pageX;\n    const startY = event.pageY;\n\n    const startEvent: SashEvent = {\n      startX,\n      currentX: startX,\n      startY,\n      currentY: startY,\n    };\n\n    this.el.classList.add(\"sash-active\", styles.active);\n\n    this.emit(\"start\", startEvent);\n\n    this.el.setPointerCapture(event.pointerId);\n\n    const onPointerMove = (event: PointerEvent) => {\n      event.preventDefault();\n\n      const moveEvent: SashEvent = {\n        startX,\n        currentX: event.pageX,\n        startY,\n        currentY: event.pageY,\n      };\n\n      this.emit(\"change\", moveEvent);\n    };\n\n    const onPointerUp = (event: PointerEvent): void => {\n      event.preventDefault();\n\n      this.el.classList.remove(\"sash-active\", styles.active);\n      this.hoverDelayer.cancel();\n      this.emit(\"end\");\n\n      this.el.releasePointerCapture(event.pointerId);\n\n      window.removeEventListener(\"pointermove\", onPointerMove);\n      window.removeEventListener(\"pointerup\", onPointerUp);\n    };\n\n    window.addEventListener(\"pointermove\", onPointerMove);\n    window.addEventListener(\"pointerup\", onPointerUp);\n  };\n\n  private onPointerDoublePress = (): void => {\n    this.emit(\"reset\");\n  };\n\n  private onMouseEnter = (): void => {\n    if (this.el.classList.contains(styles.active)) {\n      this.hoverDelayer.cancel();\n      this.el.classList.add(\"sash-hover\", styles.hover);\n    } else {\n      this.hoverDelayer(this.el);\n    }\n  };\n\n  private onMouseLeave = (): void => {\n    this.hoverDelayer.cancel();\n    this.el.classList.remove(\"sash-hover\", styles.hover);\n  };\n\n  /**\n   * Layout the sash. The sash will size and position itself\n   * based on its provided {@link SashLayoutProvider layout provider}.\n   */\n  public layout(): void {\n    if (this.orientation === Orientation.Vertical) {\n      const verticalProvider = this\n        .layoutProvider as VerticalSashLayoutProvider;\n\n      this.el.style.left =\n        verticalProvider.getVerticalSashLeft(this) - this.size / 2 + \"px\";\n\n      if (verticalProvider.getVerticalSashTop) {\n        this.el.style.top = verticalProvider.getVerticalSashTop(this) + \"px\";\n      }\n\n      if (verticalProvider.getVerticalSashHeight) {\n        this.el.style.height =\n          verticalProvider.getVerticalSashHeight(this) + \"px\";\n      }\n    } else {\n      const horizontalProvider = this\n        .layoutProvider as HorizontalSashLayoutProvider;\n\n      this.el.style.top =\n        horizontalProvider.getHorizontalSashTop(this) - this.size / 2 + \"px\";\n\n      if (horizontalProvider.getHorizontalSashLeft) {\n        this.el.style.left =\n          horizontalProvider.getHorizontalSashLeft(this) + \"px\";\n      }\n\n      if (horizontalProvider.getHorizontalSashWidth) {\n        this.el.style.width =\n          horizontalProvider.getHorizontalSashWidth(this) + \"px\";\n      }\n    }\n  }\n\n  public dispose(): void {\n    this.el.removeEventListener(\"pointerdown\", this.onPointerStart);\n    this.el.removeEventListener(\"dblclick\", this.onPointerDoublePress);\n    this.el.removeEventListener(\"mouseenter\", this.onMouseEnter);\n    this.el.removeEventListener(\"mouseleave\", this.onMouseLeave);\n\n    // Cancel any pending hover timeout to drop closures to this.el\n    this.hoverDelayer.cancel();\n\n    // Remove all EventEmitter listeners to prevent memory leaks\n    this.removeAllListeners();\n\n    this.el.remove();\n  }\n}\n","import EventEmitter from \"eventemitter3\";\nimport clamp from \"lodash.clamp\";\n\nimport styles from \"../allotment.module.css\";\nimport { pushToEnd, pushToStart, range } from \"../helpers/array\";\nimport { Disposable } from \"../helpers/disposable\";\nimport {\n  Orientation,\n  Sash,\n  SashEvent as BaseSashEvent,\n  SashState,\n} from \"../sash\";\n\ninterface SashEvent {\n  readonly sash: Sash;\n  readonly start: number;\n  readonly current: number;\n}\n\n/**\n * When adding or removing views, distribute the delta space among\n * all other views.\n */\nexport type DistributeSizing = { type: \"distribute\" };\n\n/**\n * When adding or removing views, split the delta space with another\n * specific view, indexed by the provided `index`.\n */\nexport type SplitSizing = { type: \"split\"; index: number };\n\n/**\n * When adding or removing views, assume the view is invisible.\n */\nexport type InvisibleSizing = { type: \"invisible\"; cachedVisibleSize: number };\n\n/**\n * When adding or removing views, the sizing provides fine grained\n * control over how other views get resized.\n */\nexport type Sizing = DistributeSizing | SplitSizing | InvisibleSizing;\n\nexport namespace Sizing {\n  /**\n   * When adding or removing views, distribute the delta space among\n   * all other views.\n   */\n  export const Distribute: DistributeSizing = { type: \"distribute\" };\n\n  /**\n   * When adding or removing views, split the delta space with another\n   * specific view, indexed by the provided `index`.\n   */\n  export function Split(index: number): SplitSizing {\n    return { type: \"split\", index };\n  }\n\n  /**\n   * When adding or removing views, assume the view is invisible.\n   */\n  export function Invisible(cachedVisibleSize: number): InvisibleSizing {\n    return { type: \"invisible\", cachedVisibleSize };\n  }\n}\n\n/** A descriptor for a {@link SplitView} instance. */\nexport interface SplitViewDescriptor {\n  /** The layout size of the {@link SplitView}. */\n  size: number;\n\n  /**\n   * Descriptors for each {@link View view}.\n   */\n  views: {\n    /** Whether the {@link View view} is visible. */\n    visible?: boolean;\n\n    /** The size of the {@link View view}. */\n    size: number;\n\n    container: HTMLElement;\n    view: View;\n  }[];\n}\n\nexport interface SplitViewOptions {\n  /** Which axis the views align on. */\n  readonly orientation?: Orientation;\n\n  /** Resize each view proportionally when resizing the SplitView. */\n  readonly proportionalLayout?: boolean;\n\n  /**\n   * An initial description of this {@link SplitView} instance, allowing\n   * to initialze all views within the ctor.\n   */\n  readonly descriptor?: SplitViewDescriptor;\n\n  /** Override the orthogonal size of sashes. */\n  readonly getSashOrthogonalSize?: () => number;\n}\n\nexport enum LayoutPriority {\n  Normal = \"NORMAL\",\n  Low = \"LOW\",\n  High = \"HIGH\",\n}\n\n/**\n * The interface to implement for views within a {@link SplitView}.\n */\nexport interface View {\n  /** The DOM element for this view. */\n  readonly element: HTMLElement;\n\n  /**\n   * A minimum size for this view.\n   *\n   * @remarks If none, set it to `0`.\n   */\n  readonly minimumSize: number;\n\n  /**\n   * A minimum size for this view.\n   *\n   * @remarks If none, set it to `Number.POSITIVE_INFINITY`.\n   */\n  readonly maximumSize: number;\n\n  /**\n   * The priority of the view when the {@link SplitView.resize layout} algorithm\n   * runs. Views with higher priority will be resized first.\n   *\n   * @remarks Only used when `proportionalLayout` is false.\n   */\n  readonly priority?: LayoutPriority;\n\n  /**\n   * Whether the view will snap whenever the user reaches its minimum size or\n   * attempts to grow it beyond the minimum size.\n   */\n  readonly snap?: boolean;\n\n  /**\n   * This will be called by the {@link SplitView} during layout. A view meant to\n   * pass along the layout information down to its descendants.\n   *\n   * @param size The size of this view, in pixels.\n   * @param offset The offset of this view, relative to the start of the {@link SplitView}.\n   */\n  layout(size: number, offset: number): void;\n\n  /**\n   * This will be called by the {@link SplitView} whenever this view is made\n   * visible or hidden.\n   *\n   * @param visible Whether the view becomes visible.\n   */\n  setVisible?(visible: boolean): void;\n}\n\ntype ViewItemSize = number | { cachedVisibleSize: number };\n\nabstract class ViewItem {\n  protected container: HTMLElement;\n  public view: View;\n  private _size: number;\n\n  constructor(container: HTMLElement, view: View, size: ViewItemSize) {\n    this.container = container;\n    this.view = view;\n\n    this.container.classList.add(\"split-view-view\", styles.splitViewView);\n    this.container.dataset.testid = \"split-view-view\";\n\n    if (typeof size === \"number\") {\n      this._size = size;\n      this._cachedVisibleSize = undefined;\n      container.classList.add(\"split-view-view-visible\");\n    } else {\n      this._size = 0;\n      this._cachedVisibleSize = size.cachedVisibleSize;\n    }\n  }\n\n  set size(size: number) {\n    this._size = size;\n  }\n\n  get size(): number {\n    return this._size;\n  }\n\n  get priority(): LayoutPriority | undefined {\n    return this.view.priority;\n  }\n\n  get snap(): boolean {\n    return !!this.view.snap;\n  }\n\n  private _cachedVisibleSize: number | undefined = undefined;\n  get cachedVisibleSize(): number | undefined {\n    return this._cachedVisibleSize;\n  }\n\n  get visible(): boolean {\n    return typeof this._cachedVisibleSize === \"undefined\";\n  }\n\n  public setVisible(visible: boolean, size?: number): void {\n    if (visible === this.visible) {\n      return;\n    }\n\n    if (visible) {\n      this.size = clamp(\n        this._cachedVisibleSize!,\n        this.viewMinimumSize,\n        this.viewMaximumSize,\n      );\n      this._cachedVisibleSize = undefined;\n    } else {\n      this._cachedVisibleSize = typeof size === \"number\" ? size : this.size;\n      this.size = 0;\n    }\n\n    this.container.classList.toggle(\"split-view-view-visible\", visible);\n\n    if (this.view.setVisible) {\n      this.view.setVisible(visible);\n    }\n  }\n\n  get minimumSize(): number {\n    return this.visible ? this.view.minimumSize : 0;\n  }\n  get viewMinimumSize(): number {\n    return this.view.minimumSize;\n  }\n\n  get maximumSize(): number {\n    return this.visible ? this.view.maximumSize : 0;\n  }\n  get viewMaximumSize(): number {\n    return this.view.maximumSize;\n  }\n\n  set enabled(enabled: boolean) {\n    this.container.style.pointerEvents = enabled ? \"\" : \"none\";\n  }\n\n  layout(offset: number): void {\n    this.layoutContainer(offset);\n    this.view.layout(this.size, offset);\n  }\n\n  abstract layoutContainer(offset: number): void;\n}\n\nclass HorizontalViewItem extends ViewItem {\n  layoutContainer(offset: number): void {\n    this.container.style.left = `${offset}px`;\n    this.container.style.width = `${this.size}px`;\n  }\n}\n\nclass VerticalViewItem extends ViewItem {\n  layoutContainer(offset: number): void {\n    this.container.style.top = `${offset}px`;\n    this.container.style.height = `${this.size}px`;\n  }\n}\n\ninterface SashItem {\n  sash: Sash;\n}\n\ninterface SashDragSnapState {\n  readonly index: number;\n  readonly limitDelta: number;\n  readonly size: number;\n}\n\ninterface SashDragState {\n  index: number;\n  start: number;\n  current: number;\n  sizes: number[];\n  minDelta: number;\n  maxDelta: number;\n  snapBefore: SashDragSnapState | undefined;\n  snapAfter: SashDragSnapState | undefined;\n}\n\n/**\n * The {@link SplitView} is the UI component which implements a one dimensional\n * flex-like layout algorithm for a collection of {@link View} instances, which\n * are essentially HTMLElement instances with the following size constraints:\n *\n * - {@link View.minimumSize}\n * - {@link View.maximumSize}\n * - {@link View.snap}\n *\n * In case the SplitView doesn't have enough size to fit all views, it will overflow\n * its content with a scrollbar.\n *\n * In between each pair of views there will be a {@link Sash} allowing the user\n * to resize the views, making sure the constraints are respected.\n */\nexport class SplitView extends EventEmitter implements Disposable {\n  public onDidChange: ((sizes: number[]) => void) | undefined;\n  public onDidDragStart: ((sizes: number[]) => void) | undefined;\n  public onDidDragEnd: ((sizes: number[]) => void) | undefined;\n\n  /**  This {@link SplitView}'s orientation. */\n  readonly orientation: Orientation;\n\n  private sashContainer: HTMLElement;\n  private size = 0;\n  private contentSize = 0;\n  private proportions: undefined | number[] = undefined;\n  private viewItems: ViewItem[] = [];\n  private sashItems: SashItem[] = [];\n  private sashDragState: SashDragState | undefined;\n  private proportionalLayout: boolean;\n  private readonly getSashOrthogonalSize: { (): number } | undefined;\n\n  private _startSnappingEnabled = true;\n  get startSnappingEnabled(): boolean {\n    return this._startSnappingEnabled;\n  }\n\n  /**\n   * Enable/disable snapping at the beginning of this {@link SplitView}.\n   */\n  set startSnappingEnabled(startSnappingEnabled: boolean) {\n    if (this._startSnappingEnabled === startSnappingEnabled) {\n      return;\n    }\n\n    this._startSnappingEnabled = startSnappingEnabled;\n    this.updateSashEnablement();\n  }\n\n  private _endSnappingEnabled = true;\n  get endSnappingEnabled(): boolean {\n    return this._endSnappingEnabled;\n  }\n\n  /**\n   * Enable/disable snapping at the end of this {@link SplitView}.\n   */\n  set endSnappingEnabled(endSnappingEnabled: boolean) {\n    if (this._endSnappingEnabled === endSnappingEnabled) {\n      return;\n    }\n\n    this._endSnappingEnabled = endSnappingEnabled;\n    this.updateSashEnablement();\n  }\n\n  /** Create a new {@link SplitView} instance. */\n  constructor(\n    container: HTMLElement,\n    options: SplitViewOptions = {},\n    onDidChange?: (sizes: number[]) => void,\n    onDidDragStart?: (sizes: number[]) => void,\n    onDidDragEnd?: (sizes: number[]) => void,\n  ) {\n    super();\n\n    this.orientation = options.orientation ?? Orientation.Vertical;\n    this.proportionalLayout = options.proportionalLayout ?? true;\n    this.getSashOrthogonalSize = options.getSashOrthogonalSize;\n\n    if (onDidChange) {\n      this.onDidChange = onDidChange;\n    }\n\n    if (onDidDragStart) {\n      this.onDidDragStart = onDidDragStart;\n    }\n\n    if (onDidDragEnd) {\n      this.onDidDragEnd = onDidDragEnd;\n    }\n\n    this.sashContainer = document.createElement(\"div\");\n\n    this.sashContainer.classList.add(\"sash-container\", styles.sashContainer);\n    container.prepend(this.sashContainer); // Should always be first child\n\n    // We have an existing set of view, add them now\n    if (options.descriptor) {\n      this.size = options.descriptor.size;\n\n      for (const [\n        index,\n        viewDescriptor,\n      ] of options.descriptor.views.entries()) {\n        const size = viewDescriptor.size;\n\n        const container = viewDescriptor.container;\n        const view = viewDescriptor.view;\n\n        this.addView(container, view, size, index, true);\n      }\n\n      // Initialize content size and proportions for first layout\n      this.contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);\n      this.saveProportions();\n    }\n  }\n\n  /**\n   * Add a {@link View view} to this {@link SplitView}.\n   *\n   * @param container The container element.\n   * @param view The view to add.\n   * @param size Either a fixed size, or a dynamic {@link Sizing} strategy.\n   * @param index The index to insert the view on.\n   * @param skipLayout Whether layout should be skipped.\n   */\n  public addView(\n    container: HTMLElement,\n    view: View,\n    size: number | Sizing,\n    index = this.viewItems.length,\n    skipLayout?: boolean,\n  ) {\n    let viewSize: ViewItemSize;\n\n    if (typeof size === \"number\") {\n      viewSize = size;\n    } else if (size.type === \"split\") {\n      viewSize = this.getViewSize(size.index) / 2;\n    } else if (size.type === \"invisible\") {\n      viewSize = { cachedVisibleSize: size.cachedVisibleSize };\n    } else {\n      viewSize = view.minimumSize;\n    }\n\n    const item =\n      this.orientation === Orientation.Vertical\n        ? new VerticalViewItem(container, view, viewSize)\n        : new HorizontalViewItem(container, view, viewSize);\n\n    this.viewItems.splice(index, 0, item);\n\n    if (this.viewItems.length > 1) {\n      const sash =\n        this.orientation === Orientation.Vertical\n          ? new Sash(\n              this.sashContainer,\n              {\n                getHorizontalSashTop: (s) => this.getSashPosition(s),\n                getHorizontalSashWidth: this.getSashOrthogonalSize,\n              },\n              { orientation: Orientation.Horizontal },\n            )\n          : new Sash(\n              this.sashContainer,\n              {\n                getVerticalSashLeft: (s) => this.getSashPosition(s),\n                getVerticalSashHeight: this.getSashOrthogonalSize,\n              },\n              { orientation: Orientation.Vertical },\n            );\n\n      const sashEventMapper =\n        this.orientation === Orientation.Vertical\n          ? (e: BaseSashEvent) => ({\n              sash,\n              start: e.startY,\n              current: e.currentY,\n            })\n          : (e: BaseSashEvent) => ({\n              sash,\n              start: e.startX,\n              current: e.currentX,\n            });\n\n      sash.on(\"start\", (event: BaseSashEvent) => {\n        this.emit(\"sashDragStart\");\n        this.onSashStart(sashEventMapper(event));\n        const sizes = this.viewItems.map((i) => i.size);\n        this.onDidDragStart?.(sizes);\n      });\n\n      sash.on(\"change\", (event: BaseSashEvent) =>\n        this.onSashChange(sashEventMapper(event)),\n      );\n\n      sash.on(\"end\", () => {\n        this.emit(\"sashDragEnd\");\n        this.onSashEnd(this.sashItems.findIndex((item) => item.sash === sash));\n        const sizes = this.viewItems.map((i) => i.size);\n        this.onDidDragEnd?.(sizes);\n      });\n\n      sash.on(\"reset\", () => {\n        const index = this.sashItems.findIndex((item) => item.sash === sash);\n        const upIndexes = range(index, -1, -1);\n        const downIndexes = range(index + 1, this.viewItems.length);\n        const snapBeforeIndex = this.findFirstSnapIndex(upIndexes);\n        const snapAfterIndex = this.findFirstSnapIndex(downIndexes);\n\n        if (\n          typeof snapBeforeIndex === \"number\" &&\n          !this.viewItems[snapBeforeIndex].visible\n        ) {\n          return;\n        }\n\n        if (\n          typeof snapAfterIndex === \"number\" &&\n          !this.viewItems[snapAfterIndex].visible\n        ) {\n          return;\n        }\n\n        this.emit(\"sashreset\", index);\n      });\n\n      const sashItem: SashItem = { sash };\n\n      this.sashItems.splice(index - 1, 0, sashItem);\n    }\n\n    if (!skipLayout) {\n      this.relayout();\n    }\n\n    if (!skipLayout && typeof size !== \"number\" && size.type === \"distribute\") {\n      this.distributeViewSizes();\n    }\n  }\n\n  /**\n   * Remove a {@link View view} from this {@link SplitView}.\n   *\n   * @param index The index where the {@link View view} is located.\n   * @param sizing Whether to distribute other {@link View view}'s sizes.\n   */\n  public removeView(index: number, sizing?: Sizing): View {\n    if (index < 0 || index >= this.viewItems.length) {\n      throw new Error(\"Index out of bounds\");\n    }\n\n    // Remove view\n    const viewItem = this.viewItems.splice(index, 1)[0];\n    const view = viewItem.view;\n\n    // Remove sash\n    if (this.viewItems.length >= 1) {\n      const sashIndex = Math.max(index - 1, 0);\n      const sashItem = this.sashItems.splice(sashIndex, 1)[0];\n      sashItem.sash.dispose();\n    }\n\n    this.relayout();\n\n    if (sizing && sizing.type === \"distribute\") {\n      this.distributeViewSizes();\n    }\n\n    return view;\n  }\n\n  /**\n   * Move a {@link View view} to a different index.\n   *\n   * @param from The source index.\n   * @param to The target index.\n   */\n  public moveView(container: HTMLElement, from: number, to: number): void {\n    const cachedVisibleSize = this.getViewCachedVisibleSize(from);\n\n    const sizing =\n      typeof cachedVisibleSize === \"undefined\"\n        ? this.getViewSize(from)\n        : Sizing.Invisible(cachedVisibleSize);\n\n    const view = this.removeView(from);\n    this.addView(container, view, sizing, to);\n  }\n\n  /**\n   * Returns the {@link View view}'s size previously to being hidden.\n   *\n   * @param index The {@link View view} index.\n   */\n  private getViewCachedVisibleSize(index: number): number | undefined {\n    if (index < 0 || index >= this.viewItems.length) {\n      throw new Error(\"Index out of bounds\");\n    }\n\n    const viewItem = this.viewItems[index];\n    return viewItem.cachedVisibleSize;\n  }\n\n  /**\n   * Layout the {@link SplitView}.\n   *\n   * @param size The entire size of the {@link SplitView}.\n   */\n  public layout(size: number = this.size): void {\n    const previousSize = Math.max(this.size, this.contentSize);\n    this.size = size;\n\n    if (!this.proportions) {\n      const indexes = range(0, this.viewItems.length);\n\n      const lowPriorityIndexes = indexes.filter(\n        (i) => this.viewItems[i].priority === LayoutPriority.Low,\n      );\n\n      const highPriorityIndexes = indexes.filter(\n        (i) => this.viewItems[i].priority === LayoutPriority.High,\n      );\n\n      this.resize(\n        this.viewItems.length - 1,\n        size - previousSize,\n        undefined,\n        lowPriorityIndexes,\n        highPriorityIndexes,\n      );\n    } else {\n      for (let i = 0; i < this.viewItems.length; i++) {\n        const item = this.viewItems[i];\n\n        item.size = clamp(\n          Math.round(this.proportions[i] * size),\n          item.minimumSize,\n          item.maximumSize,\n        );\n      }\n    }\n\n    this.distributeEmptySpace();\n    this.layoutViews();\n  }\n\n  /**\n   * Resize a {@link View view} within the {@link SplitView}.\n   *\n   * @param index The {@link View view} index.\n   * @param size The {@link View view} size.\n   */\n  public resizeView(index: number, size: number): void {\n    if (index < 0 || index >= this.viewItems.length) {\n      return;\n    }\n\n    const indexes = range(0, this.viewItems.length).filter((i) => i !== index);\n\n    const lowPriorityIndexes = [\n      ...indexes.filter(\n        (i) => this.viewItems[i].priority === LayoutPriority.Low,\n      ),\n      index,\n    ];\n\n    const highPriorityIndexes = indexes.filter(\n      (i) => this.viewItems[i].priority === LayoutPriority.High,\n    );\n\n    const item = this.viewItems[index];\n    size = Math.round(size);\n    size = clamp(size, item.minimumSize, Math.min(item.maximumSize, this.size));\n\n    item.size = size;\n    this.relayout(lowPriorityIndexes, highPriorityIndexes);\n  }\n\n  public resizeViews(sizes: number[]): void {\n    for (let index = 0; index < sizes.length; index++) {\n      const item = this.viewItems[index];\n      let size = sizes[index];\n\n      size = Math.round(size);\n\n      size = clamp(\n        size,\n        item.minimumSize,\n        Math.min(item.maximumSize, this.size),\n      );\n\n      item.size = size;\n    }\n\n    this.contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);\n    this.saveProportions();\n    this.layout(this.size);\n  }\n\n  /**\n   * Returns the sizes of all {@link View views}.\n   */\n  public getViewSizes(): number[] {\n    return this.viewItems.map((i) => i.size);\n  }\n\n  /**\n   * Returns the size of a {@link View view}.\n   */\n  public getViewSize(index: number): number {\n    if (index < 0 || index >= this.viewItems.length) {\n      return -1;\n    }\n\n    return this.viewItems[index].size;\n  }\n\n  /**\n   * Returns whether the {@link View view} is visible.\n   *\n   * @param index The {@link View view} index.\n   */\n  isViewVisible(index: number): boolean {\n    if (index < 0 || index >= this.viewItems.length) {\n      throw new Error(\"Index out of bounds\");\n    }\n\n    const viewItem = this.viewItems[index];\n    return viewItem.visible;\n  }\n\n  /**\n   * Set a {@link View view}'s visibility.\n   *\n   * @param index The {@link View view} index.\n   * @param visible Whether the {@link View view} should be visible.\n   */\n  setViewVisible(index: number, visible: boolean): void {\n    if (index < 0 || index >= this.viewItems.length) {\n      throw new Error(\"Index out of bounds\");\n    }\n\n    const viewItem = this.viewItems[index];\n    viewItem.setVisible(visible);\n\n    this.distributeEmptySpace(index);\n    this.layoutViews();\n    this.saveProportions();\n  }\n\n  /**\n   * Distribute the entire {@link SplitView} size among all {@link View views}.\n   */\n  public distributeViewSizes(): void {\n    const flexibleViewItems: ViewItem[] = [];\n    let flexibleSize = 0;\n\n    for (const item of this.viewItems) {\n      if (item.maximumSize - item.minimumSize > 0) {\n        flexibleViewItems.push(item);\n        flexibleSize += item.size;\n      }\n    }\n\n    const size = Math.floor(flexibleSize / flexibleViewItems.length);\n\n    for (const item of flexibleViewItems) {\n      item.size = clamp(size, item.minimumSize, item.maximumSize);\n    }\n\n    const indexes = range(0, this.viewItems.length);\n\n    const lowPriorityIndexes = indexes.filter(\n      (i) => this.viewItems[i].priority === LayoutPriority.Low,\n    );\n\n    const highPriorityIndexes = indexes.filter(\n      (i) => this.viewItems[i].priority === LayoutPriority.High,\n    );\n\n    this.relayout(lowPriorityIndexes, highPriorityIndexes);\n  }\n\n  public dispose(): void {\n    this.sashItems.forEach((sashItem) => sashItem.sash.dispose());\n    this.sashItems = [];\n\n    // Remove all EventEmitter listeners to prevent memory leaks\n    this.removeAllListeners();\n\n    this.sashContainer.remove();\n  }\n\n  private relayout(\n    lowPriorityIndexes?: number[],\n    highPriorityIndexes?: number[],\n  ): void {\n    const contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);\n\n    this.resize(\n      this.viewItems.length - 1,\n      this.size - contentSize,\n      undefined,\n      lowPriorityIndexes,\n      highPriorityIndexes,\n    );\n\n    this.distributeEmptySpace();\n    this.layoutViews();\n    this.saveProportions();\n  }\n\n  private onSashStart({ sash, start }: SashEvent): void {\n    const index = this.sashItems.findIndex((item) => item.sash === sash);\n\n    const resetSashDragState = (start: number) => {\n      const sizes = this.viewItems.map((i) => i.size);\n\n      let minDelta = Number.NEGATIVE_INFINITY;\n      let maxDelta = Number.POSITIVE_INFINITY;\n\n      let snapBefore: SashDragSnapState | undefined;\n      let snapAfter: SashDragSnapState | undefined;\n\n      const upIndexes = range(index, -1, -1);\n      const downIndexes = range(index + 1, this.viewItems.length);\n\n      const minDeltaUp = upIndexes.reduce(\n        (r, i) => r + (this.viewItems[i].minimumSize - sizes[i]),\n        0,\n      );\n\n      const maxDeltaUp = upIndexes.reduce(\n        (r, i) => r + (this.viewItems[i].viewMaximumSize - sizes[i]),\n        0,\n      );\n\n      const maxDeltaDown =\n        downIndexes.length === 0\n          ? Number.POSITIVE_INFINITY\n          : downIndexes.reduce(\n              (r, i) => r + (sizes[i] - this.viewItems[i].minimumSize),\n              0,\n            );\n\n      const minDeltaDown =\n        downIndexes.length === 0\n          ? Number.NEGATIVE_INFINITY\n          : downIndexes.reduce(\n              (r, i) => r + (sizes[i] - this.viewItems[i].viewMaximumSize),\n              0,\n            );\n\n      minDelta = Math.max(minDeltaUp, minDeltaDown);\n      maxDelta = Math.min(maxDeltaDown, maxDeltaUp);\n\n      const snapBeforeIndex = this.findFirstSnapIndex(upIndexes);\n      const snapAfterIndex = this.findFirstSnapIndex(downIndexes);\n\n      if (typeof snapBeforeIndex === \"number\") {\n        const viewItem = this.viewItems[snapBeforeIndex];\n        const halfSize = Math.floor(viewItem.viewMinimumSize / 2);\n\n        snapBefore = {\n          index: snapBeforeIndex,\n          limitDelta: viewItem.visible\n            ? minDelta - halfSize\n            : minDelta + halfSize,\n          size: viewItem.size,\n        };\n      }\n\n      if (typeof snapAfterIndex === \"number\") {\n        const viewItem = this.viewItems[snapAfterIndex];\n        const halfSize = Math.floor(viewItem.viewMinimumSize / 2);\n\n        snapAfter = {\n          index: snapAfterIndex,\n          limitDelta: viewItem.visible\n            ? maxDelta + halfSize\n            : maxDelta - halfSize,\n          size: viewItem.size,\n        };\n      }\n\n      this.sashDragState = {\n        start,\n        current: start,\n        index,\n        sizes,\n        minDelta,\n        maxDelta,\n        snapBefore,\n        snapAfter,\n      };\n    };\n\n    resetSashDragState(start);\n  }\n\n  private onSashChange({ current }: SashEvent): void {\n    const { index, start, sizes, minDelta, maxDelta, snapBefore, snapAfter } =\n      this.sashDragState!;\n\n    this.sashDragState!.current = current;\n\n    const delta = current - start;\n\n    // TODO: Should this be conditional on alt?\n    this.resize(\n      index,\n      delta,\n      sizes,\n      undefined,\n      undefined,\n      minDelta,\n      maxDelta,\n      snapBefore,\n      snapAfter,\n    );\n\n    this.distributeEmptySpace();\n    this.layoutViews();\n  }\n\n  private onSashEnd = (index: number): void => {\n    this.emit(\"sashchange\", index);\n    this.saveProportions();\n\n    for (const item of this.viewItems) {\n      item.enabled = true;\n    }\n  };\n\n  private getSashPosition(sash: Sash): number {\n    let position = 0;\n\n    for (let i = 0; i < this.sashItems.length; i++) {\n      position += this.viewItems[i].size;\n\n      if (this.sashItems[i].sash === sash) {\n        return position;\n      }\n    }\n\n    return 0;\n  }\n\n  private resize(\n    index: number,\n    delta: number,\n    sizes = this.viewItems.map((i) => i.size),\n    lowPriorityIndexes?: number[],\n    highPriorityIndexes?: number[],\n    overloadMinDelta: number = Number.NEGATIVE_INFINITY,\n    overloadMaxDelta: number = Number.POSITIVE_INFINITY,\n    snapBefore?: SashDragSnapState,\n    snapAfter?: SashDragSnapState,\n  ): number {\n    if (index < 0 || index >= this.viewItems.length) {\n      return 0;\n    }\n\n    const upIndexes = range(index, -1, -1);\n    const downIndexes = range(index + 1, this.viewItems.length);\n\n    if (highPriorityIndexes) {\n      for (const index of highPriorityIndexes) {\n        pushToStart(upIndexes, index);\n        pushToStart(downIndexes, index);\n      }\n    }\n\n    if (lowPriorityIndexes) {\n      for (const index of lowPriorityIndexes) {\n        pushToEnd(upIndexes, index);\n        pushToEnd(downIndexes, index);\n      }\n    }\n\n    const upItems = upIndexes.map((i) => this.viewItems[i]);\n    const upSizes = upIndexes.map((i) => sizes[i]);\n\n    const downItems = downIndexes.map((i) => this.viewItems[i]);\n    const downSizes = downIndexes.map((i) => sizes[i]);\n\n    const minDeltaUp = upIndexes.reduce(\n      (r, i) => r + (this.viewItems[i].minimumSize - sizes[i]),\n      0,\n    );\n\n    const maxDeltaUp = upIndexes.reduce(\n      (r, i) => r + (this.viewItems[i].maximumSize - sizes[i]),\n      0,\n    );\n\n    const maxDeltaDown =\n      downIndexes.length === 0\n        ? Number.POSITIVE_INFINITY\n        : downIndexes.reduce(\n            (r, i) => r + (sizes[i] - this.viewItems[i].minimumSize),\n            0,\n          );\n\n    const minDeltaDown =\n      downIndexes.length === 0\n        ? Number.NEGATIVE_INFINITY\n        : downIndexes.reduce(\n            (r, i) => r + (sizes[i] - this.viewItems[i].maximumSize),\n            0,\n          );\n\n    const minDelta = Math.max(minDeltaUp, minDeltaDown, overloadMinDelta);\n    const maxDelta = Math.min(maxDeltaDown, maxDeltaUp, overloadMaxDelta);\n\n    let snapped = false;\n\n    if (snapBefore) {\n      const snapView = this.viewItems[snapBefore.index];\n      const visible = delta >= snapBefore.limitDelta;\n      snapped = visible !== snapView.visible;\n      snapView.setVisible(visible, snapBefore.size);\n    }\n\n    if (!snapped && snapAfter) {\n      const snapView = this.viewItems[snapAfter.index];\n      const visible = delta < snapAfter.limitDelta;\n      snapped = visible !== snapView.visible;\n      snapView.setVisible(visible, snapAfter.size);\n    }\n\n    if (snapped) {\n      return this.resize(\n        index,\n        delta,\n        sizes,\n        lowPriorityIndexes,\n        highPriorityIndexes,\n        overloadMinDelta,\n        overloadMaxDelta,\n      );\n    }\n\n    delta = clamp(delta, minDelta, maxDelta);\n\n    for (let i = 0, deltaUp = delta; i < upItems.length; i++) {\n      const item = upItems[i];\n\n      const size = clamp(\n        upSizes[i] + deltaUp,\n        item.minimumSize,\n        item.maximumSize,\n      );\n\n      const viewDelta = size - upSizes[i];\n\n      deltaUp -= viewDelta;\n\n      item.size = size;\n    }\n\n    for (let i = 0, deltaDown = delta; i < downItems.length; i++) {\n      const item = downItems[i];\n\n      const size = clamp(\n        downSizes[i] - deltaDown,\n        item.minimumSize,\n        item.maximumSize,\n      );\n\n      const viewDelta = size - downSizes[i];\n\n      deltaDown += viewDelta;\n      item.size = size;\n    }\n\n    return delta;\n  }\n\n  private distributeEmptySpace(lowPriorityIndex?: number): void {\n    const contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);\n    let emptyDelta = this.size - contentSize;\n\n    const indexes = range(this.viewItems.length - 1, -1, -1);\n\n    if (typeof lowPriorityIndex === \"number\") {\n      pushToEnd(indexes, lowPriorityIndex);\n    }\n\n    for (let i = 0; emptyDelta !== 0 && i < indexes.length; i++) {\n      const item = this.viewItems[indexes[i]];\n      const size = clamp(\n        item.size + emptyDelta,\n        item.minimumSize,\n        item.maximumSize,\n      );\n\n      const viewDelta = size - item.size;\n\n      emptyDelta -= viewDelta;\n      item.size = size;\n    }\n  }\n\n  private layoutViews(): void {\n    // Save new content size\n    this.contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);\n\n    // Layout views\n    let offset = 0;\n\n    for (const viewItem of this.viewItems) {\n      viewItem.layout(offset);\n      offset += viewItem.size;\n    }\n\n    this.onDidChange?.(this.viewItems.map((viewItem) => viewItem.size));\n\n    // Layout sashes\n    this.sashItems.forEach((item) => item.sash.layout());\n    this.updateSashEnablement();\n  }\n\n  private saveProportions(): void {\n    if (this.proportionalLayout && this.contentSize > 0) {\n      this.proportions = this.viewItems.map((i) => i.size / this.contentSize);\n    }\n  }\n\n  private updateSashEnablement(): void {\n    let previous = false;\n\n    const collapsesDown = this.viewItems.map(\n      (i) => (previous = i.size - i.minimumSize > 0 || previous),\n    );\n\n    previous = false;\n\n    const expandsDown = this.viewItems.map(\n      (i) => (previous = i.maximumSize - i.size > 0 || previous),\n    );\n\n    const reverseViews = [...this.viewItems].reverse();\n\n    previous = false;\n\n    const collapsesUp = reverseViews\n      .map((i) => (previous = i.size - i.minimumSize > 0 || previous))\n      .reverse();\n\n    previous = false;\n\n    const expandsUp = reverseViews\n      .map((i) => (previous = i.maximumSize - i.size > 0 || previous))\n      .reverse();\n\n    let position = 0;\n\n    for (let index = 0; index < this.sashItems.length; index++) {\n      const { sash } = this.sashItems[index];\n      const viewItem = this.viewItems[index];\n\n      position += viewItem.size;\n\n      const min = !(collapsesDown[index] && expandsUp[index + 1]);\n      const max = !(expandsDown[index] && collapsesUp[index + 1]);\n\n      if (min && max) {\n        const upIndexes = range(index, -1, -1);\n        const downIndexes = range(index + 1, this.viewItems.length);\n        const snapBeforeIndex = this.findFirstSnapIndex(upIndexes);\n        const snapAfterIndex = this.findFirstSnapIndex(downIndexes);\n\n        const snappedBefore =\n          typeof snapBeforeIndex === \"number\" &&\n          !this.viewItems[snapBeforeIndex].visible;\n\n        const snappedAfter =\n          typeof snapAfterIndex === \"number\" &&\n          !this.viewItems[snapAfterIndex].visible;\n\n        if (\n          snappedBefore &&\n          collapsesUp[index] &&\n          (position > 0 || this.startSnappingEnabled)\n        ) {\n          sash.state = SashState.Minimum;\n        } else if (\n          snappedAfter &&\n          collapsesDown[index] &&\n          (position < this.contentSize || this.endSnappingEnabled)\n        ) {\n          sash.state = SashState.Maximum;\n        } else {\n          sash.state = SashState.Disabled;\n        }\n      } else if (min && !max) {\n        sash.state = SashState.Minimum;\n      } else if (!min && max) {\n        sash.state = SashState.Maximum;\n      } else {\n        sash.state = SashState.Enabled;\n      }\n    }\n  }\n\n  private findFirstSnapIndex(indexes: number[]): number | undefined {\n    for (const index of indexes) {\n      const viewItem = this.viewItems[index];\n\n      if (!viewItem.visible) {\n        continue;\n      }\n\n      if (viewItem.snap) {\n        return index;\n      }\n    }\n\n    for (const index of indexes) {\n      const viewItem = this.viewItems[index];\n\n      if (viewItem.visible && viewItem.maximumSize - viewItem.minimumSize > 0) {\n        return undefined;\n      }\n\n      if (!viewItem.visible && viewItem.snap) {\n        return index;\n      }\n    }\n\n    return undefined;\n  }\n}\n","import { endsWith } from \"../helpers/string\";\nimport { LayoutService } from \"../layout-service\";\nimport { LayoutPriority, View } from \"../split-view\";\n\nexport interface Layout {\n  getPreferredSize: () => number | undefined;\n}\n\nexport class PixelLayout implements Layout {\n  private size: number;\n\n  constructor(size: number) {\n    this.size = size;\n  }\n\n  public getPreferredSize() {\n    return this.size;\n  }\n}\n\nexport class ProportionLayout implements Layout {\n  private proportion: number;\n  private layoutService: LayoutService;\n\n  constructor(proportion: number, layoutService: LayoutService) {\n    this.proportion = proportion;\n    this.layoutService = layoutService;\n  }\n\n  public getPreferredSize() {\n    return this.proportion * this.layoutService.getSize();\n  }\n}\n\nexport class NullLayout implements Layout {\n  public getPreferredSize() {\n    return undefined;\n  }\n}\n\nexport interface PaneViewOptions {\n  element: HTMLElement;\n  minimumSize?: number;\n  maximumSize?: number;\n  priority?: LayoutPriority;\n  preferredSize?: number | string;\n  snap?: boolean;\n}\n\nexport class PaneView implements View {\n  public minimumSize: number = 0;\n  public maximumSize: number = Number.POSITIVE_INFINITY;\n\n  readonly element: HTMLElement;\n  readonly priority?: LayoutPriority | undefined;\n  readonly snap: boolean;\n\n  private layoutService: LayoutService;\n  private layoutStrategy: Layout;\n\n  get preferredSize(): number | undefined {\n    return this.layoutStrategy.getPreferredSize();\n  }\n\n  set preferredSize(preferredSize: number | string | undefined) {\n    if (typeof preferredSize === \"number\") {\n      this.layoutStrategy = new PixelLayout(preferredSize);\n    } else if (typeof preferredSize === \"string\") {\n      const trimmedPreferredSize = preferredSize.trim();\n\n      if (endsWith(trimmedPreferredSize, \"%\")) {\n        const proportion = Number(trimmedPreferredSize.slice(0, -1)) / 100;\n\n        this.layoutStrategy = new ProportionLayout(\n          proportion,\n          this.layoutService\n        );\n      } else if (endsWith(trimmedPreferredSize, \"px\")) {\n        const pixels = Number(trimmedPreferredSize.slice(0, -2)) / 100;\n\n        this.layoutStrategy = new PixelLayout(pixels);\n      } else if (typeof Number.parseFloat(trimmedPreferredSize) === \"number\") {\n        const number = Number.parseFloat(trimmedPreferredSize);\n\n        this.layoutStrategy = new PixelLayout(number);\n      } else {\n        this.layoutStrategy = new NullLayout();\n      }\n    } else {\n      this.layoutStrategy = new NullLayout();\n    }\n  }\n\n  constructor(layoutService: LayoutService, options: PaneViewOptions) {\n    this.layoutService = layoutService;\n    this.element = options.element;\n\n    this.minimumSize =\n      typeof options.minimumSize === \"number\" ? options.minimumSize : 30;\n\n    this.maximumSize =\n      typeof options.maximumSize === \"number\"\n        ? options.maximumSize\n        : Number.POSITIVE_INFINITY;\n\n    if (typeof options.preferredSize === \"number\") {\n      this.layoutStrategy = new PixelLayout(options.preferredSize);\n    } else if (typeof options.preferredSize === \"string\") {\n      const preferredSize = options.preferredSize.trim();\n\n      if (endsWith(preferredSize, \"%\")) {\n        const proportion = Number(preferredSize.slice(0, -1)) / 100;\n\n        this.layoutStrategy = new ProportionLayout(\n          proportion,\n          this.layoutService\n        );\n      } else if (endsWith(preferredSize, \"px\")) {\n        const pixels = Number(preferredSize.slice(0, -2));\n\n        this.layoutStrategy = new PixelLayout(pixels);\n      } else if (typeof Number.parseFloat(preferredSize) === \"number\") {\n        const number = Number.parseFloat(preferredSize);\n\n        this.layoutStrategy = new PixelLayout(number);\n      } else {\n        this.layoutStrategy = new NullLayout();\n      }\n    } else {\n      this.layoutStrategy = new NullLayout();\n    }\n\n    this.priority = options.priority ?? LayoutPriority.Normal;\n\n    this.snap = typeof options.snap === \"boolean\" ? options.snap : false;\n  }\n\n  layout(_size: number): void {}\n}\n","import classNames from \"classnames\";\nimport clamp from \"lodash.clamp\";\nimport isEqual from \"lodash.isequal\";\nimport React, {\n  forwardRef,\n  useCallback,\n  useEffect,\n  useImperativeHandle,\n  useMemo,\n  useRef,\n  useState,\n} from \"react\";\nimport useResizeObserver from \"use-resize-observer\";\n\nimport styles from \"./allotment.module.css\";\nimport { isIOS } from \"./helpers/platform\";\nimport useIsomorphicLayoutEffect from \"./helpers/use-isomorphic-layout-effect\";\nimport { LayoutService } from \"./layout-service\";\nimport { PaneView } from \"./pane-view\";\nimport { Orientation } from \"./sash\";\nimport {\n  LayoutPriority,\n  Sizing,\n  SplitView,\n  SplitViewOptions,\n} from \"./split-view\";\n\nfunction isPane(item: React.ReactNode | typeof Pane): item is typeof Pane {\n  return (item as any).type.displayName === \"Allotment.Pane\";\n}\n\nfunction isPaneProps(props: AllotmentProps | PaneProps): props is PaneProps {\n  return (\n    (props as PaneProps).minSize !== undefined ||\n    (props as PaneProps).maxSize !== undefined ||\n    (props as PaneProps).preferredSize !== undefined ||\n    (props as PaneProps).priority !== undefined ||\n    (props as PaneProps).visible !== undefined\n  );\n}\n\nexport interface CommonProps {\n  /** Sets a className attribute on the outer component */\n  className?: string;\n  /** Maximum size of each element */\n  maxSize?: number;\n  /** Minimum size of each element */\n  minSize?: number;\n  /** Enable snap to zero size */\n  snap?: boolean;\n}\n\nexport type PaneProps = {\n  children: React.ReactNode;\n  /**\n   * Preferred size of this pane. Allotment will attempt to use this size when adding this pane (including on initial mount) as well as when a user double clicks a sash, or the `reset` method is called on the Allotment instance.\n   * @remarks The size can either be a number or a string. If it is a number it will be interpreted as a number of pixels. If it is a string it should end in either \"px\" or \"%\". If it ends in \"px\" it will be interpreted as a number of pixels, e.g. \"120px\". If it ends in \"%\" it will be interpreted as a percentage of the size of the Allotment component, e.g. \"50%\".\n   */\n  preferredSize?: number | string;\n  /**\n   * The priority of the pane when the layout algorithm runs. Panes with higher priority will be resized first.\n   * @remarks Only used when `proportionalLayout` is false.\n   */\n  priority?: LayoutPriority;\n  /** Whether the pane should be visible */\n  visible?: boolean;\n} & CommonProps;\n\n/**\n * Pane component.\n */\nexport const Pane = forwardRef<HTMLDivElement, PaneProps>(\n  ({ className, children }: PaneProps, ref) => {\n    return (\n      <div\n        ref={ref}\n        className={classNames(\n          \"split-view-view\",\n          styles.splitViewView,\n          className,\n        )}\n      >\n        {children}\n      </div>\n    );\n  },\n);\n\nPane.displayName = \"Allotment.Pane\";\n\nexport type AllotmentHandle = {\n  reset: () => void;\n  resize: (sizes: number[]) => void;\n};\n\nexport type AllotmentProps = {\n  children: React.ReactNode;\n  /** Initial size of each element */\n  defaultSizes?: number[];\n  /** The id to set on the SplitView component. */\n  id?: string;\n  /** Resize each view proportionally when resizing container */\n  proportionalLayout?: boolean;\n  /** Whether to render a separator between panes */\n  separator?: boolean;\n  /**\n   * Initial size of each element\n   * @deprecated Use {@link AllotmentProps.defaultSizes defaultSizes} instead\n   */\n  sizes?: number[];\n  /** Direction to split */\n  vertical?: boolean;\n  /** Callback on drag */\n  onChange?: (sizes: number[]) => void;\n  /** Callback on reset */\n  onReset?: () => void;\n  /** Callback on visibility change */\n  onVisibleChange?: (index: number, visible: boolean) => void;\n  /** Callback on drag start */\n  onDragStart?: (sizes: number[]) => void;\n  /** Callback on drag end */\n  onDragEnd?: (sizes: number[]) => void;\n} & CommonProps;\n\n/**\n * React split-pane component.\n */\nconst Allotment = forwardRef<AllotmentHandle, AllotmentProps>(\n  (\n    {\n      children,\n      className,\n      id,\n      maxSize = Infinity,\n      minSize = 30,\n      proportionalLayout = true,\n      separator = true,\n      sizes,\n      defaultSizes = sizes,\n      snap = false,\n      vertical = false,\n      onChange,\n      onReset,\n      onVisibleChange,\n      onDragStart,\n      onDragEnd,\n    },\n    ref,\n  ) => {\n    const containerRef = useRef<HTMLDivElement>(null!);\n    const previousKeys = useRef<string[]>([]);\n    const splitViewPropsRef = useRef(new Map<React.Key, PaneProps>());\n    const splitViewRef = useRef<SplitView | null>(null);\n    const splitViewViewRef = useRef(new Map<React.Key, HTMLElement>());\n    const layoutService = useRef<LayoutService>(new LayoutService());\n    const views = useRef<PaneView[]>([]);\n\n    const [dimensionsInitialized, setDimensionsInitialized] = useState(false);\n\n    // if (process.env.NODE_ENV !== \"production\" && sizes) {\n    //   console.warn(\n    //     `Prop sizes is deprecated. Please use defaultSizes instead.`,\n    //   );\n    // }\n\n    const childrenArray = useMemo(\n      () => React.Children.toArray(children).filter(React.isValidElement),\n      [children],\n    );\n\n    const resizeToPreferredSize = useCallback((index: number): boolean => {\n      const view = views.current?.[index];\n\n      if (typeof view?.preferredSize !== \"number\") {\n        return false;\n      }\n\n      splitViewRef.current?.resizeView(index, Math.round(view.preferredSize));\n\n      return true;\n    }, []);\n\n    useImperativeHandle(ref, () => ({\n      reset: () => {\n        if (onReset) {\n          onReset();\n        } else {\n          splitViewRef.current?.distributeViewSizes();\n\n          for (let index = 0; index < views.current.length; index++) {\n            resizeToPreferredSize(index);\n          }\n        }\n      },\n      resize: (sizes) => {\n        splitViewRef.current?.resizeViews(sizes);\n      },\n    }));\n\n    useIsomorphicLayoutEffect(() => {\n      let initializeSizes = true;\n\n      if (\n        defaultSizes &&\n        splitViewViewRef.current.size !== defaultSizes.length\n      ) {\n        initializeSizes = false;\n\n        console.warn(\n          `Expected ${defaultSizes.length} children based on defaultSizes but found ${splitViewViewRef.current.size}`,\n        );\n      }\n\n      if (initializeSizes && defaultSizes) {\n        previousKeys.current = childrenArray.map(\n          (child) => child.key as string,\n        );\n      }\n\n      const options: SplitViewOptions = {\n        orientation: vertical ? Orientation.Vertical : Orientation.Horizontal,\n        proportionalLayout,\n        // use old sizes if they exist, otherwise use default sizes\n        ...(splitViewRef.current\n          ? {\n              descriptor: {\n                size: splitViewRef.current\n                  .getViewSizes()\n                  .reduce((a, b) => a + b, 0),\n                views: splitViewRef.current\n                  .getViewSizes()\n                  .map((size, index) => {\n                    return {\n                      container: [...splitViewViewRef.current.values()][index],\n                      size: size,\n                      view: views.current[index],\n                    };\n                  }),\n              },\n            }\n          : initializeSizes &&\n            defaultSizes && {\n              descriptor: {\n                size: defaultSizes.reduce((a, b) => a + b, 0),\n                views: defaultSizes.map((size, index) => {\n                  const props = splitViewPropsRef.current.get(\n                    previousKeys.current[index],\n                  );\n\n                  const view = new PaneView(layoutService.current, {\n                    element: document.createElement(\"div\"),\n                    minimumSize: props?.minSize ?? minSize,\n                    maximumSize: props?.maxSize ?? maxSize,\n                    priority: props?.priority ?? LayoutPriority.Normal,\n                    ...(props?.preferredSize && {\n                      preferredSize: props?.preferredSize,\n                    }),\n                    snap: props?.snap ?? snap,\n                  });\n\n                  views.current.push(view);\n\n                  return {\n                    container: [...splitViewViewRef.current.values()][index],\n                    size: size,\n                    view: view,\n                  };\n                }),\n              },\n            }),\n      };\n\n      splitViewRef.current = new SplitView(\n        containerRef.current,\n        options,\n        onChange,\n        onDragStart,\n        onDragEnd,\n      );\n\n      splitViewRef.current.on(\"sashDragStart\", () => {\n        containerRef.current?.classList.add(\"split-view-sash-dragging\");\n      });\n      splitViewRef.current.on(\"sashDragEnd\", () => {\n        containerRef.current?.classList.remove(\"split-view-sash-dragging\");\n      });\n\n      splitViewRef.current.on(\"sashchange\", (_index: number) => {\n        if (onVisibleChange && splitViewRef.current) {\n          const keys = childrenArray.map((child) => child.key as string);\n\n          for (let index = 0; index < keys.length; index++) {\n            const props = splitViewPropsRef.current.get(keys[index]);\n\n            if (props?.visible !== undefined) {\n              if (props.visible !== splitViewRef.current.isViewVisible(index)) {\n                onVisibleChange(\n                  index,\n                  splitViewRef.current.isViewVisible(index),\n                );\n              }\n            }\n          }\n        }\n      });\n\n      splitViewRef.current.on(\"sashreset\", (index: number) => {\n        if (onReset) {\n          onReset();\n        } else {\n          if (resizeToPreferredSize(index)) {\n            return;\n          }\n\n          if (resizeToPreferredSize(index + 1)) {\n            return;\n          }\n\n          splitViewRef.current?.distributeViewSizes();\n        }\n      });\n\n      const that = splitViewRef.current;\n\n      return () => {\n        that.dispose();\n      };\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, []);\n\n    /**\n     * Add, remove or update views as children change\n     */\n    useIsomorphicLayoutEffect(() => {\n      if (dimensionsInitialized) {\n        const keys = childrenArray.map((child) => child.key as string);\n        const panes = [...previousKeys.current];\n\n        const enter = keys.filter((key) => !previousKeys.current.includes(key));\n        const update = keys.filter((key) => previousKeys.current.includes(key));\n        const exit = previousKeys.current.map((key) => !keys.includes(key));\n\n        for (let index = exit.length - 1; index >= 0; index--) {\n          if (exit[index]) {\n            splitViewRef.current?.removeView(index);\n            panes.splice(index, 1);\n            views.current.splice(index, 1);\n          }\n        }\n\n        for (const enterKey of enter) {\n          const props = splitViewPropsRef.current.get(enterKey);\n\n          const view = new PaneView(layoutService.current, {\n            element: document.createElement(\"div\"),\n            minimumSize: props?.minSize ?? minSize,\n            maximumSize: props?.maxSize ?? maxSize,\n            priority: props?.priority ?? LayoutPriority.Normal,\n            ...(props?.preferredSize && {\n              preferredSize: props?.preferredSize,\n            }),\n            snap: props?.snap ?? snap,\n          });\n\n          splitViewRef.current?.addView(\n            splitViewViewRef.current.get(enterKey)!,\n            view,\n            Sizing.Distribute,\n            keys.findIndex((key) => key === enterKey),\n          );\n\n          panes.splice(\n            keys.findIndex((key) => key === enterKey),\n            0,\n            enterKey,\n          );\n\n          views.current.splice(\n            keys.findIndex((key) => key === enterKey),\n            0,\n            view,\n          );\n        }\n\n        // Move panes if order has changed\n        while (!isEqual(keys, panes)) {\n          for (const [i, key] of keys.entries()) {\n            const index = panes.findIndex((pane) => pane === key);\n\n            if (index !== i) {\n              splitViewRef.current?.moveView(\n                splitViewViewRef.current.get(key) as HTMLElement,\n                index,\n                i,\n              );\n\n              const tempKey = panes[index];\n              panes.splice(index, 1);\n              panes.splice(i, 0, tempKey);\n\n              break;\n            }\n          }\n        }\n\n        for (const enterKey of enter) {\n          const index = keys.findIndex((key) => key === enterKey);\n\n          const preferredSize = views.current[index].preferredSize;\n\n          if (preferredSize !== undefined) {\n            splitViewRef.current?.resizeView(index, preferredSize);\n          }\n        }\n\n        for (const updateKey of [...enter, ...update]) {\n          const props = splitViewPropsRef.current.get(updateKey);\n          const index = keys.findIndex((key) => key === updateKey);\n\n          if (props && isPaneProps(props)) {\n            if (props.visible !== undefined) {\n              if (\n                splitViewRef.current?.isViewVisible(index) !== props.visible\n              ) {\n                splitViewRef.current?.setViewVisible(index, props.visible);\n              }\n            }\n          }\n        }\n\n        for (const updateKey of update) {\n          const props = splitViewPropsRef.current.get(updateKey);\n          const index = keys.findIndex((key) => key === updateKey);\n\n          if (props && isPaneProps(props)) {\n            if (\n              props.preferredSize !== undefined &&\n              views.current[index].preferredSize !== props.preferredSize\n            ) {\n              views.current[index].preferredSize = props.preferredSize;\n            }\n\n            let sizeChanged = false;\n\n            if (\n              props.minSize !== undefined &&\n              views.current[index].minimumSize !== props.minSize\n            ) {\n              views.current[index].minimumSize = props.minSize;\n              sizeChanged = true;\n            }\n\n            if (\n              props.maxSize !== undefined &&\n              views.current[index].maximumSize !== props.maxSize\n            ) {\n              views.current[index].maximumSize = props.maxSize;\n              sizeChanged = true;\n            }\n\n            if (sizeChanged) {\n              splitViewRef.current?.layout();\n            }\n          }\n        }\n\n        if (enter.length > 0 || exit.length > 0) {\n          previousKeys.current = keys;\n        }\n      }\n    }, [childrenArray, dimensionsInitialized, maxSize, minSize, snap]);\n\n    useEffect(() => {\n      if (splitViewRef.current) {\n        splitViewRef.current.onDidChange = onChange;\n      }\n    }, [onChange]);\n\n    useEffect(() => {\n      if (splitViewRef.current) {\n        splitViewRef.current.onDidDragStart = onDragStart;\n      }\n    }, [onDragStart]);\n\n    useEffect(() => {\n      if (splitViewRef.current) {\n        splitViewRef.current.onDidDragEnd = onDragEnd;\n      }\n    }, [onDragEnd]);\n\n    useResizeObserver({\n      ref: containerRef,\n      onResize: ({ width, height }) => {\n        if (width && height) {\n          splitViewRef.current?.layout(vertical ? height : width);\n          layoutService.current.setSize(vertical ? height : width);\n          setDimensionsInitialized(true);\n        }\n      },\n    });\n\n    // useEffect(() => {\n    //   if (isIOS) {\n    //     setSashSize(20);\n    //   }\n    // }, []);\n\n    return (\n      <div\n        ref={containerRef}\n        className={classNames(\n          \"split-view\",\n          vertical ? \"split-view-vertical\" : \"split-view-horizontal\",\n          { \"split-view-separator-border\": separator },\n          styles.splitView,\n          vertical ? styles.vertical : styles.horizontal,\n          { [styles.separatorBorder]: separator },\n          className,\n        )}\n        id={id}\n      >\n        <div\n          className={classNames(\n            \"split-view-container\",\n            styles.splitViewContainer,\n          )}\n        >\n          {React.Children.toArray(children).map((child) => {\n            if (!React.isValidElement(child)) {\n              return null;\n            }\n\n            // toArray flattens and converts nulls to non-null keys\n            const key = child.key!;\n\n            if (isPane(child)) {\n              splitViewPropsRef.current.set(key, child.props);\n\n              return React.cloneElement(child as React.ReactElement, {\n                key: key,\n                ref: (el: HTMLElement | null) => {\n                  const ref = (child as any).ref;\n\n                  if (ref) {\n                    ref.current = el;\n                  }\n\n                  if (el) {\n                    splitViewViewRef.current.set(key, el);\n                  } else {\n                    splitViewViewRef.current.delete(key);\n                  }\n                },\n              });\n            } else {\n              return (\n                <Pane\n                  key={key}\n                  ref={(el: HTMLElement | null) => {\n                    if (el) {\n                      splitViewViewRef.current.set(key, el);\n                    } else {\n                      splitViewViewRef.current.delete(key);\n                    }\n                  }}\n                >\n                  {child}\n                </Pane>\n              );\n            }\n          })}\n        </div>\n      </div>\n    );\n  },\n);\n\nAllotment.displayName = \"Allotment\";\n\n/**\n * Set sash size. This is set in both css and js and this function keeps the two in sync.\n *\n * @param sashSize Sash size in pixels\n */\nexport function setSashSize(sashSize: number) {\n  const size = clamp(sashSize, 4, 20);\n  const hoverSize = clamp(sashSize, 1, 8);\n\n  document.documentElement.style.setProperty(\"--sash-size\", size + \"px\");\n  document.documentElement.style.setProperty(\n    \"--sash-hover-size\",\n    hoverSize + \"px\",\n  );\n}\n\nexport default Object.assign(Allotment, { Pane: Pane });\n"],"names":["start","range","Orientation","SashState","event","Sizing","LayoutPriority","styles","container","sash","item","index","vertical","sizes","ref"],"mappings":"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"}