@livenetworks/ashlar 1.6.1 → 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 (559) 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/{js → components}/ln-confirm/README.md +69 -18
  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 -171
  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/_ln-confirm.scss +0 -24
  414. package/js/ln-confirm/ln-confirm.js +0 -1
  415. package/js/ln-core/crypto.js +0 -83
  416. package/js/ln-core/helpers.js +0 -788
  417. package/js/ln-core/index.js +0 -7
  418. package/js/ln-core/persist.js +0 -97
  419. package/js/ln-couchdb-connector/ln-couchdb-connector.js +0 -1
  420. package/js/ln-data-coordinator/ln-data-coordinator.js +0 -1
  421. package/js/ln-data-coordinator/src/data-read-policy.js +0 -18
  422. package/js/ln-data-store/ln-data-store.js +0 -1
  423. package/js/ln-date/ln-date.js +0 -1
  424. package/js/ln-date/src/ln-date.js +0 -603
  425. package/js/ln-debug/README.md +0 -58
  426. package/js/ln-debug/ln-debug.js +0 -1
  427. package/js/ln-debug/src/ln-debug.js +0 -19
  428. package/js/ln-dropdown/ln-dropdown.js +0 -1
  429. package/js/ln-dropdown/ln-dropdown.scss +0 -15
  430. package/js/ln-editor/ln-editor.js +0 -1
  431. package/js/ln-editor/ln-editor.scss +0 -43
  432. package/js/ln-external-links/ln-external-links.js +0 -1
  433. package/js/ln-fill/ln-fill.js +0 -1
  434. package/js/ln-filter/README.md +0 -189
  435. package/js/ln-filter/ln-filter-dev.scss +0 -8
  436. package/js/ln-filter/ln-filter.js +0 -1
  437. package/js/ln-filter/src/ln-filter.js +0 -419
  438. package/js/ln-form/ln-form.js +0 -1
  439. package/js/ln-http/ln-http.js +0 -1
  440. package/js/ln-link/ln-link.js +0 -1
  441. package/js/ln-list/README.md +0 -129
  442. package/js/ln-list/ln-list.js +0 -1
  443. package/js/ln-list/ln-list.scss +0 -28
  444. package/js/ln-modal/ln-modal-dev.scss +0 -13
  445. package/js/ln-modal/ln-modal.js +0 -1
  446. package/js/ln-modal/ln-modal.scss +0 -35
  447. package/js/ln-modal-coordinator/README.md +0 -99
  448. package/js/ln-modal-coordinator/ln-modal-coordinator-dev.scss +0 -8
  449. package/js/ln-modal-coordinator/ln-modal-coordinator.js +0 -1
  450. package/js/ln-nav/ln-nav.js +0 -1
  451. package/js/ln-number/README.md +0 -149
  452. package/js/ln-number/ln-number.js +0 -1
  453. package/js/ln-number/src/ln-number.js +0 -443
  454. package/js/ln-options/ln-options.js +0 -1
  455. package/js/ln-popover/ln-popover.js +0 -1
  456. package/js/ln-progress/ln-progress.js +0 -1
  457. package/js/ln-progress/src/ln-progress.js +0 -98
  458. package/js/ln-router/ln-router.js +0 -1
  459. package/js/ln-search/README.md +0 -158
  460. package/js/ln-search/ln-search-dev.scss +0 -8
  461. package/js/ln-search/ln-search.js +0 -1
  462. package/js/ln-search/src/ln-search.js +0 -117
  463. package/js/ln-slug/ln-slug.js +0 -1
  464. package/js/ln-sort/ln-sort.js +0 -1
  465. package/js/ln-sort/src/ln-sort.js +0 -178
  466. package/js/ln-sortable/ln-sortable.js +0 -1
  467. package/js/ln-stat/ln-stat.js +0 -1
  468. package/js/ln-table/ln-table.js +0 -1
  469. package/js/ln-table/ln-table.scss +0 -11
  470. package/js/ln-table-coordinator/README.md +0 -73
  471. package/js/ln-table-coordinator/ln-table-coordinator.js +0 -1
  472. package/js/ln-table-coordinator/src/ln-table-coordinator.js +0 -160
  473. package/js/ln-tabs/ln-tabs-dev.scss +0 -18
  474. package/js/ln-tabs/ln-tabs.js +0 -1
  475. package/js/ln-tabs/src/ln-tabs.js +0 -188
  476. package/js/ln-time/ln-time.js +0 -1
  477. package/js/ln-toast/ln-toast.js +0 -1
  478. package/js/ln-toggle/ln-toggle.js +0 -1
  479. package/js/ln-tooltip/ln-tooltip.js +0 -1
  480. package/js/ln-tooltip/ln-tooltip.scss +0 -9
  481. package/js/ln-translations/ln-translations.js +0 -1
  482. package/js/ln-upload/README.md +0 -255
  483. package/js/ln-upload/ln-upload.js +0 -1
  484. package/js/ln-upload/ln-upload.scss +0 -20
  485. package/js/ln-upload/src/ln-upload.js +0 -423
  486. package/js/ln-validate/ln-validate.js +0 -1
  487. package/scss/components/_button.scss +0 -20
  488. package/scss/components/_confirm.scss +0 -5
  489. package/scss/components/_form.scss +0 -107
  490. package/scss/components/_status-badge.scss +0 -4
  491. package/scss/components/_toast.scss +0 -68
  492. package/scss/components/_upload.scss +0 -51
  493. package/scss/config/_theme.scss +0 -216
  494. package/scss/config/mixins/_btn.scss +0 -179
  495. package/scss/config/mixins/_confirm.scss +0 -31
  496. package/scss/config/mixins/_dropdown.scss +0 -141
  497. package/scss/config/mixins/_popover.scss +0 -64
  498. package/scss/ln-ashlar-dev.scss +0 -39
  499. /package/{js → components}/ln-core/positioning.js +0 -0
  500. /package/{js → components}/ln-core/reactive.js +0 -0
  501. /package/{js → components}/ln-filter/ln-filter.scss +0 -0
  502. /package/{js → components}/ln-icon/ln-icon.js +0 -0
  503. /package/{js → components}/ln-icon/src/ln-icon.js +0 -0
  504. /package/{js → components}/ln-search/ln-search.scss +0 -0
  505. /package/{js → components}/ln-toast/template.html +0 -0
  506. /package/{scss → theme}/components/_accordion.scss +0 -0
  507. /package/{scss → theme}/components/_ajax.scss +0 -0
  508. /package/{scss → theme}/components/_alert.scss +0 -0
  509. /package/{scss → theme}/components/_avatar.scss +0 -0
  510. /package/{scss → theme}/components/_breadcrumbs.scss +0 -0
  511. /package/{scss → theme}/components/_card.scss +0 -0
  512. /package/{scss → theme}/components/_chip.scss +0 -0
  513. /package/{scss → theme}/components/_circular-progress.scss +0 -0
  514. /package/{scss → theme}/components/_editor.scss +0 -0
  515. /package/{scss → theme}/components/_empty-state.scss +0 -0
  516. /package/{scss → theme}/components/_filter.scss +0 -0
  517. /package/{scss → theme}/components/_link.scss +0 -0
  518. /package/{scss → theme}/components/_loader.scss +0 -0
  519. /package/{scss → theme}/components/_modal.scss +0 -0
  520. /package/{scss → theme}/components/_nav.scss +0 -0
  521. /package/{scss → theme}/components/_page-header.scss +0 -0
  522. /package/{scss → theme}/components/_popover.scss +0 -0
  523. /package/{scss → theme}/components/_progress.scss +0 -0
  524. /package/{scss → theme}/components/_prose.scss +0 -0
  525. /package/{scss → theme}/components/_scrollbar.scss +0 -0
  526. /package/{scss → theme}/components/_sections.scss +0 -0
  527. /package/{scss → theme}/components/_sidebar.scss +0 -0
  528. /package/{scss → theme}/components/_stat-card.scss +0 -0
  529. /package/{scss → theme}/components/_stepper.scss +0 -0
  530. /package/{scss → theme}/components/_timeline.scss +0 -0
  531. /package/{scss → theme}/components/_tooltip.scss +0 -0
  532. /package/{scss → theme}/components/_translations.scss +0 -0
  533. /package/{scss → theme}/config/_icons.scss +0 -0
  534. /package/{scss → theme}/config/_mixins.scss +0 -0
  535. /package/{scss → theme}/config/mixins/_ajax.scss +0 -0
  536. /package/{scss → theme}/config/mixins/_avatar.scss +0 -0
  537. /package/{scss → theme}/config/mixins/_breadcrumbs.scss +0 -0
  538. /package/{scss → theme}/config/mixins/_breakpoints.scss +0 -0
  539. /package/{scss → theme}/config/mixins/_chip.scss +0 -0
  540. /package/{scss → theme}/config/mixins/_circular-progress.scss +0 -0
  541. /package/{scss → theme}/config/mixins/_display.scss +0 -0
  542. /package/{scss → theme}/config/mixins/_empty-state.scss +0 -0
  543. /package/{scss → theme}/config/mixins/_focus.scss +0 -0
  544. /package/{scss → theme}/config/mixins/_interaction.scss +0 -0
  545. /package/{scss → theme}/config/mixins/_kbd.scss +0 -0
  546. /package/{scss → theme}/config/mixins/_link.scss +0 -0
  547. /package/{scss → theme}/config/mixins/_page-header.scss +0 -0
  548. /package/{scss → theme}/config/mixins/_position.scss +0 -0
  549. /package/{scss → theme}/config/mixins/_progress.scss +0 -0
  550. /package/{scss → theme}/config/mixins/_prose.scss +0 -0
  551. /package/{scss → theme}/config/mixins/_shadows.scss +0 -0
  552. /package/{scss → theme}/config/mixins/_sizing.scss +0 -0
  553. /package/{scss → theme}/config/mixins/_spacing.scss +0 -0
  554. /package/{scss → theme}/config/mixins/_stat-card.scss +0 -0
  555. /package/{scss → theme}/config/mixins/_stepper.scss +0 -0
  556. /package/{scss → theme}/config/mixins/_timeline.scss +0 -0
  557. /package/{scss → theme}/config/mixins/_transitions.scss +0 -0
  558. /package/{scss → theme}/config/mixins/_translations.scss +0 -0
  559. /package/{scss → theme}/tabler-icons.txt +0 -0
