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

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 (771) hide show
  1. package/DS1/0-face/calendar.ts +194 -0
  2. package/DS1/0-face/carousel.ts +623 -0
  3. package/DS1/0-face/component-visibility.ts +13 -0
  4. package/DS1/0-face/copy-text.ts +96 -0
  5. package/DS1/0-face/device.ts +8 -58
  6. package/DS1/0-face/dialog-swipe.ts +249 -0
  7. package/DS1/0-face/dialogs.ts +208 -0
  8. package/DS1/0-face/drawer.ts +258 -0
  9. package/DS1/0-face/feedback-words.ts +36 -0
  10. package/DS1/0-face/feedback.ts +40 -0
  11. package/DS1/0-face/format.ts +700 -0
  12. package/DS1/0-face/generated/toast-assets.ts +18 -0
  13. package/DS1/0-face/grid-fit.ts +1 -1
  14. package/DS1/0-face/grid.ts +3 -2
  15. package/DS1/0-face/header.ts +78 -0
  16. package/DS1/0-face/i18n.ts +93 -18
  17. package/DS1/0-face/keys.ts +276 -0
  18. package/DS1/0-face/languages.ts +4 -4
  19. package/DS1/0-face/layout-inspector.ts +6 -6
  20. package/DS1/0-face/library-styles.ts +33 -0
  21. package/DS1/0-face/load-toaster.ts +7 -0
  22. package/DS1/0-face/preference-options.ts +29 -0
  23. package/DS1/0-face/preferences.ts +3 -11
  24. package/DS1/0-face/pricing.ts +98 -43
  25. package/DS1/0-face/scaling.ts +160 -4
  26. package/DS1/0-face/shared-words.ts +9 -4
  27. package/DS1/0-face/sidebar.ts +201 -0
  28. package/DS1/0-face/theme-bootstrap.js +184 -0
  29. package/DS1/0-face/theme.ts +89 -47
  30. package/DS1/0-face/toast-queue.ts +157 -0
  31. package/DS1/0-face/toaster.ts +384 -0
  32. package/DS1/0-face/tooltips.ts +157 -15
  33. package/DS1/0-face/translations/da.json +60 -1
  34. package/DS1/0-face/translations/de.json +60 -1
  35. package/DS1/0-face/translations/en.json +60 -1
  36. package/DS1/0-face/translations/es.json +60 -1
  37. package/DS1/0-face/translations/fi.json +60 -1
  38. package/DS1/0-face/translations/fr.json +60 -1
  39. package/DS1/0-face/translations/is.json +60 -1
  40. package/DS1/0-face/translations/it.json +60 -1
  41. package/DS1/0-face/translations/ja.json +60 -1
  42. package/DS1/0-face/translations/ko.json +60 -1
  43. package/DS1/0-face/translations/nb.json +60 -1
  44. package/DS1/0-face/translations/pt-BR.json +60 -1
  45. package/DS1/0-face/translations/pt.json +60 -1
  46. package/DS1/0-face/translations/sv.json +60 -1
  47. package/DS1/0-face/translations/zh.json +60 -1
  48. package/DS1/0-face/translations-format.ts +3 -4
  49. package/DS1/1-root/card.css +192 -0
  50. package/DS1/1-root/carousel.css +136 -0
  51. package/DS1/1-root/cjk.css +23 -0
  52. package/DS1/1-root/component-metrics.css +1 -0
  53. package/DS1/1-root/component-tokens.css +51 -8
  54. package/DS1/1-root/controls.css +887 -14
  55. package/DS1/1-root/dialog-placement.css +191 -0
  56. package/DS1/1-root/document.css +183 -0
  57. package/DS1/1-root/drawer.css +83 -0
  58. package/DS1/1-root/empty.css +83 -0
  59. package/DS1/1-root/figures.css +141 -0
  60. package/DS1/1-root/fonts/Iosevka-LICENSE.md +3 -1
  61. package/DS1/1-root/fonts/Iosevka-Regular.woff2 +0 -0
  62. package/DS1/1-root/fonts.css +69 -0
  63. package/DS1/1-root/footer.css +186 -0
  64. package/DS1/1-root/header.css +165 -0
  65. package/DS1/1-root/kbd.css +46 -0
  66. package/DS1/1-root/library-tokens.ts +91 -0
  67. package/DS1/1-root/measures.ts +53 -0
  68. package/DS1/1-root/notice.css +165 -0
  69. package/DS1/1-root/one.css +14 -84
  70. package/DS1/1-root/one.semantic.css +200 -148
  71. package/DS1/1-root/palette.css +58 -0
  72. package/DS1/1-root/palette.ts +19 -0
  73. package/DS1/1-root/progress.css +356 -0
  74. package/DS1/1-root/prose.css +202 -0
  75. package/DS1/1-root/row.css +297 -0
  76. package/DS1/1-root/table.css +111 -0
  77. package/DS1/1-root/text.css +70 -0
  78. package/DS1/2-core/button-split.ts +55 -0
  79. package/DS1/2-core/chart/chart.css +169 -0
  80. package/DS1/2-core/chart/grid-chart.ts +554 -0
  81. package/DS1/2-core/ds-avatar.ts +25 -6
  82. package/DS1/2-core/ds-badge.ts +10 -10
  83. package/DS1/2-core/ds-button.ts +111 -26
  84. package/DS1/2-core/ds-card.ts +135 -105
  85. package/DS1/2-core/ds-chart.ts +327 -0
  86. package/DS1/2-core/ds-composer.ts +8 -2
  87. package/DS1/2-core/ds-cycle.ts +97 -21
  88. package/DS1/2-core/ds-empty.ts +120 -0
  89. package/DS1/2-core/ds-icon.ts +11 -2
  90. package/DS1/2-core/ds-input.ts +165 -6
  91. package/DS1/2-core/ds-kbd.ts +78 -0
  92. package/DS1/2-core/ds-loading.ts +72 -0
  93. package/DS1/2-core/ds-notice.ts +180 -0
  94. package/DS1/2-core/ds-progress.ts +380 -0
  95. package/DS1/2-core/ds-spacing-handle.ts +22 -0
  96. package/DS1/2-core/ds-stat.ts +174 -0
  97. package/DS1/2-core/ds-switch.ts +1 -0
  98. package/DS1/2-core/ds-text.ts +15 -2
  99. package/DS1/2-core/ds-toast.ts +354 -0
  100. package/DS1/2-core/figures.ts +105 -0
  101. package/DS1/2-core/generated/ds-icon-map.ts +234 -128
  102. package/DS1/2-core/generated/icon-avatar.ts +2 -0
  103. package/DS1/2-core/generated/icons-extra.ts +118 -65
  104. package/DS1/2-core/generated/icons-immediate.ts +1 -1
  105. package/DS1/2-core/spacing-handle.ts +95 -0
  106. package/DS1/2-core/styles/ds-avatar.css +9 -8
  107. package/DS1/2-core/styles/ds-button-host.css +26 -3
  108. package/DS1/2-core/styles/ds-button-split.css +67 -0
  109. package/DS1/2-core/styles/ds-button.css +49 -15
  110. package/DS1/2-core/styles/ds-card.css +34 -0
  111. package/DS1/2-core/styles/ds-composer.css +13 -0
  112. package/DS1/2-core/styles/ds-cycle.css +69 -0
  113. package/DS1/2-core/styles/ds-empty.css +18 -0
  114. package/DS1/2-core/styles/ds-gap.css +1 -0
  115. package/DS1/2-core/styles/ds-icon.css +1 -0
  116. package/DS1/2-core/styles/ds-input.css +59 -6
  117. package/DS1/2-core/styles/ds-kbd.css +12 -0
  118. package/DS1/2-core/styles/ds-loading.css +13 -0
  119. package/DS1/2-core/styles/ds-notice.css +30 -0
  120. package/DS1/2-core/styles/ds-progress.css +25 -0
  121. package/DS1/2-core/styles/ds-select.css +2 -2
  122. package/DS1/2-core/styles/ds-spacing-handle.css +8 -0
  123. package/DS1/2-core/styles/ds-split.css +2 -62
  124. package/DS1/2-core/styles/ds-stat.css +34 -0
  125. package/DS1/2-core/styles/ds-switch.css +16 -1
  126. package/DS1/2-core/styles/ds-text.css +43 -12
  127. package/DS1/2-core/styles/ds-toast.css +182 -0
  128. package/DS1/2-core/styles/ds-tooltip.css +1 -0
  129. package/DS1/3-unit/calendar-base.ts +263 -0
  130. package/DS1/3-unit/ds-accordion.ts +9 -1
  131. package/DS1/3-unit/ds-avatar-group.ts +1 -0
  132. package/DS1/3-unit/ds-calendar-large.ts +349 -0
  133. package/DS1/3-unit/ds-calendar.ts +344 -0
  134. package/DS1/3-unit/ds-carousel.ts +368 -0
  135. package/DS1/3-unit/ds-date-picker.ts +540 -0
  136. package/DS1/3-unit/ds-form.ts +45 -37
  137. package/DS1/3-unit/ds-list.ts +48 -1
  138. package/DS1/3-unit/ds-matrix.ts +318 -0
  139. package/DS1/3-unit/ds-menu.ts +8 -4
  140. package/DS1/3-unit/ds-row.ts +84 -1
  141. package/DS1/3-unit/ds-sidebar.ts +280 -0
  142. package/DS1/3-unit/ds-table.ts +75 -34
  143. package/DS1/3-unit/styles/ds-accordion.css +1 -0
  144. package/DS1/3-unit/styles/ds-avatar-group.css +2 -4
  145. package/DS1/3-unit/styles/ds-calendar-large.css +165 -0
  146. package/DS1/3-unit/styles/ds-calendar.css +238 -0
  147. package/DS1/3-unit/styles/ds-carousel.css +30 -0
  148. package/DS1/3-unit/styles/ds-date-picker.css +124 -0
  149. package/DS1/3-unit/styles/ds-list.css +1 -0
  150. package/DS1/3-unit/styles/ds-matrix.css +203 -0
  151. package/DS1/3-unit/styles/ds-menu.css +31 -6
  152. package/DS1/3-unit/styles/ds-row.css +84 -2
  153. package/DS1/3-unit/styles/ds-sidebar.css +117 -0
  154. package/DS1/3-unit/styles/ds-table.css +3 -74
  155. package/DS1/4-page/ds-dialog.ts +40 -4
  156. package/DS1/4-page/ds-document.ts +240 -0
  157. package/DS1/4-page/ds-footer.ts +165 -0
  158. package/DS1/4-page/ds-grid.ts +39 -59
  159. package/DS1/4-page/ds-header.ts +171 -0
  160. package/DS1/4-page/ds-page.ts +184 -0
  161. package/DS1/4-page/email.ts +2 -3
  162. package/DS1/4-page/styles/ds-container.css +1 -0
  163. package/DS1/4-page/styles/ds-document.css +18 -0
  164. package/DS1/4-page/styles/ds-footer.css +29 -0
  165. package/DS1/4-page/styles/ds-grid.css +31 -85
  166. package/DS1/4-page/styles/ds-header.css +57 -0
  167. package/DS1/4-page/styles/ds-page.css +214 -0
  168. package/DS1/components.ts +7 -1
  169. package/DS1/index.ts +26 -6
  170. package/DS1/react/avatar.ts +4 -5
  171. package/DS1/react/button-split.ts +29 -0
  172. package/DS1/react/button.ts +32 -13
  173. package/DS1/react/carousel.ts +76 -0
  174. package/DS1/react/dialog.ts +36 -5
  175. package/DS1/react/document.ts +14 -0
  176. package/DS1/react/empty.ts +32 -0
  177. package/DS1/react/footer.ts +17 -0
  178. package/DS1/react/header.ts +15 -0
  179. package/DS1/react/input.ts +28 -17
  180. package/DS1/react/kbd.ts +21 -0
  181. package/DS1/react/loading.ts +18 -0
  182. package/DS1/react/notice.ts +59 -0
  183. package/DS1/react/page.ts +13 -0
  184. package/DS1/react/progress.ts +99 -0
  185. package/DS1/react/sidebar.ts +60 -0
  186. package/DS1/react/spacing-handle.ts +21 -0
  187. package/DS1/react/stat.ts +73 -0
  188. package/DS1/react/toast.ts +82 -0
  189. package/DS1/x-icon/Tabler-LICENSE.md +27 -0
  190. package/DS1/x-icon/airtable.svg +5 -0
  191. package/DS1/x-icon/attach.svg +3 -0
  192. package/DS1/x-icon/audio.svg +3 -0
  193. package/DS1/x-icon/bag-alt.svg +3 -0
  194. package/DS1/x-icon/bank.svg +3 -0
  195. package/DS1/x-icon/banknote.svg +3 -0
  196. package/DS1/x-icon/bolt.svg +3 -0
  197. package/DS1/x-icon/book-alt.svg +3 -0
  198. package/DS1/x-icon/book.svg +4 -0
  199. package/DS1/x-icon/box.svg +3 -0
  200. package/DS1/x-icon/briefcase.svg +3 -0
  201. package/DS1/x-icon/building.svg +4 -0
  202. package/DS1/x-icon/car.svg +3 -0
  203. package/DS1/x-icon/card.svg +3 -0
  204. package/DS1/x-icon/cart.svg +3 -0
  205. package/DS1/x-icon/{ezo-item-button-start.svg → chevron-left.svg} +1 -1
  206. package/DS1/x-icon/{ezo-android-screen-stats.svg → chevron-right.svg} +1 -1
  207. package/DS1/x-icon/cloud.svg +3 -0
  208. package/DS1/x-icon/coffee.svg +3 -0
  209. package/DS1/x-icon/coins.svg +3 -0
  210. package/DS1/x-icon/cursor.svg +3 -0
  211. package/DS1/x-icon/curve.svg +7 -0
  212. package/DS1/x-icon/dislike.svg +4 -0
  213. package/DS1/x-icon/dot-bank.svg +3 -0
  214. package/DS1/x-icon/dot-banknote.svg +3 -0
  215. package/DS1/x-icon/dot-banknotes.svg +3 -0
  216. package/DS1/x-icon/dot-card.svg +3 -0
  217. package/DS1/x-icon/dot-coin.svg +3 -0
  218. package/DS1/x-icon/dot-coins.svg +3 -0
  219. package/DS1/x-icon/dot-receipt.svg +3 -0
  220. package/DS1/x-icon/dot-safe.svg +3 -0
  221. package/DS1/x-icon/dot-transfer.svg +3 -0
  222. package/DS1/x-icon/dot-wallet.svg +3 -0
  223. package/DS1/x-icon/download.svg +4 -0
  224. package/DS1/x-icon/drive.svg +5 -0
  225. package/DS1/x-icon/drop.svg +3 -0
  226. package/DS1/x-icon/dropbox.svg +3 -0
  227. package/DS1/x-icon/dumbbell.svg +3 -0
  228. package/DS1/x-icon/eye-off.svg +3 -0
  229. package/DS1/x-icon/eye.svg +3 -0
  230. package/DS1/x-icon/facebook.svg +3 -0
  231. package/DS1/x-icon/figma.svg +5 -0
  232. package/DS1/x-icon/flame.svg +3 -0
  233. package/DS1/x-icon/flip.svg +5 -0
  234. package/DS1/x-icon/food.svg +3 -0
  235. package/DS1/x-icon/fuel.svg +3 -0
  236. package/DS1/x-icon/game.svg +3 -0
  237. package/DS1/x-icon/gift.svg +3 -0
  238. package/DS1/x-icon/github.svg +3 -0
  239. package/DS1/x-icon/heart.svg +3 -0
  240. package/DS1/x-icon/history.svg +3 -0
  241. package/DS1/x-icon/home-alt.svg +3 -0
  242. package/DS1/x-icon/income.svg +3 -0
  243. package/DS1/x-icon/info.svg +5 -0
  244. package/DS1/x-icon/instagram.svg +5 -0
  245. package/DS1/x-icon/jpbank.svg +3 -0
  246. package/DS1/x-icon/key.svg +4 -0
  247. package/DS1/x-icon/keyboard.svg +3 -0
  248. package/DS1/x-icon/like.svg +4 -0
  249. package/DS1/x-icon/linkedin.svg +7 -0
  250. package/DS1/x-icon/loom.svg +6 -0
  251. package/DS1/x-icon/map.svg +4 -0
  252. package/DS1/x-icon/medical.svg +3 -0
  253. package/DS1/x-icon/{ezo-android-screen-lists.svg → minus.svg} +1 -1
  254. package/DS1/x-icon/moon.svg +3 -0
  255. package/DS1/x-icon/move.svg +3 -0
  256. package/DS1/x-icon/music-alt.svg +3 -0
  257. package/DS1/x-icon/music.svg +5 -0
  258. package/DS1/x-icon/notion.svg +6 -0
  259. package/DS1/x-icon/offline.svg +3 -0
  260. package/DS1/x-icon/pause.svg +4 -0
  261. package/DS1/x-icon/paw.svg +3 -0
  262. package/DS1/x-icon/pdf.svg +3 -0
  263. package/DS1/x-icon/people.svg +5 -0
  264. package/DS1/x-icon/percent.svg +3 -0
  265. package/DS1/x-icon/phone.svg +3 -0
  266. package/DS1/x-icon/pill.svg +3 -0
  267. package/DS1/x-icon/plane.svg +3 -0
  268. package/DS1/x-icon/postal.svg +3 -0
  269. package/DS1/x-icon/present.svg +4 -0
  270. package/DS1/x-icon/reaction.svg +5 -0
  271. package/DS1/x-icon/receipt.svg +3 -0
  272. package/DS1/x-icon/refresh.svg +3 -0
  273. package/DS1/x-icon/refund.svg +3 -0
  274. package/DS1/x-icon/repeat.svg +3 -0
  275. package/DS1/x-icon/rotate.svg +4 -0
  276. package/DS1/x-icon/safe.svg +3 -0
  277. package/DS1/x-icon/school-alt.svg +3 -0
  278. package/DS1/x-icon/shield-alt.svg +3 -0
  279. package/DS1/x-icon/shield.svg +4 -0
  280. package/DS1/x-icon/shirt.svg +3 -0
  281. package/DS1/x-icon/shop.svg +3 -0
  282. package/DS1/x-icon/sign-in.svg +3 -0
  283. package/DS1/x-icon/sign-out.svg +3 -0
  284. package/DS1/x-icon/slack.svg +6 -0
  285. package/DS1/x-icon/sparkle.svg +3 -0
  286. package/DS1/x-icon/start.svg +4 -0
  287. package/DS1/x-icon/{ezo-item-button-reopen.svg → stop.svg} +1 -1
  288. package/DS1/x-icon/sun.svg +3 -0
  289. package/DS1/x-icon/system.svg +4 -0
  290. package/DS1/x-icon/tag.svg +3 -0
  291. package/DS1/x-icon/ticket.svg +3 -0
  292. package/DS1/x-icon/title-struck.svg +4 -0
  293. package/DS1/x-icon/train.svg +3 -0
  294. package/DS1/x-icon/transfer.svg +3 -0
  295. package/DS1/x-icon/tv.svg +3 -0
  296. package/DS1/x-icon/upload.svg +4 -0
  297. package/DS1/x-icon/video.svg +4 -0
  298. package/DS1/x-icon/vimeo.svg +3 -0
  299. package/DS1/x-icon/wallet.svg +3 -0
  300. package/DS1/x-icon/wifi.svg +3 -0
  301. package/DS1/x-icon/window.svg +4 -0
  302. package/DS1/x-icon/wrench.svg +3 -0
  303. package/DS1/x-icon/x-brand.svg +4 -0
  304. package/DS1/x-icon/youtube.svg +4 -0
  305. package/README.md +3 -3
  306. package/dist/0-face/calendar.d.ts +75 -0
  307. package/dist/0-face/calendar.d.ts.map +1 -0
  308. package/dist/0-face/calendar.js +149 -0
  309. package/dist/0-face/carousel.d.ts +174 -0
  310. package/dist/0-face/carousel.d.ts.map +1 -0
  311. package/dist/0-face/carousel.js +583 -0
  312. package/dist/0-face/component-visibility.d.ts +7 -0
  313. package/dist/0-face/component-visibility.d.ts.map +1 -0
  314. package/dist/0-face/component-visibility.js +10 -0
  315. package/dist/0-face/copy-text.d.ts +11 -0
  316. package/dist/0-face/copy-text.d.ts.map +1 -0
  317. package/dist/0-face/copy-text.js +97 -0
  318. package/dist/0-face/device.d.ts +3 -7
  319. package/dist/0-face/device.d.ts.map +1 -1
  320. package/dist/0-face/device.js +7 -41
  321. package/dist/0-face/dialog-swipe.d.ts +49 -0
  322. package/dist/0-face/dialog-swipe.d.ts.map +1 -0
  323. package/dist/0-face/dialog-swipe.js +239 -0
  324. package/dist/0-face/dialogs.d.ts +33 -0
  325. package/dist/0-face/dialogs.d.ts.map +1 -0
  326. package/dist/0-face/dialogs.js +173 -0
  327. package/dist/0-face/drawer.d.ts +64 -0
  328. package/dist/0-face/drawer.d.ts.map +1 -0
  329. package/dist/0-face/drawer.js +256 -0
  330. package/dist/0-face/feedback-words.d.ts +21 -0
  331. package/dist/0-face/feedback-words.d.ts.map +1 -0
  332. package/dist/0-face/feedback-words.js +30 -0
  333. package/dist/0-face/feedback.d.ts +41 -0
  334. package/dist/0-face/feedback.d.ts.map +1 -0
  335. package/dist/0-face/feedback.js +35 -0
  336. package/dist/0-face/format.d.ts +166 -0
  337. package/dist/0-face/format.d.ts.map +1 -0
  338. package/dist/0-face/format.js +445 -0
  339. package/dist/0-face/generated/toast-assets.d.ts +11 -0
  340. package/dist/0-face/generated/toast-assets.d.ts.map +1 -0
  341. package/dist/0-face/generated/toast-assets.js +14 -0
  342. package/dist/0-face/grid-fit.js +1 -1
  343. package/dist/0-face/grid.d.ts.map +1 -1
  344. package/dist/0-face/grid.js +2 -1
  345. package/dist/0-face/header.d.ts +38 -0
  346. package/dist/0-face/header.d.ts.map +1 -0
  347. package/dist/0-face/header.js +80 -0
  348. package/dist/0-face/i18n.d.ts +32 -2
  349. package/dist/0-face/i18n.d.ts.map +1 -1
  350. package/dist/0-face/i18n.js +65 -19
  351. package/dist/0-face/keys.d.ts +104 -0
  352. package/dist/0-face/keys.d.ts.map +1 -0
  353. package/dist/0-face/keys.js +253 -0
  354. package/dist/0-face/languages.d.ts +2 -2
  355. package/dist/0-face/languages.js +3 -3
  356. package/dist/0-face/layout-inspector.js +6 -6
  357. package/dist/0-face/library-styles.d.ts +7 -0
  358. package/dist/0-face/library-styles.d.ts.map +1 -0
  359. package/dist/0-face/library-styles.js +29 -0
  360. package/dist/0-face/load-toaster.d.ts +8 -0
  361. package/dist/0-face/load-toaster.d.ts.map +1 -0
  362. package/dist/0-face/load-toaster.js +7 -0
  363. package/dist/0-face/preference-options.d.ts +34 -0
  364. package/dist/0-face/preference-options.d.ts.map +1 -0
  365. package/dist/0-face/preference-options.js +1 -0
  366. package/dist/0-face/preferences.d.ts +3 -12
  367. package/dist/0-face/preferences.d.ts.map +1 -1
  368. package/dist/0-face/pricing.d.ts +19 -9
  369. package/dist/0-face/pricing.d.ts.map +1 -1
  370. package/dist/0-face/pricing.js +81 -40
  371. package/dist/0-face/scaling.d.ts +71 -1
  372. package/dist/0-face/scaling.d.ts.map +1 -1
  373. package/dist/0-face/scaling.js +108 -3
  374. package/dist/0-face/shared-words.d.ts +9 -4
  375. package/dist/0-face/shared-words.d.ts.map +1 -1
  376. package/dist/0-face/sidebar.d.ts +69 -0
  377. package/dist/0-face/sidebar.d.ts.map +1 -0
  378. package/dist/0-face/sidebar.js +191 -0
  379. package/dist/0-face/theme-bootstrap.d.ts +1 -0
  380. package/dist/0-face/theme-bootstrap.d.ts.map +1 -0
  381. package/dist/0-face/theme-bootstrap.js +214 -0
  382. package/dist/0-face/theme.d.ts +32 -0
  383. package/dist/0-face/theme.d.ts.map +1 -1
  384. package/dist/0-face/theme.js +69 -43
  385. package/dist/0-face/toast-queue.d.ts +110 -0
  386. package/dist/0-face/toast-queue.d.ts.map +1 -0
  387. package/dist/0-face/toast-queue.js +98 -0
  388. package/dist/0-face/toaster.d.ts +27 -0
  389. package/dist/0-face/toaster.d.ts.map +1 -0
  390. package/dist/0-face/toaster.js +373 -0
  391. package/dist/0-face/tooltips.d.ts +24 -1
  392. package/dist/0-face/tooltips.d.ts.map +1 -1
  393. package/dist/0-face/tooltips.js +155 -16
  394. package/dist/0-face/translations/da.json +60 -1
  395. package/dist/0-face/translations/de.json +60 -1
  396. package/dist/0-face/translations/en.json +60 -1
  397. package/dist/0-face/translations/es.json +60 -1
  398. package/dist/0-face/translations/fi.json +60 -1
  399. package/dist/0-face/translations/fr.json +60 -1
  400. package/dist/0-face/translations/is.json +60 -1
  401. package/dist/0-face/translations/it.json +60 -1
  402. package/dist/0-face/translations/ja.json +60 -1
  403. package/dist/0-face/translations/ko.json +60 -1
  404. package/dist/0-face/translations/nb.json +60 -1
  405. package/dist/0-face/translations/pt-BR.json +60 -1
  406. package/dist/0-face/translations/pt.json +60 -1
  407. package/dist/0-face/translations/sv.json +60 -1
  408. package/dist/0-face/translations/zh.json +60 -1
  409. package/dist/0-face/translations-format.d.ts.map +1 -1
  410. package/dist/0-face/translations-format.js +3 -4
  411. package/dist/0-face/tree.d.ts +69 -0
  412. package/dist/0-face/tree.d.ts.map +1 -0
  413. package/dist/0-face/tree.js +191 -0
  414. package/dist/1-root/library-tokens.d.ts +31 -0
  415. package/dist/1-root/library-tokens.d.ts.map +1 -0
  416. package/dist/1-root/library-tokens.js +84 -0
  417. package/dist/1-root/measures.d.ts +52 -0
  418. package/dist/1-root/measures.d.ts.map +1 -0
  419. package/dist/1-root/measures.js +49 -0
  420. package/dist/1-root/palette.d.ts +5 -0
  421. package/dist/1-root/palette.d.ts.map +1 -1
  422. package/dist/1-root/palette.js +18 -0
  423. package/dist/2-core/button-split.d.ts +21 -0
  424. package/dist/2-core/button-split.d.ts.map +1 -0
  425. package/dist/2-core/button-split.js +48 -0
  426. package/dist/2-core/chart/grid-chart.d.ts +113 -0
  427. package/dist/2-core/chart/grid-chart.d.ts.map +1 -0
  428. package/dist/2-core/chart/grid-chart.js +466 -0
  429. package/dist/2-core/ds-avatar.d.ts +20 -3
  430. package/dist/2-core/ds-avatar.d.ts.map +1 -1
  431. package/dist/2-core/ds-avatar.js +19 -5
  432. package/dist/2-core/ds-badge.js +10 -13
  433. package/dist/2-core/ds-banner.d.ts +23 -7
  434. package/dist/2-core/ds-banner.d.ts.map +1 -1
  435. package/dist/2-core/ds-banner.js +48 -12
  436. package/dist/2-core/ds-button.d.ts +76 -0
  437. package/dist/2-core/ds-button.d.ts.map +1 -1
  438. package/dist/2-core/ds-button.js +101 -26
  439. package/dist/2-core/ds-card.d.ts +76 -11
  440. package/dist/2-core/ds-card.d.ts.map +1 -1
  441. package/dist/2-core/ds-card.js +129 -105
  442. package/dist/2-core/ds-chart.d.ts +105 -0
  443. package/dist/2-core/ds-chart.d.ts.map +1 -0
  444. package/dist/2-core/ds-chart.js +390 -0
  445. package/dist/2-core/ds-composer.d.ts +7 -0
  446. package/dist/2-core/ds-composer.d.ts.map +1 -1
  447. package/dist/2-core/ds-composer.js +1 -1
  448. package/dist/2-core/ds-cycle.d.ts +36 -2
  449. package/dist/2-core/ds-cycle.d.ts.map +1 -1
  450. package/dist/2-core/ds-cycle.js +95 -18
  451. package/dist/2-core/ds-empty.d.ts +74 -0
  452. package/dist/2-core/ds-empty.d.ts.map +1 -0
  453. package/dist/2-core/ds-empty.js +96 -0
  454. package/dist/2-core/ds-icon.d.ts +6 -0
  455. package/dist/2-core/ds-icon.d.ts.map +1 -1
  456. package/dist/2-core/ds-icon.js +12 -2
  457. package/dist/2-core/ds-input.d.ts +39 -1
  458. package/dist/2-core/ds-input.d.ts.map +1 -1
  459. package/dist/2-core/ds-input.js +150 -6
  460. package/dist/2-core/ds-kbd.d.ts +48 -0
  461. package/dist/2-core/ds-kbd.d.ts.map +1 -0
  462. package/dist/2-core/ds-kbd.js +65 -0
  463. package/dist/2-core/ds-language.d.ts +8 -1
  464. package/dist/2-core/ds-language.d.ts.map +1 -1
  465. package/dist/2-core/ds-language.js +2 -2
  466. package/dist/2-core/ds-loading.d.ts +40 -0
  467. package/dist/2-core/ds-loading.d.ts.map +1 -0
  468. package/dist/2-core/ds-loading.js +63 -0
  469. package/dist/2-core/ds-meter.d.ts +103 -0
  470. package/dist/2-core/ds-meter.d.ts.map +1 -0
  471. package/dist/2-core/ds-meter.js +124 -0
  472. package/dist/2-core/ds-notice.d.ts +103 -0
  473. package/dist/2-core/ds-notice.d.ts.map +1 -0
  474. package/dist/2-core/ds-notice.js +152 -0
  475. package/dist/2-core/ds-pagedots.d.ts +64 -7
  476. package/dist/2-core/ds-pagedots.d.ts.map +1 -1
  477. package/dist/2-core/ds-pagedots.js +124 -18
  478. package/dist/2-core/ds-progress.d.ts +200 -0
  479. package/dist/2-core/ds-progress.d.ts.map +1 -0
  480. package/dist/2-core/ds-progress.js +319 -0
  481. package/dist/2-core/ds-spacing-handle.d.ts +25 -0
  482. package/dist/2-core/ds-spacing-handle.d.ts.map +1 -0
  483. package/dist/2-core/ds-spacing-handle.js +25 -0
  484. package/dist/2-core/ds-split.d.ts +4 -67
  485. package/dist/2-core/ds-split.d.ts.map +1 -1
  486. package/dist/2-core/ds-split.js +4 -98
  487. package/dist/2-core/ds-stat.d.ts +126 -0
  488. package/dist/2-core/ds-stat.d.ts.map +1 -0
  489. package/dist/2-core/ds-stat.js +137 -0
  490. package/dist/2-core/ds-steps.d.ts +72 -0
  491. package/dist/2-core/ds-steps.d.ts.map +1 -0
  492. package/dist/2-core/ds-steps.js +114 -0
  493. package/dist/2-core/ds-switch.d.ts +1 -0
  494. package/dist/2-core/ds-switch.d.ts.map +1 -1
  495. package/dist/2-core/ds-switch.js +1 -0
  496. package/dist/2-core/ds-text.d.ts +15 -2
  497. package/dist/2-core/ds-text.d.ts.map +1 -1
  498. package/dist/2-core/ds-text.js +13 -0
  499. package/dist/2-core/ds-textarea.d.ts.map +1 -1
  500. package/dist/2-core/ds-textarea.js +1 -0
  501. package/dist/2-core/ds-toast.d.ts +139 -0
  502. package/dist/2-core/ds-toast.d.ts.map +1 -0
  503. package/dist/2-core/ds-toast.js +329 -0
  504. package/dist/2-core/ds-toggle.d.ts +11 -0
  505. package/dist/2-core/ds-toggle.d.ts.map +1 -0
  506. package/dist/2-core/ds-toggle.js +10 -0
  507. package/dist/2-core/figures.d.ts +56 -0
  508. package/dist/2-core/figures.d.ts.map +1 -0
  509. package/dist/2-core/figures.js +70 -0
  510. package/dist/2-core/generated/ds-icon-map.d.ts +118 -65
  511. package/dist/2-core/generated/ds-icon-map.d.ts.map +1 -1
  512. package/dist/2-core/generated/ds-icon-map.js +234 -128
  513. package/dist/2-core/generated/icon-avatar.d.ts +2 -0
  514. package/dist/2-core/generated/icon-avatar.d.ts.map +1 -0
  515. package/dist/2-core/generated/icon-avatar.js +2 -0
  516. package/dist/2-core/generated/icons-extra.d.ts.map +1 -1
  517. package/dist/2-core/generated/icons-extra.js +118 -65
  518. package/dist/2-core/generated/icons-immediate.d.ts +1 -1
  519. package/dist/2-core/generated/icons-immediate.d.ts.map +1 -1
  520. package/dist/2-core/generated/icons-immediate.js +1 -1
  521. package/dist/2-core/spacing-handle.d.ts +28 -0
  522. package/dist/2-core/spacing-handle.d.ts.map +1 -0
  523. package/dist/2-core/spacing-handle.js +146 -0
  524. package/dist/3-unit/calendar-base.d.ts +149 -0
  525. package/dist/3-unit/calendar-base.d.ts.map +1 -0
  526. package/dist/3-unit/calendar-base.js +172 -0
  527. package/dist/3-unit/ds-accordion.d.ts +9 -0
  528. package/dist/3-unit/ds-accordion.d.ts.map +1 -1
  529. package/dist/3-unit/ds-accordion.js +7 -1
  530. package/dist/3-unit/ds-avatar-group.d.ts +1 -0
  531. package/dist/3-unit/ds-avatar-group.d.ts.map +1 -1
  532. package/dist/3-unit/ds-calendar-large.d.ts +138 -0
  533. package/dist/3-unit/ds-calendar-large.d.ts.map +1 -0
  534. package/dist/3-unit/ds-calendar-large.js +305 -0
  535. package/dist/3-unit/ds-calendar.d.ts +175 -0
  536. package/dist/3-unit/ds-calendar.d.ts.map +1 -0
  537. package/dist/3-unit/ds-calendar.js +303 -0
  538. package/dist/3-unit/ds-carousel.d.ts +182 -0
  539. package/dist/3-unit/ds-carousel.d.ts.map +1 -0
  540. package/dist/3-unit/ds-carousel.js +327 -0
  541. package/dist/3-unit/ds-date-picker.d.ts +203 -0
  542. package/dist/3-unit/ds-date-picker.d.ts.map +1 -0
  543. package/dist/3-unit/ds-date-picker.js +499 -0
  544. package/dist/3-unit/ds-form.d.ts.map +1 -1
  545. package/dist/3-unit/ds-form.js +38 -28
  546. package/dist/3-unit/ds-list.d.ts +12 -0
  547. package/dist/3-unit/ds-list.d.ts.map +1 -1
  548. package/dist/3-unit/ds-list.js +52 -1
  549. package/dist/3-unit/ds-matrix.d.ts +146 -0
  550. package/dist/3-unit/ds-matrix.d.ts.map +1 -0
  551. package/dist/3-unit/ds-matrix.js +248 -0
  552. package/dist/3-unit/ds-menu.d.ts +1 -1
  553. package/dist/3-unit/ds-menu.d.ts.map +1 -1
  554. package/dist/3-unit/ds-menu.js +7 -4
  555. package/dist/3-unit/ds-row.d.ts +66 -0
  556. package/dist/3-unit/ds-row.d.ts.map +1 -1
  557. package/dist/3-unit/ds-row.js +80 -1
  558. package/dist/3-unit/ds-sidebar.d.ts +108 -0
  559. package/dist/3-unit/ds-sidebar.d.ts.map +1 -0
  560. package/dist/3-unit/ds-sidebar.js +268 -0
  561. package/dist/3-unit/ds-table.d.ts +28 -10
  562. package/dist/3-unit/ds-table.d.ts.map +1 -1
  563. package/dist/3-unit/ds-table.js +53 -25
  564. package/dist/3-unit/ds-tree.d.ts +69 -0
  565. package/dist/3-unit/ds-tree.d.ts.map +1 -0
  566. package/dist/3-unit/ds-tree.js +136 -0
  567. package/dist/4-page/ds-dialog.d.ts +16 -1
  568. package/dist/4-page/ds-dialog.d.ts.map +1 -1
  569. package/dist/4-page/ds-dialog.js +39 -3
  570. package/dist/4-page/ds-document.d.ts +98 -0
  571. package/dist/4-page/ds-document.d.ts.map +1 -0
  572. package/dist/4-page/ds-document.js +213 -0
  573. package/dist/4-page/ds-footer.d.ts +100 -0
  574. package/dist/4-page/ds-footer.d.ts.map +1 -0
  575. package/dist/4-page/ds-footer.js +119 -0
  576. package/dist/4-page/ds-grid.d.ts +32 -12
  577. package/dist/4-page/ds-grid.d.ts.map +1 -1
  578. package/dist/4-page/ds-grid.js +30 -39
  579. package/dist/4-page/ds-header.d.ts +84 -0
  580. package/dist/4-page/ds-header.d.ts.map +1 -0
  581. package/dist/4-page/ds-header.js +143 -0
  582. package/dist/4-page/ds-layout.d.ts +1 -0
  583. package/dist/4-page/ds-layout.d.ts.map +1 -1
  584. package/dist/4-page/ds-layout.js +1 -1
  585. package/dist/4-page/ds-page.d.ts +110 -0
  586. package/dist/4-page/ds-page.d.ts.map +1 -0
  587. package/dist/4-page/ds-page.js +155 -0
  588. package/dist/4-page/email.d.ts +2 -3
  589. package/dist/4-page/email.d.ts.map +1 -1
  590. package/dist/4-page/email.js +2 -3
  591. package/dist/components.d.ts +4 -1
  592. package/dist/components.d.ts.map +1 -1
  593. package/dist/components.js +4 -1
  594. package/dist/design-system-1.bundle.js +11304 -4322
  595. package/dist/design-system-1.bundle.js.map +1 -1
  596. package/dist/design-system-1.bundle.min.js +8867 -4132
  597. package/dist/design-system-1.bundle.min.js.map +1 -1
  598. package/dist/design-system-1.css +1 -1
  599. package/dist/feedback.js +541 -0
  600. package/dist/feedback.js.map +1 -0
  601. package/dist/icons-extra-B4Iotc7s.js +298 -0
  602. package/dist/icons-extra-B4Iotc7s.js.map +1 -0
  603. package/dist/icons-extra-C4sCgoUj.js +185 -0
  604. package/dist/icons-extra-C4sCgoUj.js.map +1 -0
  605. package/dist/icons-extra-DSav6uTU.js +300 -0
  606. package/dist/icons-extra-DSav6uTU.js.map +1 -0
  607. package/dist/icons-extra-Dc_yVWIz.js +1024 -0
  608. package/dist/icons-extra-Dc_yVWIz.js.map +1 -0
  609. package/dist/icons-extra-cfzoudMf.js +1030 -0
  610. package/dist/icons-extra-cfzoudMf.js.map +1 -0
  611. package/dist/icons-extra-g_xpwZhZ.js +631 -0
  612. package/dist/icons-extra-g_xpwZhZ.js.map +1 -0
  613. package/dist/index.d.ts +23 -6
  614. package/dist/index.d.ts.map +1 -1
  615. package/dist/index.js +23 -6
  616. package/dist/react/avatar.d.ts +5 -9
  617. package/dist/react/avatar.d.ts.map +1 -1
  618. package/dist/react/avatar.js +2 -2
  619. package/dist/react/button-split.d.ts +19 -0
  620. package/dist/react/button-split.d.ts.map +1 -0
  621. package/dist/react/button-split.js +35 -0
  622. package/dist/react/button.d.ts +18 -7
  623. package/dist/react/button.d.ts.map +1 -1
  624. package/dist/react/button.js +13 -4
  625. package/dist/react/carousel.d.ts +63 -0
  626. package/dist/react/carousel.d.ts.map +1 -0
  627. package/dist/react/carousel.js +47 -0
  628. package/dist/react/choice.d.ts +1 -1
  629. package/dist/react/context-menu.d.ts +337 -337
  630. package/dist/react/dialog.d.ts +684 -678
  631. package/dist/react/dialog.d.ts.map +1 -1
  632. package/dist/react/dialog.js +29 -3
  633. package/dist/react/document.d.ts +11 -0
  634. package/dist/react/document.d.ts.map +1 -0
  635. package/dist/react/document.js +10 -0
  636. package/dist/react/empty.d.ts +34 -0
  637. package/dist/react/empty.d.ts.map +1 -0
  638. package/dist/react/empty.js +8 -0
  639. package/dist/react/file-picker.d.ts +1 -1
  640. package/dist/react/footer.d.ts +13 -0
  641. package/dist/react/footer.d.ts.map +1 -0
  642. package/dist/react/footer.js +12 -0
  643. package/dist/react/header.d.ts +12 -0
  644. package/dist/react/header.d.ts.map +1 -0
  645. package/dist/react/header.js +11 -0
  646. package/dist/react/input.d.ts +31 -9
  647. package/dist/react/input.d.ts.map +1 -1
  648. package/dist/react/input.js +94 -94
  649. package/dist/react/kbd.d.ts +26 -0
  650. package/dist/react/kbd.d.ts.map +1 -0
  651. package/dist/react/kbd.js +8 -0
  652. package/dist/react/loading.d.ts +14 -0
  653. package/dist/react/loading.d.ts.map +1 -0
  654. package/dist/react/loading.js +14 -0
  655. package/dist/react/meter.d.ts +64 -0
  656. package/dist/react/meter.d.ts.map +1 -0
  657. package/dist/react/meter.js +15 -0
  658. package/dist/react/notice.d.ts +45 -0
  659. package/dist/react/notice.d.ts.map +1 -0
  660. package/dist/react/notice.js +34 -0
  661. package/dist/react/page.d.ts +10 -0
  662. package/dist/react/page.d.ts.map +1 -0
  663. package/dist/react/page.js +9 -0
  664. package/dist/react/progress.d.ts +107 -0
  665. package/dist/react/progress.d.ts.map +1 -0
  666. package/dist/react/progress.js +47 -0
  667. package/dist/react/sidebar.d.ts +44 -0
  668. package/dist/react/sidebar.d.ts.map +1 -0
  669. package/dist/react/sidebar.js +41 -0
  670. package/dist/react/spacing-handle.d.ts +13 -0
  671. package/dist/react/spacing-handle.d.ts.map +1 -0
  672. package/dist/react/spacing-handle.js +18 -0
  673. package/dist/react/split.d.ts +6 -14
  674. package/dist/react/split.d.ts.map +1 -1
  675. package/dist/react/split.js +5 -31
  676. package/dist/react/stat.d.ts +78 -0
  677. package/dist/react/stat.d.ts.map +1 -0
  678. package/dist/react/stat.js +25 -0
  679. package/dist/react/steps.d.ts +36 -0
  680. package/dist/react/steps.d.ts.map +1 -0
  681. package/dist/react/steps.js +10 -0
  682. package/dist/react/toast.d.ts +37 -0
  683. package/dist/react/toast.d.ts.map +1 -0
  684. package/dist/react/toast.js +55 -0
  685. package/dist/react/tree.d.ts +31 -0
  686. package/dist/react/tree.d.ts.map +1 -0
  687. package/dist/react/tree.js +37 -0
  688. package/dist/shared-words-BfnT24Fe.js +1635 -0
  689. package/dist/shared-words-BfnT24Fe.js.map +1 -0
  690. package/dist/shared-words-CyZYc_De.js +1818 -0
  691. package/dist/shared-words-CyZYc_De.js.map +1 -0
  692. package/dist/shared-words-DAVSET4Z.js +1800 -0
  693. package/dist/shared-words-DAVSET4Z.js.map +1 -0
  694. package/dist/shared-words-UCvnkctb.js +1653 -0
  695. package/dist/shared-words-UCvnkctb.js.map +1 -0
  696. package/package.json +16 -5
  697. package/DS1/2-core/ds-banner.ts +0 -122
  698. package/DS1/2-core/ds-date.ts +0 -24
  699. package/DS1/2-core/ds-language.ts +0 -94
  700. package/DS1/2-core/ds-pagedots.ts +0 -52
  701. package/DS1/2-core/ds-split.ts +0 -122
  702. package/DS1/2-core/ds-textarea.ts +0 -136
  703. package/DS1/2-core/styles/ds-banner.css +0 -77
  704. package/DS1/2-core/styles/ds-date.css +0 -9
  705. package/DS1/2-core/styles/ds-language.css +0 -78
  706. package/DS1/2-core/styles/ds-pagedots.css +0 -31
  707. package/DS1/2-core/styles/ds-textarea.css +0 -27
  708. package/DS1/4-page/ds-layout.ts +0 -949
  709. package/DS1/4-page/styles/ds-layout.css +0 -246
  710. package/DS1/react/split.ts +0 -42
  711. package/DS1/x-icon/ezo-accordion-chevron.svg +0 -11
  712. package/DS1/x-icon/ezo-account-close.svg +0 -1
  713. package/DS1/x-icon/ezo-android-screen-archive.svg +0 -4
  714. package/DS1/x-icon/ezo-android-screen-calendar.svg +0 -6
  715. package/DS1/x-icon/ezo-android-screen-camera.svg +0 -5
  716. package/DS1/x-icon/ezo-android-screen-check.svg +0 -3
  717. package/DS1/x-icon/ezo-android-screen-compose.svg +0 -4
  718. package/DS1/x-icon/ezo-android-screen-globe.svg +0 -1
  719. package/DS1/x-icon/ezo-android-screen-shared.svg +0 -5
  720. package/DS1/x-icon/ezo-android-screen-store.svg +0 -4
  721. package/DS1/x-icon/ezo-android-screen-views.svg +0 -4
  722. package/DS1/x-icon/ezo-android-screen-work.svg +0 -3
  723. package/DS1/x-icon/ezo-arrow-cursor.svg +0 -8
  724. package/DS1/x-icon/ezo-block-accordion.svg +0 -1
  725. package/DS1/x-icon/ezo-block-divider.svg +0 -1
  726. package/DS1/x-icon/ezo-block-group.svg +0 -1
  727. package/DS1/x-icon/ezo-block-image.svg +0 -1
  728. package/DS1/x-icon/ezo-block-section.svg +0 -1
  729. package/DS1/x-icon/ezo-block-table.svg +0 -1
  730. package/DS1/x-icon/ezo-code.svg +0 -14
  731. package/DS1/x-icon/ezo-down.svg +0 -3
  732. package/DS1/x-icon/ezo-figma-premium-star.svg +0 -5
  733. package/DS1/x-icon/ezo-item-button-complete.svg +0 -4
  734. package/DS1/x-icon/ezo-item-button-header.svg +0 -3
  735. package/DS1/x-icon/ezo-item-button-open.svg +0 -3
  736. package/DS1/x-icon/ezo-item-button-star.svg +0 -3
  737. package/DS1/x-icon/ezo-item-button-unheader.svg +0 -7
  738. package/DS1/x-icon/ezo-item-button-unstar.svg +0 -5
  739. package/DS1/x-icon/ezo-item-star.svg +0 -5
  740. package/DS1/x-icon/ezo-left.svg +0 -3
  741. package/DS1/x-icon/ezo-logo.svg +0 -1
  742. package/DS1/x-icon/ezo-mic.svg +0 -8
  743. package/DS1/x-icon/ezo-move-column.svg +0 -14
  744. package/DS1/x-icon/ezo-move-row.svg +0 -18
  745. package/DS1/x-icon/ezo-navigation-check.svg +0 -1
  746. package/DS1/x-icon/ezo-note-back.svg +0 -5
  747. package/DS1/x-icon/ezo-note-menu-complete.svg +0 -11
  748. package/DS1/x-icon/ezo-note-menu-delete.svg +0 -4
  749. package/DS1/x-icon/ezo-note-menu-duplicate.svg +0 -8
  750. package/DS1/x-icon/ezo-note-menu-note.svg +0 -5
  751. package/DS1/x-icon/ezo-note-menu-page.svg +0 -3
  752. package/DS1/x-icon/ezo-note-menu-star.svg +0 -5
  753. package/DS1/x-icon/ezo-note-menu-start.svg +0 -6
  754. package/DS1/x-icon/ezo-note-menu-stop.svg +0 -6
  755. package/DS1/x-icon/ezo-note-more.svg +0 -7
  756. package/DS1/x-icon/ezo-note-star.svg +0 -5
  757. package/DS1/x-icon/ezo-pattern-call-to-action.svg +0 -1
  758. package/DS1/x-icon/ezo-play.svg +0 -5
  759. package/DS1/x-icon/ezo-premium-star.svg +0 -5
  760. package/DS1/x-icon/ezo-setting-1xdots.svg +0 -13
  761. package/DS1/x-icon/ezo-setting-1xgrid.svg +0 -10
  762. package/DS1/x-icon/ezo-setting-1xlines.svg +0 -7
  763. package/DS1/x-icon/ezo-setting-2xdots.svg +0 -8
  764. package/DS1/x-icon/ezo-setting-2xgrid.svg +0 -8
  765. package/DS1/x-icon/ezo-setting-2xlines.svg +0 -6
  766. package/DS1/x-icon/ezo-setting-blank.svg +0 -5
  767. package/DS1/x-icon/ezo-store-chevron.svg +0 -1
  768. package/DS1/x-icon/ezo-upgrade-close.svg +0 -5
  769. package/DS1/x-icon/product-sources.json +0 -2557
  770. /package/DS1/x-icon/{ezo-password-visibility-see.svg → password-see.svg} +0 -0
  771. /package/DS1/x-icon/{ezo-password-visibility-unsee.svg → password-unsee.svg} +0 -0
