diff --git a/CHANGELOG.md b/CHANGELOG.md
index c5ea17be2de03bbfe82bcc30aa28f7035cc93da0..0a21c3a1d32f5b8a2068c89df83f1b84ce4abbda 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,16 +1,24 @@
+## [0.7.0] - 2021-05-26
+### Changed
+- Made significant changes and improvements to TypeScript types (work ongoing)
+
+### Fixed
+- Fixed scrolling issue on iOS ([#54](https://github.com/PolymerLabs/uni-virtualizer/issues/54))
+
 ## [0.6.0] - 2021-05-01
 - This is a stopgap release to unblock migrations to Lit 2.0
-- In the near future:
-  - Source will move to the Lit monorepo
-  - Subsequent releases will likely be as `@lit-labs/virtualizer`
+- In the near future, source will move to the Lit monorepo
 
 ### Changed
 - Migrated to Lit 2.x
 
 ## [0.5.0] - 2021-05-01
 ### Changed
+- Changed npm package to `@lit-labs/virtualizer`
 - Significant refactoring
 - Now emits custom events, access data from `detail` object
+- `layout` property is now required for both the `lit-virtualizer`
+  element and the `scroll()` directive
 
 ### Added
 - Support for older browsers (IE11, legacy Edge)
diff --git a/README.md b/README.md
index 86e6610be14ed8f375074a628298e8e9c8c50823..0ddf6a9d89e1a73514e0d11e92b8d007f864f887 100644
--- a/README.md
+++ b/README.md
@@ -182,7 +182,7 @@ const handleEvent = (e) => {
 }
 
 const example = (contacts) => html`
-  <section @rangechanged=${handleEvent}>
+  <section @visibilityChanged=${handleEvent}>
     ${scroll({
       items: contacts,
       renderItem: ({ mediumText }) => html`<p>${mediumText}</p>`,
diff --git a/lib/lit-virtualizer.d.ts b/lib/lit-virtualizer.d.ts
index d6a63bd658542fee62c36f8658fc3561ab61d2e8..4c93ff899f483d4824d24024b0803c8838150d0a 100644
--- a/lib/lit-virtualizer.d.ts
+++ b/lib/lit-virtualizer.d.ts
@@ -1,5 +1,5 @@
 import { LitElement, TemplateResult } from 'lit';
-import { Type, Layout, LayoutConfig } from './uni-virtualizer/lib/layouts/Layout.js';
+import { LayoutSpecifier, Layout, LayoutConstructor } from './uni-virtualizer/lib/layouts/Layout.js';
 /**
  * A LitElement wrapper of the scroll directive.
  *
@@ -7,19 +7,19 @@ import { Type, Layout, LayoutConfig } from './uni-virtualizer/lib/layouts/Layout
  * Pass an items array, renderItem method, and scroll target as properties
  * to the <lit-virtualizer> element.
  */
-export declare class LitVirtualizer<Item> extends LitElement {
-    renderItem: (item: Item, index?: number) => TemplateResult;
-    items: Array<Item>;
+export declare class LitVirtualizer extends LitElement {
+    renderItem?: ((item: any, index?: number) => TemplateResult);
+    items: Array<unknown>;
     scrollTarget: Element | Window;
-    keyFunction: (item: any) => any;
+    keyFunction: ((item: unknown) => unknown) | undefined;
     private _layout;
     private _scrollToIndex;
     createRenderRoot(): this;
     /**
      * The method used for rendering each item.
      */
-    set layout(layout: Layout | Type<Layout> | LayoutConfig);
-    get layout(): Layout | Type<Layout> | LayoutConfig;
+    set layout(layout: Layout | LayoutConstructor | LayoutSpecifier | null);
+    get layout(): Layout | LayoutConstructor | LayoutSpecifier | null;
     /**
      * Scroll to the specified index, placing that item at the given position
      * in the scroll view.
@@ -29,7 +29,7 @@ export declare class LitVirtualizer<Item> extends LitElement {
 }
 declare global {
     interface HTMLElementTagNameMap {
-        'lit-virtualizer': LitVirtualizer<unknown>;
+        'lit-virtualizer': LitVirtualizer;
     }
 }
 //# sourceMappingURL=lit-virtualizer.d.ts.map
\ No newline at end of file
diff --git a/lib/lit-virtualizer.d.ts.map b/lib/lit-virtualizer.d.ts.map
index 65ca47b388981b8454619ef71c1eade0c847b6da..763404320ecd414b07e98aee537f55aeacb223ba 100644
--- a/lib/lit-virtualizer.d.ts.map
+++ b/lib/lit-virtualizer.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"lit-virtualizer.d.ts","sourceRoot":"","sources":["../src/lib/lit-virtualizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,UAAU,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAKvD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAErF;;;;;;GAMG;AACH,qBACa,cAAc,CAAC,IAAI,CAAE,SAAQ,UAAU;IAEhD,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,cAAc,CAAC;IAG3D,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAGnB,YAAY,EAAE,OAAO,GAAG,MAAM,CAAQ;IAGtC,WAAW,EAAE,CAAC,IAAI,EAAC,GAAG,KAAK,GAAG,CAAC;IAE/B,OAAO,CAAC,OAAO,CAAsC;IAErD,OAAO,CAAC,cAAc,CAAoC;IAE1D,gBAAgB;IAahB;;OAEG;IAWH,IACI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,YAAY,EAItD;IAED,IAAI,MAAM,IANS,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,YAAY,CAQtD;IAGD;;;OAGG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAgB;IAO7D,MAAM,IAAI,cAAc;CAO3B;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,iBAAiB,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;KAC9C;CACJ"}
\ No newline at end of file
+{"version":3,"file":"lit-virtualizer.d.ts","sourceRoot":"","sources":["../src/lib/lit-virtualizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,UAAU,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAKvD,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAErG;;;;;;GAMG;AACH,qBACa,cAAe,SAAQ,UAAU;IAE1C,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,cAAc,CAAC,CAAC;IAG7D,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAM;IAG3B,YAAY,EAAE,OAAO,GAAG,MAAM,CAAQ;IAGtC,WAAW,EAAE,CAAC,CAAC,IAAI,EAAC,OAAO,KAAK,OAAO,CAAC,GAAG,SAAS,CAAa;IAEjE,OAAO,CAAC,OAAO,CAA6D;IAE5E,OAAO,CAAC,cAAc,CAAkD;IAExE,gBAAgB;IAahB;;OAEG;IAWH,IACI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,eAAe,GAAG,IAAI,EAIrE;IAED,IAAI,MAAM,IAAI,MAAM,GAAG,iBAAiB,GAAG,eAAe,GAAG,IAAI,CAEhE;IAGD;;;OAGG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAgB;IAO7D,MAAM,IAAI,cAAc;CAO3B;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,iBAAiB,EAAE,cAAc,CAAC;KACrC;CACJ"}
\ No newline at end of file
diff --git a/lib/lit-virtualizer.js b/lib/lit-virtualizer.js
index d7846882e0c98212ee4be144728f26a4c7736fe8..7fb00024c2df2290559fc78db1ad13faf86a2c62 100644
--- a/lib/lit-virtualizer.js
+++ b/lib/lit-virtualizer.js
@@ -1,4 +1,9 @@
-import { __decorate } from "tslib";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+    return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
 import { html, LitElement } from 'lit';
 import { customElement } from 'lit/decorators/custom-element.js';
 import { property } from 'lit/decorators/property.js';
@@ -14,7 +19,11 @@ import { scrollerRef } from './uni-virtualizer/lib/VirtualScroller.js';
 let LitVirtualizer = class LitVirtualizer extends LitElement {
     constructor() {
         super(...arguments);
+        this.items = [];
         this.scrollTarget = this;
+        this.keyFunction = undefined;
+        this._layout = null;
+        this._scrollToIndex = null;
     }
     createRenderRoot() {
         return this;
@@ -83,3 +92,4 @@ LitVirtualizer = __decorate([
     customElement('lit-virtualizer')
 ], LitVirtualizer);
 export { LitVirtualizer };
+//# sourceMappingURL=lit-virtualizer.js.map
\ No newline at end of file
diff --git a/lib/lit-virtualizer.js.map b/lib/lit-virtualizer.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..54c885bd148d6bae8f5de85e3417a97a99035d24
--- /dev/null
+++ b/lib/lit-virtualizer.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lit-virtualizer.js","sourceRoot":"","sources":["../src/lib/lit-virtualizer.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAkB,MAAM,KAAK,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,WAAW,EAAoB,MAAM,0CAA0C,CAAC;AAGzF;;;;;;GAMG;AAEH,IAAa,cAAc,GAA3B,MAAa,cAAe,SAAQ,UAAU;IAA9C;;QAKI,UAAK,GAAmB,EAAE,CAAC;QAG3B,iBAAY,GAAqB,IAAI,CAAC;QAGtC,gBAAW,GAA4C,SAAS,CAAC;QAEzD,YAAO,GAAwD,IAAI,CAAC;QAEpE,mBAAc,GAA6C,IAAI,CAAC;IA0D5E,CAAC;IAxDG,gBAAgB;QACZ,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,gBAAgB;IAChB,0BAA0B;IAC1B,IAAI;IAEJ,qBAAqB;IACrB,2BAA2B;IAC3B,gDAAgD;IAChD,IAAI;IAEJ;;OAEG;IACH,qBAAqB;IACrB,+BAA+B;IAC/B,IAAI;IACJ,+BAA+B;IAC/B,4CAA4C;IAC5C,yCAAyC;IACzC,gCAAgC;IAChC,QAAQ;IACR,IAAI;IAGJ,IAAI,MAAM,CAAC,MAA2D;QAClE,qDAAqD;QACrD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IAED,IAAI,MAAM;QACN,OAAQ,IAAyB,CAAC,WAAW,CAAE,CAAC,MAAM,CAAC;IAC3D,CAAC;IAGD;;;OAGG;IACH,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,WAAmB,OAAO;QACzD,IAAI,CAAC,cAAc,GAAG,EAAC,KAAK,EAAE,QAAQ,EAAC,CAAC;QACxC,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,MAAM,IAAI,CAAC,cAAc,CAAC;QAC1B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC/B,CAAC;IAED,MAAM;QACF,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,OAAO,IAAI,CAAA;cACL,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;SACzG,CAAC;IACN,CAAC;CACJ,CAAA;AAvEG;IADC,QAAQ,EAAE;kDACkD;AAG7D;IADC,QAAQ,CAAC,EAAC,SAAS,EAAE,KAAK,EAAC,CAAC;6CACF;AAG3B;IADC,QAAQ,CAAC,EAAC,SAAS,EAAE,KAAK,EAAC,CAAC;oDACS;AAGtC;IADC,QAAQ,EAAE;mDACsD;AAiCjE;IADC,QAAQ,CAAC,EAAC,SAAS,EAAC,KAAK,EAAC,CAAC;4CAK3B;AAhDQ,cAAc;IAD1B,aAAa,CAAC,iBAAiB,CAAC;GACpB,cAAc,CAyE1B;SAzEY,cAAc","sourcesContent":["import { html, LitElement, TemplateResult } from 'lit';\nimport { customElement } from 'lit/decorators/custom-element.js';\nimport { property } from 'lit/decorators/property.js';\nimport { scroll } from './scroll.js';\nimport { scrollerRef, ContainerElement } from './uni-virtualizer/lib/VirtualScroller.js';\nimport { LayoutSpecifier, Layout, LayoutConstructor } from './uni-virtualizer/lib/layouts/Layout.js';\n\n/**\n * A LitElement wrapper of the scroll directive.\n *\n * Import this module to declare the lit-virtualizer custom element.\n * Pass an items array, renderItem method, and scroll target as properties\n * to the <lit-virtualizer> element.\n */\n@customElement('lit-virtualizer')\nexport class LitVirtualizer extends LitElement {\n    @property()\n    renderItem?: ((item: any, index?: number) => TemplateResult);\n\n    @property({attribute: false})\n    items: Array<unknown> = [];\n\n    @property({attribute: false})\n    scrollTarget: Element | Window = this;\n\n    @property()\n    keyFunction: ((item:unknown) => unknown) | undefined = undefined;\n\n    private _layout: Layout | LayoutConstructor | LayoutSpecifier | null = null;\n\n    private _scrollToIndex: {index: number, position: string} | null = null;\n  \n    createRenderRoot() {\n        return this;\n    }\n\n    // get items() {\n    //     return this._items;\n    // }\n\n    // set items(items) {\n    //     this._items = items;\n    //     this._scroller.totalItems = items.length;\n    // }\n\n    /**\n     * The method used for rendering each item.\n     */\n    // get renderItem() {\n    //     return this._renderItem;\n    // }\n    // set renderItem(renderItem) {\n    //     if (renderItem !== this.renderItem) {\n    //         this._renderItem = renderItem;\n    //         this.requestUpdate();\n    //     }\n    // }\n\n    @property({attribute:false})\n    set layout(layout: Layout | LayoutConstructor | LayoutSpecifier | null) {\n        // TODO (graynorton): Shouldn't have to set this here\n        this._layout = layout;\n        this.requestUpdate();\n    }\n\n    get layout(): Layout | LayoutConstructor | LayoutSpecifier | null {\n        return (this as ContainerElement)[scrollerRef]!.layout;\n    }\n    \n    \n    /**\n     * Scroll to the specified index, placing that item at the given position\n     * in the scroll view.\n     */\n    async scrollToIndex(index: number, position: string = 'start') {\n        this._scrollToIndex = {index, position};\n        this.requestUpdate();\n        await this.updateComplete;\n        this._scrollToIndex = null;\n    }\n\n    render(): TemplateResult {\n        const { items, renderItem, keyFunction, scrollTarget } = this;\n        const layout = this._layout;\n        return html`\n            ${scroll({ items, renderItem, layout, keyFunction, scrollTarget, scrollToIndex: this._scrollToIndex })}\n        `;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'lit-virtualizer': LitVirtualizer;\n    }\n}"]}
\ No newline at end of file
diff --git a/lib/scroll.d.ts b/lib/scroll.d.ts
index bca0558061c88063428fcb2e8468a86b31c31157..b75789ee00a5abbdae3a15a2bd2392a5b7a213bb 100644
--- a/lib/scroll.d.ts
+++ b/lib/scroll.d.ts
@@ -1,19 +1,19 @@
 import { TemplateResult, ChildPart } from 'lit';
 import { PartInfo } from 'lit/directive.js';
 import { AsyncDirective } from 'lit/async-directive.js';
-import { Type, Layout, LayoutConfig } from './uni-virtualizer/lib/layouts/Layout.js';
-import { VirtualScroller } from './uni-virtualizer/lib/VirtualScroller.js';
+import { Layout, LayoutConstructor, LayoutSpecifier } from './uni-virtualizer/lib/layouts/Layout.js';
+import { VirtualScroller, ScrollToIndexValue } from './uni-virtualizer/lib/VirtualScroller.js';
 /**
  * Configuration options for the scroll directive.
  */
-interface ScrollConfig<Item> {
+interface ScrollConfig {
     /**
      * A function that returns a lit-html TemplateResult. It will be used
      * to generate the DOM for each item in the virtual list.
      */
-    renderItem?: (item: Item, index?: number) => TemplateResult;
-    keyFunction?: (item: any) => any;
-    layout?: Layout | Type<Layout> | LayoutConfig;
+    renderItem?: (item: any, index?: number) => TemplateResult;
+    keyFunction?: (item: any) => unknown;
+    layout?: Layout | LayoutConstructor | LayoutSpecifier | null;
     /**
      * An element that receives scroll events for the virtual scroller.
      */
@@ -21,7 +21,7 @@ interface ScrollConfig<Item> {
     /**
      * The list of items to display via the renderItem function.
      */
-    items?: Array<Item>;
+    items?: Array<any>;
     /**
      * Limit for the number of items to display. Defaults to the length of the
      * items array.
@@ -30,24 +30,23 @@ interface ScrollConfig<Item> {
     /**
      * Index and position of the item to scroll to.
      */
-    scrollToIndex?: {
-        index: number;
-        position?: string;
-    };
+    scrollToIndex?: ScrollToIndexValue;
 }
+export declare const defaultKeyFunction: (item: any) => any;
+export declare const defaultRenderItem: (item: any) => TemplateResult<1>;
 declare class ScrollDirective extends AsyncDirective {
-    container: HTMLElement;
-    scroller: VirtualScroller<unknown, HTMLElement>;
+    container: HTMLElement | null;
+    scroller: VirtualScroller | null;
     first: number;
     last: number;
     renderItem: (item: any, index?: number) => TemplateResult;
-    keyFunction: (item: any) => any;
-    items: Array<any>;
+    keyFunction: (item: any) => unknown;
+    items: Array<unknown>;
     constructor(part: PartInfo);
-    render<T>(config?: ScrollConfig<T>): unknown;
-    update<T>(part: ChildPart, [config]: [ScrollConfig<T>]): unknown;
+    render(config?: ScrollConfig): unknown;
+    update(part: ChildPart, [config]: [ScrollConfig]): unknown;
     private _initialize;
 }
-export declare const scroll: (config?: ScrollConfig<unknown>) => import("lit/directive.js").DirectiveResult<typeof ScrollDirective>;
+export declare const scroll: (config?: ScrollConfig | undefined) => import("lit-html/directive").DirectiveResult<typeof ScrollDirective>;
 export {};
 //# sourceMappingURL=scroll.d.ts.map
\ No newline at end of file
diff --git a/lib/scroll.d.ts.map b/lib/scroll.d.ts.map
index 64ae5c72b0d1342ef2018721bc93362b9ed1c9ff..5278da9ef97db92a43e22caa6a644990a194e313 100644
--- a/lib/scroll.d.ts.map
+++ b/lib/scroll.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"scroll.d.ts","sourceRoot":"","sources":["../src/lib/scroll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAW,SAAS,EAAE,MAAM,KAAK,CAAC;AACzD,OAAO,EAAa,QAAQ,EAAY,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,EAAE,eAAe,EAAoB,MAAM,0CAA0C,CAAC;AAE7F;;GAEG;AACH,UAAU,YAAY,CAAC,IAAI;IACvB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,cAAc,CAAC;IAE5D,WAAW,CAAC,EAAE,CAAC,IAAI,EAAC,GAAG,KAAK,GAAG,CAAC;IAGhC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC;IAE9C;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAEhC;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAEpB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,aAAa,CAAC,EAAE;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC;CACpD;AAIH,cAAM,eAAgB,SAAQ,cAAc;IACxC,SAAS,EAAE,WAAW,CAAA;IACtB,QAAQ,EAAE,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IAC/C,KAAK,EAAE,MAAM,CAAI;IACjB,IAAI,EAAE,MAAM,CAAK;IACjB,UAAU,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,cAAc,CAAA;IACzD,WAAW,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,CAAA;IAC/B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;gBAEL,IAAI,EAAE,QAAQ;IAO1B,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;IAclC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAetD,OAAO,CAAC,WAAW;CAiBtB;AAED,eAAO,MAAM,MAAM,wGAA6B,CAAC"}
\ No newline at end of file
+{"version":3,"file":"scroll.d.ts","sourceRoot":"","sources":["../src/lib/scroll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAW,SAAS,EAAQ,MAAM,KAAK,CAAC;AAC/D,OAAO,EAAa,QAAQ,EAAY,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AACrG,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAE/F;;GAEG;AACH,UAAU,YAAY;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,cAAc,CAAC;IAE3D,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC;IAGrC,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB,GAAG,eAAe,GAAG,IAAI,CAAC;IAE7D;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAEhC;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAEnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,aAAa,CAAC,EAAE,kBAAkB,CAAC;CACpC;AAEH,eAAO,MAAM,kBAAkB,SAAU,GAAG,QAAS,CAAC;AACtD,eAAO,MAAM,iBAAiB,SAAU,GAAG,sBAA2C,CAAC;AAEvF,cAAM,eAAgB,SAAQ,cAAc;IACxC,SAAS,EAAE,WAAW,GAAG,IAAI,CAAO;IACpC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAO;IACvC,KAAK,SAAI;IACT,IAAI,SAAK;IACT,UAAU,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,cAAc,CAAqB;IAC9E,WAAW,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAsB;IACzD,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAK;gBAEd,IAAI,EAAE,QAAQ;IAO1B,MAAM,CAAC,MAAM,CAAC,EAAE,YAAY;IAc5B,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC;IAehD,OAAO,CAAC,WAAW;CAiBtB;AAED,eAAO,MAAM,MAAM,6GAA6B,CAAC"}
\ No newline at end of file
diff --git a/lib/scroll.js b/lib/scroll.js
index 9a0a5b4133c8a00def065e2c611db3d93b7208b0..33fd6bb63b352c8a49b057cce761280af45a57b7 100644
--- a/lib/scroll.js
+++ b/lib/scroll.js
@@ -1,22 +1,28 @@
-import { nothing } from 'lit';
+import { nothing, html } from 'lit';
 import { directive, PartType } from 'lit/directive.js';
 import { AsyncDirective } from 'lit/async-directive.js';
 import { repeat } from 'lit/directives/repeat.js';
 import { VirtualScroller } from './uni-virtualizer/lib/VirtualScroller.js';
-const defaultKeyFunction = item => item;
+export const defaultKeyFunction = (item) => item;
+export const defaultRenderItem = (item) => html `${JSON.stringify(item, null, 2)}`;
 class ScrollDirective extends AsyncDirective {
     constructor(part) {
         super(part);
+        this.container = null;
+        this.scroller = null;
         this.first = 0;
         this.last = -1;
+        this.renderItem = defaultRenderItem;
+        this.keyFunction = defaultKeyFunction;
+        this.items = [];
         if (part.type !== PartType.CHILD) {
             throw new Error('The scroll directive can only be used in child expressions');
         }
     }
     render(config) {
         if (config) {
-            this.renderItem = config.renderItem;
-            this.keyFunction = config.keyFunction;
+            this.renderItem = config.renderItem || this.renderItem;
+            this.keyFunction = config.keyFunction || this.keyFunction;
         }
         const itemsToRender = [];
         if (this.first >= 0 && this.last >= this.first) {
@@ -30,9 +36,9 @@ class ScrollDirective extends AsyncDirective {
         var _a;
         if (this.scroller || this._initialize(part, config)) {
             const { scroller } = this;
-            this.items = scroller.items = config.items;
+            this.items = scroller.items = config.items || [];
             scroller.totalItems = config.totalItems || ((_a = config.items) === null || _a === void 0 ? void 0 : _a.length) || 0;
-            scroller.layout = config.layout;
+            scroller.layout = config.layout || null;
             scroller.scrollTarget = config.scrollTarget || this.container;
             if (config.scrollToIndex) {
                 scroller.scrollToIndex = config.scrollToIndex;
@@ -60,3 +66,4 @@ class ScrollDirective extends AsyncDirective {
     }
 }
 export const scroll = directive(ScrollDirective);
+//# sourceMappingURL=scroll.js.map
\ No newline at end of file
diff --git a/lib/scroll.js.map b/lib/scroll.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..4cf7e26beb7d9c52e8af93dc789f96a06756123a
--- /dev/null
+++ b/lib/scroll.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"scroll.js","sourceRoot":"","sources":["../src/lib/scroll.ts"],"names":[],"mappings":"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","sourcesContent":["import { TemplateResult, nothing, ChildPart, html } from 'lit';\nimport { directive, PartInfo, PartType } from 'lit/directive.js';\nimport { AsyncDirective } from 'lit/async-directive.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { Layout, LayoutConstructor, LayoutSpecifier } from './uni-virtualizer/lib/layouts/Layout.js';\nimport { VirtualScroller, ScrollToIndexValue } from './uni-virtualizer/lib/VirtualScroller.js';\n\n/**\n * Configuration options for the scroll directive.\n */\ninterface ScrollConfig {\n    /**\n     * A function that returns a lit-html TemplateResult. It will be used\n     * to generate the DOM for each item in the virtual list.\n     */\n    renderItem?: (item: any, index?: number) => TemplateResult;\n\n    keyFunction?: (item: any) => unknown;\n  \n    // TODO (graynorton): Document...\n    layout?: Layout | LayoutConstructor | LayoutSpecifier | null;\n  \n    /**\n     * An element that receives scroll events for the virtual scroller.\n     */\n    scrollTarget?: Element | Window;\n  \n    /**\n     * The list of items to display via the renderItem function.\n     */\n    items?: Array<any>;\n  \n    /**\n     * Limit for the number of items to display. Defaults to the length of the\n     * items array.\n     */\n    totalItems?: number;\n  \n    /**\n     * Index and position of the item to scroll to.\n     */\n    scrollToIndex?: ScrollToIndexValue;\n  }\n  \nexport const defaultKeyFunction = (item: any) => item;\nexport const defaultRenderItem = (item: any) => html`${JSON.stringify(item, null, 2)}`;\n\nclass ScrollDirective extends AsyncDirective {\n    container: HTMLElement | null = null\n    scroller: VirtualScroller | null = null\n    first = 0\n    last = -1\n    renderItem: (item: any, index?: number) => TemplateResult = defaultRenderItem;\n    keyFunction: (item: any) => unknown = defaultKeyFunction;\n    items: Array<unknown> = []\n\n    constructor(part: PartInfo) {\n        super(part);\n        if (part.type !== PartType.CHILD) {\n            throw new Error('The scroll directive can only be used in child expressions');\n        }\n    }\n    \n    render(config?: ScrollConfig) {\n        if (config) {\n            this.renderItem = config.renderItem || this.renderItem;\n            this.keyFunction = config.keyFunction || this.keyFunction;\n        }\n        const itemsToRender = [];\n        if (this.first >= 0 && this.last >= this.first) {\n            for (let i = this.first; i < this.last + 1; i++) {\n                itemsToRender.push(this.items[i]);\n            }    \n        }\n        return repeat(itemsToRender, this.keyFunction || defaultKeyFunction, this.renderItem);\n    }\n\n    update(part: ChildPart, [config]: [ScrollConfig]) {\n        if (this.scroller || this._initialize(part, config)) {\n            const { scroller } = this;\n            this.items = scroller!.items = config.items || [];\n            scroller!.totalItems = config.totalItems || config.items?.length || 0;\n            scroller!.layout = config.layout || null;\n            scroller!.scrollTarget = config.scrollTarget || this.container;\n            if (config.scrollToIndex) {\n                scroller!.scrollToIndex = config.scrollToIndex;\n            }\n            return this.render(config);    \n        }\n        return nothing;\n    }\n\n    private _initialize(part: ChildPart, config: ScrollConfig) {\n        const container = this.container = part.parentNode as HTMLElement;\n        if (container && container.nodeType === 1) {\n            this.scroller = new VirtualScroller({ container });\n            container.addEventListener('rangeChanged', (e: Event) => {\n                this.first = (e as CustomEvent).detail.first;\n                this.last = (e as CustomEvent).detail.last;\n                this.setValue(this.render());\n            });\n            return true;\n        }\n        // TODO (GN): This seems to be needed in the case where the `scroll`\n        // directive is used within the `LitVirtualizer` element. Figure out why\n        // and see if there's a cleaner solution.\n        Promise.resolve().then(() => this.update(part, [config]));\n        return false;\n    }\n}\n\nexport const scroll = directive(ScrollDirective);"]}
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/VirtualScroller.d.ts b/lib/uni-virtualizer/lib/VirtualScroller.d.ts
index 5806fc0ad4e5483f01ad7a1cf2451a31c1f0013a..70fd76efc606d2ff36d5635718ed3a172af6a43b 100644
--- a/lib/uni-virtualizer/lib/VirtualScroller.d.ts
+++ b/lib/uni-virtualizer/lib/VirtualScroller.d.ts
@@ -1,18 +1,28 @@
-import { ItemBox, Type, Layout, LayoutConfig } from './layouts/Layout.js';
+import { ItemBox, Layout, LayoutConstructor, LayoutSpecifier } from './layouts/Layout.js';
 export declare const scrollerRef: unique symbol;
-declare global {
-    interface Window {
-        ShadyDOM?: any;
-    }
-}
 export declare type RangeChangeEvent = {
     first: number;
     last: number;
     firstVisible: number;
     lastVisible: number;
 };
-interface VirtualScrollerConfig {
-    layout?: Layout | Type<Layout> | LayoutConfig;
+interface ElementWithOptionalScrollerRef extends Element {
+    [scrollerRef]?: VirtualScroller;
+}
+interface ShadowRootWithOptionalScrollerRef extends ShadowRoot {
+    [scrollerRef]?: VirtualScroller;
+}
+declare type Container = ElementWithOptionalScrollerRef | ShadowRootWithOptionalScrollerRef;
+export declare type ContainerElement = ElementWithOptionalScrollerRef;
+declare type ChildMeasurements = {
+    [key: number]: ItemBox;
+};
+export declare type ScrollToIndexValue = {
+    index: number;
+    position?: string;
+} | null;
+export interface VirtualScrollerConfig {
+    layout?: Layout | LayoutConstructor | LayoutSpecifier;
     /**
      * An element that receives scroll events for the virtual scroller.
      */
@@ -30,7 +40,7 @@ interface VirtualScrollerConfig {
  * Extensions of this class must also override VirtualRepeater's DOM
  * manipulation methods.
  */
-export declare class VirtualScroller<Item, Child extends HTMLElement> {
+export declare class VirtualScroller {
     private _benchmarkStart;
     /**
      * Whether the layout should receive an updated viewport size on the next
@@ -70,7 +80,7 @@ export declare class VirtualScroller<Item, Child extends HTMLElement> {
     /**
      * Containing element. Set by container.
      */
-    protected _container: Element | ShadowRoot;
+    protected _container: Container | null;
     /**
      * The parent of all child nodes to be rendered. Set by container.
      */
@@ -80,11 +90,6 @@ export declare class VirtualScroller<Item, Child extends HTMLElement> {
      * restored when container is changed.
      */
     private _containerInlineStyle;
-    /**
-     * Keep track of original container stylesheet, so it can be restored
-     * when container is changed.
-     */
-    private _containerStylesheet;
     /**
      * Size of the container.
      */
@@ -137,12 +142,10 @@ export declare class VirtualScroller<Item, Child extends HTMLElement> {
      * measured, and their dimensions passed to this callback. Use it to layout
      * children as needed.
      */
-    protected _measureCallback: (sizes: {
-        [key: number]: ItemBox;
-    }) => void;
-    protected _measureChildOverride: (element: Element, item: object) => object;
+    protected _measureCallback: ((sizes: ChildMeasurements) => void) | null;
+    protected _measureChildOverride: ((element: Element, item: unknown) => ItemBox) | null;
     constructor(config?: VirtualScrollerConfig);
-    set items(items: any);
+    set items(items: Array<unknown> | undefined);
     /**
      * The total number of items, regardless of the range, that can be rendered
      * as child nodes.
@@ -152,15 +155,15 @@ export declare class VirtualScroller<Item, Child extends HTMLElement> {
     /**
      * The parent of all child nodes to be rendered.
      */
-    get container(): Element | ShadowRoot;
-    set container(container: Element | ShadowRoot);
-    get layout(): Layout | Type<Layout> | LayoutConfig;
-    set layout(layout: Layout | Type<Layout> | LayoutConfig);
+    get container(): Container | null;
+    set container(container: Container | null);
+    get layout(): Layout | LayoutConstructor | LayoutSpecifier | null;
+    set layout(layout: Layout | LayoutConstructor | LayoutSpecifier | null);
     startBenchmarking(): void;
     stopBenchmarking(): {
         timeElapsed: number;
         virtualizationTime: number;
-    };
+    } | null;
     private _measureChildren;
     /**
      * Returns the width, height, and margins of the given child.
@@ -177,19 +180,15 @@ export declare class VirtualScroller<Item, Child extends HTMLElement> {
      * Index and position of item to scroll to. The scroller will fix to that point
      * until the user scrolls.
      */
-    set scrollToIndex(newValue: {
-        index: number;
-        position?: string;
-    });
-    protected _schedule(method: any): Promise<void>;
+    set scrollToIndex(newValue: ScrollToIndexValue);
+    protected _schedule(method: Function): Promise<void>;
     _updateDOM(): Promise<void>;
     _updateLayout(): void;
     private _handleScrollEvent;
-    handleEvent(event: any): void;
+    handleEvent(event: CustomEvent): void;
     private _initResizeObservers;
-    private _applyContainerStyles;
     private _createContainerSizer;
-    get _children(): Array<Child>;
+    get _children(): Array<HTMLElement>;
     private _updateView;
     /**
      * Styles the _sizer element or the container so that its size reflects the
diff --git a/lib/uni-virtualizer/lib/VirtualScroller.d.ts.map b/lib/uni-virtualizer/lib/VirtualScroller.d.ts.map
index fb02bc5f06fb90647f52463f7797a944ec8da8ba..917e1bf68689debf0f5402d5b5409b43302e2955 100644
--- a/lib/uni-virtualizer/lib/VirtualScroller.d.ts.map
+++ b/lib/uni-virtualizer/lib/VirtualScroller.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"VirtualScroller.d.ts","sourceRoot":"","sources":["../../../src/lib/uni-virtualizer/lib/VirtualScroller.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"VirtualScroller.d.ts","sourceRoot":"","sources":["../../../src/lib/uni-virtualizer/lib/VirtualScroller.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/VirtualScroller.js b/lib/uni-virtualizer/lib/VirtualScroller.js
index deb122c252aca658b7aeae6edeee9f98de61ee2b..c2cf7431568224fddcd6af51f7352c5a6b116724 100644
--- a/lib/uni-virtualizer/lib/VirtualScroller.js
+++ b/lib/uni-virtualizer/lib/VirtualScroller.js
@@ -1,28 +1,5 @@
 import getResizeObserver from './polyfillLoaders/ResizeObserver.js';
 export const scrollerRef = Symbol('scrollerRef');
-let nativeShadowDOM = 'attachShadow' in Element.prototype && (!('ShadyDOM' in window) || !window['ShadyDOM'].inUse);
-const HOST_CLASSNAME = 'uni-virtualizer-host';
-let globalContainerStylesheet = null;
-function containerStyles(hostSel, childSel) {
-    return `
-    ${hostSel} {
-      display: block;
-      position: relative;
-      contain: strict;
-      height: 150px;
-      overflow: auto;
-    }
-    ${childSel} {
-      box-sizing: border-box;
-    }`;
-}
-function attachGlobalContainerStylesheet() {
-    if (!globalContainerStylesheet) {
-        globalContainerStylesheet = document.createElement('style');
-        globalContainerStylesheet.textContent = containerStyles(`.${HOST_CLASSNAME}`, `.${HOST_CLASSNAME} > *`);
-        document.head.appendChild(globalContainerStylesheet);
-    }
-}
 /**
  * Provides virtual scrolling boilerplate.
  *
@@ -84,11 +61,6 @@ export class VirtualScroller {
          * restored when container is changed.
          */
         this._containerInlineStyle = null;
-        /**
-         * Keep track of original container stylesheet, so it can be restored
-         * when container is changed.
-         */
-        this._containerStylesheet = null;
         /**
          * Size of the container.
          */
@@ -128,6 +100,14 @@ export class VirtualScroller {
          * Index of the last child in the range.
          */
         this._last = 0;
+        /**
+         * Index of the first item intersecting the container element.
+         */
+        this._firstVisible = 0;
+        /**
+         * Index of the last item intersecting the container element.
+         */
+        this._lastVisible = 0;
         this._scheduled = new WeakSet();
         /**
          * Invoked at the end of each render cycle: children in the range are
@@ -143,7 +123,7 @@ export class VirtualScroller {
         }
     }
     set items(items) {
-        if (items !== this._items) {
+        if (Array.isArray(items) && items !== this._items) {
             this._itemsChanged = true;
             this._items = items;
             this._schedule(this._updateLayout);
@@ -218,7 +198,16 @@ export class VirtualScroller {
             this._containerElement = newEl;
             if (newEl) {
                 this._containerInlineStyle = newEl.getAttribute('style') || null;
-                this._applyContainerStyles();
+                // https://github.com/PolymerLabs/uni-virtualizer/issues/104
+                // Would rather set these CSS properties on the host using Shadow Root
+                // style scoping (and fall back to a global stylesheet where native
+                // Shadow DOM is not available), but this Mobile Safari bug is preventing
+                // that from working: https://bugs.webkit.org/show_bug.cgi?id=226195
+                const style = newEl.style;
+                style.display = style.display || 'block';
+                style.position = style.position || 'relative';
+                style.overflow = style.overflow || 'auto';
+                style.contain = style.contain || 'strict';
                 if (newEl === this._scrollTarget) {
                     this._sizer = this._sizer || this._createContainerSizer();
                     this._container.insertBefore(this._sizer, this._container.firstChild);
@@ -242,11 +231,12 @@ export class VirtualScroller {
         if (this._layout === layout) {
             return;
         }
-        let _layout, _config;
+        let _layout = null;
+        let _config = {};
         if (typeof layout === 'object') {
             if (layout.type !== undefined) {
                 _layout = layout.type;
-                delete layout.type;
+                // delete (layout as LayoutSpecifier).type;
             }
             _config = layout;
         }
@@ -325,7 +315,7 @@ export class VirtualScroller {
             const child = children[i];
             const idx = this._first + i;
             if (this._itemsChanged || this._toBeMeasured.has(child)) {
-                mm[idx] = fn.call(this, child, this._items[idx]);
+                mm[idx] = fn.call(this, child, this._items[idx] /*as unknown as object*/);
             }
         }
         this._childMeasurements = mm;
@@ -438,7 +428,9 @@ export class VirtualScroller {
             try {
                 window.performance.measure('uv-virtualizing', 'uv-start', 'uv-end');
             }
-            catch (e) { }
+            catch (e) {
+                console.warn('Error measuring performance data: ', e);
+            }
             window.performance.mark('uv-start');
         }
         this._schedule(this._updateLayout);
@@ -479,26 +471,6 @@ export class VirtualScroller {
             this._mutationObserver = new MutationObserver(this._observeMutations.bind(this));
         }
     }
-    _applyContainerStyles() {
-        if (nativeShadowDOM) {
-            if (this._containerStylesheet === null) {
-                const sheet = (this._containerStylesheet = document.createElement('style'));
-                sheet.textContent = containerStyles(':host', '::slotted(*)');
-            }
-            const root = this._containerElement.shadowRoot || this._containerElement.attachShadow({ mode: 'open' });
-            const slot = root.querySelector('slot:not([name])');
-            root.appendChild(this._containerStylesheet);
-            if (!slot) {
-                root.appendChild(document.createElement('slot'));
-            }
-        }
-        else {
-            attachGlobalContainerStylesheet();
-            if (this._containerElement) {
-                this._containerElement.classList.add(HOST_CLASSNAME);
-            }
-        }
-    }
     _createContainerSizer() {
         const sizer = document.createElement('div');
         // When the scrollHeight is large, the height of this element might be
@@ -600,6 +572,7 @@ export class VirtualScroller {
                 if (child) {
                     const { top, left, width, height } = pos[key];
                     child.style.position = 'absolute';
+                    child.style.boxSizing = 'border-box';
                     child.style.transform = `translate(${left}px, ${top}px)`;
                     if (width !== undefined) {
                         child.style.width = width + 'px';
@@ -683,7 +656,7 @@ export class VirtualScroller {
         // this.requestRemeasure();
     }
     _childrenSizeChanged(changes) {
-        for (let change of changes) {
+        for (const change of changes) {
             this._toBeMeasured.set(change.target, change.contentRect);
         }
         this._measureChildren();
@@ -703,3 +676,4 @@ function getMarginValue(value) {
     const float = value ? parseFloat(value) : NaN;
     return Number.isNaN(float) ? 0 : float;
 }
+//# sourceMappingURL=VirtualScroller.js.map
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/VirtualScroller.js.map b/lib/uni-virtualizer/lib/VirtualScroller.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..693e4099af0f40c1ce2589fec061afe13ae23bc2
--- /dev/null
+++ b/lib/uni-virtualizer/lib/VirtualScroller.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"VirtualScroller.js","sourceRoot":"","sources":["../../../src/lib/uni-virtualizer/lib/VirtualScroller.ts"],"names":[],"mappings":"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","sourcesContent":["import getResizeObserver from './polyfillLoaders/ResizeObserver.js';\nimport { ItemBox, Margins, Layout, LayoutConstructor, LayoutSpecifier } from './layouts/Layout.js';\n\nexport const scrollerRef = Symbol('scrollerRef');\n\ninterface Range {\n  first: number;\n  last: number;\n  num: number;\n  remeasure: boolean;\n  stable: boolean;\n  firstVisible: number;\n  lastVisible: number;\n}\n\nexport type RangeChangeEvent = {\n  first: number;\n  last: number;\n  firstVisible: number;\n  lastVisible: number;\n};\n\ninterface ElementWithOptionalScrollerRef extends Element {\n  [scrollerRef]?: VirtualScroller\n}\n\ninterface ShadowRootWithOptionalScrollerRef extends ShadowRoot {\n  [scrollerRef]?: VirtualScroller\n}\n\ntype Container = ElementWithOptionalScrollerRef | ShadowRootWithOptionalScrollerRef;\nexport type ContainerElement = ElementWithOptionalScrollerRef;\n\ntype VerticalScrollSize = {height: number};\ntype HorizontalScrollSize = {width: number};\ntype ScrollSize = VerticalScrollSize | HorizontalScrollSize;\n\ntype ChildMeasurements = {[key: number]: ItemBox};\n\nexport type ScrollToIndexValue = {index: number, position?: string} | null;\n\nexport interface VirtualScrollerConfig {\n  layout?: Layout | LayoutConstructor | LayoutSpecifier;\n\n  /**\n   * An element that receives scroll events for the virtual scroller.\n   */\n  scrollTarget?: Element | Window;\n\n  /**\n   * The parent of all child nodes to be rendered.\n   */\n  container: Element | ShadowRoot;\n}\n\n/**\n * Provides virtual scrolling boilerplate.\n *\n * Extensions of this class must set container, layout, and scrollTarget.\n *\n * Extensions of this class must also override VirtualRepeater's DOM\n * manipulation methods.\n */\nexport class VirtualScroller {\n  private _benchmarkStart: number | null = null;\n  /**\n   * Whether the layout should receive an updated viewport size on the next\n   * render.\n   */\n  // private _needsUpdateView: boolean = false;\n\n  private _layout: Layout | null = null;\n\n  /**\n   * The element that generates scroll events and defines the container\n   * viewport. Set by scrollTarget.\n   */\n  private _scrollTarget: Element | null = null;\n\n  /**\n   * A sentinel element that sizes the container when it is a scrolling\n   * element. This ensures the scroll bar accurately reflects the total\n   * size of the list.\n   */\n  private _sizer: HTMLElement | null = null;\n\n  /**\n   * Layout provides these values, we set them on _render().\n   * TODO @straversi: Can we find an XOR type, usable for the key here?\n   */\n  private _scrollSize: ScrollSize | null = null;\n\n  /**\n   * Difference between scroll target's current and required scroll offsets.\n   * Provided by layout.\n   */\n  private _scrollErr: {left: number, top: number} | null = null;\n\n  /**\n   * A list of the positions (top, left) of the children in the current range.\n   */\n  private _childrenPos: Array<{top: number, left: number}> | null = null;\n\n  // TODO: (graynorton): type\n  private _childMeasurements: ChildMeasurements | null = null;\n\n  private _toBeMeasured: Map<HTMLElement, unknown> = new Map();\n\n  private _rangeChanged = true;\n\n  private _itemsChanged = true;\n\n  private _visibilityChanged = true;\n\n  /**\n   * Containing element. Set by container.\n   */\n  protected _container: Container | null = null;\n\n  /**\n   * The parent of all child nodes to be rendered. Set by container.\n   */\n  private _containerElement: ContainerElement | null = null;\n\n  /**\n   * Keep track of original inline style of the container, so it can be\n   * restored when container is changed.\n   */\n  private _containerInlineStyle: string | null = null;\n\n  /**\n   * Size of the container.\n   */\n  private _containerSize: {width: number, height: number} | null = null;\n\n  /**\n   * Resize observer attached to container.\n   */\n  private _containerRO: ResizeObserver | null = null;\n\n  /**\n   * Resize observer attached to children.\n   */\n  private _childrenRO: ResizeObserver | null = null;\n\n  private _mutationObserver: MutationObserver | null = null;\n  private _mutationPromise: Promise<void> | null = null;\n  private _mutationPromiseResolver: Function | null = null;\n  private _mutationsObserved = false;\n\n  // TODO (graynorton): Rethink, per longer comment below\n\n  private _loadListener = this._childLoaded.bind(this);\n\n  /**\n   * Index and position of item to scroll to.\n   */\n  private _scrollToIndex: ScrollToIndexValue = null;\n\n  /**\n   * Items to render. Set by items.\n   */\n  private _items: Array<unknown> = [];\n\n  /**\n   * Total number of items to render. Set by totalItems.\n   */\n  private _totalItems: number | null = null;\n\n  /**\n   * Index of the first child in the range, not necessarily the first visible child.\n   * TODO @straversi: Consider renaming these.\n   */\n  protected _first = 0;\n\n  /**\n   * Index of the last child in the range.\n   */\n  protected _last = 0;\n\n  /**\n   * Index of the first item intersecting the container element.\n   */\n  private _firstVisible = 0;\n\n  /**\n   * Index of the last item intersecting the container element.\n   */\n  private _lastVisible = 0;\n\n  protected _scheduled = new WeakSet();\n\n  /**\n   * Invoked at the end of each render cycle: children in the range are\n   * measured, and their dimensions passed to this callback. Use it to layout\n   * children as needed.\n   */\n   protected _measureCallback: ((sizes: ChildMeasurements) => void) | null = null;\n\n   protected _measureChildOverride: ((element: Element, item: unknown) => ItemBox) | null = null;\n\n  constructor(config?: VirtualScrollerConfig) {\n    this._first = -1;\n    this._last = -1;\n\n    if (config) {\n      Object.assign(this, config);\n    }\n  }\n\n  set items(items: Array<unknown> | undefined) {\n    if (Array.isArray(items) && items !== this._items) {\n      this._itemsChanged = true;\n      this._items = items;\n      this._schedule(this._updateLayout);\n    }\n  }\n\n  /**\n   * The total number of items, regardless of the range, that can be rendered\n   * as child nodes.\n   */\n  get totalItems(): number {\n    return (this._totalItems === null ? this._items.length : this._totalItems);\n  }\n\n  set totalItems(num: number) {\n    if (typeof num !== 'number' && num !== null) {\n      throw new Error('New value must be a number.');\n    }\n\n    // TODO(valdrin) should we check if it is a finite number?\n    // Technically, Infinity would break Layout, not VirtualRepeater.\n    if (num !== this._totalItems) {\n      this._totalItems = num;\n      this._schedule(this._updateLayout);\n    }\n  }\n\n  /**\n   * The parent of all child nodes to be rendered.\n   */\n  get container(): Container | null {\n    return this._container;\n  }\n\n  set container(container: Container | null) {\n    if (container === this._container) {\n      return;\n    }\n\n    if (this._container) {\n      // Remove children from old container.\n      // TODO (graynorton): Decide whether we'd rather fire an event to clear\n      // the range and let the renderer take care of removing the DOM children\n      this._children.forEach(child => child.parentNode!.removeChild(child));\n    }\n\n    this._container = container;\n\n    this._schedule(this._updateLayout);\n\n    this._initResizeObservers().then(() => {\n        const oldEl = this._containerElement as HTMLElement;\n        // Consider document fragments as shadowRoots.\n        const newEl =\n            (container && container.nodeType === Node.DOCUMENT_FRAGMENT_NODE) ?\n            (container as ShadowRoot).host as HTMLElement :\n            container as HTMLElement;\n        if (oldEl === newEl) {\n          return;\n        }\n  \n        this._containerRO!.disconnect();\n        this._containerSize = null;\n  \n        if (oldEl) {\n          if (this._containerInlineStyle) {\n            oldEl.setAttribute('style', this._containerInlineStyle!);\n          } else {\n            oldEl.removeAttribute('style');\n          }\n          this._containerInlineStyle = null;\n          if (oldEl === this._scrollTarget) {\n            oldEl.removeEventListener('scroll', this, {passive: true} as EventListenerOptions);\n            this._sizer && this._sizer.remove();\n          }\n          oldEl.removeEventListener('load', this._loadListener, true);\n\n          this._mutationObserver!.disconnect();\n        } else {\n          // First time container was setup, add listeners only now.\n          addEventListener('scroll', this, {passive: true});\n        }\n  \n        this._containerElement = newEl;\n  \n        if (newEl) {\n          this._containerInlineStyle = newEl.getAttribute('style') || null;\n          // https://github.com/PolymerLabs/uni-virtualizer/issues/104\n          // Would rather set these CSS properties on the host using Shadow Root\n          // style scoping (and fall back to a global stylesheet where native\n          // Shadow DOM is not available), but this Mobile Safari bug is preventing\n          // that from working: https://bugs.webkit.org/show_bug.cgi?id=226195\n          const style = newEl.style as CSSStyleDeclaration & { contain: string };\n          style.display = style.display || 'block';\n          style.position = style.position || 'relative';\n          style.overflow = style.overflow || 'auto';\n          style.contain = style.contain || 'strict';\n          if (newEl === this._scrollTarget) {\n            this._sizer = this._sizer || this._createContainerSizer();\n            this._container!.insertBefore(this._sizer, this._container!.firstChild);\n          }\n          this._schedule(this._updateLayout);\n          this._containerRO!.observe(newEl);\n          this._mutationObserver!.observe(newEl, { childList: true });\n          this._mutationPromise = new Promise(resolve => this._mutationPromiseResolver = resolve);\n  \n          if (this._layout && this._layout.listenForChildLoadEvents) {\n            newEl.addEventListener('load', this._loadListener, true);\n          }\n        }\n      });  \n  }\n\n  // This will always actually return a layout instance,\n  // but TypeScript wants the getter and setter types to be the same\n  get layout(): Layout | LayoutConstructor | LayoutSpecifier | null {\n    return this._layout;\n  }\n\n  set layout(layout: Layout | LayoutConstructor | LayoutSpecifier | null) {\n    if (this._layout === layout) {\n      return;\n    }\n\n    let _layout: LayoutConstructor | Layout | null = null;\n    let _config: object = {};\n\n    if (typeof layout === 'object') {\n      if ((layout as LayoutSpecifier).type !== undefined) {\n        _layout = (layout as LayoutSpecifier).type;\n        // delete (layout as LayoutSpecifier).type;\n      }\n      _config = layout as object;\n    }\n    else {\n      _layout = layout;\n    }\n\n    if (typeof _layout === 'function') {\n      if (this._layout instanceof _layout) {\n        if (_config) {\n          this._layout!.config = _config;\n        }\n        return;\n      }\n      else {\n        _layout = new _layout(_config);\n      }\n    }\n\n    if (this._layout) {\n      this._measureCallback = null;\n      this._measureChildOverride = null;\n      this._layout.removeEventListener('scrollsizechange', this);\n      this._layout.removeEventListener('scrollerrorchange', this);\n      this._layout.removeEventListener('itempositionchange', this);\n      this._layout.removeEventListener('rangechange', this);\n      delete this.container![scrollerRef];\n      this.container!.removeEventListener('load', this._loadListener, true);\n      // Reset container size so layout can get correct viewport size.\n      if (this._containerElement) {\n        this._sizeContainer(undefined);\n      }\n    }\n\n    this._layout = _layout as Layout | null;\n\n    if (this._layout) {\n      if (this._layout.measureChildren && typeof this._layout.updateItemSizes === 'function') {\n        if (typeof this._layout.measureChildren === 'function') {\n          this._measureChildOverride = this._layout.measureChildren;\n        }\n        this._measureCallback = this._layout.updateItemSizes.bind(this._layout);\n      }\n      this._layout.addEventListener('scrollsizechange', this);\n      this._layout.addEventListener('scrollerrorchange', this);\n      this._layout.addEventListener('itempositionchange', this);\n      this._layout.addEventListener('rangechange', this);\n      this._container![scrollerRef] = this;\n      if (this._layout.listenForChildLoadEvents) {\n        this._container!.addEventListener('load', this._loadListener, true);\n      }\n      this._schedule(this._updateLayout);\n    }\n  }\n\n  // TODO (graynorton): Rework benchmarking so that it has no API and\n  // instead is always on except in production builds\n  startBenchmarking() {\n    if (this._benchmarkStart === null) {\n      this._benchmarkStart = window.performance.now();\n    }\n  }\n\n  stopBenchmarking() {\n    if (this._benchmarkStart !== null) {\n      const now = window.performance.now();\n      const timeElapsed = now - this._benchmarkStart;\n      const entries = performance.getEntriesByName('uv-virtualizing', 'measure');\n      const virtualizationTime = entries\n        .filter(e => e.startTime >= this._benchmarkStart! && e.startTime < now)\n        .reduce((t, m) => t + m.duration, 0);\n      this._benchmarkStart = null;\n      return { timeElapsed, virtualizationTime };\n    }\n    return null;\n  }\n\n  private _measureChildren(): void {\n    const mm: ChildMeasurements = {};\n    const children = this._children;\n    const fn = this._measureChildOverride || this._measureChild;\n    for (let i = 0; i < children.length; i++) {\n      const child = children[i];\n      const idx = this._first + i;\n      if (this._itemsChanged || this._toBeMeasured.has(child)) {\n        mm[idx] = fn.call(this, child, this._items[idx] /*as unknown as object*/);\n      }\n    }\n    this._childMeasurements = mm;\n    this._schedule(this._updateLayout);\n    this._toBeMeasured.clear();\n  }\n\n  /**\n   * Returns the width, height, and margins of the given child.\n   */\n  _measureChild(element: Element): ItemBox {\n    // offsetWidth doesn't take transforms in consideration, so we use\n    // getBoundingClientRect which does.\n    const {width, height} = element.getBoundingClientRect();\n    return Object.assign({width, height}, getMargins(element));\n  }\n\n\n  /**\n   * The element that generates scroll events and defines the container\n   * viewport. The value `null` (default) corresponds to `window` as scroll\n   * target.\n   */\n  get scrollTarget(): Element | Window | null {\n    return this._scrollTarget;\n  }\n  set scrollTarget(target: Element | Window | null) {\n    // Consider window as null.\n    if (target === window) {\n      target = null;\n    }\n    if (this._scrollTarget === target) {\n      return;\n    }\n    this._sizeContainer(undefined);\n    if (this._scrollTarget) {\n      this._scrollTarget.removeEventListener('scroll', this, {passive: true} as EventListenerOptions);\n      if (this._sizer && this._scrollTarget === this._containerElement) {\n        this._sizer.remove();\n      }\n    }\n\n    this._scrollTarget = target as (Element | null);\n\n    if (target) {\n      target.addEventListener('scroll', this, {passive: true});\n      if (target === this._containerElement) {\n        this._sizer = this._sizer || this._createContainerSizer();\n        this._container!.insertBefore(this._sizer, this._container!.firstChild);\n      }\n    }\n  }\n\n  /**\n   * Index and position of item to scroll to. The scroller will fix to that point\n   * until the user scrolls.\n   */\n  set scrollToIndex(newValue: ScrollToIndexValue) {\n    this._scrollToIndex = newValue;\n    this._schedule(this._updateLayout);\n  }\n\n  protected async _schedule(method: Function): Promise<void> {\n    if (!this._scheduled.has(method)) {\n      this._scheduled.add(method);\n      await Promise.resolve();\n      this._scheduled.delete(method);\n      method.call(this);\n    }\n  }\n\n  async _updateDOM() {\n    const {_rangeChanged, _itemsChanged} = this;\n    if (this._visibilityChanged) {\n      this._notifyVisibility();\n      this._visibilityChanged = false;\n    }\n    if (_rangeChanged || _itemsChanged) {\n      this._notifyRange();\n      this._rangeChanged = false;\n      this._itemsChanged = false;\n      await this._mutationPromise;\n    }\n    if (this._layout!.measureChildren) {\n      this._children.forEach((child) => this._childrenRO!.observe(child));\n    }\n    this._positionChildren(this._childrenPos!);\n    this._sizeContainer(this._scrollSize);\n    if (this._scrollErr) {\n      this._correctScrollError(this._scrollErr);\n      this._scrollErr = null;\n    }\n    if (this._benchmarkStart && 'mark' in window.performance) {\n      window.performance.mark('uv-end');\n    }\n  }\n\n  _updateLayout() {\n    this._layout!.totalItems = this._totalItems!;\n    if (this._scrollToIndex !== null) {\n      this._layout!.scrollToIndex(this._scrollToIndex.index, this._scrollToIndex!.position!);\n      this._scrollToIndex = null;\n    }\n    this._updateView();\n    if (this._childMeasurements !== null) {\n      // If the layout has been changed, we may have measurements but no callback\n      if (this._measureCallback) {\n        this._measureCallback(this._childMeasurements);\n      }\n      this._childMeasurements = null;\n    }\n    this._layout!.reflowIfNeeded(this._itemsChanged);\n    if (this._benchmarkStart && 'mark' in window.performance) {\n      window.performance.mark('uv-end');\n    }\n  }\n\n  private _handleScrollEvent() {\n    if (this._benchmarkStart && 'mark' in window.performance) {\n      try {\n        window.performance.measure(\n          'uv-virtualizing',\n          'uv-start',\n          'uv-end'\n        );\n      } catch(e) {\n        console.warn('Error measuring performance data: ', e);\n      }\n      window.performance.mark('uv-start');\n    }\n    this._schedule(this._updateLayout);\n  }\n\n  handleEvent(event: CustomEvent) {\n    switch (event.type) {\n      case 'scroll':\n        if (!this._scrollTarget || event.target === this._scrollTarget) {\n          this._handleScrollEvent();\n        }\n        break;\n      case 'scrollsizechange':\n        this._scrollSize = event.detail;\n        this._schedule(this._updateDOM);\n        break;\n      case 'scrollerrorchange':\n        this._scrollErr = event.detail;\n        this._schedule(this._updateDOM);\n        break;\n      case 'itempositionchange':\n        this._childrenPos = event.detail;\n        this._schedule(this._updateDOM);\n        break;\n      case 'rangechange':\n        this._adjustRange(event.detail);\n        this._schedule(this._updateDOM);\n        break;\n      default:\n        console.warn('event not handled', event);\n    }\n  }\n\n  private async _initResizeObservers() {\n    if (this._containerRO === null) {\n      const ResizeObserver = await getResizeObserver();\n      this._containerRO = new ResizeObserver(\n        (entries: ResizeObserverEntry[]) => this._containerSizeChanged(entries[0].contentRect));\n      this._childrenRO =\n        new ResizeObserver(this._childrenSizeChanged.bind(this));\n      this._mutationObserver = new MutationObserver(this._observeMutations.bind(this));\n    }\n  }\n\n  private _createContainerSizer(): HTMLDivElement {\n    const sizer = document.createElement('div');\n    // When the scrollHeight is large, the height of this element might be\n    // ignored. Setting content and font-size ensures the element has a size.\n    Object.assign(sizer.style, {\n      position: 'absolute',\n      margin: '-2px 0 0 0',\n      padding: 0,\n      visibility: 'hidden',\n      fontSize: '2px',\n    });\n    sizer.innerHTML = '&nbsp;';\n    sizer.id = 'uni-virtualizer-spacer';\n    return sizer;\n  }\n\n  get _children(): Array<HTMLElement> {\n    const arr = [];\n    let next = this.container!.firstElementChild as HTMLElement;\n    while (next) {\n      // Skip our spacer. TODO (graynorton): Feels a bit hacky. Anything better?\n      if (next.id !== 'uni-virtualizer-spacer') {\n        arr.push(next);\n      }\n      next = next.nextElementSibling as HTMLElement;\n    }\n    return arr;\n  }\n\n  private _updateView() {\n    if (!this.container || !this._containerElement || !this._layout) {\n      return;\n    }\n    let width, height, top, left;\n    if (this._scrollTarget === this._containerElement && this._containerSize !== null) {\n      width = this._containerSize.width;\n      height = this._containerSize.height;\n      left = this._containerElement.scrollLeft;\n      top = this._containerElement.scrollTop;\n    } else {\n      const containerBounds = this._containerElement.getBoundingClientRect();\n      const scrollBounds = this._scrollTarget ?\n          this._scrollTarget.getBoundingClientRect() :\n          {\n            top: containerBounds.top + window.pageYOffset,\n            left: containerBounds.left + window.pageXOffset,\n            width: innerWidth,\n            height: innerHeight\n          };\n      const scrollerWidth = scrollBounds.width;\n      const scrollerHeight = scrollBounds.height;\n      const xMin = Math.max(\n          0, Math.min(scrollerWidth, containerBounds.left - scrollBounds.left));\n      const yMin = Math.max(\n          0, Math.min(scrollerHeight, containerBounds.top - scrollBounds.top));\n      // TODO (graynorton): Direction is intended to be a layout-level concept, not a scroller-level concept,\n      // so this feels like a factoring problem\n      const xMax = this._layout.direction === 'vertical' ?\n          Math.max(\n              0,\n              Math.min(\n                  scrollerWidth, containerBounds.right - scrollBounds.left)) :\n          scrollerWidth;\n      const yMax = this._layout.direction === 'vertical' ?\n          scrollerHeight :\n          Math.max(\n              0,\n              Math.min(\n                  scrollerHeight, containerBounds.bottom - scrollBounds.top));\n      width = xMax - xMin;\n      height = yMax - yMin;\n      left = Math.max(0, -(containerBounds.left - scrollBounds.left));\n      top = Math.max(0, -(containerBounds.top - scrollBounds.top));\n    }\n    this._layout.viewportSize = {width, height};\n    this._layout.viewportScroll = {top, left};\n  }\n\n  /**\n   * Styles the _sizer element or the container so that its size reflects the\n   * total size of all items.\n   */\n  private _sizeContainer(size?: ScrollSize | null) {\n    if (this._scrollTarget === this._containerElement) {\n      const left = size && (size as HorizontalScrollSize).width ? (size as HorizontalScrollSize).width - 1 : 0;\n      const top = size && (size as VerticalScrollSize).height ? (size as VerticalScrollSize).height - 1 : 0;\n      if (this._sizer) {\n        this._sizer.style.transform = `translate(${left}px, ${top}px)`;\n      }\n    } else {\n      if (this._containerElement) {\n        const style = (this._containerElement as HTMLElement).style;\n        (style.minWidth as string | null) = size && (size as HorizontalScrollSize).width ? (size as HorizontalScrollSize).width + 'px' : null;\n        (style.minHeight as string | null) = size && (size as VerticalScrollSize).height ? (size as VerticalScrollSize).height + 'px' : null;  \n      }\n    }\n  }\n\n  /**\n   * Sets the top and left transform style of the children from the values in\n   * pos.\n   */\n  private _positionChildren(pos: Array<{top: number, left: number, width?: number, height?: number}>) {\n    if (pos) {\n      const children = this._children;\n      Object.keys(pos).forEach((key) => {\n        const idx = (key as unknown as number) - this._first;\n        const child = children[idx];\n        if (child) {\n          const {top, left, width, height} = pos[key as unknown as number];\n          child.style.position = 'absolute';\n          child.style.boxSizing = 'border-box';\n          child.style.transform = `translate(${left}px, ${top}px)`;\n          if (width !== undefined) {\n            child.style.width = width + 'px';\n          }\n          if (height !== undefined) {\n            child.style.height = height + 'px';\n          }\n        }\n      });  \n    }\n  }\n\n  private async _adjustRange(range: Range) {\n    const {_first, _last, _firstVisible, _lastVisible} = this;\n    this._first = range.first;\n    this._last = range.last;\n    this._firstVisible = range.firstVisible;\n    this._lastVisible = range.lastVisible;\n    this._rangeChanged = (\n      this._rangeChanged ||\n      this._first !== _first ||\n      this._last !== _last\n    );\n    this._visibilityChanged = (\n      this._visibilityChanged ||\n      this._firstVisible !== _firstVisible ||\n      this._lastVisible !== _lastVisible\n    );\n  }\n\n  private _correctScrollError(err: {top: number, left: number}) {\n    if (this._scrollTarget) {\n      this._scrollTarget.scrollTop -= err.top;\n      this._scrollTarget.scrollLeft -= err.left;\n    } else {\n      window.scroll(window.pageXOffset - err.left, window.pageYOffset - err.top);\n    }\n  }\n\n  /**\n   * Emits a rangechange event with the current first, last, firstVisible, and\n   * lastVisible.\n   */\n  private _notifyRange() {\n    // TODO (graynorton): Including visibility here for backward compat, but \n    // may decide to remove at some point. The rationale for separating is that\n    // range change events are mainly intended for \"internal\" consumption by the\n    // renderer, whereas visibility change events are mainly intended for \"external\"\n    // consumption by application code.\n    this._container!.dispatchEvent(\n        new CustomEvent('rangeChanged', {detail:{\n          first: this._first,\n          last: this._last,\n          firstVisible: this._firstVisible,\n          lastVisible: this._lastVisible,\n        }})\n    );\n  }\n\n  private _notifyVisibility() {\n    this._container!.dispatchEvent(\n        new CustomEvent('visibilityChanged', {detail:{\n          first: this._first,\n          last: this._last,\n          firstVisible: this._firstVisible,\n          lastVisible: this._lastVisible,\n        }})\n    );\n  }\n\n  /**\n   * Render and update the view at the next opportunity with the given\n   * container size.\n   */\n  private _containerSizeChanged(size: {width: number, height: number}) {\n    const {width, height} = size;\n    this._containerSize = {width, height};\n    this._schedule(this._updateLayout);\n  }\n\n  private async _observeMutations() {\n    if (!this._mutationsObserved) {\n      this._mutationsObserved = true;\n      this._mutationPromiseResolver!();\n      this._mutationPromise = new Promise(resolve => this._mutationPromiseResolver = resolve);\n      this._mutationsObserved = false;\n    }\n  }\n\n  // TODO (graynorton): Rethink how this works. Probably child loading is too specific\n  // to have dedicated support for; might want some more generic lifecycle hooks for\n  // layouts to use. Possibly handle measurement this way, too, or maybe that remains\n  // a first-class feature?\n\n  private _childLoaded() {\n    // this.requestRemeasure();\n  }\n\n  private _childrenSizeChanged(changes: ResizeObserverEntry[]) {\n    for (const change of changes) {\n      this._toBeMeasured.set(change.target as HTMLElement, change.contentRect);\n    }\n    this._measureChildren();\n    this._schedule(this._updateLayout);\n  }\n}\n\nfunction getMargins(el: Element): Margins {\n  const style = window.getComputedStyle(el);\n  return {\n    marginTop: getMarginValue(style.marginTop),\n    marginRight: getMarginValue(style.marginRight),\n    marginBottom: getMarginValue(style.marginBottom),\n    marginLeft: getMarginValue(style.marginLeft),\n  };\n}\n\nfunction getMarginValue(value: string): number {\n  const float = value ? parseFloat(value) : NaN;\n  return Number.isNaN(float) ? 0 : float;\n}"]}
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout.d.ts b/lib/uni-virtualizer/lib/layouts/Layout.d.ts
index 42d282ba7ee5d75b7ba85afcf985c8ea47112ea4..425e2d89301a051c6eecb4e00b4dbdeec7032b2b 100644
--- a/lib/uni-virtualizer/lib/layouts/Layout.d.ts
+++ b/lib/uni-virtualizer/lib/layouts/Layout.d.ts
@@ -8,7 +8,7 @@ export declare type Margins = {
     marginBottom: number;
     marginLeft: number;
 };
-export declare type ItemBox = Size | Size & Margins;
+export declare type ItemBox = Size | (Size & Margins);
 export declare type position = 'left' | 'top';
 export declare type Positions = {
     left: number;
@@ -16,29 +16,28 @@ export declare type Positions = {
     width?: number;
     height?: number;
 };
-export interface Type<T> extends Function {
-    new (...args: any[]): T;
-}
-export interface LayoutConfig {
-    type?: Type<Layout>;
+export declare type LayoutConstructor = new (config?: object) => Layout;
+export interface LayoutSpecifier {
+    type: LayoutConstructor;
 }
+export declare type LayoutSpecifierFactory = (config?: object) => LayoutSpecifier;
 export declare type ScrollDirection = 'vertical' | 'horizontal';
 /**
  * Interface for layouts consumed by VirtualScroller or VirtualRepeater.
  */
 export interface Layout {
-    config: LayoutConfig;
+    config?: object;
     totalItems: number;
     direction: ScrollDirection;
     viewportSize: Size;
     viewportScroll: Positions;
-    readonly measureChildren?: boolean | ((e: Element, i: object) => object);
+    readonly measureChildren?: boolean | ((e: Element, i: unknown) => ItemBox);
     readonly listenForChildLoadEvents?: boolean;
     updateItemSizes?: (sizes: {
         [key: number]: ItemBox;
     }) => void;
-    addEventListener: any;
-    removeEventListener: any;
+    addEventListener: Function;
+    removeEventListener: Function;
     scrollToIndex: (index: number, position: string) => void;
     /**
      * Called by a VirtualRepeater or VirtualScroller when an update that
diff --git a/lib/uni-virtualizer/lib/layouts/Layout.d.ts.map b/lib/uni-virtualizer/lib/layouts/Layout.d.ts.map
index 470e5b26be4db353e4a9bafb815d41bcf208832f..13497a406bb9144e3f8b5c729bca351916c831bb 100644
--- a/lib/uni-virtualizer/lib/layouts/Layout.d.ts.map
+++ b/lib/uni-virtualizer/lib/layouts/Layout.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"Layout.d.ts","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/layouts/Layout.ts"],"names":[],"mappings":"AAAA,oBAAY,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC3C,oBAAY,IAAI,GAAG;KAChB,GAAG,IAAI,SAAS,GAAG,MAAM;CAC3B,CAAC;AAEF,oBAAY,OAAO,GAAG;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAC;AAEF,oBAAY,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC;AAE5C,oBAAY,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AACtC,oBAAY,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAC;AAEF,MAAM,WAAW,IAAI,CAAC,CAAC,CAAE,SAAQ,QAAQ;IACvC,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;CACpB;AAED,oBAAY,eAAe,GAAG,UAAU,GAAG,YAAY,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,YAAY,CAAC;IAErB,UAAU,EAAE,MAAM,CAAC;IAEnB,SAAS,EAAE,eAAe,CAAC;IAE3B,YAAY,EAAE,IAAI,CAAC;IAEnB,cAAc,EAAE,SAAS,CAAC;IAE1B,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IAEzE,QAAQ,CAAC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAE5C,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE;QACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KACvB,KAAK,IAAI,CAAC;IAEX,gBAAgB,MAAC;IAEjB,mBAAmB,MAAC;IAEpB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6CG;IACH,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C"}
\ No newline at end of file
+{"version":3,"file":"Layout.d.ts","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/layouts/Layout.ts"],"names":[],"mappings":"AAAA,oBAAY,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC3C,oBAAY,IAAI,GAAG;KAChB,GAAG,IAAI,SAAS,GAAG,MAAM;CAC3B,CAAC;AAEF,oBAAY,OAAO,GAAG;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAC;AAEF,oBAAY,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;AAE9C,oBAAY,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AACtC,oBAAY,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAC;AAGF,oBAAY,iBAAiB,GAAG,KAAI,MAAM,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,iBAAiB,CAAA;CACxB;AAED,oBAAY,sBAAsB,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,eAAe,CAAC;AAG1E,oBAAY,eAAe,GAAG,UAAU,GAAG,YAAY,CAAC;AAExD;;GAEG;AACF,MAAM,WAAW,MAAM;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,UAAU,EAAE,MAAM,CAAC;IAEnB,SAAS,EAAE,eAAe,CAAC;IAE3B,YAAY,EAAE,IAAI,CAAC;IAEnB,cAAc,EAAE,SAAS,CAAC;IAE1B,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC;IAE3E,QAAQ,CAAC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAE5C,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE;QACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KACvB,KAAK,IAAI,CAAC;IAEX,gBAAgB,EAAE,QAAQ,CAAC;IAE3B,mBAAmB,EAAE,QAAQ,CAAC;IAE9B,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6CG;IACH,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C"}
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout.js b/lib/uni-virtualizer/lib/layouts/Layout.js
index cb0ff5c3b541f646105198ee23ac0fc3d805023e..215b2c9498b60901b4bf2dd7c4a18803a4e4562c 100644
--- a/lib/uni-virtualizer/lib/layouts/Layout.js
+++ b/lib/uni-virtualizer/lib/layouts/Layout.js
@@ -1 +1,2 @@
 export {};
+//# sourceMappingURL=Layout.js.map
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout.js.map b/lib/uni-virtualizer/lib/layouts/Layout.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..a95ae35dbf53896f9eba8ccbeeea0b06f9c8d3c0
--- /dev/null
+++ b/lib/uni-virtualizer/lib/layouts/Layout.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/layouts/Layout.ts"],"names":[],"mappings":"","sourcesContent":["export type dimension = 'height' | 'width';\nexport type Size = {\n  [key in dimension]: number\n};\n\nexport type Margins = {\n  marginTop: number,\n  marginRight: number,\n  marginBottom: number,\n  marginLeft: number\n};\n\nexport type ItemBox = Size | (Size & Margins);\n\nexport type position = 'left' | 'top';\nexport type Positions = {\n  left: number,\n  top: number,\n  width?: number,\n  height?: number\n};\n\n\nexport type LayoutConstructor = new(config?: object) => Layout;\n\nexport interface LayoutSpecifier {\n  type: LayoutConstructor\n}\n\nexport type LayoutSpecifierFactory = (config?: object) => LayoutSpecifier;\n\n\nexport type ScrollDirection = 'vertical' | 'horizontal';\n\n/**\n * Interface for layouts consumed by VirtualScroller or VirtualRepeater.\n */\n export interface Layout {\n  config?: object;\n   \n  totalItems: number;\n\n  direction: ScrollDirection;\n\n  viewportSize: Size;\n\n  viewportScroll: Positions;\n\n  readonly measureChildren?: boolean | ((e: Element, i: unknown) => ItemBox);\n\n  readonly listenForChildLoadEvents?: boolean;\n\n  updateItemSizes?: (sizes: {\n    [key: number]: ItemBox\n  }) => void;\n\n  addEventListener: Function;\n\n  removeEventListener: Function;\n\n  scrollToIndex: (index: number, position: string) => void;\n\n  /**\n   * Called by a VirtualRepeater or VirtualScroller when an update that\n   * potentially affects layout has occurred. For example, a viewport size\n   * change.\n   *\n   * The layout is in turn responsible for dispatching events, as necessary,\n   * to the VirtualRepeater or VirtualScroller. Each of the following events\n   * represents an update that should be determined during a reflow. Dispatch\n   * each event at maximum once during a single reflow.\n   *\n   * Events that should be dispatched:\n   * - scrollsizechange\n   *     Dispatch when the total length of all items in the scrolling direction,\n   *     including spacing, changes.\n   *     detail: {\n   *       'height' | 'width': number\n   *     }\n   * - rangechange\n   *     Dispatch when the range of children that should be displayed changes\n   *     (based on layout calculations and the size of the container) or when\n   *     the first or last item to intersect the container changes.\n   *     detail: {\n   *       first: number,\n   *       last: number,\n   *       num: number,\n   *       stable: boolean,\n   *       remeasure: boolean,\n   *       firstVisible: number,\n   *       lastVisible: number,\n   *     }\n   * - itempositionchange\n   *     Dispatch when the child positions change, for example due to a range\n   *     change.\n   *     detail {\n   *       [number]: {\n   *         left: number,\n   *         top: number\n   *       }\n   *     }\n   * - scrollerrorchange\n   *     Dispatch when the set viewportScroll offset is not what it should be.\n   *     detail {\n   *       height: number,\n   *       width: number,\n   *     }\n   */\n  reflowIfNeeded: (force: boolean) => void;\n}"]}
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1d.d.ts b/lib/uni-virtualizer/lib/layouts/Layout1d.d.ts
index 843bab970bceb48331dbc28b30ec11c56f9940f2..cafaca7a6b9f0d7789eb17d2c753149dc5c99e60 100644
--- a/lib/uni-virtualizer/lib/layouts/Layout1d.d.ts
+++ b/lib/uni-virtualizer/lib/layouts/Layout1d.d.ts
@@ -1,10 +1,19 @@
-import { Layout1dBase } from './Layout1dBase.js';
+import { Layout1dBase, Layout1dBaseConfig } from './Layout1dBase.js';
 import { ItemBox, Positions, Size } from './Layout.js';
 declare type ItemBounds = {
     pos: number;
     size: number;
 };
-export declare class Layout1d extends Layout1dBase {
+declare type Layout1dConstructor = {
+    prototype: Layout1d;
+    new (config?: Layout1dBaseConfig): Layout1d;
+};
+declare type Layout1dSpecifier = Layout1dBaseConfig & {
+    type: Layout1dConstructor;
+};
+declare type Layout1dSpecifierFactory = (config?: Layout1dBaseConfig) => Layout1dSpecifier;
+export declare const layout1d: Layout1dSpecifierFactory;
+export declare class Layout1d extends Layout1dBase<Layout1dBaseConfig> {
     /**
      * Indices of children mapped to their (position and length) in the scrolling
      * direction. Used to keep track of children that are in range.
@@ -24,11 +33,11 @@ export declare class Layout1d extends Layout1dBase {
      * jumping to any point of the scroll size. We choose it once and stick with
      * it until stable. _first and _last are deduced around it.
      */
-    _anchorIdx: number;
+    _anchorIdx: number | null;
     /**
      * Position in the scrolling direction of the anchor child.
      */
-    _anchorPos: number;
+    _anchorPos: number | null;
     /**
      * Whether all children in range were in range during the previous reflow.
      */
@@ -47,7 +56,6 @@ export declare class Layout1d extends Layout1dBase {
     private _tMeasured;
     private _measureChildren;
     _estimate: boolean;
-    constructor(config: any);
     get measureChildren(): boolean;
     /**
      * Determine the average size of all children represented in the sizes
@@ -62,13 +70,13 @@ export declare class Layout1d extends Layout1dBase {
      */
     _updateItemSize(): void;
     _getMetrics(idx: number): ItemBox;
-    _getPhysicalItem(idx: number): ItemBounds;
+    _getPhysicalItem(idx: number): ItemBounds | undefined;
     _getSize(idx: number): number | undefined;
     /**
      * Returns the position in the scrolling direction of the item at idx.
      * Estimates it if the item at idx is not in the DOM.
      */
-    _getPosition(idx: any): number;
+    _getPosition(idx: number): number;
     _calculateAnchor(lower: number, upper: number): number;
     _getAnchor(lower: number, upper: number): number;
     /**
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1d.d.ts.map b/lib/uni-virtualizer/lib/layouts/Layout1d.d.ts.map
index 511045deb4569007c11e36a74ffdd4ca0dbb4931..16037434e706663ab3bc9fadb9e5c19090b5342f 100644
--- a/lib/uni-virtualizer/lib/layouts/Layout1d.d.ts.map
+++ b/lib/uni-virtualizer/lib/layouts/Layout1d.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"Layout1d.d.ts","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/layouts/Layout1d.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAC,MAAM,aAAa,CAAC;AAErD,aAAK,UAAU,GAAG;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAA;CACb,CAAC;AAEF,qBAAa,QAAS,SAAQ,YAAY;IACxC;;;OAGG;IACH,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAa;IAEpD;;;OAGG;IACH,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAa;IAEvD;;OAEG;IACH,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAa;IAExC;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAQ;IAE1B;;OAEG;IACH,UAAU,EAAE,MAAM,CAAQ;IAE1B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAQ;IAExB;;OAEG;IACH,eAAe,EAAE,OAAO,CAAS;IAEjC;;OAEG;IACH,OAAO,CAAC,UAAU,CAAa;IAE/B;;OAEG;IACH,OAAO,CAAC,UAAU,CAAa;IAE/B,OAAO,CAAC,gBAAgB,CAAQ;IAEhC,SAAS,EAAE,OAAO,CAAQ;gBAEd,MAAM,KAAA;IAIlB,IAAI,eAAe,YAElB;IAED;;;OAGG;IACH,eAAe,CAAC,KAAK,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAC;IAmC/C;;;OAGG;IACH,eAAe;IAMf,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIjC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU;IAIzC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKzC;;;OAGG;IACH,YAAY,CAAC,GAAG,KAAA,GAAG,MAAM;IAKzB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IActD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAqDhD;;;OAGG;IACH,eAAe;IAQf;;OAEG;IACH,WAAW;IAeX,SAAS;IA+GT,eAAe,IAAI,MAAM;IAezB,iBAAiB;IAQjB,OAAO;IA0BP,iBAAiB;IAMjB;;OAEG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IAOxC;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAO/B,gBAAgB;IAKhB,UAAU;CAMX"}
\ No newline at end of file
+{"version":3,"file":"Layout1d.d.ts","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/layouts/Layout1d.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAE,kBAAkB,EAAC,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAU,MAAM,aAAa,CAAC;AAE9D,aAAK,UAAU,GAAG;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAA;CACb,CAAC;AAEF,aAAK,mBAAmB,GAAG;IACzB,SAAS,EAAE,QAAQ,CAAC;IACpB,KAAI,MAAM,CAAC,EAAE,kBAAkB,GAAG,QAAQ,CAAA;CAC3C,CAAA;AAED,aAAK,iBAAiB,GAAG,kBAAkB,GAAG;IAC5C,IAAI,EAAE,mBAAmB,CAAA;CAC1B,CAAA;AAED,aAAK,wBAAwB,GAAG,CAAC,MAAM,CAAC,EAAE,kBAAkB,KAAK,iBAAiB,CAAC;AAEnF,eAAO,MAAM,QAAQ,EAAE,wBAEb,CAAC;AAGX,qBAAa,QAAS,SAAQ,YAAY,CAAC,kBAAkB,CAAC;IAC5D;;;OAGG;IACH,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAa;IAEpD;;;OAGG;IACH,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAa;IAEvD;;OAEG;IACH,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAa;IAExC;;;;OAIG;IACH,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEjC;;OAEG;IACH,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEjC;;OAEG;IACH,OAAO,UAAQ;IAEf;;OAEG;IACH,eAAe,UAAS;IAExB;;OAEG;IACH,OAAO,CAAC,UAAU,CAAK;IAEvB;;OAEG;IACH,OAAO,CAAC,UAAU,CAAK;IAEvB,OAAO,CAAC,gBAAgB,CAAQ;IAEhC,SAAS,UAAQ;IAUjB,IAAI,eAAe,YAElB;IAED;;;OAGG;IACH,eAAe,CAAC,KAAK,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAC;IAmC/C;;;OAGG;IACH,eAAe;IAMf,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IASjC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIrD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKzC;;;OAGG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAKjC,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IActD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAqDhD;;;OAGG;IACH,eAAe;IAQf;;OAEG;IACH,WAAW;IAeX,SAAS;IA+GT,eAAe,IAAI,MAAM;IAezB,iBAAiB;IAQjB,OAAO;IA0BP,iBAAiB;IAMjB;;OAEG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IAOxC;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAO/B,gBAAgB;IAKhB,UAAU;CAMX"}
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1d.js b/lib/uni-virtualizer/lib/layouts/Layout1d.js
index 24e296295ce03663bdb90b19925ccb70e3586ddb..7a261b8b7d3a3bce975eef81a6558dc5ad561e66 100644
--- a/lib/uni-virtualizer/lib/layouts/Layout1d.js
+++ b/lib/uni-virtualizer/lib/layouts/Layout1d.js
@@ -1,7 +1,10 @@
 import { Layout1dBase } from './Layout1dBase.js';
+export const layout1d = (config) => Object.assign({
+    type: Layout1d
+}, config);
 export class Layout1d extends Layout1dBase {
-    constructor(config) {
-        super(config);
+    constructor() {
+        super(...arguments);
         /**
          * Indices of children mapped to their (position and length) in the scrolling
          * direction. Used to keep track of children that are in range.
@@ -45,6 +48,11 @@ export class Layout1d extends Layout1dBase {
         this._measureChildren = true;
         this._estimate = true;
     }
+    // protected _defaultConfig: Layout1dBaseConfig = Object.assign({}, super._defaultConfig, {
+    // })
+    // constructor(config: Layout1dConfig) {
+    //   super(config);
+    // }
     get measureChildren() {
         return this._measureChildren;
     }
@@ -54,7 +62,7 @@ export class Layout1d extends Layout1dBase {
      */
     updateItemSizes(sizes) {
         Object.keys(sizes).forEach((key) => {
-            const metrics = sizes[key], mi = this._getMetrics(Number(key)), prevSize = mi[this._sizeDim];
+            const metrics = sizes[Number(key)], mi = this._getMetrics(Number(key)), prevSize = mi[this._sizeDim];
             // TODO(valdrin) Handle margin collapsing.
             // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Box_Model/Mastering_margin_collapsing
             mi.width = metrics.width + (metrics.marginLeft || 0) +
@@ -64,10 +72,10 @@ export class Layout1d extends Layout1dBase {
             const size = mi[this._sizeDim];
             const item = this._getPhysicalItem(Number(key));
             if (item) {
-                let delta;
+                let delta = 0;
                 if (size !== undefined) {
                     item.size = size;
-                    if (prevSize === undefined) {
+                    if (prevSize === -1) {
                         delta = size;
                         this._nMeasured++;
                     }
@@ -93,7 +101,12 @@ export class Layout1d extends Layout1dBase {
             Math.round(this._tMeasured / this._nMeasured);
     }
     _getMetrics(idx) {
-        return (this._metrics[idx] = this._metrics[idx] || {});
+        let metrics = this._metrics.get(idx);
+        if (metrics === undefined) {
+            metrics = { height: -1, width: -1 };
+            this._metrics.set(idx, metrics);
+        }
+        return metrics;
     }
     _getPhysicalItem(idx) {
         return this._newPhysicalItems.get(idx) || this._physicalItems.get(idx);
@@ -365,3 +378,4 @@ export class Layout1d extends Layout1dBase {
         super._emitRange({ remeasure, stable });
     }
 }
+//# sourceMappingURL=Layout1d.js.map
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1d.js.map b/lib/uni-virtualizer/lib/layouts/Layout1d.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..53e2375c71a8f5e1aa116c5d3152e392569607ef
--- /dev/null
+++ b/lib/uni-virtualizer/lib/layouts/Layout1d.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"Layout1d.js","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/layouts/Layout1d.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAqB,MAAM,mBAAmB,CAAC;AAmBnE,MAAM,CAAC,MAAM,QAAQ,GAA6B,CAAC,MAA2B,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;IAC/F,IAAI,EAAE,QAAQ;CACf,EAAE,MAAM,CAAC,CAAC;AAGX,MAAM,OAAO,QAAS,SAAQ,YAAgC;IAA9D;;QACE;;;WAGG;QACH,mBAAc,GAA4B,IAAI,GAAG,EAAE,CAAC;QAEpD;;;WAGG;QACH,sBAAiB,GAA4B,IAAI,GAAG,EAAE,CAAC;QAEvD;;WAEG;QACH,aAAQ,GAAsB,IAAI,GAAG,EAAE,CAAC;QAExC;;;;WAIG;QACH,eAAU,GAAkB,IAAI,CAAC;QAEjC;;WAEG;QACH,eAAU,GAAkB,IAAI,CAAC;QAEjC;;WAEG;QACH,YAAO,GAAG,IAAI,CAAC;QAEf;;WAEG;QACH,oBAAe,GAAG,KAAK,CAAC;QAExB;;WAEG;QACK,eAAU,GAAG,CAAC,CAAC;QAEvB;;WAEG;QACK,eAAU,GAAG,CAAC,CAAC;QAEf,qBAAgB,GAAG,IAAI,CAAC;QAEhC,cAAS,GAAG,IAAI,CAAC;IAgYnB,CAAC;IA9XC,2FAA2F;IAE3F,KAAK;IAEL,wCAAwC;IACxC,mBAAmB;IACnB,IAAI;IAEJ,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,KAA+B;QAC7C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACjC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAChE,QAAQ,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEnC,0CAA0C;YAC1C,6FAA6F;YAC7F,EAAE,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,GAAG,CAAE,OAAmB,CAAC,UAAU,IAAI,CAAC,CAAC;gBAC7D,CAAE,OAAmB,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;YAC5C,EAAE,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,CAAE,OAAmB,CAAC,SAAS,IAAI,CAAC,CAAC;gBAC9D,CAAE,OAAmB,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;YAE7C,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChD,IAAI,IAAI,EAAE;gBACR,IAAI,KAAK,GAAG,CAAC,CAAC;gBAEd,IAAI,IAAI,KAAK,SAAS,EAAE;oBACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;oBACjB,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE;wBACnB,KAAK,GAAG,IAAI,CAAC;wBACb,IAAI,CAAC,UAAU,EAAE,CAAC;qBACnB;yBAAM;wBACL,KAAK,GAAG,IAAI,GAAG,QAAQ,CAAC;qBACzB;iBACF;gBACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;aAC3C;QACH,CAAC,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,CAAC,eAAe,EAAE,CAAC;SACxB;IACH,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,uBAAuB;QACvB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,CAAC;IAED,WAAW,CAAC,GAAW;QACrB,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,OAAO,KAAK,SAAS,EAAE;YACzB,OAAO,GAAG,EAAC,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAC,CAAC;YAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;SACjC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,gBAAgB,CAAC,GAAW;QAC1B,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzE,CAAC;IAED,QAAQ,CAAC,GAAW;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,GAAW;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;IACjE,CAAC;IAED,gBAAgB,CAAC,KAAa,EAAE,KAAa;QAC3C,IAAI,KAAK,KAAK,CAAC,EAAE;YACf,OAAO,CAAC,CAAC;SACV;QACD,IAAI,KAAK,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE;YAC7C,OAAO,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;SAC7B;QACD,OAAO,IAAI,CAAC,GAAG,CACX,CAAC,EACD,IAAI,CAAC,GAAG,CACJ,IAAI,CAAC,WAAW,GAAG,CAAC,EACpB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,UAAU,CAAC,KAAa,EAAE,KAAa;QACrC,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,EAAE;YAClC,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SAC5C;QACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACnB,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC7C,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SAC5C;QACD,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE;YAClB,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SAC5C;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAC9C,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,EAC5C,QAAQ,GAAG,SAAU,CAAC,GAAG,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAU,CAAC,IAAI,EAChE,OAAO,GAAG,QAAS,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,GAAG,QAAS,CAAC,IAAI,CAAC;QAElE,IAAI,OAAO,GAAG,KAAK,EAAE;YACnB,+DAA+D;YAC/D,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SAC5C;QACD,IAAI,QAAQ,GAAG,KAAK,EAAE;YACpB,iEAAiE;YACjE,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SAC5C;QACD,IAAI,QAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,EAAE;YAC1C,iDAAiD;YACjD,OAAO,IAAI,CAAC,MAAM,CAAC;SACpB;QACD,IAAI,OAAO,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,EAAE;YACxC,2CAA2C;YAC3C,OAAO,IAAI,CAAC,KAAK,CAAC;SACnB;QACD,6DAA6D;QAC7D,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAE9C,OAAO,IAAI,EAAE;YACX,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAChD,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,EACjD,IAAI,GAAG,SAAU,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,SAAU,CAAC,IAAI,CAAC;YAE3D,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC;gBAChC,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,EAAE;gBACpC,OAAO,YAAY,CAAC;aACrB;iBAAM,IAAI,IAAI,GAAG,KAAK,EAAE;gBACvB,MAAM,GAAG,YAAY,GAAG,CAAC,CAAC;aAC3B;iBAAM,IAAI,IAAI,GAAG,KAAK,EAAE;gBACvB,MAAM,GAAG,YAAY,GAAG,CAAC,CAAC;aAC3B;SACF;IACH,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,EAAE;YAClD,IAAI,CAAC,WAAW,EAAE,CAAC;SACpB;aAAM;YACL,IAAI,CAAC,SAAS,EAAE,CAAC;SAClB;IACH,CAAC;IAED;;OAEG;IACH,WAAW;QACT,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAChB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC;QACrC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,SAAS;QACP,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC;QACrC,IAAI,KAAK,EAAE,KAAK,CAAC;QAEjB,wEAAwE;QACxE,uEAAuE;QACvE,oEAAoE;QAEpE,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,EAAE;YAC5B,qDAAqD;YACrD,gDAAgD;YAChD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC;YACtC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACrD,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3D,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;SAC5F;aACI;YACH,uDAAuD;YACvD,oCAAoC;YACpC,KAAK,GAAG,IAAI,CAAC,GAAG,CACd,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CACvD,CAAC;YACF,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YAEnE,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE;gBACxD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBAChD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aACtD;SACF;QAED,IAAI,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,UAAU,KAAK,SAAS,EAAE;YAC5B,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;SAC7B;QAED,0EAA0E;QAC1E,kBAAkB;QAClB,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,IAAI,IAAI,CAAC,UAAU,GAAG,UAAU,GAAG,IAAI,CAAC,QAAQ,GAAG,KAAK,EAAE;YACxD,SAAS,GAAG,KAAK,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;SACpE;QAED,IAAI,IAAI,CAAC,UAAU,GAAG,KAAK,EAAE;YAC3B,SAAS,GAAG,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;SACrC;QAED,IAAI,SAAS,EAAE;YACb,IAAI,CAAC,eAAe,IAAI,SAAS,CAAC;YAClC,KAAK,IAAI,SAAS,CAAC;YACnB,KAAK,IAAI,SAAS,CAAC;YACnB,IAAI,CAAC,YAAY,IAAI,SAAS,CAAC;SAChC;QAED,0EAA0E;QAC1E,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,EAAC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,EAAC,CAAC,CAAC;QAErE,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QAE1D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,OAAO,IAAI,CAAC,YAAY,GAAG,KAAK,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACnD,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,IAAI,KAAK,SAAS,EAAE;gBACtB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;gBACrB,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;aACvB;YACD,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAC,GAAG,EAAE,IAAI,EAAC,CAAC,CAAC;YACpC,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE;gBACtD,MAAM;aACP;SACF;QAED,OAAO,IAAI,CAAC,YAAY,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;YACjE,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,IAAI,KAAK,SAAS,EAAE;gBACtB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;gBACrB,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;aACvB;YACD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAC,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAC,CAAC,CAAC;YACxD,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE;gBACtD,MAAM;aACP;iBAAM;gBACL,IAAI,CAAC,YAAY,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;aAC3C;SACF;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;QAEb,mEAAmE;QACnE,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,IAAI,SAAS,EAAE;YACb,IAAI,CAAC,YAAY,IAAI,SAAS,CAAC;YAC/B,IAAI,CAAC,YAAY,IAAI,SAAS,CAAC;YAC/B,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC;YAC7B,IAAI,CAAC,eAAe,IAAI,SAAS,CAAC;YAClC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC;YAC/C,IAAI,CAAC,YAAY,IAAI,SAAS,CAAC;SAChC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,cAAc,CAAC;YAC7C,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;SAC7B;IACH,CAAC;IAED,eAAe;QACb,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YACrB,OAAO,IAAI,CAAC,YAAY,CAAC;SAC1B;aAAM,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,EAAE;YACjC,OAAO,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;SACxD;aAAM,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE;YAC9C,OAAO,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC;SAC7C;aAAM,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,EAAE;YAChD,OAAO,CACH,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC;gBACtC,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;SAC1D;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,iBAAiB;QACf,2EAA2E;QAC3E,kBAAkB;QAClB,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACnE,CAAC;IAED,kEAAkE;IAClE,OAAO;QACL,MAAM,EAAC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAC,GAAG,IAAI,CAAC;QAE1C,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,IAAI,IAAI,CAAC,WAAW,KAAK,WAAW,EAAE;YACpC,IAAI,CAAC,eAAe,EAAE,CAAC;SACxB;QAED,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE;YAC3C,IAAI,CAAC,iBAAiB,EAAE,CAAC;SAC1B;aAAM,IACH,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK;YAC9C,IAAI,CAAC,eAAe,EAAE;YACxB,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,CAAC,gBAAgB,EAAE,CAAC;SACzB;aAAM;YACL,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,IAAI,CAAC,iBAAiB,EAAE,CAAC;SAC1B;IACH,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,GAAW;QAC1B,OAAO;YACL,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;YAC3C,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC;SACnB,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,GAAW;QACtB,OAAO;YACL,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS;YACrD,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC,SAAS;SACjC,CAAC;IACZ,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,UAAU;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,KAAK,CAAC,UAAU,CAAC,EAAC,SAAS,EAAE,MAAM,EAAC,CAAC,CAAC;IACxC,CAAC;CACF","sourcesContent":["import {Layout1dBase, Layout1dBaseConfig} from './Layout1dBase.js';\nimport {ItemBox, Positions, Size, Margins} from './Layout.js';\n\ntype ItemBounds = {\n  pos: number,\n  size: number\n};\n\ntype Layout1dConstructor = {\n  prototype: Layout1d,\n  new(config?: Layout1dBaseConfig): Layout1d\n}\n\ntype Layout1dSpecifier = Layout1dBaseConfig & {\n  type: Layout1dConstructor\n}\n\ntype Layout1dSpecifierFactory = (config?: Layout1dBaseConfig) => Layout1dSpecifier;\n\nexport const layout1d: Layout1dSpecifierFactory = (config?: Layout1dBaseConfig) => Object.assign({\n  type: Layout1d\n}, config);\n\n\nexport class Layout1d extends Layout1dBase<Layout1dBaseConfig> {\n  /**\n   * Indices of children mapped to their (position and length) in the scrolling\n   * direction. Used to keep track of children that are in range.\n   */\n  _physicalItems: Map<number, ItemBounds> = new Map();\n\n  /**\n   * Used in tandem with _physicalItems to track children in range across\n   * reflows.\n   */\n  _newPhysicalItems: Map<number, ItemBounds> = new Map();\n\n  /**\n   * Width and height of children by their index.\n   */\n  _metrics: Map<number, Size> = new Map();\n\n  /**\n   * anchorIdx is the anchor around which we reflow. It is designed to allow\n   * jumping to any point of the scroll size. We choose it once and stick with\n   * it until stable. _first and _last are deduced around it.\n   */\n  _anchorIdx: number | null = null;\n\n  /**\n   * Position in the scrolling direction of the anchor child.\n   */\n  _anchorPos: number | null = null;\n\n  /**\n   * Whether all children in range were in range during the previous reflow.\n   */\n  _stable = true;\n\n  /**\n   * Whether to remeasure children during the next reflow.\n   */\n  _needsRemeasure = false;\n\n  /**\n   * Number of children to lay out.\n   */\n  private _nMeasured = 0;\n\n  /**\n   * Total length in the scrolling direction of the laid out children.\n   */\n  private _tMeasured = 0;\n\n  private _measureChildren = true;\n\n  _estimate = true;\n\n  // protected _defaultConfig: Layout1dBaseConfig = Object.assign({}, super._defaultConfig, {\n\n  // })\n\n  // constructor(config: Layout1dConfig) {\n  //   super(config);\n  // }\n\n  get measureChildren() {\n    return this._measureChildren;\n  }\n\n  /**\n   * Determine the average size of all children represented in the sizes\n   * argument.\n   */\n  updateItemSizes(sizes: {[key: number]: ItemBox}) {\n    Object.keys(sizes).forEach((key) => {\n      const metrics = sizes[Number(key)], mi = this._getMetrics(Number(key)),\n            prevSize = mi[this._sizeDim];\n\n      // TODO(valdrin) Handle margin collapsing.\n      // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Box_Model/Mastering_margin_collapsing\n      mi.width = metrics.width + ((metrics as Margins).marginLeft || 0) +\n          ((metrics as Margins).marginRight || 0);\n      mi.height = metrics.height + ((metrics as Margins).marginTop || 0) +\n          ((metrics as Margins).marginBottom || 0);\n\n      const size = mi[this._sizeDim];\n      const item = this._getPhysicalItem(Number(key));\n      if (item) {\n        let delta = 0;\n\n        if (size !== undefined) {\n          item.size = size;\n          if (prevSize === -1) {\n            delta = size;\n            this._nMeasured++;\n          } else {\n            delta = size - prevSize;\n          }\n        }\n        this._tMeasured = this._tMeasured + delta;\n      }\n    });\n    if (this._nMeasured) {\n      this._updateItemSize();\n      this._scheduleReflow();\n    }\n  }\n\n  /**\n   * Set the average item size based on the total length and number of children\n   * in range.\n   */\n  _updateItemSize() {\n    // Keep integer values.\n    this._itemSize[this._sizeDim] =\n        Math.round(this._tMeasured / this._nMeasured);\n  }\n\n  _getMetrics(idx: number): ItemBox {\n    let metrics = this._metrics.get(idx);\n    if (metrics === undefined) {\n      metrics = {height: -1, width: -1};\n      this._metrics.set(idx, metrics);\n    }\n    return metrics;\n  }\n\n  _getPhysicalItem(idx: number): ItemBounds | undefined {\n    return this._newPhysicalItems.get(idx) || this._physicalItems.get(idx);\n  }\n\n  _getSize(idx: number): number | undefined {\n    const item = this._getPhysicalItem(idx);\n    return item && item.size;\n  }\n\n  /**\n   * Returns the position in the scrolling direction of the item at idx.\n   * Estimates it if the item at idx is not in the DOM.\n   */\n  _getPosition(idx: number): number {\n    const item = this._getPhysicalItem(idx);\n    return item ? item.pos : (idx * (this._delta)) + this._spacing;\n  }\n\n  _calculateAnchor(lower: number, upper: number): number {\n    if (lower === 0) {\n      return 0;\n    }\n    if (upper > this._scrollSize - this._viewDim1) {\n      return this._totalItems - 1;\n    }\n    return Math.max(\n        0,\n        Math.min(\n            this._totalItems - 1,\n            Math.floor(((lower + upper) / 2) / this._delta)));\n  }\n\n  _getAnchor(lower: number, upper: number): number {\n    if (this._physicalItems.size === 0) {\n      return this._calculateAnchor(lower, upper);\n    }\n    if (this._first < 0) {\n      console.error('_getAnchor: negative _first');\n      return this._calculateAnchor(lower, upper);\n    }\n    if (this._last < 0) {\n      console.error('_getAnchor: negative _last');\n      return this._calculateAnchor(lower, upper);\n    }\n\n    const firstItem = this._getPhysicalItem(this._first),\n          lastItem = this._getPhysicalItem(this._last),\n          firstMin = firstItem!.pos, firstMax = firstMin + firstItem!.size,\n          lastMin = lastItem!.pos, lastMax = lastMin + lastItem!.size;\n\n    if (lastMax < lower) {\n      // Window is entirely past physical items, calculate new anchor\n      return this._calculateAnchor(lower, upper);\n    }\n    if (firstMin > upper) {\n      // Window is entirely before physical items, calculate new anchor\n      return this._calculateAnchor(lower, upper);\n    }\n    if (firstMin >= lower || firstMax >= lower) {\n      // First physical item overlaps window, choose it\n      return this._first;\n    }\n    if (lastMax <= upper || lastMin <= upper) {\n      // Last physical overlaps window, choose it\n      return this._last;\n    }\n    // Window contains a physical item, but not the first or last\n    let maxIdx = this._last, minIdx = this._first;\n\n    while (true) {\n      const candidateIdx = Math.round((maxIdx + minIdx) / 2),\n            candidate = this._physicalItems.get(candidateIdx),\n            cMin = candidate!.pos, cMax = cMin + candidate!.size;\n\n      if ((cMin >= lower && cMin <= upper) ||\n          (cMax >= lower && cMax <= upper)) {\n        return candidateIdx;\n      } else if (cMax < lower) {\n        minIdx = candidateIdx + 1;\n      } else if (cMin > upper) {\n        maxIdx = candidateIdx - 1;\n      }\n    }\n  }\n\n  /**\n   * Updates _first and _last based on items that should be in the current\n   * viewed range.\n   */\n  _getActiveItems() {\n    if (this._viewDim1 === 0 || this._totalItems === 0) {\n      this._clearItems();\n    } else {\n      this._getItems();\n    }\n  }\n\n  /**\n   * Sets the range to empty.\n   */\n  _clearItems() {\n    this._first = -1;\n    this._last = -1;\n    this._physicalMin = 0;\n    this._physicalMax = 0;\n    const items = this._newPhysicalItems;\n    this._newPhysicalItems = this._physicalItems;\n    this._newPhysicalItems.clear();\n    this._physicalItems = items;\n    this._stable = true;\n  }\n\n  /*\n   * Updates _first and _last based on items that should be in the given range.\n   */\n  _getItems() {\n    const items = this._newPhysicalItems;\n    let lower, upper;\n\n    // The anchorIdx is the anchor around which we reflow. It is designed to\n    // allow jumping to any point of the scroll size. We choose it once and\n    // stick with it until stable. first and last are deduced around it.\n\n    if (this._scrollToIndex >= 0) {\n      // If we have a scrollToIndex, we anchor on the given\n      // index and set the scroll position accordingly\n      this._anchorIdx = this._scrollToIndex;\n      this._anchorPos = this._getPosition(this._anchorIdx);\n      this._scrollIfNeeded();\n      lower = Math.max(0, this._scrollPosition - this._overhang);\n      upper = Math.min(this._scrollSize, this._scrollPosition + this._viewDim1 + this._overhang);\n    }\n    else {\n      // Otherwise, we find an appropriate index to anchor on\n      // given the current scroll position\n      upper = Math.min(\n        this._scrollSize,\n        this._scrollPosition + this._viewDim1 + this._overhang\n      );\n      lower = Math.max(0, upper - this._viewDim1 - (2 * this._overhang));\n\n      if (this._anchorIdx === null || this._anchorPos === null) {\n        this._anchorIdx = this._getAnchor(lower, upper);\n        this._anchorPos = this._getPosition(this._anchorIdx);    \n      }\n    }\n\n    let anchorSize = this._getSize(this._anchorIdx);\n    if (anchorSize === undefined) {\n      anchorSize = this._itemDim1;\n    }\n\n    // Anchor might be outside bounds, so prefer correcting the error and keep\n    // that anchorIdx.\n    let anchorErr = 0;\n\n    if (this._anchorPos + anchorSize + this._spacing < lower) {\n      anchorErr = lower - (this._anchorPos + anchorSize + this._spacing);\n    }\n\n    if (this._anchorPos > upper) {\n      anchorErr = upper - this._anchorPos;\n    }\n\n    if (anchorErr) {\n      this._scrollPosition -= anchorErr;\n      lower -= anchorErr;\n      upper -= anchorErr;\n      this._scrollError += anchorErr;\n    }\n\n    // TODO @straversi: If size is always itemDim1, then why keep track of it?\n    items.set(this._anchorIdx, {pos: this._anchorPos, size: anchorSize});\n\n    this._first = (this._last = this._anchorIdx);\n    this._physicalMin = (this._physicalMax = this._anchorPos);\n\n    this._stable = true;\n\n    while (this._physicalMin > lower && this._first > 0) {\n      let size = this._getSize(--this._first);\n      if (size === undefined) {\n        this._stable = false;\n        size = this._itemDim1;\n      }\n      const pos = (this._physicalMin -= size + this._spacing);\n      items.set(this._first, {pos, size});\n      if (this._stable === false && this._estimate === false) {\n        break;\n      }\n    }\n\n    while (this._physicalMax < upper && this._last < this._totalItems) {\n      let size = this._getSize(this._last);\n      if (size === undefined) {\n        this._stable = false;\n        size = this._itemDim1;\n      }\n      items.set(this._last++, {pos: this._physicalMax, size});\n      if (this._stable === false && this._estimate === false) {\n        break;\n      } else {\n        this._physicalMax += size + this._spacing;\n      }\n    }\n\n    this._last--;\n\n    // This handles the cases where we were relying on estimated sizes.\n    const extentErr = this._calculateError();\n    if (extentErr) {\n      this._physicalMin -= extentErr;\n      this._physicalMax -= extentErr;\n      this._anchorPos -= extentErr;\n      this._scrollPosition -= extentErr;\n      items.forEach((item) => item.pos -= extentErr);\n      this._scrollError += extentErr;\n    }\n\n    if (this._stable) {\n      this._newPhysicalItems = this._physicalItems;\n      this._newPhysicalItems.clear();\n      this._physicalItems = items;\n    }\n  }\n\n  _calculateError(): number {\n    if (this._first === 0) {\n      return this._physicalMin;\n    } else if (this._physicalMin <= 0) {\n      return this._physicalMin - (this._first * this._delta);\n    } else if (this._last === this._totalItems - 1) {\n      return this._physicalMax - this._scrollSize;\n    } else if (this._physicalMax >= this._scrollSize) {\n      return (\n          (this._physicalMax - this._scrollSize) +\n          ((this._totalItems - 1 - this._last) * this._delta));\n    }\n    return 0;\n  }\n\n  _updateScrollSize() {\n    // Reuse previously calculated physical max, as it might be higher than the\n    // estimated size.\n    super._updateScrollSize();\n    this._scrollSize = Math.max(this._physicalMax, this._scrollSize);\n  }\n\n  // TODO: Can this be made to inherit from base, with proper hooks?\n  _reflow() {\n    const {_first, _last, _scrollSize} = this;\n\n    this._updateScrollSize();\n    this._getActiveItems();\n\n    if (this._scrollSize !== _scrollSize) {\n      this._emitScrollSize();\n    }\n\n    this._updateVisibleIndices();\n    this._emitRange();\n    if (this._first === -1 && this._last === -1) {\n      this._resetReflowState();\n    } else if (\n        this._first !== _first || this._last !== _last ||\n        this._needsRemeasure) {\n      this._emitChildPositions();\n      this._emitScrollError();\n    } else {\n      this._emitChildPositions();\n      this._emitScrollError();\n      this._resetReflowState();\n    }\n  }\n\n  _resetReflowState() {\n    this._anchorIdx = null;\n    this._anchorPos = null;\n    this._stable = true;\n  }\n\n  /**\n   * Returns the top and left positioning of the item at idx.\n   */\n  _getItemPosition(idx: number): Positions {\n    return {\n      [this._positionDim]: this._getPosition(idx),\n      [this._secondaryPositionDim]: 0,\n    } as Positions;\n  }\n\n  /**\n   * Returns the height and width of the item at idx.\n   */\n  _getItemSize(idx: number): Size {\n    return {\n      [this._sizeDim]: this._getSize(idx) || this._itemDim1,\n      [this._secondarySizeDim]: this._itemDim2,\n    } as Size;\n  }\n\n  _viewDim2Changed() {\n    this._needsRemeasure = true;\n    this._scheduleReflow();\n  }\n\n  _emitRange() {\n    const remeasure = this._needsRemeasure;\n    const stable = this._stable;\n    this._needsRemeasure = false;\n    super._emitRange({remeasure, stable});\n  }\n}\n"]}
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1dBase.d.ts b/lib/uni-virtualizer/lib/layouts/Layout1dBase.d.ts
index 1ec5e4adbfbaa9ea3e158dd0ee59cdecf46b943c..35db11a215e139c4527c726fa219dc3fae044ddc 100644
--- a/lib/uni-virtualizer/lib/layouts/Layout1dBase.d.ts
+++ b/lib/uni-virtualizer/lib/layouts/Layout1dBase.d.ts
@@ -1,5 +1,12 @@
-import { Layout, Positions, ScrollDirection, Size, dimension, position, LayoutConfig } from './Layout.js';
-export declare abstract class Layout1dBase implements Layout {
+import { Layout, Positions, ScrollDirection, Size, dimension, position } from './Layout.js';
+declare type UpdateVisibleIndicesOptions = {
+    emit?: boolean;
+};
+export interface Layout1dBaseConfig {
+    direction?: ScrollDirection;
+    totalItems?: number;
+}
+export declare abstract class Layout1dBase<C extends Layout1dBaseConfig> implements Layout {
     /**
      * The last set viewport scroll position.
      */
@@ -100,11 +107,11 @@ export declare abstract class Layout1dBase implements Layout {
      */
     protected _overhang: number;
     private _eventTarget;
-    protected _spacingChanged: any;
-    protected static _defaultConfig: LayoutConfig;
-    constructor(config: any);
-    set config(config: LayoutConfig);
-    get config(): LayoutConfig;
+    protected _spacingChanged: boolean;
+    protected _defaultConfig: C;
+    constructor(config?: C);
+    set config(config: C);
+    get config(): C;
     /**
      * Maximum index of children + 1, to help estimate total height of the scroll
      * space.
@@ -139,15 +146,15 @@ export declare abstract class Layout1dBase implements Layout {
     /**
      * Perform a reflow if one has been scheduled.
      */
-    reflowIfNeeded(force: any): void;
+    reflowIfNeeded(force: boolean): void;
     /**
      * Scroll to the child at the given index, and the given position within that
      * child.
      */
-    scrollToIndex(index: any, position?: string): void;
-    dispatchEvent(...args: any[]): Promise<void>;
-    addEventListener(...args: any[]): Promise<void>;
-    removeEventListener(...args: any[]): Promise<void>;
+    scrollToIndex(index: number, position?: string): void;
+    dispatchEvent(evt: Event): Promise<void>;
+    addEventListener(type: string, listener: EventListener | EventListenerObject | null, options?: boolean | AddEventListenerOptions | undefined): Promise<void>;
+    removeEventListener(type: string, callback: EventListener | EventListenerObject | null, options?: boolean | EventListenerOptions | undefined): Promise<void>;
     /**
      * Get the top and left positioning of the item at idx.
      */
@@ -156,7 +163,7 @@ export declare abstract class Layout1dBase implements Layout {
      * Update _first and _last based on items that should be in the current
      * range.
      */
-    abstract _getActiveItems(): any;
+    abstract _getActiveItems(): void;
     protected _itemDim2Changed(): void;
     protected _viewDim2Changed(): void;
     protected _updateLayout(): void;
@@ -189,7 +196,7 @@ export declare abstract class Layout1dBase implements Layout {
      */
     protected _updateScrollSize(): void;
     protected _scrollIfNeeded(): void;
-    protected _emitRange(inProps?: any): void;
+    protected _emitRange(inProps?: unknown): void;
     protected _emitScrollSize(): void;
     protected _emitScrollError(): void;
     /**
@@ -206,7 +213,8 @@ export declare abstract class Layout1dBase implements Layout {
      * Find the indices of the first and last items to intersect the viewport.
      * Emit a visibleindiceschange event when either index changes.
      */
-    protected _updateVisibleIndices(options?: any): void;
+    protected _updateVisibleIndices(options?: UpdateVisibleIndicesOptions): void;
     private _scrollPositionChanged;
 }
+export {};
 //# sourceMappingURL=Layout1dBase.d.ts.map
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1dBase.d.ts.map b/lib/uni-virtualizer/lib/layouts/Layout1dBase.d.ts.map
index 29480cad4fb2479f471e00315614dcfacb36b07b..96c99bef00039d9fb14dc10e76bef00b227b912a 100644
--- a/lib/uni-virtualizer/lib/layouts/Layout1dBase.d.ts.map
+++ b/lib/uni-virtualizer/lib/layouts/Layout1dBase.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"Layout1dBase.d.ts","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/layouts/Layout1dBase.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"Layout1dBase.d.ts","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/layouts/Layout1dBase.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1dBase.js b/lib/uni-virtualizer/lib/layouts/Layout1dBase.js
index 94efc6df12444102eb08c9ed14dda66c8a1d7d72..995c860ad93bf52395ebef55532a9f7ae43e73fb 100644
--- a/lib/uni-virtualizer/lib/layouts/Layout1dBase.js
+++ b/lib/uni-virtualizer/lib/layouts/Layout1dBase.js
@@ -28,6 +28,14 @@ export class Layout1dBase {
          * top of the viewport. Value is a proportion of the item size.
          */
         this._scrollToAnchor = 0;
+        /**
+         * The index of the first item intersecting the viewport.
+         */
+        this._firstVisible = 0;
+        /**
+         * The index of the last item intersecting the viewport.
+         */
+        this._lastVisible = 0;
         this._eventTargetPromise = (EventTarget().then((Ctor) => {
             this._eventTarget = new Ctor();
         }));
@@ -96,19 +104,20 @@ export class Layout1dBase {
         // TODO (graynorton): Probably want to make this something we calculate based
         // on viewport size, item size, other factors, possibly still with a dial of some kind
         this._overhang = 1000;
-        if (config) {
-            this.config = config;
-        }
+        this._eventTarget = null;
+        this._spacingChanged = false;
+        this._defaultConfig = {
+            direction: 'vertical'
+        };
+        this.config = config || this._defaultConfig;
     }
     set config(config) {
-        Object.assign(this, Object.assign({}, this.constructor._defaultConfig, config));
+        Object.assign(this, Object.assign({}, this._defaultConfig, config));
     }
     get config() {
-        const config = {};
-        for (let key in this.constructor._defaultConfig) {
-            config[key] = this[key];
-        }
-        return config;
+        return {
+            direction: this.direction
+        };
     }
     /**
      * Maximum index of children + 1, to help estimate total height of the scroll
@@ -241,17 +250,17 @@ export class Layout1dBase {
         }
         this._scheduleReflow();
     }
-    async dispatchEvent(...args) {
+    async dispatchEvent(evt) {
         await this._eventTargetPromise;
-        this._eventTarget.dispatchEvent(...args);
+        this._eventTarget.dispatchEvent(evt);
     }
-    async addEventListener(...args) {
+    async addEventListener(type, listener, options) {
         await this._eventTargetPromise;
-        this._eventTarget.addEventListener(...args);
+        this._eventTarget.addEventListener(type, listener, options);
     }
-    async removeEventListener(...args) {
+    async removeEventListener(type, callback, options) {
         await this._eventTargetPromise;
-        this._eventTarget.removeEventListener(...args);
+        this._eventTarget.removeEventListener(type, callback, options);
     }
     _itemDim2Changed() {
         // Override
@@ -449,4 +458,4 @@ export class Layout1dBase {
         }
     }
 }
-Layout1dBase._defaultConfig = {};
+//# sourceMappingURL=Layout1dBase.js.map
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1dBase.js.map b/lib/uni-virtualizer/lib/layouts/Layout1dBase.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..be6a74593fea802779d275aef73f85858458c307
--- /dev/null
+++ b/lib/uni-virtualizer/lib/layouts/Layout1dBase.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"Layout1dBase.js","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/layouts/Layout1dBase.ts"],"names":[],"mappings":"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","sourcesContent":["import EventTarget from '../polyfillLoaders/EventTarget.js';\nimport {Layout, Positions, ScrollDirection, Size, dimension, position} from './Layout.js';\n\ntype UpdateVisibleIndicesOptions = {\n  emit?: boolean\n}\n\nexport interface Layout1dBaseConfig {\n  direction?: ScrollDirection,\n  totalItems?: number\n}\n\nexport abstract class Layout1dBase<C extends Layout1dBaseConfig> implements Layout {\n  /**\n   * The last set viewport scroll position.\n   */\n  private _latestCoords: Positions = {left: 0, top: 0};\n\n  /**\n   * Scrolling direction.\n   */\n  private _direction: ScrollDirection = 'vertical';\n\n  /**\n   * Dimensions of the viewport.\n   */\n  private _viewportSize: Size = {width: 0, height: 0};\n\n  /**\n   * Flag for debouncing asynchnronous reflow requests.\n   */\n  private _pendingReflow = false;\n\n  private _pendingLayoutUpdate = false;\n\n  /**\n   * Index of the item that has been scrolled to via the public API. When the\n   * container is otherwise scrolled, this value is set back to -1.\n   */\n  protected _scrollToIndex = -1;\n\n  /**\n   * When a child is scrolled to, the offset from the top of the child and the\n   * top of the viewport. Value is a proportion of the item size.\n   */\n  private _scrollToAnchor = 0;\n\n  /**\n   * The index of the first item intersecting the viewport.\n   */\n  private _firstVisible = 0;\n\n  /**\n   * The index of the last item intersecting the viewport.\n   */\n  private _lastVisible = 0;\n\n  private _eventTargetPromise: Promise<void> = (EventTarget().then((Ctor) => {\n    this._eventTarget = new Ctor();\n  }));\n\n  /**\n   * Pixel offset in the scroll direction of the first child.\n   */\n  protected _physicalMin = 0;\n\n  /**\n   * Pixel offset in the scroll direction of the last child.\n   */\n  protected _physicalMax = 0;\n\n  /**\n   * Index of the first child.\n   */\n  protected _first = -1;\n\n  /**\n   * Index of the last child.\n   */\n  protected _last = -1;\n\n  /**\n   * The _estimated_ size of a child.\n   */\n  protected _itemSize: Size = {width: 100, height: 100};\n\n  /**\n   * Space in pixels between children.\n   */\n  protected _spacing = 0;\n\n  /**\n   * Length in the scrolling direction.\n   */\n  protected _sizeDim: dimension = 'height';\n\n  /**\n   * Length in the non-scrolling direction.\n   */\n  protected _secondarySizeDim: dimension = 'width';\n\n  /**\n   * Position in the scrolling direction.\n   */\n  protected _positionDim: position = 'top';\n\n  /**\n   * Position in the non-scrolling direction.\n   */\n  protected _secondaryPositionDim: position = 'left';\n\n  /**\n   * Current scroll offset in pixels.\n   */\n  protected _scrollPosition = 0;\n\n  /**\n   * Difference between current scroll offset and scroll offset calculated due\n   * to a reflow.\n   */\n  protected _scrollError = 0;\n\n  /**\n   * Total number of items that could possibly be displayed. Used to help\n   * calculate the scroll size.\n   */\n  protected _totalItems = 0;\n\n  /**\n   * The total (estimated) length of all items in the scrolling direction.\n   */\n  protected _scrollSize = 1;\n\n  /**\n   * Number of pixels beyond the visible size of the container to still include\n   * in the active range of items.\n   */\n  // TODO (graynorton): Probably want to make this something we calculate based\n  // on viewport size, item size, other factors, possibly still with a dial of some kind\n  protected _overhang = 1000;\n\n  private _eventTarget: EventTarget | null = null;\n  protected _spacingChanged = false;\n\n  protected _defaultConfig: C = {\n    direction: 'vertical'\n  } as C\n\n  constructor(config?: C) {\n    this.config = config || this._defaultConfig;\n  }\n\n  set config(config: C) {\n    Object.assign(this, Object.assign({}, this._defaultConfig, config));\n  }\n\n  get config(): C {\n    return {\n      direction: this.direction\n    } as C;\n  }\n\n  /**\n   * Maximum index of children + 1, to help estimate total height of the scroll\n   * space.\n   */\n  get totalItems(): number {\n    return this._totalItems;\n  }\n  set totalItems(num) {\n    const _num = Number(num);\n    if (_num !== this._totalItems) {\n      this._totalItems = _num;\n      this._scheduleReflow();\n    }\n  }\n\n  /**\n   * Primary scrolling direction.\n   */\n  get direction(): ScrollDirection {\n    return this._direction;\n  }\n  set direction(dir) {\n    // Force it to be either horizontal or vertical.\n    dir = (dir === 'horizontal') ? dir : 'vertical';\n    if (dir !== this._direction) {\n      this._direction = dir;\n      this._sizeDim = (dir === 'horizontal') ? 'width' : 'height';\n      this._secondarySizeDim = (dir === 'horizontal') ? 'height' : 'width';\n      this._positionDim = (dir === 'horizontal') ? 'left' : 'top';\n      this._secondaryPositionDim = (dir === 'horizontal') ? 'top' : 'left';\n      this._scheduleLayoutUpdate();\n    }\n  }\n\n  /**\n   * Estimate of the dimensions of a single child.\n   */\n  get itemSize(): Size {\n    return this._itemSize;\n  }\n  set itemSize(dims) {\n    const {_itemDim1, _itemDim2} = this;\n    Object.assign(this._itemSize, dims);\n    if (_itemDim1 !== this._itemDim1 || _itemDim2 !== this._itemDim2) {\n      if (_itemDim2 !== this._itemDim2) {\n        this._itemDim2Changed();\n      } else {\n        this._scheduleLayoutUpdate();\n      }\n    }\n  }\n\n  /**\n   * Amount of space in between items.\n   */\n  get spacing(): number {\n    return this._spacing;\n  }\n  set spacing(px) {\n    const _px = Number(px);\n    if (_px !== this._spacing) {\n      this._spacing = _px;\n      this._scheduleLayoutUpdate();\n    }\n  }\n\n  /**\n   * Height and width of the viewport.\n   */\n  get viewportSize(): Size {\n    return this._viewportSize;\n  }\n  set viewportSize(dims) {\n    const {_viewDim1, _viewDim2} = this;\n    Object.assign(this._viewportSize, dims);\n    if (_viewDim2 !== this._viewDim2) {\n      this._viewDim2Changed();\n    } else if (_viewDim1 !== this._viewDim1) {\n      this._checkThresholds();\n    }\n  }\n\n  /**\n   * Scroll offset of the viewport.\n   */\n  get viewportScroll(): Positions {\n    return this._latestCoords;\n  }\n  set viewportScroll(coords) {\n    Object.assign(this._latestCoords, coords);\n    const oldPos = this._scrollPosition;\n    this._scrollPosition = this._latestCoords[this._positionDim];\n    if (oldPos !== this._scrollPosition) {\n      this._scrollPositionChanged(oldPos, this._scrollPosition);\n      this._updateVisibleIndices({emit: true});\n    }\n    this._checkThresholds();\n  }\n\n  /**\n   * Perform a reflow if one has been scheduled.\n   */\n  reflowIfNeeded(force: boolean) {\n    if (force || this._pendingReflow) {\n      this._pendingReflow = false;\n      this._reflow();\n    }\n  }\n\n  /**\n   * Scroll to the child at the given index, and the given position within that\n   * child.\n   */\n  scrollToIndex(index: number, position = 'start') {\n    if (!Number.isFinite(index))\n      return;\n    index = Math.min(this.totalItems, Math.max(0, index));\n    this._scrollToIndex = index;\n    if (position === 'nearest') {\n      position = index > this._first + this._num / 2 ? 'end' : 'start';\n    }\n    switch (position) {\n      case 'start':\n        this._scrollToAnchor = 0;\n        break;\n      case 'center':\n        this._scrollToAnchor = 0.5;\n        break;\n      case 'end':\n        this._scrollToAnchor = 1;\n        break;\n      default:\n        throw new TypeError(\n            'position must be one of: start, center, end, nearest');\n    }\n    this._scheduleReflow();\n  }\n\n  async dispatchEvent(evt: Event) {\n    await this._eventTargetPromise;\n    this._eventTarget!.dispatchEvent(evt);\n  }\n\n  async addEventListener(type: string, listener: EventListener | EventListenerObject | null, options?: boolean | AddEventListenerOptions | undefined) {\n    await this._eventTargetPromise;\n    this._eventTarget!.addEventListener(type, listener, options);\n  }\n\n  async removeEventListener(type: string, callback: EventListener | EventListenerObject | null, options?: boolean | EventListenerOptions | undefined) {\n    await this._eventTargetPromise;\n    this._eventTarget!.removeEventListener(type, callback, options);\n  }\n\n  /**\n   * Get the top and left positioning of the item at idx.\n   */\n  abstract _getItemPosition(idx: number): Positions;\n\n  /**\n   * Update _first and _last based on items that should be in the current\n   * range.\n   */\n  abstract _getActiveItems(): void;\n\n  protected _itemDim2Changed() {\n    // Override\n  }\n\n  protected _viewDim2Changed() {\n    // Override\n  }\n\n  protected _updateLayout() {\n    // Override\n  }\n\n  protected _getItemSize(_idx: number): Size {\n    return {\n      [this._sizeDim]: this._itemDim1,\n      [this._secondarySizeDim]: this._itemDim2,\n    } as unknown as Size;\n  }\n\n  /**\n   * The size of an item in the scrolling direction + space between items.\n   */\n  protected get _delta(): number {\n    return this._itemDim1 + this._spacing;\n  }\n\n  /**\n   * The height or width of an item, whichever corresponds to the scrolling direction.\n   */\n  protected get _itemDim1(): number {\n    return this._itemSize[this._sizeDim];\n  }\n\n  /**\n   * The height or width of an item, whichever does NOT correspond to the scrolling direction.\n   */\n  protected get _itemDim2(): number {\n    return this._itemSize[this._secondarySizeDim];\n  }\n\n  /**\n   * The height or width of the viewport, whichever corresponds to the scrolling direction.\n   */\n  protected get _viewDim1(): number {\n    return this._viewportSize[this._sizeDim];\n  }\n\n  /**\n   * The height or width of the viewport, whichever does NOT correspond to the scrolling direction.\n   */\n  protected get _viewDim2(): number {\n    return this._viewportSize[this._secondarySizeDim];\n  }\n\n  protected _scheduleReflow() {\n    this._pendingReflow = true;\n  }\n\n  protected _scheduleLayoutUpdate() {\n    this._pendingLayoutUpdate = true;\n    this._scheduleReflow();\n  }\n\n  protected _reflow() {\n    const {_first, _last, _scrollSize} = this;\n\n    if (this._pendingLayoutUpdate) {\n      this._updateLayout();\n      this._pendingLayoutUpdate = false;\n    }\n    this._updateScrollSize();\n    this._getActiveItems();\n    this._scrollIfNeeded();\n    this._updateVisibleIndices();\n\n    if (this._scrollSize !== _scrollSize) {\n      this._emitScrollSize();\n    }\n\n    if (this._first === -1 && this._last === -1) {\n      // TODO: have default empty object for emitRange instead\n      this._emitRange();\n    } else if (\n        this._first !== _first || this._last !== _last ||\n        this._spacingChanged) {\n      // TODO: have default empty object for emitRange instead\n      this._emitRange();\n      this._emitChildPositions();\n    }\n    this._emitScrollError();\n  }\n\n  /**\n   * Estimates the total length of all items in the scrolling direction, including spacing.\n   */\n  protected _updateScrollSize() {\n    // Ensure we have at least 1px - this allows getting at least 1 item to be\n    // rendered.\n    this._scrollSize = Math.max(1, this._totalItems * this._delta);\n  }\n\n  protected _scrollIfNeeded() {\n    if (this._scrollToIndex === -1) {\n      return;\n    }\n    const index = this._scrollToIndex;\n    const anchor = this._scrollToAnchor;\n    const pos = this._getItemPosition(index)[this._positionDim];\n    const size = this._getItemSize(index)[this._sizeDim];\n\n    const curAnchorPos = this._scrollPosition + this._viewDim1 * anchor;\n    const newAnchorPos = pos + size * anchor;\n    // Ensure scroll position is an integer within scroll bounds.\n    const scrollPosition = Math.floor(Math.min(\n        this._scrollSize - this._viewDim1,\n        Math.max(0, this._scrollPosition - curAnchorPos + newAnchorPos)));\n    this._scrollError += this._scrollPosition - scrollPosition;\n    this._scrollPosition = scrollPosition;\n  }\n\n  protected _emitRange(inProps: unknown = undefined) {\n    const detail = Object.assign(\n        {\n          first: this._first,\n          last: this._last,\n          num: this._num,\n          stable: true,\n          firstVisible: this._firstVisible,\n          lastVisible: this._lastVisible,\n        },\n        inProps);\n    this.dispatchEvent(new CustomEvent('rangechange', {detail}));\n  }\n\n  protected _emitScrollSize() {\n    const detail = {\n      [this._sizeDim]: this._scrollSize,\n    };\n    this.dispatchEvent(new CustomEvent('scrollsizechange', {detail}));\n  }\n\n  protected _emitScrollError() {\n    if (this._scrollError) {\n      const detail = {\n        [this._positionDim]: this._scrollError,\n        [this._secondaryPositionDim]: 0,\n      };\n      this.dispatchEvent(new CustomEvent('scrollerrorchange', {detail}));\n      this._scrollError = 0;\n    }\n  }\n\n  /**\n   * Get or estimate the top and left positions of items in the current range.\n   * Emit an itempositionchange event with these positions.\n   */\n  protected _emitChildPositions() {\n    const detail: {[key: number]: Positions} = {};\n    for (let idx = this._first; idx <= this._last; idx++) {\n      detail[idx] = this._getItemPosition(idx);\n    }\n    this.dispatchEvent(new CustomEvent('itempositionchange', {detail}));\n  }\n\n  /**\n   * Number of items to display.\n   */\n  private get _num(): number {\n    if (this._first === -1 || this._last === -1) {\n      return 0;\n    }\n    return this._last - this._first + 1;\n  }\n\n  private _checkThresholds() {\n    if (this._viewDim1 === 0 && this._num > 0) {\n      this._scheduleReflow();\n    } else {\n      const min = Math.max(0, this._scrollPosition - this._overhang);\n      const max = Math.min(\n          this._scrollSize,\n          this._scrollPosition + this._viewDim1 + this._overhang);\n      if (this._physicalMin > min || this._physicalMax < max) {\n        this._scheduleReflow();\n      }\n    }\n  }\n\n  /**\n   * Find the indices of the first and last items to intersect the viewport.\n   * Emit a visibleindiceschange event when either index changes.\n   */\n   protected _updateVisibleIndices(options?: UpdateVisibleIndicesOptions) {\n    if (this._first === -1 || this._last === -1) return;\n\n    let firstVisible = this._first;\n    while (\n      Math.round(\n        this._getItemPosition(firstVisible)[this._positionDim] +\n        this._getItemSize(firstVisible)[this._sizeDim]\n      )\n      <=\n      Math.round (this._scrollPosition)\n     ) {\n      firstVisible++;\n    }\n\n    let lastVisible = this._last;\n    while (\n      Math.round(this._getItemPosition(lastVisible)[this._positionDim])\n      >=\n      Math.round(this._scrollPosition + this._viewDim1)\n    ) {\n      lastVisible--;\n    }\n\n    if (firstVisible !== this._firstVisible || lastVisible !== this._lastVisible) {\n      this._firstVisible = firstVisible;\n      this._lastVisible = lastVisible;\n      if (options && options.emit) {\n        this._emitRange();\n      }\n    }\n  }\n\n  private _scrollPositionChanged(oldPos: number, newPos: number) {\n    // When both values are bigger than the max scroll position, keep the\n    // current _scrollToIndex, otherwise invalidate it.\n    const maxPos = this._scrollSize - this._viewDim1;\n    if (oldPos < maxPos || newPos < maxPos) {\n      this._scrollToIndex = -1;\n    }\n  }\n}\n"]}
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1dFlex.d.ts b/lib/uni-virtualizer/lib/layouts/Layout1dFlex.d.ts
index b4f6e54f539aef2a2ecd0399237e3d59a57a8a1f..e6aadd4b26ce97a862ca1051c6ecb08467347162 100644
--- a/lib/uni-virtualizer/lib/layouts/Layout1dFlex.d.ts
+++ b/lib/uni-virtualizer/lib/layouts/Layout1dFlex.d.ts
@@ -1,11 +1,14 @@
-import { Layout1dBase } from './Layout1dBase';
-import { ItemBox, Positions, Size, LayoutConfig, Type } from './Layout';
-export interface Layout1dFlexConfig extends LayoutConfig {
-    type?: Type<Layout1dFlex>;
-    direction?: "horizontal" | "vertical";
+import { Layout1dBase, Layout1dBaseConfig } from './Layout1dBase';
+import { ItemBox, Positions, Size } from './Layout';
+interface Layout1dFlexConfig extends Layout1dBaseConfig {
     spacing?: number;
     idealSize?: number;
 }
+declare type Layout1dFlexSpecifier = Layout1dFlexConfig & {
+    type: new (config?: Layout1dFlexConfig) => Layout1dFlex;
+};
+declare type Layout1dFlexSpecifierFactory = (config?: Layout1dFlexConfig) => Layout1dFlexSpecifier;
+export declare const layout1dFlex: Layout1dFlexSpecifierFactory;
 interface Rolumn {
     _startIdx: number;
     _endIdx: number;
@@ -21,35 +24,33 @@ interface Chunk {
 /**
  * TODO @straversi: document and test this Layout.
  */
-export declare class Layout1dFlex extends Layout1dBase {
+export declare class Layout1dFlex extends Layout1dBase<Layout1dFlexConfig> {
     private _itemSizes;
     private _chunkSize;
     private _chunks;
     private _aspectRatios;
     private _numberOfAspectRatiosMeasured;
-    protected _idealSize: number;
+    protected _idealSize: number | null;
     protected _config: Layout1dFlexConfig;
-    protected static _defaultConfig: Layout1dFlexConfig;
+    protected _defaultConfig: Layout1dFlexConfig;
     listenForChildLoadEvents: boolean;
-    measureChildren: ((e: Element, i: object) => object);
-    set idealSize(px: number);
-    get idealSize(): number;
+    /**
+     * TODO graynorton@ Don't hard-code Flickr - probably need a config option
+     */
+    measureChildren: ((e: Element, i: unknown) => (ItemBox));
+    set idealSize(px: number | null);
+    get idealSize(): number | null;
     updateItemSizes(sizes: {
         [key: number]: ItemBox;
     }): void;
     _newChunk(): {
-        _rolumns: any[];
-        _itemPositions: any[];
+        _rolumns: never[];
+        _itemPositions: never[];
         _size: number;
         _dirty: boolean;
     };
-    _getChunk(idx: number | string): {
-        _rolumns: any[];
-        _itemPositions: any[];
-        _size: number;
-        _dirty: boolean;
-    };
-    _recordAspectRatio(dims: any): void;
+    _getChunk(idx: number | string): Chunk;
+    _recordAspectRatio(dims: ItemBox): void;
     _getRandomAspectRatio(): Size;
     _viewDim2Changed(): void;
     _getActiveItems(): void;
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1dFlex.d.ts.map b/lib/uni-virtualizer/lib/layouts/Layout1dFlex.d.ts.map
index a899016165645dce6a8326b41733b024ed5d4e3d..de4bacef32254ea5dd92cfff32da4d1c83d31950 100644
--- a/lib/uni-virtualizer/lib/layouts/Layout1dFlex.d.ts.map
+++ b/lib/uni-virtualizer/lib/layouts/Layout1dFlex.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"Layout1dFlex.d.ts","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/layouts/Layout1dFlex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAC,MAAM,UAAU,CAAC;AAEtE,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,IAAI,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1B,SAAS,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,UAAU,MAAM;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,UAAU,KAAK;IACb,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAA;CAChB;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,UAAU,CAAmB;IAIrC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,6BAA6B,CAAa;IAClD,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,OAAO,EAAE,kBAAkB,CAAM;IAC3C,SAAS,CAAC,MAAM,CAAC,cAAc,EAAE,kBAAkB,CAIlD;IAED,wBAAwB,UAAQ;IAEhC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,CAKnD;IAED,IAAI,SAAS,CAAC,EAAE,QAAA,EAMf;IAED,IAAI,SAAS,WAEZ;IAED,eAAe,CAAC,KAAK,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAC;IAoB/C,SAAS;;;;;;IAST,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;;;;;;IAI9B,kBAAkB,CAAC,IAAI,KAAA;IAavB,qBAAqB,IAAI,IAAI;IAa7B,gBAAgB;IAIhB,eAAe;IA2Bf,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IAKxC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAM/B,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAStC,YAAY,CAAC,QAAQ,EAAE,MAAM;IA+D7B,aAAa,IAAI,IAAI;IAYrB,iBAAiB;CAOlB"}
\ No newline at end of file
+{"version":3,"file":"Layout1dFlex.d.ts","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/layouts/Layout1dFlex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAE,kBAAkB,EAAC,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAC,MAAM,UAAU,CAAC;AAElD,UAAU,kBAAmB,SAAQ,kBAAkB;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,aAAK,qBAAqB,GAAG,kBAAkB,GAAG;IAChD,IAAI,EAAE,KAAI,MAAM,CAAC,EAAE,kBAAkB,KAAK,YAAY,CAAA;CACvD,CAAA;AAED,aAAK,4BAA4B,GAAG,CAAC,MAAM,CAAC,EAAE,kBAAkB,KAAK,qBAAqB,CAAC;AAE3F,eAAO,MAAM,YAAY,EAAE,4BAEjB,CAAC;AAEX,UAAU,MAAM;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,UAAU,KAAK;IACb,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAA;CAChB;AAeD;;GAEG;AACH,qBAAa,YAAa,SAAQ,YAAY,CAAC,kBAAkB,CAAC;IAChE,OAAO,CAAC,UAAU,CAAmB;IAIrC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,6BAA6B,CAAa;IAClD,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC3C,SAAS,CAAC,OAAO,EAAE,kBAAkB,CAAM;IAC3C,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAGzC;IAEH,wBAAwB,UAAQ;IAElC;;OAEG;IACD,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAUvD;IAED,IAAI,SAAS,CAAC,EAAE,eAAA,EAMf;IAED,IAAI,SAAS,kBAEZ;IAED,eAAe,CAAC,KAAK,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAC;IAqB/C,SAAS;;;;;;IAST,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI9B,kBAAkB,CAAC,IAAI,EAAE,OAAO;IAahC,qBAAqB,IAAI,IAAI;IAa7B,gBAAgB;IAIhB,eAAe;IA2Bf,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IAKxC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAM/B,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAStC,YAAY,CAAC,QAAQ,EAAE,MAAM;IA+D7B,aAAa,IAAI,IAAI;IAYrB,iBAAiB;CAOlB"}
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1dFlex.js b/lib/uni-virtualizer/lib/layouts/Layout1dFlex.js
index 567ee9bc28f6b65eff52d1d853d150f6ca99fb12..00b54b50b3e4977d706846e4f139a6e91f15c615 100644
--- a/lib/uni-virtualizer/lib/layouts/Layout1dFlex.js
+++ b/lib/uni-virtualizer/lib/layouts/Layout1dFlex.js
@@ -1,4 +1,7 @@
 import { Layout1dBase } from './Layout1dBase';
+export const layout1dFlex = (config) => Object.assign({
+    type: Layout1dFlex
+}, config);
 /**
  * TODO @straversi: document and test this Layout.
  */
@@ -6,16 +9,33 @@ export class Layout1dFlex extends Layout1dBase {
     constructor() {
         super(...arguments);
         this._itemSizes = [];
+        // private _itemPositions: Array<Positions> = [];
+        // private _rolumnStartIdx: Array<number> = [];
+        // private _rolumnStartPos: Array<number> = [];
+        this._chunkSize = null;
         this._chunks = [];
         this._aspectRatios = {};
         this._numberOfAspectRatiosMeasured = 0;
+        this._idealSize = null;
         this._config = {};
+        this._defaultConfig = Object.assign({}, super._defaultConfig, {
+            spacing: 0,
+            idealSize: 200
+        });
         this.listenForChildLoadEvents = true;
+        /**
+         * TODO graynorton@ Don't hard-code Flickr - probably need a config option
+         */
         this.measureChildren = function (e, i) {
-            return {
-                width: i['o_width'] || e.naturalWidth || undefined,
-                height: i['o_height'] || e.naturalHeight || undefined
-            };
+            const { naturalWidth, naturalHeight } = e;
+            if (naturalWidth !== undefined && naturalHeight != undefined) {
+                return { width: naturalWidth, height: naturalHeight };
+            }
+            const { o_width, o_height } = i;
+            if (o_width !== undefined && o_height !== undefined) {
+                return { width: o_width, height: o_height };
+            }
+            return { width: -1, height: -1 };
         };
     }
     set idealSize(px) {
@@ -31,15 +51,16 @@ export class Layout1dFlex extends Layout1dBase {
     updateItemSizes(sizes) {
         let dirty;
         Object.keys(sizes).forEach((key) => {
-            const chunk = this._getChunk(key);
-            const dims = sizes[key];
-            const prevDims = this._itemSizes[key];
+            const n = Number(key);
+            const chunk = this._getChunk(n);
+            const dims = sizes[n];
+            const prevDims = this._itemSizes[n];
             if (dims.width && dims.height) {
                 if (!prevDims || prevDims.width !== dims.width || prevDims.height !== dims.height) {
                     chunk._dirty = true;
                     dirty = true;
-                    this._itemSizes[Number(key)] = sizes[key];
-                    this._recordAspectRatio(sizes[key]);
+                    this._itemSizes[n] = sizes[n];
+                    this._recordAspectRatio(sizes[n]);
                 }
             }
         });
@@ -121,7 +142,7 @@ export class Layout1dFlex extends Layout1dBase {
     }
     _getNaturalItemDims(idx) {
         let itemDims = this._itemSizes[idx];
-        if (itemDims === undefined || itemDims.width === undefined || itemDims.height === undefined) {
+        if (itemDims === undefined || itemDims.width === -1 || itemDims.height === -1) {
             itemDims = this._getRandomAspectRatio();
         }
         return itemDims;
@@ -208,8 +229,4 @@ export class Layout1dFlex extends Layout1dBase {
         // (this._spacing * 2);
     }
 }
-Layout1dFlex._defaultConfig = {
-    direction: 'vertical',
-    spacing: 0,
-    idealSize: 200
-};
+//# sourceMappingURL=Layout1dFlex.js.map
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1dFlex.js.map b/lib/uni-virtualizer/lib/layouts/Layout1dFlex.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..1d93aa6da4cc4a62ce585a3d6261549773c8d855
--- /dev/null
+++ b/lib/uni-virtualizer/lib/layouts/Layout1dFlex.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"Layout1dFlex.js","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/layouts/Layout1dFlex.ts"],"names":[],"mappings":"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","sourcesContent":["import {Layout1dBase, Layout1dBaseConfig} from './Layout1dBase';\nimport {ItemBox, Positions, Size} from './Layout';\n\ninterface Layout1dFlexConfig extends Layout1dBaseConfig {\n  spacing?: number,\n  idealSize?: number\n}\n\ntype Layout1dFlexSpecifier = Layout1dFlexConfig & {\n  type: new(config?: Layout1dFlexConfig) => Layout1dFlex\n}\n\ntype Layout1dFlexSpecifierFactory = (config?: Layout1dFlexConfig) => Layout1dFlexSpecifier;\n\nexport const layout1dFlex: Layout1dFlexSpecifierFactory = (config?: Layout1dFlexConfig) => Object.assign({\n  type: Layout1dFlex\n}, config);\n\ninterface Rolumn {\n  _startIdx: number,\n  _endIdx: number,\n  _startPos: number,\n  _size: number\n}\n\ninterface Chunk {\n  _itemPositions: Array<Positions>,\n  _rolumns: Array<Rolumn>,\n  _size: number,\n  _dirty: boolean\n}\n\ninterface AspectRatios {\n  // conceptually,  key is a number, but strictly speaking it's a string\n  [key: string]: number\n}\n\n/**\n * TODO graynorton@ Don't hard-code Flickr - probably need a config option\n */\n interface FlickrImageData {\n  o_width: number,\n  o_height: number\n}\n\n/**\n * TODO @straversi: document and test this Layout.\n */\nexport class Layout1dFlex extends Layout1dBase<Layout1dFlexConfig> {\n  private _itemSizes: Array<Size> = [];\n  // private _itemPositions: Array<Positions> = [];\n  // private _rolumnStartIdx: Array<number> = [];\n  // private _rolumnStartPos: Array<number> = [];\n  private _chunkSize: number | null = null;\n  private _chunks: Array<Chunk> = [];\n  private _aspectRatios: AspectRatios = {};\n  private _numberOfAspectRatiosMeasured: number = 0;\n  protected _idealSize: number | null = null;\n  protected _config: Layout1dFlexConfig = {};\n  protected _defaultConfig: Layout1dFlexConfig = Object.assign({}, super._defaultConfig, {\n    spacing: 0,\n    idealSize: 200\n  });\n\n  listenForChildLoadEvents = true;\n\n/**\n * TODO graynorton@ Don't hard-code Flickr - probably need a config option\n */\n  measureChildren: ((e: Element, i: unknown) => (ItemBox)) = function (e, i) {\n    const { naturalWidth, naturalHeight } = e as HTMLImageElement;\n    if (naturalWidth !== undefined && naturalHeight != undefined) {\n      return { width: naturalWidth, height: naturalHeight };\n    }\n    const { o_width, o_height } = i as FlickrImageData;\n    if (o_width !== undefined && o_height !== undefined) {\n      return { width: o_width, height: o_height };\n    }\n    return { width: -1, height: -1 };\n  }\n\n  set idealSize(px) {\n    const _px = Number(px);\n    if (_px !== this._idealSize) {\n      this._idealSize = _px;\n      this._scheduleLayoutUpdate();\n    }\n  }\n\n  get idealSize() {\n    return this._idealSize;\n  }\n\n  updateItemSizes(sizes: {[key: number]: ItemBox}) {\n    let dirty;\n    Object.keys(sizes).forEach((key) => {\n        const n = Number(key);\n        const chunk = this._getChunk(n);\n        const dims = sizes[n];\n        const prevDims = this._itemSizes[n];\n        if (dims.width && dims.height) {\n          if (!prevDims || prevDims.width !== dims.width || prevDims.height !== dims.height) {\n            chunk._dirty = true;\n            dirty = true;\n            this._itemSizes[n] = sizes[n];\n            this._recordAspectRatio(sizes[n]);\n          }\n        }\n    });\n    if (dirty) {\n      this._scheduleLayoutUpdate();\n    }\n  }\n\n  _newChunk() {\n    return {\n      ['_rolumns']: [],\n      _itemPositions: [],\n      _size: 0,\n      _dirty: false  \n    }\n  }\n\n  _getChunk(idx: number | string) {\n    return this._chunks[Math.floor(Number(idx) / this._chunkSize!)] || this._newChunk();\n  }\n\n  _recordAspectRatio(dims: ItemBox) {\n    if (dims.width && dims.height) {\n      const bucket = Math.round(dims.width / dims.height * 10) / 10;\n      if (this._aspectRatios[bucket]) {\n        this._aspectRatios[bucket]++;\n      }\n      else {\n        this._aspectRatios[bucket] = 1;\n      }\n      this._numberOfAspectRatiosMeasured++;  \n    }\n  }\n\n  _getRandomAspectRatio(): Size {\n    if (this._numberOfAspectRatiosMeasured === 0) {\n      return {width: 1, height: 1};\n    }\n    const n = Math.random() * this._numberOfAspectRatiosMeasured;\n    const buckets = Object.keys(this._aspectRatios);\n    let i = -1, m = 0;\n    while (m < n && i < buckets.length) {\n      m += this._aspectRatios[buckets[++i]];\n    }\n    return {width: Number(buckets[i]), height: 1};\n}\n\n  _viewDim2Changed() {\n    this._scheduleLayoutUpdate();\n  }\n\n  _getActiveItems() {\n    const chunk = this._getChunk(0);\n    if (chunk._rolumns.length === 0) return;\n    const scrollPos = Math.max(0, Math.min(this._scrollPosition, this._scrollSize - this._viewDim1));\n    const min = Math.max(0, scrollPos - this._overhang);\n    const max = Math.min(\n        this._scrollSize,\n        scrollPos + this._viewDim1 + this._overhang);\n    const mid = (min + max) / 2;\n    const estMidRolumn = Math.round((mid / this._scrollSize) * chunk._rolumns.length);\n    let idx = estMidRolumn;\n    while (chunk._rolumns[idx]._startPos < min) {\n        idx++;\n    }\n    while (chunk._rolumns[idx]._startPos > min) {\n        idx--;\n    }\n    this._first = chunk._rolumns[idx]._startIdx;\n    this._physicalMin = chunk._rolumns[idx]._startPos;\n    let rolumnMax;\n    while ((rolumnMax = chunk._rolumns[idx]._startPos + chunk._rolumns[idx]._size + (this._spacing * 2)) < max) {\n        idx++;\n    }\n    this._last = chunk._rolumns[idx]._endIdx;\n    this._physicalMax = rolumnMax;\n  }\n\n  _getItemPosition(idx: number): Positions {\n      const chunk = this._getChunk(0);\n      return chunk._itemPositions[idx];\n  }\n\n  _getItemSize(idx: number): Size {\n    const chunk = this._getChunk(0);\n    const {width, height} = chunk._itemPositions[idx];\n    return {width, height} as Size;\n  }\n\n  _getNaturalItemDims(idx: number): Size {\n    let itemDims = this._itemSizes[idx];\n    if (itemDims === undefined || itemDims.width === -1 || itemDims.height === -1) {\n      itemDims = this._getRandomAspectRatio();\n    }\n    return itemDims;\n  }\n\n\n  _layOutChunk(startIdx: number) {\n    const chunk: Chunk = this._newChunk();\n    let startPos = this._spacing;\n    let idx = 0;\n    let rolumnSize2 = 0;\n    let lastRatio = Infinity;\n    const finishRolumn = (lastIdx: number) => {\n        const rolumn = {\n          _startIdx: startIdx,\n          _endIdx: lastIdx,\n          _startPos: startPos - this._spacing,\n          _size: 0\n        }\n        chunk._rolumns.push(rolumn);\n        let itemStartPos = this._spacing;\n        for (let i = startIdx; i <= lastIdx; i++) {\n            const pos = chunk._itemPositions[i];\n            pos.width = pos.width! * lastRatio;\n            pos.height = pos.height! * lastRatio;\n            pos.left = this._positionDim === 'left' ? startPos : itemStartPos;\n            pos.top = this._positionDim === 'top' ? startPos : itemStartPos;\n            itemStartPos += pos[this._secondarySizeDim]! + this._spacing;\n        }\n        rolumn._size = chunk._itemPositions[lastIdx][this._sizeDim]!;\n    }\n    while (idx < this._chunkSize!) {\n      const itemDims = this._getNaturalItemDims(idx);\n      const availableSpace = this._viewDim2 - (this._spacing * (idx - startIdx + 2));\n      const itemSize = itemDims[this._sizeDim];\n      const itemSize2 = itemDims[this._secondarySizeDim];\n      const idealScaleFactor = this._idealSize! / itemSize;\n      const adjItemSize = idealScaleFactor * itemSize;\n      const adjItemSize2 = idealScaleFactor * itemSize2;\n      chunk._itemPositions[idx] = {\n          left: 0,\n          top: 0,\n          width: (this._sizeDim === 'width' ? adjItemSize : adjItemSize2),\n          height: (this._sizeDim === 'height' ? adjItemSize : adjItemSize2)\n      };\n      const ratio = availableSpace / (rolumnSize2 + adjItemSize2);\n      if (Math.abs(1 - ratio) > Math.abs(1 - lastRatio)) {\n          // rolumn is better without adding this item\n          finishRolumn(idx - 1);\n          startIdx = idx;\n          startPos += (this._idealSize! * lastRatio) + this._spacing;\n          lastRatio = (this._viewDim2 - (2 * this._spacing)) / adjItemSize2;\n          rolumnSize2 = adjItemSize2;\n      }\n      else {\n          // add this item and continue\n          rolumnSize2 += adjItemSize2;\n          lastRatio = ratio;\n      }\n      if (idx === this._chunkSize! - 1) {\n          finishRolumn(idx);\n      }\n      idx++;\n    }\n    const lastRolumn = chunk._rolumns[chunk._rolumns.length - 1];\n    chunk._size = lastRolumn._startPos + lastRolumn._size;\n    return chunk;  \n  }\n\n  _updateLayout(): void {\n    if (/*this._rolumnStartIdx === undefined ||*/ this._viewDim2 === 0) return;\n    this._chunkSize = Math.ceil(2 * (this._viewDim1 * this._viewDim2) / (this._idealSize! * this._idealSize!));\n    console.log('chunkSize', this._chunkSize);\n    // TODO: An odd place to do this, need to think through the logistics of getting size info to the layout\n    // in all cases\n    // this._itemSizes.length = 100;//this._totalItems;\n    this._chunks[0] = this._layOutChunk(0);\n    // TODO (graynorton): This is a hack to force reflow\n    this._spacingChanged = true;\n}\n\n  _updateScrollSize() {\n    const chunk = this._chunks[0];\n    this._scrollSize = !chunk || chunk._rolumns.length === 0 ? 1 : chunk._size + (2 * this._spacing);\n        // chunk._rolumns[chunk._rolumns.length - 1]._startPos +\n        // chunk._itemPositions[chunk._rolumns.length - 1][this._sizeDim] +\n        // (this._spacing * 2);\n  }\n}"]}
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1dGrid.d.ts b/lib/uni-virtualizer/lib/layouts/Layout1dGrid.d.ts
index c8f7a5c894287d49c6855481a653259422131db1..39633e64c311e105edf9bd9c8ed63e8ab73d26f5 100644
--- a/lib/uni-virtualizer/lib/layouts/Layout1dGrid.d.ts
+++ b/lib/uni-virtualizer/lib/layouts/Layout1dGrid.d.ts
@@ -2,9 +2,8 @@ import { Layout1dBase } from './Layout1dBase.js';
 /**
  * TODO @straversi: document and test this Layout.
  */
-export declare abstract class Layout1dGrid extends Layout1dBase {
-    protected _rolumns: any;
-    constructor(config: any);
+export declare abstract class Layout1dGrid<Config> extends Layout1dBase<Config> {
+    protected _rolumns: number;
     _viewDim2Changed(): void;
     _itemDim2Changed(): void;
     _getActiveItems(): void;
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1dGrid.d.ts.map b/lib/uni-virtualizer/lib/layouts/Layout1dGrid.d.ts.map
index 748cb292f3329dbbcebac625ab7955a6b8683e66..ed14c15459b9a49e0a8b7d28c09fde366ed3d32b 100644
--- a/lib/uni-virtualizer/lib/layouts/Layout1dGrid.d.ts.map
+++ b/lib/uni-virtualizer/lib/layouts/Layout1dGrid.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"Layout1dGrid.d.ts","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/layouts/Layout1dGrid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAE/C;;GAEG;AACH,8BAAsB,YAAa,SAAQ,YAAY;IACrD,SAAS,CAAC,QAAQ,MAAC;gBAEP,MAAM,KAAA;IAKlB,gBAAgB;IAIhB,gBAAgB;IAIhB,eAAe;IAef,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC;IAQ1D,iBAAiB;CAIlB"}
\ No newline at end of file
+{"version":3,"file":"Layout1dGrid.d.ts","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/layouts/Layout1dGrid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAE/C;;GAEG;AACH,8BAAsB,YAAY,CAAC,MAAM,CAAE,SAAQ,YAAY,CAAC,MAAM,CAAC;IACrE,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAK;IAO/B,gBAAgB;IAIhB,gBAAgB;IAIhB,eAAe;IAef,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC;IAQ1D,iBAAiB;CAIlB"}
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1dGrid.js b/lib/uni-virtualizer/lib/layouts/Layout1dGrid.js
index 24db275ef90173740b73488f8816fbf3344dff78..f9fdf72e948f74f384cb655887b12862afde5547 100644
--- a/lib/uni-virtualizer/lib/layouts/Layout1dGrid.js
+++ b/lib/uni-virtualizer/lib/layouts/Layout1dGrid.js
@@ -3,10 +3,14 @@ import { Layout1dBase } from './Layout1dBase.js';
  * TODO @straversi: document and test this Layout.
  */
 export class Layout1dGrid extends Layout1dBase {
-    constructor(config) {
-        super(config);
+    constructor() {
+        super(...arguments);
         this._rolumns = 1;
     }
+    // constructor(config) {
+    //   super(config);
+    //   this._rolumns = 1;
+    // }
     _viewDim2Changed() {
         this._scheduleLayoutUpdate();
     }
@@ -36,3 +40,4 @@ export class Layout1dGrid extends Layout1dBase {
             Math.max(1, Math.ceil(this._totalItems / this._rolumns) * this._delta + this._spacing);
     }
 }
+//# sourceMappingURL=Layout1dGrid.js.map
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1dGrid.js.map b/lib/uni-virtualizer/lib/layouts/Layout1dGrid.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..d5b5318d4d7ba2efa45ae788e5ef20563707af2d
--- /dev/null
+++ b/lib/uni-virtualizer/lib/layouts/Layout1dGrid.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"Layout1dGrid.js","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/layouts/Layout1dGrid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAE/C;;GAEG;AACH,MAAM,OAAgB,YAAqB,SAAQ,YAAoB;IAAvE;;QACY,aAAQ,GAAW,CAAC,CAAC;IA0CjC,CAAC;IAxCC,wBAAwB;IACxB,mBAAmB;IACnB,uBAAuB;IACvB,IAAI;IAEJ,gBAAgB;QACd,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAED,eAAe;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAChB,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEjD,IAAI,CAAC,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QACvC,IAAI,CAAC,KAAK;YACN,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;QAC3C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,gBAAgB,CAAC,GAAW;QAC1B,OAAO;YACL,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM;YAC9E,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE,IAAI,CAAC,QAAQ;gBAC3C,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;SACrB,CAAC;IAC9C,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,WAAW;YACZ,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7F,CAAC;CACF","sourcesContent":["import {Layout1dBase} from './Layout1dBase.js';\n\n/**\n * TODO @straversi: document and test this Layout.\n */\nexport abstract class Layout1dGrid<Config> extends Layout1dBase<Config> {\n  protected _rolumns: number = 1;\n\n  // constructor(config) {\n  //   super(config);\n  //   this._rolumns = 1;\n  // }\n\n  _viewDim2Changed() {\n    this._scheduleLayoutUpdate();\n  }\n\n  _itemDim2Changed() {\n    this._scheduleLayoutUpdate();\n  }\n\n  _getActiveItems() {\n    const min = Math.max(0, this._scrollPosition - this._overhang);\n    const max = Math.min(\n        this._scrollSize,\n        this._scrollPosition + this._viewDim1 + this._overhang);\n    const firstCow = Math.floor(min / this._delta);\n    const lastCow = Math.ceil(max / this._delta) - 1;\n\n    this._first = firstCow * this._rolumns;\n    this._last =\n        Math.min(((lastCow + 1) * this._rolumns) - 1, this._totalItems - 1);\n    this._physicalMin = this._delta * firstCow;\n    this._physicalMax = this._delta * (lastCow + 1);\n  }\n\n  _getItemPosition(idx: number): {top: number, left: number} {\n    return {\n      [this._positionDim]: this._spacing + Math.floor(idx / this._rolumns) * this._delta,\n          [this._secondaryPositionDim]: this._spacing +\n          ((idx % this._rolumns) * (this._spacing + this._itemDim2))\n    } as unknown as {top: number, left: number};\n  }\n\n  _updateScrollSize() {\n    this._scrollSize =\n        Math.max(1, Math.ceil(this._totalItems / this._rolumns) * this._delta + this._spacing);\n  }\n}\n"]}
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1dNaturalSizeGrid.d.ts b/lib/uni-virtualizer/lib/layouts/Layout1dNaturalSizeGrid.d.ts
index aeb4125400544350993c7c2b5c934b5931b9d163..4e5324c76353f7af1f7f4d8f1981ff2684b258ab 100644
--- a/lib/uni-virtualizer/lib/layouts/Layout1dNaturalSizeGrid.d.ts
+++ b/lib/uni-virtualizer/lib/layouts/Layout1dNaturalSizeGrid.d.ts
@@ -1,6 +1,7 @@
 import { Layout1dGrid } from './Layout1dGrid.js';
+import { Layout1dBaseConfig } from './Layout1dBase.js';
 import { ItemBox } from './Layout';
-export declare class Layout1dNaturalSizeGrid extends Layout1dGrid {
+export declare class Layout1dNaturalSizeGrid extends Layout1dGrid<Layout1dBaseConfig> {
     updateItemSizes(sizes: {
         [key: number]: ItemBox;
     }): void;
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1dNaturalSizeGrid.d.ts.map b/lib/uni-virtualizer/lib/layouts/Layout1dNaturalSizeGrid.d.ts.map
index 602b691726e6fb10dd3c8e430253267e8f0bafcf..5b45aac00d294a71c6a6a6ba4a6fb75ff4530a98 100644
--- a/lib/uni-virtualizer/lib/layouts/Layout1dNaturalSizeGrid.d.ts.map
+++ b/lib/uni-virtualizer/lib/layouts/Layout1dNaturalSizeGrid.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"Layout1dNaturalSizeGrid.d.ts","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/layouts/Layout1dNaturalSizeGrid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAC,OAAO,EAAC,MAAM,UAAU,CAAC;AAEjC,qBAAa,uBAAwB,SAAQ,YAAY;IACrD,eAAe,CAAC,KAAK,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAC;IAQ7C,aAAa;CAYlB"}
\ No newline at end of file
+{"version":3,"file":"Layout1dNaturalSizeGrid.d.ts","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/layouts/Layout1dNaturalSizeGrid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAC,kBAAkB,EAAC,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAC,OAAO,EAAC,MAAM,UAAU,CAAC;AAEjC,qBAAa,uBAAwB,SAAQ,YAAY,CAAC,kBAAkB,CAAC;IACzE,eAAe,CAAC,KAAK,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAC;IAQ7C,aAAa;CAYlB"}
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1dNaturalSizeGrid.js b/lib/uni-virtualizer/lib/layouts/Layout1dNaturalSizeGrid.js
index 7ba0132588ff7979f3b004188241fa8334abaead..b188b16d0fe9a2889e18fa40f2a18377682632a4 100644
--- a/lib/uni-virtualizer/lib/layouts/Layout1dNaturalSizeGrid.js
+++ b/lib/uni-virtualizer/lib/layouts/Layout1dNaturalSizeGrid.js
@@ -20,3 +20,4 @@ export class Layout1dNaturalSizeGrid extends Layout1dGrid {
         this._spacingChanged = !(_spacing === this._spacing);
     }
 }
+//# sourceMappingURL=Layout1dNaturalSizeGrid.js.map
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1dNaturalSizeGrid.js.map b/lib/uni-virtualizer/lib/layouts/Layout1dNaturalSizeGrid.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..cf506e8d0dcce673437abc94de413141f2cf4df8
--- /dev/null
+++ b/lib/uni-virtualizer/lib/layouts/Layout1dNaturalSizeGrid.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"Layout1dNaturalSizeGrid.js","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/layouts/Layout1dNaturalSizeGrid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAI/C,MAAM,OAAO,uBAAwB,SAAQ,YAAgC;IACzE,eAAe,CAAC,KAA+B;QAC3C,uCAAuC;QACvC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;SACtB;IACH,CAAC;IAED,aAAa;QACX,MAAM,EAAC,QAAQ,EAAC,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACzE,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE;YACrB,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC/D,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;SACzB;aACI;YACH,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;SACnB;QACD,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;CACN","sourcesContent":["import {Layout1dGrid} from './Layout1dGrid.js';\nimport {Layout1dBaseConfig} from './Layout1dBase.js';\nimport {ItemBox} from './Layout';\n\nexport class Layout1dNaturalSizeGrid extends Layout1dGrid<Layout1dBaseConfig> {\n    updateItemSizes(sizes: {[key: number]: ItemBox}) {\n        // Assume all items have the same size.\n        const size = Object.values(sizes)[0];\n        if (size) {\n          this.itemSize = size;\n        }\n      }\n    \n      _updateLayout() {\n        const {_spacing} = this;\n        this._rolumns = Math.max(1, Math.floor(this._viewDim2 / this._itemDim2));\n        if (this._rolumns > 1) {\n          this._spacing = (this._viewDim2 % (this._rolumns * this._itemDim2)) /\n              (this._rolumns + 1);\n        }\n        else {\n          this._spacing = 0;\n        }\n        this._spacingChanged = !(_spacing === this._spacing);\n      }        \n}"]}
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1dSquareGrid.d.ts b/lib/uni-virtualizer/lib/layouts/Layout1dSquareGrid.d.ts
index 6aea3ca7ab177d3750be3c5e0179cff8930dbf0b..f7d46726678162fc91735c45111fce60687c1dca 100644
--- a/lib/uni-virtualizer/lib/layouts/Layout1dSquareGrid.d.ts
+++ b/lib/uni-virtualizer/lib/layouts/Layout1dSquareGrid.d.ts
@@ -1,10 +1,20 @@
+import { Layout1dBaseConfig } from './Layout1dBase.js';
 import { Layout1dGrid } from './Layout1dGrid.js';
 import { Positions } from './Layout.js';
-export declare class Layout1dSquareGrid extends Layout1dGrid {
+interface Layout1dSquareGridConfig extends Layout1dBaseConfig {
+    spacing?: number;
+    idealSize?: number;
+}
+declare type Layout1dSquareGridSpecifier = Layout1dSquareGridConfig & {
+    type: new (config?: Layout1dSquareGridConfig) => Layout1dSquareGrid;
+};
+declare type Layout1dSquareGridSpecifierFactory = (config?: Layout1dSquareGridConfig) => Layout1dSquareGridSpecifier;
+export declare const layout1dSquareGrid: Layout1dSquareGridSpecifierFactory;
+export declare class Layout1dSquareGrid extends Layout1dGrid<Layout1dSquareGridConfig> {
     protected _idealSize: number;
-    constructor(config: any);
-    set idealSize(px: any);
+    set idealSize(px: number);
     _getItemPosition(idx: number): Positions;
     _updateLayout(): void;
 }
+export {};
 //# sourceMappingURL=Layout1dSquareGrid.d.ts.map
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1dSquareGrid.d.ts.map b/lib/uni-virtualizer/lib/layouts/Layout1dSquareGrid.d.ts.map
index a283b0668bda6eac853d0d53ad7d675f770ecfad..9fcaf8aa40d8116114cd4785986408c7ff0b0feb 100644
--- a/lib/uni-virtualizer/lib/layouts/Layout1dSquareGrid.d.ts.map
+++ b/lib/uni-virtualizer/lib/layouts/Layout1dSquareGrid.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"Layout1dSquareGrid.d.ts","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/layouts/Layout1dSquareGrid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEjB,MAAM,KAAA;IAOlB,IAAI,SAAS,CAAC,EAAE,KAAA,EAKf;IAED,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IAIxC,aAAa;CASd"}
\ No newline at end of file
+{"version":3,"file":"Layout1dSquareGrid.d.ts","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/layouts/Layout1dSquareGrid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAC,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,UAAU,wBAAyB,SAAQ,kBAAkB;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,aAAK,2BAA2B,GAAG,wBAAwB,GAAG;IAC5D,IAAI,EAAE,KAAI,MAAM,CAAC,EAAE,wBAAwB,KAAK,kBAAkB,CAAA;CACnE,CAAA;AAED,aAAK,kCAAkC,GAAG,CAAC,MAAM,CAAC,EAAE,wBAAwB,KAAK,2BAA2B,CAAC;AAE7G,eAAO,MAAM,kBAAkB,EAAE,kCAEvB,CAAC;AAEX,qBAAa,kBAAmB,SAAQ,YAAY,CAAC,wBAAwB,CAAC;IAC5E,SAAS,CAAC,UAAU,EAAE,MAAM,CAAO;IASnC,IAAI,SAAS,CAAC,EAAE,EAAE,MAAM,EAKvB;IAED,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IAIxC,aAAa;CASd"}
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1dSquareGrid.js b/lib/uni-virtualizer/lib/layouts/Layout1dSquareGrid.js
index 27636003a5baa3d56b60693222ed0e84561ff796..ce7b984d5b60e2ae09942df097049732d949390f 100644
--- a/lib/uni-virtualizer/lib/layouts/Layout1dSquareGrid.js
+++ b/lib/uni-virtualizer/lib/layouts/Layout1dSquareGrid.js
@@ -1,11 +1,18 @@
 import { Layout1dGrid } from './Layout1dGrid.js';
+export const layout1dSquareGrid = (config) => Object.assign({
+    type: Layout1dSquareGrid
+}, config);
 export class Layout1dSquareGrid extends Layout1dGrid {
-    constructor(config) {
-        super(config);
-        if (config.idealSize === undefined) {
-            this._idealSize = 200;
-        }
+    constructor() {
+        super(...arguments);
+        this._idealSize = 200;
     }
+    // constructor(config) {
+    //   super(config);
+    //   if (config.idealSize === undefined) {
+    //       this._idealSize = 200;
+    //   }
+    // }
     set idealSize(px) {
         if (px !== this._idealSize) {
             this._idealSize = px;
@@ -25,3 +32,4 @@ export class Layout1dSquareGrid extends Layout1dGrid {
         }
     }
 }
+//# sourceMappingURL=Layout1dSquareGrid.js.map
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/layouts/Layout1dSquareGrid.js.map b/lib/uni-virtualizer/lib/layouts/Layout1dSquareGrid.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..701d12281865e1459666458e9418a96696813f3b
--- /dev/null
+++ b/lib/uni-virtualizer/lib/layouts/Layout1dSquareGrid.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"Layout1dSquareGrid.js","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/layouts/Layout1dSquareGrid.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAc/C,MAAM,CAAC,MAAM,kBAAkB,GAAuC,CAAC,MAAiC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;IACzH,IAAI,EAAE,kBAAkB;CACzB,EAAE,MAAM,CAAC,CAAC;AAEX,MAAM,OAAO,kBAAmB,SAAQ,YAAsC;IAA9E;;QACY,eAAU,GAAW,GAAG,CAAC;IA6BrC,CAAC;IA3BC,wBAAwB;IACxB,mBAAmB;IACnB,0CAA0C;IAC1C,+BAA+B;IAC/B,MAAM;IACN,IAAI;IAEJ,IAAI,SAAS,CAAC,EAAU;QACtB,IAAI,EAAE,KAAK,IAAI,CAAC,UAAU,EAAE;YAC1B,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC,qBAAqB,EAAE,CAAC;SAC9B;IACH,CAAC;IAED,gBAAgB,CAAC,GAAW;QAC1B,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACpE,CAAC;IAED,aAAa;QACX,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;QAClD,IAAI,CAAC,QAAQ,GAAG,QAAQ,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChF,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QACzF,IAAI,OAAO,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;YACpC,IAAI,CAAC,SAAS,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;YACrD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;SAC7B;IACH,CAAC;CACF","sourcesContent":["import {Layout1dBaseConfig} from './Layout1dBase.js';\nimport {Layout1dGrid} from './Layout1dGrid.js';\nimport {Positions} from './Layout.js';\n\ninterface Layout1dSquareGridConfig extends Layout1dBaseConfig {\n  spacing?: number,\n  idealSize?: number\n}\n\ntype Layout1dSquareGridSpecifier = Layout1dSquareGridConfig & {\n  type: new(config?: Layout1dSquareGridConfig) => Layout1dSquareGrid\n}\n\ntype Layout1dSquareGridSpecifierFactory = (config?: Layout1dSquareGridConfig) => Layout1dSquareGridSpecifier;\n\nexport const layout1dSquareGrid: Layout1dSquareGridSpecifierFactory = (config?: Layout1dSquareGridConfig) => Object.assign({\n  type: Layout1dSquareGrid\n}, config);\n\nexport class Layout1dSquareGrid extends Layout1dGrid<Layout1dSquareGridConfig> {\n  protected _idealSize: number = 200;\n\n  // constructor(config) {\n  //   super(config);\n  //   if (config.idealSize === undefined) {\n  //       this._idealSize = 200;\n  //   }\n  // }\n\n  set idealSize(px: number) {\n    if (px !== this._idealSize) {\n      this._idealSize = px;\n      this._scheduleLayoutUpdate();\n    }\n  }\n\n  _getItemPosition(idx: number): Positions {\n    return Object.assign(super._getItemPosition(idx), this._itemSize);\n  }\n\n  _updateLayout() {\n    const frolumns = this._viewDim2 / this._idealSize;\n    this._rolumns = frolumns % 1 < 0.5 ? Math.floor(frolumns) : Math.ceil(frolumns);\n    const adjSize = (this._viewDim2 - ((this._rolumns + 1) * this._spacing)) / this._rolumns;\n    if (adjSize !== this._itemSize.width) {\n      this._itemSize = { width: adjSize, height: adjSize };\n      this._spacingChanged = true;\n    }\n  }    \n}"]}
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.d.ts b/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.d.ts
index d9f205869ab7ecc5e93b11c8310941611bbc18fa..da9f9dc7cdee3c8af63f235aec6913cde5362f1d 100644
--- a/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.d.ts
+++ b/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.d.ts
@@ -1,2 +1,6 @@
-export default function EventTarget(): Promise<any>;
+interface EventTargetConstructor {
+    new (): EventTarget;
+}
+export default function EventTarget(): Promise<EventTargetConstructor>;
+export {};
 //# sourceMappingURL=EventTarget.d.ts.map
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.d.ts.map b/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.d.ts.map
index ff50f3f8186e7b5ffc8ccf6c656dd39a0d56d9f3..7e5f49dc04b97a08ca30dc564ae41bacf8baa143 100644
--- a/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.d.ts.map
+++ b/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"EventTarget.d.ts","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.ts"],"names":[],"mappings":"AAEA,wBAA8B,WAAW,iBAExC"}
\ No newline at end of file
+{"version":3,"file":"EventTarget.d.ts","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.ts"],"names":[],"mappings":"AAEA,UAAU,sBAAsB;IAC5B,QAAO,WAAW,CAAA;CACrB;AAKD,wBAA8B,WAAW,oCAExC"}
\ No newline at end of file
diff --git a/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.js b/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.js
index d92179f7fd5315203f870a6963e871dc8ddf6c0c..362e284121b97e0fba0925225777aebc32e26b8d 100644
--- a/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.js
+++ b/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.js
@@ -1,14 +1,15 @@
-let _ET, ET;
+let _ET;
+let ET;
 export default async function EventTarget() {
-    return ET || init();
+  return ET || init();
 }
 async function init() {
-    _ET = window.EventTarget;
-    try {
-        new _ET();
-    }
-    catch (_a) {
-        _ET = (await import('event-target-shim')).EventTarget;
-    }
-    return (ET = _ET);
+  _ET = window.EventTarget;
+  try {
+    new _ET();
+  } catch (_a) {
+    _ET = (await import("event-target-shim")).default.EventTarget;
+  }
+  return (ET = _ET);
 }
+//# sourceMappingURL=EventTarget.js.map
diff --git a/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.js.map b/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..4ce7a8b18f1f07910bae2b2fd08b8b9cddf2d9ca
--- /dev/null
+++ b/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"EventTarget.js","sourceRoot":"","sources":["../../../../src/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.ts"],"names":[],"mappings":"AAMA,IAAI,GAA+C,CAAC;AACpD,IAAI,EAA0B,CAAC;AAE/B,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,WAAW;IACrC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,IAAI;IACf,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC;IACzB,IAAI;QACA,IAAI,GAAG,EAAE,CAAC;KACb;IACD,WAAM;QACF,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,WAAW,CAAC;KACzD;IACD,OAAO,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;AACtB,CAAC","sourcesContent":["type EventTargetModule = typeof import('event-target-shim');\n\ninterface EventTargetConstructor {\n    new(): EventTarget\n}\n\nlet _ET: EventTargetModule | EventTargetConstructor;\nlet ET: EventTargetConstructor;\n\nexport default async function EventTarget() {\n    return ET || init();\n}\n\nasync function init() {\n    _ET = window.EventTarget;\n    try {\n        new _ET();\n    }\n    catch {\n        _ET = (await import('event-target-shim')).EventTarget;\n    }\n    return (ET = _ET);\n}"]}
\ No newline at end of file
diff --git a/lib/uni-virtualizer/uni-virtualizer.d.ts b/lib/uni-virtualizer/uni-virtualizer.d.ts
index 60838ab88dbfc1aa5889ba3a24729ac7f7a668e3..4137a2752ade8a4a41893635ed94ea0ad572a2e7 100644
--- a/lib/uni-virtualizer/uni-virtualizer.d.ts
+++ b/lib/uni-virtualizer/uni-virtualizer.d.ts
@@ -1,4 +1,4 @@
 export { VirtualScroller, RangeChangeEvent, scrollerRef } from './lib/VirtualScroller.js';
-export { Layout1d } from './lib/layouts/Layout1d.js';
+export { Layout1d, layout1d } from './lib/layouts/Layout1d.js';
 export { Layout1dGrid } from './lib/layouts/Layout1dGrid.js';
 //# sourceMappingURL=uni-virtualizer.d.ts.map
\ No newline at end of file
diff --git a/lib/uni-virtualizer/uni-virtualizer.d.ts.map b/lib/uni-virtualizer/uni-virtualizer.d.ts.map
index d045b7d96beda8cc80bc3a3b82e22ff23131a44f..38e1246ce67e788109d6c9310210a601693b6f95 100644
--- a/lib/uni-virtualizer/uni-virtualizer.d.ts.map
+++ b/lib/uni-virtualizer/uni-virtualizer.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"uni-virtualizer.d.ts","sourceRoot":"","sources":["../../src/lib/uni-virtualizer/uni-virtualizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE1F,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC"}
\ No newline at end of file
+{"version":3,"file":"uni-virtualizer.d.ts","sourceRoot":"","sources":["../../src/lib/uni-virtualizer/uni-virtualizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE1F,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC"}
\ No newline at end of file
diff --git a/lib/uni-virtualizer/uni-virtualizer.js b/lib/uni-virtualizer/uni-virtualizer.js
index abbfd723d9d0013a5afa3641ace55bd4b89be275..ed6b82aedaa51d4c38de726c0db6e21d01759f5f 100644
--- a/lib/uni-virtualizer/uni-virtualizer.js
+++ b/lib/uni-virtualizer/uni-virtualizer.js
@@ -1,3 +1,4 @@
 export { VirtualScroller, scrollerRef } from './lib/VirtualScroller.js';
-export { Layout1d } from './lib/layouts/Layout1d.js';
+export { Layout1d, layout1d } from './lib/layouts/Layout1d.js';
 export { Layout1dGrid } from './lib/layouts/Layout1dGrid.js';
+//# sourceMappingURL=uni-virtualizer.js.map
\ No newline at end of file
diff --git a/lib/uni-virtualizer/uni-virtualizer.js.map b/lib/uni-virtualizer/uni-virtualizer.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..326d70cd4eedd257fb6fbb0078255e2882c49724
--- /dev/null
+++ b/lib/uni-virtualizer/uni-virtualizer.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"uni-virtualizer.js","sourceRoot":"","sources":["../../src/lib/uni-virtualizer/uni-virtualizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAoB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE1F,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC","sourcesContent":["export { VirtualScroller, RangeChangeEvent, scrollerRef } from './lib/VirtualScroller.js';\n\nexport { Layout1d, layout1d } from './lib/layouts/Layout1d.js';\nexport { Layout1dGrid } from './lib/layouts/Layout1dGrid.js';\n"]}
\ No newline at end of file
diff --git a/lit-virtualizer.d.ts b/lit-virtualizer.d.ts
index 1c857d4bc1aeb43b56a7923b990ddcd094b09be2..58204903e4356b38a34df0ba29fec6390d435078 100644
--- a/lit-virtualizer.d.ts
+++ b/lit-virtualizer.d.ts
@@ -1,4 +1,4 @@
 export { scroll } from './lib/scroll.js';
-export { Layout1d, Layout1dGrid, RangeChangeEvent, scrollerRef } from './lib/uni-virtualizer/uni-virtualizer.js';
+export { Layout1d, layout1d, Layout1dGrid, RangeChangeEvent, scrollerRef } from './lib/uni-virtualizer/uni-virtualizer.js';
 export { LitVirtualizer } from './lib/lit-virtualizer.js';
 //# sourceMappingURL=lit-virtualizer.d.ts.map
\ No newline at end of file
diff --git a/lit-virtualizer.d.ts.map b/lit-virtualizer.d.ts.map
index 3a1ccb65e6cefe6192415cdbb5e6dfa1f273233c..08ad361b84e378b6052924266a57fca5a48177b0 100644
--- a/lit-virtualizer.d.ts.map
+++ b/lit-virtualizer.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"lit-virtualizer.d.ts","sourceRoot":"","sources":["src/lit-virtualizer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAC;AACjH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC"}
\ No newline at end of file
+{"version":3,"file":"lit-virtualizer.d.ts","sourceRoot":"","sources":["src/lit-virtualizer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAC3H,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC"}
\ No newline at end of file
diff --git a/lit-virtualizer.js b/lit-virtualizer.js
index 1774c8a7f63ab390fd6bb96ce2f58dccef32c211..ef3497547e82647ab7282927e83a32ed39456b4c 100644
--- a/lit-virtualizer.js
+++ b/lit-virtualizer.js
@@ -1,4 +1,5 @@
 // export { repeat } from './lib/repeat.js';
 export { scroll } from './lib/scroll.js';
-export { Layout1d, Layout1dGrid, scrollerRef } from './lib/uni-virtualizer/uni-virtualizer.js';
+export { Layout1d, layout1d, Layout1dGrid, scrollerRef } from './lib/uni-virtualizer/uni-virtualizer.js';
 export { LitVirtualizer } from './lib/lit-virtualizer.js';
+//# sourceMappingURL=lit-virtualizer.js.map
\ No newline at end of file
diff --git a/lit-virtualizer.js.map b/lit-virtualizer.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..c0c3a0f6bb2af1571380e7f79e81a6affa787f18
--- /dev/null
+++ b/lit-virtualizer.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lit-virtualizer.js","sourceRoot":"","sources":["src/lit-virtualizer.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAoB,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAC3H,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC","sourcesContent":["// export { repeat } from './lib/repeat.js';\nexport { scroll } from './lib/scroll.js';\nexport { Layout1d, layout1d, Layout1dGrid, RangeChangeEvent, scrollerRef } from './lib/uni-virtualizer/uni-virtualizer.js';\nexport { LitVirtualizer } from './lib/lit-virtualizer.js';\n"]}
\ No newline at end of file
diff --git a/package.json b/package.json
index b9854ae5453193acdc822d0b06e02674733844a1..f1194c01e74606efba3403df51f2adbadd5b0da6 100644
--- a/package.json
+++ b/package.json
@@ -45,8 +45,7 @@
         "rollup-plugin-node-resolve": "^4.2.3",
         "rollup-plugin-terser": "^5.0.0",
         "tachometer": "^0.4.7",
-        "tslint": "^5.18.0",
-        "typescript": "^4.0.2"
+        "typescript": "^4.1.3"
     },
     "dependencies": {
         "event-target-shim": "^5.0.1",
