@livenetworks/ashlar 2.1.13 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (437) hide show
  1. package/assets/brand/android-chrome-192x192.png +0 -0
  2. package/assets/brand/android-chrome-512x512.png +0 -0
  3. package/assets/brand/apple-touch-icon.png +0 -0
  4. package/assets/brand/favicon-16x16.png +0 -0
  5. package/assets/brand/favicon-32x32.png +0 -0
  6. package/assets/brand/favicon-48x48.png +0 -0
  7. package/assets/brand/favicon-dark-128x128.png +0 -0
  8. package/assets/brand/favicon-dark-16x16.png +0 -0
  9. package/assets/brand/favicon-dark-180x180.png +0 -0
  10. package/assets/brand/favicon-dark-192x192.png +0 -0
  11. package/assets/brand/favicon-dark-256x256.png +0 -0
  12. package/assets/brand/favicon-dark-32x32.png +0 -0
  13. package/assets/brand/favicon-dark-48x48.png +0 -0
  14. package/assets/brand/favicon-dark-512x512.png +0 -0
  15. package/assets/brand/favicon-dark-64x64.png +0 -0
  16. package/assets/brand/favicon-dark.ico +0 -0
  17. package/assets/brand/favicon-dark.png +0 -0
  18. package/assets/brand/favicon-light-128x128.png +0 -0
  19. package/assets/brand/favicon-light-16x16.png +0 -0
  20. package/assets/brand/favicon-light-180x180.png +0 -0
  21. package/assets/brand/favicon-light-192x192.png +0 -0
  22. package/assets/brand/favicon-light-256x256.png +0 -0
  23. package/assets/brand/favicon-light-32x32.png +0 -0
  24. package/assets/brand/favicon-light-48x48.png +0 -0
  25. package/assets/brand/favicon-light-512x512.png +0 -0
  26. package/assets/brand/favicon-light-64x64.png +0 -0
  27. package/assets/brand/favicon-light.ico +0 -0
  28. package/assets/brand/favicon-light.png +0 -0
  29. package/assets/brand/favicon.ico +0 -0
  30. package/assets/brand/favicon.png +0 -0
  31. package/assets/brand/favicon.svg +12 -0
  32. package/assets/brand/ln-ashlar-emblem-dark-128.png +0 -0
  33. package/assets/brand/ln-ashlar-emblem-dark-16.png +0 -0
  34. package/assets/brand/ln-ashlar-emblem-dark-256.png +0 -0
  35. package/assets/brand/ln-ashlar-emblem-dark-32.png +0 -0
  36. package/assets/brand/ln-ashlar-emblem-dark-64.png +0 -0
  37. package/assets/brand/ln-ashlar-emblem-dark.png +0 -0
  38. package/assets/brand/ln-ashlar-emblem-light-128.png +0 -0
  39. package/assets/brand/ln-ashlar-emblem-light-16.png +0 -0
  40. package/assets/brand/ln-ashlar-emblem-light-256.png +0 -0
  41. package/assets/brand/ln-ashlar-emblem-light-32.png +0 -0
  42. package/assets/brand/ln-ashlar-emblem-light-64.png +0 -0
  43. package/assets/brand/ln-ashlar-emblem-light.png +0 -0
  44. package/assets/brand/ln-ashlar-logo-dark-128.png +0 -0
  45. package/assets/brand/ln-ashlar-logo-dark-256.png +0 -0
  46. package/assets/brand/ln-ashlar-logo-dark-512.png +0 -0
  47. package/assets/brand/ln-ashlar-logo-dark.png +0 -0
  48. package/assets/brand/ln-ashlar-logo-light-128.png +0 -0
  49. package/assets/brand/ln-ashlar-logo-light-256.png +0 -0
  50. package/assets/brand/ln-ashlar-logo-light-512.png +0 -0
  51. package/assets/brand/ln-ashlar-logo-light.png +0 -0
  52. package/assets/brand/site.webmanifest +41 -0
  53. package/assets/brand/source/ln-ashlar-icon-dark-1024.png +0 -0
  54. package/assets/brand/source/ln-ashlar-icon-dark-uncropped-1024.png +0 -0
  55. package/assets/brand/source/ln-ashlar-icon-light-1024.png +0 -0
  56. package/assets/brand/source/ln-ashlar-icon-light-uncropped-1024.png +0 -0
  57. package/assets/flags/ad.svg +150 -0
  58. package/assets/flags/ae.svg +6 -0
  59. package/assets/flags/af.svg +81 -0
  60. package/assets/flags/ag.svg +14 -0
  61. package/assets/flags/ai.svg +29 -0
  62. package/assets/flags/al.svg +5 -0
  63. package/assets/flags/am.svg +5 -0
  64. package/assets/flags/ao.svg +13 -0
  65. package/assets/flags/aq.svg +5 -0
  66. package/assets/flags/ar.svg +32 -0
  67. package/assets/flags/arab.svg +109 -0
  68. package/assets/flags/as.svg +72 -0
  69. package/assets/flags/asean.svg +13 -0
  70. package/assets/flags/at.svg +4 -0
  71. package/assets/flags/au.svg +8 -0
  72. package/assets/flags/aw.svg +186 -0
  73. package/assets/flags/ax.svg +18 -0
  74. package/assets/flags/az.svg +8 -0
  75. package/assets/flags/ba.svg +12 -0
  76. package/assets/flags/bb.svg +6 -0
  77. package/assets/flags/bd.svg +4 -0
  78. package/assets/flags/be.svg +7 -0
  79. package/assets/flags/bf.svg +7 -0
  80. package/assets/flags/bg.svg +5 -0
  81. package/assets/flags/bh.svg +4 -0
  82. package/assets/flags/bi.svg +15 -0
  83. package/assets/flags/bj.svg +14 -0
  84. package/assets/flags/bl.svg +5 -0
  85. package/assets/flags/bm.svg +97 -0
  86. package/assets/flags/bn.svg +36 -0
  87. package/assets/flags/bo.svg +673 -0
  88. package/assets/flags/bq.svg +5 -0
  89. package/assets/flags/br.svg +45 -0
  90. package/assets/flags/bs.svg +13 -0
  91. package/assets/flags/bt.svg +89 -0
  92. package/assets/flags/bv.svg +13 -0
  93. package/assets/flags/bw.svg +7 -0
  94. package/assets/flags/by.svg +18 -0
  95. package/assets/flags/bz.svg +145 -0
  96. package/assets/flags/ca.svg +4 -0
  97. package/assets/flags/cc.svg +19 -0
  98. package/assets/flags/cd.svg +5 -0
  99. package/assets/flags/cefta.svg +13 -0
  100. package/assets/flags/cf.svg +15 -0
  101. package/assets/flags/cg.svg +12 -0
  102. package/assets/flags/ch.svg +9 -0
  103. package/assets/flags/ci.svg +7 -0
  104. package/assets/flags/ck.svg +9 -0
  105. package/assets/flags/cl.svg +13 -0
  106. package/assets/flags/cm.svg +15 -0
  107. package/assets/flags/cn.svg +11 -0
  108. package/assets/flags/co.svg +7 -0
  109. package/assets/flags/cp.svg +7 -0
  110. package/assets/flags/cr.svg +7 -0
  111. package/assets/flags/cu.svg +13 -0
  112. package/assets/flags/cv.svg +13 -0
  113. package/assets/flags/cw.svg +14 -0
  114. package/assets/flags/cx.svg +15 -0
  115. package/assets/flags/cy.svg +6 -0
  116. package/assets/flags/cz.svg +5 -0
  117. package/assets/flags/de.svg +5 -0
  118. package/assets/flags/dg.svg +130 -0
  119. package/assets/flags/dj.svg +13 -0
  120. package/assets/flags/dk.svg +5 -0
  121. package/assets/flags/dm.svg +152 -0
  122. package/assets/flags/do.svg +121 -0
  123. package/assets/flags/dz.svg +5 -0
  124. package/assets/flags/eac.svg +48 -0
  125. package/assets/flags/ec.svg +138 -0
  126. package/assets/flags/ee.svg +5 -0
  127. package/assets/flags/eg.svg +38 -0
  128. package/assets/flags/eh.svg +16 -0
  129. package/assets/flags/er.svg +8 -0
  130. package/assets/flags/es-ct.svg +4 -0
  131. package/assets/flags/es-ga.svg +187 -0
  132. package/assets/flags/es-pv.svg +5 -0
  133. package/assets/flags/es.svg +544 -0
  134. package/assets/flags/et.svg +14 -0
  135. package/assets/flags/eu.svg +28 -0
  136. package/assets/flags/fi.svg +5 -0
  137. package/assets/flags/fj.svg +120 -0
  138. package/assets/flags/fk.svg +90 -0
  139. package/assets/flags/fm.svg +11 -0
  140. package/assets/flags/fo.svg +12 -0
  141. package/assets/flags/fr.svg +5 -0
  142. package/assets/flags/ga.svg +7 -0
  143. package/assets/flags/gb-eng.svg +5 -0
  144. package/assets/flags/gb-nir.svg +132 -0
  145. package/assets/flags/gb-sct.svg +4 -0
  146. package/assets/flags/gb-wls.svg +9 -0
  147. package/assets/flags/gb.svg +7 -0
  148. package/assets/flags/gd.svg +27 -0
  149. package/assets/flags/ge.svg +6 -0
  150. package/assets/flags/gf.svg +5 -0
  151. package/assets/flags/gg.svg +9 -0
  152. package/assets/flags/gh.svg +6 -0
  153. package/assets/flags/gi.svg +32 -0
  154. package/assets/flags/gl.svg +4 -0
  155. package/assets/flags/gm.svg +14 -0
  156. package/assets/flags/gn.svg +7 -0
  157. package/assets/flags/gp.svg +5 -0
  158. package/assets/flags/gq.svg +23 -0
  159. package/assets/flags/gr.svg +16 -0
  160. package/assets/flags/gs.svg +133 -0
  161. package/assets/flags/gt.svg +204 -0
  162. package/assets/flags/gu.svg +19 -0
  163. package/assets/flags/gw.svg +13 -0
  164. package/assets/flags/gy.svg +9 -0
  165. package/assets/flags/hk.svg +8 -0
  166. package/assets/flags/hm.svg +8 -0
  167. package/assets/flags/hn.svg +18 -0
  168. package/assets/flags/hr.svg +58 -0
  169. package/assets/flags/ht.svg +116 -0
  170. package/assets/flags/hu.svg +7 -0
  171. package/assets/flags/ic.svg +7 -0
  172. package/assets/flags/id.svg +4 -0
  173. package/assets/flags/ie.svg +7 -0
  174. package/assets/flags/il.svg +14 -0
  175. package/assets/flags/im.svg +36 -0
  176. package/assets/flags/in.svg +25 -0
  177. package/assets/flags/io.svg +130 -0
  178. package/assets/flags/iq.svg +10 -0
  179. package/assets/flags/ir.svg +219 -0
  180. package/assets/flags/is.svg +12 -0
  181. package/assets/flags/it.svg +7 -0
  182. package/assets/flags/je.svg +62 -0
  183. package/assets/flags/jm.svg +8 -0
  184. package/assets/flags/jo.svg +16 -0
  185. package/assets/flags/jp.svg +11 -0
  186. package/assets/flags/ke.svg +23 -0
  187. package/assets/flags/kg.svg +4 -0
  188. package/assets/flags/kh.svg +61 -0
  189. package/assets/flags/ki.svg +36 -0
  190. package/assets/flags/km.svg +16 -0
  191. package/assets/flags/kn.svg +14 -0
  192. package/assets/flags/kp.svg +15 -0
  193. package/assets/flags/kr.svg +24 -0
  194. package/assets/flags/kw.svg +13 -0
  195. package/assets/flags/ky.svg +103 -0
  196. package/assets/flags/kz.svg +36 -0
  197. package/assets/flags/la.svg +12 -0
  198. package/assets/flags/lb.svg +15 -0
  199. package/assets/flags/lc.svg +8 -0
  200. package/assets/flags/li.svg +43 -0
  201. package/assets/flags/lk.svg +22 -0
  202. package/assets/flags/lr.svg +14 -0
  203. package/assets/flags/ls.svg +8 -0
  204. package/assets/flags/lt.svg +7 -0
  205. package/assets/flags/lu.svg +5 -0
  206. package/assets/flags/lv.svg +6 -0
  207. package/assets/flags/ly.svg +13 -0
  208. package/assets/flags/ma.svg +4 -0
  209. package/assets/flags/mc.svg +6 -0
  210. package/assets/flags/md.svg +70 -0
  211. package/assets/flags/me.svg +116 -0
  212. package/assets/flags/mf.svg +5 -0
  213. package/assets/flags/mg.svg +7 -0
  214. package/assets/flags/mh.svg +7 -0
  215. package/assets/flags/mk.svg +5 -0
  216. package/assets/flags/ml.svg +7 -0
  217. package/assets/flags/mm.svg +12 -0
  218. package/assets/flags/mn.svg +14 -0
  219. package/assets/flags/mo.svg +9 -0
  220. package/assets/flags/mp.svg +86 -0
  221. package/assets/flags/mq.svg +5 -0
  222. package/assets/flags/mr.svg +6 -0
  223. package/assets/flags/ms.svg +29 -0
  224. package/assets/flags/mt.svg +58 -0
  225. package/assets/flags/mu.svg +8 -0
  226. package/assets/flags/mv.svg +6 -0
  227. package/assets/flags/mw.svg +10 -0
  228. package/assets/flags/mx.svg +382 -0
  229. package/assets/flags/my.svg +26 -0
  230. package/assets/flags/mz.svg +21 -0
  231. package/assets/flags/na.svg +16 -0
  232. package/assets/flags/nc.svg +13 -0
  233. package/assets/flags/ne.svg +6 -0
  234. package/assets/flags/nf.svg +9 -0
  235. package/assets/flags/ng.svg +6 -0
  236. package/assets/flags/ni.svg +129 -0
  237. package/assets/flags/nl.svg +5 -0
  238. package/assets/flags/no.svg +7 -0
  239. package/assets/flags/np.svg +13 -0
  240. package/assets/flags/nr.svg +12 -0
  241. package/assets/flags/nu.svg +10 -0
  242. package/assets/flags/nz.svg +36 -0
  243. package/assets/flags/om.svg +115 -0
  244. package/assets/flags/pa.svg +14 -0
  245. package/assets/flags/pc.svg +33 -0
  246. package/assets/flags/pe.svg +4 -0
  247. package/assets/flags/pf.svg +19 -0
  248. package/assets/flags/pg.svg +9 -0
  249. package/assets/flags/ph.svg +6 -0
  250. package/assets/flags/pk.svg +15 -0
  251. package/assets/flags/pl.svg +6 -0
  252. package/assets/flags/pm.svg +5 -0
  253. package/assets/flags/pn.svg +53 -0
  254. package/assets/flags/pr.svg +13 -0
  255. package/assets/flags/ps.svg +6 -0
  256. package/assets/flags/pt.svg +57 -0
  257. package/assets/flags/pw.svg +11 -0
  258. package/assets/flags/py.svg +157 -0
  259. package/assets/flags/qa.svg +4 -0
  260. package/assets/flags/re.svg +5 -0
  261. package/assets/flags/ro.svg +7 -0
  262. package/assets/flags/rs.svg +292 -0
  263. package/assets/flags/ru.svg +5 -0
  264. package/assets/flags/rw.svg +13 -0
  265. package/assets/flags/sa.svg +25 -0
  266. package/assets/flags/sb.svg +13 -0
  267. package/assets/flags/sc.svg +7 -0
  268. package/assets/flags/sd.svg +13 -0
  269. package/assets/flags/se.svg +4 -0
  270. package/assets/flags/sg.svg +13 -0
  271. package/assets/flags/sh-ac.svg +689 -0
  272. package/assets/flags/sh-hl.svg +164 -0
  273. package/assets/flags/sh-ta.svg +76 -0
  274. package/assets/flags/sh.svg +7 -0
  275. package/assets/flags/si.svg +18 -0
  276. package/assets/flags/sj.svg +7 -0
  277. package/assets/flags/sk.svg +9 -0
  278. package/assets/flags/sl.svg +7 -0
  279. package/assets/flags/sm.svg +75 -0
  280. package/assets/flags/sn.svg +8 -0
  281. package/assets/flags/so.svg +11 -0
  282. package/assets/flags/sr.svg +6 -0
  283. package/assets/flags/ss.svg +8 -0
  284. package/assets/flags/st.svg +16 -0
  285. package/assets/flags/sv.svg +593 -0
  286. package/assets/flags/sx.svg +56 -0
  287. package/assets/flags/sy.svg +6 -0
  288. package/assets/flags/sz.svg +34 -0
  289. package/assets/flags/tc.svg +50 -0
  290. package/assets/flags/td.svg +7 -0
  291. package/assets/flags/tf.svg +15 -0
  292. package/assets/flags/tg.svg +14 -0
  293. package/assets/flags/th.svg +7 -0
  294. package/assets/flags/tj.svg +22 -0
  295. package/assets/flags/tk.svg +5 -0
  296. package/assets/flags/tl.svg +13 -0
  297. package/assets/flags/tm.svg +204 -0
  298. package/assets/flags/tn.svg +4 -0
  299. package/assets/flags/to.svg +10 -0
  300. package/assets/flags/tr.svg +8 -0
  301. package/assets/flags/tt.svg +5 -0
  302. package/assets/flags/tv.svg +9 -0
  303. package/assets/flags/tw.svg +34 -0
  304. package/assets/flags/tz.svg +13 -0
  305. package/assets/flags/ua.svg +6 -0
  306. package/assets/flags/ug.svg +30 -0
  307. package/assets/flags/um.svg +9 -0
  308. package/assets/flags/un.svg +16 -0
  309. package/assets/flags/us.svg +9 -0
  310. package/assets/flags/uy.svg +28 -0
  311. package/assets/flags/uz.svg +30 -0
  312. package/assets/flags/va.svg +190 -0
  313. package/assets/flags/vc.svg +8 -0
  314. package/assets/flags/ve.svg +26 -0
  315. package/assets/flags/vg.svg +59 -0
  316. package/assets/flags/vi.svg +28 -0
  317. package/assets/flags/vn.svg +11 -0
  318. package/assets/flags/vu.svg +21 -0
  319. package/assets/flags/wf.svg +5 -0
  320. package/assets/flags/ws.svg +7 -0
  321. package/assets/flags/xk.svg +5 -0
  322. package/assets/flags/xx.svg +4 -0
  323. package/assets/flags/ye.svg +7 -0
  324. package/assets/flags/yt.svg +5 -0
  325. package/assets/flags/za.svg +17 -0
  326. package/assets/flags/zm.svg +27 -0
  327. package/assets/flags/zw.svg +21 -0
  328. package/components/COMPONENTS.md +80 -80
  329. package/components/ln-api-connector/ln-api-connector.schema.json +105 -105
  330. package/components/ln-chart/ln-chart-dev.scss +0 -4
  331. package/components/ln-core/README.md +21 -21
  332. package/components/ln-core/ln-core.schema.json +120 -120
  333. package/components/ln-core/query.js +113 -113
  334. package/components/ln-data-coordinator/README.md +2 -0
  335. package/components/ln-data-coordinator/ln-data-coordinator.js +1 -1
  336. package/components/ln-data-coordinator/ln-data-coordinator.schema.json +196 -196
  337. package/components/ln-data-coordinator/src/ln-data-coordinator.js +457 -432
  338. package/components/ln-data-store/ln-data-store.schema.json +92 -92
  339. package/components/ln-date/ln-date.js +1 -1
  340. package/components/ln-date/src/ln-date.js +1 -1
  341. package/components/ln-debug/ln-debug.js +1 -1
  342. package/components/ln-debug/ln-debug.schema.json +28 -28
  343. package/components/ln-debug/src/generated-attributes.js +4 -0
  344. package/components/ln-dropdown/ln-dropdown.schema.json +90 -90
  345. package/components/ln-external-links/README.md +19 -19
  346. package/components/ln-external-links/ln-external-links.js +1 -1
  347. package/components/ln-external-links/ln-external-links.schema.json +9 -0
  348. package/components/ln-external-links/ln-external-links.scss +12 -0
  349. package/components/ln-external-links/src/ln-external-links.js +3 -2
  350. package/components/ln-filter/README.md +2 -1
  351. package/components/ln-filter/ln-filter.js +1 -1
  352. package/components/ln-filter/ln-filter.schema.json +157 -169
  353. package/components/ln-filter/src/ln-filter.js +1 -3
  354. package/components/ln-form/ln-form.schema.json +57 -57
  355. package/components/ln-key/ln-key.js +1 -1
  356. package/components/ln-key/ln-key.schema.json +8 -0
  357. package/components/ln-key/src/ln-key.js +8 -5
  358. package/components/ln-obfuscator/ln-obfuscator.js +1 -1
  359. package/components/ln-obfuscator/ln-obfuscator.schema.json +6 -0
  360. package/components/ln-obfuscator/src/ln-obfuscator.js +2 -2
  361. package/components/ln-options/ln-options.schema.json +47 -47
  362. package/components/ln-popover/ln-popover.schema.json +82 -82
  363. package/components/ln-progress/ln-progress.schema.json +0 -13
  364. package/components/ln-search/ln-search.schema.json +111 -111
  365. package/components/ln-sort/README.md +1 -0
  366. package/components/ln-sort/ln-sort.js +1 -1
  367. package/components/ln-sort/ln-sort.schema.json +100 -112
  368. package/components/ln-sort/src/sort-model.js +1 -6
  369. package/components/ln-sortable/ln-sortable.schema.json +38 -38
  370. package/components/ln-sortable/ln-sortable.scss +25 -25
  371. package/components/ln-table/README.md +8 -1
  372. package/components/ln-table/ln-table.js +1 -1
  373. package/components/ln-table/ln-table.schema.json +195 -195
  374. package/components/ln-table/src/ln-table.js +43 -7
  375. package/components/ln-table-coordinator/ln-table-coordinator.js +1 -1
  376. package/components/ln-table-coordinator/ln-table-coordinator.schema.json +18 -0
  377. package/components/ln-table-coordinator/src/ln-table-coordinator.js +104 -2
  378. package/components/ln-toast/README.md +1 -1
  379. package/components/ln-toast/ln-toast.js +1 -1
  380. package/components/ln-toast/ln-toast.schema.json +6 -0
  381. package/components/ln-toast/src/ln-toast.js +1 -1
  382. package/components/ln-translations/README.md +202 -120
  383. package/components/ln-translations/ln-translations.js +1 -1
  384. package/components/ln-translations/ln-translations.schema.json +136 -120
  385. package/components/ln-translations/src/ln-translations.js +354 -295
  386. package/components/ln-translations/src/translations-model.js +221 -0
  387. package/components/ln-validate/README.md +6 -6
  388. package/components/ln-validate/ln-validate-dev.scss +0 -5
  389. package/components/ln-validate/ln-validate.js +1 -1
  390. package/components/ln-validate/ln-validate.schema.json +0 -6
  391. package/components/ln-validate/src/ln-validate.js +48 -29
  392. package/ln-ashlar.html-data.json +26 -8
  393. package/package.json +3 -2
  394. package/theme/README.md +7 -6
  395. package/theme/base/_global.scss +2 -2
  396. package/theme/base/_reset.scss +11 -0
  397. package/theme/components/_app-shell.scss +0 -8
  398. package/theme/components/_form.scss +6 -6
  399. package/theme/components/_ln-table.scss +6 -3
  400. package/theme/components/_scrollbar.scss +5 -4
  401. package/theme/components/_sortable.scss +19 -19
  402. package/theme/components/_stat-card.scss +1 -0
  403. package/theme/components/_table.scss +10 -33
  404. package/theme/components/_translations.scss +118 -111
  405. package/theme/config/_density.scss +236 -104
  406. package/theme/config/_palette.scss +71 -49
  407. package/theme/config/_theme.scss +27 -31
  408. package/theme/config/_tokens.scss +28 -26
  409. package/theme/config/mixins/_app-shell.scss +31 -21
  410. package/theme/config/mixins/_btn.scss +4 -2
  411. package/theme/config/mixins/_card.scss +87 -67
  412. package/theme/config/mixins/_colors.scss +2 -1
  413. package/theme/config/mixins/_count.scss +48 -0
  414. package/theme/config/mixins/_display.scss +12 -0
  415. package/theme/config/mixins/_footer.scss +3 -1
  416. package/theme/config/mixins/_form.scss +48 -16
  417. package/theme/config/mixins/_index.scss +1 -0
  418. package/theme/config/mixins/_layout.scss +9 -0
  419. package/theme/config/mixins/_ln-table.scss +22 -15
  420. package/theme/config/mixins/_modal.scss +3 -0
  421. package/theme/config/mixins/_nav.scss +19 -4
  422. package/theme/config/mixins/_sidebar.scss +2 -1
  423. package/theme/config/mixins/_stat-card.scss +33 -2
  424. package/theme/config/mixins/_status-badge.scss +1 -0
  425. package/theme/config/mixins/_table.scss +81 -39
  426. package/theme/config/mixins/_tabs.scss +31 -0
  427. package/theme/config/mixins/_toast.scss +0 -1
  428. package/theme/config/mixins/_translations.scss +126 -124
  429. package/theme/designs/relaxed/_card.scss +12 -0
  430. package/theme/designs/relaxed/_layout.scss +24 -0
  431. package/theme/ln-ashlar-core.scss +1 -0
  432. package/theme/ln-ashlar-dev.scss +0 -1
  433. package/theme/ln-ashlar-relaxed.scss +67 -0
  434. package/theme/tailwind/components.css +561 -24
  435. package/theme/utilities/_utilities.scss +1 -11
  436. package/web-types.json +38 -10
  437. package/components/ln-progress/ln-progress-dev.scss +0 -8