@@ -1,16 +1,20 @@
1
1
  @import "../../1-root/component-metrics.css";
2
2
 
3
- /* ds-row.css */
3
+ /* ds-row.css: the same rows as the native .ds-row in 1-root/row.css. What a row holds
4
+ stands on the lower sixteen of its square with the spare four above, as Ezo sets every
5
+ row: words on a 16px line box, a 16px icon and a 16px control all end on the bottom line. */
4
6
 
5
7
  :host {
6
8
  box-sizing: border-box;
7
9
  display: flex;
8
10
  flex-direction: row;
9
- align-items: var(--ds-row-align, center);
11
+ align-items: var(--ds-row-align, flex-end);
10
12
  gap: var(--ds-row-gap, calc(4px * var(--ds-sf)));
11
13
  min-width: 0;
12
14
  height: var(--ds-row-default-height, var(--ds-row-height));
15
+ line-height: var(--ds-type-lineheight-default);
13
16
  }
17
+ :host([hidden]) { display: none !important; }
14
18
 
15
19
  :host([auto]) {
16
20
  height: auto;
@@ -35,3 +39,81 @@
35
39
  :host([centered]), :host([end]) {
36
40
  gap: var(--ds-row-packed-gap, var(--ds-row-gap, calc(4px * var(--ds-sf))));
37
41
  }
42
+
43
+ /* A tile or a card: the children stacked, each line one square, sized to them; its lines
44
+ wrap, so they stay on whole squares rather than the sixteen. */
45
+ :host([stacked]) {
46
+ flex-direction: column;
47
+ line-height: var(--ds-row-height);
48
+ align-items: var(--ds-row-align, flex-start);
49
+ justify-content: flex-start;
50
+ gap: 0;
51
+ height: auto;
52
+ }
53
+
54
+ /*
55
+ * A row a person presses. The target is the row's whole box: a layer above
56
+ * the content takes the press anywhere on the row, a layer under it shows
57
+ * the pointer, the press, the current destination and the focus ring.
58
+ * Controls in the end slot stand above both and keep their own presses.
59
+ */
60
+ :host([href]), :host([interactive]) {
61
+ position: relative;
62
+ isolation: isolate;
63
+ padding-inline: var(--ds-row-padding, calc(4px * var(--ds-sf)));
64
+ -webkit-tap-highlight-color: transparent;
65
+ }
66
+
67
+ .target {
68
+ box-sizing: border-box;
69
+ display: flex;
70
+ flex: 1 1 auto;
71
+ flex-direction: inherit;
72
+ align-items: inherit;
73
+ align-self: stretch;
74
+ justify-content: inherit;
75
+ gap: inherit;
76
+ min-width: 0;
77
+ margin: 0;
78
+ padding: 0;
79
+ border: 0;
80
+ background: none;
81
+ color: inherit;
82
+ font: inherit;
83
+ letter-spacing: inherit;
84
+ text-align: inherit;
85
+ text-decoration: none;
86
+ cursor: pointer;
87
+ outline: none;
88
+ appearance: none;
89
+ }
90
+ .target::before,
91
+ .target::after {
92
+ content: "";
93
+ position: absolute;
94
+ inset: 0;
95
+ border-radius: var(--ds-row-radius, 0);
96
+ }
97
+ .target::before { z-index: 1; }
98
+ .target::after { z-index: -1; }
99
+ ::slotted([slot="end"]) { position: relative; z-index: 2; }
100
+
101
+ .target:hover::after { background: var(--ds-row-fill-hover, var(--ds-fill)); }
102
+ .target:active::after { background: var(--ds-row-fill-press, var(--ds-fill-hover)); }
103
+ .target[aria-current] {
104
+ --ds-type-weight-default: var(--ds-row-current-weight, 500);
105
+ font-weight: var(--ds-row-current-weight, 500);
106
+ }
107
+ .target[aria-current]::after { background: var(--ds-row-fill-current, var(--ds-fill-hover)); }
108
+ .target:focus-visible::after { outline: 2px solid var(--ds-focus-ring); outline-offset: -2px; }
109
+
110
+ :host([disabled]) .target { cursor: default; opacity: 0.5; }
111
+ :host([disabled]) .target::after { background: none; }
112
+
113
+ /* A navigation row: the sidebar's two-pixel corners. */
114
+ :host([nav]) { --ds-row-radius: calc(2px * var(--ds-sf)); }
115
+
116
+ @media (forced-colors: active) {
117
+ .target[aria-current]::after { outline: 1px solid Highlight; outline-offset: -1px; }
118
+ .target:focus-visible::after { outline-color: Highlight; }
119
+ }
@@ -0,0 +1,117 @@
1
+ @import "../../1-root/component-metrics.css";
2
+
3
+ :host {
4
+ display: flex;
5
+ flex-direction: column;
6
+ width: calc(12 * var(--ds-unit));
7
+ max-width: 100%;
8
+ min-width: 0;
9
+ min-height: 0;
10
+ color: var(--ds-text-color);
11
+ font-family: var(--ds-typeface-regular);
12
+ font-feature-settings: var(--ds-font-features);
13
+ font-size: var(--ds-type-size-default);
14
+ font-weight: var(--ds-type-weight-default);
15
+ line-height: var(--ds-type-lineheight-default);
16
+ letter-spacing: var(--ds-type-letterspacing-default);
17
+ }
18
+ nav {
19
+ flex: 1 1 auto;
20
+ min-height: 0;
21
+ overflow-y: auto;
22
+ overscroll-behavior: contain;
23
+ scrollbar-width: thin;
24
+ padding: calc(var(--ds-unit) / 2) 0;
25
+ }
26
+ ::slotted([slot="header"]), ::slotted([slot="footer"]) { flex: none; }
27
+ .row {
28
+ --ds-row-gap: 0px;
29
+ border-radius: calc(2px * var(--ds-sf));
30
+ padding-inline: calc(4px * var(--ds-sf));
31
+ padding-inline-start: calc(4px * var(--ds-sf) + var(--depth) * var(--ds-unit) / 2);
32
+ }
33
+ /* The look of every pressable row (ds-row, .ds-row, the tree's rows): the same tokens, the same fallbacks. */
34
+ .row:hover { background: var(--ds-row-fill-hover, var(--ds-fill)); }
35
+ .row[data-current] { background: var(--ds-row-fill-current, var(--ds-fill-hover)); }
36
+ .row[data-current] .choice { --ds-type-weight-default: var(--ds-row-current-weight, 500); }
37
+ ds-button { --ds-corner-size: 0px; --ds-button-padding: 0; }
38
+ .disclosure { flex: 0 0 var(--ds-unit); width: var(--ds-unit); }
39
+ .spacer { flex: 1; }
40
+ .disclosure { --ds-button-color: var(--ds-text-color-muted); --ds-button-height: var(--ds-row-height); }
41
+ ds-icon { transform: rotate(0deg); }
42
+ ds-icon[data-open] { transform: rotate(90deg); }
43
+ .choice { flex: 0 1 auto; min-width: 0; }
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; }
46
+ .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
+ .action { margin-inline-start: calc(4px * var(--ds-sf)); --ds-text-size: 10px; --ds-button-color: var(--ds-text-color-muted); }
48
+ .empty { margin: 0; padding: calc(var(--ds-unit) / 2); color: var(--ds-text-color-muted); }
49
+ @media (forced-colors: active) { .row[data-current] { outline: 1px solid Highlight; outline-offset: -1px; } }
50
+
51
+ /* ---- Tree: the same rows as the native .ds-sidebar tree in 1-root/row.css. ---- */
52
+ .tree {
53
+ flex: 1 1 auto;
54
+ display: flex;
55
+ flex-direction: column;
56
+ min-width: 0;
57
+ min-height: 0;
58
+ overflow-y: auto;
59
+ overscroll-behavior: contain;
60
+ scrollbar-width: thin;
61
+ }
62
+
63
+ /* One square high, its contents on the lower sixteen as every row's; each level one square
64
+ further in, so a row's arrow stands under its parent's label. */
65
+ .tree .item {
66
+ box-sizing: border-box;
67
+ display: flex;
68
+ align-items: flex-end;
69
+ height: var(--ds-row-height);
70
+ min-width: 0;
71
+ padding-inline: calc(var(--depth, 0) * var(--ds-unit)) var(--ds-row-padding, calc(4px * var(--ds-sf)));
72
+ border-radius: 0;
73
+ white-space: nowrap;
74
+ cursor: pointer;
75
+ user-select: none;
76
+ -webkit-tap-highlight-color: transparent;
77
+ outline: none;
78
+ }
79
+ .tree .item:hover:not([aria-disabled="true"]) { background: var(--ds-row-fill-hover, var(--ds-fill)); }
80
+ .tree .item:active:not([aria-disabled="true"]) { background: var(--ds-row-fill-press, var(--ds-fill-hover)); }
81
+ .tree .item[aria-selected="true"] {
82
+ --ds-type-weight-default: var(--ds-row-current-weight, 500);
83
+ background: var(--ds-row-fill-current, var(--ds-fill-hover));
84
+ font-weight: var(--ds-row-current-weight, 500);
85
+ }
86
+ .tree .item:focus-visible { outline: 2px solid var(--ds-focus-ring); outline-offset: -2px; }
87
+ .tree .item[aria-disabled="true"] { cursor: default; opacity: 0.5; }
88
+
89
+ /* The arrow and the icon each take a whole square, drawn on the row's sixteen (the square's
90
+ spare four above); a leaf keeps an empty one so labels line up. */
91
+ .tree .disclosure, .tree .icon {
92
+ box-sizing: border-box;
93
+ display: inline-flex;
94
+ flex: 0 0 var(--ds-unit);
95
+ justify-content: center;
96
+ align-items: center;
97
+ width: var(--ds-unit);
98
+ height: var(--ds-unit);
99
+ padding-top: calc(var(--ds-unit) - var(--ds-control-height));
100
+ }
101
+ .tree .disclosure { color: var(--ds-text-color-muted); }
102
+ .tree .disclosure ds-icon { transition: transform 120ms ease-out; }
103
+ .tree .label {
104
+ flex: 1 1 auto;
105
+ min-width: 0;
106
+ padding-inline-start: calc(4px * var(--ds-sf));
107
+ overflow: hidden;
108
+ text-overflow: ellipsis;
109
+ }
110
+
111
+ @media (prefers-reduced-motion: reduce) {
112
+ .tree .disclosure ds-icon { transition: none; }
113
+ }
114
+ @media (forced-colors: active) {
115
+ .tree .item[aria-selected="true"] { outline: 1px solid Highlight; outline-offset: -1px; }
116
+ .tree .item:focus-visible { outline-color: Highlight; }
117
+ }
@@ -1,80 +1,9 @@
1
1
  /* ds-table.css */
