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

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 (722) 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 +14 -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 +891 -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/library-tokens.ts +91 -0
  66. package/DS1/1-root/measures.ts +53 -0
  67. package/DS1/1-root/notice.css +165 -0
  68. package/DS1/1-root/one.css +14 -84
  69. package/DS1/1-root/one.semantic.css +200 -148
  70. package/DS1/1-root/palette.css +58 -0
  71. package/DS1/1-root/palette.ts +19 -0
  72. package/DS1/1-root/progress.css +356 -0
  73. package/DS1/1-root/prose.css +202 -0
  74. package/DS1/1-root/row.css +300 -0
  75. package/DS1/1-root/table.css +111 -0
  76. package/DS1/1-root/text.css +70 -0
  77. package/DS1/2-core/button-split.ts +55 -0
  78. package/DS1/2-core/chart/chart.css +169 -0
  79. package/DS1/2-core/chart/grid-chart.ts +554 -0
  80. package/DS1/2-core/ds-avatar.ts +25 -6
  81. package/DS1/2-core/ds-badge.ts +10 -10
  82. package/DS1/2-core/ds-button.ts +111 -26
  83. package/DS1/2-core/ds-card.ts +135 -105
  84. package/DS1/2-core/ds-chart.ts +327 -0
  85. package/DS1/2-core/ds-composer.ts +8 -2
  86. package/DS1/2-core/ds-cycle.ts +97 -21
  87. package/DS1/2-core/ds-empty.ts +120 -0
  88. package/DS1/2-core/ds-icon.ts +11 -2
  89. package/DS1/2-core/ds-input.ts +165 -6
  90. package/DS1/2-core/ds-message.ts +218 -0
  91. package/DS1/2-core/ds-notice.ts +10 -0
  92. package/DS1/2-core/ds-progress.ts +380 -0
  93. package/DS1/2-core/ds-stat.ts +174 -0
  94. package/DS1/2-core/ds-switch.ts +1 -0
  95. package/DS1/2-core/ds-text.ts +15 -2
  96. package/DS1/2-core/ds-toast.ts +354 -0
  97. package/DS1/2-core/figures.ts +105 -0
  98. package/DS1/2-core/generated/ds-icon-map.ts +238 -128
  99. package/DS1/2-core/generated/icon-avatar.ts +2 -0
  100. package/DS1/2-core/generated/icons-extra.ts +120 -65
  101. package/DS1/2-core/generated/icons-immediate.ts +1 -1
  102. package/DS1/2-core/styles/ds-avatar.css +9 -8
  103. package/DS1/2-core/styles/ds-button-host.css +26 -3
  104. package/DS1/2-core/styles/ds-button-split.css +67 -0
  105. package/DS1/2-core/styles/ds-button.css +49 -15
  106. package/DS1/2-core/styles/ds-card.css +34 -0
  107. package/DS1/2-core/styles/ds-composer.css +13 -0
  108. package/DS1/2-core/styles/ds-cycle.css +10 -0
  109. package/DS1/2-core/styles/ds-empty.css +18 -0
  110. package/DS1/2-core/styles/ds-gap.css +1 -0
  111. package/DS1/2-core/styles/ds-icon.css +1 -0
  112. package/DS1/2-core/styles/ds-input.css +59 -6
  113. package/DS1/2-core/styles/ds-notice.css +32 -0
  114. package/DS1/2-core/styles/ds-progress.css +25 -0
  115. package/DS1/2-core/styles/ds-select.css +2 -2
  116. package/DS1/2-core/styles/ds-split.css +2 -62
  117. package/DS1/2-core/styles/ds-stat.css +34 -0
  118. package/DS1/2-core/styles/ds-switch.css +16 -1
  119. package/DS1/2-core/styles/ds-text.css +43 -12
  120. package/DS1/2-core/styles/ds-toast.css +182 -0
  121. package/DS1/2-core/styles/ds-tooltip.css +1 -0
  122. package/DS1/3-unit/calendar-base.ts +263 -0
  123. package/DS1/3-unit/ds-accordion.ts +9 -1
  124. package/DS1/3-unit/ds-avatar-group.ts +1 -0
  125. package/DS1/3-unit/ds-calendar-large.ts +349 -0
  126. package/DS1/3-unit/ds-calendar.ts +344 -0
  127. package/DS1/3-unit/ds-carousel.ts +368 -0
  128. package/DS1/3-unit/ds-date-picker.ts +540 -0
  129. package/DS1/3-unit/ds-form.ts +45 -37
  130. package/DS1/3-unit/ds-list.ts +48 -1
  131. package/DS1/3-unit/ds-matrix.ts +318 -0
  132. package/DS1/3-unit/ds-menu.ts +8 -4
  133. package/DS1/3-unit/ds-row.ts +84 -1
  134. package/DS1/3-unit/ds-sidebar.ts +366 -0
  135. package/DS1/3-unit/ds-table.ts +75 -34
  136. package/DS1/3-unit/styles/ds-accordion.css +1 -0
  137. package/DS1/3-unit/styles/ds-avatar-group.css +2 -4
  138. package/DS1/3-unit/styles/ds-calendar-large.css +165 -0
  139. package/DS1/3-unit/styles/ds-calendar.css +238 -0
  140. package/DS1/3-unit/styles/ds-carousel.css +30 -0
  141. package/DS1/3-unit/styles/ds-date-picker.css +124 -0
  142. package/DS1/3-unit/styles/ds-list.css +1 -0
  143. package/DS1/3-unit/styles/ds-matrix.css +203 -0
  144. package/DS1/3-unit/styles/ds-menu.css +31 -6
  145. package/DS1/3-unit/styles/ds-row.css +84 -2
  146. package/DS1/3-unit/styles/ds-sidebar.css +134 -0
  147. package/DS1/3-unit/styles/ds-table.css +3 -74
  148. package/DS1/4-page/ds-dialog.ts +40 -4
  149. package/DS1/4-page/ds-document.ts +240 -0
  150. package/DS1/4-page/ds-footer.ts +165 -0
  151. package/DS1/4-page/ds-grid.ts +39 -59
  152. package/DS1/4-page/ds-header.ts +171 -0
  153. package/DS1/4-page/ds-page.ts +184 -0
  154. package/DS1/4-page/email.ts +2 -3
  155. package/DS1/4-page/styles/ds-container.css +1 -0
  156. package/DS1/4-page/styles/ds-document.css +18 -0
  157. package/DS1/4-page/styles/ds-footer.css +29 -0
  158. package/DS1/4-page/styles/ds-grid.css +31 -85
  159. package/DS1/4-page/styles/ds-header.css +57 -0
  160. package/DS1/4-page/styles/ds-page.css +214 -0
  161. package/DS1/components.ts +7 -1
  162. package/DS1/index.ts +24 -6
  163. package/DS1/react/avatar.ts +4 -5
  164. package/DS1/react/button-split.ts +29 -0
  165. package/DS1/react/button.ts +32 -13
  166. package/DS1/react/carousel.ts +76 -0
  167. package/DS1/react/dialog.ts +36 -5
  168. package/DS1/react/document.ts +14 -0
  169. package/DS1/react/empty.ts +32 -0
  170. package/DS1/react/footer.ts +17 -0
  171. package/DS1/react/header.ts +15 -0
  172. package/DS1/react/input.ts +28 -17
  173. package/DS1/react/message.ts +73 -0
  174. package/DS1/react/notice.ts +59 -0
  175. package/DS1/react/page.ts +13 -0
  176. package/DS1/react/progress.ts +99 -0
  177. package/DS1/react/sidebar.ts +71 -0
  178. package/DS1/react/stat.ts +73 -0
  179. package/DS1/react/toast.ts +82 -0
  180. package/DS1/x-icon/Tabler-LICENSE.md +27 -0
  181. package/DS1/x-icon/airtable.svg +5 -0
  182. package/DS1/x-icon/attach.svg +3 -0
  183. package/DS1/x-icon/audio.svg +3 -0
  184. package/DS1/x-icon/bag-alt.svg +3 -0
  185. package/DS1/x-icon/bank.svg +3 -0
  186. package/DS1/x-icon/banknote.svg +3 -0
  187. package/DS1/x-icon/bolt.svg +3 -0
  188. package/DS1/x-icon/book-alt.svg +3 -0
  189. package/DS1/x-icon/book.svg +4 -0
  190. package/DS1/x-icon/box.svg +3 -0
  191. package/DS1/x-icon/briefcase.svg +3 -0
  192. package/DS1/x-icon/building.svg +4 -0
  193. package/DS1/x-icon/car.svg +3 -0
  194. package/DS1/x-icon/card.svg +3 -0
  195. package/DS1/x-icon/cart.svg +3 -0
  196. package/DS1/x-icon/{ezo-android-screen-stats.svg → chevron-down.svg} +1 -1
  197. package/DS1/x-icon/{ezo-item-button-start.svg → chevron-left.svg} +1 -1
  198. package/DS1/x-icon/{ezo-android-screen-lists.svg → chevron-right.svg} +1 -1
  199. package/DS1/x-icon/{ezo-item-button-reopen.svg → chevron-up.svg} +1 -1
  200. package/DS1/x-icon/cloud.svg +3 -0
  201. package/DS1/x-icon/coffee.svg +3 -0
  202. package/DS1/x-icon/coins.svg +3 -0
  203. package/DS1/x-icon/cursor.svg +3 -0
  204. package/DS1/x-icon/curve.svg +7 -0
  205. package/DS1/x-icon/dislike.svg +4 -0
  206. package/DS1/x-icon/dot-bank.svg +3 -0
  207. package/DS1/x-icon/dot-banknote.svg +3 -0
  208. package/DS1/x-icon/dot-banknotes.svg +3 -0
  209. package/DS1/x-icon/dot-card.svg +3 -0
  210. package/DS1/x-icon/dot-coin.svg +3 -0
  211. package/DS1/x-icon/dot-coins.svg +3 -0
  212. package/DS1/x-icon/dot-receipt.svg +3 -0
  213. package/DS1/x-icon/dot-safe.svg +3 -0
  214. package/DS1/x-icon/dot-transfer.svg +3 -0
  215. package/DS1/x-icon/dot-wallet.svg +3 -0
  216. package/DS1/x-icon/download.svg +4 -0
  217. package/DS1/x-icon/drive.svg +5 -0
  218. package/DS1/x-icon/drop.svg +3 -0
  219. package/DS1/x-icon/dropbox.svg +3 -0
  220. package/DS1/x-icon/dumbbell.svg +3 -0
  221. package/DS1/x-icon/eye-off.svg +3 -0
  222. package/DS1/x-icon/eye.svg +3 -0
  223. package/DS1/x-icon/facebook.svg +3 -0
  224. package/DS1/x-icon/figma.svg +5 -0
  225. package/DS1/x-icon/flame.svg +3 -0
  226. package/DS1/x-icon/flip.svg +5 -0
  227. package/DS1/x-icon/food.svg +3 -0
  228. package/DS1/x-icon/fuel.svg +3 -0
  229. package/DS1/x-icon/game.svg +3 -0
  230. package/DS1/x-icon/gift.svg +3 -0
  231. package/DS1/x-icon/github.svg +3 -0
  232. package/DS1/x-icon/heart.svg +3 -0
  233. package/DS1/x-icon/history.svg +3 -0
  234. package/DS1/x-icon/home-alt.svg +3 -0
  235. package/DS1/x-icon/income.svg +3 -0
  236. package/DS1/x-icon/info.svg +5 -0
  237. package/DS1/x-icon/instagram.svg +5 -0
  238. package/DS1/x-icon/jpbank.svg +3 -0
  239. package/DS1/x-icon/key.svg +4 -0
  240. package/DS1/x-icon/keyboard.svg +3 -0
  241. package/DS1/x-icon/like.svg +4 -0
  242. package/DS1/x-icon/linkedin.svg +7 -0
  243. package/DS1/x-icon/loom.svg +6 -0
  244. package/DS1/x-icon/map.svg +4 -0
  245. package/DS1/x-icon/medical.svg +3 -0
  246. package/DS1/x-icon/minus.svg +3 -0
  247. package/DS1/x-icon/moon.svg +3 -0
  248. package/DS1/x-icon/move.svg +3 -0
  249. package/DS1/x-icon/music-alt.svg +3 -0
  250. package/DS1/x-icon/music.svg +5 -0
  251. package/DS1/x-icon/notion.svg +6 -0
  252. package/DS1/x-icon/offline.svg +3 -0
  253. package/DS1/x-icon/pause.svg +4 -0
  254. package/DS1/x-icon/paw.svg +3 -0
  255. package/DS1/x-icon/pdf.svg +3 -0
  256. package/DS1/x-icon/people.svg +5 -0
  257. package/DS1/x-icon/percent.svg +3 -0
  258. package/DS1/x-icon/phone.svg +3 -0
  259. package/DS1/x-icon/pill.svg +3 -0
  260. package/DS1/x-icon/plane.svg +3 -0
  261. package/DS1/x-icon/postal.svg +3 -0
  262. package/DS1/x-icon/present.svg +4 -0
  263. package/DS1/x-icon/reaction.svg +5 -0
  264. package/DS1/x-icon/receipt.svg +3 -0
  265. package/DS1/x-icon/refresh.svg +3 -0
  266. package/DS1/x-icon/refund.svg +3 -0
  267. package/DS1/x-icon/repeat.svg +3 -0
  268. package/DS1/x-icon/rotate.svg +4 -0
  269. package/DS1/x-icon/safe.svg +3 -0
  270. package/DS1/x-icon/school-alt.svg +3 -0
  271. package/DS1/x-icon/shield-alt.svg +3 -0
  272. package/DS1/x-icon/shield.svg +4 -0
  273. package/DS1/x-icon/shirt.svg +3 -0
  274. package/DS1/x-icon/shop.svg +3 -0
  275. package/DS1/x-icon/sign-in.svg +3 -0
  276. package/DS1/x-icon/sign-out.svg +3 -0
  277. package/DS1/x-icon/slack.svg +6 -0
  278. package/DS1/x-icon/sparkle.svg +3 -0
  279. package/DS1/x-icon/start.svg +4 -0
  280. package/DS1/x-icon/stop.svg +3 -0
  281. package/DS1/x-icon/sun.svg +3 -0
  282. package/DS1/x-icon/system.svg +4 -0
  283. package/DS1/x-icon/tag.svg +3 -0
  284. package/DS1/x-icon/ticket.svg +3 -0
  285. package/DS1/x-icon/title-struck.svg +4 -0
  286. package/DS1/x-icon/train.svg +3 -0
  287. package/DS1/x-icon/transfer.svg +3 -0
  288. package/DS1/x-icon/tv.svg +3 -0
  289. package/DS1/x-icon/upload.svg +4 -0
  290. package/DS1/x-icon/video.svg +4 -0
  291. package/DS1/x-icon/vimeo.svg +3 -0
  292. package/DS1/x-icon/wallet.svg +3 -0
  293. package/DS1/x-icon/wifi.svg +3 -0
  294. package/DS1/x-icon/window.svg +4 -0
  295. package/DS1/x-icon/wrench.svg +3 -0
  296. package/DS1/x-icon/x-brand.svg +4 -0
  297. package/DS1/x-icon/youtube.svg +4 -0
  298. package/README.md +3 -3
  299. package/dist/0-face/calendar.d.ts +75 -0
  300. package/dist/0-face/calendar.d.ts.map +1 -0
  301. package/dist/0-face/calendar.js +149 -0
  302. package/dist/0-face/carousel.d.ts +174 -0
  303. package/dist/0-face/carousel.d.ts.map +1 -0
  304. package/dist/0-face/carousel.js +583 -0
  305. package/dist/0-face/component-visibility.d.ts +7 -0
  306. package/dist/0-face/component-visibility.d.ts.map +1 -0
  307. package/dist/0-face/component-visibility.js +11 -0
  308. package/dist/0-face/copy-text.d.ts +11 -0
  309. package/dist/0-face/copy-text.d.ts.map +1 -0
  310. package/dist/0-face/copy-text.js +97 -0
  311. package/dist/0-face/device.d.ts +3 -7
  312. package/dist/0-face/device.d.ts.map +1 -1
  313. package/dist/0-face/device.js +7 -41
  314. package/dist/0-face/dialog-swipe.d.ts +49 -0
  315. package/dist/0-face/dialog-swipe.d.ts.map +1 -0
  316. package/dist/0-face/dialog-swipe.js +239 -0
  317. package/dist/0-face/dialogs.d.ts +33 -0
  318. package/dist/0-face/dialogs.d.ts.map +1 -0
  319. package/dist/0-face/dialogs.js +173 -0
  320. package/dist/0-face/drawer.d.ts +64 -0
  321. package/dist/0-face/drawer.d.ts.map +1 -0
  322. package/dist/0-face/drawer.js +256 -0
  323. package/dist/0-face/feedback-words.d.ts +21 -0
  324. package/dist/0-face/feedback-words.d.ts.map +1 -0
  325. package/dist/0-face/feedback-words.js +30 -0
  326. package/dist/0-face/feedback.d.ts +41 -0
  327. package/dist/0-face/feedback.d.ts.map +1 -0
  328. package/dist/0-face/feedback.js +35 -0
  329. package/dist/0-face/format.d.ts +166 -0
  330. package/dist/0-face/format.d.ts.map +1 -0
  331. package/dist/0-face/format.js +445 -0
  332. package/dist/0-face/generated/toast-assets.d.ts +11 -0
  333. package/dist/0-face/generated/toast-assets.d.ts.map +1 -0
  334. package/dist/0-face/generated/toast-assets.js +14 -0
  335. package/dist/0-face/grid-fit.js +1 -1
  336. package/dist/0-face/grid.d.ts.map +1 -1
  337. package/dist/0-face/grid.js +2 -1
  338. package/dist/0-face/header.d.ts +38 -0
  339. package/dist/0-face/header.d.ts.map +1 -0
  340. package/dist/0-face/header.js +80 -0
  341. package/dist/0-face/i18n.d.ts +32 -2
  342. package/dist/0-face/i18n.d.ts.map +1 -1
  343. package/dist/0-face/i18n.js +65 -19
  344. package/dist/0-face/keys.d.ts +104 -0
  345. package/dist/0-face/keys.d.ts.map +1 -0
  346. package/dist/0-face/keys.js +253 -0
  347. package/dist/0-face/languages.d.ts +2 -2
  348. package/dist/0-face/languages.js +3 -3
  349. package/dist/0-face/layout-inspector.js +6 -6
  350. package/dist/0-face/library-styles.d.ts +7 -0
  351. package/dist/0-face/library-styles.d.ts.map +1 -0
  352. package/dist/0-face/library-styles.js +29 -0
  353. package/dist/0-face/load-toaster.d.ts +8 -0
  354. package/dist/0-face/load-toaster.d.ts.map +1 -0
  355. package/dist/0-face/load-toaster.js +7 -0
  356. package/dist/0-face/preference-options.d.ts +34 -0
  357. package/dist/0-face/preference-options.d.ts.map +1 -0
  358. package/dist/0-face/preference-options.js +1 -0
  359. package/dist/0-face/preferences.d.ts +3 -12
  360. package/dist/0-face/preferences.d.ts.map +1 -1
  361. package/dist/0-face/pricing.d.ts +19 -9
  362. package/dist/0-face/pricing.d.ts.map +1 -1
  363. package/dist/0-face/pricing.js +81 -40
  364. package/dist/0-face/scaling.d.ts +71 -1
  365. package/dist/0-face/scaling.d.ts.map +1 -1
  366. package/dist/0-face/scaling.js +108 -3
  367. package/dist/0-face/shared-words.d.ts +9 -4
  368. package/dist/0-face/shared-words.d.ts.map +1 -1
  369. package/dist/0-face/sidebar.d.ts +69 -0
  370. package/dist/0-face/sidebar.d.ts.map +1 -0
  371. package/dist/0-face/sidebar.js +191 -0
  372. package/dist/0-face/theme-bootstrap.d.ts +1 -0
  373. package/dist/0-face/theme-bootstrap.d.ts.map +1 -0
  374. package/dist/0-face/theme-bootstrap.js +214 -0
  375. package/dist/0-face/theme.d.ts +32 -0
  376. package/dist/0-face/theme.d.ts.map +1 -1
  377. package/dist/0-face/theme.js +69 -43
  378. package/dist/0-face/toast-queue.d.ts +110 -0
  379. package/dist/0-face/toast-queue.d.ts.map +1 -0
  380. package/dist/0-face/toast-queue.js +98 -0
  381. package/dist/0-face/toaster.d.ts +27 -0
  382. package/dist/0-face/toaster.d.ts.map +1 -0
  383. package/dist/0-face/toaster.js +373 -0
  384. package/dist/0-face/tooltips.d.ts +24 -1
  385. package/dist/0-face/tooltips.d.ts.map +1 -1
  386. package/dist/0-face/tooltips.js +155 -16
  387. package/dist/0-face/translations/da.json +60 -1
  388. package/dist/0-face/translations/de.json +60 -1
  389. package/dist/0-face/translations/en.json +60 -1
  390. package/dist/0-face/translations/es.json +60 -1
  391. package/dist/0-face/translations/fi.json +60 -1
  392. package/dist/0-face/translations/fr.json +60 -1
  393. package/dist/0-face/translations/is.json +60 -1
  394. package/dist/0-face/translations/it.json +60 -1
  395. package/dist/0-face/translations/ja.json +60 -1
  396. package/dist/0-face/translations/ko.json +60 -1
  397. package/dist/0-face/translations/nb.json +60 -1
  398. package/dist/0-face/translations/pt-BR.json +60 -1
  399. package/dist/0-face/translations/pt.json +60 -1
  400. package/dist/0-face/translations/sv.json +60 -1
  401. package/dist/0-face/translations/zh.json +60 -1
  402. package/dist/0-face/translations-format.d.ts.map +1 -1
  403. package/dist/0-face/translations-format.js +3 -4
  404. package/dist/1-root/library-tokens.d.ts +31 -0
  405. package/dist/1-root/library-tokens.d.ts.map +1 -0
  406. package/dist/1-root/library-tokens.js +84 -0
  407. package/dist/1-root/measures.d.ts +52 -0
  408. package/dist/1-root/measures.d.ts.map +1 -0
  409. package/dist/1-root/measures.js +49 -0
  410. package/dist/1-root/palette.d.ts +5 -0
  411. package/dist/1-root/palette.d.ts.map +1 -1
  412. package/dist/1-root/palette.js +18 -0
  413. package/dist/2-core/button-split.d.ts +21 -0
  414. package/dist/2-core/button-split.d.ts.map +1 -0
  415. package/dist/2-core/button-split.js +48 -0
  416. package/dist/2-core/chart/grid-chart.d.ts +113 -0
  417. package/dist/2-core/chart/grid-chart.d.ts.map +1 -0
  418. package/dist/2-core/chart/grid-chart.js +466 -0
  419. package/dist/2-core/ds-avatar.d.ts +20 -3
  420. package/dist/2-core/ds-avatar.d.ts.map +1 -1
  421. package/dist/2-core/ds-avatar.js +19 -5
  422. package/dist/2-core/ds-badge.js +10 -13
  423. package/dist/2-core/ds-button.d.ts +76 -0
  424. package/dist/2-core/ds-button.d.ts.map +1 -1
  425. package/dist/2-core/ds-button.js +101 -26
  426. package/dist/2-core/ds-card.d.ts +76 -11
  427. package/dist/2-core/ds-card.d.ts.map +1 -1
  428. package/dist/2-core/ds-card.js +129 -105
  429. package/dist/2-core/ds-chart.d.ts +105 -0
  430. package/dist/2-core/ds-chart.d.ts.map +1 -0
  431. package/dist/2-core/ds-chart.js +390 -0
  432. package/dist/2-core/ds-composer.d.ts +7 -0
  433. package/dist/2-core/ds-composer.d.ts.map +1 -1
  434. package/dist/2-core/ds-composer.js +1 -1
  435. package/dist/2-core/ds-cycle.d.ts +36 -2
  436. package/dist/2-core/ds-cycle.d.ts.map +1 -1
  437. package/dist/2-core/ds-cycle.js +95 -18
  438. package/dist/2-core/ds-empty.d.ts +74 -0
  439. package/dist/2-core/ds-empty.d.ts.map +1 -0
  440. package/dist/2-core/ds-empty.js +96 -0
  441. package/dist/2-core/ds-icon.d.ts +6 -0
  442. package/dist/2-core/ds-icon.d.ts.map +1 -1
  443. package/dist/2-core/ds-icon.js +12 -2
  444. package/dist/2-core/ds-input.d.ts +39 -1
  445. package/dist/2-core/ds-input.d.ts.map +1 -1
  446. package/dist/2-core/ds-input.js +150 -6
  447. package/dist/2-core/ds-message.d.ts +154 -0
  448. package/dist/2-core/ds-message.d.ts.map +1 -0
  449. package/dist/2-core/ds-message.js +177 -0
  450. package/dist/2-core/ds-notice.d.ts +13 -0
  451. package/dist/2-core/ds-notice.d.ts.map +1 -0
  452. package/dist/2-core/ds-notice.js +11 -0
  453. package/dist/2-core/ds-progress.d.ts +200 -0
  454. package/dist/2-core/ds-progress.d.ts.map +1 -0
  455. package/dist/2-core/ds-progress.js +319 -0
  456. package/dist/2-core/ds-stat.d.ts +126 -0
  457. package/dist/2-core/ds-stat.d.ts.map +1 -0
  458. package/dist/2-core/ds-stat.js +137 -0
  459. package/dist/2-core/ds-switch.d.ts +1 -0
  460. package/dist/2-core/ds-switch.d.ts.map +1 -1
  461. package/dist/2-core/ds-switch.js +1 -0
  462. package/dist/2-core/ds-text.d.ts +15 -2
  463. package/dist/2-core/ds-text.d.ts.map +1 -1
  464. package/dist/2-core/ds-text.js +13 -0
  465. package/dist/2-core/ds-toast.d.ts +139 -0
  466. package/dist/2-core/ds-toast.d.ts.map +1 -0
  467. package/dist/2-core/ds-toast.js +329 -0
  468. package/dist/2-core/figures.d.ts +56 -0
  469. package/dist/2-core/figures.d.ts.map +1 -0
  470. package/dist/2-core/figures.js +70 -0
  471. package/dist/2-core/generated/ds-icon-map.d.ts +120 -65
  472. package/dist/2-core/generated/ds-icon-map.d.ts.map +1 -1
  473. package/dist/2-core/generated/ds-icon-map.js +238 -128
  474. package/dist/2-core/generated/icon-avatar.d.ts +2 -0
  475. package/dist/2-core/generated/icon-avatar.d.ts.map +1 -0
  476. package/dist/2-core/generated/icon-avatar.js +2 -0
  477. package/dist/2-core/generated/icons-extra.d.ts.map +1 -1
  478. package/dist/2-core/generated/icons-extra.js +120 -65
  479. package/dist/2-core/generated/icons-immediate.d.ts +1 -1
  480. package/dist/2-core/generated/icons-immediate.d.ts.map +1 -1
  481. package/dist/2-core/generated/icons-immediate.js +1 -1
  482. package/dist/3-unit/calendar-base.d.ts +149 -0
  483. package/dist/3-unit/calendar-base.d.ts.map +1 -0
  484. package/dist/3-unit/calendar-base.js +172 -0
  485. package/dist/3-unit/ds-accordion.d.ts +9 -0
  486. package/dist/3-unit/ds-accordion.d.ts.map +1 -1
  487. package/dist/3-unit/ds-accordion.js +7 -1
  488. package/dist/3-unit/ds-avatar-group.d.ts +1 -0
  489. package/dist/3-unit/ds-avatar-group.d.ts.map +1 -1
  490. package/dist/3-unit/ds-calendar-large.d.ts +138 -0
  491. package/dist/3-unit/ds-calendar-large.d.ts.map +1 -0
  492. package/dist/3-unit/ds-calendar-large.js +305 -0
  493. package/dist/3-unit/ds-calendar.d.ts +175 -0
  494. package/dist/3-unit/ds-calendar.d.ts.map +1 -0
  495. package/dist/3-unit/ds-calendar.js +303 -0
  496. package/dist/3-unit/ds-carousel.d.ts +182 -0
  497. package/dist/3-unit/ds-carousel.d.ts.map +1 -0
  498. package/dist/3-unit/ds-carousel.js +327 -0
  499. package/dist/3-unit/ds-date-picker.d.ts +203 -0
  500. package/dist/3-unit/ds-date-picker.d.ts.map +1 -0
  501. package/dist/3-unit/ds-date-picker.js +499 -0
  502. package/dist/3-unit/ds-form.d.ts.map +1 -1
  503. package/dist/3-unit/ds-form.js +38 -28
  504. package/dist/3-unit/ds-list.d.ts +12 -0
  505. package/dist/3-unit/ds-list.d.ts.map +1 -1
  506. package/dist/3-unit/ds-list.js +52 -1
  507. package/dist/3-unit/ds-matrix.d.ts +146 -0
  508. package/dist/3-unit/ds-matrix.d.ts.map +1 -0
  509. package/dist/3-unit/ds-matrix.js +248 -0
  510. package/dist/3-unit/ds-menu.d.ts +1 -1
  511. package/dist/3-unit/ds-menu.d.ts.map +1 -1
  512. package/dist/3-unit/ds-menu.js +7 -4
  513. package/dist/3-unit/ds-row.d.ts +66 -0
  514. package/dist/3-unit/ds-row.d.ts.map +1 -1
  515. package/dist/3-unit/ds-row.js +80 -1
  516. package/dist/3-unit/ds-sidebar.d.ts +149 -0
  517. package/dist/3-unit/ds-sidebar.d.ts.map +1 -0
  518. package/dist/3-unit/ds-sidebar.js +342 -0
  519. package/dist/3-unit/ds-table.d.ts +28 -10
  520. package/dist/3-unit/ds-table.d.ts.map +1 -1
  521. package/dist/3-unit/ds-table.js +53 -25
  522. package/dist/4-page/ds-dialog.d.ts +16 -1
  523. package/dist/4-page/ds-dialog.d.ts.map +1 -1
  524. package/dist/4-page/ds-dialog.js +39 -3
  525. package/dist/4-page/ds-document.d.ts +98 -0
  526. package/dist/4-page/ds-document.d.ts.map +1 -0
  527. package/dist/4-page/ds-document.js +213 -0
  528. package/dist/4-page/ds-footer.d.ts +100 -0
  529. package/dist/4-page/ds-footer.d.ts.map +1 -0
  530. package/dist/4-page/ds-footer.js +119 -0
  531. package/dist/4-page/ds-grid.d.ts +32 -12
  532. package/dist/4-page/ds-grid.d.ts.map +1 -1
  533. package/dist/4-page/ds-grid.js +30 -39
  534. package/dist/4-page/ds-header.d.ts +84 -0
  535. package/dist/4-page/ds-header.d.ts.map +1 -0
  536. package/dist/4-page/ds-header.js +143 -0
  537. package/dist/4-page/ds-page.d.ts +110 -0
  538. package/dist/4-page/ds-page.d.ts.map +1 -0
  539. package/dist/4-page/ds-page.js +155 -0
  540. package/dist/4-page/email.d.ts +2 -3
  541. package/dist/4-page/email.d.ts.map +1 -1
  542. package/dist/4-page/email.js +2 -3
  543. package/dist/components.d.ts +4 -1
  544. package/dist/components.d.ts.map +1 -1
  545. package/dist/components.js +4 -1
  546. package/dist/design-system-1.bundle.js +12322 -5523
  547. package/dist/design-system-1.bundle.js.map +1 -1
  548. package/dist/design-system-1.bundle.min.js +8771 -4115
  549. package/dist/design-system-1.bundle.min.js.map +1 -1
  550. package/dist/design-system-1.css +1 -1
  551. package/dist/feedback.js +541 -0
  552. package/dist/feedback.js.map +1 -0
  553. package/dist/{icons-extra-BoAACA4X.js → icons-extra-CiDDs7_-.js} +404 -312
  554. package/dist/icons-extra-CiDDs7_-.js.map +1 -0
  555. package/dist/{icons-extra-DlxTo_Y4.js → icons-extra-hauwCx07.js} +121 -66
  556. package/dist/icons-extra-hauwCx07.js.map +1 -0
  557. package/dist/index.d.ts +21 -6
  558. package/dist/index.d.ts.map +1 -1
  559. package/dist/index.js +21 -6
  560. package/dist/react/avatar.d.ts +5 -9
  561. package/dist/react/avatar.d.ts.map +1 -1
  562. package/dist/react/avatar.js +2 -2
  563. package/dist/react/button-split.d.ts +19 -0
  564. package/dist/react/button-split.d.ts.map +1 -0
  565. package/dist/react/{split.js → button-split.js} +12 -9
  566. package/dist/react/button.d.ts +18 -7
  567. package/dist/react/button.d.ts.map +1 -1
  568. package/dist/react/button.js +13 -4
  569. package/dist/react/carousel.d.ts +63 -0
  570. package/dist/react/carousel.d.ts.map +1 -0
  571. package/dist/react/carousel.js +47 -0
  572. package/dist/react/choice.d.ts +1 -1
  573. package/dist/react/context-menu.d.ts +337 -337
  574. package/dist/react/dialog.d.ts +684 -678
  575. package/dist/react/dialog.d.ts.map +1 -1
  576. package/dist/react/dialog.js +29 -3
  577. package/dist/react/document.d.ts +11 -0
  578. package/dist/react/document.d.ts.map +1 -0
  579. package/dist/react/document.js +10 -0
  580. package/dist/react/empty.d.ts +34 -0
  581. package/dist/react/empty.d.ts.map +1 -0
  582. package/dist/react/empty.js +8 -0
  583. package/dist/react/file-picker.d.ts +1 -1
  584. package/dist/react/footer.d.ts +13 -0
  585. package/dist/react/footer.d.ts.map +1 -0
  586. package/dist/react/footer.js +12 -0
  587. package/dist/react/header.d.ts +12 -0
  588. package/dist/react/header.d.ts.map +1 -0
  589. package/dist/react/header.js +11 -0
  590. package/dist/react/input.d.ts +31 -9
  591. package/dist/react/input.d.ts.map +1 -1
  592. package/dist/react/input.js +94 -94
  593. package/dist/react/message.d.ts +66 -0
  594. package/dist/react/message.d.ts.map +1 -0
  595. package/dist/react/message.js +37 -0
  596. package/dist/react/notice.d.ts +45 -0
  597. package/dist/react/notice.d.ts.map +1 -0
  598. package/dist/react/notice.js +34 -0
  599. package/dist/react/page.d.ts +10 -0
  600. package/dist/react/page.d.ts.map +1 -0
  601. package/dist/react/page.js +9 -0
  602. package/dist/react/progress.d.ts +107 -0
  603. package/dist/react/progress.d.ts.map +1 -0
  604. package/dist/react/progress.js +47 -0
  605. package/dist/react/sidebar.d.ts +54 -0
  606. package/dist/react/sidebar.d.ts.map +1 -0
  607. package/dist/react/sidebar.js +48 -0
  608. package/dist/react/stat.d.ts +78 -0
  609. package/dist/react/stat.d.ts.map +1 -0
  610. package/dist/react/stat.js +25 -0
  611. package/dist/react/toast.d.ts +37 -0
  612. package/dist/react/toast.d.ts.map +1 -0
  613. package/dist/react/toast.js +55 -0
  614. package/dist/shared-words-CyZYc_De.js +1818 -0
  615. package/dist/shared-words-CyZYc_De.js.map +1 -0
  616. package/dist/shared-words-DAVSET4Z.js +1800 -0
  617. package/dist/shared-words-DAVSET4Z.js.map +1 -0
  618. package/package.json +19 -6
  619. package/DS1/2-core/ds-banner.ts +0 -122
  620. package/DS1/2-core/ds-date.ts +0 -24
  621. package/DS1/2-core/ds-language.ts +0 -94
  622. package/DS1/2-core/ds-pagedots.ts +0 -52
  623. package/DS1/2-core/ds-split.ts +0 -122
  624. package/DS1/2-core/ds-textarea.ts +0 -136
  625. package/DS1/2-core/styles/ds-banner.css +0 -77
  626. package/DS1/2-core/styles/ds-date.css +0 -9
  627. package/DS1/2-core/styles/ds-language.css +0 -78
  628. package/DS1/2-core/styles/ds-pagedots.css +0 -31
  629. package/DS1/2-core/styles/ds-textarea.css +0 -27
  630. package/DS1/4-page/ds-layout.ts +0 -949
  631. package/DS1/4-page/styles/ds-layout.css +0 -246
  632. package/DS1/react/split.ts +0 -42
  633. package/DS1/x-icon/ezo-accordion-chevron.svg +0 -11
  634. package/DS1/x-icon/ezo-account-close.svg +0 -1
  635. package/DS1/x-icon/ezo-android-screen-archive.svg +0 -4
  636. package/DS1/x-icon/ezo-android-screen-calendar.svg +0 -6
  637. package/DS1/x-icon/ezo-android-screen-camera.svg +0 -5
  638. package/DS1/x-icon/ezo-android-screen-check.svg +0 -3
  639. package/DS1/x-icon/ezo-android-screen-compose.svg +0 -4
  640. package/DS1/x-icon/ezo-android-screen-globe.svg +0 -1
  641. package/DS1/x-icon/ezo-android-screen-shared.svg +0 -5
  642. package/DS1/x-icon/ezo-android-screen-store.svg +0 -4
  643. package/DS1/x-icon/ezo-android-screen-views.svg +0 -4
  644. package/DS1/x-icon/ezo-android-screen-work.svg +0 -3
  645. package/DS1/x-icon/ezo-arrow-cursor.svg +0 -8
  646. package/DS1/x-icon/ezo-block-accordion.svg +0 -1
  647. package/DS1/x-icon/ezo-block-divider.svg +0 -1
  648. package/DS1/x-icon/ezo-block-group.svg +0 -1
  649. package/DS1/x-icon/ezo-block-image.svg +0 -1
  650. package/DS1/x-icon/ezo-block-section.svg +0 -1
  651. package/DS1/x-icon/ezo-block-table.svg +0 -1
  652. package/DS1/x-icon/ezo-code.svg +0 -14
  653. package/DS1/x-icon/ezo-down.svg +0 -3
  654. package/DS1/x-icon/ezo-figma-premium-star.svg +0 -5
  655. package/DS1/x-icon/ezo-item-button-complete.svg +0 -4
  656. package/DS1/x-icon/ezo-item-button-header.svg +0 -3
  657. package/DS1/x-icon/ezo-item-button-open.svg +0 -3
  658. package/DS1/x-icon/ezo-item-button-star.svg +0 -3
  659. package/DS1/x-icon/ezo-item-button-unheader.svg +0 -7
  660. package/DS1/x-icon/ezo-item-button-unstar.svg +0 -5
  661. package/DS1/x-icon/ezo-item-star.svg +0 -5
  662. package/DS1/x-icon/ezo-left.svg +0 -3
  663. package/DS1/x-icon/ezo-logo.svg +0 -1
  664. package/DS1/x-icon/ezo-mic.svg +0 -8
  665. package/DS1/x-icon/ezo-move-column.svg +0 -14
  666. package/DS1/x-icon/ezo-move-row.svg +0 -18
  667. package/DS1/x-icon/ezo-navigation-check.svg +0 -1
  668. package/DS1/x-icon/ezo-note-back.svg +0 -5
  669. package/DS1/x-icon/ezo-note-menu-complete.svg +0 -11
  670. package/DS1/x-icon/ezo-note-menu-delete.svg +0 -4
  671. package/DS1/x-icon/ezo-note-menu-duplicate.svg +0 -8
  672. package/DS1/x-icon/ezo-note-menu-note.svg +0 -5
  673. package/DS1/x-icon/ezo-note-menu-page.svg +0 -3
  674. package/DS1/x-icon/ezo-note-menu-star.svg +0 -5
  675. package/DS1/x-icon/ezo-note-menu-start.svg +0 -6
  676. package/DS1/x-icon/ezo-note-menu-stop.svg +0 -6
  677. package/DS1/x-icon/ezo-note-more.svg +0 -7
  678. package/DS1/x-icon/ezo-note-star.svg +0 -5
  679. package/DS1/x-icon/ezo-pattern-call-to-action.svg +0 -1
  680. package/DS1/x-icon/ezo-play.svg +0 -5
  681. package/DS1/x-icon/ezo-premium-star.svg +0 -5
  682. package/DS1/x-icon/ezo-setting-1xdots.svg +0 -13
  683. package/DS1/x-icon/ezo-setting-1xgrid.svg +0 -10
  684. package/DS1/x-icon/ezo-setting-1xlines.svg +0 -7
  685. package/DS1/x-icon/ezo-setting-2xdots.svg +0 -8
  686. package/DS1/x-icon/ezo-setting-2xgrid.svg +0 -8
  687. package/DS1/x-icon/ezo-setting-2xlines.svg +0 -6
  688. package/DS1/x-icon/ezo-setting-blank.svg +0 -5
  689. package/DS1/x-icon/ezo-store-chevron.svg +0 -1
  690. package/DS1/x-icon/ezo-upgrade-close.svg +0 -5
  691. package/DS1/x-icon/product-sources.json +0 -2557
  692. package/dist/2-core/ds-banner.d.ts +0 -68
  693. package/dist/2-core/ds-banner.d.ts.map +0 -1
  694. package/dist/2-core/ds-banner.js +0 -98
  695. package/dist/2-core/ds-date.d.ts +0 -16
  696. package/dist/2-core/ds-date.d.ts.map +0 -1
  697. package/dist/2-core/ds-date.js +0 -15
  698. package/dist/2-core/ds-language.d.ts +0 -75
  699. package/dist/2-core/ds-language.d.ts.map +0 -1
  700. package/dist/2-core/ds-language.js +0 -74
  701. package/dist/2-core/ds-pagedots.d.ts +0 -32
  702. package/dist/2-core/ds-pagedots.d.ts.map +0 -1
  703. package/dist/2-core/ds-pagedots.js +0 -36
  704. package/dist/2-core/ds-split.d.ts +0 -75
  705. package/dist/2-core/ds-split.d.ts.map +0 -1
  706. package/dist/2-core/ds-split.js +0 -101
  707. package/dist/2-core/ds-textarea.d.ts +0 -46
  708. package/dist/2-core/ds-textarea.d.ts.map +0 -1
  709. package/dist/2-core/ds-textarea.js +0 -121
  710. package/dist/4-page/ds-layout.d.ts +0 -31
  711. package/dist/4-page/ds-layout.d.ts.map +0 -1
  712. package/dist/4-page/ds-layout.js +0 -930
  713. package/dist/icons-extra-BoAACA4X.js.map +0 -1
  714. package/dist/icons-extra-DlxTo_Y4.js.map +0 -1
  715. package/dist/react/split.d.ts +0 -15
  716. package/dist/react/split.d.ts.map +0 -1
  717. package/dist/shared-words-Cg6Phtx0.js +0 -915
  718. package/dist/shared-words-Cg6Phtx0.js.map +0 -1
  719. package/dist/shared-words-Ddz0yUEF.js +0 -933
  720. package/dist/shared-words-Ddz0yUEF.js.map +0 -1
  721. /package/DS1/x-icon/{ezo-password-visibility-see.svg → password-see.svg} +0 -0
  722. /package/DS1/x-icon/{ezo-password-visibility-unsee.svg → password-unsee.svg} +0 -0