@@ -562,7 +562,8 @@
562
562
  },
563
563
  {
564
564
  "name": "data-ln-empty-state",
565
- "description": "data-ln-empty-state attribute"
565
+ "description": "Visual / CSS styling attribute (theme/components/_empty-state.scss)",
566
+ "valueSet": "v"
566
567
  },
567
568
  {
568
569
  "name": "data-ln-empty-when",
@@ -581,6 +582,11 @@
581
582
  }
582
583
  ]
583
584
  },
585
+ {
586
+ "name": "data-ln-external-links-hint",
587
+ "description": "Marks the visually hidden ",
588
+ "valueSet": "v"
589
+ },
584
590
  {
585
591
  "name": "data-ln-field",
586
592
  "description": "data-ln-field attribute"
@@ -717,6 +723,10 @@
717
723
  "name": "data-ln-key-for",
718
724
  "description": "Target element ID that this shortcut badge is displayed for"
719
725
  },
726
+ {
727
+ "name": "data-ln-key-map",
728
+ "description": "Container modifier context alias for external shortcut badges"
729
+ },
720
730
  {
721
731
  "name": "data-ln-key-modifier",
722
732
  "description": "Platform modifier text representation override"
@@ -1259,7 +1269,7 @@
1259
1269
  },
1260
1270
  {
1261
1271
  "name": "data-ln-stat-card",
1262
- "description": "Visual / CSS styling attribute (theme/components/_stat-card.scss)",
1272
+ "description": "Visual / CSS styling attribute (theme/components/_stat-card.scss, theme/designs/relaxed/_layout.scss)",
1263
1273
  "valueSet": "v"
1264
1274
  },
