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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,1141 @@
1
+ {
2
+ "family": "dialog",
3
+ "ui": "dialog",
4
+ "binding": "angular",
5
+ "catalog": {
6
+ "group": "Overlays",
7
+ "summary": "Modal dialog and alert dialog."
8
+ },
9
+ "axes": {
10
+ "size": [
11
+ "sm",
12
+ "md",
13
+ "lg",
14
+ "xl",
15
+ "full"
16
+ ],
17
+ "placement": [
18
+ "center",
19
+ "top"
20
+ ],
21
+ "scroll": [
22
+ "content",
23
+ "viewport"
24
+ ],
25
+ "surface": [
26
+ "panel",
27
+ "plain"
28
+ ],
29
+ "mount": [
30
+ "active",
31
+ "lazy",
32
+ "eager"
33
+ ],
34
+ "fullScreen": [
35
+ "never",
36
+ "narrow",
37
+ "always"
38
+ ],
39
+ "modal": [
40
+ true,
41
+ false
42
+ ],
43
+ "escape": [
44
+ "close",
45
+ "none"
46
+ ],
47
+ "outsidePress": [
48
+ "close",
49
+ "none"
50
+ ],
51
+ "back": [
52
+ "close",
53
+ "none"
54
+ ],
55
+ "tone": [
56
+ "accent",
57
+ "secondary",
58
+ "success",
59
+ "warning",
60
+ "danger"
61
+ ],
62
+ "initialFocus": [
63
+ "first",
64
+ "container",
65
+ "cancel"
66
+ ]
67
+ },
68
+ "members": {
69
+ "dialog": {
70
+ "nativeElement": "div",
71
+ "role": "dialog",
72
+ "defaults": {
73
+ "size": "md",
74
+ "placement": "center",
75
+ "scroll": "content",
76
+ "surface": "panel",
77
+ "mount": "active",
78
+ "fullScreen": "narrow",
79
+ "modal": true,
80
+ "escape": "close",
81
+ "outsidePress": "close",
82
+ "back": "close",
83
+ "initialFocus": "first",
84
+ "loading": false,
85
+ "fullscreenToggle": false
86
+ },
87
+ "fixed": {},
88
+ "capabilities": [
89
+ "open",
90
+ "size",
91
+ "appearance",
92
+ "placement",
93
+ "loading",
94
+ "wiring",
95
+ "fullscreen"
96
+ ],
97
+ "states": [
98
+ "default",
99
+ "hover",
100
+ "active",
101
+ "focus-visible",
102
+ "open",
103
+ "loading",
104
+ "fullscreen"
105
+ ],
106
+ "parts": [
107
+ "root",
108
+ "trigger",
109
+ "backdrop",
110
+ "viewport",
111
+ "content",
112
+ "header",
113
+ "title",
114
+ "description",
115
+ "body",
116
+ "footer",
117
+ "close",
118
+ "fullscreen"
119
+ ]
120
+ },
121
+ "alertDialog": {
122
+ "nativeElement": "div",
123
+ "role": "alertdialog",
124
+ "defaults": {
125
+ "size": "sm",
126
+ "placement": "center",
127
+ "scroll": "content",
128
+ "surface": "panel",
129
+ "mount": "active",
130
+ "fullScreen": "never",
131
+ "modal": true,
132
+ "escape": "close",
133
+ "outsidePress": "none",
134
+ "back": "close",
135
+ "initialFocus": "cancel",
136
+ "tone": "danger",
137
+ "loading": false
138
+ },
139
+ "fixed": {
140
+ "outsidePress": true,
141
+ "modal": true
142
+ },
143
+ "capabilities": [
144
+ "open",
145
+ "size",
146
+ "appearance",
147
+ "loading",
148
+ "wiring"
149
+ ],
150
+ "states": [
151
+ "default",
152
+ "hover",
153
+ "active",
154
+ "focus-visible",
155
+ "open",
156
+ "loading"
157
+ ],
158
+ "parts": [
159
+ "root",
160
+ "trigger",
161
+ "backdrop",
162
+ "viewport",
163
+ "content",
164
+ "header",
165
+ "icon",
166
+ "title",
167
+ "description",
168
+ "body",
169
+ "footer",
170
+ "cancel",
171
+ "action"
172
+ ]
173
+ }
174
+ },
175
+ "docs": {
176
+ "dialog": {
177
+ "imports": {
178
+ "source": "import { SlDialog, SlDialogBody, SlDialogClose, SlDialogDescription, SlDialogFooter, SlDialogHeader, SlDialogTitle, SlDialogTrigger, provideDialogDefaults } from '@slotted/angular/dialog';",
179
+ "selector": "sl-dialog, [slDialogTrigger], [slDialogHeader], [slDialogTitle], [slDialogDescription], [slDialogBody], [slDialogFooter], [slDialogClose]",
180
+ "exportAs": "slDialog, slDialogTrigger, slDialogHeader, slDialogTitle, slDialogClose"
181
+ },
182
+ "anatomy": [
183
+ {
184
+ "part": "root",
185
+ "element": "div, in a portal; the sl-dialog host stays where it is written",
186
+ "required": true,
187
+ "purpose": "The layer, fixed over the viewport. It carries data-ui=\"dialog\", one attribute per axis, data-open and data-loading, and a z-index of --slotted-z-index-overlay plus the depth of the layer stack, so a dialog opened over another sits above it. It is also the container that fullScreen=\"narrow\" measures, so full screen follows the width of the layer rather than the width of the window."
188
+ },
189
+ {
190
+ "part": "trigger",
191
+ "element": "your own element, with slDialogTrigger on it",
192
+ "required": false,
193
+ "purpose": "The control that opens the dialog. It stays where it is written while the layer is rendered in a portal, and carries aria-haspopup, aria-expanded and aria-controls. A press on it does not count as a press outside the dialog. On slButton, the element keeps the button’s data-part=\"root\"."
194
+ },
195
+ {
196
+ "part": "backdrop",
197
+ "element": "div",
198
+ "required": true,
199
+ "purpose": "The scrim behind the panel, painted from --slotted-scrim. It does not scroll. A non-modal dialog does not paint it and lets the pointer through to the page."
200
+ },
201
+ {
202
+ "part": "viewport",
203
+ "element": "div",
204
+ "required": true,
205
+ "purpose": "The box that positions the panel and, with scroll=\"viewport\", the box that scrolls. A panel taller than the layer aligns to the top edge, so its title stays on screen."
206
+ },
207
+ {
208
+ "part": "content",
209
+ "element": "div",
210
+ "required": true,
211
+ "purpose": "The panel. It carries role=\"dialog\" and, while modal, aria-modal=\"true\". It is a grid of three rows, header, body and footer, and only the body row shrinks, so the actions stay on screen when the body is long."
212
+ },
213
+ {
214
+ "part": "header",
215
+ "element": "your own header, with slDialogHeader on it",
216
+ "required": false,
217
+ "purpose": "Three columns: the mark, the words and the corner buttons. A title that wraps makes the row taller and never pushes the close button off the line. Any other content written in the header, such as a badge, is placed in the words column under the description."
218
+ },
219
+ {
220
+ "part": "title",
221
+ "element": "your own heading, with slDialogTitle on it",
222
+ "required": false,
223
+ "purpose": "The visible name of the dialog. The panel points aria-labelledby at it only while it is rendered."
224
+ },
225
+ {
226
+ "part": "description",
227
+ "element": "your own element, with slDialogDescription on it",
228
+ "required": false,
229
+ "purpose": "The sentence that says what the dialog is for. The panel points aria-describedby at it only while it is rendered. It is optional in sl-dialog and required in sl-alert-dialog."
230
+ },
231
+ {
232
+ "part": "body",
233
+ "element": "your own element, with slDialogBody on it",
234
+ "required": false,
235
+ "purpose": "The row that scrolls. It carries aria-busy while loading is set. Scrolling it to the end does not scroll the page behind a non-modal dialog."
236
+ },
237
+ {
238
+ "part": "footer",
239
+ "element": "your own footer, with slDialogFooter on it",
240
+ "required": false,
241
+ "purpose": "The actions: a row aligned to the end that wraps when the buttons do not fit, on the sunken surface. Each row of the panel draws the rule above itself, so a panel without a body draws one rule, not two."
242
+ },
243
+ {
244
+ "part": "close",
245
+ "element": "your own button, with slDialogClose on it",
246
+ "required": false,
247
+ "purpose": "The ✕ button. Its target is at least 24 by 24 pixels. It closes the dialog with the reason dismiss, carrying its value as the result."
248
+ },
249
+ {
250
+ "part": "fullscreen",
251
+ "element": "button",
252
+ "required": false,
253
+ "purpose": "The button that expands the panel to the whole layer and restores it, appended by slDialogHeader when fullscreenToggle is set. It sits before the close button, carries aria-pressed, and its mark shows what the next press does."
254
+ }
255
+ ],
256
+ "api": [
257
+ {
258
+ "name": "open",
259
+ "type": "boolean",
260
+ "defaultValue": "false",
261
+ "appliesTo": "sl-dialog, sl-alert-dialog",
262
+ "description": "Whether the dialog is open. A model: bind [(open)] to a signal, whose initial value is the starting state. (openChangeRequest) can refuse a change before it is written."
263
+ },
264
+ {
265
+ "name": "size",
266
+ "type": "'sm' | 'md' | 'lg' | 'xl' | 'full'",
267
+ "defaultValue": "md",
268
+ "appliesTo": "sl-dialog, provideDialogDefaults",
269
+ "description": "The maximum width of the panel: 24rem, 32rem, 42rem, 56rem, or the whole layer less its padding. For another width, set --slotted-dialog-measure."
270
+ },
271
+ {
272
+ "name": "placement",
273
+ "type": "'center' | 'top'",
274
+ "defaultValue": "center",
275
+ "appliesTo": "sl-dialog, sl-alert-dialog, provideDialogDefaults",
276
+ "description": "Where the panel sits in the layer. Use top for content that grows while the reader types, so the panel does not move with each new line."
277
+ },
278
+ {
279
+ "name": "scroll",
280
+ "type": "'content' | 'viewport'",
281
+ "defaultValue": "content",
282
+ "appliesTo": "sl-dialog, sl-alert-dialog, provideDialogDefaults",
283
+ "description": "What scrolls when the content is long. content keeps the panel inside the layer and scrolls the body, so the actions stay on screen; viewport lets the panel grow and scrolls the layer. With content, the layer still scrolls when the header and footer alone are taller than it."
284
+ },
285
+ {
286
+ "name": "mount",
287
+ "type": "'active' | 'lazy' | 'eager'",
288
+ "defaultValue": "active",
289
+ "appliesTo": "sl-dialog, sl-alert-dialog, provideDialogDefaults",
290
+ "description": "When the layer is in the document. active renders it while open and removes it after the closing animation, lazy renders it on the first open and keeps it, eager renders it from the start and hides it with content-visibility and inert while closed."
291
+ },
292
+ {
293
+ "name": "escape",
294
+ "type": "'close' | 'none'",
295
+ "defaultValue": "close",
296
+ "appliesTo": "sl-dialog, sl-alert-dialog, provideDialogDefaults",
297
+ "description": "Whether Escape asks the dialog to close. Escape reaches the topmost dialog only."
298
+ },
299
+ {
300
+ "name": "loading",
301
+ "type": "boolean",
302
+ "defaultValue": "false",
303
+ "appliesTo": "sl-dialog, sl-alert-dialog",
304
+ "description": "Marks the body with aria-busy and gives it a minimum height while the content is on its way. The header, the close button and Escape stay available."
305
+ },
306
+ {
307
+ "name": "messages",
308
+ "type": "Partial<DialogMessages>",
309
+ "defaultValue": "—",
310
+ "appliesTo": "sl-dialog, sl-alert-dialog",
311
+ "description": "Replaces words of the language in force, key by key: the accessible names of the close and full-screen buttons (close, fullScreen). An aria-label on slDialogClose takes precedence."
312
+ },
313
+ {
314
+ "name": "initialFocus",
315
+ "type": "'first' | 'container' | 'cancel' | HTMLElement | false",
316
+ "defaultValue": "first",
317
+ "appliesTo": "sl-dialog",
318
+ "description": "Where focus goes when the dialog opens: the first focusable element, the panel itself (container), the cancel part, an element such as a template reference to an input, or nowhere (false). Use container for content that is read before it is used, such as a list or a table."
319
+ },
320
+ {
321
+ "name": "finalFocus",
322
+ "type": "HTMLElement | false",
323
+ "defaultValue": "—",
324
+ "appliesTo": "sl-dialog, sl-alert-dialog",
325
+ "description": "Where focus goes when the dialog closes. Unset, focus returns to the element that had it when the dialog opened, usually the trigger. false leaves focus where it is."
326
+ },
327
+ {
328
+ "name": "value",
329
+ "type": "string",
330
+ "defaultValue": "—",
331
+ "appliesTo": "slDialogClose, slAlertDialogCancel, slAlertDialogAction",
332
+ "description": "The result this button closes the dialog with, read from request.result in (openChangeRequest) and from (closed). slAlertDialogCancel defaults to \"cancel\" and slAlertDialogAction to \"confirm\"."
333
+ },
334
+ {
335
+ "name": "modal",
336
+ "type": "boolean",
337
+ "defaultValue": "true",
338
+ "appliesTo": "sl-dialog, provideDialogDefaults",
339
+ "description": "Whether the page behind is inert, its scroll locked and focus kept inside the panel. false does none of this, paints no scrim, lets the pointer reach the page and writes no aria-modal."
340
+ },
341
+ {
342
+ "name": "outsidePress",
343
+ "type": "'close' | 'none'",
344
+ "defaultValue": "close",
345
+ "appliesTo": "sl-dialog, provideDialogDefaults",
346
+ "description": "Whether a press outside the panel asks the dialog to close. sl-alert-dialog fixes it at none."
347
+ },
348
+ {
349
+ "name": "back",
350
+ "type": "'close' | 'none'",
351
+ "defaultValue": "close",
352
+ "appliesTo": "sl-dialog, provideDialogDefaults",
353
+ "description": "Whether the browser’s way back, a back button or a phone’s back gesture, closes a modal dialog instead of leaving the page. Each open modal dialog adds one history entry, and the close request carries the reason back."
354
+ },
355
+ {
356
+ "name": "surface",
357
+ "type": "'panel' | 'plain'",
358
+ "defaultValue": "panel",
359
+ "appliesTo": "sl-dialog, provideDialogDefaults",
360
+ "description": "Whether sl-dialog paints the panel. plain removes the background, border, radius, shadow, rows and padding, and keeps the portal, the scrim, focus handling and the dismissal policy, for a panel of your own such as a slCard or an image viewer. A plain panel does not keep its footer on screen for a long body."
361
+ },
362
+ {
363
+ "name": "fullScreen",
364
+ "type": "'never' | 'narrow' | 'always'",
365
+ "defaultValue": "narrow",
366
+ "appliesTo": "sl-dialog, provideDialogDefaults",
367
+ "description": "When the panel fills the whole layer, without margins or radius. narrow does so while the layer is narrower than 480 pixels, measured with a container query on the layer."
368
+ },
369
+ {
370
+ "name": "fullscreenToggle",
371
+ "type": "boolean",
372
+ "defaultValue": "false",
373
+ "appliesTo": "sl-dialog",
374
+ "description": "Adds a button to slDialogHeader that expands the panel to the whole layer and restores it, for content the reader wants more room for."
375
+ },
376
+ {
377
+ "name": "fullscreen",
378
+ "type": "boolean",
379
+ "defaultValue": "false",
380
+ "appliesTo": "sl-dialog",
381
+ "description": "Whether the panel is expanded by the toggle. A model: bind [(fullscreen)] to a signal, whose initial value is the starting state."
382
+ }
383
+ ],
384
+ "composition": [
385
+ {
386
+ "name": "directives on your own elements",
387
+ "type": "attribute selector",
388
+ "defaultValue": "—",
389
+ "appliesTo": "slDialogTrigger, slDialogHeader, slDialogTitle, slDialogDescription, slDialogBody, slDialogFooter, slDialogClose, slAlertDialogIcon, slAlertDialogCancel, slAlertDialogAction",
390
+ "description": "Every part except the layer is a directive on an element you write, so the trigger, the cancel and the action can be a slButton."
391
+ },
392
+ {
393
+ "name": "exportAs",
394
+ "type": "'slDialog' | 'slAlertDialog'",
395
+ "defaultValue": "—",
396
+ "appliesTo": "sl-dialog, sl-alert-dialog",
397
+ "description": "A template reference variable reaches the instance. [slDialogTrigger]=\"dialog\" links a trigger to it from anywhere in the same template."
398
+ },
399
+ {
400
+ "name": "openDialog(), close(result), focus()",
401
+ "type": "() => void",
402
+ "defaultValue": "—",
403
+ "appliesTo": "the instance",
404
+ "description": "Open the dialog, close it with a result, or move focus into the panel, from the template or from code. There is no service that opens a component as a dialog: render sl-dialog in the template, under @if when it should exist only while open."
405
+ },
406
+ {
407
+ "name": "--slotted-dialog-measure",
408
+ "type": "length",
409
+ "defaultValue": "from size",
410
+ "appliesTo": "the root part",
411
+ "description": "The maximum width of the panel, for a width the five sizes do not hold, such as a two-column form at 46rem. Set it with a style attribute on one dialog, with a rule for a region, or once in the theme. It takes precedence over size."
412
+ },
413
+ {
414
+ "name": "container",
415
+ "type": "Element | null",
416
+ "defaultValue": "—",
417
+ "appliesTo": "sl-dialog, sl-alert-dialog",
418
+ "description": "The element this dialog is rendered into, instead of the shared portal root. The layer takes the theme, scheme, density and direction of the place where sl-dialog is written, with or without a trigger."
419
+ },
420
+ {
421
+ "name": "provideDialogDefaults()",
422
+ "type": "{ size, placement, scroll, surface, mount, fullScreen, modal, escape, outsidePress, back }",
423
+ "defaultValue": "—",
424
+ "appliesTo": "an injector",
425
+ "description": "Sets these ten values once for every dialog under the injector, through DIALOG_DEFAULTS. A value set on one dialog takes precedence."
426
+ }
427
+ ],
428
+ "events": [
429
+ {
430
+ "name": "(openChangeRequest)",
431
+ "payload": "DialogChangeRequest",
432
+ "when": "Before the dialog opens or closes, whatever caused it. The request carries the new value, the previous value, the reason (pointer, keyboard, dismiss, escape, outsidePress, back, submit or programmatic), the result of the close, the originating event, and cancel(), which keeps the dialog as it is. One handler therefore guards the ✕, Escape, a press outside, the way back and close() together."
433
+ },
434
+ {
435
+ "name": "(openChange)",
436
+ "payload": "boolean",
437
+ "when": "After the open state changed, so a template can bind [(open)]. It carries the new state only; the reason is on (openChangeRequest)."
438
+ },
439
+ {
440
+ "name": "(fullscreenChangeRequest)",
441
+ "payload": "DialogFullscreenRequest",
442
+ "when": "Before the panel expands to the whole layer or is restored. The request carries the new value, the previous value, the reason (pointer, keyboard or programmatic), the originating event, and cancel(), which keeps the panel as it is."
443
+ },
444
+ {
445
+ "name": "(fullscreenChange)",
446
+ "payload": "boolean",
447
+ "when": "After the expanded state changed, so a template can bind [(fullscreen)]."
448
+ },
449
+ {
450
+ "name": "(closed)",
451
+ "payload": "string | undefined",
452
+ "when": "Once the dialog has closed, with the result of the close: the value of the button that closed it, the argument of close(result), or undefined."
453
+ }
454
+ ],
455
+ "accessibility": [
456
+ "sl-dialog follows the WAI-ARIA dialog (modal) pattern. While a modal dialog is open, Tab and Shift+Tab move through the focusable elements inside it and wrap from the last to the first and back. Escape closes the topmost dialog only; a dialog that refuses the close keeps the Escape from reaching the dialog beneath it.",
457
+ "The panel carries role=\"dialog\", aria-labelledby pointing at the title and aria-describedby pointing at the description, each only while that part is rendered. An aria-label of your own on sl-dialog moves to the panel and replaces aria-labelledby.",
458
+ "aria-modal=\"true\" is written only while the dialog is modal. A modal dialog makes everything outside it inert, which removes the page from the accessibility tree and from the pointer, and locks the page scroll. [modal]=\"false\" does none of this and writes no aria-modal.",
459
+ "When the dialog opens, focus moves to its first focusable element, to the element initialFocus names, or to the panel itself with initialFocus=\"container\", for content that is read before it is used. When it closes, focus returns to the element that had it when the dialog opened, or to the element finalFocus names. If that element has left the document, focus goes to its nearest ancestor still in the document.",
460
+ "Containment, inertness and Escape are implemented in JavaScript rather than with the native dialog element, so every overlay of the library shares one stacking order: a select opened inside a dialog paints above it. Without JavaScript, there is no dialog.",
461
+ "The close button’s target is at least 24 by 24 pixels, and its mark is drawn from a glyph, not a character.",
462
+ "The panel has a border as well as a shadow, so its edge stays visible under forced colours, where shadows are removed and the scrim becomes opaque."
463
+ ]
464
+ },
465
+ "alertDialog": {
466
+ "imports": {
467
+ "source": "import { SlAlertDialog, SlAlertDialogAction, SlAlertDialogCancel, SlAlertDialogIcon, SlDialogBody, SlDialogDescription, SlDialogFooter, SlDialogHeader, SlDialogTitle, SlDialogTrigger } from '@slotted/angular/dialog';",
468
+ "selector": "sl-alert-dialog, [slDialogTrigger], [slAlertDialogIcon], [slAlertDialogCancel], [slAlertDialogAction]",
469
+ "exportAs": "slAlertDialog, slAlertDialogCancel, slAlertDialogAction"
470
+ },
471
+ "anatomy": [
472
+ {
473
+ "part": "root",
474
+ "element": "div, in a portal; the sl-dialog host stays where it is written",
475
+ "required": true,
476
+ "purpose": "The layer, fixed over the viewport. It carries data-ui=\"dialog\", one attribute per axis, data-open and data-loading, and a z-index of --slotted-z-index-overlay plus the depth of the layer stack, so a dialog opened over another sits above it. It is also the container that fullScreen=\"narrow\" measures, so full screen follows the width of the layer rather than the width of the window."
477
+ },
478
+ {
479
+ "part": "trigger",
480
+ "element": "your own element, with slDialogTrigger on it",
481
+ "required": false,
482
+ "purpose": "The control that opens the dialog. It stays where it is written while the layer is rendered in a portal, and carries aria-haspopup, aria-expanded and aria-controls. A press on it does not count as a press outside the dialog. On slButton, the element keeps the button’s data-part=\"root\"."
483
+ },
484
+ {
485
+ "part": "backdrop",
486
+ "element": "div",
487
+ "required": true,
488
+ "purpose": "The scrim behind the panel, painted from --slotted-scrim. It does not scroll. A non-modal dialog does not paint it and lets the pointer through to the page."
489
+ },
490
+ {
491
+ "part": "viewport",
492
+ "element": "div",
493
+ "required": true,
494
+ "purpose": "The box that positions the panel and, with scroll=\"viewport\", the box that scrolls. A panel taller than the layer aligns to the top edge, so its title stays on screen."
495
+ },
496
+ {
497
+ "part": "content",
498
+ "element": "div",
499
+ "required": true,
500
+ "purpose": "The panel. It carries role=\"alertdialog\" and, while modal, aria-modal=\"true\". It is a grid of three rows, header, body and footer, and only the body row shrinks, so the actions stay on screen when the body is long."
501
+ },
502
+ {
503
+ "part": "header",
504
+ "element": "your own header, with slDialogHeader on it",
505
+ "required": false,
506
+ "purpose": "Three columns: the mark, the words and the corner buttons. A title that wraps makes the row taller and never pushes the close button off the line. Any other content written in the header, such as a badge, is placed in the words column under the description."
507
+ },
508
+ {
509
+ "part": "title",
510
+ "element": "your own heading, with slDialogTitle on it",
511
+ "required": false,
512
+ "purpose": "The visible name of the dialog. The panel points aria-labelledby at it only while it is rendered."
513
+ },
514
+ {
515
+ "part": "description",
516
+ "element": "your own element, with slDialogDescription on it",
517
+ "required": true,
518
+ "purpose": "The sentence that says what is about to happen. Required: the alertdialog pattern makes aria-describedby mandatory, and sl-alert-dialog throws an error when it is missing."
519
+ },
520
+ {
521
+ "part": "body",
522
+ "element": "your own element, with slDialogBody on it",
523
+ "required": false,
524
+ "purpose": "The row that scrolls. It carries aria-busy while loading is set. Scrolling it to the end does not scroll the page behind a non-modal dialog."
525
+ },
526
+ {
527
+ "part": "footer",
528
+ "element": "your own footer, with slDialogFooter on it",
529
+ "required": false,
530
+ "purpose": "The actions: a row aligned to the end that wraps when the buttons do not fit, on the sunken surface. Each row of the panel draws the rule above itself, so a panel without a body draws one rule, not two."
531
+ },
532
+ {
533
+ "part": "icon",
534
+ "element": "your own element, with slAlertDialogIcon on it",
535
+ "required": false,
536
+ "purpose": "The mark of the tone, drawn from a glyph, so the kind of decision does not depend on colour alone. Under forced colours it is the only signal of the tone."
537
+ },
538
+ {
539
+ "part": "cancel",
540
+ "element": "your own button, with slAlertDialogCancel on it",
541
+ "required": true,
542
+ "purpose": "The least destructive answer, and where focus lands when the dialog opens. It closes with the reason dismiss and the result \"cancel\". On slButton, the element keeps the button’s data-part=\"root\"."
543
+ },
544
+ {
545
+ "part": "action",
546
+ "element": "your own button, with slAlertDialogAction on it",
547
+ "required": true,
548
+ "purpose": "The action being confirmed. It closes with the reason submit and the result \"confirm\". On slButton, the element keeps the button’s data-part=\"root\"."
549
+ }
550
+ ],
551
+ "api": [
552
+ {
553
+ "name": "open",
554
+ "type": "boolean",
555
+ "defaultValue": "false",
556
+ "appliesTo": "sl-dialog, sl-alert-dialog",
557
+ "description": "Whether the dialog is open. A model: bind [(open)] to a signal, whose initial value is the starting state. (openChangeRequest) can refuse a change before it is written."
558
+ },
559
+ {
560
+ "name": "size",
561
+ "type": "'sm' | 'md' | 'lg' | 'xl' | 'full'",
562
+ "defaultValue": "sm",
563
+ "appliesTo": "sl-alert-dialog",
564
+ "description": "The maximum width of the panel. sl-alert-dialog defaults to sm, 24rem."
565
+ },
566
+ {
567
+ "name": "placement",
568
+ "type": "'center' | 'top'",
569
+ "defaultValue": "center",
570
+ "appliesTo": "sl-dialog, sl-alert-dialog, provideDialogDefaults",
571
+ "description": "Where the panel sits in the layer. Use top for content that grows while the reader types, so the panel does not move with each new line."
572
+ },
573
+ {
574
+ "name": "scroll",
575
+ "type": "'content' | 'viewport'",
576
+ "defaultValue": "content",
577
+ "appliesTo": "sl-dialog, sl-alert-dialog, provideDialogDefaults",
578
+ "description": "What scrolls when the content is long. content keeps the panel inside the layer and scrolls the body, so the actions stay on screen; viewport lets the panel grow and scrolls the layer. With content, the layer still scrolls when the header and footer alone are taller than it."
579
+ },
580
+ {
581
+ "name": "mount",
582
+ "type": "'active' | 'lazy' | 'eager'",
583
+ "defaultValue": "active",
584
+ "appliesTo": "sl-dialog, sl-alert-dialog, provideDialogDefaults",
585
+ "description": "When the layer is in the document. active renders it while open and removes it after the closing animation, lazy renders it on the first open and keeps it, eager renders it from the start and hides it with content-visibility and inert while closed."
586
+ },
587
+ {
588
+ "name": "escape",
589
+ "type": "'close' | 'none'",
590
+ "defaultValue": "close",
591
+ "appliesTo": "sl-dialog, sl-alert-dialog, provideDialogDefaults",
592
+ "description": "Whether Escape asks the dialog to close. Escape reaches the topmost dialog only."
593
+ },
594
+ {
595
+ "name": "loading",
596
+ "type": "boolean",
597
+ "defaultValue": "false",
598
+ "appliesTo": "sl-dialog, sl-alert-dialog",
599
+ "description": "Marks the body with aria-busy and gives it a minimum height while the content is on its way. The header, the close button and Escape stay available."
600
+ },
601
+ {
602
+ "name": "messages",
603
+ "type": "Partial<DialogMessages>",
604
+ "defaultValue": "—",
605
+ "appliesTo": "sl-dialog, sl-alert-dialog",
606
+ "description": "Replaces words of the language in force, key by key: the accessible names of the close and full-screen buttons (close, fullScreen). An aria-label on slDialogClose takes precedence."
607
+ },
608
+ {
609
+ "name": "initialFocus",
610
+ "type": "'first' | 'container' | 'cancel' | HTMLElement | false",
611
+ "defaultValue": "cancel",
612
+ "appliesTo": "sl-alert-dialog",
613
+ "description": "Where focus goes when the dialog opens. The default, cancel, is the least destructive answer."
614
+ },
615
+ {
616
+ "name": "finalFocus",
617
+ "type": "HTMLElement | false",
618
+ "defaultValue": "—",
619
+ "appliesTo": "sl-dialog, sl-alert-dialog",
620
+ "description": "Where focus goes when the dialog closes. Unset, focus returns to the element that had it when the dialog opened, usually the trigger. false leaves focus where it is."
621
+ },
622
+ {
623
+ "name": "value",
624
+ "type": "string",
625
+ "defaultValue": "—",
626
+ "appliesTo": "slDialogClose, slAlertDialogCancel, slAlertDialogAction",
627
+ "description": "The result this button closes the dialog with, read from request.result in (openChangeRequest) and from (closed). slAlertDialogCancel defaults to \"cancel\" and slAlertDialogAction to \"confirm\"."
628
+ },
629
+ {
630
+ "name": "tone",
631
+ "type": "'accent' | 'secondary' | 'success' | 'warning' | 'danger'",
632
+ "defaultValue": "danger",
633
+ "appliesTo": "sl-alert-dialog",
634
+ "description": "The kind of decision. It sets the mark slAlertDialogIcon draws and its colour."
635
+ },
636
+ {
637
+ "name": "modal",
638
+ "type": "boolean",
639
+ "defaultValue": "true",
640
+ "appliesTo": "sl-alert-dialog",
641
+ "description": "Fixed: an alert dialog is always modal."
642
+ },
643
+ {
644
+ "name": "outsidePress",
645
+ "type": "'close' | 'none'",
646
+ "defaultValue": "none",
647
+ "appliesTo": "sl-alert-dialog",
648
+ "description": "Fixed: a press outside never closes an alert dialog."
649
+ },
650
+ {
651
+ "name": "back",
652
+ "type": "'close' | 'none'",
653
+ "defaultValue": "close",
654
+ "appliesTo": "sl-alert-dialog",
655
+ "description": "Whether the browser’s way back cancels the confirmation, as Escape does. The close request carries the reason back."
656
+ },
657
+ {
658
+ "name": "surface",
659
+ "type": "'panel' | 'plain'",
660
+ "defaultValue": "panel",
661
+ "appliesTo": "sl-alert-dialog",
662
+ "description": "Whether sl-alert-dialog paints the panel. plain removes the paint and keeps the behaviour."
663
+ },
664
+ {
665
+ "name": "fullScreen",
666
+ "type": "'never' | 'narrow' | 'always'",
667
+ "defaultValue": "never",
668
+ "appliesTo": "sl-alert-dialog",
669
+ "description": "When the panel fills the whole layer. sl-alert-dialog keeps its margins at every width by default."
670
+ }
671
+ ],
672
+ "composition": [
673
+ {
674
+ "name": "directives on your own elements",
675
+ "type": "attribute selector",
676
+ "defaultValue": "—",
677
+ "appliesTo": "slDialogTrigger, slDialogHeader, slDialogTitle, slDialogDescription, slDialogBody, slDialogFooter, slDialogClose, slAlertDialogIcon, slAlertDialogCancel, slAlertDialogAction",
678
+ "description": "Every part except the layer is a directive on an element you write, so the trigger, the cancel and the action can be a slButton."
679
+ },
680
+ {
681
+ "name": "exportAs",
682
+ "type": "'slDialog' | 'slAlertDialog'",
683
+ "defaultValue": "—",
684
+ "appliesTo": "sl-dialog, sl-alert-dialog",
685
+ "description": "A template reference variable reaches the instance. [slDialogTrigger]=\"dialog\" links a trigger to it from anywhere in the same template."
686
+ },
687
+ {
688
+ "name": "openDialog(), close(result), focus()",
689
+ "type": "() => void",
690
+ "defaultValue": "—",
691
+ "appliesTo": "the instance",
692
+ "description": "Open the dialog, close it with a result, or move focus into the panel, from the template or from code. There is no service that opens a component as a dialog: render sl-dialog in the template, under @if when it should exist only while open."
693
+ },
694
+ {
695
+ "name": "--slotted-dialog-measure",
696
+ "type": "length",
697
+ "defaultValue": "from size",
698
+ "appliesTo": "the root part",
699
+ "description": "The maximum width of the panel, for a width the five sizes do not hold, such as a two-column form at 46rem. Set it with a style attribute on one dialog, with a rule for a region, or once in the theme. It takes precedence over size."
700
+ },
701
+ {
702
+ "name": "container",
703
+ "type": "Element | null",
704
+ "defaultValue": "—",
705
+ "appliesTo": "sl-dialog, sl-alert-dialog",
706
+ "description": "The element this dialog is rendered into, instead of the shared portal root. The layer takes the theme, scheme, density and direction of the place where sl-dialog is written, with or without a trigger."
707
+ },
708
+ {
709
+ "name": "provideDialogDefaults()",
710
+ "type": "{ size, placement, scroll, surface, mount, fullScreen, modal, escape, outsidePress, back }",
711
+ "defaultValue": "—",
712
+ "appliesTo": "an injector",
713
+ "description": "Sets these ten values once for every dialog under the injector, through DIALOG_DEFAULTS. A value set on one dialog takes precedence."
714
+ }
715
+ ],
716
+ "events": [
717
+ {
718
+ "name": "(openChangeRequest)",
719
+ "payload": "DialogChangeRequest",
720
+ "when": "Before the dialog opens or closes, whatever caused it. The request carries the new value, the previous value, the reason (pointer, keyboard, dismiss, escape, outsidePress, back, submit or programmatic), the result of the close, the originating event, and cancel(), which keeps the dialog as it is. One handler therefore guards the ✕, Escape, a press outside, the way back and close() together."
721
+ },
722
+ {
723
+ "name": "(openChange)",
724
+ "payload": "boolean",
725
+ "when": "After the open state changed, so a template can bind [(open)]. It carries the new state only; the reason is on (openChangeRequest)."
726
+ },
727
+ {
728
+ "name": "(fullscreenChangeRequest)",
729
+ "payload": "DialogFullscreenRequest",
730
+ "when": "Before the panel expands to the whole layer or is restored. The request carries the new value, the previous value, the reason (pointer, keyboard or programmatic), the originating event, and cancel(), which keeps the panel as it is."
731
+ },
732
+ {
733
+ "name": "(fullscreenChange)",
734
+ "payload": "boolean",
735
+ "when": "After the expanded state changed, so a template can bind [(fullscreen)]."
736
+ },
737
+ {
738
+ "name": "(closed)",
739
+ "payload": "string | undefined",
740
+ "when": "Once the dialog has closed, with the result of the close: the value of the button that closed it, the argument of close(result), or undefined."
741
+ }
742
+ ],
743
+ "accessibility": [
744
+ "sl-alert-dialog follows the WAI-ARIA alert dialog pattern: the modal dialog pattern with role=\"alertdialog\" and a required description. The keyboard is the same: Tab and Shift+Tab wrap inside the panel, and Escape closes it.",
745
+ "aria-describedby is required. sl-alert-dialog throws an error when no slDialogDescription is rendered while it is open, so a confirmation is never announced without the sentence that says what it does.",
746
+ "Focus starts on slAlertDialogCancel, the least destructive answer, as the pattern advises for a step that cannot be undone easily.",
747
+ "A press outside never closes an alert dialog, and it is always modal. Escape closes it, which answers with the cancel; set escape=\"none\" when cancelling is not safe either.",
748
+ "There is no close part: the reader answers with the cancel or the action. slDialogClose inside sl-alert-dialog throws an error.",
749
+ "The tone is carried by the icon’s shape as well as by its colour, so it survives forced colours and readers who cannot tell the colours apart."
750
+ ]
751
+ }
752
+ },
753
+ "tokens": [
754
+ "--slotted-border-subtle",
755
+ "--slotted-border-width-thick",
756
+ "--slotted-border-width-thin",
757
+ "--slotted-control-font-family",
758
+ "--slotted-control-icon-size-lg",
759
+ "--slotted-control-inner-size-lg",
760
+ "--slotted-control-radius",
761
+ "--slotted-control-transition-duration",
762
+ "--slotted-control-transition-easing",
763
+ "--slotted-dialog-body-color",
764
+ "--slotted-dialog-border-color",
765
+ "--slotted-dialog-close-active-background",
766
+ "--slotted-dialog-close-color",
767
+ "--slotted-dialog-close-hover-background",
768
+ "--slotted-dialog-color",
769
+ "--slotted-dialog-description-color",
770
+ "--slotted-dialog-footer-surface",
771
+ "--slotted-dialog-measure",
772
+ "--slotted-dialog-radius",
773
+ "--slotted-dialog-rule-color",
774
+ "--slotted-dialog-scrim",
775
+ "--slotted-dialog-surface",
776
+ "--slotted-dialog-title-color",
777
+ "--slotted-dialog-title-font-family",
778
+ "--slotted-duration-long",
779
+ "--slotted-duration-medium",
780
+ "--slotted-duration-short",
781
+ "--slotted-easing-exit",
782
+ "--slotted-easing-standard",
783
+ "--slotted-focus-ring-color",
784
+ "--slotted-focus-ring-offset",
785
+ "--slotted-focus-ring-width",
786
+ "--slotted-font-family-heading",
787
+ "--slotted-font-family-sans",
788
+ "--slotted-font-size-lg",
789
+ "--slotted-font-size-md",
790
+ "--slotted-font-size-xl",
791
+ "--slotted-font-weight-semibold",
792
+ "--slotted-line-height-md",
793
+ "--slotted-radius-lg",
794
+ "--slotted-radius-sm",
795
+ "--slotted-scrim",
796
+ "--slotted-shadow-lg",
797
+ "--slotted-space-12",
798
+ "--slotted-space-2",
799
+ "--slotted-space-4",
800
+ "--slotted-space-5",
801
+ "--slotted-space-6",
802
+ "--slotted-space-7",
803
+ "--slotted-space-8",
804
+ "--slotted-surface-raised",
805
+ "--slotted-surface-sunken",
806
+ "--slotted-target-comfortable",
807
+ "--slotted-target-min",
808
+ "--slotted-text",
809
+ "--slotted-text-muted",
810
+ "--slotted-tone-accent-text",
811
+ "--slotted-tone-danger-text",
812
+ "--slotted-tone-secondary-subtle-active",
813
+ "--slotted-tone-secondary-subtle-hover",
814
+ "--slotted-tone-secondary-text",
815
+ "--slotted-tone-success-text",
816
+ "--slotted-tone-warning-text",
817
+ "--slotted-z-index-overlay"
818
+ ],
819
+ "examples": [
820
+ {
821
+ "id": "playground",
822
+ "title": "Playground",
823
+ "note": "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.",
824
+ "language": "html",
825
+ "source": "<button slButton [slDialogTrigger]=\"d\">Edit project</button>\n<sl-dialog #d=\"slDialog\" [(open)]=\"open\">\n <header slDialogHeader>\n <h2 slDialogTitle>Edit project</h2>\n <p slDialogDescription>The name is visible to the whole space.</p>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <input slTextField aria-label=\"Name\" value=\"Home page redesign\" />\n </div>\n <footer slDialogFooter>\n <button slButton variant=\"ghost\" tone=\"secondary\">Cancel</button>\n <button slButton>Save</button>\n </footer>\n</sl-dialog>\n",
826
+ "verdict": "excerpt"
827
+ },
828
+ {
829
+ "id": "sizes",
830
+ "title": "How wide the panel is allowed to be",
831
+ "note": "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.",
832
+ "language": "ts",
833
+ "source": "import { Component } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n type DialogSize,\n} from '@slotted/angular/dialog';\nimport { SlInline } from '@slotted/angular/inline';\nimport { SlText } from '@slotted/angular/typography';\n\nconst SIZES: { size: DialogSize; title: string; body: string }[] = [\n {\n size: 'sm',\n title: 'Rename warehouse',\n body: 'Small, 24rem: one field or one question.',\n },\n {\n size: 'md',\n title: 'Edit customer',\n body: 'Medium, 32rem, the default: a short form of one column.',\n },\n {\n size: 'lg',\n title: 'Invoice INV-2041',\n body: 'Large, 42rem: a record with a table of line items.',\n },\n {\n size: 'xl',\n title: 'Compare price lists',\n body: 'Extra large, 56rem: two columns side by side.',\n },\n {\n size: 'full',\n title: 'Shipment manifest',\n body: 'Full: the whole layer less its padding, for a document.',\n },\n];\n\n@Component({\n selector: 'app-dialog-sizes',\n imports: [\n SlButton,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlInline,\n SlText,\n ],\n template: `\n <div slInline [gap]=\"2\">\n @for (option of sizes; track option.size) {\n <button slButton tone=\"secondary\" variant=\"outline\" [slDialogTrigger]=\"dialog\">\n {{ option.size }}\n </button>\n <sl-dialog #dialog=\"slDialog\" [size]=\"option.size\">\n <header slDialogHeader>\n <h2 slDialogTitle>{{ option.title }}</h2>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <span slText size=\"sm\">{{ option.body }}</span>\n </div>\n </sl-dialog>\n }\n </div>\n `,\n})\nexport class DialogSizes {\n readonly sizes = SIZES;\n}\n",
834
+ "verdict": "example"
835
+ },
836
+ {
837
+ "id": "placement",
838
+ "title": "Where the panel sits in the layer",
839
+ "note": "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.",
840
+ "language": "ts",
841
+ "source": "import { Component, signal } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n} from '@slotted/angular/dialog';\nimport { SlField, SlFieldLabel } from '@slotted/angular/field';\nimport { SlTextarea } from '@slotted/angular/textarea';\n\n@Component({\n selector: 'app-dialog-placement',\n imports: [\n SlButton,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlField,\n SlFieldLabel,\n SlTextarea,\n ],\n template: `\n <button slButton tone=\"secondary\" variant=\"outline\" [slDialogTrigger]=\"dialog\">\n Add a note\n </button>\n <sl-dialog #dialog=\"slDialog\" placement=\"top\" [(open)]=\"open\">\n <header slDialogHeader>\n <h2 slDialogTitle>Note on order SO-1182</h2>\n <p slDialogDescription>The warehouse team sees the note on the pick list.</p>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <div slField>\n <label slFieldLabel>Note</label>\n <textarea\n slTextarea\n [rows]=\"3\"\n [maxRows]=\"12\"\n placeholder=\"Leave at the loading dock after 2 pm.\"\n ></textarea>\n </div>\n </div>\n <footer slDialogFooter>\n <button slButton variant=\"ghost\" tone=\"secondary\" (click)=\"open.set(false)\">Cancel</button>\n <button slButton (click)=\"open.set(false)\">Add note</button>\n </footer>\n </sl-dialog>\n `,\n})\nexport class DialogPlacement {\n readonly open = signal(false);\n}\n",
842
+ "verdict": "example"
843
+ },
844
+ {
845
+ "id": "scroll",
846
+ "title": "What scrolls when the content is long",
847
+ "note": "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.",
848
+ "language": "ts",
849
+ "source": "import { Component, signal } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n} from '@slotted/angular/dialog';\nimport { SlInline } from '@slotted/angular/inline';\nimport { SlStack } from '@slotted/angular/stack';\nimport { SlText } from '@slotted/angular/typography';\n\nconst ITEMS = Array.from({ length: 24 }, (_, index) => ({\n sku: `NW-${String(4100 + index * 7)}`,\n name: [\n 'Chai, 10 boxes',\n 'Aniseed syrup, 12 bottles',\n 'Cajun seasoning, 48 jars',\n 'Olive oil, 36 bottles',\n 'Dried pears, 12 packs',\n 'Curry sauce, 12 jars',\n ][index % 6],\n}));\n\nconst TERMS = [\n 'Prices are in US dollars and exclude sales tax, which is added at the rate of the delivery address.',\n 'Payment is due 30 days from the invoice date. Balances unpaid after 45 days accrue interest at 1% a month.',\n 'Goods travel at the risk of Northwind Traders until they are signed for at the delivery address.',\n 'Damaged goods are reported within 5 business days of delivery, with photos of the packaging and the label.',\n 'Returns of undamaged goods are accepted within 30 days and are refunded less a 10% restocking fee.',\n 'Orders above $5,000 may be split into several shipments, each invoiced when it leaves the warehouse.',\n 'Either party may end a standing order with 14 days of written notice; shipments already picked are invoiced.',\n 'These terms are governed by the law of the State of Washington.',\n];\n\n@Component({\n selector: 'app-dialog-scroll',\n imports: [\n SlButton,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlInline,\n SlStack,\n SlText,\n ],\n template: `\n <div slInline [gap]=\"2\">\n <button slButton tone=\"secondary\" variant=\"outline\" [slDialogTrigger]=\"items\">\n Review 24 line items\n </button>\n <sl-dialog #items=\"slDialog\" [(open)]=\"open\">\n <header slDialogHeader>\n <h2 slDialogTitle>Purchase order PO-7730</h2>\n <p slDialogDescription>Only the list scrolls; the actions stay in view.</p>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <div slStack [gap]=\"2\">\n @for (item of lineItems; track item.sku) {\n <div slInline [gap]=\"3\" justify=\"between\">\n <span slText size=\"sm\">{{ item.name }}</span>\n <span slText size=\"sm\" tone=\"muted\">{{ item.sku }}</span>\n </div>\n }\n </div>\n </div>\n <footer slDialogFooter>\n <button slButton variant=\"ghost\" tone=\"secondary\" (click)=\"open.set(false)\">\n Cancel\n </button>\n <button slButton (click)=\"open.set(false)\">Approve order</button>\n </footer>\n </sl-dialog>\n <button slButton tone=\"secondary\" variant=\"outline\" [slDialogTrigger]=\"terms\">\n Read the terms of sale\n </button>\n <sl-dialog #terms=\"slDialog\" scroll=\"viewport\">\n <header slDialogHeader>\n <h2 slDialogTitle>Terms of sale</h2>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <div slStack [gap]=\"4\">\n @for (term of termsOfSale; track term) {\n <span slText>{{ term }}</span>\n }\n </div>\n </div>\n </sl-dialog>\n </div>\n `,\n})\nexport class DialogScroll {\n readonly open = signal(false);\n readonly lineItems = ITEMS;\n readonly termsOfSale = TERMS;\n}\n",
850
+ "verdict": "example"
851
+ },
852
+ {
853
+ "id": "surface",
854
+ "title": "The layer, around a box you painted",
855
+ "note": "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.",
856
+ "language": "html",
857
+ "source": "<sl-dialog surface=\"plain\" [(open)]=\"open\">\n <div slCard fill=\"elevated\">\n <h2 slDialogTitle>A card, inside the layer</h2>\n <p slDialogDescription>The family paints nothing here.</p>\n </div>\n</sl-dialog>\n",
858
+ "verdict": "excerpt"
859
+ },
860
+ {
861
+ "id": "fullScreen",
862
+ "title": "Taking the whole layer on a narrow one",
863
+ "note": "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.",
864
+ "language": "html",
865
+ "source": "<sl-dialog fullScreen=\"always\" [(open)]=\"open\">…</sl-dialog>\n",
866
+ "verdict": "excerpt"
867
+ },
868
+ {
869
+ "id": "modal",
870
+ "title": "A layer the page behind can still be used",
871
+ "note": "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.",
872
+ "language": "html",
873
+ "source": "<sl-dialog [modal]=\"false\" [(open)]=\"open\">…</sl-dialog>\n",
874
+ "verdict": "excerpt"
875
+ },
876
+ {
877
+ "id": "policy",
878
+ "title": "Refusing a close, and refusing it once",
879
+ "note": "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.",
880
+ "language": "html",
881
+ "source": "<sl-dialog [(open)]=\"open\" (openChangeRequest)=\"refuseWhileSaving($event)\">…</sl-dialog>\n",
882
+ "verdict": "excerpt"
883
+ },
884
+ {
885
+ "id": "focus",
886
+ "title": "Where focus goes, and where it comes back to",
887
+ "note": "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.",
888
+ "language": "html",
889
+ "source": "<sl-dialog [initialFocus]=\"email\" [(open)]=\"open\">\n <div slDialogBody>\n <input #email slTextField aria-label=\"Email\" />\n </div>\n</sl-dialog>\n",
890
+ "verdict": "excerpt"
891
+ },
892
+ {
893
+ "id": "loading",
894
+ "title": "Open before the content arrived",
895
+ "note": "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.",
896
+ "language": "ts",
897
+ "source": "import { Component, effect, signal } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlDescriptionList,\n SlDescriptionListDescription,\n SlDescriptionListItem,\n SlDescriptionListTerm,\n} from '@slotted/angular/description-list';\nimport {\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n} from '@slotted/angular/dialog';\nimport { SlSkeleton, SlSkeletonRegion } from '@slotted/angular/skeleton';\n\ninterface Invoice {\n customer: string;\n issued: string;\n due: string;\n amount: string;\n}\n\nconst FIELDS: { key: keyof Invoice; term: string; width: string }[] = [\n { key: 'customer', term: 'Customer', width: '9rem' },\n { key: 'issued', term: 'Issued', width: '6rem' },\n { key: 'due', term: 'Due', width: '6rem' },\n { key: 'amount', term: 'Amount', width: '5rem' },\n];\n\n@Component({\n selector: 'app-dialog-loading',\n imports: [\n SlButton,\n SlDescriptionList,\n SlDescriptionListDescription,\n SlDescriptionListItem,\n SlDescriptionListTerm,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlSkeleton,\n SlSkeletonRegion,\n ],\n template: `\n <button slButton tone=\"secondary\" variant=\"outline\" [slDialogTrigger]=\"dialog\">\n View invoice INV-2041\n </button>\n <sl-dialog #dialog=\"slDialog\" [loading]=\"invoice() === null\" [(open)]=\"open\">\n <header slDialogHeader>\n <h2 slDialogTitle>Invoice INV-2041</h2>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <div\n slSkeletonRegion\n [delay]=\"200\"\n [loading]=\"invoice() === null\"\n [messages]=\"{ label: 'Loading invoice' }\"\n >\n <div slDescriptionList>\n @for (field of fields; track field.key) {\n <div slDescriptionListItem>\n <dt slDescriptionListTerm>{{ field.term }}</dt>\n <dd slDescriptionListDescription>\n @if (invoice(); as loaded) {\n {{ loaded[field.key] }}\n } @else {\n <span slSkeleton [inlineSize]=\"field.width\"></span>\n }\n </dd>\n </div>\n }\n </div>\n </div>\n </div>\n </sl-dialog>\n `,\n})\nexport class DialogLoading {\n readonly fields = FIELDS;\n readonly open = signal(false);\n readonly invoice = signal<Invoice | null>(null);\n\n constructor() {\n effect((onCleanup) => {\n if (!this.open()) return;\n this.invoice.set(null);\n const timer = setTimeout(\n () =>\n this.invoice.set({\n customer: 'Northwind Traders',\n issued: '12 August 2026',\n due: '11 September 2026',\n amount: '$1,240.00',\n }),\n 1200,\n );\n onCleanup(() => clearTimeout(timer));\n });\n }\n}\n",
898
+ "verdict": "example"
899
+ },
900
+ {
901
+ "id": "nested",
902
+ "title": "A layer opened from a layer",
903
+ "note": "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.",
904
+ "language": "ts",
905
+ "source": "import { Component, computed, signal } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlDescriptionList,\n SlDescriptionListDescription,\n SlDescriptionListItem,\n SlDescriptionListTerm,\n} from '@slotted/angular/description-list';\nimport {\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n} from '@slotted/angular/dialog';\nimport { SlField, SlFieldLabel } from '@slotted/angular/field';\nimport { SlSelect, SlSelectItem, type SelectSelection } from '@slotted/angular/select';\n\nconst CARRIERS = [\n { value: 'ups', label: 'UPS Ground' },\n { value: 'fedex', label: 'FedEx Ground' },\n { value: 'usps', label: 'USPS Priority Mail' },\n];\n\n@Component({\n selector: 'app-dialog-nested',\n imports: [\n SlButton,\n SlDescriptionList,\n SlDescriptionListDescription,\n SlDescriptionListItem,\n SlDescriptionListTerm,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlField,\n SlFieldLabel,\n SlSelect,\n SlSelectItem,\n ],\n template: `\n <button slButton tone=\"secondary\" variant=\"outline\" [slDialogTrigger]=\"order\">\n Open order SO-1182\n </button>\n <sl-dialog #order=\"slDialog\">\n <header slDialogHeader>\n <h2 slDialogTitle>Order SO-1182</h2>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <div slDescriptionList>\n <div slDescriptionListItem>\n <dt slDescriptionListTerm>Customer</dt>\n <dd slDescriptionListDescription>Contoso Foods</dd>\n </div>\n <div slDescriptionListItem>\n <dt slDescriptionListTerm>Carrier</dt>\n <dd slDescriptionListDescription>{{ carrierLabel() }}</dd>\n </div>\n </div>\n </div>\n <footer slDialogFooter>\n <button slButton tone=\"secondary\" variant=\"outline\" [slDialogTrigger]=\"change\">\n Change carrier\n </button>\n <sl-dialog #change=\"slDialog\" size=\"sm\" [open]=\"changing()\" (openChange)=\"toggle($event)\">\n <header slDialogHeader>\n <h2 slDialogTitle>Change carrier</h2>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <div slField>\n <label slFieldLabel>Carrier</label>\n <sl-select [items]=\"carriers\" [(value)]=\"draft\">\n @for (option of carriers; track option.value) {\n <sl-select-item [value]=\"option.value\">{{ option.label }}</sl-select-item>\n }\n </sl-select>\n </div>\n </div>\n <footer slDialogFooter>\n <button slButton variant=\"ghost\" tone=\"secondary\" (click)=\"changing.set(false)\">\n Cancel\n </button>\n <button slButton (click)=\"use()\">Use carrier</button>\n </footer>\n </sl-dialog>\n </footer>\n </sl-dialog>\n `,\n})\nexport class DialogNested {\n readonly carriers = CARRIERS;\n readonly carrier = signal<SelectSelection>('ups');\n readonly draft = signal<SelectSelection>('ups');\n readonly changing = signal(false);\n readonly carrierLabel = computed(\n () => CARRIERS.find((option) => option.value === this.carrier())?.label,\n );\n\n toggle(next: boolean): void {\n if (next) this.draft.set(this.carrier());\n this.changing.set(next);\n }\n\n use(): void {\n this.carrier.set(this.draft());\n this.changing.set(false);\n }\n}\n",
906
+ "verdict": "example"
907
+ },
908
+ {
909
+ "id": "content",
910
+ "title": "Content the family did not choose",
911
+ "note": "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.",
912
+ "language": "html",
913
+ "source": "<h2 slDialogTitle>deployment-pipeline-eu-west-1-production-rollback-2026-09-04T01</h2>\n",
914
+ "verdict": "excerpt"
915
+ },
916
+ {
917
+ "id": "composition",
918
+ "title": "Replacing a part, and reaching the instance",
919
+ "note": "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.",
920
+ "language": "html",
921
+ "source": "<button slButton variant=\"outline\" [slDialogTrigger]=\"d\">Edit project</button>\n",
922
+ "verdict": "excerpt"
923
+ },
924
+ {
925
+ "id": "defaults",
926
+ "title": "Deciding once for the application",
927
+ "note": "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.",
928
+ "language": "ts",
929
+ "source": "import { Component } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n provideDialogDefaults,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n} from '@slotted/angular/dialog';\nimport { SlInline } from '@slotted/angular/inline';\nimport { SlText } from '@slotted/angular/typography';\n\n@Component({\n selector: 'app-dialog-defaults',\n imports: [\n SlButton,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlInline,\n SlText,\n ],\n providers: [provideDialogDefaults({ placement: 'top', size: 'lg' })],\n template: `\n <div slInline [gap]=\"2\">\n <button slButton tone=\"secondary\" variant=\"outline\" [slDialogTrigger]=\"order\">\n Purchase order PO-7730\n </button>\n <sl-dialog #order=\"slDialog\">\n <header slDialogHeader>\n <h2 slDialogTitle>Purchase order PO-7730</h2>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <span slText size=\"sm\">Large and at the top, from the provider.</span>\n </div>\n </sl-dialog>\n <button slButton tone=\"secondary\" variant=\"outline\" [slDialogTrigger]=\"rename\">\n Rename supplier\n </button>\n <sl-dialog #rename=\"slDialog\" size=\"sm\">\n <header slDialogHeader>\n <h2 slDialogTitle>Rename supplier</h2>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <span slText size=\"sm\">At the top from the provider, and small because it says so.</span>\n </div>\n </sl-dialog>\n </div>\n `,\n})\nexport class DialogDefaults {}\n",
930
+ "verdict": "example"
931
+ },
932
+ {
933
+ "id": "accessibility",
934
+ "title": "The pattern’s table, and what it costs",
935
+ "note": "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.",
936
+ "language": "html",
937
+ "source": "<sl-dialog [(open)]=\"open\" (openChangeRequest)=\"report($event.reason, $event.result)\">\n …\n</sl-dialog>\n",
938
+ "verdict": "excerpt"
939
+ },
940
+ {
941
+ "id": "playground",
942
+ "title": "Playground",
943
+ "note": "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.",
944
+ "language": "html",
945
+ "source": "<button slButton tone=\"danger\" variant=\"outline\" [slDialogTrigger]=\"d\">Delete project</button>\n<sl-alert-dialog #d=\"slAlertDialog\" [(open)]=\"open\">\n <header slDialogHeader>\n <span slAlertDialogIcon></span>\n <h2 slDialogTitle>Delete this project?</h2>\n <p slDialogDescription>\n The project and its 42 documents leave for everyone. This cannot be undone.\n </p>\n </header>\n <footer slDialogFooter>\n <button slButton variant=\"outline\" tone=\"secondary\" slAlertDialogCancel>Keep project</button>\n <button slButton tone=\"danger\" slAlertDialogAction>Delete project</button>\n </footer>\n</sl-alert-dialog>\n",
946
+ "verdict": "excerpt"
947
+ },
948
+ {
949
+ "id": "tones",
950
+ "title": "What kind of decision this is",
951
+ "note": "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.",
952
+ "language": "html",
953
+ "source": "<sl-alert-dialog tone=\"warning\" [(open)]=\"open\">…</sl-alert-dialog>\n",
954
+ "verdict": "excerpt"
955
+ },
956
+ {
957
+ "id": "actions",
958
+ "title": "Two controls, each saying what it does",
959
+ "note": "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.",
960
+ "language": "html",
961
+ "source": "<footer slDialogFooter>\n <button slButton slAlertDialogCancel>Keep project</button>\n <button slButton slAlertDialogAction value=\"deleted\">Delete project</button>\n</footer>\n",
962
+ "verdict": "excerpt"
963
+ },
964
+ {
965
+ "id": "policy",
966
+ "title": "What can and cannot dismiss it",
967
+ "note": "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.",
968
+ "language": "html",
969
+ "source": "<sl-alert-dialog escape=\"none\" [(open)]=\"open\">…</sl-alert-dialog>\n",
970
+ "verdict": "excerpt"
971
+ },
972
+ {
973
+ "id": "focus",
974
+ "title": "The safest thing under the reader’s hands",
975
+ "note": "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.",
976
+ "language": "html",
977
+ "source": "<sl-alert-dialog initialFocus=\"cancel\" [(open)]=\"open\">…</sl-alert-dialog>\n",
978
+ "verdict": "excerpt"
979
+ },
980
+ {
981
+ "id": "content",
982
+ "title": "A confirmation that has more to say",
983
+ "note": "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.",
984
+ "language": "html",
985
+ "source": "<header slDialogHeader>\n <span slAlertDialogIcon></span>\n <h2 slDialogTitle>Delete 3 documents?</h2>\n <p slDialogDescription>This cannot be undone.</p>\n</header>\n",
986
+ "verdict": "excerpt"
987
+ },
988
+ {
989
+ "id": "composition",
990
+ "title": "The actions are the consumer’s own buttons",
991
+ "note": "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.",
992
+ "language": "html",
993
+ "source": "<button slButton tone=\"danger\" slAlertDialogAction>Delete project</button>\n",
994
+ "verdict": "excerpt"
995
+ },
996
+ {
997
+ "id": "accessibility",
998
+ "title": "What the role changes, and what it does not",
999
+ "note": "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.",
1000
+ "language": "html",
1001
+ "source": "<p slDialogDescription>The project and its 42 documents leave for everyone.</p>\n",
1002
+ "verdict": "excerpt"
1003
+ },
1004
+ {
1005
+ "id": "alert-tones",
1006
+ "title": "alert-tones.ts",
1007
+ "note": null,
1008
+ "language": "ts",
1009
+ "source": "import { Component } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlAlertDialog,\n SlAlertDialogAction,\n SlAlertDialogCancel,\n SlAlertDialogIcon,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n type DialogTone,\n} from '@slotted/angular/dialog';\nimport { SlInline } from '@slotted/angular/inline';\n\nconst CONFIRMATIONS: {\n tone: DialogTone;\n trigger: string;\n title: string;\n description: string;\n action: string;\n}[] = [\n {\n tone: 'accent',\n trigger: 'Send invoices',\n title: 'Send 214 invoices?',\n description: 'Each customer receives the September invoice by email within the hour.',\n action: 'Send invoices',\n },\n {\n tone: 'warning',\n trigger: 'Publish prices',\n title: 'Publish the new prices?',\n description: 'Open quotes keep their prices; new orders use the new ones from now on.',\n action: 'Publish prices',\n },\n {\n tone: 'success',\n trigger: 'Close September',\n title: 'Close the books for September?',\n description: 'All 1,180 entries reconcile. Entries dated September can no longer be edited.',\n action: 'Close September',\n },\n];\n\n@Component({\n selector: 'app-dialog-alert-tones',\n imports: [\n SlAlertDialog,\n SlAlertDialogAction,\n SlAlertDialogCancel,\n SlAlertDialogIcon,\n SlButton,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlInline,\n ],\n template: `\n <div slInline [gap]=\"2\">\n @for (confirmation of confirmations; track confirmation.tone) {\n <button slButton tone=\"secondary\" variant=\"outline\" [slDialogTrigger]=\"dialog\">\n {{ confirmation.trigger }}\n </button>\n <sl-alert-dialog #dialog=\"slAlertDialog\" [tone]=\"confirmation.tone\">\n <header slDialogHeader>\n <span slAlertDialogIcon></span>\n <h2 slDialogTitle>{{ confirmation.title }}</h2>\n <p slDialogDescription>{{ confirmation.description }}</p>\n </header>\n <footer slDialogFooter>\n <button slButton slAlertDialogCancel tone=\"secondary\" variant=\"outline\">Not now</button>\n <button slButton slAlertDialogAction [tone]=\"confirmation.tone\">\n {{ confirmation.action }}\n </button>\n </footer>\n </sl-alert-dialog>\n }\n </div>\n `,\n})\nexport class DialogAlertTones {\n readonly confirmations = CONFIRMATIONS;\n}\n",
1010
+ "verdict": "example"
1011
+ },
1012
+ {
1013
+ "id": "async-submit",
1014
+ "title": "async-submit.ts",
1015
+ "note": null,
1016
+ "language": "ts",
1017
+ "source": "import { Component, signal } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n type DialogChangeRequest,\n} from '@slotted/angular/dialog';\nimport { SlInline } from '@slotted/angular/inline';\nimport { SlText } from '@slotted/angular/typography';\n\n@Component({\n selector: 'app-dialog-async-submit',\n imports: [\n SlButton,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlInline,\n SlText,\n ],\n template: `\n <div slInline align=\"center\" [gap]=\"3\">\n <button slButton tone=\"secondary\" variant=\"outline\" [slDialogTrigger]=\"dialog\">\n Refund order SO-1182\n </button>\n <sl-dialog #dialog=\"slDialog\" [(open)]=\"open\" (openChangeRequest)=\"guard($event)\">\n <header slDialogHeader>\n <h2 slDialogTitle>Refund $1,240.00</h2>\n <p slDialogDescription>To the card ending 4242, for order SO-1182.</p>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <span slText size=\"sm\">\n The payment provider takes a moment to confirm. The dialog stays open until it does.\n </span>\n </div>\n <footer slDialogFooter>\n <button\n slButton\n variant=\"ghost\"\n tone=\"secondary\"\n [disabled]=\"saving()\"\n (click)=\"open.set(false)\"\n >\n Cancel\n </button>\n <button\n slButton\n [loading]=\"saving()\"\n [messages]=\"{ loading: 'Issuing refund' }\"\n (click)=\"refund()\"\n >\n Issue refund\n </button>\n </footer>\n </sl-dialog>\n @if (sent()) {\n <span slText role=\"status\" size=\"sm\" tone=\"muted\">Refund issued.</span>\n }\n </div>\n `,\n})\nexport class DialogAsyncSubmit {\n readonly open = signal(false);\n readonly saving = signal(false);\n readonly sent = signal(false);\n\n guard(request: DialogChangeRequest): void {\n if (!request.value && this.saving()) request.cancel();\n if (request.value) this.sent.set(false);\n }\n\n refund(): void {\n this.saving.set(true);\n setTimeout(() => {\n this.saving.set(false);\n this.sent.set(true);\n this.open.set(false);\n }, 1500);\n }\n}\n",
1018
+ "verdict": "example"
1019
+ },
1020
+ {
1021
+ "id": "basic",
1022
+ "title": "basic.ts",
1023
+ "note": null,
1024
+ "language": "ts",
1025
+ "source": "import { Component, signal } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n} from '@slotted/angular/dialog';\nimport { SlField, SlFieldLabel } from '@slotted/angular/field';\nimport { SlInline } from '@slotted/angular/inline';\nimport { SlTextField, SlTextFieldInput } from '@slotted/angular/text-field';\nimport { SlText } from '@slotted/angular/typography';\n\n@Component({\n selector: 'app-dialog-basic',\n imports: [\n SlButton,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlField,\n SlFieldLabel,\n SlInline,\n SlText,\n SlTextField,\n SlTextFieldInput,\n ],\n template: `\n <div slInline align=\"center\" [gap]=\"3\">\n <span slText size=\"sm\">{{ email() }}</span>\n <button slButton size=\"sm\" tone=\"secondary\" variant=\"outline\" [slDialogTrigger]=\"dialog\">\n Edit billing email\n </button>\n <sl-dialog #dialog=\"slDialog\" [open]=\"open()\" (openChange)=\"toggle($event)\">\n <header slDialogHeader>\n <h2 slDialogTitle>Billing email</h2>\n <p slDialogDescription>\n Invoices and payment receipts for Northwind Traders go to this address.\n </p>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <div slField>\n <label slFieldLabel>Email</label>\n <div slTextField>\n <input\n slTextFieldInput\n type=\"email\"\n [value]=\"draft()\"\n (valueChange)=\"draft.set($event.value)\"\n />\n </div>\n </div>\n </div>\n <footer slDialogFooter>\n <button slButton variant=\"ghost\" tone=\"secondary\" (click)=\"open.set(false)\">\n Cancel\n </button>\n <button slButton (click)=\"save()\">Save</button>\n </footer>\n </sl-dialog>\n </div>\n `,\n})\nexport class DialogBasic {\n readonly open = signal(false);\n readonly email = signal('ap@northwindtraders.com');\n readonly draft = signal(this.email());\n\n toggle(next: boolean): void {\n if (next) this.draft.set(this.email());\n this.open.set(next);\n }\n\n save(): void {\n this.email.set(this.draft());\n this.open.set(false);\n }\n}\n",
1026
+ "verdict": "example"
1027
+ },
1028
+ {
1029
+ "id": "bulk-edit",
1030
+ "title": "bulk-edit.ts",
1031
+ "note": null,
1032
+ "language": "ts",
1033
+ "source": "import { Component, computed, signal } from '@angular/core';\nimport { SlBadge } from '@slotted/angular/badge';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n} from '@slotted/angular/dialog';\nimport { SlField, SlFieldLabel } from '@slotted/angular/field';\nimport { SlInline } from '@slotted/angular/inline';\nimport { SlSelect, SlSelectItem, type SelectSelection } from '@slotted/angular/select';\nimport { SlStack } from '@slotted/angular/stack';\nimport {\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n SlTableSelect,\n SlTableSelectAll,\n} from '@slotted/angular/table';\nimport { SlText } from '@slotted/angular/typography';\n\nconst STATUSES = [\n { value: 'processing', label: 'Processing', tone: 'accent' },\n { value: 'hold', label: 'On hold', tone: 'warning' },\n { value: 'ready', label: 'Ready to ship', tone: 'success' },\n] as const;\n\nconst WAREHOUSES = [\n { value: 'RNO', label: 'Reno, NV' },\n { value: 'CMH', label: 'Columbus, OH' },\n { value: 'SAV', label: 'Savannah, GA' },\n];\n\ntype Status = (typeof STATUSES)[number]['value'];\n\nconst INITIAL: { id: string; customer: string; status: Status; warehouse: string }[] = [\n { id: 'SO-1182', customer: 'Contoso Foods', status: 'processing', warehouse: 'RNO' },\n { id: 'SO-1183', customer: 'Fabrikam Grocers', status: 'processing', warehouse: 'CMH' },\n { id: 'SO-1184', customer: 'Tailspin Market', status: 'hold', warehouse: 'RNO' },\n { id: 'SO-1185', customer: 'Woodgrove Deli', status: 'processing', warehouse: 'SAV' },\n];\n\n@Component({\n selector: 'app-dialog-bulk-edit',\n imports: [\n SlBadge,\n SlButton,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlField,\n SlFieldLabel,\n SlInline,\n SlSelect,\n SlSelectItem,\n SlStack,\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n SlTableSelect,\n SlTableSelectAll,\n SlText,\n ],\n template: `\n <div slStack [gap]=\"3\">\n <div slInline align=\"center\" [gap]=\"3\">\n <span slText size=\"sm\" tone=\"muted\">\n {{ count() === 0 ? 'Select orders to edit them together.' : count() + ' selected' }}\n </span>\n <button\n slButton\n focusableWhenDisabled\n size=\"sm\"\n tone=\"secondary\"\n variant=\"outline\"\n [disabled]=\"count() === 0\"\n [slDialogTrigger]=\"dialog\"\n >\n Edit selected\n </button>\n <sl-dialog #dialog=\"slDialog\" [open]=\"open()\" (openChange)=\"toggle($event)\">\n <header slDialogHeader>\n <h2 slDialogTitle>Edit {{ editing().length }} {{ noun() }}</h2>\n <p slDialogDescription>{{ editing().join(', ') }}</p>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <div slStack [gap]=\"4\">\n <div slField>\n <label slFieldLabel>Status</label>\n <sl-select [items]=\"statuses\" [(value)]=\"status\">\n @for (option of statuses; track option.value) {\n <sl-select-item [value]=\"option.value\">{{ option.label }}</sl-select-item>\n }\n </sl-select>\n </div>\n <div slField>\n <label slFieldLabel>Ships from</label>\n <sl-select [items]=\"warehouses\" [(value)]=\"warehouse\">\n @for (option of warehouses; track option.value) {\n <sl-select-item [value]=\"option.value\">{{ option.label }}</sl-select-item>\n }\n </sl-select>\n </div>\n </div>\n </div>\n <footer slDialogFooter>\n <button slButton variant=\"ghost\" tone=\"secondary\" (click)=\"open.set(false)\">\n Cancel\n </button>\n <button slButton (click)=\"apply()\">Update {{ editing().length }} {{ noun() }}</button>\n </footer>\n </sl-dialog>\n </div>\n <div slTable selectionMode=\"multiple\" [columns]=\"5\" [(value)]=\"chosen\">\n <div slTableContent>\n <thead slTableHead>\n <tr slTableRow>\n <th slTableSelectAll></th>\n <th slTableColumnHeader>Order</th>\n <th slTableColumnHeader>Customer</th>\n <th slTableColumnHeader>Status</th>\n <th slTableColumnHeader>Ships from</th>\n </tr>\n </thead>\n <tbody slTableBody>\n @for (row of orders(); track row.id) {\n <tr slTableRow [value]=\"row.id\">\n <td slTableSelect></td>\n <th slTableRowHeader>{{ row.id }}</th>\n <td slTableCell>{{ row.customer }}</td>\n <td slTableCell>\n <span slBadge [tone]=\"statusOf(row.status).tone\">\n {{ statusOf(row.status).label }}\n </span>\n </td>\n <td slTableCell>{{ warehouseOf(row.warehouse) }}</td>\n </tr>\n }\n </tbody>\n </div>\n </div>\n </div>\n `,\n})\nexport class DialogBulkEdit {\n readonly statuses = STATUSES;\n readonly warehouses = WAREHOUSES;\n readonly orders = signal(INITIAL);\n readonly chosen = signal<readonly string[]>([]);\n readonly editing = signal<readonly string[]>([]);\n readonly open = signal(false);\n readonly status = signal<SelectSelection>('ready');\n readonly warehouse = signal<SelectSelection>('RNO');\n readonly count = computed(() => this.chosen().length);\n readonly noun = computed(() => (this.editing().length === 1 ? 'order' : 'orders'));\n\n statusOf(value: Status) {\n return STATUSES.find((status) => status.value === value)!;\n }\n\n warehouseOf(value: string) {\n return WAREHOUSES.find((option) => option.value === value)?.label;\n }\n\n toggle(next: boolean): void {\n if (next) this.editing.set(this.chosen());\n this.open.set(next);\n }\n\n apply(): void {\n const editing = this.editing();\n const status = this.status() as Status;\n const warehouse = this.warehouse() as string;\n this.orders.update((rows) =>\n rows.map((row) => (editing.includes(row.id) ? { ...row, status, warehouse } : row)),\n );\n this.chosen.set([]);\n this.open.set(false);\n }\n}\n",
1034
+ "verdict": "example"
1035
+ },
1036
+ {
1037
+ "id": "cancel-order",
1038
+ "title": "cancel-order.ts",
1039
+ "note": null,
1040
+ "language": "ts",
1041
+ "source": "import { Component, signal } from '@angular/core';\nimport { SlBadge } from '@slotted/angular/badge';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlAlertDialog,\n SlAlertDialogAction,\n SlAlertDialogCancel,\n SlAlertDialogIcon,\n SlDialogBody,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n} from '@slotted/angular/dialog';\nimport { SlField, SlFieldLabel } from '@slotted/angular/field';\nimport { SlInline } from '@slotted/angular/inline';\nimport { SlSelect, SlSelectItem, type SelectSelection } from '@slotted/angular/select';\nimport { SlText } from '@slotted/angular/typography';\n\nconst REASONS = [\n { value: 'customer', label: 'The customer asked to cancel' },\n { value: 'stock', label: 'Items are out of stock' },\n { value: 'payment', label: 'The payment was flagged' },\n { value: 'duplicate', label: 'Duplicate order' },\n];\n\n@Component({\n selector: 'app-dialog-cancel-order',\n imports: [\n SlAlertDialog,\n SlAlertDialogAction,\n SlAlertDialogCancel,\n SlAlertDialogIcon,\n SlBadge,\n SlButton,\n SlDialogBody,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlField,\n SlFieldLabel,\n SlInline,\n SlSelect,\n SlSelectItem,\n SlText,\n ],\n template: `\n <div slInline align=\"center\" [gap]=\"3\">\n <span slText weight=\"medium\">Order SO-1182</span>\n <span slBadge [tone]=\"cancelled() ? 'danger' : 'accent'\">\n {{ cancelled() ? 'Cancelled' : 'Processing' }}\n </span>\n <button\n slButton\n focusableWhenDisabled\n size=\"sm\"\n tone=\"danger\"\n variant=\"outline\"\n [disabled]=\"cancelled()\"\n [slDialogTrigger]=\"dialog\"\n >\n Cancel order\n </button>\n <sl-alert-dialog #dialog=\"slAlertDialog\" (openChange)=\"$event && reason.set(null)\">\n <header slDialogHeader>\n <span slAlertDialogIcon></span>\n <h2 slDialogTitle>Cancel order SO-1182?</h2>\n <p slDialogDescription>\n Contoso Foods is refunded $1,240.00 and the 6 items go back to stock. The order cannot\n be reopened.\n </p>\n </header>\n <div slDialogBody>\n <div slField required>\n <label slFieldLabel>Reason</label>\n <sl-select placeholder=\"Choose a reason\" [items]=\"reasons\" [(value)]=\"reason\">\n @for (option of reasons; track option.value) {\n <sl-select-item [value]=\"option.value\">{{ option.label }}</sl-select-item>\n }\n </sl-select>\n </div>\n </div>\n <footer slDialogFooter>\n <button slButton slAlertDialogCancel tone=\"secondary\" variant=\"outline\">\n Keep order\n </button>\n <button\n slButton\n slAlertDialogAction\n tone=\"danger\"\n [disabled]=\"reason() === null\"\n (click)=\"cancelled.set(true)\"\n >\n Cancel order\n </button>\n </footer>\n </sl-alert-dialog>\n </div>\n `,\n})\nexport class DialogCancelOrder {\n readonly reasons = REASONS;\n readonly cancelled = signal(false);\n readonly reason = signal<SelectSelection>(null);\n}\n",
1042
+ "verdict": "example"
1043
+ },
1044
+ {
1045
+ "id": "create-shipment",
1046
+ "title": "create-shipment.ts",
1047
+ "note": null,
1048
+ "language": "ts",
1049
+ "source": "import { Component, computed, signal } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport { SlCheckbox } from '@slotted/angular/checkbox';\nimport {\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n type DialogChangeRequest,\n} from '@slotted/angular/dialog';\nimport { SlField, SlFieldDescription, SlFieldError, SlFieldLabel } from '@slotted/angular/field';\nimport { SlInline } from '@slotted/angular/inline';\nimport { SlSelect, SlSelectItem, type SelectSelection } from '@slotted/angular/select';\nimport { SlStack } from '@slotted/angular/stack';\nimport { SlTextField, SlTextFieldInput } from '@slotted/angular/text-field';\nimport { SlText } from '@slotted/angular/typography';\n\nconst CARRIERS = [\n { value: 'ups', label: 'UPS Ground', description: '3–5 business days' },\n { value: 'fedex', label: 'FedEx 2Day', description: '2 business days' },\n { value: 'usps', label: 'USPS Priority Mail', description: '1–3 business days' },\n];\n\nfunction weightError(value: string): string {\n if (value.trim() === '') return 'Enter the total weight of the packages.';\n const weight = Number(value);\n if (!Number.isFinite(weight) || weight <= 0) return 'Enter a weight above 0, such as 18.4.';\n return '';\n}\n\n@Component({\n selector: 'app-dialog-create-shipment',\n imports: [\n SlButton,\n SlCheckbox,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlField,\n SlFieldDescription,\n SlFieldError,\n SlFieldLabel,\n SlInline,\n SlSelect,\n SlSelectItem,\n SlStack,\n SlText,\n SlTextField,\n SlTextFieldInput,\n ],\n template: `\n <div slInline align=\"center\" [gap]=\"3\">\n <button slButton [slDialogTrigger]=\"dialog\">Create shipment</button>\n <sl-dialog #dialog=\"slDialog\" size=\"lg\" [(open)]=\"open\" (openChangeRequest)=\"guard($event)\">\n <header slDialogHeader>\n <h2 slDialogTitle>Create a shipment</h2>\n <p slDialogDescription>\n Order SO-1182 for Contoso Foods: 6 items to 1200 Pike St, Seattle.\n </p>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <form id=\"create-shipment\" novalidate (submit)=\"submit($event)\">\n <div slStack [gap]=\"5\">\n <div slField>\n <label slFieldLabel>Carrier</label>\n <sl-select name=\"carrier\" [items]=\"carriers\" [(value)]=\"carrier\">\n @for (option of carriers; track option.value) {\n <sl-select-item [value]=\"option.value\" [description]=\"option.description\">\n {{ option.label }}\n </sl-select-item>\n }\n </sl-select>\n </div>\n <div slField required [invalid]=\"error() !== '' ? true : undefined\">\n <label slFieldLabel>Weight in kilograms</label>\n <span slFieldDescription>All packages together, as weighed at the dock.</span>\n <div slTextField>\n <input\n slTextFieldInput\n inputmode=\"decimal\"\n name=\"weight\"\n [value]=\"weight()\"\n (valueChange)=\"weight.set($event.value)\"\n />\n </div>\n <span slFieldError live=\"polite\" reserve>{{ error() }}</span>\n </div>\n <div slCheckbox defaultChecked name=\"notify\">\n Email the tracking number to the customer\n </div>\n </div>\n </form>\n </div>\n <footer slDialogFooter>\n <button\n slButton\n variant=\"ghost\"\n tone=\"secondary\"\n [disabled]=\"saving()\"\n (click)=\"open.set(false)\"\n >\n Cancel\n </button>\n <button\n slButton\n form=\"create-shipment\"\n type=\"submit\"\n [loading]=\"saving()\"\n [messages]=\"{ loading: 'Creating shipment' }\"\n >\n Create shipment\n </button>\n </footer>\n </sl-dialog>\n @if (created(); as message) {\n <span slText role=\"status\" size=\"sm\" tone=\"muted\">{{ message }}</span>\n }\n </div>\n `,\n})\nexport class DialogCreateShipment {\n readonly carriers = CARRIERS;\n readonly open = signal(false);\n readonly carrier = signal<SelectSelection>('ups');\n readonly weight = signal('');\n readonly submitted = signal(false);\n readonly saving = signal(false);\n readonly created = signal<string | null>(null);\n readonly error = computed(() => (this.submitted() ? weightError(this.weight()) : ''));\n\n guard(request: DialogChangeRequest): void {\n if (!request.value && this.saving()) {\n request.cancel();\n return;\n }\n if (request.value) {\n this.weight.set('');\n this.submitted.set(false);\n }\n }\n\n submit(event: Event): void {\n event.preventDefault();\n this.submitted.set(true);\n if (weightError(this.weight()) !== '') return;\n this.saving.set(true);\n setTimeout(() => {\n const label = CARRIERS.find((option) => option.value === this.carrier())?.label;\n this.saving.set(false);\n this.created.set(`Shipment SH-4472 created with ${label}.`);\n this.open.set(false);\n }, 1200);\n }\n}\n",
1050
+ "verdict": "example"
1051
+ },
1052
+ {
1053
+ "id": "destructive",
1054
+ "title": "destructive.ts",
1055
+ "note": null,
1056
+ "language": "ts",
1057
+ "source": "import { Component, signal } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlAlertDialog,\n SlAlertDialogAction,\n SlAlertDialogCancel,\n SlAlertDialogIcon,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n} from '@slotted/angular/dialog';\nimport { SlInline } from '@slotted/angular/inline';\nimport { SlText } from '@slotted/angular/typography';\n\n@Component({\n selector: 'app-dialog-destructive',\n imports: [\n SlAlertDialog,\n SlAlertDialogAction,\n SlAlertDialogCancel,\n SlAlertDialogIcon,\n SlButton,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlInline,\n SlText,\n ],\n template: `\n <div slInline align=\"center\" [gap]=\"3\">\n <button slButton tone=\"danger\" variant=\"outline\" [slDialogTrigger]=\"dialog\">\n Delete price list\n </button>\n <sl-alert-dialog #dialog=\"slAlertDialog\">\n <header slDialogHeader>\n <span slAlertDialogIcon></span>\n <h2 slDialogTitle>Delete the 2026 wholesale price list?</h2>\n <p slDialogDescription>\n The 412 prices in it are removed, and 9 customers on this list move to retail prices.\n This cannot be undone.\n </p>\n </header>\n <footer slDialogFooter>\n <button slButton slAlertDialogCancel tone=\"secondary\" variant=\"outline\">\n Keep price list\n </button>\n <button slButton slAlertDialogAction tone=\"danger\" (click)=\"deleted.set(true)\">\n Delete price list\n </button>\n </footer>\n </sl-alert-dialog>\n @if (deleted()) {\n <span slText role=\"status\" size=\"sm\" tone=\"muted\">\n The 2026 wholesale price list was deleted.\n </span>\n }\n </div>\n `,\n})\nexport class DialogDestructive {\n readonly deleted = signal(false);\n}\n",
1058
+ "verdict": "example"
1059
+ },
1060
+ {
1061
+ "id": "dismiss",
1062
+ "title": "dismiss.ts",
1063
+ "note": null,
1064
+ "language": "ts",
1065
+ "source": "import { Component, signal } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlDialog,\n SlDialogBody,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n} from '@slotted/angular/dialog';\nimport { SlText } from '@slotted/angular/typography';\n\n@Component({\n selector: 'app-dialog-dismiss',\n imports: [\n SlButton,\n SlDialog,\n SlDialogBody,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlText,\n ],\n template: `\n <button slButton [slDialogTrigger]=\"dialog\">Import products</button>\n <sl-dialog #dialog=\"slDialog\" escape=\"none\" outsidePress=\"none\" [(open)]=\"open\">\n <header slDialogHeader>\n <h2 slDialogTitle>Import 1,240 products</h2>\n <p slDialogDescription>From spring-catalogue.csv into the Northwind price list.</p>\n </header>\n <div slDialogBody>\n <span slText size=\"sm\">\n 38 rows update existing products and 1,202 add new ones. Escape and a press outside the\n panel leave this dialog open; choose one of the actions.\n </span>\n </div>\n <footer slDialogFooter>\n <button slButton variant=\"ghost\" tone=\"secondary\" (click)=\"open.set(false)\">\n Cancel import\n </button>\n <button slButton (click)=\"open.set(false)\">Start import</button>\n </footer>\n </sl-dialog>\n `,\n})\nexport class DialogDismiss {\n readonly open = signal(false);\n}\n",
1066
+ "verdict": "example"
1067
+ },
1068
+ {
1069
+ "id": "form",
1070
+ "title": "form.ts",
1071
+ "note": null,
1072
+ "language": "ts",
1073
+ "source": "import { Component, computed, signal } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n} from '@slotted/angular/dialog';\nimport { SlField, SlFieldError, SlFieldLabel } from '@slotted/angular/field';\nimport { SlInline } from '@slotted/angular/inline';\nimport { SlStack } from '@slotted/angular/stack';\nimport { SlTextField, SlTextFieldInput } from '@slotted/angular/text-field';\nimport { SlText } from '@slotted/angular/typography';\n\nfunction nameError(value: string): string {\n return value.trim() === '' ? 'Enter the contact’s full name.' : '';\n}\n\nfunction emailError(value: string): string {\n if (value.trim() === '') return 'Enter the address the contact reads.';\n if (!/^\\S+@\\S+\\.\\S+$/.test(value)) return 'Enter an address like ana@contoso.com.';\n return '';\n}\n\n@Component({\n selector: 'app-dialog-form',\n imports: [\n SlButton,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlField,\n SlFieldError,\n SlFieldLabel,\n SlInline,\n SlStack,\n SlText,\n SlTextField,\n SlTextFieldInput,\n ],\n template: `\n <div slInline align=\"center\" [gap]=\"3\">\n <button slButton [slDialogTrigger]=\"dialog\">Add contact</button>\n <sl-dialog #dialog=\"slDialog\" [open]=\"open()\" (openChange)=\"toggle($event)\">\n <header slDialogHeader>\n <h2 slDialogTitle>New contact</h2>\n <p slDialogDescription>Contoso Foods, Seattle.</p>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <form id=\"new-contact\" novalidate (submit)=\"submit($event)\">\n <div slStack [gap]=\"4\">\n <div slField required [invalid]=\"errors()?.name ? true : undefined\">\n <label slFieldLabel>Full name</label>\n <div slTextField>\n <input\n slTextFieldInput\n autocomplete=\"name\"\n [value]=\"name()\"\n (valueChange)=\"name.set($event.value)\"\n />\n </div>\n <span slFieldError live=\"polite\" reserve>{{ errors()?.name }}</span>\n </div>\n <div slField required [invalid]=\"errors()?.email ? true : undefined\">\n <label slFieldLabel>Email</label>\n <div slTextField>\n <input\n slTextFieldInput\n autocomplete=\"email\"\n type=\"email\"\n [value]=\"email()\"\n (valueChange)=\"email.set($event.value)\"\n />\n </div>\n <span slFieldError live=\"polite\" reserve>{{ errors()?.email }}</span>\n </div>\n </div>\n </form>\n </div>\n <footer slDialogFooter>\n <button slButton variant=\"ghost\" tone=\"secondary\" (click)=\"open.set(false)\">\n Cancel\n </button>\n <button slButton type=\"submit\" form=\"new-contact\">Add contact</button>\n </footer>\n </sl-dialog>\n @if (added(); as message) {\n <span slText role=\"status\" size=\"sm\" tone=\"muted\">{{ message }}</span>\n }\n </div>\n `,\n})\nexport class DialogForm {\n readonly open = signal(false);\n readonly name = signal('');\n readonly email = signal('');\n readonly submitted = signal(false);\n readonly added = signal<string | null>(null);\n readonly errors = computed(() =>\n this.submitted() ? { name: nameError(this.name()), email: emailError(this.email()) } : null,\n );\n\n toggle(next: boolean): void {\n if (next) {\n this.name.set('');\n this.email.set('');\n this.submitted.set(false);\n }\n this.open.set(next);\n }\n\n submit(event: Event): void {\n event.preventDefault();\n this.submitted.set(true);\n if (nameError(this.name()) !== '' || emailError(this.email()) !== '') return;\n this.added.set(`${this.name().trim()} was added to Contoso Foods.`);\n this.open.set(false);\n }\n}\n",
1074
+ "verdict": "example"
1075
+ },
1076
+ {
1077
+ "id": "full-screen",
1078
+ "title": "full-screen.ts",
1079
+ "note": null,
1080
+ "language": "ts",
1081
+ "source": "import { Component } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n} from '@slotted/angular/dialog';\nimport { SlInline } from '@slotted/angular/inline';\nimport { SlStack } from '@slotted/angular/stack';\nimport { SlText } from '@slotted/angular/typography';\n\nconst STOPS = [\n { time: '08:10', place: 'Contoso Foods, 1200 Pike St' },\n { time: '08:55', place: 'Fabrikam Grocers, 410 Broadway E' },\n { time: '09:40', place: 'Tailspin Market, 3300 Fremont Ave N' },\n { time: '10:30', place: 'Woodgrove Deli, 85 Pine St' },\n { time: '11:15', place: 'Wide World Importers, 2201 1st Ave S' },\n];\n\n@Component({\n selector: 'app-dialog-full-screen',\n imports: [\n SlButton,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlInline,\n SlStack,\n SlText,\n ],\n template: `\n <button slButton tone=\"secondary\" variant=\"outline\" [slDialogTrigger]=\"dialog\">\n Open route plan\n </button>\n <sl-dialog #dialog=\"slDialog\" fullscreenToggle size=\"lg\">\n <header slDialogHeader>\n <h2 slDialogTitle>Route 14, Tuesday 6 October</h2>\n <p slDialogDescription>5 stops, 38 km, driver Ana Souza.</p>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <div slStack [gap]=\"3\">\n @for (stop of stops; track stop.time) {\n <div slInline [gap]=\"4\">\n <span slText size=\"sm\" tone=\"muted\">{{ stop.time }}</span>\n <span slText size=\"sm\">{{ stop.place }}</span>\n </div>\n }\n </div>\n </div>\n </sl-dialog>\n `,\n})\nexport class DialogFullScreen {\n readonly stops = STOPS;\n}\n",
1082
+ "verdict": "example"
1083
+ },
1084
+ {
1085
+ "id": "initial-focus",
1086
+ "title": "initial-focus.ts",
1087
+ "note": null,
1088
+ "language": "ts",
1089
+ "source": "import { Component, computed, signal } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n} from '@slotted/angular/dialog';\nimport { SlStack } from '@slotted/angular/stack';\nimport { SlTextField, SlTextFieldInput } from '@slotted/angular/text-field';\nimport { SlText } from '@slotted/angular/typography';\n\nconst CUSTOMERS = [\n 'Contoso Foods',\n 'Fabrikam Grocers',\n 'Northwind Traders',\n 'Tailspin Market',\n 'Wide World Importers',\n 'Woodgrove Deli',\n];\n\n@Component({\n selector: 'app-dialog-initial-focus',\n imports: [\n SlButton,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlStack,\n SlText,\n SlTextField,\n SlTextFieldInput,\n ],\n template: `\n <button slButton tone=\"secondary\" variant=\"outline\" [slDialogTrigger]=\"dialog\">\n Find a customer\n </button>\n <sl-dialog #dialog=\"slDialog\" [initialFocus]=\"search\" (openChange)=\"$event && query.set('')\">\n <header slDialogHeader>\n <h2 slDialogTitle>Find a customer</h2>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <div slStack [gap]=\"4\">\n <div slTextField>\n <input\n #search\n slTextFieldInput\n aria-label=\"Customer name\"\n placeholder=\"Search by name\"\n type=\"search\"\n [value]=\"query()\"\n (valueChange)=\"query.set($event.value)\"\n />\n </div>\n <div slStack [gap]=\"2\">\n @for (name of matches(); track name) {\n <span slText size=\"sm\">{{ name }}</span>\n }\n </div>\n </div>\n </div>\n </sl-dialog>\n `,\n})\nexport class DialogInitialFocus {\n readonly query = signal('');\n readonly matches = computed(() =>\n CUSTOMERS.filter((name) => name.toLowerCase().includes(this.query().toLowerCase())),\n );\n}\n",
1090
+ "verdict": "example"
1091
+ },
1092
+ {
1093
+ "id": "menu-action",
1094
+ "title": "menu-action.ts",
1095
+ "note": null,
1096
+ "language": "ts",
1097
+ "source": "import { Component, ElementRef, signal, viewChild } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n} from '@slotted/angular/dialog';\nimport { SlField, SlFieldLabel } from '@slotted/angular/field';\nimport { SlMenu, SlMenuItem, SlMenuSeparator, SlMenuTrigger } from '@slotted/angular/menu';\nimport { SlTextField, SlTextFieldInput } from '@slotted/angular/text-field';\n\n@Component({\n selector: 'app-dialog-menu-action',\n imports: [\n SlButton,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlField,\n SlFieldLabel,\n SlMenu,\n SlMenuItem,\n SlMenuSeparator,\n SlMenuTrigger,\n SlTextField,\n SlTextFieldInput,\n ],\n template: `\n <button #actions slButton tone=\"secondary\" variant=\"outline\" [slMenuTriggerFor]=\"menu\">\n Customer actions\n </button>\n <sl-menu #menu>\n <button slMenuItem (select)=\"open.set(true)\">Change credit limit…</button>\n <button slMenuItem>Export statement</button>\n <hr slMenuSeparator />\n <button slMenuItem tone=\"danger\">Suspend account…</button>\n </sl-menu>\n <sl-dialog size=\"sm\" [finalFocus]=\"trigger()?.nativeElement\" [(open)]=\"open\">\n <header slDialogHeader>\n <h2 slDialogTitle>Credit limit</h2>\n <p slDialogDescription>Contoso Foods has $18,420.00 outstanding on open invoices.</p>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <div slField>\n <label slFieldLabel>Limit in US dollars</label>\n <div slTextField>\n <input slTextFieldInput inputmode=\"decimal\" value=\"25000\" />\n </div>\n </div>\n </div>\n <footer slDialogFooter>\n <button slButton variant=\"ghost\" tone=\"secondary\" (click)=\"open.set(false)\">Cancel</button>\n <button slButton (click)=\"open.set(false)\">Save limit</button>\n </footer>\n </sl-dialog>\n `,\n})\nexport class DialogMenuAction {\n readonly open = signal(false);\n readonly trigger = viewChild('actions', { read: ElementRef });\n}\n",
1098
+ "verdict": "example"
1099
+ },
1100
+ {
1101
+ "id": "non-modal",
1102
+ "title": "non-modal.ts",
1103
+ "note": null,
1104
+ "language": "ts",
1105
+ "source": "import { Component } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n} from '@slotted/angular/dialog';\nimport { SlStack } from '@slotted/angular/stack';\nimport { SlText } from '@slotted/angular/typography';\n\nconst STEPS = [\n 'Pick the 6 lines on the pick list from aisles 4 and 9.',\n 'Pack the olive oil upright, with dividers.',\n 'Print the UPS label and attach it to the top face.',\n];\n\n@Component({\n selector: 'app-dialog-non-modal',\n imports: [\n SlButton,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlStack,\n SlText,\n ],\n template: `\n <button slButton tone=\"secondary\" variant=\"outline\" [slDialogTrigger]=\"dialog\">\n Show packing steps\n </button>\n <sl-dialog #dialog=\"slDialog\" outsidePress=\"none\" placement=\"top\" size=\"sm\" [modal]=\"false\">\n <header slDialogHeader>\n <h2 slDialogTitle>Packing steps</h2>\n <p slDialogDescription>Order SO-1182. The page stays usable behind this panel.</p>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <div slStack [gap]=\"2\">\n @for (step of steps; track step; let index = $index) {\n <span slText size=\"sm\">{{ index + 1 }}. {{ step }}</span>\n }\n </div>\n </div>\n </sl-dialog>\n `,\n})\nexport class DialogNonModal {\n readonly steps = STEPS;\n}\n",
1106
+ "verdict": "example"
1107
+ },
1108
+ {
1109
+ "id": "parts",
1110
+ "title": "parts.ts",
1111
+ "note": null,
1112
+ "language": "ts",
1113
+ "source": "import { Component, signal } from '@angular/core';\nimport { SlBadge } from '@slotted/angular/badge';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlDescriptionList,\n SlDescriptionListDescription,\n SlDescriptionListItem,\n SlDescriptionListTerm,\n} from '@slotted/angular/description-list';\nimport {\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n} from '@slotted/angular/dialog';\n\nconst DETAILS = [\n { term: 'Carrier', value: 'UPS Ground' },\n { term: 'Tracking number', value: '1Z 999 AA1 01 2345 6784' },\n { term: 'Packages', value: '3, 18.4 kg in total' },\n { term: 'Estimated delivery', value: 'Thursday, 8 October' },\n];\n\n@Component({\n selector: 'app-dialog-parts',\n imports: [\n SlBadge,\n SlButton,\n SlDescriptionList,\n SlDescriptionListDescription,\n SlDescriptionListItem,\n SlDescriptionListTerm,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n ],\n template: `\n <button slButton tone=\"secondary\" variant=\"outline\" [slDialogTrigger]=\"dialog\">\n View shipment\n </button>\n <sl-dialog #dialog=\"slDialog\" [(open)]=\"open\">\n <header slDialogHeader>\n <h2 slDialogTitle>Shipment SH-4471</h2>\n <p slDialogDescription>Order SO-1182 for Contoso Foods, Seattle.</p>\n <span slBadge tone=\"accent\">In transit</span>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <div slDescriptionList>\n @for (detail of details; track detail.term) {\n <div slDescriptionListItem>\n <dt slDescriptionListTerm>{{ detail.term }}</dt>\n <dd slDescriptionListDescription>{{ detail.value }}</dd>\n </div>\n }\n </div>\n </div>\n <footer slDialogFooter>\n <button slButton variant=\"ghost\" tone=\"secondary\" (click)=\"open.set(false)\">Close</button>\n <button slButton>Print label</button>\n </footer>\n </sl-dialog>\n `,\n})\nexport class DialogParts {\n readonly open = signal(false);\n readonly details = DETAILS;\n}\n",
1114
+ "verdict": "example"
1115
+ },
1116
+ {
1117
+ "id": "result",
1118
+ "title": "result.ts",
1119
+ "note": null,
1120
+ "language": "ts",
1121
+ "source": "import { Component, signal } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlDialog,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n} from '@slotted/angular/dialog';\nimport { SlInline } from '@slotted/angular/inline';\nimport { SlText } from '@slotted/angular/typography';\n\nconst OUTCOMES: Record<string, string> = {\n partial: 'Ships the 4 items in stock today.',\n wait: 'Holds the order until every item is in stock.',\n};\n\n@Component({\n selector: 'app-dialog-result',\n imports: [\n SlButton,\n SlDialog,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlInline,\n SlText,\n ],\n template: `\n <div slInline align=\"center\" [gap]=\"3\">\n <button slButton tone=\"secondary\" variant=\"outline\" [slDialogTrigger]=\"dialog\">\n Ship order SO-1182\n </button>\n <sl-dialog #dialog=\"slDialog\" (closed)=\"record($event)\">\n <header slDialogHeader>\n <h2 slDialogTitle>Two items are out of stock</h2>\n <p slDialogDescription>Aniseed syrup and dried pears are back in stock on 14 October.</p>\n <button slDialogClose></button>\n </header>\n <footer slDialogFooter>\n <button slButton variant=\"outline\" tone=\"secondary\" (click)=\"dialog.close('wait')\">\n Wait for all items\n </button>\n <button slButton (click)=\"dialog.close('partial')\">Ship 4 items now</button>\n </footer>\n </sl-dialog>\n @if (outcome(); as message) {\n <span slText size=\"sm\" tone=\"muted\">{{ message }}</span>\n }\n </div>\n `,\n})\nexport class DialogResult {\n readonly outcome = signal<string | null>(null);\n\n record(result: string | undefined): void {\n this.outcome.set((result && OUTCOMES[result]) ?? 'Closed without a choice.');\n }\n}\n",
1122
+ "verdict": "example"
1123
+ },
1124
+ {
1125
+ "id": "row-action",
1126
+ "title": "row-action.ts",
1127
+ "note": null,
1128
+ "language": "ts",
1129
+ "source": "import { Component, signal } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n} from '@slotted/angular/dialog';\nimport { SlField, SlFieldLabel } from '@slotted/angular/field';\nimport {\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n} from '@slotted/angular/table';\nimport { SlTextField, SlTextFieldInput } from '@slotted/angular/text-field';\nimport { SlVisuallyHidden } from '@slotted/angular/visually-hidden';\n\nconst ORDERS = [\n { id: 'SO-1182', customer: 'Contoso Foods', total: '$1,240.00', amount: '1240.00', card: '4242' },\n { id: 'SO-1183', customer: 'Fabrikam Grocers', total: '$386.50', amount: '386.50', card: '1881' },\n {\n id: 'SO-1184',\n customer: 'Tailspin Market',\n total: '$2,075.25',\n amount: '2075.25',\n card: '0005',\n },\n];\n\ntype Order = (typeof ORDERS)[number];\n\n@Component({\n selector: 'app-dialog-row-action',\n imports: [\n SlButton,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlField,\n SlFieldLabel,\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n SlTextField,\n SlTextFieldInput,\n SlVisuallyHidden,\n ],\n template: `\n <div slTable [columns]=\"4\">\n <div slTableContent>\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader>Order</th>\n <th slTableColumnHeader>Customer</th>\n <th slTableColumnHeader numeric>Total</th>\n <th slTableColumnHeader><span slVisuallyHidden>Actions</span></th>\n </tr>\n </thead>\n <tbody slTableBody>\n @for (row of orders; track row.id) {\n <tr slTableRow [value]=\"row.id\">\n <th slTableRowHeader>{{ row.id }}</th>\n <td slTableCell>{{ row.customer }}</td>\n <td slTableCell numeric>{{ row.total }}</td>\n <td slTableCell>\n <button\n slButton\n size=\"sm\"\n tone=\"secondary\"\n variant=\"ghost\"\n [attr.aria-label]=\"'Refund ' + row.id\"\n (click)=\"refund(row)\"\n >\n Refund\n </button>\n </td>\n </tr>\n }\n </tbody>\n </div>\n </div>\n <sl-dialog size=\"sm\" [(open)]=\"open\">\n <header slDialogHeader>\n <h2 slDialogTitle>Refund {{ order().id }}</h2>\n <p slDialogDescription>\n {{ order().customer }} paid {{ order().total }} with the card ending {{ order().card }}.\n </p>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <div slField>\n <label slFieldLabel>Amount in US dollars</label>\n <div slTextField>\n <input slTextFieldInput inputmode=\"decimal\" [value]=\"order().amount\" />\n </div>\n </div>\n </div>\n <footer slDialogFooter>\n <button slButton variant=\"ghost\" tone=\"secondary\" (click)=\"open.set(false)\">Cancel</button>\n <button slButton (click)=\"open.set(false)\">Issue refund</button>\n </footer>\n </sl-dialog>\n `,\n})\nexport class DialogRowAction {\n readonly orders = ORDERS;\n readonly open = signal(false);\n readonly order = signal<Order>(ORDERS[0]!);\n\n refund(row: Order): void {\n this.order.set(row);\n this.open.set(true);\n }\n}\n",
1130
+ "verdict": "example"
1131
+ },
1132
+ {
1133
+ "id": "unsaved-changes",
1134
+ "title": "unsaved-changes.ts",
1135
+ "note": null,
1136
+ "language": "ts",
1137
+ "source": "import { Component, computed, signal } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlAlertDialog,\n SlAlertDialogAction,\n SlAlertDialogCancel,\n SlAlertDialogIcon,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n type DialogChangeRequest,\n} from '@slotted/angular/dialog';\nimport { SlField, SlFieldLabel } from '@slotted/angular/field';\nimport { SlInline } from '@slotted/angular/inline';\nimport { SlTextField, SlTextFieldInput } from '@slotted/angular/text-field';\nimport { SlText } from '@slotted/angular/typography';\n\n@Component({\n selector: 'app-dialog-unsaved-changes',\n imports: [\n SlAlertDialog,\n SlAlertDialogAction,\n SlAlertDialogCancel,\n SlAlertDialogIcon,\n SlButton,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlField,\n SlFieldLabel,\n SlInline,\n SlText,\n SlTextField,\n SlTextFieldInput,\n ],\n template: `\n <div slInline align=\"center\" [gap]=\"3\">\n <button slButton tone=\"secondary\" variant=\"outline\" [slDialogTrigger]=\"dialog\">\n Change delivery address\n </button>\n <sl-dialog #dialog=\"slDialog\" [(open)]=\"open\" (openChangeRequest)=\"guard($event)\">\n <header slDialogHeader>\n <h2 slDialogTitle>Delivery address</h2>\n <p slDialogDescription>Applies to order SO-1182 and to later orders.</p>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <div slField>\n <label slFieldLabel>Address</label>\n <div slTextField>\n <input slTextFieldInput [value]=\"draft()\" (valueChange)=\"draft.set($event.value)\" />\n </div>\n </div>\n </div>\n <footer slDialogFooter>\n <button slButton variant=\"ghost\" tone=\"secondary\" (click)=\"leave()\">Cancel</button>\n <button slButton (click)=\"save()\">Save address</button>\n </footer>\n <sl-alert-dialog tone=\"warning\" [(open)]=\"confirming\">\n <header slDialogHeader>\n <span slAlertDialogIcon></span>\n <h2 slDialogTitle>Discard the new address?</h2>\n <p slDialogDescription>\n The address you typed is not saved. The order keeps the previous one.\n </p>\n </header>\n <footer slDialogFooter>\n <button slButton slAlertDialogCancel tone=\"secondary\" variant=\"outline\">\n Keep editing\n </button>\n <button slButton slAlertDialogAction tone=\"warning\" (click)=\"open.set(false)\">\n Discard changes\n </button>\n </footer>\n </sl-alert-dialog>\n </sl-dialog>\n <span slText size=\"sm\" tone=\"muted\">{{ address() }}</span>\n </div>\n `,\n})\nexport class DialogUnsavedChanges {\n readonly open = signal(false);\n readonly confirming = signal(false);\n readonly address = signal('Pier 70, Suite 300, Seattle, WA 98121');\n readonly draft = signal(this.address());\n readonly dirty = computed(() => this.draft() !== this.address());\n\n guard(request: DialogChangeRequest): void {\n if (request.value) {\n this.draft.set(this.address());\n } else if (this.dirty()) {\n request.cancel();\n this.confirming.set(true);\n }\n }\n\n leave(): void {\n if (this.dirty()) this.confirming.set(true);\n else this.open.set(false);\n }\n\n save(): void {\n this.address.set(this.draft());\n this.open.set(false);\n }\n}\n",
1138
+ "verdict": "example"
1139
+ }
1140
+ ]
1141
+ }