@livenetworks/ashlar 1.6.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. package/LICENSE +641 -0
  2. package/README.md +202 -86
  3. package/{js → components}/COMPONENTS.md +1116 -1108
  4. package/{js → components}/index.js +81 -58
  5. package/{js → components}/ln-accordion/README.md +7 -6
  6. package/components/ln-accordion/ln-accordion-dev.scss +8 -0
  7. package/components/ln-accordion/ln-accordion.js +1 -0
  8. package/components/ln-accordion/ln-accordion.schema.json +30 -0
  9. package/components/ln-accordion/ln-accordion.scss +8 -0
  10. package/{js → components}/ln-accordion/src/ln-accordion.js +8 -2
  11. package/{js → components}/ln-ajax/README.md +171 -160
  12. package/components/ln-ajax/ln-ajax-dev.scss +8 -0
  13. package/components/ln-ajax/ln-ajax.js +1 -0
  14. package/components/ln-ajax/ln-ajax.schema.json +30 -0
  15. package/{js → components}/ln-ajax/src/ln-ajax.js +65 -30
  16. package/{js → components}/ln-api-connector/README.md +27 -5
  17. package/components/ln-api-connector/ln-api-connector.js +1 -0
  18. package/components/ln-api-connector/ln-api-connector.schema.json +96 -0
  19. package/components/ln-api-connector/src/connector-core.js +97 -0
  20. package/components/ln-api-connector/src/ln-api-connector.js +447 -0
  21. package/{js → components}/ln-api-queue/README.md +12 -9
  22. package/components/ln-api-queue/ln-api-queue.js +1 -0
  23. package/components/ln-api-queue/ln-api-queue.schema.json +34 -0
  24. package/{js → components}/ln-api-queue/src/ln-api-queue.js +33 -14
  25. package/{js → components}/ln-api-queue/src/queue-storage.js +7 -3
  26. package/{js → components}/ln-autoresize/README.md +129 -127
  27. package/components/ln-autoresize/ln-autoresize-dev.scss +8 -0
  28. package/components/ln-autoresize/ln-autoresize.js +1 -0
  29. package/components/ln-autoresize/ln-autoresize.schema.json +22 -0
  30. package/{js → components}/ln-autoresize/src/ln-autoresize.js +8 -1
  31. package/{js → components}/ln-autosave/README.md +127 -124
  32. package/components/ln-autosave/ln-autosave-dev.scss +13 -0
  33. package/components/ln-autosave/ln-autosave.js +1 -0
  34. package/components/ln-autosave/ln-autosave.schema.json +48 -0
  35. package/components/ln-autosave/src/autosave-model.js +34 -0
  36. package/{js → components}/ln-autosave/src/ln-autosave.js +65 -58
  37. package/components/ln-chart/README.md +145 -0
  38. package/components/ln-chart/ln-chart-dev.scss +20 -0
  39. package/components/ln-chart/ln-chart.js +1 -0
  40. package/components/ln-chart/ln-chart.schema.json +146 -0
  41. package/components/ln-chart/ln-chart.scss +8 -0
  42. package/components/ln-chart/src/chart-model.js +154 -0
  43. package/components/ln-chart/src/ln-chart.js +176 -0
  44. package/{js → components}/ln-circular-progress/README.md +15 -14
  45. package/components/ln-circular-progress/ln-circular-progress-dev.scss +8 -0
  46. package/components/ln-circular-progress/ln-circular-progress.js +1 -0
  47. package/components/ln-circular-progress/ln-circular-progress.schema.json +42 -0
  48. package/{js → components}/ln-circular-progress/src/ln-circular-progress.js +32 -50
  49. package/components/ln-confirm/README.md +216 -0
  50. package/components/ln-confirm/ln-confirm-dev.scss +24 -0
  51. package/components/ln-confirm/ln-confirm.js +1 -0
  52. package/components/ln-confirm/ln-confirm.schema.json +66 -0
  53. package/components/ln-confirm/ln-confirm.scss +24 -0
  54. package/{js → components}/ln-confirm/src/ln-confirm.js +180 -167
  55. package/{js → components}/ln-core/README.md +374 -149
  56. package/components/ln-core/attrs.js +273 -0
  57. package/components/ln-core/compare.js +40 -0
  58. package/components/ln-core/crypto.js +265 -0
  59. package/components/ln-core/date.js +50 -0
  60. package/components/ln-core/dom.js +115 -0
  61. package/components/ln-core/events.js +122 -0
  62. package/components/ln-core/form.js +136 -0
  63. package/{js → components}/ln-core/hash.js +149 -92
  64. package/components/ln-core/helpers.js +33 -0
  65. package/components/ln-core/http.js +48 -0
  66. package/components/ln-core/index.js +11 -0
  67. package/components/ln-core/lifecycle.js +403 -0
  68. package/components/ln-core/ln-core.schema.json +109 -0
  69. package/components/ln-core/locale.js +55 -0
  70. package/components/ln-core/matching.js +78 -0
  71. package/components/ln-core/number.js +125 -0
  72. package/components/ln-core/progress.js +30 -0
  73. package/components/ln-core/template.js +206 -0
  74. package/{js → components}/ln-core/window-cache.js +247 -213
  75. package/{js → components}/ln-couchdb-connector/README.md +7 -5
  76. package/components/ln-couchdb-connector/ln-couchdb-connector.js +1 -0
  77. package/components/ln-couchdb-connector/ln-couchdb-connector.schema.json +50 -0
  78. package/{js → components}/ln-couchdb-connector/src/ln-couchdb-connector.js +29 -43
  79. package/{js → components}/ln-data-coordinator/README.md +109 -73
  80. package/components/ln-data-coordinator/ln-data-coordinator-dev.scss +8 -0
  81. package/components/ln-data-coordinator/ln-data-coordinator.js +1 -0
  82. package/components/ln-data-coordinator/ln-data-coordinator.schema.json +196 -0
  83. package/components/ln-data-coordinator/src/data-read-policy.js +41 -0
  84. package/{js → components}/ln-data-coordinator/src/ln-data-coordinator.js +411 -154
  85. package/{js → components}/ln-data-coordinator/src/mutation-receipts.js +0 -5
  86. package/{js → components}/ln-data-store/README.md +42 -17
  87. package/components/ln-data-store/ln-data-store-dev.scss +13 -0
  88. package/components/ln-data-store/ln-data-store.js +1 -0
  89. package/components/ln-data-store/ln-data-store.schema.json +84 -0
  90. package/components/ln-data-store/src/data-store-model.js +155 -0
  91. package/{js → components}/ln-data-store/src/ln-data-store.js +407 -105
  92. package/components/ln-data-store/src/window-index.js +119 -0
  93. package/{js → components}/ln-date/README.md +17 -7
  94. package/{js → components}/ln-date/ln-date-dev.scss +14 -14
  95. package/components/ln-date/ln-date.js +1 -0
  96. package/components/ln-date/ln-date.schema.json +92 -0
  97. package/components/ln-date/src/date-model.js +186 -0
  98. package/components/ln-date/src/ln-date.js +486 -0
  99. package/components/ln-debug/README.md +132 -0
  100. package/components/ln-debug/ln-debug.js +1 -0
  101. package/components/ln-debug/ln-debug.schema.json +28 -0
  102. package/components/ln-debug/src/console-sink.js +19 -0
  103. package/components/ln-debug/src/debug-verifier.js +331 -0
  104. package/components/ln-debug/src/gate.js +95 -0
  105. package/components/ln-debug/src/generated-attributes.js +299 -0
  106. package/components/ln-debug/src/ln-debug.js +60 -0
  107. package/{js → components}/ln-dropdown/README.md +150 -140
  108. package/components/ln-dropdown/ln-dropdown-dev.scss +13 -0
  109. package/components/ln-dropdown/ln-dropdown.js +1 -0
  110. package/components/ln-dropdown/ln-dropdown.schema.json +90 -0
  111. package/components/ln-dropdown/ln-dropdown.scss +18 -0
  112. package/{js → components}/ln-dropdown/src/ln-dropdown.js +114 -11
  113. package/{js → components}/ln-editor/README.md +11 -9
  114. package/components/ln-editor/ln-editor-dev.scss +18 -0
  115. package/components/ln-editor/ln-editor.js +1 -0
  116. package/components/ln-editor/ln-editor.schema.json +58 -0
  117. package/components/ln-editor/ln-editor.scss +13 -0
  118. package/{js → components}/ln-editor/src/ln-editor.js +59 -11
  119. package/{js → components}/ln-external-links/README.md +10 -8
  120. package/components/ln-external-links/ln-external-links.js +1 -0
  121. package/components/ln-external-links/ln-external-links.schema.json +18 -0
  122. package/{js → components}/ln-external-links/src/ln-external-links.js +13 -11
  123. package/{js → components}/ln-fill/README.md +6 -8
  124. package/components/ln-fill/ln-fill.js +1 -0
  125. package/components/ln-fill/ln-fill.schema.json +23 -0
  126. package/{js → components}/ln-fill/src/ln-fill.js +7 -1
  127. package/components/ln-filter/README.md +131 -0
  128. package/components/ln-filter/ln-filter-dev.scss +13 -0
  129. package/components/ln-filter/ln-filter.js +1 -0
  130. package/components/ln-filter/ln-filter.schema.json +153 -0
  131. package/components/ln-filter/src/filter-model.js +185 -0
  132. package/components/ln-filter/src/ln-filter.js +435 -0
  133. package/{js → components}/ln-form/README.md +260 -264
  134. package/components/ln-form/ln-form-dev.scss +8 -0
  135. package/components/ln-form/ln-form.js +1 -0
  136. package/components/ln-form/ln-form.schema.json +45 -0
  137. package/{js → components}/ln-form/src/ln-form.js +107 -99
  138. package/{js → components}/ln-http/README.md +11 -6
  139. package/components/ln-http/ln-http.js +1 -0
  140. package/components/ln-http/ln-http.schema.json +6 -0
  141. package/components/ln-http/src/http-core.js +51 -0
  142. package/{js → components}/ln-http/src/ln-http.js +28 -33
  143. package/{js → components}/ln-icon/README.md +16 -9
  144. package/components/ln-icon/ln-icon.schema.json +6 -0
  145. package/components/ln-include/README.md +75 -0
  146. package/components/ln-include/ln-include-dev.scss +13 -0
  147. package/components/ln-include/ln-include.js +1 -0
  148. package/components/ln-include/ln-include.schema.json +23 -0
  149. package/components/ln-include/src/ln-include.js +111 -0
  150. package/components/ln-key/README.md +130 -0
  151. package/components/ln-key/ln-key-dev.scss +18 -0
  152. package/components/ln-key/ln-key.js +1 -0
  153. package/components/ln-key/ln-key.schema.json +56 -0
  154. package/components/ln-key/src/key-model.js +146 -0
  155. package/components/ln-key/src/ln-key.js +201 -0
  156. package/{js → components}/ln-link/README.md +7 -9
  157. package/components/ln-link/ln-link-dev.scss +8 -0
  158. package/components/ln-link/ln-link.js +1 -0
  159. package/components/ln-link/ln-link.schema.json +22 -0
  160. package/{js → components}/ln-link/src/ln-link.js +16 -11
  161. package/components/ln-list/README.md +152 -0
  162. package/components/ln-list/ln-list-dev.scss +8 -0
  163. package/components/ln-list/ln-list.js +1 -0
  164. package/components/ln-list/ln-list.schema.json +166 -0
  165. package/components/ln-list/ln-list.scss +25 -0
  166. package/{js → components}/ln-list/src/ln-list.js +1301 -1216
  167. package/{js → components}/ln-modal/README.md +13 -10
  168. package/components/ln-modal/ln-modal-dev.scss +18 -0
  169. package/components/ln-modal/ln-modal.js +1 -0
  170. package/components/ln-modal/ln-modal.schema.json +54 -0
  171. package/components/ln-modal/ln-modal.scss +51 -0
  172. package/{js → components}/ln-modal/src/ln-modal.js +164 -137
  173. package/{js → components}/ln-nav/README.md +11 -11
  174. package/components/ln-nav/ln-nav.js +1 -0
  175. package/components/ln-nav/ln-nav.schema.json +25 -0
  176. package/{js → components}/ln-nav/src/ln-nav.js +25 -14
  177. package/components/ln-number/README.md +205 -0
  178. package/{js → components}/ln-number/ln-number-dev.scss +13 -13
  179. package/components/ln-number/ln-number.js +1 -0
  180. package/components/ln-number/ln-number.schema.json +63 -0
  181. package/components/ln-number/src/ln-number.js +400 -0
  182. package/components/ln-number/src/number-model.js +31 -0
  183. package/components/ln-obfuscator/README.md +60 -0
  184. package/components/ln-obfuscator/ln-obfuscator.js +1 -0
  185. package/components/ln-obfuscator/ln-obfuscator.schema.json +49 -0
  186. package/components/ln-obfuscator/src/ln-obfuscator.js +159 -0
  187. package/components/ln-obfuscator/src/obfuscator-model.js +250 -0
  188. package/{js → components}/ln-options/README.md +3 -1
  189. package/components/ln-options/ln-options-dev.scss +13 -0
  190. package/components/ln-options/ln-options.js +1 -0
  191. package/components/ln-options/ln-options.schema.json +41 -0
  192. package/{js → components}/ln-options/src/ln-options.js +13 -5
  193. package/components/ln-persist/README.md +151 -0
  194. package/components/ln-persist/ln-persist.js +1 -0
  195. package/components/ln-persist/ln-persist.schema.json +28 -0
  196. package/components/ln-persist/src/ln-persist.js +83 -0
  197. package/components/ln-picklist/README.md +230 -0
  198. package/components/ln-picklist/ln-picklist-dev.scss +22 -0
  199. package/components/ln-picklist/ln-picklist.js +1 -0
  200. package/components/ln-picklist/ln-picklist.schema.json +49 -0
  201. package/components/ln-picklist/src/ln-picklist.js +228 -0
  202. package/{js → components}/ln-popover/README.md +164 -162
  203. package/components/ln-popover/ln-popover-dev.scss +13 -0
  204. package/components/ln-popover/ln-popover.js +1 -0
  205. package/components/ln-popover/ln-popover.schema.json +82 -0
  206. package/components/ln-popover/ln-popover.scss +18 -0
  207. package/{js → components}/ln-popover/src/ln-popover.js +42 -36
  208. package/{js → components}/ln-progress/README.md +410 -413
  209. package/components/ln-progress/ln-progress-dev.scss +8 -0
  210. package/components/ln-progress/ln-progress.js +1 -0
  211. package/components/ln-progress/ln-progress.schema.json +40 -0
  212. package/components/ln-progress/src/ln-progress.js +91 -0
  213. package/components/ln-progress/src/progress-model.js +20 -0
  214. package/{js → components}/ln-router/README.md +443 -432
  215. package/components/ln-router/ln-router-dev.scss +13 -0
  216. package/components/ln-router/ln-router.js +1 -0
  217. package/components/ln-router/ln-router.schema.json +68 -0
  218. package/{js → components}/ln-router/src/ln-router.js +585 -539
  219. package/components/ln-router/src/router-model.js +50 -0
  220. package/components/ln-scroll/README.md +45 -0
  221. package/components/ln-scroll/ln-scroll.js +1 -0
  222. package/components/ln-scroll/ln-scroll.schema.json +85 -0
  223. package/components/ln-scroll/src/ln-scroll.js +150 -0
  224. package/components/ln-search/README.md +188 -0
  225. package/components/ln-search/ln-search-dev.scss +13 -0
  226. package/components/ln-search/ln-search.js +1 -0
  227. package/components/ln-search/ln-search.schema.json +103 -0
  228. package/components/ln-search/src/ln-search.js +330 -0
  229. package/{js → components}/ln-slug/README.md +6 -3
  230. package/components/ln-slug/ln-slug-dev.scss +18 -0
  231. package/components/ln-slug/ln-slug.js +1 -0
  232. package/components/ln-slug/ln-slug.schema.json +23 -0
  233. package/{js → components}/ln-slug/src/ln-slug.js +20 -13
  234. package/components/ln-slug/src/slug-model.js +21 -0
  235. package/{js → components}/ln-sort/README.md +178 -170
  236. package/{js → components}/ln-sort/ln-sort-dev.scss +8 -8
  237. package/components/ln-sort/ln-sort.js +1 -0
  238. package/components/ln-sort/ln-sort.schema.json +104 -0
  239. package/components/ln-sort/src/ln-sort.js +321 -0
  240. package/components/ln-sort/src/sort-model.js +117 -0
  241. package/{js → components}/ln-sortable/README.md +7 -11
  242. package/components/ln-sortable/ln-sortable-dev.scss +13 -0
  243. package/components/ln-sortable/ln-sortable.js +1 -0
  244. package/components/ln-sortable/ln-sortable.schema.json +36 -0
  245. package/{js → components}/ln-sortable/src/ln-sortable.js +8 -13
  246. package/{js → components}/ln-stat/README.md +3 -1
  247. package/components/ln-stat/ln-stat-dev.scss +8 -0
  248. package/components/ln-stat/ln-stat.js +1 -0
  249. package/components/ln-stat/ln-stat.schema.json +32 -0
  250. package/{js → components}/ln-stat/src/ln-stat.js +14 -18
  251. package/components/ln-stat/src/stat-model.js +28 -0
  252. package/{js → components}/ln-table/README.md +37 -24
  253. package/{js → components}/ln-table/ln-table-dev.scss +17 -17
  254. package/components/ln-table/ln-table.js +1 -0
  255. package/components/ln-table/ln-table.schema.json +211 -0
  256. package/components/ln-table/ln-table.scss +15 -0
  257. package/{js → components}/ln-table/src/ln-table.js +1365 -1493
  258. package/components/ln-table/src/table-model.js +98 -0
  259. package/components/ln-table-coordinator/README.md +61 -0
  260. package/components/ln-table-coordinator/ln-table-coordinator.js +1 -0
  261. package/components/ln-table-coordinator/ln-table-coordinator.schema.json +93 -0
  262. package/components/ln-table-coordinator/src/ln-table-coordinator.js +193 -0
  263. package/{js → components}/ln-tabs/README.md +32 -14
  264. package/components/ln-tabs/ln-tabs-dev.scss +24 -0
  265. package/components/ln-tabs/ln-tabs.js +1 -0
  266. package/components/ln-tabs/ln-tabs.schema.json +75 -0
  267. package/components/ln-tabs/ln-tabs.scss +8 -0
  268. package/components/ln-tabs/src/ln-tabs.js +207 -0
  269. package/components/ln-tabs/src/tabs-model.js +82 -0
  270. package/{js → components}/ln-time/README.md +96 -95
  271. package/components/ln-time/ln-time-dev.scss +13 -0
  272. package/components/ln-time/ln-time.js +1 -0
  273. package/components/ln-time/ln-time.schema.json +38 -0
  274. package/{js → components}/ln-time/src/ln-time.js +206 -223
  275. package/components/ln-time/src/time-model.js +64 -0
  276. package/{js → components}/ln-toast/README.md +23 -5
  277. package/components/ln-toast/ln-toast-dev.scss +8 -0
  278. package/components/ln-toast/ln-toast.js +1 -0
  279. package/components/ln-toast/ln-toast.schema.json +65 -0
  280. package/components/ln-toast/ln-toast.scss +59 -0
  281. package/{js → components}/ln-toast/src/ln-toast.js +233 -232
  282. package/{js → components}/ln-toggle/README.md +198 -196
  283. package/{js → components}/ln-toggle/ln-toggle-dev.scss +13 -13
  284. package/components/ln-toggle/ln-toggle.js +1 -0
  285. package/components/ln-toggle/ln-toggle.schema.json +52 -0
  286. package/components/ln-toggle/ln-toggle.scss +37 -0
  287. package/{js → components}/ln-toggle/src/ln-toggle.js +61 -46
  288. package/{js → components}/ln-tooltip/README.md +6 -6
  289. package/{js → components}/ln-tooltip/ln-tooltip-dev.scss +9 -9
  290. package/components/ln-tooltip/ln-tooltip.js +1 -0
  291. package/components/ln-tooltip/ln-tooltip.schema.json +86 -0
  292. package/components/ln-tooltip/ln-tooltip.scss +9 -0
  293. package/{js → components}/ln-tooltip/src/ln-tooltip.js +14 -3
  294. package/{js → components}/ln-translations/README.md +3 -1
  295. package/components/ln-translations/ln-translations-dev.scss +13 -0
  296. package/components/ln-translations/ln-translations.js +1 -0
  297. package/components/ln-translations/ln-translations.schema.json +120 -0
  298. package/{js → components}/ln-translations/src/ln-translations.js +25 -10
  299. package/components/ln-ui-coordinator/README.md +101 -0
  300. package/components/ln-ui-coordinator/ln-ui-coordinator-dev.scss +8 -0
  301. package/components/ln-ui-coordinator/ln-ui-coordinator.js +1 -0
  302. package/components/ln-ui-coordinator/ln-ui-coordinator.schema.json +60 -0
  303. package/{js/ln-modal-coordinator/src/ln-modal-coordinator.js → components/ln-ui-coordinator/src/ln-ui-coordinator.js} +403 -345
  304. package/components/ln-upload/README.md +133 -0
  305. package/components/ln-upload/ln-upload-dev.scss +18 -0
  306. package/components/ln-upload/ln-upload.js +1 -0
  307. package/components/ln-upload/ln-upload.schema.json +193 -0
  308. package/components/ln-upload/ln-upload.scss +20 -0
  309. package/components/ln-upload/src/ln-upload.js +652 -0
  310. package/components/ln-upload/src/upload-model.js +78 -0
  311. package/{js → components}/ln-validate/README.md +182 -180
  312. package/{js → components}/ln-validate/ln-validate-dev.scss +15 -15
  313. package/components/ln-validate/ln-validate.js +1 -0
  314. package/components/ln-validate/ln-validate.schema.json +50 -0
  315. package/components/ln-validate/ln-validate.scss +7 -0
  316. package/{js → components}/ln-validate/src/ln-validate.js +23 -45
  317. package/components/ln-validate/src/validate-model.js +64 -0
  318. package/components/ln-websocket-connector/README.md +166 -0
  319. package/components/ln-websocket-connector/ln-websocket-connector.js +1 -0
  320. package/components/ln-websocket-connector/ln-websocket-connector.schema.json +29 -0
  321. package/components/ln-websocket-connector/src/ln-websocket-connector.js +279 -0
  322. package/ln-ashlar.html-data.json +1796 -0
  323. package/package.json +84 -61
  324. package/{scss → theme}/base/_global.scss +1 -2
  325. package/{scss → theme}/base/_reset.scss +1 -1
  326. package/{scss → theme}/base/_typography.scss +2 -0
  327. package/theme/brand.css +73 -0
  328. package/{scss → theme}/components/_app-shell.scss +8 -0
  329. package/theme/components/_button.scss +24 -0
  330. package/theme/components/_chart.scss +5 -0
  331. package/theme/components/_confirm.scss +6 -0
  332. package/{scss → theme}/components/_date.scss +30 -22
  333. package/{scss → theme}/components/_dropdown.scss +6 -1
  334. package/theme/components/_form.scss +140 -0
  335. package/{scss → theme}/components/_layout.scss +6 -0
  336. package/{scss → theme}/components/_ln-table.scss +1 -6
  337. package/theme/components/_picklist.scss +3 -0
  338. package/{scss → theme}/components/_sort.scss +10 -10
  339. package/theme/components/_status-badge.scss +6 -0
  340. package/{scss → theme}/components/_table.scss +16 -0
  341. package/{scss → theme}/components/_tabs.scss +0 -4
  342. package/theme/components/_toast.scss +48 -0
  343. package/{scss → theme}/components/_toggle.scss +1 -1
  344. package/theme/components/_upload.scss +45 -0
  345. package/{scss → theme}/config/_breakpoints.scss +1 -1
  346. package/theme/config/_contrast.scss +128 -0
  347. package/{scss → theme}/config/_density.scss +191 -205
  348. package/theme/config/_palette.scss +274 -0
  349. package/theme/config/_theme.scss +293 -0
  350. package/{scss → theme}/config/_tokens.scss +285 -441
  351. package/{scss → theme}/config/mixins/_accordion.scss +1 -1
  352. package/{scss → theme}/config/mixins/_alert.scss +1 -0
  353. package/{scss → theme}/config/mixins/_app-shell.scss +4 -2
  354. package/{scss → theme}/config/mixins/_borders.scss +2 -0
  355. package/theme/config/mixins/_btn.scss +175 -0
  356. package/{scss → theme}/config/mixins/_card.scss +55 -46
  357. package/theme/config/mixins/_chart.scss +82 -0
  358. package/{scss → theme}/config/mixins/_collapsible.scss +2 -1
  359. package/{scss → theme}/config/mixins/_colors.scss +8 -14
  360. package/{scss → theme}/config/mixins/_diagnostics.scss +48 -48
  361. package/theme/config/mixins/_dropdown.scss +169 -0
  362. package/{scss → theme}/config/mixins/_editor.scss +0 -7
  363. package/{scss → theme}/config/mixins/_filter.scss +47 -47
  364. package/{scss → theme}/config/mixins/_footer.scss +1 -1
  365. package/{scss → theme}/config/mixins/_form.scss +49 -18
  366. package/{scss → theme}/config/mixins/_index.scss +62 -61
  367. package/{scss → theme}/config/mixins/_layout.scss +6 -2
  368. package/{scss → theme}/config/mixins/_ln-table.scss +31 -10
  369. package/{scss → theme}/config/mixins/_loader.scss +1 -1
  370. package/{scss → theme}/config/mixins/_modal.scss +145 -149
  371. package/{scss → theme}/config/mixins/_motion.scss +13 -0
  372. package/{scss → theme}/config/mixins/_nav.scss +7 -7
  373. package/theme/config/mixins/_picklist.scss +66 -0
  374. package/theme/config/mixins/_popover.scss +96 -0
  375. package/{scss → theme}/config/mixins/_sidebar.scss +7 -4
  376. package/{scss → theme}/config/mixins/_sort.scss +43 -42
  377. package/{scss → theme}/config/mixins/_status-badge.scss +15 -2
  378. package/{scss → theme}/config/mixins/_table.scss +25 -14
  379. package/{scss → theme}/config/mixins/_tabs.scss +1 -1
  380. package/{scss → theme}/config/mixins/_toast.scss +174 -179
  381. package/{scss → theme}/config/mixins/_tooltip.scss +2 -2
  382. package/{scss → theme}/config/mixins/_typography.scss +16 -5
  383. package/{scss → theme}/config/mixins/_upload.scss +8 -6
  384. package/theme/ln-ashlar-core.scss +24 -0
  385. package/theme/ln-ashlar-dev.scss +66 -0
  386. package/theme/ln-ashlar-landing.scss +56 -0
  387. package/{scss/ln-ashlar.scss → theme/ln-ashlar-theme.scss} +63 -69
  388. package/theme/ln-ashlar.scss +8 -0
  389. package/theme/presentation/_bento.scss +151 -0
  390. package/theme/presentation/_cta.scss +111 -0
  391. package/theme/presentation/_effects.scss +216 -0
  392. package/theme/presentation/_features.scss +108 -0
  393. package/theme/presentation/_footer.scss +129 -0
  394. package/theme/presentation/_hero.scss +158 -0
  395. package/theme/presentation/_layout.scss +170 -0
  396. package/theme/presentation/_navbar.scss +140 -0
  397. package/theme/presentation/_pricing.scss +262 -0
  398. package/theme/presentation/_stats.scss +87 -0
  399. package/theme/presentation/_testimonials.scss +124 -0
  400. package/theme/presentation/_tokens.scss +39 -0
  401. package/theme/presentation/_typography.scss +163 -0
  402. package/{scss → theme}/utilities/_animations.scss +38 -0
  403. package/{scss → theme}/utilities/_utilities.scss +6 -0
  404. package/web-types.json +2312 -0
  405. package/js/ln-accordion/ln-accordion.js +0 -1
  406. package/js/ln-ajax/ln-ajax.js +0 -1
  407. package/js/ln-api-connector/ln-api-connector.js +0 -1
  408. package/js/ln-api-connector/src/ln-api-connector.js +0 -368
  409. package/js/ln-api-queue/ln-api-queue.js +0 -1
  410. package/js/ln-autoresize/ln-autoresize.js +0 -1
  411. package/js/ln-autosave/ln-autosave.js +0 -1
  412. package/js/ln-circular-progress/ln-circular-progress.js +0 -1
  413. package/js/ln-confirm/README.md +0 -162
  414. package/js/ln-confirm/_ln-confirm.scss +0 -24
  415. package/js/ln-confirm/ln-confirm.js +0 -1
  416. package/js/ln-core/crypto.js +0 -83
  417. package/js/ln-core/helpers.js +0 -788
  418. package/js/ln-core/index.js +0 -7
  419. package/js/ln-core/persist.js +0 -97
  420. package/js/ln-couchdb-connector/ln-couchdb-connector.js +0 -1
  421. package/js/ln-data-coordinator/ln-data-coordinator.js +0 -1
  422. package/js/ln-data-coordinator/src/data-read-policy.js +0 -18
  423. package/js/ln-data-store/ln-data-store.js +0 -1
  424. package/js/ln-date/ln-date.js +0 -1
  425. package/js/ln-date/src/ln-date.js +0 -603
  426. package/js/ln-debug/README.md +0 -58
  427. package/js/ln-debug/ln-debug.js +0 -1
  428. package/js/ln-debug/src/ln-debug.js +0 -19
  429. package/js/ln-dropdown/ln-dropdown.js +0 -1
  430. package/js/ln-dropdown/ln-dropdown.scss +0 -15
  431. package/js/ln-editor/ln-editor.js +0 -1
  432. package/js/ln-editor/ln-editor.scss +0 -43
  433. package/js/ln-external-links/ln-external-links.js +0 -1
  434. package/js/ln-fill/ln-fill.js +0 -1
  435. package/js/ln-filter/README.md +0 -189
  436. package/js/ln-filter/ln-filter-dev.scss +0 -8
  437. package/js/ln-filter/ln-filter.js +0 -1
  438. package/js/ln-filter/src/ln-filter.js +0 -419
  439. package/js/ln-form/ln-form.js +0 -1
  440. package/js/ln-http/ln-http.js +0 -1
  441. package/js/ln-link/ln-link.js +0 -1
  442. package/js/ln-list/README.md +0 -129
  443. package/js/ln-list/ln-list.js +0 -1
  444. package/js/ln-list/ln-list.scss +0 -28
  445. package/js/ln-modal/ln-modal-dev.scss +0 -13
  446. package/js/ln-modal/ln-modal.js +0 -1
  447. package/js/ln-modal/ln-modal.scss +0 -35
  448. package/js/ln-modal-coordinator/README.md +0 -99
  449. package/js/ln-modal-coordinator/ln-modal-coordinator-dev.scss +0 -8
  450. package/js/ln-modal-coordinator/ln-modal-coordinator.js +0 -1
  451. package/js/ln-nav/ln-nav.js +0 -1
  452. package/js/ln-number/README.md +0 -149
  453. package/js/ln-number/ln-number.js +0 -1
  454. package/js/ln-number/src/ln-number.js +0 -443
  455. package/js/ln-options/ln-options.js +0 -1
  456. package/js/ln-popover/ln-popover.js +0 -1
  457. package/js/ln-progress/ln-progress.js +0 -1
  458. package/js/ln-progress/src/ln-progress.js +0 -98
  459. package/js/ln-router/ln-router.js +0 -1
  460. package/js/ln-search/README.md +0 -158
  461. package/js/ln-search/ln-search-dev.scss +0 -8
  462. package/js/ln-search/ln-search.js +0 -1
  463. package/js/ln-search/src/ln-search.js +0 -117
  464. package/js/ln-slug/ln-slug.js +0 -1
  465. package/js/ln-sort/ln-sort.js +0 -1
  466. package/js/ln-sort/src/ln-sort.js +0 -178
  467. package/js/ln-sortable/ln-sortable.js +0 -1
  468. package/js/ln-stat/ln-stat.js +0 -1
  469. package/js/ln-table/ln-table.js +0 -1
  470. package/js/ln-table/ln-table.scss +0 -11
  471. package/js/ln-table-coordinator/README.md +0 -73
  472. package/js/ln-table-coordinator/ln-table-coordinator.js +0 -1
  473. package/js/ln-table-coordinator/src/ln-table-coordinator.js +0 -160
  474. package/js/ln-tabs/ln-tabs-dev.scss +0 -18
  475. package/js/ln-tabs/ln-tabs.js +0 -1
  476. package/js/ln-tabs/src/ln-tabs.js +0 -188
  477. package/js/ln-time/ln-time.js +0 -1
  478. package/js/ln-toast/ln-toast.js +0 -1
  479. package/js/ln-toggle/ln-toggle.js +0 -1
  480. package/js/ln-tooltip/ln-tooltip.js +0 -1
  481. package/js/ln-tooltip/ln-tooltip.scss +0 -9
  482. package/js/ln-translations/ln-translations.js +0 -1
  483. package/js/ln-upload/README.md +0 -255
  484. package/js/ln-upload/ln-upload.js +0 -1
  485. package/js/ln-upload/ln-upload.scss +0 -20
  486. package/js/ln-upload/src/ln-upload.js +0 -423
  487. package/js/ln-validate/ln-validate.js +0 -1
  488. package/scss/components/_button.scss +0 -20
  489. package/scss/components/_confirm.scss +0 -5
  490. package/scss/components/_form.scss +0 -107
  491. package/scss/components/_status-badge.scss +0 -4
  492. package/scss/components/_toast.scss +0 -68
  493. package/scss/components/_upload.scss +0 -51
  494. package/scss/config/_theme.scss +0 -216
  495. package/scss/config/mixins/_btn.scss +0 -179
  496. package/scss/config/mixins/_confirm.scss +0 -31
  497. package/scss/config/mixins/_dropdown.scss +0 -141
  498. package/scss/config/mixins/_popover.scss +0 -64
  499. package/scss/ln-ashlar-dev.scss +0 -39
  500. /package/{js → components}/ln-core/positioning.js +0 -0
  501. /package/{js → components}/ln-core/reactive.js +0 -0
  502. /package/{js → components}/ln-filter/ln-filter.scss +0 -0
  503. /package/{js → components}/ln-icon/ln-icon.js +0 -0
  504. /package/{js → components}/ln-icon/src/ln-icon.js +0 -0
  505. /package/{js → components}/ln-search/ln-search.scss +0 -0
  506. /package/{js → components}/ln-toast/template.html +0 -0
  507. /package/{scss → theme}/components/_accordion.scss +0 -0
  508. /package/{scss → theme}/components/_ajax.scss +0 -0
  509. /package/{scss → theme}/components/_alert.scss +0 -0
  510. /package/{scss → theme}/components/_avatar.scss +0 -0
  511. /package/{scss → theme}/components/_breadcrumbs.scss +0 -0
  512. /package/{scss → theme}/components/_card.scss +0 -0
  513. /package/{scss → theme}/components/_chip.scss +0 -0
  514. /package/{scss → theme}/components/_circular-progress.scss +0 -0
  515. /package/{scss → theme}/components/_editor.scss +0 -0
  516. /package/{scss → theme}/components/_empty-state.scss +0 -0
  517. /package/{scss → theme}/components/_filter.scss +0 -0
  518. /package/{scss → theme}/components/_link.scss +0 -0
  519. /package/{scss → theme}/components/_loader.scss +0 -0
  520. /package/{scss → theme}/components/_modal.scss +0 -0
  521. /package/{scss → theme}/components/_nav.scss +0 -0
  522. /package/{scss → theme}/components/_page-header.scss +0 -0
  523. /package/{scss → theme}/components/_popover.scss +0 -0
  524. /package/{scss → theme}/components/_progress.scss +0 -0
  525. /package/{scss → theme}/components/_prose.scss +0 -0
  526. /package/{scss → theme}/components/_scrollbar.scss +0 -0
  527. /package/{scss → theme}/components/_sections.scss +0 -0
  528. /package/{scss → theme}/components/_sidebar.scss +0 -0
  529. /package/{scss → theme}/components/_stat-card.scss +0 -0
  530. /package/{scss → theme}/components/_stepper.scss +0 -0
  531. /package/{scss → theme}/components/_timeline.scss +0 -0
  532. /package/{scss → theme}/components/_tooltip.scss +0 -0
  533. /package/{scss → theme}/components/_translations.scss +0 -0
  534. /package/{scss → theme}/config/_icons.scss +0 -0
  535. /package/{scss → theme}/config/_mixins.scss +0 -0
  536. /package/{scss → theme}/config/mixins/_ajax.scss +0 -0
  537. /package/{scss → theme}/config/mixins/_avatar.scss +0 -0
  538. /package/{scss → theme}/config/mixins/_breadcrumbs.scss +0 -0
  539. /package/{scss → theme}/config/mixins/_breakpoints.scss +0 -0
  540. /package/{scss → theme}/config/mixins/_chip.scss +0 -0
  541. /package/{scss → theme}/config/mixins/_circular-progress.scss +0 -0
  542. /package/{scss → theme}/config/mixins/_display.scss +0 -0
  543. /package/{scss → theme}/config/mixins/_empty-state.scss +0 -0
  544. /package/{scss → theme}/config/mixins/_focus.scss +0 -0
  545. /package/{scss → theme}/config/mixins/_interaction.scss +0 -0
  546. /package/{scss → theme}/config/mixins/_kbd.scss +0 -0
  547. /package/{scss → theme}/config/mixins/_link.scss +0 -0
  548. /package/{scss → theme}/config/mixins/_page-header.scss +0 -0
  549. /package/{scss → theme}/config/mixins/_position.scss +0 -0
  550. /package/{scss → theme}/config/mixins/_progress.scss +0 -0
  551. /package/{scss → theme}/config/mixins/_prose.scss +0 -0
  552. /package/{scss → theme}/config/mixins/_shadows.scss +0 -0
  553. /package/{scss → theme}/config/mixins/_sizing.scss +0 -0
  554. /package/{scss → theme}/config/mixins/_spacing.scss +0 -0
  555. /package/{scss → theme}/config/mixins/_stat-card.scss +0 -0
  556. /package/{scss → theme}/config/mixins/_stepper.scss +0 -0
  557. /package/{scss → theme}/config/mixins/_timeline.scss +0 -0
  558. /package/{scss → theme}/config/mixins/_transitions.scss +0 -0
  559. /package/{scss → theme}/config/mixins/_translations.scss +0 -0
  560. /package/{scss → theme}/tabler-icons.txt +0 -0
