@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
@@ -0,0 +1,115 @@
1
+ // ─── Guard Body ────────────────────────────────────────
2
+
3
+ export function guardBody(setupFn, componentTag) {
4
+ if (!document.body) {
5
+ document.addEventListener('DOMContentLoaded', function () {
6
+ guardBody(setupFn, componentTag);
7
+ });
8
+ console.warn('[' + componentTag + '] Script loaded before <body> — add "defer" to your <script> tag');
9
+ return;
10
+ }
11
+ setupFn();
12
+ }
13
+
14
+ // ─── Visibility Check ─────────────────────────────────────
15
+
16
+ export function isVisible(el) {
17
+ return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length);
18
+ }
19
+
20
+ /**
21
+ * Determines whether a mouse click event should be ignored (modified click or non-primary button).
22
+ * @param {MouseEvent|Object} [event]
23
+ * @returns {boolean}
24
+ */
25
+ export function shouldIgnoreClick(event) {
26
+ if (!event) return true;
27
+ if (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return true;
28
+ if (typeof event.button === 'number' && event.button !== 0) return true;
29
+ return false;
30
+ }
31
+
32
+ /**
33
+ * Checks if a target element is an active editable field or contenteditable element.
34
+ * @param {Element|Object} [target]
35
+ * @returns {boolean}
36
+ */
37
+ export function isEditableTarget(target) {
38
+ if (!target) return false;
39
+ if (typeof target.closest === 'function') {
40
+ return Boolean(target.closest('input, textarea, select, [contenteditable]:not([contenteditable="false"])'));
41
+ }
42
+ const tag = String(target.tagName || '').toLowerCase();
43
+ return tag === 'input' || tag === 'textarea' || tag === 'select' || Boolean(target.isContentEditable);
44
+ }
45
+
46
+ /**
47
+ * Checks if a target element is disabled, aria-disabled, or inside an inert container.
48
+ * @param {Element|Object} [target]
49
+ * @returns {boolean}
50
+ */
51
+ export function isTargetDisabled(target) {
52
+ if (!target) return true;
53
+ if (target.disabled || (typeof target.getAttribute === 'function' && target.getAttribute('aria-disabled') === 'true')) {
54
+ return true;
55
+ }
56
+ if (typeof target.closest === 'function' && target.closest('[inert]')) {
57
+ return true;
58
+ }
59
+ return false;
60
+ }
61
+
62
+ /**
63
+ * Checks if a target element is connected, enabled, not inert, visible, and optionally supports an action method.
64
+ * @param {Element} target
65
+ * @param {string} [action]
66
+ * @returns {boolean}
67
+ */
68
+ export function isUsableTarget(target, action) {
69
+ if (!target || !document.contains(target)) return false;
70
+ if (isTargetDisabled(target)) return false;
71
+ if (action && typeof target[action] !== 'function') return false;
72
+ return isVisible(target);
73
+ }
74
+
75
+ /**
76
+ * Checks if a link click should be intercepted by client-side routing.
77
+ * Must be standard navigation click (left button, no modifiers), same origin,
78
+ * not mailto/tel, and not pure hash/empty.
79
+ *
80
+ * @param {MouseEvent} event
81
+ * @param {HTMLAnchorElement} anchor
82
+ * @returns {boolean}
83
+ */
84
+ export function shouldInterceptLink(event, anchor) {
85
+ if (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey || event.button !== 0) {
86
+ return false;
87
+ }
88
+ if (!anchor) return false;
89
+ const href = anchor.getAttribute('href');
90
+ if (!href) return false;
91
+ if (anchor.getAttribute('target') === '_blank') return false;
92
+ if (anchor.hasAttribute('download')) return false;
93
+ if (href.startsWith('mailto:') || href.startsWith('tel:')) return false;
94
+ if (href === '#' || href.startsWith('#')) return false;
95
+ if (anchor.hostname && anchor.hostname !== window.location.hostname) return false;
96
+ return true;
97
+ }
98
+
99
+ /**
100
+ * Read the raw machine value behind a formatted cell/item display.
101
+ * Returns the `data-ln-value` attribute if present, else trimmed textContent.
102
+ * Single read path for value-based sort/filter across components.
103
+ */
104
+ export function readValue(el) {
105
+ if (el.hasAttribute('data-ln-value')) {
106
+ return el.getAttribute('data-ln-value');
107
+ }
108
+ if (el.tagName === 'TIME' && el.hasAttribute('datetime')) {
109
+ return el.getAttribute('datetime');
110
+ }
111
+ if (el.tagName === 'DATA' && el.hasAttribute('value')) {
112
+ return el.getAttribute('value');
113
+ }
114
+ return el.textContent.trim();
115
+ }
@@ -0,0 +1,122 @@
1
+ // ─── Environment & Debug Gates ─────────────────────────────
2
+
3
+ export function hasActiveDebug() {
4
+ if (typeof window === 'undefined') return false;
5
+ if (window.lnDebug === true) return true;
6
+ if (window.lnCore && window.lnCore._debugSink) return true;
7
+ if (typeof document !== 'undefined' && document.body) {
8
+ return document.body.hasAttribute('data-ln-debug') || document.body.querySelector('[data-ln-debug]') !== null;
9
+ }
10
+ return false;
11
+ }
12
+
13
+ export function isDevMode(el) {
14
+ if (typeof window === 'undefined') return false;
15
+ if (window.lnDebug === true) return true;
16
+
17
+ // Authoritative gate check when ln-debug is active
18
+ if (window.lnCore && window.lnCore._debugIsContained) {
19
+ if (el) return window.lnCore._debugIsContained(el);
20
+ return window.lnCore._debugSink !== null;
21
+ }
22
+
23
+ // Direct DOM containment fallback (e.g. standalone tests or before gate boots)
24
+ if (el && el.closest) {
25
+ const host = el.closest('[data-ln-debug]');
26
+ if (!host || (typeof document !== 'undefined' && host === document.documentElement)) {
27
+ return false;
28
+ }
29
+ return true;
30
+ }
31
+ if (typeof document !== 'undefined' && document.body) {
32
+ return document.body.hasAttribute('data-ln-debug');
33
+ }
34
+ return false;
35
+ }
36
+
37
+ // ─── Global Console Warning Interceptor (Production Mode) ──
38
+ if (typeof window !== 'undefined') {
39
+ window.lnCore = window.lnCore || {};
40
+ if (!window.lnCore._warnBound) {
41
+ window.lnCore._warnBound = true;
42
+ const originalWarn = console.warn;
43
+ console.warn = function (...args) {
44
+ const isLibraryWarning = typeof args[0] === 'string' &&
45
+ (args[0].startsWith('[ln-') || args[0].startsWith('[lnCore'));
46
+
47
+ if (isLibraryWarning) {
48
+ let el = null;
49
+ for (let i = 1; i < args.length; i++) {
50
+ if (args[i] && args[i].nodeType === 1) {
51
+ el = args[i];
52
+ break;
53
+ }
54
+ }
55
+ if (!isDevMode(el)) {
56
+ return;
57
+ }
58
+ }
59
+ originalWarn.apply(console, args);
60
+ };
61
+ }
62
+ }
63
+
64
+ // ─── Event Dispatch & Sinks ────────────────────────────────
65
+
66
+ // Nullable console-observation sink. Installed/removed only by ln-debug's
67
+ // gate (components/ln-debug/src/gate.js). window.lnCore is guaranteed already
68
+ // initialized by the module-load-time block above (_warnBound),
69
+ // so the hot-path read needs no defensive "window.lnCore &&" guard.
70
+ export function setDebugSink(sink, isContained) {
71
+ window.lnCore = window.lnCore || {};
72
+ window.lnCore._debugSink = sink;
73
+ window.lnCore._debugIsContained = isContained || null;
74
+ }
75
+
76
+ // Nullable persist restore/save sink. Installed/removed only by ln-persist
77
+ // (components/ln-persist/src/ln-persist.js) — mirrors setDebugSink exactly.
78
+ export function setPersistSink(sink) {
79
+ window.lnCore = window.lnCore || {};
80
+ window.lnCore._persistSink = sink;
81
+ }
82
+
83
+ export function dispatch(element, eventName, detail) {
84
+ const payload = detail || {};
85
+ if (window.lnCore._debugSink) window.lnCore._debugSink('event', eventName, element, payload);
86
+ element.dispatchEvent(new CustomEvent(eventName, {
87
+ bubbles: true,
88
+ detail: payload
89
+ }));
90
+ }
91
+
92
+ export function dispatchCancelable(element, eventName, detail) {
93
+ const payload = detail || {};
94
+ if (window.lnCore._debugSink) window.lnCore._debugSink('event', eventName, element, payload);
95
+ const event = new CustomEvent(eventName, {
96
+ bubbles: true,
97
+ cancelable: true,
98
+ detail: payload
99
+ });
100
+ element.dispatchEvent(event);
101
+ return event;
102
+ }
103
+
104
+ /**
105
+ * Re-filter / re-sort / re-render a data-driven list-like component, then
106
+ * notify the coordinator that fresh data is requested.
107
+ */
108
+ export function requestData(component, eventName, keyName) {
109
+ component._applyFilterAndSort();
110
+ component._vStart = -1;
111
+ component._vEnd = -1;
112
+ component._render();
113
+ component._updateFooter();
114
+
115
+ const detail = {
116
+ sort: component.currentSort,
117
+ filters: component.currentFilters,
118
+ search: component.currentSearch
119
+ };
120
+ detail[keyName] = component.name;
121
+ dispatch(component.dom, eventName, detail);
122
+ }
@@ -0,0 +1,136 @@
1
+ // ─── Form Method Resolution ────────────────────────────────
2
+
3
+ export function resolveFormMethod(form) {
4
+ const methodInput = form.querySelector('input[name="_method"]');
5
+ const raw = (methodInput && methodInput.value !== '') ? methodInput.value : form.method;
6
+ return (raw || '').toUpperCase();
7
+ }
8
+
9
+ // ─── Form Serialization ───────────────────────────────────
10
+
11
+ export function serializeForm(form, opts) {
12
+ const typed = !!(opts && opts.typed);
13
+ const exclude = opts && opts.exclude;
14
+ const data = {};
15
+ const elements = form.elements;
16
+
17
+ const checkboxCounts = {};
18
+ if (typed) {
19
+ for (let i = 0; i < elements.length; i++) {
20
+ const el = elements[i];
21
+ if (el.name && el.type === 'checkbox' && !el.disabled) {
22
+ checkboxCounts[el.name] = (checkboxCounts[el.name] || 0) + 1;
23
+ }
24
+ }
25
+ }
26
+
27
+ for (let i = 0; i < elements.length; i++) {
28
+ const el = elements[i];
29
+ if (!el.name || el.disabled || el.type === 'file' || el.type === 'submit' || el.type === 'button') continue;
30
+ if (exclude && el.matches && el.matches(exclude)) continue;
31
+
32
+ if (el.type === 'checkbox') {
33
+ if (typed && checkboxCounts[el.name] === 1) {
34
+ data[el.name] = el.checked;
35
+ } else {
36
+ if (!data[el.name]) data[el.name] = [];
37
+ if (el.checked) data[el.name].push(el.value);
38
+ }
39
+ } else if (el.type === 'radio') {
40
+ if (el.checked) data[el.name] = el.value;
41
+ } else if (el.type === 'select-multiple') {
42
+ data[el.name] = [];
43
+ for (let j = 0; j < el.options.length; j++) {
44
+ if (el.options[j].selected) data[el.name].push(el.options[j].value);
45
+ }
46
+ } else if (typed && el.type === 'hidden') {
47
+ data[el.name] = el.value;
48
+ } else if (typed && (el.type === 'number' || el.type === 'range')) {
49
+ const n = Number(el.value);
50
+ data[el.name] = (el.value === '' || isNaN(n)) ? null : n;
51
+ } else {
52
+ data[el.name] = el.value;
53
+ }
54
+ }
55
+
56
+ return data;
57
+ }
58
+
59
+ // ─── Form Population ──────────────────────────────────────
60
+
61
+ function _coerceBool(value) {
62
+ if (typeof value !== 'string') return !!value;
63
+ const v = value.trim().toLowerCase();
64
+ return v !== 'false' && v !== '0' && v !== '' && v !== 'off' && v !== 'no';
65
+ }
66
+
67
+ export function populateForm(form, data) {
68
+ const elements = form.elements;
69
+ const filled = [];
70
+
71
+ const checkboxCounts = {};
72
+ for (let i = 0; i < elements.length; i++) {
73
+ const el = elements[i];
74
+ if (el.name && el.type === 'checkbox') {
75
+ checkboxCounts[el.name] = (checkboxCounts[el.name] || 0) + 1;
76
+ }
77
+ }
78
+
79
+ for (let i = 0; i < elements.length; i++) {
80
+ const el = elements[i];
81
+ if (el.type === 'file' || el.type === 'submit' || el.type === 'button') continue;
82
+
83
+ const matchKey = el.getAttribute('data-ln-fill-as') || el.name;
84
+ if (!matchKey || !(matchKey in data)) continue;
85
+
86
+ const value = data[matchKey];
87
+
88
+ if (el.type === 'checkbox') {
89
+ if (Array.isArray(value)) {
90
+ el.checked = value.indexOf(el.value) !== -1;
91
+ } else if (checkboxCounts[el.name] > 1) {
92
+ const list = String(value).split(',').map(function (s) { return s.trim(); });
93
+ el.checked = list.indexOf(el.value) !== -1;
94
+ } else {
95
+ el.checked = _coerceBool(value);
96
+ }
97
+ filled.push(el);
98
+ } else if (el.type === 'radio') {
99
+ el.checked = el.value === String(value);
100
+ filled.push(el);
101
+ } else if (el.type === 'select-multiple') {
102
+ if (Array.isArray(value)) {
103
+ for (let j = 0; j < el.options.length; j++) {
104
+ el.options[j].selected = value.indexOf(el.options[j].value) !== -1;
105
+ }
106
+ }
107
+ filled.push(el);
108
+ } else {
109
+ el.value = value;
110
+ filled.push(el);
111
+ }
112
+ }
113
+
114
+ return filled;
115
+ }
116
+
117
+ // ─── Value Property Interception ───────────────────────────
118
+
119
+ export function interceptValueProperty(dom, descriptor, { get, set }) {
120
+ Object.defineProperty(dom, 'value', {
121
+ get: function () {
122
+ if (get) {
123
+ return get.call(this);
124
+ }
125
+ return descriptor.get.call(this);
126
+ },
127
+ set: function (val) {
128
+ if (set) {
129
+ set.call(this, val, (originalVal) => descriptor.set.call(this, originalVal));
130
+ } else {
131
+ descriptor.set.call(this, val);
132
+ }
133
+ },
134
+ configurable: true
135
+ });
136
+ }
@@ -1,92 +1,149 @@
1
- // ─── Hash codec (URL fragment as namespaced state) ─────────
2
- //
3
- // Grammar: #nsA:valA&nsB:valB
4
- // Each component owns ONE namespace, ignores all others, and PRESERVES
5
- // foreign segments on write — this is what makes component isolation work.
6
- //
7
- // Three-state value model:
8
- // absent → hashGet returns null (e.g. closed)
9
- // #ns → hashGet returns '' (present, no value — e.g. "new")
10
- // #ns:val → hashGet returns 'val' (present, with param)
11
- //
12
- // Write mechanism: `location.hash =` (fires hashchange; identical value is a
13
- // no-op so there are no loops). Never pushState here.
14
-
15
- function _strip(str) {
16
- return (str || '').replace(/^#/, '');
17
- }
18
-
19
- export function hashParse(str) {
20
- const raw = (str === undefined) ? location.hash : str;
21
- const map = {};
22
- const h = _strip(raw);
23
- if (!h) return map;
24
- const parts = h.split('&');
25
- for (let i = 0; i < parts.length; i++) {
26
- const part = parts[i];
27
- if (!part) continue;
28
- const sep = part.indexOf(':');
29
- const ns = (sep > -1 ? part.slice(0, sep) : part);
30
- const val = (sep > -1 ? part.slice(sep + 1) : '');
31
- if (!ns) continue;
32
- try { map[ns] = decodeURIComponent(val); }
33
- catch (e) { map[ns] = val; }
34
- }
35
- return map;
36
- }
37
-
38
- export function hashGet(ns) {
39
- if (!ns) return null;
40
- const map = hashParse();
41
- return (ns in map) ? map[ns] : null;
42
- }
43
-
44
- export function hashSet(ns, value) {
45
- if (!ns) return;
46
- const map = hashParse();
47
- if (value === null || value === undefined) {
48
- delete map[ns];
49
- } else {
50
- map[ns] = String(value);
51
- }
52
- const keys = Object.keys(map);
53
- const next = keys.map(function (k) {
54
- const v = map[k];
55
- return (v === '') ? k : (k + ':' + encodeURIComponent(v));
56
- }).join('&');
57
- // Setting an identical hash is a no-op (no hashchange) → no loops.
58
- if (_strip(location.hash) === next) return;
59
- location.hash = next;
60
- }
61
-
62
- // ─── Hash-link click guard (shared by ln-tabs & ln-modal) ──
63
- //
64
- // A "hash link" is an <a href="#…"> whose click a component wants to drive
65
- // through the codec instead of native fragment navigation (native nav replaces
66
- // the WHOLE fragment and wipes foreign segments). Both ln-tabs and ln-modal
67
- // funnel their own anchor clicks through here so the guard + preventDefault
68
- // live in ONE place.
69
- //
70
- // Returns:
71
- // false → modifier / middle / shift-click: caller must return and let the
72
- // browser do native open-in-new-tab / new-window. No preventDefault.
73
- // true → ordinary click: preventDefault() has been called; caller proceeds
74
- // with its OWN write (hashSet merge, or a component-specific branch
75
- // such as ln-tabs' already-current setAttribute).
76
- //
77
- // Deliberately does NOT call hashSet — ln-tabs needs an "already-current value
78
- // → setAttribute active directly (no hash write)" branch, so the write differs
79
- // per component. The shared, reusable surface is the guard + preventDefault.
80
- export function hashLinkClick(e) {
81
- if (e.button === 1 || e.ctrlKey || e.metaKey || e.shiftKey) return false;
82
- e.preventDefault();
83
- return true;
84
- }
85
-
86
- if (typeof window !== 'undefined') {
87
- window.lnCore = window.lnCore || {};
88
- window.lnCore.hashParse = hashParse;
89
- window.lnCore.hashGet = hashGet;
90
- window.lnCore.hashSet = hashSet;
91
- window.lnCore.hashLinkClick = hashLinkClick;
92
- }
1
+ // ─── Hash codec (URL fragment as namespaced state) ─────────
2
+ //
3
+ // Grammar: #nsA:valA&nsB:valB
4
+ // Each component owns ONE namespace, ignores all others, and PRESERVES
5
+ // foreign segments on write — this is what makes component isolation work.
6
+ //
7
+ // Three-state value model:
8
+ // absent → hashGet returns null (e.g. closed)
9
+ // #ns → hashGet returns '' (present, no value — e.g. "new")
10
+ // #ns:val → hashGet returns 'val' (present, with param)
11
+ //
12
+ // Write mechanism: `location.hash =` (fires hashchange; identical value is a
13
+ // no-op so there are no loops). Never pushState here.
14
+
15
+ function _strip(str) {
16
+ return (str || '').replace(/^#/, '');
17
+ }
18
+
19
+ export function hashParse(str) {
20
+ const raw = (str === undefined) ? location.hash : str;
21
+ const map = {};
22
+ const h = _strip(raw);
23
+ if (!h) return map;
24
+ const parts = h.split('&');
25
+ for (let i = 0; i < parts.length; i++) {
26
+ const part = parts[i];
27
+ if (!part) continue;
28
+ const sep = part.indexOf(':');
29
+ const ns = (sep > -1 ? part.slice(0, sep) : part);
30
+ const val = (sep > -1 ? part.slice(sep + 1) : '');
31
+ if (!ns) continue;
32
+ try { map[ns] = decodeURIComponent(val); }
33
+ catch (e) { map[ns] = val; }
34
+ }
35
+ return map;
36
+ }
37
+
38
+ export function hashGet(ns) {
39
+ if (!ns) return null;
40
+ const map = hashParse();
41
+ return (ns in map) ? map[ns] : null;
42
+ }
43
+
44
+ export function hashSet(ns, value) {
45
+ if (!ns) return;
46
+ const map = hashParse();
47
+ if (value === null || value === undefined) {
48
+ delete map[ns];
49
+ } else {
50
+ map[ns] = String(value);
51
+ }
52
+ const keys = Object.keys(map);
53
+ const next = keys.map(function (k) {
54
+ const v = map[k];
55
+ return (v === '') ? k : (k + ':' + encodeURIComponent(v));
56
+ }).join('&');
57
+ // Setting an identical hash is a no-op (no hashchange) → no loops.
58
+ if (_strip(location.hash) === next) return;
59
+ location.hash = next;
60
+ }
61
+
62
+ // ─── Hash-link click guard (shared by ln-tabs & ln-modal) ──
63
+ //
64
+ // A "hash link" is an <a href="#…"> whose click a component wants to drive
65
+ // through the codec instead of native fragment navigation (native nav replaces
66
+ // the WHOLE fragment and wipes foreign segments). Both ln-tabs and ln-modal
67
+ // funnel their own anchor clicks through here so the guard + preventDefault
68
+ // live in ONE place.
69
+ //
70
+ // Returns:
71
+ // false → modifier / middle / shift-click: caller must return and let the
72
+ // browser do native open-in-new-tab / new-window. No preventDefault.
73
+ // true → ordinary click: preventDefault() has been called; caller proceeds
74
+ // with its OWN write (hashSet merge, or a component-specific branch
75
+ // such as ln-tabs' already-current setAttribute).
76
+ //
77
+ // Deliberately does NOT call hashSet — ln-tabs needs an "already-current value
78
+ // → setAttribute active directly (no hash write)" branch, so the write differs
79
+ // per component. The shared, reusable surface is the guard + preventDefault.
80
+ export function hashLinkClick(e) {
81
+ if (e.button === 1 || e.ctrlKey || e.metaKey || e.shiftKey) return false;
82
+ e.preventDefault();
83
+ return true;
84
+ }
85
+
86
+ // ─── Hash Helpers for Controls (ln-sort, ln-search, ln-filter) ──
87
+
88
+ export function resolveHashNamespace(el, defaultSuffix) {
89
+ if (!el || !el.hasAttribute('data-ln-hash')) return null;
90
+ const explicit = el.getAttribute('data-ln-hash');
91
+ if (explicit && explicit.trim() !== '') return explicit.trim();
92
+ const targetId = el.getAttribute('data-ln-sort')
93
+ || el.getAttribute('data-ln-search-for')
94
+ || el.getAttribute('data-ln-search')
95
+ || el.getAttribute('data-ln-filter')
96
+ || el.id;
97
+ if (targetId) {
98
+ return defaultSuffix ? (targetId + '-' + defaultSuffix) : targetId;
99
+ }
100
+ return defaultSuffix || null;
101
+ }
102
+
103
+ export function hashSortEncode(fieldOrColumn, direction) {
104
+ if (!direction || direction === 'none' || fieldOrColumn === null || fieldOrColumn === undefined) return null;
105
+ return String(fieldOrColumn) + '.' + direction;
106
+ }
107
+
108
+ export function hashSortDecode(val) {
109
+ if (!val || typeof val !== 'string') return null;
110
+ if (val.endsWith('.asc')) {
111
+ return { fieldOrColumn: val.slice(0, -4), direction: 'asc' };
112
+ }
113
+ if (val.endsWith('.desc')) {
114
+ return { fieldOrColumn: val.slice(0, -5), direction: 'desc' };
115
+ }
116
+ return null;
117
+ }
118
+
119
+ export function hashFilterEncode(key, values) {
120
+ if (!key || !Array.isArray(values) || values.length === 0) return null;
121
+ return key + ':' + values.map(encodeURIComponent).join(',');
122
+ }
123
+
124
+ export function hashFilterDecode(val) {
125
+ if (!val || typeof val !== 'string') return null;
126
+ const colon = val.indexOf(':');
127
+ if (colon === -1) return null;
128
+ const key = val.slice(0, colon);
129
+ const rawValues = val.slice(colon + 1);
130
+ const values = rawValues ? rawValues.split(',').map(function (v) {
131
+ try { return decodeURIComponent(v); }
132
+ catch (e) { return v; }
133
+ }).filter(Boolean) : [];
134
+ return { key: key, values: values };
135
+ }
136
+
137
+ if (typeof window !== 'undefined') {
138
+ window.lnCore = window.lnCore || {};
139
+ window.lnCore.hashParse = hashParse;
140
+ window.lnCore.hashGet = hashGet;
141
+ window.lnCore.hashSet = hashSet;
142
+ window.lnCore.hashLinkClick = hashLinkClick;
143
+ window.lnCore.resolveHashNamespace = resolveHashNamespace;
144
+ window.lnCore.hashSortEncode = hashSortEncode;
145
+ window.lnCore.hashSortDecode = hashSortDecode;
146
+ window.lnCore.hashFilterEncode = hashFilterEncode;
147
+ window.lnCore.hashFilterDecode = hashFilterDecode;
148
+ }
149
+
@@ -0,0 +1,33 @@
1
+ // ==========================================================================
2
+ // ln-core — Shared Helpers & Runtime Kernel Facade (Barrel File)
3
+ // ==========================================================================
4
+ // All primitives are modularized into cohesive single-responsibility modules.
5
+ // This barrel re-exports the entire public surface with 100% backward
6
+ // compatibility. Evaluation order preserves module initialization invariants:
7
+ // events.js evaluates first to ensure window.lnCore and console warning
8
+ // interception are established before subsequent modules load.
9
+ // ==========================================================================
10
+
11
+ // Events & Debug
12
+ export { dispatch, dispatchCancelable, requestData, setDebugSink, setPersistSink, hasActiveDebug, isDevMode } from './events.js';
13
+
14
+ // DOM & Target Predicates
15
+ export { guardBody, isVisible, shouldIgnoreClick, isEditableTarget, isTargetDisabled, isUsableTarget, shouldInterceptLink, readValue } from './dom.js';
16
+
17
+ // Form Utilities
18
+ export { resolveFormMethod, serializeForm, populateForm, interceptValueProperty } from './form.js';
19
+
20
+ // HTTP & Data Mappers
21
+ export { buildUrl, getHeaders, parseHeaders, registerDataMapper, getDataMapper } from './http.js';
22
+
23
+ // Locale & i18n
24
+ export { getLocale, ensureLocaleObserver, registerLocaleFallback, getLocaleFallback } from './locale.js';
25
+
26
+ // Templates & DOM Fill
27
+ export { cloneTemplate, cloneTemplateScoped, fill, lnFill, fillTemplate, renderList, buildDict } from './template.js';
28
+
29
+ // Lifecycle & Kernel Registration
30
+ export { findElements, holdInit, releaseInit, pendingCount, queueBoot, observeAttributes, registerComponent } from './lifecycle.js';
31
+
32
+ // Value Comparison Primitives (re-exported from compare.js for backward compatibility)
33
+ export { compareValues, detectValueType } from './compare.js';