@slotted/angular 0.0.0-stage → 0.1.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (793) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +51 -2
  3. package/docs/AGENTS.snippet.md +10 -0
  4. package/docs/accordion.json +345 -0
  5. package/docs/accordion.md +207 -0
  6. package/docs/action-bar.json +421 -0
  7. package/docs/action-bar.md +364 -0
  8. package/docs/action-sheet.json +210 -0
  9. package/docs/action-sheet.md +19 -0
  10. package/docs/alert.json +407 -0
  11. package/docs/alert.md +239 -0
  12. package/docs/app-shell.examples.md +349 -0
  13. package/docs/app-shell.json +835 -0
  14. package/docs/app-shell.md +214 -0
  15. package/docs/aspect-ratio.json +159 -0
  16. package/docs/aspect-ratio.md +134 -0
  17. package/docs/attachment.json +486 -0
  18. package/docs/attachment.md +253 -0
  19. package/docs/avatar-group.json +208 -0
  20. package/docs/avatar-group.md +130 -0
  21. package/docs/avatar.json +342 -0
  22. package/docs/avatar.md +142 -0
  23. package/docs/badge.json +334 -0
  24. package/docs/badge.md +138 -0
  25. package/docs/breadcrumb.json +368 -0
  26. package/docs/breadcrumb.md +237 -0
  27. package/docs/button-group.json +158 -0
  28. package/docs/button-group.md +72 -0
  29. package/docs/button.examples.md +621 -0
  30. package/docs/button.json +977 -0
  31. package/docs/button.md +200 -0
  32. package/docs/calendar.json +592 -0
  33. package/docs/calendar.md +242 -0
  34. package/docs/card.json +283 -0
  35. package/docs/card.md +130 -0
  36. package/docs/carousel.json +560 -0
  37. package/docs/carousel.md +357 -0
  38. package/docs/cascader.json +933 -0
  39. package/docs/cascader.md +379 -0
  40. package/docs/chart.examples.md +582 -0
  41. package/docs/chart.json +1359 -0
  42. package/docs/chart.md +187 -0
  43. package/docs/checkbox-group.examples.md +612 -0
  44. package/docs/checkbox-group.json +395 -0
  45. package/docs/checkbox-group.md +106 -0
  46. package/docs/checkbox.examples.md +546 -0
  47. package/docs/checkbox.json +506 -0
  48. package/docs/checkbox.md +104 -0
  49. package/docs/code-block.json +616 -0
  50. package/docs/code-block.md +303 -0
  51. package/docs/collapsible.json +456 -0
  52. package/docs/collapsible.md +261 -0
  53. package/docs/color-picker.json +523 -0
  54. package/docs/color-picker.md +201 -0
  55. package/docs/column-manager.json +486 -0
  56. package/docs/column-manager.md +277 -0
  57. package/docs/combobox.examples.md +1732 -0
  58. package/docs/combobox.json +1250 -0
  59. package/docs/combobox.md +209 -0
  60. package/docs/command-palette.json +800 -0
  61. package/docs/command-palette.md +419 -0
  62. package/docs/container.json +156 -0
  63. package/docs/container.md +92 -0
  64. package/docs/context-menu.json +231 -0
  65. package/docs/context-menu.md +176 -0
  66. package/docs/currency-field.examples.md +321 -0
  67. package/docs/currency-field.json +649 -0
  68. package/docs/currency-field.md +128 -0
  69. package/docs/dashboard-grid.json +680 -0
  70. package/docs/dashboard-grid.md +265 -0
  71. package/docs/data-grid.examples.md +3064 -0
  72. package/docs/data-grid.json +1577 -0
  73. package/docs/data-grid.md +237 -0
  74. package/docs/data-grid.props.md +81 -0
  75. package/docs/data-list.json +685 -0
  76. package/docs/data-list.md +327 -0
  77. package/docs/date-field.json +490 -0
  78. package/docs/date-field.md +235 -0
  79. package/docs/date-picker.examples.md +1226 -0
  80. package/docs/date-picker.json +696 -0
  81. package/docs/date-picker.md +121 -0
  82. package/docs/date-range-picker.examples.md +1300 -0
  83. package/docs/date-range-picker.json +903 -0
  84. package/docs/date-range-picker.md +142 -0
  85. package/docs/datetime-field.json +665 -0
  86. package/docs/datetime-field.md +337 -0
  87. package/docs/datetime-picker.examples.md +1269 -0
  88. package/docs/datetime-picker.json +928 -0
  89. package/docs/datetime-picker.md +150 -0
  90. package/docs/datetime-range-picker.examples.md +225 -0
  91. package/docs/datetime-range-picker.json +1015 -0
  92. package/docs/datetime-range-picker.md +162 -0
  93. package/docs/description-list.json +471 -0
  94. package/docs/description-list.md +268 -0
  95. package/docs/detail-panel.json +530 -0
  96. package/docs/detail-panel.md +361 -0
  97. package/docs/dialog.examples.md +2467 -0
  98. package/docs/dialog.json +1141 -0
  99. package/docs/dialog.md +217 -0
  100. package/docs/dialog.props.md +63 -0
  101. package/docs/divider.json +148 -0
  102. package/docs/divider.md +83 -0
  103. package/docs/drawer.examples.md +1929 -0
  104. package/docs/drawer.json +753 -0
  105. package/docs/drawer.md +199 -0
  106. package/docs/entity-picker.json +946 -0
  107. package/docs/entity-picker.md +365 -0
  108. package/docs/event-calendar.examples.md +308 -0
  109. package/docs/event-calendar.json +1202 -0
  110. package/docs/event-calendar.md +201 -0
  111. package/docs/field-group.json +333 -0
  112. package/docs/field-group.md +181 -0
  113. package/docs/field.examples.md +676 -0
  114. package/docs/field.json +528 -0
  115. package/docs/field.md +127 -0
  116. package/docs/filter-bar.json +817 -0
  117. package/docs/filter-bar.md +380 -0
  118. package/docs/form.json +378 -0
  119. package/docs/form.md +235 -0
  120. package/docs/fullscreen.json +395 -0
  121. package/docs/fullscreen.md +225 -0
  122. package/docs/grid.json +176 -0
  123. package/docs/grid.md +74 -0
  124. package/docs/highlight.json +279 -0
  125. package/docs/highlight.md +210 -0
  126. package/docs/hover-card.json +254 -0
  127. package/docs/hover-card.md +213 -0
  128. package/docs/icon.json +173 -0
  129. package/docs/icon.md +101 -0
  130. package/docs/image.json +476 -0
  131. package/docs/image.md +254 -0
  132. package/docs/import-export-center.json +836 -0
  133. package/docs/import-export-center.md +345 -0
  134. package/docs/index.md +141 -0
  135. package/docs/inline-message.json +312 -0
  136. package/docs/inline-message.md +191 -0
  137. package/docs/inline.json +149 -0
  138. package/docs/inline.md +72 -0
  139. package/docs/kbd.json +350 -0
  140. package/docs/kbd.md +210 -0
  141. package/docs/link.json +264 -0
  142. package/docs/link.md +167 -0
  143. package/docs/list-item.json +463 -0
  144. package/docs/list-item.md +236 -0
  145. package/docs/list.json +321 -0
  146. package/docs/list.md +185 -0
  147. package/docs/listbox.json +807 -0
  148. package/docs/listbox.md +413 -0
  149. package/docs/loading-overlay.json +440 -0
  150. package/docs/loading-overlay.md +248 -0
  151. package/docs/markdown.json +461 -0
  152. package/docs/markdown.md +266 -0
  153. package/docs/menu.examples.md +1651 -0
  154. package/docs/menu.json +922 -0
  155. package/docs/menu.md +155 -0
  156. package/docs/menubar.json +292 -0
  157. package/docs/menubar.md +173 -0
  158. package/docs/message-scroller.json +401 -0
  159. package/docs/message-scroller.md +212 -0
  160. package/docs/message.json +862 -0
  161. package/docs/message.md +473 -0
  162. package/docs/multi-select.examples.md +1922 -0
  163. package/docs/multi-select.json +1314 -0
  164. package/docs/multi-select.md +213 -0
  165. package/docs/navigation-menu.json +529 -0
  166. package/docs/navigation-menu.md +329 -0
  167. package/docs/notification-center.json +664 -0
  168. package/docs/notification-center.md +372 -0
  169. package/docs/number-field.examples.md +1078 -0
  170. package/docs/number-field.json +668 -0
  171. package/docs/number-field.md +137 -0
  172. package/docs/otp-input.json +479 -0
  173. package/docs/otp-input.md +291 -0
  174. package/docs/page-header.json +574 -0
  175. package/docs/page-header.md +338 -0
  176. package/docs/page.json +332 -0
  177. package/docs/page.md +184 -0
  178. package/docs/pagination.json +434 -0
  179. package/docs/pagination.md +238 -0
  180. package/docs/popover.examples.md +1235 -0
  181. package/docs/popover.json +656 -0
  182. package/docs/popover.md +199 -0
  183. package/docs/progress-indicator.json +501 -0
  184. package/docs/progress-indicator.md +329 -0
  185. package/docs/prompt-composer.json +498 -0
  186. package/docs/prompt-composer.md +278 -0
  187. package/docs/prose.json +357 -0
  188. package/docs/prose.md +226 -0
  189. package/docs/radio-group.examples.md +626 -0
  190. package/docs/radio-group.json +541 -0
  191. package/docs/radio-group.md +112 -0
  192. package/docs/rating.json +1053 -0
  193. package/docs/rating.md +435 -0
  194. package/docs/result-state.json +376 -0
  195. package/docs/result-state.md +286 -0
  196. package/docs/saved-views.json +384 -0
  197. package/docs/saved-views.md +242 -0
  198. package/docs/scroll-area.json +120 -0
  199. package/docs/scroll-area.md +8 -0
  200. package/docs/section.json +344 -0
  201. package/docs/section.md +208 -0
  202. package/docs/segmented-control.json +429 -0
  203. package/docs/segmented-control.md +240 -0
  204. package/docs/select.examples.md +1214 -0
  205. package/docs/select.json +1147 -0
  206. package/docs/select.md +199 -0
  207. package/docs/side-navigation.json +632 -0
  208. package/docs/side-navigation.md +430 -0
  209. package/docs/skeleton.json +358 -0
  210. package/docs/skeleton.md +223 -0
  211. package/docs/slider.json +522 -0
  212. package/docs/slider.md +261 -0
  213. package/docs/sparkline.json +426 -0
  214. package/docs/sparkline.md +206 -0
  215. package/docs/split-button.json +361 -0
  216. package/docs/split-button.md +275 -0
  217. package/docs/splitter.json +142 -0
  218. package/docs/splitter.md +14 -0
  219. package/docs/stack.json +135 -0
  220. package/docs/stack.md +74 -0
  221. package/docs/stat-card.json +529 -0
  222. package/docs/stat-card.md +270 -0
  223. package/docs/status-indicator.json +314 -0
  224. package/docs/status-indicator.md +197 -0
  225. package/docs/stepper.json +451 -0
  226. package/docs/stepper.md +250 -0
  227. package/docs/switch.json +451 -0
  228. package/docs/switch.md +508 -0
  229. package/docs/table-of-contents.json +553 -0
  230. package/docs/table-of-contents.md +289 -0
  231. package/docs/table.examples.md +1981 -0
  232. package/docs/table.json +1059 -0
  233. package/docs/table.md +290 -0
  234. package/docs/tabs.examples.md +1370 -0
  235. package/docs/tabs.json +661 -0
  236. package/docs/tabs.md +211 -0
  237. package/docs/tag.json +813 -0
  238. package/docs/tag.md +241 -0
  239. package/docs/tags-input.json +771 -0
  240. package/docs/tags-input.md +361 -0
  241. package/docs/text-field.examples.md +821 -0
  242. package/docs/text-field.json +604 -0
  243. package/docs/text-field.md +125 -0
  244. package/docs/textarea.examples.md +612 -0
  245. package/docs/textarea.json +440 -0
  246. package/docs/textarea.md +98 -0
  247. package/docs/time-field.json +584 -0
  248. package/docs/time-field.md +291 -0
  249. package/docs/time-picker.json +679 -0
  250. package/docs/time-picker.md +315 -0
  251. package/docs/time-range-picker.examples.md +191 -0
  252. package/docs/time-range-picker.json +924 -0
  253. package/docs/time-range-picker.md +152 -0
  254. package/docs/timeline.json +839 -0
  255. package/docs/timeline.md +401 -0
  256. package/docs/toast.json +642 -0
  257. package/docs/toast.md +311 -0
  258. package/docs/toggle-group.json +417 -0
  259. package/docs/toggle-group.md +255 -0
  260. package/docs/toggle.json +326 -0
  261. package/docs/toggle.md +222 -0
  262. package/docs/toolbar.json +380 -0
  263. package/docs/toolbar.md +240 -0
  264. package/docs/tooltip.examples.md +664 -0
  265. package/docs/tooltip.json +604 -0
  266. package/docs/tooltip.md +146 -0
  267. package/docs/top-navigation.examples.md +287 -0
  268. package/docs/top-navigation.json +648 -0
  269. package/docs/top-navigation.md +138 -0
  270. package/docs/tour.json +759 -0
  271. package/docs/tour.md +337 -0
  272. package/docs/transfer.json +746 -0
  273. package/docs/transfer.md +273 -0
  274. package/docs/tree.json +918 -0
  275. package/docs/tree.md +397 -0
  276. package/docs/typography.json +317 -0
  277. package/docs/typography.md +107 -0
  278. package/docs/upload.examples.md +358 -0
  279. package/docs/upload.json +1103 -0
  280. package/docs/upload.md +166 -0
  281. package/docs/visually-hidden.json +71 -0
  282. package/docs/visually-hidden.md +42 -0
  283. package/docs/wizard.json +724 -0
  284. package/docs/wizard.md +295 -0
  285. package/fesm2022/slotted-angular-accordion.mjs +247 -0
  286. package/fesm2022/slotted-angular-accordion.mjs.map +1 -0
  287. package/fesm2022/slotted-angular-action-bar.mjs +639 -0
  288. package/fesm2022/slotted-angular-action-bar.mjs.map +1 -0
  289. package/fesm2022/slotted-angular-action-sheet.mjs +749 -0
  290. package/fesm2022/slotted-angular-action-sheet.mjs.map +1 -0
  291. package/fesm2022/slotted-angular-alert.mjs +427 -0
  292. package/fesm2022/slotted-angular-alert.mjs.map +1 -0
  293. package/fesm2022/slotted-angular-app-shell.mjs +1334 -0
  294. package/fesm2022/slotted-angular-app-shell.mjs.map +1 -0
  295. package/fesm2022/slotted-angular-aspect-ratio.mjs +63 -0
  296. package/fesm2022/slotted-angular-aspect-ratio.mjs.map +1 -0
  297. package/fesm2022/slotted-angular-attachment.mjs +595 -0
  298. package/fesm2022/slotted-angular-attachment.mjs.map +1 -0
  299. package/fesm2022/slotted-angular-avatar-group.mjs +230 -0
  300. package/fesm2022/slotted-angular-avatar-group.mjs.map +1 -0
  301. package/fesm2022/slotted-angular-avatar.mjs +330 -0
  302. package/fesm2022/slotted-angular-avatar.mjs.map +1 -0
  303. package/fesm2022/slotted-angular-badge.mjs +255 -0
  304. package/fesm2022/slotted-angular-badge.mjs.map +1 -0
  305. package/fesm2022/slotted-angular-breadcrumb.mjs +544 -0
  306. package/fesm2022/slotted-angular-breadcrumb.mjs.map +1 -0
  307. package/fesm2022/slotted-angular-button-group.mjs +146 -0
  308. package/fesm2022/slotted-angular-button-group.mjs.map +1 -0
  309. package/fesm2022/slotted-angular-button.mjs +692 -0
  310. package/fesm2022/slotted-angular-button.mjs.map +1 -0
  311. package/fesm2022/slotted-angular-calendar.mjs +916 -0
  312. package/fesm2022/slotted-angular-calendar.mjs.map +1 -0
  313. package/fesm2022/slotted-angular-card.mjs +225 -0
  314. package/fesm2022/slotted-angular-card.mjs.map +1 -0
  315. package/fesm2022/slotted-angular-carousel.mjs +840 -0
  316. package/fesm2022/slotted-angular-carousel.mjs.map +1 -0
  317. package/fesm2022/slotted-angular-cascader.mjs +1839 -0
  318. package/fesm2022/slotted-angular-cascader.mjs.map +1 -0
  319. package/fesm2022/slotted-angular-chart.mjs +974 -0
  320. package/fesm2022/slotted-angular-chart.mjs.map +1 -0
  321. package/fesm2022/slotted-angular-checkbox-group.mjs +283 -0
  322. package/fesm2022/slotted-angular-checkbox-group.mjs.map +1 -0
  323. package/fesm2022/slotted-angular-checkbox.mjs +468 -0
  324. package/fesm2022/slotted-angular-checkbox.mjs.map +1 -0
  325. package/fesm2022/slotted-angular-code-block.mjs +476 -0
  326. package/fesm2022/slotted-angular-code-block.mjs.map +1 -0
  327. package/fesm2022/slotted-angular-collapsible.mjs +479 -0
  328. package/fesm2022/slotted-angular-collapsible.mjs.map +1 -0
  329. package/fesm2022/slotted-angular-color-picker.mjs +910 -0
  330. package/fesm2022/slotted-angular-color-picker.mjs.map +1 -0
  331. package/fesm2022/slotted-angular-column-manager.mjs +1037 -0
  332. package/fesm2022/slotted-angular-column-manager.mjs.map +1 -0
  333. package/fesm2022/slotted-angular-combobox.mjs +1480 -0
  334. package/fesm2022/slotted-angular-combobox.mjs.map +1 -0
  335. package/fesm2022/slotted-angular-command-palette.mjs +1283 -0
  336. package/fesm2022/slotted-angular-command-palette.mjs.map +1 -0
  337. package/fesm2022/slotted-angular-container.mjs +105 -0
  338. package/fesm2022/slotted-angular-container.mjs.map +1 -0
  339. package/fesm2022/slotted-angular-context-menu.mjs +221 -0
  340. package/fesm2022/slotted-angular-context-menu.mjs.map +1 -0
  341. package/fesm2022/slotted-angular-currency-field.mjs +1131 -0
  342. package/fesm2022/slotted-angular-currency-field.mjs.map +1 -0
  343. package/fesm2022/slotted-angular-dashboard-grid.mjs +1928 -0
  344. package/fesm2022/slotted-angular-dashboard-grid.mjs.map +1 -0
  345. package/fesm2022/slotted-angular-data-grid.mjs +6697 -0
  346. package/fesm2022/slotted-angular-data-grid.mjs.map +1 -0
  347. package/fesm2022/slotted-angular-data-list.mjs +1418 -0
  348. package/fesm2022/slotted-angular-data-list.mjs.map +1 -0
  349. package/fesm2022/slotted-angular-date-field.mjs +772 -0
  350. package/fesm2022/slotted-angular-date-field.mjs.map +1 -0
  351. package/fesm2022/slotted-angular-date-picker.mjs +690 -0
  352. package/fesm2022/slotted-angular-date-picker.mjs.map +1 -0
  353. package/fesm2022/slotted-angular-date-range-picker.mjs +1150 -0
  354. package/fesm2022/slotted-angular-date-range-picker.mjs.map +1 -0
  355. package/fesm2022/slotted-angular-datetime-field.mjs +1058 -0
  356. package/fesm2022/slotted-angular-datetime-field.mjs.map +1 -0
  357. package/fesm2022/slotted-angular-datetime-picker.mjs +1362 -0
  358. package/fesm2022/slotted-angular-datetime-picker.mjs.map +1 -0
  359. package/fesm2022/slotted-angular-datetime-range-picker.mjs +1872 -0
  360. package/fesm2022/slotted-angular-datetime-range-picker.mjs.map +1 -0
  361. package/fesm2022/slotted-angular-description-list.mjs +545 -0
  362. package/fesm2022/slotted-angular-description-list.mjs.map +1 -0
  363. package/fesm2022/slotted-angular-detail-panel.mjs +754 -0
  364. package/fesm2022/slotted-angular-detail-panel.mjs.map +1 -0
  365. package/fesm2022/slotted-angular-dialog.mjs +980 -0
  366. package/fesm2022/slotted-angular-dialog.mjs.map +1 -0
  367. package/fesm2022/slotted-angular-divider.mjs +76 -0
  368. package/fesm2022/slotted-angular-divider.mjs.map +1 -0
  369. package/fesm2022/slotted-angular-drawer.mjs +1397 -0
  370. package/fesm2022/slotted-angular-drawer.mjs.map +1 -0
  371. package/fesm2022/slotted-angular-entity-picker.mjs +1987 -0
  372. package/fesm2022/slotted-angular-entity-picker.mjs.map +1 -0
  373. package/fesm2022/slotted-angular-event-calendar.mjs +2934 -0
  374. package/fesm2022/slotted-angular-event-calendar.mjs.map +1 -0
  375. package/fesm2022/slotted-angular-field-group.mjs +301 -0
  376. package/fesm2022/slotted-angular-field-group.mjs.map +1 -0
  377. package/fesm2022/slotted-angular-field.mjs +928 -0
  378. package/fesm2022/slotted-angular-field.mjs.map +1 -0
  379. package/fesm2022/slotted-angular-filter-bar.mjs +3107 -0
  380. package/fesm2022/slotted-angular-filter-bar.mjs.map +1 -0
  381. package/fesm2022/slotted-angular-form.mjs +592 -0
  382. package/fesm2022/slotted-angular-form.mjs.map +1 -0
  383. package/fesm2022/slotted-angular-fullscreen.mjs +314 -0
  384. package/fesm2022/slotted-angular-fullscreen.mjs.map +1 -0
  385. package/fesm2022/slotted-angular-grid.mjs +58 -0
  386. package/fesm2022/slotted-angular-grid.mjs.map +1 -0
  387. package/fesm2022/slotted-angular-highlight.mjs +123 -0
  388. package/fesm2022/slotted-angular-highlight.mjs.map +1 -0
  389. package/fesm2022/slotted-angular-hover-card.mjs +326 -0
  390. package/fesm2022/slotted-angular-hover-card.mjs.map +1 -0
  391. package/fesm2022/slotted-angular-i18n.mjs +75 -0
  392. package/fesm2022/slotted-angular-i18n.mjs.map +1 -0
  393. package/fesm2022/slotted-angular-icon.mjs +232 -0
  394. package/fesm2022/slotted-angular-icon.mjs.map +1 -0
  395. package/fesm2022/slotted-angular-image.mjs +442 -0
  396. package/fesm2022/slotted-angular-image.mjs.map +1 -0
  397. package/fesm2022/slotted-angular-import-export-center.mjs +1792 -0
  398. package/fesm2022/slotted-angular-import-export-center.mjs.map +1 -0
  399. package/fesm2022/slotted-angular-inline-message.mjs +280 -0
  400. package/fesm2022/slotted-angular-inline-message.mjs.map +1 -0
  401. package/fesm2022/slotted-angular-inline.mjs +52 -0
  402. package/fesm2022/slotted-angular-inline.mjs.map +1 -0
  403. package/fesm2022/slotted-angular-kbd.mjs +284 -0
  404. package/fesm2022/slotted-angular-kbd.mjs.map +1 -0
  405. package/fesm2022/slotted-angular-link.mjs +182 -0
  406. package/fesm2022/slotted-angular-link.mjs.map +1 -0
  407. package/fesm2022/slotted-angular-list-item.mjs +367 -0
  408. package/fesm2022/slotted-angular-list-item.mjs.map +1 -0
  409. package/fesm2022/slotted-angular-list.mjs +256 -0
  410. package/fesm2022/slotted-angular-list.mjs.map +1 -0
  411. package/fesm2022/slotted-angular-listbox.mjs +1274 -0
  412. package/fesm2022/slotted-angular-listbox.mjs.map +1 -0
  413. package/fesm2022/slotted-angular-loading-overlay.mjs +451 -0
  414. package/fesm2022/slotted-angular-loading-overlay.mjs.map +1 -0
  415. package/fesm2022/slotted-angular-markdown.mjs +914 -0
  416. package/fesm2022/slotted-angular-markdown.mjs.map +1 -0
  417. package/fesm2022/slotted-angular-menu.mjs +1211 -0
  418. package/fesm2022/slotted-angular-menu.mjs.map +1 -0
  419. package/fesm2022/slotted-angular-menubar.mjs +230 -0
  420. package/fesm2022/slotted-angular-menubar.mjs.map +1 -0
  421. package/fesm2022/slotted-angular-message-scroller.mjs +378 -0
  422. package/fesm2022/slotted-angular-message-scroller.mjs.map +1 -0
  423. package/fesm2022/slotted-angular-message.mjs +866 -0
  424. package/fesm2022/slotted-angular-message.mjs.map +1 -0
  425. package/fesm2022/slotted-angular-multi-select.mjs +1939 -0
  426. package/fesm2022/slotted-angular-multi-select.mjs.map +1 -0
  427. package/fesm2022/slotted-angular-navigation-menu.mjs +770 -0
  428. package/fesm2022/slotted-angular-navigation-menu.mjs.map +1 -0
  429. package/fesm2022/slotted-angular-notification-center.mjs +1172 -0
  430. package/fesm2022/slotted-angular-notification-center.mjs.map +1 -0
  431. package/fesm2022/slotted-angular-number-field.mjs +966 -0
  432. package/fesm2022/slotted-angular-number-field.mjs.map +1 -0
  433. package/fesm2022/slotted-angular-otp-input.mjs +629 -0
  434. package/fesm2022/slotted-angular-otp-input.mjs.map +1 -0
  435. package/fesm2022/slotted-angular-page-header.mjs +788 -0
  436. package/fesm2022/slotted-angular-page-header.mjs.map +1 -0
  437. package/fesm2022/slotted-angular-page.mjs +255 -0
  438. package/fesm2022/slotted-angular-page.mjs.map +1 -0
  439. package/fesm2022/slotted-angular-pagination.mjs +562 -0
  440. package/fesm2022/slotted-angular-pagination.mjs.map +1 -0
  441. package/fesm2022/slotted-angular-popover.mjs +799 -0
  442. package/fesm2022/slotted-angular-popover.mjs.map +1 -0
  443. package/fesm2022/slotted-angular-progress-indicator.mjs +572 -0
  444. package/fesm2022/slotted-angular-progress-indicator.mjs.map +1 -0
  445. package/fesm2022/slotted-angular-prompt-composer.mjs +596 -0
  446. package/fesm2022/slotted-angular-prompt-composer.mjs.map +1 -0
  447. package/fesm2022/slotted-angular-prose.mjs +314 -0
  448. package/fesm2022/slotted-angular-prose.mjs.map +1 -0
  449. package/fesm2022/slotted-angular-radio-group.mjs +469 -0
  450. package/fesm2022/slotted-angular-radio-group.mjs.map +1 -0
  451. package/fesm2022/slotted-angular-rating.mjs +1174 -0
  452. package/fesm2022/slotted-angular-rating.mjs.map +1 -0
  453. package/fesm2022/slotted-angular-result-state.mjs +330 -0
  454. package/fesm2022/slotted-angular-result-state.mjs.map +1 -0
  455. package/fesm2022/slotted-angular-saved-views.mjs +877 -0
  456. package/fesm2022/slotted-angular-saved-views.mjs.map +1 -0
  457. package/fesm2022/slotted-angular-scroll-area.mjs +294 -0
  458. package/fesm2022/slotted-angular-scroll-area.mjs.map +1 -0
  459. package/fesm2022/slotted-angular-section.mjs +266 -0
  460. package/fesm2022/slotted-angular-section.mjs.map +1 -0
  461. package/fesm2022/slotted-angular-segmented-control.mjs +454 -0
  462. package/fesm2022/slotted-angular-segmented-control.mjs.map +1 -0
  463. package/fesm2022/slotted-angular-select.mjs +1899 -0
  464. package/fesm2022/slotted-angular-select.mjs.map +1 -0
  465. package/fesm2022/slotted-angular-side-navigation.mjs +1042 -0
  466. package/fesm2022/slotted-angular-side-navigation.mjs.map +1 -0
  467. package/fesm2022/slotted-angular-skeleton.mjs +316 -0
  468. package/fesm2022/slotted-angular-skeleton.mjs.map +1 -0
  469. package/fesm2022/slotted-angular-slider.mjs +586 -0
  470. package/fesm2022/slotted-angular-slider.mjs.map +1 -0
  471. package/fesm2022/slotted-angular-sparkline.mjs +235 -0
  472. package/fesm2022/slotted-angular-sparkline.mjs.map +1 -0
  473. package/fesm2022/slotted-angular-split-button.mjs +331 -0
  474. package/fesm2022/slotted-angular-split-button.mjs.map +1 -0
  475. package/fesm2022/slotted-angular-splitter.mjs +516 -0
  476. package/fesm2022/slotted-angular-splitter.mjs.map +1 -0
  477. package/fesm2022/slotted-angular-stack.mjs +48 -0
  478. package/fesm2022/slotted-angular-stack.mjs.map +1 -0
  479. package/fesm2022/slotted-angular-stat-card.mjs +478 -0
  480. package/fesm2022/slotted-angular-stat-card.mjs.map +1 -0
  481. package/fesm2022/slotted-angular-status-indicator.mjs +155 -0
  482. package/fesm2022/slotted-angular-status-indicator.mjs.map +1 -0
  483. package/fesm2022/slotted-angular-stepper.mjs +536 -0
  484. package/fesm2022/slotted-angular-stepper.mjs.map +1 -0
  485. package/fesm2022/slotted-angular-switch.mjs +447 -0
  486. package/fesm2022/slotted-angular-switch.mjs.map +1 -0
  487. package/fesm2022/slotted-angular-table-of-contents.mjs +750 -0
  488. package/fesm2022/slotted-angular-table-of-contents.mjs.map +1 -0
  489. package/fesm2022/slotted-angular-table.mjs +2518 -0
  490. package/fesm2022/slotted-angular-table.mjs.map +1 -0
  491. package/fesm2022/slotted-angular-tabs.mjs +829 -0
  492. package/fesm2022/slotted-angular-tabs.mjs.map +1 -0
  493. package/fesm2022/slotted-angular-tag.mjs +595 -0
  494. package/fesm2022/slotted-angular-tag.mjs.map +1 -0
  495. package/fesm2022/slotted-angular-tags-input.mjs +1211 -0
  496. package/fesm2022/slotted-angular-tags-input.mjs.map +1 -0
  497. package/fesm2022/slotted-angular-text-field.mjs +674 -0
  498. package/fesm2022/slotted-angular-text-field.mjs.map +1 -0
  499. package/fesm2022/slotted-angular-textarea.mjs +275 -0
  500. package/fesm2022/slotted-angular-textarea.mjs.map +1 -0
  501. package/fesm2022/slotted-angular-theme.mjs +45 -0
  502. package/fesm2022/slotted-angular-theme.mjs.map +1 -0
  503. package/fesm2022/slotted-angular-time-field.mjs +895 -0
  504. package/fesm2022/slotted-angular-time-field.mjs.map +1 -0
  505. package/fesm2022/slotted-angular-time-picker.mjs +856 -0
  506. package/fesm2022/slotted-angular-time-picker.mjs.map +1 -0
  507. package/fesm2022/slotted-angular-time-range-picker.mjs +1534 -0
  508. package/fesm2022/slotted-angular-time-range-picker.mjs.map +1 -0
  509. package/fesm2022/slotted-angular-timeline.mjs +928 -0
  510. package/fesm2022/slotted-angular-timeline.mjs.map +1 -0
  511. package/fesm2022/slotted-angular-toast.mjs +917 -0
  512. package/fesm2022/slotted-angular-toast.mjs.map +1 -0
  513. package/fesm2022/slotted-angular-toggle-group.mjs +311 -0
  514. package/fesm2022/slotted-angular-toggle-group.mjs.map +1 -0
  515. package/fesm2022/slotted-angular-toggle.mjs +162 -0
  516. package/fesm2022/slotted-angular-toggle.mjs.map +1 -0
  517. package/fesm2022/slotted-angular-toolbar.mjs +536 -0
  518. package/fesm2022/slotted-angular-toolbar.mjs.map +1 -0
  519. package/fesm2022/slotted-angular-tooltip.mjs +798 -0
  520. package/fesm2022/slotted-angular-tooltip.mjs.map +1 -0
  521. package/fesm2022/slotted-angular-top-navigation.mjs +1308 -0
  522. package/fesm2022/slotted-angular-top-navigation.mjs.map +1 -0
  523. package/fesm2022/slotted-angular-tour.mjs +1330 -0
  524. package/fesm2022/slotted-angular-tour.mjs.map +1 -0
  525. package/fesm2022/slotted-angular-transfer.mjs +1406 -0
  526. package/fesm2022/slotted-angular-transfer.mjs.map +1 -0
  527. package/fesm2022/slotted-angular-tree.mjs +1448 -0
  528. package/fesm2022/slotted-angular-tree.mjs.map +1 -0
  529. package/fesm2022/slotted-angular-typography.mjs +184 -0
  530. package/fesm2022/slotted-angular-typography.mjs.map +1 -0
  531. package/fesm2022/slotted-angular-upload.mjs +1523 -0
  532. package/fesm2022/slotted-angular-upload.mjs.map +1 -0
  533. package/fesm2022/slotted-angular-visually-hidden.mjs +32 -0
  534. package/fesm2022/slotted-angular-visually-hidden.mjs.map +1 -0
  535. package/fesm2022/slotted-angular-wizard.mjs +1715 -0
  536. package/fesm2022/slotted-angular-wizard.mjs.map +1 -0
  537. package/fesm2022/slotted-angular.mjs +4 -0
  538. package/fesm2022/slotted-angular.mjs.map +1 -0
  539. package/package.json +537 -3
  540. package/types/slotted-angular-accordion.d.ts +156 -0
  541. package/types/slotted-angular-accordion.d.ts.map +1 -0
  542. package/types/slotted-angular-action-bar.d.ts +291 -0
  543. package/types/slotted-angular-action-bar.d.ts.map +1 -0
  544. package/types/slotted-angular-action-sheet.d.ts +294 -0
  545. package/types/slotted-angular-action-sheet.d.ts.map +1 -0
  546. package/types/slotted-angular-alert.d.ts +214 -0
  547. package/types/slotted-angular-alert.d.ts.map +1 -0
  548. package/types/slotted-angular-app-shell.d.ts +549 -0
  549. package/types/slotted-angular-app-shell.d.ts.map +1 -0
  550. package/types/slotted-angular-aspect-ratio.d.ts +57 -0
  551. package/types/slotted-angular-aspect-ratio.d.ts.map +1 -0
  552. package/types/slotted-angular-attachment.d.ts +294 -0
  553. package/types/slotted-angular-attachment.d.ts.map +1 -0
  554. package/types/slotted-angular-avatar-group.d.ts +119 -0
  555. package/types/slotted-angular-avatar-group.d.ts.map +1 -0
  556. package/types/slotted-angular-avatar.d.ts +202 -0
  557. package/types/slotted-angular-avatar.d.ts.map +1 -0
  558. package/types/slotted-angular-badge.d.ts +166 -0
  559. package/types/slotted-angular-badge.d.ts.map +1 -0
  560. package/types/slotted-angular-breadcrumb.d.ts +251 -0
  561. package/types/slotted-angular-breadcrumb.d.ts.map +1 -0
  562. package/types/slotted-angular-button-group.d.ts +89 -0
  563. package/types/slotted-angular-button-group.d.ts.map +1 -0
  564. package/types/slotted-angular-button.d.ts +390 -0
  565. package/types/slotted-angular-button.d.ts.map +1 -0
  566. package/types/slotted-angular-calendar.d.ts +280 -0
  567. package/types/slotted-angular-calendar.d.ts.map +1 -0
  568. package/types/slotted-angular-card.d.ts +140 -0
  569. package/types/slotted-angular-card.d.ts.map +1 -0
  570. package/types/slotted-angular-carousel.d.ts +288 -0
  571. package/types/slotted-angular-carousel.d.ts.map +1 -0
  572. package/types/slotted-angular-cascader.d.ts +351 -0
  573. package/types/slotted-angular-cascader.d.ts.map +1 -0
  574. package/types/slotted-angular-chart.d.ts +319 -0
  575. package/types/slotted-angular-chart.d.ts.map +1 -0
  576. package/types/slotted-angular-checkbox-group.d.ts +156 -0
  577. package/types/slotted-angular-checkbox-group.d.ts.map +1 -0
  578. package/types/slotted-angular-checkbox.d.ts +197 -0
  579. package/types/slotted-angular-checkbox.d.ts.map +1 -0
  580. package/types/slotted-angular-code-block.d.ts +158 -0
  581. package/types/slotted-angular-code-block.d.ts.map +1 -0
  582. package/types/slotted-angular-collapsible.d.ts +272 -0
  583. package/types/slotted-angular-collapsible.d.ts.map +1 -0
  584. package/types/slotted-angular-color-picker.d.ts +181 -0
  585. package/types/slotted-angular-color-picker.d.ts.map +1 -0
  586. package/types/slotted-angular-column-manager.d.ts +200 -0
  587. package/types/slotted-angular-column-manager.d.ts.map +1 -0
  588. package/types/slotted-angular-combobox.d.ts +449 -0
  589. package/types/slotted-angular-combobox.d.ts.map +1 -0
  590. package/types/slotted-angular-command-palette.d.ts +256 -0
  591. package/types/slotted-angular-command-palette.d.ts.map +1 -0
  592. package/types/slotted-angular-container.d.ts +84 -0
  593. package/types/slotted-angular-container.d.ts.map +1 -0
  594. package/types/slotted-angular-context-menu.d.ts +84 -0
  595. package/types/slotted-angular-context-menu.d.ts.map +1 -0
  596. package/types/slotted-angular-currency-field.d.ts +480 -0
  597. package/types/slotted-angular-currency-field.d.ts.map +1 -0
  598. package/types/slotted-angular-dashboard-grid.d.ts +341 -0
  599. package/types/slotted-angular-dashboard-grid.d.ts.map +1 -0
  600. package/types/slotted-angular-data-grid.d.ts +1077 -0
  601. package/types/slotted-angular-data-grid.d.ts.map +1 -0
  602. package/types/slotted-angular-data-list.d.ts +272 -0
  603. package/types/slotted-angular-data-list.d.ts.map +1 -0
  604. package/types/slotted-angular-date-field.d.ts +320 -0
  605. package/types/slotted-angular-date-field.d.ts.map +1 -0
  606. package/types/slotted-angular-date-picker.d.ts +224 -0
  607. package/types/slotted-angular-date-picker.d.ts.map +1 -0
  608. package/types/slotted-angular-date-range-picker.d.ts +310 -0
  609. package/types/slotted-angular-date-range-picker.d.ts.map +1 -0
  610. package/types/slotted-angular-datetime-field.d.ts +362 -0
  611. package/types/slotted-angular-datetime-field.d.ts.map +1 -0
  612. package/types/slotted-angular-datetime-picker.d.ts +370 -0
  613. package/types/slotted-angular-datetime-picker.d.ts.map +1 -0
  614. package/types/slotted-angular-datetime-range-picker.d.ts +459 -0
  615. package/types/slotted-angular-datetime-range-picker.d.ts.map +1 -0
  616. package/types/slotted-angular-description-list.d.ts +281 -0
  617. package/types/slotted-angular-description-list.d.ts.map +1 -0
  618. package/types/slotted-angular-detail-panel.d.ts +240 -0
  619. package/types/slotted-angular-detail-panel.d.ts.map +1 -0
  620. package/types/slotted-angular-dialog.d.ts +497 -0
  621. package/types/slotted-angular-dialog.d.ts.map +1 -0
  622. package/types/slotted-angular-divider.d.ts +40 -0
  623. package/types/slotted-angular-divider.d.ts.map +1 -0
  624. package/types/slotted-angular-drawer.d.ts +532 -0
  625. package/types/slotted-angular-drawer.d.ts.map +1 -0
  626. package/types/slotted-angular-entity-picker.d.ts +338 -0
  627. package/types/slotted-angular-entity-picker.d.ts.map +1 -0
  628. package/types/slotted-angular-event-calendar.d.ts +574 -0
  629. package/types/slotted-angular-event-calendar.d.ts.map +1 -0
  630. package/types/slotted-angular-field-group.d.ts +152 -0
  631. package/types/slotted-angular-field-group.d.ts.map +1 -0
  632. package/types/slotted-angular-field.d.ts +535 -0
  633. package/types/slotted-angular-field.d.ts.map +1 -0
  634. package/types/slotted-angular-filter-bar.d.ts +573 -0
  635. package/types/slotted-angular-filter-bar.d.ts.map +1 -0
  636. package/types/slotted-angular-form.d.ts +298 -0
  637. package/types/slotted-angular-form.d.ts.map +1 -0
  638. package/types/slotted-angular-fullscreen.d.ts +145 -0
  639. package/types/slotted-angular-fullscreen.d.ts.map +1 -0
  640. package/types/slotted-angular-grid.d.ts +50 -0
  641. package/types/slotted-angular-grid.d.ts.map +1 -0
  642. package/types/slotted-angular-highlight.d.ts +93 -0
  643. package/types/slotted-angular-highlight.d.ts.map +1 -0
  644. package/types/slotted-angular-hover-card.d.ts +140 -0
  645. package/types/slotted-angular-hover-card.d.ts.map +1 -0
  646. package/types/slotted-angular-i18n.d.ts +46 -0
  647. package/types/slotted-angular-i18n.d.ts.map +1 -0
  648. package/types/slotted-angular-icon.d.ts +94 -0
  649. package/types/slotted-angular-icon.d.ts.map +1 -0
  650. package/types/slotted-angular-image.d.ts +251 -0
  651. package/types/slotted-angular-image.d.ts.map +1 -0
  652. package/types/slotted-angular-import-export-center.d.ts +351 -0
  653. package/types/slotted-angular-import-export-center.d.ts.map +1 -0
  654. package/types/slotted-angular-inline-message.d.ts +195 -0
  655. package/types/slotted-angular-inline-message.d.ts.map +1 -0
  656. package/types/slotted-angular-inline.d.ts +41 -0
  657. package/types/slotted-angular-inline.d.ts.map +1 -0
  658. package/types/slotted-angular-kbd.d.ts +174 -0
  659. package/types/slotted-angular-kbd.d.ts.map +1 -0
  660. package/types/slotted-angular-link.d.ts +94 -0
  661. package/types/slotted-angular-link.d.ts.map +1 -0
  662. package/types/slotted-angular-list-item.d.ts +210 -0
  663. package/types/slotted-angular-list-item.d.ts.map +1 -0
  664. package/types/slotted-angular-list.d.ts +176 -0
  665. package/types/slotted-angular-list.d.ts.map +1 -0
  666. package/types/slotted-angular-listbox.d.ts +470 -0
  667. package/types/slotted-angular-listbox.d.ts.map +1 -0
  668. package/types/slotted-angular-loading-overlay.d.ts +219 -0
  669. package/types/slotted-angular-loading-overlay.d.ts.map +1 -0
  670. package/types/slotted-angular-markdown.d.ts +172 -0
  671. package/types/slotted-angular-markdown.d.ts.map +1 -0
  672. package/types/slotted-angular-menu.d.ts +448 -0
  673. package/types/slotted-angular-menu.d.ts.map +1 -0
  674. package/types/slotted-angular-menubar.d.ts +90 -0
  675. package/types/slotted-angular-menubar.d.ts.map +1 -0
  676. package/types/slotted-angular-message-scroller.d.ts +151 -0
  677. package/types/slotted-angular-message-scroller.d.ts.map +1 -0
  678. package/types/slotted-angular-message.d.ts +348 -0
  679. package/types/slotted-angular-message.d.ts.map +1 -0
  680. package/types/slotted-angular-multi-select.d.ts +462 -0
  681. package/types/slotted-angular-multi-select.d.ts.map +1 -0
  682. package/types/slotted-angular-navigation-menu.d.ts +309 -0
  683. package/types/slotted-angular-navigation-menu.d.ts.map +1 -0
  684. package/types/slotted-angular-notification-center.d.ts +318 -0
  685. package/types/slotted-angular-notification-center.d.ts.map +1 -0
  686. package/types/slotted-angular-number-field.d.ts +402 -0
  687. package/types/slotted-angular-number-field.d.ts.map +1 -0
  688. package/types/slotted-angular-otp-input.d.ts +286 -0
  689. package/types/slotted-angular-otp-input.d.ts.map +1 -0
  690. package/types/slotted-angular-page-header.d.ts +334 -0
  691. package/types/slotted-angular-page-header.d.ts.map +1 -0
  692. package/types/slotted-angular-page.d.ts +141 -0
  693. package/types/slotted-angular-page.d.ts.map +1 -0
  694. package/types/slotted-angular-pagination.d.ts +213 -0
  695. package/types/slotted-angular-pagination.d.ts.map +1 -0
  696. package/types/slotted-angular-popover.d.ts +366 -0
  697. package/types/slotted-angular-popover.d.ts.map +1 -0
  698. package/types/slotted-angular-progress-indicator.d.ts +312 -0
  699. package/types/slotted-angular-progress-indicator.d.ts.map +1 -0
  700. package/types/slotted-angular-prompt-composer.d.ts +242 -0
  701. package/types/slotted-angular-prompt-composer.d.ts.map +1 -0
  702. package/types/slotted-angular-prose.d.ts +171 -0
  703. package/types/slotted-angular-prose.d.ts.map +1 -0
  704. package/types/slotted-angular-radio-group.d.ts +268 -0
  705. package/types/slotted-angular-radio-group.d.ts.map +1 -0
  706. package/types/slotted-angular-rating.d.ts +374 -0
  707. package/types/slotted-angular-rating.d.ts.map +1 -0
  708. package/types/slotted-angular-result-state.d.ts +217 -0
  709. package/types/slotted-angular-result-state.d.ts.map +1 -0
  710. package/types/slotted-angular-saved-views.d.ts +198 -0
  711. package/types/slotted-angular-saved-views.d.ts.map +1 -0
  712. package/types/slotted-angular-scroll-area.d.ts +186 -0
  713. package/types/slotted-angular-scroll-area.d.ts.map +1 -0
  714. package/types/slotted-angular-section.d.ts +143 -0
  715. package/types/slotted-angular-section.d.ts.map +1 -0
  716. package/types/slotted-angular-segmented-control.d.ts +251 -0
  717. package/types/slotted-angular-segmented-control.d.ts.map +1 -0
  718. package/types/slotted-angular-select.d.ts +507 -0
  719. package/types/slotted-angular-select.d.ts.map +1 -0
  720. package/types/slotted-angular-side-navigation.d.ts +373 -0
  721. package/types/slotted-angular-side-navigation.d.ts.map +1 -0
  722. package/types/slotted-angular-skeleton.d.ts +198 -0
  723. package/types/slotted-angular-skeleton.d.ts.map +1 -0
  724. package/types/slotted-angular-slider.d.ts +216 -0
  725. package/types/slotted-angular-slider.d.ts.map +1 -0
  726. package/types/slotted-angular-sparkline.d.ts +106 -0
  727. package/types/slotted-angular-sparkline.d.ts.map +1 -0
  728. package/types/slotted-angular-split-button.d.ts +180 -0
  729. package/types/slotted-angular-split-button.d.ts.map +1 -0
  730. package/types/slotted-angular-splitter.d.ts +206 -0
  731. package/types/slotted-angular-splitter.d.ts.map +1 -0
  732. package/types/slotted-angular-stack.d.ts +38 -0
  733. package/types/slotted-angular-stack.d.ts.map +1 -0
  734. package/types/slotted-angular-stat-card.d.ts +232 -0
  735. package/types/slotted-angular-stat-card.d.ts.map +1 -0
  736. package/types/slotted-angular-status-indicator.d.ts +106 -0
  737. package/types/slotted-angular-status-indicator.d.ts.map +1 -0
  738. package/types/slotted-angular-stepper.d.ts +198 -0
  739. package/types/slotted-angular-stepper.d.ts.map +1 -0
  740. package/types/slotted-angular-switch.d.ts +243 -0
  741. package/types/slotted-angular-switch.d.ts.map +1 -0
  742. package/types/slotted-angular-table-of-contents.d.ts +210 -0
  743. package/types/slotted-angular-table-of-contents.d.ts.map +1 -0
  744. package/types/slotted-angular-table.d.ts +888 -0
  745. package/types/slotted-angular-table.d.ts.map +1 -0
  746. package/types/slotted-angular-tabs.d.ts +340 -0
  747. package/types/slotted-angular-tabs.d.ts.map +1 -0
  748. package/types/slotted-angular-tag.d.ts +279 -0
  749. package/types/slotted-angular-tag.d.ts.map +1 -0
  750. package/types/slotted-angular-tags-input.d.ts +302 -0
  751. package/types/slotted-angular-tags-input.d.ts.map +1 -0
  752. package/types/slotted-angular-text-field.d.ts +334 -0
  753. package/types/slotted-angular-text-field.d.ts.map +1 -0
  754. package/types/slotted-angular-textarea.d.ts +150 -0
  755. package/types/slotted-angular-textarea.d.ts.map +1 -0
  756. package/types/slotted-angular-theme.d.ts +26 -0
  757. package/types/slotted-angular-theme.d.ts.map +1 -0
  758. package/types/slotted-angular-time-field.d.ts +300 -0
  759. package/types/slotted-angular-time-field.d.ts.map +1 -0
  760. package/types/slotted-angular-time-picker.d.ts +260 -0
  761. package/types/slotted-angular-time-picker.d.ts.map +1 -0
  762. package/types/slotted-angular-time-range-picker.d.ts +401 -0
  763. package/types/slotted-angular-time-range-picker.d.ts.map +1 -0
  764. package/types/slotted-angular-timeline.d.ts +329 -0
  765. package/types/slotted-angular-timeline.d.ts.map +1 -0
  766. package/types/slotted-angular-toast.d.ts +340 -0
  767. package/types/slotted-angular-toast.d.ts.map +1 -0
  768. package/types/slotted-angular-toggle-group.d.ts +167 -0
  769. package/types/slotted-angular-toggle-group.d.ts.map +1 -0
  770. package/types/slotted-angular-toggle.d.ts +106 -0
  771. package/types/slotted-angular-toggle.d.ts.map +1 -0
  772. package/types/slotted-angular-toolbar.d.ts +252 -0
  773. package/types/slotted-angular-toolbar.d.ts.map +1 -0
  774. package/types/slotted-angular-tooltip.d.ts +388 -0
  775. package/types/slotted-angular-tooltip.d.ts.map +1 -0
  776. package/types/slotted-angular-top-navigation.d.ts +442 -0
  777. package/types/slotted-angular-top-navigation.d.ts.map +1 -0
  778. package/types/slotted-angular-tour.d.ts +440 -0
  779. package/types/slotted-angular-tour.d.ts.map +1 -0
  780. package/types/slotted-angular-transfer.d.ts +296 -0
  781. package/types/slotted-angular-transfer.d.ts.map +1 -0
  782. package/types/slotted-angular-tree.d.ts +499 -0
  783. package/types/slotted-angular-tree.d.ts.map +1 -0
  784. package/types/slotted-angular-typography.d.ts +89 -0
  785. package/types/slotted-angular-typography.d.ts.map +1 -0
  786. package/types/slotted-angular-upload.d.ts +365 -0
  787. package/types/slotted-angular-upload.d.ts.map +1 -0
  788. package/types/slotted-angular-visually-hidden.d.ts +19 -0
  789. package/types/slotted-angular-visually-hidden.d.ts.map +1 -0
  790. package/types/slotted-angular-wizard.d.ts +441 -0
  791. package/types/slotted-angular-wizard.d.ts.map +1 -0
  792. package/types/slotted-angular.d.ts +3 -0
  793. package/types/slotted-angular.d.ts.map +1 -0
