@0001-labs/design-system-1 0.3.0-alpha.28 → 0.3.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 (782) hide show
  1. package/DS1/0-face/button-label.ts +28 -0
  2. package/DS1/0-face/calendar.ts +6 -4
  3. package/DS1/0-face/carousel.ts +70 -0
  4. package/DS1/0-face/constraint-panel.ts +443 -0
  5. package/DS1/0-face/constraint-site.ts +201 -0
  6. package/DS1/0-face/constraints.ts +308 -0
  7. package/DS1/0-face/copy-text.ts +1 -1
  8. package/DS1/0-face/cut-fade.ts +312 -0
  9. package/DS1/0-face/define.ts +30 -2
  10. package/DS1/0-face/face-correction.ts +96 -0
  11. package/DS1/0-face/failures.ts +32 -0
  12. package/DS1/0-face/fault-lines.ts +159 -0
  13. package/DS1/0-face/feedback-overlays.ts +5 -3
  14. package/DS1/0-face/feedback.ts +3 -0
  15. package/DS1/0-face/focus-vision.swift +31 -0
  16. package/DS1/0-face/focus.ts +181 -0
  17. package/DS1/0-face/google-face-metrics.json +102 -0
  18. package/DS1/0-face/grid.ts +61 -4
  19. package/DS1/0-face/i18n.ts +36 -18
  20. package/DS1/0-face/layout-inspector.ts +124 -98
  21. package/DS1/0-face/preference-options.ts +4 -0
  22. package/DS1/0-face/scaling.ts +21 -3
  23. package/DS1/0-face/shape.ts +43 -0
  24. package/DS1/0-face/text-contrast.ts +164 -0
  25. package/DS1/0-face/theme-bootstrap.js +43 -0
  26. package/DS1/0-face/toast-queue.ts +7 -1
  27. package/DS1/0-face/translations/da.json +10 -1
  28. package/DS1/0-face/translations/de.json +10 -1
  29. package/DS1/0-face/translations/en.json +10 -1
  30. package/DS1/0-face/translations/es.json +10 -1
  31. package/DS1/0-face/translations/fi.json +10 -1
  32. package/DS1/0-face/translations/fr.json +10 -1
  33. package/DS1/0-face/translations/is.json +10 -1
  34. package/DS1/0-face/translations/it.json +10 -1
  35. package/DS1/0-face/translations/ja.json +10 -1
  36. package/DS1/0-face/translations/ko.json +10 -1
  37. package/DS1/0-face/translations/nb.json +10 -1
  38. package/DS1/0-face/translations/pt-BR.json +10 -1
  39. package/DS1/0-face/translations/pt.json +10 -1
  40. package/DS1/0-face/translations/sv.json +10 -1
  41. package/DS1/0-face/translations/zh.json +10 -1
  42. package/DS1/0-face/word-wrap.ts +113 -0
  43. package/DS1/1-root/card.css +47 -20
  44. package/DS1/1-root/carousel.css +7 -0
  45. package/DS1/1-root/cjk.css +1 -1
  46. package/DS1/1-root/component-tokens.css +3 -2
  47. package/DS1/1-root/context.css +44 -6
  48. package/DS1/1-root/controls.css +99 -8
  49. package/DS1/1-root/document.css +9 -1
  50. package/DS1/1-root/empty.css +46 -5
  51. package/DS1/1-root/figures.css +50 -3
  52. package/DS1/1-root/fonts.css +1 -1
  53. package/DS1/1-root/footer.css +147 -16
  54. package/DS1/1-root/foundation.ts +60 -0
  55. package/DS1/1-root/guide.css +35 -0
  56. package/DS1/1-root/header.css +30 -9
  57. package/DS1/1-root/material.css +67 -0
  58. package/DS1/1-root/notice.css +10 -2
  59. package/DS1/1-root/one.css +15 -7
  60. package/DS1/1-root/progress.css +9 -1
  61. package/DS1/1-root/row.css +68 -2
  62. package/DS1/1-root/table.css +47 -4
  63. package/DS1/1-root/text.css +26 -0
  64. package/DS1/2-core/button-split.ts +10 -5
  65. package/DS1/2-core/chart/chart.css +71 -2
  66. package/DS1/2-core/chart/grid-chart.ts +2 -1
  67. package/DS1/2-core/ds-activity.ts +32 -0
  68. package/DS1/2-core/ds-app-chrome.ts +1 -0
  69. package/DS1/2-core/ds-avatar.ts +75 -7
  70. package/DS1/2-core/ds-badge.ts +8 -1
  71. package/DS1/2-core/ds-button.ts +7 -1
  72. package/DS1/2-core/ds-chart.ts +184 -49
  73. package/DS1/2-core/ds-cycle.ts +27 -186
  74. package/DS1/2-core/ds-device-bezel.ts +1 -0
  75. package/DS1/2-core/ds-empty.ts +6 -4
  76. package/DS1/2-core/ds-input.ts +23 -3
  77. package/DS1/2-core/ds-message.ts +22 -0
  78. package/DS1/2-core/ds-number.ts +349 -0
  79. package/DS1/2-core/ds-progress.ts +3 -0
  80. package/DS1/2-core/ds-radio.ts +3 -0
  81. package/DS1/2-core/ds-stat.ts +3 -0
  82. package/DS1/2-core/ds-switch.ts +5 -1
  83. package/DS1/2-core/ds-tag.ts +9 -2
  84. package/DS1/2-core/ds-text.ts +7 -0
  85. package/DS1/2-core/ds-token.ts +3 -0
  86. package/DS1/2-core/ds-tooltip.ts +17 -2
  87. package/DS1/2-core/ds-window.ts +1 -0
  88. package/DS1/2-core/generated/ds-icon-map.ts +47 -5
  89. package/DS1/2-core/generated/icons-extra.ts +24 -3
  90. package/DS1/2-core/generated/icons-immediate.ts +3 -3
  91. package/DS1/2-core/number-expression.ts +64 -0
  92. package/DS1/2-core/styles/ds-activity.css +16 -0
  93. package/DS1/2-core/styles/ds-badge.css +4 -1
  94. package/DS1/2-core/styles/ds-button-host.css +47 -13
  95. package/DS1/2-core/styles/ds-button-split.css +8 -0
  96. package/DS1/2-core/styles/ds-button.css +94 -20
  97. package/DS1/2-core/styles/ds-card.css +6 -0
  98. package/DS1/2-core/styles/ds-checkbox.css +20 -8
  99. package/DS1/2-core/styles/ds-image.css +2 -1
  100. package/DS1/2-core/styles/ds-input.css +37 -4
  101. package/DS1/2-core/styles/ds-number.css +127 -0
  102. package/DS1/2-core/styles/ds-radio.css +4 -1
  103. package/DS1/2-core/styles/ds-switch.css +34 -4
  104. package/DS1/2-core/styles/ds-tag.css +34 -6
  105. package/DS1/2-core/styles/ds-text.css +13 -4
  106. package/DS1/2-core/styles/ds-token.css +4 -1
  107. package/DS1/2-core/styles/ds-tooltip.css +13 -7
  108. package/DS1/3-unit/calendar-base.ts +5 -2
  109. package/DS1/3-unit/context-trigger.ts +29 -2
  110. package/DS1/3-unit/ds-calendar.ts +711 -37
  111. package/DS1/3-unit/ds-carousel.ts +13 -1
  112. package/DS1/3-unit/ds-context.ts +40 -2
  113. package/DS1/3-unit/ds-form.ts +47 -11
  114. package/DS1/3-unit/ds-list.ts +31 -3
  115. package/DS1/3-unit/ds-matrix.ts +3 -0
  116. package/DS1/3-unit/ds-menu.ts +9 -5
  117. package/DS1/3-unit/ds-row.ts +17 -2
  118. package/DS1/3-unit/ds-select.ts +1 -1
  119. package/DS1/3-unit/ds-sidebar.ts +18 -3
  120. package/DS1/3-unit/ds-table-of-contents.ts +166 -0
  121. package/DS1/3-unit/ds-table.ts +2 -1
  122. package/DS1/3-unit/ds-tabs.ts +40 -2
  123. package/DS1/3-unit/styles/ds-calendar.css +356 -42
  124. package/DS1/3-unit/styles/ds-context.css +38 -0
  125. package/DS1/3-unit/styles/ds-list.css +26 -1
  126. package/DS1/3-unit/styles/ds-matrix.css +4 -1
  127. package/DS1/3-unit/styles/ds-row.css +39 -0
  128. package/DS1/3-unit/styles/ds-select.css +22 -12
  129. package/DS1/3-unit/styles/ds-sidebar.css +16 -2
  130. package/DS1/3-unit/styles/ds-table-of-contents.css +40 -0
  131. package/DS1/3-unit/styles/ds-tabs.css +95 -0
  132. package/DS1/4-page/ds-container.ts +2 -1
  133. package/DS1/4-page/ds-document.ts +3 -0
  134. package/DS1/4-page/ds-footer.ts +93 -18
  135. package/DS1/4-page/ds-header.ts +5 -1
  136. package/DS1/4-page/ds-overlay.ts +8 -3
  137. package/DS1/4-page/ds-page.ts +22 -1
  138. package/DS1/4-page/email.ts +7 -4
  139. package/DS1/4-page/styles/ds-container.css +0 -1
  140. package/DS1/4-page/styles/ds-overlay.css +7 -0
  141. package/DS1/4-page/styles/ds-page.css +10 -0
  142. package/DS1/5-visual-kit/app-chrome.ts +129 -0
  143. package/DS1/5-visual-kit/bezels.ts +394 -0
  144. package/DS1/5-visual-kit/browser-icons.LICENSE +53 -0
  145. package/DS1/5-visual-kit/browser-icons.ts +47 -0
  146. package/DS1/5-visual-kit/browser-styles.ts +53 -0
  147. package/DS1/5-visual-kit/device-bezel.ts +55 -0
  148. package/DS1/5-visual-kit/instagram-frame.ts +15 -0
  149. package/DS1/5-visual-kit/instagram.ts +41 -0
  150. package/DS1/5-visual-kit/mobile-chrome.ts +25 -0
  151. package/DS1/5-visual-kit/native-icon-paths.ts +145 -0
  152. package/DS1/5-visual-kit/window.ts +22 -0
  153. package/DS1/components.ts +1 -0
  154. package/DS1/index.ts +14 -1
  155. package/DS1/react/choice.ts +4 -2
  156. package/DS1/react/context.ts +11 -6
  157. package/DS1/react/empty.ts +2 -2
  158. package/DS1/react/footer.ts +5 -5
  159. package/DS1/react/header.ts +1 -1
  160. package/DS1/react/message.ts +4 -2
  161. package/DS1/react/number.ts +53 -0
  162. package/DS1/react/sidebar.ts +4 -2
  163. package/DS1/react/table-of-contents.ts +28 -0
  164. package/DS1/x-flag/LICENSE.md +26 -0
  165. package/DS1/x-flag/ac.svg +1 -0
  166. package/DS1/x-flag/ad.svg +1 -0
  167. package/DS1/x-flag/ae.svg +1 -0
  168. package/DS1/x-flag/af.svg +1 -0
  169. package/DS1/x-flag/ag.svg +1 -0
  170. package/DS1/x-flag/ai.svg +1 -0
  171. package/DS1/x-flag/al.svg +1 -0
  172. package/DS1/x-flag/am.svg +1 -0
  173. package/DS1/x-flag/ao.svg +1 -0
  174. package/DS1/x-flag/aq.svg +1 -0
  175. package/DS1/x-flag/ar.svg +1 -0
  176. package/DS1/x-flag/as.svg +1 -0
  177. package/DS1/x-flag/at.svg +1 -0
  178. package/DS1/x-flag/au.svg +1 -0
  179. package/DS1/x-flag/aw.svg +1 -0
  180. package/DS1/x-flag/ax.svg +1 -0
  181. package/DS1/x-flag/az.svg +1 -0
  182. package/DS1/x-flag/ba.svg +1 -0
  183. package/DS1/x-flag/bb.svg +1 -0
  184. package/DS1/x-flag/bd.svg +1 -0
  185. package/DS1/x-flag/be.svg +1 -0
  186. package/DS1/x-flag/bf.svg +1 -0
  187. package/DS1/x-flag/bg.svg +1 -0
  188. package/DS1/x-flag/bh.svg +1 -0
  189. package/DS1/x-flag/bi.svg +1 -0
  190. package/DS1/x-flag/bj.svg +1 -0
  191. package/DS1/x-flag/bl.svg +1 -0
  192. package/DS1/x-flag/bm.svg +1 -0
  193. package/DS1/x-flag/bn.svg +1 -0
  194. package/DS1/x-flag/bo.svg +1 -0
  195. package/DS1/x-flag/bq-bo.svg +1 -0
  196. package/DS1/x-flag/bq-sa.svg +1 -0
  197. package/DS1/x-flag/bq-se.svg +1 -0
  198. package/DS1/x-flag/bq.svg +1 -0
  199. package/DS1/x-flag/br.svg +1 -0
  200. package/DS1/x-flag/bs.svg +1 -0
  201. package/DS1/x-flag/bt.svg +1 -0
  202. package/DS1/x-flag/bv.svg +1 -0
  203. package/DS1/x-flag/bw.svg +1 -0
  204. package/DS1/x-flag/by.svg +1 -0
  205. package/DS1/x-flag/bz.svg +1 -0
  206. package/DS1/x-flag/ca.svg +1 -0
  207. package/DS1/x-flag/cc.svg +1 -0
  208. package/DS1/x-flag/cd.svg +1 -0
  209. package/DS1/x-flag/cf.svg +1 -0
  210. package/DS1/x-flag/cg.svg +1 -0
  211. package/DS1/x-flag/ch.svg +1 -0
  212. package/DS1/x-flag/ci.svg +1 -0
  213. package/DS1/x-flag/ck.svg +1 -0
  214. package/DS1/x-flag/cl.svg +1 -0
  215. package/DS1/x-flag/cm.svg +1 -0
  216. package/DS1/x-flag/cn.svg +1 -0
  217. package/DS1/x-flag/co.svg +1 -0
  218. package/DS1/x-flag/cr.svg +1 -0
  219. package/DS1/x-flag/cu.svg +1 -0
  220. package/DS1/x-flag/cv.svg +1 -0
  221. package/DS1/x-flag/cw.svg +1 -0
  222. package/DS1/x-flag/cx.svg +1 -0
  223. package/DS1/x-flag/cy.svg +1 -0
  224. package/DS1/x-flag/cz.svg +1 -0
  225. package/DS1/x-flag/de.svg +1 -0
  226. package/DS1/x-flag/dj.svg +1 -0
  227. package/DS1/x-flag/dk.svg +1 -0
  228. package/DS1/x-flag/dm.svg +1 -0
  229. package/DS1/x-flag/do.svg +1 -0
  230. package/DS1/x-flag/dz.svg +1 -0
  231. package/DS1/x-flag/ec.svg +1 -0
  232. package/DS1/x-flag/ee.svg +1 -0
  233. package/DS1/x-flag/eg.svg +1 -0
  234. package/DS1/x-flag/eh.svg +1 -0
  235. package/DS1/x-flag/er.svg +1 -0
  236. package/DS1/x-flag/es-ct.svg +1 -0
  237. package/DS1/x-flag/es.svg +1 -0
  238. package/DS1/x-flag/et.svg +1 -0
  239. package/DS1/x-flag/eu.svg +1 -0
  240. package/DS1/x-flag/fi.svg +1 -0
  241. package/DS1/x-flag/fj.svg +1 -0
  242. package/DS1/x-flag/fk.svg +1 -0
  243. package/DS1/x-flag/fm.svg +1 -0
  244. package/DS1/x-flag/fo.svg +1 -0
  245. package/DS1/x-flag/fr.svg +1 -0
  246. package/DS1/x-flag/ga.svg +1 -0
  247. package/DS1/x-flag/gb-eng.svg +1 -0
  248. package/DS1/x-flag/gb-nir.svg +1 -0
  249. package/DS1/x-flag/gb-sct.svg +1 -0
  250. package/DS1/x-flag/gb-wls.svg +1 -0
  251. package/DS1/x-flag/gb.svg +1 -0
  252. package/DS1/x-flag/gd.svg +1 -0
  253. package/DS1/x-flag/ge.svg +1 -0
  254. package/DS1/x-flag/gf.svg +1 -0
  255. package/DS1/x-flag/gg.svg +1 -0
  256. package/DS1/x-flag/gh.svg +1 -0
  257. package/DS1/x-flag/gi.svg +1 -0
  258. package/DS1/x-flag/gl.svg +1 -0
  259. package/DS1/x-flag/gm.svg +1 -0
  260. package/DS1/x-flag/gn.svg +1 -0
  261. package/DS1/x-flag/gp.svg +1 -0
  262. package/DS1/x-flag/gq.svg +1 -0
  263. package/DS1/x-flag/gr.svg +1 -0
  264. package/DS1/x-flag/gs.svg +1 -0
  265. package/DS1/x-flag/gt.svg +1 -0
  266. package/DS1/x-flag/gu.svg +1 -0
  267. package/DS1/x-flag/gw.svg +1 -0
  268. package/DS1/x-flag/gy.svg +1 -0
  269. package/DS1/x-flag/hk.svg +1 -0
  270. package/DS1/x-flag/hm.svg +1 -0
  271. package/DS1/x-flag/hn.svg +1 -0
  272. package/DS1/x-flag/hr.svg +1 -0
  273. package/DS1/x-flag/ht.svg +1 -0
  274. package/DS1/x-flag/hu.svg +1 -0
  275. package/DS1/x-flag/ic.svg +1 -0
  276. package/DS1/x-flag/id.svg +1 -0
  277. package/DS1/x-flag/ie.svg +1 -0
  278. package/DS1/x-flag/il.svg +1 -0
  279. package/DS1/x-flag/im.svg +1 -0
  280. package/DS1/x-flag/in.svg +1 -0
  281. package/DS1/x-flag/io.svg +1 -0
  282. package/DS1/x-flag/iq.svg +1 -0
  283. package/DS1/x-flag/ir.svg +1 -0
  284. package/DS1/x-flag/is.svg +1 -0
  285. package/DS1/x-flag/it.svg +1 -0
  286. package/DS1/x-flag/je.svg +1 -0
  287. package/DS1/x-flag/jm.svg +1 -0
  288. package/DS1/x-flag/jo.svg +1 -0
  289. package/DS1/x-flag/jp.svg +1 -0
  290. package/DS1/x-flag/ke.svg +1 -0
  291. package/DS1/x-flag/kg.svg +1 -0
  292. package/DS1/x-flag/kh.svg +1 -0
  293. package/DS1/x-flag/ki.svg +1 -0
  294. package/DS1/x-flag/km.svg +1 -0
  295. package/DS1/x-flag/kn.svg +1 -0
  296. package/DS1/x-flag/kp.svg +1 -0
  297. package/DS1/x-flag/kr.svg +1 -0
  298. package/DS1/x-flag/kw.svg +1 -0
  299. package/DS1/x-flag/ky.svg +1 -0
  300. package/DS1/x-flag/kz.svg +1 -0
  301. package/DS1/x-flag/la.svg +1 -0
  302. package/DS1/x-flag/lb.svg +1 -0
  303. package/DS1/x-flag/lc.svg +1 -0
  304. package/DS1/x-flag/li.svg +1 -0
  305. package/DS1/x-flag/lk.svg +1 -0
  306. package/DS1/x-flag/lr.svg +1 -0
  307. package/DS1/x-flag/ls.svg +1 -0
  308. package/DS1/x-flag/lt.svg +1 -0
  309. package/DS1/x-flag/lu.svg +1 -0
  310. package/DS1/x-flag/lv.svg +1 -0
  311. package/DS1/x-flag/ly.svg +1 -0
  312. package/DS1/x-flag/ma.svg +1 -0
  313. package/DS1/x-flag/mc.svg +1 -0
  314. package/DS1/x-flag/md.svg +1 -0
  315. package/DS1/x-flag/me.svg +1 -0
  316. package/DS1/x-flag/mf.svg +1 -0
  317. package/DS1/x-flag/mg.svg +1 -0
  318. package/DS1/x-flag/mh.svg +1 -0
  319. package/DS1/x-flag/mk.svg +1 -0
  320. package/DS1/x-flag/ml.svg +1 -0
  321. package/DS1/x-flag/mm.svg +1 -0
  322. package/DS1/x-flag/mn.svg +1 -0
  323. package/DS1/x-flag/mo.svg +1 -0
  324. package/DS1/x-flag/mp.svg +1 -0
  325. package/DS1/x-flag/mq.svg +1 -0
  326. package/DS1/x-flag/mr.svg +1 -0
  327. package/DS1/x-flag/ms.svg +1 -0
  328. package/DS1/x-flag/mt.svg +1 -0
  329. package/DS1/x-flag/mu.svg +1 -0
  330. package/DS1/x-flag/mv.svg +1 -0
  331. package/DS1/x-flag/mw.svg +1 -0
  332. package/DS1/x-flag/mx.svg +1 -0
  333. package/DS1/x-flag/my.svg +1 -0
  334. package/DS1/x-flag/mz.svg +1 -0
  335. package/DS1/x-flag/na.svg +1 -0
  336. package/DS1/x-flag/nc.svg +1 -0
  337. package/DS1/x-flag/ne.svg +1 -0
  338. package/DS1/x-flag/nf.svg +1 -0
  339. package/DS1/x-flag/ng.svg +1 -0
  340. package/DS1/x-flag/ni.svg +1 -0
  341. package/DS1/x-flag/nl.svg +1 -0
  342. package/DS1/x-flag/no.svg +1 -0
  343. package/DS1/x-flag/np.svg +1 -0
  344. package/DS1/x-flag/nr.svg +1 -0
  345. package/DS1/x-flag/nu.svg +1 -0
  346. package/DS1/x-flag/nz.svg +1 -0
  347. package/DS1/x-flag/om.svg +1 -0
  348. package/DS1/x-flag/pa.svg +1 -0
  349. package/DS1/x-flag/pe.svg +1 -0
  350. package/DS1/x-flag/pf.svg +1 -0
  351. package/DS1/x-flag/pg.svg +1 -0
  352. package/DS1/x-flag/ph.svg +1 -0
  353. package/DS1/x-flag/pk.svg +1 -0
  354. package/DS1/x-flag/pl.svg +1 -0
  355. package/DS1/x-flag/pm.svg +1 -0
  356. package/DS1/x-flag/pn.svg +1 -0
  357. package/DS1/x-flag/pr.svg +1 -0
  358. package/DS1/x-flag/ps.svg +1 -0
  359. package/DS1/x-flag/pt.svg +1 -0
  360. package/DS1/x-flag/pw.svg +1 -0
  361. package/DS1/x-flag/py.svg +1 -0
  362. package/DS1/x-flag/qa.svg +1 -0
  363. package/DS1/x-flag/re.svg +1 -0
  364. package/DS1/x-flag/ro.svg +1 -0
  365. package/DS1/x-flag/rs.svg +1 -0
  366. package/DS1/x-flag/ru.svg +1 -0
  367. package/DS1/x-flag/rw.svg +1 -0
  368. package/DS1/x-flag/sa.svg +1 -0
  369. package/DS1/x-flag/sb.svg +1 -0
  370. package/DS1/x-flag/sc.svg +1 -0
  371. package/DS1/x-flag/sd.svg +1 -0
  372. package/DS1/x-flag/se.svg +1 -0
  373. package/DS1/x-flag/sg.svg +1 -0
  374. package/DS1/x-flag/sh.svg +1 -0
  375. package/DS1/x-flag/si.svg +1 -0
  376. package/DS1/x-flag/sj.svg +1 -0
  377. package/DS1/x-flag/sk.svg +1 -0
  378. package/DS1/x-flag/sl.svg +1 -0
  379. package/DS1/x-flag/sm.svg +1 -0
  380. package/DS1/x-flag/sn.svg +1 -0
  381. package/DS1/x-flag/so.svg +1 -0
  382. package/DS1/x-flag/sr.svg +1 -0
  383. package/DS1/x-flag/ss.svg +1 -0
  384. package/DS1/x-flag/st.svg +1 -0
  385. package/DS1/x-flag/sv.svg +1 -0
  386. package/DS1/x-flag/sx.svg +1 -0
  387. package/DS1/x-flag/sy.svg +1 -0
  388. package/DS1/x-flag/sz.svg +1 -0
  389. package/DS1/x-flag/ta.svg +1 -0
  390. package/DS1/x-flag/tc.svg +1 -0
  391. package/DS1/x-flag/td.svg +1 -0
  392. package/DS1/x-flag/tf.svg +1 -0
  393. package/DS1/x-flag/tg.svg +1 -0
  394. package/DS1/x-flag/th.svg +1 -0
  395. package/DS1/x-flag/tj.svg +1 -0
  396. package/DS1/x-flag/tk.svg +1 -0
  397. package/DS1/x-flag/tl.svg +1 -0
  398. package/DS1/x-flag/tm.svg +1 -0
  399. package/DS1/x-flag/tn.svg +1 -0
  400. package/DS1/x-flag/to.svg +1 -0
  401. package/DS1/x-flag/tr.svg +1 -0
  402. package/DS1/x-flag/tt.svg +1 -0
  403. package/DS1/x-flag/tv.svg +1 -0
  404. package/DS1/x-flag/tw.svg +1 -0
  405. package/DS1/x-flag/tz.svg +1 -0
  406. package/DS1/x-flag/ua.svg +1 -0
  407. package/DS1/x-flag/ug.svg +1 -0
  408. package/DS1/x-flag/um.svg +1 -0
  409. package/DS1/x-flag/us.svg +1 -0
  410. package/DS1/x-flag/uy.svg +1 -0
  411. package/DS1/x-flag/uz.svg +1 -0
  412. package/DS1/x-flag/va.svg +1 -0
  413. package/DS1/x-flag/vc.svg +1 -0
  414. package/DS1/x-flag/ve.svg +1 -0
  415. package/DS1/x-flag/vg.svg +1 -0
  416. package/DS1/x-flag/vi.svg +1 -0
  417. package/DS1/x-flag/vn.svg +1 -0
  418. package/DS1/x-flag/vu.svg +1 -0
  419. package/DS1/x-flag/wf.svg +1 -0
  420. package/DS1/x-flag/ws.svg +1 -0
  421. package/DS1/x-flag/xk.svg +1 -0
  422. package/DS1/x-flag/ye.svg +1 -0
  423. package/DS1/x-flag/yt.svg +1 -0
  424. package/DS1/x-flag/za.svg +1 -0
  425. package/DS1/x-flag/zm.svg +1 -0
  426. package/DS1/x-flag/zw.svg +1 -0
  427. package/DS1/x-icon/android.svg +9 -0
  428. package/DS1/x-icon/arrange-check.svg +1 -1
  429. package/DS1/x-icon/arrange-page.svg +1 -1
  430. package/DS1/x-icon/chrome.svg +7 -0
  431. package/DS1/x-icon/edge-brand.svg +6 -0
  432. package/DS1/x-icon/firefox.svg +4 -0
  433. package/DS1/x-icon/health.svg +3 -0
  434. package/DS1/x-icon/left.svg +2 -3
  435. package/DS1/x-icon/linux.svg +1 -0
  436. package/DS1/x-icon/material.svg +1 -0
  437. package/DS1/x-icon/milestone-planned.svg +3 -0
  438. package/DS1/x-icon/milestone.svg +3 -0
  439. package/DS1/x-icon/more.svg +1 -5
  440. package/DS1/x-icon/network.svg +3 -0
  441. package/DS1/x-icon/opera.svg +4 -0
  442. package/DS1/x-icon/prediction.svg +3 -0
  443. package/DS1/x-icon/priority-high.svg +3 -0
  444. package/DS1/x-icon/priority-low.svg +3 -0
  445. package/DS1/x-icon/priority-medium.svg +3 -0
  446. package/DS1/x-icon/project.svg +3 -0
  447. package/DS1/x-icon/redo.svg +2 -2
  448. package/DS1/x-icon/repeat-small.svg +3 -0
  449. package/DS1/x-icon/safari.svg +4 -0
  450. package/DS1/x-icon/scaling.svg +3 -0
  451. package/DS1/x-icon/tabs.svg +4 -0
  452. package/DS1/x-icon/windows.svg +5 -0
  453. package/README.md +3 -3
  454. package/dist/0-face/button-label.d.ts +5 -0
  455. package/dist/0-face/button-label.d.ts.map +1 -0
  456. package/dist/0-face/button-label.js +31 -0
  457. package/dist/0-face/calendar.d.ts +1 -1
  458. package/dist/0-face/calendar.d.ts.map +1 -1
  459. package/dist/0-face/calendar.js +6 -3
  460. package/dist/0-face/carousel.d.ts +9 -0
  461. package/dist/0-face/carousel.d.ts.map +1 -1
  462. package/dist/0-face/carousel.js +80 -0
  463. package/dist/0-face/constraint-panel.d.ts +43 -0
  464. package/dist/0-face/constraint-panel.d.ts.map +1 -0
  465. package/dist/0-face/constraint-panel.js +451 -0
  466. package/dist/0-face/constraint-site.d.ts +73 -0
  467. package/dist/0-face/constraint-site.d.ts.map +1 -0
  468. package/dist/0-face/constraint-site.js +186 -0
  469. package/dist/0-face/constraints.d.ts +47 -0
  470. package/dist/0-face/constraints.d.ts.map +1 -0
  471. package/dist/0-face/constraints.js +274 -0
  472. package/dist/0-face/copy-text.js +1 -1
  473. package/dist/0-face/cut-fade.d.ts +112 -0
  474. package/dist/0-face/cut-fade.d.ts.map +1 -0
  475. package/dist/0-face/cut-fade.js +274 -0
  476. package/dist/0-face/define.d.ts.map +1 -1
  477. package/dist/0-face/define.js +24 -3
  478. package/dist/0-face/face-correction.d.ts +51 -0
  479. package/dist/0-face/face-correction.d.ts.map +1 -0
  480. package/dist/0-face/face-correction.js +80 -0
  481. package/dist/0-face/failures.d.ts +16 -0
  482. package/dist/0-face/failures.d.ts.map +1 -0
  483. package/dist/0-face/failures.js +21 -0
  484. package/dist/0-face/fault-lines.d.ts +20 -0
  485. package/dist/0-face/fault-lines.d.ts.map +1 -0
  486. package/dist/0-face/fault-lines.js +172 -0
  487. package/dist/0-face/feedback-overlays.d.ts.map +1 -1
  488. package/dist/0-face/feedback-overlays.js +5 -3
  489. package/dist/0-face/feedback.d.ts +2 -0
  490. package/dist/0-face/feedback.d.ts.map +1 -1
  491. package/dist/0-face/feedback.js +1 -0
  492. package/dist/0-face/focus.d.ts +71 -0
  493. package/dist/0-face/focus.d.ts.map +1 -0
  494. package/dist/0-face/focus.js +196 -0
  495. package/dist/0-face/grid.d.ts +11 -1
  496. package/dist/0-face/grid.d.ts.map +1 -1
  497. package/dist/0-face/grid.js +90 -4
  498. package/dist/0-face/i18n.d.ts.map +1 -1
  499. package/dist/0-face/i18n.js +38 -16
  500. package/dist/0-face/layout-inspector.d.ts +5 -1
  501. package/dist/0-face/layout-inspector.d.ts.map +1 -1
  502. package/dist/0-face/layout-inspector.js +130 -104
  503. package/dist/0-face/preference-options.d.ts +4 -0
  504. package/dist/0-face/preference-options.d.ts.map +1 -1
  505. package/dist/0-face/scaling.d.ts +8 -1
  506. package/dist/0-face/scaling.d.ts.map +1 -1
  507. package/dist/0-face/scaling.js +19 -2
  508. package/dist/0-face/shape.d.ts +35 -0
  509. package/dist/0-face/shape.d.ts.map +1 -0
  510. package/dist/0-face/shape.js +23 -0
  511. package/dist/0-face/text-contrast.d.ts +22 -0
  512. package/dist/0-face/text-contrast.d.ts.map +1 -0
  513. package/dist/0-face/text-contrast.js +178 -0
  514. package/dist/0-face/theme-bootstrap.js +56 -0
  515. package/dist/0-face/toast-queue.d.ts +4 -0
  516. package/dist/0-face/toast-queue.d.ts.map +1 -1
  517. package/dist/0-face/toast-queue.js +4 -1
  518. package/dist/0-face/translations/da.json +10 -1
  519. package/dist/0-face/translations/de.json +10 -1
  520. package/dist/0-face/translations/en.json +10 -1
  521. package/dist/0-face/translations/es.json +10 -1
  522. package/dist/0-face/translations/fi.json +10 -1
  523. package/dist/0-face/translations/fr.json +10 -1
  524. package/dist/0-face/translations/is.json +10 -1
  525. package/dist/0-face/translations/it.json +10 -1
  526. package/dist/0-face/translations/ja.json +10 -1
  527. package/dist/0-face/translations/ko.json +10 -1
  528. package/dist/0-face/translations/nb.json +10 -1
  529. package/dist/0-face/translations/pt-BR.json +10 -1
  530. package/dist/0-face/translations/pt.json +10 -1
  531. package/dist/0-face/translations/sv.json +10 -1
  532. package/dist/0-face/translations/zh.json +10 -1
  533. package/dist/0-face/word-wrap.d.ts +6 -0
  534. package/dist/0-face/word-wrap.d.ts.map +1 -0
  535. package/dist/0-face/word-wrap.js +119 -0
  536. package/dist/1-root/foundation.d.ts +12 -0
  537. package/dist/1-root/foundation.d.ts.map +1 -0
  538. package/dist/1-root/foundation.js +59 -0
  539. package/dist/2-core/button-split.d.ts +1 -0
  540. package/dist/2-core/button-split.d.ts.map +1 -1
  541. package/dist/2-core/button-split.js +9 -4
  542. package/dist/2-core/chart/grid-chart.d.ts +2 -0
  543. package/dist/2-core/chart/grid-chart.d.ts.map +1 -1
  544. package/dist/2-core/chart/grid-chart.js +2 -1
  545. package/dist/2-core/ds-activity.d.ts +25 -0
  546. package/dist/2-core/ds-activity.d.ts.map +1 -0
  547. package/dist/2-core/ds-activity.js +28 -0
  548. package/dist/2-core/ds-app-chrome.d.ts +2 -0
  549. package/dist/2-core/ds-app-chrome.d.ts.map +1 -0
  550. package/dist/2-core/ds-app-chrome.js +1 -0
  551. package/dist/2-core/ds-avatar.d.ts +12 -0
  552. package/dist/2-core/ds-avatar.d.ts.map +1 -1
  553. package/dist/2-core/ds-avatar.js +86 -7
  554. package/dist/2-core/ds-badge.d.ts +7 -1
  555. package/dist/2-core/ds-badge.d.ts.map +1 -1
  556. package/dist/2-core/ds-badge.js +8 -1
  557. package/dist/2-core/ds-button.d.ts +12 -0
  558. package/dist/2-core/ds-button.d.ts.map +1 -1
  559. package/dist/2-core/ds-button.js +4 -0
  560. package/dist/2-core/ds-chart.d.ts +28 -3
  561. package/dist/2-core/ds-chart.d.ts.map +1 -1
  562. package/dist/2-core/ds-chart.js +110 -130
  563. package/dist/2-core/ds-cycle.d.ts +2 -2
  564. package/dist/2-core/ds-cycle.d.ts.map +1 -1
  565. package/dist/2-core/ds-cycle.js +36 -171
  566. package/dist/2-core/ds-device-bezel.d.ts +2 -0
  567. package/dist/2-core/ds-device-bezel.d.ts.map +1 -0
  568. package/dist/2-core/ds-device-bezel.js +1 -0
  569. package/dist/2-core/ds-empty.d.ts +2 -2
  570. package/dist/2-core/ds-empty.d.ts.map +1 -1
  571. package/dist/2-core/ds-empty.js +6 -4
  572. package/dist/2-core/ds-input.d.ts +7 -0
  573. package/dist/2-core/ds-input.d.ts.map +1 -1
  574. package/dist/2-core/ds-input.js +23 -3
  575. package/dist/2-core/ds-message.d.ts +11 -0
  576. package/dist/2-core/ds-message.d.ts.map +1 -1
  577. package/dist/2-core/ds-message.js +18 -0
  578. package/dist/2-core/ds-number.d.ts +86 -0
  579. package/dist/2-core/ds-number.d.ts.map +1 -0
  580. package/dist/2-core/ds-number.js +326 -0
  581. package/dist/2-core/ds-progress.d.ts +3 -0
  582. package/dist/2-core/ds-progress.d.ts.map +1 -1
  583. package/dist/2-core/ds-progress.js +3 -0
  584. package/dist/2-core/ds-radio.d.ts +3 -0
  585. package/dist/2-core/ds-radio.d.ts.map +1 -1
  586. package/dist/2-core/ds-radio.js +10 -1
  587. package/dist/2-core/ds-stat.d.ts +3 -0
  588. package/dist/2-core/ds-stat.d.ts.map +1 -1
  589. package/dist/2-core/ds-stat.js +3 -0
  590. package/dist/2-core/ds-switch.d.ts +14 -1
  591. package/dist/2-core/ds-switch.d.ts.map +1 -1
  592. package/dist/2-core/ds-switch.js +3 -1
  593. package/dist/2-core/ds-tag.d.ts +8 -1
  594. package/dist/2-core/ds-tag.d.ts.map +1 -1
  595. package/dist/2-core/ds-tag.js +12 -2
  596. package/dist/2-core/ds-text.d.ts +7 -0
  597. package/dist/2-core/ds-text.d.ts.map +1 -1
  598. package/dist/2-core/ds-text.js +7 -0
  599. package/dist/2-core/ds-token.d.ts +3 -0
  600. package/dist/2-core/ds-token.d.ts.map +1 -1
  601. package/dist/2-core/ds-token.js +3 -0
  602. package/dist/2-core/ds-tooltip.d.ts.map +1 -1
  603. package/dist/2-core/ds-tooltip.js +23 -2
  604. package/dist/2-core/ds-window.d.ts +2 -0
  605. package/dist/2-core/ds-window.d.ts.map +1 -0
  606. package/dist/2-core/ds-window.js +1 -0
  607. package/dist/2-core/generated/ds-icon-map.d.ts +27 -6
  608. package/dist/2-core/generated/ds-icon-map.d.ts.map +1 -1
  609. package/dist/2-core/generated/ds-icon-map.js +47 -5
  610. package/dist/2-core/generated/icons-extra.d.ts.map +1 -1
  611. package/dist/2-core/generated/icons-extra.js +24 -3
  612. package/dist/2-core/generated/icons-immediate.d.ts +1 -1
  613. package/dist/2-core/generated/icons-immediate.d.ts.map +1 -1
  614. package/dist/2-core/generated/icons-immediate.js +3 -3
  615. package/dist/2-core/number-expression.d.ts +12 -0
  616. package/dist/2-core/number-expression.d.ts.map +1 -0
  617. package/dist/2-core/number-expression.js +82 -0
  618. package/dist/3-unit/calendar-base.d.ts +5 -0
  619. package/dist/3-unit/calendar-base.d.ts.map +1 -1
  620. package/dist/3-unit/calendar-base.js +3 -2
  621. package/dist/3-unit/context-trigger.d.ts.map +1 -1
  622. package/dist/3-unit/context-trigger.js +32 -2
  623. package/dist/3-unit/ds-calendar.d.ts +197 -4
  624. package/dist/3-unit/ds-calendar.d.ts.map +1 -1
  625. package/dist/3-unit/ds-calendar.js +687 -45
  626. package/dist/3-unit/ds-carousel.d.ts +3 -0
  627. package/dist/3-unit/ds-carousel.d.ts.map +1 -1
  628. package/dist/3-unit/ds-carousel.js +13 -1
  629. package/dist/3-unit/ds-context.d.ts +18 -1
  630. package/dist/3-unit/ds-context.d.ts.map +1 -1
  631. package/dist/3-unit/ds-context.js +37 -1
  632. package/dist/3-unit/ds-form.d.ts +9 -0
  633. package/dist/3-unit/ds-form.d.ts.map +1 -1
  634. package/dist/3-unit/ds-form.js +52 -11
  635. package/dist/3-unit/ds-list.d.ts +20 -1
  636. package/dist/3-unit/ds-list.d.ts.map +1 -1
  637. package/dist/3-unit/ds-list.js +31 -3
  638. package/dist/3-unit/ds-matrix.d.ts +3 -0
  639. package/dist/3-unit/ds-matrix.d.ts.map +1 -1
  640. package/dist/3-unit/ds-matrix.js +3 -0
  641. package/dist/3-unit/ds-menu.d.ts.map +1 -1
  642. package/dist/3-unit/ds-menu.js +17 -1
  643. package/dist/3-unit/ds-row.d.ts +13 -0
  644. package/dist/3-unit/ds-row.d.ts.map +1 -1
  645. package/dist/3-unit/ds-row.js +15 -2
  646. package/dist/3-unit/ds-select.js +1 -1
  647. package/dist/3-unit/ds-sidebar.d.ts +17 -0
  648. package/dist/3-unit/ds-sidebar.d.ts.map +1 -1
  649. package/dist/3-unit/ds-sidebar.js +14 -3
  650. package/dist/3-unit/ds-table-of-contents.d.ts +68 -0
  651. package/dist/3-unit/ds-table-of-contents.d.ts.map +1 -0
  652. package/dist/3-unit/ds-table-of-contents.js +190 -0
  653. package/dist/3-unit/ds-table.d.ts.map +1 -1
  654. package/dist/3-unit/ds-table.js +2 -1
  655. package/dist/3-unit/ds-tabs.d.ts +32 -1
  656. package/dist/3-unit/ds-tabs.d.ts.map +1 -1
  657. package/dist/3-unit/ds-tabs.js +39 -1
  658. package/dist/4-page/ds-container.d.ts.map +1 -1
  659. package/dist/4-page/ds-container.js +2 -1
  660. package/dist/4-page/ds-document.d.ts +3 -0
  661. package/dist/4-page/ds-document.d.ts.map +1 -1
  662. package/dist/4-page/ds-document.js +3 -0
  663. package/dist/4-page/ds-footer.d.ts +47 -7
  664. package/dist/4-page/ds-footer.d.ts.map +1 -1
  665. package/dist/4-page/ds-footer.js +58 -14
  666. package/dist/4-page/ds-header.d.ts +6 -0
  667. package/dist/4-page/ds-header.d.ts.map +1 -1
  668. package/dist/4-page/ds-header.js +4 -1
  669. package/dist/4-page/ds-overlay.d.ts +2 -2
  670. package/dist/4-page/ds-overlay.d.ts.map +1 -1
  671. package/dist/4-page/ds-overlay.js +8 -3
  672. package/dist/4-page/ds-page.d.ts +12 -0
  673. package/dist/4-page/ds-page.d.ts.map +1 -1
  674. package/dist/4-page/ds-page.js +19 -1
  675. package/dist/4-page/email.d.ts +2 -0
  676. package/dist/4-page/email.d.ts.map +1 -1
  677. package/dist/4-page/email.js +5 -4
  678. package/dist/5-visual-kit/app-chrome.d.ts +98 -0
  679. package/dist/5-visual-kit/app-chrome.d.ts.map +1 -0
  680. package/dist/5-visual-kit/app-chrome.js +119 -0
  681. package/dist/5-visual-kit/bezels.d.ts +30 -0
  682. package/dist/5-visual-kit/bezels.d.ts.map +1 -0
  683. package/dist/5-visual-kit/bezels.js +388 -0
  684. package/dist/5-visual-kit/browser-icons.d.ts +5 -0
  685. package/dist/5-visual-kit/browser-icons.d.ts.map +1 -0
  686. package/dist/5-visual-kit/browser-icons.js +51 -0
  687. package/dist/5-visual-kit/browser-styles.d.ts +3 -0
  688. package/dist/5-visual-kit/browser-styles.d.ts.map +1 -0
  689. package/dist/5-visual-kit/browser-styles.js +52 -0
  690. package/dist/5-visual-kit/device-bezel.d.ts +84 -0
  691. package/dist/5-visual-kit/device-bezel.d.ts.map +1 -0
  692. package/dist/5-visual-kit/device-bezel.js +56 -0
  693. package/dist/5-visual-kit/instagram-frame.d.ts +8 -0
  694. package/dist/5-visual-kit/instagram-frame.d.ts.map +1 -0
  695. package/dist/5-visual-kit/instagram-frame.js +13 -0
  696. package/dist/5-visual-kit/instagram.d.ts +18 -0
  697. package/dist/5-visual-kit/instagram.d.ts.map +1 -0
  698. package/dist/5-visual-kit/instagram.js +39 -0
  699. package/dist/5-visual-kit/mobile-chrome.d.ts +4 -0
  700. package/dist/5-visual-kit/mobile-chrome.d.ts.map +1 -0
  701. package/dist/5-visual-kit/mobile-chrome.js +24 -0
  702. package/dist/5-visual-kit/native-icon-paths.d.ts +146 -0
  703. package/dist/5-visual-kit/native-icon-paths.d.ts.map +1 -0
  704. package/dist/5-visual-kit/native-icon-paths.js +145 -0
  705. package/dist/5-visual-kit/window.d.ts +51 -0
  706. package/dist/5-visual-kit/window.d.ts.map +1 -0
  707. package/dist/5-visual-kit/window.js +20 -0
  708. package/dist/browser-icons-BFbS1tIx.js +56 -0
  709. package/dist/browser-icons-BFbS1tIx.js.map +1 -0
  710. package/dist/browser-icons-CT8qU77Z.js +48 -0
  711. package/dist/browser-icons-CT8qU77Z.js.map +1 -0
  712. package/dist/components.d.ts +1 -0
  713. package/dist/components.d.ts.map +1 -1
  714. package/dist/components.js +1 -0
  715. package/dist/design-system-1.bundle.js +5874 -2097
  716. package/dist/design-system-1.bundle.js.map +1 -1
  717. package/dist/design-system-1.bundle.min.js +7332 -4682
  718. package/dist/design-system-1.bundle.min.js.map +1 -1
  719. package/dist/design-system-1.css +1 -1
  720. package/dist/feedback.js +197 -167
  721. package/dist/feedback.js.map +1 -1
  722. package/dist/{icons-extra-CRxxWFjX.js → icons-extra-BMPvmQPI.js} +25 -4
  723. package/dist/icons-extra-BMPvmQPI.js.map +1 -0
  724. package/dist/{icons-extra-H5pqCM_R.js → icons-extra-BfYOw-cR.js} +83 -5
  725. package/dist/icons-extra-BfYOw-cR.js.map +1 -0
  726. package/dist/index.d.ts +12 -1
  727. package/dist/index.d.ts.map +1 -1
  728. package/dist/index.js +11 -1
  729. package/dist/instagram-CKofs55A.js +50 -0
  730. package/dist/instagram-CKofs55A.js.map +1 -0
  731. package/dist/instagram-CcYf5oiM.js +48 -0
  732. package/dist/instagram-CcYf5oiM.js.map +1 -0
  733. package/dist/lit-Ce_uWYM4.js +612 -0
  734. package/dist/lit-Ce_uWYM4.js.map +1 -0
  735. package/dist/lit-DGUVm1Ce.js +557 -0
  736. package/dist/lit-DGUVm1Ce.js.map +1 -0
  737. package/dist/native-icon-paths-CB9evXBM.js +93 -0
  738. package/dist/native-icon-paths-CB9evXBM.js.map +1 -0
  739. package/dist/native-icon-paths-zay-3g_n.js +150 -0
  740. package/dist/native-icon-paths-zay-3g_n.js.map +1 -0
  741. package/dist/react/avatar.d.ts +1 -1
  742. package/dist/react/choice.d.ts +4 -0
  743. package/dist/react/choice.d.ts.map +1 -1
  744. package/dist/react/choice.js +2 -2
  745. package/dist/react/context.d.ts +19 -4
  746. package/dist/react/context.d.ts.map +1 -1
  747. package/dist/react/context.js +4 -4
  748. package/dist/react/empty.d.ts +2 -2
  749. package/dist/react/empty.d.ts.map +1 -1
  750. package/dist/react/empty.js +1 -1
  751. package/dist/react/footer.d.ts +5 -5
  752. package/dist/react/footer.d.ts.map +1 -1
  753. package/dist/react/footer.js +2 -2
  754. package/dist/react/header.d.ts +2 -2
  755. package/dist/react/header.d.ts.map +1 -1
  756. package/dist/react/message.d.ts +4 -0
  757. package/dist/react/message.d.ts.map +1 -1
  758. package/dist/react/message.js +2 -2
  759. package/dist/react/number.d.ts +53 -0
  760. package/dist/react/number.d.ts.map +1 -0
  761. package/dist/react/number.js +25 -0
  762. package/dist/react/page.d.ts +1 -1
  763. package/dist/react/sidebar.d.ts +4 -0
  764. package/dist/react/sidebar.d.ts.map +1 -1
  765. package/dist/react/sidebar.js +2 -2
  766. package/dist/react/table-of-contents.d.ts +19 -0
  767. package/dist/react/table-of-contents.d.ts.map +1 -0
  768. package/dist/react/table-of-contents.js +28 -0
  769. package/dist/{shared-words-CdMDVtXx.js → shared-words-C5cjxMjZ.js} +151 -16
  770. package/dist/shared-words-C5cjxMjZ.js.map +1 -0
  771. package/dist/{shared-words-BtRee8xR.js → shared-words-Cdm7xd-_.js} +163 -28
  772. package/dist/shared-words-Cdm7xd-_.js.map +1 -0
  773. package/package.json +25 -12
  774. package/DS1/3-unit/ds-calendar-large.ts +0 -353
  775. package/DS1/3-unit/styles/ds-calendar-large.css +0 -178
  776. package/dist/3-unit/ds-calendar-large.d.ts +0 -142
  777. package/dist/3-unit/ds-calendar-large.d.ts.map +0 -1
  778. package/dist/3-unit/ds-calendar-large.js +0 -308
  779. package/dist/icons-extra-CRxxWFjX.js.map +0 -1
  780. package/dist/icons-extra-H5pqCM_R.js.map +0 -1
  781. package/dist/shared-words-BtRee8xR.js.map +0 -1
  782. package/dist/shared-words-CdMDVtXx.js.map +0 -1
