@livenetworks/ashlar 2.0.6 → 2.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +641 -641
- package/components/COMPONENTS.md +1116 -1116
- package/components/index.js +81 -81
- package/components/ln-accordion/ln-accordion-dev.scss +8 -8
- package/components/ln-accordion/ln-accordion.js +1 -1
- package/components/ln-accordion/ln-accordion.schema.json +30 -30
- package/components/ln-accordion/src/ln-accordion.js +1 -0
- package/components/ln-ajax/ln-ajax-dev.scss +8 -8
- package/components/ln-ajax/ln-ajax.js +1 -1
- package/components/ln-ajax/ln-ajax.schema.json +30 -30
- package/components/ln-api-connector/ln-api-connector.js +1 -1
- package/components/ln-api-connector/ln-api-connector.schema.json +96 -96
- package/components/ln-api-connector/src/ln-api-connector.js +1 -0
- package/components/ln-api-queue/ln-api-queue.js +1 -1
- package/components/ln-api-queue/ln-api-queue.schema.json +34 -34
- package/components/ln-api-queue/src/ln-api-queue.js +3 -13
- package/components/ln-autoresize/ln-autoresize-dev.scss +8 -8
- package/components/ln-autoresize/ln-autoresize.js +1 -1
- package/components/ln-autoresize/ln-autoresize.schema.json +22 -22
- package/components/ln-autosave/ln-autosave-dev.scss +13 -13
- package/components/ln-autosave/ln-autosave.js +1 -1
- package/components/ln-autosave/ln-autosave.schema.json +48 -48
- package/components/ln-autosave/src/autosave-model.js +34 -34
- package/components/ln-chart/ln-chart.js +1 -1
- package/components/ln-chart/ln-chart.schema.json +146 -146
- package/components/ln-chart/src/chart-model.js +154 -154
- package/components/ln-circular-progress/ln-circular-progress.js +1 -1
- package/components/ln-circular-progress/ln-circular-progress.schema.json +42 -42
- package/components/ln-confirm/ln-confirm-dev.scss +24 -24
- package/components/ln-confirm/ln-confirm.js +1 -1
- package/components/ln-confirm/ln-confirm.schema.json +66 -66
- package/components/ln-confirm/src/ln-confirm.js +178 -178
- package/components/ln-core/crypto.js +286 -265
- package/components/ln-core/dom.js +115 -115
- package/components/ln-core/form.js +136 -136
- package/components/ln-core/helpers.js +33 -33
- package/components/ln-core/http.js +48 -48
- package/components/ln-core/index.js +1 -1
- package/components/ln-core/ln-core.schema.json +109 -109
- package/components/ln-core/locale.js +55 -55
- package/components/ln-core/matching.js +78 -78
- package/components/ln-core/number.js +125 -125
- package/components/ln-core/template.js +206 -206
- package/components/ln-couchdb-connector/README.md +4 -0
- package/components/ln-couchdb-connector/ln-couchdb-connector.js +1 -1
- package/components/ln-couchdb-connector/ln-couchdb-connector.schema.json +50 -50
- package/components/ln-couchdb-connector/src/ln-couchdb-connector.js +19 -1
- package/components/ln-data-coordinator/README.md +9 -38
- package/components/ln-data-coordinator/ln-data-coordinator-dev.scss +8 -8
- package/components/ln-data-coordinator/ln-data-coordinator.js +1 -1
- package/components/ln-data-coordinator/ln-data-coordinator.schema.json +16 -16
- package/components/ln-data-coordinator/src/data-read-policy.js +0 -7
- package/components/ln-data-coordinator/src/ln-data-coordinator.js +428 -1299
- package/components/ln-data-store/README.md +3 -2
- package/components/ln-data-store/ln-data-store-dev.scss +13 -13
- package/components/ln-data-store/ln-data-store.js +1 -1
- package/components/ln-data-store/ln-data-store.schema.json +84 -84
- package/components/ln-data-store/src/data-store-model.js +184 -155
- package/components/ln-data-store/src/ln-data-store.js +58 -11
- package/components/ln-date/README.md +4 -0
- package/components/ln-date/ln-date.js +1 -1
- package/components/ln-date/ln-date.schema.json +92 -92
- package/components/ln-date/src/date-model.js +186 -186
- package/components/ln-date/src/ln-date.js +3 -3
- package/components/ln-debug/ln-debug.js +1 -1
- package/components/ln-debug/ln-debug.schema.json +28 -28
- package/components/ln-debug/src/console-sink.js +19 -19
- package/components/ln-debug/src/gate.js +95 -95
- package/components/ln-debug/src/generated-attributes.js +2 -2
- package/components/ln-dropdown/ln-dropdown-dev.scss +13 -13
- package/components/ln-dropdown/ln-dropdown.js +1 -1
- package/components/ln-dropdown/ln-dropdown.schema.json +90 -90
- package/components/ln-editor/ln-editor.js +1 -1
- package/components/ln-editor/ln-editor.schema.json +58 -58
- package/components/ln-external-links/ln-external-links.js +1 -1
- package/components/ln-external-links/ln-external-links.schema.json +18 -18
- package/components/ln-fill/ln-fill.js +1 -1
- package/components/ln-fill/ln-fill.schema.json +23 -23
- package/components/ln-filter/ln-filter.js +1 -1
- package/components/ln-filter/ln-filter.schema.json +153 -153
- package/components/ln-filter/src/filter-model.js +185 -185
- package/components/ln-form/ln-form-dev.scss +8 -8
- package/components/ln-form/ln-form.js +1 -1
- package/components/ln-form/ln-form.schema.json +45 -45
- package/components/ln-http/ln-http.js +1 -1
- package/components/ln-http/ln-http.schema.json +6 -6
- package/components/ln-icon/ln-icon.schema.json +6 -6
- package/components/ln-include/ln-include.js +1 -1
- package/components/ln-include/ln-include.schema.json +23 -23
- package/components/ln-key/ln-key-dev.scss +18 -18
- package/components/ln-key/ln-key.js +1 -1
- package/components/ln-key/ln-key.schema.json +56 -56
- package/components/ln-key/src/ln-key.js +10 -10
- package/components/ln-link/ln-link-dev.scss +8 -8
- package/components/ln-link/ln-link.js +1 -1
- package/components/ln-link/ln-link.schema.json +22 -22
- package/components/ln-list/README.md +152 -152
- package/components/ln-list/ln-list-dev.scss +8 -8
- package/components/ln-list/ln-list.js +1 -1
- package/components/ln-list/ln-list.schema.json +166 -166
- package/components/ln-list/src/ln-list.js +4 -4
- package/components/ln-modal/README.md +4 -6
- package/components/ln-modal/ln-modal.js +1 -1
- package/components/ln-modal/ln-modal.schema.json +65 -65
- package/components/ln-modal/src/ln-modal.js +28 -8
- package/components/ln-nav/ln-nav.js +1 -1
- package/components/ln-nav/ln-nav.schema.json +25 -25
- package/components/ln-number/ln-number.js +1 -1
- package/components/ln-number/ln-number.schema.json +63 -63
- package/components/ln-number/src/number-model.js +31 -31
- package/components/ln-obfuscator/README.md +60 -60
- package/components/ln-obfuscator/ln-obfuscator.js +1 -1
- package/components/ln-obfuscator/ln-obfuscator.schema.json +49 -49
- package/components/ln-obfuscator/src/ln-obfuscator.js +159 -159
- package/components/ln-obfuscator/src/obfuscator-model.js +250 -250
- package/components/ln-options/ln-options.js +1 -1
- package/components/ln-options/ln-options.schema.json +41 -41
- package/components/ln-options/src/ln-options.js +1 -0
- package/components/ln-persist/README.md +151 -151
- package/components/ln-persist/ln-persist.js +1 -1
- package/components/ln-persist/ln-persist.schema.json +28 -28
- package/components/ln-persist/src/ln-persist.js +83 -83
- package/components/ln-picklist/README.md +230 -230
- package/components/ln-picklist/ln-picklist-dev.scss +22 -22
- package/components/ln-picklist/ln-picklist.js +1 -1
- package/components/ln-picklist/ln-picklist.schema.json +49 -49
- package/components/ln-picklist/src/ln-picklist.js +228 -228
- package/components/ln-popover/README.md +4 -0
- package/components/ln-popover/ln-popover-dev.scss +13 -13
- package/components/ln-popover/ln-popover.js +1 -1
- package/components/ln-popover/ln-popover.schema.json +82 -82
- package/components/ln-popover/src/ln-popover.js +9 -0
- package/components/ln-progress/ln-progress-dev.scss +8 -8
- package/components/ln-progress/ln-progress.js +1 -1
- package/components/ln-progress/ln-progress.schema.json +40 -40
- package/components/ln-router/ln-router.js +1 -1
- package/components/ln-router/ln-router.schema.json +76 -76
- package/components/ln-scroll/README.md +45 -45
- package/components/ln-scroll/ln-scroll.js +1 -1
- package/components/ln-scroll/ln-scroll.schema.json +85 -85
- package/components/ln-scroll/src/ln-scroll.js +150 -150
- package/components/ln-search/README.md +188 -188
- package/components/ln-search/ln-search.js +1 -1
- package/components/ln-search/ln-search.schema.json +103 -103
- package/components/ln-slug/ln-slug.js +1 -1
- package/components/ln-slug/ln-slug.schema.json +23 -23
- package/components/ln-sort/ln-sort.js +1 -1
- package/components/ln-sort/ln-sort.schema.json +104 -104
- package/components/ln-sort/src/ln-sort.js +321 -321
- package/components/ln-sort/src/sort-model.js +117 -117
- package/components/ln-sortable/ln-sortable-dev.scss +13 -13
- package/components/ln-sortable/ln-sortable.js +1 -1
- package/components/ln-sortable/ln-sortable.schema.json +36 -36
- package/components/ln-stat/ln-stat-dev.scss +8 -8
- package/components/ln-stat/ln-stat.js +1 -1
- package/components/ln-stat/ln-stat.schema.json +32 -32
- package/components/ln-stat/src/stat-model.js +28 -28
- package/components/ln-table/ln-table.js +1 -1
- package/components/ln-table/ln-table.schema.json +211 -211
- package/components/ln-table/src/ln-table.js +2 -0
- package/components/ln-table/src/table-model.js +98 -98
- package/components/ln-table-coordinator/ln-table-coordinator.js +1 -1
- package/components/ln-table-coordinator/ln-table-coordinator.schema.json +93 -93
- package/components/ln-table-coordinator/src/ln-table-coordinator.js +3 -3
- package/components/ln-tabs/README.md +2 -2
- package/components/ln-tabs/ln-tabs.js +1 -1
- package/components/ln-tabs/ln-tabs.schema.json +75 -75
- package/components/ln-tabs/src/ln-tabs.js +208 -207
- package/components/ln-tabs/src/tabs-model.js +82 -82
- package/components/ln-time/ln-time-dev.scss +13 -13
- package/components/ln-time/ln-time.js +1 -1
- package/components/ln-time/ln-time.schema.json +38 -38
- package/components/ln-toast/ln-toast.js +1 -1
- package/components/ln-toast/ln-toast.schema.json +65 -65
- package/components/ln-toggle/ln-toggle.js +1 -1
- package/components/ln-toggle/ln-toggle.schema.json +52 -52
- package/components/ln-tooltip/ln-tooltip.js +1 -1
- package/components/ln-tooltip/ln-tooltip.schema.json +86 -86
- package/components/ln-translations/ln-translations.js +1 -1
- package/components/ln-translations/ln-translations.schema.json +120 -120
- package/components/ln-ui-coordinator/README.md +62 -62
- package/components/ln-ui-coordinator/ln-ui-coordinator.js +1 -1
- package/components/ln-ui-coordinator/ln-ui-coordinator.schema.json +28 -28
- package/components/ln-ui-coordinator/src/ln-ui-coordinator.js +140 -140
- package/components/ln-upload/ln-upload.js +1 -1
- package/components/ln-upload/ln-upload.schema.json +193 -193
- package/components/ln-upload/src/upload-model.js +78 -78
- package/components/ln-validate/ln-validate.js +1 -1
- package/components/ln-validate/ln-validate.schema.json +50 -50
- package/components/ln-validate/src/validate-model.js +64 -64
- package/components/ln-websocket-connector/README.md +166 -166
- package/components/ln-websocket-connector/ln-websocket-connector.js +1 -1
- package/components/ln-websocket-connector/ln-websocket-connector.schema.json +29 -29
- package/components/ln-websocket-connector/src/ln-websocket-connector.js +283 -279
- package/ln-ashlar.html-data.json +7 -8
- package/package.json +84 -84
- package/theme/brand.css +73 -73
- package/theme/components/_confirm.scss +6 -6
- package/theme/components/_picklist.scss +3 -3
- package/theme/config/_palette.scss +274 -274
- package/theme/config/_theme.scss +292 -292
- package/theme/config/_tokens.scss +285 -285
- package/theme/config/mixins/_index.scss +62 -62
- package/theme/config/mixins/_picklist.scss +66 -66
- package/theme/ln-ashlar-dev.scss +66 -66
- package/theme/ln-ashlar-landing.scss +56 -56
- package/theme/ln-ashlar-theme.scss +63 -63
- package/theme/presentation/_bento.scss +151 -151
- package/theme/presentation/_cta.scss +111 -111
- package/theme/presentation/_effects.scss +216 -216
- package/theme/presentation/_features.scss +108 -108
- package/theme/presentation/_footer.scss +129 -129
- package/theme/presentation/_hero.scss +158 -158
- package/theme/presentation/_layout.scss +170 -170
- package/theme/presentation/_navbar.scss +140 -140
- package/theme/presentation/_pricing.scss +262 -262
- package/theme/presentation/_stats.scss +87 -87
- package/theme/presentation/_testimonials.scss +124 -124
- package/theme/presentation/_tokens.scss +39 -39
- package/theme/presentation/_typography.scss +163 -163
- package/web-types.json +12 -12
|
@@ -1,152 +1,152 @@
|
|
|
1
|
-
# ln-list
|
|
2
|
-
|
|
3
|
-
> Applied to a list or grid container via `data-ln-list="name"`. In SSR mode, it coordinates direct DOM search,
|
|
4
|
-
> filter, and sort interactions on its child items. In data-driven mode (`data-ln-list-source="store"`), it listens for
|
|
5
|
-
> `ln-data-store:data` CustomEvents, clones `<template data-ln-template="name-row">`, populates fields via `fill()`,
|
|
6
|
-
> and mounts rendered items into `[data-ln-list-body]` with optional virtual scroll windowing.
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## 📦 Declarative Setup in HTML
|
|
11
|
-
|
|
12
|
-
### 1. Simple SSR List
|
|
13
|
-
For a server-rendered list where the backend outputs `<li>` elements directly:
|
|
14
|
-
|
|
15
|
-
```html
|
|
16
|
-
<search aria-label="Search documents">
|
|
17
|
-
<svg class="ln-icon" aria-hidden="true"><use href="#ln-icon-search"></use></svg>
|
|
18
|
-
<input type="search" placeholder="Search..." data-ln-search-for="documents-list">
|
|
19
|
-
<button type="button" data-ln-search-clear aria-label="Clear search">
|
|
20
|
-
<svg class="ln-icon" aria-hidden="true"><use href="#ln-icon-x"></use></svg>
|
|
21
|
-
</button>
|
|
22
|
-
</search>
|
|
23
|
-
|
|
24
|
-
<ul id="documents-list" data-ln-list="documents" data-ln-search="">
|
|
25
|
-
<li data-ln-item-id="1">Document A</li>
|
|
26
|
-
<li data-ln-item-id="2">Document B</li>
|
|
27
|
-
</ul>
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
### 2. Data-Driven Grid List (with Virtual Scroll)
|
|
31
|
-
Opted-in by adding the `data-ln-list-source` attribute pointing to a `data-ln-data-store`. The search input targets the store:
|
|
32
|
-
|
|
33
|
-
```html
|
|
34
|
-
<!-- Store is the State Host for queries in Data-Driven mode -->
|
|
35
|
-
<div data-ln-data-store="documents" data-ln-search=""></div>
|
|
36
|
-
|
|
37
|
-
<search aria-label="Search documents">
|
|
38
|
-
<svg class="ln-icon" aria-hidden="true"><use href="#ln-icon-search"></use></svg>
|
|
39
|
-
<input type="search" placeholder="Search..." data-ln-search-for="documents">
|
|
40
|
-
<button type="button" data-ln-search-clear aria-label="Clear search">
|
|
41
|
-
<svg class="ln-icon" aria-hidden="true"><use href="#ln-icon-x"></use></svg>
|
|
42
|
-
</button>
|
|
43
|
-
</search>
|
|
44
|
-
|
|
45
|
-
<section id="documents-grid"
|
|
46
|
-
data-ln-list="documents"
|
|
47
|
-
data-ln-list-source="documents"
|
|
48
|
-
data-ln-list-window="1000"
|
|
49
|
-
data-ln-list-selectable>
|
|
50
|
-
|
|
51
|
-
<!-- Items container -->
|
|
52
|
-
<ul class="grid-layout" data-ln-list-body></ul>
|
|
53
|
-
|
|
54
|
-
<!-- Row Template (Must contain an element with data-ln-item attribute) -->
|
|
55
|
-
<template data-ln-template="documents-row">
|
|
56
|
-
<li data-ln-item class="card-item">
|
|
57
|
-
<header>
|
|
58
|
-
<input type="checkbox" data-ln-item-select>
|
|
59
|
-
<h3 data-ln-field="title"></h3>
|
|
60
|
-
</header>
|
|
61
|
-
<p>{{ description }}</p>
|
|
62
|
-
<button type="button" data-ln-item-action="delete">Delete</button>
|
|
63
|
-
</li>
|
|
64
|
-
</template>
|
|
65
|
-
|
|
66
|
-
<!-- Empty States -->
|
|
67
|
-
<template data-ln-template="documents-empty">
|
|
68
|
-
<div class="empty-state">No documents found.</div>
|
|
69
|
-
</template>
|
|
70
|
-
|
|
71
|
-
<template data-ln-template="documents-empty-filtered">
|
|
72
|
-
<div class="empty-state">No matching documents found.</div>
|
|
73
|
-
</template>
|
|
74
|
-
</section>
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
|
-
## 🛠️ Attributes Reference
|
|
80
|
-
|
|
81
|
-
| Attribute | Elements | Description |
|
|
82
|
-
| :--- | :--- | :--- |
|
|
83
|
-
| `data-ln-list` | Root wrapper | Component identifier. Target must carry a unique `id`. |
|
|
84
|
-
| `data-ln-list-source` | Root wrapper | Opt-in indicator for Data-Driven Mode (points to Store ID). |
|
|
85
|
-
| `data-ln-list-selectable` | Root wrapper | Enables checkbox-based item selections. |
|
|
86
|
-
| `data-ln-list-window="N"` | Root wrapper | Opt-in server-side sliding-window virtualization. `N` sets the resident-row cap (default 1000). Requires Data-Driven Mode. |
|
|
87
|
-
| `data-ln-list-window-page="N"` | Root wrapper | Chunk/page fetch size for windowed requests (default 200). |
|
|
88
|
-
| `data-ln-list-window-threshold="N"` | Root wrapper | Prefetch margin threshold in rows before reaching edge (default 25). |
|
|
89
|
-
| `data-ln-list-count="N"` | Root wrapper | Declares unfiltered grand total for windowed lists. |
|
|
90
|
-
| `data-ln-list-body` | Sub-element | Target container where items are rendered (falls back to root). |
|
|
91
|
-
| `data-ln-item` | Template element | Identifies an item root inside a template or hydrated markup. |
|
|
92
|
-
| `data-ln-item-id` | `[data-ln-item]` | Unique ID of the row item. |
|
|
93
|
-
| `data-ln-item-select` | `<input>` | Checkbox inside item template for row selection. |
|
|
94
|
-
| `data-ln-item-action="name"` | `<button>` | Item action button (dispatches `ln-list:item-action`). |
|
|
95
|
-
| `data-ln-list-select-all` | `<input>` | Global select-all checkbox for list items. |
|
|
96
|
-
| `data-ln-list-field="key"` | Sub-element | Maps element value (via `readValue()`) to record property for sorting/filtering. |
|
|
97
|
-
| `data-ln-list-total` | `<span>` | Target element to display total record count. |
|
|
98
|
-
| `data-ln-list-filtered` | `<span>` | Target element to display filtered count. |
|
|
99
|
-
| `data-ln-list-selected` | `<span>` | Target element to display active selection count. |
|
|
100
|
-
| `data-ln-list-empty` | `<template>` | Empty state template in SSR mode. |
|
|
101
|
-
| `data-ln-empty` | `<template>` | Generic empty state template in Data-Driven mode. |
|
|
102
|
-
| `data-ln-empty-when="initial\|search"` | Sub-element | Conditional empty state view inside `template[data-ln-empty]`. |
|
|
103
|
-
|
|
104
|
-
---
|
|
105
|
-
|
|
106
|
-
## ⚡ DOM Events
|
|
107
|
-
|
|
108
|
-
### Listened Events
|
|
109
|
-
|
|
110
|
-
* `ln-list:set-search` `{ query }`: Layer 1 command to set list search term.
|
|
111
|
-
* `ln-list:set-data` `{ data, total, filtered }`: Hydrates/renders the items in Data-Driven mode.
|
|
112
|
-
* `ln-list:set-loading` `{ loading: true|false }`: Toggles the loading dimming overlay class (`.ln-list--loading`).
|
|
113
|
-
* `ln-list:page-failed` `{ offset }`: Windowed mode — the coordinator reports the page fetch at `offset` failed.
|
|
114
|
-
* `ln-list:request-revalidate`: Windowed mode — asks the cache to revalidate the currently visible page after a local mutation.
|
|
115
|
-
* `ln-list:request-invalidate`: Windowed mode — invalidates window cache and resets to page 0.
|
|
116
|
-
* `ln-list:request-clear-filters`: Layer 1 command to clear search and active filters.
|
|
117
|
-
* `ln-search:change` `{ term }`: Top-level search change. In Data-Driven mode, triggers query refetch via `_requestData()`. In SSR mode, filters in-memory records and updates DOM.
|
|
118
|
-
* `ln-filter:change` `{ key, values }`: SSR mode — filters in-memory records by field / data attributes.
|
|
119
|
-
* `ln-sort:change` `{ field, direction }`: In Data-Driven mode, sets `currentSort` and triggers query refetch via `_requestData()`. In SSR mode, sorts in-memory records and updates virtual scroll.
|
|
120
|
-
|
|
121
|
-
### Emitted Events
|
|
122
|
-
|
|
123
|
-
* `ln-list:request-data` `{ list, sort, filters, search }`: Requests data query from the Coordinator. When windowed, includes `{ offset, limit, queryGen }`.
|
|
124
|
-
* `ln-list:search` `{ list, query }`: Fired in Data-Driven mode when search term updates.
|
|
125
|
-
* `ln-list:ready` `{ total }`: Fired when initial markup parsing completes.
|
|
126
|
-
* `ln-list:rendered` `{ list, total, visible }`: Fired after items have been drawn to DOM.
|
|
127
|
-
* `ln-list:filter` `{ term, matched, total }`: Fired in SSR mode when search/filter narrows visible items.
|
|
128
|
-
* `ln-list:sorted` `{ field, direction, matched, total }`: Fired in SSR mode when items are sorted.
|
|
129
|
-
* `ln-list:item-click` `{ list, id, record }`: Fired when clicking item body (excluding buttons, anchors, inputs).
|
|
130
|
-
* `ln-list:item-action` `{ list, id, action, record }`: Fired when clicking `[data-ln-item-action]`.
|
|
131
|
-
* `ln-list:select` `{ list, selectedIds, count }`: Fired when selection updates.
|
|
132
|
-
* `ln-list:select-all` `{ list, selected: true|false }`: Fired when select-all triggers.
|
|
133
|
-
* `ln-list:empty` `{ term, total }`: Fired when the list becomes empty.
|
|
134
|
-
* `ln-list:clear-filters` `{ list }`: Fired in Data-Driven mode when filters are cleared.
|
|
135
|
-
|
|
136
|
-
---
|
|
137
|
-
|
|
138
|
-
## 🔧 Internals
|
|
139
|
-
|
|
140
|
-
Source: `components/ln-list/src/ln-list.js`.
|
|
141
|
-
|
|
142
|
-
### Spacer element matches container semantics
|
|
143
|
-
|
|
144
|
-
Virtual scroll needs top/bottom spacer elements to preserve scroll height without rendering off-screen rows. If `[data-ln-list-body]` is a `<ul>`/`<ol>`, spacers are `<li class="ln-list__spacer" aria-hidden="true">` to stay HTML5-valid and accessible; any other container gets `<div class="ln-list__spacer" aria-hidden="true">`.
|
|
145
|
-
|
|
146
|
-
### Slice / Windowed virtualization
|
|
147
|
-
|
|
148
|
-
When windowed virtualization is enabled (`data-ln-list-window`), `ln-list` operates with slice rendering via `createWindowCache`. Only a sliding window of records is kept resident in the view. When the user scrolls, `ln-list` renders placeholder items for records that are not yet loaded and dispatches `ln-list:request-data` with `{ offset, limit }` to fetch the missing slice from the coordinator.
|
|
149
|
-
|
|
150
|
-
### `_parseChildren()`
|
|
151
|
-
|
|
152
|
-
Parses static children inside `[data-ln-list-body]` into `this._data` at mount (excluding existing spacers), extracting `searchText` and structured values via `readValue()` (`data-ln-value`), and measures the first child's height for `this._itemHeight`.
|
|
1
|
+
# ln-list
|
|
2
|
+
|
|
3
|
+
> Applied to a list or grid container via `data-ln-list="name"`. In SSR mode, it coordinates direct DOM search,
|
|
4
|
+
> filter, and sort interactions on its child items. In data-driven mode (`data-ln-list-source="store"`), it listens for
|
|
5
|
+
> `ln-data-store:data` CustomEvents, clones `<template data-ln-template="name-row">`, populates fields via `fill()`,
|
|
6
|
+
> and mounts rendered items into `[data-ln-list-body]` with optional virtual scroll windowing.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 📦 Declarative Setup in HTML
|
|
11
|
+
|
|
12
|
+
### 1. Simple SSR List
|
|
13
|
+
For a server-rendered list where the backend outputs `<li>` elements directly:
|
|
14
|
+
|
|
15
|
+
```html
|
|
16
|
+
<search aria-label="Search documents">
|
|
17
|
+
<svg class="ln-icon" aria-hidden="true"><use href="#ln-icon-search"></use></svg>
|
|
18
|
+
<input type="search" placeholder="Search..." data-ln-search-for="documents-list">
|
|
19
|
+
<button type="button" data-ln-search-clear aria-label="Clear search">
|
|
20
|
+
<svg class="ln-icon" aria-hidden="true"><use href="#ln-icon-x"></use></svg>
|
|
21
|
+
</button>
|
|
22
|
+
</search>
|
|
23
|
+
|
|
24
|
+
<ul id="documents-list" data-ln-list="documents" data-ln-search="">
|
|
25
|
+
<li data-ln-item-id="1">Document A</li>
|
|
26
|
+
<li data-ln-item-id="2">Document B</li>
|
|
27
|
+
</ul>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 2. Data-Driven Grid List (with Virtual Scroll)
|
|
31
|
+
Opted-in by adding the `data-ln-list-source` attribute pointing to a `data-ln-data-store`. The search input targets the store:
|
|
32
|
+
|
|
33
|
+
```html
|
|
34
|
+
<!-- Store is the State Host for queries in Data-Driven mode -->
|
|
35
|
+
<div data-ln-data-store="documents" data-ln-search=""></div>
|
|
36
|
+
|
|
37
|
+
<search aria-label="Search documents">
|
|
38
|
+
<svg class="ln-icon" aria-hidden="true"><use href="#ln-icon-search"></use></svg>
|
|
39
|
+
<input type="search" placeholder="Search..." data-ln-search-for="documents">
|
|
40
|
+
<button type="button" data-ln-search-clear aria-label="Clear search">
|
|
41
|
+
<svg class="ln-icon" aria-hidden="true"><use href="#ln-icon-x"></use></svg>
|
|
42
|
+
</button>
|
|
43
|
+
</search>
|
|
44
|
+
|
|
45
|
+
<section id="documents-grid"
|
|
46
|
+
data-ln-list="documents"
|
|
47
|
+
data-ln-list-source="documents"
|
|
48
|
+
data-ln-list-window="1000"
|
|
49
|
+
data-ln-list-selectable>
|
|
50
|
+
|
|
51
|
+
<!-- Items container -->
|
|
52
|
+
<ul class="grid-layout" data-ln-list-body></ul>
|
|
53
|
+
|
|
54
|
+
<!-- Row Template (Must contain an element with data-ln-item attribute) -->
|
|
55
|
+
<template data-ln-template="documents-row">
|
|
56
|
+
<li data-ln-item class="card-item">
|
|
57
|
+
<header>
|
|
58
|
+
<input type="checkbox" data-ln-item-select>
|
|
59
|
+
<h3 data-ln-field="title"></h3>
|
|
60
|
+
</header>
|
|
61
|
+
<p>{{ description }}</p>
|
|
62
|
+
<button type="button" data-ln-item-action="delete">Delete</button>
|
|
63
|
+
</li>
|
|
64
|
+
</template>
|
|
65
|
+
|
|
66
|
+
<!-- Empty States -->
|
|
67
|
+
<template data-ln-template="documents-empty">
|
|
68
|
+
<div class="empty-state">No documents found.</div>
|
|
69
|
+
</template>
|
|
70
|
+
|
|
71
|
+
<template data-ln-template="documents-empty-filtered">
|
|
72
|
+
<div class="empty-state">No matching documents found.</div>
|
|
73
|
+
</template>
|
|
74
|
+
</section>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 🛠️ Attributes Reference
|
|
80
|
+
|
|
81
|
+
| Attribute | Elements | Description |
|
|
82
|
+
| :--- | :--- | :--- |
|
|
83
|
+
| `data-ln-list` | Root wrapper | Component identifier. Target must carry a unique `id`. |
|
|
84
|
+
| `data-ln-list-source` | Root wrapper | Opt-in indicator for Data-Driven Mode (points to Store ID). |
|
|
85
|
+
| `data-ln-list-selectable` | Root wrapper | Enables checkbox-based item selections. |
|
|
86
|
+
| `data-ln-list-window="N"` | Root wrapper | Opt-in server-side sliding-window virtualization. `N` sets the resident-row cap (default 1000). Requires Data-Driven Mode. |
|
|
87
|
+
| `data-ln-list-window-page="N"` | Root wrapper | Chunk/page fetch size for windowed requests (default 200). |
|
|
88
|
+
| `data-ln-list-window-threshold="N"` | Root wrapper | Prefetch margin threshold in rows before reaching edge (default 25). |
|
|
89
|
+
| `data-ln-list-count="N"` | Root wrapper | Declares unfiltered grand total for windowed lists. |
|
|
90
|
+
| `data-ln-list-body` | Sub-element | Target container where items are rendered (falls back to root). |
|
|
91
|
+
| `data-ln-item` | Template element | Identifies an item root inside a template or hydrated markup. |
|
|
92
|
+
| `data-ln-item-id` | `[data-ln-item]` | Unique ID of the row item. |
|
|
93
|
+
| `data-ln-item-select` | `<input>` | Checkbox inside item template for row selection. |
|
|
94
|
+
| `data-ln-item-action="name"` | `<button>` | Item action button (dispatches `ln-list:item-action`). |
|
|
95
|
+
| `data-ln-list-select-all` | `<input>` | Global select-all checkbox for list items. |
|
|
96
|
+
| `data-ln-list-field="key"` | Sub-element | Maps element value (via `readValue()`) to record property for sorting/filtering. |
|
|
97
|
+
| `data-ln-list-total` | `<span>` | Target element to display total record count. |
|
|
98
|
+
| `data-ln-list-filtered` | `<span>` | Target element to display filtered count. |
|
|
99
|
+
| `data-ln-list-selected` | `<span>` | Target element to display active selection count. |
|
|
100
|
+
| `data-ln-list-empty` | `<template>` | Empty state template in SSR mode. |
|
|
101
|
+
| `data-ln-empty` | `<template>` | Generic empty state template in Data-Driven mode. |
|
|
102
|
+
| `data-ln-empty-when="initial\|search"` | Sub-element | Conditional empty state view inside `template[data-ln-empty]`. |
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## ⚡ DOM Events
|
|
107
|
+
|
|
108
|
+
### Listened Events
|
|
109
|
+
|
|
110
|
+
* `ln-list:set-search` `{ query }`: Layer 1 command to set list search term.
|
|
111
|
+
* `ln-list:set-data` `{ data, total, filtered }`: Hydrates/renders the items in Data-Driven mode.
|
|
112
|
+
* `ln-list:set-loading` `{ loading: true|false }`: Toggles the loading dimming overlay class (`.ln-list--loading`).
|
|
113
|
+
* `ln-list:page-failed` `{ offset }`: Windowed mode — the coordinator reports the page fetch at `offset` failed.
|
|
114
|
+
* `ln-list:request-revalidate`: Windowed mode — asks the cache to revalidate the currently visible page after a local mutation.
|
|
115
|
+
* `ln-list:request-invalidate`: Windowed mode — invalidates window cache and resets to page 0.
|
|
116
|
+
* `ln-list:request-clear-filters`: Layer 1 command to clear search and active filters.
|
|
117
|
+
* `ln-search:change` `{ term }`: Top-level search change. In Data-Driven mode, triggers query refetch via `_requestData()`. In SSR mode, filters in-memory records and updates DOM.
|
|
118
|
+
* `ln-filter:change` `{ key, values }`: SSR mode — filters in-memory records by field / data attributes.
|
|
119
|
+
* `ln-sort:change` `{ field, direction }`: In Data-Driven mode, sets `currentSort` and triggers query refetch via `_requestData()`. In SSR mode, sorts in-memory records and updates virtual scroll.
|
|
120
|
+
|
|
121
|
+
### Emitted Events
|
|
122
|
+
|
|
123
|
+
* `ln-list:request-data` `{ list, sort, filters, search }`: Requests data query from the Coordinator. When windowed, includes `{ offset, limit, queryGen }`.
|
|
124
|
+
* `ln-list:search` `{ list, query }`: Fired in Data-Driven mode when search term updates.
|
|
125
|
+
* `ln-list:ready` `{ total }`: Fired when initial markup parsing completes.
|
|
126
|
+
* `ln-list:rendered` `{ list, total, visible }`: Fired after items have been drawn to DOM.
|
|
127
|
+
* `ln-list:filter` `{ term, matched, total }`: Fired in SSR mode when search/filter narrows visible items.
|
|
128
|
+
* `ln-list:sorted` `{ field, direction, matched, total }`: Fired in SSR mode when items are sorted.
|
|
129
|
+
* `ln-list:item-click` `{ list, id, record }`: Fired when clicking item body (excluding buttons, anchors, inputs).
|
|
130
|
+
* `ln-list:item-action` `{ list, id, action, record }`: Fired when clicking `[data-ln-item-action]`.
|
|
131
|
+
* `ln-list:select` `{ list, selectedIds, count }`: Fired when selection updates.
|
|
132
|
+
* `ln-list:select-all` `{ list, selected: true|false }`: Fired when select-all triggers.
|
|
133
|
+
* `ln-list:empty` `{ term, total }`: Fired when the list becomes empty.
|
|
134
|
+
* `ln-list:clear-filters` `{ list }`: Fired in Data-Driven mode when filters are cleared.
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## 🔧 Internals
|
|
139
|
+
|
|
140
|
+
Source: `components/ln-list/src/ln-list.js`.
|
|
141
|
+
|
|
142
|
+
### Spacer element matches container semantics
|
|
143
|
+
|
|
144
|
+
Virtual scroll needs top/bottom spacer elements to preserve scroll height without rendering off-screen rows. If `[data-ln-list-body]` is a `<ul>`/`<ol>`, spacers are `<li class="ln-list__spacer" aria-hidden="true">` to stay HTML5-valid and accessible; any other container gets `<div class="ln-list__spacer" aria-hidden="true">`.
|
|
145
|
+
|
|
146
|
+
### Slice / Windowed virtualization
|
|
147
|
+
|
|
148
|
+
When windowed virtualization is enabled (`data-ln-list-window`), `ln-list` operates with slice rendering via `createWindowCache`. Only a sliding window of records is kept resident in the view. When the user scrolls, `ln-list` renders placeholder items for records that are not yet loaded and dispatches `ln-list:request-data` with `{ offset, limit }` to fetch the missing slice from the coordinator.
|
|
149
|
+
|
|
150
|
+
### `_parseChildren()`
|
|
151
|
+
|
|
152
|
+
Parses static children inside `[data-ln-list-body]` into `this._data` at mount (excluding existing spacers), extracting `searchText` and structured values via `readValue()` (`data-ln-value`), and measures the first child's height for `this._itemHeight`.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
@use '../../theme/config/mixins' as *;
|
|
2
|
-
|
|
3
|
-
[data-ln-debug] {
|
|
4
|
-
// 1. List Integration: missing ID warning for sort/search mapping
|
|
5
|
-
[data-ln-list]:not([id]) {
|
|
6
|
-
@include dev-dom-error("[data-ln-list] is missing a required 'id' attribute for sort/search mapping.");
|
|
7
|
-
}
|
|
8
|
-
}
|
|
1
|
+
@use '../../theme/config/mixins' as *;
|
|
2
|
+
|
|
3
|
+
[data-ln-debug] {
|
|
4
|
+
// 1. List Integration: missing ID warning for sort/search mapping
|
|
5
|
+
[data-ln-list]:not([id]) {
|
|
6
|
+
@include dev-dom-error("[data-ln-list] is missing a required 'id' attribute for sort/search mapping.");
|
|
7
|
+
}
|
|
8
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(){"use strict";function X(){return typeof window>"u"?!1:window.lnDebug===!0||window.lnCore&&window.lnCore._debugSink?!0:typeof document<"u"&&document.body?document.body.hasAttribute("data-ln-debug")||document.body.querySelector("[data-ln-debug]")!==null:!1}function j(t){if(typeof window>"u")return!1;if(window.lnDebug===!0)return!0;if(window.lnCore&&window.lnCore._debugIsContained)return t?window.lnCore._debugIsContained(t):window.lnCore._debugSink!==null;if(t&&t.closest){const i=t.closest("[data-ln-debug]");return!(!i||typeof document<"u"&&i===document.documentElement)}return typeof document<"u"&&document.body?document.body.hasAttribute("data-ln-debug"):!1}if(typeof window<"u"&&(window.lnCore=window.lnCore||{},!window.lnCore._warnBound)){window.lnCore._warnBound=!0;const t=console.warn;console.warn=function(...i){if(typeof i[0]=="string"&&(i[0].startsWith("[ln-")||i[0].startsWith("[lnCore"))){let s=null;for(let a=1;a<i.length;a++)if(i[a]&&i[a].nodeType===1){s=i[a];break}if(!j(s))return}t.apply(console,i)}}function D(t,i,r){const s=r||{};window.lnCore._debugSink&&window.lnCore._debugSink("event",i,t,s),t.dispatchEvent(new CustomEvent(i,{bubbles:!0,detail:s}))}function ut(t,i,r){t._applyFilterAndSort(),t._vStart=-1,t._vEnd=-1,t._render(),t._updateFooter();const s={sort:t.currentSort,filters:t.currentFilters,search:t.currentSearch};s[r]=t.name,D(t.dom,i,s)}function $(t,i){if(!document.body){document.addEventListener("DOMContentLoaded",function(){$(t,i)}),console.warn("["+i+'] Script loaded before <body> — add "defer" to your <script> tag');return}t()}function Z(t){return t.hasAttribute("data-ln-value")?t.getAttribute("data-ln-value"):t.tagName==="TIME"&&t.hasAttribute("datetime")?t.getAttribute("datetime"):t.tagName==="DATA"&&t.hasAttribute("value")?t.getAttribute("value"):t.textContent.trim()}const tt={};function ht(t,i){tt[t]=i}function ft(t){return tt[t]||{ingress:i=>i,egress:i=>i}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerDataMapper=ht,window.lnCore.getDataMapper=ft);function et(t){const i=t?t.closest("[lang]"):null,r=(i?i.getAttribute("lang")||i.lang:null)||(typeof document<"u"&&document.documentElement?document.documentElement.getAttribute("lang")||document.documentElement.lang:null)||(typeof navigator<"u"?navigator.language:null);return r?r.trim():"en-US"}function _t(){typeof window>"u"||(window.lnCore=window.lnCore||{},!window.lnCore._localeObserverBound&&(window.lnCore._localeObserverBound=!0,$(function(){new MutationObserver(function(){D(document,"ln-core:locale-change",{})}).observe(document.documentElement,{attributes:!0,attributeFilter:["lang"],subtree:!0})},"ln-core")))}const nt={};function pt(t,i){if(!t||typeof i!="object")return;const r=t.toLowerCase().split("-")[0];nt[r]=i}function gt(t){if(!t)return null;const i=t.toLowerCase().split("-")[0];return nt[i]||null}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerLocaleFallback=pt,window.lnCore.getLocaleFallback=gt,window.lnCore.ensureLocaleObserver=_t);const G={};function it(t,i){G[t]||(G[t]=document.querySelector('[data-ln-template="'+t+'"]'));const r=G[t];return r?r.content.cloneNode(!0):(console.warn("["+(i||"ln-core")+'] Template "'+t+'" not found'),null)}function lt(t,i,r){if(t){const s=t.querySelector('[data-ln-template="'+i+'"]');if(s)return s.content.cloneNode(!0)}return it(i,r)}function P(t,i){if(!t||!i)return t;const r=t.querySelectorAll("[data-ln-field]");for(let u=0;u<r.length;u++){const h=r[u],f=h.getAttribute("data-ln-field");i[f]!=null&&(h.textContent=i[f])}const s=t.querySelectorAll("[data-ln-attr]");for(let u=0;u<s.length;u++){const h=s[u],f=h.getAttribute("data-ln-attr").split(",");for(let g=0;g<f.length;g++){const b=f[g].trim().split(":");if(b.length!==2)continue;const w=b[0].trim(),L=b[1].trim();i[L]!=null&&h.setAttribute(w,i[L])}}const a=t.querySelectorAll("[data-ln-show]");for(let u=0;u<a.length;u++){const h=a[u],f=h.getAttribute("data-ln-show");f in i&&h.classList.toggle("hidden",!i[f])}const d=t.querySelectorAll("[data-ln-class]");for(let u=0;u<d.length;u++){const h=d[u],f=h.getAttribute("data-ln-class").split(",");for(let g=0;g<f.length;g++){const b=f[g].trim().split(":");if(b.length!==2)continue;const w=b[0].trim(),L=b[1].trim();L in i&&h.classList.toggle(w,!!i[L])}}return t}function mt(t,i){t.matches&&t.matches("[data-ln-form], [data-ln-fillable]")&&(window.lnCore._debugSink&&window.lnCore._debugSink("event","ln-fill",t,i??null),t.dispatchEvent(new CustomEvent("ln-fill",{detail:i??null,bubbles:!0})));const r=t.querySelectorAll("[data-ln-form], [data-ln-fillable]");for(let s=0;s<r.length;s++)window.lnCore._debugSink&&window.lnCore._debugSink("event","ln-fill",r[s],i??null),r[s].dispatchEvent(new CustomEvent("ln-fill",{detail:i??null,bubbles:!0}));return t}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._fillBound||(window.lnCore._fillBound=!0,document.addEventListener("ln-fill",function(t){if(!(!t.target.matches||!t.target.matches("[data-ln-fillable]")))if(t.detail)P(t.target,t.detail);else{const i=t.target.querySelectorAll("[data-ln-field]");for(let r=0;r<i.length;r++)i[r].textContent=""}})));function Y(t,i){if(!t||!i)return t;const r=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);for(;r.nextNode();){const d=r.currentNode;d.textContent.indexOf("{{")!==-1&&(d.textContent=d.textContent.replace(/\{\{\s*(\w+)\s*\}\}/g,function(u,h){return i[h]!==void 0?i[h]:""}))}const s=function(d,u){return i[u]!==void 0?i[u]:""},a=Array.from(t.querySelectorAll("*"));t.nodeType===1&&a.push(t);for(let d=0;d<a.length;d++){const u=a[d],h=u.attributes;for(let f=0;f<h.length;f++){const g=h[f];g.value.indexOf("{{")!==-1&&u.setAttribute(g.name,g.value.replace(/\{\{\s*(\w+)\s*\}\}/g,s))}}return t}function bt(t,i,r,s,a,d){const u={};for(let f=0;f<t.children.length;f++){const g=t.children[f],b=g.getAttribute("data-ln-render-key");b&&(u[b]=g)}const h=document.createDocumentFragment();for(let f=0;f<i.length;f++){const g=i[f],b=String(s(g));let w=u[b];if(w)a(w,g,f);else{const L=it(r,d);if(!L||(Y(L,g),w=L.firstElementChild,!w))continue;w.setAttribute("data-ln-render-key",b),a(w,g,f)}h.appendChild(w)}t.textContent="",t.appendChild(h)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.fillTemplate=Y,window.lnCore.fill=P,window.lnCore.lnFill=mt,window.lnCore.renderList=bt);function z(t,i,r){const s=t.getAttribute(i);return s===null?r:s}function wt(t,i,r){const s=parseInt(t.getAttribute(i),10);return isNaN(s)?r:s}function rt(t,i,r=!1){const s=t.getAttribute(i);if(s===null)return!!r;const a=s.trim().toLowerCase();return!(a==="false"||a==="0")}function yt(t,i){return(t.getAttribute(i)||"").split(",").map(r=>r.trim()).filter(Boolean)}const K=new Map;function Ct(t,i){const r=(t?t.join("|"):"")+"::"+i;if(K.has(r))return K.get(r);const s=new Set(t||[]),a=function(d,u){const h=d.getAttribute(u);return h!==null&&s.has(h)?h:i};return K.set(r,a),a}function vt(t,i,r){const s=parseFloat(t.getAttribute(i));return isNaN(s)?r:s}function St(t,i,r){const s=t.getAttribute(i);if(!s)return r;try{return JSON.parse(s)}catch{return r}}function st(t,i,r,s,a){if(!t||i===null)return!0;const d=s||"ln-component",u=t.type;if(u==="trigger"||u==="marker"||u==="string"||u==="list"||!u||i===""&&t.fallback!==void 0)return!0;const h=f=>{a?console.warn(f,a):console.warn(f)};if(u==="boolean"){const f=i.trim().toLowerCase();return f!==""&&f!=="true"&&f!=="false"&&f!=="1"&&f!=="0"?(h(`[${d}] Invalid value "${i}" for boolean attribute "${r}". Allowed: "true", "false", or presence-only.`),!1):!0}if(u==="enum"){const f=t.values||[];return f.includes(i)?!0:(h(`[${d}] Invalid value "${i}" for attribute "${r}". Allowed: ${f.join(", ")}. Fallback: "${t.fallback}".`),!1)}if(u==="integer"){if(!/^-?\d+$/.test(i))return h(`[${d}] Invalid integer "${i}" for attribute "${r}". Fallback: ${t.fallback}.`),!1;const f=parseInt(i,10);return t.min!==void 0&&f<t.min?(h(`[${d}] Value ${f} for attribute "${r}" is less than min (${t.min}).`),!1):t.max!==void 0&&f>t.max?(h(`[${d}] Value ${f} for attribute "${r}" is greater than max (${t.max}).`),!1):!0}if(u==="float")return isNaN(Number(i))?(h(`[${d}] Invalid float "${i}" for attribute "${r}". Fallback: ${t.fallback}.`),!1):!0;if(u==="json")try{return JSON.parse(i),!0}catch(f){return h(`[${d}] Invalid JSON for attribute "${r}": ${f.message}. Fallback: ${t.fallback}.`),!1}return!0}function At(t,i,r){for(const s in r){const[a,d,u]=r[s];Object.defineProperty(t,s,{get:function(){return a(i,d,u)},enumerable:!0,configurable:!0})}return t}function Et(t){const i={};for(const r in t){const s=t[r];if(!s||!s.prop)continue;let a=s.read;if(!a&&s.type)switch(s.type){case"enum":a=Ct(s.values,s.fallback);break;case"integer":a=wt;break;case"float":a=vt;break;case"boolean":a=rt;break;case"list":a=yt;break;case"json":a=St;break;case"string":default:a=z;break}a||(a=z),i[s.prop]=[a,r,s.fallback]}return i}function Dt(t){const i={};for(const r in t){const s=t[r];s&&s.effect&&(i[r]=s.effect)}return Object.keys(i).length?i:null}function Lt(t){if(t.onAttrChange&&!t.declared)return null;const i=new Set;if(t.effects)for(const r in t.effects)i.add(r);if(t.onAttrChange&&t.declared)for(const r of t.declared)i.add(r);return i}function Q(t,i,r,s){if(t.nodeType!==1)return;const d=i.indexOf("[")!==-1||i.indexOf(".")!==-1||i.indexOf("#")!==-1?i:"["+i+"]",u=Array.from(t.querySelectorAll(d));t.matches&&t.matches(d)&&u.push(t);for(const h of u)if(!h[r]){window.lnCore._persistSink&&h.hasAttribute("data-ln-persist")&&window.lnCore._persistSink(h,i);try{h[r]=new s(h)}catch(f){console.error("["+r+"] init failed",h,f)}}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._bootHolds=window.lnCore._bootHolds||0,window.lnCore._bootQueue=window.lnCore._bootQueue||[]);function kt(){return typeof window<"u"&&window.lnCore&&window.lnCore._bootHolds||0}function Tt(t){typeof window<"u"?(window.lnCore=window.lnCore||{},window.lnCore._bootHolds=window.lnCore._bootHolds||0,window.lnCore._bootQueue=window.lnCore._bootQueue||[],window.lnCore._bootHolds>0?window.lnCore._bootQueue.push(t):setTimeout(t,0)):t()}function ot(){window.lnCore=window.lnCore||{};const t=window.lnCore._attrRegistry=window.lnCore._attrRegistry||{byAttr:new Map,reactive:[],persist:[]};return t.byReactive=t.byReactive||new Map,t.reactiveWildcard=t.reactiveWildcard||[],t}function It(t){const i=ot(),r=t.observed||[];for(let s=0;s<r.length;s++){const a=r[s];i.byAttr.has(a)||i.byAttr.set(a,[]),i.byAttr.get(a).push(t)}if(i.byDeclaredAttr=i.byDeclaredAttr||new Map,t.attributes)for(const s in t.attributes){i.byDeclaredAttr.has(s)||i.byDeclaredAttr.set(s,[]);const a=i.byDeclaredAttr.get(s);a.some(d=>d.componentTag===t.componentTag)||a.push({spec:t.attributes[s],componentTag:t.componentTag})}if(t.onAttrChange||t.effects){i.reactive.push(t);const s=Lt(t);if(s===null)i.reactiveWildcard.push(t);else for(const a of s)i.byReactive.has(a)||i.byReactive.set(a,[]),i.byReactive.get(a).push(t)}t.persist&&i.persist.push(t)}function at(t,i,r,s){for(let a=0;a<t.length;a++){const d=t[a];if(!i[d.attribute])continue;const u=d.effects&&d.effects[r];u?u(i,r,s):d.onAttrChange&&(!d.declared||d.declared.has(r))&&d.onAttrChange(i,r,s)}}function Ft(t){const i=t.target,r=t.attributeName;if(t.oldValue===i.getAttribute(r))return;const s=ot(),a=s.byAttr.get(r);if(X()&&s.byDeclaredAttr&&s.byDeclaredAttr.has(r)&&j(i)){const d=s.byDeclaredAttr.get(r),u=i.getAttribute(r);for(let h=0;h<d.length;h++)st(d[h].spec,u,r,d[h].componentTag,i)}if(window.lnCore._debugSink&&(r.indexOf("data-ln-")===0||a)&&window.lnCore._debugSink("attr",r,i,{oldValue:t.oldValue,newValue:i.getAttribute(r)}),r.indexOf("data-ln-")===0){const d=s.byReactive.get(r);d&&at(d,i,r,t.oldValue),s.reactiveWildcard.length&&at(s.reactiveWildcard,i,r,t.oldValue)}if(a)for(let d=0;d<a.length;d++){const u=a[d];if(u.handler){u.handler(i,r,t.oldValue);continue}u.onAttributeChange&&i[u.attribute]?u.onAttributeChange(i,r):(Q(i,u.selector,u.attribute,u.ComponentFn),u.onInit&&u.onInit(i))}}function qt(){window.lnCore=window.lnCore||{},!window.lnCore._attrObserverBound&&(window.lnCore._attrObserverBound=!0,$(function(){new MutationObserver(function(i){for(let r=0;r<i.length;r++)try{Ft(i[r])}catch(s){console.error("[ln-core] mutation handler failed",i[r].target,s)}}).observe(document.body,{attributes:!0,subtree:!0,attributeOldValue:!0})},"ln-core"))}function ct(){return window.lnCore=window.lnCore||{},window.lnCore._lifecycleRegistry=window.lnCore._lifecycleRegistry||[]}function xt(t){const i=ct();if(i.length){if(t.target)for(let r=0;r<i.length;r++){const s=i[r];if(s.onSubtreeChange){const a=s.query,d=t.target.nodeType===1?t.target.matches(a)?t.target:t.target.closest(a):t.target.parentElement?t.target.parentElement.closest(a):null;d&&s.onSubtreeChange(d,t)}}for(let r=0;r<t.addedNodes.length;r++){const s=t.addedNodes[r];if(s.nodeType===1)for(let a=0;a<i.length;a++){const d=i[a];Q(s,d.selector,d.attribute,d.ComponentFn),d.onInit&&d.onInit(s)}}for(let r=0;r<t.removedNodes.length;r++){const s=t.removedNodes[r];if(s.nodeType===1)for(let a=0;a<i.length;a++){const d=i[a],u=d.query,h=Array.from(s.querySelectorAll(u));s.matches&&s.matches(u)&&h.push(s);for(let f=0;f<h.length;f++){const g=h[f];if(!document.contains(g)){const b=g[d.attribute];if(b&&typeof b.destroy=="function")try{b.destroy()}catch(w){console.error("["+d.attribute+"] destroy failed",g,w)}delete g[d.attribute]}}}}}}function Ot(){window.lnCore=window.lnCore||{},!window.lnCore._lifecycleObserverBound&&(window.lnCore._lifecycleObserverBound=!0,$(function(){new MutationObserver(function(i){for(let r=0;r<i.length;r++){const s=i[r];if(s.type==="childList")try{xt(s)}catch(a){console.error("[ln-core] lifecycle handler failed",s.target,a)}}}).observe(document.body,{childList:!0,subtree:!0})},"ln-core"))}function Rt(t,i,r,s,a={}){const d=a.extraAttributes||[],u=a.onAttributeChange||null,h=a.onSubtreeChange||null,f=a.onInit||null,g=a.onAttrChange||null,b=a.effects||null,w=a.attributes||null,L=w?Dt(w):b,F=w?new Set(Object.keys(w)):null,q=a.persist||null;function M(e){const n=e||document.body;if(Q(n,t,i,r),w&&X())for(const l in w){const o=w[l],c=Array.from(n.querySelectorAll("["+l+"]"));n.matches&&n.matches("["+l+"]")&&c.push(n);for(let _=0;_<c.length;_++){const p=c[_];j(p)&&st(o,p.getAttribute(l),l,s,p)}}f&&f(n)}const I=[];if(t.indexOf("[")!==-1){const e=/\[([\w-]+)/g;let n;for(;(n=e.exec(t))!==null;)I.push(n[1])}else I.push(t);It({selector:t,attribute:i,componentTag:s,attributes:w,ComponentFn:r,onInit:f,observed:I.concat(d),onAttributeChange:u,onAttrChange:g,effects:L,declared:F,persist:q}),qt();const N=t.indexOf("[")!==-1||t.indexOf(".")!==-1||t.indexOf("#")!==-1?t:"["+t+"]";ct().push({selector:t,attribute:i,ComponentFn:r,onInit:f,onSubtreeChange:h,query:N}),Ot(),window[i]=M;function C(){kt()>0?Tt(function(){M(document.body)}):M(document.body)}return document.readyState==="loading"?document.addEventListener("DOMContentLoaded",C):C(),M}function Ht(t){let i=!1;for(let r=0;r<t.length;r++){const s=t[r];if(!(s===""||s==null)&&(i=!0,!Number.isFinite(Number(s))))return"string"}return i?"number":"string"}function Mt(t,i,r,s){if(r==="number"){const u=parseFloat(t),h=parseFloat(i);return(isNaN(u)?0:u)-(isNaN(h)?0:h)}const a=t!=null?String(t):"",d=i!=null?String(i):"";return s?s.compare(a,d):a<d?-1:a>d?1:0}function Nt(t,i){let r=!1;return function(){r||(r=!0,queueMicrotask(function(){r=!1,t()}))}}function Wt(t){t=t||{};let i=t.windowSize>0?t.windowSize:1e3,r=t.pageSize>0?t.pageSize:200,s=t.threshold!=null?t.threshold:25,a=t.fetchDebounce!=null?t.fetchDebounce:120;const d=typeof t.requestPage=="function"?t.requestPage:function(){},u=typeof t.onChange=="function"?t.onChange:function(){},h=new Map,f=new Map,g=new Set;let b=0,w=0,L=0,F={sort:null,filters:{},search:""},q=null,M=0,I=0,x=!1;function N(l){f.set(l,++M)}function C(){return!!(F&&(F.search||F.filters&&Object.keys(F.filters).length))}function e(){if(h.size<=i)return;const l=Array.from(h.keys()).sort(function(c,_){return(f.get(c)||0)-(f.get(_)||0)});let o=0;for(;h.size>i&&o<l.length;)h.delete(l[o]),f.delete(l[o]),o++}function n(l,o){g.add(l),d(F,l,o)}return{get:function(l){return h.get(l)},has:function(l){return h.has(l)},peek:function(){return h.size?h.values().next().value:void 0},get logicalTotal(){return b},get grandTotal(){return w},get queryGen(){return L},get size(){return h.size},ensure:function(l,o){clearTimeout(q),I=l;for(let m=l;m<o;m++)h.has(m)&&N(m);if(b<=0)return;const c=Math.max(0,l-s),_=Math.min(b,o+s),p=Math.floor(c/r),S=Math.floor(Math.max(0,_-1)/r);let E=-1;for(let m=p;m<=S;m++){const y=m*r,k=Math.min(r,b-y);let W=!1;const B=Math.max(y,c),R=Math.min(y+k,_);for(let O=B;O<R;O++)if(!h.has(O)){W=!0;break}if(W&&!g.has(y)){E=y;break}}E!==-1&&(q=setTimeout(function(){n(E,r)},a))},ingest:function(l){if(l=l||{},l.queryGen!=null&&l.queryGen!==L)return!1;const o=l.offset||0,c=l.data||[];let _=0;for(let p=0;p<c.length;p++)c[p]!=null&&_++;if(_===0&&(l.provisional||l.filtered>0))return g.delete(o),!1;x&&(h.clear(),f.clear(),x=!1),l.provisional||(w=l.total!=null?l.total:w,b=l.filtered!=null?l.filtered:l.data?l.data.length:b);for(let p=0;p<c.length;p++)c[p]!=null&&(h.set(o+p,c[p]),N(o+p));return g.delete(o),e(),u(),!0},requestInitial:function(l){l&&(F=l),n(0,r)},invalidate:function(l){L++,g.clear(),clearTimeout(q),l&&(F=l),x=!0,n(0,r)},revalidate:function(){L++,g.clear(),clearTimeout(q),x=!0;const l=Math.max(0,Math.floor(I/r)*r);n(l,r)},release:function(l){g.delete(l)},destroy:function(){clearTimeout(q),h.clear(),f.clear(),g.clear()},configure:function(l){l=l||{};let o=!1;if(l.windowSize!=null&&l.windowSize>0&&l.windowSize!==i){const c=l.windowSize<i;i=l.windowSize,c&&e(),o=!0}l.pageSize!=null&&l.pageSize>0&&(r=l.pageSize),l.threshold!=null&&l.threshold>=0&&(s=l.threshold),l.fetchDebounce!=null&&l.fetchDebounce>=0&&(a=l.fetchDebounce),o&&u()},setGrandTotal:function(l){l==null||isNaN(l)||l<0||(w=l,C()||(b=l),u())}}}function dt(t){return(t||"").replace(/^#/,"")}function J(t){const i=t===void 0?location.hash:t,r={},s=dt(i);if(!s)return r;const a=s.split("&");for(let d=0;d<a.length;d++){const u=a[d];if(!u)continue;const h=u.indexOf(":"),f=h>-1?u.slice(0,h):u,g=h>-1?u.slice(h+1):"";if(f)try{r[f]=decodeURIComponent(g)}catch{r[f]=g}}return r}function Bt(t){if(!t)return null;const i=J();return t in i?i[t]:null}function Vt(t,i){if(!t)return;const r=J();i==null?delete r[t]:r[t]=String(i);const a=Object.keys(r).map(function(d){const u=r[d];return u===""?d:d+":"+encodeURIComponent(u)}).join("&");dt(location.hash)!==a&&(location.hash=a)}function $t(t){return t.button===1||t.ctrlKey||t.metaKey||t.shiftKey?!1:(t.preventDefault(),!0)}function zt(t,i){if(!t||!t.hasAttribute("data-ln-hash"))return null;const r=t.getAttribute("data-ln-hash");if(r&&r.trim()!=="")return r.trim();const s=t.getAttribute("data-ln-sort")||t.getAttribute("data-ln-search-for")||t.getAttribute("data-ln-search")||t.getAttribute("data-ln-filter")||t.id;return s?i?s+"-"+i:s:i||null}function Ut(t,i){return!i||i==="none"||t===null||t===void 0?null:String(t)+"."+i}function jt(t){return!t||typeof t!="string"?null:t.endsWith(".asc")?{fieldOrColumn:t.slice(0,-4),direction:"asc"}:t.endsWith(".desc")?{fieldOrColumn:t.slice(0,-5),direction:"desc"}:null}function Gt(t,i){return!t||!Array.isArray(i)||i.length===0?null:t+":"+i.map(encodeURIComponent).join(",")}function Pt(t){if(!t||typeof t!="string")return null;const i=t.indexOf(":");if(i===-1)return null;const r=t.slice(0,i),s=t.slice(i+1),a=s?s.split(",").map(function(d){try{return decodeURIComponent(d)}catch{return d}}).filter(Boolean):[];return{key:r,values:a}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.hashParse=J,window.lnCore.hashGet=Bt,window.lnCore.hashSet=Vt,window.lnCore.hashLinkClick=$t,window.lnCore.resolveHashNamespace=zt,window.lnCore.hashSortEncode=Ut,window.lnCore.hashSortDecode=jt,window.lnCore.hashFilterEncode=Gt,window.lnCore.hashFilterDecode=Pt),(function(){const t="data-ln-list",i="lnList",r="data-ln-list-empty";if(window[i]!==void 0)return;function f(e,n){if(!e||!e.isDataDriven)return;const l=e.dom.hasAttribute("data-ln-list-window");if(l&&!e._windowed)e._enterWindowedMode(),e._kickWindowInitial();else if(!l&&e._windowed)e._exitWindowedMode();else if(l&&e._windowed){const o=parseInt(n,10);o>0&&e._cache.configure({windowSize:o})}}function g(e,n){if(!e||!e.isDataDriven||!e._windowed||!e._cache)return;const l=parseInt(n,10);l>0&&e._cache.configure({pageSize:l})}function b(e,n){if(!e||!e.isDataDriven||!e._windowed||!e._cache)return;const l=parseInt(n,10);l>=0&&e._cache.configure({threshold:l})}function w(e,n){if(!e||!e.isDataDriven||!e._windowed||!e._cache)return;const l=parseInt(n,10);l>=0&&e._cache.setGrandTotal(l)}const L={"data-ln-list":{prop:"name",type:"string",read:z,fallback:"",description:"List instance name or identifier"},"data-ln-list-source":{prop:"source",type:"string",read:z,fallback:"",description:"Source store or coordinator addressing"},"data-ln-list-selectable":{prop:"_selectable",type:"boolean",read:rt,description:"Enables item selection controls"},"data-ln-list-window":{type:"integer",fallback:1e3,min:10,effect:f,description:"Virtual scrolling window size in items"},"data-ln-list-window-page":{type:"integer",fallback:200,min:5,effect:g,description:"Virtual scrolling slice page size"},"data-ln-list-window-threshold":{type:"integer",fallback:50,min:0,effect:b,description:"Scroll threshold margin in pixels to trigger page fetch"},"data-ln-list-count":{type:"integer",min:0,effect:w,description:"Total item count override for virtual scrollbar calculation"},"data-ln-list-empty":{type:"marker",description:"Container for list empty state"},"data-ln-list-field":{type:"string",description:"Field name mapping for list item binding"}},F=Et(L);function q(e,n){if(e==null||isNaN(e))return"";try{return new Intl.NumberFormat(et(n)).format(e)}catch{return String(e)}}function M(e){let n=e;for(;n&&n!==document.body&&n!==document.documentElement;){const o=getComputedStyle(n).overflowY;if(o==="auto"||o==="scroll")return n;n=n.parentElement}return null}function I(e){const n=e._scrollContainer||M(e.dom);return{container:n,top:n?n.scrollTop:window.scrollY}}function x(e){e.container?e.container.scrollTop=e.top:window.scrollTo(window.scrollX,e.top)}function N(e){if(!e)return 0;const n=getComputedStyle(e),l=parseFloat(n.marginTop)||0,o=parseFloat(n.marginBottom)||0;return e.offsetHeight+l+o}function C(e){this.dom=e,At(this,e,F),this.tbody=e.querySelector("[data-ln-list-body]")||e,this.isDataDriven=e.hasAttribute("data-ln-list-source"),this._totalSpan=e.querySelector("[data-ln-list-total]"),this._filteredSpan=e.querySelector("[data-ln-list-filtered]"),this._filteredSpan&&(this._filteredWrap=this._filteredSpan.parentElement!==e?this._filteredSpan.parentElement:null),this._selectedSpan=e.querySelector("[data-ln-list-selected]"),this._selectedSpan&&(this._selectedWrap=this._selectedSpan.parentElement!==e?this._selectedSpan.parentElement:null),this._data=[],this._filteredData=[],this.selectedIds=new Set,this._searchTerm="",this._filters={},this._sortField=null,this._sortDir=null,this._virtual=!1,this._itemHeight=0,this._vStart=-1,this._vEnd=-1,this._rafId=null,this._scrollHandler=null,this._resizeHandler=null,this._scrollContainer=null,this.isUl=this.tbody.tagName==="UL"||this.tbody.tagName==="OL";const n=this;return this._onSetSearch=function(l){const o=(l.detail&&l.detail.query!=null?l.detail.query:l.detail&&l.detail.term!=null?l.detail.term:"").trim();n.isDataDriven?(n.currentSearch=o,D(e,"ln-list:search",{list:n.name,query:n.currentSearch}),n._requestData()):(n._searchTerm=o.toLowerCase(),n._applyFilterAndSort(),n._vStart=-1,n._vEnd=-1,n._render(),n._updateFooter(),D(e,"ln-list:filter",{term:n._searchTerm,matched:n._filteredData.length,total:n._data.length}))},e.addEventListener("ln-list:set-search",this._onSetSearch),this._onSearchChange=function(l){l.preventDefault(),n._onSetSearch(l)},e.addEventListener("ln-search:change",this._onSearchChange),this._onRequestClearFilters=function(){n.isDataDriven?(n.currentFilters={},n.currentSearch="",D(e,"ln-list:clear-filters",{list:n.name}),n._requestData()):(n._searchTerm="",n._filters={},n._sortField=null,n._sortDir=null,n._applyFilterAndSort(),n._vStart=-1,n._vEnd=-1,n._render(),n._updateFooter(),D(e,"ln-list:filter",{term:"",matched:n._filteredData.length,total:n._data.length}))},e.addEventListener("ln-list:request-clear-filters",this._onRequestClearFilters),this._selectableActive=!1,this._selectable&&this._enableSelection(),this.isDataDriven?(this.isLoaded=!1,this.totalCount=0,this.visibleCount=0,this.currentSort=null,this.currentFilters={},this.currentSearch="",this._lastTotal=0,this._lastFiltered=0,this._hasInitialSeed=!1,this._windowed=!1,this._cache=null,e.hasAttribute("data-ln-list-window")&&this._enterWindowedMode(),this._onSetData=function(l){const o=l.detail||{},c=o.data||[],_=o.total!=null?o.total:c.length;if(!(n._hasInitialSeed&&!n.isLoaded&&c.length===0&&_===0)){if(n._windowed){n._cache.ingest(o)&&!o.provisional&&e.classList.remove("ln-list--loading");return}n._data=c,n._lastTotal=_,n._lastFiltered=o.filtered!=null?o.filtered:n._data.length,n.totalCount=n._lastTotal,n.visibleCount=n._lastFiltered,n.isLoaded=!0,n._hasInitialSeed=!1,e.classList.remove("ln-list--loading"),n._vStart=-1,n._vEnd=-1,n._applyFilterAndSort(),n._render(),n._updateFooter(),D(e,"ln-list:rendered",{list:n.name,total:n.totalCount,visible:n.visibleCount})}},e.addEventListener("ln-list:set-data",this._onSetData),this._onSetLoading=function(l){const o=l.detail&&l.detail.loading;e.classList.toggle("ln-list--loading",!!o),o&&(n.isLoaded=!1)},e.addEventListener("ln-list:set-loading",this._onSetLoading),this._onPageFailed=function(l){!n._windowed||!n._cache||n._cache.release(l.detail&&l.detail.offset)},e.addEventListener("ln-list:page-failed",this._onPageFailed),this._onRequestRevalidate=function(){!n._windowed||!n._cache||n._cache.revalidate()},e.addEventListener("ln-list:request-revalidate",this._onRequestRevalidate),this._onRequestInvalidate=function(){!n._windowed||!n._cache||n._requestData()},e.addEventListener("ln-list:request-invalidate",this._onRequestInvalidate),this._onSort=function(l){l.detail.field!=null&&(l.preventDefault(),n.currentSort=l.detail.direction==="none"?null:{field:l.detail.field,direction:l.detail.direction},n._requestData())},e.addEventListener("ln-sort:change",this._onSort),this._onItemClick=function(l){if(l.target.closest("[data-ln-item-select]")||l.target.closest("[data-ln-item-action]")||l.target.closest("a")||l.target.closest("button")||l.ctrlKey||l.metaKey||l.button===1)return;const o=l.target.closest("[data-ln-item]");if(!o)return;const c=o.getAttribute("data-ln-item-id"),_=o._lnRecord||{};D(e,"ln-list:item-click",{list:n.name,id:c,record:_})},this.tbody&&this.tbody.addEventListener("click",this._onItemClick),this._onItemAction=function(l){const o=l.target.closest("[data-ln-item-action]");if(!o)return;const c=o.closest("[data-ln-item]");if(!c)return;const _=o.getAttribute("data-ln-item-action"),p=c.getAttribute("data-ln-item-id"),S=c._lnRecord||{};D(e,"ln-list:item-action",{list:n.name,id:p,action:_,record:S})},this.tbody&&this.tbody.addEventListener("click",this._onItemAction),this.tbody&&this.tbody.children.length>0&&this._parseChildren(),this._windowed?this._kickWindowInitial():D(e,"ln-list:request-data",{list:this.name,sort:this.currentSort,filters:this.currentFilters,search:this.currentSearch})):(this._emptyObserver=null,this.tbody&&this.tbody.children.length>0?this._parseChildren():this.tbody&&(this._emptyObserver=new MutationObserver(function(){n.tbody.children.length>0&&(n._emptyObserver.disconnect(),n._emptyObserver=null,n._parseChildren())}),this._emptyObserver.observe(this.tbody,{childList:!0})),this._onFilterChange=function(l){if(l.preventDefault(),!l.detail)return;const o=l.detail.key,c=l.detail.values||[];if(o){if(c.length===0)delete n._filters[o];else{const _=[];for(let p=0;p<c.length;p++)_.push(c[p].toLowerCase());n._filters[o]=_}n._applyFilterAndSort(),n._vStart=-1,n._vEnd=-1,n._render(),n._updateFooter(),D(e,"ln-list:filter",{term:n._searchTerm,matched:n._filteredData.length,total:n._data.length})}},e.addEventListener("ln-filter:change",this._onFilterChange),this._onSort=function(l){if(l.detail&&l.detail.field==null)return;l.preventDefault();const o=l.detail&&l.detail.direction==="none"?null:l.detail&&l.detail.direction;n._sortField=o===null?null:l.detail&&l.detail.field,n._sortDir=o,n._applyFilterAndSort(),n._vStart=-1,n._vEnd=-1,n._render(),n._updateFooter(),D(e,"ln-list:sorted",{field:n._sortField,direction:l.detail&&l.detail.direction,matched:n._filteredData.length,total:n._data.length})},e.addEventListener("ln-sort:change",this._onSort)),this}C.prototype._parseChildren=function(){const e=Array.from(this.tbody.children).filter(n=>!n.classList.contains("ln-list__spacer"));this._data=[],e.length>0&&(this._itemHeight=N(e[0])||50);for(let n=0;n<e.length;n++){const l=e[n],o=l.getAttribute("data-ln-item-id")||l.getAttribute("id"),c=l.textContent.trim().toLowerCase();let _=null;if(this.isDataDriven){_={},o!=null&&(_.id=o);const E=l.querySelectorAll("[data-ln-list-field]");for(let m=0;m<E.length;m++){const y=E[m],k=y.getAttribute("data-ln-list-field");k&&(_[k]=Z(y))}}const p={},S=l.querySelectorAll("[data-ln-list-field], [data-ln-field]");for(let E=0;E<S.length;E++){const m=S[E],y=m.getAttribute("data-ln-list-field")||m.getAttribute("data-ln-field");y&&(p[y]=Z(m))}for(let E=0;E<l.attributes.length;E++){const m=l.attributes[E];if(m.name.startsWith("data-")&&!m.name.startsWith("data-ln-")){const y=m.name.slice(5);y&&(p[y]=m.value)}}this._data.push({html:l.outerHTML,id:o,searchText:c,fields:p,..._||{}})}this._filteredData=this._data.slice(),this._data.length>0&&(this._hasInitialSeed=!0),this.isDataDriven&&(this._lastTotal=this._data.length,this._lastFiltered=this._data.length,this.totalCount=this._data.length,this.visibleCount=this._data.length,this._updateFooter()),this._render(),D(this.dom,"ln-list:ready",{total:this._data.length})},C.prototype._applyFilterAndSort=function(){if(this.isDataDriven)this._filteredData=this._data?this._data.slice():[],this.visibleCount=this.isDataDriven&&this._lastFiltered!=null?this._lastFiltered:this._filteredData.length;else{const e=this._searchTerm,n=e?e.split(/\s+/).filter(Boolean):[],l=this._filters||{},o=Object.keys(l).length>0;if(n.length===0&&!o?this._filteredData=this._data.slice():this._filteredData=this._data.filter(function(c){if(n.length>0&&!n.every(function(p){return c.searchText&&c.searchText.indexOf(p)!==-1}))return!1;if(o)for(const _ in l){const p=l[_];if(p&&p.length>0){const S=c.fields&&c.fields[_]!==void 0?c.fields[_]:c[_]!==void 0?c[_]:null,E=S!=null?String(S).toLowerCase():"";if(p.indexOf(E)===-1)return!1}}return!0}),this._sortField&&this._sortDir){const c=this._sortField,_=this._sortDir==="desc"?-1:1,p=typeof Intl<"u"?new Intl.Collator(et(this.dom),{sensitivity:"base"}):null,S=this._filteredData.map(function(m){return m.fields&&m.fields[c]!==void 0?m.fields[c]:m[c]}),E=Ht(S);this._filteredData.sort(function(m,y){const k=m.fields&&m.fields[c]!==void 0?m.fields[c]:m[c],W=y.fields&&y.fields[c]!==void 0?y.fields[c]:y[c];return Mt(k,W,E,p)*_})}}},C.prototype._render=function(){if(this.tbody)if(this.isDataDriven){if(this._windowed){this._renderWindowed();return}const e=this._lastTotal,n=this.visibleCount;if(e===0||this._filteredData.length===0||n===0){this._disableVirtualScroll(),this._showEmptyState();return}this._filteredData.length>200?(this._enableVirtualScroll(),this._renderVirtual()):(this._disableVirtualScroll(),this._renderAll())}else{const e=this._filteredData.length;e===0&&(this._searchTerm||Object.keys(this._filters||{}).length>0)?(this._disableVirtualScroll(),this._showEmptyState()):e>200?(this._enableVirtualScroll(),this._renderVirtual()):(this._disableVirtualScroll(),this._renderAll())}},C.prototype._renderAll=function(){if(this.isDataDriven){const e=this._filteredData,n=document.createDocumentFragment();for(let o=0;o<e.length;o++){const c=this._buildItem(e[o]);c&&n.appendChild(c)}const l=I(this);this.tbody.replaceChildren(n),x(l),this._selectable&&this._updateSelectAll()}else{const e=[],n=this._filteredData;for(let o=0;o<n.length;o++)e.push(n[o].html);const l=I(this);this.tbody.innerHTML=e.join(""),x(l),this._selectable&&this._restoreSelection()}},C.prototype._readGridLayout=function(){const e=getComputedStyle(this.tbody),n=e.gridTemplateColumns;let l=1;if(n&&n!=="none"){const c=n.trim().split(/\s+/).filter(Boolean);c.length>0&&(l=c.length)}const o=parseFloat(e.rowGap);return{columns:l,rowGap:isNaN(o)?0:o}},C.prototype._measureItemHeight=function(){if(this._windowed){const e=this._cache.peek(),n=e?this._buildItem(e):this._buildPlaceholderItem();n&&(this.tbody.textContent="",this.tbody.appendChild(n),this._itemHeight=N(n)||50,this.tbody.textContent="")}else if(this.isDataDriven){if(this._data.length>0){const e=this._buildItem(this._data[0]);e&&(this.tbody.textContent="",this.tbody.appendChild(e),this._itemHeight=N(e)||50,this.tbody.textContent="")}}else{const e=this.tbody.children;e.length>0&&(this._itemHeight=N(e[0])||50)}},C.prototype._enableVirtualScroll=function(){if(this._virtual)return;this._virtual=!0,this._vStart=-1,this._vEnd=-1;const e=this;this._itemHeight||this._measureItemHeight(),this._scrollContainer=M(this.dom);const n=this._scrollContainer||window;this._scrollHandler=function(){e._rafId||(e._rafId=requestAnimationFrame(function(){e._rafId=null,e._windowed?e._renderWindowed():e._renderVirtual()}))},this._resizeHandler=function(){e._itemHeight=0,e._measureItemHeight(),e._vStart=-1,e._vEnd=-1,e._windowed?e._renderWindowed():e._renderVirtual()},n.addEventListener("scroll",this._scrollHandler,{passive:!0}),window.addEventListener("resize",this._resizeHandler,{passive:!0})},C.prototype._disableVirtualScroll=function(){this._virtual&&(this._virtual=!1,this._scrollHandler&&((this._scrollContainer||window).removeEventListener("scroll",this._scrollHandler),this._scrollHandler=null),this._resizeHandler&&(window.removeEventListener("resize",this._resizeHandler),this._resizeHandler=null),this._scrollContainer=null,this._rafId&&(cancelAnimationFrame(this._rafId),this._rafId=null),this._vStart=-1,this._vEnd=-1)},C.prototype._renderVirtual=function(){const e=this._filteredData,n=e.length,l=this._itemHeight;if(!l||!n)return;const o=this._scrollContainer;let c,_;if(o){const T=this.tbody.getBoundingClientRect(),A=o.getBoundingClientRect(),v=o===this.tbody?0:T.top-A.top+o.scrollTop;c=o.scrollTop-v,_=o.clientHeight}else{const A=this.tbody.getBoundingClientRect().top+window.scrollY;c=window.scrollY-A,_=window.innerHeight}const p=this._readGridLayout(),S=p.columns,E=p.rowGap,m=l+E,y=Math.ceil(n/S);let k=Math.max(0,Math.floor(c/m)-15);k=Math.min(k,y);const W=Math.ceil(_/m)+30,B=Math.min(k+W,y),R=Math.min(k*S,n),O=Math.min(B*S,n);if(R===this._vStart&&O===this._vEnd)return;this._vStart=R,this._vEnd=O;const V=k*m,H=(y-B)*m;if(this.isDataDriven){const T=document.createDocumentFragment();if(V>0){const v=document.createElement(this.isUl?"li":"div");v.className="ln-list__spacer",v.setAttribute("aria-hidden","true"),v.style.height=V+"px",T.appendChild(v)}for(let v=R;v<O;v++){const U=this._buildItem(e[v]);U&&T.appendChild(U)}if(H>0){const v=document.createElement(this.isUl?"li":"div");v.className="ln-list__spacer",v.setAttribute("aria-hidden","true"),v.style.height=H+"px",T.appendChild(v)}const A=I(this);this.tbody.replaceChildren(T),x(A),this._selectable&&this._updateSelectAll()}else{let T="";V>0&&(T+=`<${this.isUl?"li":"div"} class="ln-list__spacer" aria-hidden="true" style="height:${V}px"></${this.isUl?"li":"div"}>`);for(let v=R;v<O;v++)T+=e[v].html;H>0&&(T+=`<${this.isUl?"li":"div"} class="ln-list__spacer" aria-hidden="true" style="height:${H}px"></${this.isUl?"li":"div"}>`);const A=I(this);this.tbody.innerHTML=T,x(A),this._selectable&&this._restoreSelection()}},C.prototype._buildPlaceholderItem=function(){const e=document.createElement(this.isUl?"li":"div");return e.className="ln-list__placeholder",e.setAttribute("aria-hidden","true"),e.style.height=this._itemHeight+"px",e},C.prototype._renderWindowed=function(){if(this.isLoaded&&this._cache.logicalTotal===0){this._disableVirtualScroll(),this._showEmptyState();return}this._virtual||this._enableVirtualScroll();const e=this._itemHeight;if(!e)return;const n=this._scrollContainer;let l,o;if(n){const A=this.tbody.getBoundingClientRect(),v=n.getBoundingClientRect(),U=n===this.tbody?0:A.top-v.top+n.scrollTop;l=n.scrollTop-U,o=n.clientHeight}else{const v=this.tbody.getBoundingClientRect().top+window.scrollY;l=window.scrollY-v,o=window.innerHeight}const c=this._readGridLayout(),_=c.columns,p=c.rowGap,S=e+p,E=this._cache.logicalTotal,m=Math.ceil(E/_);let y=Math.max(0,Math.floor(l/S)-15);y=Math.min(y,m);const k=Math.ceil(o/S)+30,W=Math.min(y+k,m),B=Math.min(y*_,E),R=Math.min(W*_,E),O=y*S,V=(m-W)*S,H=document.createDocumentFragment();if(O>0){const A=document.createElement(this.isUl?"li":"div");A.className="ln-list__spacer",A.setAttribute("aria-hidden","true"),A.style.height=O+"px",H.appendChild(A)}for(let A=B;A<R;A++)if(this._cache.has(A)){const v=this._buildItem(this._cache.get(A));v&&H.appendChild(v)}else H.appendChild(this._buildPlaceholderItem());if(V>0){const A=document.createElement(this.isUl?"li":"div");A.className="ln-list__spacer",A.setAttribute("aria-hidden","true"),A.style.height=V+"px",H.appendChild(A)}const T=I(this);this.tbody.replaceChildren(H),x(T),this._vStart=B,this._vEnd=R,this._cache.ensure(B,R)},C.prototype._showEmptyState=function(){let e=null;if(this.isDataDriven){const n=this._lastTotal!=null?this._lastTotal:this._data.length,o=this.visibleCount===0&&n>0,c=o?this.name+"-empty-filtered":this.name+"-empty";if(e=lt(this.dom,c,"ln-list"),!e){const _=this.dom.querySelector("template[data-ln-empty], template[data-ln-list-empty]");if(_){const p=o?"search":"initial",S=_.content.querySelector(`[data-ln-empty-when="${p}"]`)||_.content.firstElementChild;S&&(e=document.importNode(S,!0))}}}else{const n=this.dom.querySelector(`template[${r}]`);if(n){const l=n.content.firstElementChild;l&&(e=document.importNode(l,!0))}}if(e)if(e.tagName==="LI"||e.tagName==="TR")this.tbody.replaceChildren(e);else{const n=document.createElement(this.isUl?"li":"div");n.appendChild(e),this.tbody.replaceChildren(n)}else this.tbody.replaceChildren();D(this.dom,"ln-list:empty",{term:this.isDataDriven?this.currentSearch||"":this._searchTerm,total:this.isDataDriven?this._lastTotal!=null?this._lastTotal:this._data.length:this._data.length})},C.prototype._buildItem=function(e){let n=lt(this.dom,this.name+"-row","ln-list");if(!n){const o=this.dom.querySelector("template[data-ln-item]");o&&(n=document.importNode(o.content,!0))}let l=n?n.querySelector("[data-ln-item]")||n.firstElementChild:null;if(l)Y(l,e),P(l,e);else if(e&&e.html){const o=document.createElement(this.isUl?"ul":"div");o.innerHTML=e.html,l=o.firstElementChild}else if(l=document.createElement(this.isUl?"li":"div"),l.setAttribute("data-ln-item",""),e&&typeof e=="object"){for(const o in e)if(o!=="html"&&e[o]!=null){const c=document.createElement("span");c.setAttribute("data-ln-field",o),c.textContent=String(e[o]),l.appendChild(c)}}if(l._lnRecord=e,e&&e.id!=null&&(l.setAttribute("data-ln-item-id",e.id),this._selectable&&this.selectedIds.has(String(e.id)))){l.classList.add("ln-item-selected");const o=l.querySelector("[data-ln-item-select]");o&&(o.checked=!0)}return l},C.prototype._restoreSelection=function(){if(!this.tbody)return;const e=this.tbody.querySelectorAll("[data-ln-item]");for(let n=0;n<e.length;n++){const l=e[n].getAttribute("data-ln-item-id"),o=l!=null&&this.selectedIds.has(String(l));e[n].classList.toggle("ln-item-selected",o);const c=e[n].querySelector("[data-ln-item-select]");c&&(c.checked=o)}this._updateSelectAll()},C.prototype._enableSelection=function(){if(this._selectableActive)return;this._selectableActive=!0;const e=this;this._onSelectionChange=function(n){const l=n.target.closest("[data-ln-item-select]");if(!l)return;const o=l.closest("[data-ln-item]");if(!o)return;const c=o.getAttribute("data-ln-item-id");c!=null&&(l.checked?(e.selectedIds.add(String(c)),o.classList.add("ln-item-selected")):(e.selectedIds.delete(String(c)),o.classList.remove("ln-item-selected")),e._updateSelectAll(),e._updateFooter(),D(e.dom,"ln-list:select",{list:e.name,selectedIds:e.selectedIds,count:e.selectedIds.size}))},this.tbody.addEventListener("change",this._onSelectionChange),this._selectAllCheckbox=this.dom.querySelector("[data-ln-list-select-all]"),this._selectAllCheckbox&&(this._onSelectAll=function(){const n=e._selectAllCheckbox.checked,l=e.tbody.querySelectorAll("[data-ln-item]");for(let o=0;o<l.length;o++){const c=l[o],_=c.getAttribute("data-ln-item-id"),p=c.querySelector("[data-ln-item-select]");_!=null&&(n?(e.selectedIds.add(String(_)),c.classList.add("ln-item-selected")):(e.selectedIds.delete(String(_)),c.classList.remove("ln-item-selected")),p&&(p.checked=n))}D(e.dom,"ln-list:select-all",{list:e.name,selected:n}),D(e.dom,"ln-list:select",{list:e.name,selectedIds:e.selectedIds,count:e.selectedIds.size}),e._updateFooter()},this._selectAllCheckbox.addEventListener("change",this._onSelectAll))},C.prototype._updateSelectAll=function(){if(!this._selectAllCheckbox)return;const e=this.tbody.querySelectorAll("[data-ln-item]");let n=e.length>0;for(let l=0;l<e.length;l++){const o=e[l].getAttribute("data-ln-item-id");if(o!=null&&!this.selectedIds.has(String(o))){n=!1;break}}this._selectAllCheckbox.checked=n},C.prototype._requestData=function(){if(this._windowed){this.dom.classList.add("ln-list--loading"),this._cache.invalidate({sort:this.currentSort,filters:this.currentFilters,search:this.currentSearch});return}ut(this,"ln-list:request-data","list")},C.prototype._enterWindowedMode=function(){const e=this,n=this.dom,l=parseInt(n.getAttribute("data-ln-list-window"),10),o=parseInt(n.getAttribute("data-ln-list-window-page"),10),c=parseInt(n.getAttribute("data-ln-list-window-threshold"),10);this._onCacheChange=function(){!e._windowed||!e._cache||(e.totalCount=e._cache.grandTotal,e.visibleCount=e._cache.logicalTotal,e._lastTotal=e._cache.grandTotal,e.isLoaded=!0,e._vStart=-1,e._vEnd=-1,e._render(),e._updateFooter(),D(n,"ln-list:rendered",{list:e.name,total:e.totalCount,visible:e.visibleCount}))},this._renderBatch=Nt(this._onCacheChange),this._cache=Wt({windowSize:l>0?l:1e3,pageSize:o>0?o:200,threshold:c>=0?c:25,fetchDebounce:120,requestPage:function(_,p,S){D(n,"ln-list:request-data",{list:e.name,sort:_.sort,filters:_.filters,search:_.search,offset:p,limit:S,queryGen:e._cache.queryGen})},onChange:this._renderBatch}),this._windowed=!0,this._selectable&&this._selectAllCheckbox&&this._selectAllCheckbox.classList.add("hidden")},C.prototype._kickWindowInitial=function(){if(this._data.length>0){const e=parseInt(this.dom.getAttribute("data-ln-list-count"),10),n=e>0?e:this._data.length;this._cache.ingest({data:this._data,offset:0,total:n,filtered:n})}else this.dom.classList.add("ln-list--loading"),this._cache.requestInitial({sort:this.currentSort,filters:this.currentFilters,search:this.currentSearch})},C.prototype._exitWindowedMode=function(){this._disableVirtualScroll(),this._cache&&this._cache.destroy(),this._cache=null,this._windowed=!1,this._renderBatch=null,this._onCacheChange=null,this._selectAllCheckbox&&this._selectAllCheckbox.classList.remove("hidden"),this._itemHeight=0,this._vStart=-1,this._vEnd=-1,this._data=[],this._filteredData=[],this.dom.classList.add("ln-list--loading"),this._requestData()},C.prototype._updateFooter=function(){let e=0,n=0;this.isDataDriven?(e=this._lastTotal!=null?this._lastTotal:this._data.length,n=this.visibleCount):(e=this._data.length,n=this._filteredData.length);const l=n<e;if(this._totalSpan&&(this._totalSpan.textContent=q(e,this.dom)),this._filteredSpan&&(this._filteredSpan.textContent=l?q(n,this.dom):""),this._filteredWrap&&this._filteredWrap.classList.toggle("hidden",!l),this._selectedSpan){const o=this.selectedIds?this.selectedIds.size:0;this._selectedSpan.textContent=o>0?q(o,this.dom):"",this._selectedWrap&&this._selectedWrap.classList.toggle("hidden",o===0)}},C.prototype.destroy=function(){this.dom[i]&&(this._disableVirtualScroll(),this.dom.removeEventListener("ln-list:set-search",this._onSetSearch),this.dom.removeEventListener("ln-search:change",this._onSearchChange),this.dom.removeEventListener("ln-list:request-clear-filters",this._onRequestClearFilters),this.isDataDriven?(this._cache&&this._cache.destroy(),this.dom.removeEventListener("ln-list:set-data",this._onSetData),this.dom.removeEventListener("ln-list:set-loading",this._onSetLoading),this.dom.removeEventListener("ln-list:page-failed",this._onPageFailed),this.dom.removeEventListener("ln-list:request-revalidate",this._onRequestRevalidate),this.dom.removeEventListener("ln-list:request-invalidate",this._onRequestInvalidate),this.dom.removeEventListener("ln-sort:change",this._onSort),this.tbody&&(this.tbody.removeEventListener("click",this._onItemClick),this.tbody.removeEventListener("click",this._onItemAction))):(this._emptyObserver&&(this._emptyObserver.disconnect(),this._emptyObserver=null),this._onFilterChange&&this.dom.removeEventListener("ln-filter:change",this._onFilterChange),this._onSort&&this.dom.removeEventListener("ln-sort:change",this._onSort)),this._onSelectionChange&&this.tbody&&this.tbody.removeEventListener("change",this._onSelectionChange),this._selectAllCheckbox&&this._onSelectAll&&this._selectAllCheckbox.removeEventListener("change",this._onSelectAll),this._data=[],this._filteredData=[],delete this.dom[i])},Rt(t,i,C,"ln-list",{attributes:L})})()})();
|
|
1
|
+
(function(){"use strict";function X(){return typeof window>"u"?!1:window.lnDebug===!0||window.lnCore&&window.lnCore._debugSink?!0:typeof document<"u"&&document.body?document.body.hasAttribute("data-ln-debug")||document.body.querySelector("[data-ln-debug]")!==null:!1}function j(t){if(typeof window>"u")return!1;if(window.lnDebug===!0)return!0;if(window.lnCore&&window.lnCore._debugIsContained)return t?window.lnCore._debugIsContained(t):window.lnCore._debugSink!==null;if(t&&t.closest){const i=t.closest("[data-ln-debug]");return!(!i||typeof document<"u"&&i===document.documentElement)}return typeof document<"u"&&document.body?document.body.hasAttribute("data-ln-debug"):!1}if(typeof window<"u"&&(window.lnCore=window.lnCore||{},!window.lnCore._warnBound)){window.lnCore._warnBound=!0;const t=console.warn;console.warn=function(...i){if(typeof i[0]=="string"&&(i[0].startsWith("[ln-")||i[0].startsWith("[lnCore"))){let s=null;for(let a=1;a<i.length;a++)if(i[a]&&i[a].nodeType===1){s=i[a];break}if(!j(s))return}t.apply(console,i)}}function E(t,i,r){const s=r||{};window.lnCore._debugSink&&window.lnCore._debugSink("event",i,t,s),t.dispatchEvent(new CustomEvent(i,{bubbles:!0,detail:s}))}function ut(t,i,r){t._applyFilterAndSort(),t._vStart=-1,t._vEnd=-1,t._render(),t._updateFooter();const s={sort:t.currentSort,filters:t.currentFilters,search:t.currentSearch};s[r]=t.name,E(t.dom,i,s)}function U(t,i){if(!document.body){document.addEventListener("DOMContentLoaded",function(){U(t,i)}),console.warn("["+i+'] Script loaded before <body> — add "defer" to your <script> tag');return}t()}function Z(t){return t.hasAttribute("data-ln-value")?t.getAttribute("data-ln-value"):t.tagName==="TIME"&&t.hasAttribute("datetime")?t.getAttribute("datetime"):t.tagName==="DATA"&&t.hasAttribute("value")?t.getAttribute("value"):t.textContent.trim()}const tt={};function ht(t,i){tt[t]=i}function ft(t){return tt[t]||{ingress:i=>i,egress:i=>i}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerDataMapper=ht,window.lnCore.getDataMapper=ft);function et(t){const i=t?t.closest("[lang]"):null,r=(i?i.getAttribute("lang")||i.lang:null)||(typeof document<"u"&&document.documentElement?document.documentElement.getAttribute("lang")||document.documentElement.lang:null)||(typeof navigator<"u"?navigator.language:null);return r?r.trim():"en-US"}function _t(){typeof window>"u"||(window.lnCore=window.lnCore||{},!window.lnCore._localeObserverBound&&(window.lnCore._localeObserverBound=!0,U(function(){new MutationObserver(function(){E(document,"ln-core:locale-change",{})}).observe(document.documentElement,{attributes:!0,attributeFilter:["lang"],subtree:!0})},"ln-core")))}const nt={};function pt(t,i){if(!t||typeof i!="object")return;const r=t.toLowerCase().split("-")[0];nt[r]=i}function gt(t){if(!t)return null;const i=t.toLowerCase().split("-")[0];return nt[i]||null}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerLocaleFallback=pt,window.lnCore.getLocaleFallback=gt,window.lnCore.ensureLocaleObserver=_t);const G={};function it(t,i){G[t]||(G[t]=document.querySelector('[data-ln-template="'+t+'"]'));const r=G[t];return r?r.content.cloneNode(!0):(console.warn("["+(i||"ln-core")+'] Template "'+t+'" not found'),null)}function lt(t,i,r){if(t){const s=t.querySelector('[data-ln-template="'+i+'"]');if(s)return s.content.cloneNode(!0)}return it(i,r)}function P(t,i){if(!t||!i)return t;const r=t.querySelectorAll("[data-ln-field]");for(let u=0;u<r.length;u++){const h=r[u],f=h.getAttribute("data-ln-field");i[f]!=null&&(h.textContent=i[f])}const s=t.querySelectorAll("[data-ln-attr]");for(let u=0;u<s.length;u++){const h=s[u],f=h.getAttribute("data-ln-attr").split(",");for(let g=0;g<f.length;g++){const w=f[g].trim().split(":");if(w.length!==2)continue;const b=w[0].trim(),L=w[1].trim();i[L]!=null&&h.setAttribute(b,i[L])}}const a=t.querySelectorAll("[data-ln-show]");for(let u=0;u<a.length;u++){const h=a[u],f=h.getAttribute("data-ln-show");f in i&&h.classList.toggle("hidden",!i[f])}const d=t.querySelectorAll("[data-ln-class]");for(let u=0;u<d.length;u++){const h=d[u],f=h.getAttribute("data-ln-class").split(",");for(let g=0;g<f.length;g++){const w=f[g].trim().split(":");if(w.length!==2)continue;const b=w[0].trim(),L=w[1].trim();L in i&&h.classList.toggle(b,!!i[L])}}return t}function mt(t,i){t.matches&&t.matches("[data-ln-form], [data-ln-fillable]")&&(window.lnCore._debugSink&&window.lnCore._debugSink("event","ln-fill",t,i??null),t.dispatchEvent(new CustomEvent("ln-fill",{detail:i??null,bubbles:!0})));const r=t.querySelectorAll("[data-ln-form], [data-ln-fillable]");for(let s=0;s<r.length;s++)window.lnCore._debugSink&&window.lnCore._debugSink("event","ln-fill",r[s],i??null),r[s].dispatchEvent(new CustomEvent("ln-fill",{detail:i??null,bubbles:!0}));return t}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._fillBound||(window.lnCore._fillBound=!0,document.addEventListener("ln-fill",function(t){if(!(!t.target.matches||!t.target.matches("[data-ln-fillable]")))if(t.detail)P(t.target,t.detail);else{const i=t.target.querySelectorAll("[data-ln-field]");for(let r=0;r<i.length;r++)i[r].textContent=""}})));function Y(t,i){if(!t||!i)return t;const r=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);for(;r.nextNode();){const d=r.currentNode;d.textContent.indexOf("{{")!==-1&&(d.textContent=d.textContent.replace(/\{\{\s*(\w+)\s*\}\}/g,function(u,h){return i[h]!==void 0?i[h]:""}))}const s=function(d,u){return i[u]!==void 0?i[u]:""},a=Array.from(t.querySelectorAll("*"));t.nodeType===1&&a.push(t);for(let d=0;d<a.length;d++){const u=a[d],h=u.attributes;for(let f=0;f<h.length;f++){const g=h[f];g.value.indexOf("{{")!==-1&&u.setAttribute(g.name,g.value.replace(/\{\{\s*(\w+)\s*\}\}/g,s))}}return t}function wt(t,i,r,s,a,d){const u={};for(let f=0;f<t.children.length;f++){const g=t.children[f],w=g.getAttribute("data-ln-render-key");w&&(u[w]=g)}const h=document.createDocumentFragment();for(let f=0;f<i.length;f++){const g=i[f],w=String(s(g));let b=u[w];if(b)a(b,g,f);else{const L=it(r,d);if(!L||(Y(L,g),b=L.firstElementChild,!b))continue;b.setAttribute("data-ln-render-key",w),a(b,g,f)}h.appendChild(b)}t.textContent="",t.appendChild(h)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.fillTemplate=Y,window.lnCore.fill=P,window.lnCore.lnFill=mt,window.lnCore.renderList=wt);function $(t,i,r){const s=t.getAttribute(i);return s===null?r:s}function bt(t,i,r){const s=parseInt(t.getAttribute(i),10);return isNaN(s)?r:s}function rt(t,i,r=!1){const s=t.getAttribute(i);if(s===null)return!!r;const a=s.trim().toLowerCase();return!(a==="false"||a==="0")}function yt(t,i){return(t.getAttribute(i)||"").split(",").map(r=>r.trim()).filter(Boolean)}const K=new Map;function Ct(t,i){const r=(t?t.join("|"):"")+"::"+i;if(K.has(r))return K.get(r);const s=new Set(t||[]),a=function(d,u){const h=d.getAttribute(u);return h!==null&&s.has(h)?h:i};return K.set(r,a),a}function vt(t,i,r){const s=parseFloat(t.getAttribute(i));return isNaN(s)?r:s}function St(t,i,r){const s=t.getAttribute(i);if(!s)return r;try{return JSON.parse(s)}catch{return r}}function st(t,i,r,s,a){if(!t||i===null)return!0;const d=s||"ln-component",u=t.type;if(u==="trigger"||u==="marker"||u==="string"||u==="list"||!u||i===""&&t.fallback!==void 0)return!0;const h=f=>{a?console.warn(f,a):console.warn(f)};if(u==="boolean"){const f=i.trim().toLowerCase();return f!==""&&f!=="true"&&f!=="false"&&f!=="1"&&f!=="0"?(h(`[${d}] Invalid value "${i}" for boolean attribute "${r}". Allowed: "true", "false", or presence-only.`),!1):!0}if(u==="enum"){const f=t.values||[];return f.includes(i)?!0:(h(`[${d}] Invalid value "${i}" for attribute "${r}". Allowed: ${f.join(", ")}. Fallback: "${t.fallback}".`),!1)}if(u==="integer"){if(!/^-?\d+$/.test(i))return h(`[${d}] Invalid integer "${i}" for attribute "${r}". Fallback: ${t.fallback}.`),!1;const f=parseInt(i,10);return t.min!==void 0&&f<t.min?(h(`[${d}] Value ${f} for attribute "${r}" is less than min (${t.min}).`),!1):t.max!==void 0&&f>t.max?(h(`[${d}] Value ${f} for attribute "${r}" is greater than max (${t.max}).`),!1):!0}if(u==="float")return isNaN(Number(i))?(h(`[${d}] Invalid float "${i}" for attribute "${r}". Fallback: ${t.fallback}.`),!1):!0;if(u==="json")try{return JSON.parse(i),!0}catch(f){return h(`[${d}] Invalid JSON for attribute "${r}": ${f.message}. Fallback: ${t.fallback}.`),!1}return!0}function At(t,i,r){for(const s in r){const[a,d,u]=r[s];Object.defineProperty(t,s,{get:function(){return a(i,d,u)},enumerable:!0,configurable:!0})}return t}function Dt(t){const i={};for(const r in t){const s=t[r];if(!s||!s.prop)continue;let a=s.read;if(!a&&s.type)switch(s.type){case"enum":a=Ct(s.values,s.fallback);break;case"integer":a=bt;break;case"float":a=vt;break;case"boolean":a=rt;break;case"list":a=yt;break;case"json":a=St;break;case"string":default:a=$;break}a||(a=$),i[s.prop]=[a,r,s.fallback]}return i}function Et(t){const i={};for(const r in t){const s=t[r];s&&s.effect&&(i[r]=s.effect)}return Object.keys(i).length?i:null}function Lt(t){if(t.onAttrChange&&!t.declared)return null;const i=new Set;if(t.effects)for(const r in t.effects)i.add(r);if(t.onAttrChange&&t.declared)for(const r of t.declared)i.add(r);return i}function Q(t,i,r,s){if(t.nodeType!==1)return;const d=i.indexOf("[")!==-1||i.indexOf(".")!==-1||i.indexOf("#")!==-1?i:"["+i+"]",u=Array.from(t.querySelectorAll(d));t.matches&&t.matches(d)&&u.push(t);for(const h of u)if(!h[r]){window.lnCore._persistSink&&h.hasAttribute("data-ln-persist")&&window.lnCore._persistSink(h,i);try{h[r]=new s(h)}catch(f){console.error("["+r+"] init failed",h,f)}}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._bootHolds=window.lnCore._bootHolds||0,window.lnCore._bootQueue=window.lnCore._bootQueue||[]);function kt(){return typeof window<"u"&&window.lnCore&&window.lnCore._bootHolds||0}function xt(t){typeof window<"u"?(window.lnCore=window.lnCore||{},window.lnCore._bootHolds=window.lnCore._bootHolds||0,window.lnCore._bootQueue=window.lnCore._bootQueue||[],window.lnCore._bootHolds>0?window.lnCore._bootQueue.push(t):setTimeout(t,0)):t()}function ot(){window.lnCore=window.lnCore||{};const t=window.lnCore._attrRegistry=window.lnCore._attrRegistry||{byAttr:new Map,reactive:[],persist:[]};return t.byReactive=t.byReactive||new Map,t.reactiveWildcard=t.reactiveWildcard||[],t}function Tt(t){const i=ot(),r=t.observed||[];for(let s=0;s<r.length;s++){const a=r[s];i.byAttr.has(a)||i.byAttr.set(a,[]),i.byAttr.get(a).push(t)}if(i.byDeclaredAttr=i.byDeclaredAttr||new Map,t.attributes)for(const s in t.attributes){i.byDeclaredAttr.has(s)||i.byDeclaredAttr.set(s,[]);const a=i.byDeclaredAttr.get(s);a.some(d=>d.componentTag===t.componentTag)||a.push({spec:t.attributes[s],componentTag:t.componentTag})}if(t.onAttrChange||t.effects){i.reactive.push(t);const s=Lt(t);if(s===null)i.reactiveWildcard.push(t);else for(const a of s)i.byReactive.has(a)||i.byReactive.set(a,[]),i.byReactive.get(a).push(t)}t.persist&&i.persist.push(t)}function at(t,i,r,s){for(let a=0;a<t.length;a++){const d=t[a];if(!i[d.attribute])continue;const u=d.effects&&d.effects[r];u?u(i,r,s):d.onAttrChange&&(!d.declared||d.declared.has(r))&&d.onAttrChange(i,r,s)}}function It(t){const i=t.target,r=t.attributeName;if(t.oldValue===i.getAttribute(r))return;const s=ot(),a=s.byAttr.get(r);if(X()&&s.byDeclaredAttr&&s.byDeclaredAttr.has(r)&&j(i)){const d=s.byDeclaredAttr.get(r),u=i.getAttribute(r);for(let h=0;h<d.length;h++)st(d[h].spec,u,r,d[h].componentTag,i)}if(window.lnCore._debugSink&&(r.indexOf("data-ln-")===0||a)&&window.lnCore._debugSink("attr",r,i,{oldValue:t.oldValue,newValue:i.getAttribute(r)}),r.indexOf("data-ln-")===0){const d=s.byReactive.get(r);d&&at(d,i,r,t.oldValue),s.reactiveWildcard.length&&at(s.reactiveWildcard,i,r,t.oldValue)}if(a)for(let d=0;d<a.length;d++){const u=a[d];if(u.handler){u.handler(i,r,t.oldValue);continue}u.onAttributeChange&&i[u.attribute]?u.onAttributeChange(i,r):(Q(i,u.selector,u.attribute,u.ComponentFn),u.onInit&&u.onInit(i))}}function Ft(){window.lnCore=window.lnCore||{},!window.lnCore._attrObserverBound&&(window.lnCore._attrObserverBound=!0,U(function(){new MutationObserver(function(i){for(let r=0;r<i.length;r++)try{It(i[r])}catch(s){console.error("[ln-core] mutation handler failed",i[r].target,s)}}).observe(document.body,{attributes:!0,subtree:!0,attributeOldValue:!0})},"ln-core"))}function ct(){return window.lnCore=window.lnCore||{},window.lnCore._lifecycleRegistry=window.lnCore._lifecycleRegistry||[]}function qt(t){const i=ct();if(i.length){if(t.target)for(let r=0;r<i.length;r++){const s=i[r];if(s.onSubtreeChange){const a=s.query,d=t.target.nodeType===1?t.target.matches(a)?t.target:t.target.closest(a):t.target.parentElement?t.target.parentElement.closest(a):null;d&&s.onSubtreeChange(d,t)}}for(let r=0;r<t.addedNodes.length;r++){const s=t.addedNodes[r];if(s.nodeType===1)for(let a=0;a<i.length;a++){const d=i[a];Q(s,d.selector,d.attribute,d.ComponentFn),d.onInit&&d.onInit(s)}}for(let r=0;r<t.removedNodes.length;r++){const s=t.removedNodes[r];if(s.nodeType===1)for(let a=0;a<i.length;a++){const d=i[a],u=d.query,h=Array.from(s.querySelectorAll(u));s.matches&&s.matches(u)&&h.push(s);for(let f=0;f<h.length;f++){const g=h[f];if(!document.contains(g)){const w=g[d.attribute];if(w&&typeof w.destroy=="function")try{w.destroy()}catch(b){console.error("["+d.attribute+"] destroy failed",g,b)}delete g[d.attribute]}}}}}}function Ot(){window.lnCore=window.lnCore||{},!window.lnCore._lifecycleObserverBound&&(window.lnCore._lifecycleObserverBound=!0,U(function(){new MutationObserver(function(i){for(let r=0;r<i.length;r++){const s=i[r];if(s.type==="childList")try{qt(s)}catch(a){console.error("[ln-core] lifecycle handler failed",s.target,a)}}}).observe(document.body,{childList:!0,subtree:!0})},"ln-core"))}function Rt(t,i,r,s,a={}){const d=a.extraAttributes||[],u=a.onAttributeChange||null,h=a.onSubtreeChange||null,f=a.onInit||null,g=a.onAttrChange||null,w=a.effects||null,b=a.attributes||null,L=b?Et(b):w,I=b?new Set(Object.keys(b)):null,F=a.persist||null;function M(e){const n=e||document.body;if(Q(n,t,i,r),b&&X())for(const l in b){const o=b[l],c=Array.from(n.querySelectorAll("["+l+"]"));n.matches&&n.matches("["+l+"]")&&c.push(n);for(let _=0;_<c.length;_++){const p=c[_];j(p)&&st(o,p.getAttribute(l),l,s,p)}}f&&f(n)}const T=[];if(t.indexOf("[")!==-1){const e=/\[([\w-]+)/g;let n;for(;(n=e.exec(t))!==null;)T.push(n[1])}else T.push(t);Tt({selector:t,attribute:i,componentTag:s,attributes:b,ComponentFn:r,onInit:f,observed:T.concat(d),onAttributeChange:u,onAttrChange:g,effects:L,declared:I,persist:F}),Ft();const N=t.indexOf("[")!==-1||t.indexOf(".")!==-1||t.indexOf("#")!==-1?t:"["+t+"]";ct().push({selector:t,attribute:i,ComponentFn:r,onInit:f,onSubtreeChange:h,query:N}),Ot(),window[i]=M;function C(){kt()>0?xt(function(){M(document.body)}):M(document.body)}return document.readyState==="loading"?document.addEventListener("DOMContentLoaded",C):C(),M}function Ht(t){let i=!1;for(let r=0;r<t.length;r++){const s=t[r];if(!(s===""||s==null)&&(i=!0,!Number.isFinite(Number(s))))return"string"}return i?"number":"string"}function Mt(t,i,r,s){if(r==="number"){const u=parseFloat(t),h=parseFloat(i);return(isNaN(u)?0:u)-(isNaN(h)?0:h)}const a=t!=null?String(t):"",d=i!=null?String(i):"";return s?s.compare(a,d):a<d?-1:a>d?1:0}function Nt(t,i){let r=!1;return function(){r||(r=!0,queueMicrotask(function(){r=!1,t()}))}}function Wt(t){t=t||{};let i=t.windowSize>0?t.windowSize:1e3,r=t.pageSize>0?t.pageSize:200,s=t.threshold!=null?t.threshold:25,a=t.fetchDebounce!=null?t.fetchDebounce:120;const d=typeof t.requestPage=="function"?t.requestPage:function(){},u=typeof t.onChange=="function"?t.onChange:function(){},h=new Map,f=new Map,g=new Set;let w=0,b=0,L=0,I={sort:null,filters:{},search:""},F=null,M=0,T=0,q=!1;function N(l){f.set(l,++M)}function C(){return!!(I&&(I.search||I.filters&&Object.keys(I.filters).length))}function e(){if(h.size<=i)return;const l=Array.from(h.keys()).sort(function(c,_){return(f.get(c)||0)-(f.get(_)||0)});let o=0;for(;h.size>i&&o<l.length;)h.delete(l[o]),f.delete(l[o]),o++}function n(l,o){g.add(l),d(I,l,o)}return{get:function(l){return h.get(l)},has:function(l){return h.has(l)},peek:function(){return h.size?h.values().next().value:void 0},get logicalTotal(){return w},get grandTotal(){return b},get queryGen(){return L},get size(){return h.size},ensure:function(l,o){clearTimeout(F),T=l;for(let m=l;m<o;m++)h.has(m)&&N(m);if(w<=0)return;const c=Math.max(0,l-s),_=Math.min(w,o+s),p=Math.floor(c/r),S=Math.floor(Math.max(0,_-1)/r);let D=-1;for(let m=p;m<=S;m++){const y=m*r,k=Math.min(r,w-y);let W=!1;const B=Math.max(y,c),R=Math.min(y+k,_);for(let O=B;O<R;O++)if(!h.has(O)){W=!0;break}if(W&&!g.has(y)){D=y;break}}D!==-1&&(F=setTimeout(function(){n(D,r)},a))},ingest:function(l){if(l=l||{},l.queryGen!=null&&l.queryGen!==L)return!1;const o=l.offset||0,c=l.data||[];let _=0;for(let p=0;p<c.length;p++)c[p]!=null&&_++;if(_===0&&(l.provisional||l.filtered>0))return g.delete(o),!1;q&&(h.clear(),f.clear(),q=!1),l.provisional||(b=l.total!=null?l.total:b,w=l.filtered!=null?l.filtered:l.data?l.data.length:w);for(let p=0;p<c.length;p++)c[p]!=null&&(h.set(o+p,c[p]),N(o+p));return g.delete(o),e(),u(),!0},requestInitial:function(l){l&&(I=l),n(0,r)},invalidate:function(l){L++,g.clear(),clearTimeout(F),l&&(I=l),q=!0,n(0,r)},revalidate:function(){L++,g.clear(),clearTimeout(F),q=!0;const l=Math.max(0,Math.floor(T/r)*r);n(l,r)},release:function(l){g.delete(l)},destroy:function(){clearTimeout(F),h.clear(),f.clear(),g.clear()},configure:function(l){l=l||{};let o=!1;if(l.windowSize!=null&&l.windowSize>0&&l.windowSize!==i){const c=l.windowSize<i;i=l.windowSize,c&&e(),o=!0}l.pageSize!=null&&l.pageSize>0&&(r=l.pageSize),l.threshold!=null&&l.threshold>=0&&(s=l.threshold),l.fetchDebounce!=null&&l.fetchDebounce>=0&&(a=l.fetchDebounce),o&&u()},setGrandTotal:function(l){l==null||isNaN(l)||l<0||(b=l,C()||(w=l),u())}}}function dt(t){return(t||"").replace(/^#/,"")}function J(t){const i=t===void 0?location.hash:t,r={},s=dt(i);if(!s)return r;const a=s.split("&");for(let d=0;d<a.length;d++){const u=a[d];if(!u)continue;const h=u.indexOf(":"),f=h>-1?u.slice(0,h):u,g=h>-1?u.slice(h+1):"";if(f)try{r[f]=decodeURIComponent(g)}catch{r[f]=g}}return r}function Bt(t){if(!t)return null;const i=J();return t in i?i[t]:null}function Vt(t,i){if(!t)return;const r=J();i==null?delete r[t]:r[t]=String(i);const a=Object.keys(r).map(function(d){const u=r[d];return u===""?d:d+":"+encodeURIComponent(u)}).join("&");dt(location.hash)!==a&&(location.hash=a)}function Ut(t){return t.button===1||t.ctrlKey||t.metaKey||t.shiftKey?!1:(t.preventDefault(),!0)}function $t(t,i){if(!t||!t.hasAttribute("data-ln-hash"))return null;const r=t.getAttribute("data-ln-hash");if(r&&r.trim()!=="")return r.trim();const s=t.getAttribute("data-ln-sort")||t.getAttribute("data-ln-search-for")||t.getAttribute("data-ln-search")||t.getAttribute("data-ln-filter")||t.id;return s?i?s+"-"+i:s:i||null}function zt(t,i){return!i||i==="none"||t===null||t===void 0?null:String(t)+"."+i}function jt(t){return!t||typeof t!="string"?null:t.endsWith(".asc")?{fieldOrColumn:t.slice(0,-4),direction:"asc"}:t.endsWith(".desc")?{fieldOrColumn:t.slice(0,-5),direction:"desc"}:null}function Gt(t,i){return!t||!Array.isArray(i)||i.length===0?null:t+":"+i.map(encodeURIComponent).join(",")}function Pt(t){if(!t||typeof t!="string")return null;const i=t.indexOf(":");if(i===-1)return null;const r=t.slice(0,i),s=t.slice(i+1),a=s?s.split(",").map(function(d){try{return decodeURIComponent(d)}catch{return d}}).filter(Boolean):[];return{key:r,values:a}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.hashParse=J,window.lnCore.hashGet=Bt,window.lnCore.hashSet=Vt,window.lnCore.hashLinkClick=Ut,window.lnCore.resolveHashNamespace=$t,window.lnCore.hashSortEncode=zt,window.lnCore.hashSortDecode=jt,window.lnCore.hashFilterEncode=Gt,window.lnCore.hashFilterDecode=Pt);function Yt(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const i=Math.random()*16|0;return(t==="x"?i:i&3|8).toString(16)})}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.uuid=Yt),(function(){const t="data-ln-list",i="lnList",r="data-ln-list-empty";if(window[i]!==void 0)return;function f(e,n){if(!e||!e.isDataDriven)return;const l=e.dom.hasAttribute("data-ln-list-window");if(l&&!e._windowed)e._enterWindowedMode(),e._kickWindowInitial();else if(!l&&e._windowed)e._exitWindowedMode();else if(l&&e._windowed){const o=parseInt(n,10);o>0&&e._cache.configure({windowSize:o})}}function g(e,n){if(!e||!e.isDataDriven||!e._windowed||!e._cache)return;const l=parseInt(n,10);l>0&&e._cache.configure({pageSize:l})}function w(e,n){if(!e||!e.isDataDriven||!e._windowed||!e._cache)return;const l=parseInt(n,10);l>=0&&e._cache.configure({threshold:l})}function b(e,n){if(!e||!e.isDataDriven||!e._windowed||!e._cache)return;const l=parseInt(n,10);l>=0&&e._cache.setGrandTotal(l)}const L={"data-ln-list":{prop:"name",type:"string",read:$,fallback:"",description:"List instance name or identifier"},"data-ln-list-source":{prop:"source",type:"string",read:$,fallback:"",description:"Source store or coordinator addressing"},"data-ln-list-selectable":{prop:"_selectable",type:"boolean",read:rt,description:"Enables item selection controls"},"data-ln-list-window":{type:"integer",fallback:1e3,min:10,effect:f,description:"Virtual scrolling window size in items"},"data-ln-list-window-page":{type:"integer",fallback:200,min:5,effect:g,description:"Virtual scrolling slice page size"},"data-ln-list-window-threshold":{type:"integer",fallback:50,min:0,effect:w,description:"Scroll threshold margin in pixels to trigger page fetch"},"data-ln-list-count":{type:"integer",min:0,effect:b,description:"Total item count override for virtual scrollbar calculation"},"data-ln-list-empty":{type:"marker",description:"Container for list empty state"},"data-ln-list-field":{type:"string",description:"Field name mapping for list item binding"}},I=Dt(L);function F(e,n){if(e==null||isNaN(e))return"";try{return new Intl.NumberFormat(et(n)).format(e)}catch{return String(e)}}function M(e){let n=e;for(;n&&n!==document.body&&n!==document.documentElement;){const o=getComputedStyle(n).overflowY;if(o==="auto"||o==="scroll")return n;n=n.parentElement}return null}function T(e){const n=e._scrollContainer||M(e.dom);return{container:n,top:n?n.scrollTop:window.scrollY}}function q(e){e.container?e.container.scrollTop=e.top:window.scrollTo(window.scrollX,e.top)}function N(e){if(!e)return 0;const n=getComputedStyle(e),l=parseFloat(n.marginTop)||0,o=parseFloat(n.marginBottom)||0;return e.offsetHeight+l+o}function C(e){this.dom=e,At(this,e,I),this.tbody=e.querySelector("[data-ln-list-body]")||e,this.isDataDriven=e.hasAttribute("data-ln-list-source"),this._totalSpan=e.querySelector("[data-ln-list-total]"),this._filteredSpan=e.querySelector("[data-ln-list-filtered]"),this._filteredSpan&&(this._filteredWrap=this._filteredSpan.parentElement!==e?this._filteredSpan.parentElement:null),this._selectedSpan=e.querySelector("[data-ln-list-selected]"),this._selectedSpan&&(this._selectedWrap=this._selectedSpan.parentElement!==e?this._selectedSpan.parentElement:null),this._data=[],this._filteredData=[],this.selectedIds=new Set,this._searchTerm="",this._filters={},this._sortField=null,this._sortDir=null,this._virtual=!1,this._itemHeight=0,this._vStart=-1,this._vEnd=-1,this._rafId=null,this._scrollHandler=null,this._resizeHandler=null,this._scrollContainer=null,this.isUl=this.tbody.tagName==="UL"||this.tbody.tagName==="OL";const n=this;return this._onSetSearch=function(l){const o=(l.detail&&l.detail.query!=null?l.detail.query:l.detail&&l.detail.term!=null?l.detail.term:"").trim();n.isDataDriven?(n.currentSearch=o,E(e,"ln-list:search",{list:n.name,query:n.currentSearch}),n._requestData()):(n._searchTerm=o.toLowerCase(),n._applyFilterAndSort(),n._vStart=-1,n._vEnd=-1,n._render(),n._updateFooter(),E(e,"ln-list:filter",{term:n._searchTerm,matched:n._filteredData.length,total:n._data.length}))},e.addEventListener("ln-list:set-search",this._onSetSearch),this._onSearchChange=function(l){l.preventDefault(),n._onSetSearch(l)},e.addEventListener("ln-search:change",this._onSearchChange),this._onRequestClearFilters=function(){n.isDataDriven?(n.currentFilters={},n.currentSearch="",E(e,"ln-list:clear-filters",{list:n.name}),n._requestData()):(n._searchTerm="",n._filters={},n._sortField=null,n._sortDir=null,n._applyFilterAndSort(),n._vStart=-1,n._vEnd=-1,n._render(),n._updateFooter(),E(e,"ln-list:filter",{term:"",matched:n._filteredData.length,total:n._data.length}))},e.addEventListener("ln-list:request-clear-filters",this._onRequestClearFilters),this._selectableActive=!1,this._selectable&&this._enableSelection(),this.isDataDriven?(this.isLoaded=!1,this.totalCount=0,this.visibleCount=0,this.currentSort=null,this.currentFilters={},this.currentSearch="",this._lastTotal=0,this._lastFiltered=0,this._hasInitialSeed=!1,this._windowed=!1,this._cache=null,e.hasAttribute("data-ln-list-window")&&this._enterWindowedMode(),this._onSetData=function(l){const o=l.detail||{},c=o.data||[],_=o.total!=null?o.total:c.length;if(!(n._hasInitialSeed&&!n.isLoaded&&c.length===0&&_===0)){if(n._windowed){n._cache.ingest(o)&&!o.provisional&&e.classList.remove("ln-list--loading");return}n._data=c,n._lastTotal=_,n._lastFiltered=o.filtered!=null?o.filtered:n._data.length,n.totalCount=n._lastTotal,n.visibleCount=n._lastFiltered,n.isLoaded=!0,n._hasInitialSeed=!1,e.classList.remove("ln-list--loading"),n._vStart=-1,n._vEnd=-1,n._applyFilterAndSort(),n._render(),n._updateFooter(),E(e,"ln-list:rendered",{list:n.name,total:n.totalCount,visible:n.visibleCount})}},e.addEventListener("ln-list:set-data",this._onSetData),this._onSetLoading=function(l){const o=l.detail&&l.detail.loading;e.classList.toggle("ln-list--loading",!!o),o&&(n.isLoaded=!1)},e.addEventListener("ln-list:set-loading",this._onSetLoading),this._onPageFailed=function(l){!n._windowed||!n._cache||n._cache.release(l.detail&&l.detail.offset)},e.addEventListener("ln-list:page-failed",this._onPageFailed),this._onRequestRevalidate=function(){!n._windowed||!n._cache||n._cache.revalidate()},e.addEventListener("ln-list:request-revalidate",this._onRequestRevalidate),this._onRequestInvalidate=function(){!n._windowed||!n._cache||n._requestData()},e.addEventListener("ln-list:request-invalidate",this._onRequestInvalidate),this._onSort=function(l){!l.detail||l.detail.field==null||(l.preventDefault(),n.currentSort=l.detail.direction==="none"?null:{field:l.detail.field,direction:l.detail.direction},n._requestData())},e.addEventListener("ln-sort:change",this._onSort),this._onItemClick=function(l){if(l.target.closest("[data-ln-item-select]")||l.target.closest("[data-ln-item-action]")||l.target.closest("a")||l.target.closest("button")||l.ctrlKey||l.metaKey||l.button===1)return;const o=l.target.closest("[data-ln-item]");if(!o)return;const c=o.getAttribute("data-ln-item-id"),_=o._lnRecord||{};E(e,"ln-list:item-click",{list:n.name,id:c,record:_})},this.tbody&&this.tbody.addEventListener("click",this._onItemClick),this._onItemAction=function(l){const o=l.target.closest("[data-ln-item-action]");if(!o)return;const c=o.closest("[data-ln-item]");if(!c)return;const _=o.getAttribute("data-ln-item-action"),p=c.getAttribute("data-ln-item-id"),S=c._lnRecord||{};E(e,"ln-list:item-action",{list:n.name,id:p,action:_,record:S})},this.tbody&&this.tbody.addEventListener("click",this._onItemAction),this.tbody&&this.tbody.children.length>0&&this._parseChildren(),this._windowed?this._kickWindowInitial():E(e,"ln-list:request-data",{list:this.name,sort:this.currentSort,filters:this.currentFilters,search:this.currentSearch})):(this._emptyObserver=null,this.tbody&&this.tbody.children.length>0?this._parseChildren():this.tbody&&(this._emptyObserver=new MutationObserver(function(){n.tbody.children.length>0&&(n._emptyObserver.disconnect(),n._emptyObserver=null,n._parseChildren())}),this._emptyObserver.observe(this.tbody,{childList:!0})),this._onFilterChange=function(l){if(l.preventDefault(),!l.detail)return;const o=l.detail.key,c=l.detail.values||[];if(o){if(c.length===0)delete n._filters[o];else{const _=[];for(let p=0;p<c.length;p++)_.push(c[p].toLowerCase());n._filters[o]=_}n._applyFilterAndSort(),n._vStart=-1,n._vEnd=-1,n._render(),n._updateFooter(),E(e,"ln-list:filter",{term:n._searchTerm,matched:n._filteredData.length,total:n._data.length})}},e.addEventListener("ln-filter:change",this._onFilterChange),this._onSort=function(l){if(!l.detail||l.detail.field==null)return;l.preventDefault();const o=l.detail.direction==="none"?null:l.detail.direction;n._sortField=o===null?null:l.detail.field,n._sortDir=o,n._applyFilterAndSort(),n._vStart=-1,n._vEnd=-1,n._render(),n._updateFooter(),E(e,"ln-list:sorted",{field:n._sortField,direction:l.detail&&l.detail.direction,matched:n._filteredData.length,total:n._data.length})},e.addEventListener("ln-sort:change",this._onSort)),this}C.prototype._parseChildren=function(){const e=Array.from(this.tbody.children).filter(n=>!n.classList.contains("ln-list__spacer"));this._data=[],e.length>0&&(this._itemHeight=N(e[0])||50);for(let n=0;n<e.length;n++){const l=e[n],o=l.getAttribute("data-ln-item-id")||l.getAttribute("id"),c=l.textContent.trim().toLowerCase();let _=null;if(this.isDataDriven){_={},o!=null&&(_.id=o);const D=l.querySelectorAll("[data-ln-list-field]");for(let m=0;m<D.length;m++){const y=D[m],k=y.getAttribute("data-ln-list-field");k&&(_[k]=Z(y))}}const p={},S=l.querySelectorAll("[data-ln-list-field], [data-ln-field]");for(let D=0;D<S.length;D++){const m=S[D],y=m.getAttribute("data-ln-list-field")||m.getAttribute("data-ln-field");y&&(p[y]=Z(m))}for(let D=0;D<l.attributes.length;D++){const m=l.attributes[D];if(m.name.startsWith("data-")&&!m.name.startsWith("data-ln-")){const y=m.name.slice(5);y&&(p[y]=m.value)}}this._data.push({html:l.outerHTML,id:o,searchText:c,fields:p,..._||{}})}this._filteredData=this._data.slice(),this._data.length>0&&(this._hasInitialSeed=!0),this.isDataDriven&&(this._lastTotal=this._data.length,this._lastFiltered=this._data.length,this.totalCount=this._data.length,this.visibleCount=this._data.length,this._updateFooter()),this._render(),E(this.dom,"ln-list:ready",{total:this._data.length})},C.prototype._applyFilterAndSort=function(){if(this.isDataDriven)this._filteredData=this._data?this._data.slice():[],this.visibleCount=this.isDataDriven&&this._lastFiltered!=null?this._lastFiltered:this._filteredData.length;else{const e=this._searchTerm,n=e?e.split(/\s+/).filter(Boolean):[],l=this._filters||{},o=Object.keys(l).length>0;if(n.length===0&&!o?this._filteredData=this._data.slice():this._filteredData=this._data.filter(function(c){if(n.length>0&&!n.every(function(p){return c.searchText&&c.searchText.indexOf(p)!==-1}))return!1;if(o)for(const _ in l){const p=l[_];if(p&&p.length>0){const S=c.fields&&c.fields[_]!==void 0?c.fields[_]:c[_]!==void 0?c[_]:null,D=S!=null?String(S).toLowerCase():"";if(p.indexOf(D)===-1)return!1}}return!0}),this._sortField&&this._sortDir){const c=this._sortField,_=this._sortDir==="desc"?-1:1,p=typeof Intl<"u"?new Intl.Collator(et(this.dom),{sensitivity:"base"}):null,S=this._filteredData.map(function(m){return m.fields&&m.fields[c]!==void 0?m.fields[c]:m[c]}),D=Ht(S);this._filteredData.sort(function(m,y){const k=m.fields&&m.fields[c]!==void 0?m.fields[c]:m[c],W=y.fields&&y.fields[c]!==void 0?y.fields[c]:y[c];return Mt(k,W,D,p)*_})}}},C.prototype._render=function(){if(this.tbody)if(this.isDataDriven){if(this._windowed){this._renderWindowed();return}const e=this._lastTotal,n=this.visibleCount;if(e===0||this._filteredData.length===0||n===0){this._disableVirtualScroll(),this._showEmptyState();return}this._filteredData.length>200?(this._enableVirtualScroll(),this._renderVirtual()):(this._disableVirtualScroll(),this._renderAll())}else{const e=this._filteredData.length;e===0&&(this._searchTerm||Object.keys(this._filters||{}).length>0)?(this._disableVirtualScroll(),this._showEmptyState()):e>200?(this._enableVirtualScroll(),this._renderVirtual()):(this._disableVirtualScroll(),this._renderAll())}},C.prototype._renderAll=function(){if(this.isDataDriven){const e=this._filteredData,n=document.createDocumentFragment();for(let o=0;o<e.length;o++){const c=this._buildItem(e[o]);c&&n.appendChild(c)}const l=T(this);this.tbody.replaceChildren(n),q(l),this._selectable&&this._updateSelectAll()}else{const e=[],n=this._filteredData;for(let o=0;o<n.length;o++)e.push(n[o].html);const l=T(this);this.tbody.innerHTML=e.join(""),q(l),this._selectable&&this._restoreSelection()}},C.prototype._readGridLayout=function(){const e=getComputedStyle(this.tbody),n=e.gridTemplateColumns;let l=1;if(n&&n!=="none"){const c=n.trim().split(/\s+/).filter(Boolean);c.length>0&&(l=c.length)}const o=parseFloat(e.rowGap);return{columns:l,rowGap:isNaN(o)?0:o}},C.prototype._measureItemHeight=function(){if(this._windowed){const e=this._cache.peek(),n=e?this._buildItem(e):this._buildPlaceholderItem();n&&(this.tbody.textContent="",this.tbody.appendChild(n),this._itemHeight=N(n)||50,this.tbody.textContent="")}else if(this.isDataDriven){if(this._data.length>0){const e=this._buildItem(this._data[0]);e&&(this.tbody.textContent="",this.tbody.appendChild(e),this._itemHeight=N(e)||50,this.tbody.textContent="")}}else{const e=this.tbody.children;e.length>0&&(this._itemHeight=N(e[0])||50)}},C.prototype._enableVirtualScroll=function(){if(this._virtual)return;this._virtual=!0,this._vStart=-1,this._vEnd=-1;const e=this;this._itemHeight||this._measureItemHeight(),this._scrollContainer=M(this.dom);const n=this._scrollContainer||window;this._scrollHandler=function(){e._rafId||(e._rafId=requestAnimationFrame(function(){e._rafId=null,e._windowed?e._renderWindowed():e._renderVirtual()}))},this._resizeHandler=function(){e._itemHeight=0,e._measureItemHeight(),e._vStart=-1,e._vEnd=-1,e._windowed?e._renderWindowed():e._renderVirtual()},n.addEventListener("scroll",this._scrollHandler,{passive:!0}),window.addEventListener("resize",this._resizeHandler,{passive:!0})},C.prototype._disableVirtualScroll=function(){this._virtual&&(this._virtual=!1,this._scrollHandler&&((this._scrollContainer||window).removeEventListener("scroll",this._scrollHandler),this._scrollHandler=null),this._resizeHandler&&(window.removeEventListener("resize",this._resizeHandler),this._resizeHandler=null),this._scrollContainer=null,this._rafId&&(cancelAnimationFrame(this._rafId),this._rafId=null),this._vStart=-1,this._vEnd=-1)},C.prototype._renderVirtual=function(){const e=this._filteredData,n=e.length,l=this._itemHeight;if(!l||!n)return;const o=this._scrollContainer;let c,_;if(o){const x=this.tbody.getBoundingClientRect(),A=o.getBoundingClientRect(),v=o===this.tbody?0:x.top-A.top+o.scrollTop;c=o.scrollTop-v,_=o.clientHeight}else{const A=this.tbody.getBoundingClientRect().top+window.scrollY;c=window.scrollY-A,_=window.innerHeight}const p=this._readGridLayout(),S=p.columns,D=p.rowGap,m=l+D,y=Math.ceil(n/S);let k=Math.max(0,Math.floor(c/m)-15);k=Math.min(k,y);const W=Math.ceil(_/m)+30,B=Math.min(k+W,y),R=Math.min(k*S,n),O=Math.min(B*S,n);if(R===this._vStart&&O===this._vEnd)return;this._vStart=R,this._vEnd=O;const V=k*m,H=(y-B)*m;if(this.isDataDriven){const x=document.createDocumentFragment();if(V>0){const v=document.createElement(this.isUl?"li":"div");v.className="ln-list__spacer",v.setAttribute("aria-hidden","true"),v.style.height=V+"px",x.appendChild(v)}for(let v=R;v<O;v++){const z=this._buildItem(e[v]);z&&x.appendChild(z)}if(H>0){const v=document.createElement(this.isUl?"li":"div");v.className="ln-list__spacer",v.setAttribute("aria-hidden","true"),v.style.height=H+"px",x.appendChild(v)}const A=T(this);this.tbody.replaceChildren(x),q(A),this._selectable&&this._updateSelectAll()}else{let x="";V>0&&(x+=`<${this.isUl?"li":"div"} class="ln-list__spacer" aria-hidden="true" style="height:${V}px"></${this.isUl?"li":"div"}>`);for(let v=R;v<O;v++)x+=e[v].html;H>0&&(x+=`<${this.isUl?"li":"div"} class="ln-list__spacer" aria-hidden="true" style="height:${H}px"></${this.isUl?"li":"div"}>`);const A=T(this);this.tbody.innerHTML=x,q(A),this._selectable&&this._restoreSelection()}},C.prototype._buildPlaceholderItem=function(){const e=document.createElement(this.isUl?"li":"div");return e.className="ln-list__placeholder",e.setAttribute("aria-hidden","true"),e.style.height=this._itemHeight+"px",e},C.prototype._renderWindowed=function(){if(this.isLoaded&&this._cache.logicalTotal===0){this._disableVirtualScroll(),this._showEmptyState();return}this._virtual||this._enableVirtualScroll();const e=this._itemHeight;if(!e)return;const n=this._scrollContainer;let l,o;if(n){const A=this.tbody.getBoundingClientRect(),v=n.getBoundingClientRect(),z=n===this.tbody?0:A.top-v.top+n.scrollTop;l=n.scrollTop-z,o=n.clientHeight}else{const v=this.tbody.getBoundingClientRect().top+window.scrollY;l=window.scrollY-v,o=window.innerHeight}const c=this._readGridLayout(),_=c.columns,p=c.rowGap,S=e+p,D=this._cache.logicalTotal,m=Math.ceil(D/_);let y=Math.max(0,Math.floor(l/S)-15);y=Math.min(y,m);const k=Math.ceil(o/S)+30,W=Math.min(y+k,m),B=Math.min(y*_,D),R=Math.min(W*_,D),O=y*S,V=(m-W)*S,H=document.createDocumentFragment();if(O>0){const A=document.createElement(this.isUl?"li":"div");A.className="ln-list__spacer",A.setAttribute("aria-hidden","true"),A.style.height=O+"px",H.appendChild(A)}for(let A=B;A<R;A++)if(this._cache.has(A)){const v=this._buildItem(this._cache.get(A));v&&H.appendChild(v)}else H.appendChild(this._buildPlaceholderItem());if(V>0){const A=document.createElement(this.isUl?"li":"div");A.className="ln-list__spacer",A.setAttribute("aria-hidden","true"),A.style.height=V+"px",H.appendChild(A)}const x=T(this);this.tbody.replaceChildren(H),q(x),this._vStart=B,this._vEnd=R,this._cache.ensure(B,R)},C.prototype._showEmptyState=function(){let e=null;if(this.isDataDriven){const n=this._lastTotal!=null?this._lastTotal:this._data.length,o=this.visibleCount===0&&n>0,c=o?this.name+"-empty-filtered":this.name+"-empty";if(e=lt(this.dom,c,"ln-list"),!e){const _=this.dom.querySelector("template[data-ln-empty], template[data-ln-list-empty]");if(_){const p=o?"search":"initial",S=_.content.querySelector(`[data-ln-empty-when="${p}"]`)||_.content.firstElementChild;S&&(e=document.importNode(S,!0))}}}else{const n=this.dom.querySelector(`template[${r}]`);if(n){const l=n.content.firstElementChild;l&&(e=document.importNode(l,!0))}}if(e)if(e.tagName==="LI"||e.tagName==="TR")this.tbody.replaceChildren(e);else{const n=document.createElement(this.isUl?"li":"div");n.appendChild(e),this.tbody.replaceChildren(n)}else this.tbody.replaceChildren();E(this.dom,"ln-list:empty",{term:this.isDataDriven?this.currentSearch||"":this._searchTerm,total:this.isDataDriven?this._lastTotal!=null?this._lastTotal:this._data.length:this._data.length})},C.prototype._buildItem=function(e){let n=lt(this.dom,this.name+"-row","ln-list");if(!n){const o=this.dom.querySelector("template[data-ln-item]");o&&(n=document.importNode(o.content,!0))}let l=n?n.querySelector("[data-ln-item]")||n.firstElementChild:null;if(l)Y(l,e),P(l,e);else if(e&&e.html){const o=document.createElement(this.isUl?"ul":"div");o.innerHTML=e.html,l=o.firstElementChild}else if(l=document.createElement(this.isUl?"li":"div"),l.setAttribute("data-ln-item",""),e&&typeof e=="object"){for(const o in e)if(o!=="html"&&e[o]!=null){const c=document.createElement("span");c.setAttribute("data-ln-field",o),c.textContent=String(e[o]),l.appendChild(c)}}if(l._lnRecord=e,e&&e.id!=null&&(l.setAttribute("data-ln-item-id",e.id),this._selectable&&this.selectedIds.has(String(e.id)))){l.classList.add("ln-item-selected");const o=l.querySelector("[data-ln-item-select]");o&&(o.checked=!0)}return l},C.prototype._restoreSelection=function(){if(!this.tbody)return;const e=this.tbody.querySelectorAll("[data-ln-item]");for(let n=0;n<e.length;n++){const l=e[n].getAttribute("data-ln-item-id"),o=l!=null&&this.selectedIds.has(String(l));e[n].classList.toggle("ln-item-selected",o);const c=e[n].querySelector("[data-ln-item-select]");c&&(c.checked=o)}this._updateSelectAll()},C.prototype._enableSelection=function(){if(this._selectableActive)return;this._selectableActive=!0;const e=this;this._onSelectionChange=function(n){const l=n.target.closest("[data-ln-item-select]");if(!l)return;const o=l.closest("[data-ln-item]");if(!o)return;const c=o.getAttribute("data-ln-item-id");c!=null&&(l.checked?(e.selectedIds.add(String(c)),o.classList.add("ln-item-selected")):(e.selectedIds.delete(String(c)),o.classList.remove("ln-item-selected")),e._updateSelectAll(),e._updateFooter(),E(e.dom,"ln-list:select",{list:e.name,selectedIds:e.selectedIds,count:e.selectedIds.size}))},this.tbody.addEventListener("change",this._onSelectionChange),this._selectAllCheckbox=this.dom.querySelector("[data-ln-list-select-all]"),this._selectAllCheckbox&&(this._onSelectAll=function(){const n=e._selectAllCheckbox.checked,l=e.tbody.querySelectorAll("[data-ln-item]");for(let o=0;o<l.length;o++){const c=l[o],_=c.getAttribute("data-ln-item-id"),p=c.querySelector("[data-ln-item-select]");_!=null&&(n?(e.selectedIds.add(String(_)),c.classList.add("ln-item-selected")):(e.selectedIds.delete(String(_)),c.classList.remove("ln-item-selected")),p&&(p.checked=n))}E(e.dom,"ln-list:select-all",{list:e.name,selected:n}),E(e.dom,"ln-list:select",{list:e.name,selectedIds:e.selectedIds,count:e.selectedIds.size}),e._updateFooter()},this._selectAllCheckbox.addEventListener("change",this._onSelectAll))},C.prototype._updateSelectAll=function(){if(!this._selectAllCheckbox)return;const e=this.tbody.querySelectorAll("[data-ln-item]");let n=e.length>0;for(let l=0;l<e.length;l++){const o=e[l].getAttribute("data-ln-item-id");if(o!=null&&!this.selectedIds.has(String(o))){n=!1;break}}this._selectAllCheckbox.checked=n},C.prototype._requestData=function(){if(this._windowed){this.dom.classList.add("ln-list--loading"),this._cache.invalidate({sort:this.currentSort,filters:this.currentFilters,search:this.currentSearch});return}ut(this,"ln-list:request-data","list")},C.prototype._enterWindowedMode=function(){const e=this,n=this.dom,l=parseInt(n.getAttribute("data-ln-list-window"),10),o=parseInt(n.getAttribute("data-ln-list-window-page"),10),c=parseInt(n.getAttribute("data-ln-list-window-threshold"),10);this._onCacheChange=function(){!e._windowed||!e._cache||(e.totalCount=e._cache.grandTotal,e.visibleCount=e._cache.logicalTotal,e._lastTotal=e._cache.grandTotal,e.isLoaded=!0,e._vStart=-1,e._vEnd=-1,e._render(),e._updateFooter(),E(n,"ln-list:rendered",{list:e.name,total:e.totalCount,visible:e.visibleCount}))},this._renderBatch=Nt(this._onCacheChange),this._cache=Wt({windowSize:l>0?l:1e3,pageSize:o>0?o:200,threshold:c>=0?c:25,fetchDebounce:120,requestPage:function(_,p,S){E(n,"ln-list:request-data",{list:e.name,sort:_.sort,filters:_.filters,search:_.search,offset:p,limit:S,queryGen:e._cache.queryGen})},onChange:this._renderBatch}),this._windowed=!0,this._selectable&&this._selectAllCheckbox&&this._selectAllCheckbox.classList.add("hidden")},C.prototype._kickWindowInitial=function(){if(this._data.length>0){const e=parseInt(this.dom.getAttribute("data-ln-list-count"),10),n=e>0?e:this._data.length;this._cache.ingest({data:this._data,offset:0,total:n,filtered:n})}else this.dom.classList.add("ln-list--loading"),this._cache.requestInitial({sort:this.currentSort,filters:this.currentFilters,search:this.currentSearch})},C.prototype._exitWindowedMode=function(){this._disableVirtualScroll(),this._cache&&this._cache.destroy(),this._cache=null,this._windowed=!1,this._renderBatch=null,this._onCacheChange=null,this._selectAllCheckbox&&this._selectAllCheckbox.classList.remove("hidden"),this._itemHeight=0,this._vStart=-1,this._vEnd=-1,this._data=[],this._filteredData=[],this.dom.classList.add("ln-list--loading"),this._requestData()},C.prototype._updateFooter=function(){let e=0,n=0;this.isDataDriven?(e=this._lastTotal!=null?this._lastTotal:this._data.length,n=this.visibleCount):(e=this._data.length,n=this._filteredData.length);const l=n<e;if(this._totalSpan&&(this._totalSpan.textContent=F(e,this.dom)),this._filteredSpan&&(this._filteredSpan.textContent=l?F(n,this.dom):""),this._filteredWrap&&this._filteredWrap.classList.toggle("hidden",!l),this._selectedSpan){const o=this.selectedIds?this.selectedIds.size:0;this._selectedSpan.textContent=o>0?F(o,this.dom):"",this._selectedWrap&&this._selectedWrap.classList.toggle("hidden",o===0)}},C.prototype.destroy=function(){this.dom[i]&&(this._disableVirtualScroll(),this.dom.removeEventListener("ln-list:set-search",this._onSetSearch),this.dom.removeEventListener("ln-search:change",this._onSearchChange),this.dom.removeEventListener("ln-list:request-clear-filters",this._onRequestClearFilters),this.isDataDriven?(this._cache&&this._cache.destroy(),this.dom.removeEventListener("ln-list:set-data",this._onSetData),this.dom.removeEventListener("ln-list:set-loading",this._onSetLoading),this.dom.removeEventListener("ln-list:page-failed",this._onPageFailed),this.dom.removeEventListener("ln-list:request-revalidate",this._onRequestRevalidate),this.dom.removeEventListener("ln-list:request-invalidate",this._onRequestInvalidate),this.dom.removeEventListener("ln-sort:change",this._onSort),this.tbody&&(this.tbody.removeEventListener("click",this._onItemClick),this.tbody.removeEventListener("click",this._onItemAction))):(this._emptyObserver&&(this._emptyObserver.disconnect(),this._emptyObserver=null),this._onFilterChange&&this.dom.removeEventListener("ln-filter:change",this._onFilterChange),this._onSort&&this.dom.removeEventListener("ln-sort:change",this._onSort)),this._onSelectionChange&&this.tbody&&this.tbody.removeEventListener("change",this._onSelectionChange),this._selectAllCheckbox&&this._onSelectAll&&this._selectAllCheckbox.removeEventListener("change",this._onSelectAll),this._data=[],this._filteredData=[],delete this.dom[i])},Rt(t,i,C,"ln-list",{attributes:L})})()})();
|