@@ -0,0 +1,486 @@
1
+ import {
2
+ buildDict,
3
+ dispatch,
4
+ ensureLocaleObserver,
5
+ formatDateToISO,
6
+ getLocale,
7
+ getLocaleFallback,
8
+ interceptValueProperty,
9
+ parseDateInput,
10
+ registerComponent,
11
+ registerLocaleFallback
12
+ } from '../../ln-core';
13
+
14
+ import {
15
+ formatDateValue,
16
+ KEYWORD_RE,
17
+ parseTypedDate
18
+ } from './date-model.js';
19
+
20
+ (function () {
21
+ const DOM_SELECTOR = 'data-ln-date';
22
+ const DOM_ATTRIBUTE = 'lnDate';
23
+
24
+ if (window[DOM_ATTRIBUTE] !== undefined) return;
25
+
26
+ function _syncAttribute(el) {
27
+ const inst = el[DOM_ATTRIBUTE];
28
+ if (!inst) return;
29
+ if (inst.isTextElement) {
30
+ inst._initTextElement();
31
+ } else if (inst.value) {
32
+ const date = parseDateInput(inst.value);
33
+ if (date) inst._displayFormatted(date);
34
+ }
35
+ }
36
+
37
+ // ─── Attribute Contract (SSOT) ──────────────────────────
38
+ const ATTRIBUTES = {
39
+ 'data-ln-date': { type: 'enum', values: ['short', 'medium', 'long', 'full', 'iso'], fallback: 'medium', effect: _syncAttribute, description: 'Date display style preset or activator' },
40
+ 'data-ln-date-format': { type: 'string', effect: _syncAttribute, description: 'Custom Intl.DateTimeFormat pattern or options' },
41
+ 'data-ln-date-locale': { type: 'string', effect: _syncAttribute, description: 'BCP 47 language tag override for date formatting' },
42
+ 'data-ln-value': { type: 'string', effect: _syncAttribute, description: 'Raw ISO date string or timestamp for non-time elements (td, span)' },
43
+ 'data-ln-date-dict': { type: 'marker', description: 'Container for date translation dictionary' },
44
+ 'data-ln-date-dict-key': { type: 'string', description: 'Dictionary key for relative time or custom date formatting' },
45
+ 'data-ln-date-field': { type: 'string', description: 'Field name mapping for date record binding' },
46
+ 'data-ln-date-label': { type: 'string', description: 'Accessible label text for the date input' }
47
+ };
48
+
49
+ const _inputValueDesc = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value');
50
+
51
+ // ─── Component Helpers ────────────────────────────────────
52
+
53
+ function _notifyChange(self, iso, date) {
54
+ dispatch(self.dom, 'ln-date:change', {
55
+ value: iso,
56
+ formatted: self.dom.value,
57
+ date: date
58
+ });
59
+ self.dom.dispatchEvent(new Event('change', { bubbles: true }));
60
+ }
61
+
62
+ function _updateState(self, iso, date, formattedText) {
63
+ self._setHiddenRaw(iso);
64
+ _inputValueDesc.set.call(self._picker, iso);
65
+ self._lastISO = iso;
66
+ if (formattedText !== undefined) {
67
+ self._isFormatting = true;
68
+ self.dom.value = formattedText;
69
+ self._isFormatting = false;
70
+ } else if (date) {
71
+ self._displayFormatted(date);
72
+ }
73
+ _notifyChange(self, iso, date);
74
+ }
75
+
76
+ function _clearState(self) {
77
+ self._setHiddenRaw('');
78
+ _inputValueDesc.set.call(self._picker, '');
79
+ self._isFormatting = true;
80
+ self.dom.value = '';
81
+ self._isFormatting = false;
82
+ self._lastISO = '';
83
+ _notifyChange(self, '', null);
84
+ }
85
+
86
+ // ─── Component Constructor & Methods ──────────────────────
87
+
88
+ function _component(dom) {
89
+ if (dom[DOM_ATTRIBUTE]) return dom[DOM_ATTRIBUTE];
90
+ dom[DOM_ATTRIBUTE] = this;
91
+
92
+ this.dom = dom;
93
+ const self = this;
94
+
95
+ // Subscribe to global locale changes
96
+ this._onLocaleChange = function () {
97
+ if (self.isTextElement) {
98
+ self._formatTextContent();
99
+ } else if (self.value) {
100
+ const date = parseDateInput(self.value);
101
+ if (date) self._displayFormatted(date);
102
+ }
103
+ };
104
+ ensureLocaleObserver();
105
+ document.addEventListener('ln-core:locale-change', this._onLocaleChange);
106
+
107
+ if (dom.tagName !== 'INPUT') {
108
+ this.isTextElement = true;
109
+ this._initTextElement();
110
+ return this;
111
+ }
112
+
113
+ this.isTextElement = false;
114
+
115
+ // Read initial state
116
+ const initialValue = dom.value;
117
+ const name = dom.name;
118
+
119
+ // Check for declarative HTML dictionary nearby
120
+ const container = dom.closest('.form-element, form') || dom.parentNode;
121
+ if (container) {
122
+ const dictEls = container.querySelectorAll('[data-ln-date-dict]');
123
+ for (let i = 0; i < dictEls.length; i++) {
124
+ const lang = dictEls[i].getAttribute('data-ln-date-dict');
125
+ if (lang) {
126
+ const dictData = buildDict(dictEls[i], 'data-ln-date-dict-key');
127
+ if (dictData['months-long']) {
128
+ dictData.monthsLong = dictData['months-long'].split(',').map(s => s.trim());
129
+ }
130
+ if (dictData['months-short']) {
131
+ dictData.monthsShort = dictData['months-short'].split(',').map(s => s.trim());
132
+ }
133
+ registerLocaleFallback(lang, dictData);
134
+ }
135
+ }
136
+ }
137
+
138
+ // Wrap field: <span data-ln-date-field>
139
+ const wrapper = document.createElement('span');
140
+ wrapper.setAttribute('data-ln-date-field', '');
141
+ dom.parentNode.insertBefore(wrapper, dom);
142
+ wrapper.appendChild(dom);
143
+ this._wrapper = wrapper;
144
+
145
+ // Create hidden input for form submission
146
+ const hidden = document.createElement('input');
147
+ hidden.type = 'hidden';
148
+ hidden.name = name;
149
+ dom.removeAttribute('name');
150
+ if (dom.hasAttribute('data-ln-fill-as')) {
151
+ hidden.setAttribute('data-ln-fill-as', dom.getAttribute('data-ln-fill-as'));
152
+ }
153
+ dom.insertAdjacentElement('afterend', hidden);
154
+ this._hidden = hidden;
155
+
156
+ // Create hidden date input for native picker
157
+ const picker = document.createElement('input');
158
+ picker.type = 'date';
159
+ picker.tabIndex = -1;
160
+ picker.setAttribute('tabindex', '-1');
161
+ picker.setAttribute('aria-hidden', 'true');
162
+ picker.setAttribute('aria-label', dom.getAttribute('data-ln-date-label') || 'Date picker');
163
+ picker.style.cssText = 'position:absolute;opacity:0;width:0;height:0;overflow:hidden;pointer-events:none';
164
+ hidden.insertAdjacentElement('afterend', picker);
165
+ this._picker = picker;
166
+
167
+ // Transform visible input to text
168
+ dom.type = 'text';
169
+
170
+ // Create calendar button
171
+ const btn = document.createElement('button');
172
+ btn.type = 'button';
173
+ btn.setAttribute('aria-label', dom.getAttribute('data-ln-date-label') || 'Open date picker');
174
+ btn.innerHTML = '<svg class="ln-icon" aria-hidden="true"><use href="#ln-icon-calendar"></use></svg>';
175
+ picker.insertAdjacentElement('afterend', btn);
176
+ this._btn = btn;
177
+ this._lastISO = '';
178
+
179
+ // Intercept programmatic value sets on hidden input
180
+ Object.defineProperty(hidden, 'value', {
181
+ get: function () {
182
+ return _inputValueDesc.get.call(hidden);
183
+ },
184
+ set: function (val) {
185
+ _inputValueDesc.set.call(hidden, val);
186
+ if (val && val !== '') {
187
+ const date = parseDateInput(val);
188
+ if (date) _updateState(self, val, date);
189
+ } else if (val === '') {
190
+ _clearState(self);
191
+ }
192
+ }
193
+ });
194
+
195
+ // Intercept programmatic value sets on visible input (2-way binding)
196
+ interceptValueProperty(dom, _inputValueDesc, {
197
+ get: function () {
198
+ return _inputValueDesc.get.call(dom);
199
+ },
200
+ set: function (val, originalSet) {
201
+ if (self._isFormatting) {
202
+ originalSet(val);
203
+ return;
204
+ }
205
+ if (!val || val === '') {
206
+ originalSet('');
207
+ _clearState(self);
208
+ return;
209
+ }
210
+
211
+ const date = parseDateInput(val) || parseTypedDate(val);
212
+ if (date) {
213
+ const iso = formatDateToISO(date);
214
+ const format = dom.getAttribute(DOM_SELECTOR) || '';
215
+ const locale = getLocale(dom);
216
+ const fallback = getLocaleFallback(locale);
217
+ const formatted = formatDateValue(date, format, locale, fallback);
218
+ originalSet(formatted);
219
+ _updateState(self, iso, date, formatted);
220
+ } else {
221
+ originalSet(String(val));
222
+ _clearState(self);
223
+ }
224
+ }
225
+ });
226
+
227
+ // Bind events
228
+ this._onPickerChange = function () {
229
+ const val = picker.value;
230
+ if (val) {
231
+ const date = parseDateInput(val);
232
+ if (date) _updateState(self, val, date);
233
+ } else {
234
+ _clearState(self);
235
+ }
236
+ };
237
+ picker.addEventListener('change', this._onPickerChange);
238
+
239
+ this._onBlur = function () {
240
+ const typed = self.dom.value.trim();
241
+
242
+ if (typed === '') {
243
+ if (self._lastISO !== '') _clearState(self);
244
+ return;
245
+ }
246
+
247
+ if (self._lastISO) {
248
+ const currentDate = parseDateInput(self._lastISO);
249
+ if (currentDate) {
250
+ const format = self.dom.getAttribute(DOM_SELECTOR) || '';
251
+ const locale = getLocale(self.dom);
252
+ const fallback = getLocaleFallback(locale);
253
+ if (typed === formatDateValue(currentDate, format, locale, fallback)) return;
254
+ }
255
+ }
256
+
257
+ const parsed = parseTypedDate(typed);
258
+ if (parsed) {
259
+ const iso = formatDateToISO(parsed);
260
+ _updateState(self, iso, parsed);
261
+ } else {
262
+ if (self._lastISO) {
263
+ const prevDate = parseDateInput(self._lastISO);
264
+ if (prevDate) self._displayFormatted(prevDate);
265
+ } else {
266
+ self.dom.value = '';
267
+ }
268
+ }
269
+ };
270
+ dom.addEventListener('blur', this._onBlur);
271
+
272
+ this._onBtnClick = function () {
273
+ self._openPicker();
274
+ };
275
+ btn.addEventListener('click', this._onBtnClick);
276
+
277
+ // Handle form reset
278
+ const form = dom.form;
279
+ if (form) {
280
+ this._form = form;
281
+ this._onFormReset = function () {
282
+ setTimeout(function () {
283
+ const val = self.dom.value;
284
+ if (val) {
285
+ const date = parseDateInput(val) || parseTypedDate(val);
286
+ if (date) {
287
+ const iso = formatDateToISO(date);
288
+ _updateState(self, iso, date);
289
+ return;
290
+ }
291
+ }
292
+ _clearState(self);
293
+ }, 0);
294
+ };
295
+ form.addEventListener('reset', this._onFormReset);
296
+ }
297
+
298
+ // Handle initial pre-filled value
299
+ if (initialValue && initialValue !== '') {
300
+ const date = parseDateInput(initialValue);
301
+ if (date) _updateState(self, initialValue, date);
302
+ }
303
+
304
+ return this;
305
+ }
306
+
307
+ _component.prototype._initTextElement = function () {
308
+ const dom = this.dom;
309
+ const valAttr = dom.getAttribute('data-ln-value');
310
+ const dateAttr = dom.getAttribute('data-ln-date');
311
+ const datetimeAttr = dom.getAttribute('datetime');
312
+
313
+ let candidate = null;
314
+ if (dom.tagName === 'TIME' && datetimeAttr !== null && datetimeAttr !== '') {
315
+ candidate = datetimeAttr;
316
+ } else if (valAttr !== null && valAttr !== '') {
317
+ candidate = valAttr;
318
+ } else if (datetimeAttr !== null && datetimeAttr !== '') {
319
+ candidate = datetimeAttr;
320
+ } else if (dateAttr !== null && dateAttr !== '' && dateAttr !== 'true' && !KEYWORD_RE.test(dateAttr)) {
321
+ candidate = dateAttr;
322
+ } else {
323
+ candidate = dom.textContent.trim();
324
+ }
325
+
326
+ const date = parseDateInput(candidate) || parseTypedDate(candidate);
327
+ if (date && !isNaN(date.getTime())) {
328
+ const iso = formatDateToISO(date);
329
+ this._rawValue = iso;
330
+ if (dom.tagName !== 'TIME' && !dom.hasAttribute('data-ln-value')) {
331
+ dom.setAttribute('data-ln-value', iso);
332
+ }
333
+ this._formatTextContent();
334
+ } else {
335
+ this._rawValue = null;
336
+ }
337
+ };
338
+
339
+ _component.prototype._formatTextContent = function () {
340
+ if (this._rawValue) {
341
+ const date = parseDateInput(this._rawValue);
342
+ if (date) {
343
+ const formatAttr = this.dom.getAttribute('data-ln-date-format');
344
+ let format = formatAttr;
345
+ if (!format) {
346
+ const dateAttr = this.dom.getAttribute('data-ln-date');
347
+ if (dateAttr && KEYWORD_RE.test(dateAttr)) {
348
+ format = dateAttr;
349
+ }
350
+ }
351
+ const locale = getLocale(this.dom);
352
+ const fallback = getLocaleFallback(locale);
353
+ this.dom.textContent = formatDateValue(date, format || 'medium', locale, fallback);
354
+ }
355
+ }
356
+ };
357
+
358
+ _component.prototype._openPicker = function () {
359
+ if (typeof this._picker.showPicker === 'function') {
360
+ try {
361
+ this._picker.showPicker();
362
+ } catch (e) {
363
+ this._picker.click();
364
+ }
365
+ } else {
366
+ this._picker.click();
367
+ }
368
+ };
369
+
370
+ _component.prototype._setHiddenRaw = function (val) {
371
+ _inputValueDesc.set.call(this._hidden, val);
372
+ };
373
+
374
+ _component.prototype._displayFormatted = function (date) {
375
+ const format = this.dom.getAttribute(DOM_SELECTOR) || '';
376
+ const locale = getLocale(this.dom);
377
+ const fallback = getLocaleFallback(locale);
378
+ this._isFormatting = true;
379
+ this.dom.value = formatDateValue(date, format, locale, fallback);
380
+ this._isFormatting = false;
381
+ };
382
+
383
+ // ─── Public API ───────────────────────────────────────────
384
+
385
+ Object.defineProperty(_component.prototype, 'value', {
386
+ get: function () {
387
+ if (this.isTextElement) {
388
+ return this._rawValue || '';
389
+ }
390
+ return _inputValueDesc.get.call(this._hidden);
391
+ },
392
+ set: function (isoStr) {
393
+ if (this.isTextElement) {
394
+ if (!isoStr || isoStr === '') {
395
+ this._rawValue = null;
396
+ this.dom.removeAttribute('data-ln-value');
397
+ if (this.dom.tagName === 'TIME') {
398
+ this.dom.removeAttribute('datetime');
399
+ }
400
+ this.dom.textContent = '';
401
+ return;
402
+ }
403
+ const date = parseDateInput(isoStr) || parseTypedDate(isoStr);
404
+ if (!date) return;
405
+ const iso = formatDateToISO(date);
406
+ this._rawValue = iso;
407
+ if (this.dom.tagName === 'TIME') {
408
+ this.dom.setAttribute('datetime', iso);
409
+ } else {
410
+ this.dom.setAttribute('data-ln-value', iso);
411
+ }
412
+ this._formatTextContent();
413
+ return;
414
+ }
415
+ if (!isoStr || isoStr === '') {
416
+ _clearState(this);
417
+ return;
418
+ }
419
+ const date = parseDateInput(isoStr);
420
+ if (!date) return;
421
+ _updateState(this, isoStr, date);
422
+ }
423
+ });
424
+
425
+ Object.defineProperty(_component.prototype, 'date', {
426
+ get: function () {
427
+ const val = this.value;
428
+ if (!val) return null;
429
+ return parseDateInput(val);
430
+ },
431
+ set: function (dateObj) {
432
+ if (!dateObj || !(dateObj instanceof Date) || isNaN(dateObj.getTime())) {
433
+ this.value = '';
434
+ return;
435
+ }
436
+ this.value = formatDateToISO(dateObj);
437
+ }
438
+ });
439
+
440
+ Object.defineProperty(_component.prototype, 'formatted', {
441
+ get: function () {
442
+ if (this.isTextElement) {
443
+ return this.dom.textContent;
444
+ }
445
+ return this.dom.value;
446
+ }
447
+ });
448
+
449
+ _component.prototype.destroy = function () {
450
+ if (!this.dom[DOM_ATTRIBUTE]) return;
451
+ if (this.isTextElement) {
452
+ delete this.dom[DOM_ATTRIBUTE];
453
+ return;
454
+ }
455
+ if (this._form && this._onFormReset) {
456
+ this._form.removeEventListener('reset', this._onFormReset);
457
+ }
458
+ this._picker.removeEventListener('change', this._onPickerChange);
459
+ this.dom.removeEventListener('blur', this._onBlur);
460
+ this._btn.removeEventListener('click', this._onBtnClick);
461
+ const isoVal = this.value;
462
+ this._hidden.remove();
463
+ this._picker.remove();
464
+ this._btn.remove();
465
+ if (this._wrapper && this._wrapper.parentNode) {
466
+ this._wrapper.parentNode.insertBefore(this.dom, this._wrapper);
467
+ this._wrapper.remove();
468
+ }
469
+ delete this.dom.value;
470
+ this.dom.name = this._hidden.name;
471
+ this.dom.type = 'date';
472
+ if (isoVal) this.dom.value = isoVal;
473
+ if (this._onLocaleChange) {
474
+ document.removeEventListener('ln-core:locale-change', this._onLocaleChange);
475
+ }
476
+ delete this.dom[DOM_ATTRIBUTE];
477
+ };
478
+
479
+ // ─── Init ─────────────────────────────────────────────────
480
+
481
+ registerComponent(DOM_SELECTOR, DOM_ATTRIBUTE, _component, 'ln-date', {
482
+ attributes: ATTRIBUTES,
483
+ extraAttributes: ['datetime', 'lang'],
484
+ onAttributeChange: _syncAttribute
485
+ });
486
+ })();
@@ -0,0 +1,132 @@
1
+ # ln-debug
2
+
3
+ > Activated via the `data-ln-debug` attribute on `<body>` (or an element inside `<body>`). It gates library console warnings (`[ln-`), listens to DOM mutations and `ln-*` CustomEvents, verifies cross-references (`data-ln-*-for`, `data-ln-*-source`), and flags misspelled library attributes against the schema manifest using Levenshtein distance. It introduces zero production overhead, remaining dormant or excluded outside development mode without modifying DOM structure.
4
+
5
+ ---
6
+
7
+ ## 1. Philosophy & Purpose
8
+
9
+ In production, libraries should remain completely silent and zero-overhead. In development, however, missing templates, broken target IDs (`data-ln-toggle-for`), unresolved data stores (`data-ln-table-source`), and attribute spelling typos (`data-ln-tabl-source`) lead to silent failures and wasted debugging time.
10
+
11
+ The `ln-debug` component solves this by providing:
12
+ 1. **Console Warning Filter**: Gates library warnings (`[ln-` / `[lnCore`) so they only print when debug mode is enabled.
13
+ 2. **Generic Cross-Reference Contract Verifier**:
14
+ - Validates that `data-ln-*-for` target IDs resolve to existing DOM elements.
15
+ - Validates that `data-ln-*-source` and `data-ln-*-store` consumers resolve to declared `[data-ln-data-store]` providers.
16
+ - Flags duplicate `[data-ln-data-store]` instances across the document.
17
+ - Detects misspelled `data-ln-*` attributes against the schema-generated attribute manifest.
18
+ 3. **Console Observation Layer**: Logs every `ln-*` CustomEvent dispatched through `ln-core`, and every library attribute mutation, to the console — the library's whole runtime life, visible on demand.
19
+ 4. **Zero Production Overhead**: Runs strictly in dev mode (`data-ln-debug` attribute or `dist/ln-ashlar-dev.js`).
20
+
21
+ ---
22
+
23
+ ## 2. Minimal Blueprint
24
+
25
+ Add the `data-ln-debug` attribute to `<body>`, or to any element whose
26
+ subtree should be observed:
27
+
28
+ ```html
29
+ <!DOCTYPE html>
30
+ <html lang="en">
31
+ <head>
32
+ <!-- Core library and Dev Verifier -->
33
+ <script src="dist/ln-ashlar.iife.js" defer></script>
34
+ </head>
35
+ <body data-ln-debug>
36
+ <!-- Broken references or typos will be reported clearly in the console -->
37
+ <button data-ln-toggle-for="sidebar-menu">Toggle</button>
38
+ <div id="sidebar-menu">Sidebar Content</div>
39
+ </body>
40
+ </html>
41
+ ```
42
+
43
+ The console warning filter (§1), the cross-reference verifier (§3), and
44
+ the console observation layer (§6) activate on elements inside `<body>`'s
45
+ subtree — see §6 for the observation layer's host-containment rule.
46
+ Placing `data-ln-debug` on `<html>` is unsupported and ignored.
47
+
48
+ ---
49
+
50
+ ## 3. Generic Resolvers & Diagnostic Rules
51
+
52
+ | Rule | Pattern | Description | Example Warning |
53
+ |---|---|---|---|
54
+ | **ID References** | `data-ln-*-for="id"` | Verifies target `#id` exists in the document | `[ln-debug] Unresolved ID reference: <button data-ln-toggle-for="menu"> targets "#menu", but no element with id="menu" exists in the document.` |
55
+ | **Store References** | `data-ln-*-source="store"` | Verifies `[data-ln-data-store="store"]` exists in the DOM | `[ln-debug] Unresolved store reference: <table data-ln-table-source="users"> targets store "users", but no [data-ln-data-store="users"] exists in the document.` |
56
+ | **Store Uniqueness** | `[data-ln-data-store]` | Ensures store names are globally unique | `[ln-debug] Duplicate store name: Multiple elements declare data-ln-data-store="users". Store names must be unique across the document.` |
57
+ | **Attribute Spelling** | `data-ln-*` | Checks against generated attribute manifest and suggests typos | `[ln-debug] Unknown attribute "data-ln-table-sorce" on <table>. Did you mean "data-ln-table-source"?` |
58
+
59
+ ---
60
+
61
+ ## 4. Programmatic API
62
+
63
+ When debug mode is loaded, `window.lnDebug` is available for on-demand verification and testing:
64
+
65
+ ```javascript
66
+ // Perform a synchronous scan of the document (or a specific subtree)
67
+ const report = window.lnDebug.verify(document.body, { silent: false });
68
+
69
+ console.log(`Found ${report.total} issue(s):`);
70
+ console.log(report.idIssues);
71
+ console.log(report.storeIssues);
72
+ console.log(report.uniquenessIssues);
73
+ console.log(report.spellingIssues);
74
+
75
+ // Schedule a debounced verification that waits for lifecycle boot queue to settle
76
+ window.lnDebug.schedule(document.body, 50, (report) => {
77
+ console.log('DOM verification completed:', report);
78
+ });
79
+ ```
80
+
81
+ ---
82
+
83
+ ## 5. Lifecycle Coordination & False-Alarm Prevention
84
+
85
+ The verifier hooks into `lnCore`'s `queueBoot` and `pendingCount()`:
86
+ - If asynchronous initialization is in progress (`holdInit` > 0 from `ln-include` or router), verification is queued and executes only after boot holds are released.
87
+ - Rapid DOM mutations are debounced to ensure sibling elements (e.g. stores and consumers) have fully settled before invariants are asserted.
88
+
89
+ ---
90
+
91
+ ## 6. Console Observation Layer
92
+
93
+ While a host is active, `ln-core`'s `dispatch()`, `dispatchCancelable()`, and
94
+ `lnFill()` log every `ln-*` CustomEvent they emit — event name, target
95
+ element, and detail payload — to the console via `console.groupCollapsed`.
96
+ The shared attribute observer likewise logs every mutation of a
97
+ `data-ln-*` attribute, and of any attribute the library's reactive
98
+ registry already observes (`lang`, `href`, `datetime`), as an `old →
99
+ new` pair. Page attributes the library has no opinion on (`class`,
100
+ `style`, `aria-*`) are never logged — this is the library's runtime life,
101
+ not the page's.
102
+
103
+ **Host containment.** A host is any element carrying `data-ln-debug`.
104
+ Multiple hosts may be active at once. An event or attribute mutation is
105
+ logged only when some active host `.contains()` the target element — this
106
+ layer observes its own subtree, exactly like every other component in the
107
+ library. Placing `data-ln-debug` on `<body>` observes the whole page;
108
+ placing it on a smaller container scopes logging to that container's
109
+ descendants only.
110
+
111
+ **Page-wide exception.** A handful of `dispatch()` calls target `window` or
112
+ `document` directly — `ln-toast:enqueue`, `ln-data-store:online` /
113
+ `offline` / `quota-exceeded`, `ln-core:locale-change` — because no element
114
+ subtree can contain a target that isn't an element. These log only when
115
+ `document.body` itself is a host.
116
+
117
+ **Scope.** `data-ln-debug` is read from elements inside `document.body`'s
118
+ subtree via the shared attribute observer, and is re-evaluated on every
119
+ mutation of that attribute — adding or removing it on any descendant of
120
+ `<body>` (including `<body>` itself) takes effect immediately, without a
121
+ reload, whether added, removed, or toggled in the DOM inspector. An element
122
+ that already carries `data-ln-debug` at the moment it is inserted into the
123
+ document — via `innerHTML`, `appendChild`, `ln-include`, or a router view
124
+ swap — becomes an active host immediately on insertion, and stops being one
125
+ the moment it is removed. `<html>` is not a supported host for this layer —
126
+ unlike the console warning filter in §1, which still reads `data-ln-debug`
127
+ from `<html>` or `<body>`. The two checks are independent and are not
128
+ required to agree.
129
+
130
+ Nothing is logged via `console.warn` or `console.debug` — `console.warn`
131
+ is reserved for markup-error diagnostics (see above), and Chrome hides
132
+ `console.debug` below its Verbose log level by default.