@@ -15,7 +15,7 @@
15
15
  :host([columns]) {
16
16
  display: grid;
17
17
  grid-template-columns: repeat(var(--ds-list-columns, 2), minmax(0, 1fr));
18
- column-gap: var(--ds-list-column-gap, calc(8px * var(--ds-sf)));
18
+ column-gap: var(--ds-list-column-gap, calc(var(--ds-unit) / 2));
19
19
  }
20
20
 
21
21
  :host([columns="2"]) {
@@ -25,3 +25,28 @@
25
25
  :host([columns="3"]) {
26
26
  --ds-list-columns: 3;
27
27
  }
28
+
29
+ /* The group's name on the square above its rows: words on the lower sixteen of the square with
30
+ the spare four above, in the muted ink, as a day's heading stands over Money's payments. It
31
+ names the list (aria-label), so the drawn words are hidden from assistive technology. */
32
+ .heading {
33
+ box-sizing: border-box;
34
+ flex: none;
35
+ grid-column: 1 / -1;
36
+ width: 100%;
37
+ height: var(--ds-unit);
38
+ padding-top: calc(4px * var(--ds-sf));
39
+ overflow: hidden;
40
+ color: var(--ds-list-heading-color, var(--ds-text-color-muted));
41
+ font-family: var(--ds-typeface-regular);
42
+ font-feature-settings: var(--ds-font-features);
43
+ font-size: var(--ds-type-size-default);
44
+ font-weight: var(--ds-type-weight-default);
45
+ line-height: var(--ds-type-lineheight-default);
46
+ letter-spacing: var(--ds-type-letterspacing-default);
47
+ white-space: nowrap;
48
+ text-overflow: clip;
49
+ }
50
+ /* A cut heading fades over its last square, never an ellipsis (0-face/cut-fade.ts marks it). */
51
+ .heading[data-cut="end"] { mask-image: linear-gradient(to right, #000 calc(100% - var(--ds-unit)), transparent); }
52
+ :host(:dir(rtl)) .heading[data-cut="end"] { mask-image: linear-gradient(to left, #000 calc(100% - var(--ds-unit)), transparent); }
@@ -91,10 +91,13 @@
91
91
  padding-inline-end: calc(4px * var(--ds-sf, 1));
92
92
  overflow: hidden;
93
93
  text-align: end;
94
- text-overflow: ellipsis;
94
+ text-overflow: clip;
95
95
  white-space: nowrap;
96
96
  cursor: pointer;
97
97
  }
98
+ /* A cut name fades over its last square, never an ellipsis (0-face/cut-fade.ts marks it). */
99
+ .name[data-cut="end"] { mask-image: linear-gradient(to right, #000 calc(100% - var(--ds-unit)), transparent); }
100
+ :host(:dir(rtl)) .name[data-cut="end"] { mask-image: linear-gradient(to left, #000 calc(100% - var(--ds-unit)), transparent); }
98
101
  .name[data-lit] { background: var(--ds-row-fill-hover, var(--ds-fill)); }
99
102
  .name.totals { color: var(--ds-title-color); cursor: default; }
100
103
 
@@ -124,6 +124,45 @@
124
124
  :host([disabled]) .target { cursor: default; opacity: 0.5; }
125
125
  :host([disabled]) .target::after { background: none; }
126
126
 
127
+ /*
128
+ * The parts of a record's row (payments, events, people): a 16px picture before the
129
+ * name (an avatar tile, a large icon) takes the first sixteen of its square, and the row's 4px
130
+ * gap puts the words on the next square. The name hugs its words and gives way first; once
131
+ * the element has measured it cut (`data-cut="end"`), it fades out over its last square,
132
+ * never an ellipsis. A tag stands after the name, and the value (a figure, a date) at the
133
+ * row's end in tabular figures.
134
+ */
135
+ ::slotted(.ds-row__picture) {
136
+ flex: none;
137
+ box-sizing: border-box;
138
+ width: var(--ds-control-height);
139
+ height: var(--ds-control-height);
140
+ margin: 0;
141
+ padding: 0;
142
+ }
143
+ ::slotted(.ds-row__name) {
144
+ flex: 0 1 auto;
145
+ min-width: 0;
146
+ overflow: hidden;
147
+ white-space: nowrap;
148
+ text-overflow: clip;
149
+ }
150
+ ::slotted(.ds-row__name[data-cut="end"]) {
151
+ mask-image: linear-gradient(to right, #000 calc(100% - var(--ds-unit)), transparent);
152
+ }
153
+ :host(:dir(rtl)) ::slotted(.ds-row__name[data-cut="end"]) {
154
+ mask-image: linear-gradient(to left, #000 calc(100% - var(--ds-unit)), transparent);
155
+ }
156
+ ::slotted(.ds-row__value) {
157
+ flex: none;
158
+ /* Important: a page's `* { margin: 0 }` reset (Tailwind's preflight, say)
159
+ reaches the slotted value from outside and would leave it after the name. */
160
+ margin-inline-start: auto !important;
161
+ white-space: nowrap;
162
+ text-align: end;
163
+ font-variant-numeric: tabular-nums;
164
+ }
165
+
127
166
  /* A navigation row: the sidebar's two-pixel corners. */
128
167
  :host([nav]) { --ds-row-radius: calc(2px * var(--ds-sf)); }
129
168
 
@@ -2,28 +2,35 @@
2
2
 
3
3
  /*
4
4
  * Select as a field, around a native <select> (`data-field`): the menu
5
- * engine's own rules (an action menu's) do not reach it. One square high and
6
- * eight wide by default; a list one square a visible row.
5
+ * engine's own rules (an action menu's) do not reach it. One control high
6
+ * (16px), standing at the foot of its line on the lower sixteen as a button
7
+ * does, and hugging its options by default; a list one square a visible row.
7
8
  */
8
9
  :host([data-field]) {
9
10
  --ds-select-unit: calc(var(--ds-1) * var(--ds-sf));
10
11
  display: inline-flex;
11
12
  position: relative;
12
- vertical-align: middle;
13
- width: calc(8 * var(--ds-select-unit));
13
+ vertical-align: bottom;
14
+ width: max-content;
14
15
  max-width: 100%;
15
16
  min-width: 0;
16
17
  max-height: none;
17
- height: calc(var(--ds-select-rows, 1) * var(--ds-select-unit));
18
+ height: var(--ds-control-height);
19
+ }
20
+ :host([data-field]:not([data-listbox])) {
21
+ width: max-content !important;
22
+ flex: 0 0 auto !important;
23
+ justify-self: start !important;
18
24
  }
19
25
  :host([hidden]) { display: none !important; }
20
26
  ::slotted(select) {
21
27
  appearance: none !important;
22
28
  box-sizing: border-box !important;
23
29
  display: block !important;
24
- width: 100% !important;
30
+ field-sizing: content;
31
+ width: auto !important;
25
32
  min-width: 0 !important;
26
- max-width: none !important;
33
+ max-width: 100% !important;
27
34
  height: 100% !important;
28
35
  min-height: 0 !important;
29
36
  margin: 0 !important;
@@ -37,7 +44,7 @@
37
44
  font-size: var(--ds-type-size-default) !important;
38
45
  font-weight: var(--ds-type-weight-default) !important;
39
46
  letter-spacing: var(--ds-type-letterspacing-default) !important;
40
- line-height: calc(var(--ds-select-unit) - 2px) !important;
47
+ line-height: calc(var(--ds-control-height) - 2px) !important;
41
48
  box-shadow: none !important;
42
49
  cursor: pointer !important;
43
50
  }
@@ -47,8 +54,8 @@
47
54
  inset-inline-end: calc(2px * var(--ds-sf));
48
55
  top: 50%;
49
56
  transform: translateY(-50%);
50
- width: calc(.8 * var(--ds-select-unit));
51
- height: calc(.8 * var(--ds-select-unit));
57
+ width: var(--ds-control-height);
58
+ height: var(--ds-control-height);
52
59
  background: var(--ds-input-color);
53
60
  mask: var(--ds-select-arrow) center / contain no-repeat;
54
61
  }
@@ -59,14 +66,17 @@
59
66
  ::slotted(select[multiple]),
60
67
  ::slotted(select[size]:not([size="0"]):not([size="1"])) {
61
68
  padding: 0 calc(4px * var(--ds-sf)) !important;
69
+ line-height: calc(var(--ds-select-unit) - 2px) !important;
62
70
  }
63
71
 
72
+ :host([data-listbox]) { width: calc(8 * var(--ds-select-unit)); height: calc(var(--ds-select-rows, 1) * var(--ds-select-unit)); }
73
+ :host([data-listbox]) ::slotted(select) { width: 100% !important; }
74
+
64
75
  /* Intrinsic width uses the native option sizing, including translated labels. */
65
76
  :host([fit]:not([data-listbox])) { width: max-content; }
66
77
  :host([fit]:not([data-listbox])) ::slotted(select) { width: auto !important; max-width: 100% !important; }
67
78
 
68
- /* A settings chip keeps the same native picker, on the shared control height. */
69
- :host([chip]:not([data-listbox])) { height: var(--ds-control-height); }
79
+ /* A settings chip keeps the same native picker and height, filled as a button. */
70
80
  :host([chip]:not([data-listbox])) ::slotted(select) {
71
81
  border: 0 !important;
72
82
  background: var(--ds-button-background-color-secondary) !important;
@@ -42,7 +42,13 @@ ds-icon { transform: rotate(0deg); }
42
42
  ds-icon[data-open] { transform: rotate(90deg); }
43
43
  .choice { flex: 0 1 auto; min-width: 0; }
44
44
  .name:has(ds-icon) { display: flex; align-items: center; gap: calc(4px * var(--ds-sf)); }
45
- .name { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
45
+ .name { overflow: hidden; white-space: nowrap; text-overflow: clip; }
46
+ /* Cut words fade over their last square, never an ellipsis (0-face/cut-fade.ts marks them). */
47
+ :is(.name, .tree .label)[data-cut="end"] { mask-image: linear-gradient(to right, #000 calc(100% - var(--ds-unit)), transparent); }
48
+ :host(:dir(rtl)) :is(.name, .tree .label)[data-cut="end"] { mask-image: linear-gradient(to left, #000 calc(100% - var(--ds-unit)), transparent); }
49
+ /* A detail (a version) follows the label in the small muted type, 4px after its words and on their line, cut with them. */
50
+ .detail { margin-inline-start: calc(4px * var(--ds-sf)); font-size: var(--ds-type-size-small); line-height: 1; color: var(--ds-text-color-muted); font-variant-numeric: tabular-nums; white-space: nowrap; }
51
+ .name:has(ds-icon) .detail { margin-inline-start: 0; }
46
52
  .meta { flex: none; padding-inline-start: calc(4px * var(--ds-sf)); font-size: var(--ds-type-size-small); color: var(--ds-text-color-muted); font-variant-numeric: tabular-nums; white-space: nowrap; }
47
53
  .action { margin-inline-start: calc(4px * var(--ds-sf)); --ds-text-size: 10px; --ds-button-color: var(--ds-text-color-muted); }
48
54
  .empty { margin: 0; padding: calc(var(--ds-unit) / 2); color: var(--ds-text-color-muted); }
@@ -105,7 +111,7 @@ ds-icon[data-open] { transform: rotate(90deg); }
105
111
  min-width: 0;
106
112
  padding-inline-start: calc(4px * var(--ds-sf));
107
113
  overflow: hidden;
108
- text-overflow: ellipsis;
114
+ text-overflow: clip;
109
115
  }
110
116
 
111
117
  @media (prefers-reduced-motion: reduce) {
@@ -132,3 +138,11 @@ ds-icon[data-open] { transform: rotate(90deg); }
132
138
 
133
139
  :host([disclosure-position="start"]) .row { padding-inline-start: calc(4px * var(--ds-sf) + var(--depth) * var(--ds-unit)); }
134
140
  :host([disclosure-position="start"]) .row:not(:has(.disclosure)) .choice { margin-inline-start: var(--ds-unit); }
141
+
142
+ /* Narrow: eight squares wide, each row hugging its words, so the pointer's and the current
143
+ row's fill wrap the label (and its meta and disclosure) 4px either side instead of running
144
+ across the column. Rows still stand one square apart, half a square further in per level. */
145
+ :host([narrow]) { width: calc(8 * var(--ds-unit)); }
146
+ :host([narrow]) nav { display: flex; flex-direction: column; align-items: flex-start; }
147
+ :host([narrow]) .row { width: fit-content; max-width: 100%; }
148
+ :host([narrow]) .spacer { display: none; }
@@ -0,0 +1,40 @@
1
+ @import "../../1-root/component-metrics.css";
2
+ :host {
3
+ display: block;
4
+ width: var(--ds-toc-width, calc(12 * var(--ds-unit)));
5
+ max-width: 100%;
6
+ color: var(--ds-text-color);
7
+ font-family: var(--ds-typeface-regular);
8
+ font-size: var(--ds-type-size-default);
9
+ font-weight: var(--ds-type-weight-default);
10
+ line-height: var(--ds-type-lineheight-default);
11
+ letter-spacing: var(--ds-type-letterspacing-default);
12
+ }
13
+ :host([hidden]) { display: none !important; }
14
+ .title { display: flex; align-items: flex-end; min-height: var(--ds-unit); }
15
+ .links { margin-top: var(--ds-unit); }
16
+ a, ::slotted(a) {
17
+ box-sizing: border-box;
18
+ display: block;
19
+ min-height: var(--ds-unit);
20
+ padding-top: calc(4px * var(--ds-sf));
21
+ padding-inline-start: calc(var(--toc-depth, 0) * var(--ds-unit));
22
+ color: var(--ds-toc-color, var(--ds-text-color-muted));
23
+ font: inherit;
24
+ line-height: var(--ds-type-lineheight-default);
25
+ letter-spacing: inherit;
26
+ text-decoration: none;
27
+ white-space: nowrap;
28
+ overflow: hidden;
29
+ text-overflow: clip;
30
+ }
31
+ /* A cut label fades over its last square, never an ellipsis (0-face/cut-fade.ts marks it). */
32
+ a[data-cut="end"], ::slotted(a[data-cut="end"]) {
33
+ mask-image: linear-gradient(to right, #000 calc(100% - var(--ds-unit)), transparent);
34
+ }
35
+ :host(:dir(rtl)) a[data-cut="end"], :host(:dir(rtl)) ::slotted(a[data-cut="end"]) {
36
+ mask-image: linear-gradient(to left, #000 calc(100% - var(--ds-unit)), transparent);
37
+ }
38
+ a:hover, ::slotted(a:hover) { color: var(--ds-text-color); text-decoration: underline; }
39
+ a[aria-current], ::slotted(a[aria-current]) { color: var(--ds-toc-current-color, var(--ds-sharp-blue)); }
40
+ a:focus-visible, ::slotted(a:focus-visible) { outline: 1px solid var(--ds-focus-ring); outline-offset: 1px; }
@@ -12,6 +12,8 @@
12
12
  height: var(--ds-row-height);
13
13
  }
14
14
 
15
+ :host([hidden]) { display: none !important; }
16
+
15
17
  :host([wrap]) {
16
18
  flex-wrap: wrap;
17
19
  height: auto;
@@ -42,3 +44,96 @@
42
44
  --ds-button-background: var(--ds-button-background-color-primary);
43
45
  --ds-button-color: var(--ds-button-text-color-on-accent);
44
46
  }
47
+
48
+ /*
49
+ * Text tabs (`text`): the words alone, no fill in any state, the current one
50
+ * in the ink and the others muted until the pointer is over them. The tabs
51
+ * stay 4px apart, as every tab run, each with its 4px of padding, so the words
52
+ * stand twelve apart; the run is drawn 4px back so the first word starts on
53
+ * the column's edge, as a heading would.
54
+ */
55
+ :host([text]) {
56
+ /* Important: a page's `* { margin: 0 }` reset (Tailwind's preflight, say)
57
+ reaches the host from outside and would set the first word 4px in. */
58
+ margin-inline-start: calc(-4px * var(--ds-sf)) !important;
59
+ }
60
+
61
+ :host([text]) ::slotted(ds-button),
62
+ :host([text]) ::slotted(ds-button:hover),
63
+ :host([text]) ::slotted(ds-button[active]) {
64
+ --ds-button-background: transparent;
65
+ }
66
+
67
+ :host([text]) ::slotted(ds-button) {
68
+ --ds-button-color: var(--ds-text-color-muted);
69
+ }
70
+
71
+ :host([text]) ::slotted(ds-button:hover),
72
+ :host([text]) ::slotted(ds-button[active]) {
73
+ --ds-button-color: var(--ds-text-color);
74
+ }
75
+
76
+ /*
77
+ * Split tabs (`split`): joined into one face a control high, as the split
78
+ * button draws it: a pixel of the paper between them, the run's outer corners
79
+ * rounded (each tab's `segment` place), the tabs muted on the secondary
80
+ * ground, the current one on the accent.
81
+ */
82
+ :host([split]) {
83
+ display: inline-flex;
84
+ align-items: stretch;
85
+ gap: 1px;
86
+ height: var(--ds-control-height);
87
+ vertical-align: bottom;
88
+ }
89
+
90
+ :host([split]) ::slotted(ds-button) {
91
+ --ds-button-height: var(--ds-control-height);
92
+ --ds-button-padding: 0 calc(5px * var(--ds-sf));
93
+ --ds-button-background: var(--ds-button-background-color-secondary);
94
+ --ds-button-color: var(--ds-text-color-muted);
95
+ }
96
+
97
+ :host([split]) ::slotted(ds-button:hover) {
98
+ --ds-button-background: var(--ds-button-background-color-secondary);
99
+ --ds-button-color: var(--ds-text-color);
100
+ }
101
+
102
+ :host([split]) ::slotted(ds-button[active]) {
103
+ --ds-button-background: var(--ds-accent-color);
104
+ --ds-button-color: var(--ds-button-text-color-on-accent);
105
+ }
106
+
107
+ /*
108
+ * Paper tabs (`paper`): a notebook's tabs hanging from a page's top edge.
109
+ * Each tab is a row high with its words on the sixteen, half a square of room
110
+ * at its sides, the tabs 4px apart, rounded at the top and square at the foot
111
+ * where they join the page (each tab's `paper` mark, which the run sets):
112
+ * the current one on the paper's colour in the ink, so it reads as part of
113
+ * the page below; the others on the quiet fill in the muted ink, lit under
114
+ * the pointer. The run stands at the page's edge; the page places it, over a
115
+ * header's band, say, so the tabs hang into it.
116
+ */
117
+ :host([paper]) {
118
+ align-items: flex-end;
119
+ height: var(--ds-row-height);
120
+ }
121
+
122
+ :host([paper]) ::slotted(ds-button) {
123
+ --ds-button-height: var(--ds-row-height);
124
+ --ds-button-padding: 0 calc(10px * var(--ds-sf));
125
+ --ds-button-background: var(--ds-button-background-color-secondary);
126
+ --ds-button-color: var(--ds-text-color-muted);
127
+ }
128
+
129
+ :host([paper]) ::slotted(ds-button:hover) {
130
+ --ds-button-background: var(--ds-fill-hover);
131
+ --ds-button-color: var(--ds-text-color);
132
+ }
133
+
134
+ :host([paper]) ::slotted(ds-button[active]),
135
+ :host([paper]) ::slotted(ds-button[active]:hover) {
136
+ /* The page's own colour: a product's --ds-background, else the paper's. */
137
+ --ds-button-background: var(--ds-background, var(--background, Canvas));
138
+ --ds-button-color: var(--ds-text-color);
139
+ }
@@ -1,3 +1,4 @@
1
+ import { define } from "../0-face/define";
1
2
  // ds-container.ts
2
3
  // Container component with responsive width constraints
3
4
 
@@ -19,7 +20,7 @@ export class Container extends LitElement {
19
20
  }
20
21
  }
21
22
 
22
- customElements.define("ds-container", Container);
23
+ define("ds-container", Container);
23
24
 
24
25
  declare global {
25
26
  interface HTMLElementTagNameMap {
@@ -7,6 +7,7 @@
7
7
  import { LitElement, html, nothing, unsafeCSS } from "lit";
8
8
  import { getText } from "../0-face/i18n";
9
9
  import { define } from "../0-face/define";
10
+ import { CutFades } from "../0-face/cut-fade";
10
11
  import metrics from "../1-root/component-metrics.css?inline";
11
12
  import documentSheet from "../1-root/document.css?inline";
12
13
  import documentRules from "../1-root/document.css?raw";
@@ -97,6 +98,8 @@ export class DocumentPage extends LitElement {
97
98
  };
98
99
 
99
100
  static styles = [unsafeCSS(metrics), unsafeCSS(documentSheet), unsafeCSS(styles)];
101
+ /** Words cut short fade over their last square, never an ellipsis: marks them `data-cut="end"` while they do not fit. */
102
+ protected readonly cuts = new CutFades(this, { selector: ".ds-document__toc-list a" });
100
103
 
101
104
  declare levels: string;
102
105
  declare label: string | undefined;
@@ -1,42 +1,78 @@
1
1
  // ds-footer.ts
2
- // A site footer: the brand, columns of links, the language and theme, and the
3
- // copyright. Drawn by 1-root/footer.css, the same classes a page without
2
+ // A site footer: the brand, columns of links or contact lines, round marks
3
+ // stacked at the row's end, the language and theme, the copyright and the
4
+ // policies under it. Drawn by 1-root/footer.css, the same classes a page without
4
5
  // scripts writes.
5
6
 
6
7
  import { LitElement, html, nothing, unsafeCSS } from "lit";
7
8
  import { getText } from "../0-face/i18n";
8
9
  import { define } from "../0-face/define";
10
+ import { CutFades } from "../0-face/cut-fade";
9
11
  import "../2-core/ds-cycle";
10
12
  import metrics from "../1-root/component-metrics.css?inline";
11
13
  import controls from "../1-root/controls.css?inline";
12
14
  import styles from "./styles/ds-footer.css?inline";
13
15
 
14
- /** A link in a footer column. */
16
+ /**
17
+ * A line in a footer column: a link, or, without `href`, words alone (an
18
+ * address, a registration number). In a column with words alone its links
19
+ * are underlined, so they can be told from the words around them.
20
+ */
15
21
  export interface FooterLink {
16
22
  /** The words: a translation key, or as written with the footer's `literal`. */
17
23
  label: string;
18
- href: string;
24
+ /** Where it leads. Without it the line is words alone. */
25
+ href?: string;
19
26
  /** Opens elsewhere: in a new tab, with no referrer. */
20
27
  external?: boolean;
21
28
  /** The page being read: `aria-current="page"`. */
22
29
  current?: boolean;
30
+ /**
31
+ * The link drawn as a mark, its label its accessible name: the icon file's
32
+ * address (`icons/instagram.svg`, as Sync 1's `icons` export copies it). A
33
+ * column's icon links stand first, in a row of their own, or stacked as
34
+ * round marks with the column's `icons: "stack"`.
35
+ */
36
+ icon?: string;
23
37
  }
24
38
 
25
- /** A footer column: a heading and its links. */
39
+ /** How a column's icon links stand: in a row first (`row`), or stacked as round marks (`stack`). */
40
+ export type FooterIcons = "row" | "stack";
41
+
42
+ /** A footer column: a heading and its lines. */
26
43
  export interface FooterColumn {
27
44
  heading?: string;
45
+ /** The heading as a link: where it leads. */
46
+ href?: string;
28
47
  links: FooterLink[];
48
+ /** The column's width in whole squares: eight by default. */
49
+ width?: number;
50
+ /**
51
+ * `stack` draws its icon links as round marks one control high, one a line,
52
+ * the column one square wide at the end of the row; the heading then names
53
+ * the marks for assistive technology. `row` (the default) stands them first,
54
+ * in a row of their own.
55
+ */
56
+ icons?: FooterIcons;
29
57
  }
30
58
 
31
59
  /** The settings a footer offers, each a `ds-cycle` of that type. */
32
- export type FooterPreference = "language" | "theme";
33
- const PREFERENCES: readonly FooterPreference[] = ["language", "theme"];
60
+ export type FooterPreference = "language" | "theme" | "shape";
61
+ const PREFERENCES: readonly FooterPreference[] = ["language", "theme", "shape"];
62
+ /** What an empty `preferences` offers: the shape only when it is named. */
63
+ const DEFAULT_PREFERENCES: readonly FooterPreference[] = ["language", "theme"];
64
+
65
+ /** A column's width in whole squares, from its `width`: eight when it is missing or not a positive number. */
66
+ export function footerColumnWidth(width: unknown): number {
67
+ const squares = Math.round(Number(width));
68
+ return Number.isFinite(squares) && squares >= 1 ? squares : 8;
69
+ }
34
70
 
35
- /** The preferences named by an attribute: every one when it is present but empty. */
71
+ /** The preferences named by an attribute: language and theme when it is present but empty. */
36
72
  export function footerPreferences(value: string | null | undefined): FooterPreference[] {
37
73
  if (value == null || value === "false") return [];
38
74
  const named = value.split(/[\s,]+/).filter(Boolean);
39
- if (!named.length || named.includes("true")) return [...PREFERENCES];
75
+ if (!named.length || named.includes("true")) return [...DEFAULT_PREFERENCES];
40
76
  return PREFERENCES.filter(name => named.includes(name));
41
77
  }
42
78
 
@@ -46,11 +82,14 @@ export function footerPreferences(value: string | null | undefined): FooterPrefe
46
82
  * the words as they stand with `literal`. The `brand` slot takes its place.
47
83
  * @prop {string} href - Where the brand links. `/` by default.
48
84
  * @prop {string} tagline - A line about the site under the brand.
49
- * @prop {FooterColumn[]} columns - The columns of links, eight squares each.
85
+ * @prop {FooterColumn[]} columns - The columns of links or lines, eight squares each
86
+ * unless a column names its `width`.
50
87
  * @prop {string} label - The columns' accessible name, as a navigation; without it they are plain lists.
51
88
  * @prop {string} owner - Who holds the copyright: the brand by default.
52
89
  * @prop {number} year - The copyright's year: this year by default.
53
- * @prop {string} preferences - `language`, `theme` or both, as `ds-cycle`
90
+ * @prop {FooterLink[]} policies - Links under the copyright (privacy, terms), each
91
+ * drawn as a secondary button.
92
+ * @prop {string} preferences - `language`, `theme`, `shape` or several, as `ds-cycle`
54
93
  * buttons at the end of the last row; present but empty, both.
55
94
  * @prop {boolean} literal - Show the words as written, never looked up.
56
95
  *
@@ -72,11 +111,14 @@ export class Footer extends LitElement {
72
111
  label: { type: String },
73
112
  owner: { type: String },
74
113
  year: { type: Number },
114
+ policies: { type: Array },
75
115
  preferences: { type: String },
76
116
  literal: { type: Boolean, reflect: true },
77
117
  };
78
118
 
79
119
  static styles = [unsafeCSS(metrics), unsafeCSS(controls), unsafeCSS(styles)];
120
+ /** Words cut short fade over their last square, never an ellipsis: marks them `data-cut="end"` while they do not fit. */
121
+ protected readonly cuts = new CutFades(this, { selector: ".ds-footer__links > li > *, .ds-footer__heading > a" });
80
122
 
81
123
  declare brand: string | undefined;
82
124
  declare href: string;
@@ -85,6 +127,7 @@ export class Footer extends LitElement {
85
127
  declare label: string | undefined;
86
128
  declare owner: string | undefined;
87
129
  declare year: number | undefined;
130
+ declare policies: FooterLink[];
88
131
  declare preferences: string | null | undefined;
89
132
  declare literal: boolean;
90
133
 
@@ -94,6 +137,7 @@ export class Footer extends LitElement {
94
137
  super();
95
138
  this.href = "/";
96
139
  this.columns = [];
140
+ this.policies = [];
97
141
  this.literal = false;
98
142
  }
99
143
 
@@ -118,9 +162,39 @@ export class Footer extends LitElement {
118
162
  return [...this.children].some(node => node.getAttribute("slot") === name);
119
163
  }
120
164
 
165
+ private iconLink(link: FooterLink) {
166
+ return html`<li><a href=${link.href} aria-label=${this.words(link.label)} aria-current=${link.current ? "page" : nothing}
167
+ target=${link.external ? "_blank" : nothing} rel=${link.external ? "noopener noreferrer" : nothing}><span class="ds-icon" aria-hidden="true" style=${`--ds-icon: url("${link.icon}")`}></span></a></li>`;
168
+ }
169
+
170
+ private anchor(link: FooterLink, className?: string) {
171
+ return html`<a class=${className ?? nothing} href=${link.href!} aria-current=${link.current ? "page" : nothing}
172
+ target=${link.external ? "_blank" : nothing} rel=${link.external ? "noopener noreferrer" : nothing}>${this.words(link.label)}</a>`;
173
+ }
174
+
121
175
  private link(link: FooterLink) {
122
- return html`<li><a href=${link.href} aria-current=${link.current ? "page" : nothing}
123
- target=${link.external ? "_blank" : nothing} rel=${link.external ? "noopener noreferrer" : nothing}>${this.words(link.label)}</a></li>`;
176
+ return html`<li>${link.href ? this.anchor(link) : html`<span>${this.words(link.label)}</span>`}</li>`;
177
+ }
178
+
179
+ private column(column: FooterColumn) {
180
+ const stack = column.icons === "stack";
181
+ const icons = column.links.filter(link => link.icon && link.href);
182
+ const lines = column.links.filter(link => !(link.icon && link.href));
183
+ const width = footerColumnWidth(column.width);
184
+ const heading = column.heading ? this.words(column.heading) : "";
185
+ if (stack) {
186
+ return html`<div class="ds-footer__column ds-footer__column--stack" part="column">
187
+ <ul class="ds-footer__icons" part="icons" aria-label=${heading || nothing}>${icons.map(link => this.iconLink(link))}</ul>
188
+ ${lines.length ? html`<ul class="ds-footer__links">${lines.map(link => this.link(link))}</ul>` : nothing}
189
+ </div>`;
190
+ }
191
+ return html`<div class="ds-footer__column" part="column" style=${width === 8 ? nothing : `--ds-footer-column-width: ${width}`}>
192
+ ${heading
193
+ ? html`<h2 class="ds-footer__heading" part="heading">${column.href ? html`<a href=${column.href}>${heading}</a>` : heading}</h2>`
194
+ : nothing}
195
+ ${icons.length ? html`<ul class="ds-footer__icons" part="icons">${icons.map(link => this.iconLink(link))}</ul>` : nothing}
196
+ <ul class="ds-footer__links">${lines.map(link => this.link(link))}</ul>
197
+ </div>`;
124
198
  }
125
199
 
126
200
  render() {
@@ -131,10 +205,8 @@ export class Footer extends LitElement {
131
205
  const year = Number.isFinite(this.year) ? this.year : new Date().getFullYear();
132
206
  const brandSlotted = this.slotted("brand");
133
207
  const hasBrand = brandSlotted || Boolean(this.brand) || Boolean(this.tagline);
134
- const list = columns.map(column => html`<div class="ds-footer__column" part="column">
135
- ${column.heading ? html`<h2 class="ds-footer__heading" part="heading">${this.words(column.heading)}</h2>` : nothing}
136
- <ul class="ds-footer__links">${column.links.map(link => this.link(link))}</ul>
137
- </div>`);
208
+ const policies = (Array.isArray(this.policies) ? this.policies : []).filter(link => link && link.href);
209
+ const list = columns.map(column => this.column(column));
138
210
  return html`<footer class="ds-footer" part="footer">
139
211
  <div class="ds-footer__brand" part="brand" ?hidden=${!hasBrand}>
140
212
  <slot name="brand" @slotchange=${this.relabel}>${this.brand ? html`<a class="ds-footer__mark" href=${this.href || "/"}>${this.words(this.brand)}</a>` : nothing}</slot>
@@ -147,8 +219,11 @@ export class Footer extends LitElement {
147
219
  : nothing}
148
220
  <div class="ds-footer__base" part="base">
149
221
  <p class="ds-footer__legal" part="legal"><slot name="legal" @slotchange=${this.relabel}>${owner ? `© ${year} ${owner}` : `© ${year}`}</slot></p>
222
+ ${policies.length
223
+ ? html`<ul class="ds-footer__policies" part="policies">${policies.map(link => html`<li>${this.anchor(link, "ds-button ds-button--secondary")}</li>`)}</ul>`
224
+ : nothing}
150
225
  <div class="ds-footer__preferences" part="preferences" ?hidden=${!hasPreferences}>
151
- ${preferences.map(type => html`<ds-cycle type=${type}></ds-cycle>`)}
226
+ ${preferences.map(type => html`<ds-cycle type=${type} label=${type === "shape" ? "Shape" : nothing}></ds-cycle>`)}
152
227
  <slot name="preferences" @slotchange=${this.relabel}></slot>
153
228
  </div>
154
229
  </div>
@@ -23,6 +23,7 @@ export const MENU_LABEL = "Menu";
23
23
  * @prop {string} href - Where the brand links. `/` by default.
24
24
  * @prop {string} label - The navigation's accessible name, when a page has more than one.
25
25
  * @prop {boolean} literal - Show `brand` as written, never looked up.
26
+ * @prop {"site" | "app"} variant - Site navigation or a compact app title bar.
26
27
  * @prop {boolean} sticky - Stay at the top of the page as it scrolls, on the paper.
27
28
  *
28
29
  * @slot - The navigation: `<a href>` links, one square high. The link to the
@@ -46,6 +47,7 @@ export const MENU_LABEL = "Menu";
46
47
  */
47
48
  export class Header extends LitElement {
48
49
  static properties = {
50
+ variant: { type: String, reflect: true },
49
51
  brand: { type: String },
50
52
  href: { type: String },
51
53
  label: { type: String },
@@ -55,6 +57,7 @@ export class Header extends LitElement {
55
57
 
56
58
  static styles = [unsafeCSS(metrics), unsafeCSS(controls), unsafeCSS(styles)];
57
59
 
60
+ declare variant: "site" | "app";
58
61
  declare brand: string | undefined;
59
62
  declare href: string;
60
63
  declare label: string | undefined;
@@ -66,6 +69,7 @@ export class Header extends LitElement {
66
69
 
67
70
  constructor() {
68
71
  super();
72
+ this.variant = "site";
69
73
  this.href = "/";
70
74
  this.literal = false;
71
75
  this.sticky = false;
@@ -146,7 +150,7 @@ export class Header extends LitElement {
146
150
  : this.brand
147
151
  ? html`<a class="ds-header__brand" part="brand" href=${this.href || "/"}>${this.words(this.brand)}</a>`
148
152
  : html`<slot name="brand" @slotchange=${this.relabel}></slot>`;
149
- return html`<header class="ds-header${this.sticky ? " ds-header--sticky" : ""}" part="header">
153
+ return html`<header class="ds-header${this.variant === "app" ? " ds-header--app" : ""}${this.sticky ? " ds-header--sticky" : ""}" part="header">
150
154
  ${brand}
151
155
  <nav class="ds-header__nav" part="nav" id="nav" aria-label=${this.label ? this.words(this.label) : nothing} ?hidden=${!hasNav}><slot @slotchange=${this.onNavChange}></slot></nav>
152
156
  <div class="ds-header__actions" part="actions" ?hidden=${!hasActions}><slot name="actions" @slotchange=${this.relabel}></slot></div>