@@ -0,0 +1,120 @@
1
+ // ds-empty.ts
2
+ // An empty state: a place with nothing in it yet, and what to do about it.
3
+ // Drawn by 1-root/empty.css, the same classes a page without scripts writes.
4
+
5
+ import { LitElement, html, nothing, unsafeCSS } from "lit";
6
+ import { getText } from "../0-face/i18n";
7
+ import { define } from "../0-face/define";
8
+ import "./ds-icon";
9
+ import metrics from "../1-root/component-metrics.css?inline";
10
+ import empty from "../1-root/empty.css?inline";
11
+ import styles from "./styles/ds-empty.css?inline";
12
+
13
+ /** The shared words' title for an empty place, in the current language. */
14
+ export const EMPTY_HEADING = "Nothing here yet";
15
+
16
+ /**
17
+ * @element ds-empty
18
+ * @prop {string} heading - The title: a translation key, or the words as they
19
+ * stand with `literal`. Unset, the shared words' "Nothing here yet".
20
+ * @prop {string} text - The line under it: a translation key, or literal words.
21
+ * @prop {boolean} literal - Show `heading` and `text` as written, never looked up.
22
+ * @prop {string} icon - An icon from the library on the square above the title.
23
+ * @prop {boolean} centered - Centre the words in the space the element stands in.
24
+ * @prop {number} level - Make the title a heading of this level (1–6).
25
+ *
26
+ * @slot - The text, when it needs more than words: a link, a strong word.
27
+ * @slot heading - The title, as inline content.
28
+ * @slot icon - An icon of the page's own, in place of `icon`.
29
+ * @slot actions - The buttons or links that fill the place, on one row.
30
+ *
31
+ * @example
32
+ * <ds-empty icon="search" heading="No results" text="Try another word.">
33
+ * <ds-button slot="actions" secondary>Clear the search</ds-button>
34
+ * </ds-empty>
35
+ */
36
+ export class Empty extends LitElement {
37
+ static properties = {
38
+ heading: { type: String },
39
+ text: { type: String },
40
+ literal: { type: Boolean, reflect: true },
41
+ icon: { type: String },
42
+ centered: { type: Boolean, reflect: true },
43
+ level: { type: Number },
44
+ };
45
+
46
+ static styles = [unsafeCSS(metrics), unsafeCSS(empty), unsafeCSS(styles)];
47
+
48
+ declare heading: string | undefined;
49
+ declare text: string | undefined;
50
+ declare literal: boolean;
51
+ declare icon: string | undefined;
52
+ declare centered: boolean;
53
+ declare level: number | undefined;
54
+
55
+ private readonly relabel = () => this.requestUpdate();
56
+
57
+ constructor() {
58
+ super();
59
+ this.literal = false;
60
+ this.centered = false;
61
+ }
62
+
63
+ connectedCallback() {
64
+ super.connectedCallback();
65
+ window.addEventListener("language-changed", this.relabel);
66
+ window.addEventListener("translations-loaded", this.relabel);
67
+ }
68
+
69
+ disconnectedCallback() {
70
+ window.removeEventListener("language-changed", this.relabel);
71
+ window.removeEventListener("translations-loaded", this.relabel);
72
+ super.disconnectedCallback();
73
+ }
74
+
75
+ private words(value: string | undefined): string {
76
+ if (!value) return "";
77
+ return this.literal ? value : getText(value) || value;
78
+ }
79
+
80
+ /**
81
+ * Whether light-DOM content fills a slot: elements, or text that is not
82
+ * blank. The blank text between slotted children still counts as assigned
83
+ * to the default slot and hides its fallback, so `text` is drawn beside the
84
+ * slot rather than inside it.
85
+ */
86
+ private slotted(name: string): boolean {
87
+ return [...this.childNodes].some(node => name
88
+ ? node instanceof Element && node.getAttribute("slot") === name
89
+ : node instanceof Element ? !node.hasAttribute("slot") : node.nodeType === Node.TEXT_NODE && Boolean(node.textContent?.trim()));
90
+ }
91
+
92
+ render() {
93
+ const heading = this.heading ? this.words(this.heading) : getText(EMPTY_HEADING) || EMPTY_HEADING;
94
+ const text = this.words(this.text);
95
+ const hasIcon = Boolean(this.icon) || this.slotted("icon");
96
+ const slottedText = this.slotted("");
97
+ const hasText = Boolean(text) || slottedText;
98
+ const hasActions = this.slotted("actions");
99
+ const level = this.level && this.level >= 1 && this.level <= 6 ? Math.round(this.level) : undefined;
100
+ const changed = () => this.requestUpdate();
101
+ return html`<div class="ds-empty${this.centered ? " ds-empty--centered" : ""}" part="empty">
102
+ <div class="ds-empty__icon" part="icon" aria-hidden="true" ?hidden=${!hasIcon}>
103
+ <slot name="icon" @slotchange=${changed}>${this.icon ? html`<ds-icon size="large" .type=${this.icon}></ds-icon>` : nothing}</slot>
104
+ </div>
105
+ <div class="ds-empty__title" part="title" role=${level ? "heading" : nothing} aria-level=${level ?? nothing}>
106
+ <slot name="heading" @slotchange=${changed}>${heading}</slot>
107
+ </div>
108
+ <div class="ds-empty__text" part="text" ?hidden=${!hasText}><slot @slotchange=${changed}></slot>${slottedText ? nothing : text}</div>
109
+ <div class="ds-empty__actions" part="actions" ?hidden=${!hasActions}><slot name="actions" @slotchange=${changed}></slot></div>
110
+ </div>`;
111
+ }
112
+ }
113
+
114
+ define("ds-empty", Empty);
115
+
116
+ declare global {
117
+ interface HTMLElementTagNameMap {
118
+ "ds-empty": Empty;
119
+ }
120
+ }
@@ -7,6 +7,15 @@ import { define } from "../0-face/define";
7
7
 
