@livenetworks/ashlar 1.6.1 → 2.0.0

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.
Files changed (559) hide show
  1. package/LICENSE +641 -0
  2. package/README.md +202 -86
  3. package/{js → components}/COMPONENTS.md +1116 -1108
  4. package/{js → components}/index.js +81 -58
  5. package/{js → components}/ln-accordion/README.md +7 -6
  6. package/components/ln-accordion/ln-accordion-dev.scss +8 -0
  7. package/components/ln-accordion/ln-accordion.js +1 -0
  8. package/components/ln-accordion/ln-accordion.schema.json +30 -0
  9. package/components/ln-accordion/ln-accordion.scss +8 -0
  10. package/{js → components}/ln-accordion/src/ln-accordion.js +8 -2
  11. package/{js → components}/ln-ajax/README.md +171 -160
  12. package/components/ln-ajax/ln-ajax-dev.scss +8 -0
  13. package/components/ln-ajax/ln-ajax.js +1 -0
  14. package/components/ln-ajax/ln-ajax.schema.json +30 -0
  15. package/{js → components}/ln-ajax/src/ln-ajax.js +65 -30
  16. package/{js → components}/ln-api-connector/README.md +27 -5
  17. package/components/ln-api-connector/ln-api-connector.js +1 -0
  18. package/components/ln-api-connector/ln-api-connector.schema.json +96 -0
  19. package/components/ln-api-connector/src/connector-core.js +97 -0
  20. package/components/ln-api-connector/src/ln-api-connector.js +447 -0
  21. package/{js → components}/ln-api-queue/README.md +12 -9
  22. package/components/ln-api-queue/ln-api-queue.js +1 -0
  23. package/components/ln-api-queue/ln-api-queue.schema.json +34 -0
  24. package/{js → components}/ln-api-queue/src/ln-api-queue.js +33 -14
  25. package/{js → components}/ln-api-queue/src/queue-storage.js +7 -3
  26. package/{js → components}/ln-autoresize/README.md +129 -127
  27. package/components/ln-autoresize/ln-autoresize-dev.scss +8 -0
  28. package/components/ln-autoresize/ln-autoresize.js +1 -0
  29. package/components/ln-autoresize/ln-autoresize.schema.json +22 -0
  30. package/{js → components}/ln-autoresize/src/ln-autoresize.js +8 -1
  31. package/{js → components}/ln-autosave/README.md +127 -124
  32. package/components/ln-autosave/ln-autosave-dev.scss +13 -0
  33. package/components/ln-autosave/ln-autosave.js +1 -0
  34. package/components/ln-autosave/ln-autosave.schema.json +48 -0
  35. package/components/ln-autosave/src/autosave-model.js +34 -0
  36. package/{js → components}/ln-autosave/src/ln-autosave.js +65 -58
  37. package/components/ln-chart/README.md +145 -0
  38. package/components/ln-chart/ln-chart-dev.scss +20 -0
  39. package/components/ln-chart/ln-chart.js +1 -0
  40. package/components/ln-chart/ln-chart.schema.json +146 -0
  41. package/components/ln-chart/ln-chart.scss +8 -0
  42. package/components/ln-chart/src/chart-model.js +154 -0
  43. package/components/ln-chart/src/ln-chart.js +176 -0
  44. package/{js → components}/ln-circular-progress/README.md +15 -14
  45. package/components/ln-circular-progress/ln-circular-progress-dev.scss +8 -0
  46. package/components/ln-circular-progress/ln-circular-progress.js +1 -0
  47. package/components/ln-circular-progress/ln-circular-progress.schema.json +42 -0
  48. package/{js → components}/ln-circular-progress/src/ln-circular-progress.js +32 -50
  49. package/{js → components}/ln-confirm/README.md +69 -18
  50. package/components/ln-confirm/ln-confirm-dev.scss +24 -0
  51. package/components/ln-confirm/ln-confirm.js +1 -0
  52. package/components/ln-confirm/ln-confirm.schema.json +66 -0
  53. package/components/ln-confirm/ln-confirm.scss +24 -0
  54. package/{js → components}/ln-confirm/src/ln-confirm.js +180 -171
  55. package/{js → components}/ln-core/README.md +374 -149
  56. package/components/ln-core/attrs.js +273 -0
  57. package/components/ln-core/compare.js +40 -0
  58. package/components/ln-core/crypto.js +265 -0
  59. package/components/ln-core/date.js +50 -0
  60. package/components/ln-core/dom.js +115 -0
  61. package/components/ln-core/events.js +122 -0
  62. package/components/ln-core/form.js +136 -0
  63. package/{js → components}/ln-core/hash.js +149 -92
  64. package/components/ln-core/helpers.js +33 -0
  65. package/components/ln-core/http.js +48 -0
  66. package/components/ln-core/index.js +11 -0
  67. package/components/ln-core/lifecycle.js +403 -0
  68. package/components/ln-core/ln-core.schema.json +109 -0
  69. package/components/ln-core/locale.js +55 -0
  70. package/components/ln-core/matching.js +78 -0
  71. package/components/ln-core/number.js +125 -0
  72. package/components/ln-core/progress.js +30 -0
  73. package/components/ln-core/template.js +206 -0
  74. package/{js → components}/ln-core/window-cache.js +247 -213
  75. package/{js → components}/ln-couchdb-connector/README.md +7 -5
  76. package/components/ln-couchdb-connector/ln-couchdb-connector.js +1 -0
  77. package/components/ln-couchdb-connector/ln-couchdb-connector.schema.json +50 -0
  78. package/{js → components}/ln-couchdb-connector/src/ln-couchdb-connector.js +29 -43
  79. package/{js → components}/ln-data-coordinator/README.md +109 -73
  80. package/components/ln-data-coordinator/ln-data-coordinator-dev.scss +8 -0
  81. package/components/ln-data-coordinator/ln-data-coordinator.js +1 -0
  82. package/components/ln-data-coordinator/ln-data-coordinator.schema.json +196 -0
  83. package/components/ln-data-coordinator/src/data-read-policy.js +41 -0
  84. package/{js → components}/ln-data-coordinator/src/ln-data-coordinator.js +411 -154
  85. package/{js → components}/ln-data-coordinator/src/mutation-receipts.js +0 -5
  86. package/{js → components}/ln-data-store/README.md +42 -17
  87. package/components/ln-data-store/ln-data-store-dev.scss +13 -0
  88. package/components/ln-data-store/ln-data-store.js +1 -0
  89. package/components/ln-data-store/ln-data-store.schema.json +84 -0
  90. package/components/ln-data-store/src/data-store-model.js +155 -0
  91. package/{js → components}/ln-data-store/src/ln-data-store.js +407 -105
  92. package/components/ln-data-store/src/window-index.js +119 -0
  93. package/{js → components}/ln-date/README.md +17 -7
  94. package/{js → components}/ln-date/ln-date-dev.scss +14 -14
  95. package/components/ln-date/ln-date.js +1 -0
  96. package/components/ln-date/ln-date.schema.json +92 -0
  97. package/components/ln-date/src/date-model.js +186 -0
  98. package/components/ln-date/src/ln-date.js +486 -0
  99. package/components/ln-debug/README.md +132 -0
  100. package/components/ln-debug/ln-debug.js +1 -0
  101. package/components/ln-debug/ln-debug.schema.json +28 -0
  102. package/components/ln-debug/src/console-sink.js +19 -0
  103. package/components/ln-debug/src/debug-verifier.js +331 -0
  104. package/components/ln-debug/src/gate.js +95 -0
  105. package/components/ln-debug/src/generated-attributes.js +299 -0
  106. package/components/ln-debug/src/ln-debug.js +60 -0
  107. package/{js → components}/ln-dropdown/README.md +150 -140
  108. package/components/ln-dropdown/ln-dropdown-dev.scss +13 -0
  109. package/components/ln-dropdown/ln-dropdown.js +1 -0
  110. package/components/ln-dropdown/ln-dropdown.schema.json +90 -0
  111. package/components/ln-dropdown/ln-dropdown.scss +18 -0
  112. package/{js → components}/ln-dropdown/src/ln-dropdown.js +114 -11
  113. package/{js → components}/ln-editor/README.md +11 -9
  114. package/components/ln-editor/ln-editor-dev.scss +18 -0
  115. package/components/ln-editor/ln-editor.js +1 -0
  116. package/components/ln-editor/ln-editor.schema.json +58 -0
  117. package/components/ln-editor/ln-editor.scss +13 -0
  118. package/{js → components}/ln-editor/src/ln-editor.js +59 -11
  119. package/{js → components}/ln-external-links/README.md +10 -8
  120. package/components/ln-external-links/ln-external-links.js +1 -0
  121. package/components/ln-external-links/ln-external-links.schema.json +18 -0
  122. package/{js → components}/ln-external-links/src/ln-external-links.js +13 -11
  123. package/{js → components}/ln-fill/README.md +6 -8
  124. package/components/ln-fill/ln-fill.js +1 -0
  125. package/components/ln-fill/ln-fill.schema.json +23 -0
  126. package/{js → components}/ln-fill/src/ln-fill.js +7 -1
  127. package/components/ln-filter/README.md +131 -0
  128. package/components/ln-filter/ln-filter-dev.scss +13 -0
  129. package/components/ln-filter/ln-filter.js +1 -0
  130. package/components/ln-filter/ln-filter.schema.json +153 -0
  131. package/components/ln-filter/src/filter-model.js +185 -0
  132. package/components/ln-filter/src/ln-filter.js +435 -0
  133. package/{js → components}/ln-form/README.md +260 -264
  134. package/components/ln-form/ln-form-dev.scss +8 -0
  135. package/components/ln-form/ln-form.js +1 -0
  136. package/components/ln-form/ln-form.schema.json +45 -0
  137. package/{js → components}/ln-form/src/ln-form.js +107 -99
  138. package/{js → components}/ln-http/README.md +11 -6
  139. package/components/ln-http/ln-http.js +1 -0
  140. package/components/ln-http/ln-http.schema.json +6 -0
  141. package/components/ln-http/src/http-core.js +51 -0
  142. package/{js → components}/ln-http/src/ln-http.js +28 -33
  143. package/{js → components}/ln-icon/README.md +16 -9
  144. package/components/ln-icon/ln-icon.schema.json +6 -0
  145. package/components/ln-include/README.md +75 -0
  146. package/components/ln-include/ln-include-dev.scss +13 -0
  147. package/components/ln-include/ln-include.js +1 -0
  148. package/components/ln-include/ln-include.schema.json +23 -0
  149. package/components/ln-include/src/ln-include.js +111 -0
  150. package/components/ln-key/README.md +130 -0
  151. package/components/ln-key/ln-key-dev.scss +18 -0
  152. package/components/ln-key/ln-key.js +1 -0
  153. package/components/ln-key/ln-key.schema.json +56 -0
  154. package/components/ln-key/src/key-model.js +146 -0
  155. package/components/ln-key/src/ln-key.js +201 -0
  156. package/{js → components}/ln-link/README.md +7 -9
  157. package/components/ln-link/ln-link-dev.scss +8 -0
  158. package/components/ln-link/ln-link.js +1 -0
  159. package/components/ln-link/ln-link.schema.json +22 -0
  160. package/{js → components}/ln-link/src/ln-link.js +16 -11
  161. package/components/ln-list/README.md +152 -0
  162. package/components/ln-list/ln-list-dev.scss +8 -0
  163. package/components/ln-list/ln-list.js +1 -0
  164. package/components/ln-list/ln-list.schema.json +166 -0
  165. package/components/ln-list/ln-list.scss +25 -0
  166. package/{js → components}/ln-list/src/ln-list.js +1301 -1216
  167. package/{js → components}/ln-modal/README.md +13 -10
  168. package/components/ln-modal/ln-modal-dev.scss +18 -0
  169. package/components/ln-modal/ln-modal.js +1 -0
  170. package/components/ln-modal/ln-modal.schema.json +54 -0
  171. package/components/ln-modal/ln-modal.scss +51 -0
  172. package/{js → components}/ln-modal/src/ln-modal.js +164 -137
  173. package/{js → components}/ln-nav/README.md +11 -11
  174. package/components/ln-nav/ln-nav.js +1 -0
  175. package/components/ln-nav/ln-nav.schema.json +25 -0
  176. package/{js → components}/ln-nav/src/ln-nav.js +25 -14
  177. package/components/ln-number/README.md +205 -0
  178. package/{js → components}/ln-number/ln-number-dev.scss +13 -13
  179. package/components/ln-number/ln-number.js +1 -0
  180. package/components/ln-number/ln-number.schema.json +63 -0
  181. package/components/ln-number/src/ln-number.js +400 -0
  182. package/components/ln-number/src/number-model.js +31 -0
  183. package/components/ln-obfuscator/README.md +60 -0
  184. package/components/ln-obfuscator/ln-obfuscator.js +1 -0
  185. package/components/ln-obfuscator/ln-obfuscator.schema.json +49 -0
  186. package/components/ln-obfuscator/src/ln-obfuscator.js +159 -0
  187. package/components/ln-obfuscator/src/obfuscator-model.js +250 -0
  188. package/{js → components}/ln-options/README.md +3 -1
  189. package/components/ln-options/ln-options-dev.scss +13 -0
  190. package/components/ln-options/ln-options.js +1 -0
  191. package/components/ln-options/ln-options.schema.json +41 -0
  192. package/{js → components}/ln-options/src/ln-options.js +13 -5
  193. package/components/ln-persist/README.md +151 -0
  194. package/components/ln-persist/ln-persist.js +1 -0
  195. package/components/ln-persist/ln-persist.schema.json +28 -0
  196. package/components/ln-persist/src/ln-persist.js +83 -0
  197. package/components/ln-picklist/README.md +230 -0
  198. package/components/ln-picklist/ln-picklist-dev.scss +22 -0
  199. package/components/ln-picklist/ln-picklist.js +1 -0
  200. package/components/ln-picklist/ln-picklist.schema.json +49 -0
  201. package/components/ln-picklist/src/ln-picklist.js +228 -0
  202. package/{js → components}/ln-popover/README.md +164 -162
  203. package/components/ln-popover/ln-popover-dev.scss +13 -0
  204. package/components/ln-popover/ln-popover.js +1 -0
  205. package/components/ln-popover/ln-popover.schema.json +82 -0
  206. package/components/ln-popover/ln-popover.scss +18 -0
  207. package/{js → components}/ln-popover/src/ln-popover.js +42 -36
  208. package/{js → components}/ln-progress/README.md +410 -413
  209. package/components/ln-progress/ln-progress-dev.scss +8 -0
  210. package/components/ln-progress/ln-progress.js +1 -0
  211. package/components/ln-progress/ln-progress.schema.json +40 -0
  212. package/components/ln-progress/src/ln-progress.js +91 -0
  213. package/components/ln-progress/src/progress-model.js +20 -0
  214. package/{js → components}/ln-router/README.md +443 -432
  215. package/components/ln-router/ln-router-dev.scss +13 -0
  216. package/components/ln-router/ln-router.js +1 -0
  217. package/components/ln-router/ln-router.schema.json +68 -0
  218. package/{js → components}/ln-router/src/ln-router.js +585 -539
  219. package/components/ln-router/src/router-model.js +50 -0
  220. package/components/ln-scroll/README.md +45 -0
  221. package/components/ln-scroll/ln-scroll.js +1 -0
  222. package/components/ln-scroll/ln-scroll.schema.json +85 -0
  223. package/components/ln-scroll/src/ln-scroll.js +150 -0
  224. package/components/ln-search/README.md +188 -0
  225. package/components/ln-search/ln-search-dev.scss +13 -0
  226. package/components/ln-search/ln-search.js +1 -0
  227. package/components/ln-search/ln-search.schema.json +103 -0
  228. package/components/ln-search/src/ln-search.js +330 -0
  229. package/{js → components}/ln-slug/README.md +6 -3
  230. package/components/ln-slug/ln-slug-dev.scss +18 -0
  231. package/components/ln-slug/ln-slug.js +1 -0
  232. package/components/ln-slug/ln-slug.schema.json +23 -0
  233. package/{js → components}/ln-slug/src/ln-slug.js +20 -13
  234. package/components/ln-slug/src/slug-model.js +21 -0
  235. package/{js → components}/ln-sort/README.md +178 -170
  236. package/{js → components}/ln-sort/ln-sort-dev.scss +8 -8
  237. package/components/ln-sort/ln-sort.js +1 -0
  238. package/components/ln-sort/ln-sort.schema.json +104 -0
  239. package/components/ln-sort/src/ln-sort.js +321 -0
  240. package/components/ln-sort/src/sort-model.js +117 -0
  241. package/{js → components}/ln-sortable/README.md +7 -11
  242. package/components/ln-sortable/ln-sortable-dev.scss +13 -0
  243. package/components/ln-sortable/ln-sortable.js +1 -0
  244. package/components/ln-sortable/ln-sortable.schema.json +36 -0
  245. package/{js → components}/ln-sortable/src/ln-sortable.js +8 -13
  246. package/{js → components}/ln-stat/README.md +3 -1
  247. package/components/ln-stat/ln-stat-dev.scss +8 -0
  248. package/components/ln-stat/ln-stat.js +1 -0
  249. package/components/ln-stat/ln-stat.schema.json +32 -0
  250. package/{js → components}/ln-stat/src/ln-stat.js +14 -18
  251. package/components/ln-stat/src/stat-model.js +28 -0
  252. package/{js → components}/ln-table/README.md +37 -24
  253. package/{js → components}/ln-table/ln-table-dev.scss +17 -17
  254. package/components/ln-table/ln-table.js +1 -0
  255. package/components/ln-table/ln-table.schema.json +211 -0
  256. package/components/ln-table/ln-table.scss +15 -0
  257. package/{js → components}/ln-table/src/ln-table.js +1365 -1493
  258. package/components/ln-table/src/table-model.js +98 -0
  259. package/components/ln-table-coordinator/README.md +61 -0
  260. package/components/ln-table-coordinator/ln-table-coordinator.js +1 -0
  261. package/components/ln-table-coordinator/ln-table-coordinator.schema.json +93 -0
  262. package/components/ln-table-coordinator/src/ln-table-coordinator.js +193 -0
  263. package/{js → components}/ln-tabs/README.md +32 -14
  264. package/components/ln-tabs/ln-tabs-dev.scss +24 -0
  265. package/components/ln-tabs/ln-tabs.js +1 -0
  266. package/components/ln-tabs/ln-tabs.schema.json +75 -0
  267. package/components/ln-tabs/ln-tabs.scss +8 -0
  268. package/components/ln-tabs/src/ln-tabs.js +207 -0
  269. package/components/ln-tabs/src/tabs-model.js +82 -0
  270. package/{js → components}/ln-time/README.md +96 -95
  271. package/components/ln-time/ln-time-dev.scss +13 -0
  272. package/components/ln-time/ln-time.js +1 -0
  273. package/components/ln-time/ln-time.schema.json +38 -0
  274. package/{js → components}/ln-time/src/ln-time.js +206 -223
  275. package/components/ln-time/src/time-model.js +64 -0
  276. package/{js → components}/ln-toast/README.md +23 -5
  277. package/components/ln-toast/ln-toast-dev.scss +8 -0
  278. package/components/ln-toast/ln-toast.js +1 -0
  279. package/components/ln-toast/ln-toast.schema.json +65 -0
  280. package/components/ln-toast/ln-toast.scss +59 -0
  281. package/{js → components}/ln-toast/src/ln-toast.js +233 -232
  282. package/{js → components}/ln-toggle/README.md +198 -196
  283. package/{js → components}/ln-toggle/ln-toggle-dev.scss +13 -13
  284. package/components/ln-toggle/ln-toggle.js +1 -0
  285. package/components/ln-toggle/ln-toggle.schema.json +52 -0
  286. package/components/ln-toggle/ln-toggle.scss +37 -0
  287. package/{js → components}/ln-toggle/src/ln-toggle.js +61 -46
  288. package/{js → components}/ln-tooltip/README.md +6 -6
  289. package/{js → components}/ln-tooltip/ln-tooltip-dev.scss +9 -9
  290. package/components/ln-tooltip/ln-tooltip.js +1 -0
  291. package/components/ln-tooltip/ln-tooltip.schema.json +86 -0
  292. package/components/ln-tooltip/ln-tooltip.scss +9 -0
  293. package/{js → components}/ln-tooltip/src/ln-tooltip.js +14 -3
  294. package/{js → components}/ln-translations/README.md +3 -1
  295. package/components/ln-translations/ln-translations-dev.scss +13 -0
  296. package/components/ln-translations/ln-translations.js +1 -0
  297. package/components/ln-translations/ln-translations.schema.json +120 -0
  298. package/{js → components}/ln-translations/src/ln-translations.js +25 -10
  299. package/components/ln-ui-coordinator/README.md +101 -0
  300. package/components/ln-ui-coordinator/ln-ui-coordinator-dev.scss +8 -0
  301. package/components/ln-ui-coordinator/ln-ui-coordinator.js +1 -0
  302. package/components/ln-ui-coordinator/ln-ui-coordinator.schema.json +60 -0
  303. package/{js/ln-modal-coordinator/src/ln-modal-coordinator.js → components/ln-ui-coordinator/src/ln-ui-coordinator.js} +403 -345
  304. package/components/ln-upload/README.md +133 -0
  305. package/components/ln-upload/ln-upload-dev.scss +18 -0
  306. package/components/ln-upload/ln-upload.js +1 -0
  307. package/components/ln-upload/ln-upload.schema.json +193 -0
  308. package/components/ln-upload/ln-upload.scss +20 -0
  309. package/components/ln-upload/src/ln-upload.js +652 -0
  310. package/components/ln-upload/src/upload-model.js +78 -0
  311. package/{js → components}/ln-validate/README.md +182 -180
  312. package/{js → components}/ln-validate/ln-validate-dev.scss +15 -15
  313. package/components/ln-validate/ln-validate.js +1 -0
  314. package/components/ln-validate/ln-validate.schema.json +50 -0
  315. package/components/ln-validate/ln-validate.scss +7 -0
  316. package/{js → components}/ln-validate/src/ln-validate.js +23 -45
  317. package/components/ln-validate/src/validate-model.js +64 -0
  318. package/components/ln-websocket-connector/README.md +166 -0
  319. package/components/ln-websocket-connector/ln-websocket-connector.js +1 -0
  320. package/components/ln-websocket-connector/ln-websocket-connector.schema.json +29 -0
  321. package/components/ln-websocket-connector/src/ln-websocket-connector.js +279 -0
  322. package/ln-ashlar.html-data.json +1796 -0
  323. package/package.json +84 -61
  324. package/{scss → theme}/base/_global.scss +1 -2
  325. package/{scss → theme}/base/_reset.scss +1 -1
  326. package/{scss → theme}/base/_typography.scss +2 -0
  327. package/theme/brand.css +73 -0
  328. package/{scss → theme}/components/_app-shell.scss +8 -0
  329. package/theme/components/_button.scss +24 -0
  330. package/theme/components/_chart.scss +5 -0
  331. package/theme/components/_confirm.scss +6 -0
  332. package/{scss → theme}/components/_date.scss +30 -22
  333. package/{scss → theme}/components/_dropdown.scss +6 -1
  334. package/theme/components/_form.scss +140 -0
  335. package/{scss → theme}/components/_layout.scss +6 -0
  336. package/{scss → theme}/components/_ln-table.scss +1 -6
  337. package/theme/components/_picklist.scss +3 -0
  338. package/{scss → theme}/components/_sort.scss +10 -10
  339. package/theme/components/_status-badge.scss +6 -0
  340. package/{scss → theme}/components/_table.scss +16 -0
  341. package/{scss → theme}/components/_tabs.scss +0 -4
  342. package/theme/components/_toast.scss +48 -0
  343. package/{scss → theme}/components/_toggle.scss +1 -1
  344. package/theme/components/_upload.scss +45 -0
  345. package/{scss → theme}/config/_breakpoints.scss +1 -1
  346. package/theme/config/_contrast.scss +128 -0
  347. package/{scss → theme}/config/_density.scss +191 -205
  348. package/theme/config/_palette.scss +274 -0
  349. package/theme/config/_theme.scss +293 -0
  350. package/{scss → theme}/config/_tokens.scss +285 -441
  351. package/{scss → theme}/config/mixins/_accordion.scss +1 -1
  352. package/{scss → theme}/config/mixins/_alert.scss +1 -0
  353. package/{scss → theme}/config/mixins/_app-shell.scss +4 -2
  354. package/{scss → theme}/config/mixins/_borders.scss +2 -0
  355. package/theme/config/mixins/_btn.scss +175 -0
  356. package/{scss → theme}/config/mixins/_card.scss +55 -46
  357. package/theme/config/mixins/_chart.scss +82 -0
  358. package/{scss → theme}/config/mixins/_collapsible.scss +2 -1
  359. package/{scss → theme}/config/mixins/_colors.scss +8 -14
  360. package/{scss → theme}/config/mixins/_diagnostics.scss +48 -48
  361. package/theme/config/mixins/_dropdown.scss +169 -0
  362. package/{scss → theme}/config/mixins/_editor.scss +0 -7
  363. package/{scss → theme}/config/mixins/_filter.scss +47 -47
  364. package/{scss → theme}/config/mixins/_footer.scss +1 -1
  365. package/{scss → theme}/config/mixins/_form.scss +49 -18
  366. package/{scss → theme}/config/mixins/_index.scss +62 -61
  367. package/{scss → theme}/config/mixins/_layout.scss +6 -2
  368. package/{scss → theme}/config/mixins/_ln-table.scss +31 -10
  369. package/{scss → theme}/config/mixins/_loader.scss +1 -1
  370. package/{scss → theme}/config/mixins/_modal.scss +145 -149
  371. package/{scss → theme}/config/mixins/_motion.scss +13 -0
  372. package/{scss → theme}/config/mixins/_nav.scss +7 -7
  373. package/theme/config/mixins/_picklist.scss +66 -0
  374. package/theme/config/mixins/_popover.scss +96 -0
  375. package/{scss → theme}/config/mixins/_sidebar.scss +7 -4
  376. package/{scss → theme}/config/mixins/_sort.scss +43 -42
  377. package/{scss → theme}/config/mixins/_status-badge.scss +15 -2
  378. package/{scss → theme}/config/mixins/_table.scss +25 -14
  379. package/{scss → theme}/config/mixins/_tabs.scss +1 -1
  380. package/{scss → theme}/config/mixins/_toast.scss +174 -179
  381. package/{scss → theme}/config/mixins/_tooltip.scss +2 -2
  382. package/{scss → theme}/config/mixins/_typography.scss +16 -5
  383. package/{scss → theme}/config/mixins/_upload.scss +8 -6
  384. package/theme/ln-ashlar-core.scss +24 -0
  385. package/theme/ln-ashlar-dev.scss +66 -0
  386. package/theme/ln-ashlar-landing.scss +56 -0
  387. package/{scss/ln-ashlar.scss → theme/ln-ashlar-theme.scss} +63 -69
  388. package/theme/ln-ashlar.scss +8 -0
  389. package/theme/presentation/_bento.scss +151 -0
  390. package/theme/presentation/_cta.scss +111 -0
  391. package/theme/presentation/_effects.scss +216 -0
  392. package/theme/presentation/_features.scss +108 -0
  393. package/theme/presentation/_footer.scss +129 -0
  394. package/theme/presentation/_hero.scss +158 -0
  395. package/theme/presentation/_layout.scss +170 -0
  396. package/theme/presentation/_navbar.scss +140 -0
  397. package/theme/presentation/_pricing.scss +262 -0
  398. package/theme/presentation/_stats.scss +87 -0
  399. package/theme/presentation/_testimonials.scss +124 -0
  400. package/theme/presentation/_tokens.scss +39 -0
  401. package/theme/presentation/_typography.scss +163 -0
  402. package/{scss → theme}/utilities/_animations.scss +38 -0
  403. package/{scss → theme}/utilities/_utilities.scss +6 -0
  404. package/web-types.json +2312 -0
  405. package/js/ln-accordion/ln-accordion.js +0 -1
  406. package/js/ln-ajax/ln-ajax.js +0 -1
  407. package/js/ln-api-connector/ln-api-connector.js +0 -1
  408. package/js/ln-api-connector/src/ln-api-connector.js +0 -368
  409. package/js/ln-api-queue/ln-api-queue.js +0 -1
  410. package/js/ln-autoresize/ln-autoresize.js +0 -1
  411. package/js/ln-autosave/ln-autosave.js +0 -1
  412. package/js/ln-circular-progress/ln-circular-progress.js +0 -1
  413. package/js/ln-confirm/_ln-confirm.scss +0 -24
  414. package/js/ln-confirm/ln-confirm.js +0 -1
  415. package/js/ln-core/crypto.js +0 -83
  416. package/js/ln-core/helpers.js +0 -788
  417. package/js/ln-core/index.js +0 -7
  418. package/js/ln-core/persist.js +0 -97
  419. package/js/ln-couchdb-connector/ln-couchdb-connector.js +0 -1
  420. package/js/ln-data-coordinator/ln-data-coordinator.js +0 -1
  421. package/js/ln-data-coordinator/src/data-read-policy.js +0 -18
  422. package/js/ln-data-store/ln-data-store.js +0 -1
  423. package/js/ln-date/ln-date.js +0 -1
  424. package/js/ln-date/src/ln-date.js +0 -603
  425. package/js/ln-debug/README.md +0 -58
  426. package/js/ln-debug/ln-debug.js +0 -1
  427. package/js/ln-debug/src/ln-debug.js +0 -19
  428. package/js/ln-dropdown/ln-dropdown.js +0 -1
  429. package/js/ln-dropdown/ln-dropdown.scss +0 -15
  430. package/js/ln-editor/ln-editor.js +0 -1
  431. package/js/ln-editor/ln-editor.scss +0 -43
  432. package/js/ln-external-links/ln-external-links.js +0 -1
  433. package/js/ln-fill/ln-fill.js +0 -1
  434. package/js/ln-filter/README.md +0 -189
  435. package/js/ln-filter/ln-filter-dev.scss +0 -8
  436. package/js/ln-filter/ln-filter.js +0 -1
  437. package/js/ln-filter/src/ln-filter.js +0 -419
  438. package/js/ln-form/ln-form.js +0 -1
  439. package/js/ln-http/ln-http.js +0 -1
  440. package/js/ln-link/ln-link.js +0 -1
  441. package/js/ln-list/README.md +0 -129
  442. package/js/ln-list/ln-list.js +0 -1
  443. package/js/ln-list/ln-list.scss +0 -28
  444. package/js/ln-modal/ln-modal-dev.scss +0 -13
  445. package/js/ln-modal/ln-modal.js +0 -1
  446. package/js/ln-modal/ln-modal.scss +0 -35
  447. package/js/ln-modal-coordinator/README.md +0 -99
  448. package/js/ln-modal-coordinator/ln-modal-coordinator-dev.scss +0 -8
  449. package/js/ln-modal-coordinator/ln-modal-coordinator.js +0 -1
  450. package/js/ln-nav/ln-nav.js +0 -1
  451. package/js/ln-number/README.md +0 -149
  452. package/js/ln-number/ln-number.js +0 -1
  453. package/js/ln-number/src/ln-number.js +0 -443
  454. package/js/ln-options/ln-options.js +0 -1
  455. package/js/ln-popover/ln-popover.js +0 -1
  456. package/js/ln-progress/ln-progress.js +0 -1
  457. package/js/ln-progress/src/ln-progress.js +0 -98
  458. package/js/ln-router/ln-router.js +0 -1
  459. package/js/ln-search/README.md +0 -158
  460. package/js/ln-search/ln-search-dev.scss +0 -8
  461. package/js/ln-search/ln-search.js +0 -1
  462. package/js/ln-search/src/ln-search.js +0 -117
  463. package/js/ln-slug/ln-slug.js +0 -1
  464. package/js/ln-sort/ln-sort.js +0 -1
  465. package/js/ln-sort/src/ln-sort.js +0 -178
  466. package/js/ln-sortable/ln-sortable.js +0 -1
  467. package/js/ln-stat/ln-stat.js +0 -1
  468. package/js/ln-table/ln-table.js +0 -1
  469. package/js/ln-table/ln-table.scss +0 -11
  470. package/js/ln-table-coordinator/README.md +0 -73
  471. package/js/ln-table-coordinator/ln-table-coordinator.js +0 -1
  472. package/js/ln-table-coordinator/src/ln-table-coordinator.js +0 -160
  473. package/js/ln-tabs/ln-tabs-dev.scss +0 -18
  474. package/js/ln-tabs/ln-tabs.js +0 -1
  475. package/js/ln-tabs/src/ln-tabs.js +0 -188
  476. package/js/ln-time/ln-time.js +0 -1
  477. package/js/ln-toast/ln-toast.js +0 -1
  478. package/js/ln-toggle/ln-toggle.js +0 -1
  479. package/js/ln-tooltip/ln-tooltip.js +0 -1
  480. package/js/ln-tooltip/ln-tooltip.scss +0 -9
  481. package/js/ln-translations/ln-translations.js +0 -1
  482. package/js/ln-upload/README.md +0 -255
  483. package/js/ln-upload/ln-upload.js +0 -1
  484. package/js/ln-upload/ln-upload.scss +0 -20
  485. package/js/ln-upload/src/ln-upload.js +0 -423
  486. package/js/ln-validate/ln-validate.js +0 -1
  487. package/scss/components/_button.scss +0 -20
  488. package/scss/components/_confirm.scss +0 -5
  489. package/scss/components/_form.scss +0 -107
  490. package/scss/components/_status-badge.scss +0 -4
  491. package/scss/components/_toast.scss +0 -68
  492. package/scss/components/_upload.scss +0 -51
  493. package/scss/config/_theme.scss +0 -216
  494. package/scss/config/mixins/_btn.scss +0 -179
  495. package/scss/config/mixins/_confirm.scss +0 -31
  496. package/scss/config/mixins/_dropdown.scss +0 -141
  497. package/scss/config/mixins/_popover.scss +0 -64
  498. package/scss/ln-ashlar-dev.scss +0 -39
  499. /package/{js → components}/ln-core/positioning.js +0 -0
  500. /package/{js → components}/ln-core/reactive.js +0 -0
  501. /package/{js → components}/ln-filter/ln-filter.scss +0 -0
  502. /package/{js → components}/ln-icon/ln-icon.js +0 -0
  503. /package/{js → components}/ln-icon/src/ln-icon.js +0 -0
  504. /package/{js → components}/ln-search/ln-search.scss +0 -0
  505. /package/{js → components}/ln-toast/template.html +0 -0
  506. /package/{scss → theme}/components/_accordion.scss +0 -0
  507. /package/{scss → theme}/components/_ajax.scss +0 -0
  508. /package/{scss → theme}/components/_alert.scss +0 -0
  509. /package/{scss → theme}/components/_avatar.scss +0 -0
  510. /package/{scss → theme}/components/_breadcrumbs.scss +0 -0
  511. /package/{scss → theme}/components/_card.scss +0 -0
  512. /package/{scss → theme}/components/_chip.scss +0 -0
  513. /package/{scss → theme}/components/_circular-progress.scss +0 -0
  514. /package/{scss → theme}/components/_editor.scss +0 -0
  515. /package/{scss → theme}/components/_empty-state.scss +0 -0
  516. /package/{scss → theme}/components/_filter.scss +0 -0
  517. /package/{scss → theme}/components/_link.scss +0 -0
  518. /package/{scss → theme}/components/_loader.scss +0 -0
  519. /package/{scss → theme}/components/_modal.scss +0 -0
  520. /package/{scss → theme}/components/_nav.scss +0 -0
  521. /package/{scss → theme}/components/_page-header.scss +0 -0
  522. /package/{scss → theme}/components/_popover.scss +0 -0
  523. /package/{scss → theme}/components/_progress.scss +0 -0
  524. /package/{scss → theme}/components/_prose.scss +0 -0
  525. /package/{scss → theme}/components/_scrollbar.scss +0 -0
  526. /package/{scss → theme}/components/_sections.scss +0 -0
  527. /package/{scss → theme}/components/_sidebar.scss +0 -0
  528. /package/{scss → theme}/components/_stat-card.scss +0 -0
  529. /package/{scss → theme}/components/_stepper.scss +0 -0
  530. /package/{scss → theme}/components/_timeline.scss +0 -0
  531. /package/{scss → theme}/components/_tooltip.scss +0 -0
  532. /package/{scss → theme}/components/_translations.scss +0 -0
  533. /package/{scss → theme}/config/_icons.scss +0 -0
  534. /package/{scss → theme}/config/_mixins.scss +0 -0
  535. /package/{scss → theme}/config/mixins/_ajax.scss +0 -0
  536. /package/{scss → theme}/config/mixins/_avatar.scss +0 -0
  537. /package/{scss → theme}/config/mixins/_breadcrumbs.scss +0 -0
  538. /package/{scss → theme}/config/mixins/_breakpoints.scss +0 -0
  539. /package/{scss → theme}/config/mixins/_chip.scss +0 -0
  540. /package/{scss → theme}/config/mixins/_circular-progress.scss +0 -0
  541. /package/{scss → theme}/config/mixins/_display.scss +0 -0
  542. /package/{scss → theme}/config/mixins/_empty-state.scss +0 -0
  543. /package/{scss → theme}/config/mixins/_focus.scss +0 -0
  544. /package/{scss → theme}/config/mixins/_interaction.scss +0 -0
  545. /package/{scss → theme}/config/mixins/_kbd.scss +0 -0
  546. /package/{scss → theme}/config/mixins/_link.scss +0 -0
  547. /package/{scss → theme}/config/mixins/_page-header.scss +0 -0
  548. /package/{scss → theme}/config/mixins/_position.scss +0 -0
  549. /package/{scss → theme}/config/mixins/_progress.scss +0 -0
  550. /package/{scss → theme}/config/mixins/_prose.scss +0 -0
  551. /package/{scss → theme}/config/mixins/_shadows.scss +0 -0
  552. /package/{scss → theme}/config/mixins/_sizing.scss +0 -0
  553. /package/{scss → theme}/config/mixins/_spacing.scss +0 -0
  554. /package/{scss → theme}/config/mixins/_stat-card.scss +0 -0
  555. /package/{scss → theme}/config/mixins/_stepper.scss +0 -0
  556. /package/{scss → theme}/config/mixins/_timeline.scss +0 -0
  557. /package/{scss → theme}/config/mixins/_transitions.scss +0 -0
  558. /package/{scss → theme}/config/mixins/_translations.scss +0 -0
  559. /package/{scss → theme}/tabler-icons.txt +0 -0
