Virtual List
Windowed list with built-in search, sorting, selection and an async data source.
c2-virtual-list renders only the rows you can see. It windows items to the visible range plus an overscan margin with the same virtual scroller the data grid uses, so 50 000 rows cost the same DOM as twenty — and every visible row is a real c2-list-item, so the markup, slots, selection styling and theme are the ones you already know from c2-list.
Search is part of the component rather than something you bolt on: searchable puts a field above the list, search is also a plain property so an external input can drive it, search-fields narrows what a query is matched against, matcher replaces the matching outright, and highlight marks what matched. sort orders the rows. An async dataSource swaps the whole thing for block loading, with the query and the sort delegated to the server.
Give the host a height (or --c2-virtual-list--max-height); the rows scroll inside it. Windowing needs a uniform row height, which comes from --c2-virtual-list__item--height — a list with two-line rows has to raise it. Tab moves into the list, the arrow keys, Home, End, PageUp and PageDown walk the rows, Enter or Space selects, ⌘/Ctrl-click toggles and shift-click selects a range.
Installation
npm install @c2n/virtual-list@c2n/list-item, @c2n/text-field and @c2n/spinner are dependencies of the package and are registered for you.
Usage
Hand the list its items — an array in the property, JSON in the attribute — and say which field is the label. Without label-field the list falls back to label, name, title or value, so a list of plain objects (or of bare strings) needs no configuration at all.
import '@c2n/virtual-list'<style>
.list {
width: 100%;
height: 208px;
--c2-virtual-list--border-top: 1px solid #e4e4e7;
--c2-virtual-list--border-right: 1px solid #e4e4e7;
--c2-virtual-list--border-bottom: 1px solid #e4e4e7;
--c2-virtual-list--border-left: 1px solid #e4e4e7;
}
.two-line {
--c2-virtual-list__item--height: 52px;
}
.dense {
--c2-virtual-list__item--height: 26px;
--c2-list-item--font-size: 12px;
--c2-list-item--line-height: 16px;
--c2-list-item--padding-top: 2px;
--c2-list-item--padding-bottom: 2px;
}
</style>
<div data-label="Search over 60 rows">
<c2-virtual-list client:only="lit" class="list two-line" aria-label="People" searchable highlight selection="single" item-key="id" label-field="name" description-field="team" search-placeholder="Search people" items='[{"id":"1","name":"Ada Lovelace 1","team":"Analytics","score":10000},{"id":"2","name":"Grace Hopper 2","team":"Compilers","score":17919},{"id":"3","name":"Alan Turing 3","team":"Research","score":25838},{"id":"4","name":"Katherine Johnson 4","team":"Flight","score":33757},{"id":"5","name":"Radia Perlman 5","team":"Networks","score":41676},{"id":"6","name":"Barbara Liskov 6","team":"Analytics","score":49595},{"id":"7","name":"Margaret Hamilton 7","team":"Compilers","score":57514},{"id":"8","name":"Ada Lovelace 8","team":"Research","score":65433},{"id":"9","name":"Grace Hopper 9","team":"Flight","score":73352},{"id":"10","name":"Alan Turing 10","team":"Networks","score":81271},{"id":"11","name":"Katherine Johnson 11","team":"Analytics","score":89190},{"id":"12","name":"Radia Perlman 12","team":"Compilers","score":97109},{"id":"13","name":"Barbara Liskov 13","team":"Research","score":15028},{"id":"14","name":"Margaret Hamilton 14","team":"Flight","score":22947},{"id":"15","name":"Ada Lovelace 15","team":"Networks","score":30866},{"id":"16","name":"Grace Hopper 16","team":"Analytics","score":38785},{"id":"17","name":"Alan Turing 17","team":"Compilers","score":46704},{"id":"18","name":"Katherine Johnson 18","team":"Research","score":54623},{"id":"19","name":"Radia Perlman 19","team":"Flight","score":62542},{"id":"20","name":"Barbara Liskov 20","team":"Networks","score":70461},{"id":"21","name":"Margaret Hamilton 21","team":"Analytics","score":78380},{"id":"22","name":"Ada Lovelace 22","team":"Compilers","score":86299},{"id":"23","name":"Grace Hopper 23","team":"Research","score":94218},{"id":"24","name":"Alan Turing 24","team":"Flight","score":12137},{"id":"25","name":"Katherine Johnson 25","team":"Networks","score":20056},{"id":"26","name":"Radia Perlman 26","team":"Analytics","score":27975},{"id":"27","name":"Barbara Liskov 27","team":"Compilers","score":35894},{"id":"28","name":"Margaret Hamilton 28","team":"Research","score":43813},{"id":"29","name":"Ada Lovelace 29","team":"Flight","score":51732},{"id":"30","name":"Grace Hopper 30","team":"Networks","score":59651},{"id":"31","name":"Alan Turing 31","team":"Analytics","score":67570},{"id":"32","name":"Katherine Johnson 32","team":"Compilers","score":75489},{"id":"33","name":"Radia Perlman 33","team":"Research","score":83408},{"id":"34","name":"Barbara Liskov 34","team":"Flight","score":91327},{"id":"35","name":"Margaret Hamilton 35","team":"Networks","score":99246},{"id":"36","name":"Ada Lovelace 36","team":"Analytics","score":17165},{"id":"37","name":"Grace Hopper 37","team":"Compilers","score":25084},{"id":"38","name":"Alan Turing 38","team":"Research","score":33003},{"id":"39","name":"Katherine Johnson 39","team":"Flight","score":40922},{"id":"40","name":"Radia Perlman 40","team":"Networks","score":48841},{"id":"41","name":"Barbara Liskov 41","team":"Analytics","score":56760},{"id":"42","name":"Margaret Hamilton 42","team":"Compilers","score":64679},{"id":"43","name":"Ada Lovelace 43","team":"Research","score":72598},{"id":"44","name":"Grace Hopper 44","team":"Flight","score":80517},{"id":"45","name":"Alan Turing 45","team":"Networks","score":88436},{"id":"46","name":"Katherine Johnson 46","team":"Analytics","score":96355},{"id":"47","name":"Radia Perlman 47","team":"Compilers","score":14274},{"id":"48","name":"Barbara Liskov 48","team":"Research","score":22193},{"id":"49","name":"Margaret Hamilton 49","team":"Flight","score":30112},{"id":"50","name":"Ada Lovelace 50","team":"Networks","score":38031},{"id":"51","name":"Grace Hopper 51","team":"Analytics","score":45950},{"id":"52","name":"Alan Turing 52","team":"Compilers","score":53869},{"id":"53","name":"Katherine Johnson 53","team":"Research","score":61788},{"id":"54","name":"Radia Perlman 54","team":"Flight","score":69707},{"id":"55","name":"Barbara Liskov 55","team":"Networks","score":77626},{"id":"56","name":"Margaret Hamilton 56","team":"Analytics","score":85545},{"id":"57","name":"Ada Lovelace 57","team":"Compilers","score":93464},{"id":"58","name":"Grace Hopper 58","team":"Research","score":11383},{"id":"59","name":"Alan Turing 59","team":"Flight","score":19302},{"id":"60","name":"Katherine Johnson 60","team":"Networks","score":27221}]'></c2-virtual-list>
</div>
<div data-label="Plain list">
<c2-virtual-list client:only="lit" class="list" aria-label="Fruit" items='["Apple","Apricot","Banana","Blackberry","Cherry","Date","Elderberry","Fig","Grape","Lemon","Lime","Mango","Nectarine","Orange","Peach"]'></c2-virtual-list>
</div>
<div data-label="Multiple selection">
<c2-virtual-list client:only="lit" class="list" aria-label="People" selection="multiple" item-key="id" label-field="name" value="2;3;4;7" items='[{"id":"1","name":"Ada Lovelace","team":"Analytics"},{"id":"2","name":"Grace Hopper","team":"Compilers"},{"id":"3","name":"Alan Turing","team":"Research"},{"id":"4","name":"Katherine Johnson","team":"Flight"},{"id":"5","name":"Radia Perlman","team":"Networks"},{"id":"6","name":"Barbara Liskov","team":"Research"},{"id":"7","name":"Margaret Hamilton","team":"Flight"}]'></c2-virtual-list>
</div>
<div data-label="Sorted">
<c2-virtual-list client:only="lit" class="list two-line" aria-label="Scores" sort="score:desc" item-key="id" label-field="name" description-field="score" items='[{"id":"1","name":"Ada Lovelace 1","team":"Analytics","score":10000},{"id":"2","name":"Grace Hopper 2","team":"Compilers","score":17919},{"id":"3","name":"Alan Turing 3","team":"Research","score":25838},{"id":"4","name":"Katherine Johnson 4","team":"Flight","score":33757},{"id":"5","name":"Radia Perlman 5","team":"Networks","score":41676},{"id":"6","name":"Barbara Liskov 6","team":"Analytics","score":49595},{"id":"7","name":"Margaret Hamilton 7","team":"Compilers","score":57514},{"id":"8","name":"Ada Lovelace 8","team":"Research","score":65433},{"id":"9","name":"Grace Hopper 9","team":"Flight","score":73352},{"id":"10","name":"Alan Turing 10","team":"Networks","score":81271},{"id":"11","name":"Katherine Johnson 11","team":"Analytics","score":89190},{"id":"12","name":"Radia Perlman 12","team":"Compilers","score":97109},{"id":"13","name":"Barbara Liskov 13","team":"Research","score":15028},{"id":"14","name":"Margaret Hamilton 14","team":"Flight","score":22947},{"id":"15","name":"Ada Lovelace 15","team":"Networks","score":30866},{"id":"16","name":"Grace Hopper 16","team":"Analytics","score":38785},{"id":"17","name":"Alan Turing 17","team":"Compilers","score":46704},{"id":"18","name":"Katherine Johnson 18","team":"Research","score":54623},{"id":"19","name":"Radia Perlman 19","team":"Flight","score":62542},{"id":"20","name":"Barbara Liskov 20","team":"Networks","score":70461},{"id":"21","name":"Margaret Hamilton 21","team":"Analytics","score":78380},{"id":"22","name":"Ada Lovelace 22","team":"Compilers","score":86299},{"id":"23","name":"Grace Hopper 23","team":"Research","score":94218},{"id":"24","name":"Alan Turing 24","team":"Flight","score":12137},{"id":"25","name":"Katherine Johnson 25","team":"Networks","score":20056},{"id":"26","name":"Radia Perlman 26","team":"Analytics","score":27975},{"id":"27","name":"Barbara Liskov 27","team":"Compilers","score":35894},{"id":"28","name":"Margaret Hamilton 28","team":"Research","score":43813},{"id":"29","name":"Ada Lovelace 29","team":"Flight","score":51732},{"id":"30","name":"Grace Hopper 30","team":"Networks","score":59651},{"id":"31","name":"Alan Turing 31","team":"Analytics","score":67570},{"id":"32","name":"Katherine Johnson 32","team":"Compilers","score":75489},{"id":"33","name":"Radia Perlman 33","team":"Research","score":83408},{"id":"34","name":"Barbara Liskov 34","team":"Flight","score":91327},{"id":"35","name":"Margaret Hamilton 35","team":"Networks","score":99246},{"id":"36","name":"Ada Lovelace 36","team":"Analytics","score":17165},{"id":"37","name":"Grace Hopper 37","team":"Compilers","score":25084},{"id":"38","name":"Alan Turing 38","team":"Research","score":33003},{"id":"39","name":"Katherine Johnson 39","team":"Flight","score":40922},{"id":"40","name":"Radia Perlman 40","team":"Networks","score":48841},{"id":"41","name":"Barbara Liskov 41","team":"Analytics","score":56760},{"id":"42","name":"Margaret Hamilton 42","team":"Compilers","score":64679},{"id":"43","name":"Ada Lovelace 43","team":"Research","score":72598},{"id":"44","name":"Grace Hopper 44","team":"Flight","score":80517},{"id":"45","name":"Alan Turing 45","team":"Networks","score":88436},{"id":"46","name":"Katherine Johnson 46","team":"Analytics","score":96355},{"id":"47","name":"Radia Perlman 47","team":"Compilers","score":14274},{"id":"48","name":"Barbara Liskov 48","team":"Research","score":22193},{"id":"49","name":"Margaret Hamilton 49","team":"Flight","score":30112},{"id":"50","name":"Ada Lovelace 50","team":"Networks","score":38031},{"id":"51","name":"Grace Hopper 51","team":"Analytics","score":45950},{"id":"52","name":"Alan Turing 52","team":"Compilers","score":53869},{"id":"53","name":"Katherine Johnson 53","team":"Research","score":61788},{"id":"54","name":"Radia Perlman 54","team":"Flight","score":69707},{"id":"55","name":"Barbara Liskov 55","team":"Networks","score":77626},{"id":"56","name":"Margaret Hamilton 56","team":"Analytics","score":85545},{"id":"57","name":"Ada Lovelace 57","team":"Compilers","score":93464},{"id":"58","name":"Grace Hopper 58","team":"Research","score":11383},{"id":"59","name":"Alan Turing 59","team":"Flight","score":19302},{"id":"60","name":"Katherine Johnson 60","team":"Networks","score":27221}]'></c2-virtual-list>
</div>
<div data-label="Two-line rows">
<c2-virtual-list client:only="lit" class="list two-line" aria-label="People" item-key="id" label-field="name" description-field="role" items='[{"id":"1","name":"Ada Lovelace 1","team":"Analytics","role":"Engineer","score":10000},{"id":"2","name":"Grace Hopper 2","team":"Compilers","role":"Researcher","score":17919},{"id":"3","name":"Alan Turing 3","team":"Research","role":"Designer","score":25838},{"id":"4","name":"Katherine Johnson 4","team":"Flight","role":"Analyst","score":33757},{"id":"5","name":"Radia Perlman 5","team":"Networks","role":"Architect","score":41676},{"id":"6","name":"Barbara Liskov 6","team":"Analytics","role":"Engineer","score":49595},{"id":"7","name":"Margaret Hamilton 7","team":"Compilers","role":"Researcher","score":57514},{"id":"8","name":"Ada Lovelace 8","team":"Research","role":"Designer","score":65433},{"id":"9","name":"Grace Hopper 9","team":"Flight","role":"Analyst","score":73352},{"id":"10","name":"Alan Turing 10","team":"Networks","role":"Architect","score":81271},{"id":"11","name":"Katherine Johnson 11","team":"Analytics","role":"Engineer","score":89190},{"id":"12","name":"Radia Perlman 12","team":"Compilers","role":"Researcher","score":97109},{"id":"13","name":"Barbara Liskov 13","team":"Research","role":"Designer","score":15028},{"id":"14","name":"Margaret Hamilton 14","team":"Flight","role":"Analyst","score":22947},{"id":"15","name":"Ada Lovelace 15","team":"Networks","role":"Architect","score":30866},{"id":"16","name":"Grace Hopper 16","team":"Analytics","role":"Engineer","score":38785},{"id":"17","name":"Alan Turing 17","team":"Compilers","role":"Researcher","score":46704},{"id":"18","name":"Katherine Johnson 18","team":"Research","role":"Designer","score":54623},{"id":"19","name":"Radia Perlman 19","team":"Flight","role":"Analyst","score":62542},{"id":"20","name":"Barbara Liskov 20","team":"Networks","role":"Architect","score":70461},{"id":"21","name":"Margaret Hamilton 21","team":"Analytics","role":"Engineer","score":78380},{"id":"22","name":"Ada Lovelace 22","team":"Compilers","role":"Researcher","score":86299},{"id":"23","name":"Grace Hopper 23","team":"Research","role":"Designer","score":94218},{"id":"24","name":"Alan Turing 24","team":"Flight","role":"Analyst","score":12137},{"id":"25","name":"Katherine Johnson 25","team":"Networks","role":"Architect","score":20056},{"id":"26","name":"Radia Perlman 26","team":"Analytics","role":"Engineer","score":27975},{"id":"27","name":"Barbara Liskov 27","team":"Compilers","role":"Researcher","score":35894},{"id":"28","name":"Margaret Hamilton 28","team":"Research","role":"Designer","score":43813},{"id":"29","name":"Ada Lovelace 29","team":"Flight","role":"Analyst","score":51732},{"id":"30","name":"Grace Hopper 30","team":"Networks","role":"Architect","score":59651},{"id":"31","name":"Alan Turing 31","team":"Analytics","role":"Engineer","score":67570},{"id":"32","name":"Katherine Johnson 32","team":"Compilers","role":"Researcher","score":75489},{"id":"33","name":"Radia Perlman 33","team":"Research","role":"Designer","score":83408},{"id":"34","name":"Barbara Liskov 34","team":"Flight","role":"Analyst","score":91327},{"id":"35","name":"Margaret Hamilton 35","team":"Networks","role":"Architect","score":99246},{"id":"36","name":"Ada Lovelace 36","team":"Analytics","role":"Engineer","score":17165},{"id":"37","name":"Grace Hopper 37","team":"Compilers","role":"Researcher","score":25084},{"id":"38","name":"Alan Turing 38","team":"Research","role":"Designer","score":33003},{"id":"39","name":"Katherine Johnson 39","team":"Flight","role":"Analyst","score":40922},{"id":"40","name":"Radia Perlman 40","team":"Networks","role":"Architect","score":48841},{"id":"41","name":"Barbara Liskov 41","team":"Analytics","role":"Engineer","score":56760},{"id":"42","name":"Margaret Hamilton 42","team":"Compilers","role":"Researcher","score":64679},{"id":"43","name":"Ada Lovelace 43","team":"Research","role":"Designer","score":72598},{"id":"44","name":"Grace Hopper 44","team":"Flight","role":"Analyst","score":80517},{"id":"45","name":"Alan Turing 45","team":"Networks","role":"Architect","score":88436},{"id":"46","name":"Katherine Johnson 46","team":"Analytics","role":"Engineer","score":96355},{"id":"47","name":"Radia Perlman 47","team":"Compilers","role":"Researcher","score":14274},{"id":"48","name":"Barbara Liskov 48","team":"Research","role":"Designer","score":22193},{"id":"49","name":"Margaret Hamilton 49","team":"Flight","role":"Analyst","score":30112},{"id":"50","name":"Ada Lovelace 50","team":"Networks","role":"Architect","score":38031},{"id":"51","name":"Grace Hopper 51","team":"Analytics","role":"Engineer","score":45950},{"id":"52","name":"Alan Turing 52","team":"Compilers","role":"Researcher","score":53869},{"id":"53","name":"Katherine Johnson 53","team":"Research","role":"Designer","score":61788},{"id":"54","name":"Radia Perlman 54","team":"Flight","role":"Analyst","score":69707},{"id":"55","name":"Barbara Liskov 55","team":"Networks","role":"Architect","score":77626},{"id":"56","name":"Margaret Hamilton 56","team":"Analytics","role":"Engineer","score":85545},{"id":"57","name":"Ada Lovelace 57","team":"Compilers","role":"Researcher","score":93464},{"id":"58","name":"Grace Hopper 58","team":"Research","role":"Designer","score":11383},{"id":"59","name":"Alan Turing 59","team":"Flight","role":"Analyst","score":19302},{"id":"60","name":"Katherine Johnson 60","team":"Networks","role":"Architect","score":27221}]'></c2-virtual-list>
</div>
<div data-label="Dense rows">
<c2-virtual-list client:only="lit" class="list dense" aria-label="People" item-key="id" label-field="name" items='[{"id":"1","name":"Ada Lovelace 1","team":"Analytics","role":"Engineer","score":10000},{"id":"2","name":"Grace Hopper 2","team":"Compilers","role":"Researcher","score":17919},{"id":"3","name":"Alan Turing 3","team":"Research","role":"Designer","score":25838},{"id":"4","name":"Katherine Johnson 4","team":"Flight","role":"Analyst","score":33757},{"id":"5","name":"Radia Perlman 5","team":"Networks","role":"Architect","score":41676},{"id":"6","name":"Barbara Liskov 6","team":"Analytics","role":"Engineer","score":49595},{"id":"7","name":"Margaret Hamilton 7","team":"Compilers","role":"Researcher","score":57514},{"id":"8","name":"Ada Lovelace 8","team":"Research","role":"Designer","score":65433},{"id":"9","name":"Grace Hopper 9","team":"Flight","role":"Analyst","score":73352},{"id":"10","name":"Alan Turing 10","team":"Networks","role":"Architect","score":81271},{"id":"11","name":"Katherine Johnson 11","team":"Analytics","role":"Engineer","score":89190},{"id":"12","name":"Radia Perlman 12","team":"Compilers","role":"Researcher","score":97109},{"id":"13","name":"Barbara Liskov 13","team":"Research","role":"Designer","score":15028},{"id":"14","name":"Margaret Hamilton 14","team":"Flight","role":"Analyst","score":22947},{"id":"15","name":"Ada Lovelace 15","team":"Networks","role":"Architect","score":30866},{"id":"16","name":"Grace Hopper 16","team":"Analytics","role":"Engineer","score":38785},{"id":"17","name":"Alan Turing 17","team":"Compilers","role":"Researcher","score":46704},{"id":"18","name":"Katherine Johnson 18","team":"Research","role":"Designer","score":54623},{"id":"19","name":"Radia Perlman 19","team":"Flight","role":"Analyst","score":62542},{"id":"20","name":"Barbara Liskov 20","team":"Networks","role":"Architect","score":70461},{"id":"21","name":"Margaret Hamilton 21","team":"Analytics","role":"Engineer","score":78380},{"id":"22","name":"Ada Lovelace 22","team":"Compilers","role":"Researcher","score":86299},{"id":"23","name":"Grace Hopper 23","team":"Research","role":"Designer","score":94218},{"id":"24","name":"Alan Turing 24","team":"Flight","role":"Analyst","score":12137},{"id":"25","name":"Katherine Johnson 25","team":"Networks","role":"Architect","score":20056},{"id":"26","name":"Radia Perlman 26","team":"Analytics","role":"Engineer","score":27975},{"id":"27","name":"Barbara Liskov 27","team":"Compilers","role":"Researcher","score":35894},{"id":"28","name":"Margaret Hamilton 28","team":"Research","role":"Designer","score":43813},{"id":"29","name":"Ada Lovelace 29","team":"Flight","role":"Analyst","score":51732},{"id":"30","name":"Grace Hopper 30","team":"Networks","role":"Architect","score":59651},{"id":"31","name":"Alan Turing 31","team":"Analytics","role":"Engineer","score":67570},{"id":"32","name":"Katherine Johnson 32","team":"Compilers","role":"Researcher","score":75489},{"id":"33","name":"Radia Perlman 33","team":"Research","role":"Designer","score":83408},{"id":"34","name":"Barbara Liskov 34","team":"Flight","role":"Analyst","score":91327},{"id":"35","name":"Margaret Hamilton 35","team":"Networks","role":"Architect","score":99246},{"id":"36","name":"Ada Lovelace 36","team":"Analytics","role":"Engineer","score":17165},{"id":"37","name":"Grace Hopper 37","team":"Compilers","role":"Researcher","score":25084},{"id":"38","name":"Alan Turing 38","team":"Research","role":"Designer","score":33003},{"id":"39","name":"Katherine Johnson 39","team":"Flight","role":"Analyst","score":40922},{"id":"40","name":"Radia Perlman 40","team":"Networks","role":"Architect","score":48841},{"id":"41","name":"Barbara Liskov 41","team":"Analytics","role":"Engineer","score":56760},{"id":"42","name":"Margaret Hamilton 42","team":"Compilers","role":"Researcher","score":64679},{"id":"43","name":"Ada Lovelace 43","team":"Research","role":"Designer","score":72598},{"id":"44","name":"Grace Hopper 44","team":"Flight","role":"Analyst","score":80517},{"id":"45","name":"Alan Turing 45","team":"Networks","role":"Architect","score":88436},{"id":"46","name":"Katherine Johnson 46","team":"Analytics","role":"Engineer","score":96355},{"id":"47","name":"Radia Perlman 47","team":"Compilers","role":"Researcher","score":14274},{"id":"48","name":"Barbara Liskov 48","team":"Research","role":"Designer","score":22193},{"id":"49","name":"Margaret Hamilton 49","team":"Flight","role":"Analyst","score":30112},{"id":"50","name":"Ada Lovelace 50","team":"Networks","role":"Architect","score":38031},{"id":"51","name":"Grace Hopper 51","team":"Analytics","role":"Engineer","score":45950},{"id":"52","name":"Alan Turing 52","team":"Compilers","role":"Researcher","score":53869},{"id":"53","name":"Katherine Johnson 53","team":"Research","role":"Designer","score":61788},{"id":"54","name":"Radia Perlman 54","team":"Flight","role":"Analyst","score":69707},{"id":"55","name":"Barbara Liskov 55","team":"Networks","role":"Architect","score":77626},{"id":"56","name":"Margaret Hamilton 56","team":"Analytics","role":"Engineer","score":85545},{"id":"57","name":"Ada Lovelace 57","team":"Compilers","role":"Researcher","score":93464},{"id":"58","name":"Grace Hopper 58","team":"Research","role":"Designer","score":11383},{"id":"59","name":"Alan Turing 59","team":"Flight","role":"Analyst","score":19302},{"id":"60","name":"Katherine Johnson 60","team":"Networks","role":"Architect","score":27221}]'></c2-virtual-list>
</div>
<div data-label="Disabled items">
<c2-virtual-list client:only="lit" class="list" aria-label="People" selection="single" item-key="id" label-field="name" description-field="team" disabled-field="away" items='[{"id":"1","name":"Ada Lovelace","team":"Analytics"},{"id":"2","name":"Grace Hopper","team":"Compilers","away":true},{"id":"3","name":"Alan Turing","team":"Research"},{"id":"4","name":"Katherine Johnson","team":"Flight","away":true},{"id":"5","name":"Radia Perlman","team":"Networks"}]'></c2-virtual-list>
</div>
<div data-label="Loading">
<c2-virtual-list client:only="lit" class="list" aria-label="People" loading items="[]"></c2-virtual-list>
</div>
<div data-label="Empty">
<c2-virtual-list client:only="lit" class="list" aria-label="States" empty-message="Nothing here yet" items="[]"></c2-virtual-list>
</div>Searching a million rows
With a dataSource the list holds nothing: it asks for one block at a time as rows scroll into view, and hands the query and the sort to the server. Rows whose block has not arrived render as skeletons, so the list never jumps.
const list = document.querySelector('c2-virtual-list')
list.dataSource = {
async getItems({ start, count, search, sort }) {
const response = await fetch(`/api/people?start=${start}&count=${count}&q=${search}&sort=${sort?.field ?? ''}`)
const page = await response.json()
return { items: page.rows, total: page.total }
},
}Custom rows
renderItem replaces the label/description pair with any markup — the row is still a c2-list-item, so its slots are yours.
import { html } from 'lit'
list.renderItem = ({ item }) => html`
<c2-feather-user slot="prefix-icon"></c2-feather-user>
<strong>${item.name}</strong>
<span slot="description">${item.team} · ${item.score.toLocaleString()}</span>
`