8
8
  const iconNameToSvgMap: Record<string, string> = { ...immediateIcons }
9
9
  const deferred = new Set<string>(deferredIconNames)
10
+
11
+ /**
12
+ * Make library drawings available at once, outside the immediate set: a
13
+ * component that always draws one icon (ds-avatar's person) ships that
14
+ * drawing with itself, so it never waits for the deferred chunk.
15
+ */
16
+ export function provideIcons(icons: Readonly<Record<string, string>>): void {
17
+ for (const [name, svg] of Object.entries(icons)) iconNameToSvgMap[name.toLowerCase()] ??= svg
18
+ }
10
19
  let extraReady = false
11
20
  let extraLoading: Promise<void> | undefined
12
21
  function loadExtraIcons(): Promise<void> {
@@ -30,8 +39,8 @@ function loadExtraIcons(): Promise<void> {
30
39
  * one-colour icon is turned over to `currentColor` here, where the component
31
40
  * puts it on the page, so it takes the colour of the text around it.
32
41
  *
33
- * An icon with colours of its own is left exactly as drawn. Consistency's block
34
- * and pattern tiles set dark ink on a coloured ground, and a brand mark keeps
42
+ * An icon with colours of its own is left exactly as drawn. The block and
43
+ * pattern tiles set dark ink on a coloured ground, and a brand mark keeps
35
44
  * the colours that make it that brand. `white` never counts as a colour: in
36
45
  * this set it is the rectangle inside a `<clipPath>`.
37
46
  */
@@ -3,10 +3,11 @@
3
3
 
4
4
  import { LitElement, html, unsafeCSS, type CSSResultGroup, type PropertyDeclarations } from "lit";
5
5
  import { live } from "lit/directives/live.js";
6
+ import { styleMap } from "lit/directives/style-map.js";
6
7
  import { ifDefined } from "lit/directives/if-defined.js";
7
8
  import { define } from "../0-face/define";
8
- import seeIcon from "../x-icon/ezo-password-visibility-see.svg?url";
9
- import unseeIcon from "../x-icon/ezo-password-visibility-unsee.svg?url";
9
+ import seeIcon from "../x-icon/password-see.svg?url";
10
+ import unseeIcon from "../x-icon/password-unsee.svg?url";
10
11
  import { getText, currentLanguage } from "../0-face/i18n";
11
12
  import "./ds-text";
12
13
  import styles from "./styles/ds-input.css?inline";
@@ -20,7 +21,16 @@ export class Input extends LitElement {
20
21
  private initialValue: string | undefined;
21
22
  static properties: PropertyDeclarations = {
22
23
  type: { type: String, reflect: true },
24
+ // A text area: the same field across whole rows.
25
+ multiline: { type: Boolean, reflect: true },
26
+ rows: { type: Number },
27
+ maxRows: { type: Number, attribute: "max-rows" },
28
+ autoGrow: { type: Boolean, attribute: "auto-grow", reflect: true },
29
+ wrap: { type: String },
23
30
  inputMode: { type: String, attribute: "inputmode" },
31
+ enterKeyHint: { type: String, attribute: "enterkeyhint" },
32
+ list: { type: String },
33
+ suggestions: { attribute: false },
24
34
  ariaLabel: { type: String, attribute: "aria-label" },
25
35
  ariaLabelledBy: { type: String, attribute: "aria-labelledby" },
26
36
  ariaDescribedBy: { type: String, attribute: "aria-describedby" },
@@ -64,9 +74,30 @@ export class Input extends LitElement {
64
74
  | "url"
65
75
  | "search"
66
76
  | "date"
77
+ | "month"
78
+ | "week"
67
79
  | "time"
68
80
  | "datetime-local";
81
+ declare multiline: boolean;
82
+ declare rows: number;
83
+ declare maxRows: number;
84
+ declare autoGrow: boolean;
85
+ declare wrap: "soft" | "hard" | "off";
86
+ private resizeFrame = 0;
87
+ private measuredWidth = 0;
88
+ private resizeObserver?: ResizeObserver;
89
+ private readonly fontsChanged = () => this.resizeToContent();
69
90
  declare inputMode: string;
91
+ /** The return key's label on a touch keyboard: enter, done, go, next, previous, search or send. */
92
+ declare enterKeyHint: string;
93
+ /**
94
+ * The id of a `<datalist>` beside the field. A shadow root keeps the inner
95
+ * input from reaching it, so its options are mirrored inside, and kept in step.
96
+ */
97
+ declare list: string;
98
+ /** Suggestions offered while typing, as a datalist would. Wins over `list`. */
99
+ declare suggestions: readonly (string | { value: string; label?: string })[];
100
+ private listObserver?: MutationObserver;
70
101
  declare ariaLabel: string;
71
102
  declare ariaLabelledBy: string;
72
103
  declare ariaDescribedBy: string;
@@ -104,7 +135,15 @@ export class Input extends LitElement {
104
135
  constructor() {
105
136
  super();
106
137
  this.type = "text";
138
+ this.multiline = false;
139
+ this.rows = 3;
140
+ this.maxRows = 10;
141
+ this.autoGrow = false;
142
+ this.wrap = "soft";
107
143
  this.inputMode = "";
144
+ this.enterKeyHint = "";
145
+ this.list = "";
146
+ this.suggestions = [];
108
147
  this.ariaLabel = "";
109
148
  this.ariaLabelledBy = "";
110
149
  this.ariaDescribedBy = "";
@@ -161,6 +200,18 @@ export class Input extends LitElement {
161
200
 
162
201
  // Also listen for translations loaded event
163
202
  window.addEventListener("translations-loaded", this.boundHandlers.languageChanged);
203
+ if (typeof ResizeObserver !== "undefined") {
204
+ this.resizeObserver = new ResizeObserver((entries) => {
205
+ if (this.clientWidth !== this.measuredWidth || entries.some(entry => entry.target !== this)) {
206
+ this.measuredWidth = this.clientWidth;
207
+ this.resizeToContent();
208
+ }
209
+ });
210
+ this.resizeObserver.observe(this);
211
+ const metric = this.shadowRoot?.querySelector(".row-metric");
212
+ if (metric) this.resizeObserver.observe(metric);
213
+ }
214
+ document.fonts?.addEventListener("loadingdone", this.fontsChanged);
164
215
  }
165
216
 
166
217
  disconnectedCallback() {
@@ -168,10 +219,24 @@ export class Input extends LitElement {
168
219
  this.removeEventListener("click", this.focusFromLabel);
169
220
  window.removeEventListener("language-changed", this.boundHandlers.languageChanged);
170
221
  window.removeEventListener("translations-loaded", this.boundHandlers.languageChanged);
222
+ this.listObserver?.disconnect();
223
+ this.listObserver = undefined;
224
+ this.resizeObserver?.disconnect();
225
+ document.fonts?.removeEventListener("loadingdone", this.fontsChanged);
226
+ cancelAnimationFrame(this.resizeFrame);
171
227
  }
172
228
 
173
229
  firstUpdated(): void {
174
230
  if (this.autofocus) this.focus();
231
+ // A fixed-width field can change scale without changing its width. Measure
232
+ // one shared row separately from the content height that we set ourselves.
233
+ const metric = this.shadowRoot?.querySelector(".row-metric");
234
+ if (metric) this.resizeObserver?.observe(metric);
235
+ }
236
+
237
+ willUpdate(changed: Map<string, unknown>): void {
238
+ // A multiline field stands on its own by default, in the field treatment.
239
+ if (changed.has("multiline") && this.multiline && this.variant === "default" && !this.hasAttribute("variant")) this.variant = "field";
175
240
  }
176
241
 
177
242
  updated(changedProperties: Map<string, unknown>) {
@@ -182,14 +247,45 @@ export class Input extends LitElement {
182
247
  }
183
248
  if (this.initialValue === undefined) this.initialValue = this.value;
184
249
  if (changedProperties.has("type") && this.type !== "password") this._passwordVisible = false;
250
+ if (this.multiline) this.resizeToContent();
251
+ if (changedProperties.has("list")) this.observeList();
185
252
  this.syncForm();
186
253
  }
187
254
 
255
+ private listSource(): HTMLDataListElement | null {
256
+ if (!this.list) return null;
257
+ const root = this.getRootNode() as Document | ShadowRoot;
258
+ const source = root.getElementById?.(this.list);
259
+ return source instanceof HTMLDataListElement ? source : null;
260
+ }
261
+
262
+ private observeList(): void {
263
+ this.listObserver?.disconnect();
264
+ this.listObserver = undefined;
265
+ const source = this.listSource();
266
+ if (!source || typeof MutationObserver === "undefined") return;
267
+ this.listObserver = new MutationObserver(() => this.requestUpdate());
268
+ this.listObserver.observe(source, { childList: true, subtree: true, attributes: true, characterData: true });
269
+ }
270
+
271
+ /** The options the field offers, from `suggestions` or the named datalist. */
272
+ protected suggestionOptions(): { value: string; label?: string }[] {
273
+ if (this.suggestions?.length) return this.suggestions.map((option) => (typeof option === "string" ? { value: option } : option));
274
+ const source = this.listSource();
275
+ return source ? [...source.options].map((option) => ({ value: option.value, label: option.label !== option.value ? option.label : undefined })) : [];
276
+ }
277
+
278
+ protected renderSuggestions(options: { value: string; label?: string }[]) {
279
+ return options.length
280
+ ? html`<datalist id="suggestions">${options.map((option) => html`<option value=${option.value} label=${ifDefined(option.label)}></option>`)}</datalist>`
281
+ : null;
282
+ }
283
+
188
284
  protected get input(): HTMLInputElement | HTMLTextAreaElement | null {
189
285
  return this.shadowRoot?.querySelector("input, textarea") ?? null;
190
286
  }
191
287
  protected get isMultiline(): boolean {
192
- return false;
288
+ return this.multiline;
193
289
  }
194
290
  get selectionStart(): number | null {
195
291
  return this.input?.selectionStart ?? null;
@@ -411,7 +507,68 @@ export class Input extends LitElement {
411
507
  this.input?.select();
412
508
  }
413
509
 
510
+ /** Grow on the row grid, bounded by maxRows; the remainder scrolls. */
511
+ private resizeToContent(): void {
512
+ cancelAnimationFrame(this.resizeFrame);
513
+ const control = this.input;
514
+ if (!control || !this.multiline) return;
515
+ if (!this.autoGrow) {
516
+ control.style.height = "";
517
+ control.style.overflowY = "";
518
+ return;
519
+ }
520
+ this.resizeFrame = requestAnimationFrame(() => {
521
+ if (!this.isConnected) return;
522
+ const computed = getComputedStyle(control);
523
+ const row =
524
+ parseFloat(computed.getPropertyValue("--ds-row-height")) ||
525
+ 20 * (parseFloat(computed.getPropertyValue("--ds-sf")) || 1);
526
+ const minimum = Math.max(1, Math.floor(this.rows || 1)) * row;
527
+ const maximum = Math.max(minimum, Math.floor(this.maxRows || this.rows || 1) * row);
528
+ control.style.height = "0px";
529
+ const border = parseFloat(computed.borderTopWidth) + parseFloat(computed.borderBottomWidth);
530
+ const needed = Math.ceil((control.scrollHeight + border) / row) * row;
531
+ control.style.height = `${Math.max(minimum, Math.min(maximum, needed))}px`;
532
+ control.style.overflowY = needed > maximum ? "auto" : "hidden";
533
+ });
534
+ }
535
+
536
+ /** The multiline field: a native textarea across whole rows. */
537
+ protected renderMultiline(hasError: boolean, description: string) {
538
+ const rows = Math.max(1, Math.floor(this.rows || 1));
539
+ return html`<span class="row-metric" aria-hidden="true"></span><textarea
540
+ id="input"
541
+ part="input"
542
+ aria-label=${ifDefined(this.accessibleLabel())}
543
+ aria-invalid=${ifDefined(this.ariaInvalid || (hasError ? "true" : undefined))}
544
+ aria-describedby=${ifDefined([description ? "description" : "", hasError ? "error" : ""].filter(Boolean).join(" ") || undefined)}
545
+ inputmode=${ifDefined(this.inputMode || undefined)}
546
+ enterkeyhint=${ifDefined(this.enterKeyHint || undefined)}
547
+ spellcheck=${ifDefined(this.spellcheckHint || undefined)}
548
+ .name=${this.name}
549
+ .value=${live(this.value)}
550
+ .placeholder=${this._placeholder || this.placeholder}
551
+ ?disabled=${this.disabled || this._formDisabled}
552
+ ?readonly=${this.readonly}
553
+ ?required=${this.required}
554
+ ?autofocus=${this.autofocus}
555
+ autocomplete=${this.autocomplete}
556
+ minlength=${ifDefined(this.minlength || undefined)}
557
+ maxlength=${ifDefined(this.maxlength >= 0 ? this.maxlength : undefined)}
558
+ rows=${rows}
559
+ wrap=${this.wrap || "soft"}
560
+ style=${styleMap({ "--ds-textarea-rows": String(rows) })}
561
+ class=${hasError ? "has-error" : ""}
562
+ @input=${this._handleInput}
563
+ @change=${this.handleChange}
564
+ @focus=${this._handleFocus}
565
+ @blur=${this._handleBlur}
566
+ ></textarea>`;
567
+ }
568
+
414
569
  protected renderControl(hasError: boolean, description: string) {
570
+ if (this.multiline) return this.renderMultiline(hasError, description);
571
+ const suggestions = this.suggestionOptions();
415
572
  return html`<input
416
573
  id="input"
417
574
  part="input"
@@ -420,6 +577,8 @@ export class Input extends LitElement {
420
577
  aria-invalid=${ifDefined(this.ariaInvalid || (hasError ? "true" : undefined))}
421
578
  aria-describedby=${ifDefined([description ? "description" : "", hasError ? "error" : ""].filter(Boolean).join(" ") || undefined)}
422
579
  inputmode=${ifDefined(this.inputMode || undefined)}
580
+ enterkeyhint=${ifDefined(this.enterKeyHint || undefined)}
581
+ list=${ifDefined(suggestions.length ? "suggestions" : undefined)}
423
582
  spellcheck=${ifDefined(this.spellcheckHint || undefined)}
424
583
  .name=${this.name}
425
584
  .value=${live(this.value)}
@@ -441,7 +600,7 @@ export class Input extends LitElement {
441
600
  @keydown=${this.handleKeyDown}
442
601
  @focus=${this._handleFocus}
443
602
  @blur=${this._handleBlur}
444
- />`;
603
+ />${this.renderSuggestions(suggestions)}`;
445
604
  }
446
605
 
447
606
  render() {
@@ -455,7 +614,7 @@ export class Input extends LitElement {
455
614
  .join(" ");
456
615
 
457
616
  return html`
458
- <div class="input-wrapper">
617
+ <div class=${hasError ? "input-wrapper has-error" : "input-wrapper"}>
459
618
  ${
460
619
  this.label || this.labelText
461
620
  ? html`
@@ -499,7 +658,7 @@ export class Input extends LitElement {
499
658
  hasError
500
659
  ? html`
501
660
  <div id="error" class="error-message" role="status">
502
- ${this.errorText ? html`<ds-text .text=${this.errorText}></ds-text>` : this.error}
661
+ ${this.errorText ? html`<ds-text wrap .text=${this.errorText}></ds-text>` : this.error}
503
662
  </div>
504
663
  `
505
664
  : null
@@ -0,0 +1,218 @@
1
+ // ds-message.ts
2
+ // An inline notice in the flow of the page: a tone, a title and/or text,
3
+ // actions and an optional dismiss; with `banner`, a strip across the top of
4
+ // its positioning context instead. Drawn by 1-root/notice.css, the same
5
+ // classes a page without scripts writes.
6
+
7
+ import { LitElement, html, nothing, unsafeCSS, type PropertyValues } from "lit";
8
+ import { getText } from "../0-face/i18n";
9
+ import { define } from "../0-face/define";
10
+ import "./ds-icon";
11
+ import "./ds-toast";
12
+ import type { ToastPosition } from "../0-face/toast-queue";
13
+ export { toast as message } from "../0-face/toast-queue";
14
+ export type { ToastOptions as MessageOptions, ToastId as MessageId } from "../0-face/toast-queue";
15
+ export type MessageForm = "inline" | "banner" | "toast" | "assistant";
16
+ import metrics from "../1-root/component-metrics.css?inline";
17
+ import controls from "../1-root/controls.css?inline";
18
+ import styles from "./styles/ds-notice.css?inline";
19
+
20
+ export type MessageTone = "neutral" | "success" | "warning" | "danger";
21
+ const TONES: readonly MessageTone[] = ["neutral", "success", "warning", "danger"];
22
+ /** The icon each tone's mark carries unless `icon` names another. */
23
+ export const MESSAGE_ICONS: Readonly<Record<MessageTone, string>> = {
24
+ neutral: "info",
25
+ success: "check",
26
+ warning: "warning",
27
+ danger: "warning",
28
+ };
29
+
30
+ /** Detail of `ds-message-dismiss`. Cancel the event to keep the notice and remove it yourself. */
31
+ export interface MessageDismissDetail { tone: MessageTone }
32
+
33
+ /**
34
+ * @element ds-message
35
+ * @prop {"neutral" | "success" | "warning" | "danger"} tone - The mark's colour
36
+ * and icon; danger also turns the words into the danger colour. Neutral by default.
37
+ * @prop {string} heading - A title: a translation key, or literal words.
38
+ * @prop {string} text - The text: a translation key, or literal words.
39
+ * @prop {boolean} literal - Show `heading` and `text` as written, never looked up.
40
+ * @prop {string} icon - An icon from the library in place of the tone's own.
41
+ * @prop {boolean} dismissible - Show a close button at the end of the first line.
42
+ * @prop {boolean} banner - A strip one square high across the top of its
43
+ * positioning context, filled in the tone's colour, its words, actions and
44
+ * close button on one line; it reserves no room in the flow.
45
+ *
46
+ * @slot - The text, when it needs more than words: a link, a strong word.
47
+ * @slot heading - The title, as inline content.
48
+ * @slot icon - An icon of the page's own inside the mark.
49
+ * @slot actions - Buttons or links on the row under the words.
50
+ *
51
+ * @fires ds-message-dismiss - The close button was pressed. Cancelable: unless
52
+ * it is cancelled, the notice hides itself.
53
+ *
54
+ * The element is a live region: `role="status"`, or `role="alert"` for danger,
55
+ * unless the page gives it a role of its own.
56
+ *
57
+ * @example
58
+ * <ds-message tone="danger" heading="Couldn't save" dismissible>
59
+ * Your changes are kept on this device.
60
+ * <ds-button slot="actions" secondary>Try again</ds-button>
61
+ * </ds-message>
62
+ */
63
+ export class Message extends LitElement {
64
+ static properties = {
65
+ expand: { type: Boolean },
66
+ visibleToasts: { type: Number, attribute: "visible-toasts" },
67
+ richColors: { type: Boolean, attribute: "rich-colors" },
68
+ contained: { type: Boolean },
69
+ label: { type: String },
70
+ closeLabel: { type: String, attribute: "close-label" },
71
+ form: { type: String, reflect: true },
72
+ position: { type: String },
73
+ duration: { type: Number },
74
+ closeButton: { type: Boolean, attribute: "close-button" },
75
+ tone: { type: String, reflect: true },
76
+ heading: { type: String },
77
+ text: { type: String },
78
+ literal: { type: Boolean, reflect: true },
79
+ icon: { type: String },
80
+ dismissible: { type: Boolean, reflect: true },
81
+ banner: { type: Boolean, reflect: true },
82
+ };
83
+
84
+ static styles = [unsafeCSS(metrics), unsafeCSS(controls), unsafeCSS(styles)];
85
+
86
+ declare expand: boolean;
87
+ declare visibleToasts: number;
88
+ declare richColors: boolean;
89
+ declare contained: boolean;
90
+ declare label: string;
91
+ declare closeLabel: string;
92
+ declare form: MessageForm;
93
+ declare position: ToastPosition;
94
+ declare duration: number;
95
+ declare closeButton: boolean;
96
+ protected dismissEvent = "ds-message-dismiss";
97
+
98
+ declare tone: MessageTone;
99
+ declare heading: string | undefined;
100
+ declare text: string | undefined;
101
+ declare literal: boolean;
102
+ declare icon: string | undefined;
103
+ declare dismissible: boolean;
104
+ declare banner: boolean;
105
+
106
+ /** The role this element last set, so a role the page wrote is left alone. */
107
+ private ownRole: string | null = null;
108
+ private readonly relabel = () => this.requestUpdate();
109
+
110
+ constructor() {
111
+ super();
112
+ this.expand = false;
113
+ this.visibleToasts = 3;
114
+ this.richColors = false;
115
+ this.contained = false;
116
+ this.label = "Messages";
117
+ this.closeLabel = "Close";
118
+ this.form = "inline";
119
+ this.position = "bottom-right";
120
+ this.duration = Infinity;
121
+ this.closeButton = true;
122
+ this.tone = "neutral";
123
+ this.literal = false;
124
+ this.dismissible = false;
125
+ this.banner = false;
126
+ }
127
+
128
+ /** The tone in effect: an unknown value reads as neutral. */
129
+ get resolvedTone(): MessageTone {
130
+ return TONES.includes(this.tone) ? this.tone : "neutral";
131
+ }
132
+
133
+ connectedCallback() {
134
+ super.connectedCallback();
135
+ window.addEventListener("language-changed", this.relabel);
136
+ window.addEventListener("translations-loaded", this.relabel);
137
+ this.syncRole();
138
+ }
139
+
140
+ disconnectedCallback() {
141
+ window.removeEventListener("language-changed", this.relabel);
142
+ window.removeEventListener("translations-loaded", this.relabel);
143
+ super.disconnectedCallback();
144
+ }
145
+
146
+ protected willUpdate(changed: PropertyValues<this>) {
147
+ super.willUpdate(changed);
148
+ if (changed.has("tone") || changed.has("form")) this.syncRole();
149
+ }
150
+
151
+ private syncRole() {
152
+ if (!this.isConnected) return;
153
+ const current = this.getAttribute("role");
154
+ if (current !== null && current !== this.ownRole) return;
155
+ this.ownRole = this.form === "toast" ? "presentation" : this.resolvedTone === "danger" ? "alert" : "status";
156
+ if (current !== this.ownRole) this.setAttribute("role", this.ownRole);
157
+ }
158
+
159
+ private words(value: string | undefined): string {
160
+ if (!value) return "";
161
+ return this.literal ? value : getText(value) || value;
162
+ }
163
+
164
+ /**
165
+ * Whether light-DOM content fills a slot: elements, or text that is not
166
+ * blank. The blank text between slotted children still counts as assigned
167
+ * to the default slot and hides its fallback, so `text` is drawn beside the
168
+ * slot rather than inside it.
169
+ */
170
+ private slotted(name: string): boolean {
171
+ return [...this.childNodes].some(node => name
172
+ ? node instanceof Element && node.getAttribute("slot") === name
173
+ : node instanceof Element ? !node.hasAttribute("slot") : node.nodeType === Node.TEXT_NODE && Boolean(node.textContent?.trim()));
174
+ }
175
+
176
+ /** Ask to close: hides the notice unless a listener cancels `ds-message-dismiss`. */
177
+ dismiss(): boolean {
178
+ const event = new CustomEvent<MessageDismissDetail>(this.dismissEvent, {
179
+ bubbles: true, composed: true, cancelable: true, detail: { tone: this.resolvedTone },
180
+ });
181
+ if (!this.dispatchEvent(event)) return false;
182
+ this.hidden = true;
183
+ return true;
184
+ }
185
+
186
+ render() {
187
+ if (this.form === "toast") return html`<ds-toast .expand=${this.expand} .visibleToasts=${this.visibleToasts} .richColors=${this.richColors} .contained=${this.contained} .label=${this.label} .closeLabel=${this.closeLabel} .position=${this.position} .duration=${this.duration} .closeButton=${this.closeButton}></ds-toast>`;
188
+ const tone = this.resolvedTone;
189
+ const heading = this.words(this.heading);
190
+ const text = this.words(this.text);
191
+ const hasHeading = Boolean(heading) || this.slotted("heading");
192
+ const slottedText = this.slotted("");
193
+ const hasText = Boolean(text) || slottedText;
194
+ const hasActions = this.slotted("actions");
195
+ const changed = () => this.requestUpdate();
196
+ return html`<div class="ds-notice${tone === "neutral" ? "" : ` ds-notice--${tone}`}${(this.banner || this.form === "banner") ? " ds-notice--banner" : ""}" part="message notice">
197
+ <span class="ds-notice__mark" part="mark" aria-hidden="true">
198
+ <slot name="icon" @slotchange=${changed}><ds-icon size="large" .type=${this.icon || MESSAGE_ICONS[tone]}></ds-icon></slot>
199
+ </span>
200
+ <div class="ds-notice__title" part="title" ?hidden=${!hasHeading}><slot name="heading" @slotchange=${changed}>${heading}</slot></div>
201
+ <div class="ds-notice__text" part="text" ?hidden=${!hasText}><slot @slotchange=${changed}></slot>${slottedText ? nothing : text}</div>
202
+ <div class="ds-notice__actions" part="actions" ?hidden=${!hasActions}><slot name="actions" @slotchange=${changed}></slot></div>
203
+ ${this.dismissible
204
+ ? html`<button class="ds-button ds-button--icon ds-notice__dismiss" part="dismiss" type="button" aria-label=${getText("Close") || "Close"} @click=${() => this.dismiss()}>
205
+ <ds-icon type="close" aria-hidden="true"></ds-icon>
206
+ </button>`
207
+ : nothing}
208
+ </div>`;
209
+ }
210
+ }
211
+
212
+ define("ds-message", Message);
213
+
214
+ declare global {
215
+ interface HTMLElementTagNameMap {
216
+ "ds-message": Message;
217
+ }
218
+ }
@@ -0,0 +1,10 @@
1
+ /** Compatibility name. New surfaces use Message. */
2
+ import { Message, MESSAGE_ICONS } from "./ds-message";
3
+ import { define } from "../0-face/define";
4
+ export type { MessageTone as NoticeTone, MessageDismissDetail as NoticeDismissDetail } from "./ds-message";
5
+ export const NOTICE_ICONS = MESSAGE_ICONS;
6
+ export class Notice extends Message {
7
+ protected dismissEvent = "ds-notice-dismiss";
8
+ }
9
+ define("ds-notice", Notice);
10
+ declare global { interface HTMLElementTagNameMap { "ds-notice": Notice } }