@@ -0,0 +1,2467 @@
1
+ <!-- index: ./index.md -->
2
+ # dialog
3
+
4
+ `data-ui="dialog"` · Modal dialog and alert dialog.
5
+
6
+ ## Examples
7
+
8
+ ### Playground
9
+
10
+ A layer opened inside the scene rather than over the page. Press the trigger, then Tab: focus is contained, Escape closes, and focus returns to the button it came from.
11
+
12
+ Excerpt — not a complete module
13
+
14
+ ```html
15
+ <button slButton [slDialogTrigger]="d">Edit project</button>
16
+ <sl-dialog #d="slDialog" [(open)]="open">
17
+ <header slDialogHeader>
18
+ <h2 slDialogTitle>Edit project</h2>
19
+ <p slDialogDescription>The name is visible to the whole space.</p>
20
+ <button slDialogClose></button>
21
+ </header>
22
+ <div slDialogBody>
23
+ <input slTextField aria-label="Name" value="Home page redesign" />
24
+ </div>
25
+ <footer slDialogFooter>
26
+ <button slButton variant="ghost" tone="secondary">Cancel</button>
27
+ <button slButton>Save</button>
28
+ </footer>
29
+ </sl-dialog>
30
+ ```
31
+
32
+ ### How wide the panel is allowed to be
33
+
34
+ Five named steps rather than a pixel string, because a theme can retune a step and cannot retune width: 600px. full spends the whole layer minus its padding, for a dialog that is a document.
35
+
36
+ Example
37
+
38
+ ```ts
39
+ import { Component } from '@angular/core';
40
+ import { SlButton } from '@slotted/angular/button';
41
+ import {
42
+ SlDialog,
43
+ SlDialogBody,
44
+ SlDialogClose,
45
+ SlDialogHeader,
46
+ SlDialogTitle,
47
+ SlDialogTrigger,
48
+ type DialogSize,
49
+ } from '@slotted/angular/dialog';
50
+ import { SlInline } from '@slotted/angular/inline';
51
+ import { SlText } from '@slotted/angular/typography';
52
+
53
+ const SIZES: { size: DialogSize; title: string; body: string }[] = [
54
+ {
55
+ size: 'sm',
56
+ title: 'Rename warehouse',
57
+ body: 'Small, 24rem: one field or one question.',
58
+ },
59
+ {
60
+ size: 'md',
61
+ title: 'Edit customer',
62
+ body: 'Medium, 32rem, the default: a short form of one column.',
63
+ },
64
+ {
65
+ size: 'lg',
66
+ title: 'Invoice INV-2041',
67
+ body: 'Large, 42rem: a record with a table of line items.',
68
+ },
69
+ {
70
+ size: 'xl',
71
+ title: 'Compare price lists',
72
+ body: 'Extra large, 56rem: two columns side by side.',
73
+ },
74
+ {
75
+ size: 'full',
76
+ title: 'Shipment manifest',
77
+ body: 'Full: the whole layer less its padding, for a document.',
78
+ },
79
+ ];
80
+
81
+ @Component({
82
+ selector: 'app-dialog-sizes',
83
+ imports: [
84
+ SlButton,
85
+ SlDialog,
86
+ SlDialogBody,
87
+ SlDialogClose,
88
+ SlDialogHeader,
89
+ SlDialogTitle,
90
+ SlDialogTrigger,
91
+ SlInline,
92
+ SlText,
93
+ ],
94
+ template: `
95
+ <div slInline [gap]="2">
96
+ @for (option of sizes; track option.size) {
97
+ <button slButton tone="secondary" variant="outline" [slDialogTrigger]="dialog">
98
+ {{ option.size }}
99
+ </button>
100
+ <sl-dialog #dialog="slDialog" [size]="option.size">
101
+ <header slDialogHeader>
102
+ <h2 slDialogTitle>{{ option.title }}</h2>
103
+ <button slDialogClose></button>
104
+ </header>
105
+ <div slDialogBody>
106
+ <span slText size="sm">{{ option.body }}</span>
107
+ </div>
108
+ </sl-dialog>
109
+ }
110
+ </div>
111
+ `,
112
+ })
113
+ export class DialogSizes {
114
+ readonly sizes = SIZES;
115
+ }
116
+ ```
117
+
118
+ ### Where the panel sits in the layer
119
+
120
+ center is right for a panel whose height is settled; top is right for one that grows as the reader types, because a centred panel moves under the cursor every time a line is added.
121
+
122
+ Example
123
+
124
+ ```ts
125
+ import { Component, signal } from '@angular/core';
126
+ import { SlButton } from '@slotted/angular/button';
127
+ import {
128
+ SlDialog,
129
+ SlDialogBody,
130
+ SlDialogClose,
131
+ SlDialogDescription,
132
+ SlDialogFooter,
133
+ SlDialogHeader,
134
+ SlDialogTitle,
135
+ SlDialogTrigger,
136
+ } from '@slotted/angular/dialog';
137
+ import { SlField, SlFieldLabel } from '@slotted/angular/field';
138
+ import { SlTextarea } from '@slotted/angular/textarea';
139
+
140
+ @Component({
141
+ selector: 'app-dialog-placement',
142
+ imports: [
143
+ SlButton,
144
+ SlDialog,
145
+ SlDialogBody,
146
+ SlDialogClose,
147
+ SlDialogDescription,
148
+ SlDialogFooter,
149
+ SlDialogHeader,
150
+ SlDialogTitle,
151
+ SlDialogTrigger,
152
+ SlField,
153
+ SlFieldLabel,
154
+ SlTextarea,
155
+ ],
156
+ template: `
157
+ <button slButton tone="secondary" variant="outline" [slDialogTrigger]="dialog">
158
+ Add a note
159
+ </button>
160
+ <sl-dialog #dialog="slDialog" placement="top" [(open)]="open">
161
+ <header slDialogHeader>
162
+ <h2 slDialogTitle>Note on order SO-1182</h2>
163
+ <p slDialogDescription>The warehouse team sees the note on the pick list.</p>
164
+ <button slDialogClose></button>
165
+ </header>
166
+ <div slDialogBody>
167
+ <div slField>
168
+ <label slFieldLabel>Note</label>
169
+ <textarea
170
+ slTextarea
171
+ [rows]="3"
172
+ [maxRows]="12"
173
+ placeholder="Leave at the loading dock after 2 pm."
174
+ ></textarea>
175
+ </div>
176
+ </div>
177
+ <footer slDialogFooter>
178
+ <button slButton variant="ghost" tone="secondary" (click)="open.set(false)">Cancel</button>
179
+ <button slButton (click)="open.set(false)">Add note</button>
180
+ </footer>
181
+ </sl-dialog>
182
+ `,
183
+ })
184
+ export class DialogPlacement {
185
+ readonly open = signal(false);
186
+ }
187
+ ```
188
+
189
+ ### What scrolls when the content is long
190
+
191
+ content bounds the panel to the layer and scrolls the body, so the actions stay on screen; viewport scrolls the whole panel, for content that is read rather than acted on. Radix and React Aria ship neither, and a footer past the fold is the default of following their examples.
192
+
193
+ Example
194
+
195
+ ```ts
196
+ import { Component, signal } from '@angular/core';
197
+ import { SlButton } from '@slotted/angular/button';
198
+ import {
199
+ SlDialog,
200
+ SlDialogBody,
201
+ SlDialogClose,
202
+ SlDialogDescription,
203
+ SlDialogFooter,
204
+ SlDialogHeader,
205
+ SlDialogTitle,
206
+ SlDialogTrigger,
207
+ } from '@slotted/angular/dialog';
208
+ import { SlInline } from '@slotted/angular/inline';
209
+ import { SlStack } from '@slotted/angular/stack';
210
+ import { SlText } from '@slotted/angular/typography';
211
+
212
+ const ITEMS = Array.from({ length: 24 }, (_, index) => ({
213
+ sku: `NW-${String(4100 + index * 7)}`,
214
+ name: [
215
+ 'Chai, 10 boxes',
216
+ 'Aniseed syrup, 12 bottles',
217
+ 'Cajun seasoning, 48 jars',
218
+ 'Olive oil, 36 bottles',
219
+ 'Dried pears, 12 packs',
220
+ 'Curry sauce, 12 jars',
221
+ ][index % 6],
222
+ }));
223
+
224
+ const TERMS = [
225
+ 'Prices are in US dollars and exclude sales tax, which is added at the rate of the delivery address.',
226
+ 'Payment is due 30 days from the invoice date. Balances unpaid after 45 days accrue interest at 1% a month.',
227
+ 'Goods travel at the risk of Northwind Traders until they are signed for at the delivery address.',
228
+ 'Damaged goods are reported within 5 business days of delivery, with photos of the packaging and the label.',
229
+ 'Returns of undamaged goods are accepted within 30 days and are refunded less a 10% restocking fee.',
230
+ 'Orders above $5,000 may be split into several shipments, each invoiced when it leaves the warehouse.',
231
+ 'Either party may end a standing order with 14 days of written notice; shipments already picked are invoiced.',
232
+ 'These terms are governed by the law of the State of Washington.',
233
+ ];
234
+
235
+ @Component({
236
+ selector: 'app-dialog-scroll',
237
+ imports: [
238
+ SlButton,
239
+ SlDialog,
240
+ SlDialogBody,
241
+ SlDialogClose,
242
+ SlDialogDescription,
243
+ SlDialogFooter,
244
+ SlDialogHeader,
245
+ SlDialogTitle,
246
+ SlDialogTrigger,
247
+ SlInline,
248
+ SlStack,
249
+ SlText,
250
+ ],
251
+ template: `
252
+ <div slInline [gap]="2">
253
+ <button slButton tone="secondary" variant="outline" [slDialogTrigger]="items">
254
+ Review 24 line items
255
+ </button>
256
+ <sl-dialog #items="slDialog" [(open)]="open">
257
+ <header slDialogHeader>
258
+ <h2 slDialogTitle>Purchase order PO-7730</h2>
259
+ <p slDialogDescription>Only the list scrolls; the actions stay in view.</p>
260
+ <button slDialogClose></button>
261
+ </header>
262
+ <div slDialogBody>
263
+ <div slStack [gap]="2">
264
+ @for (item of lineItems; track item.sku) {
265
+ <div slInline [gap]="3" justify="between">
266
+ <span slText size="sm">{{ item.name }}</span>
267
+ <span slText size="sm" tone="muted">{{ item.sku }}</span>
268
+ </div>
269
+ }
270
+ </div>
271
+ </div>
272
+ <footer slDialogFooter>
273
+ <button slButton variant="ghost" tone="secondary" (click)="open.set(false)">
274
+ Cancel
275
+ </button>
276
+ <button slButton (click)="open.set(false)">Approve order</button>
277
+ </footer>
278
+ </sl-dialog>
279
+ <button slButton tone="secondary" variant="outline" [slDialogTrigger]="terms">
280
+ Read the terms of sale
281
+ </button>
282
+ <sl-dialog #terms="slDialog" scroll="viewport">
283
+ <header slDialogHeader>
284
+ <h2 slDialogTitle>Terms of sale</h2>
285
+ <button slDialogClose></button>
286
+ </header>
287
+ <div slDialogBody>
288
+ <div slStack [gap]="4">
289
+ @for (term of termsOfSale; track term) {
290
+ <span slText>{{ term }}</span>
291
+ }
292
+ </div>
293
+ </div>
294
+ </sl-dialog>
295
+ </div>
296
+ `,
297
+ })
298
+ export class DialogScroll {
299
+ readonly open = signal(false);
300
+ readonly lineItems = ITEMS;
301
+ readonly termsOfSale = TERMS;
302
+ }
303
+ ```
304
+
305
+ ### The layer, around a box you painted
306
+
307
+ surface="plain" turns the family’s own paint off — no ground, no border, no radius, no shadow, no rows — and keeps the portal, the scrim, the containment and the dismissal policy. It is what a headless library ships by default, offered here as an axis rather than as the only shape.
308
+
309
+ Excerpt — not a complete module
310
+
311
+ ```html
312
+ <sl-dialog surface="plain" [(open)]="open">
313
+ <div slCard fill="elevated">
314
+ <h2 slDialogTitle>A card, inside the layer</h2>
315
+ <p slDialogDescription>The family paints nothing here.</p>
316
+ </div>
317
+ </sl-dialog>
318
+ ```
319
+
320
+ ### Taking the whole layer on a narrow one
321
+
322
+ A container query at a literal breakpoint, not a viewport query: the layer answers its own inline size, so a dialog inside a named portal container is as narrow as that container rather than as the window.
323
+
324
+ Excerpt — not a complete module
325
+
326
+ ```html
327
+ <sl-dialog fullScreen="always" [(open)]="open">…</sl-dialog>
328
+ ```
329
+
330
+ ### A layer the page behind can still be used
331
+
332
+ modal={false} writes no aria-modal, makes nothing inert, locks no scroll and contains no focus. The APG warns that marking a dialog modal without doing all four has severe consequences for the readers who rely on the mark.
333
+
334
+ Excerpt — not a complete module
335
+
336
+ ```html
337
+ <sl-dialog [modal]="false" [(open)]="open">…</sl-dialog>
338
+ ```
339
+
340
+ ### Refusing a close, and refusing it once
341
+
342
+ Six ways to close and one request. A guard on onOpenChange covers Escape, an outside press, the close button and the imperative handle together; Radix reports the same policy through four callbacks.
343
+
344
+ Excerpt — not a complete module
345
+
346
+ ```html
347
+ <sl-dialog [(open)]="open" (openChangeRequest)="refuseWhileSaving($event)">…</sl-dialog>
348
+ ```
349
+
350
+ ### Where focus goes, and where it comes back to
351
+
352
+ By default the first tabbable element, and the trigger again on close. initialFocus names another element — a search input, or the panel itself for content that has to be read before it is operated, which is the APG’s own note.
353
+
354
+ Excerpt — not a complete module
355
+
356
+ ```html
357
+ <sl-dialog [initialFocus]="email" [(open)]="open">
358
+ <div slDialogBody>
359
+ <input #email slTextField aria-label="Email" />
360
+ </div>
361
+ </sl-dialog>
362
+ ```
363
+
364
+ ### Open before the content arrived
365
+
366
+ The body carries aria-busy and keeps a floor so the panel does not jump to size when the data lands. The header, the close button and Escape all stay operable: a loading dialog a reader cannot leave is the worse failure of the two.
367
+
368
+ Example
369
+
370
+ ```ts
371
+ import { Component, effect, signal } from '@angular/core';
372
+ import { SlButton } from '@slotted/angular/button';
373
+ import {
374
+ SlDescriptionList,
375
+ SlDescriptionListDescription,
376
+ SlDescriptionListItem,
377
+ SlDescriptionListTerm,
378
+ } from '@slotted/angular/description-list';
379
+ import {
380
+ SlDialog,
381
+ SlDialogBody,
382
+ SlDialogClose,
383
+ SlDialogHeader,
384
+ SlDialogTitle,
385
+ SlDialogTrigger,
386
+ } from '@slotted/angular/dialog';
387
+ import { SlSkeleton, SlSkeletonRegion } from '@slotted/angular/skeleton';
388
+
389
+ interface Invoice {
390
+ customer: string;
391
+ issued: string;
392
+ due: string;
393
+ amount: string;
394
+ }
395
+
396
+ const FIELDS: { key: keyof Invoice; term: string; width: string }[] = [
397
+ { key: 'customer', term: 'Customer', width: '9rem' },
398
+ { key: 'issued', term: 'Issued', width: '6rem' },
399
+ { key: 'due', term: 'Due', width: '6rem' },
400
+ { key: 'amount', term: 'Amount', width: '5rem' },
401
+ ];
402
+
403
+ @Component({
404
+ selector: 'app-dialog-loading',
405
+ imports: [
406
+ SlButton,
407
+ SlDescriptionList,
408
+ SlDescriptionListDescription,
409
+ SlDescriptionListItem,
410
+ SlDescriptionListTerm,
411
+ SlDialog,
412
+ SlDialogBody,
413
+ SlDialogClose,
414
+ SlDialogHeader,
415
+ SlDialogTitle,
416
+ SlDialogTrigger,
417
+ SlSkeleton,
418
+ SlSkeletonRegion,
419
+ ],
420
+ template: `
421
+ <button slButton tone="secondary" variant="outline" [slDialogTrigger]="dialog">
422
+ View invoice INV-2041
423
+ </button>
424
+ <sl-dialog #dialog="slDialog" [loading]="invoice() === null" [(open)]="open">
425
+ <header slDialogHeader>
426
+ <h2 slDialogTitle>Invoice INV-2041</h2>
427
+ <button slDialogClose></button>
428
+ </header>
429
+ <div slDialogBody>
430
+ <div
431
+ slSkeletonRegion
432
+ [delay]="200"
433
+ [loading]="invoice() === null"
434
+ [messages]="{ label: 'Loading invoice' }"
435
+ >
436
+ <div slDescriptionList>
437
+ @for (field of fields; track field.key) {
438
+ <div slDescriptionListItem>
439
+ <dt slDescriptionListTerm>{{ field.term }}</dt>
440
+ <dd slDescriptionListDescription>
441
+ @if (invoice(); as loaded) {
442
+ {{ loaded[field.key] }}
443
+ } @else {
444
+ <span slSkeleton [inlineSize]="field.width"></span>
445
+ }
446
+ </dd>
447
+ </div>
448
+ }
449
+ </div>
450
+ </div>
451
+ </div>
452
+ </sl-dialog>
453
+ `,
454
+ })
455
+ export class DialogLoading {
456
+ readonly fields = FIELDS;
457
+ readonly open = signal(false);
458
+ readonly invoice = signal<Invoice | null>(null);
459
+
460
+ constructor() {
461
+ effect((onCleanup) => {
462
+ if (!this.open()) return;
463
+ this.invoice.set(null);
464
+ const timer = setTimeout(
465
+ () =>
466
+ this.invoice.set({
467
+ customer: 'Northwind Traders',
468
+ issued: '12 August 2026',
469
+ due: '11 September 2026',
470
+ amount: '$1,240.00',
471
+ }),
472
+ 1200,
473
+ );
474
+ onCleanup(() => clearTimeout(timer));
475
+ });
476
+ }
477
+ }
478
+ ```
479
+
480
+ ### A layer opened from a layer
481
+
482
+ Escape reaches the topmost one only, and a layer that refuses stops the request reaching the one beneath it. The depth comes from the single stack dismissable-layer keeps, so nothing here states a z-index.
483
+
484
+ Example
485
+
486
+ ```ts
487
+ import { Component, computed, signal } from '@angular/core';
488
+ import { SlButton } from '@slotted/angular/button';
489
+ import {
490
+ SlDescriptionList,
491
+ SlDescriptionListDescription,
492
+ SlDescriptionListItem,
493
+ SlDescriptionListTerm,
494
+ } from '@slotted/angular/description-list';
495
+ import {
496
+ SlDialog,
497
+ SlDialogBody,
498
+ SlDialogClose,
499
+ SlDialogFooter,
500
+ SlDialogHeader,
501
+ SlDialogTitle,
502
+ SlDialogTrigger,
503
+ } from '@slotted/angular/dialog';
504
+ import { SlField, SlFieldLabel } from '@slotted/angular/field';
505
+ import { SlSelect, SlSelectItem, type SelectSelection } from '@slotted/angular/select';
506
+
507
+ const CARRIERS = [
508
+ { value: 'ups', label: 'UPS Ground' },
509
+ { value: 'fedex', label: 'FedEx Ground' },
510
+ { value: 'usps', label: 'USPS Priority Mail' },
511
+ ];
512
+
513
+ @Component({
514
+ selector: 'app-dialog-nested',
515
+ imports: [
516
+ SlButton,
517
+ SlDescriptionList,
518
+ SlDescriptionListDescription,
519
+ SlDescriptionListItem,
520
+ SlDescriptionListTerm,
521
+ SlDialog,
522
+ SlDialogBody,
523
+ SlDialogClose,
524
+ SlDialogFooter,
525
+ SlDialogHeader,
526
+ SlDialogTitle,
527
+ SlDialogTrigger,
528
+ SlField,
529
+ SlFieldLabel,
530
+ SlSelect,
531
+ SlSelectItem,
532
+ ],
533
+ template: `
534
+ <button slButton tone="secondary" variant="outline" [slDialogTrigger]="order">
535
+ Open order SO-1182
536
+ </button>
537
+ <sl-dialog #order="slDialog">
538
+ <header slDialogHeader>
539
+ <h2 slDialogTitle>Order SO-1182</h2>
540
+ <button slDialogClose></button>
541
+ </header>
542
+ <div slDialogBody>
543
+ <div slDescriptionList>
544
+ <div slDescriptionListItem>
545
+ <dt slDescriptionListTerm>Customer</dt>
546
+ <dd slDescriptionListDescription>Contoso Foods</dd>
547
+ </div>
548
+ <div slDescriptionListItem>
549
+ <dt slDescriptionListTerm>Carrier</dt>
550
+ <dd slDescriptionListDescription>{{ carrierLabel() }}</dd>
551
+ </div>
552
+ </div>
553
+ </div>
554
+ <footer slDialogFooter>
555
+ <button slButton tone="secondary" variant="outline" [slDialogTrigger]="change">
556
+ Change carrier
557
+ </button>
558
+ <sl-dialog #change="slDialog" size="sm" [open]="changing()" (openChange)="toggle($event)">
559
+ <header slDialogHeader>
560
+ <h2 slDialogTitle>Change carrier</h2>
561
+ <button slDialogClose></button>
562
+ </header>
563
+ <div slDialogBody>
564
+ <div slField>
565
+ <label slFieldLabel>Carrier</label>
566
+ <sl-select [items]="carriers" [(value)]="draft">
567
+ @for (option of carriers; track option.value) {
568
+ <sl-select-item [value]="option.value">{{ option.label }}</sl-select-item>
569
+ }
570
+ </sl-select>
571
+ </div>
572
+ </div>
573
+ <footer slDialogFooter>
574
+ <button slButton variant="ghost" tone="secondary" (click)="changing.set(false)">
575
+ Cancel
576
+ </button>
577
+ <button slButton (click)="use()">Use carrier</button>
578
+ </footer>
579
+ </sl-dialog>
580
+ </footer>
581
+ </sl-dialog>
582
+ `,
583
+ })
584
+ export class DialogNested {
585
+ readonly carriers = CARRIERS;
586
+ readonly carrier = signal<SelectSelection>('ups');
587
+ readonly draft = signal<SelectSelection>('ups');
588
+ readonly changing = signal(false);
589
+ readonly carrierLabel = computed(
590
+ () => CARRIERS.find((option) => option.value === this.carrier())?.label,
591
+ );
592
+
593
+ toggle(next: boolean): void {
594
+ if (next) this.draft.set(this.carrier());
595
+ this.changing.set(next);
596
+ }
597
+
598
+ use(): void {
599
+ this.carrier.set(this.draft());
600
+ this.changing.set(false);
601
+ }
602
+ }
603
+ ```
604
+
605
+ ### Content the family did not choose
606
+
607
+ A ninety-character unbroken token in the title would widen a centred panel past both edges of the layer at once; overflow-wrap and a zero minimum are the pair that answer it. Long German and right-to-left strings are in the same scene.
608
+
609
+ Excerpt — not a complete module
610
+
611
+ ```html
612
+ <h2 slDialogTitle>deployment-pipeline-eu-west-1-production-rollback-2026-09-04T01</h2>
613
+ ```
614
+
615
+ ### Replacing a part, and reaching the instance
616
+
617
+ render substitutes the element of every part, which is how the trigger becomes a Button. The ref on Dialog is a handle with open, close and focus — the three actions a consumer cannot express declaratively.
618
+
619
+ Excerpt — not a complete module
620
+
621
+ ```html
622
+ <button slButton variant="outline" [slDialogTrigger]="d">Edit project</button>
623
+ ```
624
+
625
+ ### Deciding once for the application
626
+
627
+ Eight decisions an application takes once instead of eight props on every dialog in a product. Angular Material is the only surveyed library with an equivalent, and a dialog that states one itself still wins.
628
+
629
+ Example
630
+
631
+ ```ts
632
+ import { Component } from '@angular/core';
633
+ import { SlButton } from '@slotted/angular/button';
634
+ import {
635
+ provideDialogDefaults,
636
+ SlDialog,
637
+ SlDialogBody,
638
+ SlDialogClose,
639
+ SlDialogHeader,
640
+ SlDialogTitle,
641
+ SlDialogTrigger,
642
+ } from '@slotted/angular/dialog';
643
+ import { SlInline } from '@slotted/angular/inline';
644
+ import { SlText } from '@slotted/angular/typography';
645
+
646
+ @Component({
647
+ selector: 'app-dialog-defaults',
648
+ imports: [
649
+ SlButton,
650
+ SlDialog,
651
+ SlDialogBody,
652
+ SlDialogClose,
653
+ SlDialogHeader,
654
+ SlDialogTitle,
655
+ SlDialogTrigger,
656
+ SlInline,
657
+ SlText,
658
+ ],
659
+ providers: [provideDialogDefaults({ placement: 'top', size: 'lg' })],
660
+ template: `
661
+ <div slInline [gap]="2">
662
+ <button slButton tone="secondary" variant="outline" [slDialogTrigger]="order">
663
+ Purchase order PO-7730
664
+ </button>
665
+ <sl-dialog #order="slDialog">
666
+ <header slDialogHeader>
667
+ <h2 slDialogTitle>Purchase order PO-7730</h2>
668
+ <button slDialogClose></button>
669
+ </header>
670
+ <div slDialogBody>
671
+ <span slText size="sm">Large and at the top, from the provider.</span>
672
+ </div>
673
+ </sl-dialog>
674
+ <button slButton tone="secondary" variant="outline" [slDialogTrigger]="rename">
675
+ Rename supplier
676
+ </button>
677
+ <sl-dialog #rename="slDialog" size="sm">
678
+ <header slDialogHeader>
679
+ <h2 slDialogTitle>Rename supplier</h2>
680
+ <button slDialogClose></button>
681
+ </header>
682
+ <div slDialogBody>
683
+ <span slText size="sm">At the top from the provider, and small because it says so.</span>
684
+ </div>
685
+ </sl-dialog>
686
+ </div>
687
+ `,
688
+ })
689
+ export class DialogDefaults {}
690
+ ```
691
+
692
+ ### The pattern’s table, and what it costs
693
+
694
+ Tab and Shift+Tab wrap inside the layer, Escape closes the topmost one, and the background is inert to the pointer and to the accessibility tree at once. All three are JavaScript here, because the platform’s dialog element is declined.
695
+
696
+ Excerpt — not a complete module
697
+
698
+ ```html
699
+ <sl-dialog [(open)]="open" (openChangeRequest)="report($event.reason, $event.result)">
700
+ …
701
+ </sl-dialog>
702
+ ```
703
+
704
+ ### Playground
705
+
706
+ A confirmation opened inside the scene. Focus lands on the least destructive action, an outside press does nothing at all, and Escape answers because a member with a cancel action can always cancel.
707
+
708
+ Excerpt — not a complete module
709
+
710
+ ```html
711
+ <button slButton tone="danger" variant="outline" [slDialogTrigger]="d">Delete project</button>
712
+ <sl-alert-dialog #d="slAlertDialog" [(open)]="open">
713
+ <header slDialogHeader>
714
+ <span slAlertDialogIcon></span>
715
+ <h2 slDialogTitle>Delete this project?</h2>
716
+ <p slDialogDescription>
717
+ The project and its 42 documents leave for everyone. This cannot be undone.
718
+ </p>
719
+ </header>
720
+ <footer slDialogFooter>
721
+ <button slButton variant="outline" tone="secondary" slAlertDialogCancel>Keep project</button>
722
+ <button slButton tone="danger" slAlertDialogAction>Delete project</button>
723
+ </footer>
724
+ </sl-alert-dialog>
725
+ ```
726
+
727
+ ### What kind of decision this is
728
+
729
+ Each tone carries its own mark, so the register survives a reader who cannot tell the colours apart and forced colours, where every tone ground becomes one system colour and the silhouette is all that is left.
730
+
731
+ Excerpt — not a complete module
732
+
733
+ ```html
734
+ <sl-alert-dialog tone="warning" [(open)]="open">…</sl-alert-dialog>
735
+ ```
736
+
737
+ ### Two controls, each saying what it does
738
+
739
+ Labels name the action rather than answering a question — “Excluir projeto”, not “Sim”. The action closes with submit and the cancel with dismiss, so a consumer reading the reason knows which one the reader chose.
740
+
741
+ Excerpt — not a complete module
742
+
743
+ ```html
744
+ <footer slDialogFooter>
745
+ <button slButton slAlertDialogCancel>Keep project</button>
746
+ <button slButton slAlertDialogAction value="deleted">Delete project</button>
747
+ </footer>
748
+ ```
749
+
750
+ ### What can and cannot dismiss it
751
+
752
+ An outside press never closes an alert dialog, whatever the consumer asks for. Ark and React Aria make the role a prop, so setting role="alertdialog" and forgetting the policy ships a destructive confirmation a stray click dismisses.
753
+
754
+ Excerpt — not a complete module
755
+
756
+ ```html
757
+ <sl-alert-dialog escape="none" [(open)]="open">…</sl-alert-dialog>
758
+ ```
759
+
760
+ ### The safest thing under the reader’s hands
761
+
762
+ Focus lands on the cancel action rather than on the first tabbable element, which is what the APG advises for a step that is not easily reversible. It is a default of the member, not something a consumer remembers to set.
763
+
764
+ Excerpt — not a complete module
765
+
766
+ ```html
767
+ <sl-alert-dialog initialFocus="cancel" [(open)]="open">…</sl-alert-dialog>
768
+ ```
769
+
770
+ ### A confirmation that has more to say
771
+
772
+ A body between the header and the actions holds the list of what is about to go. The description stays the one sentence aria-describedby announces, so the reader hears the consequence before the detail.
773
+
774
+ Excerpt — not a complete module
775
+
776
+ ```html
777
+ <header slDialogHeader>
778
+ <span slAlertDialogIcon></span>
779
+ <h2 slDialogTitle>Delete 3 documents?</h2>
780
+ <p slDialogDescription>This cannot be undone.</p>
781
+ </header>
782
+ ```
783
+
784
+ ### The actions are the consumer’s own buttons
785
+
786
+ render hands each control every attribute the family wrote, so the danger button is the library’s Button with the family’s behaviour on it — nothing is reimplemented and nothing is wrapped.
787
+
788
+ Excerpt — not a complete module
789
+
790
+ ```html
791
+ <button slButton tone="danger" slAlertDialogAction>Delete project</button>
792
+ ```
793
+
794
+ ### What the role changes, and what it does not
795
+
796
+ role="alertdialog" and a mandatory aria-describedby are the two things the pattern adds; the keyboard is the modal dialog’s. The trigger still says aria-haspopup="dialog", because the property has no alertdialog token.
797
+
798
+ Excerpt — not a complete module
799
+
800
+ ```html
801
+ <p slDialogDescription>The project and its 42 documents leave for everyone.</p>
802
+ ```
803
+
804
+ ### alert-tones.ts
805
+
806
+ Example
807
+
808
+ ```ts
809
+ import { Component } from '@angular/core';
810
+ import { SlButton } from '@slotted/angular/button';
811
+ import {
812
+ SlAlertDialog,
813
+ SlAlertDialogAction,
814
+ SlAlertDialogCancel,
815
+ SlAlertDialogIcon,
816
+ SlDialogDescription,
817
+ SlDialogFooter,
818
+ SlDialogHeader,
819
+ SlDialogTitle,
820
+ SlDialogTrigger,
821
+ type DialogTone,
822
+ } from '@slotted/angular/dialog';
823
+ import { SlInline } from '@slotted/angular/inline';
824
+
825
+ const CONFIRMATIONS: {
826
+ tone: DialogTone;
827
+ trigger: string;
828
+ title: string;
829
+ description: string;
830
+ action: string;
831
+ }[] = [
832
+ {
833
+ tone: 'accent',
834
+ trigger: 'Send invoices',
835
+ title: 'Send 214 invoices?',
836
+ description: 'Each customer receives the September invoice by email within the hour.',
837
+ action: 'Send invoices',
838
+ },
839
+ {
840
+ tone: 'warning',
841
+ trigger: 'Publish prices',
842
+ title: 'Publish the new prices?',
843
+ description: 'Open quotes keep their prices; new orders use the new ones from now on.',
844
+ action: 'Publish prices',
845
+ },
846
+ {
847
+ tone: 'success',
848
+ trigger: 'Close September',
849
+ title: 'Close the books for September?',
850
+ description: 'All 1,180 entries reconcile. Entries dated September can no longer be edited.',
851
+ action: 'Close September',
852
+ },
853
+ ];
854
+
855
+ @Component({
856
+ selector: 'app-dialog-alert-tones',
857
+ imports: [
858
+ SlAlertDialog,
859
+ SlAlertDialogAction,
860
+ SlAlertDialogCancel,
861
+ SlAlertDialogIcon,
862
+ SlButton,
863
+ SlDialogDescription,
864
+ SlDialogFooter,
865
+ SlDialogHeader,
866
+ SlDialogTitle,
867
+ SlDialogTrigger,
868
+ SlInline,
869
+ ],
870
+ template: `
871
+ <div slInline [gap]="2">
872
+ @for (confirmation of confirmations; track confirmation.tone) {
873
+ <button slButton tone="secondary" variant="outline" [slDialogTrigger]="dialog">
874
+ {{ confirmation.trigger }}
875
+ </button>
876
+ <sl-alert-dialog #dialog="slAlertDialog" [tone]="confirmation.tone">
877
+ <header slDialogHeader>
878
+ <span slAlertDialogIcon></span>
879
+ <h2 slDialogTitle>{{ confirmation.title }}</h2>
880
+ <p slDialogDescription>{{ confirmation.description }}</p>
881
+ </header>
882
+ <footer slDialogFooter>
883
+ <button slButton slAlertDialogCancel tone="secondary" variant="outline">Not now</button>
884
+ <button slButton slAlertDialogAction [tone]="confirmation.tone">
885
+ {{ confirmation.action }}
886
+ </button>
887
+ </footer>
888
+ </sl-alert-dialog>
889
+ }
890
+ </div>
891
+ `,
892
+ })
893
+ export class DialogAlertTones {
894
+ readonly confirmations = CONFIRMATIONS;
895
+ }
896
+ ```
897
+
898
+ ### async-submit.ts
899
+
900
+ Example
901
+
902
+ ```ts
903
+ import { Component, signal } from '@angular/core';
904
+ import { SlButton } from '@slotted/angular/button';
905
+ import {
906
+ SlDialog,
907
+ SlDialogBody,
908
+ SlDialogClose,
909
+ SlDialogDescription,
910
+ SlDialogFooter,
911
+ SlDialogHeader,
912
+ SlDialogTitle,
913
+ SlDialogTrigger,
914
+ type DialogChangeRequest,
915
+ } from '@slotted/angular/dialog';
916
+ import { SlInline } from '@slotted/angular/inline';
917
+ import { SlText } from '@slotted/angular/typography';
918
+
919
+ @Component({
920
+ selector: 'app-dialog-async-submit',
921
+ imports: [
922
+ SlButton,
923
+ SlDialog,
924
+ SlDialogBody,
925
+ SlDialogClose,
926
+ SlDialogDescription,
927
+ SlDialogFooter,
928
+ SlDialogHeader,
929
+ SlDialogTitle,
930
+ SlDialogTrigger,
931
+ SlInline,
932
+ SlText,
933
+ ],
934
+ template: `
935
+ <div slInline align="center" [gap]="3">
936
+ <button slButton tone="secondary" variant="outline" [slDialogTrigger]="dialog">
937
+ Refund order SO-1182
938
+ </button>
939
+ <sl-dialog #dialog="slDialog" [(open)]="open" (openChangeRequest)="guard($event)">
940
+ <header slDialogHeader>
941
+ <h2 slDialogTitle>Refund $1,240.00</h2>
942
+ <p slDialogDescription>To the card ending 4242, for order SO-1182.</p>
943
+ <button slDialogClose></button>
944
+ </header>
945
+ <div slDialogBody>
946
+ <span slText size="sm">
947
+ The payment provider takes a moment to confirm. The dialog stays open until it does.
948
+ </span>
949
+ </div>
950
+ <footer slDialogFooter>
951
+ <button
952
+ slButton
953
+ variant="ghost"
954
+ tone="secondary"
955
+ [disabled]="saving()"
956
+ (click)="open.set(false)"
957
+ >
958
+ Cancel
959
+ </button>
960
+ <button
961
+ slButton
962
+ [loading]="saving()"
963
+ [messages]="{ loading: 'Issuing refund' }"
964
+ (click)="refund()"
965
+ >
966
+ Issue refund
967
+ </button>
968
+ </footer>
969
+ </sl-dialog>
970
+ @if (sent()) {
971
+ <span slText role="status" size="sm" tone="muted">Refund issued.</span>
972
+ }
973
+ </div>
974
+ `,
975
+ })
976
+ export class DialogAsyncSubmit {
977
+ readonly open = signal(false);
978
+ readonly saving = signal(false);
979
+ readonly sent = signal(false);
980
+
981
+ guard(request: DialogChangeRequest): void {
982
+ if (!request.value && this.saving()) request.cancel();
983
+ if (request.value) this.sent.set(false);
984
+ }
985
+
986
+ refund(): void {
987
+ this.saving.set(true);
988
+ setTimeout(() => {
989
+ this.saving.set(false);
990
+ this.sent.set(true);
991
+ this.open.set(false);
992
+ }, 1500);
993
+ }
994
+ }
995
+ ```
996
+
997
+ ### bulk-edit.ts
998
+
999
+ Example
1000
+
1001
+ ```ts
1002
+ import { Component, computed, signal } from '@angular/core';
1003
+ import { SlBadge } from '@slotted/angular/badge';
1004
+ import { SlButton } from '@slotted/angular/button';
1005
+ import {
1006
+ SlDialog,
1007
+ SlDialogBody,
1008
+ SlDialogClose,
1009
+ SlDialogDescription,
1010
+ SlDialogFooter,
1011
+ SlDialogHeader,
1012
+ SlDialogTitle,
1013
+ SlDialogTrigger,
1014
+ } from '@slotted/angular/dialog';
1015
+ import { SlField, SlFieldLabel } from '@slotted/angular/field';
1016
+ import { SlInline } from '@slotted/angular/inline';
1017
+ import { SlSelect, SlSelectItem, type SelectSelection } from '@slotted/angular/select';
1018
+ import { SlStack } from '@slotted/angular/stack';
1019
+ import {
1020
+ SlTable,
1021
+ SlTableBody,
1022
+ SlTableCell,
1023
+ SlTableColumnHeader,
1024
+ SlTableContent,
1025
+ SlTableHead,
1026
+ SlTableRow,
1027
+ SlTableRowHeader,
1028
+ SlTableSelect,
1029
+ SlTableSelectAll,
1030
+ } from '@slotted/angular/table';
1031
+ import { SlText } from '@slotted/angular/typography';
1032
+
1033
+ const STATUSES = [
1034
+ { value: 'processing', label: 'Processing', tone: 'accent' },
1035
+ { value: 'hold', label: 'On hold', tone: 'warning' },
1036
+ { value: 'ready', label: 'Ready to ship', tone: 'success' },
1037
+ ] as const;
1038
+
1039
+ const WAREHOUSES = [
1040
+ { value: 'RNO', label: 'Reno, NV' },
1041
+ { value: 'CMH', label: 'Columbus, OH' },
1042
+ { value: 'SAV', label: 'Savannah, GA' },
1043
+ ];
1044
+
1045
+ type Status = (typeof STATUSES)[number]['value'];
1046
+
1047
+ const INITIAL: { id: string; customer: string; status: Status; warehouse: string }[] = [
1048
+ { id: 'SO-1182', customer: 'Contoso Foods', status: 'processing', warehouse: 'RNO' },
1049
+ { id: 'SO-1183', customer: 'Fabrikam Grocers', status: 'processing', warehouse: 'CMH' },
1050
+ { id: 'SO-1184', customer: 'Tailspin Market', status: 'hold', warehouse: 'RNO' },
1051
+ { id: 'SO-1185', customer: 'Woodgrove Deli', status: 'processing', warehouse: 'SAV' },
1052
+ ];
1053
+
1054
+ @Component({
1055
+ selector: 'app-dialog-bulk-edit',
1056
+ imports: [
1057
+ SlBadge,
1058
+ SlButton,
1059
+ SlDialog,
1060
+ SlDialogBody,
1061
+ SlDialogClose,
1062
+ SlDialogDescription,
1063
+ SlDialogFooter,
1064
+ SlDialogHeader,
1065
+ SlDialogTitle,
1066
+ SlDialogTrigger,
1067
+ SlField,
1068
+ SlFieldLabel,
1069
+ SlInline,
1070
+ SlSelect,
1071
+ SlSelectItem,
1072
+ SlStack,
1073
+ SlTable,
1074
+ SlTableBody,
1075
+ SlTableCell,
1076
+ SlTableColumnHeader,
1077
+ SlTableContent,
1078
+ SlTableHead,
1079
+ SlTableRow,
1080
+ SlTableRowHeader,
1081
+ SlTableSelect,
1082
+ SlTableSelectAll,
1083
+ SlText,
1084
+ ],
1085
+ template: `
1086
+ <div slStack [gap]="3">
1087
+ <div slInline align="center" [gap]="3">
1088
+ <span slText size="sm" tone="muted">
1089
+ {{ count() === 0 ? 'Select orders to edit them together.' : count() + ' selected' }}
1090
+ </span>
1091
+ <button
1092
+ slButton
1093
+ focusableWhenDisabled
1094
+ size="sm"
1095
+ tone="secondary"
1096
+ variant="outline"
1097
+ [disabled]="count() === 0"
1098
+ [slDialogTrigger]="dialog"
1099
+ >
1100
+ Edit selected
1101
+ </button>
1102
+ <sl-dialog #dialog="slDialog" [open]="open()" (openChange)="toggle($event)">
1103
+ <header slDialogHeader>
1104
+ <h2 slDialogTitle>Edit {{ editing().length }} {{ noun() }}</h2>
1105
+ <p slDialogDescription>{{ editing().join(', ') }}</p>
1106
+ <button slDialogClose></button>
1107
+ </header>
1108
+ <div slDialogBody>
1109
+ <div slStack [gap]="4">
1110
+ <div slField>
1111
+ <label slFieldLabel>Status</label>
1112
+ <sl-select [items]="statuses" [(value)]="status">
1113
+ @for (option of statuses; track option.value) {
1114
+ <sl-select-item [value]="option.value">{{ option.label }}</sl-select-item>
1115
+ }
1116
+ </sl-select>
1117
+ </div>
1118
+ <div slField>
1119
+ <label slFieldLabel>Ships from</label>
1120
+ <sl-select [items]="warehouses" [(value)]="warehouse">
1121
+ @for (option of warehouses; track option.value) {
1122
+ <sl-select-item [value]="option.value">{{ option.label }}</sl-select-item>
1123
+ }
1124
+ </sl-select>
1125
+ </div>
1126
+ </div>
1127
+ </div>
1128
+ <footer slDialogFooter>
1129
+ <button slButton variant="ghost" tone="secondary" (click)="open.set(false)">
1130
+ Cancel
1131
+ </button>
1132
+ <button slButton (click)="apply()">Update {{ editing().length }} {{ noun() }}</button>
1133
+ </footer>
1134
+ </sl-dialog>
1135
+ </div>
1136
+ <div slTable selectionMode="multiple" [columns]="5" [(value)]="chosen">
1137
+ <div slTableContent>
1138
+ <thead slTableHead>
1139
+ <tr slTableRow>
1140
+ <th slTableSelectAll></th>
1141
+ <th slTableColumnHeader>Order</th>
1142
+ <th slTableColumnHeader>Customer</th>
1143
+ <th slTableColumnHeader>Status</th>
1144
+ <th slTableColumnHeader>Ships from</th>
1145
+ </tr>
1146
+ </thead>
1147
+ <tbody slTableBody>
1148
+ @for (row of orders(); track row.id) {
1149
+ <tr slTableRow [value]="row.id">
1150
+ <td slTableSelect></td>
1151
+ <th slTableRowHeader>{{ row.id }}</th>
1152
+ <td slTableCell>{{ row.customer }}</td>
1153
+ <td slTableCell>
1154
+ <span slBadge [tone]="statusOf(row.status).tone">
1155
+ {{ statusOf(row.status).label }}
1156
+ </span>
1157
+ </td>
1158
+ <td slTableCell>{{ warehouseOf(row.warehouse) }}</td>
1159
+ </tr>
1160
+ }
1161
+ </tbody>
1162
+ </div>
1163
+ </div>
1164
+ </div>
1165
+ `,
1166
+ })
1167
+ export class DialogBulkEdit {
1168
+ readonly statuses = STATUSES;
1169
+ readonly warehouses = WAREHOUSES;
1170
+ readonly orders = signal(INITIAL);
1171
+ readonly chosen = signal<readonly string[]>([]);
1172
+ readonly editing = signal<readonly string[]>([]);
1173
+ readonly open = signal(false);
1174
+ readonly status = signal<SelectSelection>('ready');
1175
+ readonly warehouse = signal<SelectSelection>('RNO');
1176
+ readonly count = computed(() => this.chosen().length);
1177
+ readonly noun = computed(() => (this.editing().length === 1 ? 'order' : 'orders'));
1178
+
1179
+ statusOf(value: Status) {
1180
+ return STATUSES.find((status) => status.value === value)!;
1181
+ }
1182
+
1183
+ warehouseOf(value: string) {
1184
+ return WAREHOUSES.find((option) => option.value === value)?.label;
1185
+ }
1186
+
1187
+ toggle(next: boolean): void {
1188
+ if (next) this.editing.set(this.chosen());
1189
+ this.open.set(next);
1190
+ }
1191
+
1192
+ apply(): void {
1193
+ const editing = this.editing();
1194
+ const status = this.status() as Status;
1195
+ const warehouse = this.warehouse() as string;
1196
+ this.orders.update((rows) =>
1197
+ rows.map((row) => (editing.includes(row.id) ? { ...row, status, warehouse } : row)),
1198
+ );
1199
+ this.chosen.set([]);
1200
+ this.open.set(false);
1201
+ }
1202
+ }
1203
+ ```
1204
+
1205
+ ### cancel-order.ts
1206
+
1207
+ Example
1208
+
1209
+ ```ts
1210
+ import { Component, signal } from '@angular/core';
1211
+ import { SlBadge } from '@slotted/angular/badge';
1212
+ import { SlButton } from '@slotted/angular/button';
1213
+ import {
1214
+ SlAlertDialog,
1215
+ SlAlertDialogAction,
1216
+ SlAlertDialogCancel,
1217
+ SlAlertDialogIcon,
1218
+ SlDialogBody,
1219
+ SlDialogDescription,
1220
+ SlDialogFooter,
1221
+ SlDialogHeader,
1222
+ SlDialogTitle,
1223
+ SlDialogTrigger,
1224
+ } from '@slotted/angular/dialog';
1225
+ import { SlField, SlFieldLabel } from '@slotted/angular/field';
1226
+ import { SlInline } from '@slotted/angular/inline';
1227
+ import { SlSelect, SlSelectItem, type SelectSelection } from '@slotted/angular/select';
1228
+ import { SlText } from '@slotted/angular/typography';
1229
+
1230
+ const REASONS = [
1231
+ { value: 'customer', label: 'The customer asked to cancel' },
1232
+ { value: 'stock', label: 'Items are out of stock' },
1233
+ { value: 'payment', label: 'The payment was flagged' },
1234
+ { value: 'duplicate', label: 'Duplicate order' },
1235
+ ];
1236
+
1237
+ @Component({
1238
+ selector: 'app-dialog-cancel-order',
1239
+ imports: [
1240
+ SlAlertDialog,
1241
+ SlAlertDialogAction,
1242
+ SlAlertDialogCancel,
1243
+ SlAlertDialogIcon,
1244
+ SlBadge,
1245
+ SlButton,
1246
+ SlDialogBody,
1247
+ SlDialogDescription,
1248
+ SlDialogFooter,
1249
+ SlDialogHeader,
1250
+ SlDialogTitle,
1251
+ SlDialogTrigger,
1252
+ SlField,
1253
+ SlFieldLabel,
1254
+ SlInline,
1255
+ SlSelect,
1256
+ SlSelectItem,
1257
+ SlText,
1258
+ ],
1259
+ template: `
1260
+ <div slInline align="center" [gap]="3">
1261
+ <span slText weight="medium">Order SO-1182</span>
1262
+ <span slBadge [tone]="cancelled() ? 'danger' : 'accent'">
1263
+ {{ cancelled() ? 'Cancelled' : 'Processing' }}
1264
+ </span>
1265
+ <button
1266
+ slButton
1267
+ focusableWhenDisabled
1268
+ size="sm"
1269
+ tone="danger"
1270
+ variant="outline"
1271
+ [disabled]="cancelled()"
1272
+ [slDialogTrigger]="dialog"
1273
+ >
1274
+ Cancel order
1275
+ </button>
1276
+ <sl-alert-dialog #dialog="slAlertDialog" (openChange)="$event && reason.set(null)">
1277
+ <header slDialogHeader>
1278
+ <span slAlertDialogIcon></span>
1279
+ <h2 slDialogTitle>Cancel order SO-1182?</h2>
1280
+ <p slDialogDescription>
1281
+ Contoso Foods is refunded $1,240.00 and the 6 items go back to stock. The order cannot
1282
+ be reopened.
1283
+ </p>
1284
+ </header>
1285
+ <div slDialogBody>
1286
+ <div slField required>
1287
+ <label slFieldLabel>Reason</label>
1288
+ <sl-select placeholder="Choose a reason" [items]="reasons" [(value)]="reason">
1289
+ @for (option of reasons; track option.value) {
1290
+ <sl-select-item [value]="option.value">{{ option.label }}</sl-select-item>
1291
+ }
1292
+ </sl-select>
1293
+ </div>
1294
+ </div>
1295
+ <footer slDialogFooter>
1296
+ <button slButton slAlertDialogCancel tone="secondary" variant="outline">
1297
+ Keep order
1298
+ </button>
1299
+ <button
1300
+ slButton
1301
+ slAlertDialogAction
1302
+ tone="danger"
1303
+ [disabled]="reason() === null"
1304
+ (click)="cancelled.set(true)"
1305
+ >
1306
+ Cancel order
1307
+ </button>
1308
+ </footer>
1309
+ </sl-alert-dialog>
1310
+ </div>
1311
+ `,
1312
+ })
1313
+ export class DialogCancelOrder {
1314
+ readonly reasons = REASONS;
1315
+ readonly cancelled = signal(false);
1316
+ readonly reason = signal<SelectSelection>(null);
1317
+ }
1318
+ ```
1319
+
1320
+ ### create-shipment.ts
1321
+
1322
+ Example
1323
+
1324
+ ```ts
1325
+ import { Component, computed, signal } from '@angular/core';
1326
+ import { SlButton } from '@slotted/angular/button';
1327
+ import { SlCheckbox } from '@slotted/angular/checkbox';
1328
+ import {
1329
+ SlDialog,
1330
+ SlDialogBody,
1331
+ SlDialogClose,
1332
+ SlDialogDescription,
1333
+ SlDialogFooter,
1334
+ SlDialogHeader,
1335
+ SlDialogTitle,
1336
+ SlDialogTrigger,
1337
+ type DialogChangeRequest,
1338
+ } from '@slotted/angular/dialog';
1339
+ import { SlField, SlFieldDescription, SlFieldError, SlFieldLabel } from '@slotted/angular/field';
1340
+ import { SlInline } from '@slotted/angular/inline';
1341
+ import { SlSelect, SlSelectItem, type SelectSelection } from '@slotted/angular/select';
1342
+ import { SlStack } from '@slotted/angular/stack';
1343
+ import { SlTextField, SlTextFieldInput } from '@slotted/angular/text-field';
1344
+ import { SlText } from '@slotted/angular/typography';
1345
+
1346
+ const CARRIERS = [
1347
+ { value: 'ups', label: 'UPS Ground', description: '3–5 business days' },
1348
+ { value: 'fedex', label: 'FedEx 2Day', description: '2 business days' },
1349
+ { value: 'usps', label: 'USPS Priority Mail', description: '1–3 business days' },
1350
+ ];
1351
+
1352
+ function weightError(value: string): string {
1353
+ if (value.trim() === '') return 'Enter the total weight of the packages.';
1354
+ const weight = Number(value);
1355
+ if (!Number.isFinite(weight) || weight <= 0) return 'Enter a weight above 0, such as 18.4.';
1356
+ return '';
1357
+ }
1358
+
1359
+ @Component({
1360
+ selector: 'app-dialog-create-shipment',
1361
+ imports: [
1362
+ SlButton,
1363
+ SlCheckbox,
1364
+ SlDialog,
1365
+ SlDialogBody,
1366
+ SlDialogClose,
1367
+ SlDialogDescription,
1368
+ SlDialogFooter,
1369
+ SlDialogHeader,
1370
+ SlDialogTitle,
1371
+ SlDialogTrigger,
1372
+ SlField,
1373
+ SlFieldDescription,
1374
+ SlFieldError,
1375
+ SlFieldLabel,
1376
+ SlInline,
1377
+ SlSelect,
1378
+ SlSelectItem,
1379
+ SlStack,
1380
+ SlText,
1381
+ SlTextField,
1382
+ SlTextFieldInput,
1383
+ ],
1384
+ template: `
1385
+ <div slInline align="center" [gap]="3">
1386
+ <button slButton [slDialogTrigger]="dialog">Create shipment</button>
1387
+ <sl-dialog #dialog="slDialog" size="lg" [(open)]="open" (openChangeRequest)="guard($event)">
1388
+ <header slDialogHeader>
1389
+ <h2 slDialogTitle>Create a shipment</h2>
1390
+ <p slDialogDescription>
1391
+ Order SO-1182 for Contoso Foods: 6 items to 1200 Pike St, Seattle.
1392
+ </p>
1393
+ <button slDialogClose></button>
1394
+ </header>
1395
+ <div slDialogBody>
1396
+ <form id="create-shipment" novalidate (submit)="submit($event)">
1397
+ <div slStack [gap]="5">
1398
+ <div slField>
1399
+ <label slFieldLabel>Carrier</label>
1400
+ <sl-select name="carrier" [items]="carriers" [(value)]="carrier">
1401
+ @for (option of carriers; track option.value) {
1402
+ <sl-select-item [value]="option.value" [description]="option.description">
1403
+ {{ option.label }}
1404
+ </sl-select-item>
1405
+ }
1406
+ </sl-select>
1407
+ </div>
1408
+ <div slField required [invalid]="error() !== '' ? true : undefined">
1409
+ <label slFieldLabel>Weight in kilograms</label>
1410
+ <span slFieldDescription>All packages together, as weighed at the dock.</span>
1411
+ <div slTextField>
1412
+ <input
1413
+ slTextFieldInput
1414
+ inputmode="decimal"
1415
+ name="weight"
1416
+ [value]="weight()"
1417
+ (valueChange)="weight.set($event.value)"
1418
+ />
1419
+ </div>
1420
+ <span slFieldError live="polite" reserve>{{ error() }}</span>
1421
+ </div>
1422
+ <div slCheckbox defaultChecked name="notify">
1423
+ Email the tracking number to the customer
1424
+ </div>
1425
+ </div>
1426
+ </form>
1427
+ </div>
1428
+ <footer slDialogFooter>
1429
+ <button
1430
+ slButton
1431
+ variant="ghost"
1432
+ tone="secondary"
1433
+ [disabled]="saving()"
1434
+ (click)="open.set(false)"
1435
+ >
1436
+ Cancel
1437
+ </button>
1438
+ <button
1439
+ slButton
1440
+ form="create-shipment"
1441
+ type="submit"
1442
+ [loading]="saving()"
1443
+ [messages]="{ loading: 'Creating shipment' }"
1444
+ >
1445
+ Create shipment
1446
+ </button>
1447
+ </footer>
1448
+ </sl-dialog>
1449
+ @if (created(); as message) {
1450
+ <span slText role="status" size="sm" tone="muted">{{ message }}</span>
1451
+ }
1452
+ </div>
1453
+ `,
1454
+ })
1455
+ export class DialogCreateShipment {
1456
+ readonly carriers = CARRIERS;
1457
+ readonly open = signal(false);
1458
+ readonly carrier = signal<SelectSelection>('ups');
1459
+ readonly weight = signal('');
1460
+ readonly submitted = signal(false);
1461
+ readonly saving = signal(false);
1462
+ readonly created = signal<string | null>(null);
1463
+ readonly error = computed(() => (this.submitted() ? weightError(this.weight()) : ''));
1464
+
1465
+ guard(request: DialogChangeRequest): void {
1466
+ if (!request.value && this.saving()) {
1467
+ request.cancel();
1468
+ return;
1469
+ }
1470
+ if (request.value) {
1471
+ this.weight.set('');
1472
+ this.submitted.set(false);
1473
+ }
1474
+ }
1475
+
1476
+ submit(event: Event): void {
1477
+ event.preventDefault();
1478
+ this.submitted.set(true);
1479
+ if (weightError(this.weight()) !== '') return;
1480
+ this.saving.set(true);
1481
+ setTimeout(() => {
1482
+ const label = CARRIERS.find((option) => option.value === this.carrier())?.label;
1483
+ this.saving.set(false);
1484
+ this.created.set(`Shipment SH-4472 created with ${label}.`);
1485
+ this.open.set(false);
1486
+ }, 1200);
1487
+ }
1488
+ }
1489
+ ```
1490
+
1491
+ ### destructive.ts
1492
+
1493
+ Example
1494
+
1495
+ ```ts
1496
+ import { Component, signal } from '@angular/core';
1497
+ import { SlButton } from '@slotted/angular/button';
1498
+ import {
1499
+ SlAlertDialog,
1500
+ SlAlertDialogAction,
1501
+ SlAlertDialogCancel,
1502
+ SlAlertDialogIcon,
1503
+ SlDialogDescription,
1504
+ SlDialogFooter,
1505
+ SlDialogHeader,
1506
+ SlDialogTitle,
1507
+ SlDialogTrigger,
1508
+ } from '@slotted/angular/dialog';
1509
+ import { SlInline } from '@slotted/angular/inline';
1510
+ import { SlText } from '@slotted/angular/typography';
1511
+
1512
+ @Component({
1513
+ selector: 'app-dialog-destructive',
1514
+ imports: [
1515
+ SlAlertDialog,
1516
+ SlAlertDialogAction,
1517
+ SlAlertDialogCancel,
1518
+ SlAlertDialogIcon,
1519
+ SlButton,
1520
+ SlDialogDescription,
1521
+ SlDialogFooter,
1522
+ SlDialogHeader,
1523
+ SlDialogTitle,
1524
+ SlDialogTrigger,
1525
+ SlInline,
1526
+ SlText,
1527
+ ],
1528
+ template: `
1529
+ <div slInline align="center" [gap]="3">
1530
+ <button slButton tone="danger" variant="outline" [slDialogTrigger]="dialog">
1531
+ Delete price list
1532
+ </button>
1533
+ <sl-alert-dialog #dialog="slAlertDialog">
1534
+ <header slDialogHeader>
1535
+ <span slAlertDialogIcon></span>
1536
+ <h2 slDialogTitle>Delete the 2026 wholesale price list?</h2>
1537
+ <p slDialogDescription>
1538
+ The 412 prices in it are removed, and 9 customers on this list move to retail prices.
1539
+ This cannot be undone.
1540
+ </p>
1541
+ </header>
1542
+ <footer slDialogFooter>
1543
+ <button slButton slAlertDialogCancel tone="secondary" variant="outline">
1544
+ Keep price list
1545
+ </button>
1546
+ <button slButton slAlertDialogAction tone="danger" (click)="deleted.set(true)">
1547
+ Delete price list
1548
+ </button>
1549
+ </footer>
1550
+ </sl-alert-dialog>
1551
+ @if (deleted()) {
1552
+ <span slText role="status" size="sm" tone="muted">
1553
+ The 2026 wholesale price list was deleted.
1554
+ </span>
1555
+ }
1556
+ </div>
1557
+ `,
1558
+ })
1559
+ export class DialogDestructive {
1560
+ readonly deleted = signal(false);
1561
+ }
1562
+ ```
1563
+
1564
+ ### dismiss.ts
1565
+
1566
+ Example
1567
+
1568
+ ```ts
1569
+ import { Component, signal } from '@angular/core';
1570
+ import { SlButton } from '@slotted/angular/button';
1571
+ import {
1572
+ SlDialog,
1573
+ SlDialogBody,
1574
+ SlDialogDescription,
1575
+ SlDialogFooter,
1576
+ SlDialogHeader,
1577
+ SlDialogTitle,
1578
+ SlDialogTrigger,
1579
+ } from '@slotted/angular/dialog';
1580
+ import { SlText } from '@slotted/angular/typography';
1581
+
1582
+ @Component({
1583
+ selector: 'app-dialog-dismiss',
1584
+ imports: [
1585
+ SlButton,
1586
+ SlDialog,
1587
+ SlDialogBody,
1588
+ SlDialogDescription,
1589
+ SlDialogFooter,
1590
+ SlDialogHeader,
1591
+ SlDialogTitle,
1592
+ SlDialogTrigger,
1593
+ SlText,
1594
+ ],
1595
+ template: `
1596
+ <button slButton [slDialogTrigger]="dialog">Import products</button>
1597
+ <sl-dialog #dialog="slDialog" escape="none" outsidePress="none" [(open)]="open">
1598
+ <header slDialogHeader>
1599
+ <h2 slDialogTitle>Import 1,240 products</h2>
1600
+ <p slDialogDescription>From spring-catalogue.csv into the Northwind price list.</p>
1601
+ </header>
1602
+ <div slDialogBody>
1603
+ <span slText size="sm">
1604
+ 38 rows update existing products and 1,202 add new ones. Escape and a press outside the
1605
+ panel leave this dialog open; choose one of the actions.
1606
+ </span>
1607
+ </div>
1608
+ <footer slDialogFooter>
1609
+ <button slButton variant="ghost" tone="secondary" (click)="open.set(false)">
1610
+ Cancel import
1611
+ </button>
1612
+ <button slButton (click)="open.set(false)">Start import</button>
1613
+ </footer>
1614
+ </sl-dialog>
1615
+ `,
1616
+ })
1617
+ export class DialogDismiss {
1618
+ readonly open = signal(false);
1619
+ }
1620
+ ```
1621
+
1622
+ ### form.ts
1623
+
1624
+ Example
1625
+
1626
+ ```ts
1627
+ import { Component, computed, signal } from '@angular/core';
1628
+ import { SlButton } from '@slotted/angular/button';
1629
+ import {
1630
+ SlDialog,
1631
+ SlDialogBody,
1632
+ SlDialogClose,
1633
+ SlDialogDescription,
1634
+ SlDialogFooter,
1635
+ SlDialogHeader,
1636
+ SlDialogTitle,
1637
+ SlDialogTrigger,
1638
+ } from '@slotted/angular/dialog';
1639
+ import { SlField, SlFieldError, SlFieldLabel } from '@slotted/angular/field';
1640
+ import { SlInline } from '@slotted/angular/inline';
1641
+ import { SlStack } from '@slotted/angular/stack';
1642
+ import { SlTextField, SlTextFieldInput } from '@slotted/angular/text-field';
1643
+ import { SlText } from '@slotted/angular/typography';
1644
+
1645
+ function nameError(value: string): string {
1646
+ return value.trim() === '' ? 'Enter the contact’s full name.' : '';
1647
+ }
1648
+
1649
+ function emailError(value: string): string {
1650
+ if (value.trim() === '') return 'Enter the address the contact reads.';
1651
+ if (!/^\S+@\S+\.\S+$/.test(value)) return 'Enter an address like ana@contoso.com.';
1652
+ return '';
1653
+ }
1654
+
1655
+ @Component({
1656
+ selector: 'app-dialog-form',
1657
+ imports: [
1658
+ SlButton,
1659
+ SlDialog,
1660
+ SlDialogBody,
1661
+ SlDialogClose,
1662
+ SlDialogDescription,
1663
+ SlDialogFooter,
1664
+ SlDialogHeader,
1665
+ SlDialogTitle,
1666
+ SlDialogTrigger,
1667
+ SlField,
1668
+ SlFieldError,
1669
+ SlFieldLabel,
1670
+ SlInline,
1671
+ SlStack,
1672
+ SlText,
1673
+ SlTextField,
1674
+ SlTextFieldInput,
1675
+ ],
1676
+ template: `
1677
+ <div slInline align="center" [gap]="3">
1678
+ <button slButton [slDialogTrigger]="dialog">Add contact</button>
1679
+ <sl-dialog #dialog="slDialog" [open]="open()" (openChange)="toggle($event)">
1680
+ <header slDialogHeader>
1681
+ <h2 slDialogTitle>New contact</h2>
1682
+ <p slDialogDescription>Contoso Foods, Seattle.</p>
1683
+ <button slDialogClose></button>
1684
+ </header>
1685
+ <div slDialogBody>
1686
+ <form id="new-contact" novalidate (submit)="submit($event)">
1687
+ <div slStack [gap]="4">
1688
+ <div slField required [invalid]="errors()?.name ? true : undefined">
1689
+ <label slFieldLabel>Full name</label>
1690
+ <div slTextField>
1691
+ <input
1692
+ slTextFieldInput
1693
+ autocomplete="name"
1694
+ [value]="name()"
1695
+ (valueChange)="name.set($event.value)"
1696
+ />
1697
+ </div>
1698
+ <span slFieldError live="polite" reserve>{{ errors()?.name }}</span>
1699
+ </div>
1700
+ <div slField required [invalid]="errors()?.email ? true : undefined">
1701
+ <label slFieldLabel>Email</label>
1702
+ <div slTextField>
1703
+ <input
1704
+ slTextFieldInput
1705
+ autocomplete="email"
1706
+ type="email"
1707
+ [value]="email()"
1708
+ (valueChange)="email.set($event.value)"
1709
+ />
1710
+ </div>
1711
+ <span slFieldError live="polite" reserve>{{ errors()?.email }}</span>
1712
+ </div>
1713
+ </div>
1714
+ </form>
1715
+ </div>
1716
+ <footer slDialogFooter>
1717
+ <button slButton variant="ghost" tone="secondary" (click)="open.set(false)">
1718
+ Cancel
1719
+ </button>
1720
+ <button slButton type="submit" form="new-contact">Add contact</button>
1721
+ </footer>
1722
+ </sl-dialog>
1723
+ @if (added(); as message) {
1724
+ <span slText role="status" size="sm" tone="muted">{{ message }}</span>
1725
+ }
1726
+ </div>
1727
+ `,
1728
+ })
1729
+ export class DialogForm {
1730
+ readonly open = signal(false);
1731
+ readonly name = signal('');
1732
+ readonly email = signal('');
1733
+ readonly submitted = signal(false);
1734
+ readonly added = signal<string | null>(null);
1735
+ readonly errors = computed(() =>
1736
+ this.submitted() ? { name: nameError(this.name()), email: emailError(this.email()) } : null,
1737
+ );
1738
+
1739
+ toggle(next: boolean): void {
1740
+ if (next) {
1741
+ this.name.set('');
1742
+ this.email.set('');
1743
+ this.submitted.set(false);
1744
+ }
1745
+ this.open.set(next);
1746
+ }
1747
+
1748
+ submit(event: Event): void {
1749
+ event.preventDefault();
1750
+ this.submitted.set(true);
1751
+ if (nameError(this.name()) !== '' || emailError(this.email()) !== '') return;
1752
+ this.added.set(`${this.name().trim()} was added to Contoso Foods.`);
1753
+ this.open.set(false);
1754
+ }
1755
+ }
1756
+ ```
1757
+
1758
+ ### full-screen.ts
1759
+
1760
+ Example
1761
+
1762
+ ```ts
1763
+ import { Component } from '@angular/core';
1764
+ import { SlButton } from '@slotted/angular/button';
1765
+ import {
1766
+ SlDialog,
1767
+ SlDialogBody,
1768
+ SlDialogClose,
1769
+ SlDialogDescription,
1770
+ SlDialogHeader,
1771
+ SlDialogTitle,
1772
+ SlDialogTrigger,
1773
+ } from '@slotted/angular/dialog';
1774
+ import { SlInline } from '@slotted/angular/inline';
1775
+ import { SlStack } from '@slotted/angular/stack';
1776
+ import { SlText } from '@slotted/angular/typography';
1777
+
1778
+ const STOPS = [
1779
+ { time: '08:10', place: 'Contoso Foods, 1200 Pike St' },
1780
+ { time: '08:55', place: 'Fabrikam Grocers, 410 Broadway E' },
1781
+ { time: '09:40', place: 'Tailspin Market, 3300 Fremont Ave N' },
1782
+ { time: '10:30', place: 'Woodgrove Deli, 85 Pine St' },
1783
+ { time: '11:15', place: 'Wide World Importers, 2201 1st Ave S' },
1784
+ ];
1785
+
1786
+ @Component({
1787
+ selector: 'app-dialog-full-screen',
1788
+ imports: [
1789
+ SlButton,
1790
+ SlDialog,
1791
+ SlDialogBody,
1792
+ SlDialogClose,
1793
+ SlDialogDescription,
1794
+ SlDialogHeader,
1795
+ SlDialogTitle,
1796
+ SlDialogTrigger,
1797
+ SlInline,
1798
+ SlStack,
1799
+ SlText,
1800
+ ],
1801
+ template: `
1802
+ <button slButton tone="secondary" variant="outline" [slDialogTrigger]="dialog">
1803
+ Open route plan
1804
+ </button>
1805
+ <sl-dialog #dialog="slDialog" fullscreenToggle size="lg">
1806
+ <header slDialogHeader>
1807
+ <h2 slDialogTitle>Route 14, Tuesday 6 October</h2>
1808
+ <p slDialogDescription>5 stops, 38 km, driver Ana Souza.</p>
1809
+ <button slDialogClose></button>
1810
+ </header>
1811
+ <div slDialogBody>
1812
+ <div slStack [gap]="3">
1813
+ @for (stop of stops; track stop.time) {
1814
+ <div slInline [gap]="4">
1815
+ <span slText size="sm" tone="muted">{{ stop.time }}</span>
1816
+ <span slText size="sm">{{ stop.place }}</span>
1817
+ </div>
1818
+ }
1819
+ </div>
1820
+ </div>
1821
+ </sl-dialog>
1822
+ `,
1823
+ })
1824
+ export class DialogFullScreen {
1825
+ readonly stops = STOPS;
1826
+ }
1827
+ ```
1828
+
1829
+ ### initial-focus.ts
1830
+
1831
+ Example
1832
+
1833
+ ```ts
1834
+ import { Component, computed, signal } from '@angular/core';
1835
+ import { SlButton } from '@slotted/angular/button';
1836
+ import {
1837
+ SlDialog,
1838
+ SlDialogBody,
1839
+ SlDialogClose,
1840
+ SlDialogHeader,
1841
+ SlDialogTitle,
1842
+ SlDialogTrigger,
1843
+ } from '@slotted/angular/dialog';
1844
+ import { SlStack } from '@slotted/angular/stack';
1845
+ import { SlTextField, SlTextFieldInput } from '@slotted/angular/text-field';
1846
+ import { SlText } from '@slotted/angular/typography';
1847
+
1848
+ const CUSTOMERS = [
1849
+ 'Contoso Foods',
1850
+ 'Fabrikam Grocers',
1851
+ 'Northwind Traders',
1852
+ 'Tailspin Market',
1853
+ 'Wide World Importers',
1854
+ 'Woodgrove Deli',
1855
+ ];
1856
+
1857
+ @Component({
1858
+ selector: 'app-dialog-initial-focus',
1859
+ imports: [
1860
+ SlButton,
1861
+ SlDialog,
1862
+ SlDialogBody,
1863
+ SlDialogClose,
1864
+ SlDialogHeader,
1865
+ SlDialogTitle,
1866
+ SlDialogTrigger,
1867
+ SlStack,
1868
+ SlText,
1869
+ SlTextField,
1870
+ SlTextFieldInput,
1871
+ ],
1872
+ template: `
1873
+ <button slButton tone="secondary" variant="outline" [slDialogTrigger]="dialog">
1874
+ Find a customer
1875
+ </button>
1876
+ <sl-dialog #dialog="slDialog" [initialFocus]="search" (openChange)="$event && query.set('')">
1877
+ <header slDialogHeader>
1878
+ <h2 slDialogTitle>Find a customer</h2>
1879
+ <button slDialogClose></button>
1880
+ </header>
1881
+ <div slDialogBody>
1882
+ <div slStack [gap]="4">
1883
+ <div slTextField>
1884
+ <input
1885
+ #search
1886
+ slTextFieldInput
1887
+ aria-label="Customer name"
1888
+ placeholder="Search by name"
1889
+ type="search"
1890
+ [value]="query()"
1891
+ (valueChange)="query.set($event.value)"
1892
+ />
1893
+ </div>
1894
+ <div slStack [gap]="2">
1895
+ @for (name of matches(); track name) {
1896
+ <span slText size="sm">{{ name }}</span>
1897
+ }
1898
+ </div>
1899
+ </div>
1900
+ </div>
1901
+ </sl-dialog>
1902
+ `,
1903
+ })
1904
+ export class DialogInitialFocus {
1905
+ readonly query = signal('');
1906
+ readonly matches = computed(() =>
1907
+ CUSTOMERS.filter((name) => name.toLowerCase().includes(this.query().toLowerCase())),
1908
+ );
1909
+ }
1910
+ ```
1911
+
1912
+ ### menu-action.ts
1913
+
1914
+ Example
1915
+
1916
+ ```ts
1917
+ import { Component, ElementRef, signal, viewChild } from '@angular/core';
1918
+ import { SlButton } from '@slotted/angular/button';
1919
+ import {
1920
+ SlDialog,
1921
+ SlDialogBody,
1922
+ SlDialogClose,
1923
+ SlDialogDescription,
1924
+ SlDialogFooter,
1925
+ SlDialogHeader,
1926
+ SlDialogTitle,
1927
+ } from '@slotted/angular/dialog';
1928
+ import { SlField, SlFieldLabel } from '@slotted/angular/field';
1929
+ import { SlMenu, SlMenuItem, SlMenuSeparator, SlMenuTrigger } from '@slotted/angular/menu';
1930
+ import { SlTextField, SlTextFieldInput } from '@slotted/angular/text-field';
1931
+
1932
+ @Component({
1933
+ selector: 'app-dialog-menu-action',
1934
+ imports: [
1935
+ SlButton,
1936
+ SlDialog,
1937
+ SlDialogBody,
1938
+ SlDialogClose,
1939
+ SlDialogDescription,
1940
+ SlDialogFooter,
1941
+ SlDialogHeader,
1942
+ SlDialogTitle,
1943
+ SlField,
1944
+ SlFieldLabel,
1945
+ SlMenu,
1946
+ SlMenuItem,
1947
+ SlMenuSeparator,
1948
+ SlMenuTrigger,
1949
+ SlTextField,
1950
+ SlTextFieldInput,
1951
+ ],
1952
+ template: `
1953
+ <button #actions slButton tone="secondary" variant="outline" [slMenuTriggerFor]="menu">
1954
+ Customer actions
1955
+ </button>
1956
+ <sl-menu #menu>
1957
+ <button slMenuItem (select)="open.set(true)">Change credit limit…</button>
1958
+ <button slMenuItem>Export statement</button>
1959
+ <hr slMenuSeparator />
1960
+ <button slMenuItem tone="danger">Suspend account…</button>
1961
+ </sl-menu>
1962
+ <sl-dialog size="sm" [finalFocus]="trigger()?.nativeElement" [(open)]="open">
1963
+ <header slDialogHeader>
1964
+ <h2 slDialogTitle>Credit limit</h2>
1965
+ <p slDialogDescription>Contoso Foods has $18,420.00 outstanding on open invoices.</p>
1966
+ <button slDialogClose></button>
1967
+ </header>
1968
+ <div slDialogBody>
1969
+ <div slField>
1970
+ <label slFieldLabel>Limit in US dollars</label>
1971
+ <div slTextField>
1972
+ <input slTextFieldInput inputmode="decimal" value="25000" />
1973
+ </div>
1974
+ </div>
1975
+ </div>
1976
+ <footer slDialogFooter>
1977
+ <button slButton variant="ghost" tone="secondary" (click)="open.set(false)">Cancel</button>
1978
+ <button slButton (click)="open.set(false)">Save limit</button>
1979
+ </footer>
1980
+ </sl-dialog>
1981
+ `,
1982
+ })
1983
+ export class DialogMenuAction {
1984
+ readonly open = signal(false);
1985
+ readonly trigger = viewChild('actions', { read: ElementRef });
1986
+ }
1987
+ ```
1988
+
1989
+ ### non-modal.ts
1990
+
1991
+ Example
1992
+
1993
+ ```ts
1994
+ import { Component } from '@angular/core';
1995
+ import { SlButton } from '@slotted/angular/button';
1996
+ import {
1997
+ SlDialog,
1998
+ SlDialogBody,
1999
+ SlDialogClose,
2000
+ SlDialogDescription,
2001
+ SlDialogHeader,
2002
+ SlDialogTitle,
2003
+ SlDialogTrigger,
2004
+ } from '@slotted/angular/dialog';
2005
+ import { SlStack } from '@slotted/angular/stack';
2006
+ import { SlText } from '@slotted/angular/typography';
2007
+
2008
+ const STEPS = [
2009
+ 'Pick the 6 lines on the pick list from aisles 4 and 9.',
2010
+ 'Pack the olive oil upright, with dividers.',
2011
+ 'Print the UPS label and attach it to the top face.',
2012
+ ];
2013
+
2014
+ @Component({
2015
+ selector: 'app-dialog-non-modal',
2016
+ imports: [
2017
+ SlButton,
2018
+ SlDialog,
2019
+ SlDialogBody,
2020
+ SlDialogClose,
2021
+ SlDialogDescription,
2022
+ SlDialogHeader,
2023
+ SlDialogTitle,
2024
+ SlDialogTrigger,
2025
+ SlStack,
2026
+ SlText,
2027
+ ],
2028
+ template: `
2029
+ <button slButton tone="secondary" variant="outline" [slDialogTrigger]="dialog">
2030
+ Show packing steps
2031
+ </button>
2032
+ <sl-dialog #dialog="slDialog" outsidePress="none" placement="top" size="sm" [modal]="false">
2033
+ <header slDialogHeader>
2034
+ <h2 slDialogTitle>Packing steps</h2>
2035
+ <p slDialogDescription>Order SO-1182. The page stays usable behind this panel.</p>
2036
+ <button slDialogClose></button>
2037
+ </header>
2038
+ <div slDialogBody>
2039
+ <div slStack [gap]="2">
2040
+ @for (step of steps; track step; let index = $index) {
2041
+ <span slText size="sm">{{ index + 1 }}. {{ step }}</span>
2042
+ }
2043
+ </div>
2044
+ </div>
2045
+ </sl-dialog>
2046
+ `,
2047
+ })
2048
+ export class DialogNonModal {
2049
+ readonly steps = STEPS;
2050
+ }
2051
+ ```
2052
+
2053
+ ### parts.ts
2054
+
2055
+ Example
2056
+
2057
+ ```ts
2058
+ import { Component, signal } from '@angular/core';
2059
+ import { SlBadge } from '@slotted/angular/badge';
2060
+ import { SlButton } from '@slotted/angular/button';
2061
+ import {
2062
+ SlDescriptionList,
2063
+ SlDescriptionListDescription,
2064
+ SlDescriptionListItem,
2065
+ SlDescriptionListTerm,
2066
+ } from '@slotted/angular/description-list';
2067
+ import {
2068
+ SlDialog,
2069
+ SlDialogBody,
2070
+ SlDialogClose,
2071
+ SlDialogDescription,
2072
+ SlDialogFooter,
2073
+ SlDialogHeader,
2074
+ SlDialogTitle,
2075
+ SlDialogTrigger,
2076
+ } from '@slotted/angular/dialog';
2077
+
2078
+ const DETAILS = [
2079
+ { term: 'Carrier', value: 'UPS Ground' },
2080
+ { term: 'Tracking number', value: '1Z 999 AA1 01 2345 6784' },
2081
+ { term: 'Packages', value: '3, 18.4 kg in total' },
2082
+ { term: 'Estimated delivery', value: 'Thursday, 8 October' },
2083
+ ];
2084
+
2085
+ @Component({
2086
+ selector: 'app-dialog-parts',
2087
+ imports: [
2088
+ SlBadge,
2089
+ SlButton,
2090
+ SlDescriptionList,
2091
+ SlDescriptionListDescription,
2092
+ SlDescriptionListItem,
2093
+ SlDescriptionListTerm,
2094
+ SlDialog,
2095
+ SlDialogBody,
2096
+ SlDialogClose,
2097
+ SlDialogDescription,
2098
+ SlDialogFooter,
2099
+ SlDialogHeader,
2100
+ SlDialogTitle,
2101
+ SlDialogTrigger,
2102
+ ],
2103
+ template: `
2104
+ <button slButton tone="secondary" variant="outline" [slDialogTrigger]="dialog">
2105
+ View shipment
2106
+ </button>
2107
+ <sl-dialog #dialog="slDialog" [(open)]="open">
2108
+ <header slDialogHeader>
2109
+ <h2 slDialogTitle>Shipment SH-4471</h2>
2110
+ <p slDialogDescription>Order SO-1182 for Contoso Foods, Seattle.</p>
2111
+ <span slBadge tone="accent">In transit</span>
2112
+ <button slDialogClose></button>
2113
+ </header>
2114
+ <div slDialogBody>
2115
+ <div slDescriptionList>
2116
+ @for (detail of details; track detail.term) {
2117
+ <div slDescriptionListItem>
2118
+ <dt slDescriptionListTerm>{{ detail.term }}</dt>
2119
+ <dd slDescriptionListDescription>{{ detail.value }}</dd>
2120
+ </div>
2121
+ }
2122
+ </div>
2123
+ </div>
2124
+ <footer slDialogFooter>
2125
+ <button slButton variant="ghost" tone="secondary" (click)="open.set(false)">Close</button>
2126
+ <button slButton>Print label</button>
2127
+ </footer>
2128
+ </sl-dialog>
2129
+ `,
2130
+ })
2131
+ export class DialogParts {
2132
+ readonly open = signal(false);
2133
+ readonly details = DETAILS;
2134
+ }
2135
+ ```
2136
+
2137
+ ### result.ts
2138
+
2139
+ Example
2140
+
2141
+ ```ts
2142
+ import { Component, signal } from '@angular/core';
2143
+ import { SlButton } from '@slotted/angular/button';
2144
+ import {
2145
+ SlDialog,
2146
+ SlDialogClose,
2147
+ SlDialogDescription,
2148
+ SlDialogFooter,
2149
+ SlDialogHeader,
2150
+ SlDialogTitle,
2151
+ SlDialogTrigger,
2152
+ } from '@slotted/angular/dialog';
2153
+ import { SlInline } from '@slotted/angular/inline';
2154
+ import { SlText } from '@slotted/angular/typography';
2155
+
2156
+ const OUTCOMES: Record<string, string> = {
2157
+ partial: 'Ships the 4 items in stock today.',
2158
+ wait: 'Holds the order until every item is in stock.',
2159
+ };
2160
+
2161
+ @Component({
2162
+ selector: 'app-dialog-result',
2163
+ imports: [
2164
+ SlButton,
2165
+ SlDialog,
2166
+ SlDialogClose,
2167
+ SlDialogDescription,
2168
+ SlDialogFooter,
2169
+ SlDialogHeader,
2170
+ SlDialogTitle,
2171
+ SlDialogTrigger,
2172
+ SlInline,
2173
+ SlText,
2174
+ ],
2175
+ template: `
2176
+ <div slInline align="center" [gap]="3">
2177
+ <button slButton tone="secondary" variant="outline" [slDialogTrigger]="dialog">
2178
+ Ship order SO-1182
2179
+ </button>
2180
+ <sl-dialog #dialog="slDialog" (closed)="record($event)">
2181
+ <header slDialogHeader>
2182
+ <h2 slDialogTitle>Two items are out of stock</h2>
2183
+ <p slDialogDescription>Aniseed syrup and dried pears are back in stock on 14 October.</p>
2184
+ <button slDialogClose></button>
2185
+ </header>
2186
+ <footer slDialogFooter>
2187
+ <button slButton variant="outline" tone="secondary" (click)="dialog.close('wait')">
2188
+ Wait for all items
2189
+ </button>
2190
+ <button slButton (click)="dialog.close('partial')">Ship 4 items now</button>
2191
+ </footer>
2192
+ </sl-dialog>
2193
+ @if (outcome(); as message) {
2194
+ <span slText size="sm" tone="muted">{{ message }}</span>
2195
+ }
2196
+ </div>
2197
+ `,
2198
+ })
2199
+ export class DialogResult {
2200
+ readonly outcome = signal<string | null>(null);
2201
+
2202
+ record(result: string | undefined): void {
2203
+ this.outcome.set((result && OUTCOMES[result]) ?? 'Closed without a choice.');
2204
+ }
2205
+ }
2206
+ ```
2207
+
2208
+ ### row-action.ts
2209
+
2210
+ Example
2211
+
2212
+ ```ts
2213
+ import { Component, signal } from '@angular/core';
2214
+ import { SlButton } from '@slotted/angular/button';
2215
+ import {
2216
+ SlDialog,
2217
+ SlDialogBody,
2218
+ SlDialogClose,
2219
+ SlDialogDescription,
2220
+ SlDialogFooter,
2221
+ SlDialogHeader,
2222
+ SlDialogTitle,
2223
+ } from '@slotted/angular/dialog';
2224
+ import { SlField, SlFieldLabel } from '@slotted/angular/field';
2225
+ import {
2226
+ SlTable,
2227
+ SlTableBody,
2228
+ SlTableCell,
2229
+ SlTableColumnHeader,
2230
+ SlTableContent,
2231
+ SlTableHead,
2232
+ SlTableRow,
2233
+ SlTableRowHeader,
2234
+ } from '@slotted/angular/table';
2235
+ import { SlTextField, SlTextFieldInput } from '@slotted/angular/text-field';
2236
+ import { SlVisuallyHidden } from '@slotted/angular/visually-hidden';
2237
+
2238
+ const ORDERS = [
2239
+ { id: 'SO-1182', customer: 'Contoso Foods', total: '$1,240.00', amount: '1240.00', card: '4242' },
2240
+ { id: 'SO-1183', customer: 'Fabrikam Grocers', total: '$386.50', amount: '386.50', card: '1881' },
2241
+ {
2242
+ id: 'SO-1184',
2243
+ customer: 'Tailspin Market',
2244
+ total: '$2,075.25',
2245
+ amount: '2075.25',
2246
+ card: '0005',
2247
+ },
2248
+ ];
2249
+
2250
+ type Order = (typeof ORDERS)[number];
2251
+
2252
+ @Component({
2253
+ selector: 'app-dialog-row-action',
2254
+ imports: [
2255
+ SlButton,
2256
+ SlDialog,
2257
+ SlDialogBody,
2258
+ SlDialogClose,
2259
+ SlDialogDescription,
2260
+ SlDialogFooter,
2261
+ SlDialogHeader,
2262
+ SlDialogTitle,
2263
+ SlField,
2264
+ SlFieldLabel,
2265
+ SlTable,
2266
+ SlTableBody,
2267
+ SlTableCell,
2268
+ SlTableColumnHeader,
2269
+ SlTableContent,
2270
+ SlTableHead,
2271
+ SlTableRow,
2272
+ SlTableRowHeader,
2273
+ SlTextField,
2274
+ SlTextFieldInput,
2275
+ SlVisuallyHidden,
2276
+ ],
2277
+ template: `
2278
+ <div slTable [columns]="4">
2279
+ <div slTableContent>
2280
+ <thead slTableHead>
2281
+ <tr slTableRow>
2282
+ <th slTableColumnHeader>Order</th>
2283
+ <th slTableColumnHeader>Customer</th>
2284
+ <th slTableColumnHeader numeric>Total</th>
2285
+ <th slTableColumnHeader><span slVisuallyHidden>Actions</span></th>
2286
+ </tr>
2287
+ </thead>
2288
+ <tbody slTableBody>
2289
+ @for (row of orders; track row.id) {
2290
+ <tr slTableRow [value]="row.id">
2291
+ <th slTableRowHeader>{{ row.id }}</th>
2292
+ <td slTableCell>{{ row.customer }}</td>
2293
+ <td slTableCell numeric>{{ row.total }}</td>
2294
+ <td slTableCell>
2295
+ <button
2296
+ slButton
2297
+ size="sm"
2298
+ tone="secondary"
2299
+ variant="ghost"
2300
+ [attr.aria-label]="'Refund ' + row.id"
2301
+ (click)="refund(row)"
2302
+ >
2303
+ Refund
2304
+ </button>
2305
+ </td>
2306
+ </tr>
2307
+ }
2308
+ </tbody>
2309
+ </div>
2310
+ </div>
2311
+ <sl-dialog size="sm" [(open)]="open">
2312
+ <header slDialogHeader>
2313
+ <h2 slDialogTitle>Refund {{ order().id }}</h2>
2314
+ <p slDialogDescription>
2315
+ {{ order().customer }} paid {{ order().total }} with the card ending {{ order().card }}.
2316
+ </p>
2317
+ <button slDialogClose></button>
2318
+ </header>
2319
+ <div slDialogBody>
2320
+ <div slField>
2321
+ <label slFieldLabel>Amount in US dollars</label>
2322
+ <div slTextField>
2323
+ <input slTextFieldInput inputmode="decimal" [value]="order().amount" />
2324
+ </div>
2325
+ </div>
2326
+ </div>
2327
+ <footer slDialogFooter>
2328
+ <button slButton variant="ghost" tone="secondary" (click)="open.set(false)">Cancel</button>
2329
+ <button slButton (click)="open.set(false)">Issue refund</button>
2330
+ </footer>
2331
+ </sl-dialog>
2332
+ `,
2333
+ })
2334
+ export class DialogRowAction {
2335
+ readonly orders = ORDERS;
2336
+ readonly open = signal(false);
2337
+ readonly order = signal<Order>(ORDERS[0]!);
2338
+
2339
+ refund(row: Order): void {
2340
+ this.order.set(row);
2341
+ this.open.set(true);
2342
+ }
2343
+ }
2344
+ ```
2345
+
2346
+ ### unsaved-changes.ts
2347
+
2348
+ Example
2349
+
2350
+ ```ts
2351
+ import { Component, computed, signal } from '@angular/core';
2352
+ import { SlButton } from '@slotted/angular/button';
2353
+ import {
2354
+ SlAlertDialog,
2355
+ SlAlertDialogAction,
2356
+ SlAlertDialogCancel,
2357
+ SlAlertDialogIcon,
2358
+ SlDialog,
2359
+ SlDialogBody,
2360
+ SlDialogClose,
2361
+ SlDialogDescription,
2362
+ SlDialogFooter,
2363
+ SlDialogHeader,
2364
+ SlDialogTitle,
2365
+ SlDialogTrigger,
2366
+ type DialogChangeRequest,
2367
+ } from '@slotted/angular/dialog';
2368
+ import { SlField, SlFieldLabel } from '@slotted/angular/field';
2369
+ import { SlInline } from '@slotted/angular/inline';
2370
+ import { SlTextField, SlTextFieldInput } from '@slotted/angular/text-field';
2371
+ import { SlText } from '@slotted/angular/typography';
2372
+
2373
+ @Component({
2374
+ selector: 'app-dialog-unsaved-changes',
2375
+ imports: [
2376
+ SlAlertDialog,
2377
+ SlAlertDialogAction,
2378
+ SlAlertDialogCancel,
2379
+ SlAlertDialogIcon,
2380
+ SlButton,
2381
+ SlDialog,
2382
+ SlDialogBody,
2383
+ SlDialogClose,
2384
+ SlDialogDescription,
2385
+ SlDialogFooter,
2386
+ SlDialogHeader,
2387
+ SlDialogTitle,
2388
+ SlDialogTrigger,
2389
+ SlField,
2390
+ SlFieldLabel,
2391
+ SlInline,
2392
+ SlText,
2393
+ SlTextField,
2394
+ SlTextFieldInput,
2395
+ ],
2396
+ template: `
2397
+ <div slInline align="center" [gap]="3">
2398
+ <button slButton tone="secondary" variant="outline" [slDialogTrigger]="dialog">
2399
+ Change delivery address
2400
+ </button>
2401
+ <sl-dialog #dialog="slDialog" [(open)]="open" (openChangeRequest)="guard($event)">
2402
+ <header slDialogHeader>
2403
+ <h2 slDialogTitle>Delivery address</h2>
2404
+ <p slDialogDescription>Applies to order SO-1182 and to later orders.</p>
2405
+ <button slDialogClose></button>
2406
+ </header>
2407
+ <div slDialogBody>
2408
+ <div slField>
2409
+ <label slFieldLabel>Address</label>
2410
+ <div slTextField>
2411
+ <input slTextFieldInput [value]="draft()" (valueChange)="draft.set($event.value)" />
2412
+ </div>
2413
+ </div>
2414
+ </div>
2415
+ <footer slDialogFooter>
2416
+ <button slButton variant="ghost" tone="secondary" (click)="leave()">Cancel</button>
2417
+ <button slButton (click)="save()">Save address</button>
2418
+ </footer>
2419
+ <sl-alert-dialog tone="warning" [(open)]="confirming">
2420
+ <header slDialogHeader>
2421
+ <span slAlertDialogIcon></span>
2422
+ <h2 slDialogTitle>Discard the new address?</h2>
2423
+ <p slDialogDescription>
2424
+ The address you typed is not saved. The order keeps the previous one.
2425
+ </p>
2426
+ </header>
2427
+ <footer slDialogFooter>
2428
+ <button slButton slAlertDialogCancel tone="secondary" variant="outline">
2429
+ Keep editing
2430
+ </button>
2431
+ <button slButton slAlertDialogAction tone="warning" (click)="open.set(false)">
2432
+ Discard changes
2433
+ </button>
2434
+ </footer>
2435
+ </sl-alert-dialog>
2436
+ </sl-dialog>
2437
+ <span slText size="sm" tone="muted">{{ address() }}</span>
2438
+ </div>
2439
+ `,
2440
+ })
2441
+ export class DialogUnsavedChanges {
2442
+ readonly open = signal(false);
2443
+ readonly confirming = signal(false);
2444
+ readonly address = signal('Pier 70, Suite 300, Seattle, WA 98121');
2445
+ readonly draft = signal(this.address());
2446
+ readonly dirty = computed(() => this.draft() !== this.address());
2447
+
2448
+ guard(request: DialogChangeRequest): void {
2449
+ if (request.value) {
2450
+ this.draft.set(this.address());
2451
+ } else if (this.dirty()) {
2452
+ request.cancel();
2453
+ this.confirming.set(true);
2454
+ }
2455
+ }
2456
+
2457
+ leave(): void {
2458
+ if (this.dirty()) this.confirming.set(true);
2459
+ else this.open.set(false);
2460
+ }
2461
+
2462
+ save(): void {
2463
+ this.address.set(this.draft());
2464
+ this.open.set(false);
2465
+ }
2466
+ }
2467
+ ```