1265
1275
  {
@@ -1623,8 +1633,7 @@
1623
1633
  },
1624
1634
  {
1625
1635
  "name": "data-ln-translatable",
1626
- "description": "Marks form control as translatable into multiple languages",
1627
- "valueSet": "v"
1636
+ "description": "Marks form control container as translatable, value is field name"
1628
1637
  },
1629
1638
  {
1630
1639
  "name": "data-ln-translatable-lang",
@@ -1632,7 +1641,7 @@
1632
1641
  },
1633
1642
  {
1634
1643
  "name": "data-ln-translations",
1635
- "description": "Mounts multi-language translation manager on form container",
1644
+ "description": "Mounts multi-language translation coordinator on form container",
1636
1645
  "valueSet": "v"
1637
1646
  },
1638
1647
  {
@@ -1642,27 +1651,36 @@
1642
1651
  },
1643
1652
  {
1644
1653
  "name": "data-ln-translations-add",
1645
- "description": "Trigger button action to add specified language translation fields"
1654
+ "description": "Trigger button to open translation language menu"
1646
1655
  },
1647
1656
  {
1648
1657
  "name": "data-ln-translations-default",
1649
1658
  "description": "Default primary language code (e.g. en)"
1650
1659
  },
1660
+ {
1661
+ "name": "data-ln-translations-dict",
1662
+ "description": "Dictionary key prefix mapping for translatable labels"
1663
+ },
1651
1664
  {
1652
1665
  "name": "data-ln-translations-lang",
1653
- "description": "Language code associated with active language badge"
1666
+ "description": "Language code associated with active language badge or menu item"
1654
1667
  },
