@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,214 @@
1
+ @import "../../1-root/component-metrics.css";
2
+
3
+ /* ds-page.css
4
+ * Five areas, six arrangements. Every width is whole squares; areas are
5
+ * separated by one square down the page and two across. An empty area takes
6
+ * no room, so its margin goes with it.
7
+ */
8
+
9
+ :host {
10
+ --ds-page-nav: calc(12 * var(--ds-unit));
11
+ --ds-page-aside: calc(12 * var(--ds-unit));
12
+ --ds-page-measure: calc(32 * var(--ds-unit));
13
+ --ds-page-tile: calc(12 * var(--ds-unit));
14
+ --ds-page-gap: calc(2 * var(--ds-unit));
15
+ --ds-page-line: var(--ds-border-color, var(--ds-slate-light));
16
+ /* How far the content stands outside its column on each side, the column's place and the
17
+ grid's lines kept: a phone's lists take a little more width, their words a longer line
18
+ (Money sets 4px). Zero by default. */
19
+ --ds-page-bleed: 0px;
20
+ box-sizing: border-box;
21
+ display: block;
22
+ container-type: inline-size;
23
+ min-width: 0;
24
+ color: var(--ds-text-color);
25
+ font-family: var(--ds-typeface-regular);
26
+ font-feature-settings: var(--ds-font-features);
27
+ font-size: var(--ds-type-size-default);
28
+ line-height: var(--ds-type-lineheight-default);
29
+ letter-spacing: var(--ds-type-letterspacing-default);
30
+ }
31
+
32
+ :host([hidden]) { display: none; }
33
+ :host([fill]) { height: 100%; }
34
+
35
+ .page {
36
+ box-sizing: border-box;
37
+ display: grid;
38
+ column-gap: var(--ds-page-gap);
39
+ grid-template-columns: var(--ds-page-nav) minmax(0, 1fr);
40
+ grid-template-rows: auto minmax(0, 1fr) auto auto;
41
+ grid-template-areas:
42
+ "nav header"
43
+ "nav main"
44
+ "nav aside"
45
+ "nav footer";
46
+ min-height: 100%;
47
+ padding: var(--ds-unit) calc(var(--ds-unit) - var(--ds-page-bleed));
48
+ }
49
+
50
+ :host([fill]) .page { height: 100%; }
51
+
52
+ .area { position: relative; min-width: 0; }
53
+ /* The drawer's menu button: shown only on a narrow page with `drawer`. */
54
+ .bar { display: none; grid-area: bar; }
55
+ .bar[hidden] { display: none !important; }
56
+ .area[data-empty] { display: none; }
57
+ .nav { grid-area: nav; }
58
+ .header { grid-area: header; margin-block-end: var(--ds-unit); }
59
+ .main { grid-area: main; }
60
+ .aside { grid-area: aside; margin-block-start: var(--ds-unit); }
61
+ .footer { grid-area: footer; margin-block-start: var(--ds-unit); }
62
+
63
+ :host([fill]) :is(.nav, .main, .aside) { min-height: 0; overflow: auto; }
64
+
65
+ /* List and detail: a wider leading column holds the list. */
66
+ :host([layout="split"]) { --ds-page-nav: calc(16 * var(--ds-unit)); }
67
+
68
+ /* Inspector: navigation, the work, and its properties beside it. */
69
+ :host([layout="inspector"]) .page {
70
+ grid-template-columns: var(--ds-page-nav) minmax(0, 1fr) var(--ds-page-aside);
71
+ grid-template-rows: auto minmax(0, 1fr) auto;
72
+ grid-template-areas:
73
+ "nav header aside"
74
+ "nav main aside"
75
+ "nav footer aside";
76
+ }
77
+ :host([layout="inspector"]) .aside { margin-block-start: 0; }
78
+
79
+ /* One column down the middle; centred is narrower and sits in the middle of
80
+ * the height it is given. Tiles fill the width with 12-square tiles.
81
+ *
82
+ * A centred column stands on a whole square. The room beside it is shared out
83
+ * and rounded down to squares, then added to the page's own square of padding,
84
+ * so when the room is an odd number of squares the extra one falls on the
85
+ * trailing side instead of leaving the column on a half. 100% is the width of
86
+ * the element; with less room than the measure needs, the padding stays one
87
+ * square and the column takes what is left. */
88
+ :host(:is([layout="column"], [layout="centered"], [layout="tiles"])) .page {
89
+ grid-template-columns: minmax(0, calc(var(--ds-page-measure) + 2 * var(--ds-page-bleed)));
90
+ grid-template-rows: auto auto minmax(0, 1fr) auto auto;
91
+ grid-template-areas: "header" "nav" "main" "aside" "footer";
92
+ }
93
+ :host(:is([layout="column"], [layout="centered"])) .page {
94
+ justify-content: start;
95
+ padding-inline-start: calc(var(--ds-unit) + max(0px, round(down, calc((100% - 2 * var(--ds-unit) - var(--ds-page-measure)) / 2), var(--ds-unit))) - var(--ds-page-bleed));
96
+ }
97
+ :host(:is([layout="column"], [layout="centered"], [layout="tiles"])) .nav { margin-block-end: var(--ds-unit); }
98
+
99
+ :host([layout="centered"]) { --ds-page-measure: calc(16 * var(--ds-unit)); }
100
+ :host([layout="centered"]) .page { grid-template-rows: auto; align-content: center; }
101
+
102
+ :host([layout="tiles"]) .page { grid-template-columns: minmax(0, 1fr); }
103
+ :host([layout="tiles"]) .main {
104
+ display: grid;
105
+ grid-template-columns: repeat(auto-fill, var(--ds-page-tile));
106
+ grid-auto-rows: auto;
107
+ gap: var(--ds-unit);
108
+ align-items: start;
109
+ align-content: start;
110
+ }
111
+ :host([layout="tiles"]) .main ::slotted(*) { min-width: 0; }
112
+ :host([layout="tiles"]) .main ::slotted([data-tile="wide"]) { grid-column: span 2; }
113
+ :host([layout="tiles"]) .main ::slotted([data-tile="full"]) { grid-column: 1 / -1; }
114
+
115
+ /* Hairlines between columns, on the grid line in the middle of the gap. The
116
+ * column reaches across half the gap to draw it, so its content keeps its
117
+ * whole width. */
118
+ :host([divided]:not([layout="column"]):not([layout="centered"]):not([layout="tiles"])) .nav {
119
+ border-inline-end: 1px solid var(--ds-page-line);
120
+ padding-inline-end: calc(var(--ds-page-gap) / 2 - 1px);
121
+ margin-inline-end: calc(var(--ds-page-gap) / -2);
122
+ }
123
+ :host([divided][layout="inspector"]) .aside {
124
+ border-inline-start: 1px solid var(--ds-page-line);
125
+ padding-inline-start: calc(var(--ds-page-gap) / 2 - 1px);
126
+ margin-inline-start: calc(var(--ds-page-gap) / -2);
127
+ }
128
+
129
+ /* Narrower than navigation, the work and its properties: properties go below. */
130
+ @container (max-width: 959px) {
131
+ :host([layout="inspector"]) .page {
132
+ grid-template-columns: var(--ds-page-nav) minmax(0, 1fr);
133
+ grid-template-rows: auto minmax(0, 1fr) auto auto;
134
+ grid-template-areas:
135
+ "nav header"
136
+ "nav main"
137
+ "nav aside"
138
+ "nav footer";
139
+ }
140
+ :host([layout="inspector"]) .aside { margin-block-start: var(--ds-unit); }
141
+ :host([divided][layout="inspector"]) .aside { border-inline-start: 0; padding-inline-start: 0; margin-inline-start: 0; }
142
+ }
143
+
144
+ /* Phone width: every layout is one column, navigation first. */
145
+ @container (max-width: 599px) {
146
+ .page,
147
+ :host([layout="inspector"]) .page {
148
+ grid-template-columns: minmax(0, 1fr);
149
+ grid-template-rows: auto;
150
+ grid-template-areas: "nav" "header" "main" "aside" "footer";
151
+ column-gap: 0;
152
+ align-content: start;
153
+ }
154
+ .nav { margin-block-end: var(--ds-unit); }
155
+ :host([divided]:not([layout="column"]):not([layout="centered"]):not([layout="tiles"])) .nav {
156
+ border-inline-end: 0;
157
+ padding-inline-end: 0;
158
+ margin-inline-end: 0;
159
+ border-block-end: 1px solid var(--ds-page-line);
160
+ padding-block-end: calc(var(--ds-unit) - 1px);
161
+ }
162
+ :host([fill]) :is(.nav, .main, .aside) { overflow: visible; }
163
+ :host([fill]) .page { height: auto; }
164
+ :host([layout="tiles"]) .main { display: flex; flex-direction: column; align-items: stretch; }
165
+ }
166
+
167
+ /* Phone width with a drawer: the navigation folds away and the menu button
168
+ * stands in a one-square column before the header. In the drawer the
169
+ * navigation takes the panel's width, with none of the page's margins. */
170
+ @container (max-width: 599px) {
171
+ :host([drawer]) .page,
172
+ :host([drawer][layout="inspector"]) .page {
173
+ grid-template-columns: var(--ds-unit) minmax(0, 1fr);
174
+ column-gap: var(--ds-unit);
175
+ grid-template-areas: "bar header" "main main" "aside aside" "footer footer";
176
+ }
177
+ :host([drawer]) .bar {
178
+ display: flex;
179
+ align-items: center;
180
+ justify-content: center;
181
+ height: var(--ds-unit);
182
+ margin-block-end: var(--ds-unit);
183
+ }
184
+ :host([drawer]) .page > .nav { display: none; }
185
+ }
186
+ /* Important, as the layouts' own margins and hairlines for the navigation
187
+ * reach it by more specific selectors. */
188
+ .ds-drawer > .nav {
189
+ margin: 0 !important;
190
+ padding: 0 !important;
191
+ border: 0 !important;
192
+ overflow: visible !important;
193
+ }
194
+
195
+ /* Inspection: each area outlined and named by its slot, in the corner its
196
+ * content is least likely to use. */
197
+ :host([view]) .area:not([data-empty]) {
198
+ outline: 1px dashed color-mix(in srgb, var(--ds-pink) 80%, var(--ds-text-color));
199
+ outline-offset: -1px;
200
+ }
201
+ :host([view]) .area:not([data-empty])::before {
202
+ content: attr(data-area);
203
+ position: absolute;
204
+ z-index: 1;
205
+ inset-block-end: 0;
206
+ inset-inline-end: 0;
207
+ height: var(--ds-unit);
208
+ padding-inline: calc(4px * var(--ds-sf));
209
+ font-size: var(--ds-type-size-small);
210
+ line-height: var(--ds-unit);
211
+ color: var(--ds-black);
212
+ background: var(--ds-pink);
213
+ pointer-events: none;
214
+ }
package/DS1/components.ts CHANGED
@@ -2,7 +2,6 @@
2
2
  export * from "./2-core/ds-button";
