@0001-labs/design-system-1 0.3.0-alpha.28 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (769) 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 +422 -0
  5. package/DS1/0-face/constraint-site.ts +200 -0
  6. package/DS1/0-face/constraints.ts +281 -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/feedback-overlays.ts +5 -3
  13. package/DS1/0-face/feedback.ts +3 -0
  14. package/DS1/0-face/focus-vision.swift +31 -0
  15. package/DS1/0-face/focus.ts +181 -0
  16. package/DS1/0-face/google-face-metrics.json +102 -0
  17. package/DS1/0-face/grid.ts +61 -4
  18. package/DS1/0-face/i18n.ts +36 -18
  19. package/DS1/0-face/layout-inspector.ts +124 -98
  20. package/DS1/0-face/preference-options.ts +4 -0
  21. package/DS1/0-face/scaling.ts +21 -3
  22. package/DS1/0-face/shape.ts +43 -0
  23. package/DS1/0-face/text-contrast.ts +164 -0
  24. package/DS1/0-face/theme-bootstrap.js +43 -0
  25. package/DS1/0-face/toast-queue.ts +7 -1
  26. package/DS1/0-face/translations/da.json +10 -1
  27. package/DS1/0-face/translations/de.json +10 -1
  28. package/DS1/0-face/translations/en.json +10 -1
  29. package/DS1/0-face/translations/es.json +10 -1
  30. package/DS1/0-face/translations/fi.json +10 -1
  31. package/DS1/0-face/translations/fr.json +10 -1
  32. package/DS1/0-face/translations/is.json +10 -1
  33. package/DS1/0-face/translations/it.json +10 -1
  34. package/DS1/0-face/translations/ja.json +10 -1
  35. package/DS1/0-face/translations/ko.json +10 -1
  36. package/DS1/0-face/translations/nb.json +10 -1
  37. package/DS1/0-face/translations/pt-BR.json +10 -1
  38. package/DS1/0-face/translations/pt.json +10 -1
  39. package/DS1/0-face/translations/sv.json +10 -1
  40. package/DS1/0-face/translations/zh.json +10 -1
  41. package/DS1/0-face/word-wrap.ts +113 -0
  42. package/DS1/1-root/card.css +47 -20
  43. package/DS1/1-root/carousel.css +7 -0
  44. package/DS1/1-root/cjk.css +1 -1
  45. package/DS1/1-root/component-tokens.css +3 -2
  46. package/DS1/1-root/context.css +44 -6
  47. package/DS1/1-root/controls.css +99 -8
  48. package/DS1/1-root/document.css +9 -1
  49. package/DS1/1-root/empty.css +46 -5
  50. package/DS1/1-root/figures.css +50 -3
  51. package/DS1/1-root/fonts.css +1 -1
  52. package/DS1/1-root/footer.css +147 -16
  53. package/DS1/1-root/foundation.ts +60 -0
  54. package/DS1/1-root/guide.css +35 -0
  55. package/DS1/1-root/header.css +30 -9
  56. package/DS1/1-root/material.css +67 -0
  57. package/DS1/1-root/notice.css +10 -2
  58. package/DS1/1-root/one.css +14 -7
  59. package/DS1/1-root/progress.css +9 -1
  60. package/DS1/1-root/row.css +68 -2
  61. package/DS1/1-root/table.css +47 -4
  62. package/DS1/1-root/text.css +26 -0
  63. package/DS1/2-core/button-split.ts +10 -5
  64. package/DS1/2-core/chart/chart.css +71 -2
  65. package/DS1/2-core/chart/grid-chart.ts +2 -1
  66. package/DS1/2-core/ds-activity.ts +32 -0
  67. package/DS1/2-core/ds-app-chrome.ts +1 -0
  68. package/DS1/2-core/ds-avatar.ts +35 -6
  69. package/DS1/2-core/ds-badge.ts +8 -1
  70. package/DS1/2-core/ds-button.ts +7 -1
  71. package/DS1/2-core/ds-chart.ts +184 -49
  72. package/DS1/2-core/ds-cycle.ts +27 -186
  73. package/DS1/2-core/ds-device-bezel.ts +1 -0
  74. package/DS1/2-core/ds-empty.ts +6 -4
  75. package/DS1/2-core/ds-input.ts +23 -3
  76. package/DS1/2-core/ds-message.ts +22 -0
  77. package/DS1/2-core/ds-number.ts +349 -0
  78. package/DS1/2-core/ds-progress.ts +3 -0
  79. package/DS1/2-core/ds-radio.ts +3 -0
  80. package/DS1/2-core/ds-stat.ts +3 -0
  81. package/DS1/2-core/ds-switch.ts +5 -1
  82. package/DS1/2-core/ds-tag.ts +9 -2
  83. package/DS1/2-core/ds-text.ts +7 -0
  84. package/DS1/2-core/ds-token.ts +3 -0
  85. package/DS1/2-core/ds-tooltip.ts +17 -2
  86. package/DS1/2-core/ds-window.ts +1 -0
  87. package/DS1/2-core/generated/ds-icon-map.ts +47 -5
  88. package/DS1/2-core/generated/icons-extra.ts +24 -3
  89. package/DS1/2-core/generated/icons-immediate.ts +3 -3
  90. package/DS1/2-core/number-expression.ts +64 -0
  91. package/DS1/2-core/styles/ds-activity.css +16 -0
  92. package/DS1/2-core/styles/ds-badge.css +4 -1
  93. package/DS1/2-core/styles/ds-button-host.css +45 -12
  94. package/DS1/2-core/styles/ds-button-split.css +8 -0
  95. package/DS1/2-core/styles/ds-button.css +92 -19
  96. package/DS1/2-core/styles/ds-card.css +6 -0
  97. package/DS1/2-core/styles/ds-checkbox.css +20 -8
  98. package/DS1/2-core/styles/ds-image.css +2 -1
  99. package/DS1/2-core/styles/ds-input.css +37 -4
  100. package/DS1/2-core/styles/ds-number.css +127 -0
  101. package/DS1/2-core/styles/ds-radio.css +4 -1
  102. package/DS1/2-core/styles/ds-switch.css +34 -4
  103. package/DS1/2-core/styles/ds-tag.css +32 -5
  104. package/DS1/2-core/styles/ds-text.css +13 -4
  105. package/DS1/2-core/styles/ds-token.css +4 -1
  106. package/DS1/2-core/styles/ds-tooltip.css +13 -7
  107. package/DS1/3-unit/calendar-base.ts +5 -2
  108. package/DS1/3-unit/ds-calendar.ts +711 -37
  109. package/DS1/3-unit/ds-carousel.ts +13 -1
  110. package/DS1/3-unit/ds-context.ts +40 -2
  111. package/DS1/3-unit/ds-form.ts +45 -10
  112. package/DS1/3-unit/ds-list.ts +31 -3
  113. package/DS1/3-unit/ds-matrix.ts +3 -0
  114. package/DS1/3-unit/ds-menu.ts +9 -5
  115. package/DS1/3-unit/ds-row.ts +17 -2
  116. package/DS1/3-unit/ds-select.ts +1 -1
  117. package/DS1/3-unit/ds-sidebar.ts +18 -3
  118. package/DS1/3-unit/ds-table-of-contents.ts +166 -0
  119. package/DS1/3-unit/ds-tabs.ts +40 -2
  120. package/DS1/3-unit/styles/ds-calendar.css +356 -42
  121. package/DS1/3-unit/styles/ds-context.css +38 -0
  122. package/DS1/3-unit/styles/ds-list.css +26 -1
  123. package/DS1/3-unit/styles/ds-matrix.css +4 -1
  124. package/DS1/3-unit/styles/ds-row.css +39 -0
  125. package/DS1/3-unit/styles/ds-select.css +22 -12
  126. package/DS1/3-unit/styles/ds-sidebar.css +16 -2
  127. package/DS1/3-unit/styles/ds-table-of-contents.css +40 -0
  128. package/DS1/3-unit/styles/ds-tabs.css +95 -0
  129. package/DS1/4-page/ds-document.ts +3 -0
  130. package/DS1/4-page/ds-footer.ts +93 -18
  131. package/DS1/4-page/ds-header.ts +5 -1
  132. package/DS1/4-page/ds-overlay.ts +8 -3
  133. package/DS1/4-page/ds-page.ts +22 -1
  134. package/DS1/4-page/email.ts +7 -4
  135. package/DS1/4-page/styles/ds-container.css +0 -1
  136. package/DS1/4-page/styles/ds-overlay.css +7 -0
  137. package/DS1/4-page/styles/ds-page.css +10 -0
  138. package/DS1/5-visual-kit/app-chrome.ts +129 -0
  139. package/DS1/5-visual-kit/bezels.ts +394 -0
  140. package/DS1/5-visual-kit/browser-icons.LICENSE +53 -0
  141. package/DS1/5-visual-kit/browser-icons.ts +47 -0
  142. package/DS1/5-visual-kit/browser-styles.ts +53 -0
  143. package/DS1/5-visual-kit/device-bezel.ts +55 -0
  144. package/DS1/5-visual-kit/instagram-frame.ts +15 -0
  145. package/DS1/5-visual-kit/instagram.ts +41 -0
  146. package/DS1/5-visual-kit/mobile-chrome.ts +25 -0
  147. package/DS1/5-visual-kit/native-icon-paths.ts +145 -0
  148. package/DS1/5-visual-kit/window.ts +22 -0
  149. package/DS1/components.ts +1 -0
  150. package/DS1/index.ts +14 -1
  151. package/DS1/react/choice.ts +4 -2
  152. package/DS1/react/context.ts +11 -6
  153. package/DS1/react/empty.ts +2 -2
  154. package/DS1/react/footer.ts +5 -5
  155. package/DS1/react/header.ts +1 -1
  156. package/DS1/react/message.ts +4 -2
  157. package/DS1/react/number.ts +53 -0
  158. package/DS1/react/sidebar.ts +4 -2
  159. package/DS1/react/table-of-contents.ts +28 -0
  160. package/DS1/x-flag/LICENSE.md +26 -0
  161. package/DS1/x-flag/ac.svg +1 -0
  162. package/DS1/x-flag/ad.svg +1 -0
  163. package/DS1/x-flag/ae.svg +1 -0
  164. package/DS1/x-flag/af.svg +1 -0
  165. package/DS1/x-flag/ag.svg +1 -0
  166. package/DS1/x-flag/ai.svg +1 -0
  167. package/DS1/x-flag/al.svg +1 -0
  168. package/DS1/x-flag/am.svg +1 -0
  169. package/DS1/x-flag/ao.svg +1 -0
  170. package/DS1/x-flag/aq.svg +1 -0
  171. package/DS1/x-flag/ar.svg +1 -0
  172. package/DS1/x-flag/as.svg +1 -0
  173. package/DS1/x-flag/at.svg +1 -0
  174. package/DS1/x-flag/au.svg +1 -0
  175. package/DS1/x-flag/aw.svg +1 -0
  176. package/DS1/x-flag/ax.svg +1 -0
  177. package/DS1/x-flag/az.svg +1 -0
  178. package/DS1/x-flag/ba.svg +1 -0
  179. package/DS1/x-flag/bb.svg +1 -0
  180. package/DS1/x-flag/bd.svg +1 -0
  181. package/DS1/x-flag/be.svg +1 -0
  182. package/DS1/x-flag/bf.svg +1 -0
  183. package/DS1/x-flag/bg.svg +1 -0
  184. package/DS1/x-flag/bh.svg +1 -0
  185. package/DS1/x-flag/bi.svg +1 -0
  186. package/DS1/x-flag/bj.svg +1 -0
  187. package/DS1/x-flag/bl.svg +1 -0
  188. package/DS1/x-flag/bm.svg +1 -0
  189. package/DS1/x-flag/bn.svg +1 -0
  190. package/DS1/x-flag/bo.svg +1 -0
  191. package/DS1/x-flag/bq-bo.svg +1 -0
  192. package/DS1/x-flag/bq-sa.svg +1 -0
  193. package/DS1/x-flag/bq-se.svg +1 -0
  194. package/DS1/x-flag/bq.svg +1 -0
  195. package/DS1/x-flag/br.svg +1 -0
  196. package/DS1/x-flag/bs.svg +1 -0
  197. package/DS1/x-flag/bt.svg +1 -0
  198. package/DS1/x-flag/bv.svg +1 -0
  199. package/DS1/x-flag/bw.svg +1 -0
  200. package/DS1/x-flag/by.svg +1 -0
  201. package/DS1/x-flag/bz.svg +1 -0
  202. package/DS1/x-flag/ca.svg +1 -0
  203. package/DS1/x-flag/cc.svg +1 -0
  204. package/DS1/x-flag/cd.svg +1 -0
  205. package/DS1/x-flag/cf.svg +1 -0
  206. package/DS1/x-flag/cg.svg +1 -0
  207. package/DS1/x-flag/ch.svg +1 -0
  208. package/DS1/x-flag/ci.svg +1 -0
  209. package/DS1/x-flag/ck.svg +1 -0
  210. package/DS1/x-flag/cl.svg +1 -0
  211. package/DS1/x-flag/cm.svg +1 -0
  212. package/DS1/x-flag/cn.svg +1 -0
  213. package/DS1/x-flag/co.svg +1 -0
  214. package/DS1/x-flag/cr.svg +1 -0
  215. package/DS1/x-flag/cu.svg +1 -0
  216. package/DS1/x-flag/cv.svg +1 -0
  217. package/DS1/x-flag/cw.svg +1 -0
  218. package/DS1/x-flag/cx.svg +1 -0
  219. package/DS1/x-flag/cy.svg +1 -0
  220. package/DS1/x-flag/cz.svg +1 -0
  221. package/DS1/x-flag/de.svg +1 -0
  222. package/DS1/x-flag/dj.svg +1 -0
  223. package/DS1/x-flag/dk.svg +1 -0
  224. package/DS1/x-flag/dm.svg +1 -0
  225. package/DS1/x-flag/do.svg +1 -0
  226. package/DS1/x-flag/dz.svg +1 -0
  227. package/DS1/x-flag/ec.svg +1 -0
  228. package/DS1/x-flag/ee.svg +1 -0
  229. package/DS1/x-flag/eg.svg +1 -0
  230. package/DS1/x-flag/eh.svg +1 -0
  231. package/DS1/x-flag/er.svg +1 -0
  232. package/DS1/x-flag/es-ct.svg +1 -0
  233. package/DS1/x-flag/es.svg +1 -0
  234. package/DS1/x-flag/et.svg +1 -0
  235. package/DS1/x-flag/eu.svg +1 -0
  236. package/DS1/x-flag/fi.svg +1 -0
  237. package/DS1/x-flag/fj.svg +1 -0
  238. package/DS1/x-flag/fk.svg +1 -0
  239. package/DS1/x-flag/fm.svg +1 -0
  240. package/DS1/x-flag/fo.svg +1 -0
  241. package/DS1/x-flag/fr.svg +1 -0
  242. package/DS1/x-flag/ga.svg +1 -0
  243. package/DS1/x-flag/gb-eng.svg +1 -0
  244. package/DS1/x-flag/gb-nir.svg +1 -0
  245. package/DS1/x-flag/gb-sct.svg +1 -0
  246. package/DS1/x-flag/gb-wls.svg +1 -0
  247. package/DS1/x-flag/gb.svg +1 -0
  248. package/DS1/x-flag/gd.svg +1 -0
  249. package/DS1/x-flag/ge.svg +1 -0
  250. package/DS1/x-flag/gf.svg +1 -0
  251. package/DS1/x-flag/gg.svg +1 -0
  252. package/DS1/x-flag/gh.svg +1 -0
  253. package/DS1/x-flag/gi.svg +1 -0
  254. package/DS1/x-flag/gl.svg +1 -0
  255. package/DS1/x-flag/gm.svg +1 -0
  256. package/DS1/x-flag/gn.svg +1 -0
  257. package/DS1/x-flag/gp.svg +1 -0
  258. package/DS1/x-flag/gq.svg +1 -0
  259. package/DS1/x-flag/gr.svg +1 -0
  260. package/DS1/x-flag/gs.svg +1 -0
  261. package/DS1/x-flag/gt.svg +1 -0
  262. package/DS1/x-flag/gu.svg +1 -0
  263. package/DS1/x-flag/gw.svg +1 -0
  264. package/DS1/x-flag/gy.svg +1 -0
  265. package/DS1/x-flag/hk.svg +1 -0
  266. package/DS1/x-flag/hm.svg +1 -0
  267. package/DS1/x-flag/hn.svg +1 -0
  268. package/DS1/x-flag/hr.svg +1 -0
  269. package/DS1/x-flag/ht.svg +1 -0
  270. package/DS1/x-flag/hu.svg +1 -0
  271. package/DS1/x-flag/ic.svg +1 -0
  272. package/DS1/x-flag/id.svg +1 -0
  273. package/DS1/x-flag/ie.svg +1 -0
  274. package/DS1/x-flag/il.svg +1 -0
  275. package/DS1/x-flag/im.svg +1 -0
  276. package/DS1/x-flag/in.svg +1 -0
  277. package/DS1/x-flag/io.svg +1 -0
  278. package/DS1/x-flag/iq.svg +1 -0
  279. package/DS1/x-flag/ir.svg +1 -0
  280. package/DS1/x-flag/is.svg +1 -0
  281. package/DS1/x-flag/it.svg +1 -0
  282. package/DS1/x-flag/je.svg +1 -0
  283. package/DS1/x-flag/jm.svg +1 -0
  284. package/DS1/x-flag/jo.svg +1 -0
  285. package/DS1/x-flag/jp.svg +1 -0
  286. package/DS1/x-flag/ke.svg +1 -0
  287. package/DS1/x-flag/kg.svg +1 -0
  288. package/DS1/x-flag/kh.svg +1 -0
  289. package/DS1/x-flag/ki.svg +1 -0
  290. package/DS1/x-flag/km.svg +1 -0
  291. package/DS1/x-flag/kn.svg +1 -0
  292. package/DS1/x-flag/kp.svg +1 -0
  293. package/DS1/x-flag/kr.svg +1 -0
  294. package/DS1/x-flag/kw.svg +1 -0
  295. package/DS1/x-flag/ky.svg +1 -0
  296. package/DS1/x-flag/kz.svg +1 -0
  297. package/DS1/x-flag/la.svg +1 -0
  298. package/DS1/x-flag/lb.svg +1 -0
  299. package/DS1/x-flag/lc.svg +1 -0
  300. package/DS1/x-flag/li.svg +1 -0
  301. package/DS1/x-flag/lk.svg +1 -0
  302. package/DS1/x-flag/lr.svg +1 -0
  303. package/DS1/x-flag/ls.svg +1 -0
  304. package/DS1/x-flag/lt.svg +1 -0
  305. package/DS1/x-flag/lu.svg +1 -0
  306. package/DS1/x-flag/lv.svg +1 -0
  307. package/DS1/x-flag/ly.svg +1 -0
  308. package/DS1/x-flag/ma.svg +1 -0
  309. package/DS1/x-flag/mc.svg +1 -0
  310. package/DS1/x-flag/md.svg +1 -0
  311. package/DS1/x-flag/me.svg +1 -0
  312. package/DS1/x-flag/mf.svg +1 -0
  313. package/DS1/x-flag/mg.svg +1 -0
  314. package/DS1/x-flag/mh.svg +1 -0
  315. package/DS1/x-flag/mk.svg +1 -0
  316. package/DS1/x-flag/ml.svg +1 -0
  317. package/DS1/x-flag/mm.svg +1 -0
  318. package/DS1/x-flag/mn.svg +1 -0
  319. package/DS1/x-flag/mo.svg +1 -0
  320. package/DS1/x-flag/mp.svg +1 -0
  321. package/DS1/x-flag/mq.svg +1 -0
  322. package/DS1/x-flag/mr.svg +1 -0
  323. package/DS1/x-flag/ms.svg +1 -0
  324. package/DS1/x-flag/mt.svg +1 -0
  325. package/DS1/x-flag/mu.svg +1 -0
  326. package/DS1/x-flag/mv.svg +1 -0
  327. package/DS1/x-flag/mw.svg +1 -0
  328. package/DS1/x-flag/mx.svg +1 -0
  329. package/DS1/x-flag/my.svg +1 -0
  330. package/DS1/x-flag/mz.svg +1 -0
  331. package/DS1/x-flag/na.svg +1 -0
  332. package/DS1/x-flag/nc.svg +1 -0
  333. package/DS1/x-flag/ne.svg +1 -0
  334. package/DS1/x-flag/nf.svg +1 -0
  335. package/DS1/x-flag/ng.svg +1 -0
  336. package/DS1/x-flag/ni.svg +1 -0
  337. package/DS1/x-flag/nl.svg +1 -0
  338. package/DS1/x-flag/no.svg +1 -0
  339. package/DS1/x-flag/np.svg +1 -0
  340. package/DS1/x-flag/nr.svg +1 -0
  341. package/DS1/x-flag/nu.svg +1 -0
  342. package/DS1/x-flag/nz.svg +1 -0
  343. package/DS1/x-flag/om.svg +1 -0
  344. package/DS1/x-flag/pa.svg +1 -0
  345. package/DS1/x-flag/pe.svg +1 -0
  346. package/DS1/x-flag/pf.svg +1 -0
  347. package/DS1/x-flag/pg.svg +1 -0
  348. package/DS1/x-flag/ph.svg +1 -0
  349. package/DS1/x-flag/pk.svg +1 -0
  350. package/DS1/x-flag/pl.svg +1 -0
  351. package/DS1/x-flag/pm.svg +1 -0
  352. package/DS1/x-flag/pn.svg +1 -0
  353. package/DS1/x-flag/pr.svg +1 -0
  354. package/DS1/x-flag/ps.svg +1 -0
  355. package/DS1/x-flag/pt.svg +1 -0
  356. package/DS1/x-flag/pw.svg +1 -0
  357. package/DS1/x-flag/py.svg +1 -0
  358. package/DS1/x-flag/qa.svg +1 -0
  359. package/DS1/x-flag/re.svg +1 -0
  360. package/DS1/x-flag/ro.svg +1 -0
  361. package/DS1/x-flag/rs.svg +1 -0
  362. package/DS1/x-flag/ru.svg +1 -0
  363. package/DS1/x-flag/rw.svg +1 -0
  364. package/DS1/x-flag/sa.svg +1 -0
  365. package/DS1/x-flag/sb.svg +1 -0
  366. package/DS1/x-flag/sc.svg +1 -0
  367. package/DS1/x-flag/sd.svg +1 -0
  368. package/DS1/x-flag/se.svg +1 -0
  369. package/DS1/x-flag/sg.svg +1 -0
  370. package/DS1/x-flag/sh.svg +1 -0
  371. package/DS1/x-flag/si.svg +1 -0
  372. package/DS1/x-flag/sj.svg +1 -0
  373. package/DS1/x-flag/sk.svg +1 -0
  374. package/DS1/x-flag/sl.svg +1 -0
  375. package/DS1/x-flag/sm.svg +1 -0
  376. package/DS1/x-flag/sn.svg +1 -0
  377. package/DS1/x-flag/so.svg +1 -0
  378. package/DS1/x-flag/sr.svg +1 -0
  379. package/DS1/x-flag/ss.svg +1 -0
  380. package/DS1/x-flag/st.svg +1 -0
  381. package/DS1/x-flag/sv.svg +1 -0
  382. package/DS1/x-flag/sx.svg +1 -0
  383. package/DS1/x-flag/sy.svg +1 -0
  384. package/DS1/x-flag/sz.svg +1 -0
  385. package/DS1/x-flag/ta.svg +1 -0
  386. package/DS1/x-flag/tc.svg +1 -0
  387. package/DS1/x-flag/td.svg +1 -0
  388. package/DS1/x-flag/tf.svg +1 -0
  389. package/DS1/x-flag/tg.svg +1 -0
  390. package/DS1/x-flag/th.svg +1 -0
  391. package/DS1/x-flag/tj.svg +1 -0
  392. package/DS1/x-flag/tk.svg +1 -0
  393. package/DS1/x-flag/tl.svg +1 -0
  394. package/DS1/x-flag/tm.svg +1 -0
  395. package/DS1/x-flag/tn.svg +1 -0
  396. package/DS1/x-flag/to.svg +1 -0
  397. package/DS1/x-flag/tr.svg +1 -0
  398. package/DS1/x-flag/tt.svg +1 -0
  399. package/DS1/x-flag/tv.svg +1 -0
  400. package/DS1/x-flag/tw.svg +1 -0
  401. package/DS1/x-flag/tz.svg +1 -0
  402. package/DS1/x-flag/ua.svg +1 -0
  403. package/DS1/x-flag/ug.svg +1 -0
  404. package/DS1/x-flag/um.svg +1 -0
  405. package/DS1/x-flag/us.svg +1 -0
  406. package/DS1/x-flag/uy.svg +1 -0
  407. package/DS1/x-flag/uz.svg +1 -0
  408. package/DS1/x-flag/va.svg +1 -0
  409. package/DS1/x-flag/vc.svg +1 -0
  410. package/DS1/x-flag/ve.svg +1 -0
  411. package/DS1/x-flag/vg.svg +1 -0
  412. package/DS1/x-flag/vi.svg +1 -0
  413. package/DS1/x-flag/vn.svg +1 -0
  414. package/DS1/x-flag/vu.svg +1 -0
  415. package/DS1/x-flag/wf.svg +1 -0
  416. package/DS1/x-flag/ws.svg +1 -0
  417. package/DS1/x-flag/xk.svg +1 -0
  418. package/DS1/x-flag/ye.svg +1 -0
  419. package/DS1/x-flag/yt.svg +1 -0
  420. package/DS1/x-flag/za.svg +1 -0
  421. package/DS1/x-flag/zm.svg +1 -0
  422. package/DS1/x-flag/zw.svg +1 -0
  423. package/DS1/x-icon/android.svg +9 -0
  424. package/DS1/x-icon/arrange-check.svg +1 -1
  425. package/DS1/x-icon/arrange-page.svg +1 -1
  426. package/DS1/x-icon/chrome.svg +7 -0
  427. package/DS1/x-icon/edge-brand.svg +6 -0
  428. package/DS1/x-icon/firefox.svg +4 -0
  429. package/DS1/x-icon/health.svg +3 -0
  430. package/DS1/x-icon/left.svg +2 -3
  431. package/DS1/x-icon/linux.svg +1 -0
  432. package/DS1/x-icon/material.svg +1 -0
  433. package/DS1/x-icon/milestone-planned.svg +3 -0
  434. package/DS1/x-icon/milestone.svg +3 -0
  435. package/DS1/x-icon/more.svg +1 -5
  436. package/DS1/x-icon/network.svg +3 -0
  437. package/DS1/x-icon/opera.svg +4 -0
  438. package/DS1/x-icon/prediction.svg +3 -0
  439. package/DS1/x-icon/priority-high.svg +3 -0
  440. package/DS1/x-icon/priority-low.svg +3 -0
  441. package/DS1/x-icon/priority-medium.svg +3 -0
  442. package/DS1/x-icon/project.svg +3 -0
  443. package/DS1/x-icon/redo.svg +2 -2
  444. package/DS1/x-icon/repeat-small.svg +3 -0
  445. package/DS1/x-icon/safari.svg +4 -0
  446. package/DS1/x-icon/scaling.svg +3 -0
  447. package/DS1/x-icon/tabs.svg +4 -0
  448. package/DS1/x-icon/windows.svg +5 -0
  449. package/README.md +3 -3
  450. package/dist/0-face/button-label.d.ts +5 -0
  451. package/dist/0-face/button-label.d.ts.map +1 -0
  452. package/dist/0-face/button-label.js +31 -0
  453. package/dist/0-face/calendar.d.ts +1 -1
  454. package/dist/0-face/calendar.d.ts.map +1 -1
  455. package/dist/0-face/calendar.js +6 -3
  456. package/dist/0-face/carousel.d.ts +9 -0
  457. package/dist/0-face/carousel.d.ts.map +1 -1
  458. package/dist/0-face/carousel.js +80 -0
  459. package/dist/0-face/constraint-panel.d.ts +43 -0
  460. package/dist/0-face/constraint-panel.d.ts.map +1 -0
  461. package/dist/0-face/constraint-panel.js +429 -0
  462. package/dist/0-face/constraint-site.d.ts +72 -0
  463. package/dist/0-face/constraint-site.d.ts.map +1 -0
  464. package/dist/0-face/constraint-site.js +185 -0
  465. package/dist/0-face/constraints.d.ts +47 -0
  466. package/dist/0-face/constraints.d.ts.map +1 -0
  467. package/dist/0-face/constraints.js +247 -0
  468. package/dist/0-face/copy-text.js +1 -1
  469. package/dist/0-face/cut-fade.d.ts +112 -0
  470. package/dist/0-face/cut-fade.d.ts.map +1 -0
  471. package/dist/0-face/cut-fade.js +274 -0
  472. package/dist/0-face/define.d.ts.map +1 -1
  473. package/dist/0-face/define.js +24 -3
  474. package/dist/0-face/face-correction.d.ts +51 -0
  475. package/dist/0-face/face-correction.d.ts.map +1 -0
  476. package/dist/0-face/face-correction.js +80 -0
  477. package/dist/0-face/failures.d.ts +16 -0
  478. package/dist/0-face/failures.d.ts.map +1 -0
  479. package/dist/0-face/failures.js +21 -0
  480. package/dist/0-face/feedback-overlays.d.ts.map +1 -1
  481. package/dist/0-face/feedback-overlays.js +5 -3
  482. package/dist/0-face/feedback.d.ts +2 -0
  483. package/dist/0-face/feedback.d.ts.map +1 -1
  484. package/dist/0-face/feedback.js +1 -0
  485. package/dist/0-face/focus.d.ts +71 -0
  486. package/dist/0-face/focus.d.ts.map +1 -0
  487. package/dist/0-face/focus.js +196 -0
  488. package/dist/0-face/grid.d.ts +11 -1
  489. package/dist/0-face/grid.d.ts.map +1 -1
  490. package/dist/0-face/grid.js +90 -4
  491. package/dist/0-face/i18n.d.ts.map +1 -1
  492. package/dist/0-face/i18n.js +38 -16
  493. package/dist/0-face/layout-inspector.d.ts +5 -1
  494. package/dist/0-face/layout-inspector.d.ts.map +1 -1
  495. package/dist/0-face/layout-inspector.js +130 -104
  496. package/dist/0-face/preference-options.d.ts +4 -0
  497. package/dist/0-face/preference-options.d.ts.map +1 -1
  498. package/dist/0-face/scaling.d.ts +8 -1
  499. package/dist/0-face/scaling.d.ts.map +1 -1
  500. package/dist/0-face/scaling.js +19 -2
  501. package/dist/0-face/shape.d.ts +35 -0
  502. package/dist/0-face/shape.d.ts.map +1 -0
  503. package/dist/0-face/shape.js +23 -0
  504. package/dist/0-face/text-contrast.d.ts +22 -0
  505. package/dist/0-face/text-contrast.d.ts.map +1 -0
  506. package/dist/0-face/text-contrast.js +178 -0
  507. package/dist/0-face/theme-bootstrap.js +56 -0
  508. package/dist/0-face/toast-queue.d.ts +4 -0
  509. package/dist/0-face/toast-queue.d.ts.map +1 -1
  510. package/dist/0-face/toast-queue.js +4 -1
  511. package/dist/0-face/translations/da.json +10 -1
  512. package/dist/0-face/translations/de.json +10 -1
  513. package/dist/0-face/translations/en.json +10 -1
  514. package/dist/0-face/translations/es.json +10 -1
  515. package/dist/0-face/translations/fi.json +10 -1
  516. package/dist/0-face/translations/fr.json +10 -1
  517. package/dist/0-face/translations/is.json +10 -1
  518. package/dist/0-face/translations/it.json +10 -1
  519. package/dist/0-face/translations/ja.json +10 -1
  520. package/dist/0-face/translations/ko.json +10 -1
  521. package/dist/0-face/translations/nb.json +10 -1
  522. package/dist/0-face/translations/pt-BR.json +10 -1
  523. package/dist/0-face/translations/pt.json +10 -1
  524. package/dist/0-face/translations/sv.json +10 -1
  525. package/dist/0-face/translations/zh.json +10 -1
  526. package/dist/0-face/word-wrap.d.ts +6 -0
  527. package/dist/0-face/word-wrap.d.ts.map +1 -0
  528. package/dist/0-face/word-wrap.js +119 -0
  529. package/dist/1-root/foundation.d.ts +12 -0
  530. package/dist/1-root/foundation.d.ts.map +1 -0
  531. package/dist/1-root/foundation.js +59 -0
  532. package/dist/2-core/button-split.d.ts +1 -0
  533. package/dist/2-core/button-split.d.ts.map +1 -1
  534. package/dist/2-core/button-split.js +9 -4
  535. package/dist/2-core/chart/grid-chart.d.ts +2 -0
  536. package/dist/2-core/chart/grid-chart.d.ts.map +1 -1
  537. package/dist/2-core/chart/grid-chart.js +2 -1
  538. package/dist/2-core/ds-activity.d.ts +25 -0
  539. package/dist/2-core/ds-activity.d.ts.map +1 -0
  540. package/dist/2-core/ds-activity.js +28 -0
  541. package/dist/2-core/ds-app-chrome.d.ts +2 -0
  542. package/dist/2-core/ds-app-chrome.d.ts.map +1 -0
  543. package/dist/2-core/ds-app-chrome.js +1 -0
  544. package/dist/2-core/ds-avatar.d.ts +7 -0
  545. package/dist/2-core/ds-avatar.d.ts.map +1 -1
  546. package/dist/2-core/ds-avatar.js +41 -6
  547. package/dist/2-core/ds-badge.d.ts +7 -1
  548. package/dist/2-core/ds-badge.d.ts.map +1 -1
  549. package/dist/2-core/ds-badge.js +8 -1
  550. package/dist/2-core/ds-button.d.ts +12 -0
  551. package/dist/2-core/ds-button.d.ts.map +1 -1
  552. package/dist/2-core/ds-button.js +4 -0
  553. package/dist/2-core/ds-chart.d.ts +28 -3
  554. package/dist/2-core/ds-chart.d.ts.map +1 -1
  555. package/dist/2-core/ds-chart.js +110 -130
  556. package/dist/2-core/ds-cycle.d.ts +2 -2
  557. package/dist/2-core/ds-cycle.d.ts.map +1 -1
  558. package/dist/2-core/ds-cycle.js +36 -171
  559. package/dist/2-core/ds-device-bezel.d.ts +2 -0
  560. package/dist/2-core/ds-device-bezel.d.ts.map +1 -0
  561. package/dist/2-core/ds-device-bezel.js +1 -0
  562. package/dist/2-core/ds-empty.d.ts +2 -2
  563. package/dist/2-core/ds-empty.d.ts.map +1 -1
  564. package/dist/2-core/ds-empty.js +6 -4
  565. package/dist/2-core/ds-input.d.ts +7 -0
  566. package/dist/2-core/ds-input.d.ts.map +1 -1
  567. package/dist/2-core/ds-input.js +23 -3
  568. package/dist/2-core/ds-message.d.ts +11 -0
  569. package/dist/2-core/ds-message.d.ts.map +1 -1
  570. package/dist/2-core/ds-message.js +18 -0
  571. package/dist/2-core/ds-number.d.ts +86 -0
  572. package/dist/2-core/ds-number.d.ts.map +1 -0
  573. package/dist/2-core/ds-number.js +326 -0
  574. package/dist/2-core/ds-progress.d.ts +3 -0
  575. package/dist/2-core/ds-progress.d.ts.map +1 -1
  576. package/dist/2-core/ds-progress.js +3 -0
  577. package/dist/2-core/ds-radio.d.ts +3 -0
  578. package/dist/2-core/ds-radio.d.ts.map +1 -1
  579. package/dist/2-core/ds-radio.js +10 -1
  580. package/dist/2-core/ds-stat.d.ts +3 -0
  581. package/dist/2-core/ds-stat.d.ts.map +1 -1
  582. package/dist/2-core/ds-stat.js +3 -0
  583. package/dist/2-core/ds-switch.d.ts +14 -1
  584. package/dist/2-core/ds-switch.d.ts.map +1 -1
  585. package/dist/2-core/ds-switch.js +3 -1
  586. package/dist/2-core/ds-tag.d.ts +8 -1
  587. package/dist/2-core/ds-tag.d.ts.map +1 -1
  588. package/dist/2-core/ds-tag.js +12 -2
  589. package/dist/2-core/ds-text.d.ts +7 -0
  590. package/dist/2-core/ds-text.d.ts.map +1 -1
  591. package/dist/2-core/ds-text.js +7 -0
  592. package/dist/2-core/ds-token.d.ts +3 -0
  593. package/dist/2-core/ds-token.d.ts.map +1 -1
  594. package/dist/2-core/ds-token.js +3 -0
  595. package/dist/2-core/ds-tooltip.d.ts.map +1 -1
  596. package/dist/2-core/ds-tooltip.js +23 -2
  597. package/dist/2-core/ds-window.d.ts +2 -0
  598. package/dist/2-core/ds-window.d.ts.map +1 -0
  599. package/dist/2-core/ds-window.js +1 -0
  600. package/dist/2-core/generated/ds-icon-map.d.ts +27 -6
  601. package/dist/2-core/generated/ds-icon-map.d.ts.map +1 -1
  602. package/dist/2-core/generated/ds-icon-map.js +47 -5
  603. package/dist/2-core/generated/icons-extra.d.ts.map +1 -1
  604. package/dist/2-core/generated/icons-extra.js +24 -3
  605. package/dist/2-core/generated/icons-immediate.d.ts +1 -1
  606. package/dist/2-core/generated/icons-immediate.d.ts.map +1 -1
  607. package/dist/2-core/generated/icons-immediate.js +3 -3
  608. package/dist/2-core/number-expression.d.ts +12 -0
  609. package/dist/2-core/number-expression.d.ts.map +1 -0
  610. package/dist/2-core/number-expression.js +82 -0
  611. package/dist/3-unit/calendar-base.d.ts +5 -0
  612. package/dist/3-unit/calendar-base.d.ts.map +1 -1
  613. package/dist/3-unit/calendar-base.js +3 -2
  614. package/dist/3-unit/ds-calendar.d.ts +197 -4
  615. package/dist/3-unit/ds-calendar.d.ts.map +1 -1
  616. package/dist/3-unit/ds-calendar.js +687 -45
  617. package/dist/3-unit/ds-carousel.d.ts +3 -0
  618. package/dist/3-unit/ds-carousel.d.ts.map +1 -1
  619. package/dist/3-unit/ds-carousel.js +13 -1
  620. package/dist/3-unit/ds-context.d.ts +18 -1
  621. package/dist/3-unit/ds-context.d.ts.map +1 -1
  622. package/dist/3-unit/ds-context.js +37 -1
  623. package/dist/3-unit/ds-form.d.ts +9 -0
  624. package/dist/3-unit/ds-form.d.ts.map +1 -1
  625. package/dist/3-unit/ds-form.js +50 -10
  626. package/dist/3-unit/ds-list.d.ts +20 -1
  627. package/dist/3-unit/ds-list.d.ts.map +1 -1
  628. package/dist/3-unit/ds-list.js +31 -3
  629. package/dist/3-unit/ds-matrix.d.ts +3 -0
  630. package/dist/3-unit/ds-matrix.d.ts.map +1 -1
  631. package/dist/3-unit/ds-matrix.js +3 -0
  632. package/dist/3-unit/ds-menu.d.ts.map +1 -1
  633. package/dist/3-unit/ds-menu.js +17 -1
  634. package/dist/3-unit/ds-row.d.ts +13 -0
  635. package/dist/3-unit/ds-row.d.ts.map +1 -1
  636. package/dist/3-unit/ds-row.js +15 -2
  637. package/dist/3-unit/ds-select.js +1 -1
  638. package/dist/3-unit/ds-sidebar.d.ts +17 -0
  639. package/dist/3-unit/ds-sidebar.d.ts.map +1 -1
  640. package/dist/3-unit/ds-sidebar.js +14 -3
  641. package/dist/3-unit/ds-table-of-contents.d.ts +68 -0
  642. package/dist/3-unit/ds-table-of-contents.d.ts.map +1 -0
  643. package/dist/3-unit/ds-table-of-contents.js +190 -0
  644. package/dist/3-unit/ds-tabs.d.ts +32 -1
  645. package/dist/3-unit/ds-tabs.d.ts.map +1 -1
  646. package/dist/3-unit/ds-tabs.js +39 -1
  647. package/dist/4-page/ds-document.d.ts +3 -0
  648. package/dist/4-page/ds-document.d.ts.map +1 -1
  649. package/dist/4-page/ds-document.js +3 -0
  650. package/dist/4-page/ds-footer.d.ts +47 -7
  651. package/dist/4-page/ds-footer.d.ts.map +1 -1
  652. package/dist/4-page/ds-footer.js +58 -14
  653. package/dist/4-page/ds-header.d.ts +6 -0
  654. package/dist/4-page/ds-header.d.ts.map +1 -1
  655. package/dist/4-page/ds-header.js +4 -1
  656. package/dist/4-page/ds-overlay.d.ts +2 -2
  657. package/dist/4-page/ds-overlay.d.ts.map +1 -1
  658. package/dist/4-page/ds-overlay.js +8 -3
  659. package/dist/4-page/ds-page.d.ts +12 -0
  660. package/dist/4-page/ds-page.d.ts.map +1 -1
  661. package/dist/4-page/ds-page.js +19 -1
  662. package/dist/4-page/email.d.ts +2 -0
  663. package/dist/4-page/email.d.ts.map +1 -1
  664. package/dist/4-page/email.js +5 -4
  665. package/dist/5-visual-kit/app-chrome.d.ts +98 -0
  666. package/dist/5-visual-kit/app-chrome.d.ts.map +1 -0
  667. package/dist/5-visual-kit/app-chrome.js +119 -0
  668. package/dist/5-visual-kit/bezels.d.ts +30 -0
  669. package/dist/5-visual-kit/bezels.d.ts.map +1 -0
  670. package/dist/5-visual-kit/bezels.js +388 -0
  671. package/dist/5-visual-kit/browser-icons.d.ts +5 -0
  672. package/dist/5-visual-kit/browser-icons.d.ts.map +1 -0
  673. package/dist/5-visual-kit/browser-icons.js +51 -0
  674. package/dist/5-visual-kit/browser-styles.d.ts +3 -0
  675. package/dist/5-visual-kit/browser-styles.d.ts.map +1 -0
  676. package/dist/5-visual-kit/browser-styles.js +52 -0
  677. package/dist/5-visual-kit/device-bezel.d.ts +84 -0
  678. package/dist/5-visual-kit/device-bezel.d.ts.map +1 -0
  679. package/dist/5-visual-kit/device-bezel.js +56 -0
  680. package/dist/5-visual-kit/instagram-frame.d.ts +8 -0
  681. package/dist/5-visual-kit/instagram-frame.d.ts.map +1 -0
  682. package/dist/5-visual-kit/instagram-frame.js +13 -0
  683. package/dist/5-visual-kit/instagram.d.ts +18 -0
  684. package/dist/5-visual-kit/instagram.d.ts.map +1 -0
  685. package/dist/5-visual-kit/instagram.js +39 -0
  686. package/dist/5-visual-kit/mobile-chrome.d.ts +4 -0
  687. package/dist/5-visual-kit/mobile-chrome.d.ts.map +1 -0
  688. package/dist/5-visual-kit/mobile-chrome.js +24 -0
  689. package/dist/5-visual-kit/native-icon-paths.d.ts +146 -0
  690. package/dist/5-visual-kit/native-icon-paths.d.ts.map +1 -0
  691. package/dist/5-visual-kit/native-icon-paths.js +145 -0
  692. package/dist/5-visual-kit/window.d.ts +51 -0
  693. package/dist/5-visual-kit/window.d.ts.map +1 -0
  694. package/dist/5-visual-kit/window.js +20 -0
  695. package/dist/browser-icons-BFbS1tIx.js +56 -0
  696. package/dist/browser-icons-BFbS1tIx.js.map +1 -0
  697. package/dist/browser-icons-CT8qU77Z.js +48 -0
  698. package/dist/browser-icons-CT8qU77Z.js.map +1 -0
  699. package/dist/components.d.ts +1 -0
  700. package/dist/components.d.ts.map +1 -1
  701. package/dist/components.js +1 -0
  702. package/dist/design-system-1.bundle.js +5514 -2077
  703. package/dist/design-system-1.bundle.js.map +1 -1
  704. package/dist/design-system-1.bundle.min.js +7026 -4628
  705. package/dist/design-system-1.bundle.min.js.map +1 -1
  706. package/dist/design-system-1.css +1 -1
  707. package/dist/feedback.js +197 -167
  708. package/dist/feedback.js.map +1 -1
  709. package/dist/{icons-extra-CRxxWFjX.js → icons-extra-BMPvmQPI.js} +25 -4
  710. package/dist/icons-extra-BMPvmQPI.js.map +1 -0
  711. package/dist/{icons-extra-H5pqCM_R.js → icons-extra-BfYOw-cR.js} +83 -5
  712. package/dist/icons-extra-BfYOw-cR.js.map +1 -0
  713. package/dist/index.d.ts +12 -1
  714. package/dist/index.d.ts.map +1 -1
  715. package/dist/index.js +11 -1
  716. package/dist/instagram-CKofs55A.js +50 -0
  717. package/dist/instagram-CKofs55A.js.map +1 -0
  718. package/dist/instagram-CcYf5oiM.js +48 -0
  719. package/dist/instagram-CcYf5oiM.js.map +1 -0
  720. package/dist/lit-Ce_uWYM4.js +612 -0
  721. package/dist/lit-Ce_uWYM4.js.map +1 -0
  722. package/dist/lit-DGUVm1Ce.js +557 -0
  723. package/dist/lit-DGUVm1Ce.js.map +1 -0
  724. package/dist/native-icon-paths-CB9evXBM.js +93 -0
  725. package/dist/native-icon-paths-CB9evXBM.js.map +1 -0
  726. package/dist/native-icon-paths-zay-3g_n.js +150 -0
  727. package/dist/native-icon-paths-zay-3g_n.js.map +1 -0
  728. package/dist/react/avatar.d.ts +1 -1
  729. package/dist/react/choice.d.ts +4 -0
  730. package/dist/react/choice.d.ts.map +1 -1
  731. package/dist/react/choice.js +2 -2
  732. package/dist/react/context.d.ts +19 -4
  733. package/dist/react/context.d.ts.map +1 -1
  734. package/dist/react/context.js +4 -4
  735. package/dist/react/empty.d.ts +2 -2
  736. package/dist/react/empty.d.ts.map +1 -1
  737. package/dist/react/empty.js +1 -1
  738. package/dist/react/footer.d.ts +5 -5
  739. package/dist/react/footer.d.ts.map +1 -1
  740. package/dist/react/footer.js +2 -2
  741. package/dist/react/header.d.ts +2 -2
  742. package/dist/react/header.d.ts.map +1 -1
  743. package/dist/react/message.d.ts +4 -0
  744. package/dist/react/message.d.ts.map +1 -1
  745. package/dist/react/message.js +2 -2
  746. package/dist/react/number.d.ts +53 -0
  747. package/dist/react/number.d.ts.map +1 -0
  748. package/dist/react/number.js +25 -0
  749. package/dist/react/page.d.ts +1 -1
  750. package/dist/react/sidebar.d.ts +4 -0
  751. package/dist/react/sidebar.d.ts.map +1 -1
  752. package/dist/react/sidebar.js +2 -2
  753. package/dist/react/table-of-contents.d.ts +19 -0
  754. package/dist/react/table-of-contents.d.ts.map +1 -0
  755. package/dist/react/table-of-contents.js +28 -0
  756. package/dist/{shared-words-CdMDVtXx.js → shared-words-C5cjxMjZ.js} +151 -16
  757. package/dist/shared-words-C5cjxMjZ.js.map +1 -0
  758. package/dist/{shared-words-BtRee8xR.js → shared-words-Cdm7xd-_.js} +163 -28
  759. package/dist/shared-words-Cdm7xd-_.js.map +1 -0
  760. package/package.json +23 -12
  761. package/DS1/3-unit/ds-calendar-large.ts +0 -353
  762. package/DS1/3-unit/styles/ds-calendar-large.css +0 -178
  763. package/dist/3-unit/ds-calendar-large.d.ts +0 -142
  764. package/dist/3-unit/ds-calendar-large.d.ts.map +0 -1
  765. package/dist/3-unit/ds-calendar-large.js +0 -308
  766. package/dist/icons-extra-CRxxWFjX.js.map +0 -1
  767. package/dist/icons-extra-H5pqCM_R.js.map +0 -1
  768. package/dist/shared-words-BtRee8xR.js.map +0 -1
  769. package/dist/shared-words-CdMDVtXx.js.map +0 -1