@@ -0,0 +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`.
@@ -0,0 +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
+ }
@@ -0,0 +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})})()})();
@@ -0,0 +1,166 @@
1
+ {
2
+ "$comment": "This file is partly generated. The $comment, component, generator, and each attribute's direction, sources, type, values, fallback, and description keys are owned by the generator and synchronized from JS source code. All other keys are preserved and safe to hand-author. Regenerate with `npm run sync:ln-schemas`.",
3
+ "component": "ln-list",
4
+ "generator": "scripts/sync-ln-schemas.mjs",
5
+ "attributes": {
6
+ "data-ln-debug": {
7
+ "direction": null,
8
+ "sources": [
9
+ "ln-list-dev.scss"
10
+ ]
11
+ },
12
+ "data-ln-empty": {
13
+ "direction": "author",
14
+ "sources": [
15
+ "src/ln-list.js"
16
+ ]
17
+ },
18
+ "data-ln-empty-when": {
19
+ "direction": "author",
20
+ "sources": [
21
+ "src/ln-list.js"
22
+ ]
23
+ },
24
+ "data-ln-field": {
25
+ "direction": "both",
26
+ "sources": [
27
+ "src/ln-list.js"
28
+ ]
29
+ },
30
+ "data-ln-item": {
31
+ "direction": "both",
32
+ "sources": [
33
+ "src/ln-list.js"
34
+ ]
35
+ },
36
+ "data-ln-item-action": {
37
+ "direction": "author",
38
+ "sources": [
39
+ "src/ln-list.js"
40
+ ]
41
+ },
42
+ "data-ln-item-id": {
43
+ "direction": "both",
44
+ "sources": [
45
+ "src/ln-list.js"
46
+ ]
47
+ },
48
+ "data-ln-item-select": {
49
+ "direction": "author",
50
+ "sources": [
51
+ "src/ln-list.js"
52
+ ]
53
+ },
54
+ "data-ln-list": {
55
+ "direction": null,
56
+ "sources": [
57
+ "ln-list-dev.scss",
58
+ "src/ln-list.js"
59
+ ],
60
+ "type": "string",
61
+ "fallback": "",
62
+ "description": "List instance name or identifier"
63
+ },
64
+ "data-ln-list-body": {
65
+ "direction": "author",
66
+ "sources": [
67
+ "ln-list.scss",
68
+ "src/ln-list.js"
69
+ ]
70
+ },
71
+ "data-ln-list-count": {
72
+ "direction": "author",
73
+ "sources": [
74
+ "src/ln-list.js"
75
+ ],
76
+ "type": "integer",
77
+ "min": 0,
78
+ "description": "Total item count override for virtual scrollbar calculation"
79
+ },
80
+ "data-ln-list-empty": {
81
+ "direction": "author",
82
+ "sources": [
83
+ "src/ln-list.js"
84
+ ],
85
+ "type": "marker",
86
+ "description": "Container for list empty state"
87
+ },
88
+ "data-ln-list-field": {
89
+ "direction": "author",
90
+ "sources": [
91
+ "src/ln-list.js"
92
+ ],
93
+ "type": "string",
94
+ "description": "Field name mapping for list item binding"
95
+ },
96
+ "data-ln-list-filtered": {
97
+ "direction": "author",
98
+ "sources": [
99
+ "src/ln-list.js"
100
+ ]
101
+ },
102
+ "data-ln-list-select-all": {
103
+ "direction": "author",
104
+ "sources": [
105
+ "src/ln-list.js"
106
+ ]
107
+ },
108
+ "data-ln-list-selectable": {
109
+ "direction": null,
110
+ "sources": [
111
+ "src/ln-list.js"
112
+ ],
113
+ "type": "boolean",
114
+ "description": "Enables item selection controls"
115
+ },
116
+ "data-ln-list-selected": {
117
+ "direction": "author",
118
+ "sources": [
119
+ "src/ln-list.js"
120
+ ]
121
+ },
122
+ "data-ln-list-source": {
123
+ "direction": "author",
124
+ "sources": [
125
+ "src/ln-list.js"
126
+ ],
127
+ "type": "string",
128
+ "fallback": "",
129
+ "description": "Source store or coordinator addressing"
130
+ },
131
+ "data-ln-list-total": {
132
+ "direction": "author",
133
+ "sources": [
134
+ "src/ln-list.js"
135
+ ]
136
+ },
137
+ "data-ln-list-window": {
138
+ "direction": "author",
139
+ "sources": [
140
+ "src/ln-list.js"
141
+ ],
142
+ "type": "integer",
143
+ "min": 10,
144
+ "description": "Virtual scrolling window size in items"
145
+ },
146
+ "data-ln-list-window-page": {
147
+ "direction": "author",
148
+ "sources": [
149
+ "src/ln-list.js"
150
+ ],
151
+ "type": "integer",
152
+ "min": 5,
153
+ "description": "Virtual scrolling slice page size"
154
+ },
155
+ "data-ln-list-window-threshold": {
156
+ "direction": "author",
157
+ "sources": [
158
+ "src/ln-list.js"
159
+ ],
160
+ "type": "integer",
161
+ "fallback": 50,
162
+ "min": 0,
163
+ "description": "Scroll threshold margin in pixels to trigger page fetch"
164
+ }
165
+ }
166
+ }
@@ -0,0 +1,25 @@
1
+ // ==========================================================================
2
+ // ln-list — Functional Loading and Virtualization State
3
+ // ==========================================================================
4
+
5
+ .ln-list--loading [data-ln-list-body] {
6
+ opacity: 0.5;
7
+ pointer-events: none;
8
+ }
9
+
10
+ .ln-list__spacer {
11
+ grid-column: 1 / -1;
12
+ margin: 0 !important;
13
+ padding: 0 !important;
14
+ border: none !important;
15
+ list-style: none !important;
16
+ background: transparent !important;
17
+ pointer-events: none;
18
+ }
19
+
20
+ .ln-list__placeholder {
21
+ margin: 0 !important;
22
+ padding: 0 !important;
23
+ border: none !important;
24
+ list-style: none !important;
25
+ }