3
3
  export * from "./2-core/ds-text";
4
4
  export * from "./2-core/ds-input";
5
- export * from "./2-core/ds-textarea";
6
5
  export * from "./2-core/ds-gap";
7
6
  export * from "./2-core/ds-icon";
8
7
  export * from "./2-core/ds-tooltip";
@@ -11,3 +10,10 @@ export * from "./3-unit/ds-list";
11
10
  export * from "./3-unit/ds-menu";
12
11
  export * from "./3-unit/ds-tabs";
13
12
  export * from "./4-page/ds-panel";
13
+ export * from "./4-page/ds-page";
14
+
15
+ export * from "./3-unit/ds-sidebar";
16
+
17
+ export * from "./4-page/ds-grid";
18
+
19
+ export * from "./2-core/ds-chart";
package/DS1/index.ts CHANGED
@@ -26,35 +26,39 @@ export * from "./0-face/i18n";
26
26
  export * from "./0-face/languages";
27
27
  export * from "./0-face/language-routing";
28
28
  export * from "./0-face/translations-format";
29
+ export * from "./0-face/format";
29
30
  export * from "./0-face/preferences";
30
31
  export * from "./0-face/pricing";
31
32
  export * from "./0-face/theme";
33
+ export * from "./0-face/keys";
34
+ export * from "./0-face/sidebar";
32
35
 
