@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,1922 @@
1
+ <!-- index: ./index.md -->
2
+ # multi-select
3
+
4
+ `data-ui="multi-select"` · Picks several options shown as tags.
5
+
6
+ ## Examples
7
+
8
+ ### Playground
9
+
10
+ One control with every axis on it, driven by the controls under the canvas. Add a service, take one back out, and watch the row grow by whole rows rather than by pixels.
11
+
12
+ Excerpt — not a complete module
13
+
14
+ ```html
15
+ <sl-multi-select
16
+ aria-label="Affected services"
17
+ placeholder="Add a service"
18
+ [defaultValue]="['checkout-api']"
19
+ >
20
+ <sl-multi-select-item value="checkout-api" label="checkout-api" />
21
+ <sl-multi-select-item value="payments-worker" label="payments-worker" />
22
+ </sl-multi-select>
23
+ ```
24
+
25
+ ### The chips, and where they live
26
+
27
+ Inside the frame, beside the caret, because this control holds a real input. Each chip is a tag: the same pill, the same remove control, the same geometry stated once in tag.css.
28
+
29
+ Excerpt — not a complete module
30
+
31
+ ```html
32
+ <sl-multi-select aria-label="Affected services" [(value)]="services">
33
+ <sl-multi-select-item value="checkout-api" label="checkout-api" />
34
+ </sl-multi-select>
35
+ ```
36
+
37
+ ### Creating a value the list does not hold
38
+
39
+ With creatable, the offer stands as an option — ArrowDown reaches it, aria-activedescendant names it and Enter takes it — and its mark is the plus rather than the check, because nothing is in the set yet.
40
+
41
+ Excerpt — not a complete module
42
+
43
+ ```html
44
+ <sl-multi-select aria-label="Labels" creatable (valueChangeRequest)="onLabels($event)">
45
+ <sl-multi-select-item value="regression" label="regression" />
46
+ </sl-multi-select>
47
+ ```
48
+
49
+ ### A limit that is a validity, not a silence
50
+
51
+ At the limit the counter takes the accent, the root carries data-complete, every unchosen option answers aria-disabled, and what was refused leaves through valueRefuse instead of vanishing.
52
+
53
+ Example
54
+
55
+ ```ts
56
+ import { Component } from '@angular/core';
57
+ import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
58
+ import {
59
+ SlMultiSelect,
60
+ SlMultiSelectItem,
61
+ type MultiSelectOption,
62
+ } from '@slotted/angular/multi-select';
63
+
64
+ const CATEGORIES: MultiSelectOption[] = [
65
+ { value: 'beverages', label: 'Beverages' },
66
+ { value: 'condiments', label: 'Condiments' },
67
+ { value: 'confections', label: 'Confections' },
68
+ { value: 'dairy', label: 'Dairy products' },
69
+ { value: 'grains', label: 'Grains and cereals' },
70
+ { value: 'meat', label: 'Meat and poultry' },
71
+ { value: 'produce', label: 'Produce' },
72
+ { value: 'seafood', label: 'Seafood' },
73
+ ];
74
+
75
+ @Component({
76
+ selector: 'app-multi-select-limit',
77
+ imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect, SlMultiSelectItem],
78
+ template: `
79
+ <div slField>
80
+ <label slFieldLabel>Featured categories</label>
81
+ <sl-multi-select
82
+ placeholder="Add a category"
83
+ [max]="3"
84
+ [items]="categories"
85
+ [value]="featured"
86
+ >
87
+ @for (category of categories; track category.value) {
88
+ <sl-multi-select-item [value]="category.value" [label]="category.label" />
89
+ }
90
+ </sl-multi-select>
91
+ <span slFieldDescription>The storefront home page shows up to three categories.</span>
92
+ </div>
93
+ `,
94
+ })
95
+ export class MultiSelectLimit {
96
+ protected readonly categories = CATEGORIES;
97
+ protected readonly featured = ['beverages', 'confections'];
98
+ }
99
+ ```
100
+
101
+ ### Duplicates
102
+
103
+ The comparison is locale-sensitive, so P1 is already held when p1 is typed. The refusal moves focus to the chip that holds it: the reader is shown where their value is instead of being told nothing happened.
104
+
105
+ Excerpt — not a complete module
106
+
107
+ ```html
108
+ <sl-multi-select aria-label="Labels" creatable locale="pt-BR" />
109
+
110
+ <sl-multi-select aria-label="Labels" allowDuplicates creatable />
111
+ ```
112
+
113
+ ### Reorder, by keyboard first
114
+
115
+ Alt with an arrow moves the focused chip one place, following the writing direction; Alt+Home and Alt+End take it to either end. The set is unchanged and the request carries keyboard, so a consumer persisting an order listens for exactly that.
116
+
117
+ Excerpt — not a complete module
118
+
119
+ ```html
120
+ <sl-multi-select aria-label="Rollback order" reorderable (valueChangeRequest)="onOrder($event)" />
121
+ ```
122
+
123
+ ### Pasting many values at once
124
+
125
+ One list of delimiters serves the key and the paste split, so a control cannot accept a comma-separated list from the clipboard and refuse it from the keyboard. Past the limit, the rest is reported rather than dropped.
126
+
127
+ Excerpt — not a complete module
128
+
129
+ ```html
130
+ <sl-multi-select aria-label="Notify" addOnPaste creatable [delimiters]="[',', ';']" [max]="5" />
131
+ ```
132
+
133
+ ### Editing a chip in place
134
+
135
+ Enter on a focused chip turns its cell into a field, Enter commits and Escape reverts — which is the grid pattern’s own answer for a cell holding editable content. The commit is one transition, not a removal and an addition.
136
+
137
+ Excerpt — not a complete module
138
+
139
+ ```html
140
+ <sl-multi-select aria-label="Labels" creatable editable [defaultValue]="['payments-worker']" />
141
+ ```
142
+
143
+ ### Filtering, and the mark
144
+
145
+ The default comparison is locale-sensitive and the mark shows the span the collator matched, rather than a naive substring that would disagree with it. chosenOptions decides whether a value already held stays in the list.
146
+
147
+ Example
148
+
149
+ ```ts
150
+ import { Component } from '@angular/core';
151
+ import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
152
+ import { SlMultiSelect, SlMultiSelectItem } from '@slotted/angular/multi-select';
153
+
154
+ const CITIES = [
155
+ { value: 'cdz', label: 'Cádiz, Spain' },
156
+ { value: 'dus', label: 'Düsseldorf, Germany' },
157
+ { value: 'krk', label: 'Kraków, Poland' },
158
+ { value: 'mmx', label: 'Malmö, Sweden' },
159
+ { value: 'yul', label: 'Montréal, Canada' },
160
+ { value: 'gru', label: 'São Paulo, Brazil' },
161
+ { value: 'zrh', label: 'Zürich, Switzerland' },
162
+ { value: 'aar', label: 'Aarhus, Denmark' },
163
+ ];
164
+
165
+ @Component({
166
+ selector: 'app-multi-select-filtering',
167
+ imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect, SlMultiSelectItem],
168
+ template: `
169
+ <div slField>
170
+ <label slFieldLabel>Distributor cities</label>
171
+ <sl-multi-select placeholder="Search cities">
172
+ @for (city of cities; track city.value) {
173
+ <sl-multi-select-item [value]="city.value" [label]="city.label" />
174
+ }
175
+ </sl-multi-select>
176
+ <span slFieldDescription>Type “zur” or “malmo”: accents and case are ignored.</span>
177
+ </div>
178
+ `,
179
+ })
180
+ export class MultiSelectFiltering {
181
+ protected readonly cities = CITIES;
182
+ }
183
+ ```
184
+
185
+ ### Groups
186
+
187
+ A set of options under a heading the group points at with aria-labelledby. A group whose every option was filtered away leaves the surface entirely, so a heading never claims a category matched when none did.
188
+
189
+ Example
190
+
191
+ ```ts
192
+ import { Component } from '@angular/core';
193
+ import { SlField, SlFieldLabel } from '@slotted/angular/field';
194
+ import {
195
+ SlMultiSelect,
196
+ SlMultiSelectGroup,
197
+ SlMultiSelectItem,
198
+ SlMultiSelectSeparator,
199
+ type MultiSelectOptionGroup,
200
+ } from '@slotted/angular/multi-select';
201
+
202
+ const REGIONS: MultiSelectOptionGroup[] = [
203
+ {
204
+ label: 'West',
205
+ options: [
206
+ { value: 'RNO', label: 'Reno, NV' },
207
+ { value: 'ONT', label: 'Ontario, CA' },
208
+ { value: 'SEA', label: 'Kent, WA' },
209
+ ],
210
+ },
211
+ {
212
+ label: 'Central',
213
+ options: [
214
+ { value: 'DFW', label: 'Dallas, TX' },
215
+ { value: 'JOT', label: 'Joliet, IL' },
216
+ { value: 'CMH', label: 'Columbus, OH' },
217
+ ],
218
+ },
219
+ {
220
+ label: 'East',
221
+ options: [
222
+ { value: 'SAV', label: 'Savannah, GA' },
223
+ { value: 'ABE', label: 'Allentown, PA' },
224
+ { value: 'EWR', label: 'Edison, NJ' },
225
+ ],
226
+ },
227
+ ];
228
+
229
+ @Component({
230
+ selector: 'app-multi-select-groups',
231
+ imports: [
232
+ SlField,
233
+ SlFieldLabel,
234
+ SlMultiSelect,
235
+ SlMultiSelectGroup,
236
+ SlMultiSelectItem,
237
+ SlMultiSelectSeparator,
238
+ ],
239
+ template: `
240
+ <div slField>
241
+ <label slFieldLabel>Stocking warehouses</label>
242
+ <sl-multi-select placeholder="Add a warehouse" [items]="regions" [value]="stocked">
243
+ @for (region of regions; track region.label; let first = $first) {
244
+ @if (!first) {
245
+ <sl-multi-select-separator />
246
+ }
247
+ <sl-multi-select-group [label]="region.label">
248
+ @for (warehouse of region.options; track warehouse.value) {
249
+ <sl-multi-select-item [value]="warehouse.value" [label]="warehouse.label" />
250
+ }
251
+ </sl-multi-select-group>
252
+ }
253
+ </sl-multi-select>
254
+ </div>
255
+ `,
256
+ })
257
+ export class MultiSelectGroups {
258
+ protected readonly regions = REGIONS;
259
+ protected readonly stocked = ['RNO', 'SAV'];
260
+ }
261
+ ```
262
+
263
+ ### Overflow, and access to the whole set
264
+
265
+ wrap grows by rows to three and then scrolls, keeping every chip in the DOM. collapse is one line high for a table row: what did not fit becomes a counting chip that opens the popup, whose band holds every value.
266
+
267
+ Example
268
+
269
+ ```ts
270
+ import { Component } from '@angular/core';
271
+ import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
272
+ import {
273
+ SlMultiSelect,
274
+ SlMultiSelectItem,
275
+ type MultiSelectOption,
276
+ } from '@slotted/angular/multi-select';
277
+ import { SlStack } from '@slotted/angular/stack';
278
+
279
+ const WAREHOUSES: MultiSelectOption[] = [
280
+ { value: 'RNO', label: 'Reno, NV' },
281
+ { value: 'ONT', label: 'Ontario, CA' },
282
+ { value: 'SEA', label: 'Kent, WA' },
283
+ { value: 'DFW', label: 'Dallas, TX' },
284
+ { value: 'JOT', label: 'Joliet, IL' },
285
+ { value: 'CMH', label: 'Columbus, OH' },
286
+ { value: 'SAV', label: 'Savannah, GA' },
287
+ { value: 'ABE', label: 'Allentown, PA' },
288
+ { value: 'EWR', label: 'Edison, NJ' },
289
+ ];
290
+
291
+ const STOCKED = ['RNO', 'ONT', 'SEA', 'DFW', 'JOT', 'CMH', 'SAV'];
292
+
293
+ @Component({
294
+ selector: 'app-multi-select-overflow',
295
+ imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect, SlMultiSelectItem, SlStack],
296
+ template: `
297
+ <div slStack [gap]="5">
298
+ <div slField>
299
+ <label slFieldLabel>Stocking warehouses</label>
300
+ <sl-multi-select overflow="wrap" [items]="warehouses" [value]="stocked">
301
+ @for (warehouse of warehouses; track warehouse.value) {
302
+ <sl-multi-select-item [value]="warehouse.value" [label]="warehouse.label" />
303
+ }
304
+ </sl-multi-select>
305
+ <span slFieldDescription>Wrap: every chip stays in view, up to three rows.</span>
306
+ </div>
307
+ <div slField>
308
+ <label slFieldLabel>Stocking warehouses</label>
309
+ <sl-multi-select overflow="collapse" [items]="warehouses" [value]="stocked">
310
+ @for (warehouse of warehouses; track warehouse.value) {
311
+ <sl-multi-select-item [value]="warehouse.value" [label]="warehouse.label" />
312
+ }
313
+ </sl-multi-select>
314
+ <span slFieldDescription>Collapse: one row, and a count of the rest.</span>
315
+ </div>
316
+ </div>
317
+ `,
318
+ })
319
+ export class MultiSelectOverflow {
320
+ protected readonly warehouses = WAREHOUSES;
321
+ protected readonly stocked = STOCKED;
322
+ }
323
+ ```
324
+
325
+ ### Sizes
326
+
327
+ The three control steps, from the geometry every control in the library reads. An empty control is exactly the height of a text field beside it on the same form; a chip is what changes that.
328
+
329
+ Example
330
+
331
+ ```ts
332
+ import { Component } from '@angular/core';
333
+ import { SlField, SlFieldLabel } from '@slotted/angular/field';
334
+ import {
335
+ SlMultiSelect,
336
+ SlMultiSelectItem,
337
+ type MultiSelectOption,
338
+ } from '@slotted/angular/multi-select';
339
+ import { SlStack } from '@slotted/angular/stack';
340
+
341
+ const WAREHOUSES: MultiSelectOption[] = [
342
+ { value: 'RNO', label: 'Reno, NV' },
343
+ { value: 'CMH', label: 'Columbus, OH' },
344
+ { value: 'SAV', label: 'Savannah, GA' },
345
+ { value: 'DFW', label: 'Dallas, TX' },
346
+ ];
347
+
348
+ const SIZES = [
349
+ { size: 'sm', label: 'Filter by warehouse' },
350
+ { size: 'md', label: 'Stocking warehouses' },
351
+ { size: 'lg', label: 'Return warehouses' },
352
+ ] as const;
353
+
354
+ @Component({
355
+ selector: 'app-multi-select-sizes',
356
+ imports: [SlField, SlFieldLabel, SlMultiSelect, SlMultiSelectItem, SlStack],
357
+ template: `
358
+ <div slStack [gap]="5">
359
+ @for (entry of sizes; track entry.size) {
360
+ <div slField [size]="entry.size">
361
+ <label slFieldLabel>{{ entry.label }}</label>
362
+ <sl-multi-select [items]="warehouses" [value]="stocked">
363
+ @for (warehouse of warehouses; track warehouse.value) {
364
+ <sl-multi-select-item [value]="warehouse.value" [label]="warehouse.label" />
365
+ }
366
+ </sl-multi-select>
367
+ </div>
368
+ }
369
+ </div>
370
+ `,
371
+ })
372
+ export class MultiSelectSizes {
373
+ protected readonly sizes = SIZES;
374
+ protected readonly warehouses = WAREHOUSES;
375
+ protected readonly stocked = ['RNO', 'CMH'];
376
+ }
377
+ ```
378
+
379
+ ### Variants
380
+
381
+ outline for a form, subtle for a panel that already has a ground, and plain for a table cell — where an edge and a resting shadow would draw a cell that is not there.
382
+
383
+ Example
384
+
385
+ ```ts
386
+ import { Component } from '@angular/core';
387
+ import { SlField, SlFieldLabel } from '@slotted/angular/field';
388
+ import {
389
+ SlMultiSelect,
390
+ SlMultiSelectItem,
391
+ type MultiSelectOption,
392
+ } from '@slotted/angular/multi-select';
393
+ import { SlStack } from '@slotted/angular/stack';
394
+
395
+ const CHANNELS: MultiSelectOption[] = [
396
+ { value: 'web', label: 'Web store' },
397
+ { value: 'marketplace', label: 'Marketplace' },
398
+ { value: 'wholesale', label: 'Wholesale' },
399
+ { value: 'phone', label: 'Phone orders' },
400
+ ];
401
+
402
+ const VARIANTS = [
403
+ { variant: 'outline', label: 'Sales channels' },
404
+ { variant: 'subtle', label: 'Promotion channels' },
405
+ { variant: 'plain', label: 'Report channels' },
406
+ ] as const;
407
+
408
+ @Component({
409
+ selector: 'app-multi-select-variants',
410
+ imports: [SlField, SlFieldLabel, SlMultiSelect, SlMultiSelectItem, SlStack],
411
+ template: `
412
+ <div slStack [gap]="5">
413
+ @for (entry of variants; track entry.variant) {
414
+ <div slField>
415
+ <label slFieldLabel>{{ entry.label }}</label>
416
+ <sl-multi-select [variant]="entry.variant" [items]="channels" [value]="chosen">
417
+ @for (channel of channels; track channel.value) {
418
+ <sl-multi-select-item [value]="channel.value" [label]="channel.label" />
419
+ }
420
+ </sl-multi-select>
421
+ </div>
422
+ }
423
+ </div>
424
+ `,
425
+ })
426
+ export class MultiSelectVariants {
427
+ protected readonly variants = VARIANTS;
428
+ protected readonly channels = CHANNELS;
429
+ protected readonly chosen = ['web', 'wholesale'];
430
+ }
431
+ ```
432
+
433
+ ### States
434
+
435
+ disabled answers nothing and keeps its values legible; readOnly keeps the caret and the copy and withholds the popup and every remove control; invalid retints the border and the focus ring together.
436
+
437
+ Example
438
+
439
+ ```ts
440
+ import { Component } from '@angular/core';
441
+ import { SlField, SlFieldDescription, SlFieldError, SlFieldLabel } from '@slotted/angular/field';
442
+ import {
443
+ SlMultiSelect,
444
+ SlMultiSelectItem,
445
+ type MultiSelectOption,
446
+ } from '@slotted/angular/multi-select';
447
+ import { SlStack } from '@slotted/angular/stack';
448
+
449
+ const WAREHOUSES: MultiSelectOption[] = [
450
+ { value: 'RNO', label: 'Reno, NV' },
451
+ { value: 'CMH', label: 'Columbus, OH' },
452
+ { value: 'SAV', label: 'Savannah, GA' },
453
+ { value: 'DFW', label: 'Dallas, TX' },
454
+ ];
455
+
456
+ @Component({
457
+ selector: 'app-multi-select-states',
458
+ imports: [
459
+ SlField,
460
+ SlFieldDescription,
461
+ SlFieldError,
462
+ SlFieldLabel,
463
+ SlMultiSelect,
464
+ SlMultiSelectItem,
465
+ SlStack,
466
+ ],
467
+ template: `
468
+ <div slStack [gap]="5">
469
+ <div slField invalid required>
470
+ <label slFieldLabel>Stocking warehouses</label>
471
+ <sl-multi-select placeholder="Add a warehouse" [items]="warehouses">
472
+ @for (warehouse of warehouses; track warehouse.value) {
473
+ <sl-multi-select-item [value]="warehouse.value" [label]="warehouse.label" />
474
+ }
475
+ </sl-multi-select>
476
+ <span slFieldError>Choose at least one warehouse before publishing.</span>
477
+ </div>
478
+ <div slField readOnly>
479
+ <label slFieldLabel>Warehouses holding stock</label>
480
+ <sl-multi-select [items]="warehouses" [value]="holding">
481
+ @for (warehouse of warehouses; track warehouse.value) {
482
+ <sl-multi-select-item [value]="warehouse.value" [label]="warehouse.label" />
483
+ }
484
+ </sl-multi-select>
485
+ <span slFieldDescription>Updated by the nightly inventory sync.</span>
486
+ </div>
487
+ <div slField disabled>
488
+ <label slFieldLabel>Transfer warehouses</label>
489
+ <sl-multi-select [items]="warehouses" [value]="transfer">
490
+ @for (warehouse of warehouses; track warehouse.value) {
491
+ <sl-multi-select-item [value]="warehouse.value" [label]="warehouse.label" />
492
+ }
493
+ </sl-multi-select>
494
+ <span slFieldDescription>Transfers open once the purchase order is received.</span>
495
+ </div>
496
+ </div>
497
+ `,
498
+ })
499
+ export class MultiSelectStates {
500
+ protected readonly warehouses = WAREHOUSES;
501
+ protected readonly holding = ['RNO', 'SAV'];
502
+ protected readonly transfer = ['CMH'];
503
+ }
504
+ ```
505
+
506
+ ### Loading, and nothing found
507
+
508
+ While an answer travels the control shows the ring where the chevron stood and the popup shows rows the height of an option — the shape of the list that is coming. A query nothing answered keeps the surface’s measure rather than collapsing it.
509
+
510
+ Excerpt — not a complete module
511
+
512
+ ```html
513
+ <sl-multi-select aria-label="Services" loading />
514
+
515
+ <sl-multi-select aria-label="Services" [messages]="{ empty: 'No service by that name' }" />
516
+ ```
517
+
518
+ ### Content the family did not choose
519
+
520
+ A forty-character service name truncates inside its chip and stays whole in the accessibility tree; the row wraps rather than pushing the frame wider; and under 120 pixels there is no chip at all and the counter answers instead.
521
+
522
+ Excerpt — not a complete module
523
+
524
+ ```html
525
+ <sl-multi-select
526
+ aria-label="Affected services"
527
+ [defaultValue]="['notification-relay-eu-west-1-canary']"
528
+ />
529
+ ```
530
+
531
+ ### The keyboard
532
+
533
+ Backspace from an empty field moves to the last chip and removes nothing; a second press removes it. Delete takes the focused chip out, the arrows walk the row, and a printable character sends the reader back to the field.
534
+
535
+ Example
536
+
537
+ ```ts
538
+ import { Component } from '@angular/core';
539
+ import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
540
+ import {
541
+ SlMultiSelect,
542
+ SlMultiSelectItem,
543
+ type MultiSelectOption,
544
+ } from '@slotted/angular/multi-select';
545
+
546
+ const CARRIERS: MultiSelectOption[] = [
547
+ { value: 'ups', label: 'UPS Ground' },
548
+ { value: 'fedex', label: 'FedEx Ground' },
549
+ { value: 'usps', label: 'USPS Priority Mail' },
550
+ { value: 'dhl', label: 'DHL Express' },
551
+ { value: 'ontrac', label: 'OnTrac' },
552
+ ];
553
+
554
+ @Component({
555
+ selector: 'app-multi-select-keyboard',
556
+ imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect, SlMultiSelectItem],
557
+ template: `
558
+ <div slField>
559
+ <label slFieldLabel>Carrier priority</label>
560
+ <sl-multi-select
561
+ reorderable
562
+ placeholder="Add a carrier"
563
+ [items]="carriers"
564
+ [value]="priority"
565
+ >
566
+ @for (carrier of carriers; track carrier.value) {
567
+ <sl-multi-select-item [value]="carrier.value" [label]="carrier.label" />
568
+ }
569
+ </sl-multi-select>
570
+ <span slFieldDescription>
571
+ Rates are requested from the first carrier, then the next. Alt with an arrow moves the
572
+ focused carrier.
573
+ </span>
574
+ </div>
575
+ `,
576
+ })
577
+ export class MultiSelectKeyboard {
578
+ protected readonly carriers = CARRIERS;
579
+ protected readonly priority = ['usps', 'ups', 'fedex'];
580
+ }
581
+ ```
582
+
583
+ ### In a form
584
+
585
+ One hidden input per value, all under the same name, and a ControlValueAccessor with a Validator beside it — so a Reactive Form sees required, tooMany and duplicate without the consumer writing one.
586
+
587
+ Example
588
+
589
+ ```ts
590
+ import { Component, signal } from '@angular/core';
591
+ import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
592
+ import { SlButton } from '@slotted/angular/button';
593
+ import { SlField, SlFieldError, SlFieldLabel } from '@slotted/angular/field';
594
+ import { SlInline } from '@slotted/angular/inline';
595
+ import {
596
+ SlMultiSelect,
597
+ SlMultiSelectItem,
598
+ type MultiSelectOption,
599
+ } from '@slotted/angular/multi-select';
600
+ import { SlStack } from '@slotted/angular/stack';
601
+ import { SlText } from '@slotted/angular/typography';
602
+
603
+ const WAREHOUSES: MultiSelectOption[] = [
604
+ { value: 'RNO', label: 'Reno, NV' },
605
+ { value: 'CMH', label: 'Columbus, OH' },
606
+ { value: 'SAV', label: 'Savannah, GA' },
607
+ { value: 'DFW', label: 'Dallas, TX' },
608
+ ];
609
+
610
+ const CHANNELS: MultiSelectOption[] = [
611
+ { value: 'web', label: 'Web store' },
612
+ { value: 'marketplace', label: 'Marketplace' },
613
+ { value: 'wholesale', label: 'Wholesale' },
614
+ ];
615
+
616
+ @Component({
617
+ selector: 'app-multi-select-form',
618
+ imports: [
619
+ ReactiveFormsModule,
620
+ SlButton,
621
+ SlField,
622
+ SlFieldError,
623
+ SlFieldLabel,
624
+ SlInline,
625
+ SlMultiSelect,
626
+ SlMultiSelectItem,
627
+ SlStack,
628
+ SlText,
629
+ ],
630
+ template: `
631
+ <form novalidate [formGroup]="form" (ngSubmit)="submit()" (reset)="clear()">
632
+ <div slStack [gap]="5">
633
+ <div slField required [invalid]="missing() ? true : undefined">
634
+ <label slFieldLabel>Stocking warehouses</label>
635
+ <sl-multi-select
636
+ name="warehouses"
637
+ placeholder="Add a warehouse"
638
+ formControlName="warehouses"
639
+ [items]="warehouses"
640
+ (valueChange)="missing.set(false)"
641
+ >
642
+ @for (warehouse of warehouses; track warehouse.value) {
643
+ <sl-multi-select-item [value]="warehouse.value" [label]="warehouse.label" />
644
+ }
645
+ </sl-multi-select>
646
+ <span slFieldError live="polite" reserve>{{
647
+ missing() ? 'Choose at least one warehouse to stock this product.' : ''
648
+ }}</span>
649
+ </div>
650
+ <div slField>
651
+ <label slFieldLabel>Sales channels</label>
652
+ <sl-multi-select name="channels" formControlName="channels" [items]="channels">
653
+ @for (channel of channels; track channel.value) {
654
+ <sl-multi-select-item [value]="channel.value" [label]="channel.label" />
655
+ }
656
+ </sl-multi-select>
657
+ </div>
658
+ <div slInline [gap]="3" align="center">
659
+ <button slButton type="submit">Save</button>
660
+ <button slButton type="reset" tone="secondary" variant="outline">Reset</button>
661
+ @if (saved(); as message) {
662
+ <span slText size="sm" tone="muted">{{ message }}</span>
663
+ }
664
+ </div>
665
+ </div>
666
+ </form>
667
+ `,
668
+ })
669
+ export class MultiSelectForm {
670
+ protected readonly warehouses = WAREHOUSES;
671
+ protected readonly channels = CHANNELS;
672
+ /* The control's own Validator reports required, so none is written here. */
673
+ protected readonly form = new FormGroup({
674
+ warehouses: new FormControl<readonly string[]>([], { nonNullable: true }),
675
+ channels: new FormControl<readonly string[]>(['web'], { nonNullable: true }),
676
+ });
677
+ protected readonly missing = signal(false);
678
+ protected readonly saved = signal<string | null>(null);
679
+
680
+ protected submit(): void {
681
+ this.missing.set(this.form.controls.warehouses.invalid);
682
+ const { warehouses } = this.form.getRawValue();
683
+ this.saved.set(
684
+ this.form.valid
685
+ ? `Saved with ${warehouses.length} of ${WAREHOUSES.length} warehouses.`
686
+ : null,
687
+ );
688
+ }
689
+
690
+ protected clear(): void {
691
+ this.missing.set(false);
692
+ this.saved.set(null);
693
+ }
694
+ }
695
+ ```
696
+
697
+ ### Composition, and the defaults an application sets once
698
+
699
+ An injection token carries the axes, provideSlotted the language, exportAs reaches the instance from the template, and projected options keep their own content.
700
+
701
+ Excerpt — not a complete module
702
+
703
+ ```html
704
+ <sl-multi-select #services="slMultiSelect" aria-label="Affected services" />
705
+
706
+ <button type="button" (click)="services.focus()">Add a service</button>
707
+ ```
708
+
709
+ ### async-search.ts
710
+
711
+ Example
712
+
713
+ ```ts
714
+ import { Component, effect, signal } from '@angular/core';
715
+ import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
716
+ import { SlMultiSelect, SlMultiSelectItem } from '@slotted/angular/multi-select';
717
+
718
+ interface Customer {
719
+ value: string;
720
+ label: string;
721
+ city: string;
722
+ }
723
+
724
+ const CUSTOMERS: Customer[] = [
725
+ { value: 'ALFKI', label: 'Alfreds Futterkiste', city: 'Berlin' },
726
+ { value: 'ANATR', label: 'Ana Trujillo Emparedados', city: 'México D.F.' },
727
+ { value: 'BERGS', label: 'Berglunds snabbköp', city: 'Luleå' },
728
+ { value: 'BLAUS', label: 'Blauer See Delikatessen', city: 'Mannheim' },
729
+ { value: 'BONAP', label: 'Bon app’', city: 'Marseille' },
730
+ { value: 'BOTTM', label: 'Bottom-Dollar Markets', city: 'Tsawassen' },
731
+ { value: 'ERNSH', label: 'Ernst Handel', city: 'Graz' },
732
+ { value: 'FOLKO', label: 'Folk och fä HB', city: 'Bräcke' },
733
+ { value: 'FRANK', label: 'Frankenversand', city: 'München' },
734
+ { value: 'QUICK', label: 'QUICK-Stop', city: 'Cunewalde' },
735
+ { value: 'RATTC', label: 'Rattlesnake Canyon Grocery', city: 'Albuquerque' },
736
+ { value: 'SAVEA', label: 'Save-a-lot Markets', city: 'Boise' },
737
+ ];
738
+
739
+ /** Stands in for the customer search endpoint, which filters on the server. */
740
+ const searchCustomers = (query: string) =>
741
+ new Promise<Customer[]>((resolve) =>
742
+ setTimeout(() => {
743
+ const needle = query.trim().toLowerCase();
744
+ resolve(CUSTOMERS.filter((customer) => customer.label.toLowerCase().includes(needle)));
745
+ }, 600),
746
+ );
747
+
748
+ /** The first page of customers, which arrives with the page itself. */
749
+ const FIRST_PAGE = CUSTOMERS.slice(0, 6);
750
+
751
+ @Component({
752
+ selector: 'app-multi-select-async-search',
753
+ imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect, SlMultiSelectItem],
754
+ template: `
755
+ <div slField>
756
+ <label slFieldLabel>Customers in this campaign</label>
757
+ <sl-multi-select
758
+ placeholder="Search customers"
759
+ [filter]="null"
760
+ [loading]="loading()"
761
+ [messages]="{ empty: 'No customer by that name.', loading: 'Searching customers…' }"
762
+ (inputValueChange)="query.set($event)"
763
+ >
764
+ @for (customer of results(); track customer.value) {
765
+ <sl-multi-select-item
766
+ [value]="customer.value"
767
+ [label]="customer.label"
768
+ [description]="customer.city"
769
+ />
770
+ }
771
+ </sl-multi-select>
772
+ <span slFieldDescription>Each keystroke searches the customer list on the server.</span>
773
+ </div>
774
+ `,
775
+ })
776
+ export class MultiSelectAsyncSearch {
777
+ protected readonly query = signal('');
778
+ protected readonly results = signal<Customer[]>(FIRST_PAGE);
779
+ protected readonly loading = signal(false);
780
+
781
+ constructor() {
782
+ effect((onCleanup) => {
783
+ const query = this.query();
784
+ if (query.trim() === '') {
785
+ this.results.set(FIRST_PAGE);
786
+ this.loading.set(false);
787
+ return;
788
+ }
789
+ let current = true;
790
+ this.loading.set(true);
791
+ void searchCustomers(query).then((found) => {
792
+ if (!current) return;
793
+ this.results.set(found);
794
+ this.loading.set(false);
795
+ });
796
+ onCleanup(() => {
797
+ current = false;
798
+ });
799
+ });
800
+ }
801
+ }
802
+ ```
803
+
804
+ ### choose-columns.ts
805
+
806
+ Example
807
+
808
+ ```ts
809
+ import { Component, computed, signal } from '@angular/core';
810
+ import { SlButton } from '@slotted/angular/button';
811
+ import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
812
+ import { SlInline } from '@slotted/angular/inline';
813
+ import {
814
+ SlMultiSelect,
815
+ SlMultiSelectItem,
816
+ type MultiSelectOption,
817
+ } from '@slotted/angular/multi-select';
818
+ import { SlStack } from '@slotted/angular/stack';
819
+ import {
820
+ SlTable,
821
+ SlTableBody,
822
+ SlTableCell,
823
+ SlTableColumnHeader,
824
+ SlTableContent,
825
+ SlTableHead,
826
+ SlTableRow,
827
+ } from '@slotted/angular/table';
828
+
829
+ type Column = 'order' | 'customer' | 'placed' | 'items' | 'total';
830
+
831
+ const COLUMNS: (MultiSelectOption & { value: Column })[] = [
832
+ { value: 'order', label: 'Order' },
833
+ { value: 'customer', label: 'Customer' },
834
+ { value: 'placed', label: 'Placed' },
835
+ { value: 'items', label: 'Items' },
836
+ { value: 'total', label: 'Total' },
837
+ ];
838
+
839
+ const ORDERS: Record<Column, string>[] = [
840
+ {
841
+ order: 'SO-10482',
842
+ customer: 'Harbor & Pine',
843
+ placed: 'Oct 2',
844
+ items: '14',
845
+ total: '$1,240.00',
846
+ },
847
+ {
848
+ order: 'SO-10483',
849
+ customer: 'Brightline Studio',
850
+ placed: 'Oct 3',
851
+ items: '3',
852
+ total: '$318.50',
853
+ },
854
+ {
855
+ order: 'SO-10484',
856
+ customer: 'Northgate Labs',
857
+ placed: 'Oct 3',
858
+ items: '41',
859
+ total: '$2,906.10',
860
+ },
861
+ ];
862
+
863
+ const ALL = COLUMNS.map((column) => column.value);
864
+ const labelOf = (value: string) => COLUMNS.find((column) => column.value === value)?.label;
865
+
866
+ @Component({
867
+ selector: 'app-multi-select-choose-columns',
868
+ imports: [
869
+ SlButton,
870
+ SlField,
871
+ SlFieldDescription,
872
+ SlFieldLabel,
873
+ SlInline,
874
+ SlMultiSelect,
875
+ SlMultiSelectItem,
876
+ SlStack,
877
+ SlTable,
878
+ SlTableBody,
879
+ SlTableCell,
880
+ SlTableColumnHeader,
881
+ SlTableContent,
882
+ SlTableHead,
883
+ SlTableRow,
884
+ ],
885
+ template: `
886
+ <div slStack [gap]="4">
887
+ <div slField>
888
+ <div slInline [gap]="3" justify="between" align="center">
889
+ <label slFieldLabel>Columns</label>
890
+ <button
891
+ slButton
892
+ size="sm"
893
+ tone="secondary"
894
+ variant="ghost"
895
+ [disabled]="shown().length === all.length"
896
+ (click)="shown.set(all)"
897
+ >
898
+ Show all
899
+ </button>
900
+ </div>
901
+ <sl-multi-select reorderable placeholder="Add a column" [items]="options" [(value)]="shown">
902
+ @for (column of options; track column.value) {
903
+ <sl-multi-select-item [value]="column.value" [label]="column.label" />
904
+ }
905
+ </sl-multi-select>
906
+ <span slFieldDescription>
907
+ The table follows the order of the chips. Alt with an arrow moves a focused column.
908
+ </span>
909
+ </div>
910
+ <div slTable [columns]="columnCount()">
911
+ <div slTableContent aria-label="Orders">
912
+ <thead slTableHead>
913
+ <tr slTableRow>
914
+ @for (column of columns(); track column) {
915
+ <th slTableColumnHeader>{{ labelOf(column) }}</th>
916
+ }
917
+ </tr>
918
+ </thead>
919
+ <tbody slTableBody>
920
+ @for (order of orders; track order.order) {
921
+ <tr slTableRow [value]="order.order">
922
+ @for (column of columns(); track column) {
923
+ <td slTableCell>{{ order[column] }}</td>
924
+ }
925
+ </tr>
926
+ }
927
+ </tbody>
928
+ </div>
929
+ </div>
930
+ </div>
931
+ `,
932
+ })
933
+ export class MultiSelectChooseColumns {
934
+ protected readonly options = COLUMNS;
935
+ protected readonly orders = ORDERS;
936
+ protected readonly all = ALL;
937
+ protected readonly labelOf = labelOf;
938
+ protected readonly shown = signal<readonly string[]>(['order', 'customer', 'total']);
939
+ protected readonly columns = computed(() => this.shown() as readonly Column[]);
940
+ protected readonly columnCount = computed(() => Math.max(this.columns().length, 1));
941
+ }
942
+ ```
943
+
944
+ ### clearing.ts
945
+
946
+ Example
947
+
948
+ ```ts
949
+ import { Component } from '@angular/core';
950
+ import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
951
+ import {
952
+ SlMultiSelect,
953
+ SlMultiSelectItem,
954
+ type MultiSelectOption,
955
+ } from '@slotted/angular/multi-select';
956
+ import { SlStack } from '@slotted/angular/stack';
957
+
958
+ const CHANNELS: MultiSelectOption[] = [
959
+ { value: 'web', label: 'Web store' },
960
+ { value: 'marketplace', label: 'Marketplace' },
961
+ { value: 'wholesale', label: 'Wholesale' },
962
+ { value: 'phone', label: 'Phone orders' },
963
+ ];
964
+
965
+ @Component({
966
+ selector: 'app-multi-select-clearing',
967
+ imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect, SlMultiSelectItem, SlStack],
968
+ template: `
969
+ <div slStack [gap]="5">
970
+ <div slField>
971
+ <label slFieldLabel>Show orders from</label>
972
+ <sl-multi-select placeholder="All channels" [items]="channels" [value]="shown">
973
+ @for (channel of channels; track channel.value) {
974
+ <sl-multi-select-item [value]="channel.value" [label]="channel.label" />
975
+ }
976
+ </sl-multi-select>
977
+ <span slFieldDescription>The clear button empties the filter in one press.</span>
978
+ </div>
979
+ <div slField>
980
+ <label slFieldLabel>Sell through</label>
981
+ <sl-multi-select [clearable]="false" [items]="channels" [value]="selling">
982
+ @for (channel of channels; track channel.value) {
983
+ <sl-multi-select-item [value]="channel.value" [label]="channel.label" />
984
+ }
985
+ </sl-multi-select>
986
+ <span slFieldDescription>No clear button: channels come off one at a time.</span>
987
+ </div>
988
+ </div>
989
+ `,
990
+ })
991
+ export class MultiSelectClearing {
992
+ protected readonly channels = CHANNELS;
993
+ protected readonly shown = ['web', 'marketplace', 'phone'];
994
+ protected readonly selling = ['web', 'wholesale'];
995
+ }
996
+ ```
997
+
998
+ ### controlled.ts
999
+
1000
+ Example
1001
+
1002
+ ```ts
1003
+ import { Component, computed, signal } from '@angular/core';
1004
+ import { SlField, SlFieldLabel } from '@slotted/angular/field';
1005
+ import {
1006
+ SlMultiSelect,
1007
+ SlMultiSelectItem,
1008
+ type MultiSelectOption,
1009
+ } from '@slotted/angular/multi-select';
1010
+ import { SlStack } from '@slotted/angular/stack';
1011
+ import { SlText } from '@slotted/angular/typography';
1012
+
1013
+ const WAREHOUSES: MultiSelectOption[] = [
1014
+ { value: 'RNO', label: 'Reno, NV' },
1015
+ { value: 'CMH', label: 'Columbus, OH' },
1016
+ { value: 'SAV', label: 'Savannah, GA' },
1017
+ { value: 'DFW', label: 'Dallas, TX' },
1018
+ ];
1019
+
1020
+ const labelOf = (value: string) => WAREHOUSES.find((option) => option.value === value)?.label;
1021
+
1022
+ @Component({
1023
+ selector: 'app-multi-select-controlled',
1024
+ imports: [SlField, SlFieldLabel, SlMultiSelect, SlMultiSelectItem, SlStack, SlText],
1025
+ template: `
1026
+ <div slStack [gap]="3">
1027
+ <div slField>
1028
+ <label slFieldLabel>Stocking warehouses</label>
1029
+ <sl-multi-select
1030
+ placeholder="Add a warehouse"
1031
+ [items]="options"
1032
+ [(value)]="warehouses"
1033
+ (valueChangeRequest)="reason.set($event.reason)"
1034
+ >
1035
+ @for (warehouse of options; track warehouse.value) {
1036
+ <sl-multi-select-item [value]="warehouse.value" [label]="warehouse.label" />
1037
+ }
1038
+ </sl-multi-select>
1039
+ </div>
1040
+ <span slText size="sm" tone="muted">{{ summary() }}</span>
1041
+ </div>
1042
+ `,
1043
+ })
1044
+ export class MultiSelectControlled {
1045
+ protected readonly options = WAREHOUSES;
1046
+ protected readonly warehouses = signal<readonly string[]>(['RNO', 'CMH']);
1047
+ protected readonly reason = signal<string | null>(null);
1048
+ protected readonly summary = computed(() => {
1049
+ const held = this.warehouses();
1050
+ const stocked =
1051
+ held.length === 0 ? 'Not stocked anywhere' : `Stocked at ${held.map(labelOf).join('; ')}`;
1052
+ const reason = this.reason();
1053
+ return reason === null ? stocked : `${stocked} · last change: ${reason}`;
1054
+ });
1055
+ }
1056
+ ```
1057
+
1058
+ ### creatable.ts
1059
+
1060
+ Example
1061
+
1062
+ ```ts
1063
+ import { Component } from '@angular/core';
1064
+ import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
1065
+ import {
1066
+ SlMultiSelect,
1067
+ SlMultiSelectItem,
1068
+ type MultiSelectOption,
1069
+ } from '@slotted/angular/multi-select';
1070
+
1071
+ const SUGGESTED: MultiSelectOption[] = [
1072
+ { value: 'chai', label: 'chai' },
1073
+ { value: 'black tea', label: 'black tea' },
1074
+ { value: 'spiced', label: 'spiced' },
1075
+ { value: 'loose leaf', label: 'loose leaf' },
1076
+ { value: 'caffeinated', label: 'caffeinated' },
1077
+ { value: 'gift', label: 'gift' },
1078
+ ];
1079
+
1080
+ @Component({
1081
+ selector: 'app-multi-select-creatable',
1082
+ imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect, SlMultiSelectItem],
1083
+ template: `
1084
+ <div slField>
1085
+ <label slFieldLabel>Search keywords</label>
1086
+ <sl-multi-select creatable placeholder="Add a keyword" [items]="suggested" [value]="keywords">
1087
+ @for (keyword of suggested; track keyword.value) {
1088
+ <sl-multi-select-item [value]="keyword.value" [label]="keyword.label" />
1089
+ }
1090
+ </sl-multi-select>
1091
+ <span slFieldDescription>
1092
+ Type a keyword and press Enter or a comma. Shoppers find Chai tea, 24 bags by these words.
1093
+ </span>
1094
+ </div>
1095
+ `,
1096
+ })
1097
+ export class MultiSelectCreatable {
1098
+ protected readonly suggested = SUGGESTED;
1099
+ protected readonly keywords = ['chai', 'black tea'];
1100
+ }
1101
+ ```
1102
+
1103
+ ### defaults.ts
1104
+
1105
+ Example
1106
+
1107
+ ```ts
1108
+ import { Component } from '@angular/core';
1109
+ import { SlField, SlFieldLabel } from '@slotted/angular/field';
1110
+ import {
1111
+ provideMultiSelectDefaults,
1112
+ SlMultiSelect,
1113
+ SlMultiSelectItem,
1114
+ type MultiSelectOption,
1115
+ } from '@slotted/angular/multi-select';
1116
+ import { SlStack } from '@slotted/angular/stack';
1117
+
1118
+ const OWNERS: MultiSelectOption[] = [
1119
+ { value: 'avery', label: 'Avery Collins' },
1120
+ { value: 'kenji', label: 'Kenji Watanabe' },
1121
+ { value: 'lucia', label: 'Lucía Fernández' },
1122
+ { value: 'omar', label: 'Omar Haddad' },
1123
+ ];
1124
+
1125
+ const SEGMENTS: MultiSelectOption[] = [
1126
+ { value: 'enterprise', label: 'Enterprise' },
1127
+ { value: 'wholesale', label: 'Wholesale' },
1128
+ { value: 'retail', label: 'Retail' },
1129
+ ];
1130
+
1131
+ @Component({
1132
+ selector: 'app-multi-select-defaults',
1133
+ imports: [SlField, SlFieldLabel, SlMultiSelect, SlMultiSelectItem, SlStack],
1134
+ providers: [provideMultiSelectDefaults({ size: 'sm', variant: 'subtle', overflow: 'collapse' })],
1135
+ template: `
1136
+ <div slStack [gap]="4">
1137
+ <div slField>
1138
+ <label slFieldLabel>Account owners</label>
1139
+ <sl-multi-select placeholder="Any owner" [items]="owners" [value]="ownersChosen">
1140
+ @for (owner of owners; track owner.value) {
1141
+ <sl-multi-select-item [value]="owner.value" [label]="owner.label" />
1142
+ }
1143
+ </sl-multi-select>
1144
+ </div>
1145
+ <div slField>
1146
+ <label slFieldLabel>Segments</label>
1147
+ <sl-multi-select placeholder="Any segment" [items]="segments" [value]="segmentsChosen">
1148
+ @for (segment of segments; track segment.value) {
1149
+ <sl-multi-select-item [value]="segment.value" [label]="segment.label" />
1150
+ }
1151
+ </sl-multi-select>
1152
+ </div>
1153
+ </div>
1154
+ `,
1155
+ })
1156
+ export class MultiSelectDefaults {
1157
+ protected readonly owners = OWNERS;
1158
+ protected readonly segments = SEGMENTS;
1159
+ protected readonly ownersChosen = ['lucia', 'kenji'];
1160
+ protected readonly segmentsChosen = ['wholesale'];
1161
+ }
1162
+ ```
1163
+
1164
+ ### descriptions.ts
1165
+
1166
+ Example
1167
+
1168
+ ```ts
1169
+ import { Component } from '@angular/core';
1170
+ import { SlField, SlFieldLabel } from '@slotted/angular/field';
1171
+ import type { GlyphName } from '@slotted/angular/icon';
1172
+ import {
1173
+ SlMultiSelect,
1174
+ SlMultiSelectItem,
1175
+ type MultiSelectOption,
1176
+ } from '@slotted/angular/multi-select';
1177
+
1178
+ const DOCUMENTS: (MultiSelectOption & { icon: GlyphName; description: string })[] = [
1179
+ {
1180
+ value: 'invoice',
1181
+ label: 'Invoice',
1182
+ icon: 'file-text',
1183
+ description: 'PDF, issued when the order ships',
1184
+ },
1185
+ {
1186
+ value: 'packing-slip',
1187
+ label: 'Packing slip',
1188
+ icon: 'file',
1189
+ description: 'PDF, one page per parcel',
1190
+ },
1191
+ {
1192
+ value: 'customs',
1193
+ label: 'Customs declaration',
1194
+ icon: 'file-spreadsheet',
1195
+ description: 'CN23, international orders only',
1196
+ },
1197
+ {
1198
+ value: 'photos',
1199
+ label: 'Product photos',
1200
+ icon: 'file-image',
1201
+ description: 'Up to five images per line item',
1202
+ },
1203
+ ];
1204
+
1205
+ @Component({
1206
+ selector: 'app-multi-select-descriptions',
1207
+ imports: [SlField, SlFieldLabel, SlMultiSelect, SlMultiSelectItem],
1208
+ template: `
1209
+ <div slField>
1210
+ <label slFieldLabel>Attach to the shipping email</label>
1211
+ <sl-multi-select placeholder="Add a document" [items]="documents" [value]="attached">
1212
+ @for (document of documents; track document.value) {
1213
+ <sl-multi-select-item
1214
+ [value]="document.value"
1215
+ [label]="document.label"
1216
+ [description]="document.description"
1217
+ [icon]="document.icon"
1218
+ />
1219
+ }
1220
+ </sl-multi-select>
1221
+ </div>
1222
+ `,
1223
+ })
1224
+ export class MultiSelectDescriptions {
1225
+ protected readonly documents = DOCUMENTS;
1226
+ protected readonly attached = ['invoice'];
1227
+ }
1228
+ ```
1229
+
1230
+ ### disabled-options.ts
1231
+
1232
+ Example
1233
+
1234
+ ```ts
1235
+ import { Component } from '@angular/core';
1236
+ import { SlField, SlFieldLabel } from '@slotted/angular/field';
1237
+ import {
1238
+ SlMultiSelect,
1239
+ SlMultiSelectItem,
1240
+ type MultiSelectOption,
1241
+ } from '@slotted/angular/multi-select';
1242
+
1243
+ const WAREHOUSES: (MultiSelectOption & { description: string })[] = [
1244
+ { value: 'RNO', label: 'Reno, NV', description: '142 pallet spaces free' },
1245
+ { value: 'CMH', label: 'Columbus, OH', description: '38 pallet spaces free' },
1246
+ {
1247
+ value: 'SAV',
1248
+ label: 'Savannah, GA',
1249
+ description: 'At capacity until November 3',
1250
+ disabled: true,
1251
+ },
1252
+ { value: 'DFW', label: 'Dallas, TX', description: '210 pallet spaces free' },
1253
+ {
1254
+ value: 'ONT',
1255
+ label: 'Ontario, CA',
1256
+ description: 'Closed for a stock count this week',
1257
+ disabled: true,
1258
+ },
1259
+ ];
1260
+
1261
+ @Component({
1262
+ selector: 'app-multi-select-disabled-options',
1263
+ imports: [SlField, SlFieldLabel, SlMultiSelect, SlMultiSelectItem],
1264
+ template: `
1265
+ <div slField>
1266
+ <label slFieldLabel>Receiving warehouses</label>
1267
+ <sl-multi-select placeholder="Add a warehouse" [items]="warehouses" [value]="receiving">
1268
+ @for (warehouse of warehouses; track warehouse.value) {
1269
+ <sl-multi-select-item
1270
+ [value]="warehouse.value"
1271
+ [label]="warehouse.label"
1272
+ [description]="warehouse.description"
1273
+ [disabled]="warehouse.disabled ?? false"
1274
+ />
1275
+ }
1276
+ </sl-multi-select>
1277
+ </div>
1278
+ `,
1279
+ })
1280
+ export class MultiSelectDisabledOptions {
1281
+ protected readonly warehouses = WAREHOUSES;
1282
+ protected readonly receiving = ['RNO'];
1283
+ }
1284
+ ```
1285
+
1286
+ ### editable.ts
1287
+
1288
+ Example
1289
+
1290
+ ```ts
1291
+ import { Component } from '@angular/core';
1292
+ import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
1293
+ import { SlMultiSelect } from '@slotted/angular/multi-select';
1294
+
1295
+ @Component({
1296
+ selector: 'app-multi-select-editable',
1297
+ imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect],
1298
+ template: `
1299
+ <div slField>
1300
+ <label slFieldLabel>Bin locations</label>
1301
+ <sl-multi-select
1302
+ creatable
1303
+ editable
1304
+ placeholder="Add a bin"
1305
+ [value]="bins"
1306
+ [messages]="{ empty: 'Type a bin code and press Enter.' }"
1307
+ />
1308
+ <span slFieldDescription>
1309
+ Press ArrowLeft to reach a bin, then Enter to correct it in place.
1310
+ </span>
1311
+ </div>
1312
+ `,
1313
+ })
1314
+ export class MultiSelectEditable {
1315
+ protected readonly bins = ['A-12-03', 'A-12-04', 'C-02-11'];
1316
+ }
1317
+ ```
1318
+
1319
+ ### email-list.ts
1320
+
1321
+ Example
1322
+
1323
+ ```ts
1324
+ import { Component, signal } from '@angular/core';
1325
+ import { SlField, SlFieldDescription, SlFieldError, SlFieldLabel } from '@slotted/angular/field';
1326
+ import {
1327
+ SlMultiSelect,
1328
+ SlMultiSelectItem,
1329
+ type MultiSelectRefuseCause,
1330
+ } from '@slotted/angular/multi-select';
1331
+
1332
+ const TEAMS = [
1333
+ { value: 'purchasing@northwind.example', description: 'Purchasing team' },
1334
+ { value: 'warehouse-ops@northwind.example', description: 'Warehouse operations' },
1335
+ { value: 'category-managers@northwind.example', description: 'Category managers' },
1336
+ ];
1337
+
1338
+ const isEmail = (text: string) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(text.trim());
1339
+
1340
+ const REASONS: Record<MultiSelectRefuseCause, string> = {
1341
+ invalid: 'is not an email address',
1342
+ duplicate: 'is already on the list',
1343
+ limit: 'is over the limit',
1344
+ };
1345
+
1346
+ @Component({
1347
+ selector: 'app-multi-select-email-list',
1348
+ imports: [
1349
+ SlField,
1350
+ SlFieldDescription,
1351
+ SlFieldError,
1352
+ SlFieldLabel,
1353
+ SlMultiSelect,
1354
+ SlMultiSelectItem,
1355
+ ],
1356
+ template: `
1357
+ <div slField [invalid]="refused() !== null ? true : undefined">
1358
+ <label slFieldLabel>Stockout alerts</label>
1359
+ <sl-multi-select
1360
+ creatable
1361
+ placeholder="name@company.com"
1362
+ [delimiters]="delimiters"
1363
+ [value]="recipients"
1364
+ [validateValue]="isEmail"
1365
+ (valueRefuse)="refuse($event)"
1366
+ (valueChange)="refused.set(null)"
1367
+ >
1368
+ @for (team of teams; track team.value) {
1369
+ <sl-multi-select-item
1370
+ [value]="team.value"
1371
+ [label]="team.value"
1372
+ [description]="team.description"
1373
+ />
1374
+ }
1375
+ </sl-multi-select>
1376
+ @if (refused(); as message) {
1377
+ <span slFieldError live="polite">{{ message }}</span>
1378
+ } @else {
1379
+ <span slFieldDescription>Paste a list separated by commas, semicolons or spaces.</span>
1380
+ }
1381
+ </div>
1382
+ `,
1383
+ })
1384
+ export class MultiSelectEmailList {
1385
+ protected readonly teams = TEAMS;
1386
+ protected readonly delimiters = [',', ';', ' '];
1387
+ protected readonly recipients = ['purchasing@northwind.example'];
1388
+ protected readonly isEmail = isEmail;
1389
+ protected readonly refused = signal<string | null>(null);
1390
+
1391
+ protected refuse(event: { values: readonly string[]; cause: MultiSelectRefuseCause }): void {
1392
+ this.refused.set(`${event.values.join(', ')} ${REASONS[event.cause]}.`);
1393
+ }
1394
+ }
1395
+ ```
1396
+
1397
+ ### filter-bar.ts
1398
+
1399
+ Example
1400
+
1401
+ ```ts
1402
+ import { Component, computed, signal } from '@angular/core';
1403
+ import { SlGrid } from '@slotted/angular/grid';
1404
+ import {
1405
+ SlMultiSelect,
1406
+ SlMultiSelectItem,
1407
+ type MultiSelectOption,
1408
+ } from '@slotted/angular/multi-select';
1409
+ import { SlStack } from '@slotted/angular/stack';
1410
+ import {
1411
+ SlTable,
1412
+ SlTableBody,
1413
+ SlTableCell,
1414
+ SlTableColumnHeader,
1415
+ SlTableContent,
1416
+ SlTableHead,
1417
+ SlTableRow,
1418
+ SlTableRowHeader,
1419
+ } from '@slotted/angular/table';
1420
+ import { SlText } from '@slotted/angular/typography';
1421
+
1422
+ const ORDERS = [
1423
+ { id: 'SO-10482', customer: 'Harbor & Pine', status: 'open', channel: 'web', total: '$1,240.00' },
1424
+ {
1425
+ id: 'SO-10483',
1426
+ customer: 'Brightline Studio',
1427
+ status: 'on-hold',
1428
+ channel: 'phone',
1429
+ total: '$318.50',
1430
+ },
1431
+ {
1432
+ id: 'SO-10484',
1433
+ customer: 'Northgate Labs',
1434
+ status: 'shipped',
1435
+ channel: 'wholesale',
1436
+ total: '$2,906.10',
1437
+ },
1438
+ { id: 'SO-10485', customer: 'Verde Kitchen', status: 'delayed', channel: 'web', total: '$86.00' },
1439
+ {
1440
+ id: 'SO-10486',
1441
+ customer: 'Quill & Co.',
1442
+ status: 'shipped',
1443
+ channel: 'marketplace',
1444
+ total: '$540.25',
1445
+ },
1446
+ {
1447
+ id: 'SO-10487',
1448
+ customer: 'Atlas Freight',
1449
+ status: 'open',
1450
+ channel: 'wholesale',
1451
+ total: '$1,912.00',
1452
+ },
1453
+ { id: 'SO-10488', customer: 'Lumen Dental', status: 'open', channel: 'web', total: '$472.80' },
1454
+ {
1455
+ id: 'SO-10489',
1456
+ customer: 'Cobalt Outfitters',
1457
+ status: 'delayed',
1458
+ channel: 'marketplace',
1459
+ total: '$1,055.40',
1460
+ },
1461
+ ];
1462
+
1463
+ const STATUSES: MultiSelectOption[] = [
1464
+ { value: 'open', label: 'Open' },
1465
+ { value: 'on-hold', label: 'On hold' },
1466
+ { value: 'delayed', label: 'Delayed' },
1467
+ { value: 'shipped', label: 'Shipped' },
1468
+ ];
1469
+
1470
+ const CHANNELS: MultiSelectOption[] = [
1471
+ { value: 'web', label: 'Web store' },
1472
+ { value: 'marketplace', label: 'Marketplace' },
1473
+ { value: 'wholesale', label: 'Wholesale' },
1474
+ { value: 'phone', label: 'Phone orders' },
1475
+ ];
1476
+
1477
+ type Facet = 'status' | 'channel';
1478
+
1479
+ const labelOf = (options: MultiSelectOption[], value: string) =>
1480
+ options.find((option) => option.value === value)?.label;
1481
+
1482
+ const countOf = (facet: Facet, value: string) => {
1483
+ const count = ORDERS.filter((order) => order[facet] === value).length;
1484
+ return count === 1 ? '1 order' : `${count} orders`;
1485
+ };
1486
+
1487
+ @Component({
1488
+ selector: 'app-multi-select-filter-bar',
1489
+ imports: [
1490
+ SlGrid,
1491
+ SlMultiSelect,
1492
+ SlMultiSelectItem,
1493
+ SlStack,
1494
+ SlTable,
1495
+ SlTableBody,
1496
+ SlTableCell,
1497
+ SlTableColumnHeader,
1498
+ SlTableContent,
1499
+ SlTableHead,
1500
+ SlTableRow,
1501
+ SlTableRowHeader,
1502
+ SlText,
1503
+ ],
1504
+ template: `
1505
+ <div slStack [gap]="3">
1506
+ <div slGrid [columns]="2" [gap]="3">
1507
+ <sl-multi-select
1508
+ aria-label="Status"
1509
+ placeholder="All statuses"
1510
+ size="sm"
1511
+ overflow="collapse"
1512
+ [items]="statusOptions"
1513
+ [(value)]="statuses"
1514
+ >
1515
+ @for (status of statusOptions; track status.value) {
1516
+ <sl-multi-select-item
1517
+ [value]="status.value"
1518
+ [label]="status.label"
1519
+ [description]="countOf('status', status.value)"
1520
+ />
1521
+ }
1522
+ </sl-multi-select>
1523
+ <sl-multi-select
1524
+ aria-label="Channel"
1525
+ placeholder="All channels"
1526
+ size="sm"
1527
+ overflow="collapse"
1528
+ [items]="channelOptions"
1529
+ [(value)]="channels"
1530
+ >
1531
+ @for (channel of channelOptions; track channel.value) {
1532
+ <sl-multi-select-item
1533
+ [value]="channel.value"
1534
+ [label]="channel.label"
1535
+ [description]="countOf('channel', channel.value)"
1536
+ />
1537
+ }
1538
+ </sl-multi-select>
1539
+ </div>
1540
+ <span slText size="sm" tone="muted">{{ rows().length }} of {{ orders.length }} orders</span>
1541
+ <div slTable [columns]="5">
1542
+ <div slTableContent aria-label="Orders">
1543
+ <thead slTableHead>
1544
+ <tr slTableRow>
1545
+ <th slTableColumnHeader>Order</th>
1546
+ <th slTableColumnHeader>Customer</th>
1547
+ <th slTableColumnHeader>Status</th>
1548
+ <th slTableColumnHeader>Channel</th>
1549
+ <th slTableColumnHeader numeric>Total</th>
1550
+ </tr>
1551
+ </thead>
1552
+ <tbody slTableBody>
1553
+ @for (order of rows(); track order.id) {
1554
+ <tr slTableRow [value]="order.id">
1555
+ <th slTableRowHeader>{{ order.id }}</th>
1556
+ <td slTableCell>{{ order.customer }}</td>
1557
+ <td slTableCell>{{ labelOf(statusOptions, order.status) }}</td>
1558
+ <td slTableCell>{{ labelOf(channelOptions, order.channel) }}</td>
1559
+ <td slTableCell numeric>{{ order.total }}</td>
1560
+ </tr>
1561
+ }
1562
+ </tbody>
1563
+ </div>
1564
+ </div>
1565
+ </div>
1566
+ `,
1567
+ })
1568
+ export class MultiSelectFilterBar {
1569
+ protected readonly orders = ORDERS;
1570
+ protected readonly statusOptions = STATUSES;
1571
+ protected readonly channelOptions = CHANNELS;
1572
+ protected readonly labelOf = labelOf;
1573
+ protected readonly countOf = countOf;
1574
+ protected readonly statuses = signal<readonly string[]>(['open', 'delayed']);
1575
+ protected readonly channels = signal<readonly string[]>([]);
1576
+ protected readonly rows = computed(() => {
1577
+ const statuses = this.statuses();
1578
+ const channels = this.channels();
1579
+ return ORDERS.filter(
1580
+ (order) =>
1581
+ (statuses.length === 0 || statuses.includes(order.status)) &&
1582
+ (channels.length === 0 || channels.includes(order.channel)),
1583
+ );
1584
+ });
1585
+ }
1586
+ ```
1587
+
1588
+ ### initial-value.ts
1589
+
1590
+ Example
1591
+
1592
+ ```ts
1593
+ import { Component } from '@angular/core';
1594
+ import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
1595
+ import {
1596
+ SlMultiSelect,
1597
+ SlMultiSelectItem,
1598
+ type MultiSelectOption,
1599
+ } from '@slotted/angular/multi-select';
1600
+
1601
+ const WAREHOUSES: MultiSelectOption[] = [
1602
+ { value: 'RNO', label: 'Reno, NV' },
1603
+ { value: 'CMH', label: 'Columbus, OH' },
1604
+ { value: 'SAV', label: 'Savannah, GA' },
1605
+ { value: 'DFW', label: 'Dallas, TX' },
1606
+ { value: 'ONT', label: 'Ontario, CA' },
1607
+ { value: 'ABE', label: 'Allentown, PA' },
1608
+ ];
1609
+
1610
+ @Component({
1611
+ selector: 'app-multi-select-initial-value',
1612
+ imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect, SlMultiSelectItem],
1613
+ template: `
1614
+ <div slField>
1615
+ <label slFieldLabel>Stocking warehouses</label>
1616
+ <sl-multi-select placeholder="Add a warehouse" [items]="warehouses" [value]="stocked">
1617
+ @for (warehouse of warehouses; track warehouse.value) {
1618
+ <sl-multi-select-item [value]="warehouse.value" [label]="warehouse.label" />
1619
+ }
1620
+ </sl-multi-select>
1621
+ <span slFieldDescription>Earl Grey, 100 bags is stocked at two warehouses.</span>
1622
+ </div>
1623
+ `,
1624
+ })
1625
+ export class MultiSelectInitialValue {
1626
+ protected readonly warehouses = WAREHOUSES;
1627
+ protected readonly stocked = ['RNO', 'CMH'];
1628
+ }
1629
+ ```
1630
+
1631
+ ### loading.ts
1632
+
1633
+ Example
1634
+
1635
+ ```ts
1636
+ import { Component, signal } from '@angular/core';
1637
+ import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
1638
+ import {
1639
+ SlMultiSelect,
1640
+ SlMultiSelectItem,
1641
+ type MultiSelectOption,
1642
+ } from '@slotted/angular/multi-select';
1643
+
1644
+ const CARRIERS: MultiSelectOption[] = [
1645
+ { value: 'ups', label: 'UPS Ground' },
1646
+ { value: 'fedex', label: 'FedEx Ground' },
1647
+ { value: 'usps', label: 'USPS Priority Mail' },
1648
+ { value: 'dhl', label: 'DHL Express' },
1649
+ ];
1650
+
1651
+ /** Stands in for a request to the shipping rates API. */
1652
+ const fetchCarriers = () =>
1653
+ new Promise<MultiSelectOption[]>((resolve) => setTimeout(() => resolve(CARRIERS), 1500));
1654
+
1655
+ @Component({
1656
+ selector: 'app-multi-select-loading',
1657
+ imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect, SlMultiSelectItem],
1658
+ template: `
1659
+ <div slField>
1660
+ <label slFieldLabel>Carriers offered at checkout</label>
1661
+ <sl-multi-select
1662
+ placeholder="Add a carrier"
1663
+ [loading]="loading()"
1664
+ [items]="carriers()"
1665
+ [messages]="{ loading: 'Fetching carriers…' }"
1666
+ (openChange)="load($event)"
1667
+ >
1668
+ @for (carrier of carriers(); track carrier.value) {
1669
+ <sl-multi-select-item [value]="carrier.value" [label]="carrier.label" />
1670
+ }
1671
+ </sl-multi-select>
1672
+ <span slFieldDescription>Carriers load from the rates service when the list opens.</span>
1673
+ </div>
1674
+ `,
1675
+ })
1676
+ export class MultiSelectLoading {
1677
+ protected readonly carriers = signal<MultiSelectOption[]>([]);
1678
+ protected readonly loading = signal(false);
1679
+ private loaded = false;
1680
+
1681
+ protected async load(open: boolean): Promise<void> {
1682
+ if (!open || this.loaded || this.loading()) return;
1683
+ this.loading.set(true);
1684
+ this.carriers.set(await fetchCarriers());
1685
+ this.loading.set(false);
1686
+ this.loaded = true;
1687
+ }
1688
+ }
1689
+ ```
1690
+
1691
+ ### long-list.ts
1692
+
1693
+ Example
1694
+
1695
+ ```ts
1696
+ import { Component } from '@angular/core';
1697
+ import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
1698
+ import {
1699
+ SlMultiSelect,
1700
+ SlMultiSelectItem,
1701
+ type MultiSelectOption,
1702
+ } from '@slotted/angular/multi-select';
1703
+
1704
+ const STATES: MultiSelectOption[] = [
1705
+ { value: 'AL', label: 'Alabama' },
1706
+ { value: 'AK', label: 'Alaska' },
1707
+ { value: 'AZ', label: 'Arizona' },
1708
+ { value: 'AR', label: 'Arkansas' },
1709
+ { value: 'CA', label: 'California' },
1710
+ { value: 'CO', label: 'Colorado' },
1711
+ { value: 'CT', label: 'Connecticut' },
1712
+ { value: 'DE', label: 'Delaware' },
1713
+ { value: 'FL', label: 'Florida' },
1714
+ { value: 'GA', label: 'Georgia' },
1715
+ { value: 'HI', label: 'Hawaii' },
1716
+ { value: 'ID', label: 'Idaho' },
1717
+ { value: 'IL', label: 'Illinois' },
1718
+ { value: 'IN', label: 'Indiana' },
1719
+ { value: 'IA', label: 'Iowa' },
1720
+ { value: 'KS', label: 'Kansas' },
1721
+ { value: 'KY', label: 'Kentucky' },
1722
+ { value: 'LA', label: 'Louisiana' },
1723
+ { value: 'ME', label: 'Maine' },
1724
+ { value: 'MD', label: 'Maryland' },
1725
+ { value: 'MA', label: 'Massachusetts' },
1726
+ { value: 'MI', label: 'Michigan' },
1727
+ { value: 'MN', label: 'Minnesota' },
1728
+ { value: 'MS', label: 'Mississippi' },
1729
+ { value: 'MO', label: 'Missouri' },
1730
+ { value: 'MT', label: 'Montana' },
1731
+ { value: 'NE', label: 'Nebraska' },
1732
+ { value: 'NV', label: 'Nevada' },
1733
+ { value: 'NH', label: 'New Hampshire' },
1734
+ { value: 'NJ', label: 'New Jersey' },
1735
+ { value: 'NM', label: 'New Mexico' },
1736
+ { value: 'NY', label: 'New York' },
1737
+ { value: 'NC', label: 'North Carolina' },
1738
+ { value: 'ND', label: 'North Dakota' },
1739
+ { value: 'OH', label: 'Ohio' },
1740
+ { value: 'OK', label: 'Oklahoma' },
1741
+ { value: 'OR', label: 'Oregon' },
1742
+ { value: 'PA', label: 'Pennsylvania' },
1743
+ { value: 'RI', label: 'Rhode Island' },
1744
+ { value: 'SC', label: 'South Carolina' },
1745
+ { value: 'SD', label: 'South Dakota' },
1746
+ { value: 'TN', label: 'Tennessee' },
1747
+ { value: 'TX', label: 'Texas' },
1748
+ { value: 'UT', label: 'Utah' },
1749
+ { value: 'VT', label: 'Vermont' },
1750
+ { value: 'VA', label: 'Virginia' },
1751
+ { value: 'WA', label: 'Washington' },
1752
+ { value: 'WV', label: 'West Virginia' },
1753
+ { value: 'WI', label: 'Wisconsin' },
1754
+ { value: 'WY', label: 'Wyoming' },
1755
+ ];
1756
+
1757
+ @Component({
1758
+ selector: 'app-multi-select-long-list',
1759
+ imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect, SlMultiSelectItem],
1760
+ template: `
1761
+ <div slField>
1762
+ <label slFieldLabel>Ship-to states</label>
1763
+ <sl-multi-select
1764
+ chosenOptions="hide"
1765
+ placeholder="Add a state"
1766
+ [items]="states"
1767
+ [value]="shipTo"
1768
+ >
1769
+ @for (state of states; track state.value) {
1770
+ <sl-multi-select-item [value]="state.value" [label]="state.label" />
1771
+ }
1772
+ </sl-multi-select>
1773
+ <span slFieldDescription
1774
+ >Ground shipping from Reno, NV reaches these states in two days.</span
1775
+ >
1776
+ </div>
1777
+ `,
1778
+ })
1779
+ export class MultiSelectLongList {
1780
+ protected readonly states = STATES;
1781
+ protected readonly shipTo = ['CA', 'NV', 'OR'];
1782
+ }
1783
+ ```
1784
+
1785
+ ### narrow.ts
1786
+
1787
+ Example
1788
+
1789
+ ```ts
1790
+ import { Component } from '@angular/core';
1791
+ import { SlField, SlFieldLabel } from '@slotted/angular/field';
1792
+ import {
1793
+ SlMultiSelect,
1794
+ SlMultiSelectItem,
1795
+ type MultiSelectOption,
1796
+ } from '@slotted/angular/multi-select';
1797
+ import { SlStack } from '@slotted/angular/stack';
1798
+
1799
+ const CHANNELS: MultiSelectOption[] = [
1800
+ { value: 'web', label: 'Web store' },
1801
+ { value: 'marketplace', label: 'Marketplace' },
1802
+ { value: 'wholesale', label: 'Wholesale' },
1803
+ { value: 'phone', label: 'Phone orders' },
1804
+ ];
1805
+
1806
+ @Component({
1807
+ selector: 'app-multi-select-narrow',
1808
+ imports: [SlField, SlFieldLabel, SlMultiSelect, SlMultiSelectItem, SlStack],
1809
+ template: `
1810
+ <div slStack [gap]="4" style="inline-size: 7rem">
1811
+ <div slField>
1812
+ <label slFieldLabel>Channels</label>
1813
+ <sl-multi-select size="sm" width="content" [items]="channels" [value]="chosen">
1814
+ @for (channel of channels; track channel.value) {
1815
+ <sl-multi-select-item [value]="channel.value" [label]="channel.label" />
1816
+ }
1817
+ </sl-multi-select>
1818
+ </div>
1819
+ </div>
1820
+ `,
1821
+ })
1822
+ export class MultiSelectNarrow {
1823
+ protected readonly channels = CHANNELS;
1824
+ protected readonly chosen = ['web', 'marketplace', 'wholesale'];
1825
+ }
1826
+ ```
1827
+
1828
+ ### order-tags.ts
1829
+
1830
+ Example
1831
+
1832
+ ```ts
1833
+ import { Component } from '@angular/core';
1834
+ import {
1835
+ SlMultiSelect,
1836
+ SlMultiSelectItem,
1837
+ type MultiSelectOption,
1838
+ } from '@slotted/angular/multi-select';
1839
+ import {
1840
+ SlTable,
1841
+ SlTableBody,
1842
+ SlTableCell,
1843
+ SlTableColumnHeader,
1844
+ SlTableContent,
1845
+ SlTableHead,
1846
+ SlTableRow,
1847
+ SlTableRowHeader,
1848
+ } from '@slotted/angular/table';
1849
+
1850
+ const TAGS: MultiSelectOption[] = [
1851
+ { value: 'priority', label: 'priority' },
1852
+ { value: 'gift wrap', label: 'gift wrap' },
1853
+ { value: 'fragile', label: 'fragile' },
1854
+ { value: 'backorder', label: 'backorder' },
1855
+ { value: 'address check', label: 'address check' },
1856
+ { value: 'wholesale', label: 'wholesale' },
1857
+ ];
1858
+
1859
+ const ORDERS = [
1860
+ { id: 'SO-10482', customer: 'Harbor & Pine', tags: ['priority', 'fragile'] },
1861
+ { id: 'SO-10483', customer: 'Brightline Studio', tags: ['address check'] },
1862
+ { id: 'SO-10484', customer: 'Northgate Labs', tags: ['wholesale', 'backorder', 'priority'] },
1863
+ { id: 'SO-10485', customer: 'Verde Kitchen', tags: [] },
1864
+ ];
1865
+
1866
+ @Component({
1867
+ selector: 'app-multi-select-order-tags',
1868
+ imports: [
1869
+ SlMultiSelect,
1870
+ SlMultiSelectItem,
1871
+ SlTable,
1872
+ SlTableBody,
1873
+ SlTableCell,
1874
+ SlTableColumnHeader,
1875
+ SlTableContent,
1876
+ SlTableHead,
1877
+ SlTableRow,
1878
+ SlTableRowHeader,
1879
+ ],
1880
+ template: `
1881
+ <div slTable [columns]="3">
1882
+ <div slTableContent aria-label="Orders">
1883
+ <thead slTableHead>
1884
+ <tr slTableRow>
1885
+ <th slTableColumnHeader>Order</th>
1886
+ <th slTableColumnHeader>Customer</th>
1887
+ <th slTableColumnHeader>Tags</th>
1888
+ </tr>
1889
+ </thead>
1890
+ <tbody slTableBody>
1891
+ @for (order of orders; track order.id) {
1892
+ <tr slTableRow [value]="order.id">
1893
+ <th slTableRowHeader>{{ order.id }}</th>
1894
+ <td slTableCell>{{ order.customer }}</td>
1895
+ <td slTableCell>
1896
+ <sl-multi-select
1897
+ variant="plain"
1898
+ size="sm"
1899
+ overflow="collapse"
1900
+ creatable
1901
+ placeholder="Add a tag"
1902
+ [aria-label]="'Tags for ' + order.id"
1903
+ [items]="tags"
1904
+ [value]="order.tags"
1905
+ >
1906
+ @for (tag of tags; track tag.value) {
1907
+ <sl-multi-select-item [value]="tag.value" [label]="tag.label" />
1908
+ }
1909
+ </sl-multi-select>
1910
+ </td>
1911
+ </tr>
1912
+ }
1913
+ </tbody>
1914
+ </div>
1915
+ </div>
1916
+ `,
1917
+ })
1918
+ export class MultiSelectOrderTags {
1919
+ protected readonly tags = TAGS;
1920
+ protected readonly orders = ORDERS;
1921
+ }
1922
+ ```