1655
1668
  {
1656
1669
  "name": "data-ln-translations-locales",
1657
1670
  "description": "JSON dictionary of supported locale codes and display labels"
1658
1671
  },
1672
+ {
1673
+ "name": "data-ln-translations-menu",
1674
+ "description": "Menu container holding available language items",
1675
+ "valueSet": "v"
1676
+ },
1659
1677
  {
1660
1678
  "name": "data-ln-translations-placeholder",
1661
1679
  "description": "Placeholder label pattern for cloned translation inputs"
1662
1680
  },
1663
1681
  {
1664
1682
  "name": "data-ln-translations-prefix",
1665
- "description": "Prefix format pattern for cloned translated field names"
1683
+ "description": "Prefix format pattern for nested translatable field names"
1666
1684
  },
1667
1685
  {
1668
1686
  "name": "data-ln-translations-remove-label",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@livenetworks/ashlar",
3
- "version": "2.1.13",
3
+ "version": "2.2.1",
4
4
  "description": "LiveNetworks unified frontend library - CSS framework and vanilla JS components",
5
5
  "license": "GPL-3.0-or-later",
6
6
  "author": "Live Networks",
@@ -29,6 +29,7 @@
29
29
  "dist/",
30
30
  "theme/",
31
31
  "components/",
32
+ "assets/",
32
33
  "ln-ashlar.html-data.json",
33
34
  "web-types.json"
34
35
  ],