33
36
  // ============================================================================
34
37
  // 2-core: Core Components
35
38
  // ============================================================================
36
39
 
37
- export * from "./2-core/ds-banner";
38
40
  export * from "./2-core/ds-badge";
39
41
  export * from "./2-core/ds-button";
40
42
  export * from "./2-core/ds-checkbox";
41
43
  export * from "./2-core/ds-radio";
42
44
  export * from "./2-core/ds-switch";
43
- export * from "./2-core/ds-split";
44
45
  export * from "./2-core/ds-select";
45
46
  export * from "./2-core/ds-color";
46
47
  export * from "./2-core/ds-swatch";
47
48
  export * from "./2-core/ds-card";
48
49
  export * from "./2-core/ds-cycle";
49
- export * from "./2-core/ds-date";
50
+ export * from "./2-core/ds-empty";
50
51
  export * from "./2-core/ds-gap";
51
52
  export * from "./2-core/ds-icon";
52
53
  export * from "./2-core/ds-input";
53
54
  export * from "./2-core/ds-file-picker";
54
- export * from "./2-core/ds-textarea";
55
55
  export * from "./2-core/ds-composer";
56
- export * from "./2-core/ds-language";
56
+ export * from "./2-core/ds-message";
57
+ export * from "./2-core/ds-notice";
58
+ export * from "./2-core/ds-stat";
59
+ export * from "./2-core/ds-progress";
57
60
  export * from "./2-core/ds-text";
