@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,48 @@
1
+ @use '../config/mixins' as *;
2
+
3
+ [data-ln-toast] {
4
+ @include toast-container;
5
+ }
6
+
7
+ // The <li> IS the card: structural (item) + visual (card) styling both bind
8
+ // here, contextually — the <li> carries no static class (no-BEM), only the
9
+ // filled/authored type class.
10
+ [data-ln-toast] > li {
11
+ @include toast-item;
12
+ @include toast-card;
13
+ }
14
+
15
+ [data-ln-toast] > li.ln-enter {
16
+ @include toast-item-enter;
17
+ }
18
+
19
+ [data-ln-toast] > li.ln-out {
20
+ @include toast-item-out;
21
+ }
22
+
23
+ // Type → tone. The status→tone map lives here (one place): warn maps to the
24
+ // warning family. SSR authors the class; the dynamic path fills it verbatim.
25
+ [data-ln-toast] > li.success { @include semantic-color(success); }
26
+ [data-ln-toast] > li.error { @include semantic-color(error); }
27
+ [data-ln-toast] > li:is(.warn, .warning) { @include semantic-color(warning); }
28
+ [data-ln-toast] > li.info { @include semantic-color(info); }
29
+
30
+ [data-ln-toast] .icon {
31
+ @include toast-icon;
32
+ }
33
+
34
+ [data-ln-toast] .icon ul {
35
+ @include toast-icon-list;
36
+ }
37
+
38
+ [data-ln-toast] .content {
39
+ @include toast-content;
40
+ }
41
+
42
+ [data-ln-toast] .title {
43
+ @include toast-title;
44
+ }
45
+
46
+ [data-ln-toast] .body {
47
+ @include toast-body;
48
+ }
@@ -91,7 +91,7 @@
91
91
  button[data-ln-toggle-for]:has(> .ln-icon:only-child) {
92
92
  --btn-bg: transparent;
93
93
  --btn-border: transparent;
94
- --btn-bg-hover: var(--bg-sunken);
94
+ --btn-bg-hover: var(--bg-hover);
95
95
  --btn-border-hover: transparent;
96
96
  --btn-fg-hover: var(--color-fg);
97
97
  }
@@ -0,0 +1,45 @@
1
+ @use '../config/mixins' as *;
2
+
3
+ [data-ln-upload] {
4
+ @include upload;
5
+ }
6
+
7
+ [data-ln-upload-zone] {
8
+ @include upload-zone;
9
+ }
10
+
11
+ [data-ln-upload-zone][data-ln-upload-state="dragover"] {
12
+ @include upload-zone-dragover;
13
+ }
14
+
15
+ [data-ln-upload-list] {
16
+ @include upload-list;
17
+ }
18
+
19
+ [data-ln-upload-item] {
20
+ @include upload-item;
21
+ }
22
+
23
+ [data-ln-upload-item] [data-ln-field="name"] {
24
+ @include upload-name;
25
+ }
26
+
27
+ [data-ln-upload-item] [data-ln-field="sizeText"] {
28
+ @include upload-size;
29
+ }
30
+
31
+ [data-ln-upload-item] [data-ln-upload-progress] {
32
+ @include upload-progress;
33
+
34
+ [data-ln-progress] {
35
+ @include upload-progress-bar;
36
+ }
37
+ }
38
+
39
+ [data-ln-upload-item][data-ln-upload-state="error"] {
40
+ @include upload-item-error;
41
+ }
42
+
43
+ [data-ln-upload-item][data-ln-upload-state="deleting"]::before {
44
+ @include upload-item-deleting-spinner;
45
+ }
@@ -14,7 +14,7 @@
14
14
  // CSS custom properties are also exposed at :root so JS can read via
15
15
  // getComputedStyle(document.documentElement).getPropertyValue('--bp-md').
16
16
  //
17
- // See docs/css/breakpoints.md for full usage guide.
17
+ // See docs-mcp/css/breakpoints.md for full usage guide.
18
18
  // See docs/ln-ashlar-container-queries.md for container-query doctrine.
19
19
  // ==========================================================================
20
20
 