@@ -0,0 +1,274 @@
1
+ /**
2
+ * Cut words fade, never an ellipsis. Wherever Design system 1 cuts words that do
3
+ * not fit (a row's name, a tag, a menu entry, a calendar's title), they fade out
4
+ * over their last square (`var(--ds-unit)`), a mask on the words, so they fade
5
+ * into whatever is behind them. Words that fit stay crisp: the fade is drawn
6
+ * only while an element is marked `data-cut="end"`, and this module is what
7
+ * measures and marks it.
8
+ *
9
+ * Every stylesheet writes the fade the same way: the element clips
10
+ * (`text-overflow: clip`), and only under `[data-cut="end"]` takes
11
+ * `mask-image: linear-gradient(to right, #000 calc(100% - var(--ds-unit)), transparent)`,
12
+ * the gradient running to the left in a right-to-left page.
13
+ *
14
+ * - `watchCuts()` is the watcher a component owns: it marks the elements it
15
+ * watches while `scrollWidth > clientWidth + 1`, measures again when they
16
+ * resize, when `measure()` is called (after a render, since words can change
17
+ * without the box resizing), once the page's fonts have loaded and, with
18
+ * `text: true`, when the words inside them change. `disconnect()` lets go.
19
+ * - Every watcher measures in the next frame, together with every other one:
20
+ * all widths are read, then all marks written, so a page building a few
21
+ * hundred words lays itself out once for them rather than once each. Read
22
+ * one by one, after each element connected or updated, the words of Ezo's
23
+ * landing page laid it out again two hundred times, over half a second.
24
+ * Elements that resize are measured the same way, in one pass for all.
25
+ * - `CutFades` is the same watcher as a Lit reactive controller: it starts when
26
+ * its element connects, measures after every update and stops when it
27
+ * disconnects.
28
+ * - `startCutFades()` is for a page without Lit: it marks DS1's native classes
29
+ * (`.ds-row__name`, `.ds-sidebar__label`, `.ds-menu__item`, …) in the page,
30
+ * and keeps marking them as the page changes. It returns a function that
31
+ * stops it.
32
+ */
33
+ /** The attribute a cut element carries: `data-cut="end"`. */
34
+ export const CUT_ATTRIBUTE = "data-cut";
35
+ /**
36
+ * The native classes DS1's stylesheets fade when they are marked cut, for
37
+ * `startCutFades()` on a page without Lit.
38
+ */
39
+ export const CUT_FADE_SELECTOR = [
40
+ ".ds-row__name",
41
+ ".ds-sidebar__label",
42
+ ".ds-menu__item",
43
+ ".ds-badge__label",
44
+ ".ds-notice__title",
45
+ ".ds-notice__text",
46
+ ".ds-progress__label",
47
+ ".ds-stat__figure",
48
+ ".ds-document__toc-list a",
49
+ ".ds-footer__links a",
50
+ ".item-text",
51
+ ].join(", ");
52
+ /** Whether an element's words are wider than its box. */
53
+ export function isCut(element) {
54
+ return element.scrollWidth > element.clientWidth + 1;
55
+ }
56
+ /** Marks an element `data-cut="end"` while its words do not fit, and takes the mark off when they do. Returns whether it is cut. */
57
+ export function markCut(element) {
58
+ const cut = isCut(element);
59
+ const mark = element.getAttribute(CUT_ATTRIBUTE);
60
+ if (cut) {
61
+ if (mark !== "end")
62
+ element.setAttribute(CUT_ATTRIBUTE, "end");
63
+ }
64
+ else if (mark === "end")
65
+ element.removeAttribute(CUT_ATTRIBUTE);
66
+ return cut;
67
+ }
68
+ /** Reads every element's widths first, then writes every mark, so the page is laid out once for all of them. */
69
+ function markAll(elements) {
70
+ const cuts = [];
71
+ for (const element of elements)
72
+ if (element.isConnected)
73
+ cuts.push([element, isCut(element)]);
74
+ hookFonts();
75
+ for (const [element, cut] of cuts) {
76
+ const mark = element.getAttribute(CUT_ATTRIBUTE);
77
+ if (cut) {
78
+ if (mark !== "end")
79
+ element.setAttribute(CUT_ATTRIBUTE, "end");
80
+ }
81
+ else if (mark === "end")
82
+ element.removeAttribute(CUT_ATTRIBUTE);
83
+ }
84
+ }
85
+ const live = new Set();
86
+ const queued = new Set();
87
+ let frame = false;
88
+ const nextFrame = (run) => {
89
+ if (typeof requestAnimationFrame === "function")
90
+ requestAnimationFrame(run);
91
+ else
92
+ setTimeout(run, 0);
93
+ };
94
+ function flush() {
95
+ frame = false;
96
+ const watchers = [...queued];
97
+ queued.clear();
98
+ const elements = new Set();
99
+ for (const watcher of watchers) {
100
+ if (watcher.stopped)
101
+ continue;
102
+ for (const element of watcher.refresh())
103
+ elements.add(element);
104
+ }
105
+ markAll(elements);
106
+ }
107
+ /** Measures this watcher in the next frame, with every other watcher waiting for it. */
108
+ function schedule(watcher) {
109
+ if (watcher.stopped)
110
+ return;
111
+ queued.add(watcher);
112
+ if (frame)
113
+ return;
114
+ frame = true;
115
+ nextFrame(flush);
116
+ }
117
+ // One observer for every watched element: the sizes of a frame arrive in one
118
+ // call, read in one pass. An element two watchers hold (a row's name, which the
119
+ // row and its ds-text both watch) is let go when the last one does.
120
+ let sizes;
121
+ const holders = new Map();
122
+ function observe(element) {
123
+ if (typeof ResizeObserver === "undefined")
124
+ return;
125
+ sizes ?? (sizes = new ResizeObserver(entries => markAll(entries.map(entry => entry.target))));
126
+ const held = holders.get(element) ?? 0;
127
+ if (!held)
128
+ sizes.observe(element);
129
+ holders.set(element, held + 1);
130
+ }
131
+ function unobserve(element) {
132
+ const held = holders.get(element);
133
+ if (!held)
134
+ return;
135
+ if (held > 1) {
136
+ holders.set(element, held - 1);
137
+ return;
138
+ }
139
+ holders.delete(element);
140
+ sizes?.unobserve(element);
141
+ }
142
+ // Words drawn in a fallback face are narrower or wider once the page's fonts
143
+ // arrive. Asking for `document.fonts.ready` lays out a page that has changed,
144
+ // so it is asked once, while a measure has just laid the page out anyway.
145
+ let fontsHooked = false;
146
+ function hookFonts() {
147
+ if (fontsHooked || typeof document === "undefined")
148
+ return;
149
+ fontsHooked = true;
150
+ const again = () => { for (const watcher of live)
151
+ schedule(watcher); };
152
+ const fonts = document.fonts;
153
+ fonts?.ready?.then(again, () => { });
154
+ fonts?.addEventListener?.("loadingdone", again);
155
+ }
156
+ /** A watcher that marks the elements it watches `data-cut="end"` while their words do not fit. */
157
+ export function watchCuts(options = {}) {
158
+ const sources = [];
159
+ let watched = new Set();
160
+ const words = options.text && typeof MutationObserver !== "undefined"
161
+ ? new MutationObserver(() => schedule(self))
162
+ : undefined;
163
+ const collect = () => {
164
+ const found = new Set();
165
+ for (const source of sources) {
166
+ const elements = typeof source === "function" ? source() : source instanceof Element ? [source] : source;
167
+ for (const element of elements)
168
+ found.add(element);
169
+ }
170
+ return found;
171
+ };
172
+ const self = {
173
+ stopped: false,
174
+ refresh() {
175
+ const next = collect();
176
+ let changed = next.size !== watched.size;
177
+ for (const element of watched) {
178
+ if (!next.has(element)) {
179
+ unobserve(element);
180
+ changed = true;
181
+ }
182
+ }
183
+ for (const element of next) {
184
+ if (!watched.has(element)) {
185
+ observe(element);
186
+ changed = true;
187
+ }
188
+ }
189
+ // A MutationObserver cannot let one element go, so it starts again when the set changes.
190
+ if (words && changed) {
191
+ words.disconnect();
192
+ for (const element of next)
193
+ words.observe(element, { childList: true, characterData: true, subtree: true });
194
+ }
195
+ watched = next;
196
+ return watched;
197
+ },
198
+ };
199
+ live.add(self);
200
+ return {
201
+ watch(source) { sources.push(source); schedule(self); },
202
+ select(root, selector) { sources.push(() => root.querySelectorAll(selector)); schedule(self); },
203
+ measure() { schedule(self); },
204
+ disconnect() {
205
+ self.stopped = true;
206
+ live.delete(self);
207
+ queued.delete(self);
208
+ for (const element of watched)
209
+ unobserve(element);
210
+ words?.disconnect();
211
+ watched = new Set();
212
+ sources.length = 0;
213
+ },
214
+ };
215
+ }
216
+ /**
217
+ * The cut-words watcher as a Lit reactive controller:
218
+ * `protected readonly cuts = new CutFades(this, { selector: ".label" })`. It watches from
219
+ * when the element connects to when it disconnects, and measures after every
220
+ * update; call `measure()` when words change outside an update.
221
+ */
222
+ export class CutFades {
223
+ constructor(host, options) {
224
+ this.host = host;
225
+ this.options = options;
226
+ host.addController(this);
227
+ }
228
+ hostConnected() {
229
+ this.hostDisconnected();
230
+ const watcher = watchCuts();
231
+ const { selector, targets, text } = this.options;
232
+ if (selector)
233
+ watcher.watch(() => (this.host.renderRoot ?? this.host).querySelectorAll(selector));
234
+ if (targets)
235
+ watcher.watch(targets);
236
+ this.watcher = watcher;
237
+ // Words slotted into the element can change without an update or a resize.
238
+ if (text && typeof MutationObserver !== "undefined") {
239
+ this.words = new MutationObserver(() => this.measure());
240
+ this.words.observe(this.host, { childList: true, characterData: true, subtree: true });
241
+ }
242
+ }
243
+ hostUpdated() { this.measure(); }
244
+ hostDisconnected() {
245
+ this.words?.disconnect();
246
+ this.words = undefined;
247
+ this.watcher?.disconnect();
248
+ this.watcher = undefined;
249
+ }
250
+ /** Measures again, as after an update. */
251
+ measure() { this.watcher?.measure(); }
252
+ }
253
+ /**
254
+ * Marks DS1's native classes cut on a page without Lit, so their words fade
255
+ * where they are cut, and keeps marking them as the page changes. Returns a
256
+ * function that stops it.
257
+ *
258
+ * @example
259
+ * // A module script on the page, beside one.css and controls.css (Sync 1 `root` `"modules": ["cut-fade"]`):
260
+ * startCutFades();
261
+ */
262
+ export function startCutFades(root = document, selector = CUT_FADE_SELECTOR) {
263
+ const watcher = watchCuts();
264
+ watcher.select(root, selector);
265
+ // The page is marked as it starts, in one pass; its changes are measured in the frame after them.
266
+ markAll(root.querySelectorAll(selector));
267
+ const changes = typeof MutationObserver === "undefined" ? undefined : new MutationObserver(() => watcher.measure());
268
+ const node = root instanceof Document ? root.documentElement : root;
269
+ changes?.observe(node, { childList: true, characterData: true, subtree: true });
270
+ return () => {
271
+ changes?.disconnect();
272
+ watcher.disconnect();
273
+ };
274
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../DS1/0-face/define.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAG5E"}
1
+ {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../DS1/0-face/define.ts"],"names":[],"mappings":"AASA,gFAAgF;AAChF,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAsB5E"}
@@ -1,7 +1,28 @@
1
1
  /** Register a shared element once; a fresh page picks up changes during HMR. */
2
2
  export function define(name, element) {
3
- if (typeof customElements === "undefined")
3
+ if (typeof customElements === 'undefined' || customElements.get(name))
4
4
  return;
5
- if (!customElements.get(name))
6
- customElements.define(name, element);
5
+ const type = element;
6
+ const prototype = element.prototype;
7
+ const original = prototype.createRenderRoot;
8
+ if (original) {
9
+ const definingDocument = document;
10
+ prototype.createRenderRoot = function () {
11
+ var _a;
12
+ if (this.ownerDocument === definingDocument || !type.elementStyles?.length)
13
+ return original.call(this);
14
+ // Constructed sheets cannot cross documents. The exact finalized component
15
+ // styles can, as ordinary style nodes in the owning document's shadow root.
16
+ const root = this.shadowRoot ?? this.attachShadow(type.shadowRootOptions ?? { mode: 'open' });
17
+ for (const sheet of type.elementStyles) {
18
+ const style = this.ownerDocument.createElement('style');
19
+ style.textContent = sheet.cssText ?? Array.from(sheet.cssRules ?? [], rule => rule.cssText).join('\n');
20
+ root.append(style);
21
+ }
22
+ if (this.renderOptions)
23
+ (_a = this.renderOptions).renderBefore ?? (_a.renderBefore = root.firstChild);
24
+ return root;
25
+ };
26
+ }
27
+ customElements.define(name, element);
7
28
  }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * A face Design system 1 did not draw, set on the sixteen: its `@font-face` corrected once so that at 14px on a
3
+ * 16px line its capitals are 10px tall and its baseline stands 3px above the square's foot, as GT America's do
4
+ * (https://designsystem1.com/1-root/constraints/#a-face-you-add). Plain TypeScript with no imports, for the
5
+ * browser and for a build script alike.
6
+ *
7
+ * A face's metrics are fractions of its em: the ascent and descent the browser sets a line with and the height
8
+ * of its capitals (`readFaceMetrics` takes them from a TrueType or OpenType file). `google-face-metrics.json`
9
+ * beside this module holds them for the Google faces 0001's products offer; `scripts/face-metrics.mjs` measures
10
+ * more. Correct the face, never its words: no padding, `top` or transform in a component.
11
+ */
12
+ /** A face's vertical metrics, each over its em. */
13
+ export interface FaceMetrics {
14
+ ascent: number;
15
+ descent: number;
16
+ capHeight: number;
17
+ }
18
+ /** GT America's: capitals 0.71 of the em, and its ascent less its descent, which places the baseline in a line. */
19
+ export declare const SIXTEEN_FACE: {
20
+ readonly capHeight: 0.71;
21
+ readonly baseline: 0.742;
22
+ };
23
+ /** The four `@font-face` descriptors that put a face on the sixteen, as CSS values. */
24
+ export interface FaceDescriptors {
25
+ sizeAdjust: string;
26
+ ascentOverride: string;
27
+ descentOverride: string;
28
+ lineGapOverride: string;
29
+ }
30
+ /**
31
+ * The descriptors for a face: `size-adjust` makes its capitals 0.71 of the em, and the overrides make its ascent
32
+ * less its descent 0.742 while it keeps its own height of ascent and descent. `size-adjust` scales the overrides
33
+ * too, so they are given before it.
34
+ */
35
+ export declare function faceDescriptors({ ascent, descent, capHeight }: FaceMetrics): FaceDescriptors;
36
+ /** The descriptors as declarations for an `@font-face` rule. */
37
+ export declare function faceCorrection(metrics: FaceMetrics): string;
38
+ /**
39
+ * A stylesheet of `@font-face` rules (Google's css2 answer, say) with every face corrected in its own rule,
40
+ * without comments or spaces. A face with no metrics stops it: an uncorrected face would stand off the sixteen.
41
+ */
42
+ export declare function correctFaces(css: string, metrics: Readonly<Record<string, FaceMetrics>>): string;
43
+ /** Google's css2 stylesheet at `href`, read and corrected. css2 answers with woff2 to the browser asking. */
44
+ export declare function correctedGoogleFonts(href: string, metrics: Readonly<Record<string, FaceMetrics>>, init?: RequestInit): Promise<string>;
45
+ /**
46
+ * The metrics a browser sets a line of the face with, from its TrueType or OpenType file (not woff2): `hhea`'s
47
+ * ascent and descent, or `OS/2`'s typographic ones when the face asks for them (USE_TYPO_METRICS), and `OS/2`'s
48
+ * cap height, each over `head`'s units per em, to four places.
49
+ */
50
+ export declare function readFaceMetrics(file: Uint8Array): FaceMetrics;
51
+ //# sourceMappingURL=face-correction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"face-correction.d.ts","sourceRoot":"","sources":["../../DS1/0-face/face-correction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,mDAAmD;AACnD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,mHAAmH;AACnH,eAAO,MAAM,YAAY;;;CAAgD,CAAC;AAE1E,uFAAuF;AACvF,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,WAAW,GAAG,eAAe,CAW5F;AAED,gEAAgE;AAChE,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAG3D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,GAAG,MAAM,CAMhG;AAED,6GAA6G;AAC7G,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAI5I;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,CAiB7D"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * A face Design system 1 did not draw, set on the sixteen: its `@font-face` corrected once so that at 14px on a
3
+ * 16px line its capitals are 10px tall and its baseline stands 3px above the square's foot, as GT America's do
4
+ * (https://designsystem1.com/1-root/constraints/#a-face-you-add). Plain TypeScript with no imports, for the
5
+ * browser and for a build script alike.
6
+ *
7
+ * A face's metrics are fractions of its em: the ascent and descent the browser sets a line with and the height
8
+ * of its capitals (`readFaceMetrics` takes them from a TrueType or OpenType file). `google-face-metrics.json`
9
+ * beside this module holds them for the Google faces 0001's products offer; `scripts/face-metrics.mjs` measures
10
+ * more. Correct the face, never its words: no padding, `top` or transform in a component.
11
+ */
12
+ /** GT America's: capitals 0.71 of the em, and its ascent less its descent, which places the baseline in a line. */
13
+ export const SIXTEEN_FACE = { capHeight: 0.71, baseline: 0.742 };
14
+ /**
15
+ * The descriptors for a face: `size-adjust` makes its capitals 0.71 of the em, and the overrides make its ascent
16
+ * less its descent 0.742 while it keeps its own height of ascent and descent. `size-adjust` scales the overrides
17
+ * too, so they are given before it.
18
+ */
19
+ export function faceDescriptors({ ascent, descent, capHeight }) {
20
+ if (!(capHeight > 0) || !(ascent + descent > 0))
21
+ throw new Error('A face needs a cap height and a line height');
22
+ const size = SIXTEEN_FACE.capHeight / capHeight;
23
+ const height = Math.max((ascent + descent) * size, SIXTEEN_FACE.baseline);
24
+ const percent = (value) => `${+(value * 100).toFixed(2)}%`;
25
+ return {
26
+ sizeAdjust: percent(size),
27
+ ascentOverride: percent((height + SIXTEEN_FACE.baseline) / 2 / size),
28
+ descentOverride: percent((height - SIXTEEN_FACE.baseline) / 2 / size),
29
+ lineGapOverride: '0%',
30
+ };
31
+ }
32
+ /** The descriptors as declarations for an `@font-face` rule. */
33
+ export function faceCorrection(metrics) {
34
+ const { sizeAdjust, ascentOverride, descentOverride, lineGapOverride } = faceDescriptors(metrics);
35
+ return `size-adjust:${sizeAdjust};ascent-override:${ascentOverride};descent-override:${descentOverride};line-gap-override:${lineGapOverride}`;
36
+ }
37
+ /**
38
+ * A stylesheet of `@font-face` rules (Google's css2 answer, say) with every face corrected in its own rule,
39
+ * without comments or spaces. A face with no metrics stops it: an uncorrected face would stand off the sixteen.
40
+ */
41
+ export function correctFaces(css, metrics) {
42
+ return css.replace(/\/\*[\s\S]*?\*\//g, '').replace(/\s*([{};:,])\s*/g, '$1').trim().replace(/@font-face{([^}]*)}/g, (_, body) => {
43
+ const family = body.match(/font-family:(['"]?)([^;'"]+)\1(?:;|$)/)?.[2];
44
+ if (!family || !Object.hasOwn(metrics, family))
45
+ throw new Error(`No metrics for the face ${family ?? '(unnamed)'}`);
46
+ return `@font-face{${body}${body.endsWith(';') ? '' : ';'}${faceCorrection(metrics[family])}}`;
47
+ });
48
+ }
49
+ /** Google's css2 stylesheet at `href`, read and corrected. css2 answers with woff2 to the browser asking. */
50
+ export async function correctedGoogleFonts(href, metrics, init) {
51
+ const response = await fetch(href, init);
52
+ if (!response.ok)
53
+ throw new Error(`Google Fonts answered ${response.status} for ${href}`);
54
+ return correctFaces(await response.text(), metrics);
55
+ }
56
+ /**
57
+ * The metrics a browser sets a line of the face with, from its TrueType or OpenType file (not woff2): `hhea`'s
58
+ * ascent and descent, or `OS/2`'s typographic ones when the face asks for them (USE_TYPO_METRICS), and `OS/2`'s
59
+ * cap height, each over `head`'s units per em, to four places.
60
+ */
61
+ export function readFaceMetrics(file) {
62
+ const view = new DataView(file.buffer, file.byteOffset, file.byteLength);
63
+ const tables = new Map();
64
+ for (let i = 0, count = view.getUint16(4); i < count; i++) {
65
+ const at = 12 + i * 16;
66
+ tables.set(String.fromCharCode(...file.subarray(at, at + 4)), view.getUint32(at + 8));
67
+ }
68
+ const head = tables.get('head'), hhea = tables.get('hhea'), os2 = tables.get('OS/2');
69
+ if (head === undefined || hhea === undefined || os2 === undefined)
70
+ throw new Error('Not a TrueType or OpenType face');
71
+ const em = view.getUint16(head + 18);
72
+ const typo = (view.getUint16(os2 + 62) & 0x80) !== 0;
73
+ const ascent = typo ? view.getInt16(os2 + 68) : view.getInt16(hhea + 4);
74
+ const descent = -(typo ? view.getInt16(os2 + 70) : view.getInt16(hhea + 6));
75
+ const capHeight = view.getUint16(os2) >= 2 ? view.getInt16(os2 + 88) : 0;
76
+ if (!capHeight)
77
+ throw new Error('The face has no cap height in OS/2');
78
+ const fraction = (value) => Math.round((value / em) * 10000) / 10000;
79
+ return { ascent: fraction(ascent), descent: fraction(descent), capHeight: fraction(capHeight) };
80
+ }
@@ -0,0 +1,16 @@
1
+ /** A real operation failure, separate from validation, warnings and message colour.
2
+ * Applications subscribe to `ds-failure`; this module never sends network requests.
3
+ * Use an authored, stable code and summary, never user content or a server response.
4
+ */
5
+ export interface Failure {
6
+ code: string;
7
+ message: string;
8
+ /** Original caught error; only its stack frames enter the diagnostic. */
9
+ error?: unknown;
10
+ /** Captured at reporting time so startup handoff keeps the original call site. */
11
+ stack?: string;
12
+ }
13
+ export declare const FAILURE_EVENT = "ds-failure";
14
+ /** Report a failed operation. Safe during server rendering; no DOM text is read. */
15
+ export declare function reportFailure(failure: Failure): void;
16
+ //# sourceMappingURL=failures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failures.d.ts","sourceRoot":"","sources":["../../DS1/0-face/failures.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AACD,eAAO,MAAM,aAAa,eAAe,CAAC;AAI1C,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAcpD"}
@@ -0,0 +1,21 @@
1
+ export const FAILURE_EVENT = "ds-failure";
2
+ /** A bounded handoff for failures shown before the application reporter starts. */
3
+ const PENDING = Symbol.for("design-system-1.pending-failures");
4
+ /** Report a failed operation. Safe during server rendering; no DOM text is read. */
5
+ export function reportFailure(failure) {
6
+ if (typeof window === "undefined" || typeof failure?.code !== "string" || typeof failure.message !== "string" || !/^[a-z][a-z0-9_.-]{0,79}$/.test(failure.code) || !failure.message.trim())
7
+ return;
8
+ const source = failure.error instanceof Error ? failure.error : new Error();
9
+ const stack = (failure.stack ?? source.stack ?? "").split("\n")
10
+ .filter(line => /^\s*at\s/.test(line) || /@.*:\d+/.test(line))
11
+ .slice(0, 8).join("\n").trim().slice(0, 500);
12
+ const detail = { code: failure.code, message: failure.message.trim().slice(0, 200), ...(stack ? { stack } : {}) };
13
+ // A reporter acknowledges by preventing the default: queueing for later.
14
+ if (window.dispatchEvent(new CustomEvent(FAILURE_EVENT, { detail, cancelable: true }))) {
15
+ const scope = globalThis;
16
+ const pending = scope[PENDING] ?? (scope[PENDING] = []);
17
+ pending.push(detail);
18
+ if (pending.length > 20)
19
+ pending.shift();
20
+ }
21
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"feedback-overlays.d.ts","sourceRoot":"","sources":["../../DS1/0-face/feedback-overlays.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kHAAkH;IAClH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mHAAmH;IACnH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAsID,uFAAuF;AACvF,wBAAgB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAInE;AAED,qFAAqF;AACrF,wBAAgB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI1E;AAED,sFAAsF;AACtF,wBAAgB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQ9E"}
1
+ {"version":3,"file":"feedback-overlays.d.ts","sourceRoot":"","sources":["../../DS1/0-face/feedback-overlays.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kHAAkH;IAClH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mHAAmH;IACnH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAwID,uFAAuF;AACvF,wBAAgB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAInE;AAED,qFAAqF;AACrF,wBAAgB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI1E;AAED,sFAAsF;AACtF,wBAAgB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQ9E"}
@@ -3,7 +3,7 @@
3
3
  * `confirm()` and `prompt()`, for pages without Lit or any other framework.
4
4
  *
5
5
  * Each is drawn on the native `dialog.ds-overlay` frame from `1-root/controls.css`
6
- * (which the page loads) with its native buttons, `.ds-button--primary`,
6
+ * (which the page loads), as a sheet from the screen's foot on a phone, with its native buttons, `.ds-button--primary`,
7
7
  * `--secondary` and `--danger`, and opened with `showModal()`, so the browser
8
8
  * keeps the rest of the page inert behind it. Their words default to the
9
9
  * shared words (OK, Cancel) in the page's language where the page loads the
@@ -59,8 +59,10 @@ function show(spec) {
59
59
  return new Promise(resolve => {
60
60
  const id = `ds-feedback-${++count}`;
61
61
  const opener = focused();
62
+ // A sheet from the foot of a phone's screen, never a modal there (Joachim, 20 October 2026).
63
+ const phone = typeof matchMedia === "function" && matchMedia("(max-width: 768px)").matches;
62
64
  const dialog = element("dialog", {
63
- class: "ds-overlay",
65
+ class: phone ? "ds-overlay ds-overlay--sheet" : "ds-overlay",
64
66
  role: spec.kind === "prompt" ? "dialog" : "alertdialog",
65
67
  "aria-labelledby": `${id}-title`,
66
68
  "data-ds-feedback": spec.kind,
@@ -88,7 +90,7 @@ function show(spec) {
88
90
  }
89
91
  const footer = element("div", { "data-ds-overlay": "footer" });
90
92
  const cancel = spec.cancel === undefined ? undefined : element("button", { type: "button", class: "ds-button ds-button--secondary", value: "cancel" }, spec.cancel);
91
- const confirm = element("button", { type: "button", class: spec.danger ? "ds-button ds-button--secondary ds-button--danger" : "ds-button ds-button--primary", value: "confirm" }, spec.confirm);
93
+ const confirm = element("button", { type: "button", class: spec.danger ? "ds-button ds-button--danger" : "ds-button ds-button--primary", value: "confirm" }, spec.confirm);
92
94
  if (cancel)
93
95
  footer.appendChild(cancel);
94
96
  footer.appendChild(confirm);
@@ -38,4 +38,6 @@ export { copyText } from "./copy-text";
38
38
  export type { CopyTextOptions } from "./copy-text";
39
39
  export { setFeedbackWords } from "./feedback-words";
40
40
  export type { FeedbackWord, FeedbackWords } from "./feedback-words";
41
+ export { reportFailure, FAILURE_EVENT } from "./failures";
42
+ export type { Failure } from "./failures";
41
43
  //# sourceMappingURL=feedback.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../DS1/0-face/feedback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACjE,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACnI,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7D,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../DS1/0-face/feedback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACjE,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACnI,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7D,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEpE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1D,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC"}
@@ -33,3 +33,4 @@ export { configureToaster, pageToaster, toast } from "./toaster";
33
33
  export { alert, confirm, prompt } from "./feedback-overlays";
34
34
  export { copyText } from "./copy-text";
35
35
  export { setFeedbackWords } from "./feedback-words";
36
+ export { reportFailure, FAILURE_EVENT } from "./failures";
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Image focus: where a photo's subject is, so a picture cut to its box
3
+ * (`object-fit: cover`) keeps it in view instead of its middle. A person's
4
+ * face first, then whatever in the picture holds the most detail. Plain
5
+ * TypeScript with no imports, for the browser and for a build script alike.
6
+ *
7
+ * The focus is a point of the picture, across and down from 0 to 1, and it is
8
+ * written as the picture's `object-position` (`objectPosition()`), so a
9
+ * cover crop of any shape keeps that point in view. Work it out once, where
10
+ * the page is built, and write it into the markup, so the first paint is
11
+ * already cut right. On a Mac, `focus-vision.swift` finds the faces and the
12
+ * salient part with Apple's Vision framework, and `focusFromRegions()` turns
13
+ * them into the focus; elsewhere, or where it finds nothing, `focusOf()`
14
+ * reads the pixels:
15
+ *
16
+ * ```ts
17
+ * // swift 0-face/focus-vision.swift *.jpg > regions.json
18
+ * import { focusFromRegions, focusOf, objectPosition } from "./0-face/focus.ts";
19
+ * const focus = focusFromRegions(regions[name]) ?? focusOf(data, info.width, info.height, info.channels);
20
+ * // <img src="…" style="object-position: 50% 18%">
21
+ * ```
22
+ *
23
+ * A page with no build step marks a picture `data-ds-focus="auto"` and calls
24
+ * `startFocus()`: once the picture has loaded, its focus is found and kept in
25
+ * the browser, so it is right from the first paint on the next visit. A
26
+ * picture whose focus a person chose says so, `data-ds-focus="40% 20%"`, and
27
+ * is never measured. A picture from another host without CORS cannot be read
28
+ * and keeps its middle.
29
+ */
30
+ /** A point of a picture, across (`x`) and down (`y`), each from 0 to 1. */
31
+ export interface Focus {
32
+ x: number;
33
+ y: number;
34
+ }
35
+ export declare const CENTRE: Focus;
36
+ /** The width a picture is measured at; enough to find a face, and cheap. */
37
+ export declare const FOCUS_SAMPLE = 64;
38
+ /**
39
+ * The focus of a picture from its pixels (RGB or RGBA, row by row), measured
40
+ * small (about `FOCUS_SAMPLE` across). Skin that gathers into a face wins:
41
+ * the highest band of rows dense with skin, since a face stands above hands
42
+ * and arms. Without one, the centre of the picture's detail (where neighbouring
43
+ * pixels differ most), drawn a little towards the middle so a busy edge does
44
+ * not take the crop.
45
+ */
46
+ export declare function focusOf(pixels: ArrayLike<number>, width: number, height: number, channels?: number): Focus;
47
+ /** A part of a picture, as fractions of it from its top left corner. */
48
+ export interface Region {
49
+ x: number;
50
+ y: number;
51
+ w: number;
52
+ h: number;
53
+ }
54
+ /**
55
+ * The focus from what a detector found (`focus-vision.swift`: Apple's face
56
+ * detection and attention-based saliency), or `undefined` when it found
57
+ * nothing. Faces win: the point between them across, and down a little above
58
+ * the top of the highest, so a crop keeps the heads whole with room above
59
+ * them. Otherwise the middle of everything salient.
60
+ */
61
+ export declare function focusFromRegions(found: {
62
+ faces?: Region[];
63
+ salient?: Region[];
64
+ }): Focus | undefined;
65
+ /** The focus as CSS `object-position`, in whole percents. */
66
+ export declare function objectPosition(focus: Focus): string;
67
+ /** Finds and sets the focus of one picture marked `data-ds-focus="auto"`, once it has loaded. */
68
+ export declare function focusImage(image: HTMLImageElement): void;
69
+ /** Sets the focus of every picture marked `data-ds-focus` in `root`. */
70
+ export declare function startFocus(root?: ParentNode): void;
71
+ //# sourceMappingURL=focus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus.d.ts","sourceRoot":"","sources":["../../DS1/0-face/focus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,2EAA2E;AAC3E,MAAM,WAAW,KAAK;IAAG,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE;AAE/C,eAAO,MAAM,MAAM,EAAE,KAA0B,CAAC;AAEhD,4EAA4E;AAC5E,eAAO,MAAM,YAAY,KAAK,CAAC;AAY/B;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,KAAK,CAqDrG;AAED,wEAAwE;AACxE,MAAM,WAAW,MAAM;IAAG,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE;AAEtE;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,KAAK,GAAG,SAAS,CAkBnG;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAEnD;AAID,iGAAiG;AACjG,wBAAgB,UAAU,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CA0BxD;AAED,wEAAwE;AACxE,wBAAgB,UAAU,CAAC,IAAI,GAAE,UAAqB,GAAG,IAAI,CAE5D"}