@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.
Files changed (437) hide show
  1. package/assets/brand/android-chrome-192x192.png +0 -0
  2. package/assets/brand/android-chrome-512x512.png +0 -0
  3. package/assets/brand/apple-touch-icon.png +0 -0
  4. package/assets/brand/favicon-16x16.png +0 -0
  5. package/assets/brand/favicon-32x32.png +0 -0
  6. package/assets/brand/favicon-48x48.png +0 -0
  7. package/assets/brand/favicon-dark-128x128.png +0 -0
  8. package/assets/brand/favicon-dark-16x16.png +0 -0
  9. package/assets/brand/favicon-dark-180x180.png +0 -0
  10. package/assets/brand/favicon-dark-192x192.png +0 -0
  11. package/assets/brand/favicon-dark-256x256.png +0 -0
  12. package/assets/brand/favicon-dark-32x32.png +0 -0
  13. package/assets/brand/favicon-dark-48x48.png +0 -0
  14. package/assets/brand/favicon-dark-512x512.png +0 -0
  15. package/assets/brand/favicon-dark-64x64.png +0 -0
  16. package/assets/brand/favicon-dark.ico +0 -0
  17. package/assets/brand/favicon-dark.png +0 -0
  18. package/assets/brand/favicon-light-128x128.png +0 -0
  19. package/assets/brand/favicon-light-16x16.png +0 -0
  20. package/assets/brand/favicon-light-180x180.png +0 -0
  21. package/assets/brand/favicon-light-192x192.png +0 -0
  22. package/assets/brand/favicon-light-256x256.png +0 -0
  23. package/assets/brand/favicon-light-32x32.png +0 -0
  24. package/assets/brand/favicon-light-48x48.png +0 -0
  25. package/assets/brand/favicon-light-512x512.png +0 -0
  26. package/assets/brand/favicon-light-64x64.png +0 -0
  27. package/assets/brand/favicon-light.ico +0 -0
  28. package/assets/brand/favicon-light.png +0 -0
  29. package/assets/brand/favicon.ico +0 -0
  30. package/assets/brand/favicon.png +0 -0
  31. package/assets/brand/favicon.svg +12 -0
  32. package/assets/brand/ln-ashlar-emblem-dark-128.png +0 -0
  33. package/assets/brand/ln-ashlar-emblem-dark-16.png +0 -0
  34. package/assets/brand/ln-ashlar-emblem-dark-256.png +0 -0
  35. package/assets/brand/ln-ashlar-emblem-dark-32.png +0 -0
  36. package/assets/brand/ln-ashlar-emblem-dark-64.png +0 -0
  37. package/assets/brand/ln-ashlar-emblem-dark.png +0 -0
  38. package/assets/brand/ln-ashlar-emblem-light-128.png +0 -0
  39. package/assets/brand/ln-ashlar-emblem-light-16.png +0 -0
  40. package/assets/brand/ln-ashlar-emblem-light-256.png +0 -0
  41. package/assets/brand/ln-ashlar-emblem-light-32.png +0 -0
  42. package/assets/brand/ln-ashlar-emblem-light-64.png +0 -0
  43. package/assets/brand/ln-ashlar-emblem-light.png +0 -0
  44. package/assets/brand/ln-ashlar-logo-dark-128.png +0 -0
  45. package/assets/brand/ln-ashlar-logo-dark-256.png +0 -0
  46. package/assets/brand/ln-ashlar-logo-dark-512.png +0 -0
  47. package/assets/brand/ln-ashlar-logo-dark.png +0 -0
  48. package/assets/brand/ln-ashlar-logo-light-128.png +0 -0
  49. package/assets/brand/ln-ashlar-logo-light-256.png +0 -0
  50. package/assets/brand/ln-ashlar-logo-light-512.png +0 -0
  51. package/assets/brand/ln-ashlar-logo-light.png +0 -0
  52. package/assets/brand/site.webmanifest +41 -0
  53. package/assets/brand/source/ln-ashlar-icon-dark-1024.png +0 -0
  54. package/assets/brand/source/ln-ashlar-icon-dark-uncropped-1024.png +0 -0
  55. package/assets/brand/source/ln-ashlar-icon-light-1024.png +0 -0
  56. package/assets/brand/source/ln-ashlar-icon-light-uncropped-1024.png +0 -0
  57. package/assets/flags/ad.svg +150 -0
  58. package/assets/flags/ae.svg +6 -0
  59. package/assets/flags/af.svg +81 -0
  60. package/assets/flags/ag.svg +14 -0
  61. package/assets/flags/ai.svg +29 -0
  62. package/assets/flags/al.svg +5 -0
  63. package/assets/flags/am.svg +5 -0
  64. package/assets/flags/ao.svg +13 -0
  65. package/assets/flags/aq.svg +5 -0
  66. package/assets/flags/ar.svg +32 -0
  67. package/assets/flags/arab.svg +109 -0
  68. package/assets/flags/as.svg +72 -0
  69. package/assets/flags/asean.svg +13 -0
  70. package/assets/flags/at.svg +4 -0
  71. package/assets/flags/au.svg +8 -0
  72. package/assets/flags/aw.svg +186 -0
  73. package/assets/flags/ax.svg +18 -0
  74. package/assets/flags/az.svg +8 -0
  75. package/assets/flags/ba.svg +12 -0
  76. package/assets/flags/bb.svg +6 -0
  77. package/assets/flags/bd.svg +4 -0
  78. package/assets/flags/be.svg +7 -0
  79. package/assets/flags/bf.svg +7 -0
  80. package/assets/flags/bg.svg +5 -0
  81. package/assets/flags/bh.svg +4 -0
  82. package/assets/flags/bi.svg +15 -0
  83. package/assets/flags/bj.svg +14 -0
  84. package/assets/flags/bl.svg +5 -0
  85. package/assets/flags/bm.svg +97 -0
  86. package/assets/flags/bn.svg +36 -0
  87. package/assets/flags/bo.svg +673 -0
  88. package/assets/flags/bq.svg +5 -0
  89. package/assets/flags/br.svg +45 -0
  90. package/assets/flags/bs.svg +13 -0
  91. package/assets/flags/bt.svg +89 -0
  92. package/assets/flags/bv.svg +13 -0
  93. package/assets/flags/bw.svg +7 -0
  94. package/assets/flags/by.svg +18 -0
  95. package/assets/flags/bz.svg +145 -0
  96. package/assets/flags/ca.svg +4 -0
  97. package/assets/flags/cc.svg +19 -0
  98. package/assets/flags/cd.svg +5 -0
  99. package/assets/flags/cefta.svg +13 -0
  100. package/assets/flags/cf.svg +15 -0
  101. package/assets/flags/cg.svg +12 -0
  102. package/assets/flags/ch.svg +9 -0
  103. package/assets/flags/ci.svg +7 -0
  104. package/assets/flags/ck.svg +9 -0
  105. package/assets/flags/cl.svg +13 -0
  106. package/assets/flags/cm.svg +15 -0
  107. package/assets/flags/cn.svg +11 -0
  108. package/assets/flags/co.svg +7 -0
  109. package/assets/flags/cp.svg +7 -0
  110. package/assets/flags/cr.svg +7 -0
  111. package/assets/flags/cu.svg +13 -0
  112. package/assets/flags/cv.svg +13 -0
  113. package/assets/flags/cw.svg +14 -0
  114. package/assets/flags/cx.svg +15 -0
  115. package/assets/flags/cy.svg +6 -0
  116. package/assets/flags/cz.svg +5 -0
  117. package/assets/flags/de.svg +5 -0
  118. package/assets/flags/dg.svg +130 -0
  119. package/assets/flags/dj.svg +13 -0
  120. package/assets/flags/dk.svg +5 -0
  121. package/assets/flags/dm.svg +152 -0
  122. package/assets/flags/do.svg +121 -0
  123. package/assets/flags/dz.svg +5 -0
  124. package/assets/flags/eac.svg +48 -0
  125. package/assets/flags/ec.svg +138 -0
  126. package/assets/flags/ee.svg +5 -0
  127. package/assets/flags/eg.svg +38 -0
  128. package/assets/flags/eh.svg +16 -0
  129. package/assets/flags/er.svg +8 -0
  130. package/assets/flags/es-ct.svg +4 -0
  131. package/assets/flags/es-ga.svg +187 -0
  132. package/assets/flags/es-pv.svg +5 -0
  133. package/assets/flags/es.svg +544 -0
  134. package/assets/flags/et.svg +14 -0
  135. package/assets/flags/eu.svg +28 -0
  136. package/assets/flags/fi.svg +5 -0
  137. package/assets/flags/fj.svg +120 -0
  138. package/assets/flags/fk.svg +90 -0
  139. package/assets/flags/fm.svg +11 -0
  140. package/assets/flags/fo.svg +12 -0
  141. package/assets/flags/fr.svg +5 -0
  142. package/assets/flags/ga.svg +7 -0
  143. package/assets/flags/gb-eng.svg +5 -0
  144. package/assets/flags/gb-nir.svg +132 -0
  145. package/assets/flags/gb-sct.svg +4 -0
  146. package/assets/flags/gb-wls.svg +9 -0
  147. package/assets/flags/gb.svg +7 -0
  148. package/assets/flags/gd.svg +27 -0
  149. package/assets/flags/ge.svg +6 -0
  150. package/assets/flags/gf.svg +5 -0
  151. package/assets/flags/gg.svg +9 -0
  152. package/assets/flags/gh.svg +6 -0
  153. package/assets/flags/gi.svg +32 -0
  154. package/assets/flags/gl.svg +4 -0
  155. package/assets/flags/gm.svg +14 -0
  156. package/assets/flags/gn.svg +7 -0
  157. package/assets/flags/gp.svg +5 -0
  158. package/assets/flags/gq.svg +23 -0
  159. package/assets/flags/gr.svg +16 -0
  160. package/assets/flags/gs.svg +133 -0
  161. package/assets/flags/gt.svg +204 -0
  162. package/assets/flags/gu.svg +19 -0
  163. package/assets/flags/gw.svg +13 -0
  164. package/assets/flags/gy.svg +9 -0
  165. package/assets/flags/hk.svg +8 -0
  166. package/assets/flags/hm.svg +8 -0
  167. package/assets/flags/hn.svg +18 -0
  168. package/assets/flags/hr.svg +58 -0
  169. package/assets/flags/ht.svg +116 -0
  170. package/assets/flags/hu.svg +7 -0
  171. package/assets/flags/ic.svg +7 -0
  172. package/assets/flags/id.svg +4 -0
  173. package/assets/flags/ie.svg +7 -0
  174. package/assets/flags/il.svg +14 -0
  175. package/assets/flags/im.svg +36 -0
  176. package/assets/flags/in.svg +25 -0
  177. package/assets/flags/io.svg +130 -0
  178. package/assets/flags/iq.svg +10 -0
  179. package/assets/flags/ir.svg +219 -0
  180. package/assets/flags/is.svg +12 -0
  181. package/assets/flags/it.svg +7 -0
  182. package/assets/flags/je.svg +62 -0
  183. package/assets/flags/jm.svg +8 -0
  184. package/assets/flags/jo.svg +16 -0
  185. package/assets/flags/jp.svg +11 -0
  186. package/assets/flags/ke.svg +23 -0
  187. package/assets/flags/kg.svg +4 -0
  188. package/assets/flags/kh.svg +61 -0
  189. package/assets/flags/ki.svg +36 -0
  190. package/assets/flags/km.svg +16 -0
  191. package/assets/flags/kn.svg +14 -0
  192. package/assets/flags/kp.svg +15 -0
  193. package/assets/flags/kr.svg +24 -0
  194. package/assets/flags/kw.svg +13 -0
  195. package/assets/flags/ky.svg +103 -0
  196. package/assets/flags/kz.svg +36 -0
  197. package/assets/flags/la.svg +12 -0
  198. package/assets/flags/lb.svg +15 -0
  199. package/assets/flags/lc.svg +8 -0
  200. package/assets/flags/li.svg +43 -0
  201. package/assets/flags/lk.svg +22 -0
  202. package/assets/flags/lr.svg +14 -0
  203. package/assets/flags/ls.svg +8 -0
  204. package/assets/flags/lt.svg +7 -0
  205. package/assets/flags/lu.svg +5 -0
  206. package/assets/flags/lv.svg +6 -0
  207. package/assets/flags/ly.svg +13 -0
  208. package/assets/flags/ma.svg +4 -0
  209. package/assets/flags/mc.svg +6 -0
  210. package/assets/flags/md.svg +70 -0
  211. package/assets/flags/me.svg +116 -0
  212. package/assets/flags/mf.svg +5 -0
  213. package/assets/flags/mg.svg +7 -0
  214. package/assets/flags/mh.svg +7 -0
  215. package/assets/flags/mk.svg +5 -0
  216. package/assets/flags/ml.svg +7 -0
  217. package/assets/flags/mm.svg +12 -0
  218. package/assets/flags/mn.svg +14 -0
  219. package/assets/flags/mo.svg +9 -0
  220. package/assets/flags/mp.svg +86 -0
  221. package/assets/flags/mq.svg +5 -0
  222. package/assets/flags/mr.svg +6 -0
  223. package/assets/flags/ms.svg +29 -0
  224. package/assets/flags/mt.svg +58 -0
  225. package/assets/flags/mu.svg +8 -0
  226. package/assets/flags/mv.svg +6 -0
  227. package/assets/flags/mw.svg +10 -0
  228. package/assets/flags/mx.svg +382 -0
  229. package/assets/flags/my.svg +26 -0
  230. package/assets/flags/mz.svg +21 -0
  231. package/assets/flags/na.svg +16 -0
  232. package/assets/flags/nc.svg +13 -0
  233. package/assets/flags/ne.svg +6 -0
  234. package/assets/flags/nf.svg +9 -0
  235. package/assets/flags/ng.svg +6 -0
  236. package/assets/flags/ni.svg +129 -0
  237. package/assets/flags/nl.svg +5 -0
  238. package/assets/flags/no.svg +7 -0
  239. package/assets/flags/np.svg +13 -0
  240. package/assets/flags/nr.svg +12 -0
  241. package/assets/flags/nu.svg +10 -0
  242. package/assets/flags/nz.svg +36 -0
  243. package/assets/flags/om.svg +115 -0
  244. package/assets/flags/pa.svg +14 -0
  245. package/assets/flags/pc.svg +33 -0
  246. package/assets/flags/pe.svg +4 -0
  247. package/assets/flags/pf.svg +19 -0
  248. package/assets/flags/pg.svg +9 -0
  249. package/assets/flags/ph.svg +6 -0
  250. package/assets/flags/pk.svg +15 -0
  251. package/assets/flags/pl.svg +6 -0
  252. package/assets/flags/pm.svg +5 -0
  253. package/assets/flags/pn.svg +53 -0
  254. package/assets/flags/pr.svg +13 -0
  255. package/assets/flags/ps.svg +6 -0
  256. package/assets/flags/pt.svg +57 -0
  257. package/assets/flags/pw.svg +11 -0
  258. package/assets/flags/py.svg +157 -0
  259. package/assets/flags/qa.svg +4 -0
  260. package/assets/flags/re.svg +5 -0
  261. package/assets/flags/ro.svg +7 -0
  262. package/assets/flags/rs.svg +292 -0
  263. package/assets/flags/ru.svg +5 -0
  264. package/assets/flags/rw.svg +13 -0
  265. package/assets/flags/sa.svg +25 -0
  266. package/assets/flags/sb.svg +13 -0
  267. package/assets/flags/sc.svg +7 -0
  268. package/assets/flags/sd.svg +13 -0
  269. package/assets/flags/se.svg +4 -0
  270. package/assets/flags/sg.svg +13 -0
  271. package/assets/flags/sh-ac.svg +689 -0
  272. package/assets/flags/sh-hl.svg +164 -0
  273. package/assets/flags/sh-ta.svg +76 -0
  274. package/assets/flags/sh.svg +7 -0
  275. package/assets/flags/si.svg +18 -0
  276. package/assets/flags/sj.svg +7 -0
  277. package/assets/flags/sk.svg +9 -0
  278. package/assets/flags/sl.svg +7 -0
  279. package/assets/flags/sm.svg +75 -0
  280. package/assets/flags/sn.svg +8 -0
  281. package/assets/flags/so.svg +11 -0
  282. package/assets/flags/sr.svg +6 -0
  283. package/assets/flags/ss.svg +8 -0
  284. package/assets/flags/st.svg +16 -0
  285. package/assets/flags/sv.svg +593 -0
  286. package/assets/flags/sx.svg +56 -0
  287. package/assets/flags/sy.svg +6 -0
  288. package/assets/flags/sz.svg +34 -0
  289. package/assets/flags/tc.svg +50 -0
  290. package/assets/flags/td.svg +7 -0
  291. package/assets/flags/tf.svg +15 -0
  292. package/assets/flags/tg.svg +14 -0
  293. package/assets/flags/th.svg +7 -0
  294. package/assets/flags/tj.svg +22 -0
  295. package/assets/flags/tk.svg +5 -0
  296. package/assets/flags/tl.svg +13 -0
  297. package/assets/flags/tm.svg +204 -0
  298. package/assets/flags/tn.svg +4 -0
  299. package/assets/flags/to.svg +10 -0
  300. package/assets/flags/tr.svg +8 -0
  301. package/assets/flags/tt.svg +5 -0
  302. package/assets/flags/tv.svg +9 -0
  303. package/assets/flags/tw.svg +34 -0
  304. package/assets/flags/tz.svg +13 -0
  305. package/assets/flags/ua.svg +6 -0
  306. package/assets/flags/ug.svg +30 -0
  307. package/assets/flags/um.svg +9 -0
  308. package/assets/flags/un.svg +16 -0
  309. package/assets/flags/us.svg +9 -0
  310. package/assets/flags/uy.svg +28 -0
  311. package/assets/flags/uz.svg +30 -0
  312. package/assets/flags/va.svg +190 -0
  313. package/assets/flags/vc.svg +8 -0
  314. package/assets/flags/ve.svg +26 -0
  315. package/assets/flags/vg.svg +59 -0
  316. package/assets/flags/vi.svg +28 -0
  317. package/assets/flags/vn.svg +11 -0
  318. package/assets/flags/vu.svg +21 -0
  319. package/assets/flags/wf.svg +5 -0
  320. package/assets/flags/ws.svg +7 -0
  321. package/assets/flags/xk.svg +5 -0
  322. package/assets/flags/xx.svg +4 -0
  323. package/assets/flags/ye.svg +7 -0
  324. package/assets/flags/yt.svg +5 -0
  325. package/assets/flags/za.svg +17 -0
  326. package/assets/flags/zm.svg +27 -0
  327. package/assets/flags/zw.svg +21 -0
  328. package/components/COMPONENTS.md +80 -80
  329. package/components/ln-api-connector/ln-api-connector.schema.json +105 -105
  330. package/components/ln-chart/ln-chart-dev.scss +0 -4
  331. package/components/ln-core/README.md +21 -21
  332. package/components/ln-core/ln-core.schema.json +120 -120
  333. package/components/ln-core/query.js +113 -113
  334. package/components/ln-data-coordinator/README.md +2 -0
  335. package/components/ln-data-coordinator/ln-data-coordinator.js +1 -1
  336. package/components/ln-data-coordinator/ln-data-coordinator.schema.json +196 -196
  337. package/components/ln-data-coordinator/src/ln-data-coordinator.js +457 -432
  338. package/components/ln-data-store/ln-data-store.schema.json +92 -92
  339. package/components/ln-date/ln-date.js +1 -1
  340. package/components/ln-date/src/ln-date.js +1 -1
  341. package/components/ln-debug/ln-debug.js +1 -1
  342. package/components/ln-debug/ln-debug.schema.json +28 -28
  343. package/components/ln-debug/src/generated-attributes.js +4 -0
  344. package/components/ln-dropdown/ln-dropdown.schema.json +90 -90
  345. package/components/ln-external-links/README.md +19 -19
  346. package/components/ln-external-links/ln-external-links.js +1 -1
  347. package/components/ln-external-links/ln-external-links.schema.json +9 -0
  348. package/components/ln-external-links/ln-external-links.scss +12 -0
  349. package/components/ln-external-links/src/ln-external-links.js +3 -2
  350. package/components/ln-filter/README.md +2 -1
  351. package/components/ln-filter/ln-filter.js +1 -1
  352. package/components/ln-filter/ln-filter.schema.json +157 -169
  353. package/components/ln-filter/src/ln-filter.js +1 -3
  354. package/components/ln-form/ln-form.schema.json +57 -57
  355. package/components/ln-key/ln-key.js +1 -1
  356. package/components/ln-key/ln-key.schema.json +8 -0
  357. package/components/ln-key/src/ln-key.js +8 -5
  358. package/components/ln-obfuscator/ln-obfuscator.js +1 -1
  359. package/components/ln-obfuscator/ln-obfuscator.schema.json +6 -0
  360. package/components/ln-obfuscator/src/ln-obfuscator.js +2 -2
  361. package/components/ln-options/ln-options.schema.json +47 -47
  362. package/components/ln-popover/ln-popover.schema.json +82 -82
  363. package/components/ln-progress/ln-progress.schema.json +0 -13
  364. package/components/ln-search/ln-search.schema.json +111 -111
  365. package/components/ln-sort/README.md +1 -0
  366. package/components/ln-sort/ln-sort.js +1 -1
  367. package/components/ln-sort/ln-sort.schema.json +100 -112
  368. package/components/ln-sort/src/sort-model.js +1 -6
  369. package/components/ln-sortable/ln-sortable.schema.json +38 -38
  370. package/components/ln-sortable/ln-sortable.scss +25 -25
  371. package/components/ln-table/README.md +8 -1
  372. package/components/ln-table/ln-table.js +1 -1
  373. package/components/ln-table/ln-table.schema.json +195 -195
  374. package/components/ln-table/src/ln-table.js +43 -7
  375. package/components/ln-table-coordinator/ln-table-coordinator.js +1 -1
  376. package/components/ln-table-coordinator/ln-table-coordinator.schema.json +18 -0
  377. package/components/ln-table-coordinator/src/ln-table-coordinator.js +104 -2
  378. package/components/ln-toast/README.md +1 -1
  379. package/components/ln-toast/ln-toast.js +1 -1
  380. package/components/ln-toast/ln-toast.schema.json +6 -0
  381. package/components/ln-toast/src/ln-toast.js +1 -1
  382. package/components/ln-translations/README.md +202 -120
  383. package/components/ln-translations/ln-translations.js +1 -1
  384. package/components/ln-translations/ln-translations.schema.json +136 -120
  385. package/components/ln-translations/src/ln-translations.js +354 -295
  386. package/components/ln-translations/src/translations-model.js +221 -0
  387. package/components/ln-validate/README.md +6 -6
  388. package/components/ln-validate/ln-validate-dev.scss +0 -5
  389. package/components/ln-validate/ln-validate.js +1 -1
  390. package/components/ln-validate/ln-validate.schema.json +0 -6
  391. package/components/ln-validate/src/ln-validate.js +48 -29
  392. package/ln-ashlar.html-data.json +26 -8
  393. package/package.json +3 -2
  394. package/theme/README.md +7 -6
  395. package/theme/base/_global.scss +2 -2
  396. package/theme/base/_reset.scss +11 -0
  397. package/theme/components/_app-shell.scss +0 -8
  398. package/theme/components/_form.scss +6 -6
  399. package/theme/components/_ln-table.scss +6 -3
  400. package/theme/components/_scrollbar.scss +5 -4
  401. package/theme/components/_sortable.scss +19 -19
  402. package/theme/components/_stat-card.scss +1 -0
  403. package/theme/components/_table.scss +10 -33
  404. package/theme/components/_translations.scss +118 -111
  405. package/theme/config/_density.scss +236 -104
  406. package/theme/config/_palette.scss +71 -49
  407. package/theme/config/_theme.scss +27 -31
  408. package/theme/config/_tokens.scss +28 -26
  409. package/theme/config/mixins/_app-shell.scss +31 -21
  410. package/theme/config/mixins/_btn.scss +4 -2
  411. package/theme/config/mixins/_card.scss +87 -67
  412. package/theme/config/mixins/_colors.scss +2 -1
  413. package/theme/config/mixins/_count.scss +48 -0
  414. package/theme/config/mixins/_display.scss +12 -0
  415. package/theme/config/mixins/_footer.scss +3 -1
  416. package/theme/config/mixins/_form.scss +48 -16
  417. package/theme/config/mixins/_index.scss +1 -0
  418. package/theme/config/mixins/_layout.scss +9 -0
  419. package/theme/config/mixins/_ln-table.scss +22 -15
  420. package/theme/config/mixins/_modal.scss +3 -0
  421. package/theme/config/mixins/_nav.scss +19 -4
  422. package/theme/config/mixins/_sidebar.scss +2 -1
  423. package/theme/config/mixins/_stat-card.scss +33 -2
  424. package/theme/config/mixins/_status-badge.scss +1 -0
  425. package/theme/config/mixins/_table.scss +81 -39
  426. package/theme/config/mixins/_tabs.scss +31 -0
  427. package/theme/config/mixins/_toast.scss +0 -1
  428. package/theme/config/mixins/_translations.scss +126 -124
  429. package/theme/designs/relaxed/_card.scss +12 -0
  430. package/theme/designs/relaxed/_layout.scss +24 -0
  431. package/theme/ln-ashlar-core.scss +1 -0
  432. package/theme/ln-ashlar-dev.scss +0 -1
  433. package/theme/ln-ashlar-relaxed.scss +67 -0
  434. package/theme/tailwind/components.css +561 -24
  435. package/theme/utilities/_utilities.scss +1 -11
  436. package/web-types.json +38 -10
  437. package/components/ln-progress/ln-progress-dev.scss +0 -8
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Pure domain model and deterministic algorithms for ln-translations.
3
+ * Zero DOM dependencies — safe for headless testing and pure functional execution.
4
+ */
5
+
6
+ /**
7
+ * Standard ISO 639-1 language code to ISO 3166-1 alpha-2 country flag overrides.
8
+ * Non-overridden codes default to the language code itself.
9
+ */
10
+ export const LANG_FLAG_OVERRIDES = {
11
+ en: 'gb',
12
+ sq: 'al',
13
+ sr: 'rs',
14
+ ja: 'jp',
15
+ ko: 'kr',
16
+ zh: 'cn',
17
+ cs: 'cz',
18
+ da: 'dk',
19
+ el: 'gr',
20
+ he: 'il',
21
+ hi: 'in',
22
+ uk: 'ua',
23
+ vi: 'vn',
24
+ sv: 'se',
25
+ nb: 'no',
26
+ nn: 'no',
27
+ ca: 'es',
28
+ eu: 'es',
29
+ gl: 'es',
30
+ fa: 'ir',
31
+ ar: 'sa',
32
+ ms: 'my',
33
+ sl: 'si',
34
+ et: 'ee',
35
+ ka: 'ge',
36
+ hy: 'am',
37
+ be: 'by',
38
+ bs: 'ba',
39
+ hr: 'hr',
40
+ ga: 'ie',
41
+ cy: 'gb',
42
+ sw: 'ke',
43
+ bn: 'bd',
44
+ ur: 'pk',
45
+ ta: 'lk',
46
+ te: 'in',
47
+ ml: 'in',
48
+ kn: 'in',
49
+ mr: 'in',
50
+ gu: 'in',
51
+ pa: 'in',
52
+ ne: 'np',
53
+ km: 'kh',
54
+ lo: 'la',
55
+ my: 'mm',
56
+ af: 'za',
57
+ zu: 'za'
58
+ };
59
+
60
+ /**
61
+ * Generates the deterministic input name for a translatable field.
62
+ *
63
+ * @param {string} field - Field identifier (e.g. 'title', 'scope')
64
+ * @param {string} lang - Language code (e.g. 'en', 'sq')
65
+ * @param {string} [prefix=''] - Optional nested prefix (e.g. 'items[1]', 'company')
66
+ * @returns {string} - Generated nested name
67
+ */
68
+ export function buildFieldName(field, lang, prefix = '') {
69
+ if (!field || !lang) return '';
70
+ if (prefix) {
71
+ return `${prefix}[trans][${lang}][${field}]`;
72
+ }
73
+ return `trans[${lang}][${field}]`;
74
+ }
75
+
76
+ /**
77
+ * Parses a structured field name back into its components.
78
+ *
79
+ * @param {string} name - Field name attribute
80
+ * @returns {{ prefix: string, lang: string, field: string } | null}
81
+ */
82
+ export function parseFieldName(name) {
83
+ if (!name || typeof name !== 'string') return null;
84
+
85
+ // Pattern 1: With prefix: prefix[trans][lang][field]
86
+ const prefixMatch = name.match(/^(.*)\[trans\]\[([^\]]+)\]\[([^\]]+)\]$/);
87
+ if (prefixMatch) {
88
+ return {
89
+ prefix: prefixMatch[1],
90
+ lang: prefixMatch[2],
91
+ field: prefixMatch[3]
92
+ };
93
+ }
94
+
95
+ // Pattern 2: Without prefix: trans[lang][field]
96
+ const simpleMatch = name.match(/^trans\[([^\]]+)\]\[([^\]]+)\]$/);
97
+ if (simpleMatch) {
98
+ return {
99
+ prefix: '',
100
+ lang: simpleMatch[1],
101
+ field: simpleMatch[2]
102
+ };
103
+ }
104
+
105
+ return null;
106
+ }
107
+
108
+ /**
109
+ * Safely interpolates {lang} placeholder pattern with language display name.
110
+ *
111
+ * @param {string} pattern - Template pattern containing '{lang}'
112
+ * @param {string} langName - Display name of language
113
+ * @returns {string}
114
+ */
115
+ export function formatPlaceholder(pattern, langName) {
116
+ const template = pattern || '{lang} translation';
117
+ return template.replaceAll('{lang}', langName || '');
118
+ }
119
+
120
+ /**
121
+ * Safely interpolates {lang} remove-label pattern with language display name.
122
+ *
123
+ * @param {string} pattern - Template pattern containing '{lang}'
124
+ * @param {string} langName - Display name of language
125
+ * @returns {string}
126
+ */
127
+ export function formatRemoveLabel(pattern, langName) {
128
+ const template = pattern || 'Remove {lang}';
129
+ return template.replaceAll('{lang}', langName || '');
130
+ }
131
+
132
+ /**
133
+ * Safely parses locales JSON or returns fallback locales.
134
+ *
135
+ * @param {string|object|null} raw - Raw input JSON or object
136
+ * @param {object} [fallback={}] - Fallback locales map (defaults to empty object)
137
+ * @returns {Record<string, string>}
138
+ */
139
+ export function parseLocales(raw, fallback = {}) {
140
+ if (!raw) return { ...fallback };
141
+ if (typeof raw === 'object' && raw !== null && !Array.isArray(raw)) {
142
+ return { ...raw };
143
+ }
144
+ if (typeof raw === 'string') {
145
+ try {
146
+ const parsed = JSON.parse(raw);
147
+ if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
148
+ return parsed;
149
+ }
150
+ } catch {
151
+ // Malformed JSON falls back cleanly
152
+ }
153
+ }
154
+ return { ...fallback };
155
+ }
156
+
157
+ /**
158
+ * Resolves the display name for a language code.
159
+ *
160
+ * @param {string} lang - Language code (e.g. 'en', 'sq', 'mk')
161
+ * @param {Record<string, string>} [locales={}] - Configured locales dictionary
162
+ * @param {string} [userLocale=''] - Optional document or user locale
163
+ * @returns {string} - Localized display name or uppercase code
164
+ */
165
+ export function resolveLanguageName(lang, locales = {}, userLocale = '') {
166
+ if (!lang) return '';
167
+ if (locales && locales[lang]) {
168
+ return locales[lang];
169
+ }
170
+
171
+ // Try browser Intl.DisplayNames if available
172
+ if (typeof Intl !== 'undefined' && typeof Intl.DisplayNames === 'function') {
173
+ try {
174
+ const displayNames = new Intl.DisplayNames(userLocale ? [userLocale] : undefined, {
175
+ type: 'language',
176
+ fallback: 'none'
177
+ });
178
+ const resolved = displayNames.of(lang);
179
+ if (resolved) return resolved;
180
+ } catch {
181
+ // Ignore unsupported locale / fallback
182
+ }
183
+ }
184
+
185
+ return lang;
186
+ }
187
+
188
+ /**
189
+ * Filters out active languages and default language from the full locales map.
190
+ *
191
+ * @param {Record<string, string>} locales - Full locales dictionary
192
+ * @param {Set<string>|string[]} activeLanguages - Active language codes
193
+ * @param {string} [defaultLang=''] - Primary default language code to exclude
194
+ * @returns {Array<[string, string]>} Array of [langCode, displayName] pairs
195
+ */
196
+ export function filterAvailableLocales(locales, activeLanguages, defaultLang = '') {
197
+ if (!locales || typeof locales !== 'object') return [];
198
+ const activeSet = activeLanguages instanceof Set ? activeLanguages : new Set(activeLanguages || []);
199
+ const normalizedDefault = (defaultLang || '').toLowerCase().trim();
200
+
201
+ const available = [];
202
+ for (const [code, name] of Object.entries(locales)) {
203
+ const normalizedCode = code.toLowerCase().trim();
204
+ if (!activeSet.has(code) && !activeSet.has(normalizedCode) && (!normalizedDefault || normalizedCode !== normalizedDefault)) {
205
+ available.push([code, name]);
206
+ }
207
+ }
208
+ return available;
209
+ }
210
+
211
+ /**
212
+ * Resolves ISO 3166-1 alpha-2 country code for flag lookup.
213
+ *
214
+ * @param {string} lang - ISO 639-1 language code
215
+ * @returns {string} - Country code for SVG flag
216
+ */
217
+ export function getCountryForLanguage(lang) {
218
+ if (!lang) return '';
219
+ const clean = lang.toLowerCase().trim();
220
+ return LANG_FLAG_OVERRIDES[clean] || clean;
221
+ }
@@ -1,6 +1,6 @@
1
1
  # ln-validate