2
- /* Data table component styles */
2
+ /* The element only places the table; 1-root/table.css draws it. */
3
3
 
4
4
  :host {
5
5
  display: block;
6
6
  width: 100%;
7
+ min-width: 0;
7
8
  }
8
-
9
- .table-container {
10
- display: flex;
11
- flex-direction: column;
12
- width: 100%;
13
- }
14
-
15
- .table-header {
16
- display: grid;
17
- grid-template-columns: 160px 80px 80px 80px;
18
- height: 20px;
19
- width: 400px;
20
- }
21
-
22
- .table-body {
23
- display: grid;
24
- grid-template-columns: 160px 80px 80px 80px;
25
- border: 1px solid var(--black);
26
- width: 400px;
27
- }
28
-
29
- .header-cell {
30
- height: 20px;
31
- display: flex;
32
- align-items: center;
33
- justify-content: left;
34
- padding: 0 2px;
35
- font-family: var(--typeface-regular);
36
- font-size: var(--type-size-default);
37
- font-weight: var(--type-weight-default);
38
- line-height: var(--type-lineheight-default);
39
- color: var(--black);
40
- letter-spacing: -0.26px;
41
- }
42
-
43
- .data-cell {
44
- height: 20px;
45
- margin-top: -1px;
46
- display: flex;
47
- align-items: center;
48
- justify-content: left;
49
- outline: 1px solid var(--black);
50
- font-family: var(--typeface-regular);
51
- font-size: var(--type-size-default);
52
- font-weight: var(--type-weight-default);
53
- line-height: var(--type-lineheight-default);
54
- color: var(--black);
55
- letter-spacing: -0.26px;
56
- }
57
-
58
- .status-cell {
59
- background-color: transparent;
60
- text-align: center;
61
- }
62
-
63
- .product-cell {
64
- text-align: left;
65
- justify-content: flex-start;
66
- }
67
-
68
- .users-cell,
69
- .retention-cell {
70
- text-align: center;
71
- }
72
-
73
- /* Responsive adjustments */
74
- @media (max-width: 480px) {
75
- .table-header,
76
- .table-body {
77
- width: 100%;
78
- grid-template-columns: 1fr 60px 60px 60px;
79
- }
80
- }
9
+ :host([hidden]) { display: none !important; }
@@ -2,11 +2,17 @@ import { LitElement, css, html, unsafeCSS } from "lit";
2
2
  import { define } from "../0-face/define";
