@livenetworks/ashlar 2.1.13 → 2.2.1
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/assets/brand/android-chrome-192x192.png +0 -0
- package/assets/brand/android-chrome-512x512.png +0 -0
- package/assets/brand/apple-touch-icon.png +0 -0
- package/assets/brand/favicon-16x16.png +0 -0
- package/assets/brand/favicon-32x32.png +0 -0
- package/assets/brand/favicon-48x48.png +0 -0
- package/assets/brand/favicon-dark-128x128.png +0 -0
- package/assets/brand/favicon-dark-16x16.png +0 -0
- package/assets/brand/favicon-dark-180x180.png +0 -0
- package/assets/brand/favicon-dark-192x192.png +0 -0
- package/assets/brand/favicon-dark-256x256.png +0 -0
- package/assets/brand/favicon-dark-32x32.png +0 -0
- package/assets/brand/favicon-dark-48x48.png +0 -0
- package/assets/brand/favicon-dark-512x512.png +0 -0
- package/assets/brand/favicon-dark-64x64.png +0 -0
- package/assets/brand/favicon-dark.ico +0 -0
- package/assets/brand/favicon-dark.png +0 -0
- package/assets/brand/favicon-light-128x128.png +0 -0
- package/assets/brand/favicon-light-16x16.png +0 -0
- package/assets/brand/favicon-light-180x180.png +0 -0
- package/assets/brand/favicon-light-192x192.png +0 -0
- package/assets/brand/favicon-light-256x256.png +0 -0
- package/assets/brand/favicon-light-32x32.png +0 -0
- package/assets/brand/favicon-light-48x48.png +0 -0
- package/assets/brand/favicon-light-512x512.png +0 -0
- package/assets/brand/favicon-light-64x64.png +0 -0
- package/assets/brand/favicon-light.ico +0 -0
- package/assets/brand/favicon-light.png +0 -0
- package/assets/brand/favicon.ico +0 -0
- package/assets/brand/favicon.png +0 -0
- package/assets/brand/favicon.svg +12 -0
- package/assets/brand/ln-ashlar-emblem-dark-128.png +0 -0
- package/assets/brand/ln-ashlar-emblem-dark-16.png +0 -0
- package/assets/brand/ln-ashlar-emblem-dark-256.png +0 -0
- package/assets/brand/ln-ashlar-emblem-dark-32.png +0 -0
- package/assets/brand/ln-ashlar-emblem-dark-64.png +0 -0
- package/assets/brand/ln-ashlar-emblem-dark.png +0 -0
- package/assets/brand/ln-ashlar-emblem-light-128.png +0 -0
- package/assets/brand/ln-ashlar-emblem-light-16.png +0 -0
- package/assets/brand/ln-ashlar-emblem-light-256.png +0 -0
- package/assets/brand/ln-ashlar-emblem-light-32.png +0 -0
- package/assets/brand/ln-ashlar-emblem-light-64.png +0 -0
- package/assets/brand/ln-ashlar-emblem-light.png +0 -0
- package/assets/brand/ln-ashlar-logo-dark-128.png +0 -0
- package/assets/brand/ln-ashlar-logo-dark-256.png +0 -0
- package/assets/brand/ln-ashlar-logo-dark-512.png +0 -0
- package/assets/brand/ln-ashlar-logo-dark.png +0 -0
- package/assets/brand/ln-ashlar-logo-light-128.png +0 -0
- package/assets/brand/ln-ashlar-logo-light-256.png +0 -0
- package/assets/brand/ln-ashlar-logo-light-512.png +0 -0
- package/assets/brand/ln-ashlar-logo-light.png +0 -0
- package/assets/brand/site.webmanifest +41 -0
- package/assets/brand/source/ln-ashlar-icon-dark-1024.png +0 -0
- package/assets/brand/source/ln-ashlar-icon-dark-uncropped-1024.png +0 -0
- package/assets/brand/source/ln-ashlar-icon-light-1024.png +0 -0
- package/assets/brand/source/ln-ashlar-icon-light-uncropped-1024.png +0 -0
- package/assets/flags/ad.svg +150 -0
- package/assets/flags/ae.svg +6 -0
- package/assets/flags/af.svg +81 -0
- package/assets/flags/ag.svg +14 -0
- package/assets/flags/ai.svg +29 -0
- package/assets/flags/al.svg +5 -0
- package/assets/flags/am.svg +5 -0
- package/assets/flags/ao.svg +13 -0
- package/assets/flags/aq.svg +5 -0
- package/assets/flags/ar.svg +32 -0
- package/assets/flags/arab.svg +109 -0
- package/assets/flags/as.svg +72 -0
- package/assets/flags/asean.svg +13 -0
- package/assets/flags/at.svg +4 -0
- package/assets/flags/au.svg +8 -0
- package/assets/flags/aw.svg +186 -0
- package/assets/flags/ax.svg +18 -0
- package/assets/flags/az.svg +8 -0
- package/assets/flags/ba.svg +12 -0
- package/assets/flags/bb.svg +6 -0
- package/assets/flags/bd.svg +4 -0
- package/assets/flags/be.svg +7 -0
- package/assets/flags/bf.svg +7 -0
- package/assets/flags/bg.svg +5 -0
- package/assets/flags/bh.svg +4 -0
- package/assets/flags/bi.svg +15 -0
- package/assets/flags/bj.svg +14 -0
- package/assets/flags/bl.svg +5 -0
- package/assets/flags/bm.svg +97 -0
- package/assets/flags/bn.svg +36 -0
- package/assets/flags/bo.svg +673 -0
- package/assets/flags/bq.svg +5 -0
- package/assets/flags/br.svg +45 -0
- package/assets/flags/bs.svg +13 -0
- package/assets/flags/bt.svg +89 -0
- package/assets/flags/bv.svg +13 -0
- package/assets/flags/bw.svg +7 -0
- package/assets/flags/by.svg +18 -0
- package/assets/flags/bz.svg +145 -0
- package/assets/flags/ca.svg +4 -0
- package/assets/flags/cc.svg +19 -0
- package/assets/flags/cd.svg +5 -0
- package/assets/flags/cefta.svg +13 -0
- package/assets/flags/cf.svg +15 -0
- package/assets/flags/cg.svg +12 -0
- package/assets/flags/ch.svg +9 -0
- package/assets/flags/ci.svg +7 -0
- package/assets/flags/ck.svg +9 -0
- package/assets/flags/cl.svg +13 -0
- package/assets/flags/cm.svg +15 -0
- package/assets/flags/cn.svg +11 -0
- package/assets/flags/co.svg +7 -0
- package/assets/flags/cp.svg +7 -0
- package/assets/flags/cr.svg +7 -0
- package/assets/flags/cu.svg +13 -0
- package/assets/flags/cv.svg +13 -0
- package/assets/flags/cw.svg +14 -0
- package/assets/flags/cx.svg +15 -0
- package/assets/flags/cy.svg +6 -0
- package/assets/flags/cz.svg +5 -0
- package/assets/flags/de.svg +5 -0
- package/assets/flags/dg.svg +130 -0
- package/assets/flags/dj.svg +13 -0
- package/assets/flags/dk.svg +5 -0
- package/assets/flags/dm.svg +152 -0
- package/assets/flags/do.svg +121 -0
- package/assets/flags/dz.svg +5 -0
- package/assets/flags/eac.svg +48 -0
- package/assets/flags/ec.svg +138 -0
- package/assets/flags/ee.svg +5 -0
- package/assets/flags/eg.svg +38 -0
- package/assets/flags/eh.svg +16 -0
- package/assets/flags/er.svg +8 -0
- package/assets/flags/es-ct.svg +4 -0
- package/assets/flags/es-ga.svg +187 -0
- package/assets/flags/es-pv.svg +5 -0
- package/assets/flags/es.svg +544 -0
- package/assets/flags/et.svg +14 -0
- package/assets/flags/eu.svg +28 -0
- package/assets/flags/fi.svg +5 -0
- package/assets/flags/fj.svg +120 -0
- package/assets/flags/fk.svg +90 -0
- package/assets/flags/fm.svg +11 -0
- package/assets/flags/fo.svg +12 -0
- package/assets/flags/fr.svg +5 -0
- package/assets/flags/ga.svg +7 -0
- package/assets/flags/gb-eng.svg +5 -0
- package/assets/flags/gb-nir.svg +132 -0
- package/assets/flags/gb-sct.svg +4 -0
- package/assets/flags/gb-wls.svg +9 -0
- package/assets/flags/gb.svg +7 -0
- package/assets/flags/gd.svg +27 -0
- package/assets/flags/ge.svg +6 -0
- package/assets/flags/gf.svg +5 -0
- package/assets/flags/gg.svg +9 -0
- package/assets/flags/gh.svg +6 -0
- package/assets/flags/gi.svg +32 -0
- package/assets/flags/gl.svg +4 -0
- package/assets/flags/gm.svg +14 -0
- package/assets/flags/gn.svg +7 -0
- package/assets/flags/gp.svg +5 -0
- package/assets/flags/gq.svg +23 -0
- package/assets/flags/gr.svg +16 -0
- package/assets/flags/gs.svg +133 -0
- package/assets/flags/gt.svg +204 -0
- package/assets/flags/gu.svg +19 -0
- package/assets/flags/gw.svg +13 -0
- package/assets/flags/gy.svg +9 -0
- package/assets/flags/hk.svg +8 -0
- package/assets/flags/hm.svg +8 -0
- package/assets/flags/hn.svg +18 -0
- package/assets/flags/hr.svg +58 -0
- package/assets/flags/ht.svg +116 -0
- package/assets/flags/hu.svg +7 -0
- package/assets/flags/ic.svg +7 -0
- package/assets/flags/id.svg +4 -0
- package/assets/flags/ie.svg +7 -0
- package/assets/flags/il.svg +14 -0
- package/assets/flags/im.svg +36 -0
- package/assets/flags/in.svg +25 -0
- package/assets/flags/io.svg +130 -0
- package/assets/flags/iq.svg +10 -0
- package/assets/flags/ir.svg +219 -0
- package/assets/flags/is.svg +12 -0
- package/assets/flags/it.svg +7 -0
- package/assets/flags/je.svg +62 -0
- package/assets/flags/jm.svg +8 -0
- package/assets/flags/jo.svg +16 -0
- package/assets/flags/jp.svg +11 -0
- package/assets/flags/ke.svg +23 -0
- package/assets/flags/kg.svg +4 -0
- package/assets/flags/kh.svg +61 -0
- package/assets/flags/ki.svg +36 -0
- package/assets/flags/km.svg +16 -0
- package/assets/flags/kn.svg +14 -0
- package/assets/flags/kp.svg +15 -0
- package/assets/flags/kr.svg +24 -0
- package/assets/flags/kw.svg +13 -0
- package/assets/flags/ky.svg +103 -0
- package/assets/flags/kz.svg +36 -0
- package/assets/flags/la.svg +12 -0
- package/assets/flags/lb.svg +15 -0
- package/assets/flags/lc.svg +8 -0
- package/assets/flags/li.svg +43 -0
- package/assets/flags/lk.svg +22 -0
- package/assets/flags/lr.svg +14 -0
- package/assets/flags/ls.svg +8 -0
- package/assets/flags/lt.svg +7 -0
- package/assets/flags/lu.svg +5 -0
- package/assets/flags/lv.svg +6 -0
- package/assets/flags/ly.svg +13 -0
- package/assets/flags/ma.svg +4 -0
- package/assets/flags/mc.svg +6 -0
- package/assets/flags/md.svg +70 -0
- package/assets/flags/me.svg +116 -0
- package/assets/flags/mf.svg +5 -0
- package/assets/flags/mg.svg +7 -0
- package/assets/flags/mh.svg +7 -0
- package/assets/flags/mk.svg +5 -0
- package/assets/flags/ml.svg +7 -0
- package/assets/flags/mm.svg +12 -0
- package/assets/flags/mn.svg +14 -0
- package/assets/flags/mo.svg +9 -0
- package/assets/flags/mp.svg +86 -0
- package/assets/flags/mq.svg +5 -0
- package/assets/flags/mr.svg +6 -0
- package/assets/flags/ms.svg +29 -0
- package/assets/flags/mt.svg +58 -0
- package/assets/flags/mu.svg +8 -0
- package/assets/flags/mv.svg +6 -0
- package/assets/flags/mw.svg +10 -0
- package/assets/flags/mx.svg +382 -0
- package/assets/flags/my.svg +26 -0
- package/assets/flags/mz.svg +21 -0
- package/assets/flags/na.svg +16 -0
- package/assets/flags/nc.svg +13 -0
- package/assets/flags/ne.svg +6 -0
- package/assets/flags/nf.svg +9 -0
- package/assets/flags/ng.svg +6 -0
- package/assets/flags/ni.svg +129 -0
- package/assets/flags/nl.svg +5 -0
- package/assets/flags/no.svg +7 -0
- package/assets/flags/np.svg +13 -0
- package/assets/flags/nr.svg +12 -0
- package/assets/flags/nu.svg +10 -0
- package/assets/flags/nz.svg +36 -0
- package/assets/flags/om.svg +115 -0
- package/assets/flags/pa.svg +14 -0
- package/assets/flags/pc.svg +33 -0
- package/assets/flags/pe.svg +4 -0
- package/assets/flags/pf.svg +19 -0
- package/assets/flags/pg.svg +9 -0
- package/assets/flags/ph.svg +6 -0
- package/assets/flags/pk.svg +15 -0
- package/assets/flags/pl.svg +6 -0
- package/assets/flags/pm.svg +5 -0
- package/assets/flags/pn.svg +53 -0
- package/assets/flags/pr.svg +13 -0
- package/assets/flags/ps.svg +6 -0
- package/assets/flags/pt.svg +57 -0
- package/assets/flags/pw.svg +11 -0
- package/assets/flags/py.svg +157 -0
- package/assets/flags/qa.svg +4 -0
- package/assets/flags/re.svg +5 -0
- package/assets/flags/ro.svg +7 -0
- package/assets/flags/rs.svg +292 -0
- package/assets/flags/ru.svg +5 -0
- package/assets/flags/rw.svg +13 -0
- package/assets/flags/sa.svg +25 -0
- package/assets/flags/sb.svg +13 -0
- package/assets/flags/sc.svg +7 -0
- package/assets/flags/sd.svg +13 -0
- package/assets/flags/se.svg +4 -0
- package/assets/flags/sg.svg +13 -0
- package/assets/flags/sh-ac.svg +689 -0
- package/assets/flags/sh-hl.svg +164 -0
- package/assets/flags/sh-ta.svg +76 -0
- package/assets/flags/sh.svg +7 -0
- package/assets/flags/si.svg +18 -0
- package/assets/flags/sj.svg +7 -0
- package/assets/flags/sk.svg +9 -0
- package/assets/flags/sl.svg +7 -0
- package/assets/flags/sm.svg +75 -0
- package/assets/flags/sn.svg +8 -0
- package/assets/flags/so.svg +11 -0
- package/assets/flags/sr.svg +6 -0
- package/assets/flags/ss.svg +8 -0
- package/assets/flags/st.svg +16 -0
- package/assets/flags/sv.svg +593 -0
- package/assets/flags/sx.svg +56 -0
- package/assets/flags/sy.svg +6 -0
- package/assets/flags/sz.svg +34 -0
- package/assets/flags/tc.svg +50 -0
- package/assets/flags/td.svg +7 -0
- package/assets/flags/tf.svg +15 -0
- package/assets/flags/tg.svg +14 -0
- package/assets/flags/th.svg +7 -0
- package/assets/flags/tj.svg +22 -0
- package/assets/flags/tk.svg +5 -0
- package/assets/flags/tl.svg +13 -0
- package/assets/flags/tm.svg +204 -0
- package/assets/flags/tn.svg +4 -0
- package/assets/flags/to.svg +10 -0
- package/assets/flags/tr.svg +8 -0
- package/assets/flags/tt.svg +5 -0
- package/assets/flags/tv.svg +9 -0
- package/assets/flags/tw.svg +34 -0
- package/assets/flags/tz.svg +13 -0
- package/assets/flags/ua.svg +6 -0
- package/assets/flags/ug.svg +30 -0
- package/assets/flags/um.svg +9 -0
- package/assets/flags/un.svg +16 -0
- package/assets/flags/us.svg +9 -0
- package/assets/flags/uy.svg +28 -0
- package/assets/flags/uz.svg +30 -0
- package/assets/flags/va.svg +190 -0
- package/assets/flags/vc.svg +8 -0
- package/assets/flags/ve.svg +26 -0
- package/assets/flags/vg.svg +59 -0
- package/assets/flags/vi.svg +28 -0
- package/assets/flags/vn.svg +11 -0
- package/assets/flags/vu.svg +21 -0
- package/assets/flags/wf.svg +5 -0
- package/assets/flags/ws.svg +7 -0
- package/assets/flags/xk.svg +5 -0
- package/assets/flags/xx.svg +4 -0
- package/assets/flags/ye.svg +7 -0
- package/assets/flags/yt.svg +5 -0
- package/assets/flags/za.svg +17 -0
- package/assets/flags/zm.svg +27 -0
- package/assets/flags/zw.svg +21 -0
- package/components/COMPONENTS.md +80 -80
- package/components/ln-api-connector/ln-api-connector.schema.json +105 -105
- package/components/ln-chart/ln-chart-dev.scss +0 -4
- package/components/ln-core/README.md +21 -21
- package/components/ln-core/ln-core.schema.json +120 -120
- package/components/ln-core/query.js +113 -113
- package/components/ln-data-coordinator/README.md +2 -0
- package/components/ln-data-coordinator/ln-data-coordinator.js +1 -1
- package/components/ln-data-coordinator/ln-data-coordinator.schema.json +196 -196
- package/components/ln-data-coordinator/src/ln-data-coordinator.js +457 -432
- package/components/ln-data-store/ln-data-store.schema.json +92 -92
- package/components/ln-date/ln-date.js +1 -1
- package/components/ln-date/src/ln-date.js +1 -1
- package/components/ln-debug/ln-debug.js +1 -1
- package/components/ln-debug/ln-debug.schema.json +28 -28
- package/components/ln-debug/src/generated-attributes.js +4 -0
- package/components/ln-dropdown/ln-dropdown.schema.json +90 -90
- package/components/ln-external-links/README.md +19 -19
- package/components/ln-external-links/ln-external-links.js +1 -1
- package/components/ln-external-links/ln-external-links.schema.json +9 -0
- package/components/ln-external-links/ln-external-links.scss +12 -0
- package/components/ln-external-links/src/ln-external-links.js +3 -2
- package/components/ln-filter/README.md +2 -1
- package/components/ln-filter/ln-filter.js +1 -1
- package/components/ln-filter/ln-filter.schema.json +157 -169
- package/components/ln-filter/src/ln-filter.js +1 -3
- package/components/ln-form/ln-form.schema.json +57 -57
- package/components/ln-key/ln-key.js +1 -1
- package/components/ln-key/ln-key.schema.json +8 -0
- package/components/ln-key/src/ln-key.js +8 -5
- package/components/ln-obfuscator/ln-obfuscator.js +1 -1
- package/components/ln-obfuscator/ln-obfuscator.schema.json +6 -0
- package/components/ln-obfuscator/src/ln-obfuscator.js +2 -2
- package/components/ln-options/ln-options.schema.json +47 -47
- package/components/ln-popover/ln-popover.schema.json +82 -82
- package/components/ln-progress/ln-progress.schema.json +0 -13
- package/components/ln-search/ln-search.schema.json +111 -111
- package/components/ln-sort/README.md +1 -0
- package/components/ln-sort/ln-sort.js +1 -1
- package/components/ln-sort/ln-sort.schema.json +100 -112
- package/components/ln-sort/src/sort-model.js +1 -6
- package/components/ln-sortable/ln-sortable.schema.json +38 -38
- package/components/ln-sortable/ln-sortable.scss +25 -25
- package/components/ln-table/README.md +8 -1
- package/components/ln-table/ln-table.js +1 -1
- package/components/ln-table/ln-table.schema.json +195 -195
- package/components/ln-table/src/ln-table.js +43 -7
- package/components/ln-table-coordinator/ln-table-coordinator.js +1 -1
- package/components/ln-table-coordinator/ln-table-coordinator.schema.json +18 -0
- package/components/ln-table-coordinator/src/ln-table-coordinator.js +104 -2
- package/components/ln-toast/README.md +1 -1
- package/components/ln-toast/ln-toast.js +1 -1
- package/components/ln-toast/ln-toast.schema.json +6 -0
- package/components/ln-toast/src/ln-toast.js +1 -1
- package/components/ln-translations/README.md +202 -120
- package/components/ln-translations/ln-translations.js +1 -1
- package/components/ln-translations/ln-translations.schema.json +136 -120
- package/components/ln-translations/src/ln-translations.js +354 -295
- package/components/ln-translations/src/translations-model.js +221 -0
- package/components/ln-validate/README.md +6 -6
- package/components/ln-validate/ln-validate-dev.scss +0 -5
- package/components/ln-validate/ln-validate.js +1 -1
- package/components/ln-validate/ln-validate.schema.json +0 -6
- package/components/ln-validate/src/ln-validate.js +48 -29
- package/ln-ashlar.html-data.json +26 -8
- package/package.json +3 -2
- package/theme/README.md +7 -6
- package/theme/base/_global.scss +2 -2
- package/theme/base/_reset.scss +11 -0
- package/theme/components/_app-shell.scss +0 -8
- package/theme/components/_form.scss +6 -6
- package/theme/components/_ln-table.scss +6 -3
- package/theme/components/_scrollbar.scss +5 -4
- package/theme/components/_sortable.scss +19 -19
- package/theme/components/_stat-card.scss +1 -0
- package/theme/components/_table.scss +10 -33
- package/theme/components/_translations.scss +118 -111
- package/theme/config/_density.scss +236 -104
- package/theme/config/_palette.scss +71 -49
- package/theme/config/_theme.scss +27 -31
- package/theme/config/_tokens.scss +28 -26
- package/theme/config/mixins/_app-shell.scss +31 -21
- package/theme/config/mixins/_btn.scss +4 -2
- package/theme/config/mixins/_card.scss +87 -67
- package/theme/config/mixins/_colors.scss +2 -1
- package/theme/config/mixins/_count.scss +48 -0
- package/theme/config/mixins/_display.scss +12 -0
- package/theme/config/mixins/_footer.scss +3 -1
- package/theme/config/mixins/_form.scss +48 -16
- package/theme/config/mixins/_index.scss +1 -0
- package/theme/config/mixins/_layout.scss +9 -0
- package/theme/config/mixins/_ln-table.scss +22 -15
- package/theme/config/mixins/_modal.scss +3 -0
- package/theme/config/mixins/_nav.scss +19 -4
- package/theme/config/mixins/_sidebar.scss +2 -1
- package/theme/config/mixins/_stat-card.scss +33 -2
- package/theme/config/mixins/_status-badge.scss +1 -0
- package/theme/config/mixins/_table.scss +81 -39
- package/theme/config/mixins/_tabs.scss +31 -0
- package/theme/config/mixins/_toast.scss +0 -1
- package/theme/config/mixins/_translations.scss +126 -124
- package/theme/designs/relaxed/_card.scss +12 -0
- package/theme/designs/relaxed/_layout.scss +24 -0
- package/theme/ln-ashlar-core.scss +1 -0
- package/theme/ln-ashlar-dev.scss +0 -1
- package/theme/ln-ashlar-relaxed.scss +67 -0
- package/theme/tailwind/components.css +561 -24
- package/theme/utilities/_utilities.scss +1 -11
- package/web-types.json +38 -10
- package/components/ln-progress/ln-progress-dev.scss +0 -8
|
@@ -559,24 +559,24 @@ const batchRender = createBatcher(
|
|
|
559
559
|
|
|
560
560
|
---
|
|
561
561
|
|
|
562
|
-
## Reactive Rendering Pattern
|
|
563
|
-
|
|
564
|
-
The `createBatcher` primitive and DOM rendering helpers (`fill`, `renderList`) are designed to be used together as the canonical ln-ashlar microtask render loop:
|
|
565
|
-
|
|
566
|
-
1. **State mutation.** Component updates internal data properties (e.g. `this.state.key = 'val'`).
|
|
567
|
-
2. **Microtask queue.** The component triggers the `schedule()` function returned by `createBatcher`. Any number of synchronous assignments in the same sync block schedule a single microtask.
|
|
568
|
-
3. **One render.** When the microtask fires, the batcher calls `renderFn` exactly once. `renderFn` typically calls `fill(this.dom, this.state)` (or `renderList` for keyed collections) to project state into the DOM, then the optional `afterRender` callback fires (commonly used to dispatch a `ln-{component}:rendered` or changed event).
|
|
569
|
-
|
|
570
|
-
Two state assignments on the same tick produce one DOM update:
|
|
571
|
-
|
|
572
|
-
The pattern is: **state mutation → microtask queue → one render**.
|
|
573
|
-
Never wire sync state updates directly to immediate DOM writes when multiple attributes or filter parameters can change simultaneously — batching prevents layout thrashing.
|
|
574
|
-
|
|
575
|
-
For further details, see
|
|
576
|
-
[Reactive Rendering Pattern in components/COMPONENTS.md](../../components/COMPONENTS.md#reactive-rendering-pattern).
|
|
577
|
-
|
|
578
|
-
---
|
|
579
|
-
|
|
562
|
+
## Reactive Rendering Pattern
|
|
563
|
+
|
|
564
|
+
The `createBatcher` primitive and DOM rendering helpers (`fill`, `renderList`) are designed to be used together as the canonical ln-ashlar microtask render loop:
|
|
565
|
+
|
|
566
|
+
1. **State mutation.** Component updates internal data properties (e.g. `this.state.key = 'val'`).
|
|
567
|
+
2. **Microtask queue.** The component triggers the `schedule()` function returned by `createBatcher`. Any number of synchronous assignments in the same sync block schedule a single microtask.
|
|
568
|
+
3. **One render.** When the microtask fires, the batcher calls `renderFn` exactly once. `renderFn` typically calls `fill(this.dom, this.state)` (or `renderList` for keyed collections) to project state into the DOM, then the optional `afterRender` callback fires (commonly used to dispatch a `ln-{component}:rendered` or changed event).
|
|
569
|
+
|
|
570
|
+
Two state assignments on the same tick produce one DOM update:
|
|
571
|
+
|
|
572
|
+
The pattern is: **state mutation → microtask queue → one render**.
|
|
573
|
+
Never wire sync state updates directly to immediate DOM writes when multiple attributes or filter parameters can change simultaneously — batching prevents layout thrashing.
|
|
574
|
+
|
|
575
|
+
For further details, see
|
|
576
|
+
[Reactive Rendering Pattern in components/COMPONENTS.md](../../components/COMPONENTS.md#reactive-rendering-pattern).
|
|
577
|
+
|
|
578
|
+
---
|
|
579
|
+
|
|
580
580
|
## window-cache.js
|
|
581
581
|
|
|
582
582
|
### createWindowCache(config)
|
|
@@ -951,9 +951,9 @@ import { dispatch, dispatchCancelable, guardBody, findElements, createBatcher, f
|
|
|
951
951
|
const self = this;
|
|
952
952
|
|
|
953
953
|
// Reactive state + batched rendering
|
|
954
|
-
this.state = { items: [] };
|
|
955
|
-
this.batchRender = createBatcher(function () {
|
|
956
|
-
if (!self._destroyed) self._render();
|
|
954
|
+
this.state = { items: [] };
|
|
955
|
+
this.batchRender = createBatcher(function () {
|
|
956
|
+
if (!self._destroyed) self._render();
|
|
957
957
|
});
|
|
958
958
|
|
|
959
959
|
return this;
|
|
@@ -1,120 +1,120 @@
|
|
|
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-core",
|
|
4
|
-
"generator": "scripts/sync-ln-schemas.mjs",
|
|
5
|
-
"attributes": {
|
|
6
|
-
"data-ln-attr": {
|
|
7
|
-
"direction": "author",
|
|
8
|
-
"sources": [
|
|
9
|
-
"template.js"
|
|
10
|
-
]
|
|
11
|
-
},
|
|
12
|
-
"data-ln-class": {
|
|
13
|
-
"direction": "author",
|
|
14
|
-
"sources": [
|
|
15
|
-
"template.js"
|
|
16
|
-
]
|
|
17
|
-
},
|
|
18
|
-
"data-ln-debug": {
|
|
19
|
-
"direction": "author",
|
|
20
|
-
"sources": [
|
|
21
|
-
"events.js"
|
|
22
|
-
]
|
|
23
|
-
},
|
|
24
|
-
"data-ln-field": {
|
|
25
|
-
"direction": "author",
|
|
26
|
-
"sources": [
|
|
27
|
-
"template.js"
|
|
28
|
-
]
|
|
29
|
-
},
|
|
30
|
-
"data-ln-fill-as": {
|
|
31
|
-
"direction": "author",
|
|
32
|
-
"sources": [
|
|
33
|
-
"form.js"
|
|
34
|
-
]
|
|
35
|
-
},
|
|
36
|
-
"data-ln-fillable": {
|
|
37
|
-
"direction": "author",
|
|
38
|
-
"sources": [
|
|
39
|
-
"template.js"
|
|
40
|
-
]
|
|
41
|
-
},
|
|
42
|
-
"data-ln-filter": {
|
|
43
|
-
"direction": "author",
|
|
44
|
-
"sources": [
|
|
45
|
-
"hash.js",
|
|
46
|
-
"query.js"
|
|
47
|
-
]
|
|
48
|
-
},
|
|
49
|
-
"data-ln-form": {
|
|
50
|
-
"direction": "author",
|
|
51
|
-
"sources": [
|
|
52
|
-
"template.js"
|
|
53
|
-
]
|
|
54
|
-
},
|
|
55
|
-
"data-ln-hash": {
|
|
56
|
-
"direction": "author",
|
|
57
|
-
"sources": [
|
|
58
|
-
"hash.js"
|
|
59
|
-
]
|
|
60
|
-
},
|
|
61
|
-
"data-ln-persist": {
|
|
62
|
-
"direction": "author",
|
|
63
|
-
"sources": [
|
|
64
|
-
"lifecycle.js"
|
|
65
|
-
]
|
|
66
|
-
},
|
|
67
|
-
"data-ln-query": {
|
|
68
|
-
"direction": "author",
|
|
69
|
-
"sources": [
|
|
70
|
-
"query.js"
|
|
71
|
-
]
|
|
72
|
-
},
|
|
73
|
-
"data-ln-render-key": {
|
|
74
|
-
"direction": "both",
|
|
75
|
-
"sources": [
|
|
76
|
-
"template.js"
|
|
77
|
-
]
|
|
78
|
-
},
|
|
79
|
-
"data-ln-search": {
|
|
80
|
-
"direction": "author",
|
|
81
|
-
"sources": [
|
|
82
|
-
"hash.js",
|
|
83
|
-
"query.js"
|
|
84
|
-
]
|
|
85
|
-
},
|
|
86
|
-
"data-ln-search-for": {
|
|
87
|
-
"direction": "author",
|
|
88
|
-
"sources": [
|
|
89
|
-
"hash.js",
|
|
90
|
-
"query.js"
|
|
91
|
-
]
|
|
92
|
-
},
|
|
93
|
-
"data-ln-show": {
|
|
94
|
-
"direction": "author",
|
|
95
|
-
"sources": [
|
|
96
|
-
"template.js"
|
|
97
|
-
]
|
|
98
|
-
},
|
|
99
|
-
"data-ln-sort": {
|
|
100
|
-
"direction": "author",
|
|
101
|
-
"sources": [
|
|
102
|
-
"hash.js",
|
|
103
|
-
"query.js"
|
|
104
|
-
]
|
|
105
|
-
},
|
|
106
|
-
"data-ln-template": {
|
|
107
|
-
"direction": "author",
|
|
108
|
-
"sources": [
|
|
109
|
-
"template.js"
|
|
110
|
-
]
|
|
111
|
-
},
|
|
112
|
-
"data-ln-value": {
|
|
113
|
-
"direction": "both",
|
|
114
|
-
"sources": [
|
|
115
|
-
"dom.js",
|
|
116
|
-
"form.js"
|
|
117
|
-
]
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
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-core",
|
|
4
|
+
"generator": "scripts/sync-ln-schemas.mjs",
|
|
5
|
+
"attributes": {
|
|
6
|
+
"data-ln-attr": {
|
|
7
|
+
"direction": "author",
|
|
8
|
+
"sources": [
|
|
9
|
+
"template.js"
|
|
10
|
+
]
|
|
11
|
+
},
|
|
12
|
+
"data-ln-class": {
|
|
13
|
+
"direction": "author",
|
|
14
|
+
"sources": [
|
|
15
|
+
"template.js"
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
"data-ln-debug": {
|
|
19
|
+
"direction": "author",
|
|
20
|
+
"sources": [
|
|
21
|
+
"events.js"
|
|
22
|
+
]
|
|
23
|
+
},
|
|
24
|
+
"data-ln-field": {
|
|
25
|
+
"direction": "author",
|
|
26
|
+
"sources": [
|
|
27
|
+
"template.js"
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
"data-ln-fill-as": {
|
|
31
|
+
"direction": "author",
|
|
32
|
+
"sources": [
|
|
33
|
+
"form.js"
|
|
34
|
+
]
|
|
35
|
+
},
|
|
36
|
+
"data-ln-fillable": {
|
|
37
|
+
"direction": "author",
|
|
38
|
+
"sources": [
|
|
39
|
+
"template.js"
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
"data-ln-filter": {
|
|
43
|
+
"direction": "author",
|
|
44
|
+
"sources": [
|
|
45
|
+
"hash.js",
|
|
46
|
+
"query.js"
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
"data-ln-form": {
|
|
50
|
+
"direction": "author",
|
|
51
|
+
"sources": [
|
|
52
|
+
"template.js"
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
"data-ln-hash": {
|
|
56
|
+
"direction": "author",
|
|
57
|
+
"sources": [
|
|
58
|
+
"hash.js"
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
"data-ln-persist": {
|
|
62
|
+
"direction": "author",
|
|
63
|
+
"sources": [
|
|
64
|
+
"lifecycle.js"
|
|
65
|
+
]
|
|
66
|
+
},
|
|
67
|
+
"data-ln-query": {
|
|
68
|
+
"direction": "author",
|
|
69
|
+
"sources": [
|
|
70
|
+
"query.js"
|
|
71
|
+
]
|
|
72
|
+
},
|
|
73
|
+
"data-ln-render-key": {
|
|
74
|
+
"direction": "both",
|
|
75
|
+
"sources": [
|
|
76
|
+
"template.js"
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
"data-ln-search": {
|
|
80
|
+
"direction": "author",
|
|
81
|
+
"sources": [
|
|
82
|
+
"hash.js",
|
|
83
|
+
"query.js"
|
|
84
|
+
]
|
|
85
|
+
},
|
|
86
|
+
"data-ln-search-for": {
|
|
87
|
+
"direction": "author",
|
|
88
|
+
"sources": [
|
|
89
|
+
"hash.js",
|
|
90
|
+
"query.js"
|
|
91
|
+
]
|
|
92
|
+
},
|
|
93
|
+
"data-ln-show": {
|
|
94
|
+
"direction": "author",
|
|
95
|
+
"sources": [
|
|
96
|
+
"template.js"
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
"data-ln-sort": {
|
|
100
|
+
"direction": "author",
|
|
101
|
+
"sources": [
|
|
102
|
+
"hash.js",
|
|
103
|
+
"query.js"
|
|
104
|
+
]
|
|
105
|
+
},
|
|
106
|
+
"data-ln-template": {
|
|
107
|
+
"direction": "author",
|
|
108
|
+
"sources": [
|
|
109
|
+
"template.js"
|
|
110
|
+
]
|
|
111
|
+
},
|
|
112
|
+
"data-ln-value": {
|
|
113
|
+
"direction": "both",
|
|
114
|
+
"sources": [
|
|
115
|
+
"dom.js",
|
|
116
|
+
"form.js"
|
|
117
|
+
]
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -1,113 +1,113 @@
|
|
|
1
|
-
// ─── Query String codec (URL search params as reactive state) ──
|
|
2
|
-
//
|
|
3
|
-
// Allows components (ln-search, ln-filter, ln-sort) to bind to URL search
|
|
4
|
-
// parameters (?search=foo&status=active&sort=amount.desc) in SPAs without
|
|
5
|
-
// polluting or colliding with the URL hash fragment (#modal, #tab).
|
|
6
|
-
//
|
|
7
|
-
// Write mechanism: `history.replaceState` (does not reload the page or pollute history).
|
|
8
|
-
// Read mechanism: `URLSearchParams` on window.location.search.
|
|
9
|
-
// Navigation: Reacts to `popstate` events on browser Back/Forward navigation.
|
|
10
|
-
|
|
11
|
-
function _stripSearch(str) {
|
|
12
|
-
return (str || '').replace(/^\?/, '');
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function queryParse(searchStr) {
|
|
16
|
-
const raw = (searchStr === undefined)
|
|
17
|
-
? (typeof window !== 'undefined' ? window.location.search : '')
|
|
18
|
-
: searchStr;
|
|
19
|
-
const map = {};
|
|
20
|
-
const s = _stripSearch(raw);
|
|
21
|
-
if (!s) return map;
|
|
22
|
-
const params = new URLSearchParams(s);
|
|
23
|
-
for (const [key, val] of params.entries()) {
|
|
24
|
-
map[key] = val;
|
|
25
|
-
}
|
|
26
|
-
return map;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function queryGet(key) {
|
|
30
|
-
if (!key || typeof window === 'undefined') return null;
|
|
31
|
-
const params = new URLSearchParams(window.location.search);
|
|
32
|
-
return params.has(key) ? params.get(key) : null;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export function querySet(key, value) {
|
|
36
|
-
if (!key || typeof window === 'undefined') return;
|
|
37
|
-
const url = new URL(window.location.href);
|
|
38
|
-
|
|
39
|
-
if (value === null || value === undefined || value === '') {
|
|
40
|
-
url.searchParams.delete(key);
|
|
41
|
-
} else {
|
|
42
|
-
url.searchParams.set(key, String(value));
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
if (url.search === window.location.search) return;
|
|
46
|
-
|
|
47
|
-
const nextUrl = url.pathname + url.search + url.hash;
|
|
48
|
-
window.history.replaceState(window.history.state, '', nextUrl);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export function resolveQueryParam(el, defaultSuffix) {
|
|
52
|
-
if (!el || !el.hasAttribute('data-ln-query')) return null;
|
|
53
|
-
const explicit = el.getAttribute('data-ln-query');
|
|
54
|
-
if (explicit && explicit.trim() !== '') return explicit.trim();
|
|
55
|
-
const targetId = el.getAttribute('data-ln-sort')
|
|
56
|
-
|| el.getAttribute('data-ln-search-for')
|
|
57
|
-
|| el.getAttribute('data-ln-search')
|
|
58
|
-
|| el.getAttribute('data-ln-filter')
|
|
59
|
-
|| el.id;
|
|
60
|
-
if (targetId) {
|
|
61
|
-
return defaultSuffix ? (targetId + '_' + defaultSuffix) : targetId;
|
|
62
|
-
}
|
|
63
|
-
return defaultSuffix || null;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export function querySortEncode(fieldOrColumn, direction) {
|
|
67
|
-
if (!direction || direction === 'none' || fieldOrColumn === null || fieldOrColumn === undefined) return null;
|
|
68
|
-
return String(fieldOrColumn) + '.' + direction;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export function querySortDecode(val, queryParams) {
|
|
72
|
-
if (val && typeof val === 'string') {
|
|
73
|
-
if (val.endsWith('.asc')) {
|
|
74
|
-
return { fieldOrColumn: val.slice(0, -4), direction: 'asc' };
|
|
75
|
-
}
|
|
76
|
-
if (val.endsWith('.desc')) {
|
|
77
|
-
return { fieldOrColumn: val.slice(0, -5), direction: 'desc' };
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
if (queryParams && typeof queryParams === 'object') {
|
|
81
|
-
const field = queryParams.sort_field || queryParams.sort_by;
|
|
82
|
-
if (field) {
|
|
83
|
-
const dir = (queryParams.sort_dir && String(queryParams.sort_dir).toLowerCase() === 'desc') ? 'desc' : 'asc';
|
|
84
|
-
return { fieldOrColumn: field, direction: dir };
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return null;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
export function queryFilterEncode(values) {
|
|
91
|
-
if (!Array.isArray(values) || values.length === 0) return null;
|
|
92
|
-
return values.map(encodeURIComponent).join(',');
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export function queryFilterDecode(val) {
|
|
96
|
-
if (!val || typeof val !== 'string') return [];
|
|
97
|
-
return val.split(',').map(function (v) {
|
|
98
|
-
try { return decodeURIComponent(v.trim()); }
|
|
99
|
-
catch (e) { return v.trim(); }
|
|
100
|
-
}).filter(Boolean);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
if (typeof window !== 'undefined') {
|
|
104
|
-
window.lnCore = window.lnCore || {};
|
|
105
|
-
window.lnCore.queryParse = queryParse;
|
|
106
|
-
window.lnCore.queryGet = queryGet;
|
|
107
|
-
window.lnCore.querySet = querySet;
|
|
108
|
-
window.lnCore.resolveQueryParam = resolveQueryParam;
|
|
109
|
-
window.lnCore.querySortEncode = querySortEncode;
|
|
110
|
-
window.lnCore.querySortDecode = querySortDecode;
|
|
111
|
-
window.lnCore.queryFilterEncode = queryFilterEncode;
|
|
112
|
-
window.lnCore.queryFilterDecode = queryFilterDecode;
|
|
113
|
-
}
|
|
1
|
+
// ─── Query String codec (URL search params as reactive state) ──
|
|
2
|
+
//
|
|
3
|
+
// Allows components (ln-search, ln-filter, ln-sort) to bind to URL search
|
|
4
|
+
// parameters (?search=foo&status=active&sort=amount.desc) in SPAs without
|
|
5
|
+
// polluting or colliding with the URL hash fragment (#modal, #tab).
|
|
6
|
+
//
|
|
7
|
+
// Write mechanism: `history.replaceState` (does not reload the page or pollute history).
|
|
8
|
+
// Read mechanism: `URLSearchParams` on window.location.search.
|
|
9
|
+
// Navigation: Reacts to `popstate` events on browser Back/Forward navigation.
|
|
10
|
+
|
|
11
|
+
function _stripSearch(str) {
|
|
12
|
+
return (str || '').replace(/^\?/, '');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function queryParse(searchStr) {
|
|
16
|
+
const raw = (searchStr === undefined)
|
|
17
|
+
? (typeof window !== 'undefined' ? window.location.search : '')
|
|
18
|
+
: searchStr;
|
|
19
|
+
const map = {};
|
|
20
|
+
const s = _stripSearch(raw);
|
|
21
|
+
if (!s) return map;
|
|
22
|
+
const params = new URLSearchParams(s);
|
|
23
|
+
for (const [key, val] of params.entries()) {
|
|
24
|
+
map[key] = val;
|
|
25
|
+
}
|
|
26
|
+
return map;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function queryGet(key) {
|
|
30
|
+
if (!key || typeof window === 'undefined') return null;
|
|
31
|
+
const params = new URLSearchParams(window.location.search);
|
|
32
|
+
return params.has(key) ? params.get(key) : null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function querySet(key, value) {
|
|
36
|
+
if (!key || typeof window === 'undefined') return;
|
|
37
|
+
const url = new URL(window.location.href);
|
|
38
|
+
|
|
39
|
+
if (value === null || value === undefined || value === '') {
|
|
40
|
+
url.searchParams.delete(key);
|
|
41
|
+
} else {
|
|
42
|
+
url.searchParams.set(key, String(value));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (url.search === window.location.search) return;
|
|
46
|
+
|
|
47
|
+
const nextUrl = url.pathname + url.search + url.hash;
|
|
48
|
+
window.history.replaceState(window.history.state, '', nextUrl);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function resolveQueryParam(el, defaultSuffix) {
|
|
52
|
+
if (!el || !el.hasAttribute('data-ln-query')) return null;
|
|
53
|
+
const explicit = el.getAttribute('data-ln-query');
|
|
54
|
+
if (explicit && explicit.trim() !== '') return explicit.trim();
|
|
55
|
+
const targetId = el.getAttribute('data-ln-sort')
|
|
56
|
+
|| el.getAttribute('data-ln-search-for')
|
|
57
|
+
|| el.getAttribute('data-ln-search')
|
|
58
|
+
|| el.getAttribute('data-ln-filter')
|
|
59
|
+
|| el.id;
|
|
60
|
+
if (targetId) {
|
|
61
|
+
return defaultSuffix ? (targetId + '_' + defaultSuffix) : targetId;
|
|
62
|
+
}
|
|
63
|
+
return defaultSuffix || null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function querySortEncode(fieldOrColumn, direction) {
|
|
67
|
+
if (!direction || direction === 'none' || fieldOrColumn === null || fieldOrColumn === undefined) return null;
|
|
68
|
+
return String(fieldOrColumn) + '.' + direction;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function querySortDecode(val, queryParams) {
|
|
72
|
+
if (val && typeof val === 'string') {
|
|
73
|
+
if (val.endsWith('.asc')) {
|
|
74
|
+
return { fieldOrColumn: val.slice(0, -4), direction: 'asc' };
|
|
75
|
+
}
|
|
76
|
+
if (val.endsWith('.desc')) {
|
|
77
|
+
return { fieldOrColumn: val.slice(0, -5), direction: 'desc' };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (queryParams && typeof queryParams === 'object') {
|
|
81
|
+
const field = queryParams.sort_field || queryParams.sort_by;
|
|
82
|
+
if (field) {
|
|
83
|
+
const dir = (queryParams.sort_dir && String(queryParams.sort_dir).toLowerCase() === 'desc') ? 'desc' : 'asc';
|
|
84
|
+
return { fieldOrColumn: field, direction: dir };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export function queryFilterEncode(values) {
|
|
91
|
+
if (!Array.isArray(values) || values.length === 0) return null;
|
|
92
|
+
return values.map(encodeURIComponent).join(',');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function queryFilterDecode(val) {
|
|
96
|
+
if (!val || typeof val !== 'string') return [];
|
|
97
|
+
return val.split(',').map(function (v) {
|
|
98
|
+
try { return decodeURIComponent(v.trim()); }
|
|
99
|
+
catch (e) { return v.trim(); }
|
|
100
|
+
}).filter(Boolean);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (typeof window !== 'undefined') {
|
|
104
|
+
window.lnCore = window.lnCore || {};
|
|
105
|
+
window.lnCore.queryParse = queryParse;
|
|
106
|
+
window.lnCore.queryGet = queryGet;
|
|
107
|
+
window.lnCore.querySet = querySet;
|
|
108
|
+
window.lnCore.resolveQueryParam = resolveQueryParam;
|
|
109
|
+
window.lnCore.querySortEncode = querySortEncode;
|
|
110
|
+
window.lnCore.querySortDecode = querySortDecode;
|
|
111
|
+
window.lnCore.queryFilterEncode = queryFilterEncode;
|
|
112
|
+
window.lnCore.queryFilterDecode = queryFilterDecode;
|
|
113
|
+
}
|
|
@@ -446,6 +446,8 @@ There is no `ln-data-store:sync-conflict` event and no `forceSync()` error
|
|
|
446
446
|
backstop — both were removed as part of this refactor (no grep-verified
|
|
447
447
|
consumer existed for either).
|
|
448
448
|
|
|
449
|
+
**Non-queued direct connector rollback (`!meta.queued`)** — When an offline queue is not present and a direct connector request fails, `ln-data-coordinator` automatically rolls back the optimistic local store mutation to keep the client cache consistent: an `update` failure restores the pre-mutation `meta.snapshot` (`ln-data-store:request-update`), a `create` failure deletes the optimistic record via `meta.tempId` (`ln-data-store:request-delete`), and a `delete` failure re-creates the deleted record from `meta.snapshot` (`ln-data-store:request-create`).
|
|
450
|
+
|
|
449
451
|
---
|
|
450
452
|
|
|
451
453
|
---
|