@@ -1 +0,0 @@
1
- (function(){"use strict";if(typeof window<"u"){const t=console.warn;console.warn=function(...e){typeof e[0]=="string"&&(e[0].startsWith("[ln-")||e[0].startsWith("[lnCore"))&&!(document.documentElement.hasAttribute("data-ln-debug")||document.body&&document.body.hasAttribute("data-ln-debug"))||t.apply(console,e)}}const w={};function D(t,e){w[t]||(w[t]=document.querySelector('[data-ln-template="'+t+'"]'));const o=w[t];return o?o.content.cloneNode(!0):(console.warn("["+(e||"ln-core")+'] Template "'+t+'" not found'),null)}function x(t,e,o){t.dispatchEvent(new CustomEvent(e,{bubbles:!0,detail:o||{}}))}function L(t,e){if(!t||!e)return t;const o=t.querySelectorAll("[data-ln-field]");for(let n=0;n<o.length;n++){const i=o[n],l=i.getAttribute("data-ln-field");e[l]!=null&&(i.textContent=e[l])}const s=t.querySelectorAll("[data-ln-attr]");for(let n=0;n<s.length;n++){const i=s[n],l=i.getAttribute("data-ln-attr").split(",");for(let c=0;c<l.length;c++){const a=l[c].trim().split(":");if(a.length!==2)continue;const u=a[0].trim(),f=a[1].trim();e[f]!=null&&i.setAttribute(u,e[f])}}const d=t.querySelectorAll("[data-ln-show]");for(let n=0;n<d.length;n++){const i=d[n],l=i.getAttribute("data-ln-show");l in e&&i.classList.toggle("hidden",!e[l])}const r=t.querySelectorAll("[data-ln-class]");for(let n=0;n<r.length;n++){const i=r[n],l=i.getAttribute("data-ln-class").split(",");for(let c=0;c<l.length;c++){const a=l[c].trim().split(":");if(a.length!==2)continue;const u=a[0].trim(),f=a[1].trim();f in e&&i.classList.toggle(u,!!e[f])}}return t}function M(t,e){t.matches&&t.matches("[data-ln-form], [data-ln-fillable]")&&t.dispatchEvent(new CustomEvent("ln-fill",{detail:e??null,bubbles:!0}));const o=t.querySelectorAll("[data-ln-form], [data-ln-fillable]");for(let s=0;s<o.length;s++)o[s].dispatchEvent(new CustomEvent("ln-fill",{detail:e??null,bubbles:!0}));return t}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._fillBound||(window.lnCore._fillBound=!0,document.addEventListener("ln-fill",function(t){if(!(!t.target.matches||!t.target.matches("[data-ln-fillable]")))if(t.detail)L(t.target,t.detail);else{const e=t.target.querySelectorAll("[data-ln-field]");for(let o=0;o<e.length;o++)e[o].textContent=""}})));function v(t,e){if(!t||!e)return t;const o=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);for(;o.nextNode();){const r=o.currentNode;r.textContent.indexOf("{{")!==-1&&(r.textContent=r.textContent.replace(/\{\{\s*(\w+)\s*\}\}/g,function(n,i){return e[i]!==void 0?e[i]:""}))}const s=function(r,n){return e[n]!==void 0?e[n]:""},d=Array.from(t.querySelectorAll("*"));t.nodeType===1&&d.push(t);for(let r=0;r<d.length;r++){const n=d[r],i=n.attributes;for(let l=0;l<i.length;l++){const c=i[l];c.value.indexOf("{{")!==-1&&n.setAttribute(c.name,c.value.replace(/\{\{\s*(\w+)\s*\}\}/g,s))}}return t}function N(t,e,o,s,d,r){const n={};for(let l=0;l<t.children.length;l++){const c=t.children[l],a=c.getAttribute("data-ln-key");a&&(n[a]=c)}const i=document.createDocumentFragment();for(let l=0;l<e.length;l++){const c=e[l],a=String(s(c));let u=n[a];if(u)d(u,c,l);else{const f=D(o,r);if(!f||(v(f,c),u=f.firstElementChild,!u))continue;u.setAttribute("data-ln-key",a),d(u,c,l)}i.appendChild(u)}t.textContent="",t.appendChild(i)}function O(t,e){if(!document.body){document.addEventListener("DOMContentLoaded",function(){O(t,e)}),console.warn("["+e+'] Script loaded before <body> — add "defer" to your <script> tag');return}t()}function m(t,e,o,s){if(t.nodeType!==1)return;const r=e.indexOf("[")!==-1||e.indexOf(".")!==-1||e.indexOf("#")!==-1?e:"["+e+"]",n=Array.from(t.querySelectorAll(r));t.matches&&t.matches(r)&&n.push(t);for(const i of n)i[o]||(i[o]=new s(i))}function j(t,e,o,s,d={}){const r=d.extraAttributes||[],n=d.onAttributeChange||null,i=d.onInit||null;function l(c){const a=c||document.body;m(a,t,e,o),i&&i(a)}return O(function(){const c=new MutationObserver(function(u){for(let f=0;f<u.length;f++){const h=u[f];if(h.type==="childList"){for(let g=0;g<h.addedNodes.length;g++){const p=h.addedNodes[g];p.nodeType===1&&(m(p,t,e,o),i&&i(p))}for(let g=0;g<h.removedNodes.length;g++){const p=h.removedNodes[g];if(p.nodeType===1){const _=t.indexOf("[")!==-1||t.indexOf(".")!==-1||t.indexOf("#")!==-1?t:"["+t+"]",b=Array.from(p.querySelectorAll(_));p.matches&&p.matches(_)&&b.push(p);for(let C=0;C<b.length;C++){const q=b[C];if(!document.contains(q)){const A=q[e];A&&typeof A.destroy=="function"&&A.destroy()}}}}}else h.type==="attributes"&&(n&&h.target[e]?n(h.target,h.attributeName):(m(h.target,t,e,o),i&&i(h.target)))}});let a=[];if(t.indexOf("[")!==-1){const u=/\[([\w-]+)/g;let f;for(;(f=u.exec(t))!==null;)a.push(f[1])}else a.push(t);c.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:a.concat(r)})},s),window[e]=l,document.readyState==="loading"?document.addEventListener("DOMContentLoaded",function(){l(document.body)}):l(document.body),l}const S={};function W(t,e){S[t]=e}function F(t){return S[t]||{ingress:e=>e,egress:e=>e}}const E={};function T(t,e){if(!t||typeof e!="object")return;const o=t.toLowerCase().split("-")[0];E[o]=e}function B(t){if(!t)return null;const e=t.toLowerCase().split("-")[0];return E[e]||null}T("mk",{monthsLong:["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],monthsShort:["јан","фев","мар","апр","мај","јун","јул","авг","септ","окт","ноем","дек"],daysLong:["недела","понеделник","вторник","среда","четврток","петок","сабота"],daysShort:["нед","пон","вт","ср","чет","пет","саб"]}),typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerDataMapper=W,window.lnCore.getDataMapper=F,window.lnCore.registerLocaleFallback=T,window.lnCore.getLocaleFallback=B,window.lnCore.fillTemplate=v,window.lnCore.fill=L,window.lnCore.lnFill=M,window.lnCore.renderList=N);function k(t){return(t||"").replace(/^#/,"")}function y(t){const e=t===void 0?location.hash:t,o={},s=k(e);if(!s)return o;const d=s.split("&");for(let r=0;r<d.length;r++){const n=d[r];if(!n)continue;const i=n.indexOf(":"),l=i>-1?n.slice(0,i):n,c=i>-1?n.slice(i+1):"";if(l)try{o[l]=decodeURIComponent(c)}catch{o[l]=c}}return o}function I(t){if(!t)return null;const e=y();return t in e?e[t]:null}function K(t,e){if(!t)return;const o=y();e==null?delete o[t]:o[t]=String(e);const d=Object.keys(o).map(function(r){const n=o[r];return n===""?r:r+":"+encodeURIComponent(n)}).join("&");k(location.hash)!==d&&(location.hash=d)}function R(t){return t.button===1||t.ctrlKey||t.metaKey||t.shiftKey?!1:(t.preventDefault(),!0)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.hashParse=y,window.lnCore.hashGet=I,window.lnCore.hashSet=K,window.lnCore.hashLinkClick=R),(function(){const t="data-ln-accordion",e="lnAccordion";if(window[e]!==void 0)return;function o(s){return this.dom=s,this._onToggleOpen=function(d){if(d.detail.target.closest("[data-ln-accordion]")!==s)return;const r=s.querySelectorAll("[data-ln-toggle]");for(const n of r)n!==d.detail.target&&n.closest("[data-ln-accordion]")===s&&n.getAttribute("data-ln-toggle")==="open"&&n.setAttribute("data-ln-toggle","close");x(s,"ln-accordion:change",{target:d.detail.target})},s.addEventListener("ln-toggle:open",this._onToggleOpen),this}o.prototype.destroy=function(){this.dom[e]&&(this.dom.removeEventListener("ln-toggle:open",this._onToggleOpen),x(this.dom,"ln-accordion:destroyed",{target:this.dom}),delete this.dom[e])},j(t,e,o,"ln-accordion")})()})();
@@ -1 +0,0 @@
1
- (function(){"use strict";if(typeof window<"u"){const t=console.warn;console.warn=function(...e){typeof e[0]=="string"&&(e[0].startsWith("[ln-")||e[0].startsWith("[lnCore"))&&!(document.documentElement.hasAttribute("data-ln-debug")||document.body&&document.body.hasAttribute("data-ln-debug"))||t.apply(console,e)}}const S={};function N(t,e){S[t]||(S[t]=document.querySelector('[data-ln-template="'+t+'"]'));const o=S[t];return o?o.content.cloneNode(!0):(console.warn("["+(e||"ln-core")+'] Template "'+t+'" not found'),null)}function A(t,e,o){t.dispatchEvent(new CustomEvent(e,{bubbles:!0,detail:o||{}}))}function K(t,e,o){const u=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:o||{}});return t.dispatchEvent(u),u}function T(t,e){if(!t||!e)return t;const o=t.querySelectorAll("[data-ln-field]");for(let i=0;i<o.length;i++){const a=o[i],s=a.getAttribute("data-ln-field");e[s]!=null&&(a.textContent=e[s])}const u=t.querySelectorAll("[data-ln-attr]");for(let i=0;i<u.length;i++){const a=u[i],s=a.getAttribute("data-ln-attr").split(",");for(let d=0;d<s.length;d++){const h=s[d].trim().split(":");if(h.length!==2)continue;const r=h[0].trim(),n=h[1].trim();e[n]!=null&&a.setAttribute(r,e[n])}}const p=t.querySelectorAll("[data-ln-show]");for(let i=0;i<p.length;i++){const a=p[i],s=a.getAttribute("data-ln-show");s in e&&a.classList.toggle("hidden",!e[s])}const f=t.querySelectorAll("[data-ln-class]");for(let i=0;i<f.length;i++){const a=f[i],s=a.getAttribute("data-ln-class").split(",");for(let d=0;d<s.length;d++){const h=s[d].trim().split(":");if(h.length!==2)continue;const r=h[0].trim(),n=h[1].trim();n in e&&a.classList.toggle(r,!!e[n])}}return t}function U(t,e){t.matches&&t.matches("[data-ln-form], [data-ln-fillable]")&&t.dispatchEvent(new CustomEvent("ln-fill",{detail:e??null,bubbles:!0}));const o=t.querySelectorAll("[data-ln-form], [data-ln-fillable]");for(let u=0;u<o.length;u++)o[u].dispatchEvent(new CustomEvent("ln-fill",{detail:e??null,bubbles:!0}));return t}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._fillBound||(window.lnCore._fillBound=!0,document.addEventListener("ln-fill",function(t){if(!(!t.target.matches||!t.target.matches("[data-ln-fillable]")))if(t.detail)T(t.target,t.detail);else{const e=t.target.querySelectorAll("[data-ln-field]");for(let o=0;o<e.length;o++)e[o].textContent=""}})));function v(t,e){if(!t||!e)return t;const o=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);for(;o.nextNode();){const f=o.currentNode;f.textContent.indexOf("{{")!==-1&&(f.textContent=f.textContent.replace(/\{\{\s*(\w+)\s*\}\}/g,function(i,a){return e[a]!==void 0?e[a]:""}))}const u=function(f,i){return e[i]!==void 0?e[i]:""},p=Array.from(t.querySelectorAll("*"));t.nodeType===1&&p.push(t);for(let f=0;f<p.length;f++){const i=p[f],a=i.attributes;for(let s=0;s<a.length;s++){const d=a[s];d.value.indexOf("{{")!==-1&&i.setAttribute(d.name,d.value.replace(/\{\{\s*(\w+)\s*\}\}/g,u))}}return t}function B(t,e,o,u,p,f){const i={};for(let s=0;s<t.children.length;s++){const d=t.children[s],h=d.getAttribute("data-ln-key");h&&(i[h]=d)}const a=document.createDocumentFragment();for(let s=0;s<e.length;s++){const d=e[s],h=String(u(d));let r=i[h];if(r)p(r,d,s);else{const n=N(o,f);if(!n||(v(n,d),r=n.firstElementChild,!r))continue;r.setAttribute("data-ln-key",h),p(r,d,s)}a.appendChild(r)}t.textContent="",t.appendChild(a)}function _(t,e){if(!document.body){document.addEventListener("DOMContentLoaded",function(){_(t,e)}),console.warn("["+e+'] Script loaded before <body> — add "defer" to your <script> tag');return}t()}function G(t,e){if(t.ctrlKey||t.metaKey||t.shiftKey||t.altKey||t.button!==0||!e)return!1;const o=e.getAttribute("href");return!(!o||e.getAttribute("target")==="_blank"||e.hasAttribute("download")||o.startsWith("mailto:")||o.startsWith("tel:")||o==="#"||o.startsWith("#")||e.hostname&&e.hostname!==window.location.hostname)}const q={};function I(t,e){q[t]=e}function P(t){return q[t]||{ingress:e=>e,egress:e=>e}}const D={};function O(t,e){if(!t||typeof e!="object")return;const o=t.toLowerCase().split("-")[0];D[o]=e}function X(t){if(!t)return null;const e=t.toLowerCase().split("-")[0];return D[e]||null}O("mk",{monthsLong:["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],monthsShort:["јан","фев","мар","апр","мај","јун","јул","авг","септ","окт","ноем","дек"],daysLong:["недела","понеделник","вторник","среда","четврток","петок","сабота"],daysShort:["нед","пон","вт","ср","чет","пет","саб"]}),typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerDataMapper=I,window.lnCore.getDataMapper=P,window.lnCore.registerLocaleFallback=O,window.lnCore.getLocaleFallback=X,window.lnCore.fillTemplate=v,window.lnCore.fill=T,window.lnCore.lnFill=U,window.lnCore.renderList=B);function F(t){return(t||"").replace(/^#/,"")}function E(t){const e=t===void 0?location.hash:t,o={},u=F(e);if(!u)return o;const p=u.split("&");for(let f=0;f<p.length;f++){const i=p[f];if(!i)continue;const a=i.indexOf(":"),s=a>-1?i.slice(0,a):i,d=a>-1?i.slice(a+1):"";if(s)try{o[s]=decodeURIComponent(d)}catch{o[s]=d}}return o}function H(t){if(!t)return null;const e=E();return t in e?e[t]:null}function z(t,e){if(!t)return;const o=E();e==null?delete o[t]:o[t]=String(e);const p=Object.keys(o).map(function(f){const i=o[f];return i===""?f:f+":"+encodeURIComponent(i)}).join("&");F(location.hash)!==p&&(location.hash=p)}function R(t){return t.button===1||t.ctrlKey||t.metaKey||t.shiftKey?!1:(t.preventDefault(),!0)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.hashParse=E,window.lnCore.hashGet=H,window.lnCore.hashSet=z,window.lnCore.hashLinkClick=R),(function(){const t="data-ln-ajax",e="lnAjax",o="data-ln-form-scope";if(window[e]!==void 0)return;function u(r){if(!r.hasAttribute(t)||r[e])return;r[e]=!0;const n=s(r);p(n.links),f(n.forms)}function p(r){for(const n of r){if(n[e+"Trigger"]||n.hostname&&n.hostname!==window.location.hostname)continue;const c=n.getAttribute("href");if(c&&c.includes("#"))continue;const l=function(b){if(!G(b,n))return;b.preventDefault();const y=n.getAttribute("href");y&&a("GET",y,null,n)};n.addEventListener("click",l),n[e+"Trigger"]=l}}function f(r){for(const n of r){if(n[e+"Trigger"])continue;if(n.hasAttribute(o)){n[e+"ScopeWarned"]||(n[e+"ScopeWarned"]=!0,console.warn("[ln-ajax] Form has data-ln-form-scope — the ln-data-coordinator write pipeline takes precedence; skipping ajax interception for this form."));continue}const c=function(l){if(l.defaultPrevented)return;l.preventDefault();const b=n.method.toUpperCase(),y=n.action,x=new FormData(n);for(const k of n.querySelectorAll('button, input[type="submit"]'))k.disabled=!0;a(b,y,x,n,function(){for(const k of n.querySelectorAll('button, input[type="submit"]'))k.disabled=!1})};n.addEventListener("submit",c),n[e+"Trigger"]=c}}function i(r){if(!r[e])return;const n=s(r);for(const c of n.links)c[e+"Trigger"]&&(c.removeEventListener("click",c[e+"Trigger"]),delete c[e+"Trigger"]);for(const c of n.forms)c[e+"Trigger"]&&(c.removeEventListener("submit",c[e+"Trigger"]),delete c[e+"Trigger"]);delete r[e]}function a(r,n,c,l,b){if(K(l,"ln-ajax:before-start",{method:r,url:n}).defaultPrevented)return;A(l,"ln-ajax:start",{method:r,url:n}),l.classList.add("ln-ajax--loading");const x=document.createElement("span");x.className="ln-ajax-spinner",l.appendChild(x);function k(){l.classList.remove("ln-ajax--loading");const g=l.querySelector(".ln-ajax-spinner");g&&g.remove(),b&&b()}let C=n;const M=document.querySelector('meta[name="csrf-token"]'),L=M?M.getAttribute("content"):null;c instanceof FormData&&L&&c.append("_token",L);const j={method:r,headers:{"X-Requested-With":"XMLHttpRequest",Accept:"application/json"}};if(L&&(j.headers["X-CSRF-TOKEN"]=L),r==="GET"&&c){const g=new URLSearchParams(c);C=n+(n.includes("?")?"&":"?")+g.toString()}else r!=="GET"&&c&&(j.body=c);fetch(C,j).then(function(g){const m=g.ok;return g.json().then(function(w){return{ok:m,status:g.status,data:w}})}).then(function(g){const m=g.data;if(g.ok){if(m.title&&(document.title=m.title),m.content)for(const w in m.content){const W=document.getElementById(w);W&&(W.innerHTML=m.content[w])}if(l.tagName==="A"){const w=l.getAttribute("href");w&&window.history.pushState({ajax:!0},"",w)}else l.tagName==="FORM"&&l.method.toUpperCase()==="GET"&&window.history.pushState({ajax:!0},"",C);A(l,"ln-ajax:success",{method:r,url:C,data:m})}else A(l,"ln-ajax:error",{method:r,url:C,status:g.status,data:m});if(m.message){const w=m.message;window.dispatchEvent(new CustomEvent("ln-toast:enqueue",{detail:{type:w.type||(g.ok?"success":"error"),title:w.title||"",message:w.body||""}}))}A(l,"ln-ajax:complete",{method:r,url:C}),k()}).catch(function(g){A(l,"ln-ajax:error",{method:r,url:C,error:g}),A(l,"ln-ajax:complete",{method:r,url:C}),k()})}function s(r){const n={links:[],forms:[]};return r.tagName==="A"&&r.getAttribute(t)!=="false"?n.links.push(r):r.tagName==="FORM"&&r.getAttribute(t)!=="false"?n.forms.push(r):(n.links=Array.from(r.querySelectorAll('a:not([data-ln-ajax="false"])')),n.forms=Array.from(r.querySelectorAll('form:not([data-ln-ajax="false"])'))),n}function d(){_(function(){new MutationObserver(function(n){for(const c of n)if(c.type==="childList"){for(const l of c.addedNodes)if(l.nodeType===1&&(u(l),!l.hasAttribute(t))){for(const y of l.querySelectorAll("["+t+"]"))u(y);const b=l.closest&&l.closest("["+t+"]");if(b&&b.getAttribute(t)!=="false"){const y=s(l);p(y.links),f(y.forms)}}}else c.type==="attributes"&&u(c.target)}).observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[t]})},"ln-ajax")}function h(){for(const r of document.querySelectorAll("["+t+"]"))u(r)}window[e]=u,window[e].destroy=i,d(),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",h):h()})()})();
@@ -1 +0,0 @@
1
- (function(){"use strict";if(typeof window<"u"){const t=console.warn;console.warn=function(...i){typeof i[0]=="string"&&(i[0].startsWith("[ln-")||i[0].startsWith("[lnCore"))&&!(document.documentElement.hasAttribute("data-ln-debug")||document.body&&document.body.hasAttribute("data-ln-debug"))||t.apply(console,i)}}const b={};function j(t,i){b[t]||(b[t]=document.querySelector('[data-ln-template="'+t+'"]'));const s=b[t];return s?s.content.cloneNode(!0):(console.warn("["+(i||"ln-core")+'] Template "'+t+'" not found'),null)}function p(t,i,s){t.dispatchEvent(new CustomEvent(i,{bubbles:!0,detail:s||{}}))}function L(t,i){if(!t||!i)return t;const s=t.querySelectorAll("[data-ln-field]");for(let l=0;l<s.length;l++){const e=s[l],a=e.getAttribute("data-ln-field");i[a]!=null&&(e.textContent=i[a])}const f=t.querySelectorAll("[data-ln-attr]");for(let l=0;l<f.length;l++){const e=f[l],a=e.getAttribute("data-ln-attr").split(",");for(let r=0;r<a.length;r++){const n=a[r].trim().split(":");if(n.length!==2)continue;const o=n[0].trim(),c=n[1].trim();i[c]!=null&&e.setAttribute(o,i[c])}}const d=t.querySelectorAll("[data-ln-show]");for(let l=0;l<d.length;l++){const e=d[l],a=e.getAttribute("data-ln-show");a in i&&e.classList.toggle("hidden",!i[a])}const u=t.querySelectorAll("[data-ln-class]");for(let l=0;l<u.length;l++){const e=u[l],a=e.getAttribute("data-ln-class").split(",");for(let r=0;r<a.length;r++){const n=a[r].trim().split(":");if(n.length!==2)continue;const o=n[0].trim(),c=n[1].trim();c in i&&e.classList.toggle(o,!!i[c])}}return t}function U(t,i){t.matches&&t.matches("[data-ln-form], [data-ln-fillable]")&&t.dispatchEvent(new CustomEvent("ln-fill",{detail:i??null,bubbles:!0}));const s=t.querySelectorAll("[data-ln-form], [data-ln-fillable]");for(let f=0;f<s.length;f++)s[f].dispatchEvent(new CustomEvent("ln-fill",{detail:i??null,bubbles:!0}));return t}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._fillBound||(window.lnCore._fillBound=!0,document.addEventListener("ln-fill",function(t){if(!(!t.target.matches||!t.target.matches("[data-ln-fillable]")))if(t.detail)L(t.target,t.detail);else{const i=t.target.querySelectorAll("[data-ln-field]");for(let s=0;s<i.length;s++)i[s].textContent=""}})));function E(t,i){if(!t||!i)return t;const s=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);for(;s.nextNode();){const u=s.currentNode;u.textContent.indexOf("{{")!==-1&&(u.textContent=u.textContent.replace(/\{\{\s*(\w+)\s*\}\}/g,function(l,e){return i[e]!==void 0?i[e]:""}))}const f=function(u,l){return i[l]!==void 0?i[l]:""},d=Array.from(t.querySelectorAll("*"));t.nodeType===1&&d.push(t);for(let u=0;u<d.length;u++){const l=d[u],e=l.attributes;for(let a=0;a<e.length;a++){const r=e[a];r.value.indexOf("{{")!==-1&&l.setAttribute(r.name,r.value.replace(/\{\{\s*(\w+)\s*\}\}/g,f))}}return t}function N(t,i,s,f,d,u){const l={};for(let a=0;a<t.children.length;a++){const r=t.children[a],n=r.getAttribute("data-ln-key");n&&(l[n]=r)}const e=document.createDocumentFragment();for(let a=0;a<i.length;a++){const r=i[a],n=String(f(r));let o=l[n];if(o)d(o,r,a);else{const c=j(s,u);if(!c||(E(c,r),o=c.firstElementChild,!o))continue;o.setAttribute("data-ln-key",n),d(o,r,a)}e.appendChild(o)}t.textContent="",t.appendChild(e)}function S(t,i){if(!document.body){document.addEventListener("DOMContentLoaded",function(){S(t,i)}),console.warn("["+i+'] Script loaded before <body> — add "defer" to your <script> tag');return}t()}function y(t,i,s,f){if(t.nodeType!==1)return;const u=i.indexOf("[")!==-1||i.indexOf(".")!==-1||i.indexOf("#")!==-1?i:"["+i+"]",l=Array.from(t.querySelectorAll(u));t.matches&&t.matches(u)&&l.push(t);for(const e of l)e[s]||(e[s]=new f(e))}function H(t,i,s,f,d={}){const u=d.extraAttributes||[],l=d.onAttributeChange||null,e=d.onInit||null;function a(r){const n=r||document.body;y(n,t,i,s),e&&e(n)}return S(function(){const r=new MutationObserver(function(o){for(let c=0;c<o.length;c++){const h=o[c];if(h.type==="childList"){for(let m=0;m<h.addedNodes.length;m++){const g=h.addedNodes[m];g.nodeType===1&&(y(g,t,i,s),e&&e(g))}for(let m=0;m<h.removedNodes.length;m++){const g=h.removedNodes[m];if(g.nodeType===1){const D=t.indexOf("[")!==-1||t.indexOf(".")!==-1||t.indexOf("#")!==-1?t:"["+t+"]",_=Array.from(g.querySelectorAll(D));g.matches&&g.matches(D)&&_.push(g);for(let v=0;v<_.length;v++){const T=_[v];if(!document.contains(T)){const A=T[i];A&&typeof A.destroy=="function"&&A.destroy()}}}}}else h.type==="attributes"&&(l&&h.target[i]?l(h.target,h.attributeName):(y(h.target,t,i,s),e&&e(h.target)))}});let n=[];if(t.indexOf("[")!==-1){const o=/\[([\w-]+)/g;let c;for(;(c=o.exec(t))!==null;)n.push(c[1])}else n.push(t);r.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:n.concat(u)})},f),window[i]=a,document.readyState==="loading"?document.addEventListener("DOMContentLoaded",function(){a(document.body)}):a(document.body),a}function w(...t){return t.filter(i=>i!=null&&i!=="").map((i,s)=>s===0?i.replace(/\/+$/,""):i.replace(/^\/+/,"").replace(/\/+$/,"")).filter(Boolean).join("/")}function I(t,i){return Object.assign({"Content-Type":"application/json",Accept:"application/json"},t,null)}function M(t,i="ln-core"){try{return t?JSON.parse(t):{}}catch(s){return console.error(`[${i}] Invalid headers JSON:`,s),{}}}const O={};function K(t,i){O[t]=i}function F(t){return O[t]||{ingress:i=>i,egress:i=>i}}const q={};function k(t,i){if(!t||typeof i!="object")return;const s=t.toLowerCase().split("-")[0];q[s]=i}function W(t){if(!t)return null;const i=t.toLowerCase().split("-")[0];return q[i]||null}k("mk",{monthsLong:["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],monthsShort:["јан","фев","мар","апр","мај","јун","јул","авг","септ","окт","ноем","дек"],daysLong:["недела","понеделник","вторник","среда","четврток","петок","сабота"],daysShort:["нед","пон","вт","ср","чет","пет","саб"]}),typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerDataMapper=K,window.lnCore.getDataMapper=F,window.lnCore.registerLocaleFallback=k,window.lnCore.getLocaleFallback=W,window.lnCore.fillTemplate=E,window.lnCore.fill=L,window.lnCore.lnFill=U,window.lnCore.renderList=N);function x(t){return(t||"").replace(/^#/,"")}function C(t){const i=t===void 0?location.hash:t,s={},f=x(i);if(!f)return s;const d=f.split("&");for(let u=0;u<d.length;u++){const l=d[u];if(!l)continue;const e=l.indexOf(":"),a=e>-1?l.slice(0,e):l,r=e>-1?l.slice(e+1):"";if(a)try{s[a]=decodeURIComponent(r)}catch{s[a]=r}}return s}function B(t){if(!t)return null;const i=C();return t in i?i[t]:null}function G(t,i){if(!t)return;const s=C();i==null?delete s[t]:s[t]=String(i);const d=Object.keys(s).map(function(u){const l=s[u];return l===""?u:u+":"+encodeURIComponent(l)}).join("&");x(location.hash)!==d&&(location.hash=d)}function R(t){return t.button===1||t.ctrlKey||t.metaKey||t.shiftKey?!1:(t.preventDefault(),!0)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.hashParse=C,window.lnCore.hashGet=B,window.lnCore.hashSet=G,window.lnCore.hashLinkClick=R),(function(){const t="data-ln-api-connector",i="lnApiConnector",s="lnConnector";if(window[i]!==void 0)return;function f(e){return e.ok?e.status===204?null:e.json():e.json().catch(()=>null).then(a=>{const r=new Error("HTTP "+e.status+": "+e.statusText);throw r.status=e.status,r.data=a,r})}function d(e){return this.dom=e,e[i]=this,e[s]=this,this.refreshConfig(),this._handlers=null,u(this),this}d.prototype.refreshConfig=function(){const e=this.dom;this.baseUrl=e.getAttribute("data-ln-api-base-url")||"",this.path=e.getAttribute("data-ln-api-path")||"",this.credentials="same-origin",this.paramKeys={offset:e.getAttribute("data-ln-api-param-offset")||"offset",limit:e.getAttribute("data-ln-api-param-limit")||"limit",search:e.getAttribute("data-ln-api-param-search")||"search",sortField:e.getAttribute("data-ln-api-param-sort-field")||"sort_field",sortDir:e.getAttribute("data-ln-api-param-sort-dir")||"sort_dir"};const a=e.getAttribute("data-ln-api-headers")||"";this.headers=M(a,"ln-api-connector"),(a.toLowerCase().includes("authorization")||a.toLowerCase().includes("bearer")||a.toLowerCase().includes("basic"))&&console.warn("[ln-api-connector] Security Warning: Sensitive authorization credentials detected in data-ln-api-headers attribute. Storing secrets in HTML DOM attributes is highly discouraged and vulnerable to XSS credential extraction. Please use HttpOnly session cookies or a Backend Proxy Gateway instead."),p(e,"ln-api-connector:config-changed",{baseUrl:this.baseUrl,path:this.path,headers:this.headers,paramKeys:this.paramKeys})},d.prototype._reqHeaders=function(e){const a=Object.assign({},I(this.headers),{"X-LN-Response":"data"});return e&&(a["Idempotency-Key"]=e),a},d.prototype.fetchDelta=function(e){const a=this;let r=w(a.baseUrl,a.path);return e!=null&&e!==""&&(r+=(r.indexOf("?")!==-1?"&":"?")+"since="+encodeURIComponent(e)),window.fetch(r,{method:"GET",headers:a._reqHeaders(),credentials:a.credentials}).then(f)},d.prototype.query=function(e){const a=this;e=e||{};let r=w(a.baseUrl,a.path);const n=a.paramKeys||{offset:"offset",limit:"limit",search:"search",sortField:"sort_field",sortDir:"sort_dir"},o=new URLSearchParams;e.search&&o.append(n.search,e.search),e.offset!=null&&o.append(n.offset,e.offset),e.limit!=null&&o.append(n.limit,e.limit),e.sort&&e.sort.field&&e.sort.direction&&(o.append(n.sortField,e.sort.field),o.append(n.sortDir,e.sort.direction)),e.filters&&typeof e.filters=="object"&&Object.keys(e.filters).forEach(h=>{const m=e.filters[h];Array.isArray(m)&&m.length>0&&o.append(h,m.join(","))});const c=o.toString();return c&&(r+=(r.indexOf("?")!==-1?"&":"?")+c),window.fetch(r,{method:"GET",headers:a._reqHeaders(),credentials:a.credentials}).then(f)},d.prototype.create=function(e,a,r){const n=this;return window.fetch(w(n.baseUrl,a||n.path),{method:"POST",headers:n._reqHeaders(r),credentials:n.credentials,body:JSON.stringify(e)}).then(f)},d.prototype.update=function(e,a,r,n,o){const c=this;r!=null&&(a=Object.assign({},a,{expected_version:r}));const h=n?w(c.baseUrl,n):w(c.baseUrl,c.path,e);return window.fetch(h,{method:"PUT",headers:c._reqHeaders(o),credentials:c.credentials,body:JSON.stringify(a)}).then(f)},d.prototype.delete=function(e,a,r){const n=this;return window.fetch(w(n.baseUrl,a||n.path,e),{method:"DELETE",headers:n._reqHeaders(r),credentials:n.credentials}).then(f)},d.prototype.bulkDelete=function(e,a,r){const n=this;return window.fetch(w(n.baseUrl,a||n.path)+"/bulk-delete",{method:"DELETE",headers:n._reqHeaders(r),credentials:n.credentials,body:JSON.stringify({ids:e})}).then(f)};function u(e){e._handlers={sync:function(r){const n=r.detail||{};e.fetchDelta(n.since).then(function(o){p(e.dom,"ln-api-connector:fetched",{data:o,since:n.since,meta:n.meta||null})}).catch(function(o){p(e.dom,"ln-api-connector:error",{action:"sync",error:o.message,status:o.status||0,data:o.data||null,since:n.since,meta:n.meta||null})})},query:function(r){const n=r.detail||{},o=n.query||n;e.query(o).then(function(c){const h=c||{};p(e.dom,"ln-api-connector:fetched",{data:h.data||(Array.isArray(h)?h:[]),total:h.total,filtered:h.filtered,offset:o.offset,queryGen:o.queryGen,meta:n.meta||null})}).catch(function(c){p(e.dom,"ln-api-connector:error",{action:"query",error:c.message,status:c.status||0,data:c.data||null,meta:n.meta||null})})},create:function(r){const n=r.detail||{};e.create(n.data,n.url,n.idempotencyKey).then(function(o){const c=o&&o.content!==void 0?o.content:o,h=o&&o.message?o.message:null;p(e.dom,"ln-api-connector:created",{record:c,tempId:n.tempId,message:h,meta:n.meta||null})}).catch(function(o){p(e.dom,"ln-api-connector:error",{action:"create",error:o.message,status:o.status||0,data:o.data||null,tempId:n.tempId,meta:n.meta||null})})},update:function(r){const n=r.detail||{};e.update(n.id,n.data,n.expected_version,n.url,n.idempotencyKey).then(function(o){const c=o&&o.content!==void 0?o.content:o,h=o&&o.message?o.message:null;p(e.dom,"ln-api-connector:updated",{record:c,id:n.id,message:h,meta:n.meta||null})}).catch(function(o){p(e.dom,"ln-api-connector:error",{action:"update",error:o.message,status:o.status||0,data:o.data||null,id:n.id,conflictData:o.status===409?o.data:null,meta:n.meta||null})})},delete:function(r){const n=r.detail||{};e.delete(n.id,n.url,n.idempotencyKey).then(function(o){const c=o&&o.message?o.message:null;p(e.dom,"ln-api-connector:deleted",{response:o,id:n.id,message:c,meta:n.meta||null})}).catch(function(o){p(e.dom,"ln-api-connector:error",{action:"delete",error:o.message,status:o.status||0,data:o.data||null,id:n.id,meta:n.meta||null})})},bulkDelete:function(r){const n=r.detail||{};e.bulkDelete(n.ids,n.url,n.idempotencyKey).then(function(o){const c=o&&o.message?o.message:null;p(e.dom,"ln-api-connector:bulk-deleted",{response:o,ids:n.ids,message:c,meta:n.meta||null})}).catch(function(o){p(e.dom,"ln-api-connector:error",{action:"bulk-delete",error:o.message,status:o.status||0,data:o.data||null,ids:n.ids,meta:n.meta||null})})}},["ln-api-connector","ln-rest-connector"].forEach(function(r){e.dom.addEventListener(r+":request-sync",e._handlers.sync),e.dom.addEventListener(r+":request-query",e._handlers.query),e.dom.addEventListener(r+":request-fetch",e._handlers.query),e.dom.addEventListener(r+":request-create",e._handlers.create),e.dom.addEventListener(r+":request-update",e._handlers.update),e.dom.addEventListener(r+":request-delete",e._handlers.delete),e.dom.addEventListener(r+":request-bulk-delete",e._handlers.bulkDelete)})}d.prototype.destroy=function(){if(!this.dom[i])return;const e=this;e._handlers&&(["ln-api-connector","ln-rest-connector"].forEach(function(r){e.dom.removeEventListener(r+":request-sync",e._handlers.sync),e.dom.removeEventListener(r+":request-query",e._handlers.query),e.dom.removeEventListener(r+":request-fetch",e._handlers.query),e.dom.removeEventListener(r+":request-create",e._handlers.create),e.dom.removeEventListener(r+":request-update",e._handlers.update),e.dom.removeEventListener(r+":request-delete",e._handlers.delete),e.dom.removeEventListener(r+":request-bulk-delete",e._handlers.bulkDelete)}),e._handlers=null),p(this.dom,"ln-api-connector:destroyed",{target:this.dom}),delete this.dom[i],delete this.dom[s]};function l(e){const a=e[i];a&&a.refreshConfig()}H(t,i,d,"ln-api-connector",{extraAttributes:["data-ln-api-base-url","data-ln-api-path","data-ln-api-headers","data-ln-api-param-offset","data-ln-api-param-limit","data-ln-api-param-search","data-ln-api-param-sort-field","data-ln-api-param-sort-dir"],onAttributeChange:l})})()})();
@@ -1,368 +0,0 @@
1
- import { registerComponent, dispatch, buildUrl, getHeaders, parseHeaders } from '../../ln-core';
2
-
3
- (function () {
4
- const DOM_SELECTOR = 'data-ln-api-connector';
5
- const DOM_ATTRIBUTE = 'lnApiConnector';
6
- const DOM_ALIAS = 'lnConnector';
7
-
8
- if (window[DOM_ATTRIBUTE] !== undefined) return;
9
-
10
- // ─── Response Resolver ──────────────────────────────────
11
-
12
- function _resolve(res) {
13
- if (res.ok) return res.status === 204 ? null : res.json();
14
- return res.json().catch(() => null).then(body => {
15
- const err = new Error('HTTP ' + res.status + ': ' + res.statusText);
16
- err.status = res.status;
17
- err.data = body;
18
- throw err;
19
- });
20
- }
21
-
22
- // ─── Component Constructor ─────────────────────────────
23
-
24
- function _component(dom) {
25
- this.dom = dom;
26
- dom[DOM_ATTRIBUTE] = this;
27
- dom[DOM_ALIAS] = this; // Set alias for compatibility
28
-
29
- this.refreshConfig();
30
- this._handlers = null;
31
- _bindEvents(this);
32
-
33
- return this;
34
- }
35
-
36
- // ─── Refresh Config from DOM Attributes ─────────────────
37
-
38
- _component.prototype.refreshConfig = function () {
39
- const dom = this.dom;
40
-
41
- this.baseUrl = dom.getAttribute('data-ln-api-base-url') || '';
42
- this.path = dom.getAttribute('data-ln-api-path') || '';
43
- this.credentials = 'same-origin';
44
-
45
- this.paramKeys = {
46
- offset: dom.getAttribute('data-ln-api-param-offset') || 'offset',
47
- limit: dom.getAttribute('data-ln-api-param-limit') || 'limit',
48
- search: dom.getAttribute('data-ln-api-param-search') || 'search',
49
- sortField: dom.getAttribute('data-ln-api-param-sort-field') || 'sort_field',
50
- sortDir: dom.getAttribute('data-ln-api-param-sort-dir') || 'sort_dir'
51
- };
52
-
53
- const rawHeaders = dom.getAttribute('data-ln-api-headers') || '';
54
- this.headers = parseHeaders(rawHeaders, 'ln-api-connector');
55
-
56
- if (rawHeaders.toLowerCase().includes('authorization') || rawHeaders.toLowerCase().includes('bearer') || rawHeaders.toLowerCase().includes('basic')) {
57
- console.warn('[ln-api-connector] Security Warning: Sensitive authorization credentials detected in data-ln-api-headers attribute. Storing secrets in HTML DOM attributes is highly discouraged and vulnerable to XSS credential extraction. Please use HttpOnly session cookies or a Backend Proxy Gateway instead.');
58
- }
59
-
60
- dispatch(dom, 'ln-api-connector:config-changed', {
61
- baseUrl: this.baseUrl,
62
- path: this.path,
63
- headers: this.headers,
64
- paramKeys: this.paramKeys
65
- });
66
- };
67
-
68
- // ─── Request Headers (forces X-LN-Response) ─────────────
69
-
70
- _component.prototype._reqHeaders = function (idempotencyKey) {
71
- const headers = Object.assign({}, getHeaders(this.headers), { 'X-LN-Response': 'data' });
72
- if (idempotencyKey) headers['Idempotency-Key'] = idempotencyKey;
73
- return headers;
74
- };
75
-
76
- // ─── JS API Methods (Promises) ──────────────────────────
77
-
78
- _component.prototype.fetchDelta = function (since) {
79
- const self = this;
80
- let url = buildUrl(self.baseUrl, self.path);
81
-
82
- if (since !== undefined && since !== null && since !== '') {
83
- url += (url.indexOf('?') !== -1 ? '&' : '?') + 'since=' + encodeURIComponent(since);
84
- }
85
-
86
- return window.fetch(url, { method: 'GET', headers: self._reqHeaders(), credentials: self.credentials })
87
- .then(_resolve);
88
- };
89
-
90
- _component.prototype.query = function (queryParams) {
91
- const self = this;
92
- queryParams = queryParams || {};
93
- let url = buildUrl(self.baseUrl, self.path);
94
-
95
- const keys = self.paramKeys || {
96
- offset: 'offset',
97
- limit: 'limit',
98
- search: 'search',
99
- sortField: 'sort_field',
100
- sortDir: 'sort_dir'
101
- };
102
-
103
- const searchParams = new URLSearchParams();
104
- if (queryParams.search) {
105
- searchParams.append(keys.search, queryParams.search);
106
- }
107
- if (queryParams.offset != null) {
108
- searchParams.append(keys.offset, queryParams.offset);
109
- }
110
- if (queryParams.limit != null) {
111
- searchParams.append(keys.limit, queryParams.limit);
112
- }
113
- if (queryParams.sort && queryParams.sort.field && queryParams.sort.direction) {
114
- searchParams.append(keys.sortField, queryParams.sort.field);
115
- searchParams.append(keys.sortDir, queryParams.sort.direction);
116
- }
117
- if (queryParams.filters && typeof queryParams.filters === 'object') {
118
- Object.keys(queryParams.filters).forEach(key => {
119
- const vals = queryParams.filters[key];
120
- if (Array.isArray(vals) && vals.length > 0) {
121
- searchParams.append(key, vals.join(','));
122
- }
123
- });
124
- }
125
-
126
- const qs = searchParams.toString();
127
- if (qs) {
128
- url += (url.indexOf('?') !== -1 ? '&' : '?') + qs;
129
- }
130
-
131
- return window.fetch(url, { method: 'GET', headers: self._reqHeaders(), credentials: self.credentials })
132
- .then(_resolve);
133
- };
134
-
135
- _component.prototype.create = function (payload, url, idempotencyKey) {
136
- const self = this;
137
- return window.fetch(buildUrl(self.baseUrl, url || self.path), {
138
- method: 'POST',
139
- headers: self._reqHeaders(idempotencyKey),
140
- credentials: self.credentials,
141
- body: JSON.stringify(payload)
142
- })
143
- .then(_resolve);
144
- };
145
-
146
- _component.prototype.update = function (id, payload, expectedVersion, url, idempotencyKey) {
147
- const self = this;
148
- if (expectedVersion !== undefined && expectedVersion !== null) {
149
- payload = Object.assign({}, payload, { expected_version: expectedVersion });
150
- }
151
- // An explicit `url` is the COMPLETE resource URL — it already carries the
152
- // id (e.g. the form's resolved action `/documents/42`). Do NOT re-append
153
- // id, symmetric with create(). Only the path fallback needs id appended.
154
- const target = url ? buildUrl(self.baseUrl, url) : buildUrl(self.baseUrl, self.path, id);
155
- return window.fetch(target, {
156
- method: 'PUT',
157
- headers: self._reqHeaders(idempotencyKey),
158
- credentials: self.credentials,
159
- body: JSON.stringify(payload)
160
- })
161
- .then(_resolve);
162
- };
163
-
164
- _component.prototype.delete = function (id, url, idempotencyKey) {
165
- const self = this;
166
- return window.fetch(buildUrl(self.baseUrl, url || self.path, id), {
167
- method: 'DELETE',
168
- headers: self._reqHeaders(idempotencyKey),
169
- credentials: self.credentials
170
- })
171
- .then(_resolve);
172
- };
173
-
174
- _component.prototype.bulkDelete = function (ids, url, idempotencyKey) {
175
- const self = this;
176
- return window.fetch(buildUrl(self.baseUrl, url || self.path) + '/bulk-delete', {
177
- method: 'DELETE',
178
- headers: self._reqHeaders(idempotencyKey),
179
- credentials: self.credentials,
180
- body: JSON.stringify({ ids: ids })
181
- })
182
- .then(_resolve);
183
- };
184
-
185
- // ─── DOM Event Routing ────────────────────────────────────
186
-
187
- function _bindEvents(self) {
188
- self._handlers = {
189
- sync: function (e) {
190
- const detail = e.detail || {};
191
- self.fetchDelta(detail.since)
192
- .then(function (data) {
193
- dispatch(self.dom, 'ln-api-connector:fetched', { data: data, since: detail.since, meta: detail.meta || null });
194
- })
195
- .catch(function (err) {
196
- dispatch(self.dom, 'ln-api-connector:error', {
197
- action: 'sync',
198
- error: err.message,
199
- status: err.status || 0,
200
- data: err.data || null,
201
- since: detail.since,
202
- meta: detail.meta || null
203
- });
204
- });
205
- },
206
- query: function (e) {
207
- const detail = e.detail || {};
208
- const queryParams = detail.query || detail;
209
- self.query(queryParams)
210
- .then(function (res) {
211
- const payload = res || {};
212
- dispatch(self.dom, 'ln-api-connector:fetched', {
213
- data: payload.data || (Array.isArray(payload) ? payload : []),
214
- total: payload.total,
215
- filtered: payload.filtered,
216
- offset: queryParams.offset,
217
- queryGen: queryParams.queryGen,
218
- meta: detail.meta || null
219
- });
220
- })
221
- .catch(function (err) {
222
- dispatch(self.dom, 'ln-api-connector:error', {
223
- action: 'query',
224
- error: err.message,
225
- status: err.status || 0,
226
- data: err.data || null,
227
- meta: detail.meta || null
228
- });
229
- });
230
- },
231
- create: function (e) {
232
- const detail = e.detail || {};
233
- self.create(detail.data, detail.url, detail.idempotencyKey)
234
- .then(function (body) {
235
- const record = (body && body.content !== undefined) ? body.content : body;
236
- const message = (body && body.message) ? body.message : null;
237
- dispatch(self.dom, 'ln-api-connector:created', { record: record, tempId: detail.tempId, message: message, meta: detail.meta || null });
238
- })
239
- .catch(function (err) {
240
- dispatch(self.dom, 'ln-api-connector:error', {
241
- action: 'create',
242
- error: err.message,
243
- status: err.status || 0,
244
- data: err.data || null,
245
- tempId: detail.tempId,
246
- meta: detail.meta || null
247
- });
248
- });
249
- },
250
- update: function (e) {
251
- const detail = e.detail || {};
252
- self.update(detail.id, detail.data, detail.expected_version, detail.url, detail.idempotencyKey)
253
- .then(function (body) {
254
- const record = (body && body.content !== undefined) ? body.content : body;
255
- const message = (body && body.message) ? body.message : null;
256
- dispatch(self.dom, 'ln-api-connector:updated', { record: record, id: detail.id, message: message, meta: detail.meta || null });
257
- })
258
- .catch(function (err) {
259
- dispatch(self.dom, 'ln-api-connector:error', {
260
- action: 'update',
261
- error: err.message,
262
- status: err.status || 0,
263
- data: err.data || null,
264
- id: detail.id,
265
- conflictData: err.status === 409 ? err.data : null,
266
- meta: detail.meta || null
267
- });
268
- });
269
- },
270
- delete: function (e) {
271
- const detail = e.detail || {};
272
- self.delete(detail.id, detail.url, detail.idempotencyKey)
273
- .then(function (body) {
274
- const message = (body && body.message) ? body.message : null;
275
- dispatch(self.dom, 'ln-api-connector:deleted', { response: body, id: detail.id, message: message, meta: detail.meta || null });
276
- })
277
- .catch(function (err) {
278
- dispatch(self.dom, 'ln-api-connector:error', {
279
- action: 'delete',
280
- error: err.message,
281
- status: err.status || 0,
282
- data: err.data || null,
283
- id: detail.id,
284
- meta: detail.meta || null
285
- });
286
- });
287
- },
288
- bulkDelete: function (e) {
289
- const detail = e.detail || {};
290
- self.bulkDelete(detail.ids, detail.url, detail.idempotencyKey)
291
- .then(function (body) {
292
- const message = (body && body.message) ? body.message : null;
293
- dispatch(self.dom, 'ln-api-connector:bulk-deleted', { response: body, ids: detail.ids, message: message, meta: detail.meta || null });
294
- })
295
- .catch(function (err) {
296
- dispatch(self.dom, 'ln-api-connector:error', {
297
- action: 'bulk-delete',
298
- error: err.message,
299
- status: err.status || 0,
300
- data: err.data || null,
301
- ids: detail.ids,
302
- meta: detail.meta || null
303
- });
304
- });
305
- }
306
- };
307
-
308
- // Support both general and REST namespaces for incoming requests
309
- const namespaces = ['ln-api-connector', 'ln-rest-connector'];
310
- namespaces.forEach(function (ns) {
311
- self.dom.addEventListener(ns + ':request-sync', self._handlers.sync);
312
- self.dom.addEventListener(ns + ':request-query', self._handlers.query);
313
- self.dom.addEventListener(ns + ':request-fetch', self._handlers.query);
314
- self.dom.addEventListener(ns + ':request-create', self._handlers.create);
315
- self.dom.addEventListener(ns + ':request-update', self._handlers.update);
316
- self.dom.addEventListener(ns + ':request-delete', self._handlers.delete);
317
- self.dom.addEventListener(ns + ':request-bulk-delete', self._handlers.bulkDelete);
318
- });
319
- }
320
-
321
- _component.prototype.destroy = function () {
322
- if (!this.dom[DOM_ATTRIBUTE]) return;
323
-
324
- const self = this;
325
- if (self._handlers) {
326
- const namespaces = ['ln-api-connector', 'ln-rest-connector'];
327
- namespaces.forEach(function (ns) {
328
- self.dom.removeEventListener(ns + ':request-sync', self._handlers.sync);
329
- self.dom.removeEventListener(ns + ':request-query', self._handlers.query);
330
- self.dom.removeEventListener(ns + ':request-fetch', self._handlers.query);
331
- self.dom.removeEventListener(ns + ':request-create', self._handlers.create);
332
- self.dom.removeEventListener(ns + ':request-update', self._handlers.update);
333
- self.dom.removeEventListener(ns + ':request-delete', self._handlers.delete);
334
- self.dom.removeEventListener(ns + ':request-bulk-delete', self._handlers.bulkDelete);
335
- });
336
- self._handlers = null;
337
- }
338
-
339
- dispatch(this.dom, 'ln-api-connector:destroyed', { target: this.dom });
340
-
341
- delete this.dom[DOM_ATTRIBUTE];
342
- delete this.dom[DOM_ALIAS];
343
- };
344
-
345
- // ─── Attribute Sync ────────────────────────────────────────
346
-
347
- function _syncAttribute(el) {
348
- const instance = el[DOM_ATTRIBUTE];
349
- if (!instance) return;
350
- instance.refreshConfig();
351
- }
352
-
353
- // ─── Registration ──────────────────────────────────────
354
-
355
- registerComponent(DOM_SELECTOR, DOM_ATTRIBUTE, _component, 'ln-api-connector', {
356
- extraAttributes: [
357
- 'data-ln-api-base-url',
358
- 'data-ln-api-path',
359
- 'data-ln-api-headers',
360
- 'data-ln-api-param-offset',
361
- 'data-ln-api-param-limit',
362
- 'data-ln-api-param-search',
363
- 'data-ln-api-param-sort-field',
364
- 'data-ln-api-param-sort-dir'
365
- ],
366
- onAttributeChange: _syncAttribute
367
- });
368
- })();
@@ -1 +0,0 @@
1
- (function(){"use strict";if(typeof window<"u"){const r=console.warn;console.warn=function(...t){typeof t[0]=="string"&&(t[0].startsWith("[ln-")||t[0].startsWith("[lnCore"))&&!(document.documentElement.hasAttribute("data-ln-debug")||document.body&&document.body.hasAttribute("data-ln-debug"))||r.apply(console,t)}}const E={};function N(r,t){E[r]||(E[r]=document.querySelector('[data-ln-template="'+r+'"]'));const s=E[r];return s?s.content.cloneNode(!0):(console.warn("["+(t||"ln-core")+'] Template "'+r+'" not found'),null)}function y(r,t,s){r.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:s||{}}))}function S(r,t){if(!r||!t)return r;const s=r.querySelectorAll("[data-ln-field]");for(let o=0;o<s.length;o++){const i=s[o],d=i.getAttribute("data-ln-field");t[d]!=null&&(i.textContent=t[d])}const l=r.querySelectorAll("[data-ln-attr]");for(let o=0;o<l.length;o++){const i=l[o],d=i.getAttribute("data-ln-attr").split(",");for(let e=0;e<d.length;e++){const n=d[e].trim().split(":");if(n.length!==2)continue;const a=n[0].trim(),f=n[1].trim();t[f]!=null&&i.setAttribute(a,t[f])}}const c=r.querySelectorAll("[data-ln-show]");for(let o=0;o<c.length;o++){const i=c[o],d=i.getAttribute("data-ln-show");d in t&&i.classList.toggle("hidden",!t[d])}const u=r.querySelectorAll("[data-ln-class]");for(let o=0;o<u.length;o++){const i=u[o],d=i.getAttribute("data-ln-class").split(",");for(let e=0;e<d.length;e++){const n=d[e].trim().split(":");if(n.length!==2)continue;const a=n[0].trim(),f=n[1].trim();f in t&&i.classList.toggle(a,!!t[f])}}return r}function U(r,t){r.matches&&r.matches("[data-ln-form], [data-ln-fillable]")&&r.dispatchEvent(new CustomEvent("ln-fill",{detail:t??null,bubbles:!0}));const s=r.querySelectorAll("[data-ln-form], [data-ln-fillable]");for(let l=0;l<s.length;l++)s[l].dispatchEvent(new CustomEvent("ln-fill",{detail:t??null,bubbles:!0}));return r}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._fillBound||(window.lnCore._fillBound=!0,document.addEventListener("ln-fill",function(r){if(!(!r.target.matches||!r.target.matches("[data-ln-fillable]")))if(r.detail)S(r.target,r.detail);else{const t=r.target.querySelectorAll("[data-ln-field]");for(let s=0;s<t.length;s++)t[s].textContent=""}})));function D(r,t){if(!r||!t)return r;const s=document.createTreeWalker(r,NodeFilter.SHOW_TEXT);for(;s.nextNode();){const u=s.currentNode;u.textContent.indexOf("{{")!==-1&&(u.textContent=u.textContent.replace(/\{\{\s*(\w+)\s*\}\}/g,function(o,i){return t[i]!==void 0?t[i]:""}))}const l=function(u,o){return t[o]!==void 0?t[o]:""},c=Array.from(r.querySelectorAll("*"));r.nodeType===1&&c.push(r);for(let u=0;u<c.length;u++){const o=c[u],i=o.attributes;for(let d=0;d<i.length;d++){const e=i[d];e.value.indexOf("{{")!==-1&&o.setAttribute(e.name,e.value.replace(/\{\{\s*(\w+)\s*\}\}/g,l))}}return r}function F(r,t,s,l,c,u){const o={};for(let d=0;d<r.children.length;d++){const e=r.children[d],n=e.getAttribute("data-ln-key");n&&(o[n]=e)}const i=document.createDocumentFragment();for(let d=0;d<t.length;d++){const e=t[d],n=String(l(e));let a=o[n];if(a)c(a,e,d);else{const f=N(s,u);if(!f||(D(f,e),a=f.firstElementChild,!a))continue;a.setAttribute("data-ln-key",n),c(a,e,d)}i.appendChild(a)}r.textContent="",r.appendChild(i)}function P(r,t){if(!document.body){document.addEventListener("DOMContentLoaded",function(){P(r,t)}),console.warn("["+t+'] Script loaded before <body> — add "defer" to your <script> tag');return}r()}function v(r,t,s,l){if(r.nodeType!==1)return;const u=t.indexOf("[")!==-1||t.indexOf(".")!==-1||t.indexOf("#")!==-1?t:"["+t+"]",o=Array.from(r.querySelectorAll(u));r.matches&&r.matches(u)&&o.push(r);for(const i of o)i[s]||(i[s]=new l(i))}function j(r,t,s,l,c={}){const u=c.extraAttributes||[],o=c.onAttributeChange||null,i=c.onInit||null;function d(e){const n=e||document.body;v(n,r,t,s),i&&i(n)}return P(function(){const e=new MutationObserver(function(a){for(let f=0;f<a.length;f++){const h=a[f];if(h.type==="childList"){for(let m=0;m<h.addedNodes.length;m++){const p=h.addedNodes[m];p.nodeType===1&&(v(p,r,t,s),i&&i(p))}for(let m=0;m<h.removedNodes.length;m++){const p=h.removedNodes[m];if(p.nodeType===1){const A=r.indexOf("[")!==-1||r.indexOf(".")!==-1||r.indexOf("#")!==-1?r:"["+r+"]",C=Array.from(p.querySelectorAll(A));p.matches&&p.matches(A)&&C.push(p);for(let I=0;I<C.length;I++){const M=C[I];if(!document.contains(M)){const L=M[t];L&&typeof L.destroy=="function"&&L.destroy()}}}}}else h.type==="attributes"&&(o&&h.target[t]?o(h.target,h.attributeName):(v(h.target,r,t,s),i&&i(h.target)))}});let n=[];if(r.indexOf("[")!==-1){const a=/\[([\w-]+)/g;let f;for(;(f=a.exec(r))!==null;)n.push(f[1])}else n.push(r);e.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:n.concat(u)})},l),window[t]=d,document.readyState==="loading"?document.addEventListener("DOMContentLoaded",function(){d(document.body)}):d(document.body),d}const T={};function W(r,t){T[r]=t}function V(r){return T[r]||{ingress:t=>t,egress:t=>t}}const Q={};function O(r,t){if(!r||typeof t!="object")return;const s=r.toLowerCase().split("-")[0];Q[s]=t}function H(r){if(!r)return null;const t=r.toLowerCase().split("-")[0];return Q[t]||null}O("mk",{monthsLong:["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],monthsShort:["јан","фев","мар","апр","мај","јун","јул","авг","септ","окт","ноем","дек"],daysLong:["недела","понеделник","вторник","среда","четврток","петок","сабота"],daysShort:["нед","пон","вт","ср","чет","пет","саб"]}),typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerDataMapper=W,window.lnCore.getDataMapper=V,window.lnCore.registerLocaleFallback=O,window.lnCore.getLocaleFallback=H,window.lnCore.fillTemplate=D,window.lnCore.fill=S,window.lnCore.lnFill=U,window.lnCore.renderList=F);function R(r){return(r||"").replace(/^#/,"")}function k(r){const t=r===void 0?location.hash:r,s={},l=R(t);if(!l)return s;const c=l.split("&");for(let u=0;u<c.length;u++){const o=c[u];if(!o)continue;const i=o.indexOf(":"),d=i>-1?o.slice(0,i):o,e=i>-1?o.slice(i+1):"";if(d)try{s[d]=decodeURIComponent(e)}catch{s[d]=e}}return s}function X(r){if(!r)return null;const t=k();return r in t?t[r]:null}function z(r,t){if(!r)return;const s=k();t==null?delete s[r]:s[r]=String(t);const c=Object.keys(s).map(function(u){const o=s[u];return o===""?u:u+":"+encodeURIComponent(o)}).join("&");R(location.hash)!==c&&(location.hash=c)}function G(r){return r.button===1||r.ctrlKey||r.metaKey||r.shiftKey?!1:(r.preventDefault(),!0)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.hashParse=k,window.lnCore.hashGet=X,window.lnCore.hashSet=z,window.lnCore.hashLinkClick=G);const J="ln_api_queue",Y=2,_="outbox",w="_queue_meta";function g(r,t){return r.error||new Error(t)}function b(r,t){return r.bound([t,-1/0],[t,1/0])}function K(r){return"seq:"+r}function q(r){return"paused:"+r}function B(r){r.leaseOwner=null,r.leaseUntil=0}function Z(r,t,s){return typeof r!="string"||r.indexOf(t)===-1?r:r.split(t).join(s)}function $(r,t,s,l){const c=new Map,u=[],o=[];for(const i of r||[])c.has(i.chainKey)||c.set(i.chainKey,[]),c.get(i.chainKey).push(i);return c.forEach((i,d)=>{i.sort((n,a)=>n.seq-a.seq);const e=i[0];if(!(!e||e.status==="failed")){if(e.status==="inflight"&&(e.leaseUntil||0)>l){o.push({chainKey:d,at:e.leaseUntil});return}if((e.nextAttemptAt||0)>l){o.push({chainKey:d,at:e.nextAttemptAt});return}e.status="inflight",e.leaseOwner=t,e.leaseUntil=l+s,e.updatedAt=l,u.push(e)}}),{entries:u,wakeups:o}}function ee(r,t,s,l,c){const u=[],o=[];for(const i of r||[]){if(i.entryId===t){o.push(i.entryId);continue}i.chainKey===s&&(i.chainKey=l,i.targetId===s&&(i.targetId=l),i.meta&&i.meta.id===s&&(i.meta.id=l),i.meta&&typeof i.meta.action=="string"&&(i.meta.action=Z(i.meta.action,s,l)),i.updatedAt=c,u.push(i))}return{changed:u,deleted:o}}class te{constructor(t){t=t||{},this.indexedDB=t.indexedDB||globalThis.indexedDB,this.keyRange=t.IDBKeyRange||globalThis.IDBKeyRange,this.dbName=t.dbName||J,this.now=t.now||(()=>Date.now()),this.uuid=t.uuid||(()=>crypto.randomUUID()),this._db=null,this._ready=null}open(){return this._ready?this._ready:!this.indexedDB||!this.keyRange?Promise.resolve(null):(this._ready=new Promise((t,s)=>{const l=this.indexedDB.open(this.dbName,Y);l.onupgradeneeded=c=>{const u=c.target.result;let o;u.objectStoreNames.contains(_)?o=c.target.transaction.objectStore(_):o=u.createObjectStore(_,{keyPath:"entryId"}),o.indexNames.contains("by_scope_chain")||o.createIndex("by_scope_chain",["scope","chainKey"],{unique:!1}),o.indexNames.contains("by_scope_seq")||o.createIndex("by_scope_seq",["scope","seq"],{unique:!1}),u.objectStoreNames.contains(w)||u.createObjectStore(w,{keyPath:"key"})},l.onerror=()=>s(g(l,"Queue database open failed")),l.onsuccess=c=>{this._db=c.target.result,this._db.onversionchange=()=>this.close(),t(this._db)}}),this._ready)}close(){this._db&&this._db.close(),this._db=null,this._ready=null}deleteDatabase(){return this.close(),this.indexedDB?new Promise((t,s)=>{const l=this.indexedDB.deleteDatabase(this.dbName);l.onsuccess=()=>t(),l.onerror=()=>s(g(l,"Queue database delete failed")),l.onblocked=()=>s(new Error("Queue database delete blocked"))}):Promise.resolve()}allForScope(t){return this.open().then(s=>s?new Promise((l,c)=>{const o=s.transaction(_,"readonly").objectStore(_).index("by_scope_seq").getAll(b(this.keyRange,t));o.onsuccess=()=>l(o.result||[]),o.onerror=()=>c(g(o,"Queue scope read failed"))}):[])}enqueue(t,s){return s=s||{},this.open().then(l=>l?new Promise((c,u)=>{const o=l.transaction([w,_],"readwrite"),i=o.objectStore(w),d=o.objectStore(_),e=K(t);let n=null;const a=h=>{const m=h+1;n={entryId:this.uuid(),scope:t,chainKey:s.chainKey,seq:m,op:s.op,targetId:s.targetId!==void 0?s.targetId:null,payload:s.payload,expectedVersion:s.expectedVersion!==void 0?s.expectedVersion:null,meta:s.meta||{},attempts:0,nextAttemptAt:0,status:"pending",leaseOwner:null,leaseUntil:0,createdAt:this.now(),updatedAt:this.now()},i.put({key:e,value:m}),d.put(n)},f=i.get(e);f.onerror=()=>u(g(f,"Queue sequence read failed")),f.onsuccess=()=>{const h=f.result;if(h&&typeof h.value=="number"){a(h.value);return}const m=d.index("by_scope_seq").getAll(b(this.keyRange,t));m.onerror=()=>u(g(m,"Queue sequence migration failed")),m.onsuccess=()=>{const p=(m.result||[]).reduce((x,A)=>Math.max(x,A.seq||0),0);a(p)}},o.oncomplete=()=>c(n),o.onerror=()=>u(o.error||new Error("Queue enqueue transaction failed")),o.onabort=()=>u(o.error||new Error("Queue enqueue transaction aborted"))}):null)}claimReady(t,s,l){return this.open().then(c=>c?new Promise((u,o)=>{const i=c.transaction(_,"readwrite"),d=i.objectStore(_),e=d.index("by_scope_seq").getAll(b(this.keyRange,t)),n=this.now();let a={entries:[],wakeups:[]};e.onerror=()=>o(g(e,"Queue claim read failed")),e.onsuccess=()=>{a=$(e.result||[],s,l,n);for(const f of a.entries)d.put(f)},i.oncomplete=()=>u(a),i.onerror=()=>o(i.error||new Error("Queue claim transaction failed")),i.onabort=()=>o(i.error||new Error("Queue claim transaction aborted"))}):{entries:[],wakeups:[]})}ack(t,s){return this._updateEntry(t,s,(l,c)=>(c.delete(l.entryId),{status:"acked",entry:l}))}nack(t,s,l,c){c=c||{};const u=c.maxAttempts||8,o=c.backoff||[2e3,5e3,15e3,6e4,3e5];return this.open().then(i=>i?new Promise((d,e)=>{const n=i.transaction([_,w],"readwrite"),a=n.objectStore(_),f=n.objectStore(w),h=a.get(s);let m=null;h.onerror=()=>e(g(h,"Queue nack read failed")),h.onsuccess=()=>{const p=h.result;if(!(!p||p.scope!==t)){if(l==="drop"){a.delete(p.entryId),m={status:"dropped",entry:p};return}if(B(p),p.updatedAt=this.now(),l==="auth"){p.status="pending",a.put(p),f.put({key:q(t),value:!0}),m={status:"auth",entry:p};return}if(l==="retry"){if(p.attempts=(p.attempts||0)+1,p.attempts>=u){p.status="failed",p.nextAttemptAt=0,a.put(p),m={status:"failed",entry:p};return}const x=o[Math.min(p.attempts-1,o.length-1)];p.status="pending",p.nextAttemptAt=this.now()+x,a.put(p),m={status:"retry",entry:p,delay:x}}}},n.oncomplete=()=>d(m),n.onerror=()=>e(n.error||new Error("Queue nack transaction failed")),n.onabort=()=>e(n.error||new Error("Queue nack transaction aborted"))}):null)}remap(t,s,l){return this._remapTransaction(t,null,s,l)}resolveCreate(t,s,l,c){return this._remapTransaction(t,s,l,c)}_remapTransaction(t,s,l,c){return this.open().then(u=>u?new Promise((o,i)=>{const d=u.transaction(_,"readwrite"),e=d.objectStore(_),n=e.index("by_scope_seq").getAll(b(this.keyRange,t));let a={changed:[],deleted:[]};n.onerror=()=>i(g(n,"Queue remap read failed")),n.onsuccess=()=>{a=ee(n.result||[],s,l,c,this.now());for(const f of a.deleted)e.delete(f);for(const f of a.changed)e.put(f)},d.oncomplete=()=>o(a.changed),d.onerror=()=>i(d.error||new Error("Queue remap transaction failed")),d.onabort=()=>i(d.error||new Error("Queue remap transaction aborted"))}):[])}resetFailed(t){return this.open().then(s=>s?new Promise((l,c)=>{const u=s.transaction(_,"readwrite"),o=u.objectStore(_),i=o.index("by_scope_seq").getAll(b(this.keyRange,t));let d=0;i.onerror=()=>c(g(i,"Queue failed-entry read failed")),i.onsuccess=()=>{for(const e of i.result||[])e.status==="failed"&&(e.status="pending",e.attempts=0,e.nextAttemptAt=0,e.updatedAt=this.now(),B(e),o.put(e),d++)},u.oncomplete=()=>l(d),u.onerror=()=>c(u.error||new Error("Queue failed-entry reset failed")),u.onabort=()=>c(u.error||new Error("Queue failed-entry reset aborted"))}):0)}getPaused(t){return this.open().then(s=>s?new Promise((l,c)=>{const o=s.transaction(w,"readonly").objectStore(w).get(q(t));o.onsuccess=()=>l(!!(o.result&&o.result.value)),o.onerror=()=>c(g(o,"Queue pause-state read failed"))}):!1)}setPaused(t,s){return this.open().then(l=>{if(l)return new Promise((c,u)=>{const o=l.transaction(w,"readwrite");o.objectStore(w).put({key:q(t),value:!!s}),o.oncomplete=()=>c(),o.onerror=()=>u(o.error||new Error("Queue pause-state write failed")),o.onabort=()=>u(o.error||new Error("Queue pause-state write aborted"))})})}clear(t){return this.open().then(s=>{if(s)return new Promise((l,c)=>{const u=s.transaction([_,w],"readwrite"),i=u.objectStore(_).index("by_scope_seq").openCursor(b(this.keyRange,t));i.onsuccess=d=>{const e=d.target.result;e&&(e.delete(),e.continue())},i.onerror=()=>c(g(i,"Queue clear failed")),u.objectStore(w).delete(K(t)),u.objectStore(w).delete(q(t)),u.oncomplete=()=>l(),u.onerror=()=>c(u.error||new Error("Queue clear transaction failed")),u.onabort=()=>c(u.error||new Error("Queue clear transaction aborted"))})})}_updateEntry(t,s,l){return this.open().then(c=>c?new Promise((u,o)=>{const i=c.transaction(_,"readwrite"),d=i.objectStore(_),e=d.get(s);let n=null;e.onerror=()=>o(g(e,"Queue entry read failed")),e.onsuccess=()=>{const a=e.result;!a||a.scope!==t||(n=l(a,d))},i.oncomplete=()=>u(n),i.onerror=()=>o(i.error||new Error("Queue entry transaction failed")),i.onabort=()=>o(i.error||new Error("Queue entry transaction aborted"))}):null)}}(function(){const r="data-ln-api-queue",t="lnApiQueue",s=[2e3,5e3,15e3,6e4,3e5],l=8,c=6e4;if(window[t]!==void 0)return;function u(){try{return crypto.randomUUID()}catch{return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,n=>{const a=Math.random()*16|0;return(n==="x"?a:a&3|8).toString(16)})}}const o=new te({indexedDB:window.indexedDB,IDBKeyRange:window.IDBKeyRange,uuid:u});function i(e){this.dom=e,e[t]=this;const n=e.closest("[data-ln-data-coordinator]");this.scope=e.getAttribute(r)||(n?n.getAttribute("data-ln-data-coordinator"):null)||"default",this._paused=!1,this._timers=new Map,this._workerId=u(),this._drainPromise=null,this._onlineHandler=()=>this._drain(),this._bindEvents(),window.addEventListener("online",this._onlineHandler);const a=this;return o.open().then(f=>f?o.getPaused(a.scope):(console.warn("[ln-api-queue] IndexedDB not available — queue disabled"),!1)).then(f=>(a._paused=!!f,a._paused&&y(a.dom,"ln-api-queue:paused",{reason:"auth",restored:!0}),a._emitPendingCount())).then(()=>a._drain()).catch(f=>{console.error("[ln-api-queue] Initialization failed:",f),y(a.dom,"ln-api-queue:error",{operation:"initialize",error:f})}),this}i.prototype._isOnline=function(){const e=this.dom.getAttribute("data-ln-api-queue-online");return e==="true"?!0:e==="false"?!1:navigator.onLine},i.prototype._emitPendingCount=function(){const e=this;return o.allForScope(e.scope).then(n=>(y(e.dom,"ln-api-queue:pending-count",{count:n.length,scope:e.scope}),n.length===0&&y(e.dom,"ln-api-queue:drained",{scope:e.scope}),n))},i.prototype._clearTimer=function(e){const n=this._timers.get(e);n&&(clearTimeout(n),this._timers.delete(e))},i.prototype._scheduleTimer=function(e,n){const a=Math.max(0,n),f=this._timers.get(e);f&&clearTimeout(f);const h=this,m=setTimeout(()=>{h._timers.delete(e),h._drain()},a);this._timers.set(e,m)},i.prototype._drain=function(){const e=this;return e._paused||!e._isOnline()?Promise.resolve():(e._drainPromise||(e._drainPromise=o.claimReady(e.scope,e._workerId,c).then(n=>{for(const a of n.wakeups)e._scheduleTimer(a.chainKey,a.at-Date.now());for(const a of n.entries)e._clearTimer(a.chainKey),y(e.dom,"ln-api-queue:send",{entryId:a.entryId,chainKey:a.chainKey,op:a.op,targetId:a.targetId,payload:a.payload,expectedVersion:a.expectedVersion,idempotencyKey:a.entryId,meta:a.meta})}).catch(n=>{console.error("[ln-api-queue] Drain failed:",n),y(e.dom,"ln-api-queue:error",{operation:"drain",error:n})}).finally(()=>{e._drainPromise=null})),e._drainPromise)},i.prototype._onEnqueue=function(e){const n=this;return o.enqueue(n.scope,e.detail||{}).then(a=>{if(a)return n._emitPendingCount().then(f=>(y(n.dom,"ln-api-queue:enqueued",{entryId:a.entryId,chainKey:a.chainKey,count:f.length}),n._drain()))}).catch(a=>{y(n.dom,"ln-api-queue:error",{operation:"enqueue",error:a})})},i.prototype._onAck=function(e){const n=this,a=e.detail||{};return o.ack(n.scope,a.entryId).then(()=>n._emitPendingCount()).then(()=>n._drain()).catch(f=>{y(n.dom,"ln-api-queue:error",{operation:"ack",entryId:a.entryId,error:f})})},i.prototype._onNack=function(e){const n=this,a=e.detail||{};return o.nack(n.scope,a.entryId,a.reason,{maxAttempts:l,backoff:s}).then(f=>{if(f)return f.status==="failed"?y(n.dom,"ln-api-queue:failed",{entryId:f.entry.entryId,chainKey:f.entry.chainKey,attempts:f.entry.attempts}):f.status==="retry"?n._scheduleTimer(f.entry.chainKey,f.delay):f.status==="auth"&&(n._paused=!0,y(n.dom,"ln-api-queue:paused",{reason:"auth"}),y(n.dom,"ln-api-queue:auth-required",{entryId:f.entry.entryId,chainKey:f.entry.chainKey})),n._emitPendingCount().then(()=>{if(f.status==="dropped")return n._drain()})}).catch(f=>{y(n.dom,"ln-api-queue:error",{operation:"nack",entryId:a.entryId,error:f})})},i.prototype._onRemap=function(e){const n=this,a=e.detail||{};return o.remap(n.scope,a.oldKey,a.newId).catch(f=>{y(n.dom,"ln-api-queue:error",{operation:"remap",error:f})})},i.prototype._onResolveCreate=function(e){const n=this,a=e.detail||{};return o.resolveCreate(n.scope,a.entryId,a.oldKey,a.newId).then(()=>n._emitPendingCount()).then(()=>n._drain()).catch(f=>{y(n.dom,"ln-api-queue:error",{operation:"resolve-create",entryId:a.entryId,error:f})})},i.prototype._onResume=function(){const e=this;return o.setPaused(e.scope,!1).then(()=>(e._paused=!1,y(e.dom,"ln-api-queue:resumed",{}),e._drain())).catch(n=>{y(e.dom,"ln-api-queue:error",{operation:"resume",error:n})})},i.prototype._onDrain=function(){const e=this;return o.resetFailed(e.scope).then(()=>{const n=e._drainPromise;return n?n.then(()=>e._drain()):e._drain()}).catch(n=>{y(e.dom,"ln-api-queue:error",{operation:"manual-drain",error:n})})},i.prototype._onClear=function(){const e=this;return e._timers.forEach(n=>clearTimeout(n)),e._timers.clear(),o.clear(e.scope).then(()=>{e._paused=!1,y(e.dom,"ln-api-queue:pending-count",{count:0,scope:e.scope}),y(e.dom,"ln-api-queue:drained",{scope:e.scope})}).catch(n=>{y(e.dom,"ln-api-queue:error",{operation:"clear",error:n})})},i.prototype._bindEvents=function(){const e=this;e._handlers={enqueue:n=>e._onEnqueue(n),ack:n=>e._onAck(n),nack:n=>e._onNack(n),remap:n=>e._onRemap(n),resolveCreate:n=>e._onResolveCreate(n),resume:()=>e._onResume(),drain:()=>e._onDrain(),clear:()=>e._onClear()},e.dom.addEventListener("ln-api-queue:request-enqueue",e._handlers.enqueue),e.dom.addEventListener("ln-api-queue:ack",e._handlers.ack),e.dom.addEventListener("ln-api-queue:nack",e._handlers.nack),e.dom.addEventListener("ln-api-queue:request-remap",e._handlers.remap),e.dom.addEventListener("ln-api-queue:resolve-create",e._handlers.resolveCreate),e.dom.addEventListener("ln-api-queue:request-resume",e._handlers.resume),e.dom.addEventListener("ln-api-queue:request-drain",e._handlers.drain),e.dom.addEventListener("ln-api-queue:request-clear",e._handlers.clear)},i.prototype.destroy=function(){if(!this.dom[t])return;const e=this;e.dom.removeEventListener("ln-api-queue:request-enqueue",e._handlers.enqueue),e.dom.removeEventListener("ln-api-queue:ack",e._handlers.ack),e.dom.removeEventListener("ln-api-queue:nack",e._handlers.nack),e.dom.removeEventListener("ln-api-queue:request-remap",e._handlers.remap),e.dom.removeEventListener("ln-api-queue:resolve-create",e._handlers.resolveCreate),e.dom.removeEventListener("ln-api-queue:request-resume",e._handlers.resume),e.dom.removeEventListener("ln-api-queue:request-drain",e._handlers.drain),e.dom.removeEventListener("ln-api-queue:request-clear",e._handlers.clear),window.removeEventListener("online",e._onlineHandler),e._timers.forEach(n=>clearTimeout(n)),e._timers.clear(),y(e.dom,"ln-api-queue:destroyed",{scope:e.scope}),delete e.dom[t]};function d(e){const n=e[t];n&&n._drain()}j(r,t,i,"ln-api-queue",{extraAttributes:["data-ln-api-queue-online"],onAttributeChange:d})})()})();
@@ -1 +0,0 @@
1
- (function(){"use strict";if(typeof window<"u"){const t=console.warn;console.warn=function(...e){typeof e[0]=="string"&&(e[0].startsWith("[ln-")||e[0].startsWith("[lnCore"))&&!(document.documentElement.hasAttribute("data-ln-debug")||document.body&&document.body.hasAttribute("data-ln-debug"))||t.apply(console,e)}}const w={};function q(t,e){w[t]||(w[t]=document.querySelector('[data-ln-template="'+t+'"]'));const n=w[t];return n?n.content.cloneNode(!0):(console.warn("["+(e||"ln-core")+'] Template "'+t+'" not found'),null)}function x(t,e){if(!t||!e)return t;const n=t.querySelectorAll("[data-ln-field]");for(let o=0;o<n.length;o++){const i=n[o],l=i.getAttribute("data-ln-field");e[l]!=null&&(i.textContent=e[l])}const c=t.querySelectorAll("[data-ln-attr]");for(let o=0;o<c.length;o++){const i=c[o],l=i.getAttribute("data-ln-attr").split(",");for(let s=0;s<l.length;s++){const d=l[s].trim().split(":");if(d.length!==2)continue;const a=d[0].trim(),f=d[1].trim();e[f]!=null&&i.setAttribute(a,e[f])}}const u=t.querySelectorAll("[data-ln-show]");for(let o=0;o<u.length;o++){const i=u[o],l=i.getAttribute("data-ln-show");l in e&&i.classList.toggle("hidden",!e[l])}const r=t.querySelectorAll("[data-ln-class]");for(let o=0;o<r.length;o++){const i=r[o],l=i.getAttribute("data-ln-class").split(",");for(let s=0;s<l.length;s++){const d=l[s].trim().split(":");if(d.length!==2)continue;const a=d[0].trim(),f=d[1].trim();f in e&&i.classList.toggle(a,!!e[f])}}return t}function D(t,e){t.matches&&t.matches("[data-ln-form], [data-ln-fillable]")&&t.dispatchEvent(new CustomEvent("ln-fill",{detail:e??null,bubbles:!0}));const n=t.querySelectorAll("[data-ln-form], [data-ln-fillable]");for(let c=0;c<n.length;c++)n[c].dispatchEvent(new CustomEvent("ln-fill",{detail:e??null,bubbles:!0}));return t}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._fillBound||(window.lnCore._fillBound=!0,document.addEventListener("ln-fill",function(t){if(!(!t.target.matches||!t.target.matches("[data-ln-fillable]")))if(t.detail)x(t.target,t.detail);else{const e=t.target.querySelectorAll("[data-ln-field]");for(let n=0;n<e.length;n++)e[n].textContent=""}})));function L(t,e){if(!t||!e)return t;const n=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);for(;n.nextNode();){const r=n.currentNode;r.textContent.indexOf("{{")!==-1&&(r.textContent=r.textContent.replace(/\{\{\s*(\w+)\s*\}\}/g,function(o,i){return e[i]!==void 0?e[i]:""}))}const c=function(r,o){return e[o]!==void 0?e[o]:""},u=Array.from(t.querySelectorAll("*"));t.nodeType===1&&u.push(t);for(let r=0;r<u.length;r++){const o=u[r],i=o.attributes;for(let l=0;l<i.length;l++){const s=i[l];s.value.indexOf("{{")!==-1&&o.setAttribute(s.name,s.value.replace(/\{\{\s*(\w+)\s*\}\}/g,c))}}return t}function N(t,e,n,c,u,r){const o={};for(let l=0;l<t.children.length;l++){const s=t.children[l],d=s.getAttribute("data-ln-key");d&&(o[d]=s)}const i=document.createDocumentFragment();for(let l=0;l<e.length;l++){const s=e[l],d=String(c(s));let a=o[d];if(a)u(a,s,l);else{const f=q(n,r);if(!f||(L(f,s),a=f.firstElementChild,!a))continue;a.setAttribute("data-ln-key",d),u(a,s,l)}i.appendChild(a)}t.textContent="",t.appendChild(i)}function S(t,e){if(!document.body){document.addEventListener("DOMContentLoaded",function(){S(t,e)}),console.warn("["+e+'] Script loaded before <body> — add "defer" to your <script> tag');return}t()}function g(t,e,n,c){if(t.nodeType!==1)return;const r=e.indexOf("[")!==-1||e.indexOf(".")!==-1||e.indexOf("#")!==-1?e:"["+e+"]",o=Array.from(t.querySelectorAll(r));t.matches&&t.matches(r)&&o.push(t);for(const i of o)i[n]||(i[n]=new c(i))}function M(t,e,n,c,u={}){const r=u.extraAttributes||[],o=u.onAttributeChange||null,i=u.onInit||null;function l(s){const d=s||document.body;g(d,t,e,n),i&&i(d)}return S(function(){const s=new MutationObserver(function(a){for(let f=0;f<a.length;f++){const h=a[f];if(h.type==="childList"){for(let m=0;m<h.addedNodes.length;m++){const p=h.addedNodes[m];p.nodeType===1&&(g(p,t,e,n),i&&i(p))}for(let m=0;m<h.removedNodes.length;m++){const p=h.removedNodes[m];if(p.nodeType===1){const k=t.indexOf("[")!==-1||t.indexOf(".")!==-1||t.indexOf("#")!==-1?t:"["+t+"]",b=Array.from(p.querySelectorAll(k));p.matches&&p.matches(k)&&b.push(p);for(let C=0;C<b.length;C++){const T=b[C];if(!document.contains(T)){const A=T[e];A&&typeof A.destroy=="function"&&A.destroy()}}}}}else h.type==="attributes"&&(o&&h.target[e]?o(h.target,h.attributeName):(g(h.target,t,e,n),i&&i(h.target)))}});let d=[];if(t.indexOf("[")!==-1){const a=/\[([\w-]+)/g;let f;for(;(f=a.exec(t))!==null;)d.push(f[1])}else d.push(t);s.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:d.concat(r)})},c),window[e]=l,document.readyState==="loading"?document.addEventListener("DOMContentLoaded",function(){l(document.body)}):l(document.body),l}const v={};function j(t,e){v[t]=e}function I(t){return v[t]||{ingress:e=>e,egress:e=>e}}const _={};function E(t,e){if(!t||typeof e!="object")return;const n=t.toLowerCase().split("-")[0];_[n]=e}function z(t){if(!t)return null;const e=t.toLowerCase().split("-")[0];return _[e]||null}E("mk",{monthsLong:["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],monthsShort:["јан","фев","мар","апр","мај","јун","јул","авг","септ","окт","ноем","дек"],daysLong:["недела","понеделник","вторник","среда","четврток","петок","сабота"],daysShort:["нед","пон","вт","ср","чет","пет","саб"]}),typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerDataMapper=j,window.lnCore.getDataMapper=I,window.lnCore.registerLocaleFallback=E,window.lnCore.getLocaleFallback=z,window.lnCore.fillTemplate=L,window.lnCore.fill=x,window.lnCore.lnFill=D,window.lnCore.renderList=N);function O(t){return(t||"").replace(/^#/,"")}function y(t){const e=t===void 0?location.hash:t,n={},c=O(e);if(!c)return n;const u=c.split("&");for(let r=0;r<u.length;r++){const o=u[r];if(!o)continue;const i=o.indexOf(":"),l=i>-1?o.slice(0,i):o,s=i>-1?o.slice(i+1):"";if(l)try{n[l]=decodeURIComponent(s)}catch{n[l]=s}}return n}function W(t){if(!t)return null;const e=y();return t in e?e[t]:null}function F(t,e){if(!t)return;const n=y();e==null?delete n[t]:n[t]=String(e);const u=Object.keys(n).map(function(r){const o=n[r];return o===""?r:r+":"+encodeURIComponent(o)}).join("&");O(location.hash)!==u&&(location.hash=u)}function B(t){return t.button===1||t.ctrlKey||t.metaKey||t.shiftKey?!1:(t.preventDefault(),!0)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.hashParse=y,window.lnCore.hashGet=W,window.lnCore.hashSet=F,window.lnCore.hashLinkClick=B),(function(){const t="data-ln-autoresize",e="lnAutoresize";if(window[e]!==void 0)return;function n(c){if(c.tagName!=="TEXTAREA")return console.warn("[ln-autoresize] Can only be applied to <textarea>, got:",c.tagName),this;this.dom=c;const u=this;return this._onInput=function(){u._resize()},c.addEventListener("input",this._onInput),this._resize(),this}n.prototype._resize=function(){this.dom.style.height="auto",this.dom.style.height=this.dom.scrollHeight+"px"},n.prototype.destroy=function(){this.dom[e]&&(this.dom.removeEventListener("input",this._onInput),this.dom.style.height="",delete this.dom[e])},M(t,e,n,"ln-autoresize")})()})();
@@ -1 +0,0 @@
1
- (function(){"use strict";if(typeof window<"u"){const e=console.warn;console.warn=function(...t){typeof t[0]=="string"&&(t[0].startsWith("[ln-")||t[0].startsWith("[lnCore"))&&!(document.documentElement.hasAttribute("data-ln-debug")||document.body&&document.body.hasAttribute("data-ln-debug"))||e.apply(console,t)}}const E={};function F(e,t){E[e]||(E[e]=document.querySelector('[data-ln-template="'+e+'"]'));const s=E[e];return s?s.content.cloneNode(!0):(console.warn("["+(t||"ln-core")+'] Template "'+e+'" not found'),null)}function w(e,t,s){e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:s||{}}))}function I(e,t,s){const u=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:s||{}});return e.dispatchEvent(u),u}function x(e,t){if(!e||!t)return e;const s=e.querySelectorAll("[data-ln-field]");for(let i=0;i<s.length;i++){const l=s[i],n=l.getAttribute("data-ln-field");t[n]!=null&&(l.textContent=t[n])}const u=e.querySelectorAll("[data-ln-attr]");for(let i=0;i<u.length;i++){const l=u[i],n=l.getAttribute("data-ln-attr").split(",");for(let r=0;r<n.length;r++){const o=n[r].trim().split(":");if(o.length!==2)continue;const d=o[0].trim(),f=o[1].trim();t[f]!=null&&l.setAttribute(d,t[f])}}const c=e.querySelectorAll("[data-ln-show]");for(let i=0;i<c.length;i++){const l=c[i],n=l.getAttribute("data-ln-show");n in t&&l.classList.toggle("hidden",!t[n])}const a=e.querySelectorAll("[data-ln-class]");for(let i=0;i<a.length;i++){const l=a[i],n=l.getAttribute("data-ln-class").split(",");for(let r=0;r<n.length;r++){const o=n[r].trim().split(":");if(o.length!==2)continue;const d=o[0].trim(),f=o[1].trim();f in t&&l.classList.toggle(d,!!t[f])}}return e}function M(e,t){e.matches&&e.matches("[data-ln-form], [data-ln-fillable]")&&e.dispatchEvent(new CustomEvent("ln-fill",{detail:t??null,bubbles:!0}));const s=e.querySelectorAll("[data-ln-form], [data-ln-fillable]");for(let u=0;u<s.length;u++)s[u].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)x(e.target,e.detail);else{const t=e.target.querySelectorAll("[data-ln-field]");for(let s=0;s<t.length;s++)t[s].textContent=""}})));function k(e,t){if(!e||!t)return e;const s=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);for(;s.nextNode();){const a=s.currentNode;a.textContent.indexOf("{{")!==-1&&(a.textContent=a.textContent.replace(/\{\{\s*(\w+)\s*\}\}/g,function(i,l){return t[l]!==void 0?t[l]:""}))}const u=function(a,i){return t[i]!==void 0?t[i]:""},c=Array.from(e.querySelectorAll("*"));e.nodeType===1&&c.push(e);for(let a=0;a<c.length;a++){const i=c[a],l=i.attributes;for(let n=0;n<l.length;n++){const r=l[n];r.value.indexOf("{{")!==-1&&i.setAttribute(r.name,r.value.replace(/\{\{\s*(\w+)\s*\}\}/g,u))}}return e}function R(e,t,s,u,c,a){const i={};for(let n=0;n<e.children.length;n++){const r=e.children[n],o=r.getAttribute("data-ln-key");o&&(i[o]=r)}const l=document.createDocumentFragment();for(let n=0;n<t.length;n++){const r=t[n],o=String(u(r));let d=i[o];if(d)c(d,r,n);else{const f=F(s,a);if(!f||(k(f,r),d=f.firstElementChild,!d))continue;d.setAttribute("data-ln-key",o),c(d,r,n)}l.appendChild(d)}e.textContent="",e.appendChild(l)}function S(e,t){if(!document.body){document.addEventListener("DOMContentLoaded",function(){S(e,t)}),console.warn("["+t+'] Script loaded before <body> — add "defer" to your <script> tag');return}e()}function _(e,t,s,u){if(e.nodeType!==1)return;const a=t.indexOf("[")!==-1||t.indexOf(".")!==-1||t.indexOf("#")!==-1?t:"["+t+"]",i=Array.from(e.querySelectorAll(a));e.matches&&e.matches(a)&&i.push(e);for(const l of i)l[s]||(l[s]=new u(l))}function q(e,t){const s=!!(t&&t.typed),u=t&&t.exclude,c={},a=e.elements,i={};if(s)for(let l=0;l<a.length;l++){const n=a[l];n.name&&n.type==="checkbox"&&!n.disabled&&(i[n.name]=(i[n.name]||0)+1)}for(let l=0;l<a.length;l++){const n=a[l];if(!(!n.name||n.disabled||n.type==="file"||n.type==="submit"||n.type==="button")&&!(u&&n.matches&&n.matches(u)))if(n.type==="checkbox")s&&i[n.name]===1?c[n.name]=n.checked:(c[n.name]||(c[n.name]=[]),n.checked&&c[n.name].push(n.value));else if(n.type==="radio")n.checked&&(c[n.name]=n.value);else if(n.type==="select-multiple"){c[n.name]=[];for(let r=0;r<n.options.length;r++)n.options[r].selected&&c[n.name].push(n.options[r].value)}else if(s&&n.type==="hidden")c[n.name]=n.value;else if(s&&(n.type==="number"||n.type==="range")){const r=Number(n.value);c[n.name]=n.value===""||isNaN(r)?null:r}else c[n.name]=n.value}return c}function U(e){if(typeof e!="string")return!!e;const t=e.trim().toLowerCase();return t!=="false"&&t!=="0"&&t!==""&&t!=="off"&&t!=="no"}function j(e,t){const s=e.elements,u=[],c={};for(let a=0;a<s.length;a++){const i=s[a];i.name&&i.type==="checkbox"&&(c[i.name]=(c[i.name]||0)+1)}for(let a=0;a<s.length;a++){const i=s[a];if(i.type==="file"||i.type==="submit"||i.type==="button")continue;const l=i.getAttribute("data-ln-fill-as")||i.name;if(!l||!(l in t))continue;const n=t[l];if(i.type==="checkbox"){if(Array.isArray(n))i.checked=n.indexOf(i.value)!==-1;else if(c[i.name]>1){const r=String(n).split(",").map(function(o){return o.trim()});i.checked=r.indexOf(i.value)!==-1}else i.checked=U(n);u.push(i)}else if(i.type==="radio")i.checked=i.value===String(n),u.push(i);else if(i.type==="select-multiple"){if(Array.isArray(n))for(let r=0;r<i.options.length;r++)i.options[r].selected=n.indexOf(i.options[r].value)!==-1;u.push(i)}else i.value=n,u.push(i)}return u}function B(e,t,s,u,c={}){const a=c.extraAttributes||[],i=c.onAttributeChange||null,l=c.onInit||null;function n(r){const o=r||document.body;_(o,e,t,s),l&&l(o)}return S(function(){const r=new MutationObserver(function(d){for(let f=0;f<d.length;f++){const m=d[f];if(m.type==="childList"){for(let y=0;y<m.addedNodes.length;y++){const g=m.addedNodes[y];g.nodeType===1&&(_(g,e,t,s),l&&l(g))}for(let y=0;y<m.removedNodes.length;y++){const g=m.removedNodes[y];if(g.nodeType===1){const p=e.indexOf("[")!==-1||e.indexOf(".")!==-1||e.indexOf("#")!==-1?e:"["+e+"]",h=Array.from(g.querySelectorAll(p));g.matches&&g.matches(p)&&h.push(g);for(let C=0;C<h.length;C++){const v=h[C];if(!document.contains(v)){const b=v[t];b&&typeof b.destroy=="function"&&b.destroy()}}}}}else m.type==="attributes"&&(i&&m.target[t]?i(m.target,m.attributeName):(_(m.target,e,t,s),l&&l(m.target)))}});let o=[];if(e.indexOf("[")!==-1){const d=/\[([\w-]+)/g;let f;for(;(f=d.exec(e))!==null;)o.push(f[1])}else o.push(e);r.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:o.concat(a)})},u),window[t]=n,document.readyState==="loading"?document.addEventListener("DOMContentLoaded",function(){n(document.body)}):n(document.body),n}const T={};function W(e,t){T[e]=t}function K(e){return T[e]||{ingress:t=>t,egress:t=>t}}const O={};function N(e,t){if(!e||typeof t!="object")return;const s=e.toLowerCase().split("-")[0];O[s]=t}function P(e){if(!e)return null;const t=e.toLowerCase().split("-")[0];return O[t]||null}N("mk",{monthsLong:["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],monthsShort:["јан","фев","мар","апр","мај","јун","јул","авг","септ","окт","ноем","дек"],daysLong:["недела","понеделник","вторник","среда","четврток","петок","сабота"],daysShort:["нед","пон","вт","ср","чет","пет","саб"]}),typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerDataMapper=W,window.lnCore.getDataMapper=K,window.lnCore.registerLocaleFallback=N,window.lnCore.getLocaleFallback=P,window.lnCore.fillTemplate=k,window.lnCore.fill=x,window.lnCore.lnFill=M,window.lnCore.renderList=R);function D(e){return(e||"").replace(/^#/,"")}function A(e){const t=e===void 0?location.hash:e,s={},u=D(t);if(!u)return s;const c=u.split("&");for(let a=0;a<c.length;a++){const i=c[a];if(!i)continue;const l=i.indexOf(":"),n=l>-1?i.slice(0,l):i,r=l>-1?i.slice(l+1):"";if(n)try{s[n]=decodeURIComponent(r)}catch{s[n]=r}}return s}function G(e){if(!e)return null;const t=A();return e in t?t[e]:null}function X(e,t){if(!e)return;const s=A();t==null?delete s[e]:s[e]=String(t);const c=Object.keys(s).map(function(a){const i=s[a];return i===""?a:a+":"+encodeURIComponent(i)}).join("&");D(location.hash)!==c&&(location.hash=c)}function J(e){return e.button===1||e.ctrlKey||e.metaKey||e.shiftKey?!1:(e.preventDefault(),!0)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.hashParse=A,window.lnCore.hashGet=G,window.lnCore.hashSet=X,window.lnCore.hashLinkClick=J),(function(){const e="data-ln-autosave",t="lnAutosave",s="data-ln-autosave-clear",u="data-ln-autosave-debounce-input",c="ln-autosave:";if(window[t]!==void 0)return;function i(o){const d=l(o);if(!d){console.warn("ln-autosave: form needs an id or data-ln-autosave value",o);return}this.dom=o,this.key=d;let f=null;function m(){const p=q(o,{exclude:"[data-ln-autosave-exclude]"});try{localStorage.setItem(d,JSON.stringify(p))}catch{return}w(o,"ln-autosave:saved",{target:o,data:p})}function y(){let p;try{p=localStorage.getItem(d)}catch{return}if(!p)return;let h;try{h=JSON.parse(p)}catch{return}if(I(o,"ln-autosave:before-restore",{target:o,data:h}).defaultPrevented)return;const v=j(o,h);for(let b=0;b<v.length;b++)v[b].dispatchEvent(new Event("input",{bubbles:!0})),v[b].dispatchEvent(new Event("change",{bubbles:!0}));w(o,"ln-autosave:restored",{target:o,data:h})}function g(){try{localStorage.removeItem(d)}catch{return}w(o,"ln-autosave:cleared",{target:o})}this._onFocusout=function(p){const h=p.target;n(h)&&h.name&&!h.hasAttribute("data-ln-autosave-exclude")&&m()},this._onChange=function(p){const h=p.target;n(h)&&h.name&&!h.hasAttribute("data-ln-autosave-exclude")&&m()},this._onSubmit=function(){g()},this._onReset=function(){g()},this._onClearClick=function(p){p.target.closest("["+s+"]")&&g()},o.addEventListener("focusout",this._onFocusout),o.addEventListener("change",this._onChange),o.addEventListener("submit",this._onSubmit),o.addEventListener("reset",this._onReset),o.addEventListener("click",this._onClearClick);const L=r(o);return L>0&&(this._onInput=function(p){const h=p.target;!n(h)||!h.name||h.hasAttribute("data-ln-autosave-exclude")||(f!==null&&clearTimeout(f),f=setTimeout(m,L))},o.addEventListener("input",this._onInput)),this._getInputTimer=function(){return f},y(),this}i.prototype.destroy=function(){if(this.dom[t]){if(this.dom.removeEventListener("focusout",this._onFocusout),this.dom.removeEventListener("change",this._onChange),this.dom.removeEventListener("submit",this._onSubmit),this.dom.removeEventListener("reset",this._onReset),this.dom.removeEventListener("click",this._onClearClick),this._onInput){this.dom.removeEventListener("input",this._onInput);const o=this._getInputTimer();o!==null&&clearTimeout(o)}w(this.dom,"ln-autosave:destroyed",{target:this.dom}),delete this.dom[t]}};function l(o){const f=o.getAttribute(e)||o.id;return f?c+window.location.pathname+":"+f:null}function n(o){const d=o.tagName;return d==="INPUT"||d==="TEXTAREA"||d==="SELECT"}function r(o){if(!o.hasAttribute(u))return 0;const d=o.getAttribute(u);if(d===""||d===null)return 1e3;const f=parseInt(d,10);return isNaN(f)||f<0?(console.warn("ln-autosave: invalid debounce value, using default",o),1e3):f}B(e,t,i,"ln-autosave")})()})();
@@ -1 +0,0 @@
1
- (function(){"use strict";if(typeof window<"u"){const t=console.warn;console.warn=function(...e){typeof e[0]=="string"&&(e[0].startsWith("[ln-")||e[0].startsWith("[lnCore"))&&!(document.documentElement.hasAttribute("data-ln-debug")||document.body&&document.body.hasAttribute("data-ln-debug"))||t.apply(console,e)}}const b={};function N(t,e){b[t]||(b[t]=document.querySelector('[data-ln-template="'+t+'"]'));const r=b[t];return r?r.content.cloneNode(!0):(console.warn("["+(e||"ln-core")+'] Template "'+t+'" not found'),null)}function D(t,e,r){t.dispatchEvent(new CustomEvent(e,{bubbles:!0,detail:r||{}}))}function E(t,e){if(!t||!e)return t;const r=t.querySelectorAll("[data-ln-field]");for(let n=0;n<r.length;n++){const i=r[n],l=i.getAttribute("data-ln-field");e[l]!=null&&(i.textContent=e[l])}const s=t.querySelectorAll("[data-ln-attr]");for(let n=0;n<s.length;n++){const i=s[n],l=i.getAttribute("data-ln-attr").split(",");for(let a=0;a<l.length;a++){const f=l[a].trim().split(":");if(f.length!==2)continue;const u=f[0].trim(),c=f[1].trim();e[c]!=null&&i.setAttribute(u,e[c])}}const d=t.querySelectorAll("[data-ln-show]");for(let n=0;n<d.length;n++){const i=d[n],l=i.getAttribute("data-ln-show");l in e&&i.classList.toggle("hidden",!e[l])}const o=t.querySelectorAll("[data-ln-class]");for(let n=0;n<o.length;n++){const i=o[n],l=i.getAttribute("data-ln-class").split(",");for(let a=0;a<l.length;a++){const f=l[a].trim().split(":");if(f.length!==2)continue;const u=f[0].trim(),c=f[1].trim();c in e&&i.classList.toggle(u,!!e[c])}}return t}function q(t,e){t.matches&&t.matches("[data-ln-form], [data-ln-fillable]")&&t.dispatchEvent(new CustomEvent("ln-fill",{detail:e??null,bubbles:!0}));const r=t.querySelectorAll("[data-ln-form], [data-ln-fillable]");for(let s=0;s<r.length;s++)r[s].dispatchEvent(new CustomEvent("ln-fill",{detail:e??null,bubbles:!0}));return t}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._fillBound||(window.lnCore._fillBound=!0,document.addEventListener("ln-fill",function(t){if(!(!t.target.matches||!t.target.matches("[data-ln-fillable]")))if(t.detail)E(t.target,t.detail);else{const e=t.target.querySelectorAll("[data-ln-field]");for(let r=0;r<e.length;r++)e[r].textContent=""}})));function k(t,e){if(!t||!e)return t;const r=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);for(;r.nextNode();){const o=r.currentNode;o.textContent.indexOf("{{")!==-1&&(o.textContent=o.textContent.replace(/\{\{\s*(\w+)\s*\}\}/g,function(n,i){return e[i]!==void 0?e[i]:""}))}const s=function(o,n){return e[n]!==void 0?e[n]:""},d=Array.from(t.querySelectorAll("*"));t.nodeType===1&&d.push(t);for(let o=0;o<d.length;o++){const n=d[o],i=n.attributes;for(let l=0;l<i.length;l++){const a=i[l];a.value.indexOf("{{")!==-1&&n.setAttribute(a.name,a.value.replace(/\{\{\s*(\w+)\s*\}\}/g,s))}}return t}function F(t,e,r,s,d,o){const n={};for(let l=0;l<t.children.length;l++){const a=t.children[l],f=a.getAttribute("data-ln-key");f&&(n[f]=a)}const i=document.createDocumentFragment();for(let l=0;l<e.length;l++){const a=e[l],f=String(s(a));let u=n[f];if(u)d(u,a,l);else{const c=N(r,o);if(!c||(k(c,a),u=c.firstElementChild,!u))continue;u.setAttribute("data-ln-key",f),d(u,a,l)}i.appendChild(u)}t.textContent="",t.appendChild(i)}function S(t,e){if(!document.body){document.addEventListener("DOMContentLoaded",function(){S(t,e)}),console.warn("["+e+'] Script loaded before <body> — add "defer" to your <script> tag');return}t()}function w(t,e,r,s){if(t.nodeType!==1)return;const o=e.indexOf("[")!==-1||e.indexOf(".")!==-1||e.indexOf("#")!==-1?e:"["+e+"]",n=Array.from(t.querySelectorAll(o));t.matches&&t.matches(o)&&n.push(t);for(const i of n)i[r]||(i[r]=new s(i))}function I(t,e,r,s,d={}){const o=d.extraAttributes||[],n=d.onAttributeChange||null,i=d.onInit||null;function l(a){const f=a||document.body;w(f,t,e,r),i&&i(f)}return S(function(){const a=new MutationObserver(function(u){for(let c=0;c<u.length;c++){const h=u[c];if(h.type==="childList"){for(let p=0;p<h.addedNodes.length;p++){const m=h.addedNodes[p];m.nodeType===1&&(w(m,t,e,r),i&&i(m))}for(let p=0;p<h.removedNodes.length;p++){const m=h.removedNodes[p];if(m.nodeType===1){const g=t.indexOf("[")!==-1||t.indexOf(".")!==-1||t.indexOf("#")!==-1?t:"["+t+"]",v=Array.from(m.querySelectorAll(g));m.matches&&m.matches(g)&&v.push(m);for(let A=0;A<v.length;A++){const T=v[A];if(!document.contains(T)){const x=T[e];x&&typeof x.destroy=="function"&&x.destroy()}}}}}else h.type==="attributes"&&(n&&h.target[e]?n(h.target,h.attributeName):(w(h.target,t,e,r),i&&i(h.target)))}});let f=[];if(t.indexOf("[")!==-1){const u=/\[([\w-]+)/g;let c;for(;(c=u.exec(t))!==null;)f.push(c[1])}else f.push(t);a.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:f.concat(o)})},s),window[e]=l,document.readyState==="loading"?document.addEventListener("DOMContentLoaded",function(){l(document.body)}):l(document.body),l}const _={};function j(t,e){_[t]=e}function W(t){return _[t]||{ingress:e=>e,egress:e=>e}}const L={};function O(t,e){if(!t||typeof e!="object")return;const r=t.toLowerCase().split("-")[0];L[r]=e}function R(t){if(!t)return null;const e=t.toLowerCase().split("-")[0];return L[e]||null}O("mk",{monthsLong:["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],monthsShort:["јан","фев","мар","апр","мај","јун","јул","авг","септ","окт","ноем","дек"],daysLong:["недела","понеделник","вторник","среда","четврток","петок","сабота"],daysShort:["нед","пон","вт","ср","чет","пет","саб"]}),typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerDataMapper=j,window.lnCore.getDataMapper=W,window.lnCore.registerLocaleFallback=O,window.lnCore.getLocaleFallback=R,window.lnCore.fillTemplate=k,window.lnCore.fill=E,window.lnCore.lnFill=q,window.lnCore.renderList=F);function M(t){return(t||"").replace(/^#/,"")}function C(t){const e=t===void 0?location.hash:t,r={},s=M(e);if(!s)return r;const d=s.split("&");for(let o=0;o<d.length;o++){const n=d[o];if(!n)continue;const i=n.indexOf(":"),l=i>-1?n.slice(0,i):n,a=i>-1?n.slice(i+1):"";if(l)try{r[l]=decodeURIComponent(a)}catch{r[l]=a}}return r}function B(t){if(!t)return null;const e=C();return t in e?e[t]:null}function U(t,e){if(!t)return;const r=C();e==null?delete r[t]:r[t]=String(e);const d=Object.keys(r).map(function(o){const n=r[o];return n===""?o:o+":"+encodeURIComponent(n)}).join("&");M(location.hash)!==d&&(location.hash=d)}function K(t){return t.button===1||t.ctrlKey||t.metaKey||t.shiftKey?!1:(t.preventDefault(),!0)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.hashParse=C,window.lnCore.hashGet=B,window.lnCore.hashSet=U,window.lnCore.hashLinkClick=K),(function(){const t="data-ln-circular-progress",e="lnCircularProgress";if(window[e]!==void 0)return;const r="http://www.w3.org/2000/svg",s=36,d=16,o=2*Math.PI*d;function n(u){return this.dom=u,this.svg=null,this.trackCircle=null,this.progressCircle=null,this.labelEl=null,this._attrObserver=null,l.call(this),f.call(this),a.call(this),this}n.prototype.destroy=function(){this.dom[e]&&(this._attrObserver&&this._attrObserver.disconnect(),this.svg&&this.svg.remove(),this.labelEl&&this.labelEl.remove(),this.dom.removeAttribute("role"),this.dom.removeAttribute("aria-valuemin"),this.dom.removeAttribute("aria-valuemax"),this.dom.removeAttribute("aria-valuenow"),this.dom.removeAttribute("aria-valuetext"),delete this.dom[e])};function i(u,c){const h=document.createElementNS(r,u);for(const p in c)h.setAttribute(p,c[p]);return h}function l(){this.svg=i("svg",{viewBox:"0 0 "+s+" "+s,"aria-hidden":"true"}),this.trackCircle=i("circle",{cx:s/2,cy:s/2,r:d,fill:"none","stroke-width":"3"}),this.trackCircle.classList.add("ln-circular-progress__track"),this.progressCircle=i("circle",{cx:s/2,cy:s/2,r:d,fill:"none","stroke-width":"3","stroke-linecap":"round","stroke-dasharray":o,"stroke-dashoffset":o,transform:"rotate(-90 "+s/2+" "+s/2+")"}),this.progressCircle.classList.add("ln-circular-progress__fill"),this.svg.appendChild(this.trackCircle),this.svg.appendChild(this.progressCircle),this.labelEl=document.createElement("strong"),this.labelEl.classList.add("ln-circular-progress__label"),this.dom.appendChild(this.svg),this.dom.appendChild(this.labelEl)}function a(){const u=this,c=new MutationObserver(function(h){for(const p of h)(p.attributeName==="data-ln-circular-progress"||p.attributeName==="data-ln-circular-progress-max"||p.attributeName==="data-ln-circular-progress-label")&&f.call(u)});c.observe(this.dom,{attributes:!0,attributeFilter:["data-ln-circular-progress","data-ln-circular-progress-max","data-ln-circular-progress-label"]}),this._attrObserver=c}function f(){const u=parseFloat(this.dom.getAttribute("data-ln-circular-progress"))||0,c=parseFloat(this.dom.getAttribute("data-ln-circular-progress-max"))||100;let h=c>0?u/c*100:0;h<0&&(h=0),h>100&&(h=100);const p=o-h/100*o;this.progressCircle.setAttribute("stroke-dashoffset",p);const m=this.dom.getAttribute("data-ln-circular-progress-label"),y=m!==null?m:Math.round(h)+"%";this.labelEl.textContent=y,this.dom.setAttribute("role","progressbar"),this.dom.setAttribute("aria-valuemin","0"),this.dom.setAttribute("aria-valuemax",String(c));const g=Math.max(0,Math.min(u,c));this.dom.setAttribute("aria-valuenow",String(g)),this.dom.setAttribute("aria-valuetext",y),D(this.dom,"ln-circular-progress:change",{target:this.dom,value:u,max:c,percentage:h})}I(t,e,n,"ln-circular-progress")})()})();