3
3
  import "../2-core/ds-button";
4
4
  import "../2-core/ds-icon";
5
+ import { bindDialogSwipe, type DialogPlacement } from "../0-face/dialog-swipe";
5
6
  import "./styles/ds-dialog.css";
6
- import dialogStyles from "./styles/ds-dialog.css?inline";
7
+ import "../1-root/dialog-placement.css";
8
+ import frameStyles from "./styles/ds-dialog.css?inline";
9
+ import placementStyles from "../1-root/dialog-placement.css?inline";
7
10
  import metrics from "../1-root/component-metrics.css?inline";
8
11
 
9
- export type DialogCloseReason = "escape" | "backdrop" | "outside" | "button" | "native";
12
+ export type { DialogPlacement } from "../0-face/dialog-swipe";
13
+ export type DialogCloseReason = "escape" | "backdrop" | "outside" | "button" | "native" | "swipe";
14
+ const dialogStyles = `${frameStyles}\n${placementStyles}`;
15
+ const PLACEMENTS = new Set<string>(["sheet", "end", "start"]);
10
16
  const openDialogs = new WeakMap<Document, Set<Dialog>>();
11
17
  type SavedStyle = { style: CSSStyleDeclaration; name: string; value: string; priority: string; locked: string };
12
18
  const scrollStyles = new WeakMap<Document, { declarations: SavedStyle[]; x: number; y: number }>();