@@ -0,0 +1,128 @@
1
+ @use 'sass:color';
2
+ @use 'sass:math';
3
+
4
+ // ==========================================================================
5
+ // Contrast solver — ln-ashlar
6
+ // ==========================================================================
7
+ // Pure Sass WCAG 2.x contrast math. No consumer yet — this module is not
8
+ // @use'd anywhere. See .claude/plans/contrast-step1-solver.md.
9
+ //
10
+ // luminance() — WCAG relative luminance of a color
11
+ // contrast() — WCAG contrast ratio between two colors
12
+ // solve-l() — binary search: HSL lightness meeting a target ratio
13
+ // on-color() — pick white/ink foreground meeting a target on a fill
14
+ // ==========================================================================
15
+
16
+ $ln-contrast-text: 7; // text on neutral surfaces — AAA
17
+ $ln-contrast-fill: 7; // text on solid brand fills — AAA
18
+ $ln-contrast-ui: 3; // interactive boundaries (WCAG 1.4.11)
19
+
20
+ // Dark foreground pole for on-color(). Anchored to a polarity-independent
21
+ // literal, NOT to var(--color-neutral-900) or any ramp token — that token
22
+ // is 222 47% 11% in light mode but flips to 221 30% 97% (near-white) in
23
+ // dark mode, so binding to it would silently invert this solve on a dark
24
+ // island. Same precedent as the scrim tokens in _palette.scss:139-141
25
+ // (--color-scrim / --app-scrim-bg anchored to black rather than the ramp,
26
+ // for the identical reason). The value itself is light mode's
27
+ // --color-neutral-900, taken as a fixed Sass literal — not pure black —
28
+ // because it is a color ln-ashlar actually paints (--fg-default resolves
29
+ // to it in light mode), and it reproduces the approved architecture
30
+ // plan's Decision A island percentages within ~1 point; pure black drifts
31
+ // 4-6 points off those numbers. Do not rebind this to the ramp token.
32
+ $_ln-contrast-ink: hsl(222 47% 11%);
33
+
34
+ @function _linearize($channel) {
35
+ $c: math.div($channel, 255);
36
+ @if $c <= 0.03928 {
37
+ @return math.div($c, 12.92);
38
+ }
39
+ @return math.pow(math.div($c + 0.055, 1.055), 2.4);
40
+ }
41
+
42
+ @function luminance($color) {
43
+ $r: _linearize(color.channel($color, "red", $space: rgb));
44
+ $g: _linearize(color.channel($color, "green", $space: rgb));
45
+ $b: _linearize(color.channel($color, "blue", $space: rgb));
46
+ @return 0.2126 * $r + 0.7152 * $g + 0.0722 * $b;
47
+ }
48
+
49
+ @function _contrast-l($lum-a, $lum-b) {
50
+ $lighter: math.max($lum-a, $lum-b);
51
+ $darker: math.min($lum-a, $lum-b);
52
+ @return math.div($lighter + 0.05, $darker + 0.05);
53
+ }
54
+
55
+ @function contrast($a, $b) {
56
+ @return _contrast-l(luminance($a), luminance($b));
57
+ }
58
+
59
+ // Binary search over integer HSL lightness (0–100) for the given hue/sat
60
+ // that meets $target contrast against $against. luminance(L) is monotonic
61
+ // in L for fixed hue/sat, so contrast-vs-a-fixed-pole is monotonic on
62
+ // each side of that pole — direction depends on whether $against is the
63
+ // light or dark pole:
64
+ // - light $against (>=0.5 luminance): search for the MAX L (closest to
65
+ // white) that still passes — i.e. how dark the color must stay.
66
+ // - dark $against (<0.5 luminance): search for the MIN L (closest to
67
+ // black) that still passes — i.e. how light the color must become.
68
+ // Returns null when even the best-case pole (L:0 for the light branch,
69
+ // L:100 for the dark branch) can't reach $target.
70
+ //
71
+ // Domain restriction: each branch assumes "meets target" stays monotonic
72
+ // as the search crosses lightness, which only holds while the searched
73
+ // color's luminance stays on one side of $against's luminance. Callers
74
+ // must keep $against comfortably away from the 0.5 boundary; every
75
+ // surface this system actually solves against sits far from it (darkest
76
+ // planned surface ≈0.014 luminance), so this is not runtime-guarded here.
77
+ @function solve-l($hue, $sat, $target, $against) {
78
+ $against-lum: luminance($against);
79
+ $light-surface: $against-lum >= 0.5;
80
+
81
+ @if $light-surface {
82
+ @if _contrast-l(luminance(hsl($hue, $sat, 0%)), $against-lum) < $target {
83
+ @return null;
84
+ }
85
+ $lo: 0;
86
+ $hi: 100;
87
+ @while $lo < $hi {
88
+ $mid: math.ceil(math.div($lo + $hi, 2));
89
+ @if _contrast-l(luminance(hsl($hue, $sat, $mid * 1%)), $against-lum) >= $target {
90
+ $lo: $mid;
91
+ } @else {
92
+ $hi: $mid - 1;
93
+ }
94
+ }
95
+ @return $lo;
96
+ } @else {
97
+ @if _contrast-l(luminance(hsl($hue, $sat, 100%)), $against-lum) < $target {
98
+ @return null;
99
+ }
100
+ $lo: 0;
101
+ $hi: 100;
102
+ @while $lo < $hi {
103
+ $mid: math.floor(math.div($lo + $hi, 2));
104
+ @if _contrast-l(luminance(hsl($hue, $sat, $mid * 1%)), $against-lum) >= $target {
105
+ $hi: $mid;
106
+ } @else {
107
+ $lo: $mid + 1;
108
+ }
109
+ }
110
+ @return $lo;
111
+ }
112
+ }
113
+
114
+ // Picks whichever of the two foreground poles — white, or the fixed dark
115
+ // ink literal above — reaches $target contrast against $fill. white is
116
+ // tried first (most fills in this system are mid-to-dark brand tones
117
+ // needing a light foreground). Errors loudly if neither pole reaches the
118
+ // target — that fill has no legal foreground at this target and the
119
+ // caller must pick a different target or a different fill upstream.
120
+ @function on-color($fill, $target) {
121
+ @if _contrast-l(luminance($fill), luminance(white)) >= $target {
122
+ @return white;
123
+ }
124
+ @if _contrast-l(luminance($fill), luminance($_ln-contrast-ink)) >= $target {
125
+ @return $_ln-contrast-ink;
126
+ }
127
+ @error "on-color(): no pole (white/#{$_ln-contrast-ink}) reaches contrast #{$target} against #{$fill}.";
128
+ }
@@ -1,205 +1,191 @@
1
- // ==========================================================================
2
- // Density — ln-ashlar v2.0
3
- // ==========================================================================
4
- // Inverted density system. The :root default is DENSE (DocuFlow scale:
5
- // 14px body, 52px header, 232px sidebar). Density goes UP via the
6
- // [data-density] attribute, mirroring how [data-theme] works.
7
- //
8
- // Activation:
9
- // <html> ← default: dense (DocuFlow look)
10
- // <html data-density="compact"> ← explicit dense handle (same as base)
11
- // <html data-density="comfortable"> ← pre-v2 default (16px / roomier)
12
- // <html data-density="spacious"> ← large type, generous padding
13
- // <main data-density="compact"> ← scope dense within comfortable page
14
- //
15
- // Density is an explicit user choice (settings toggle).
16
- // It is NEVER auto-switched by viewport — viewport breakpoints handle
17
- // layout, density handles information density inside that layout.
18
- //
19
- // What reacts: everything reading --padding-y, --gap, --text-body-*,
20
- // --text-label-*, --text-title-*, --text-heading-*, --text-display-sm,
21
- // --lh-*, --app-header-height, --app-sidebar-width, --density-row-h,
22
- // --btn-padding-y, --input-padding-y.
23
- //
24
- // Interactive controls (buttons, inputs, pills): density-reactive UPWARD.
25
- // Base (~38px) = WCAG AA. Comfortable (≥46px) and Spacious (≥54px) = AAA.
26
- // Controls rebind --btn-padding-y and --input-padding-y in up-tier scopes.
27
- // See docs/css/density.md §wcag for the height math.
28
- //
29
- // No parallel --density-* token scale. Density overrides existing base
30
- // tokens at the scope root, exactly like theme color overrides.
31
- // ==========================================================================
32
-
33
- :root {
34
-
35
- // -----------------------------------------------------------------------
36
- // Density — Row height
37
- // Minimum row height for table rows and data lists. Kept density-named
38
- // because it has no analogue in the base token scale.
39
- // -----------------------------------------------------------------------
40
- --density-row-h: 2.25rem; // 36px — dense base
41
- }
42
-
43
- // ---------------------------------------------------------------------------
44
- // [data-density="compact"] — explicit handle for the dense base.
45
- //
46
- // Identical to :root. Exists so:
47
- // (a) a switcher can write a single attribute across all tiers including
48
- // returning to base (rather than removing the attribute)
49
- // (b) a region inside a comfortable page can be scoped dense:
50
- // <table data-density="compact">
51
- //
52
- // Rebinds --density-row-h so a compact-scoped region keeps the dense row
53
- // floor inside a comfortable/spacious page. NOTE: only row-h is restored —
54
- // full dense region-scoping (type, padding) would re-declare the base
55
- // surface; deferred. The global switcher returns to base via :root (dense).
56
- // ---------------------------------------------------------------------------
57
- [data-density="compact"] {
58
- --density-row-h: 2.25rem; // 36px — restore dense base in scoped context
59
- }
60
-
61
- // ---------------------------------------------------------------------------
62
- // [data-density="comfortable"] — pre-v2 default, now an explicit opt-in.
63
- //
64
- // Restores the roomy 16px / lh 1.6 scale that was the :root default before
65
- // design-v2. WCAG 2.5.5 AAA: buttons 46px, inputs/pills ≥44px.
66
- //
67
- // <html data-density="comfortable"> ← global comfortable
68
- // <aside data-density="comfortable"> ← scoped comfortable sidebar
69
- // ---------------------------------------------------------------------------
70
- [data-density="comfortable"] {
71
-
72
- // -- Logical rhythm --------------------------------------------------
73
- --padding-y: var(--size-sm); // 8px (was dense 6px)
74
- --gap: var(--size-sm); // 8px (was dense 6px)
75
-
76
- // -- Body text (restore 16px / 1.6 scale) ----------------------------
77
- --text-body-md: 1rem;
78
- --lh-body-md: 1.6;
79
-
80
- --text-body-sm: 0.875rem;
81
- --lh-body-sm: 1.5;
82
-
83
- // Explicit rebind — form inputs consume --font-size and don't always
84
- // cascade lazy var(--text-body-md) resolutions under a scope.
85
- --font-size: var(--text-body-md);
86
- --line-height: var(--lh-body-md);
87
-
88
- // -- Labels ----------------------------------------------------------
89
- --text-label-md: 0.875rem;
90
- --lh-label-md: 1.4;
91
-
92
- --text-label-sm: 0.8125rem; // 13px (was dense 12px) — form-label, table th
93
- --lh-label-sm: 1.4;
94
-
95
- // -- Caption ---------------------------------------------------------
96
- --text-caption: 0.8125rem; // 13px — modal subtitle, validation errors
97
- --lh-caption: 1.4;
98
-
99
- // -- Titles ----------------------------------------------------------
100
- --text-title-md: 1.125rem;
101
- --lh-title-md: 1.4;
102
-
103
- --text-title-sm: 1rem;
104
- --lh-title-sm: 1.4;
105
-
106
- // -- Headings --------------------------------------------------------
107
- --text-heading-sm: 1.25rem; --lh-heading-sm: 1.3;
108
- --text-heading-md: 1.5rem; --lh-heading-md: 1.25;
109
- --text-heading-lg: 1.875rem; --lh-heading-lg: 1.2;
110
-
111
- // -- Display ---------------------------------------------------------
112
- --text-display-sm: 2.25rem; --lh-display-sm: 1.15;
113
-
114
- // -- App shell -------------------------------------------------------
115
- --app-header-height: 3.5rem; // 56px (was dense 3.25rem)
116
- --app-sidebar-width: 16rem; // 256px (was dense 14.5rem)
117
-
118
- // -- Row height ------------------------------------------------------
119
- --density-row-h: 2.75rem; // 44px (was dense 2.25rem)
120
-
121
- // -- Interactive controls — WCAG 2.5.5 AAA ≥44px --------------------
122
- // btn-padding-y: 2×12px + 20px line-height + 2px borders = 46px
123
- // input-padding-y: indirection token read by form-input + pill-outline
124
- --btn-padding-y: var(--size-sm-up); // 12px → buttons 46px
125
- --btn-padding-x: var(--size-md); // 16px — restore roomy width
126
- --input-padding-y: var(--size-sm-up); // 12px → inputs/pills ≥44px
127
-
128
- // -- Card and table padding — roomier at comfortable/spacious --------
129
- --card-padding-y: var(--size-md); // 16px
130
- --card-padding-x: var(--size-lg); // 24px
131
- --table-cell-padding-y: var(--size-sm-up); // 12px
132
- --table-cell-padding-x: var(--size-lg); // 24px
133
- }
134
-
135
- // ---------------------------------------------------------------------------
136
- // [data-density="spacious"] — NEW tier above comfortable.
137
- //
138
- // For low-vision, touch-primary, or presentation contexts.
139
- // Body 18px, generous padding, larger shell. WCAG 2.5.5 AAA:
140
- // buttons 54px, inputs/pills ≥48px.
141
- //
142
- // <html data-density="spacious">
143
- // ---------------------------------------------------------------------------
144
- [data-density="spacious"] {
145
-
146
- // -- Logical rhythm --------------------------------------------------
147
- --padding-y: var(--size-md); // 16px
148
- --gap: var(--size-md); // 16px
149
-
150
- // -- Body text -------------------------------------------------------
151
- --text-body-md: 1.125rem; // 18px
152
- --lh-body-md: 1.75;
153
-
154
- --text-body-sm: 1rem;
155
- --lh-body-sm: 1.6;
156
-
157
- --font-size: var(--text-body-md);
158
- --line-height: var(--lh-body-md);
159
-
160
- // -- Labels ----------------------------------------------------------
161
- --text-label-md: 1rem;
162
- --lh-label-md: 1.5;
163
-
164
- --text-label-sm: 0.9375rem; // 15px (was dense 12px) — form-label, table th
165
- --lh-label-sm: 1.45;
166
-
167
- // -- Caption ---------------------------------------------------------
168
- --text-caption: 0.9375rem; // 15px — modal subtitle, validation errors
169
- --lh-caption: 1.45;
170
-
171
- // -- Titles ----------------------------------------------------------
172
- --text-title-md: 1.25rem;
173
- --lh-title-md: 1.5;
174
-
175
- --text-title-sm: 1.125rem;
176
- --lh-title-sm: 1.45;
177
-
178
- // -- Headings --------------------------------------------------------
179
- --text-heading-sm: 1.5rem; --lh-heading-sm: 1.35;
180
- --text-heading-md: 1.875rem; --lh-heading-md: 1.3;
181
- --text-heading-lg: 2.25rem; --lh-heading-lg: 1.25;
182
-
183
- // -- Display ---------------------------------------------------------
184
- --text-display-sm: 2.75rem; --lh-display-sm: 1.2;
185
-
186
- // -- App shell -------------------------------------------------------
187
- --app-header-height: 4rem; // 64px
188
- --app-sidebar-width: 17.5rem; // 280px
189
-
190
- // -- Row height ------------------------------------------------------
191
- --density-row-h: 3rem; // 48px
192
-
193
- // -- Interactive controls — WCAG 2.5.5 AAA ≥48px --------------------
194
- // btn-padding-y: 2×16px + 20px line-height + 2px borders = 54px
195
- // input-padding-y: indirection token read by form-input + pill-outline
196
- --btn-padding-y: var(--size-md); // 16px → buttons 54px
197
- --btn-padding-x: var(--size-lg); // 24px — spacious width
198
- --input-padding-y: var(--size-md); // 16px → inputs/pills ≥48px
199
-
200
- // -- Card and table padding ------------------------------------------
201
- --card-padding-y: var(--size-lg); // 24px
202
- --card-padding-x: var(--size-xl); // 32px
203
- --table-cell-padding-y: var(--size-md); // 16px
204
- --table-cell-padding-x: var(--size-xl); // 32px
205
- }
1
+ // ==========================================================================
2
+ // Density — ln-ashlar v2.0
3
+ // ==========================================================================
4
+ // Inverted density system. The :root default is DENSE (DocuFlow scale:
5
+ // 14px body, 52px header, 232px sidebar). Density goes UP via the
6
+ // [data-density] attribute, mirroring how [data-mode] / [data-theme] works.
7
+ //
8
+ // Activation:
9
+ // <html> ← default: dense (DocuFlow look)
10
+ // <html data-density="compact"> ← explicit dense handle (same as base)
11
+ // <html data-density="comfortable"> ← pre-v2 default (16px / roomier)
12
+ // <html data-density="spacious"> ← large type, generous padding
13
+ // <main data-density="compact"> ← scope dense within comfortable page
14
+ //
15
+ // Density is an explicit user choice (settings toggle).
16
+ // It is NEVER auto-switched by viewport — viewport breakpoints handle
17
+ // layout, density handles information density inside that layout.
18
+ //
19
+ // What reacts: everything reading --padding-y, --gap, --text-body-*,
20
+ // --text-label-*, --text-title-*, --text-heading-*, --text-display-sm,
21
+ // --lh-*, --app-header-height, --app-sidebar-width, --density-row-h,
22
+ // --btn-padding-y, --input-padding-y.
23
+ //
24
+ // Interactive controls (buttons, inputs, pills): density-reactive UPWARD.
25
+ // Base (~38px) = WCAG AA. Comfortable (≥46px) and Spacious (≥54px) = AAA.
26
+ // Controls rebind --btn-padding-y and --input-padding-y in up-tier scopes.
27
+ // See docs-mcp/css/density.md §wcag for the height math.
28
+ //
29
+ // No parallel --density-* token scale. Density overrides existing base
30
+ // tokens at the scope root, exactly like theme color overrides.
31
+ // ==========================================================================
32
+
33
+ :root {
34
+
35
+ // -----------------------------------------------------------------------
36
+ // Density — Row height
37
+ // Minimum row height for table rows and data lists. Kept density-named
38
+ // because it has no analogue in the base token scale.
39
+ // -----------------------------------------------------------------------
40
+ --density-row-h: 2.25rem; // 36px — dense base
41
+ }
42
+
43
+ // ---------------------------------------------------------------------------
44
+ // [data-density="compact"] — explicit handle for the dense base.
45
+ //
46
+ // Identical to :root. Exists so:
47
+ // (a) a switcher can write a single attribute across all tiers including
48
+ // returning to base (rather than removing the attribute)
49
+ // (b) a region inside a comfortable page can be scoped dense:
50
+ // <table data-density="compact">
51
+ //
52
+ // Rebinds --density-row-h so a compact-scoped region keeps the dense row
53
+ // floor inside a comfortable/spacious page. NOTE: only row-h is restored —
54
+ // full dense region-scoping (type, padding) would re-declare the base
55
+ // surface; deferred. The global switcher returns to base via :root (dense).
56
+ // ---------------------------------------------------------------------------
57
+ [data-density="compact"] {
58
+ --density-row-h: 2.25rem; // 36px — restore dense base in scoped context
59
+ }
60
+
61
+ // ---------------------------------------------------------------------------
62
+ // [data-density="comfortable"] — pre-v2 default, now an explicit opt-in.
63
+ //
64
+ // Restores the roomy 16px / lh 1.6 scale that was the :root default before
65
+ // design-v2. WCAG 2.5.5 AAA: buttons 46px, inputs/pills ≥44px.
66
+ //
67
+ // <html data-density="comfortable"> ← global comfortable
68
+ // <aside data-density="comfortable"> ← scoped comfortable sidebar
69
+ // ---------------------------------------------------------------------------
70
+ [data-density="comfortable"] {
71
+
72
+ // -- Logical rhythm --------------------------------------------------
73
+ --padding-y: var(--size-sm); // 8px (was dense 6px)
74
+ --gap: var(--size-sm); // 8px (was dense 6px)
75
+
76
+ // -- Body text (restore 16px / 1.6 scale) ----------------------------
77
+ --text-body-md: 1rem;
78
+ --lh-body-md: 1.6;
79
+
80
+ --text-body-sm: 0.875rem;
81
+ --lh-body-sm: 1.5;
82
+
83
+ // Explicit rebind — form inputs consume --font-size and don't always
84
+ // cascade lazy var(--text-body-md) resolutions under a scope.
85
+ --font-size: var(--text-body-md);
86
+ --line-height: var(--lh-body-md);
87
+
88
+ // -- Labels ----------------------------------------------------------
89
+ --text-label-md: 0.875rem;
90
+ --lh-label-md: 1.4;
91
+
92
+ --text-label-sm: 0.8125rem; // 13px (was dense 12px) — form-label, table th
93
+ --lh-label-sm: 1.4;
94
+
95
+ // -- Caption ---------------------------------------------------------
96
+ --text-caption: 0.8125rem; // 13px — modal subtitle, validation errors
97
+ --lh-caption: 1.4;
98
+
99
+ // -- Titles ----------------------------------------------------------
100
+ --text-title-md: 1.125rem;
101
+ --lh-title-md: 1.4;
102
+
103
+ --text-title-sm: 1rem;
104
+ --lh-title-sm: 1.4;
105
+
106
+ // -- Headings --------------------------------------------------------
107
+ --text-heading-sm: 1.25rem; --lh-heading-sm: 1.3;
108
+ --text-heading-md: 1.5rem; --lh-heading-md: 1.25;
109
+ --text-heading-lg: 1.875rem; --lh-heading-lg: 1.2;
110
+
111
+ // -- Display ---------------------------------------------------------
112
+ --text-display-sm: 2.25rem; --lh-display-sm: 1.15;
113
+
114
+ // -- App shell -------------------------------------------------------
115
+ --app-header-height: 3.5rem; // 56px (was dense 3.25rem)
116
+ --app-sidebar-width: 16rem; // 256px (was dense 14.5rem)
117
+
118
+ // -- Row height ------------------------------------------------------
119
+ --density-row-h: 2.75rem; // 44px (was dense 2.25rem)
120
+
121
+ // -- Interactive controls — Tailwind / shadcn standard (38px height) ---
122
+ --btn-padding-y: var(--size-sm); // 8px → buttons 38px
123
+ --btn-padding-x: var(--size-md); // 16px
124
+ --input-padding-y: var(--size-sm); // 8px → inputs/selects 38px
125
+ }
126
+
127
+ // ---------------------------------------------------------------------------
128
+ // [data-density="spacious"] — NEW tier above comfortable.
129
+ //
130
+ // For low-vision, touch-primary, or presentation contexts.
131
+ // Body 18px, generous padding, larger shell. WCAG 2.5.5 AAA:
132
+ // buttons 54px, inputs/pills ≥48px.
133
+ //
134
+ // <html data-density="spacious">
135
+ // ---------------------------------------------------------------------------
136
+ [data-density="spacious"] {
137
+
138
+ // -- Logical rhythm --------------------------------------------------
139
+ --padding-y: var(--size-md); // 16px
140
+ --gap: var(--size-md); // 16px
141
+
142
+ // -- Body text -------------------------------------------------------
143
+ --text-body-md: 1.125rem; // 18px
144
+ --lh-body-md: 1.75;
145
+
146
+ --text-body-sm: 1rem;
147
+ --lh-body-sm: 1.6;
148
+
149
+ --font-size: var(--text-body-md);
150
+ --line-height: var(--lh-body-md);
151
+
152
+ // -- Labels ----------------------------------------------------------
153
+ --text-label-md: 1rem;
154
+ --lh-label-md: 1.5;
155
+
156
+ --text-label-sm: 0.9375rem; // 15px (was dense 12px) — form-label, table th
157
+ --lh-label-sm: 1.45;
158
+
159
+ // -- Caption ---------------------------------------------------------
160
+ --text-caption: 0.9375rem; // 15px — modal subtitle, validation errors
161
+ --lh-caption: 1.45;
162
+
163
+ // -- Titles ----------------------------------------------------------
164
+ --text-title-md: 1.25rem;
165
+ --lh-title-md: 1.5;
166
+
167
+ --text-title-sm: 1.125rem;
168
+ --lh-title-sm: 1.45;
169
+
170
+ // -- Headings --------------------------------------------------------
171
+ --text-heading-sm: 1.5rem; --lh-heading-sm: 1.35;
172
+ --text-heading-md: 1.875rem; --lh-heading-md: 1.3;
173
+ --text-heading-lg: 2.25rem; --lh-heading-lg: 1.25;
174
+
175
+ // -- Display ---------------------------------------------------------
176
+ --text-display-sm: 2.75rem; --lh-display-sm: 1.2;
177
+
178
+ // -- App shell -------------------------------------------------------
179
+ --app-header-height: 4rem; // 64px
180
+ --app-sidebar-width: 17.5rem; // 280px
181
+
182
+ // -- Row height ------------------------------------------------------
183
+ --density-row-h: 3rem; // 48px
184
+
185
+ // -- Interactive controls — WCAG 2.5.5 AAA ≥48px --------------------
186
+ // btn-padding-y: 2×16px + 20px line-height + 2px borders = 54px
187
+ // input-padding-y: indirection token read by form-input + pill-outline
188
+ --btn-padding-y: var(--size-md); // 16px → buttons 54px
189
+ --btn-padding-x: var(--size-lg); // 24px — spacious width
190
+ --input-padding-y: var(--size-md); // 16px → inputs/pills ≥48px
191
+ }