61
+ export * from "./2-core/ds-toast";
58
62
  export * from "./2-core/ds-tooltip";
59
63
 
60
64
  // ============================================================================
@@ -64,8 +68,13 @@ export * from "./2-core/ds-tooltip";
64
68
  export * from "./3-unit/ds-accordion";
65
69
  export * from "./2-core/ds-avatar";
66
70
  export * from "./3-unit/ds-avatar-group";
71
+ export * from "./3-unit/ds-calendar";
72
+ export * from "./3-unit/ds-calendar-large";
73
+ export * from "./3-unit/ds-carousel";
74
+ export * from "./3-unit/ds-date-picker";
67
75
  export * from "./3-unit/ds-form";
68
76
  export * from "./3-unit/ds-list";
77
+ export * from "./3-unit/ds-matrix";
69
78
  export * from "./3-unit/ds-row";
70
79
  export * from "./3-unit/ds-table";
71
80
 
@@ -75,7 +84,10 @@ export * from "./3-unit/ds-table";
75
84
 
76
85
  export * from "./4-page/ds-container";
77
86
  export * from "./4-page/ds-grid";
78
- export * from "./4-page/ds-layout";
87
+ export * from "./4-page/ds-page";
88
+ export * from "./4-page/ds-header";
89
+ export * from "./4-page/ds-footer";
90
+ export * from "./4-page/ds-document";
79
91
 
80
92
  export * from "./3-unit/ds-menu";
81
93
  export * from "./3-unit/ds-tabs";
@@ -84,3 +96,9 @@ export * from "./4-page/ds-dialog";
84
96
 
85
97
  export * from "./2-core/ds-token";
86
98
  export * from "./3-unit/ds-token-field";
99
+
100
+ export * from "./3-unit/ds-sidebar";
101
+
102
+ export * from "./2-core/ds-chart";
103
+
104
+ export * from "./0-face/component-visibility";
@@ -17,6 +17,7 @@ export type AvatarProps = Omit<HTMLAttributes<AvatarElement>, "children"> &
17
17
  | "pending"
18
18
  | "plain"
19
19
  | "color"
20
+ | "ink"
20
21
  >
21
22
  >;
22
23
  /** Browser-only registration stays in the product's runtime entry for SSR. */
@@ -24,14 +25,12 @@ export const Avatar = forwardRef<AvatarElement, AvatarProps>(function Avatar(pro
24
25
  return createElement("ds-avatar", { ...props, ref });
25
26
  });
26
27
 