@@ -60,6 +66,9 @@ function styleRoot(root: Node) {
60
66
  /** A native light-DOM dialog keeps forms and accessible ID references together.
61
67
  * The browser owns the top layer, inert background and modal focus navigation.
62
68
  * Listen to ds-close-request and preventDefault to control whether it closes.
69
+ * `placement` stands it in the centre (the default), as a sheet from the
70
+ * bottom (`"sheet"`) or as a drawer at the end or start (`"end"`, `"start"`),
71
+ * which slide in and out and a finger swipes away (reason `"swipe"`).
63
72
  */
64
73
  export class Dialog extends LitElement {
65
74
  static properties = {
@@ -70,10 +79,11 @@ export class Dialog extends LitElement {
70
79
  holdScroll: { type: Boolean, attribute: "hold-scroll" },
71
80
  closeOnEscape: { type: Boolean, attribute: "close-on-escape" },
72
81
  closeOnBackdrop: { type: Boolean, attribute: "close-on-backdrop" },
82
+ placement: { type: String, reflect: true },
73
83
  anchor: { attribute: false },
74
84
  returnFocus: { attribute: false },
75
85
  };
76
- static styles = [unsafeCSS(metrics), css`:host { display: contents; }`];
86
+ static styles = [unsafeCSS(metrics), css`:host { display: contents; } :host([hidden]) { display: none !important; }`];
77
87
  declare open: boolean;
78
88
  declare nonModal: boolean;
79
89
  declare closeOnOutside: boolean;
@@ -81,6 +91,8 @@ export class Dialog extends LitElement {
81
91
  declare holdScroll: boolean;
82
92
  declare closeOnEscape: boolean;
83
93
  declare closeOnBackdrop: boolean;
94
+ /** Where it stands: `"center"`, a `"sheet"` from the bottom, or a drawer at the `"end"` or `"start"`. An anchored panel ignores it. */
95
+ declare placement: DialogPlacement;
84
96
  /** A viewport point for a floating panel; null uses ordinary dialog layout. */
85
97
  declare anchor: { x: number; y: number } | null;
86
98
  /** Resolve a replacement opener after the product has rendered its closed state. */
@@ -92,6 +104,7 @@ export class Dialog extends LitElement {
92
104
  private outsidePress: boolean | null = null;
93
105
  private observer = new MutationObserver(() => this.bindDialog());
94
106
  private sizeObserver: ResizeObserver | null = null;
107
+ private unbindSwipe: (() => void) | null = null;
95
108
 
96
109
  constructor() {
97
110
  super();
@@ -102,6 +115,7 @@ export class Dialog extends LitElement {
102
115
  this.holdScroll = false;
103
116
  this.closeOnEscape = true;
104
117
  this.closeOnBackdrop = true;
118
+ this.placement = "center";
105
119
  this.anchor = null;
106
120
  this.returnFocus = null;
107
121
  }
@@ -119,7 +133,25 @@ export class Dialog extends LitElement {
119
133
  super.disconnectedCallback();
120
134
  }
121
135
 
122
- protected updated() { this.syncOpen(); this.place(); }
136
+ protected updated() { this.syncPlacement(); this.syncOpen(); this.place(); }
137
+
138
+ /** Mark the native frame with its placement before it opens, so it slides in from its edge, and let a finger swipe it away. */
139
+ private syncPlacement() {
140
+ const dialog = this.dialog;
141
+ if (!dialog) return;
142
+ const placement = !this.anchor && PLACEMENTS.has(this.placement) ? this.placement : null;
143
+ if (placement) dialog.setAttribute("data-ds-placement", placement);
144
+ else dialog.removeAttribute("data-ds-placement");
145
+ if (placement && !this.unbindSwipe) {
146
+ this.unbindSwipe = bindDialogSwipe(dialog, {
147
+ placement: () => (!this.anchor && PLACEMENTS.has(this.placement) ? this.placement : "center"),
148
+ onDismiss: () => this.requestClose("swipe"),
149
+ });
150
+ } else if (!placement && this.unbindSwipe) {
151
+ this.unbindSwipe();
152
+ this.unbindSwipe = null;
153
+ }
154
+ }
123
155
 
124
156
  /** Keep an anchored panel inside the visible viewport as its content or keyboard changes. */
125
157
  place = () => {
@@ -147,6 +179,7 @@ export class Dialog extends LitElement {
147
179
  dialog?.addEventListener("close", this.onNativeClose);
148
180
  dialog?.addEventListener("pointerdown", this.onPointerDown);
149
181
  dialog?.addEventListener("click", this.onClick);
182
+ this.syncPlacement();
150
183
  this.syncOpen();
151
184
  };
152
185
 
@@ -156,6 +189,9 @@ export class Dialog extends LitElement {
156
189
  dialog?.removeEventListener("close", this.onNativeClose);
157
190
  dialog?.removeEventListener("pointerdown", this.onPointerDown);
158
191
  dialog?.removeEventListener("click", this.onClick);
192
+ this.unbindSwipe?.();
193
+ this.unbindSwipe = null;
194
+ dialog?.removeAttribute("data-ds-placement");
159
195
  if (dialog?.open) dialog.close();
160
196
  this.release();
161
197
  this.dialog = null;
@@ -0,0 +1,240 @@
1
+ // ds-document.ts
2
+ // A document page (terms, a privacy policy, a legal notice, a help article):
3
+ // the writing as prose, with contents built from its headings that mark the
4
+ // section in view. Drawn by 1-root/document.css, the same classes a page
5
+ // without scripts writes; the writing stays in the page and prose.css draws it.
6
+
7
+ import { LitElement, html, nothing, unsafeCSS } from "lit";
8
+ import { getText } from "../0-face/i18n";
9
+ import { define } from "../0-face/define";
10
+ import metrics from "../1-root/component-metrics.css?inline";
11
+ import documentSheet from "../1-root/document.css?inline";
12
+ import documentRules from "../1-root/document.css?raw";
13
+ import proseRules from "../1-root/prose.css?raw";
14
+ import styles from "./styles/ds-document.css?inline";
15
+
16
+ /** The shared word over the contents. */
17
+ export const CONTENTS_LABEL = "Contents";
18
+
19
+ /** One entry in the contents: a heading in the writing. */
20
+ export interface DocumentEntry {
21
+ id: string;
22
+ text: string;
23
+ level: number;
24
+ }
25
+
26
+ /**
27
+ * An id for a heading from its words: letters and digits in any script,
28
+ * joined by hyphens, unique among `taken`. Words with none of either get
29
+ * `section-<n>`.
30
+ */
31
+ export function headingId(text: string, taken: Set<string>, index: number): string {
32
+ const base = text.normalize("NFKC").toLowerCase().trim().replace(/[^\p{L}\p{N}]+/gu, "-").replace(/^-+|-+$/g, "") || `section-${index + 1}`;
33
+ let id = base;
34
+ for (let n = 2; taken.has(id); n++) id = `${base}-${n}`;
35
+ taken.add(id);
36
+ return id;
37
+ }
38
+
39
+ /** The heading levels an attribute names, between 2 and 6: `2` by default, `2 3` for two levels. */
40
+ export function documentLevels(value: string | null | undefined): number[] {
41
+ const levels = [...new Set(String(value ?? "2").split(/[\s,]+/).map(Number).filter(level => Number.isInteger(level) && level >= 2 && level <= 6))].sort();
42
+ return levels.length ? levels : [2];
43
+ }
44
+
45
+ /**
46
+ * The rules for the writing, which stands in the page: prose.css and the
47
+ * definition table, adopted once per root the element stands in. Their
48
+ * imports (the tokens) are left out: the element's host carries the measures,
49
+ * and the writing inherits them.
50
+ */
51
+ const styledRoots = new WeakSet<Document | ShadowRoot>();
52
+ function styleRoot(root: Node) {
53
+ const target = root instanceof ShadowRoot ? root : root instanceof Document ? root : null;
54
+ if (!target || styledRoots.has(target) || typeof CSSStyleSheet === "undefined" || !("adoptedStyleSheets" in target)) return;
55
+ try {
56
+ const sheet = new CSSStyleSheet();
57
+ sheet.replaceSync([proseRules, documentRules].map(css => css.replace(/^@import[^;]*;\s*$/gm, "")).join("\n"));
58
+ target.adoptedStyleSheets = [...target.adoptedStyleSheets, sheet];
59
+ styledRoots.add(target);
60
+ } catch {
61
+ // A browser without constructable sheets keeps the page's own copy of prose.css.
62
+ }
63
+ }
64
+
65
+ /**
66
+ * @element ds-document
67
+ * @prop {string} levels - The heading levels the contents list: `2` by default, `2 3` for two.
68
+ * @prop {string} label - The contents' title: a translation key, the shared word "Contents" by default.
69
+ * @prop {boolean} literal - Show `label` as written, never looked up.
70
+ * @prop {boolean} hideContents - Leave the contents out (`hide-contents`).
71
+ *
72
+ * @slot - The writing: native headings, paragraphs, lists, tables and a
73
+ * definition table (`<dl class="ds-definitions">`), as prose. The element
74
+ * marks itself `data-ds-prose` and brings the prose sheet.
75
+ * @slot contents - Contents of the page's own, in place of the built ones.
76
+ *
77
+ * The contents list the writing's headings at `levels`, giving a heading an
78
+ * id from its words when it has none. A link scrolls to its heading, and the
79
+ * section in view is marked `aria-current="location"`. With fewer than two
80
+ * headings there are no contents.
81
+ *
82
+ * @example
83
+ * <ds-document>
84
+ * <h1>Terms</h1>
85
+ * <h2>Using the service</h2><p>…</p>
86
+ * <h2>Payments</h2><p>…</p>
87
+ * </ds-document>
88
+ */
89
+ export class DocumentPage extends LitElement {
90
+ static properties = {
91
+ levels: { type: String },
92
+ label: { type: String },
93
+ literal: { type: Boolean, reflect: true },
94
+ hideContents: { type: Boolean, attribute: "hide-contents", reflect: true },
95
+ entries: { state: true },
96
+ current: { state: true },
97
+ };
98
+
99
+ static styles = [unsafeCSS(metrics), unsafeCSS(documentSheet), unsafeCSS(styles)];
100
+
101
+ declare levels: string;
102
+ declare label: string | undefined;
103
+ declare literal: boolean;
104
+ declare hideContents: boolean;
105
+ declare entries: DocumentEntry[];
106
+ declare current: string | null;
107
+
108
+ private readonly relabel = () => this.requestUpdate();
109
+ private observer: MutationObserver | null = null;
110
+ private frame = 0;
111
+
112
+ constructor() {
113
+ super();
114
+ this.levels = "2";
115
+ this.literal = false;
116
+ this.hideContents = false;
117
+ this.entries = [];
118
+ this.current = null;
119
+ }
120
+
121
+ connectedCallback() {
122
+ super.connectedCallback();
123
+ styleRoot(this.getRootNode());
124
+ if (!this.hasAttribute("data-ds-prose")) this.setAttribute("data-ds-prose", "");
125
+ window.addEventListener("language-changed", this.relabel);
126
+ window.addEventListener("translations-loaded", this.relabel);
127
+ document.addEventListener("scroll", this.onScroll, { capture: true, passive: true });
128
+ window.addEventListener("resize", this.onScroll, { passive: true });
129
+ this.observer = new MutationObserver(() => this.collect());
130
+ this.observer.observe(this, { childList: true, subtree: true, characterData: true, attributes: true, attributeFilter: ["id"] });
131
+ this.collect();
132
+ }
133
+
134
+ disconnectedCallback() {
135
+ window.removeEventListener("language-changed", this.relabel);
136
+ window.removeEventListener("translations-loaded", this.relabel);
137
+ document.removeEventListener("scroll", this.onScroll, { capture: true });
138
+ window.removeEventListener("resize", this.onScroll);
139
+ this.observer?.disconnect();
140
+ this.observer = null;
141
+ cancelAnimationFrame(this.frame);
142
+ super.disconnectedCallback();
143
+ }
144
+
145
+ protected willUpdate(changed: Map<PropertyKey, unknown>) {
146
+ if (changed.has("levels") && this.hasUpdated) this.collect();
147
+ }
148
+
149
+ /** The headings the contents list, in the order they stand. */
150
+ get headings(): HTMLElement[] {
151
+ const levels = documentLevels(this.levels);
152
+ return [...this.querySelectorAll<HTMLElement>(levels.map(level => `h${level}`).join(","))]
153
+ .filter(heading => !heading.closest("[data-ds-not-prose]") && !heading.closest('[slot="contents"]'));
154
+ }
155
+
156
+ /** Reads the headings again: their words, levels and ids. */
157
+ collect(): void {
158
+ const taken = new Set([...this.querySelectorAll("[id]")].map(element => element.id));
159
+ const entries = this.headings.map((heading, index) => {
160
+ const text = (heading.textContent ?? "").replace(/\s+/g, " ").trim();
161
+ if (!heading.id) {
162
+ // Writing an id is a change the observer would hear; it reads the same.
163
+ heading.id = headingId(text, taken, index);
164
+ }
165
+ return { id: heading.id, text, level: Number(heading.tagName.slice(1)) };
166
+ });
167
+ const same = entries.length === this.entries.length && entries.every((entry, i) => entry.id === this.entries[i]!.id && entry.text === this.entries[i]!.text && entry.level === this.entries[i]!.level);
168
+ if (!same) this.entries = entries;
169
+ this.onScroll();
170
+ }
171
+
172
+ /**
173
+ * The section in view: the last heading at or above a fifth of the way down
174
+ * the view, or, scrolled to the foot of the page, the last heading in view.
175
+ */
176
+ private onScroll = () => {
177
+ cancelAnimationFrame(this.frame);
178
+ this.frame = requestAnimationFrame(() => {
179
+ const view = window.innerHeight || 0;
180
+ // At the foot of the page the last sections cannot reach the line: the last one in view is current.
181
+ const end = document.documentElement;
182
+ const line = view && window.scrollY > 0 && window.scrollY + view >= end.scrollHeight - 1 ? view : view / 5;
183
+ let current: string | null = null;
184
+ for (const entry of this.entries) {
185
+ const heading = this.heading(entry.id);
186
+ if (!heading) continue;
187
+ if (heading.getBoundingClientRect().top <= line) current = entry.id;
188
+ else break;
189
+ }
190
+ this.current = current ?? this.entries[0]?.id ?? null;
191
+ });
192
+ };
193
+
194
+ private heading(id: string): HTMLElement | undefined {
195
+ return this.headings.find(heading => heading.id === id);
196
+ }
197
+
198
+ private follow(event: MouseEvent, id: string) {
199
+ if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;
200
+ const heading = this.heading(id);
201
+ if (!heading) return;
202
+ event.preventDefault();
203
+ const smooth = !window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;
204
+ heading.scrollIntoView({ block: "start", behavior: smooth ? "smooth" : "auto" });
205
+ if (!heading.hasAttribute("tabindex")) heading.setAttribute("tabindex", "-1");
206
+ heading.focus({ preventScroll: true });
207
+ history.replaceState(history.state, "", `#${id}`);
208
+ this.current = id;
209
+ }
210
+
211
+ render() {
212
+ const label = this.literal ? this.label || CONTENTS_LABEL : getText(this.label || CONTENTS_LABEL) || this.label || CONTENTS_LABEL;
213
+ const top = Math.min(...this.entries.map(entry => entry.level));
214
+ const own = [...this.children].some(child => child.getAttribute("slot") === "contents");
215
+ const showContents = !this.hideContents && (own || this.entries.length >= 2);
216
+ return html`<div class="ds-document" part="document">
217
+ <nav class="ds-document__toc" part="contents" aria-labelledby="contents-title" ?hidden=${!showContents}>
218
+ <div class="ds-document__contents">
219
+ <p class="ds-document__toc-title" id="contents-title" part="contents-title">${label}</p>
220
+ <slot name="contents" @slotchange=${this.relabel}>
221
+ <ol class="ds-document__toc-list" part="contents-list">
222
+ ${this.entries.map(entry => html`<li class=${entry.level > top ? "ds-document__toc-sub" : nothing}>
223
+ <a href="#${entry.id}" aria-current=${this.current === entry.id ? "location" : nothing} @click=${(event: MouseEvent) => this.follow(event, entry.id)}>${entry.text}</a>
224
+ </li>`)}
225
+ </ol>
226
+ </slot>
227
+ </div>
228
+ </nav>
229
+ <div class="ds-document__body" part="body"><slot></slot></div>
230
+ </div>`;
231
+ }
232
+ }
233
+
234
+ define("ds-document", DocumentPage);
235
+
236
+ declare global {
237
+ interface HTMLElementTagNameMap {
238
+ "ds-document": DocumentPage;
239
+ }
240
+ }