@livenetworks/ashlar 2.0.7 → 2.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +641 -641
- package/components/COMPONENTS.md +1116 -1116
- package/components/index.js +81 -81
- package/components/ln-accordion/ln-accordion-dev.scss +8 -8
- package/components/ln-accordion/ln-accordion.js +1 -1
- package/components/ln-accordion/ln-accordion.schema.json +30 -30
- package/components/ln-ajax/ln-ajax-dev.scss +8 -8
- package/components/ln-ajax/ln-ajax.js +1 -1
- package/components/ln-ajax/ln-ajax.schema.json +30 -30
- package/components/ln-api-connector/ln-api-connector.js +1 -1
- package/components/ln-api-connector/ln-api-connector.schema.json +96 -96
- package/components/ln-api-connector/src/ln-api-connector.js +1 -0
- package/components/ln-api-queue/ln-api-queue.js +1 -1
- package/components/ln-api-queue/ln-api-queue.schema.json +34 -34
- package/components/ln-api-queue/src/ln-api-queue.js +3 -13
- package/components/ln-autoresize/ln-autoresize-dev.scss +8 -8
- package/components/ln-autoresize/ln-autoresize.js +1 -1
- package/components/ln-autoresize/ln-autoresize.schema.json +22 -22
- package/components/ln-autosave/ln-autosave-dev.scss +13 -13
- package/components/ln-autosave/ln-autosave.js +1 -1
- package/components/ln-autosave/ln-autosave.schema.json +48 -48
- package/components/ln-autosave/src/autosave-model.js +34 -34
- package/components/ln-chart/ln-chart.js +1 -1
- package/components/ln-chart/ln-chart.schema.json +146 -146
- package/components/ln-chart/src/chart-model.js +154 -154
- package/components/ln-circular-progress/ln-circular-progress.js +1 -1
- package/components/ln-circular-progress/ln-circular-progress.schema.json +42 -42
- package/components/ln-confirm/ln-confirm-dev.scss +24 -24
- package/components/ln-confirm/ln-confirm.js +1 -1
- package/components/ln-confirm/ln-confirm.schema.json +66 -66
- package/components/ln-confirm/src/ln-confirm.js +178 -178
- package/components/ln-core/crypto.js +286 -265
- package/components/ln-core/dom.js +115 -115
- package/components/ln-core/form.js +136 -136
- package/components/ln-core/helpers.js +33 -33
- package/components/ln-core/http.js +48 -48
- package/components/ln-core/index.js +1 -1
- package/components/ln-core/ln-core.schema.json +109 -109
- package/components/ln-core/locale.js +55 -55
- package/components/ln-core/matching.js +78 -78
- package/components/ln-core/number.js +125 -125
- package/components/ln-core/template.js +206 -206
- package/components/ln-couchdb-connector/ln-couchdb-connector.js +1 -1
- package/components/ln-couchdb-connector/ln-couchdb-connector.schema.json +50 -50
- package/components/ln-couchdb-connector/src/ln-couchdb-connector.js +1 -0
- package/components/ln-data-coordinator/README.md +9 -38
- package/components/ln-data-coordinator/ln-data-coordinator-dev.scss +8 -8
- package/components/ln-data-coordinator/ln-data-coordinator.js +1 -1
- package/components/ln-data-coordinator/ln-data-coordinator.schema.json +16 -16
- package/components/ln-data-coordinator/src/data-read-policy.js +0 -7
- package/components/ln-data-coordinator/src/ln-data-coordinator.js +428 -1308
- package/components/ln-data-store/ln-data-store-dev.scss +13 -13
- package/components/ln-data-store/ln-data-store.js +1 -1
- package/components/ln-data-store/ln-data-store.schema.json +84 -84
- package/components/ln-data-store/src/data-store-model.js +184 -184
- package/components/ln-data-store/src/ln-data-store.js +1 -1
- package/components/ln-date/ln-date.js +1 -1
- package/components/ln-date/ln-date.schema.json +92 -92
- package/components/ln-date/src/date-model.js +186 -186
- package/components/ln-debug/ln-debug.js +1 -1
- package/components/ln-debug/ln-debug.schema.json +28 -28
- package/components/ln-debug/src/console-sink.js +19 -19
- package/components/ln-debug/src/gate.js +95 -95
- package/components/ln-debug/src/generated-attributes.js +2 -2
- package/components/ln-dropdown/ln-dropdown-dev.scss +13 -13
- package/components/ln-dropdown/ln-dropdown.js +1 -1
- package/components/ln-dropdown/ln-dropdown.schema.json +90 -90
- package/components/ln-editor/ln-editor.js +1 -1
- package/components/ln-editor/ln-editor.schema.json +58 -58
- package/components/ln-external-links/ln-external-links.js +1 -1
- package/components/ln-external-links/ln-external-links.schema.json +18 -18
- package/components/ln-fill/ln-fill.js +1 -1
- package/components/ln-fill/ln-fill.schema.json +23 -23
- package/components/ln-filter/ln-filter.js +1 -1
- package/components/ln-filter/ln-filter.schema.json +153 -153
- package/components/ln-filter/src/filter-model.js +185 -185
- package/components/ln-form/ln-form-dev.scss +8 -8
- package/components/ln-form/ln-form.js +1 -1
- package/components/ln-form/ln-form.schema.json +45 -45
- package/components/ln-http/ln-http.js +1 -1
- package/components/ln-http/ln-http.schema.json +6 -6
- package/components/ln-icon/ln-icon.schema.json +6 -6
- package/components/ln-include/ln-include.js +1 -1
- package/components/ln-include/ln-include.schema.json +23 -23
- package/components/ln-key/ln-key-dev.scss +18 -18
- package/components/ln-key/ln-key.js +1 -1
- package/components/ln-key/ln-key.schema.json +56 -56
- package/components/ln-key/src/ln-key.js +10 -10
- package/components/ln-link/ln-link-dev.scss +8 -8
- package/components/ln-link/ln-link.js +1 -1
- package/components/ln-link/ln-link.schema.json +22 -22
- package/components/ln-list/README.md +152 -152
- package/components/ln-list/ln-list-dev.scss +8 -8
- package/components/ln-list/ln-list.js +1 -1
- package/components/ln-list/ln-list.schema.json +166 -166
- package/components/ln-modal/ln-modal.js +1 -1
- package/components/ln-modal/ln-modal.schema.json +65 -65
- package/components/ln-nav/ln-nav.js +1 -1
- package/components/ln-nav/ln-nav.schema.json +25 -25
- package/components/ln-number/ln-number.js +1 -1
- package/components/ln-number/ln-number.schema.json +63 -63
- package/components/ln-number/src/number-model.js +31 -31
- package/components/ln-obfuscator/README.md +60 -60
- package/components/ln-obfuscator/ln-obfuscator.js +1 -1
- package/components/ln-obfuscator/ln-obfuscator.schema.json +49 -49
- package/components/ln-obfuscator/src/ln-obfuscator.js +159 -159
- package/components/ln-obfuscator/src/obfuscator-model.js +250 -250
- package/components/ln-options/ln-options.js +1 -1
- package/components/ln-options/ln-options.schema.json +41 -41
- package/components/ln-persist/README.md +151 -151
- package/components/ln-persist/ln-persist.js +1 -1
- package/components/ln-persist/ln-persist.schema.json +28 -28
- package/components/ln-persist/src/ln-persist.js +83 -83
- package/components/ln-picklist/README.md +230 -230
- package/components/ln-picklist/ln-picklist-dev.scss +22 -22
- package/components/ln-picklist/ln-picklist.js +1 -1
- package/components/ln-picklist/ln-picklist.schema.json +49 -49
- package/components/ln-picklist/src/ln-picklist.js +228 -228
- package/components/ln-popover/ln-popover-dev.scss +13 -13
- package/components/ln-popover/ln-popover.js +1 -1
- package/components/ln-popover/ln-popover.schema.json +82 -82
- package/components/ln-progress/ln-progress-dev.scss +8 -8
- package/components/ln-progress/ln-progress.js +1 -1
- package/components/ln-progress/ln-progress.schema.json +40 -40
- package/components/ln-router/ln-router.js +1 -1
- package/components/ln-router/ln-router.schema.json +76 -76
- package/components/ln-scroll/README.md +45 -45
- package/components/ln-scroll/ln-scroll.js +1 -1
- package/components/ln-scroll/ln-scroll.schema.json +85 -85
- package/components/ln-scroll/src/ln-scroll.js +150 -150
- package/components/ln-search/README.md +188 -188
- package/components/ln-search/ln-search.js +1 -1
- package/components/ln-search/ln-search.schema.json +103 -103
- package/components/ln-slug/ln-slug.js +1 -1
- package/components/ln-slug/ln-slug.schema.json +23 -23
- package/components/ln-sort/ln-sort.js +1 -1
- package/components/ln-sort/ln-sort.schema.json +104 -104
- package/components/ln-sort/src/ln-sort.js +321 -321
- package/components/ln-sort/src/sort-model.js +117 -117
- package/components/ln-sortable/ln-sortable-dev.scss +13 -13
- package/components/ln-sortable/ln-sortable.js +1 -1
- package/components/ln-sortable/ln-sortable.schema.json +36 -36
- package/components/ln-stat/ln-stat-dev.scss +8 -8
- package/components/ln-stat/ln-stat.js +1 -1
- package/components/ln-stat/ln-stat.schema.json +32 -32
- package/components/ln-stat/src/stat-model.js +28 -28
- package/components/ln-table/ln-table.js +1 -1
- package/components/ln-table/ln-table.schema.json +211 -211
- package/components/ln-table/src/table-model.js +98 -98
- package/components/ln-table-coordinator/ln-table-coordinator.js +1 -1
- package/components/ln-table-coordinator/ln-table-coordinator.schema.json +93 -93
- package/components/ln-tabs/ln-tabs.js +1 -1
- package/components/ln-tabs/ln-tabs.schema.json +75 -75
- package/components/ln-tabs/src/ln-tabs.js +208 -208
- package/components/ln-tabs/src/tabs-model.js +82 -82
- package/components/ln-time/ln-time-dev.scss +13 -13
- package/components/ln-time/ln-time.js +1 -1
- package/components/ln-time/ln-time.schema.json +38 -38
- package/components/ln-toast/ln-toast.js +1 -1
- package/components/ln-toast/ln-toast.schema.json +65 -65
- package/components/ln-toggle/ln-toggle.js +1 -1
- package/components/ln-toggle/ln-toggle.schema.json +52 -52
- package/components/ln-tooltip/ln-tooltip.js +1 -1
- package/components/ln-tooltip/ln-tooltip.schema.json +86 -86
- package/components/ln-translations/ln-translations.js +1 -1
- package/components/ln-translations/ln-translations.schema.json +120 -120
- package/components/ln-ui-coordinator/README.md +62 -62
- package/components/ln-ui-coordinator/ln-ui-coordinator.js +1 -1
- package/components/ln-ui-coordinator/ln-ui-coordinator.schema.json +28 -28
- package/components/ln-ui-coordinator/src/ln-ui-coordinator.js +140 -140
- package/components/ln-upload/ln-upload.js +1 -1
- package/components/ln-upload/ln-upload.schema.json +193 -193
- package/components/ln-upload/src/upload-model.js +78 -78
- package/components/ln-validate/ln-validate.js +1 -1
- package/components/ln-validate/ln-validate.schema.json +50 -50
- package/components/ln-validate/src/validate-model.js +64 -64
- package/components/ln-websocket-connector/README.md +166 -166
- package/components/ln-websocket-connector/ln-websocket-connector.js +1 -1
- package/components/ln-websocket-connector/ln-websocket-connector.schema.json +29 -29
- package/components/ln-websocket-connector/src/ln-websocket-connector.js +283 -279
- package/ln-ashlar.html-data.json +7 -8
- package/package.json +84 -84
- package/theme/brand.css +73 -73
- package/theme/components/_confirm.scss +6 -6
- package/theme/components/_picklist.scss +3 -3
- package/theme/config/_palette.scss +274 -274
- package/theme/config/_theme.scss +292 -292
- package/theme/config/_tokens.scss +285 -285
- package/theme/config/mixins/_index.scss +62 -62
- package/theme/config/mixins/_picklist.scss +66 -66
- package/theme/ln-ashlar-dev.scss +66 -66
- package/theme/ln-ashlar-landing.scss +56 -56
- package/theme/ln-ashlar-theme.scss +63 -63
- package/theme/presentation/_bento.scss +151 -151
- package/theme/presentation/_cta.scss +111 -111
- package/theme/presentation/_effects.scss +216 -216
- package/theme/presentation/_features.scss +108 -108
- package/theme/presentation/_footer.scss +129 -129
- package/theme/presentation/_hero.scss +158 -158
- package/theme/presentation/_layout.scss +170 -170
- package/theme/presentation/_navbar.scss +140 -140
- package/theme/presentation/_pricing.scss +262 -262
- package/theme/presentation/_stats.scss +87 -87
- package/theme/presentation/_testimonials.scss +124 -124
- package/theme/presentation/_tokens.scss +39 -39
- package/theme/presentation/_typography.scss +163 -163
- package/web-types.json +12 -12
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
@use '../../theme/config/mixins' as *;
|
|
2
|
-
|
|
3
|
-
[data-ln-debug] {
|
|
4
|
-
// 1. Store Table Name Check: data-ln-data-store requires an ID to serve as the store table name
|
|
5
|
-
[data-ln-data-store]:not([id]) {
|
|
6
|
-
@include dev-dom-error("[data-ln-data-store] requires a unique 'id' attribute as store table name.");
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
// 2. Frozen Attribute Edit: the IndexedDB schema and store name are fixed at init time
|
|
10
|
-
[data-ln-data-store][data-ln-data-store-frozen] {
|
|
11
|
-
@include dev-dom-error("data-ln-data-store / -indexes are read once at init — the IndexedDB schema can only change in a versionchange transaction. Reload to apply.");
|
|
12
|
-
}
|
|
13
|
-
}
|
|
1
|
+
@use '../../theme/config/mixins' as *;
|
|
2
|
+
|
|
3
|
+
[data-ln-debug] {
|
|
4
|
+
// 1. Store Table Name Check: data-ln-data-store requires an ID to serve as the store table name
|
|
5
|
+
[data-ln-data-store]:not([id]) {
|
|
6
|
+
@include dev-dom-error("[data-ln-data-store] requires a unique 'id' attribute as store table name.");
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// 2. Frozen Attribute Edit: the IndexedDB schema and store name are fixed at init time
|
|
10
|
+
[data-ln-data-store][data-ln-data-store-frozen] {
|
|
11
|
+
@include dev-dom-error("data-ln-data-store / -indexes are read once at init — the IndexedDB schema can only change in a versionchange transaction. Reload to apply.");
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(){"use strict";function ce(){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 ne(e){if(typeof window>"u")return!1;if(window.lnDebug===!0)return!0;if(window.lnCore&&window.lnCore._debugIsContained)return e?window.lnCore._debugIsContained(e):window.lnCore._debugSink!==null;if(e&&e.closest){const n=e.closest("[data-ln-debug]");return!(!n||typeof document<"u"&&n===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 e=console.warn;console.warn=function(...n){if(typeof n[0]=="string"&&(n[0].startsWith("[ln-")||n[0].startsWith("[lnCore"))){let i=null;for(let a=1;a<n.length;a++)if(n[a]&&n[a].nodeType===1){i=n[a];break}if(!ne(i))return}e.apply(console,n)}}function A(e,n,o){const i=o||{};window.lnCore._debugSink&&window.lnCore._debugSink("event",n,e,i),e.dispatchEvent(new CustomEvent(n,{bubbles:!0,detail:i}))}function Q(e,n){if(!document.body){document.addEventListener("DOMContentLoaded",function(){Q(e,n)}),console.warn("["+n+'] Script loaded before <body> — add "defer" to your <script> tag');return}e()}const ue={};function Le(e,n){ue[e]=n}function ze(e){return ue[e]||{ingress:n=>n,egress:n=>n}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerDataMapper=Le,window.lnCore.getDataMapper=ze);function Re(){typeof window>"u"||(window.lnCore=window.lnCore||{},!window.lnCore._localeObserverBound&&(window.lnCore._localeObserverBound=!0,Q(function(){new MutationObserver(function(){A(document,"ln-core:locale-change",{})}).observe(document.documentElement,{attributes:!0,attributeFilter:["lang"],subtree:!0})},"ln-core")))}const de={};function Oe(e,n){if(!e||typeof n!="object")return;const o=e.toLowerCase().split("-")[0];de[o]=n}function Be(e){if(!e)return null;const n=e.toLowerCase().split("-")[0];return de[n]||null}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerLocaleFallback=Oe,window.lnCore.getLocaleFallback=Be,window.lnCore.ensureLocaleObserver=Re);const re={};function Me(e,n){re[e]||(re[e]=document.querySelector('[data-ln-template="'+e+'"]'));const o=re[e];return o?o.content.cloneNode(!0):(console.warn("["+(n||"ln-core")+'] Template "'+e+'" not found'),null)}function fe(e,n){if(!e||!n)return e;const o=e.querySelectorAll("[data-ln-field]");for(let c=0;c<o.length;c++){const f=o[c],h=f.getAttribute("data-ln-field");n[h]!=null&&(f.textContent=n[h])}const i=e.querySelectorAll("[data-ln-attr]");for(let c=0;c<i.length;c++){const f=i[c],h=f.getAttribute("data-ln-attr").split(",");for(let g=0;g<h.length;g++){const b=h[g].trim().split(":");if(b.length!==2)continue;const _=b[0].trim(),x=b[1].trim();n[x]!=null&&f.setAttribute(_,n[x])}}const a=e.querySelectorAll("[data-ln-show]");for(let c=0;c<a.length;c++){const f=a[c],h=f.getAttribute("data-ln-show");h in n&&f.classList.toggle("hidden",!n[h])}const s=e.querySelectorAll("[data-ln-class]");for(let c=0;c<s.length;c++){const f=s[c],h=f.getAttribute("data-ln-class").split(",");for(let g=0;g<h.length;g++){const b=h[g].trim().split(":");if(b.length!==2)continue;const _=b[0].trim(),x=b[1].trim();x in n&&f.classList.toggle(_,!!n[x])}}return e}function Pe(e,n){e.matches&&e.matches("[data-ln-form], [data-ln-fillable]")&&(window.lnCore._debugSink&&window.lnCore._debugSink("event","ln-fill",e,n??null),e.dispatchEvent(new CustomEvent("ln-fill",{detail:n??null,bubbles:!0})));const o=e.querySelectorAll("[data-ln-form], [data-ln-fillable]");for(let i=0;i<o.length;i++)window.lnCore._debugSink&&window.lnCore._debugSink("event","ln-fill",o[i],n??null),o[i].dispatchEvent(new CustomEvent("ln-fill",{detail:n??null,bubbles:!0}));return e}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._fillBound||(window.lnCore._fillBound=!0,document.addEventListener("ln-fill",function(e){if(!(!e.target.matches||!e.target.matches("[data-ln-fillable]")))if(e.detail)fe(e.target,e.detail);else{const n=e.target.querySelectorAll("[data-ln-field]");for(let o=0;o<n.length;o++)n[o].textContent=""}})));function he(e,n){if(!e||!n)return e;const o=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);for(;o.nextNode();){const s=o.currentNode;s.textContent.indexOf("{{")!==-1&&(s.textContent=s.textContent.replace(/\{\{\s*(\w+)\s*\}\}/g,function(c,f){return n[f]!==void 0?n[f]:""}))}const i=function(s,c){return n[c]!==void 0?n[c]:""},a=Array.from(e.querySelectorAll("*"));e.nodeType===1&&a.push(e);for(let s=0;s<a.length;s++){const c=a[s],f=c.attributes;for(let h=0;h<f.length;h++){const g=f[h];g.value.indexOf("{{")!==-1&&c.setAttribute(g.name,g.value.replace(/\{\{\s*(\w+)\s*\}\}/g,i))}}return e}function je(e,n,o,i,a,s){const c={};for(let h=0;h<e.children.length;h++){const g=e.children[h],b=g.getAttribute("data-ln-render-key");b&&(c[b]=g)}const f=document.createDocumentFragment();for(let h=0;h<n.length;h++){const g=n[h],b=String(i(g));let _=c[b];if(_)a(_,g,h);else{const x=Me(o,s);if(!x||(he(x,g),_=x.firstElementChild,!_))continue;_.setAttribute("data-ln-render-key",b),a(_,g,h)}f.appendChild(_)}e.textContent="",e.appendChild(f)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.fillTemplate=he,window.lnCore.fill=fe,window.lnCore.lnFill=Pe,window.lnCore.renderList=je);function we(e,n,o){const i=e.getAttribute(n);return i===null?o:i}function oe(e,n,o){const i=parseInt(e.getAttribute(n),10);return isNaN(i)?o:i}function ye(e,n,o=!1){const i=e.getAttribute(n);if(i===null)return!!o;const a=i.trim().toLowerCase();return!(a==="false"||a==="0")}function ge(e,n){return(e.getAttribute(n)||"").split(",").map(o=>o.trim()).filter(Boolean)}const ie=new Map;function Fe(e,n){const o=(e?e.join("|"):"")+"::"+n;if(ie.has(o))return ie.get(o);const i=new Set(e||[]),a=function(s,c){const f=s.getAttribute(c);return f!==null&&i.has(f)?f:n};return ie.set(o,a),a}function $e(e,n,o){const i=parseFloat(e.getAttribute(n));return isNaN(i)?o:i}function Ke(e,n,o){const i=e.getAttribute(n);if(!i)return o;try{return JSON.parse(i)}catch{return o}}function pe(e,n,o,i,a){if(!e||n===null)return!0;const s=i||"ln-component",c=e.type;if(c==="trigger"||c==="marker"||c==="string"||c==="list"||!c||n===""&&e.fallback!==void 0)return!0;const f=h=>{a?console.warn(h,a):console.warn(h)};if(c==="boolean"){const h=n.trim().toLowerCase();return h!==""&&h!=="true"&&h!=="false"&&h!=="1"&&h!=="0"?(f(`[${s}] Invalid value "${n}" for boolean attribute "${o}". Allowed: "true", "false", or presence-only.`),!1):!0}if(c==="enum"){const h=e.values||[];return h.includes(n)?!0:(f(`[${s}] Invalid value "${n}" for attribute "${o}". Allowed: ${h.join(", ")}. Fallback: "${e.fallback}".`),!1)}if(c==="integer"){if(!/^-?\d+$/.test(n))return f(`[${s}] Invalid integer "${n}" for attribute "${o}". Fallback: ${e.fallback}.`),!1;const h=parseInt(n,10);return e.min!==void 0&&h<e.min?(f(`[${s}] Value ${h} for attribute "${o}" is less than min (${e.min}).`),!1):e.max!==void 0&&h>e.max?(f(`[${s}] Value ${h} for attribute "${o}" is greater than max (${e.max}).`),!1):!0}if(c==="float")return isNaN(Number(n))?(f(`[${s}] Invalid float "${n}" for attribute "${o}". Fallback: ${e.fallback}.`),!1):!0;if(c==="json")try{return JSON.parse(n),!0}catch(h){return f(`[${s}] Invalid JSON for attribute "${o}": ${h.message}. Fallback: ${e.fallback}.`),!1}return!0}function Ve(e,n,o){for(const i in o){const[a,s,c]=o[i];Object.defineProperty(e,i,{get:function(){return a(n,s,c)},enumerable:!0,configurable:!0})}return e}function Ge(e){const n={};for(const o in e){const i=e[o];if(!i||!i.prop)continue;let a=i.read;if(!a&&i.type)switch(i.type){case"enum":a=Fe(i.values,i.fallback);break;case"integer":a=oe;break;case"float":a=$e;break;case"boolean":a=ye;break;case"list":a=ge;break;case"json":a=Ke;break;case"string":default:a=we;break}a||(a=we),n[i.prop]=[a,o,i.fallback]}return n}function He(e){const n={};for(const o in e){const i=e[o];i&&i.effect&&(n[o]=i.effect)}return Object.keys(n).length?n:null}function We(e){if(e.onAttrChange&&!e.declared)return null;const n=new Set;if(e.effects)for(const o in e.effects)n.add(o);if(e.onAttrChange&&e.declared)for(const o of e.declared)n.add(o);return n}function ae(e,n,o,i){if(e.nodeType!==1)return;const s=n.indexOf("[")!==-1||n.indexOf(".")!==-1||n.indexOf("#")!==-1?n:"["+n+"]",c=Array.from(e.querySelectorAll(s));e.matches&&e.matches(s)&&c.push(e);for(const f of c)if(!f[o]){window.lnCore._persistSink&&f.hasAttribute("data-ln-persist")&&window.lnCore._persistSink(f,n);try{f[o]=new i(f)}catch(h){console.error("["+o+"] init failed",f,h)}}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._bootHolds=window.lnCore._bootHolds||0,window.lnCore._bootQueue=window.lnCore._bootQueue||[]);function Ue(){return typeof window<"u"&&window.lnCore&&window.lnCore._bootHolds||0}function Qe(e){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(e):setTimeout(e,0)):e()}function me(){window.lnCore=window.lnCore||{};const e=window.lnCore._attrRegistry=window.lnCore._attrRegistry||{byAttr:new Map,reactive:[],persist:[]};return e.byReactive=e.byReactive||new Map,e.reactiveWildcard=e.reactiveWildcard||[],e}function Je(e){const n=me(),o=e.observed||[];for(let i=0;i<o.length;i++){const a=o[i];n.byAttr.has(a)||n.byAttr.set(a,[]),n.byAttr.get(a).push(e)}if(n.byDeclaredAttr=n.byDeclaredAttr||new Map,e.attributes)for(const i in e.attributes){n.byDeclaredAttr.has(i)||n.byDeclaredAttr.set(i,[]);const a=n.byDeclaredAttr.get(i);a.some(s=>s.componentTag===e.componentTag)||a.push({spec:e.attributes[i],componentTag:e.componentTag})}if(e.onAttrChange||e.effects){n.reactive.push(e);const i=We(e);if(i===null)n.reactiveWildcard.push(e);else for(const a of i)n.byReactive.has(a)||n.byReactive.set(a,[]),n.byReactive.get(a).push(e)}e.persist&&n.persist.push(e)}function be(e,n,o,i){for(let a=0;a<e.length;a++){const s=e[a];if(!n[s.attribute])continue;const c=s.effects&&s.effects[o];c?c(n,o,i):s.onAttrChange&&(!s.declared||s.declared.has(o))&&s.onAttrChange(n,o,i)}}function Ze(e){const n=e.target,o=e.attributeName;if(e.oldValue===n.getAttribute(o))return;const i=me(),a=i.byAttr.get(o);if(ce()&&i.byDeclaredAttr&&i.byDeclaredAttr.has(o)&&ne(n)){const s=i.byDeclaredAttr.get(o),c=n.getAttribute(o);for(let f=0;f<s.length;f++)pe(s[f].spec,c,o,s[f].componentTag,n)}if(window.lnCore._debugSink&&(o.indexOf("data-ln-")===0||a)&&window.lnCore._debugSink("attr",o,n,{oldValue:e.oldValue,newValue:n.getAttribute(o)}),o.indexOf("data-ln-")===0){const s=i.byReactive.get(o);s&&be(s,n,o,e.oldValue),i.reactiveWildcard.length&&be(i.reactiveWildcard,n,o,e.oldValue)}if(a)for(let s=0;s<a.length;s++){const c=a[s];if(c.handler){c.handler(n,o,e.oldValue);continue}c.onAttributeChange&&n[c.attribute]?c.onAttributeChange(n,o):(ae(n,c.selector,c.attribute,c.ComponentFn),c.onInit&&c.onInit(n))}}function Xe(){window.lnCore=window.lnCore||{},!window.lnCore._attrObserverBound&&(window.lnCore._attrObserverBound=!0,Q(function(){new MutationObserver(function(n){for(let o=0;o<n.length;o++)try{Ze(n[o])}catch(i){console.error("[ln-core] mutation handler failed",n[o].target,i)}}).observe(document.body,{attributes:!0,subtree:!0,attributeOldValue:!0})},"ln-core"))}function _e(){return window.lnCore=window.lnCore||{},window.lnCore._lifecycleRegistry=window.lnCore._lifecycleRegistry||[]}function Ye(e){const n=_e();if(n.length){if(e.target)for(let o=0;o<n.length;o++){const i=n[o];if(i.onSubtreeChange){const a=i.query,s=e.target.nodeType===1?e.target.matches(a)?e.target:e.target.closest(a):e.target.parentElement?e.target.parentElement.closest(a):null;s&&i.onSubtreeChange(s,e)}}for(let o=0;o<e.addedNodes.length;o++){const i=e.addedNodes[o];if(i.nodeType===1)for(let a=0;a<n.length;a++){const s=n[a];ae(i,s.selector,s.attribute,s.ComponentFn),s.onInit&&s.onInit(i)}}for(let o=0;o<e.removedNodes.length;o++){const i=e.removedNodes[o];if(i.nodeType===1)for(let a=0;a<n.length;a++){const s=n[a],c=s.query,f=Array.from(i.querySelectorAll(c));i.matches&&i.matches(c)&&f.push(i);for(let h=0;h<f.length;h++){const g=f[h];if(!document.contains(g)){const b=g[s.attribute];if(b&&typeof b.destroy=="function")try{b.destroy()}catch(_){console.error("["+s.attribute+"] destroy failed",g,_)}delete g[s.attribute]}}}}}}function et(){window.lnCore=window.lnCore||{},!window.lnCore._lifecycleObserverBound&&(window.lnCore._lifecycleObserverBound=!0,Q(function(){new MutationObserver(function(n){for(let o=0;o<n.length;o++){const i=n[o];if(i.type==="childList")try{Ye(i)}catch(a){console.error("[ln-core] lifecycle handler failed",i.target,a)}}}).observe(document.body,{childList:!0,subtree:!0})},"ln-core"))}function tt(e,n,o,i,a={}){const s=a.extraAttributes||[],c=a.onAttributeChange||null,f=a.onSubtreeChange||null,h=a.onInit||null,g=a.onAttrChange||null,b=a.effects||null,_=a.attributes||null,x=_?He(_):b,P=_?new Set(Object.keys(_)):null,j=a.persist||null;function p(k){const I=k||document.body;if(ae(I,e,n,o),_&&ce())for(const F in _){const J=_[F],H=Array.from(I.querySelectorAll("["+F+"]"));I.matches&&I.matches("["+F+"]")&&H.push(I);for(let K=0;K<H.length;K++){const M=H[K];ne(M)&&pe(J,M.getAttribute(F),F,i,M)}}h&&h(I)}const S=[];if(e.indexOf("[")!==-1){const k=/\[([\w-]+)/g;let I;for(;(I=k.exec(e))!==null;)S.push(I[1])}else S.push(e);Je({selector:e,attribute:n,componentTag:i,attributes:_,ComponentFn:o,onInit:h,observed:S.concat(s),onAttributeChange:c,onAttrChange:g,effects:x,declared:P,persist:j}),Xe();const q=e.indexOf("[")!==-1||e.indexOf(".")!==-1||e.indexOf("#")!==-1?e:"["+e+"]";_e().push({selector:e,attribute:n,ComponentFn:o,onInit:h,onSubtreeChange:f,query:q}),et(),window[n]=p;function v(){Ue()>0?Qe(function(){p(document.body)}):p(document.body)}return document.readyState==="loading"?document.addEventListener("DOMContentLoaded",v):v(),p}function nt(e){let n=!1;for(let o=0;o<e.length;o++){const i=e[o];if(!(i===""||i==null)&&(n=!0,!Number.isFinite(Number(i))))return"string"}return n?"number":"string"}function rt(e,n,o,i){if(o==="number"){const c=parseFloat(e),f=parseFloat(n);return(isNaN(c)?0:c)-(isNaN(f)?0:f)}const a=e!=null?String(e):"",s=n!=null?String(n):"";return i?i.compare(a,s):a<s?-1:a>s?1:0}function Ce(e){return(e||"").replace(/^#/,"")}function se(e){const n=e===void 0?location.hash:e,o={},i=Ce(n);if(!i)return o;const a=i.split("&");for(let s=0;s<a.length;s++){const c=a[s];if(!c)continue;const f=c.indexOf(":"),h=f>-1?c.slice(0,f):c,g=f>-1?c.slice(f+1):"";if(h)try{o[h]=decodeURIComponent(g)}catch{o[h]=g}}return o}function ot(e){if(!e)return null;const n=se();return e in n?n[e]:null}function it(e,n){if(!e)return;const o=se();n==null?delete o[e]:o[e]=String(n);const a=Object.keys(o).map(function(s){const c=o[s];return c===""?s:s+":"+encodeURIComponent(c)}).join("&");Ce(location.hash)!==a&&(location.hash=a)}function at(e){return e.button===1||e.ctrlKey||e.metaKey||e.shiftKey?!1:(e.preventDefault(),!0)}function st(e,n){if(!e||!e.hasAttribute("data-ln-hash"))return null;const o=e.getAttribute("data-ln-hash");if(o&&o.trim()!=="")return o.trim();const i=e.getAttribute("data-ln-sort")||e.getAttribute("data-ln-search-for")||e.getAttribute("data-ln-search")||e.getAttribute("data-ln-filter")||e.id;return i?n?i+"-"+n:i:n||null}function lt(e,n){return!n||n==="none"||e===null||e===void 0?null:String(e)+"."+n}function ct(e){return!e||typeof e!="string"?null:e.endsWith(".asc")?{fieldOrColumn:e.slice(0,-4),direction:"asc"}:e.endsWith(".desc")?{fieldOrColumn:e.slice(0,-5),direction:"desc"}:null}function ut(e,n){return!e||!Array.isArray(n)||n.length===0?null:e+":"+n.map(encodeURIComponent).join(",")}function dt(e){if(!e||typeof e!="string")return null;const n=e.indexOf(":");if(n===-1)return null;const o=e.slice(0,n),i=e.slice(n+1),a=i?i.split(",").map(function(s){try{return decodeURIComponent(s)}catch{return s}}).filter(Boolean):[];return{key:o,values:a}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.hashParse=se,window.lnCore.hashGet=ot,window.lnCore.hashSet=it,window.lnCore.hashLinkClick=at,window.lnCore.resolveHashNamespace=st,window.lnCore.hashSortEncode=lt,window.lnCore.hashSortDecode=ct,window.lnCore.hashFilterEncode=ut,window.lnCore.hashFilterDecode=dt);let G=null;const ft="ln-ashlar:storage-salt:v1",Se=32768;function Ae(e){let n="";const o=e.byteLength;for(let i=0;i<o;i+=Se)n+=String.fromCharCode.apply(null,e.subarray(i,Math.min(i+Se,o)));return btoa(n)}function ve(e){const n=atob(e),o=n.length,i=new Uint8Array(o);for(let a=0;a<o;a++)i[a]=n.charCodeAt(a);return i}function xe(e,n){let o=G,i={};return typeof CryptoKey<"u"&&e instanceof CryptoKey?o=e:e&&typeof e=="object"&&(i=e,typeof CryptoKey<"u"&&i.key instanceof CryptoKey&&(o=i.key)),{key:o,options:i}}async function ht(e,n={}){if(!e)throw new Error("[ln-crypto] Key derivation failed: Secret string is required");const o=n.method||"pbkdf2",i=new TextEncoder;if(o==="sha256"){const h=await crypto.subtle.digest("SHA-256",i.encode(e));return crypto.subtle.importKey("raw",h,{name:"AES-GCM"},!1,["encrypt","decrypt"])}const a=n.salt||ft,s=typeof a=="string"?i.encode(a):a,c=n.iterations||1e5,f=await crypto.subtle.importKey("raw",i.encode(e),"PBKDF2",!1,["deriveKey"]);return crypto.subtle.deriveKey({name:"PBKDF2",salt:s,iterations:c,hash:"SHA-256"},f,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}async function ke(e,n={}){if(!e){G=null;return}try{const o=n.method||"sha256";G=await ht(e,{...n,method:o})}catch(o){throw console.error("[ln-core/crypto] Key derivation failed:",o),G=null,o}}function B(){return G}async function wt(e,n,o){const{key:i}=xe(n);if(e==null)return e;if(!i)throw new Error("[ln-crypto] Encryption failed: No active cryptographic key provided");try{const a=new TextEncoder,s=crypto.getRandomValues(new Uint8Array(12)),c=typeof e=="string"?e:JSON.stringify(e),f=await crypto.subtle.encrypt({name:"AES-GCM",iv:s},i,a.encode(c));return{v:1,alg:"AES-GCM",encrypted:!0,iv:Ae(s),data:Ae(new Uint8Array(f))}}catch(a){throw console.error("[ln-core/crypto] Encryption failed:",a),new Error("[ln-crypto] Encryption failed: "+(a&&a.message?a.message:String(a)))}}async function yt(e,n,o){const{key:i,options:a}=xe(n),s=a.silent===!0;if(!e||!e.encrypted)return e;if(!i){if(s)return{...e,decryptionError:!0};throw new Error("[ln-crypto] Decryption failed: No active cryptographic key provided")}if(!e.iv||!e.data){if(s)return{...e,decryptionError:!0};throw new Error("[ln-crypto] Decryption failed: Malformed envelope (missing iv or data)")}try{const c=new TextDecoder,f=ve(e.iv),h=ve(e.data),g=await crypto.subtle.decrypt({name:"AES-GCM",iv:f},i,h),b=c.decode(g);try{return JSON.parse(b)}catch{return b}}catch(c){if(s)return{...e,decryptionError:!0};throw console.error("[ln-core/crypto] Decryption failed. Key may be incorrect or payload tampered:",c),new Error("[ln-crypto] Decryption failed. Key may be incorrect or payload tampered: "+(c&&c.message?c.message:String(c)))}}function gt(e){return String(e||"").trim().toLowerCase()}function pt(e){const n=gt(e);return n?n.split(/\s+/).filter(Boolean):[]}function mt(e,n){if(!n||n.length===0)return!0;if(!e)return!1;const o=String(e).toLowerCase();for(let i=0;i<n.length;i++)if(o.indexOf(n[i])===-1)return!1;return!0}function bt(e,n){if(!n||n.length===0)return!0;if(e==null)return!1;const o=String(e).trim().toLowerCase();for(let i=0;i<n.length;i++)if(String(n[i]).trim().toLowerCase()===o)return!0;return!1}function _t(e={}){let n=e.windowSize>0?e.windowSize:1e3,o=e.pageSize>0?e.pageSize:200,i=e.fetchDebounce!=null?e.fetchDebounce:120;const a=typeof e.requestPage=="function"?e.requestPage:()=>{},s=new Map,c=new Set;let f=0,h=0,g=0,b=!1,_=null;function x(p,S){s.delete(p),s.set(p,S)}function P(){if(s.size<=n)return[];const p=[];for(;s.size>n;){const T=s.keys().next().value;p.push(s.get(T)),s.delete(T)}const S=new Set(s.values());return p.filter(T=>!S.has(T))}function j(p,S){c.add(p),clearTimeout(_),_=setTimeout(()=>a(p,o,S),i)}return{get logicalTotal(){return f},set logicalTotal(p){f=p},get grandTotal(){return h},set grandTotal(p){h=p},get queryGen(){return g},set queryGen(p){g=p},get size(){return s.size},get hasLoaded(){return b},getId:p=>{if(!s.has(p))return;const S=s.get(p);return x(p,S),S},ensure:(p,S,T)=>{if(!b&&!c.has(0))return j(0,T);if(f<=0)return;const q=Math.max(0,p),v=Math.min(f,S);for(let k=q;k<v;k++)if(!s.has(k)){const I=Math.floor(k/o)*o;if(!c.has(I))return j(I,T)}},ingest:(p,S,T,q,v)=>{if(v!=null&&v!==g)return[];b=!0,T!=null&&(h=T),q!=null&&(f=q);for(let k=0;k<S.length;k++)x(p+k,S[k]);return c.delete(p),P()},reset:function(){g++,this.clear()},clear:()=>{b=!1,s.clear(),c.clear(),clearTimeout(_)},configure:(p={})=>{let S=[];return p.windowSize>0&&p.windowSize!==n&&(n=p.windowSize,S=P()),p.pageSize>0&&(o=p.pageSize),p.fetchDebounce>=0&&(i=p.fetchDebounce),S}}}function Ct(e,n,o){if(!Array.isArray(e)||!n||!n.field)return e;const{field:i,direction:a}=n,s=a==="desc",c=e.map(h=>h?h[i]:void 0),f=nt(c);return[...e].sort((h,g)=>{const b=h?h[i]:void 0,_=g?g[i]:void 0,x=rt(b,_,f,o);return s?-x:x})}function Ie(e,n){if(!Array.isArray(e)||!n||typeof n!="object")return e;const o=Object.keys(n).filter(i=>Array.isArray(n[i])&&n[i].length>0);return o.length?e.filter(i=>i?o.every(a=>bt(i[a],n[a])):!1):e}function St(e,n,o){if(!Array.isArray(e)||!n||!o||!o.length)return e;const i=pt(n);return i.length?e.filter(a=>a?i.every(s=>o.some(c=>{const f=a[c];return f!=null&&mt(String(f),[s])})):!1):e}function At(e,n,o){if(!Array.isArray(e)||!e.length)return 0;if(o==="count")return e.length;const i=e.map(s=>s&&s[n]!=null?parseFloat(s[n]):NaN).filter(s=>Number.isFinite(s)),a=i.reduce((s,c)=>s+c,0);return o==="sum"?a:o==="avg"&&i.length?a/i.length:0}function vt(e,n={},o=[],i){if(!Array.isArray(e))return{records:[],total:0,filtered:0};const a=e.length;let s=e;n.filters&&(s=Ie(s,n.filters)),n.search&&(s=St(s,n.search,o));const c=s.length;if(n.sort&&(s=Ct(s,n.sort,i)),n.offset||n.limit){const f=n.offset||0,h=n.limit||s.length;s=s.slice(f,f+h)}return{records:s,total:a,filtered:c}}function xt(e,n){return!Array.isArray(e)||!n||typeof n!="object"?e:e.map(o=>{if(!o)return null;const i={...o};for(const[a,s]of Object.entries(n))if(typeof s=="function")try{i[a]=s(o)}catch{i[a]=void 0}return i})}function kt(e,n,o,i="_meta"){if(!Array.isArray(e)||!e.includes(i))return!0;for(const a of Object.keys(n||{})){if(!e.includes(a))return!0;const s=n[a]&&n[a].indexes||[],c=o&&o[a]||[];if(s.some(f=>!c.includes(f)))return!0}return!1}function It(e){return{ok:!1,error:e&&e.message?e.message:String(e)}}(function(){const e="data-ln-data-store",n="lnDataStore";if(window[n]!==void 0)return;function o(t,r,l){const u=t.getAttribute(r);if(u==="never"||u==="-1")return-1;const d=parseInt(u,10);return isNaN(d)?l:d}const i={"data-ln-data-store":{type:"marker",effect:De,description:"Identifies the element as a data-store definition container"},"data-ln-data-store-indexes":{type:"list",effect:De,description:"Comma-separated index field names for the IndexedDB store"},"data-ln-data-store-stale":{prop:"_staleThreshold",type:"integer",read:o,fallback:300,description:"Cache staleness threshold in seconds, or -1/never"},"data-ln-data-store-search-fields":{prop:"_searchFields",type:"list",read:ge,description:"Record fields to index for client-side search"},"data-ln-data-store-no-local-query":{prop:"noLocalQuery",type:"boolean",read:ye,description:"Bypasses local IndexedDB query resolution, forcing remote fetching"},"data-ln-data-store-window":{prop:"_windowSize",type:"integer",read:oe,fallback:1e3,min:10,effect:Wt,description:"Virtual scrolling cache window size in records"},"data-ln-data-store-window-page":{prop:"_windowPageSize",type:"integer",read:oe,fallback:200,min:5,effect:Ut,description:"Virtual scrolling slice page size"},"data-ln-data-store-frozen":{type:"marker",description:"Applied at runtime to indicate store schema is locked in IndexedDB"}},a=Ge(i),s="ln_app_cache",c="_meta",f="1.0";let h=null,g=null;const b={};function _(t){t&&t.name==="QuotaExceededError"&&A(document,"ln-data-store:quota-exceeded",{error:t})}function x(){const t={};for(const r of document.querySelectorAll(`[${e}]`)){const l=r.id;if(l){const u=r.getAttribute("data-ln-data-store-indexes")||"";t[l]={indexes:u.split(",").map(d=>d.trim()).filter(Boolean)}}}return t}function P(){return g||(g=new Promise(t=>{if(typeof indexedDB>"u")return console.warn("[ln-data-store] IndexedDB is not available in this environment"),t(null);const r=x(),l=Object.keys(r),u=indexedDB.open(s);u.onerror=()=>{console.warn("[ln-data-store] IndexedDB open failed"),t(null)},u.onsuccess=d=>{const w=d.target.result,y=Array.from(w.objectStoreNames),m=l.filter(D=>y.includes(D));let C={};if(m.length>0){const D=w.transaction(m,"readonly");for(const L of m)C[L]=Array.from(D.objectStore(L).indexNames)}if(!kt(y,r,C,c))return j(w),h=w,t(w);const $=w.version;w.close();const O=indexedDB.open(s,$+1);let z=!1,R=null;O.onblocked=()=>{console.warn("[ln-data-store] Database upgrade blocked — waiting for other tabs to close connection"),A(document,"ln-data-store:blocked",{db:s}),R||(R=setTimeout(()=>{z||(console.warn("[ln-data-store] Database upgrade timed out while blocked"),z=!0,g=null,t(null))},5e3))},O.onerror=()=>{z||(R&&clearTimeout(R),z=!0,g=null,console.warn("[ln-data-store] Database upgrade failed"),t(null))},O.onupgradeneeded=D=>{const L=D.target.result,Qt=D.target.transaction;L.objectStoreNames.contains(c)||L.createObjectStore(c,{keyPath:"key"});for(const U of l)if(L.objectStoreNames.contains(U)){const te=Qt.objectStore(U);for(const V of r[U].indexes)te.indexNames.contains(V)||te.createIndex(V,V,{unique:!1})}else{const te=L.createObjectStore(U,{keyPath:"id"});for(const V of r[U].indexes)te.createIndex(V,V,{unique:!1})}},O.onsuccess=D=>{if(z){D.target.result&&D.target.result.close();return}R&&clearTimeout(R),z=!0;const L=D.target.result;j(L),h=L,t(L)}}}),g)}function j(t){t.onversionchange=()=>{t.close(),h=null,g=null}}function p(){return h?Promise.resolve(h):(g=null,P())}async function S(t){if(!B()||!t)return t;const r={...t},l=r.id,u=await wt(r);return!u||!u.encrypted?t:{...u,id:l}}async function T(t){return!t||!t.encrypted||!B()?t:yt(t,{silent:!0})}const q=(t,r)=>p().then(l=>l?l.transaction(t,r).objectStore(t):null);function v(t){return new Promise((r,l)=>{t.onsuccess=()=>r(t.result),t.onerror=()=>{_(t.error),l(t.error)}})}const k=t=>q(t,"readonly").then(r=>r?v(r.getAll()):[]).then(r=>B()?Promise.all(r.map(l=>T(l))):r),I=(t,r)=>q(t,"readonly").then(l=>l?v(l.get(r)).then(u=>u!==void 0?u:typeof r=="string"&&r.trim()!==""&&!isNaN(Number(r))?v(l.get(Number(r))):typeof r=="number"?v(l.get(String(r))):null):null).then(l=>l?T(l):null),F=(t,r)=>p().then(l=>{if(!l)return[];const d=l.transaction(t,"readonly").objectStore(t),w=r.map(y=>v(d.get(y)).then(m=>m!==void 0?m:typeof y=="string"&&y.trim()!==""&&!isNaN(Number(y))?v(d.get(Number(y))):typeof y=="number"?v(d.get(String(y))):null));return Promise.all(w).then(y=>B()?Promise.all(y.map(m=>m?T(m):null)):y)}),J=(t,r)=>(B()?S(r):Promise.resolve(r)).then(u=>q(t,"readwrite").then(d=>d?v(d.put(u)):null)),H=(t,r)=>q(t,"readwrite").then(l=>l?v(l.delete(r)).then(()=>{if(typeof r=="string"&&r.trim()!==""&&!isNaN(Number(r)))return v(l.delete(Number(r)));if(typeof r=="number")return v(l.delete(String(r)))}):null),K=t=>q(t,"readwrite").then(r=>r?v(r.clear()):null),M=t=>q(t,"readonly").then(r=>r?v(r.count()):0),Et=t=>q(c,"readonly").then(r=>r?v(r.get(t)):null),Z=(t,r)=>q(c,"readwrite").then(l=>{if(l)return r.key=t,v(l.put(r))});function N(t){return this.dom=t,this._name=t.id,this._name||console.warn("[ln-data-store] missing id — the store cannot be addressed",t),Ve(this,t,a),this._handlers=null,this.isLoaded=!1,this.canServe=!1,this.isInitialized=!1,this.initializationError=null,this.hasCache=!1,this.isSyncing=!1,this.lastSyncedAt=null,this.query={filters:{},search:"",sort:null},t.hasAttribute("data-ln-data-store-window")?this._windowIndex=_t({windowSize:this._windowSize,pageSize:this._windowPageSize,requestPage:(r,l,u)=>{A(this.dom,"ln-data-store:request-page",{store:this._name,offset:r,limit:l,query:u,queryGen:this._windowIndex.queryGen})}}):this._windowIndex=null,this.windowed=this._windowIndex!==null,this.totalCount=0,this.presenters=null,this._mutationChain=Promise.resolve(),b[this._name]=this,qt(this),this.ready=Rt(this),this}function qt(t){t._handlers={create:r=>X(t,"create",r.detail,()=>Tt(t,r.detail)),update:r=>X(t,"update",r.detail,()=>Nt(t,r.detail)),delete:r=>X(t,"delete",r.detail,()=>Dt(t,r.detail)),"bulk-delete":r=>X(t,"bulk-delete",r.detail,()=>Lt(t,r.detail)),"sync-failed":r=>{t.isSyncing=!1,A(t.dom,"ln-data-store:sync-error",{store:t._name,error:r.detail&&r.detail.error,status:r.detail&&r.detail.status})}};for(const[r,l]of Object.entries(t._handlers))t.dom.addEventListener(`ln-data-store:request-${r}`,l);t._queryHandlers={"ln-search:change":r=>{r.preventDefault();const l=r.detail&&r.detail.term!=null?r.detail.term:"";l!==t.query.search&&(t.query.search=l,le(t))},"ln-filter:change":r=>{r.preventDefault();const l=r.detail&&r.detail.key;if(!l)return;const u=(r.detail.values||[]).slice(),d=t.query.filters[l];(d?d.length===u.length&&d.every((y,m)=>y===u[m]):!u.length)||(u.length?t.query.filters[l]=u:delete t.query.filters[l],le(t))},"ln-sort:change":r=>{r.preventDefault();const l=r.detail&&r.detail.field,u=r.detail&&r.detail.direction,d=u&&u!=="none"?{field:l,direction:u}:null,w=t.query.sort;!w&&!d||w&&d&&w.field===d.field&&w.direction===d.direction||(t.query.sort=d,le(t))}};for(const[r,l]of Object.entries(t._queryHandlers))t.dom.addEventListener(r,l)}function X(t,r,l,u){const d=l&&l.requestId;return t._mutationChain=t._mutationChain.then(()=>t.ready).then(()=>{if(t.initializationError)throw t.initializationError;return u()}).catch(w=>zt(t,r,d,w)),t._mutationChain}function Y(t,r=0){return M(t._name).then(l=>{if(t._windowIndex||t.windowed){const u=t.totalCount!=null?t.totalCount:l;t.totalCount=Math.max(0,u+r)}else t.totalCount=l;return t.hasCache=!0,t.isLoaded=!0,t.canServe=!0,Z(t._name,{schema_version:f,last_synced_at:t.lastSyncedAt,has_cache:!0,record_count:t.totalCount})})}function Tt(t,{tempId:r,data:l={},requestId:u}={}){const d={...l,id:r};return J(t._name,d).then(()=>Y(t,1)).then(()=>{A(t.dom,"ln-data-store:created",{store:t._name,record:d,tempId:r,requestId:u})})}function Nt(t,{id:r,data:l={},requestId:u}={}){return I(t._name,r).then(d=>{if(!d)throw new Error(`Record not found: ${r}`);const w=d.id,y={...d,...l,id:w},m=l.id,C=m!==void 0&&m!==w;return(C?Ot(t._name,w,{...y,id:m}):J(t._name,y)).then(()=>Y(t,0)).then(()=>{A(t.dom,"ln-data-store:updated",{store:t._name,record:C?{...y,id:m}:y,previous:d,requestId:u})})})}function Dt(t,{id:r,requestId:l}={}){return I(t._name,r).then(u=>{if(!u){A(t.dom,"ln-data-store:deleted",{store:t._name,id:r,requestId:l,missing:!0});return}const d=u.id;return H(t._name,d).then(()=>Y(t,-1)).then(()=>{A(t.dom,"ln-data-store:deleted",{store:t._name,id:d,requestId:l})})})}function Lt(t,{ids:r=[],requestId:l}={}){return r.length?Promise.all(r.map(u=>I(t._name,u))).then(u=>{const d=u.filter(Boolean).map(w=>w.id);return ee(t._name,d).then(()=>Y(t,-d.length)).then(()=>{A(t.dom,"ln-data-store:deleted",{store:t._name,ids:d,requestId:l})})}):(A(t.dom,"ln-data-store:deleted",{store:t._name,ids:[],requestId:l}),Promise.resolve())}function zt(t,r,l,u){console.error("[ln-data-store] "+r+" failed:",u),A(t.dom,"ln-data-store:mutation-error",{store:t._name,action:r,requestId:l,error:u})}function Rt(t){return P().then(r=>{if(!r)throw new Error("IndexedDB is unavailable");return Et(t._name)}).then(r=>{if(t.initializationError=null,r&&r.schema_version===f)t.lastSyncedAt=r.last_synced_at||null,t.totalCount=r.record_count||0,t.hasCache=r.has_cache===!0||t.totalCount>0,t.hasCache&&(t.isLoaded=!0,t.canServe=!0,A(t.dom,"ln-data-store:ready",{store:t._name,count:t.totalCount,source:"cache"})),t.isInitialized=!0,A(t.dom,"ln-data-store:initialized",{store:t._name,hasCache:t.hasCache,lastSyncedAt:t.lastSyncedAt,count:t.totalCount});else{if(r&&r.schema_version!==f)return K(t._name).then(()=>Z(t._name,{schema_version:f,last_synced_at:null,has_cache:!1,record_count:0})).then(()=>{t.isInitialized=!0,t.hasCache=!1,A(t.dom,"ln-data-store:initialized",{store:t._name,hasCache:!1,lastSyncedAt:null,count:0})});t.isInitialized=!0,t.hasCache=!1,A(t.dom,"ln-data-store:initialized",{store:t._name,hasCache:!1,lastSyncedAt:null,count:0})}}).catch(r=>(t.isInitialized=!0,t.isLoaded=!1,t.canServe=!1,t.hasCache=!1,t.isSyncing=!1,t.initializationError=r,A(t.dom,"ln-data-store:initialization-error",{store:t._name,error:r}),{ok:!1,error:r}))}function Ee(t){t.isSyncing=!0,A(t.dom,"ln-data-store:request-remote-sync",{since:t.lastSyncedAt})}function qe(t,r){return p().then(l=>l?(B()?Promise.all(r.map(d=>S(d))):Promise.resolve(r)).then(d=>new Promise((w,y)=>{const m=l.transaction(t,"readwrite"),C=m.objectStore(t);d.forEach(E=>C.put(E)),m.oncomplete=()=>w(),m.onerror=()=>{_(m.error),y(m.error)}})):void 0)}function ee(t,r){return p().then(l=>{if(l)return new Promise((u,d)=>{const w=l.transaction(t,"readwrite"),y=w.objectStore(t);r.forEach(m=>{y.delete(m),typeof m=="string"&&m.trim()!==""&&!isNaN(Number(m))?y.delete(Number(m)):typeof m=="number"&&y.delete(String(m))}),w.oncomplete=()=>u(),w.onerror=()=>d(w.error)})})}function Ot(t,r,l){return(B()?S(l):Promise.resolve(l)).then(d=>p().then(w=>{if(w)return new Promise((y,m)=>{const C=w.transaction(t,"readwrite"),E=C.objectStore(t);E.put(d),E.delete(r),C.oncomplete=()=>y(),C.onerror=()=>{_(C.error),m(C.error)}})}))}const Bt=new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"});function Mt(t){return t?Object.keys(t).filter(r=>Array.isArray(t[r])&&t[r].length>0):[]}function Pt(t,r,l){return r.every(u=>l[u].map(String).includes(String(t[u])))}function jt(t){return String(t||"").toLowerCase().split(/\s+/).filter(Boolean)}function Ft(t,r,l){return r.every(u=>l.some(d=>{const w=t[d];return w!=null&&String(w).toLowerCase().includes(u)}))}function $t(t,r,l){return At(t,r,l)}function W(t,r){return xt(r,t.presenters&&t.presenters.computed)}function Kt(t){return!t.sort&&!B()}function Vt(t,r,l){const u=Mt(r.filters),d=r.search?jt(r.search):[],w=t._searchFields,y=d.length>0&&w&&w.length>0;return q(t._name,"readonly").then(m=>m?new Promise((C,E)=>{const $=[],O=m.openCursor();O.onsuccess=()=>{const z=O.result;if(!z||$.length>=l){C($);return}const R=z.value;(!u.length||Pt(R,u,r.filters))&&(!y||Ft(R,d,w))&&$.push(R),z.continue()},O.onerror=()=>E(O.error)}):[])}function Te(t,r,l){return vt(r,l,t._searchFields,Bt)}function Ne(t,r,l){const u=[];for(let w=r;w<r+l;w++){const y=t._windowIndex.getId(w);u.push(y)}const d=Array.from(new Set(u.filter(w=>w!==void 0)));return F(t._name,d).then(w=>{const y=new Map;for(let C=0;C<w.length;C++){const E=w[C];E&&y.set(String(E.id),E)}const m=[];for(let C=0;C<u.length;C++){const E=u[C];if(E===void 0)m.push(null);else{const $=y.get(String(E));m.push($||null)}}return{data:W(t,m),total:t._windowIndex.grandTotal,filtered:t._windowIndex.logicalTotal,offset:r,queryGen:t._windowIndex.queryGen}})}N.prototype.getAll=function(t={}){const r=this;if(r._windowIndex){const l=t.offset||0,u=t.limit||200;if(r._windowIndex.ensure(l,l+u,t),!r._windowIndex.hasLoaded&&!r.noLocalQuery){const d=l+u,w=y=>y.length?{data:W(r,y),offset:l,queryGen:r._windowIndex.queryGen,provisional:!0}:Ne(r,l,u);return Kt(t)?Vt(r,t,d).then(y=>w(y.slice(l,d))):k(r._name).then(y=>w(Te(r,y,t).records))}return Ne(r,l,u)}return k(r._name).then(l=>{const u=Te(r,l,t);return{data:W(r,u.records),total:u.total,filtered:u.filtered}})},N.prototype.getById=function(t){return I(this._name,t).then(r=>r?W(this,[r])[0]:null)},N.prototype.count=function(t){return t&&Object.keys(t).length>0?k(this._name).then(l=>Ie(l,t).length):this.totalCount!=null?Promise.resolve(this.totalCount):M(this._name)},N.prototype.aggregate=function(t,r){return k(this._name).then(l=>$t(l,t,r))},N.prototype.setPresenters=function(t){this.presenters=t},N.prototype.applySync=function(t,r,l,u){u=u||{};const d=this;if(d._windowIndex&&u.queryGen!=null&&u.queryGen!==d._windowIndex.queryGen)return Promise.resolve({ok:!0,stale:!0});let w=p().then(y=>{if(!y)throw new Error("IndexedDB unavailable")});return t.length>0&&(w=w.then(()=>qe(d._name,t))),r.length>0&&(w=w.then(()=>ee(d._name,r))),w.then(()=>{if(d._windowIndex&&(u.offset!=null||u.total!=null)){const y=u.offset!=null?u.offset:0,m=t.map(E=>E.id),C=d._windowIndex.ingest(y,m,u.total,u.filtered,u.queryGen);if(C&&C.length)return ee(d._name,C)}}).then(()=>M(d._name)).then(y=>(d.totalCount=u.total!==void 0?u.total:y,d.hasCache=!0,Z(d._name,{schema_version:f,last_synced_at:l,has_cache:!0,record_count:d.totalCount}))).then(()=>{const y=!d.isLoaded;return d.isLoaded=!0,d.canServe=!0,d.isSyncing=!1,d.lastSyncedAt=l,y?(A(d.dom,"ln-data-store:loaded",{store:d._name,count:d.totalCount,meta:u}),A(d.dom,"ln-data-store:ready",{store:d._name,count:d.totalCount,source:"server",meta:u})):A(d.dom,"ln-data-store:synced",{store:d._name,added:t.length,deleted:r.length,changed:!0,meta:u}),{ok:!0}}).catch(y=>{d.isSyncing=!1;const m=y&&y.message?y.message:String(y);return console.error("[ln-data-store] applySync failed:",y),A(d.dom,"ln-data-store:sync-error",{store:d._name,error:m}),It(y)})},N.prototype.applyQuery=function(t,r){r=r||{};const l=this;let u=Promise.resolve();return t.length>0&&(u=u.then(()=>qe(l._name,t))),u.then(()=>M(l._name)).then(d=>(l.totalCount=r.total!==void 0?r.total:d,t.length>0&&(l.canServe=!0),W(l,t))).catch(d=>(console.error("[ln-data-store] applyQuery failed:",d),[]))},N.prototype.forceSync=function(){this.isSyncing||Ee(this)},N.prototype.fullReload=function(){const t=this;return K(t._name).then(()=>Z(t._name,{schema_version:f,last_synced_at:null,has_cache:!1,record_count:0})).then(()=>{t.isLoaded=!1,t.hasCache=!1,t.lastSyncedAt=null,t.totalCount=0,Ee(t)})},N.prototype.destroy=function(){if(this._windowIndex&&(this._windowIndex.clear(),this._windowIndex=null,this.windowed=!1),this._handlers){for(const[t,r]of Object.entries(this._handlers))this.dom.removeEventListener(`ln-data-store:request-${t}`,r);this._handlers=null}if(this._queryHandlers){for(const[t,r]of Object.entries(this._queryHandlers))this.dom.removeEventListener(t,r);this._queryHandlers=null}delete b[this._name],delete this.dom[n]};function Gt(){return p().then(t=>{if(!t)return;const r=Array.from(t.objectStoreNames);return new Promise((l,u)=>{const d=t.transaction(r,"readwrite");r.forEach(w=>d.objectStore(w).clear()),d.oncomplete=()=>l(),d.onerror=()=>u(d.error)})}).then(()=>{Object.values(b).forEach(t=>{t.isLoaded=!1,t.canServe=!1,t.isInitialized=!1,t.initializationError=null,t.hasCache=!1,t.isSyncing=!1,t.lastSyncedAt=null,t.totalCount=0})})}function le(t){t._windowIndex&&t._windowIndex.reset(),A(t.dom,"ln-data-store:query-changed",{store:t._name,query:{filters:Object.assign({},t.query.filters),search:t.query.search,sort:t.query.sort?Object.assign({},t.query.sort):null}})}const Ht="data-ln-data-store-frozen";function De(t,r){t.setAttribute(Ht,r)}function Wt(t){const r=t[n];if(!r._windowIndex)return;const l=r._windowIndex.configure({windowSize:r._windowSize});l.length&&ee(r._name,l).catch(u=>{console.error("[ln-data-store] window shrink eviction failed:",u)})}function Ut(t){const r=t[n];r._windowIndex&&r._windowIndex.configure({pageSize:r._windowPageSize})}tt(e,n,N,"ln-data-store",{attributes:i}),window[n].clearAll=Gt,window[n].init=window[n],window[n].setStorageKey=ke,typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.setStorageKey=ke)})()})();
|
|
1
|
+
(function(){"use strict";function ce(){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 ne(e){if(typeof window>"u")return!1;if(window.lnDebug===!0)return!0;if(window.lnCore&&window.lnCore._debugIsContained)return e?window.lnCore._debugIsContained(e):window.lnCore._debugSink!==null;if(e&&e.closest){const n=e.closest("[data-ln-debug]");return!(!n||typeof document<"u"&&n===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 e=console.warn;console.warn=function(...n){if(typeof n[0]=="string"&&(n[0].startsWith("[ln-")||n[0].startsWith("[lnCore"))){let i=null;for(let a=1;a<n.length;a++)if(n[a]&&n[a].nodeType===1){i=n[a];break}if(!ne(i))return}e.apply(console,n)}}function A(e,n,o){const i=o||{};window.lnCore._debugSink&&window.lnCore._debugSink("event",n,e,i),e.dispatchEvent(new CustomEvent(n,{bubbles:!0,detail:i}))}function Q(e,n){if(!document.body){document.addEventListener("DOMContentLoaded",function(){Q(e,n)}),console.warn("["+n+'] Script loaded before <body> — add "defer" to your <script> tag');return}e()}const ue={};function Le(e,n){ue[e]=n}function ze(e){return ue[e]||{ingress:n=>n,egress:n=>n}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerDataMapper=Le,window.lnCore.getDataMapper=ze);function Re(){typeof window>"u"||(window.lnCore=window.lnCore||{},!window.lnCore._localeObserverBound&&(window.lnCore._localeObserverBound=!0,Q(function(){new MutationObserver(function(){A(document,"ln-core:locale-change",{})}).observe(document.documentElement,{attributes:!0,attributeFilter:["lang"],subtree:!0})},"ln-core")))}const de={};function Oe(e,n){if(!e||typeof n!="object")return;const o=e.toLowerCase().split("-")[0];de[o]=n}function Me(e){if(!e)return null;const n=e.toLowerCase().split("-")[0];return de[n]||null}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerLocaleFallback=Oe,window.lnCore.getLocaleFallback=Me,window.lnCore.ensureLocaleObserver=Re);const re={};function Be(e,n){re[e]||(re[e]=document.querySelector('[data-ln-template="'+e+'"]'));const o=re[e];return o?o.content.cloneNode(!0):(console.warn("["+(n||"ln-core")+'] Template "'+e+'" not found'),null)}function fe(e,n){if(!e||!n)return e;const o=e.querySelectorAll("[data-ln-field]");for(let c=0;c<o.length;c++){const f=o[c],h=f.getAttribute("data-ln-field");n[h]!=null&&(f.textContent=n[h])}const i=e.querySelectorAll("[data-ln-attr]");for(let c=0;c<i.length;c++){const f=i[c],h=f.getAttribute("data-ln-attr").split(",");for(let p=0;p<h.length;p++){const b=h[p].trim().split(":");if(b.length!==2)continue;const _=b[0].trim(),x=b[1].trim();n[x]!=null&&f.setAttribute(_,n[x])}}const a=e.querySelectorAll("[data-ln-show]");for(let c=0;c<a.length;c++){const f=a[c],h=f.getAttribute("data-ln-show");h in n&&f.classList.toggle("hidden",!n[h])}const s=e.querySelectorAll("[data-ln-class]");for(let c=0;c<s.length;c++){const f=s[c],h=f.getAttribute("data-ln-class").split(",");for(let p=0;p<h.length;p++){const b=h[p].trim().split(":");if(b.length!==2)continue;const _=b[0].trim(),x=b[1].trim();x in n&&f.classList.toggle(_,!!n[x])}}return e}function Pe(e,n){e.matches&&e.matches("[data-ln-form], [data-ln-fillable]")&&(window.lnCore._debugSink&&window.lnCore._debugSink("event","ln-fill",e,n??null),e.dispatchEvent(new CustomEvent("ln-fill",{detail:n??null,bubbles:!0})));const o=e.querySelectorAll("[data-ln-form], [data-ln-fillable]");for(let i=0;i<o.length;i++)window.lnCore._debugSink&&window.lnCore._debugSink("event","ln-fill",o[i],n??null),o[i].dispatchEvent(new CustomEvent("ln-fill",{detail:n??null,bubbles:!0}));return e}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._fillBound||(window.lnCore._fillBound=!0,document.addEventListener("ln-fill",function(e){if(!(!e.target.matches||!e.target.matches("[data-ln-fillable]")))if(e.detail)fe(e.target,e.detail);else{const n=e.target.querySelectorAll("[data-ln-field]");for(let o=0;o<n.length;o++)n[o].textContent=""}})));function he(e,n){if(!e||!n)return e;const o=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);for(;o.nextNode();){const s=o.currentNode;s.textContent.indexOf("{{")!==-1&&(s.textContent=s.textContent.replace(/\{\{\s*(\w+)\s*\}\}/g,function(c,f){return n[f]!==void 0?n[f]:""}))}const i=function(s,c){return n[c]!==void 0?n[c]:""},a=Array.from(e.querySelectorAll("*"));e.nodeType===1&&a.push(e);for(let s=0;s<a.length;s++){const c=a[s],f=c.attributes;for(let h=0;h<f.length;h++){const p=f[h];p.value.indexOf("{{")!==-1&&c.setAttribute(p.name,p.value.replace(/\{\{\s*(\w+)\s*\}\}/g,i))}}return e}function je(e,n,o,i,a,s){const c={};for(let h=0;h<e.children.length;h++){const p=e.children[h],b=p.getAttribute("data-ln-render-key");b&&(c[b]=p)}const f=document.createDocumentFragment();for(let h=0;h<n.length;h++){const p=n[h],b=String(i(p));let _=c[b];if(_)a(_,p,h);else{const x=Be(o,s);if(!x||(he(x,p),_=x.firstElementChild,!_))continue;_.setAttribute("data-ln-render-key",b),a(_,p,h)}f.appendChild(_)}e.textContent="",e.appendChild(f)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.fillTemplate=he,window.lnCore.fill=fe,window.lnCore.lnFill=Pe,window.lnCore.renderList=je);function we(e,n,o){const i=e.getAttribute(n);return i===null?o:i}function oe(e,n,o){const i=parseInt(e.getAttribute(n),10);return isNaN(i)?o:i}function ye(e,n,o=!1){const i=e.getAttribute(n);if(i===null)return!!o;const a=i.trim().toLowerCase();return!(a==="false"||a==="0")}function pe(e,n){return(e.getAttribute(n)||"").split(",").map(o=>o.trim()).filter(Boolean)}const ie=new Map;function Fe(e,n){const o=(e?e.join("|"):"")+"::"+n;if(ie.has(o))return ie.get(o);const i=new Set(e||[]),a=function(s,c){const f=s.getAttribute(c);return f!==null&&i.has(f)?f:n};return ie.set(o,a),a}function $e(e,n,o){const i=parseFloat(e.getAttribute(n));return isNaN(i)?o:i}function Ke(e,n,o){const i=e.getAttribute(n);if(!i)return o;try{return JSON.parse(i)}catch{return o}}function ge(e,n,o,i,a){if(!e||n===null)return!0;const s=i||"ln-component",c=e.type;if(c==="trigger"||c==="marker"||c==="string"||c==="list"||!c||n===""&&e.fallback!==void 0)return!0;const f=h=>{a?console.warn(h,a):console.warn(h)};if(c==="boolean"){const h=n.trim().toLowerCase();return h!==""&&h!=="true"&&h!=="false"&&h!=="1"&&h!=="0"?(f(`[${s}] Invalid value "${n}" for boolean attribute "${o}". Allowed: "true", "false", or presence-only.`),!1):!0}if(c==="enum"){const h=e.values||[];return h.includes(n)?!0:(f(`[${s}] Invalid value "${n}" for attribute "${o}". Allowed: ${h.join(", ")}. Fallback: "${e.fallback}".`),!1)}if(c==="integer"){if(!/^-?\d+$/.test(n))return f(`[${s}] Invalid integer "${n}" for attribute "${o}". Fallback: ${e.fallback}.`),!1;const h=parseInt(n,10);return e.min!==void 0&&h<e.min?(f(`[${s}] Value ${h} for attribute "${o}" is less than min (${e.min}).`),!1):e.max!==void 0&&h>e.max?(f(`[${s}] Value ${h} for attribute "${o}" is greater than max (${e.max}).`),!1):!0}if(c==="float")return isNaN(Number(n))?(f(`[${s}] Invalid float "${n}" for attribute "${o}". Fallback: ${e.fallback}.`),!1):!0;if(c==="json")try{return JSON.parse(n),!0}catch(h){return f(`[${s}] Invalid JSON for attribute "${o}": ${h.message}. Fallback: ${e.fallback}.`),!1}return!0}function Ue(e,n,o){for(const i in o){const[a,s,c]=o[i];Object.defineProperty(e,i,{get:function(){return a(n,s,c)},enumerable:!0,configurable:!0})}return e}function Ve(e){const n={};for(const o in e){const i=e[o];if(!i||!i.prop)continue;let a=i.read;if(!a&&i.type)switch(i.type){case"enum":a=Fe(i.values,i.fallback);break;case"integer":a=oe;break;case"float":a=$e;break;case"boolean":a=ye;break;case"list":a=pe;break;case"json":a=Ke;break;case"string":default:a=we;break}a||(a=we),n[i.prop]=[a,o,i.fallback]}return n}function Ge(e){const n={};for(const o in e){const i=e[o];i&&i.effect&&(n[o]=i.effect)}return Object.keys(n).length?n:null}function He(e){if(e.onAttrChange&&!e.declared)return null;const n=new Set;if(e.effects)for(const o in e.effects)n.add(o);if(e.onAttrChange&&e.declared)for(const o of e.declared)n.add(o);return n}function ae(e,n,o,i){if(e.nodeType!==1)return;const s=n.indexOf("[")!==-1||n.indexOf(".")!==-1||n.indexOf("#")!==-1?n:"["+n+"]",c=Array.from(e.querySelectorAll(s));e.matches&&e.matches(s)&&c.push(e);for(const f of c)if(!f[o]){window.lnCore._persistSink&&f.hasAttribute("data-ln-persist")&&window.lnCore._persistSink(f,n);try{f[o]=new i(f)}catch(h){console.error("["+o+"] init failed",f,h)}}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._bootHolds=window.lnCore._bootHolds||0,window.lnCore._bootQueue=window.lnCore._bootQueue||[]);function We(){return typeof window<"u"&&window.lnCore&&window.lnCore._bootHolds||0}function Qe(e){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(e):setTimeout(e,0)):e()}function me(){window.lnCore=window.lnCore||{};const e=window.lnCore._attrRegistry=window.lnCore._attrRegistry||{byAttr:new Map,reactive:[],persist:[]};return e.byReactive=e.byReactive||new Map,e.reactiveWildcard=e.reactiveWildcard||[],e}function Je(e){const n=me(),o=e.observed||[];for(let i=0;i<o.length;i++){const a=o[i];n.byAttr.has(a)||n.byAttr.set(a,[]),n.byAttr.get(a).push(e)}if(n.byDeclaredAttr=n.byDeclaredAttr||new Map,e.attributes)for(const i in e.attributes){n.byDeclaredAttr.has(i)||n.byDeclaredAttr.set(i,[]);const a=n.byDeclaredAttr.get(i);a.some(s=>s.componentTag===e.componentTag)||a.push({spec:e.attributes[i],componentTag:e.componentTag})}if(e.onAttrChange||e.effects){n.reactive.push(e);const i=He(e);if(i===null)n.reactiveWildcard.push(e);else for(const a of i)n.byReactive.has(a)||n.byReactive.set(a,[]),n.byReactive.get(a).push(e)}e.persist&&n.persist.push(e)}function be(e,n,o,i){for(let a=0;a<e.length;a++){const s=e[a];if(!n[s.attribute])continue;const c=s.effects&&s.effects[o];c?c(n,o,i):s.onAttrChange&&(!s.declared||s.declared.has(o))&&s.onAttrChange(n,o,i)}}function Ze(e){const n=e.target,o=e.attributeName;if(e.oldValue===n.getAttribute(o))return;const i=me(),a=i.byAttr.get(o);if(ce()&&i.byDeclaredAttr&&i.byDeclaredAttr.has(o)&&ne(n)){const s=i.byDeclaredAttr.get(o),c=n.getAttribute(o);for(let f=0;f<s.length;f++)ge(s[f].spec,c,o,s[f].componentTag,n)}if(window.lnCore._debugSink&&(o.indexOf("data-ln-")===0||a)&&window.lnCore._debugSink("attr",o,n,{oldValue:e.oldValue,newValue:n.getAttribute(o)}),o.indexOf("data-ln-")===0){const s=i.byReactive.get(o);s&&be(s,n,o,e.oldValue),i.reactiveWildcard.length&&be(i.reactiveWildcard,n,o,e.oldValue)}if(a)for(let s=0;s<a.length;s++){const c=a[s];if(c.handler){c.handler(n,o,e.oldValue);continue}c.onAttributeChange&&n[c.attribute]?c.onAttributeChange(n,o):(ae(n,c.selector,c.attribute,c.ComponentFn),c.onInit&&c.onInit(n))}}function Xe(){window.lnCore=window.lnCore||{},!window.lnCore._attrObserverBound&&(window.lnCore._attrObserverBound=!0,Q(function(){new MutationObserver(function(n){for(let o=0;o<n.length;o++)try{Ze(n[o])}catch(i){console.error("[ln-core] mutation handler failed",n[o].target,i)}}).observe(document.body,{attributes:!0,subtree:!0,attributeOldValue:!0})},"ln-core"))}function _e(){return window.lnCore=window.lnCore||{},window.lnCore._lifecycleRegistry=window.lnCore._lifecycleRegistry||[]}function Ye(e){const n=_e();if(n.length){if(e.target)for(let o=0;o<n.length;o++){const i=n[o];if(i.onSubtreeChange){const a=i.query,s=e.target.nodeType===1?e.target.matches(a)?e.target:e.target.closest(a):e.target.parentElement?e.target.parentElement.closest(a):null;s&&i.onSubtreeChange(s,e)}}for(let o=0;o<e.addedNodes.length;o++){const i=e.addedNodes[o];if(i.nodeType===1)for(let a=0;a<n.length;a++){const s=n[a];ae(i,s.selector,s.attribute,s.ComponentFn),s.onInit&&s.onInit(i)}}for(let o=0;o<e.removedNodes.length;o++){const i=e.removedNodes[o];if(i.nodeType===1)for(let a=0;a<n.length;a++){const s=n[a],c=s.query,f=Array.from(i.querySelectorAll(c));i.matches&&i.matches(c)&&f.push(i);for(let h=0;h<f.length;h++){const p=f[h];if(!document.contains(p)){const b=p[s.attribute];if(b&&typeof b.destroy=="function")try{b.destroy()}catch(_){console.error("["+s.attribute+"] destroy failed",p,_)}delete p[s.attribute]}}}}}}function et(){window.lnCore=window.lnCore||{},!window.lnCore._lifecycleObserverBound&&(window.lnCore._lifecycleObserverBound=!0,Q(function(){new MutationObserver(function(n){for(let o=0;o<n.length;o++){const i=n[o];if(i.type==="childList")try{Ye(i)}catch(a){console.error("[ln-core] lifecycle handler failed",i.target,a)}}}).observe(document.body,{childList:!0,subtree:!0})},"ln-core"))}function tt(e,n,o,i,a={}){const s=a.extraAttributes||[],c=a.onAttributeChange||null,f=a.onSubtreeChange||null,h=a.onInit||null,p=a.onAttrChange||null,b=a.effects||null,_=a.attributes||null,x=_?Ge(_):b,P=_?new Set(Object.keys(_)):null,j=a.persist||null;function g(k){const I=k||document.body;if(ae(I,e,n,o),_&&ce())for(const F in _){const J=_[F],G=Array.from(I.querySelectorAll("["+F+"]"));I.matches&&I.matches("["+F+"]")&&G.push(I);for(let K=0;K<G.length;K++){const B=G[K];ne(B)&&ge(J,B.getAttribute(F),F,i,B)}}h&&h(I)}const S=[];if(e.indexOf("[")!==-1){const k=/\[([\w-]+)/g;let I;for(;(I=k.exec(e))!==null;)S.push(I[1])}else S.push(e);Je({selector:e,attribute:n,componentTag:i,attributes:_,ComponentFn:o,onInit:h,observed:S.concat(s),onAttributeChange:c,onAttrChange:p,effects:x,declared:P,persist:j}),Xe();const q=e.indexOf("[")!==-1||e.indexOf(".")!==-1||e.indexOf("#")!==-1?e:"["+e+"]";_e().push({selector:e,attribute:n,ComponentFn:o,onInit:h,onSubtreeChange:f,query:q}),et(),window[n]=g;function v(){We()>0?Qe(function(){g(document.body)}):g(document.body)}return document.readyState==="loading"?document.addEventListener("DOMContentLoaded",v):v(),g}function nt(e){let n=!1;for(let o=0;o<e.length;o++){const i=e[o];if(!(i===""||i==null)&&(n=!0,!Number.isFinite(Number(i))))return"string"}return n?"number":"string"}function rt(e,n,o,i){if(o==="number"){const c=parseFloat(e),f=parseFloat(n);return(isNaN(c)?0:c)-(isNaN(f)?0:f)}const a=e!=null?String(e):"",s=n!=null?String(n):"";return i?i.compare(a,s):a<s?-1:a>s?1:0}function Ce(e){return(e||"").replace(/^#/,"")}function se(e){const n=e===void 0?location.hash:e,o={},i=Ce(n);if(!i)return o;const a=i.split("&");for(let s=0;s<a.length;s++){const c=a[s];if(!c)continue;const f=c.indexOf(":"),h=f>-1?c.slice(0,f):c,p=f>-1?c.slice(f+1):"";if(h)try{o[h]=decodeURIComponent(p)}catch{o[h]=p}}return o}function ot(e){if(!e)return null;const n=se();return e in n?n[e]:null}function it(e,n){if(!e)return;const o=se();n==null?delete o[e]:o[e]=String(n);const a=Object.keys(o).map(function(s){const c=o[s];return c===""?s:s+":"+encodeURIComponent(c)}).join("&");Ce(location.hash)!==a&&(location.hash=a)}function at(e){return e.button===1||e.ctrlKey||e.metaKey||e.shiftKey?!1:(e.preventDefault(),!0)}function st(e,n){if(!e||!e.hasAttribute("data-ln-hash"))return null;const o=e.getAttribute("data-ln-hash");if(o&&o.trim()!=="")return o.trim();const i=e.getAttribute("data-ln-sort")||e.getAttribute("data-ln-search-for")||e.getAttribute("data-ln-search")||e.getAttribute("data-ln-filter")||e.id;return i?n?i+"-"+n:i:n||null}function lt(e,n){return!n||n==="none"||e===null||e===void 0?null:String(e)+"."+n}function ct(e){return!e||typeof e!="string"?null:e.endsWith(".asc")?{fieldOrColumn:e.slice(0,-4),direction:"asc"}:e.endsWith(".desc")?{fieldOrColumn:e.slice(0,-5),direction:"desc"}:null}function ut(e,n){return!e||!Array.isArray(n)||n.length===0?null:e+":"+n.map(encodeURIComponent).join(",")}function dt(e){if(!e||typeof e!="string")return null;const n=e.indexOf(":");if(n===-1)return null;const o=e.slice(0,n),i=e.slice(n+1),a=i?i.split(",").map(function(s){try{return decodeURIComponent(s)}catch{return s}}).filter(Boolean):[];return{key:o,values:a}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.hashParse=se,window.lnCore.hashGet=ot,window.lnCore.hashSet=it,window.lnCore.hashLinkClick=at,window.lnCore.resolveHashNamespace=st,window.lnCore.hashSortEncode=lt,window.lnCore.hashSortDecode=ct,window.lnCore.hashFilterEncode=ut,window.lnCore.hashFilterDecode=dt);let V=null;const ft="ln-ashlar:storage-salt:v1",Se=32768;function Ae(e){let n="";const o=e.byteLength;for(let i=0;i<o;i+=Se)n+=String.fromCharCode.apply(null,e.subarray(i,Math.min(i+Se,o)));return btoa(n)}function ve(e){const n=atob(e),o=n.length,i=new Uint8Array(o);for(let a=0;a<o;a++)i[a]=n.charCodeAt(a);return i}function xe(e,n){let o=V,i={};return typeof CryptoKey<"u"&&e instanceof CryptoKey?o=e:e&&typeof e=="object"&&(i=e,typeof CryptoKey<"u"&&i.key instanceof CryptoKey&&(o=i.key)),{key:o,options:i}}async function ht(e,n={}){if(!e)throw new Error("[ln-crypto] Key derivation failed: Secret string is required");const o=n.method||"pbkdf2",i=new TextEncoder;if(o==="sha256"){const h=await crypto.subtle.digest("SHA-256",i.encode(e));return crypto.subtle.importKey("raw",h,{name:"AES-GCM"},!1,["encrypt","decrypt"])}const a=n.salt||ft,s=typeof a=="string"?i.encode(a):a,c=n.iterations||1e5,f=await crypto.subtle.importKey("raw",i.encode(e),"PBKDF2",!1,["deriveKey"]);return crypto.subtle.deriveKey({name:"PBKDF2",salt:s,iterations:c,hash:"SHA-256"},f,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}async function ke(e,n={}){if(!e){V=null;return}try{const o=n.method||"sha256";V=await ht(e,{...n,method:o})}catch(o){throw console.error("[ln-core/crypto] Key derivation failed:",o),V=null,o}}function M(){return V}async function wt(e,n,o){const{key:i}=xe(n);if(e==null)return e;if(!i)throw new Error("[ln-crypto] Encryption failed: No active cryptographic key provided");try{const a=new TextEncoder,s=crypto.getRandomValues(new Uint8Array(12)),c=typeof e=="string"?e:JSON.stringify(e),f=await crypto.subtle.encrypt({name:"AES-GCM",iv:s},i,a.encode(c));return{v:1,alg:"AES-GCM",encrypted:!0,iv:Ae(s),data:Ae(new Uint8Array(f))}}catch(a){throw console.error("[ln-core/crypto] Encryption failed:",a),new Error("[ln-crypto] Encryption failed: "+(a&&a.message?a.message:String(a)))}}async function yt(e,n,o){const{key:i,options:a}=xe(n),s=a.silent===!0;if(!e||!e.encrypted)return e;if(!i){if(s)return{...e,decryptionError:!0};throw new Error("[ln-crypto] Decryption failed: No active cryptographic key provided")}if(!e.iv||!e.data){if(s)return{...e,decryptionError:!0};throw new Error("[ln-crypto] Decryption failed: Malformed envelope (missing iv or data)")}try{const c=new TextDecoder,f=ve(e.iv),h=ve(e.data),p=await crypto.subtle.decrypt({name:"AES-GCM",iv:f},i,h),b=c.decode(p);try{return JSON.parse(b)}catch{return b}}catch(c){if(s)return{...e,decryptionError:!0};throw console.error("[ln-core/crypto] Decryption failed. Key may be incorrect or payload tampered:",c),new Error("[ln-crypto] Decryption failed. Key may be incorrect or payload tampered: "+(c&&c.message?c.message:String(c)))}}function pt(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const n=Math.random()*16|0;return(e==="x"?n:n&3|8).toString(16)})}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.uuid=pt);function gt(e){return String(e||"").trim().toLowerCase()}function mt(e){const n=gt(e);return n?n.split(/\s+/).filter(Boolean):[]}function bt(e,n){if(!n||n.length===0)return!0;if(!e)return!1;const o=String(e).toLowerCase();for(let i=0;i<n.length;i++)if(o.indexOf(n[i])===-1)return!1;return!0}function _t(e,n){if(!n||n.length===0)return!0;if(e==null)return!1;const o=String(e).trim().toLowerCase();for(let i=0;i<n.length;i++)if(String(n[i]).trim().toLowerCase()===o)return!0;return!1}function Ct(e={}){let n=e.windowSize>0?e.windowSize:1e3,o=e.pageSize>0?e.pageSize:200,i=e.fetchDebounce!=null?e.fetchDebounce:120;const a=typeof e.requestPage=="function"?e.requestPage:()=>{},s=new Map,c=new Set;let f=0,h=0,p=0,b=!1,_=null;function x(g,S){s.delete(g),s.set(g,S)}function P(){if(s.size<=n)return[];const g=[];for(;s.size>n;){const D=s.keys().next().value;g.push(s.get(D)),s.delete(D)}const S=new Set(s.values());return g.filter(D=>!S.has(D))}function j(g,S){c.add(g),clearTimeout(_),_=setTimeout(()=>a(g,o,S),i)}return{get logicalTotal(){return f},set logicalTotal(g){f=g},get grandTotal(){return h},set grandTotal(g){h=g},get queryGen(){return p},set queryGen(g){p=g},get size(){return s.size},get hasLoaded(){return b},getId:g=>{if(!s.has(g))return;const S=s.get(g);return x(g,S),S},ensure:(g,S,D)=>{if(!b&&!c.has(0))return j(0,D);if(f<=0)return;const q=Math.max(0,g),v=Math.min(f,S);for(let k=q;k<v;k++)if(!s.has(k)){const I=Math.floor(k/o)*o;if(!c.has(I))return j(I,D)}},ingest:(g,S,D,q,v)=>{if(v!=null&&v!==p)return[];b=!0,D!=null&&(h=D),q!=null&&(f=q);for(let k=0;k<S.length;k++)x(g+k,S[k]);return c.delete(g),P()},reset:function(){p++,this.clear()},clear:()=>{b=!1,s.clear(),c.clear(),clearTimeout(_)},configure:(g={})=>{let S=[];return g.windowSize>0&&g.windowSize!==n&&(n=g.windowSize,S=P()),g.pageSize>0&&(o=g.pageSize),g.fetchDebounce>=0&&(i=g.fetchDebounce),S}}}function St(e,n,o){if(!Array.isArray(e)||!n||!n.field)return e;const{field:i,direction:a}=n,s=a==="desc",c=e.map(h=>h?h[i]:void 0),f=nt(c);return[...e].sort((h,p)=>{const b=h?h[i]:void 0,_=p?p[i]:void 0,x=rt(b,_,f,o);return s?-x:x})}function Ie(e,n){if(!Array.isArray(e)||!n||typeof n!="object")return e;const o=Object.keys(n).filter(i=>Array.isArray(n[i])&&n[i].length>0);return o.length?e.filter(i=>i?o.every(a=>_t(i[a],n[a])):!1):e}function At(e,n,o){if(!Array.isArray(e)||!n||!o||!o.length)return e;const i=mt(n);return i.length?e.filter(a=>a?i.every(s=>o.some(c=>{const f=a[c];return f!=null&&bt(String(f),[s])})):!1):e}function vt(e,n,o){if(!Array.isArray(e)||!e.length)return 0;if(o==="count")return e.length;const i=e.map(s=>s&&s[n]!=null?parseFloat(s[n]):NaN).filter(s=>Number.isFinite(s)),a=i.reduce((s,c)=>s+c,0);return o==="sum"?a:o==="avg"&&i.length?a/i.length:0}function xt(e,n={},o=[],i){if(!Array.isArray(e))return{records:[],total:0,filtered:0};const a=e.length;let s=e;n.filters&&(s=Ie(s,n.filters)),n.search&&(s=At(s,n.search,o));const c=s.length;if(n.sort&&(s=St(s,n.sort,i)),n.offset||n.limit){const f=n.offset||0,h=n.limit||s.length;s=s.slice(f,f+h)}return{records:s,total:a,filtered:c}}function kt(e,n){return!Array.isArray(e)||!n||typeof n!="object"?e:e.map(o=>{if(!o)return null;const i={...o};for(const[a,s]of Object.entries(n))if(typeof s=="function")try{i[a]=s(o)}catch{i[a]=void 0}return i})}function It(e,n,o,i="_meta"){if(!Array.isArray(e)||!e.includes(i))return!0;for(const a of Object.keys(n||{})){if(!e.includes(a))return!0;const s=n[a]&&n[a].indexes||[],c=o&&o[a]||[];if(s.some(f=>!c.includes(f)))return!0}return!1}function Et(e){return{ok:!1,error:e&&e.message?e.message:String(e)}}(function(){const e="data-ln-data-store",n="lnDataStore";if(window[n]!==void 0)return;function o(t,r,l){const u=t.getAttribute(r);if(u==="never"||u==="-1")return-1;const d=parseInt(u,10);return isNaN(d)?l:d}const i={"data-ln-data-store":{type:"marker",effect:Ne,description:"Identifies the element as a data-store definition container"},"data-ln-data-store-indexes":{type:"list",effect:Ne,description:"Comma-separated index field names for the IndexedDB store"},"data-ln-data-store-stale":{prop:"_staleThreshold",type:"integer",read:o,fallback:300,description:"Cache staleness threshold in seconds, or -1/never"},"data-ln-data-store-search-fields":{prop:"_searchFields",type:"list",read:pe,description:"Record fields to index for client-side search"},"data-ln-data-store-no-local-query":{prop:"noLocalQuery",type:"boolean",read:ye,description:"Bypasses local IndexedDB query resolution, forcing remote fetching"},"data-ln-data-store-window":{prop:"_windowSize",type:"integer",read:oe,fallback:1e3,min:10,effect:Wt,description:"Virtual scrolling cache window size in records"},"data-ln-data-store-window-page":{prop:"_windowPageSize",type:"integer",read:oe,fallback:200,min:5,effect:Qt,description:"Virtual scrolling slice page size"},"data-ln-data-store-frozen":{type:"marker",description:"Applied at runtime to indicate store schema is locked in IndexedDB"}},a=Ve(i),s="ln_app_cache",c="_meta",f="1.0";let h=null,p=null;const b={};function _(t){t&&t.name==="QuotaExceededError"&&A(document,"ln-data-store:quota-exceeded",{error:t})}function x(){const t={};for(const r of document.querySelectorAll(`[${e}]`)){const l=r.id;if(l){const u=r.getAttribute("data-ln-data-store-indexes")||"";t[l]={indexes:u.split(",").map(d=>d.trim()).filter(Boolean)}}}return t}function P(){return p||(p=new Promise(t=>{if(typeof indexedDB>"u")return console.warn("[ln-data-store] IndexedDB is not available in this environment"),t(null);const r=x(),l=Object.keys(r),u=indexedDB.open(s);u.onerror=()=>{console.warn("[ln-data-store] IndexedDB open failed"),t(null)},u.onsuccess=d=>{const w=d.target.result,y=Array.from(w.objectStoreNames),m=l.filter(N=>y.includes(N));let C={};if(m.length>0){const N=w.transaction(m,"readonly");for(const L of m)C[L]=Array.from(N.objectStore(L).indexNames)}if(!It(y,r,C,c))return j(w),h=w,t(w);const $=w.version;w.close();const O=indexedDB.open(s,$+1);let z=!1,R=null;O.onblocked=()=>{console.warn("[ln-data-store] Database upgrade blocked — waiting for other tabs to close connection"),A(document,"ln-data-store:blocked",{db:s}),R||(R=setTimeout(()=>{z||(console.warn("[ln-data-store] Database upgrade timed out while blocked"),z=!0,p=null,t(null))},5e3))},O.onerror=()=>{z||(R&&clearTimeout(R),z=!0,p=null,console.warn("[ln-data-store] Database upgrade failed"),t(null))},O.onupgradeneeded=N=>{const L=N.target.result,Jt=N.target.transaction;L.objectStoreNames.contains(c)||L.createObjectStore(c,{keyPath:"key"});for(const W of l)if(L.objectStoreNames.contains(W)){const te=Jt.objectStore(W);for(const U of r[W].indexes)te.indexNames.contains(U)||te.createIndex(U,U,{unique:!1})}else{const te=L.createObjectStore(W,{keyPath:"id"});for(const U of r[W].indexes)te.createIndex(U,U,{unique:!1})}},O.onsuccess=N=>{if(z){N.target.result&&N.target.result.close();return}R&&clearTimeout(R),z=!0;const L=N.target.result;j(L),h=L,t(L)}}}),p)}function j(t){t.onversionchange=()=>{t.close(),h=null,p=null}}function g(){return h?Promise.resolve(h):(p=null,P())}async function S(t){if(!M()||!t)return t;const r={...t},l=r.id,u=await wt(r);return!u||!u.encrypted?t:{...u,id:l}}async function D(t){return!t||!t.encrypted||!M()?t:yt(t,{silent:!0})}const q=(t,r)=>g().then(l=>l?l.transaction(t,r).objectStore(t):null);function v(t){return new Promise((r,l)=>{t.onsuccess=()=>r(t.result),t.onerror=()=>{_(t.error),l(t.error)}})}const k=t=>q(t,"readonly").then(r=>r?v(r.getAll()):[]).then(r=>M()?Promise.all(r.map(l=>D(l))):r),I=(t,r)=>q(t,"readonly").then(l=>l?v(l.get(r)).then(u=>u!==void 0?u:typeof r=="string"&&r.trim()!==""&&!isNaN(Number(r))?v(l.get(Number(r))):typeof r=="number"?v(l.get(String(r))):null):null).then(l=>l?D(l):null),F=(t,r)=>g().then(l=>{if(!l)return[];const d=l.transaction(t,"readonly").objectStore(t),w=r.map(y=>v(d.get(y)).then(m=>m!==void 0?m:typeof y=="string"&&y.trim()!==""&&!isNaN(Number(y))?v(d.get(Number(y))):typeof y=="number"?v(d.get(String(y))):null));return Promise.all(w).then(y=>M()?Promise.all(y.map(m=>m?D(m):null)):y)}),J=(t,r)=>(M()?S(r):Promise.resolve(r)).then(u=>q(t,"readwrite").then(d=>d?v(d.put(u)):null)),G=(t,r)=>q(t,"readwrite").then(l=>l?v(l.delete(r)).then(()=>{if(typeof r=="string"&&r.trim()!==""&&!isNaN(Number(r)))return v(l.delete(Number(r)));if(typeof r=="number")return v(l.delete(String(r)))}):null),K=t=>q(t,"readwrite").then(r=>r?v(r.clear()):null),B=t=>q(t,"readonly").then(r=>r?v(r.count()):0),qt=t=>q(c,"readonly").then(r=>r?v(r.get(t)):null),Z=(t,r)=>q(c,"readwrite").then(l=>{if(l)return r.key=t,v(l.put(r))});function T(t){return this.dom=t,this._name=t.id,this._name||console.warn("[ln-data-store] missing id — the store cannot be addressed",t),Ue(this,t,a),this._handlers=null,this.isLoaded=!1,this.canServe=!1,this.isInitialized=!1,this.initializationError=null,this.hasCache=!1,this.isSyncing=!1,this.lastSyncedAt=null,this.query={filters:{},search:"",sort:null},t.hasAttribute("data-ln-data-store-window")?this._windowIndex=Ct({windowSize:this._windowSize,pageSize:this._windowPageSize,requestPage:(r,l,u)=>{A(this.dom,"ln-data-store:request-page",{store:this._name,offset:r,limit:l,query:u,queryGen:this._windowIndex.queryGen})}}):this._windowIndex=null,this.windowed=this._windowIndex!==null,this.totalCount=0,this.presenters=null,this._mutationChain=Promise.resolve(),b[this._name]=this,Dt(this),this.ready=Ot(this),this}function Dt(t){t._handlers={create:r=>X(t,"create",r.detail,()=>Tt(t,r.detail)),update:r=>X(t,"update",r.detail,()=>Nt(t,r.detail)),delete:r=>X(t,"delete",r.detail,()=>Lt(t,r.detail)),"bulk-delete":r=>X(t,"bulk-delete",r.detail,()=>zt(t,r.detail)),"sync-failed":r=>{t.isSyncing=!1,A(t.dom,"ln-data-store:sync-error",{store:t._name,error:r.detail&&r.detail.error,status:r.detail&&r.detail.status})}};for(const[r,l]of Object.entries(t._handlers))t.dom.addEventListener(`ln-data-store:request-${r}`,l);t._queryHandlers={"ln-search:change":r=>{r.preventDefault();const l=r.detail&&r.detail.term!=null?r.detail.term:"";l!==t.query.search&&(t.query.search=l,le(t))},"ln-filter:change":r=>{r.preventDefault();const l=r.detail&&r.detail.key;if(!l)return;const u=(r.detail.values||[]).slice(),d=t.query.filters[l];(d?d.length===u.length&&d.every((y,m)=>y===u[m]):!u.length)||(u.length?t.query.filters[l]=u:delete t.query.filters[l],le(t))},"ln-sort:change":r=>{r.preventDefault();const l=r.detail&&r.detail.field,u=r.detail&&r.detail.direction,d=u&&u!=="none"?{field:l,direction:u}:null,w=t.query.sort;!w&&!d||w&&d&&w.field===d.field&&w.direction===d.direction||(t.query.sort=d,le(t))}};for(const[r,l]of Object.entries(t._queryHandlers))t.dom.addEventListener(r,l)}function X(t,r,l,u){const d=l&&l.requestId;return t._mutationChain=t._mutationChain.then(()=>t.ready).then(()=>{if(t.initializationError)throw t.initializationError;return u()}).catch(w=>Rt(t,r,d,w)),t._mutationChain}function Y(t,r=0){return B(t._name).then(l=>{if(t._windowIndex||t.windowed){const u=t.totalCount!=null?t.totalCount:l;t.totalCount=Math.max(0,u+r)}else t.totalCount=l;return t.hasCache=!0,t.isLoaded=!0,t.canServe=!0,Z(t._name,{schema_version:f,last_synced_at:t.lastSyncedAt,has_cache:!0,record_count:t.totalCount})})}function Tt(t,{tempId:r,data:l={},requestId:u}={}){const d={...l,id:r};return J(t._name,d).then(()=>Y(t,1)).then(()=>{A(t.dom,"ln-data-store:created",{store:t._name,record:d,tempId:r,requestId:u})})}function Nt(t,{id:r,data:l={},requestId:u}={}){return I(t._name,r).then(d=>{if(!d)throw new Error(`Record not found: ${r}`);const w=d.id,y={...d,...l,id:w},m=l.id,C=m!==void 0&&m!==w;return(C?Mt(t._name,w,{...y,id:m}):J(t._name,y)).then(()=>Y(t,0)).then(()=>{A(t.dom,"ln-data-store:updated",{store:t._name,record:C?{...y,id:m}:y,previous:d,requestId:u})})})}function Lt(t,{id:r,requestId:l}={}){return I(t._name,r).then(u=>{if(!u){A(t.dom,"ln-data-store:deleted",{store:t._name,id:r,requestId:l,missing:!0});return}const d=u.id;return G(t._name,d).then(()=>Y(t,-1)).then(()=>{A(t.dom,"ln-data-store:deleted",{store:t._name,id:d,requestId:l})})})}function zt(t,{ids:r=[],requestId:l}={}){return r.length?Promise.all(r.map(u=>I(t._name,u))).then(u=>{const d=u.filter(Boolean).map(w=>w.id);return ee(t._name,d).then(()=>Y(t,-d.length)).then(()=>{A(t.dom,"ln-data-store:deleted",{store:t._name,ids:d,requestId:l})})}):(A(t.dom,"ln-data-store:deleted",{store:t._name,ids:[],requestId:l}),Promise.resolve())}function Rt(t,r,l,u){console.error("[ln-data-store] "+r+" failed:",u),A(t.dom,"ln-data-store:mutation-error",{store:t._name,action:r,requestId:l,error:u})}function Ot(t){return P().then(r=>{if(!r)throw new Error("IndexedDB is unavailable");return qt(t._name)}).then(r=>{if(t.initializationError=null,r&&r.schema_version===f)t.lastSyncedAt=r.last_synced_at||null,t.totalCount=r.record_count||0,t.hasCache=r.has_cache===!0||t.totalCount>0,t.hasCache&&(t.isLoaded=!0,t.canServe=!0,A(t.dom,"ln-data-store:ready",{store:t._name,count:t.totalCount,source:"cache"})),t.isInitialized=!0,A(t.dom,"ln-data-store:initialized",{store:t._name,hasCache:t.hasCache,lastSyncedAt:t.lastSyncedAt,count:t.totalCount});else{if(r&&r.schema_version!==f)return K(t._name).then(()=>Z(t._name,{schema_version:f,last_synced_at:null,has_cache:!1,record_count:0})).then(()=>{t.isInitialized=!0,t.hasCache=!1,A(t.dom,"ln-data-store:initialized",{store:t._name,hasCache:!1,lastSyncedAt:null,count:0})});t.isInitialized=!0,t.hasCache=!1,A(t.dom,"ln-data-store:initialized",{store:t._name,hasCache:!1,lastSyncedAt:null,count:0})}}).catch(r=>(t.isInitialized=!0,t.isLoaded=!1,t.canServe=!1,t.hasCache=!1,t.isSyncing=!1,t.initializationError=r,A(t.dom,"ln-data-store:initialization-error",{store:t._name,error:r}),{ok:!1,error:r}))}function Ee(t){t.isSyncing=!0,A(t.dom,"ln-data-store:request-remote-sync",{since:t.lastSyncedAt})}function qe(t,r){return g().then(l=>l?(M()?Promise.all(r.map(d=>S(d))):Promise.resolve(r)).then(d=>new Promise((w,y)=>{const m=l.transaction(t,"readwrite"),C=m.objectStore(t);d.forEach(E=>C.put(E)),m.oncomplete=()=>w(),m.onerror=()=>{_(m.error),y(m.error)}})):void 0)}function ee(t,r){return g().then(l=>{if(l)return new Promise((u,d)=>{const w=l.transaction(t,"readwrite"),y=w.objectStore(t);r.forEach(m=>{y.delete(m),typeof m=="string"&&m.trim()!==""&&!isNaN(Number(m))?y.delete(Number(m)):typeof m=="number"&&y.delete(String(m))}),w.oncomplete=()=>u(),w.onerror=()=>d(w.error)})})}function Mt(t,r,l){return(M()?S(l):Promise.resolve(l)).then(d=>g().then(w=>{if(w)return new Promise((y,m)=>{const C=w.transaction(t,"readwrite"),E=C.objectStore(t);E.put(d),E.delete(r),C.oncomplete=()=>y(),C.onerror=()=>{_(C.error),m(C.error)}})}))}const Bt=new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"});function Pt(t){return t?Object.keys(t).filter(r=>Array.isArray(t[r])&&t[r].length>0):[]}function jt(t,r,l){return r.every(u=>l[u].map(String).includes(String(t[u])))}function Ft(t){return String(t||"").toLowerCase().split(/\s+/).filter(Boolean)}function $t(t,r,l){return r.every(u=>l.some(d=>{const w=t[d];return w!=null&&String(w).toLowerCase().includes(u)}))}function Kt(t,r,l){return vt(t,r,l)}function H(t,r){return kt(r,t.presenters&&t.presenters.computed)}function Ut(t){return!t.sort&&!M()}function Vt(t,r,l){const u=Pt(r.filters),d=r.search?Ft(r.search):[],w=t._searchFields,y=d.length>0&&w&&w.length>0;return q(t._name,"readonly").then(m=>m?new Promise((C,E)=>{const $=[],O=m.openCursor();O.onsuccess=()=>{const z=O.result;if(!z||$.length>=l){C($);return}const R=z.value;(!u.length||jt(R,u,r.filters))&&(!y||$t(R,d,w))&&$.push(R),z.continue()},O.onerror=()=>E(O.error)}):[])}function De(t,r,l){return xt(r,l,t._searchFields,Bt)}function Te(t,r,l){const u=[];for(let w=r;w<r+l;w++){const y=t._windowIndex.getId(w);u.push(y)}const d=Array.from(new Set(u.filter(w=>w!==void 0)));return F(t._name,d).then(w=>{const y=new Map;for(let C=0;C<w.length;C++){const E=w[C];E&&y.set(String(E.id),E)}const m=[];for(let C=0;C<u.length;C++){const E=u[C];if(E===void 0)m.push(null);else{const $=y.get(String(E));m.push($||null)}}return{data:H(t,m),total:t._windowIndex.grandTotal,filtered:t._windowIndex.logicalTotal,offset:r,queryGen:t._windowIndex.queryGen}})}T.prototype.getAll=function(t={}){const r=this;if(r._windowIndex){const l=t.offset||0,u=t.limit||200;if(r._windowIndex.ensure(l,l+u,t),!r._windowIndex.hasLoaded&&!r.noLocalQuery){const d=l+u,w=y=>y.length?{data:H(r,y),offset:l,queryGen:r._windowIndex.queryGen,provisional:!0}:Te(r,l,u);return Ut(t)?Vt(r,t,d).then(y=>w(y.slice(l,d))):k(r._name).then(y=>w(De(r,y,t).records))}return Te(r,l,u)}return k(r._name).then(l=>{const u=De(r,l,t);return{data:H(r,u.records),total:u.total,filtered:u.filtered}})},T.prototype.getById=function(t){return I(this._name,t).then(r=>r?H(this,[r])[0]:null)},T.prototype.count=function(t){return t&&Object.keys(t).length>0?k(this._name).then(l=>Ie(l,t).length):this.windowed&&this.totalCount!=null?Promise.resolve(this.totalCount):B(this._name)},T.prototype.aggregate=function(t,r){return k(this._name).then(l=>Kt(l,t,r))},T.prototype.setPresenters=function(t){this.presenters=t},T.prototype.applySync=function(t,r,l,u){u=u||{};const d=this;if(d._windowIndex&&u.queryGen!=null&&u.queryGen!==d._windowIndex.queryGen)return Promise.resolve({ok:!0,stale:!0});let w=g().then(y=>{if(!y)throw new Error("IndexedDB unavailable")});return t.length>0&&(w=w.then(()=>qe(d._name,t))),r.length>0&&(w=w.then(()=>ee(d._name,r))),w.then(()=>{if(d._windowIndex&&(u.offset!=null||u.total!=null)){const y=u.offset!=null?u.offset:0,m=t.map(E=>E.id),C=d._windowIndex.ingest(y,m,u.total,u.filtered,u.queryGen);if(C&&C.length)return ee(d._name,C)}}).then(()=>B(d._name)).then(y=>(d.totalCount=u.total!==void 0?u.total:y,d.hasCache=!0,Z(d._name,{schema_version:f,last_synced_at:l,has_cache:!0,record_count:d.totalCount}))).then(()=>{const y=!d.isLoaded;return d.isLoaded=!0,d.canServe=!0,d.isSyncing=!1,d.lastSyncedAt=l,y?(A(d.dom,"ln-data-store:loaded",{store:d._name,count:d.totalCount,meta:u}),A(d.dom,"ln-data-store:ready",{store:d._name,count:d.totalCount,source:"server",meta:u})):A(d.dom,"ln-data-store:synced",{store:d._name,added:t.length,deleted:r.length,changed:!0,meta:u}),{ok:!0}}).catch(y=>{d.isSyncing=!1;const m=y&&y.message?y.message:String(y);return console.error("[ln-data-store] applySync failed:",y),A(d.dom,"ln-data-store:sync-error",{store:d._name,error:m}),Et(y)})},T.prototype.applyQuery=function(t,r){r=r||{};const l=this;let u=Promise.resolve();return t.length>0&&(u=u.then(()=>qe(l._name,t))),u.then(()=>B(l._name)).then(d=>(l.totalCount=r.total!==void 0?r.total:d,t.length>0&&(l.canServe=!0),H(l,t))).catch(d=>(console.error("[ln-data-store] applyQuery failed:",d),[]))},T.prototype.forceSync=function(){this.isSyncing||Ee(this)},T.prototype.fullReload=function(){const t=this;return K(t._name).then(()=>Z(t._name,{schema_version:f,last_synced_at:null,has_cache:!1,record_count:0})).then(()=>{t.isLoaded=!1,t.hasCache=!1,t.lastSyncedAt=null,t.totalCount=0,Ee(t)})},T.prototype.destroy=function(){if(this._windowIndex&&(this._windowIndex.clear(),this._windowIndex=null,this.windowed=!1),this._handlers){for(const[t,r]of Object.entries(this._handlers))this.dom.removeEventListener(`ln-data-store:request-${t}`,r);this._handlers=null}if(this._queryHandlers){for(const[t,r]of Object.entries(this._queryHandlers))this.dom.removeEventListener(t,r);this._queryHandlers=null}delete b[this._name],delete this.dom[n]};function Gt(){return g().then(t=>{if(!t)return;const r=Array.from(t.objectStoreNames);return new Promise((l,u)=>{const d=t.transaction(r,"readwrite");r.forEach(w=>d.objectStore(w).clear()),d.oncomplete=()=>l(),d.onerror=()=>u(d.error)})}).then(()=>{Object.values(b).forEach(t=>{t.isLoaded=!1,t.canServe=!1,t.isInitialized=!1,t.initializationError=null,t.hasCache=!1,t.isSyncing=!1,t.lastSyncedAt=null,t.totalCount=0})})}function le(t){t._windowIndex&&t._windowIndex.reset(),A(t.dom,"ln-data-store:query-changed",{store:t._name,query:{filters:Object.assign({},t.query.filters),search:t.query.search,sort:t.query.sort?Object.assign({},t.query.sort):null}})}const Ht="data-ln-data-store-frozen";function Ne(t,r){t.setAttribute(Ht,r)}function Wt(t){const r=t[n];if(!r._windowIndex)return;const l=r._windowIndex.configure({windowSize:r._windowSize});l.length&&ee(r._name,l).catch(u=>{console.error("[ln-data-store] window shrink eviction failed:",u)})}function Qt(t){const r=t[n];r._windowIndex&&r._windowIndex.configure({pageSize:r._windowPageSize})}tt(e,n,T,"ln-data-store",{attributes:i}),window[n].clearAll=Gt,window[n].init=window[n],window[n].setStorageKey=ke,typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.setStorageKey=ke)})()})();
|
|
@@ -1,84 +1,84 @@
|
|
|
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-data-store",
|
|
4
|
-
"generator": "scripts/sync-ln-schemas.mjs",
|
|
5
|
-
"attributes": {
|
|
6
|
-
"data-ln-data-store": {
|
|
7
|
-
"direction": "author",
|
|
8
|
-
"sources": [
|
|
9
|
-
"ln-data-store-dev.scss",
|
|
10
|
-
"src/ln-data-store.js"
|
|
11
|
-
],
|
|
12
|
-
"type": "marker",
|
|
13
|
-
"description": "Identifies the element as a data-store definition container"
|
|
14
|
-
},
|
|
15
|
-
"data-ln-data-store-frozen": {
|
|
16
|
-
"direction": "runtime",
|
|
17
|
-
"sources": [
|
|
18
|
-
"ln-data-store-dev.scss",
|
|
19
|
-
"src/ln-data-store.js"
|
|
20
|
-
],
|
|
21
|
-
"type": "marker",
|
|
22
|
-
"description": "Applied at runtime to indicate store schema is locked in IndexedDB"
|
|
23
|
-
},
|
|
24
|
-
"data-ln-data-store-indexes": {
|
|
25
|
-
"direction": "author",
|
|
26
|
-
"sources": [
|
|
27
|
-
"src/ln-data-store.js"
|
|
28
|
-
],
|
|
29
|
-
"type": "list",
|
|
30
|
-
"description": "Comma-separated index field names for the IndexedDB store"
|
|
31
|
-
},
|
|
32
|
-
"data-ln-data-store-no-local-query": {
|
|
33
|
-
"direction": null,
|
|
34
|
-
"sources": [
|
|
35
|
-
"src/ln-data-store.js"
|
|
36
|
-
],
|
|
37
|
-
"type": "boolean",
|
|
38
|
-
"description": "Bypasses local IndexedDB query resolution, forcing remote fetching"
|
|
39
|
-
},
|
|
40
|
-
"data-ln-data-store-search-fields": {
|
|
41
|
-
"direction": null,
|
|
42
|
-
"sources": [
|
|
43
|
-
"src/ln-data-store.js"
|
|
44
|
-
],
|
|
45
|
-
"type": "list",
|
|
46
|
-
"description": "Record fields to index for client-side search"
|
|
47
|
-
},
|
|
48
|
-
"data-ln-data-store-stale": {
|
|
49
|
-
"direction": null,
|
|
50
|
-
"sources": [
|
|
51
|
-
"src/ln-data-store.js"
|
|
52
|
-
],
|
|
53
|
-
"type": "integer",
|
|
54
|
-
"fallback": 300,
|
|
55
|
-
"description": "Cache staleness threshold in seconds, or -1/never"
|
|
56
|
-
},
|
|
57
|
-
"data-ln-data-store-window": {
|
|
58
|
-
"direction": "author",
|
|
59
|
-
"sources": [
|
|
60
|
-
"src/ln-data-store.js"
|
|
61
|
-
],
|
|
62
|
-
"type": "integer",
|
|
63
|
-
"fallback": 1000,
|
|
64
|
-
"min": 10,
|
|
65
|
-
"description": "Virtual scrolling cache window size in records"
|
|
66
|
-
},
|
|
67
|
-
"data-ln-data-store-window-page": {
|
|
68
|
-
"direction": null,
|
|
69
|
-
"sources": [
|
|
70
|
-
"src/ln-data-store.js"
|
|
71
|
-
],
|
|
72
|
-
"type": "integer",
|
|
73
|
-
"fallback": 200,
|
|
74
|
-
"min": 5,
|
|
75
|
-
"description": "Virtual scrolling slice page size"
|
|
76
|
-
},
|
|
77
|
-
"data-ln-debug": {
|
|
78
|
-
"direction": null,
|
|
79
|
-
"sources": [
|
|
80
|
-
"ln-data-store-dev.scss"
|
|
81
|
-
]
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
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-data-store",
|
|
4
|
+
"generator": "scripts/sync-ln-schemas.mjs",
|
|
5
|
+
"attributes": {
|
|
6
|
+
"data-ln-data-store": {
|
|
7
|
+
"direction": "author",
|
|
8
|
+
"sources": [
|
|
9
|
+
"ln-data-store-dev.scss",
|
|
10
|
+
"src/ln-data-store.js"
|
|
11
|
+
],
|
|
12
|
+
"type": "marker",
|
|
13
|
+
"description": "Identifies the element as a data-store definition container"
|
|
14
|
+
},
|
|
15
|
+
"data-ln-data-store-frozen": {
|
|
16
|
+
"direction": "runtime",
|
|
17
|
+
"sources": [
|
|
18
|
+
"ln-data-store-dev.scss",
|
|
19
|
+
"src/ln-data-store.js"
|
|
20
|
+
],
|
|
21
|
+
"type": "marker",
|
|
22
|
+
"description": "Applied at runtime to indicate store schema is locked in IndexedDB"
|
|
23
|
+
},
|
|
24
|
+
"data-ln-data-store-indexes": {
|
|
25
|
+
"direction": "author",
|
|
26
|
+
"sources": [
|
|
27
|
+
"src/ln-data-store.js"
|
|
28
|
+
],
|
|
29
|
+
"type": "list",
|
|
30
|
+
"description": "Comma-separated index field names for the IndexedDB store"
|
|
31
|
+
},
|
|
32
|
+
"data-ln-data-store-no-local-query": {
|
|
33
|
+
"direction": null,
|
|
34
|
+
"sources": [
|
|
35
|
+
"src/ln-data-store.js"
|
|
36
|
+
],
|
|
37
|
+
"type": "boolean",
|
|
38
|
+
"description": "Bypasses local IndexedDB query resolution, forcing remote fetching"
|
|
39
|
+
},
|
|
40
|
+
"data-ln-data-store-search-fields": {
|
|
41
|
+
"direction": null,
|
|
42
|
+
"sources": [
|
|
43
|
+
"src/ln-data-store.js"
|
|
44
|
+
],
|
|
45
|
+
"type": "list",
|
|
46
|
+
"description": "Record fields to index for client-side search"
|
|
47
|
+
},
|
|
48
|
+
"data-ln-data-store-stale": {
|
|
49
|
+
"direction": null,
|
|
50
|
+
"sources": [
|
|
51
|
+
"src/ln-data-store.js"
|
|
52
|
+
],
|
|
53
|
+
"type": "integer",
|
|
54
|
+
"fallback": 300,
|
|
55
|
+
"description": "Cache staleness threshold in seconds, or -1/never"
|
|
56
|
+
},
|
|
57
|
+
"data-ln-data-store-window": {
|
|
58
|
+
"direction": "author",
|
|
59
|
+
"sources": [
|
|
60
|
+
"src/ln-data-store.js"
|
|
61
|
+
],
|
|
62
|
+
"type": "integer",
|
|
63
|
+
"fallback": 1000,
|
|
64
|
+
"min": 10,
|
|
65
|
+
"description": "Virtual scrolling cache window size in records"
|
|
66
|
+
},
|
|
67
|
+
"data-ln-data-store-window-page": {
|
|
68
|
+
"direction": null,
|
|
69
|
+
"sources": [
|
|
70
|
+
"src/ln-data-store.js"
|
|
71
|
+
],
|
|
72
|
+
"type": "integer",
|
|
73
|
+
"fallback": 200,
|
|
74
|
+
"min": 5,
|
|
75
|
+
"description": "Virtual scrolling slice page size"
|
|
76
|
+
},
|
|
77
|
+
"data-ln-debug": {
|
|
78
|
+
"direction": null,
|
|
79
|
+
"sources": [
|
|
80
|
+
"ln-data-store-dev.scss"
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|