@@ -59,7 +60,7 @@
59
60
  "build:dev-css": "sass theme/ln-ashlar-dev.scss demo/dist/ln-ashlar-dev.css --no-source-map --style=compressed",
60
61
  "generate:brand-assets": "powershell -ExecutionPolicy Bypass -File scripts/generate-brand-assets.ps1 && node scripts/generate-svg-favicon.mjs",
61
62
  "build:demo-index": "sass demo/index.scss demo/index.css --no-source-map --style=compressed",
62
- "build:demo-admin": "sass demo/admin/src/admin.scss demo/admin/dist/admin.css --no-source-map --style=compressed && node -e \"const fs = require('fs'); fs.copyFileSync('demo/admin/src/demo.js', 'demo/admin/dist/demo.js')\" && node demo/admin/src/build-pages.mjs",
63
+ "build:demo-admin": "sass demo/admin/src/admin.scss demo/admin/dist/admin.css --no-source-map --style=compressed && sass demo/admin/src/admin-relaxed.scss demo/admin/dist/admin-relaxed.css --no-source-map --style=compressed && node -e \"const fs = require('fs'); fs.copyFileSync('demo/admin/src/demo.js', 'demo/admin/dist/demo.js')\" && node demo/admin/src/build-pages.mjs",
63
64
  "build:demo-docuflow": "sass demo/docuflow/docuflow.scss demo/docuflow/dist/docuflow.css --no-source-map --style=compressed",
64
65
  "build:demo-spa": "node demo/spa/build.mjs",
65
66
  "build:demo-landing": "sass demo/landing/landing.scss demo/landing/landing.css --no-source-map --style=compressed",
package/theme/README.md CHANGED
@@ -22,6 +22,7 @@ theme/
22
22
  │ ├── components.css # Component utility recipes
23
23
  │ └── entry.css # Entrypoint bundle
24
24
  ├── ln-ashlar.scss # Master bundle (Core + Theme)
25
+ ├── ln-ashlar-relaxed.scss # Relaxed design bundle (Core + Theme + designs/relaxed/*)
25
26
  └── ln-ashlar-theme.scss # Theme-only visual design system bundle