27
- export type LogoProps = Omit<AvatarProps, "shape" | "size" | "fit" | "mask" | "plain"> & {
28
- src: string;
29
- };
30
- /** A monochrome brand mark fitted into the page's image area. */
28
+ export type LogoProps = Omit<AvatarProps, "size" | "fit" | "mask" | "plain" | "shape">;
29
+ /** A monochrome brand mark fitted into the page's image area; without `src`, its `initial`. */
31
30
  export const Logo = forwardRef<AvatarElement, LogoProps>(function Logo(props, ref) {
32
31
  return createElement("ds-avatar", {
33
32
  size: "fill",
34
- shape: "square",
33
+ logo: true,
35
34
  fit: "contain",
36
35
  mask: true,
37
36
  plain: true,
@@ -0,0 +1,29 @@
1
+ /** Controlled state for Button's split mode. The shared Button owns its face. */
2
+ import { createElement, useEffect, useLayoutEffect, useRef, type CSSProperties, type ReactNode, type Ref } from "react";
3
+ import type { Button as ButtonElement, SplitSegment } from "../2-core/ds-button";
4
+ export type { SplitSegment };
5
+ const useCommitEffect = typeof window === "undefined" ? useEffect : useLayoutEffect;
6
+ export interface SplitButtonProps<T extends string> {
7
+ split: true; segments: ReadonlyArray<SplitSegment<T>>; value?: T;
8
+ onPress: (value: T) => void; label: string; className?: string; style?: CSSProperties;
9
+ disabled?: boolean; compact?: boolean;
10
+ }
11
+ export function SplitButton<T extends string>({ segments, value, onPress, label, className, style, disabled = false, compact = false, forwardedRef }: SplitButtonProps<T> & { forwardedRef?: Ref<ButtonElement> }): ReactNode {
12
+ const ref = useRef<ButtonElement | null>(null);
13
+ useCommitEffect(() => {
14
+ const element = ref.current; if (!element) return;
15
+ element.split = true; element.segments = segments; element.value = value ?? "";
16
+ element.actions = value === undefined; element.disabled = disabled; element.compact = compact; element.literal = true;
17
+ const press = (event: Event) => {
18
+ if (event.target !== element) return;
19
+ if (event.type === "change") event.preventDefault();
20
+ onPress((event as CustomEvent<{ value: T }>).detail.value);
21
+ };
22
+ element.addEventListener("change", press); element.addEventListener("press", press);
23
+ return () => { element.removeEventListener("change", press); element.removeEventListener("press", press); };
24
+ });
25
+ return createElement("ds-button", { ref: (element: ButtonElement | null) => {
26
+ ref.current = element;
27
+ if (typeof forwardedRef === "function") forwardedRef(element); else if (forwardedRef) forwardedRef.current = element;
28
+ }, split: true, "aria-label": label, className, style });
29
+ }
@@ -1,12 +1,17 @@
1
1
  /** Native semantics and React events; the shared Lit element owns the face. */
2
- import { createElement, forwardRef, type AnchorHTMLAttributes, type ButtonHTMLAttributes } from "react";
2
+ import { createElement, forwardRef, type AnchorHTMLAttributes, type ReactElement, type RefAttributes, type Ref, type ButtonHTMLAttributes } from "react";
3
+ import { SplitButton, type SplitButtonProps } from "./button-split";
4
+ export type { SplitButtonProps, SplitSegment } from "./button-split";
3
5
  import type { Button as ButtonElement } from "../2-core/ds-button";
4
6
 
5
7
  export type ButtonProps = ButtonHTMLAttributes<HTMLButtonElement> &
6
- Partial<Pick<ButtonElement, "primary" | "secondary" | "active" | "choice" | "icon" | "wide" | "fit" | "danger" | "menuItem">>;
8
+ Partial<Pick<ButtonElement, "primary" | "secondary" | "active" | "choice" | "icon" | "wide" | "fixed" | "fit" | "danger" | "menuItem">>;
7
9
 
8
- export const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(
9
- {
10
+ const ButtonControl = forwardRef<HTMLButtonElement, ButtonProps | SplitButtonProps<string>>(function Button(
11
+ props, ref,
12
+ ) {
13
+ if ("split" in props && props.split) return createElement(SplitButton, { ...props, forwardedRef: ref as unknown as Ref<ButtonElement> });
14
+ const {
10
15
  children,
11
16
  className,
12
17
  style,
@@ -16,16 +21,15 @@ export const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button
16
21
  choice,
17
22
  icon,
18
23
  wide,
24
+ fixed,
19
25
  fit,
20
26
  danger,
21
27
  menuItem,
22
28
  disabled,
23
29
  hidden,
24
30
  type = "button",
25
- ...props
26
- },
27
- ref,
28
- ) {
31
+ ...nativeProps
32
+ } = props as ButtonProps;
29
33
  return createElement(
30
34
  "ds-button",
31
35
  {
@@ -36,6 +40,7 @@ export const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button
36
40
  choice,
37
41
  icon,
38
42
  wide,
43
+ fixed,
39
44
  fit,
40
45
  danger,
41
46
  menuItem,
@@ -44,18 +49,32 @@ export const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button
44
49
  className,
45
50
  style,
46
51
  },
47
- createElement("button", { ...props, ref, type, disabled, hidden }, children),
52
+ createElement("button", { ...nativeProps, ref, type, disabled, hidden }, children),
48
53
  );
49
54
  });
50
55
 
51
- /** A real link: browser navigation, context menus and modifier clicks survive. */
56
+ export const Button = ButtonControl as unknown as {
57
+ <const T extends string>(props: SplitButtonProps<T> & RefAttributes<ButtonElement>): ReactElement | null;
58
+ (props: ButtonProps & RefAttributes<HTMLButtonElement>): ReactElement | null;
59
+ displayName?: string;
60
+ };
61
+
62
+ /**
63
+ * A real link: browser navigation, context menus and modifier clicks survive.
64
+ * As `<ds-button href>`: `target="_blank"` gets `rel="noopener noreferrer"`
65
+ * unless `rel` is given, and a disabled link loses its `href` and `target`, is
66
+ * left out of the tab order and stays a link (`role="link"`, `aria-disabled`).
67
+ */
52
68
  export type ButtonLinkProps = AnchorHTMLAttributes<HTMLAnchorElement> &
53
- Partial<Pick<ButtonElement, "primary" | "secondary" | "active" | "choice" | "icon" | "wide" | "fit" | "danger" | "menuItem">> & {disabled?: boolean};
69
+ Partial<Pick<ButtonElement, "primary" | "secondary" | "active" | "choice" | "icon" | "wide" | "fixed" | "fit" | "danger" | "menuItem">> & {disabled?: boolean};
54
70
  export const ButtonLink = forwardRef<HTMLAnchorElement, ButtonLinkProps>(function ButtonLink(
55
- {children, className, style, primary, secondary, active, choice, icon, wide, fit, danger, menuItem, disabled, hidden, href, onClick, onAuxClick, tabIndex, ...props}, ref,
71
+ {children, className, style, primary, secondary, active, choice, icon, wide, fixed, fit, danger, menuItem, disabled, hidden, href, target, rel, role, onClick, onAuxClick, tabIndex, ...props}, ref,
56
72
  ) {
57
- return createElement("ds-button", {control: "slotted", primary, secondary, active, choice, icon, wide, fit, danger, menuItem, disabled, hidden, className, style},
73
+ return createElement("ds-button", {control: "slotted", primary, secondary, active, choice, icon, wide, fixed, fit, danger, menuItem, disabled, hidden, className, style},
58
74
  createElement("a", {...props, ref, href: disabled ? undefined : href, hidden,
75
+ target: disabled ? undefined : target,
76
+ rel: disabled ? undefined : rel ?? (target === "_blank" ? "noopener noreferrer" : undefined),
77
+ role: role ?? (disabled ? "link" : undefined),
59
78
  "aria-disabled": disabled || undefined, tabIndex: disabled ? -1 : tabIndex,
60
79
  onClick: event => { if (disabled) { event.preventDefault(); event.stopPropagation(); } else onClick?.(event); },
61
80
  onAuxClick: event => { if (disabled) { event.preventDefault(); event.stopPropagation(); } else onAuxClick?.(event); },
@@ -0,0 +1,76 @@
1
+ /** A carousel in React: the slides stay in the light DOM, so they render on
2
+ * the server and read in tests; ds-carousel snaps them, draws the dots and
3
+ * buttons and announces the slide in view. The region and its name are in the
4
+ * markup from the first render. Browser-only registration of ds-carousel stays
5
+ * in the product's runtime entry. */
6
+ import { createElement as h, forwardRef, useEffect, useLayoutEffect, useRef, type HTMLAttributes, type ReactNode } from "react";
7
+ import type { Carousel as CarouselElement, CarouselChangeDetail } from "../3-unit/ds-carousel";
8
+
9
+ export type { CarouselChangeDetail } from "../3-unit/ds-carousel";
10
+ export type CarouselProps = Omit<HTMLAttributes<CarouselElement>, "onChange"> & {
11
+ /** The region's name: what the slides show. */
12
+ label: string;
13
+ /** The slide in view, from 0. Changing it scrolls there. */
14
+ current?: number;
15
+ /** Show previous and next buttons beside the dots. */
16
+ buttons?: boolean;
17
+ /** Show the dots; on by default. */
18
+ dots?: boolean;
19
+ /** Draw the last dot as an end marker. */
20
+ end?: boolean;
21
+ /** Each slide's width in whole squares; the carousel's own width when not set; `"auto"` for slides of their own width, a strip. */
22
+ slideWidth?: number | "auto";
23
+ /** Squares between slides; one by default. */
24
+ gap?: number;
25
+ /** A strip's bleed: `end` runs it on to the window's end edge, `both` to both edges. */
26
+ bleed?: "none" | "end" | "both";
27
+ /** Hold the slides three times over, so the strip has no end; draws no dots. */
28
+ loop?: boolean;
29
+ /** Move on by itself: `true` for every five seconds, or milliseconds. Always with a pause button. */
30
+ autoplay?: boolean | number;
31
+ /** Slide freely, without stopping at slides. */
32
+ free?: boolean;
33
+ /** A person moved to another slide. */
34
+ onChange?: (index: number, previous: number) => void;
35
+ children?: ReactNode;
36
+ };
37
+
38
+ const useCommitEffect = typeof window === "undefined" ? useEffect : useLayoutEffect;
39
+
40
+ export const Carousel = forwardRef<CarouselElement, CarouselProps>(function Carousel(
41
+ { label, current, buttons, dots = true, end, slideWidth, gap, bleed, loop, autoplay, free, onChange, children, ...props }, ref,
42
+ ) {
43
+ const host = useRef<CarouselElement | null>(null);
44
+ useCommitEffect(() => {
45
+ const element = host.current;
46
+ if (!element || !onChange) return;
47
+ const change = (event: Event) => {
48
+ if (event.target !== element) return;
49
+ const { index, previous } = (event as CustomEvent<CarouselChangeDetail>).detail;
50
+ onChange(index, previous);
51
+ };
52
+ element.addEventListener("change", change);
53
+ return () => element.removeEventListener("change", change);
54
+ });
55
+ return h("ds-carousel", {
56
+ role: "region",
57
+ "aria-label": label,
58
+ ...props,
59
+ label,
60
+ literal: true,
61
+ current,
62
+ buttons: buttons || undefined,
63
+ "no-dots": dots ? undefined : true,
64
+ end: end || undefined,
65
+ "slide-width": slideWidth,
66
+ gap,
67
+ bleed: bleed && bleed !== "none" ? bleed : undefined,
68
+ loop: loop || undefined,
69
+ autoplay: autoplay === true ? "" : typeof autoplay === "number" ? String(autoplay) : undefined,
70
+ free: free || undefined,
71
+ ref: (element: CarouselElement | null) => {
72
+ host.current = element;
73
+ if (typeof ref === "function") ref(element); else if (ref) ref.current = element;
74
+ },
75
+ }, children);
76
+ });
@@ -1,7 +1,7 @@
1
1
  /** Optional React composition; behavior and appearance belong to ds-dialog. */
2
- import { createContext, createElement, useContext, useId, useLayoutEffect, useRef, useState, type HTMLAttributes, type ReactNode, type Ref } from "react";
2
+ import { createContext, createElement, useContext, useEffect, useId, useLayoutEffect, useRef, useState, type HTMLAttributes, type ReactNode, type Ref } from "react";
3
3
  import { createPortal } from "react-dom";
4
- import type { Dialog as DialogElement, DialogCloseReason } from "../4-page/ds-dialog";
4
+ import type { Dialog as DialogElement, DialogCloseReason, DialogPlacement } from "../4-page/ds-dialog";
5
5
 
6
6
  const DialogContext = createContext<{ open: boolean; change: (open: boolean, reason?: DialogCloseReason) => void; title: string; description: string } | null>(null);
7
7
  const useDialog = () => {
@@ -10,7 +10,7 @@ const useDialog = () => {
10
10
  return context;
11
11
  };
12
12
 
13
- export interface DialogProps { open?: boolean; defaultOpen?: boolean; onOpenChange?: (open: boolean, reason?: DialogCloseReason) => void; children: ReactNode }
13
+ export interface DialogProps { open?: boolean; defaultOpen?: boolean; onOpenChange?: (open: boolean, reason?: DialogCloseReason) => void; children?: ReactNode }
14
14
  export function Dialog({ open, defaultOpen = false, onOpenChange, children }: DialogProps) {
15
15
  const [internal, setInternal] = useState(defaultOpen);
16
16
  const id = useId();
@@ -40,11 +40,41 @@ export interface DialogContentProps extends HTMLAttributes<HTMLDialogElement> {
40
40
  flush?: boolean;
41
41
  /** Rotate a document frame while keeping it within the viewport. */
42
42
  rotated?: boolean;
43
+ /**
44
+ * Where it stands: `"center"` (the default), a `"sheet"` from the bottom, or
45
+ * a drawer at the `"end"` or `"start"`. These slide out before they leave
46
+ * the page, and a finger swipes them away (reason `"swipe"`).
47
+ */
48
+ placement?: DialogPlacement;
43
49
  }
44
- export function DialogContent({ children, portal = true, nonModal = false, closeOnOutside = false, blockOutside = false, holdScroll = false, anchor = null, returnFocus = null, closeLabel = "Close", showClose = true, closeOnEscape = true, closeOnBackdrop = true, fullScreen = false, flush = false, rotated = false, ...props }: DialogContentProps) {
50
+
51
+ /** The longest a sliding dialog stays on the page after closing, should its transition never end. */
52
+ const LEAVING = 600;
53
+ export function DialogContent({ children, portal = true, nonModal = false, closeOnOutside = false, blockOutside = false, holdScroll = false, anchor = null, returnFocus = null, closeLabel = "Close", showClose = true, closeOnEscape = true, closeOnBackdrop = true, fullScreen = false, flush = false, rotated = false, placement = "center", ...props }: DialogContentProps) {
45
54
  const context = useDialog();
46
55
  const host = useRef<DialogElement>(null);
47
56
  const [mounted, setMounted] = useState(false);
57
+ // A sheet or drawer stays on the page while it slides out, then leaves.
58
+ const sliding = placement !== "center";
59
+ const [leaving, setLeaving] = useState(false);
60
+ const [wasOpen, setWasOpen] = useState(context.open);
61
+ if (wasOpen !== context.open) {
62
+ setWasOpen(context.open);
63
+ setLeaving(!context.open && sliding && mounted);
64
+ }
65
+ useEffect(() => {
66
+ if (!leaving) return;
67
+ const native = host.current?.querySelector("dialog");
68
+ const done = () => setLeaving(false);
69
+ const ended = (event: Event) => {
70
+ const { propertyName, pseudoElement } = event as TransitionEvent;
71
+ if (event.target === native && !pseudoElement && (propertyName === "transform" || propertyName === "opacity")) done();
72
+ };
73
+ native?.addEventListener("transitionend", ended);
74
+ native?.addEventListener("transitioncancel", ended);
75
+ const timer = setTimeout(done, LEAVING);
76
+ return () => { clearTimeout(timer); native?.removeEventListener("transitionend", ended); native?.removeEventListener("transitioncancel", ended); };
77
+ }, [leaving]);
48
78
  // A portal has no server location. Keep the server and first client render
49
79
  // identical, including when the application initially requests an open modal.
50
80
  useLayoutEffect(() => { setMounted(true); }, []);
@@ -77,10 +107,11 @@ export function DialogContent({ children, portal = true, nonModal = false, close
77
107
  element.holdScroll = holdScroll;
78
108
  element.anchor = anchor;
79
109
  element.returnFocus = returnFocus;
110
+ element.placement = placement;
80
111
  element.open = context.open;
81
112
  return () => element.removeEventListener("ds-close-request", close);
82
113
  });
83
- if (!mounted || !context.open) return null;
114
+ if (!mounted || (!context.open && !leaving)) return null;
84
115
  const content = createElement("ds-dialog", { ref: host },
85
116
  createElement("dialog", { ...props, "data-ds-dialog-fullscreen": fullScreen || undefined, "data-ds-dialog-flush": flush || undefined, "data-ds-dialog-rotated": rotated || undefined }, children,
86
117
  showClose && createElement("ds-button", { control: "slotted", icon: true, "data-ds-dialog": "close" },
@@ -0,0 +1,14 @@
1
+ import { createElement, forwardRef, type HTMLAttributes } from "react";
2
+ import type { DocumentPage as DocumentElement } from "../4-page/ds-document";
3
+
4
+ export type DocumentPageProps = HTMLAttributes<DocumentElement> &
5
+ Partial<Pick<DocumentElement, "levels" | "label" | "literal" | "hideContents">>;
6
+ /**
7
+ * A document page: the children are the writing (native headings,
8
+ * paragraphs and a `<dl className="ds-definitions">`), in the light DOM so
9
+ * they render on the server; the element builds the contents from them.
10
+ * Browser-only registration stays in the product's runtime entry for SSR.
11
+ */
12
+ export const DocumentPage = forwardRef<DocumentElement, DocumentPageProps>(function DocumentPage({ hideContents, ...props }, ref) {
13
+ return createElement("ds-document", { ...props, "hide-contents": hideContents || undefined, "data-ds-prose": "", ref });
14
+ });
@@ -0,0 +1,32 @@
1
+ /** An empty state in React: the words stay in the light DOM, so they render on
2
+ * the server and read in tests; ds-empty draws them. Browser-only registration
3
+ * of ds-empty stays in the product's runtime entry. */
4
+ import { createElement as h, forwardRef, type HTMLAttributes, type ReactNode } from "react";
5
+ import type { Empty as EmptyElement } from "../2-core/ds-empty";
6
+
7
+ export type EmptyProps = Omit<HTMLAttributes<EmptyElement>, "title"> & {
8
+ /** The title. Unset, the shared words' "Nothing here yet" in the current language. */
9
+ heading?: ReactNode;
10
+ /** The line under the title; `children` take its place when given. */
11
+ text?: ReactNode;
12
+ /** An icon from the library on the square above the title. */
13
+ icon?: string;
14
+ /** The buttons or links that fill the place, on one row. */
15
+ actions?: ReactNode;
16
+ /** Centre the words in the space the element stands in. */
17
+ centered?: boolean;
18
+ /** Make the title a heading of this level (1–6). */
19
+ level?: number;
20
+ };
21
+
22
+ const title = (content: ReactNode) =>
23
+ content == null || content === false || content === "" ? null : h("span", { slot: "heading" }, content);
24
+
25
+ export const Empty = forwardRef<EmptyElement, EmptyProps>(function Empty(
26
+ { heading, text, icon, actions, centered, level, children, ...props }, ref,
27
+ ) {
28
+ return h("ds-empty", { ...props, icon, centered: centered || undefined, level, ref },
29
+ title(heading),
30
+ children ?? text,
31
+ actions == null || actions === false ? null : h("div", { slot: "actions", style: { display: "contents" } }, actions));
32
+ });