2
2
 
3
- > Applied to form controls (`<input data-ln-validate>`, `<select>`, `<textarea>`) inside a `.form-element` wrapper.
3
+ > Applied to form controls (`<input data-ln-validate>`, `<select>`, `<textarea>`); messages are read from the nearest ancestor that directly contains `[data-ln-validate-errors]`, and the list is optional.
4
4
  > On initialization, it injects `novalidate` on the parent `<form>` and intercepts the form `submit` event.
5
5
  > On field `blur` or `input` (after touched), it checks native `input.validity`, toggles the `.hidden` class on matching
6
6
  > `[data-ln-validate-error="rule"]` elements, and sets `aria-invalid`; on submit with errors, it calls `e.preventDefault()` and focuses the first invalid field.
@@ -49,7 +49,7 @@
49
49
  ```
50
50
 
51
51
  > [!IMPORTANT]
52
- > The surrounding wrapper **must** carry the class `.form-element` for the sibling error lookup to succeed.
52
+ > The surrounding wrapper does not require any specific CSS class — `ln-validate` reads from the nearest ancestor that directly contains `[data-ln-validate-errors]`.
53
53
 
54
54
  ---
55
55
 
@@ -120,7 +120,7 @@ input.lnValidate.destroy();
120
120
 
121
121
  ## ⚠️ Common Pitfalls
122
122
 
123
- - **Skipping the `.form-element` wrapper:** `ln-validate` locates sibling error elements relative to the closest `.form-element` ancestor. If you omit the wrapper class, no error lists will be toggled.
123
+ - **Error list placement:** `ln-validate` locates sibling error elements relative to the nearest ancestor that directly contains `[data-ln-validate-errors]`. If you place `[data-ln-validate-errors]` outside that ancestor, no error lists will be toggled.
124
124
  - **Relying on Native browser CSS (`:invalid`):** The browser applies `:invalid` to empty required fields on page load. **Always** use our custom classes `.ln-validate-valid` and `.ln-validate-invalid` for visual borders and focus states.
125
125
  - **Injecting custom errors without validating:** Dispatching `ln-validate:set-custom` updates visual classes, but it **does not** bubble an `:invalid` event. If you need form-level coordinators (`ln-form`) to react immediately, call `input.lnValidate.validate()` right after injecting.
126
126
  - **Expecting `novalidate` in your own markup:** Don't write it by hand
@@ -136,7 +136,7 @@ Source: `components/ln-validate/ln-validate.js` (~160 lines). Imports only `disp
136
136
 