26
27
  ```
27
28
 
@@ -31,12 +32,11 @@ theme/
31
32
 
32
33
  To prevent browser style invalidation storms during interactive DOM mutations, all SCSS mixins and components adhere to the following rules:
33
34
 
34
- 1. **Avoid Repeating `:has()` Inside Mixins:**
35
- - Never embed complex `:has()` selectors inside mixins that are `@include`d across multiple component variants or classes.
36
- - De-duplicate and hoist container-level `:has()` rules to global component scopes using `:is(...)` (e.g. `:is(.card, .section-card, [class*="card"]) > :is(main, a > main):has(...)`).
35
+ 1. **Consolidate Compound `:has()` Queries via `:is(...)`:**
36
+ - Within structural mixins (such as `panel-body` in `_card.scss`, `pills` in `_form.scss`, and numeric table cells in `_table.scss`), collapse chained `:has()` checks into a single `:has(> :is(...))` selector rather than authoring sequential `:has()` rules.
37
37
 
38
38
  2. **Prefer Natural Cascade over `:not(:has(...))`:**
39
- - Negative `:not(:has(...))` selectors force the browser layout engine to traverse ancestor trees repeatedly to prove absence.
39
+ - Negative `:not(:has(...))` selectors force the browser layout engine into exhaustive negative ancestor traversals.
40
40
  - Use CSS source-order cascade instead:
41
41
  ```scss
42
42
  // ✅ RECOMMENDED: Natural cascade override
@@ -46,12 +46,13 @@ To prevent browser style invalidation storms during interactive DOM mutations, a
46
46
  color: var(--color-accent);
47
47
  }
