[{"name":"VirtualList","comment":" Efficiently displays large lists by **rendering only visible items** plus a configurable buffer.\n\nIt does so by **dynamically measuring** the height of the displayed elements.\n\nIf item heights are **known in advance,** consider [`FabienHenon/elm-infinite-list-view`](https://package.elm-lang.org/packages/FabienHenon/elm-infinite-list-view/latest/) for better performance.\n\n\n## Usage\n\n\n### Model Setup\n\nInclude `VirtualList.Model` in your app's **model:**\n\n    import VirtualList\n\n    type alias Model =\n        { virtualList : VirtualList.Model\n\n        -- other fields\n        }\n\n    defaultModel : Model\n    defaultModel =\n        { virtualList = VirtualList.init\n\n        -- other fields\n        }\n\n\n### Update Function\n\nInclude `VirtualList.Msg` in your app’s **update function:**\n\n\n    type Msg\n        = VirtualListMsg VirtualList.Msg\n\n    -- other messages\n    update : Msg -> Model -> ( Model, Cmd Msg )\n    update msg model =\n        case msg of\n            VirtualListMsg virtualListMsg ->\n                let\n                    ( virtualListModel, virtualListCmd ) =\n                        VirtualList.update virtualListMsg model.virtualList\n                in\n                ( { model | virtualList = virtualListModel }, Cmd.map VirtualListMsg virtualListCmd )\n\n    -- other cases\n\n\n### Rendering\n\nRender the virtual list in your **view:**\n\n    view : Model -> Html Msg\n    view model =\n        VirtualList.view (renderRow model) model.virtualList VirtualListMsg\n\n    renderRow : Model -> String -> Html Msg\n    renderRow model id =\n        div [] [ text id ]\n\n\n# Model & Initialization\n\n@docs Model, init, initWithConfig, Msg, update\n\n\n# Rendering\n\n@docs view, remeasureViewport\n\n\n# Setting and Updating the Items\n\n@docs setItems, setItemsAndRemeasureAll, setItemsAndRemeasure\n\n\n# Scrolling\n\n@docs scrollToItem, Alignment\n\n","unions":[{"name":"Alignment","comment":" Defines an item’s **position in the viewport** when scrolled to.\n\n\n### Variants:\n\n  - **`Top`:** Aligns the item to the top.\n  - **`Center`:** Centers the item.\n  - **`Bottom`:** Aligns the item to the bottom.\n\n","args":[],"cases":[["Top",[]],["Center",[]],["Bottom",[]]]},{"name":"Model","comment":" The `Model` stores the **virtual list’s state.** Include it in your application’s model:\n\n    type alias Model =\n        { virtualList : VirtualList.Model\n\n        -- other fields\n        }\n\nYou **create** one with the [`init`](VirtualList#init) function.\n\n","args":[],"cases":[]},{"name":"Msg","comment":" **Messages** used by the virtual list.\n\n**Add** `VirtualList.Msg` to your app’s `Msg` type and handle it in `update`.\n\n\n    type Msg\n        = VirtualListMsg VirtualList.Msg\n\n    -- other messages\n\n","args":[],"cases":[]}],"aliases":[],"values":[{"name":"init","comment":" Initializes a virtual list model with the **[default configuration](VirtualList.Config#default).**\n","type":"VirtualList.Model"},{"name":"initWithConfig","comment":" Initializes a virtual list model with a **custom configuration.**\n\n    initWithConfig VirtualList.Config.default\n\nYou can [**modify**](VirtualList.Config) the default configuration:\n\n    config = initWithConfig VirtualList.Config.default\n        |> VirtualList.Config.setInitialHeight 650\n        |> VirtualList.Config.setBuffer 10\n\n    initWithConfig config\n\n","type":"VirtualList.Config.Config -> VirtualList.Model"},{"name":"remeasureViewport","comment":" **Remeasures the viewport height.** Call this when the container changes size,\nfor example in a `ResizeObserver` callback, to keep the visible item range correct.\n\n","type":"VirtualList.Model -> Platform.Cmd.Cmd VirtualList.Msg"},{"name":"scrollToItem","comment":" Scrolls to the **specified item** unless it is already visible.\n\n    let\n        ( newVirtualList, virtualListCmd ) =\n            VirtualList.scrollToItem model.virtualList \"item-42\" VirtualList.Center\n    in\n    ( { model | virtualList = newVirtualList }\n    , Cmd.map VirtualListMsg virtualListCmd\n    )\n\n","type":"VirtualList.Model -> String.String -> VirtualList.Alignment -> ( VirtualList.Model, Platform.Cmd.Cmd VirtualList.Msg )"},{"name":"setItems","comment":" Updates the **list of displayed items**.\n\nOnly **new items** are measured; existing ones retain cached heights.\n\n    VirtualList.setItems model.virtualList ids\n\n","type":"VirtualList.Model -> List.List String.String -> ( VirtualList.Model, Platform.Cmd.Cmd VirtualList.Msg )"},{"name":"setItemsAndRemeasure","comment":" Like [`setItems`](VirtualList#setItems), but **selectively remeasures** specific items\n\nUseful when only **some items** may have changed in height.\n\n    VirtualList.setItemsAndRemeasure model.virtualList { newIds = newIds, idsToRemeasure = changedIds }\n\n","type":"VirtualList.Model -> { newIds : List.List String.String, idsToRemeasure : List.List String.String } -> ( VirtualList.Model, Platform.Cmd.Cmd VirtualList.Msg )"},{"name":"setItemsAndRemeasureAll","comment":" Like [`setItems`](VirtualList#setItems), but **remeasures** all items.\n\nUse this if item heights have **changed.**\n\n    VirtualList.setItemsAndRemeasureAll model.virtualList newIds\n\n","type":"VirtualList.Model -> List.List String.String -> ( VirtualList.Model, Platform.Cmd.Cmd VirtualList.Msg )"},{"name":"update","comment":" **Updates** the virtual list model based on received messages.\n\n**Integrate** this into your `update` function and map the result back to your app’s `Msg`.\n\n\n    update : Msg -> Model -> ( Model, Cmd Msg )\n    update msg model =\n        case msg of\n            VirtualListMsg virtualListMsg ->\n                let\n                    ( virtualListModel, virtualListCmd ) =\n                        VirtualList.update virtualListMsg model.virtualList\n                in\n                ( { model | virtualList = virtualListModel }, Cmd.map VirtualListMsg virtualListCmd )\n\n    -- other cases\n\n","type":"VirtualList.Msg -> VirtualList.Model -> ( VirtualList.Model, Platform.Cmd.Cmd VirtualList.Msg )"},{"name":"view","comment":" **Renders** the virtual list.\n\nYou **provide** it with\n\n  - a **function** that renders an item given its ID,\n  - the virtual list **`Model`,** and\n  - the virtual list **message** type on your side.\n\n```\nview : Model -> Html Msg\nview model =\n    VirtualList.view (renderRow model) model.virtualList VirtualListMsg\n\nrenderRow : Model -> String -> Html Msg\nrenderRow model id =\n    div [] [ text id ]\n```\n\n`renderRow` is executed **lazily.**\n\n","type":"(String.String -> Html.Html msg) -> VirtualList.Model -> (VirtualList.Msg -> msg) -> Html.Html msg"}],"binops":[]},{"name":"VirtualList.Config","comment":" **Configure a virtual list** with settings for size estimation, buffering, and visibility during measurement.\n\n@docs Config, default\n\n\n# Setters\n\nYou can **combine** the following setters with the pipe operator:\n\n    VirtualList.Config.default\n        |> VirtualList.Config.setInitialHeight 650\n        |> VirtualList.Config.setBuffer 10\n\n@docs setListId, setInitialHeight, setDefaultItemHeight, setShowListDuringMeasurement, setBuffer, setDynamicBuffer\n\n\n# Getters\n\nYou will probably have **no need** to access these values directly.\n\n@docs getListId, getInitialHeight, getDefaultItemHeight, getShowListDuringMeasurement, getBuffer, getDynamicBuffer\n\n","unions":[{"name":"Config","comment":" Defines the **configuration** for a virtual list, including estimated item heights, buffer size, and visibility settings during measurement.\n\nStart with [default](VirtualList.Config#default) and customize it using setter **functions:**\n\n    VirtualList.Config.default\n        |> VirtualList.Config.setInitialHeight 650\n        |> VirtualList.Config.setBuffer 10\n\n","args":[],"cases":[]}],"aliases":[],"values":[{"name":"default","comment":" Returns a **default configuration** with reasonable initial values.\n","type":"VirtualList.Config.Config"},{"name":"getBuffer","comment":" Returns the number of **extra items** rendered outside the visible area.\n","type":"VirtualList.Config.Config -> Basics.Int"},{"name":"getDefaultItemHeight","comment":" Returns the **estimated item height** before measurement.\n","type":"VirtualList.Config.Config -> Basics.Float"},{"name":"getDynamicBuffer","comment":" Returns whether buffer sizing is dynamic based on **scroll speed.**\n","type":"VirtualList.Config.Config -> Basics.Bool"},{"name":"getInitialHeight","comment":" Returns the list’s **estimated height** before measurement.\n","type":"VirtualList.Config.Config -> Basics.Float"},{"name":"getListId","comment":" Returns the **list container’s ID.**\n","type":"VirtualList.Config.Config -> String.String"},{"name":"getShowListDuringMeasurement","comment":" Returns whether the list remains **visible during measurement,** which may affect layout.\n","type":"VirtualList.Config.Config -> Basics.Bool"},{"name":"setBuffer","comment":" Defines how many **extra items** are rendered outside the visible range for smoother scrolling.\n\n**Default:** `5`\n\n","type":"Basics.Int -> VirtualList.Config.Config -> VirtualList.Config.Config"},{"name":"setDefaultItemHeight","comment":" Sets the **estimated item height** before measurement.\n\nUses the **default** if negative: **Default:** `26`\n\n","type":"Basics.Float -> VirtualList.Config.Config -> VirtualList.Config.Config"},{"name":"setDynamicBuffer","comment":" Enables dynamic buffer sizing based on **scroll speed.**\n\n**Default:** `True`\n\n","type":"Basics.Bool -> VirtualList.Config.Config -> VirtualList.Config.Config"},{"name":"setInitialHeight","comment":" Defines the **estimated list height** before measurement.\n\nUses the **default** if negative: `500`\n\n","type":"Basics.Float -> VirtualList.Config.Config -> VirtualList.Config.Config"},{"name":"setListId","comment":" Sets the ID of the **list container** in the DOM.\n\nUses the **default ID** if an empty string is provided: `\"virtual-list\"`\n\n","type":"String.String -> VirtualList.Config.Config -> VirtualList.Config.Config"},{"name":"setShowListDuringMeasurement","comment":" Controls whether the list remains **visible during measurement.**\n\nIf `True`, it may cause **spacing issues.**\n\n**Default:** `False`\n\n","type":"Basics.Bool -> VirtualList.Config.Config -> VirtualList.Config.Config"}],"binops":[]}]