137
137
  ### State & Constructor Initialization
138
138
 
139
- Three fields per instance (`dom.lnValidate`): `dom`, `_touched` (bool), `_customErrors` (Set). No cached error-`<li>` array, no cached `.form-element` ancestor reference, no debounce — every `validate()` call re-queries `parent.querySelectorAll` and recomputes from `dom.checkValidity()`. Cheap because the query is scoped to one field's wrapper and validity checks are microsecond-fast.
139
+ Internal instance state (`dom.lnValidate`): `dom`, `_touched` (bool), `_customErrors` (Set), and lazily cached `_errorItems`. No debounce — every `validate()` call checks `dom.validity` and updates matching error elements. Scoped to the field's wrapper and validity checks are microsecond-fast.
140
140
 
141
141
  **Initial Value Instantiation Check:** Upon component construction, if an input field already contains a non-empty value (`dom.value` is non-empty or `dom.checked`), `ln-validate` immediately marks `_touched = true` and invokes `this.validate()` to synchronize its visual state and error elements in the DOM without requiring initial user interaction. Pristine empty fields remain `_touched = false`.
142
142
 
@@ -147,9 +147,9 @@ Three fields per instance (`dom.lnValidate`): `dom`, `_touched` (bool), `_custom
147
147
  ### `validate()` flow
148
148
 
149
149
  1. `nativeValid = dom.checkValidity()`; `isValid = nativeValid && _customErrors.size === 0`.
150
- 2. Walks the field's `.form-element`'s `[data-ln-validate-error]` `<li>`s; keys present in `ERROR_MAP` (`required`/`typeMismatch`/`tooShort`/`tooLong`/`patternMismatch`/`rangeUnderflow`/`rangeOverflow`) toggle `hidden` off `validity[prop]`; keys NOT in the map are skipped — that's the mechanism that lets native and custom errors share one `<ul>` without conflict.
150
+ 2. Walks the field ancestor's `[data-ln-validate-error]` `<li>`s; keys present in `ERROR_MAP` (`required`/`typeMismatch`/`tooShort`/`tooLong`/`patternMismatch`/`rangeUnderflow`/`rangeOverflow`) toggle `hidden` off `validity[prop]`; keys NOT in the map are skipped — that's the mechanism that lets native and custom errors share one `<ul>` without conflict.
151
151
  3. Toggles `.ln-validate-valid`/`.ln-validate-invalid`, dispatches `:valid`/`:invalid` `{ target, field: dom.name }`.
152
- 4. If the field has no `.form-element` ancestor, error rendering is skipped but the class toggle and dispatch still run.
152
+ 4. If the field has no ancestor containing `[data-ln-validate-errors]`, error rendering is skipped but the class toggle and dispatch still run.
153
153
 
154
154
  `validate()` never reads `_touched` — it always renders. `_touched` instead gates whether the *listener handlers* call it, so the submit gate can force-validate an untouched field on demand.
155
155
 
@@ -7,9 +7,4 @@
7
7
  textarea[data-ln-validate]:not([id]) {
8
8
  @include dev-inline-error("data-ln-validate element is missing required 'id' attribute");
9
9
  }
10
-
11
- // 2. Validation Nesting check: data-ln-validate must be wrapped inside .form-element or data-ln-form
12
- [data-ln-validate]:not(.form-element [data-ln-validate]):not([data-ln-form] [data-ln-validate]) {
13
- @include dev-dom-error("data-ln-validate must be a child of .form-element or data-ln-form wrapper");
14
- }
15
10
  }
@@ -1 +1 @@
1
- (function(){"use strict";function N(){if(typeof window>"u")return!1;if(window.lnDebug===!0||window.lnCore&&window.lnCore._debugSink)return!0;if(typeof document<"u"){if(document.documentElement&&document.documentElement.hasAttribute("data-ln-debug"))return!0;if(document.body)return document.body.hasAttribute("data-ln-debug")||document.body.querySelector("[data-ln-debug]")!==null}return!1}function S(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 t=e.closest("[data-ln-debug]");return!(!t||typeof document<"u"&&t===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(...t){if(typeof t[0]=="string"&&(t[0].startsWith("[ln-")||t[0].startsWith("[lnCore"))){let o=null;for(let i=1;i<t.length;i++)if(t[i]&&t[i].nodeType===1){o=t[i];break}if(!S(o))return}e.apply(console,t)}}function L(e,t,r){const o=r||{};window.lnCore._debugSink&&window.lnCore._debugSink("event",t,e,o),e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:o}))}function _(e,t){if(!document.body){document.addEventListener("DOMContentLoaded",function(){_(e,t)}),console.warn("["+t+'] Script loaded before <body> — add "defer" to your <script> tag');return}e()}function ie(e){const t=e.querySelector('input[name="_method"]');return((t&&t.value!==""?t.value:e.method)||"").toUpperCase()}function le(e,t){const r=!!(t&&t.typed),o=t&&t.exclude,i={},s=e.elements,l={};if(r)for(let a=0;a<s.length;a++){const n=s[a];n.name&&n.type==="checkbox"&&!n.disabled&&(l[n.name]=(l[n.name]||0)+1)}for(let a=0;a<s.length;a++){const n=s[a];if(!(!n.name||n.disabled||n.type==="file"||n.type==="submit"||n.type==="button")&&!(o&&n.matches&&n.matches(o)))if(n.type==="checkbox")r&&l[n.name]===1?i[n.name]=n.checked:(i[n.name]||(i[n.name]=[]),n.checked&&i[n.name].push(n.value));else if(n.type==="radio")n.checked&&(i[n.name]=n.value);else if(n.type==="select-multiple"){i[n.name]=[];for(let c=0;c<n.options.length;c++)n.options[c].selected&&i[n.name].push(n.options[c].value)}else if(r&&n.type==="hidden")i[n.name]=n.value;else if(r&&(n.type==="number"||n.type==="range")){const c=Number(n.value);i[n.name]=n.value===""||isNaN(c)?null:c}else i[n.name]=n.value}return i}function se(e){if(typeof e!="string")return!!e;const t=e.trim().toLowerCase();return t!=="false"&&t!=="0"&&t!==""&&t!=="off"&&t!=="no"}function ae(e,t){const r=e.elements,o=[],i={};for(let s=0;s<r.length;s++){const l=r[s];l.name&&l.type==="checkbox"&&(i[l.name]=(i[l.name]||0)+1)}for(let s=0;s<r.length;s++){const l=r[s];if(l.type==="file"||l.type==="submit"||l.type==="button")continue;const a=l.getAttribute("data-ln-fill-as")||l.name;if(!a||!(a in t))continue;const n=t[a];if(l.type==="checkbox"){if(Array.isArray(n))l.checked=n.indexOf(l.value)!==-1;else if(i[l.name]>1){const c=String(n).split(",").map(function(d){return d.trim()});l.checked=c.indexOf(l.value)!==-1}else l.checked=se(n);o.push(l)}else if(l.type==="radio")l.checked=l.value===String(n),o.push(l);else if(l.type==="select-multiple"){if(Array.isArray(n))for(let c=0;c<l.options.length;c++)l.options[c].selected=n.indexOf(l.options[c].value)!==-1;o.push(l)}else l.value=n,l.tagName==="SELECT"&&n!=null&&l.setAttribute("data-ln-value",n),o.push(l)}return o}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.populateForm=ae,window.lnCore.serializeForm=le,window.lnCore.resolveFormMethod=ie);const M={};function ce(e,t){M[e]=t}function de(e){return M[e]||{ingress:t=>t,egress:t=>t}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerDataMapper=ce,window.lnCore.getDataMapper=de);function ue(){typeof window>"u"||(window.lnCore=window.lnCore||{},!window.lnCore._localeObserverBound&&(window.lnCore._localeObserverBound=!0,_(function(){new MutationObserver(function(){L(document,"ln-core:locale-change",{})}).observe(document.documentElement,{attributes:!0,attributeFilter:["lang"],subtree:!0})},"ln-core")))}const $={};function fe(e,t){if(!e||typeof t!="object")return;const r=e.toLowerCase().split("-")[0];$[r]=t}function we(e){if(!e)return null;const t=e.toLowerCase().split("-")[0];return $[t]||null}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerLocaleFallback=fe,window.lnCore.getLocaleFallback=we,window.lnCore.ensureLocaleObserver=ue);const E={};function he(e,t){E[e]||(E[e]=document.querySelector('[data-ln-template="'+e+'"]'));const r=E[e];return r?r.content.cloneNode(!0):(console.warn("["+(t||"ln-core")+'] Template "'+e+'" not found'),null)}function B(e,t){if(!e||!t)return e;const r=e.querySelectorAll("[data-ln-field]");for(let l=0;l<r.length;l++){const a=r[l],n=a.getAttribute("data-ln-field");t[n]!=null&&(a.textContent=t[n])}const o=e.querySelectorAll("[data-ln-attr]");for(let l=0;l<o.length;l++){const a=o[l],n=a.getAttribute("data-ln-attr").split(",");for(let c=0;c<n.length;c++){const d=n[c].trim().split(":");if(d.length!==2)continue;const u=d[0].trim(),p=d[1].trim();t[p]!=null&&a.setAttribute(u,t[p])}}const i=e.querySelectorAll("[data-ln-show]");for(let l=0;l<i.length;l++){const a=i[l],n=a.getAttribute("data-ln-show");n in t&&a.classList.toggle("hidden",!t[n])}const s=e.querySelectorAll("[data-ln-class]");for(let l=0;l<s.length;l++){const a=s[l],n=a.getAttribute("data-ln-class").split(",");for(let c=0;c<n.length;c++){const d=n[c].trim().split(":");if(d.length!==2)continue;const u=d[0].trim(),p=d[1].trim();p in t&&a.classList.toggle(u,!!t[p])}}return e}function pe(e,t){e.matches&&e.matches("[data-ln-form], [data-ln-fillable]")&&(window.lnCore._debugSink&&window.lnCore._debugSink("event","ln-fill",e,t??null),e.dispatchEvent(new CustomEvent("ln-fill",{detail:t??null,bubbles:!0})));const r=e.querySelectorAll("[data-ln-form], [data-ln-fillable]");for(let o=0;o<r.length;o++)window.lnCore._debugSink&&window.lnCore._debugSink("event","ln-fill",r[o],t??null),r[o].dispatchEvent(new CustomEvent("ln-fill",{detail:t??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)B(e.target,e.detail);else{const t=e.target.querySelectorAll("[data-ln-field]");for(let r=0;r<t.length;r++)t[r].textContent=""}})));function V(e,t){if(!e||!t)return e;const r=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);for(;r.nextNode();){const s=r.currentNode;s.textContent.indexOf("{{")!==-1&&(s.textContent=s.textContent.replace(/\{\{\s*(\w+)\s*\}\}/g,function(l,a){return t[a]!==void 0?t[a]:""}))}const o=function(s,l){return t[l]!==void 0?t[l]:""},i=Array.from(e.querySelectorAll("*"));e.nodeType===1&&i.push(e);for(let s=0;s<i.length;s++){const l=i[s],a=l.attributes;for(let n=0;n<a.length;n++){const c=a[n];c.value.indexOf("{{")!==-1&&l.setAttribute(c.name,c.value.replace(/\{\{\s*(\w+)\s*\}\}/g,o))}}return e}function be(e,t,r,o,i,s){const l={};for(let n=0;n<e.children.length;n++){const c=e.children[n],d=c.getAttribute("data-ln-render-key");d&&(l[d]=c)}const a=document.createDocumentFragment();for(let n=0;n<t.length;n++){const c=t[n],d=String(o(c));let u=l[d];if(u)i(u,c,n);else{const p=he(r,s);if(!p||(V(p,c),u=p.firstElementChild,!u))continue;u.setAttribute("data-ln-render-key",d),i(u,c,n)}a.appendChild(u)}e.textContent="",e.appendChild(a)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.fillTemplate=V,window.lnCore.fill=B,window.lnCore.lnFill=pe,window.lnCore.renderList=be);function x(e,t,r){const o=e.getAttribute(t);return o===null?r:o}function j(e,t,r){const o=parseInt(e.getAttribute(t),10);return isNaN(o)?r:o}function U(e,t,r=!1){const o=e.getAttribute(t);if(o===null)return!!r;const i=o.trim().toLowerCase();return!(i==="false"||i==="0")}function W(e,t){return(e.getAttribute(t)||"").split(",").map(r=>r.trim()).filter(Boolean)}const k=new Map;function H(e,t){const r=(e?e.join("|"):"")+"::"+t;if(k.has(r))return k.get(r);const o=new Set(e||[]),i=function(s,l){const a=s.getAttribute(l);return a!==null&&o.has(a)?a:t};return k.set(r,i),i}function P(e,t,r){const o=parseFloat(e.getAttribute(t));return isNaN(o)?r:o}function K(e,t,r){const o=e.getAttribute(t);if(!o)return r;try{return JSON.parse(o)}catch{return r}}function Q(e,t,r,o,i){if(!e||t===null)return!0;const s=o||"ln-component",l=e.type;if(l==="trigger"||l==="marker"||l==="string"||l==="list"||!l||t===""&&e.fallback!==void 0)return!0;const a=n=>{i?console.warn(n,i):console.warn(n)};if(l==="boolean"){const n=t.trim().toLowerCase();return n!==""&&n!=="true"&&n!=="false"&&n!=="1"&&n!=="0"?(a(`[${s}] Invalid value "${t}" for boolean attribute "${r}". Allowed: "true", "false", or presence-only.`),!1):!0}if(l==="enum"){const n=e.values||[];return n.includes(t)?!0:(a(`[${s}] Invalid value "${t}" for attribute "${r}". Allowed: ${n.join(", ")}. Fallback: "${e.fallback}".`),!1)}if(l==="integer"){if(!/^-?\d+$/.test(t))return a(`[${s}] Invalid integer "${t}" for attribute "${r}". Fallback: ${e.fallback}.`),!1;const n=parseInt(t,10);return e.min!==void 0&&n<e.min?(a(`[${s}] Value ${n} for attribute "${r}" is less than min (${e.min}).`),!1):e.max!==void 0&&n>e.max?(a(`[${s}] Value ${n} for attribute "${r}" is greater than max (${e.max}).`),!1):!0}if(l==="float")return isNaN(Number(t))?(a(`[${s}] Invalid float "${t}" for attribute "${r}". Fallback: ${e.fallback}.`),!1):!0;if(l==="json")try{return JSON.parse(t),!0}catch(n){return a(`[${s}] Invalid JSON for attribute "${r}": ${n.message}. Fallback: ${e.fallback}.`),!1}return!0}function me(e,t,r){for(const o in r){const[i,s,l]=r[o];Object.defineProperty(e,o,{get:function(){return i(t,s,l)},enumerable:!0,configurable:!0})}return e}function ge(e){const t={};for(const r in e){const o=e[r];if(!o||!o.prop)continue;let i=o.read;if(!i&&o.type)switch(o.type){case"enum":i=H(o.values,o.fallback);break;case"integer":i=j;break;case"float":i=P;break;case"boolean":i=U;break;case"list":i=W;break;case"json":i=K;break;case"string":default:i=x;break}i||(i=x),t[o.prop]=[i,r,o.fallback]}return t}function ye(e){const t={};for(const r in e){const o=e[r];o&&o.effect&&(t[r]=o.effect)}return Object.keys(t).length?t:null}function Ce(e){if(e.onAttrChange&&!e.declared)return null;const t=new Set;if(e.effects)for(const r in e.effects)t.add(r);if(e.onAttrChange&&e.declared)for(const r of e.declared)t.add(r);return t}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.defineAttrs=me,window.lnCore.attrSpec=ge,window.lnCore.attrStr=x,window.lnCore.attrInt=j,window.lnCore.attrBool=U,window.lnCore.attrList=W,window.lnCore.attrEnum=H,window.lnCore.attrFloat=P,window.lnCore.attrJson=K);function A(e,t){if(!e[t.attribute]){window.lnCore._persistSink&&e.hasAttribute&&e.hasAttribute("data-ln-persist")&&window.lnCore._persistSink(e,t.selector);try{e[t.attribute]=new t.ComponentFn(e)}catch(r){console.error("["+t.attribute+"] init failed",e,r)}}}function G(e,t,r,o){if(e.nodeType!==1)return;const s=t.indexOf("[")!==-1||t.indexOf(".")!==-1||t.indexOf("#")!==-1?t:"["+t+"]",l={selector:t,attribute:r,ComponentFn:o};if(e.matches&&e.matches(s)&&A(e,l),e.querySelectorAll){const a=e.querySelectorAll(s);for(let n=0;n<a.length;n++)A(a[n],l)}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._bootHolds=window.lnCore._bootHolds||0,window.lnCore._bootQueue=window.lnCore._bootQueue||[]);function ve(){return typeof window<"u"&&window.lnCore&&window.lnCore._bootHolds||0}function _e(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 J(){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 Ae(e){const t=J(),r=e.observed||[];for(let o=0;o<r.length;o++){const i=r[o];t.byAttr.has(i)||t.byAttr.set(i,[]),t.byAttr.get(i).push(e)}if(t.byDeclaredAttr=t.byDeclaredAttr||new Map,e.attributes)for(const o in e.attributes){t.byDeclaredAttr.has(o)||t.byDeclaredAttr.set(o,[]);const i=t.byDeclaredAttr.get(o);i.some(s=>s.componentTag===e.componentTag)||i.push({spec:e.attributes[o],componentTag:e.componentTag})}if(e.onAttrChange||e.effects){t.reactive.push(e);const o=Ce(e);if(o===null)t.reactiveWildcard.push(e);else for(const i of o)t.byReactive.has(i)||t.byReactive.set(i,[]),t.byReactive.get(i).push(e)}e.persist&&t.persist.push(e)}function z(e,t,r,o){for(let i=0;i<e.length;i++){const s=e[i];if(!t[s.attribute])continue;const l=s.effects&&s.effects[r];l?l(t,r,o):s.onAttrChange&&(!s.declared||s.declared.has(r))&&s.onAttrChange(t,r,o)}}function Se(e){const t=e.attributeName,r=t.indexOf("data-ln-")===0,o=J(),i=o.byAttr.get(t),s=N()&&o.byDeclaredAttr&&o.byDeclaredAttr.has(t);if(!r&&!i&&!s)return;const l=e.target;if(e.oldValue!==l.getAttribute(t)){if(s&&S(l)){const a=o.byDeclaredAttr.get(t),n=l.getAttribute(t);for(let c=0;c<a.length;c++)Q(a[c].spec,n,t,a[c].componentTag,l)}if(window.lnCore._debugSink&&(r||i)&&window.lnCore._debugSink("attr",t,l,{oldValue:e.oldValue,newValue:l.getAttribute(t)}),r){const a=o.byReactive.get(t);a&&z(a,l,t,e.oldValue),o.reactiveWildcard.length&&z(o.reactiveWildcard,l,t,e.oldValue)}if(i)for(let a=0;a<i.length;a++){const n=i[a];if(n.handler){n.handler(l,t,e.oldValue);continue}n.onAttributeChange&&l[n.attribute]?n.onAttributeChange(l,t):(G(l,n.selector,n.attribute,n.ComponentFn),n.onInit&&n.onInit(l))}}}function Le(){window.lnCore=window.lnCore||{},!window.lnCore._attrObserverBound&&(window.lnCore._attrObserverBound=!0,_(function(){new MutationObserver(function(t){for(let r=0;r<t.length;r++)try{Se(t[r])}catch(o){console.error("[ln-core] mutation handler failed",t[r].target,o)}}).observe(document.body,{attributes:!0,subtree:!0,attributeOldValue:!0})},"ln-core"))}function O(){return window.lnCore=window.lnCore||{},window.lnCore._lifecycleRegistry=window.lnCore._lifecycleRegistry||[]}function q(){return window.lnCore=window.lnCore||{},window.lnCore._subtreeRegistry=window.lnCore._subtreeRegistry||[]}function X(e,t){if(!document.contains(e))if(t.attribute){const r=e[t.attribute];if(r&&typeof r.destroy=="function")try{r.destroy()}catch(o){console.error("["+t.attribute+"] destroy failed",e,o)}delete e[t.attribute]}else t.onDestroy&&t.onDestroy(e)}function Y(e){const t=O();if(!t.length)return;const r=e.target;if(r){const i=r.nodeType===1?r:r.parentElement;if(i&&(i.isContentEditable||i.closest&&i.closest('[contenteditable]:not([contenteditable="false"])')))return}const o=q();if(e.target&&o.length)for(let i=0;i<o.length;i++){const s=o[i],l=s.query,a=e.target.nodeType===1?e.target.matches&&e.target.matches(l)?e.target:e.target.closest?e.target.closest(l):null:e.target.parentElement&&e.target.parentElement.closest?e.target.parentElement.closest(l):null;a&&s.onSubtreeChange(a,e)}for(let i=0;i<e.addedNodes.length;i++){const s=e.addedNodes[i];if(s.nodeType!==1)continue;const l=!!(s.firstElementChild||s.children&&s.children.length);for(let a=0;a<t.length;a++){const n=t[a],c=n.query;if(c&&(s.matches&&s.matches(c)&&(n.ComponentFn&&A(s,n),n.onInit&&n.onInit(s)),l&&s.querySelectorAll)){const d=s.querySelectorAll(c);for(let u=0;u<d.length;u++)n.ComponentFn&&A(d[u],n),n.onInit&&n.onInit(d[u])}}}for(let i=0;i<e.removedNodes.length;i++){const s=e.removedNodes[i];if(s.nodeType!==1||document.contains(s))continue;const l=!!(s.firstElementChild||s.children&&s.children.length);for(let a=0;a<t.length;a++){const n=t[a],c=n.query;if(c&&(s.matches&&s.matches(c)&&X(s,n),l&&s.querySelectorAll)){const d=s.querySelectorAll(c);for(let u=0;u<d.length;u++)X(d[u],n)}}}}function Z(){window.lnCore=window.lnCore||{},!window.lnCore._lifecycleObserverBound&&(window.lnCore._lifecycleObserverBound=!0,_(function(){const e=new MutationObserver(function(t){for(let r=0;r<t.length;r++){const o=t[r];if(o.type==="childList")try{Y(o)}catch(i){console.error("[ln-core] lifecycle handler failed",o.target,i)}}});window.lnCore._lifecycleObserver=e,e.observe(document.body,{childList:!0,subtree:!0})},"ln-core"))}function Ee(e){if(typeof window>"u")return e();window.lnCore=window.lnCore||{};const t=window.lnCore._lifecycleObserver;if(!t)return e();const r=t.takeRecords();for(let o=0;o<r.length;o++){const i=r[o];if(i.type==="childList")try{Y(i)}catch(s){console.error("[ln-core] lifecycle handler failed",i.target,s)}}t.disconnect();try{return e()}finally{t.observe(document.body,{childList:!0,subtree:!0})}}function xe(e){O().push(e),e.onSubtreeChange&&e.query&&q().push(e),Z()}function ee(e,t,r,o,i={}){const s=i.extraAttributes||[],l=i.onAttributeChange||null,a=i.onSubtreeChange||null,n=i.onInit||null,c=i.onAttrChange||null,d=i.effects||null,u=i.attributes||null,p=u?ye(u):d,b=u?new Set(Object.keys(u)):null,m=i.persist||null;function f(I){const g=I||document.body;if(G(g,e,t,r),u&&N())for(const v in u){const Ge=u[v],D=Array.from(g.querySelectorAll("["+v+"]"));g.matches&&g.matches("["+v+"]")&&D.push(g);for(let F=0;F<D.length;F++){const T=D[F];S(T)&&Q(Ge,T.getAttribute(v),v,o,T)}}n&&n(g)}const w=[];if(e.indexOf("[")!==-1){const I=/\[([\w-]+)/g;let g;for(;(g=I.exec(e))!==null;)w.push(g[1])}else w.push(e);Ae({selector:e,attribute:t,componentTag:o,attributes:u,ComponentFn:r,onInit:n,observed:w.concat(s),onAttributeChange:l,onAttrChange:c,effects:p,declared:b,persist:m}),Le();const h=e.indexOf("[")!==-1||e.indexOf(".")!==-1||e.indexOf("#")!==-1,y=i.subtreeQuery||(h?e:"["+e+"]"),C={selector:e,attribute:t,ComponentFn:r,onInit:n,onSubtreeChange:a,query:y};O().push(C),a&&y&&q().push(C),Z(),window[t]=f,typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerComponent=ee,window.lnCore.observeLifecycle=xe,window.lnCore.withoutLifecycle=Ee);function oe(){ve()>0?_e(function(){f(document.body)}):f(document.body)}return document.readyState==="loading"?document.addEventListener("DOMContentLoaded",oe):oe(),f}function te(e){return(e||"").replace(/^#/,"")}function R(e){const t=e===void 0?location.hash:e,r={},o=te(t);if(!o)return r;const i=o.split("&");for(let s=0;s<i.length;s++){const l=i[s];if(!l)continue;const a=l.indexOf(":"),n=a>-1?l.slice(0,a):l,c=a>-1?l.slice(a+1):"";if(n)try{r[n]=decodeURIComponent(c)}catch{r[n]=c}}return r}function ke(e){if(!e)return null;const t=R();return e in t?t[e]:null}function Oe(e,t){if(!e)return;const r=R();t==null?delete r[e]:r[e]=String(t);const i=Object.keys(r).map(function(s){const l=r[s];return l===""?s:s+":"+encodeURIComponent(l)}).join("&");te(location.hash)!==i&&(location.hash=i)}function qe(e){return e.button===1||e.ctrlKey||e.metaKey||e.shiftKey?!1:(e.preventDefault(),!0)}function Re(e,t){if(!e||!e.hasAttribute("data-ln-hash"))return null;const r=e.getAttribute("data-ln-hash");if(r&&r.trim()!=="")return r.trim();const o=e.getAttribute("data-ln-sort")||e.getAttribute("data-ln-search-for")||e.getAttribute("data-ln-search")||e.getAttribute("data-ln-filter")||e.id;return o?t?o+"-"+t:o:t||null}function Ie(e,t){return!t||t==="none"||e===null||e===void 0?null:String(e)+"."+t}function De(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 Fe(e,t){return!e||!Array.isArray(t)||t.length===0?null:e+":"+t.map(encodeURIComponent).join(",")}function Te(e){if(!e||typeof e!="string")return null;const t=e.indexOf(":");if(t===-1)return null;const r=e.slice(0,t),o=e.slice(t+1),i=o?o.split(",").map(function(s){try{return decodeURIComponent(s)}catch{return s}}).filter(Boolean):[];return{key:r,values:i}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.hashParse=R,window.lnCore.hashGet=ke,window.lnCore.hashSet=Oe,window.lnCore.hashLinkClick=qe,window.lnCore.resolveHashNamespace=Re,window.lnCore.hashSortEncode=Ie,window.lnCore.hashSortDecode=De,window.lnCore.hashFilterEncode=Fe,window.lnCore.hashFilterDecode=Te);function Ne(e){return(e||"").replace(/^\?/,"")}function Me(e){const t=e===void 0?typeof window<"u"?window.location.search:"":e,r={},o=Ne(t);if(!o)return r;const i=new URLSearchParams(o);for(const[s,l]of i.entries())r[s]=l;return r}function $e(e){if(!e||typeof window>"u")return null;const t=new URLSearchParams(window.location.search);return t.has(e)?t.get(e):null}function Be(e,t){if(!e||typeof window>"u")return;const r=new URL(window.location.href);if(t==null||t===""?r.searchParams.delete(e):r.searchParams.set(e,String(t)),r.search===window.location.search)return;const o=r.pathname+r.search+r.hash;window.history.replaceState(window.history.state,"",o)}function Ve(e,t){if(!e||!e.hasAttribute("data-ln-query"))return null;const r=e.getAttribute("data-ln-query");if(r&&r.trim()!=="")return r.trim();const o=e.getAttribute("data-ln-sort")||e.getAttribute("data-ln-search-for")||e.getAttribute("data-ln-search")||e.getAttribute("data-ln-filter")||e.id;return o?t?o+"_"+t:o:t||null}function je(e,t){return!t||t==="none"||e===null||e===void 0?null:String(e)+"."+t}function Ue(e,t){if(e&&typeof e=="string"){if(e.endsWith(".asc"))return{fieldOrColumn:e.slice(0,-4),direction:"asc"};if(e.endsWith(".desc"))return{fieldOrColumn:e.slice(0,-5),direction:"desc"}}if(t&&typeof t=="object"){const r=t.sort_field||t.sort_by;if(r){const o=t.sort_dir&&String(t.sort_dir).toLowerCase()==="desc"?"desc":"asc";return{fieldOrColumn:r,direction:o}}}return null}function We(e){return!Array.isArray(e)||e.length===0?null:e.map(encodeURIComponent).join(",")}function He(e){return!e||typeof e!="string"?[]:e.split(",").map(function(t){try{return decodeURIComponent(t.trim())}catch{return t.trim()}}).filter(Boolean)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.queryParse=Me,window.lnCore.queryGet=$e,window.lnCore.querySet=Be,window.lnCore.resolveQueryParam=Ve,window.lnCore.querySortEncode=je,window.lnCore.querySortDecode=Ue,window.lnCore.queryFilterEncode=We,window.lnCore.queryFilterDecode=He);function Pe(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.uuid=Pe);const ne={required:"valueMissing",typeMismatch:"typeMismatch",tooShort:"tooShort",tooLong:"tooLong",patternMismatch:"patternMismatch",rangeUnderflow:"rangeUnderflow",rangeOverflow:"rangeOverflow"};function re(e,t=0){return e?!!(e.valid&&t===0):t===0}function Ke(e){return e.type==="checkbox"||e.type==="radio"?!!e.checked:!!(e.value&&e.value.trim()!=="")}function Qe(e,t){const r=[];if(e){const o=Object.keys(ne);for(let i=0;i<o.length;i++){const s=o[i],l=ne[s];e[l]&&r.push(s)}}if(t){const o=Array.from(t);for(let i=0;i<o.length;i++)o[i]&&r.indexOf(o[i])===-1&&r.push(o[i])}return r}(function(){const e="data-ln-validate",t="lnValidate",r="data-ln-validate-errors",o="data-ln-validate-error",i="ln-validate-valid",s="ln-validate-invalid";if(window[t]!==void 0)return;const l={"data-ln-validate":{type:"marker",description:"Activates validation on form input or field"},"data-ln-validate-errors":{type:"marker",description:"Container element holding validation error message elements"},"data-ln-validate-error":{type:"string",description:"Identifies error message template for a specific validation rule"}};function a(n){this.dom=n,this._touched=!1,this._customErrors=new Set;const c=this,d=n.tagName,u=n.type,p=d==="SELECT"||u==="checkbox"||u==="radio";this._onInput=function(){c._touched=!0,c.validate()},this._onChange=function(){c._touched=!0,c.validate()},this._onSetCustom=function(m){const f=m.detail&&m.detail.error;if(!f)return;c._customErrors.add(f),c._touched=!0;const w=n.closest(".form-element");if(w){const h=w.querySelector("["+o+'="'+f+'"]');h&&h.classList.remove("hidden")}n.classList.remove(i),n.classList.add(s),n.setAttribute("aria-invalid","true")},this._onClearCustom=function(m){const f=m.detail&&m.detail.error,w=n.closest(".form-element");if(f){if(c._customErrors.delete(f),w){const h=w.querySelector("["+o+'="'+f+'"]');h&&h.classList.add("hidden")}}else c._customErrors.forEach(function(h){if(w){const y=w.querySelector("["+o+'="'+h+'"]');y&&y.classList.add("hidden")}}),c._customErrors.clear();c._touched&&c.validate()},p||n.addEventListener("input",this._onInput),n.addEventListener("change",this._onChange),n.addEventListener("ln-validate:set-custom",this._onSetCustom),n.addEventListener("ln-validate:clear-custom",this._onClearCustom);const b=n.form;return b&&(b.hasAttribute("novalidate")||b.setAttribute("novalidate",""),this._onFormReset=function(){c.reset()},this._onValidateRequest=function(m){c._touched=!0,!c.validate()&&m.detail&&m.detail.invalidFields&&m.detail.invalidFields.push(c.dom)},b.addEventListener("reset",this._onFormReset),b.addEventListener("ln-validate:request-validate",this._onValidateRequest),b._lnValidateGateBound||(b._lnValidateGateBound=!0,b.addEventListener("submit",function(m){const f={invalidFields:[]};L(b,"ln-validate:request-validate",f),f.invalidFields.length>0&&(m.preventDefault(),f.invalidFields.sort((w,h)=>w.compareDocumentPosition(h)&Node.DOCUMENT_POSITION_PRECEDING?-1:1),f.invalidFields[0].focus())}))),Ke(n)&&(this._touched=!0,this.validate()),this}a.prototype.validate=function(){const n=this.dom,c=n.validity,d=re(c,this._customErrors.size),u=Qe(c,this._customErrors),p=n.closest(".form-element");if(p){const f=p.querySelector("["+r+"]");if(f){const w=f.querySelectorAll("["+o+"]");for(let h=0;h<w.length;h++){const y=w[h].getAttribute(o),C=!u.includes(y);w[h].classList.contains("hidden")!==C&&w[h].classList.toggle("hidden",C)}}}n.classList.contains(i)!==d&&n.classList.toggle(i,d),n.classList.contains(s)===d&&n.classList.toggle(s,!d);const b=d?"false":"true";return n.getAttribute("aria-invalid")!==b&&n.setAttribute("aria-invalid",b),L(n,d?"ln-validate:valid":"ln-validate:invalid",{target:n,field:n.name,errors:u}),d},a.prototype.reset=function(){this._touched=!1,this._customErrors.clear(),this.dom.classList.contains(i)&&this.dom.classList.remove(i),this.dom.classList.contains(s)&&this.dom.classList.remove(s),this.dom.hasAttribute("aria-invalid")&&this.dom.removeAttribute("aria-invalid");const n=this.dom.closest(".form-element");if(n){const c=n.querySelectorAll("["+o+"]");for(let d=0;d<c.length;d++)c[d].classList.contains("hidden")||c[d].classList.add("hidden")}},Object.defineProperty(a.prototype,"isValid",{get:function(){return re(this.dom.validity,this._customErrors.size)}}),a.prototype.destroy=function(){if(!this.dom[t])return;this.dom.removeEventListener("input",this._onInput),this.dom.removeEventListener("change",this._onChange),this.dom.removeEventListener("ln-validate:set-custom",this._onSetCustom),this.dom.removeEventListener("ln-validate:clear-custom",this._onClearCustom);const n=this.dom.form;n&&(this._onFormReset&&n.removeEventListener("reset",this._onFormReset),this._onValidateRequest&&n.removeEventListener("ln-validate:request-validate",this._onValidateRequest)),this.dom.classList.remove(i,s),this.dom.removeAttribute("aria-invalid"),delete this.dom[t]},ee(e,t,a,"ln-validate",{attributes:l})})()})();
1
+ (function(){"use strict";function F(){if(typeof window>"u")return!1;if(window.lnDebug===!0||window.lnCore&&window.lnCore._debugSink)return!0;if(typeof document<"u"){if(document.documentElement&&document.documentElement.hasAttribute("data-ln-debug"))return!0;if(document.body)return document.body.hasAttribute("data-ln-debug")||document.body.querySelector("[data-ln-debug]")!==null}return!1}function _(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 t=e.closest("[data-ln-debug]");return!(!t||typeof document<"u"&&t===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(...t){if(typeof t[0]=="string"&&(t[0].startsWith("[ln-")||t[0].startsWith("[lnCore"))){let o=null;for(let i=1;i<t.length;i++)if(t[i]&&t[i].nodeType===1){o=t[i];break}if(!_(o))return}e.apply(console,t)}}function A(e,t,r){const o=r||{};window.lnCore._debugSink&&window.lnCore._debugSink("event",t,e,o),e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:o}))}function C(e,t){if(!document.body){document.addEventListener("DOMContentLoaded",function(){C(e,t)}),console.warn("["+t+'] Script loaded before <body> — add "defer" to your <script> tag');return}e()}function ie(e){const t=e.querySelector('input[name="_method"]');return((t&&t.value!==""?t.value:e.method)||"").toUpperCase()}function se(e,t){const r=!!(t&&t.typed),o=t&&t.exclude,i={},l=e.elements,s={};if(r)for(let a=0;a<l.length;a++){const n=l[a];n.name&&n.type==="checkbox"&&!n.disabled&&(s[n.name]=(s[n.name]||0)+1)}for(let a=0;a<l.length;a++){const n=l[a];if(!(!n.name||n.disabled||n.type==="file"||n.type==="submit"||n.type==="button")&&!(o&&n.matches&&n.matches(o)))if(n.type==="checkbox")r&&s[n.name]===1?i[n.name]=n.checked:(i[n.name]||(i[n.name]=[]),n.checked&&i[n.name].push(n.value));else if(n.type==="radio")n.checked&&(i[n.name]=n.value);else if(n.type==="select-multiple"){i[n.name]=[];for(let c=0;c<n.options.length;c++)n.options[c].selected&&i[n.name].push(n.options[c].value)}else if(r&&n.type==="hidden")i[n.name]=n.value;else if(r&&(n.type==="number"||n.type==="range")){const c=Number(n.value);i[n.name]=n.value===""||isNaN(c)?null:c}else i[n.name]=n.value}return i}function le(e){if(typeof e!="string")return!!e;const t=e.trim().toLowerCase();return t!=="false"&&t!=="0"&&t!==""&&t!=="off"&&t!=="no"}function ae(e,t){const r=e.elements,o=[],i={};for(let l=0;l<r.length;l++){const s=r[l];s.name&&s.type==="checkbox"&&(i[s.name]=(i[s.name]||0)+1)}for(let l=0;l<r.length;l++){const s=r[l];if(s.type==="file"||s.type==="submit"||s.type==="button")continue;const a=s.getAttribute("data-ln-fill-as")||s.name;if(!a||!(a in t))continue;const n=t[a];if(s.type==="checkbox"){if(Array.isArray(n))s.checked=n.indexOf(s.value)!==-1;else if(i[s.name]>1){const c=String(n).split(",").map(function(u){return u.trim()});s.checked=c.indexOf(s.value)!==-1}else s.checked=le(n);o.push(s)}else if(s.type==="radio")s.checked=s.value===String(n),o.push(s);else if(s.type==="select-multiple"){if(Array.isArray(n))for(let c=0;c<s.options.length;c++)s.options[c].selected=n.indexOf(s.options[c].value)!==-1;o.push(s)}else s.value=n,s.tagName==="SELECT"&&n!=null&&s.setAttribute("data-ln-value",n),o.push(s)}return o}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.populateForm=ae,window.lnCore.serializeForm=se,window.lnCore.resolveFormMethod=ie);const T={};function ce(e,t){T[e]=t}function de(e){return T[e]||{ingress:t=>t,egress:t=>t}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerDataMapper=ce,window.lnCore.getDataMapper=de);function ue(){typeof window>"u"||(window.lnCore=window.lnCore||{},!window.lnCore._localeObserverBound&&(window.lnCore._localeObserverBound=!0,C(function(){new MutationObserver(function(){A(document,"ln-core:locale-change",{})}).observe(document.documentElement,{attributes:!0,attributeFilter:["lang"],subtree:!0})},"ln-core")))}const N={};function fe(e,t){if(!e||typeof t!="object")return;const r=e.toLowerCase().split("-")[0];N[r]=t}function we(e){if(!e)return null;const t=e.toLowerCase().split("-")[0];return N[t]||null}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerLocaleFallback=fe,window.lnCore.getLocaleFallback=we,window.lnCore.ensureLocaleObserver=ue);const S={};function he(e,t){S[e]||(S[e]=document.querySelector('[data-ln-template="'+e+'"]'));const r=S[e];return r?r.content.cloneNode(!0):(console.warn("["+(t||"ln-core")+'] Template "'+e+'" not found'),null)}function M(e,t){if(!e||!t)return e;const r=e.querySelectorAll("[data-ln-field]");for(let s=0;s<r.length;s++){const a=r[s],n=a.getAttribute("data-ln-field");t[n]!=null&&(a.textContent=t[n])}const o=e.querySelectorAll("[data-ln-attr]");for(let s=0;s<o.length;s++){const a=o[s],n=a.getAttribute("data-ln-attr").split(",");for(let c=0;c<n.length;c++){const u=n[c].trim().split(":");if(u.length!==2)continue;const d=u[0].trim(),h=u[1].trim();t[h]!=null&&a.setAttribute(d,t[h])}}const i=e.querySelectorAll("[data-ln-show]");for(let s=0;s<i.length;s++){const a=i[s],n=a.getAttribute("data-ln-show");n in t&&a.classList.toggle("hidden",!t[n])}const l=e.querySelectorAll("[data-ln-class]");for(let s=0;s<l.length;s++){const a=l[s],n=a.getAttribute("data-ln-class").split(",");for(let c=0;c<n.length;c++){const u=n[c].trim().split(":");if(u.length!==2)continue;const d=u[0].trim(),h=u[1].trim();h in t&&a.classList.toggle(d,!!t[h])}}return e}function pe(e,t){e.matches&&e.matches("[data-ln-form], [data-ln-fillable]")&&(window.lnCore._debugSink&&window.lnCore._debugSink("event","ln-fill",e,t??null),e.dispatchEvent(new CustomEvent("ln-fill",{detail:t??null,bubbles:!0})));const r=e.querySelectorAll("[data-ln-form], [data-ln-fillable]");for(let o=0;o<r.length;o++)window.lnCore._debugSink&&window.lnCore._debugSink("event","ln-fill",r[o],t??null),r[o].dispatchEvent(new CustomEvent("ln-fill",{detail:t??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)M(e.target,e.detail);else{const t=e.target.querySelectorAll("[data-ln-field]");for(let r=0;r<t.length;r++)t[r].textContent=""}})));function $(e,t){if(!e||!t)return e;const r=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);for(;r.nextNode();){const l=r.currentNode;l.textContent.indexOf("{{")!==-1&&(l.textContent=l.textContent.replace(/\{\{\s*(\w+)\s*\}\}/g,function(s,a){return t[a]!==void 0?t[a]:""}))}const o=function(l,s){return t[s]!==void 0?t[s]:""},i=Array.from(e.querySelectorAll("*"));e.nodeType===1&&i.push(e);for(let l=0;l<i.length;l++){const s=i[l],a=s.attributes;for(let n=0;n<a.length;n++){const c=a[n];c.value.indexOf("{{")!==-1&&s.setAttribute(c.name,c.value.replace(/\{\{\s*(\w+)\s*\}\}/g,o))}}return e}function me(e,t,r,o,i,l){const s={};for(let n=0;n<e.children.length;n++){const c=e.children[n],u=c.getAttribute("data-ln-render-key");u&&(s[u]=c)}const a=document.createDocumentFragment();for(let n=0;n<t.length;n++){const c=t[n],u=String(o(c));let d=s[u];if(d)i(d,c,n);else{const h=he(r,l);if(!h||($(h,c),d=h.firstElementChild,!d))continue;d.setAttribute("data-ln-render-key",u),i(d,c,n)}a.appendChild(d)}e.textContent="",e.appendChild(a)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.fillTemplate=$,window.lnCore.fill=M,window.lnCore.lnFill=pe,window.lnCore.renderList=me);function E(e,t,r){const o=e.getAttribute(t);return o===null?r:o}function B(e,t,r){const o=parseInt(e.getAttribute(t),10);return isNaN(o)?r:o}function V(e,t,r=!1){const o=e.getAttribute(t);if(o===null)return!!r;const i=o.trim().toLowerCase();return!(i==="false"||i==="0")}function j(e,t){return(e.getAttribute(t)||"").split(",").map(r=>r.trim()).filter(Boolean)}const L=new Map;function U(e,t){const r=(e?e.join("|"):"")+"::"+t;if(L.has(r))return L.get(r);const o=new Set(e||[]),i=function(l,s){const a=l.getAttribute(s);return a!==null&&o.has(a)?a:t};return L.set(r,i),i}function W(e,t,r){const o=parseFloat(e.getAttribute(t));return isNaN(o)?r:o}function H(e,t,r){const o=e.getAttribute(t);if(!o)return r;try{return JSON.parse(o)}catch{return r}}function P(e,t,r,o,i){if(!e||t===null)return!0;const l=o||"ln-component",s=e.type;if(s==="trigger"||s==="marker"||s==="string"||s==="list"||!s||t===""&&e.fallback!==void 0)return!0;const a=n=>{i?console.warn(n,i):console.warn(n)};if(s==="boolean"){const n=t.trim().toLowerCase();return n!==""&&n!=="true"&&n!=="false"&&n!=="1"&&n!=="0"?(a(`[${l}] Invalid value "${t}" for boolean attribute "${r}". Allowed: "true", "false", or presence-only.`),!1):!0}if(s==="enum"){const n=e.values||[];return n.includes(t)?!0:(a(`[${l}] Invalid value "${t}" for attribute "${r}". Allowed: ${n.join(", ")}. Fallback: "${e.fallback}".`),!1)}if(s==="integer"){if(!/^-?\d+$/.test(t))return a(`[${l}] Invalid integer "${t}" for attribute "${r}". Fallback: ${e.fallback}.`),!1;const n=parseInt(t,10);return e.min!==void 0&&n<e.min?(a(`[${l}] Value ${n} for attribute "${r}" is less than min (${e.min}).`),!1):e.max!==void 0&&n>e.max?(a(`[${l}] Value ${n} for attribute "${r}" is greater than max (${e.max}).`),!1):!0}if(s==="float")return isNaN(Number(t))?(a(`[${l}] Invalid float "${t}" for attribute "${r}". Fallback: ${e.fallback}.`),!1):!0;if(s==="json")try{return JSON.parse(t),!0}catch(n){return a(`[${l}] Invalid JSON for attribute "${r}": ${n.message}. Fallback: ${e.fallback}.`),!1}return!0}function be(e,t,r){for(const o in r){const[i,l,s]=r[o];Object.defineProperty(e,o,{get:function(){return i(t,l,s)},enumerable:!0,configurable:!0})}return e}function ge(e){const t={};for(const r in e){const o=e[r];if(!o||!o.prop)continue;let i=o.read;if(!i&&o.type)switch(o.type){case"enum":i=U(o.values,o.fallback);break;case"integer":i=B;break;case"float":i=W;break;case"boolean":i=V;break;case"list":i=j;break;case"json":i=H;break;case"string":default:i=E;break}i||(i=E),t[o.prop]=[i,r,o.fallback]}return t}function ye(e){const t={};for(const r in e){const o=e[r];o&&o.effect&&(t[r]=o.effect)}return Object.keys(t).length?t:null}function Ce(e){if(e.onAttrChange&&!e.declared)return null;const t=new Set;if(e.effects)for(const r in e.effects)t.add(r);if(e.onAttrChange&&e.declared)for(const r of e.declared)t.add(r);return t}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.defineAttrs=be,window.lnCore.attrSpec=ge,window.lnCore.attrStr=E,window.lnCore.attrInt=B,window.lnCore.attrBool=V,window.lnCore.attrList=j,window.lnCore.attrEnum=U,window.lnCore.attrFloat=W,window.lnCore.attrJson=H);function v(e,t){if(!e[t.attribute]){window.lnCore._persistSink&&e.hasAttribute&&e.hasAttribute("data-ln-persist")&&window.lnCore._persistSink(e,t.selector);try{e[t.attribute]=new t.ComponentFn(e)}catch(r){console.error("["+t.attribute+"] init failed",e,r)}}}function Q(e,t,r,o){if(e.nodeType!==1)return;const l=t.indexOf("[")!==-1||t.indexOf(".")!==-1||t.indexOf("#")!==-1?t:"["+t+"]",s={selector:t,attribute:r,ComponentFn:o};if(e.matches&&e.matches(l)&&v(e,s),e.querySelectorAll){const a=e.querySelectorAll(l);for(let n=0;n<a.length;n++)v(a[n],s)}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._bootHolds=window.lnCore._bootHolds||0,window.lnCore._bootQueue=window.lnCore._bootQueue||[]);function ve(){return typeof window<"u"&&window.lnCore&&window.lnCore._bootHolds||0}function _e(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 G(){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 Ae(e){const t=G(),r=e.observed||[];for(let o=0;o<r.length;o++){const i=r[o];t.byAttr.has(i)||t.byAttr.set(i,[]),t.byAttr.get(i).push(e)}if(t.byDeclaredAttr=t.byDeclaredAttr||new Map,e.attributes)for(const o in e.attributes){t.byDeclaredAttr.has(o)||t.byDeclaredAttr.set(o,[]);const i=t.byDeclaredAttr.get(o);i.some(l=>l.componentTag===e.componentTag)||i.push({spec:e.attributes[o],componentTag:e.componentTag})}if(e.onAttrChange||e.effects){t.reactive.push(e);const o=Ce(e);if(o===null)t.reactiveWildcard.push(e);else for(const i of o)t.byReactive.has(i)||t.byReactive.set(i,[]),t.byReactive.get(i).push(e)}e.persist&&t.persist.push(e)}function K(e,t,r,o){for(let i=0;i<e.length;i++){const l=e[i];if(!t[l.attribute])continue;const s=l.effects&&l.effects[r];s?s(t,r,o):l.onAttrChange&&(!l.declared||l.declared.has(r))&&l.onAttrChange(t,r,o)}}function Se(e){const t=e.attributeName,r=t.indexOf("data-ln-")===0,o=G(),i=o.byAttr.get(t),l=F()&&o.byDeclaredAttr&&o.byDeclaredAttr.has(t);if(!r&&!i&&!l)return;const s=e.target;if(e.oldValue!==s.getAttribute(t)){if(l&&_(s)){const a=o.byDeclaredAttr.get(t),n=s.getAttribute(t);for(let c=0;c<a.length;c++)P(a[c].spec,n,t,a[c].componentTag,s)}if(window.lnCore._debugSink&&(r||i)&&window.lnCore._debugSink("attr",t,s,{oldValue:e.oldValue,newValue:s.getAttribute(t)}),r){const a=o.byReactive.get(t);a&&K(a,s,t,e.oldValue),o.reactiveWildcard.length&&K(o.reactiveWildcard,s,t,e.oldValue)}if(i)for(let a=0;a<i.length;a++){const n=i[a];if(n.handler){n.handler(s,t,e.oldValue);continue}n.onAttributeChange&&s[n.attribute]?n.onAttributeChange(s,t):(Q(s,n.selector,n.attribute,n.ComponentFn),n.onInit&&n.onInit(s))}}}function Ee(){window.lnCore=window.lnCore||{},!window.lnCore._attrObserverBound&&(window.lnCore._attrObserverBound=!0,C(function(){new MutationObserver(function(t){for(let r=0;r<t.length;r++)try{Se(t[r])}catch(o){console.error("[ln-core] mutation handler failed",t[r].target,o)}}).observe(document.body,{attributes:!0,subtree:!0,attributeOldValue:!0})},"ln-core"))}function x(){return window.lnCore=window.lnCore||{},window.lnCore._lifecycleRegistry=window.lnCore._lifecycleRegistry||[]}function k(){return window.lnCore=window.lnCore||{},window.lnCore._subtreeRegistry=window.lnCore._subtreeRegistry||[]}function J(e,t){if(!document.contains(e))if(t.attribute){const r=e[t.attribute];if(r&&typeof r.destroy=="function")try{r.destroy()}catch(o){console.error("["+t.attribute+"] destroy failed",e,o)}delete e[t.attribute]}else t.onDestroy&&t.onDestroy(e)}function z(e){const t=x();if(!t.length)return;const r=e.target;if(r){const i=r.nodeType===1?r:r.parentElement;if(i&&(i.isContentEditable||i.closest&&i.closest('[contenteditable]:not([contenteditable="false"])')))return}const o=k();if(e.target&&o.length)for(let i=0;i<o.length;i++){const l=o[i],s=l.query,a=e.target.nodeType===1?e.target.matches&&e.target.matches(s)?e.target:e.target.closest?e.target.closest(s):null:e.target.parentElement&&e.target.parentElement.closest?e.target.parentElement.closest(s):null;a&&l.onSubtreeChange(a,e)}for(let i=0;i<e.addedNodes.length;i++){const l=e.addedNodes[i];if(l.nodeType!==1)continue;const s=!!(l.firstElementChild||l.children&&l.children.length);for(let a=0;a<t.length;a++){const n=t[a],c=n.query;if(c&&(l.matches&&l.matches(c)&&(n.ComponentFn&&v(l,n),n.onInit&&n.onInit(l)),s&&l.querySelectorAll)){const u=l.querySelectorAll(c);for(let d=0;d<u.length;d++)n.ComponentFn&&v(u[d],n),n.onInit&&n.onInit(u[d])}}}for(let i=0;i<e.removedNodes.length;i++){const l=e.removedNodes[i];if(l.nodeType!==1||document.contains(l))continue;const s=!!(l.firstElementChild||l.children&&l.children.length);for(let a=0;a<t.length;a++){const n=t[a],c=n.query;if(c&&(l.matches&&l.matches(c)&&J(l,n),s&&l.querySelectorAll)){const u=l.querySelectorAll(c);for(let d=0;d<u.length;d++)J(u[d],n)}}}}function X(){window.lnCore=window.lnCore||{},!window.lnCore._lifecycleObserverBound&&(window.lnCore._lifecycleObserverBound=!0,C(function(){const e=new MutationObserver(function(t){for(let r=0;r<t.length;r++){const o=t[r];if(o.type==="childList")try{z(o)}catch(i){console.error("[ln-core] lifecycle handler failed",o.target,i)}}});window.lnCore._lifecycleObserver=e,e.observe(document.body,{childList:!0,subtree:!0})},"ln-core"))}function Le(e){if(typeof window>"u")return e();window.lnCore=window.lnCore||{};const t=window.lnCore._lifecycleObserver;if(!t)return e();const r=t.takeRecords();for(let o=0;o<r.length;o++){const i=r[o];if(i.type==="childList")try{z(i)}catch(l){console.error("[ln-core] lifecycle handler failed",i.target,l)}}t.disconnect();try{return e()}finally{t.observe(document.body,{childList:!0,subtree:!0})}}function xe(e){x().push(e),e.onSubtreeChange&&e.query&&k().push(e),X()}function Y(e,t,r,o,i={}){const l=i.extraAttributes||[],s=i.onAttributeChange||null,a=i.onSubtreeChange||null,n=i.onInit||null,c=i.onAttrChange||null,u=i.effects||null,d=i.attributes||null,h=d?ye(d):u,m=d?new Set(Object.keys(d)):null,b=i.persist||null;function f(O){const g=O||document.body;if(Q(g,e,t,r),d&&F())for(const y in d){const Ke=d[y],R=Array.from(g.querySelectorAll("["+y+"]"));g.matches&&g.matches("["+y+"]")&&R.push(g);for(let q=0;q<R.length;q++){const D=R[q];_(D)&&P(Ke,D.getAttribute(y),y,o,D)}}n&&n(g)}const w=[];if(e.indexOf("[")!==-1){const O=/\[([\w-]+)/g;let g;for(;(g=O.exec(e))!==null;)w.push(g[1])}else w.push(e);Ae({selector:e,attribute:t,componentTag:o,attributes:d,ComponentFn:r,onInit:n,observed:w.concat(l),onAttributeChange:s,onAttrChange:c,effects:h,declared:m,persist:b}),Ee();const p=e.indexOf("[")!==-1||e.indexOf(".")!==-1||e.indexOf("#")!==-1,ne=i.subtreeQuery||(p?e:"["+e+"]"),re={selector:e,attribute:t,ComponentFn:r,onInit:n,onSubtreeChange:a,query:ne};x().push(re),a&&ne&&k().push(re),X(),window[t]=f,typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerComponent=Y,window.lnCore.observeLifecycle=xe,window.lnCore.withoutLifecycle=Le);function oe(){ve()>0?_e(function(){f(document.body)}):f(document.body)}return document.readyState==="loading"?document.addEventListener("DOMContentLoaded",oe):oe(),f}function Z(e){return(e||"").replace(/^#/,"")}function I(e){const t=e===void 0?location.hash:e,r={},o=Z(t);if(!o)return r;const i=o.split("&");for(let l=0;l<i.length;l++){const s=i[l];if(!s)continue;const a=s.indexOf(":"),n=a>-1?s.slice(0,a):s,c=a>-1?s.slice(a+1):"";if(n)try{r[n]=decodeURIComponent(c)}catch{r[n]=c}}return r}function ke(e){if(!e)return null;const t=I();return e in t?t[e]:null}function Ie(e,t){if(!e)return;const r=I();t==null?delete r[e]:r[e]=String(t);const i=Object.keys(r).map(function(l){const s=r[l];return s===""?l:l+":"+encodeURIComponent(s)}).join("&");Z(location.hash)!==i&&(location.hash=i)}function Oe(e){return e.button===1||e.ctrlKey||e.metaKey||e.shiftKey?!1:(e.preventDefault(),!0)}function Re(e,t){if(!e||!e.hasAttribute("data-ln-hash"))return null;const r=e.getAttribute("data-ln-hash");if(r&&r.trim()!=="")return r.trim();const o=e.getAttribute("data-ln-sort")||e.getAttribute("data-ln-search-for")||e.getAttribute("data-ln-search")||e.getAttribute("data-ln-filter")||e.id;return o?t?o+"-"+t:o:t||null}function qe(e,t){return!t||t==="none"||e===null||e===void 0?null:String(e)+"."+t}function De(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 Fe(e,t){return!e||!Array.isArray(t)||t.length===0?null:e+":"+t.map(encodeURIComponent).join(",")}function Te(e){if(!e||typeof e!="string")return null;const t=e.indexOf(":");if(t===-1)return null;const r=e.slice(0,t),o=e.slice(t+1),i=o?o.split(",").map(function(l){try{return decodeURIComponent(l)}catch{return l}}).filter(Boolean):[];return{key:r,values:i}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.hashParse=I,window.lnCore.hashGet=ke,window.lnCore.hashSet=Ie,window.lnCore.hashLinkClick=Oe,window.lnCore.resolveHashNamespace=Re,window.lnCore.hashSortEncode=qe,window.lnCore.hashSortDecode=De,window.lnCore.hashFilterEncode=Fe,window.lnCore.hashFilterDecode=Te);function Ne(e){return(e||"").replace(/^\?/,"")}function Me(e){const t=e===void 0?typeof window<"u"?window.location.search:"":e,r={},o=Ne(t);if(!o)return r;const i=new URLSearchParams(o);for(const[l,s]of i.entries())r[l]=s;return r}function $e(e){if(!e||typeof window>"u")return null;const t=new URLSearchParams(window.location.search);return t.has(e)?t.get(e):null}function Be(e,t){if(!e||typeof window>"u")return;const r=new URL(window.location.href);if(t==null||t===""?r.searchParams.delete(e):r.searchParams.set(e,String(t)),r.search===window.location.search)return;const o=r.pathname+r.search+r.hash;window.history.replaceState(window.history.state,"",o)}function Ve(e,t){if(!e||!e.hasAttribute("data-ln-query"))return null;const r=e.getAttribute("data-ln-query");if(r&&r.trim()!=="")return r.trim();const o=e.getAttribute("data-ln-sort")||e.getAttribute("data-ln-search-for")||e.getAttribute("data-ln-search")||e.getAttribute("data-ln-filter")||e.id;return o?t?o+"_"+t:o:t||null}function je(e,t){return!t||t==="none"||e===null||e===void 0?null:String(e)+"."+t}function Ue(e,t){if(e&&typeof e=="string"){if(e.endsWith(".asc"))return{fieldOrColumn:e.slice(0,-4),direction:"asc"};if(e.endsWith(".desc"))return{fieldOrColumn:e.slice(0,-5),direction:"desc"}}if(t&&typeof t=="object"){const r=t.sort_field||t.sort_by;if(r){const o=t.sort_dir&&String(t.sort_dir).toLowerCase()==="desc"?"desc":"asc";return{fieldOrColumn:r,direction:o}}}return null}function We(e){return!Array.isArray(e)||e.length===0?null:e.map(encodeURIComponent).join(",")}function He(e){return!e||typeof e!="string"?[]:e.split(",").map(function(t){try{return decodeURIComponent(t.trim())}catch{return t.trim()}}).filter(Boolean)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.queryParse=Me,window.lnCore.queryGet=$e,window.lnCore.querySet=Be,window.lnCore.resolveQueryParam=Ve,window.lnCore.querySortEncode=je,window.lnCore.querySortDecode=Ue,window.lnCore.queryFilterEncode=We,window.lnCore.queryFilterDecode=He);function Pe(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.uuid=Pe);const ee={required:"valueMissing",typeMismatch:"typeMismatch",tooShort:"tooShort",tooLong:"tooLong",patternMismatch:"patternMismatch",rangeUnderflow:"rangeUnderflow",rangeOverflow:"rangeOverflow"};function te(e,t=0){return e?!!(e.valid&&t===0):t===0}function Qe(e){return e.type==="checkbox"||e.type==="radio"?!!e.checked:!!(e.value&&e.value.trim()!=="")}function Ge(e,t){const r=[];if(e){const o=Object.keys(ee);for(let i=0;i<o.length;i++){const l=o[i],s=ee[l];e[s]&&r.push(l)}}if(t){const o=Array.from(t);for(let i=0;i<o.length;i++)o[i]&&r.indexOf(o[i])===-1&&r.push(o[i])}return r}(function(){const e="data-ln-validate",t="lnValidate",r="data-ln-validate-errors",o="data-ln-validate-error",i="ln-validate-valid",l="ln-validate-invalid";if(window[t]!==void 0)return;const s={"data-ln-validate":{type:"marker",description:"Activates validation on form input or field"},"data-ln-validate-errors":{type:"marker",description:"Container element holding validation error message elements"},"data-ln-validate-error":{type:"string",description:"Identifies error message template for a specific validation rule"}};function a(n){this.dom=n,this._touched=!1,this._customErrors=new Set;const c=this,u=n.tagName,d=n.type,h=u==="SELECT"||d==="checkbox"||d==="radio";this._onInput=function(){c._touched=!0,c.validate()},this._onChange=function(){c._touched=!0,c.validate()},this._onSetCustom=function(b){const f=b.detail&&b.detail.error;if(!f)return;c._customErrors.add(f),c._touched=!0;const w=c._getErrorItems();if(w)for(let p=0;p<w.length;p++)w[p].key===f&&w[p].el.classList.remove("hidden");n.classList.remove(i),n.classList.add(l),n.setAttribute("aria-invalid","true")},this._onClearCustom=function(b){const f=b.detail&&b.detail.error,w=c._getErrorItems();if(f){if(c._customErrors.delete(f),w)for(let p=0;p<w.length;p++)w[p].key===f&&w[p].el.classList.add("hidden")}else{if(w)for(let p=0;p<w.length;p++)c._customErrors.has(w[p].key)&&w[p].el.classList.add("hidden");c._customErrors.clear()}c._touched&&c.validate()},h||n.addEventListener("input",this._onInput),n.addEventListener("change",this._onChange),n.addEventListener("ln-validate:set-custom",this._onSetCustom),n.addEventListener("ln-validate:clear-custom",this._onClearCustom);const m=n.form;return m&&(m.hasAttribute("novalidate")||m.setAttribute("novalidate",""),this._onFormReset=function(){c.reset()},this._onValidateRequest=function(b){c._touched=!0,!c.validate()&&b.detail&&b.detail.invalidFields&&b.detail.invalidFields.push(c.dom)},m.addEventListener("reset",this._onFormReset),m.addEventListener("ln-validate:request-validate",this._onValidateRequest),m._lnValidateGateBound||(m._lnValidateGateBound=!0,m.addEventListener("submit",function(b){const f={invalidFields:[]};A(m,"ln-validate:request-validate",f),f.invalidFields.length>0&&(b.preventDefault(),f.invalidFields.sort((w,p)=>w.compareDocumentPosition(p)&Node.DOCUMENT_POSITION_PRECEDING?-1:1),f.invalidFields[0].focus())}))),Qe(n)&&(this._touched=!0,this.validate()),this}a.prototype._getErrorItems=function(){if(this._errorItems!==void 0)return this._errorItems;const n=this.dom.closest(":has(> ["+r+"])");if(n){const c=n.querySelector("["+r+"]");if(c){const u=c.querySelectorAll("["+o+"]");this._errorItems=[];for(let d=0;d<u.length;d++)this._errorItems.push({el:u[d],key:u[d].getAttribute(o)});return this._errorItems}}return this._errorItems=null,null},a.prototype.validate=function(){const n=this.dom,c=n.validity,u=te(c,this._customErrors.size),d=Ge(c,this._customErrors),h=this._getErrorItems();if(h)for(let f=0;f<h.length;f++){const w=!d.includes(h[f].key);h[f].el.classList.contains("hidden")!==w&&h[f].el.classList.toggle("hidden",w)}n.classList.contains(i)!==u&&n.classList.toggle(i,u),n.classList.contains(l)===u&&n.classList.toggle(l,!u);const m=u?"false":"true";return n.getAttribute("aria-invalid")!==m&&n.setAttribute("aria-invalid",m),A(n,u?"ln-validate:valid":"ln-validate:invalid",{target:n,field:n.name,errors:d}),u},a.prototype.reset=function(){this._touched=!1,this._customErrors.clear(),this.dom.classList.contains(i)&&this.dom.classList.remove(i),this.dom.classList.contains(l)&&this.dom.classList.remove(l),this.dom.hasAttribute("aria-invalid")&&this.dom.removeAttribute("aria-invalid");const n=this._getErrorItems();if(n)for(let c=0;c<n.length;c++)n[c].el.classList.contains("hidden")||n[c].el.classList.add("hidden")},Object.defineProperty(a.prototype,"isValid",{get:function(){return te(this.dom.validity,this._customErrors.size)}}),a.prototype.destroy=function(){if(!this.dom[t])return;this.dom.removeEventListener("input",this._onInput),this.dom.removeEventListener("change",this._onChange),this.dom.removeEventListener("ln-validate:set-custom",this._onSetCustom),this.dom.removeEventListener("ln-validate:clear-custom",this._onClearCustom);const n=this.dom.form;n&&(this._onFormReset&&n.removeEventListener("reset",this._onFormReset),this._onValidateRequest&&n.removeEventListener("ln-validate:request-validate",this._onValidateRequest)),this.dom.classList.remove(i,l),this.dom.removeAttribute("aria-invalid"),this._errorItems=null,delete this.dom[t]},Y(e,t,a,"ln-validate",{attributes:s})})()})();
@@ -15,12 +15,6 @@
15
15
  "ln-validate.scss"
16
16
  ]
17
17
  },
18
- "data-ln-form": {
19
- "direction": null,
20
- "sources": [
21
- "ln-validate-dev.scss"
22
- ]
23
- },
24
18
  "data-ln-validate": {
25
19
  "direction": null,
26
20
  "sources": [
@@ -45,10 +45,11 @@ import { hasInitialValue, isFieldValid, resolveActiveErrorKeys } from './validat
45
45
  if (!error) return;
46
46
  self._customErrors.add(error);
47
47
  self._touched = true;
48
- const parent = dom.closest('.form-element');
49
- if (parent) {
50
- const el = parent.querySelector('[' + ERROR_SELECTOR + '="' + error + '"]');
51
- if (el) el.classList.remove('hidden');
48
+ const items = self._getErrorItems();
49
+ if (items) {
50
+ for (let i = 0; i < items.length; i++) {
51
+ if (items[i].key === error) items[i].el.classList.remove('hidden');
52
+ }
52
53
  }
53
54
  dom.classList.remove(CSS_VALID);
54
55
  dom.classList.add(CSS_INVALID);
@@ -57,20 +58,22 @@ import { hasInitialValue, isFieldValid, resolveActiveErrorKeys } from './validat
57
58
 
58
59
  this._onClearCustom = function (e) {
59
60
  const error = e.detail && e.detail.error;
60
- const parent = dom.closest('.form-element');
61
+ const items = self._getErrorItems();
61
62
  if (error) {
62
63
  self._customErrors.delete(error);
63
- if (parent) {
64
- const el = parent.querySelector('[' + ERROR_SELECTOR + '="' + error + '"]');
65
- if (el) el.classList.add('hidden');
64
+ if (items) {
65
+ for (let i = 0; i < items.length; i++) {
66
+ if (items[i].key === error) items[i].el.classList.add('hidden');
67
+ }
66
68
  }
67
69
  } else {
68
- self._customErrors.forEach(function (err) {
69
- if (parent) {
70
- const el = parent.querySelector('[' + ERROR_SELECTOR + '="' + err + '"]');
71
- if (el) el.classList.add('hidden');
70
+ if (items) {
71
+ for (let i = 0; i < items.length; i++) {
72
+ if (self._customErrors.has(items[i].key)) {
73
+ items[i].el.classList.add('hidden');
74
+ }
72
75
  }
73
- });
76
+ }
74
77
  self._customErrors.clear();
75
78
  }
76
79
  if (self._touched) self.validate();
@@ -127,23 +130,39 @@ import { hasInitialValue, isFieldValid, resolveActiveErrorKeys } from './validat
127
130
  return this;
128
131
  }
129
132
 
133
+ _component.prototype._getErrorItems = function () {
134
+ if (this._errorItems !== undefined) return this._errorItems;
135
+ const parent = this.dom.closest(':has(> [' + ERRORS_SELECTOR + '])');
136
+ if (parent) {
137
+ const errorList = parent.querySelector('[' + ERRORS_SELECTOR + ']');
138
+ if (errorList) {
139
+ const nodeList = errorList.querySelectorAll('[' + ERROR_SELECTOR + ']');
140
+ this._errorItems = [];
141
+ for (let i = 0; i < nodeList.length; i++) {
142
+ this._errorItems.push({
143
+ el: nodeList[i],
144
+ key: nodeList[i].getAttribute(ERROR_SELECTOR)
145
+ });
146
+ }
147
+ return this._errorItems;
148
+ }
149
+ }
150
+ this._errorItems = null;
151
+ return null;
152
+ };
153
+
130
154
  _component.prototype.validate = function () {
131
155
  const dom = this.dom;
132
156
  const validity = dom.validity;
133
157
  const isValid = isFieldValid(validity, this._customErrors.size);
134
158
  const activeErrors = resolveActiveErrorKeys(validity, this._customErrors);
135
159
 
136
- const parent = dom.closest('.form-element');
137
- if (parent) {
138
- const errorList = parent.querySelector('[' + ERRORS_SELECTOR + ']');
139
- if (errorList) {
140
- const items = errorList.querySelectorAll('[' + ERROR_SELECTOR + ']');
141
- for (let i = 0; i < items.length; i++) {
142
- const errorKey = items[i].getAttribute(ERROR_SELECTOR);
143
- const shouldHide = !activeErrors.includes(errorKey);
144
- if (items[i].classList.contains('hidden') !== shouldHide) {
145
- items[i].classList.toggle('hidden', shouldHide);
146
- }
160
+ const items = this._getErrorItems();
161
+ if (items) {
162
+ for (let i = 0; i < items.length; i++) {
163
+ const shouldHide = !activeErrors.includes(items[i].key);
164
+ if (items[i].el.classList.contains('hidden') !== shouldHide) {
165
+ items[i].el.classList.toggle('hidden', shouldHide);
147
166
  }
148
167
  }
149
168
  }
@@ -173,12 +192,11 @@ import { hasInitialValue, isFieldValid, resolveActiveErrorKeys } from './validat
173
192
  if (this.dom.classList.contains(CSS_INVALID)) this.dom.classList.remove(CSS_INVALID);
174
193
  if (this.dom.hasAttribute('aria-invalid')) this.dom.removeAttribute('aria-invalid');
175
194
 
176
- const parent = this.dom.closest('.form-element');
177
- if (parent) {
178
- const items = parent.querySelectorAll('[' + ERROR_SELECTOR + ']');
195
+ const items = this._getErrorItems();
196
+ if (items) {
179
197
  for (let i = 0; i < items.length; i++) {
180
- if (!items[i].classList.contains('hidden')) {
181
- items[i].classList.add('hidden');
198
+ if (!items[i].el.classList.contains('hidden')) {
199
+ items[i].el.classList.add('hidden');
182
200
  }
183
201
  }
184
202
  }
@@ -205,6 +223,7 @@ import { hasInitialValue, isFieldValid, resolveActiveErrorKeys } from './validat
205
223
 
206
224
  this.dom.classList.remove(CSS_VALID, CSS_INVALID);
207
225
  this.dom.removeAttribute('aria-invalid');
226
+ this._errorItems = null;
208
227
  delete this.dom[DOM_ATTRIBUTE];
209
228
  };
210
229