48
48
  ```
49
+ - For multi-action stacking (e.g. table header sorting and filtering in `_table.scss`), declare base single-action rules with `:has(:is(...))` and override with double-action `:has(...):has(...)` rather than mutual `:not(:has(...))` exclusions.
49
50
 
50
51
  3. **Use Logical Properties for Sizing and Spacing:**
51
52
  - Mixins for padding and margin use modern CSS logical properties (`padding-inline`, `padding-block`, `margin-inline`, `margin-block`), reducing generated rules by 50% compared to separate physical properties (`-left`, `-right`, `-top`, `-bottom`).
52
53
 
53
- 4. **Anchor Pseudo-Elements to Direct Elements:**
54
- - Apply active indicators (e.g. `::before`) directly to the target element (`a::before`) with `position: relative`, rather than querying parent containers (`li:has(a.active)::before`).
54
+ 4. **Scope Container State Checks to Direct Children:**
55
+ - For container-level state indicators (e.g. navigation item active/hover lines on `li::before`), scope state queries strictly to direct children using `>` (e.g. `li:has(> a:hover)::before`, `li:has(> a.active)::before`). This avoids recursive descendant tree searches while preserving full-item indicator positioning and animations.
55
56
 
56
57
  ---
57
58
 
@@ -22,11 +22,11 @@ body {
22
22
 
23
23
  a {
24
24
  // Derive hover from --color-accent at this scope. Same hue/saturation,
25
- // lightness reduced by 8 (number form — see _btn.scss for the syntax
25
+ // lightness shifted by --accent-hover-shift (number form — see _btn.scss for the syntax
26
26
  // rationale). Local derivation means a semantic-color parent (.error,
27
27
  // .success, etc.) that rebinds --color-primary cascades to the hover
28
28
  // because var(--color-accent) re-resolves on the anchor element.
29
- --color-accent-hover: hsl(from var(--color-accent) h s calc(l - 8));
29
+ --color-accent-hover: hsl(from var(--color-accent) h s calc(l + var(--accent-hover-shift)));
30
30
 
31
31
  color: var(--color-accent);
32
32
  text-decoration: none;
@@ -15,3 +15,14 @@ ul, ol {
15
15
  html {
16
16
  font-size: 16px;
17
17
  }
18
+
19
+ // Form controls do not inherit typography by default — textarea falls back
20
+ // to the UA monospace face and buttons/inputs to the system UI font.
21
+ button,
22
+ input,
23
+ select,
24
+ textarea {
25
+ font: inherit;
26
+ letter-spacing: inherit;
27
+ color: inherit;
28
+ }
@@ -13,11 +13,3 @@
13
13
  .header-right { @include app-header-right; }
14
14
  .header-actions { @include app-header-actions; }
15
15
  .header-avatar { @include header-avatar; }
16
-
17
- // Lock root scroll exclusively for administrative shells
18
- html:has(.app-wrapper),
19
- body:has(.app-wrapper),
20
- .app-shell {
21
- height: 100%;
22
- overflow: hidden;
23
- }
@@ -71,6 +71,12 @@ $icon-group-test: ':has(> .ln-icon):has(> :is(input[type="text"], input[type="se
71
71
  @include form-input-icon-group-parts;
72
72
  }
73
73
 
74
+ // ─── Field wrapper ──────────────────────────────────────────────
75
+
76
+ .form-element {
77
+ @include form-element;
78
+ }
79
+
74
80
  // ─── Label & Actions ────────────────────────────────────────────
75
81
 
76
82
  // Non-wrapping labels only — the label sits above/beside its input, not
@@ -138,9 +144,3 @@ search:has(> input[type="search"]) {
138
144
  @include form-validate-errors;
139
145
  }
140
146
 
141
- // Any trailing feedback/metadata element inside .form-element automatically gets slot treatment with zero-specificity base styling
142
- :where(.form-element > :is(input, select, textarea, [data-ln-date-field], search, [class*="group"]) ~ :not(input)) {
143
- @include form-slot;
144
- color: var(--fg-muted);
145
- }
146
-
@@ -13,6 +13,12 @@
13
13
  @include ln-table-toolbar;
14
14
  }
15
15
 
16
+ // Toolbar sibling of the table: pin the thead under the toolbar.
17
+ :is(main, section, article):has(> .ln-table__toolbar + :is(table, [data-ln-table])),
18
+ [data-ln-table]:has(> header + table) {
19
+ @include ln-table-toolbar-stack;
20
+ }
21
+
16
22
  .ln-table__toolbar :is(label, search):has(> input[type="search"]) {
17
23
  @include ln-table-toolbar-search;
18
24
  }
@@ -21,9 +27,6 @@
21
27
  @include ln-table-count;
22
28
  }
23
29
 
24
- .table-container {
25
- @include ln-table-card-mode;
26
- }
27
30
  [data-ln-table] > footer,
28
31
  .ln-table__footer {
29
32
  @include ln-table-footer;
@@ -5,13 +5,14 @@
5
5
  height: 8px;
6
6
  }
7
7
 
8
+ // Overlay-style scrollbars: no gutter track; the thumb uses the strong
9
+ // border tone so it stays findable without competing with content.
8
10
  ::-webkit-scrollbar-track {
9
- --color-bg: var(--bg-sunken);
10
- background: var(--color-bg);
11
+ background: transparent;
11
12
  }
12
13
 
13
14
  ::-webkit-scrollbar-thumb {
14
- background-color: var(--color-border);
15
+ background-color: var(--border-strong);
15
16
  border-radius: 4px;
16
17
  border: 2px solid transparent;
17
18
  background-clip: content-box;
@@ -28,5 +29,5 @@
28
29
 
29
30
  * {
30
31
  scrollbar-width: thin;
31
- scrollbar-color: var(--color-border) var(--bg-sunken);
32
+ scrollbar-color: var(--border-strong) transparent;
32
33
  }
@@ -1,19 +1,19 @@
1
- @use '../config/mixins' as *;
2
-
3
- [data-ln-sortable] {
4
- list-style: none;
5
- padding: 0;
6
- margin: 0;
7
-
8
- > * {
9
- transition: box-shadow var(--transition-fast) var(--easing-standard), opacity var(--transition-fast) var(--easing-standard);
10
-
11
- &.ln-sortable--drop-before {
12
- box-shadow: inset 0 2px 0 0 var(--color-accent);
13
- }
14
-
15
- &.ln-sortable--drop-after {
16
- box-shadow: inset 0 -2px 0 0 var(--color-accent);
17
- }
18
- }
19
- }
1
+ @use '../config/mixins' as *;
2
+
3
+ [data-ln-sortable] {
4
+ list-style: none;
5
+ padding: 0;
6
+ margin: 0;
7
+
8
+ > * {
9
+ transition: box-shadow var(--transition-fast) var(--easing-standard), opacity var(--transition-fast) var(--easing-standard);
10
+
11
+ &.ln-sortable--drop-before {
12
+ box-shadow: inset 0 2px 0 0 var(--color-accent);
13
+ }
14
+
15
+ &.ln-sortable--drop-after {
16
+ box-shadow: inset 0 -2px 0 0 var(--color-accent);
17
+ }
18
+ }
19
+ }
@@ -2,4 +2,5 @@
2
2
 
3
3
  [data-ln-stat-card] {
4
4
  @include stat-card;
5
+ @include stat-card-tone;
5
6
  }
@@ -25,52 +25,29 @@ table {
25
25
 
26
26
  .table-container {
27
27
  @include container(table);
28
- overflow-x: auto;
29
- overscroll-behavior-x: contain;
28
+ // `clip`, not `auto` — keeps the thead pinned to the page scroller;
29
+ // narrow containers stack records instead (below).
30
+ overflow-x: clip;
30
31
 
31
- @container table (max-width: 640px) {
32
+ // Narrow container (e.g. a side column on desktop) — same card mode.
33
+ @include cq-down(md, table) {
32
34
  table { @include table-responsive; }
33
-
34
- .table-row-actions {
35
- position: static !important;
36
- opacity: 1 !important;
37
- visibility: visible !important;
38
- pointer-events: auto !important;
39
- transform: none !important;
40
- background: transparent !important;
41
- padding-left: 0 !important;
42
- justify-content: flex-end;
43
- margin-top: var(--size-xs);
44
-
45
- &::before {
46
- display: none !important;
47
- }
48
- }
49
35
  }
50
36
  }
51
37
 
52
38
  // ─── Shared Column Filter Button ─────────────────────────────────
53
- // CSS targets the unprefixed structural helper class on the button, NOT the data-ln-* JS
54
- // hook. .table-filter is a thin binding that mirrors the mixin; a consumer may instead
55
- // @include table-filter on their own selector (the class is a convenience, not a mandate).
39
+ // Binding of @mixin table-filter to the column-filter hook; the th stack keys on the same attribute.
56
40
  // Sort lives in scss/components/_sort.scss — see [data-ln-sort].
57
41
 
58
- .table-filter { @include table-filter; }
59
- th:hover .table-filter { opacity: 0.7; }
60
-
61
- // Active filter — JS-state class set DIRECTLY on the button (self-selector), combined with
62
- // the structural helper class. Fixes the latent ln-data-table bug: JS toggles
63
- // .ln-filter-active on the button itself, but the old CSS used a descendant combinator
64
- // (.ln-filter-active [data-ln-col-filter]) that never matched, so the dot never rendered.
65
- // See D2.
66
- .table-filter.ln-filter-active { @include table-filter-active; }
42
+ [data-ln-table-col-filter] { @include table-filter; }
67
43
 
68
44
 
69
45
 
70
46
  // ─── Data Table JS-State Classes ───────────────────────────────
71
47
  // JS-added state classes only. Row chrome (clickable cursor/hover, action
72
- // buttons, sticky header) is a CONSUMER concern — applied via semantic
73
- // selectors in project SCSS, never keyed off the data-ln-* JS hooks.
48
+ // buttons) is a CONSUMER concern — applied via semantic selectors in project
49
+ // SCSS, never keyed off the data-ln-* JS hooks. The sticky header is library
50
+ // default (table-base).
74
51
 
75
52
  .ln-row-selected {
76
53
  @include table-row-selected;
@@ -1,111 +1,118 @@
1
- @use '../config/mixins' as *;
2
-
3
- [data-ln-translatable-lang] {
4
- @include translations-flag-input;
5
- }
6
-
7
- [data-ln-toggle] button[data-ln-translations-lang] {
8
- @include translations-dropdown-flag;
9
- }
10
-
11
- // ─── Flag icons per language ─────────────────────────────────────
12
- // Lang code (ISO 639-1) -> country flag (ISO 3166-1 alpha-2).
13
-
14
- $lang-flag-overrides: (
15
- en: 'gb',
16
- sq: 'al',
17
- sr: 'rs',
18
- ja: 'jp',
19
- ko: 'kr',
20
- zh: 'cn',
21
- cs: 'cz',
22
- da: 'dk',
23
- el: 'gr',
24
- he: 'il',
25
- hi: 'in',
26
- uk: 'ua',
27
- vi: 'vn',
28
- sv: 'se',
29
- nb: 'no',
30
- nn: 'no',
31
- ca: 'es',
32
- eu: 'es',
33
- gl: 'es',
34
- fa: 'ir',
35
- ar: 'sa',
36
- ms: 'my',
37
- sl: 'si',
38
- et: 'ee',
39
- ka: 'ge',
40
- hy: 'am',
41
- be: 'by',
42
- bs: 'ba',
43
- hr: 'hr',
44
- ga: 'ie',
45
- cy: 'gb',
46
- sw: 'ke',
47
- bn: 'bd',
48
- ur: 'pk',
49
- ta: 'lk',
50
- te: 'in',
51
- ml: 'in',
52
- kn: 'in',
53
- mr: 'in',
54
- gu: 'in',
55
- pa: 'in',
56
- ne: 'np',
57
- km: 'kh',
58
- lo: 'la',
59
- my: 'mm',
60
- af: 'za',
61
- zu: 'za',
62
- );
63
-
64
- $lang-auto: mk, de, fr, it, bg, pt, ro, nl, pl, fi, hu, lt, lv, tr, az, is, mt, lb, no, ru, th, id;
65
-
66
- @each $lang, $country in $lang-flag-overrides {
67
- [data-ln-translatable-lang="#{$lang}"],
68
- [data-ln-translations-active] [data-ln-translations-lang="#{$lang}"],
69
- [data-ln-toggle] button[data-ln-translations-lang="#{$lang}"]::before {
70
- background-image: url('/assets/flags/#{$country}.svg');
71
- }
72
- }
73
-
74
- @each $lang in $lang-auto {
75
- [data-ln-translatable-lang="#{$lang}"],
76
- [data-ln-translations-active] [data-ln-translations-lang="#{$lang}"],
77
- [data-ln-toggle] button[data-ln-translations-lang="#{$lang}"]::before {
78
- background-image: url('/assets/flags/#{$lang}.svg');
79
- }
80
- }
81
-
82
- // ─── Header actions ──────────────────────────────────────────────
83
-
84
- .ln-translations__actions {
85
- @include translations-actions;
86
- }
87
-
88
- [data-ln-translations-active] {
89
- @include translations-active-list;
90
- }
91
-
92
- [data-ln-translations-active] p {
93
- @include translations-badge;
94
- }
95
-
96
- [data-ln-translations-active] button {
97
- @include translations-badge-remove;
98
- }
99
-
100
- [data-ln-translations-add] {
101
- @include translations-add-button;
102
- }
103
-
104
- // ─── Reduced motion ─────────────────────────────────────────────
105
-
106
- @media (prefers-reduced-motion: reduce) {
107
- [data-ln-translations-add],
108
- [data-ln-translations-active] button {
109
- transition: none;
110
- }
111
- }
1
+ @use '../config/mixins' as *;
2
+
3
+ // Configurable base path for flags (resolves relative to compiled CSS)
4
+ $flag-base-path: '../../assets/flags' !default;
5
+
6
+ [data-ln-translatable-lang] {
7
+ @include translations-flag-input;
8
+ }
9
+
10
+ textarea[data-ln-translatable-lang] {
11
+ background-position: var(--size-sm-up) calc(var(--size-sm) + (var(--size-lg) - var(--size-md-up) * 3 / 4) / 2);
12
+ }
13
+
14
+ button[data-ln-translations-lang] {
15
+ @include translations-dropdown-flag;
16
+ }
17
+
18
+ // ─── Flag icons per language ─────────────────────────────────────
19
+ // Lang code (ISO 639-1) -> country flag (ISO 3166-1 alpha-2).
20
+
21
+ $lang-flag-overrides: (
22
+ en: 'gb',
23
+ sq: 'al',
24
+ sr: 'rs',
25
+ ja: 'jp',
26
+ ko: 'kr',
27
+ zh: 'cn',
28
+ cs: 'cz',
29
+ da: 'dk',
30
+ el: 'gr',
31
+ he: 'il',
32
+ hi: 'in',
33
+ uk: 'ua',
34
+ vi: 'vn',
35
+ sv: 'se',
36
+ nb: 'no',
37
+ nn: 'no',
38
+ ca: 'es',
39
+ eu: 'es',
40
+ gl: 'es',
41
+ fa: 'ir',
42
+ ar: 'sa',
43
+ ms: 'my',
44
+ sl: 'si',
45
+ et: 'ee',
46
+ ka: 'ge',
47
+ hy: 'am',
48
+ be: 'by',
49
+ bs: 'ba',
50
+ hr: 'hr',
51
+ ga: 'ie',
52
+ cy: 'gb',
53
+ sw: 'ke',
54
+ bn: 'bd',
55
+ ur: 'pk',
56
+ ta: 'lk',
57
+ te: 'in',
58
+ ml: 'in',
59
+ kn: 'in',
60
+ mr: 'in',
61
+ gu: 'in',
62
+ pa: 'in',
63
+ ne: 'np',
64
+ km: 'kh',
65
+ lo: 'la',
66
+ my: 'mm',
67
+ af: 'za',
68
+ zu: 'za',
69
+ );
70
+
71
+ $lang-auto: mk, de, fr, it, bg, pt, ro, nl, pl, fi, hu, lt, lv, tr, az, is, mt, lb, no, ru, th, id;
72
+
73
+ @each $lang, $country in $lang-flag-overrides {
74
+ [data-ln-translatable-lang="#{$lang}"],
75
+ [data-ln-translations-active] [data-ln-translations-lang="#{$lang}"],
76
+ button[data-ln-translations-lang="#{$lang}"]::before {
77
+ background-image: var(--ln-flag-#{$lang}, url('#{$flag-base-path}/#{$country}.svg'));
78
+ }
79
+ }
80
+
81
+ @each $lang in $lang-auto {
82
+ [data-ln-translatable-lang="#{$lang}"],
83
+ [data-ln-translations-active] [data-ln-translations-lang="#{$lang}"],
84
+ button[data-ln-translations-lang="#{$lang}"]::before {
85
+ background-image: var(--ln-flag-#{$lang}, url('#{$flag-base-path}/#{$lang}.svg'));
86
+ }
87
+ }
88
+
89
+ // ─── Header actions ──────────────────────────────────────────────
90
+
91
+ .ln-translations__actions {
92
+ @include translations-actions;
93
+ }
94
+
95
+ [data-ln-translations-active] {
96
+ @include translations-active-list;
97
+ }
98
+
99
+ [data-ln-translations-active] p {
100
+ @include translations-badge;
101
+ }
102
+
103
+ [data-ln-translations-active] button {
104
+ @include translations-badge-remove;
105
+ }
106
+
107
+ [data-ln-translations-add] {
108
+ @include translations-add-button;
109
+ }
110
+
111
+ // ─── Reduced motion ─────────────────────────────────────────────
112
+
113
+ @media (prefers-reduced-motion: reduce) {
114
+ [data-ln-translations-add],
115
+ [data-ln-translations-active] button {
116
+ transition: none;
117
+ }
118
+ }