@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,1314 @@
1
+ {
2
+ "family": "multi-select",
3
+ "ui": "multi-select",
4
+ "binding": "angular",
5
+ "catalog": {
6
+ "group": "Forms",
7
+ "summary": "Picks several options shown as tags."
8
+ },
9
+ "axes": {
10
+ "size": [
11
+ "sm",
12
+ "md",
13
+ "lg"
14
+ ],
15
+ "variant": [
16
+ "outline",
17
+ "subtle",
18
+ "plain"
19
+ ],
20
+ "side": [
21
+ "bottom",
22
+ "top",
23
+ "inline-start",
24
+ "inline-end",
25
+ "left",
26
+ "right"
27
+ ],
28
+ "align": [
29
+ "start",
30
+ "center",
31
+ "end"
32
+ ],
33
+ "width": [
34
+ "anchor",
35
+ "content"
36
+ ],
37
+ "mount": [
38
+ "active",
39
+ "lazy",
40
+ "eager"
41
+ ],
42
+ "strategy": [
43
+ "absolute",
44
+ "fixed"
45
+ ],
46
+ "openOn": [
47
+ "input",
48
+ "focus",
49
+ "manual"
50
+ ],
51
+ "overflow": [
52
+ "wrap",
53
+ "collapse"
54
+ ],
55
+ "chosenOptions": [
56
+ "show",
57
+ "hide"
58
+ ],
59
+ "creatable": [
60
+ true,
61
+ false
62
+ ],
63
+ "editable": [
64
+ true,
65
+ false
66
+ ],
67
+ "reorderable": [
68
+ true,
69
+ false
70
+ ],
71
+ "allowDuplicates": [
72
+ true,
73
+ false
74
+ ],
75
+ "commitOnBlur": [
76
+ true,
77
+ false
78
+ ],
79
+ "addOnPaste": [
80
+ true,
81
+ false
82
+ ],
83
+ "clearable": [
84
+ true,
85
+ false
86
+ ],
87
+ "loop": [
88
+ true,
89
+ false
90
+ ],
91
+ "highlightMatch": [
92
+ true,
93
+ false
94
+ ],
95
+ "closeOnSelect": [
96
+ true,
97
+ false
98
+ ],
99
+ "closeOnEscape": [
100
+ true,
101
+ false
102
+ ],
103
+ "closeOnOutsidePress": [
104
+ true,
105
+ false
106
+ ],
107
+ "flip": [
108
+ true,
109
+ false
110
+ ],
111
+ "shift": [
112
+ true,
113
+ false
114
+ ],
115
+ "hideWhenDetached": [
116
+ true,
117
+ false
118
+ ],
119
+ "portal": [
120
+ true,
121
+ false
122
+ ],
123
+ "fullWidth": [
124
+ true,
125
+ false
126
+ ],
127
+ "disabled": [
128
+ true,
129
+ false
130
+ ],
131
+ "readOnly": [
132
+ true,
133
+ false
134
+ ],
135
+ "required": [
136
+ true,
137
+ false
138
+ ],
139
+ "invalid": [
140
+ true,
141
+ false
142
+ ],
143
+ "loading": [
144
+ true,
145
+ false
146
+ ]
147
+ },
148
+ "members": {
149
+ "multi-select": {
150
+ "nativeElement": "div",
151
+ "defaults": {
152
+ "size": "md",
153
+ "variant": "outline",
154
+ "side": "bottom",
155
+ "align": "start",
156
+ "width": "content",
157
+ "mount": "active",
158
+ "strategy": "absolute",
159
+ "openOn": "input",
160
+ "overflow": "wrap",
161
+ "chosenOptions": "show",
162
+ "creatable": false,
163
+ "editable": false,
164
+ "reorderable": false,
165
+ "allowDuplicates": false,
166
+ "commitOnBlur": true,
167
+ "addOnPaste": true,
168
+ "clearable": true,
169
+ "loop": false,
170
+ "highlightMatch": true,
171
+ "closeOnSelect": false,
172
+ "closeOnEscape": true,
173
+ "closeOnOutsidePress": true,
174
+ "flip": true,
175
+ "shift": true,
176
+ "hideWhenDetached": true,
177
+ "portal": true,
178
+ "fullWidth": true,
179
+ "disabled": false,
180
+ "readOnly": false,
181
+ "required": false,
182
+ "invalid": false,
183
+ "loading": false,
184
+ "max": null,
185
+ "delimiters": [
186
+ ","
187
+ ],
188
+ "sideOffset": 4,
189
+ "alignOffset": 0,
190
+ "collisionPadding": 8
191
+ },
192
+ "capabilities": [
193
+ "value",
194
+ "selection",
195
+ "open",
196
+ "current",
197
+ "overflow",
198
+ "size",
199
+ "appearance",
200
+ "placement",
201
+ "content",
202
+ "fullWidth",
203
+ "disabled",
204
+ "loading",
205
+ "readOnly",
206
+ "required",
207
+ "invalid",
208
+ "wiring"
209
+ ],
210
+ "states": [
211
+ "default",
212
+ "hover",
213
+ "active",
214
+ "focus-visible",
215
+ "open",
216
+ "disabled",
217
+ "readonly",
218
+ "invalid",
219
+ "required",
220
+ "loading",
221
+ "selected",
222
+ "current",
223
+ "complete"
224
+ ],
225
+ "parts": [
226
+ "root",
227
+ "control",
228
+ "chips",
229
+ "field",
230
+ "input",
231
+ "counter",
232
+ "busy",
233
+ "clear",
234
+ "trigger",
235
+ "arrow",
236
+ "positioner",
237
+ "content",
238
+ "chosen",
239
+ "group",
240
+ "group-label",
241
+ "item",
242
+ "indicator",
243
+ "icon",
244
+ "label",
245
+ "match",
246
+ "description",
247
+ "separator",
248
+ "empty",
249
+ "status",
250
+ "placeholder"
251
+ ]
252
+ }
253
+ },
254
+ "docs": {
255
+ "multi-select": {
256
+ "imports": {
257
+ "source": "import { SlMultiSelect, SlMultiSelectGroup, SlMultiSelectItem, SlMultiSelectSeparator } from '@slotted/angular/multi-select';",
258
+ "selector": "sl-multi-select, sl-multi-select-group, sl-multi-select-item, sl-multi-select-separator",
259
+ "exportAs": "slMultiSelect, slMultiSelectGroup, slMultiSelectItem, slMultiSelectSeparator"
260
+ },
261
+ "anatomy": [
262
+ {
263
+ "part": "root",
264
+ "element": "sl-multi-select, the host element itself",
265
+ "required": true,
266
+ "purpose": "The frame, carrying data-ui=\"multi-select\". It draws the border, the shadow, the focus ring and every state. Its height is not fixed: it grows by whole rows of tags up to three, then scrolls."
267
+ },
268
+ {
269
+ "part": "control",
270
+ "element": "div with role=\"grid\"",
271
+ "required": true,
272
+ "purpose": "The layout grid that holds the tags and the field, as the APG grid pattern describes for a list of message recipients. Its aria-label carries the number of chosen values, such as \"2 chosen\"."
273
+ },
274
+ {
275
+ "part": "chips",
276
+ "element": "div with role=\"row\"",
277
+ "required": true,
278
+ "purpose": "One row in the DOM, however many lines it wraps to. The wrap is CSS, so the reading order stays linear and ArrowDown and ArrowUp stay with the list. Past three rows it scrolls, and it draws no scrollbar inside the frame."
279
+ },
280
+ {
281
+ "part": "field",
282
+ "element": "span with role=\"gridcell\"",
283
+ "required": true,
284
+ "purpose": "The last cell of the row, holding the input. It wraps with the tags instead of moving to a line of its own, and it takes the width of a word with a floor of two characters."
285
+ },
286
+ {
287
+ "part": "input",
288
+ "element": "input with role=\"combobox\"",
289
+ "required": true,
290
+ "purpose": "A native text input, so text editing, the caret, selection, IME and autofill work as in any input. It is the tab stop of the control and carries aria-expanded, aria-controls and aria-activedescendant."
291
+ },
292
+ {
293
+ "part": "counter",
294
+ "element": "span",
295
+ "required": false,
296
+ "purpose": "The number of values against max, such as \"2 of 3\", or the number chosen while the frame is too narrow for a tag. It is drawn only in those two cases."
297
+ },
298
+ {
299
+ "part": "busy",
300
+ "element": "span",
301
+ "required": false,
302
+ "purpose": "The spinner that stands in place of the chevron while loading is set, because the list has nothing to open onto yet."
303
+ },
304
+ {
305
+ "part": "clear",
306
+ "element": "button",
307
+ "required": false,
308
+ "purpose": "Removes every value and the typed text at once, under the reason clear. It is drawn while clearable is set and the control holds a value or typed text."
309
+ },
310
+ {
311
+ "part": "trigger",
312
+ "element": "button",
313
+ "required": true,
314
+ "purpose": "Opens and closes the list with the pointer. It carries tabindex=\"-1\", because the combobox pattern keeps the popup indicator out of the tab sequence."
315
+ },
316
+ {
317
+ "part": "arrow",
318
+ "element": "span",
319
+ "required": true,
320
+ "purpose": "The chevron inside the trigger, a Glyph inside an Icon box, turned over while the list is open."
321
+ },
322
+ {
323
+ "part": "positioner",
324
+ "element": "div, rendered by the layer template",
325
+ "required": true,
326
+ "purpose": "The layer, portalled to the end of the document. It carries data-ui=\"multi-select\" as well, so the stylesheet reaches the list outside the root."
327
+ },
328
+ {
329
+ "part": "content",
330
+ "element": "div with role=\"listbox\" and aria-multiselectable",
331
+ "required": true,
332
+ "purpose": "The list surface. Selection does not follow the highlight: moving through the options chooses nothing, which departs from the combobox pattern on purpose."
333
+ },
334
+ {
335
+ "part": "chosen",
336
+ "element": "div",
337
+ "required": false,
338
+ "purpose": "Every chosen value as a tag, at the top of the list, whatever the row in the control shows. With overflow=\"collapse\", the values the +N tag counts stay readable here."
339
+ },
340
+ {
341
+ "part": "group",
342
+ "element": "div with role=\"group\"",
343
+ "required": false,
344
+ "purpose": "A run of options under a name. A group whose options were all filtered away is hidden with its heading, so a heading never claims a match."
345
+ },
346
+ {
347
+ "part": "group-label",
348
+ "element": "div",
349
+ "required": false,
350
+ "purpose": "The name of a group, which the group references with aria-labelledby."
351
+ },
352
+ {
353
+ "part": "item",
354
+ "element": "div with role=\"option\"",
355
+ "required": true,
356
+ "purpose": "One option. It compares its own label with the query and is hidden when it does not match. Pressing an option already chosen removes its value."
357
+ },
358
+ {
359
+ "part": "indicator",
360
+ "element": "span",
361
+ "required": true,
362
+ "purpose": "The check on a chosen option, and the plus on the option that adds the typed text."
363
+ },
364
+ {
365
+ "part": "icon",
366
+ "element": "span",
367
+ "required": false,
368
+ "purpose": "The first column of an option, for an icon that makes rows recognisable."
369
+ },
370
+ {
371
+ "part": "label",
372
+ "element": "span",
373
+ "required": true,
374
+ "purpose": "The text the reader chooses by, clamped to two lines. Its rules apply inside the option only, so the label of a tag keeps its own."
375
+ },
376
+ {
377
+ "part": "match",
378
+ "element": "mark, the match part of the highlight component, inside label",
379
+ "required": false,
380
+ "purpose": "The span of the label the query matched, drawn by the highlight stylesheet, so every filtered list marks a match the same way."
381
+ },
382
+ {
383
+ "part": "description",
384
+ "element": "span",
385
+ "required": false,
386
+ "purpose": "A second line under the label of an option, for detail the label has no room for."
387
+ },
388
+ {
389
+ "part": "separator",
390
+ "element": "div with role=\"separator\"",
391
+ "required": false,
392
+ "purpose": "A line between two runs of options."
393
+ },
394
+ {
395
+ "part": "empty",
396
+ "element": "div",
397
+ "required": false,
398
+ "purpose": "The message shown when no option matches. It keeps the width of the list, so nothing shifts when results arrive."
399
+ },
400
+ {
401
+ "part": "status",
402
+ "element": "div with role=\"status\"",
403
+ "required": true,
404
+ "purpose": "The live region, and the loading row. It announces how many options match the query."
405
+ },
406
+ {
407
+ "part": "placeholder",
408
+ "element": "div holding skeleton rows",
409
+ "required": false,
410
+ "purpose": "Rows the height of an option, standing in for the options while they load. Hidden from assistive technology, because the status row announces the wait."
411
+ }
412
+ ],
413
+ "api": [
414
+ {
415
+ "name": "value",
416
+ "type": "readonly string[]",
417
+ "defaultValue": "—",
418
+ "appliesTo": "sl-multi-select",
419
+ "description": "The chosen values, in the order the reader chose them. A model, so [(value)] binds both ways."
420
+ },
421
+ {
422
+ "name": "defaultValue",
423
+ "type": "readonly string[]",
424
+ "defaultValue": "—",
425
+ "appliesTo": "sl-multi-select",
426
+ "description": "The values an unbound multi-select starts with, read once in ngOnInit."
427
+ },
428
+ {
429
+ "name": "inputValue",
430
+ "type": "string",
431
+ "defaultValue": "—",
432
+ "appliesTo": "sl-multi-select",
433
+ "description": "The text in the input. It is emptied whenever a value is committed. A model."
434
+ },
435
+ {
436
+ "name": "open",
437
+ "type": "boolean",
438
+ "defaultValue": "—",
439
+ "appliesTo": "sl-multi-select",
440
+ "description": "Whether the list is open. A model."
441
+ },
442
+ {
443
+ "name": "highlightedValue",
444
+ "type": "string | null",
445
+ "defaultValue": "—",
446
+ "appliesTo": "sl-multi-select",
447
+ "description": "The option the highlight is on, which is not a chosen option. A model."
448
+ },
449
+ {
450
+ "name": "aria-label",
451
+ "type": "string",
452
+ "defaultValue": "—",
453
+ "appliesTo": "sl-multi-select",
454
+ "description": "Names the input and the list, for a multi-select outside a field."
455
+ },
456
+ {
457
+ "name": "placeholder",
458
+ "type": "string",
459
+ "defaultValue": "—",
460
+ "appliesTo": "sl-multi-select",
461
+ "description": "The text the input shows while no value is chosen."
462
+ },
463
+ {
464
+ "name": "items",
465
+ "type": "MultiSelectItems",
466
+ "defaultValue": "—",
467
+ "appliesTo": "sl-multi-select",
468
+ "description": "Values and labels declared up front, so a tag shows its label before the list has rendered its options."
469
+ },
470
+ {
471
+ "name": "filter",
472
+ "type": "MultiSelectFilter",
473
+ "defaultValue": "—",
474
+ "appliesTo": "sl-multi-select",
475
+ "description": "Compares an option label with the query. When absent, the comparison is a locale-sensitive \"contains\" that ignores case and accents; null turns filtering off for options a server has already filtered."
476
+ },
477
+ {
478
+ "name": "locale",
479
+ "type": "string",
480
+ "defaultValue": "—",
481
+ "appliesTo": "sl-multi-select",
482
+ "description": "The BCP 47 language of the filter and of the duplicate comparison. When absent, the language in force."
483
+ },
484
+ {
485
+ "name": "validateValue",
486
+ "type": "(text, values) => boolean",
487
+ "defaultValue": "—",
488
+ "appliesTo": "sl-multi-select",
489
+ "description": "Whether typed text may become a value. Text it turns down is reported through (valueRefuse) with the cause invalid."
490
+ },
491
+ {
492
+ "name": "name",
493
+ "type": "string",
494
+ "defaultValue": "—",
495
+ "appliesTo": "sl-multi-select",
496
+ "description": "The submission name. One hidden input per value carries it."
497
+ },
498
+ {
499
+ "name": "form",
500
+ "type": "string",
501
+ "defaultValue": "—",
502
+ "appliesTo": "sl-multi-select",
503
+ "description": "The id of the form the hidden inputs belong to, for a multi-select rendered outside it."
504
+ },
505
+ {
506
+ "name": "total",
507
+ "type": "number",
508
+ "defaultValue": "—",
509
+ "appliesTo": "sl-multi-select",
510
+ "description": "The number of options in the whole collection, for aria-setsize on a windowed list."
511
+ },
512
+ {
513
+ "name": "max",
514
+ "type": "number | null",
515
+ "defaultValue": "null",
516
+ "appliesTo": "sl-multi-select",
517
+ "description": "The most values the set may hold; null means no limit. At the limit, every option not yet chosen is announced as unavailable. Past it, the validator reports tooMany."
518
+ },
519
+ {
520
+ "name": "delimiters",
521
+ "type": "readonly string[]",
522
+ "defaultValue": ",",
523
+ "appliesTo": "sl-multi-select",
524
+ "description": "The characters that commit the typed text and split a paste. One list serves both."
525
+ },
526
+ {
527
+ "name": "creatable",
528
+ "type": "boolean",
529
+ "defaultValue": "false",
530
+ "appliesTo": "sl-multi-select",
531
+ "description": "Whether typed text may become a value."
532
+ },
533
+ {
534
+ "name": "editable",
535
+ "type": "boolean",
536
+ "defaultValue": "false",
537
+ "appliesTo": "sl-multi-select",
538
+ "description": "Whether Enter on a focused tag turns it into a text field."
539
+ },
540
+ {
541
+ "name": "reorderable",
542
+ "type": "boolean",
543
+ "defaultValue": "false",
544
+ "appliesTo": "sl-multi-select",
545
+ "description": "Whether Alt with ArrowLeft, ArrowRight, Home or End moves the focused tag along the row."
546
+ },
547
+ {
548
+ "name": "allowDuplicates",
549
+ "type": "boolean",
550
+ "defaultValue": "false",
551
+ "appliesTo": "sl-multi-select",
552
+ "description": "Whether the same value may be held twice."
553
+ },
554
+ {
555
+ "name": "addOnPaste",
556
+ "type": "boolean",
557
+ "defaultValue": "true",
558
+ "appliesTo": "sl-multi-select",
559
+ "description": "Whether a paste that contains delimiters becomes several values."
560
+ },
561
+ {
562
+ "name": "commitOnBlur",
563
+ "type": "boolean",
564
+ "defaultValue": "true",
565
+ "appliesTo": "sl-multi-select",
566
+ "description": "Whether typed text is committed when focus leaves the control."
567
+ },
568
+ {
569
+ "name": "overflow",
570
+ "type": "'wrap' | 'collapse'",
571
+ "defaultValue": "wrap",
572
+ "appliesTo": "sl-multi-select",
573
+ "description": "What the control does with more tags than fit: wrap grows by rows up to three, then scrolls; collapse keeps one row and counts the rest in a +N tag."
574
+ },
575
+ {
576
+ "name": "chosenOptions",
577
+ "type": "'show' | 'hide'",
578
+ "defaultValue": "show",
579
+ "appliesTo": "sl-multi-select",
580
+ "description": "Whether a chosen option stays in the list with a check, or leaves it."
581
+ },
582
+ {
583
+ "name": "clearable",
584
+ "type": "boolean",
585
+ "defaultValue": "true",
586
+ "appliesTo": "sl-multi-select",
587
+ "description": "Whether the clear button is drawn while the control holds a value or typed text."
588
+ },
589
+ {
590
+ "name": "closeOnSelect",
591
+ "type": "boolean",
592
+ "defaultValue": "false",
593
+ "appliesTo": "sl-multi-select",
594
+ "description": "Whether choosing an option closes the list. Off by default, because a set is built with several choices."
595
+ },
596
+ {
597
+ "name": "closeOnEscape",
598
+ "type": "boolean",
599
+ "defaultValue": "true",
600
+ "appliesTo": "sl-multi-select",
601
+ "description": "Whether Escape closes the list."
602
+ },
603
+ {
604
+ "name": "closeOnOutsidePress",
605
+ "type": "boolean",
606
+ "defaultValue": "true",
607
+ "appliesTo": "sl-multi-select",
608
+ "description": "Whether a press outside the list closes it."
609
+ },
610
+ {
611
+ "name": "loop",
612
+ "type": "boolean",
613
+ "defaultValue": "false",
614
+ "appliesTo": "sl-multi-select",
615
+ "description": "Whether the highlight wraps from the last option to the first, and back."
616
+ },
617
+ {
618
+ "name": "highlightMatch",
619
+ "type": "boolean",
620
+ "defaultValue": "true",
621
+ "appliesTo": "sl-multi-select",
622
+ "description": "Whether the span the query matched is marked."
623
+ },
624
+ {
625
+ "name": "size",
626
+ "type": "'sm' | 'md' | 'lg'",
627
+ "defaultValue": "md",
628
+ "appliesTo": "sl-multi-select",
629
+ "description": "The step of the control scale. Inside a field, an unset size follows the field."
630
+ },
631
+ {
632
+ "name": "variant",
633
+ "type": "'outline' | 'subtle' | 'plain'",
634
+ "defaultValue": "outline",
635
+ "appliesTo": "sl-multi-select",
636
+ "description": "The frame: outline draws an edge, subtle a filled ground, plain neither until hover or focus."
637
+ },
638
+ {
639
+ "name": "side",
640
+ "type": "'bottom' | 'top' | 'inline-start' | 'inline-end' | 'left' | 'right'",
641
+ "defaultValue": "bottom",
642
+ "appliesTo": "sl-multi-select",
643
+ "description": "The side of the control the list opens on."
644
+ },
645
+ {
646
+ "name": "align",
647
+ "type": "'start' | 'center' | 'end'",
648
+ "defaultValue": "start",
649
+ "appliesTo": "sl-multi-select",
650
+ "description": "How the list aligns along that side."
651
+ },
652
+ {
653
+ "name": "width",
654
+ "type": "'anchor' | 'content'",
655
+ "defaultValue": "content",
656
+ "appliesTo": "sl-multi-select",
657
+ "description": "content keeps the list at least as wide as the control and widens it to its longest option; anchor pins it to the width of the control."
658
+ },
659
+ {
660
+ "name": "mount",
661
+ "type": "'active' | 'lazy' | 'eager'",
662
+ "defaultValue": "active",
663
+ "appliesTo": "sl-multi-select",
664
+ "description": "When the list exists in the DOM: only while open (active), from the first open on (lazy), or from the start (eager)."
665
+ },
666
+ {
667
+ "name": "strategy",
668
+ "type": "'absolute' | 'fixed'",
669
+ "defaultValue": "absolute",
670
+ "appliesTo": "sl-multi-select",
671
+ "description": "The CSS position the list uses."
672
+ },
673
+ {
674
+ "name": "openOn",
675
+ "type": "'input' | 'focus' | 'manual'",
676
+ "defaultValue": "input",
677
+ "appliesTo": "sl-multi-select",
678
+ "description": "Which gestures open the list besides the trigger and the arrow keys: typing or a press on the input (input), also any focus on the input (focus), or none, so typing filters without opening (manual)."
679
+ },
680
+ {
681
+ "name": "sideOffset",
682
+ "type": "number",
683
+ "defaultValue": "4",
684
+ "appliesTo": "sl-multi-select",
685
+ "description": "The distance in pixels between the control and the list."
686
+ },
687
+ {
688
+ "name": "alignOffset",
689
+ "type": "number",
690
+ "defaultValue": "0",
691
+ "appliesTo": "sl-multi-select",
692
+ "description": "The shift in pixels along the aligned edge."
693
+ },
694
+ {
695
+ "name": "collisionPadding",
696
+ "type": "number",
697
+ "defaultValue": "8",
698
+ "appliesTo": "sl-multi-select",
699
+ "description": "How close in pixels the list may come to the edge of the viewport before it moves."
700
+ },
701
+ {
702
+ "name": "flip",
703
+ "type": "boolean",
704
+ "defaultValue": "true",
705
+ "appliesTo": "sl-multi-select",
706
+ "description": "Whether the list moves to the opposite side when it does not fit."
707
+ },
708
+ {
709
+ "name": "shift",
710
+ "type": "boolean",
711
+ "defaultValue": "true",
712
+ "appliesTo": "sl-multi-select",
713
+ "description": "Whether the list slides along its side to stay in view."
714
+ },
715
+ {
716
+ "name": "hideWhenDetached",
717
+ "type": "boolean",
718
+ "defaultValue": "true",
719
+ "appliesTo": "sl-multi-select",
720
+ "description": "Whether the list hides when the control scrolls out of its clipping container."
721
+ },
722
+ {
723
+ "name": "portal",
724
+ "type": "boolean",
725
+ "defaultValue": "true",
726
+ "appliesTo": "sl-multi-select",
727
+ "description": "Whether the list is portalled to the end of the document."
728
+ },
729
+ {
730
+ "name": "fullWidth",
731
+ "type": "boolean",
732
+ "defaultValue": "true",
733
+ "appliesTo": "sl-multi-select",
734
+ "description": "Whether the control fills the width of its container."
735
+ },
736
+ {
737
+ "name": "disabled",
738
+ "type": "boolean",
739
+ "defaultValue": "false",
740
+ "appliesTo": "sl-multi-select",
741
+ "description": "Whether the control is disabled: it takes no input, draws no remove buttons and leaves the tab order."
742
+ },
743
+ {
744
+ "name": "readOnly",
745
+ "type": "boolean",
746
+ "defaultValue": "false",
747
+ "appliesTo": "sl-multi-select",
748
+ "description": "Whether the values can be read and copied but not changed. The input stays focusable; the list, the remove buttons and the clear button are withheld."
749
+ },
750
+ {
751
+ "name": "required",
752
+ "type": "boolean",
753
+ "defaultValue": "false",
754
+ "appliesTo": "sl-multi-select",
755
+ "description": "Whether an empty set is invalid."
756
+ },
757
+ {
758
+ "name": "invalid",
759
+ "type": "boolean",
760
+ "defaultValue": "false",
761
+ "appliesTo": "sl-multi-select",
762
+ "description": "Whether the control is drawn in the error state, with aria-invalid on the input."
763
+ },
764
+ {
765
+ "name": "loading",
766
+ "type": "boolean",
767
+ "defaultValue": "false",
768
+ "appliesTo": "sl-multi-select",
769
+ "description": "Whether options are on their way: the spinner replaces the chevron and the list shows placeholder rows."
770
+ },
771
+ {
772
+ "name": "messages",
773
+ "type": "Partial<MultiSelectMessages>",
774
+ "defaultValue": "—",
775
+ "appliesTo": "sl-multi-select",
776
+ "description": "Replaces any of the phrases the multi-select writes: clear, trigger, chosen ({count}), count ({count}), counter ({count}, {max}), create ({query}), empty, loading, remove ({label}) and reorder ({label}, {position}, {count}). Phrases left out come from the language in force."
777
+ },
778
+ {
779
+ "name": "value",
780
+ "type": "string",
781
+ "defaultValue": "—",
782
+ "appliesTo": "sl-multi-select-item",
783
+ "description": "The key of the option, which is what enters the set."
784
+ },
785
+ {
786
+ "name": "label",
787
+ "type": "string",
788
+ "defaultValue": "—",
789
+ "appliesTo": "sl-multi-select-item",
790
+ "description": "What the reader sees, what the filter compares and what the mark splits. It is an input rather than projected content, because the filter needs the text before the option renders."
791
+ },
792
+ {
793
+ "name": "disabled",
794
+ "type": "boolean",
795
+ "defaultValue": "false",
796
+ "appliesTo": "sl-multi-select-item",
797
+ "description": "Whether the option can be chosen."
798
+ },
799
+ {
800
+ "name": "description",
801
+ "type": "string",
802
+ "defaultValue": "—",
803
+ "appliesTo": "sl-multi-select-item",
804
+ "description": "A second line under the label."
805
+ },
806
+ {
807
+ "name": "icon",
808
+ "type": "GlyphName",
809
+ "defaultValue": "—",
810
+ "appliesTo": "sl-multi-select-item",
811
+ "description": "The name of the glyph drawn in the first column of the option, as a Glyph inside an Icon box."
812
+ },
813
+ {
814
+ "name": "position",
815
+ "type": "number",
816
+ "defaultValue": "—",
817
+ "appliesTo": "sl-multi-select-item",
818
+ "description": "The place of the option in a windowed collection, for aria-posinset."
819
+ },
820
+ {
821
+ "name": "label",
822
+ "type": "string",
823
+ "defaultValue": "—",
824
+ "appliesTo": "sl-multi-select-group",
825
+ "description": "The name of the group."
826
+ }
827
+ ],
828
+ "composition": [
829
+ {
830
+ "name": "provideMultiSelectDefaults()",
831
+ "type": "Provider",
832
+ "defaultValue": "—",
833
+ "appliesTo": "Application",
834
+ "description": "Sets any axis once for every multi-select below it, in a bootstrap, a route or a component. The words come from the language in force, set by provideSlotted. A binding written on one multi-select still wins."
835
+ },
836
+ {
837
+ "name": "exportAs",
838
+ "type": "slMultiSelect",
839
+ "defaultValue": "—",
840
+ "appliesTo": "sl-multi-select",
841
+ "description": "The instance, for a template that calls focus(), setOpen(), admit(), remove(), move(), clear() or scrollToKey()."
842
+ },
843
+ {
844
+ "name": "ControlValueAccessor",
845
+ "type": "NG_VALUE_ACCESSOR",
846
+ "defaultValue": "—",
847
+ "appliesTo": "sl-multi-select",
848
+ "description": "formControl, formControlName and ngModel bind the whole set, and the disabled state of the form reaches the control."
849
+ },
850
+ {
851
+ "name": "Validator",
852
+ "type": "NG_VALIDATORS",
853
+ "defaultValue": "—",
854
+ "appliesTo": "sl-multi-select",
855
+ "description": "Reports required, tooMany and duplicate to a reactive form, with no validator to write. The React binding has no equivalent."
856
+ },
857
+ {
858
+ "name": "ng-content",
859
+ "type": "projection",
860
+ "defaultValue": "—",
861
+ "appliesTo": "sl-multi-select",
862
+ "description": "Options, groups and separators are your content, so your own control flow decides what the list holds."
863
+ }
864
+ ],
865
+ "events": [
866
+ {
867
+ "name": "valueChange",
868
+ "payload": "readonly string[]",
869
+ "when": "The set changed. It is the two-way half of [(value)]."
870
+ },
871
+ {
872
+ "name": "valueChangeRequest",
873
+ "payload": "ChangeRequest<readonly string[]>",
874
+ "when": "The same change, with its reason: select for an option, submit for typed text, remove for one value, clear for all of them, keyboard for a reorder, and programmatic for a method."
875
+ },
876
+ {
877
+ "name": "valueRefuse",
878
+ "payload": "{ values: readonly string[]; cause: \"duplicate\" | \"limit\" | \"invalid\" }",
879
+ "when": "Values were turned away, and cause says why. Nothing is held and nothing can be cancelled: the values never entered the set."
880
+ },
881
+ {
882
+ "name": "inputValueChange",
883
+ "payload": "string",
884
+ "when": "The typed text changed. It is the two-way half of [(inputValue)], and inputValueChangeRequest carries the reason."
885
+ },
886
+ {
887
+ "name": "openChange",
888
+ "payload": "boolean",
889
+ "when": "The list opened or closed. openChangeRequest carries the reason: pointer, keyboard, escape, outsidePress, select, dismiss, blur or programmatic."
890
+ },
891
+ {
892
+ "name": "highlightedValueChange",
893
+ "payload": "string | null",
894
+ "when": "The highlight moved. Moving it chooses nothing, and highlightedValueChangeRequest carries the reason."
895
+ },
896
+ {
897
+ "name": "loadMore",
898
+ "payload": "void",
899
+ "when": "The last option scrolled into view, so the next page can be fetched."
900
+ }
901
+ ],
902
+ "accessibility": [
903
+ "The input is the tab stop of the control. The tags, their remove buttons and the trigger carry tabindex=\"-1\", as the combobox and grid patterns ask; the clear button, while it is drawn, is in the tab order.",
904
+ "The tags are a layout grid with one row, which leaves ArrowDown and ArrowUp to the list. Focus lands on a tag rather than on its remove button, and Delete and Backspace do what the button does. The grid carries the number of chosen values as its name.",
905
+ "The list sets aria-multiselectable, and selection does not follow the highlight: moving through the options chooses nothing until Enter or a press. This departs from the note in the combobox pattern, as every implementation surveyed does.",
906
+ "Changes are announced as well as drawn: a value added with the count now held, a value removed with its label and the count left, a value moved with its new position, and the limit when it is reached. The status row announces how many options match the query."
907
+ ]
908
+ }
909
+ },
910
+ "tokens": [
911
+ "--slotted-border-subtle",
912
+ "--slotted-border-width-thin",
913
+ "--slotted-control-border-color",
914
+ "--slotted-control-border-width",
915
+ "--slotted-control-font-family",
916
+ "--slotted-control-font-size-lg",
917
+ "--slotted-control-font-size-md",
918
+ "--slotted-control-font-size-sm",
919
+ "--slotted-control-gap-lg",
920
+ "--slotted-control-gap-md",
921
+ "--slotted-control-gap-sm",
922
+ "--slotted-control-height-lg",
923
+ "--slotted-control-height-md",
924
+ "--slotted-control-height-sm",
925
+ "--slotted-control-icon-size-lg",
926
+ "--slotted-control-icon-size-md",
927
+ "--slotted-control-icon-size-sm",
928
+ "--slotted-control-inner-size-lg",
929
+ "--slotted-control-inner-size-md",
930
+ "--slotted-control-inner-size-sm",
931
+ "--slotted-control-invalid-edge-width",
932
+ "--slotted-control-padding-inline-lg",
933
+ "--slotted-control-padding-inline-md",
934
+ "--slotted-control-padding-inline-sm",
935
+ "--slotted-control-radius",
936
+ "--slotted-control-shadow",
937
+ "--slotted-control-shadow-focus-geometry",
938
+ "--slotted-control-surface",
939
+ "--slotted-control-transition-duration",
940
+ "--slotted-control-transition-easing",
941
+ "--slotted-disabled-background",
942
+ "--slotted-disabled-border",
943
+ "--slotted-disabled-foreground",
944
+ "--slotted-duration-medium",
945
+ "--slotted-duration-short",
946
+ "--slotted-easing-enter",
947
+ "--slotted-easing-exit",
948
+ "--slotted-easing-standard",
949
+ "--slotted-focus-ring-color",
950
+ "--slotted-focus-ring-color-invalid",
951
+ "--slotted-focus-ring-offset",
952
+ "--slotted-focus-ring-width",
953
+ "--slotted-font-family-sans",
954
+ "--slotted-font-size-xs",
955
+ "--slotted-font-weight-medium",
956
+ "--slotted-font-weight-semibold",
957
+ "--slotted-line-height-md",
958
+ "--slotted-line-height-sm",
959
+ "--slotted-multi-select-action-active-background",
960
+ "--slotted-multi-select-action-color",
961
+ "--slotted-multi-select-action-hover-background",
962
+ "--slotted-multi-select-action-size",
963
+ "--slotted-multi-select-arrow-color",
964
+ "--slotted-multi-select-autofill-background",
965
+ "--slotted-multi-select-background",
966
+ "--slotted-multi-select-border-color",
967
+ "--slotted-multi-select-color",
968
+ "--slotted-multi-select-content-border-color",
969
+ "--slotted-multi-select-content-padding-block",
970
+ "--slotted-multi-select-content-padding-inline",
971
+ "--slotted-multi-select-content-radius",
972
+ "--slotted-multi-select-content-shadow",
973
+ "--slotted-multi-select-content-text",
974
+ "--slotted-multi-select-content-text-muted",
975
+ "--slotted-multi-select-counter-color",
976
+ "--slotted-multi-select-counter-complete-color",
977
+ "--slotted-multi-select-disabled-background",
978
+ "--slotted-multi-select-disabled-border-color",
979
+ "--slotted-multi-select-disabled-color",
980
+ "--slotted-multi-select-field-basis",
981
+ "--slotted-multi-select-field-min",
982
+ "--slotted-multi-select-highlight",
983
+ "--slotted-multi-select-highlight-active",
984
+ "--slotted-multi-select-highlight-ring",
985
+ "--slotted-multi-select-hover-border-color",
986
+ "--slotted-multi-select-icon-size-min",
987
+ "--slotted-multi-select-invalid-border-color",
988
+ "--slotted-multi-select-invalid-edge-width",
989
+ "--slotted-multi-select-invalid-focus-ring-color",
990
+ "--slotted-multi-select-item-radius",
991
+ "--slotted-multi-select-measure",
992
+ "--slotted-multi-select-open-border-color",
993
+ "--slotted-multi-select-placeholder-color",
994
+ "--slotted-multi-select-plain-hover-background",
995
+ "--slotted-multi-select-radius",
996
+ "--slotted-multi-select-readonly-background",
997
+ "--slotted-multi-select-selected-color",
998
+ "--slotted-multi-select-separator-color",
999
+ "--slotted-multi-select-shadow",
1000
+ "--slotted-multi-select-subtle-background",
1001
+ "--slotted-multi-select-subtle-border-color",
1002
+ "--slotted-multi-select-subtle-hover-background",
1003
+ "--slotted-multi-select-surface",
1004
+ "--slotted-radius-lg",
1005
+ "--slotted-radius-none",
1006
+ "--slotted-shadow-md",
1007
+ "--slotted-space-1",
1008
+ "--slotted-space-2",
1009
+ "--slotted-space-5",
1010
+ "--slotted-surface-raised",
1011
+ "--slotted-surface-sunken",
1012
+ "--slotted-target-comfortable",
1013
+ "--slotted-target-min",
1014
+ "--slotted-text",
1015
+ "--slotted-text-muted",
1016
+ "--slotted-tone-accent-border",
1017
+ "--slotted-tone-accent-surface",
1018
+ "--slotted-tone-accent-text",
1019
+ "--slotted-tone-danger-border",
1020
+ "--slotted-tone-secondary-subtle-active",
1021
+ "--slotted-tone-secondary-subtle-hover",
1022
+ "--slotted-z-index-popover"
1023
+ ],
1024
+ "examples": [
1025
+ {
1026
+ "id": "playground",
1027
+ "title": "Playground",
1028
+ "note": "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.",
1029
+ "language": "html",
1030
+ "source": "<sl-multi-select\n aria-label=\"Affected services\"\n placeholder=\"Add a service\"\n [defaultValue]=\"['checkout-api']\"\n>\n <sl-multi-select-item value=\"checkout-api\" label=\"checkout-api\" />\n <sl-multi-select-item value=\"payments-worker\" label=\"payments-worker\" />\n</sl-multi-select>\n",
1031
+ "verdict": "excerpt"
1032
+ },
1033
+ {
1034
+ "id": "chips",
1035
+ "title": "The chips, and where they live",
1036
+ "note": "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.",
1037
+ "language": "html",
1038
+ "source": "<sl-multi-select aria-label=\"Affected services\" [(value)]=\"services\">\n <sl-multi-select-item value=\"checkout-api\" label=\"checkout-api\" />\n</sl-multi-select>\n",
1039
+ "verdict": "excerpt"
1040
+ },
1041
+ {
1042
+ "id": "creation",
1043
+ "title": "Creating a value the list does not hold",
1044
+ "note": "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.",
1045
+ "language": "html",
1046
+ "source": "<sl-multi-select aria-label=\"Labels\" creatable (valueChangeRequest)=\"onLabels($event)\">\n <sl-multi-select-item value=\"regression\" label=\"regression\" />\n</sl-multi-select>\n",
1047
+ "verdict": "excerpt"
1048
+ },
1049
+ {
1050
+ "id": "limit",
1051
+ "title": "A limit that is a validity, not a silence",
1052
+ "note": "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.",
1053
+ "language": "ts",
1054
+ "source": "import { Component } from '@angular/core';\nimport { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';\nimport {\n SlMultiSelect,\n SlMultiSelectItem,\n type MultiSelectOption,\n} from '@slotted/angular/multi-select';\n\nconst CATEGORIES: MultiSelectOption[] = [\n { value: 'beverages', label: 'Beverages' },\n { value: 'condiments', label: 'Condiments' },\n { value: 'confections', label: 'Confections' },\n { value: 'dairy', label: 'Dairy products' },\n { value: 'grains', label: 'Grains and cereals' },\n { value: 'meat', label: 'Meat and poultry' },\n { value: 'produce', label: 'Produce' },\n { value: 'seafood', label: 'Seafood' },\n];\n\n@Component({\n selector: 'app-multi-select-limit',\n imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect, SlMultiSelectItem],\n template: `\n <div slField>\n <label slFieldLabel>Featured categories</label>\n <sl-multi-select\n placeholder=\"Add a category\"\n [max]=\"3\"\n [items]=\"categories\"\n [value]=\"featured\"\n >\n @for (category of categories; track category.value) {\n <sl-multi-select-item [value]=\"category.value\" [label]=\"category.label\" />\n }\n </sl-multi-select>\n <span slFieldDescription>The storefront home page shows up to three categories.</span>\n </div>\n `,\n})\nexport class MultiSelectLimit {\n protected readonly categories = CATEGORIES;\n protected readonly featured = ['beverages', 'confections'];\n}\n",
1055
+ "verdict": "example"
1056
+ },
1057
+ {
1058
+ "id": "duplicates",
1059
+ "title": "Duplicates",
1060
+ "note": "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.",
1061
+ "language": "html",
1062
+ "source": "<sl-multi-select aria-label=\"Labels\" creatable locale=\"pt-BR\" />\n\n<sl-multi-select aria-label=\"Labels\" allowDuplicates creatable />\n",
1063
+ "verdict": "excerpt"
1064
+ },
1065
+ {
1066
+ "id": "reorder",
1067
+ "title": "Reorder, by keyboard first",
1068
+ "note": "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.",
1069
+ "language": "html",
1070
+ "source": "<sl-multi-select aria-label=\"Rollback order\" reorderable (valueChangeRequest)=\"onOrder($event)\" />\n",
1071
+ "verdict": "excerpt"
1072
+ },
1073
+ {
1074
+ "id": "paste",
1075
+ "title": "Pasting many values at once",
1076
+ "note": "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.",
1077
+ "language": "html",
1078
+ "source": "<sl-multi-select aria-label=\"Notify\" addOnPaste creatable [delimiters]=\"[',', ';']\" [max]=\"5\" />\n",
1079
+ "verdict": "excerpt"
1080
+ },
1081
+ {
1082
+ "id": "editing",
1083
+ "title": "Editing a chip in place",
1084
+ "note": "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.",
1085
+ "language": "html",
1086
+ "source": "<sl-multi-select aria-label=\"Labels\" creatable editable [defaultValue]=\"['payments-worker']\" />\n",
1087
+ "verdict": "excerpt"
1088
+ },
1089
+ {
1090
+ "id": "filtering",
1091
+ "title": "Filtering, and the mark",
1092
+ "note": "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.",
1093
+ "language": "ts",
1094
+ "source": "import { Component } from '@angular/core';\nimport { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';\nimport { SlMultiSelect, SlMultiSelectItem } from '@slotted/angular/multi-select';\n\nconst CITIES = [\n { value: 'cdz', label: 'Cádiz, Spain' },\n { value: 'dus', label: 'Düsseldorf, Germany' },\n { value: 'krk', label: 'Kraków, Poland' },\n { value: 'mmx', label: 'Malmö, Sweden' },\n { value: 'yul', label: 'Montréal, Canada' },\n { value: 'gru', label: 'São Paulo, Brazil' },\n { value: 'zrh', label: 'Zürich, Switzerland' },\n { value: 'aar', label: 'Aarhus, Denmark' },\n];\n\n@Component({\n selector: 'app-multi-select-filtering',\n imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect, SlMultiSelectItem],\n template: `\n <div slField>\n <label slFieldLabel>Distributor cities</label>\n <sl-multi-select placeholder=\"Search cities\">\n @for (city of cities; track city.value) {\n <sl-multi-select-item [value]=\"city.value\" [label]=\"city.label\" />\n }\n </sl-multi-select>\n <span slFieldDescription>Type “zur” or “malmo”: accents and case are ignored.</span>\n </div>\n `,\n})\nexport class MultiSelectFiltering {\n protected readonly cities = CITIES;\n}\n",
1095
+ "verdict": "example"
1096
+ },
1097
+ {
1098
+ "id": "groups",
1099
+ "title": "Groups",
1100
+ "note": "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.",
1101
+ "language": "ts",
1102
+ "source": "import { Component } from '@angular/core';\nimport { SlField, SlFieldLabel } from '@slotted/angular/field';\nimport {\n SlMultiSelect,\n SlMultiSelectGroup,\n SlMultiSelectItem,\n SlMultiSelectSeparator,\n type MultiSelectOptionGroup,\n} from '@slotted/angular/multi-select';\n\nconst REGIONS: MultiSelectOptionGroup[] = [\n {\n label: 'West',\n options: [\n { value: 'RNO', label: 'Reno, NV' },\n { value: 'ONT', label: 'Ontario, CA' },\n { value: 'SEA', label: 'Kent, WA' },\n ],\n },\n {\n label: 'Central',\n options: [\n { value: 'DFW', label: 'Dallas, TX' },\n { value: 'JOT', label: 'Joliet, IL' },\n { value: 'CMH', label: 'Columbus, OH' },\n ],\n },\n {\n label: 'East',\n options: [\n { value: 'SAV', label: 'Savannah, GA' },\n { value: 'ABE', label: 'Allentown, PA' },\n { value: 'EWR', label: 'Edison, NJ' },\n ],\n },\n];\n\n@Component({\n selector: 'app-multi-select-groups',\n imports: [\n SlField,\n SlFieldLabel,\n SlMultiSelect,\n SlMultiSelectGroup,\n SlMultiSelectItem,\n SlMultiSelectSeparator,\n ],\n template: `\n <div slField>\n <label slFieldLabel>Stocking warehouses</label>\n <sl-multi-select placeholder=\"Add a warehouse\" [items]=\"regions\" [value]=\"stocked\">\n @for (region of regions; track region.label; let first = $first) {\n @if (!first) {\n <sl-multi-select-separator />\n }\n <sl-multi-select-group [label]=\"region.label\">\n @for (warehouse of region.options; track warehouse.value) {\n <sl-multi-select-item [value]=\"warehouse.value\" [label]=\"warehouse.label\" />\n }\n </sl-multi-select-group>\n }\n </sl-multi-select>\n </div>\n `,\n})\nexport class MultiSelectGroups {\n protected readonly regions = REGIONS;\n protected readonly stocked = ['RNO', 'SAV'];\n}\n",
1103
+ "verdict": "example"
1104
+ },
1105
+ {
1106
+ "id": "overflow",
1107
+ "title": "Overflow, and access to the whole set",
1108
+ "note": "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.",
1109
+ "language": "ts",
1110
+ "source": "import { Component } from '@angular/core';\nimport { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';\nimport {\n SlMultiSelect,\n SlMultiSelectItem,\n type MultiSelectOption,\n} from '@slotted/angular/multi-select';\nimport { SlStack } from '@slotted/angular/stack';\n\nconst WAREHOUSES: MultiSelectOption[] = [\n { value: 'RNO', label: 'Reno, NV' },\n { value: 'ONT', label: 'Ontario, CA' },\n { value: 'SEA', label: 'Kent, WA' },\n { value: 'DFW', label: 'Dallas, TX' },\n { value: 'JOT', label: 'Joliet, IL' },\n { value: 'CMH', label: 'Columbus, OH' },\n { value: 'SAV', label: 'Savannah, GA' },\n { value: 'ABE', label: 'Allentown, PA' },\n { value: 'EWR', label: 'Edison, NJ' },\n];\n\nconst STOCKED = ['RNO', 'ONT', 'SEA', 'DFW', 'JOT', 'CMH', 'SAV'];\n\n@Component({\n selector: 'app-multi-select-overflow',\n imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect, SlMultiSelectItem, SlStack],\n template: `\n <div slStack [gap]=\"5\">\n <div slField>\n <label slFieldLabel>Stocking warehouses</label>\n <sl-multi-select overflow=\"wrap\" [items]=\"warehouses\" [value]=\"stocked\">\n @for (warehouse of warehouses; track warehouse.value) {\n <sl-multi-select-item [value]=\"warehouse.value\" [label]=\"warehouse.label\" />\n }\n </sl-multi-select>\n <span slFieldDescription>Wrap: every chip stays in view, up to three rows.</span>\n </div>\n <div slField>\n <label slFieldLabel>Stocking warehouses</label>\n <sl-multi-select overflow=\"collapse\" [items]=\"warehouses\" [value]=\"stocked\">\n @for (warehouse of warehouses; track warehouse.value) {\n <sl-multi-select-item [value]=\"warehouse.value\" [label]=\"warehouse.label\" />\n }\n </sl-multi-select>\n <span slFieldDescription>Collapse: one row, and a count of the rest.</span>\n </div>\n </div>\n `,\n})\nexport class MultiSelectOverflow {\n protected readonly warehouses = WAREHOUSES;\n protected readonly stocked = STOCKED;\n}\n",
1111
+ "verdict": "example"
1112
+ },
1113
+ {
1114
+ "id": "sizes",
1115
+ "title": "Sizes",
1116
+ "note": "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.",
1117
+ "language": "ts",
1118
+ "source": "import { Component } from '@angular/core';\nimport { SlField, SlFieldLabel } from '@slotted/angular/field';\nimport {\n SlMultiSelect,\n SlMultiSelectItem,\n type MultiSelectOption,\n} from '@slotted/angular/multi-select';\nimport { SlStack } from '@slotted/angular/stack';\n\nconst WAREHOUSES: MultiSelectOption[] = [\n { value: 'RNO', label: 'Reno, NV' },\n { value: 'CMH', label: 'Columbus, OH' },\n { value: 'SAV', label: 'Savannah, GA' },\n { value: 'DFW', label: 'Dallas, TX' },\n];\n\nconst SIZES = [\n { size: 'sm', label: 'Filter by warehouse' },\n { size: 'md', label: 'Stocking warehouses' },\n { size: 'lg', label: 'Return warehouses' },\n] as const;\n\n@Component({\n selector: 'app-multi-select-sizes',\n imports: [SlField, SlFieldLabel, SlMultiSelect, SlMultiSelectItem, SlStack],\n template: `\n <div slStack [gap]=\"5\">\n @for (entry of sizes; track entry.size) {\n <div slField [size]=\"entry.size\">\n <label slFieldLabel>{{ entry.label }}</label>\n <sl-multi-select [items]=\"warehouses\" [value]=\"stocked\">\n @for (warehouse of warehouses; track warehouse.value) {\n <sl-multi-select-item [value]=\"warehouse.value\" [label]=\"warehouse.label\" />\n }\n </sl-multi-select>\n </div>\n }\n </div>\n `,\n})\nexport class MultiSelectSizes {\n protected readonly sizes = SIZES;\n protected readonly warehouses = WAREHOUSES;\n protected readonly stocked = ['RNO', 'CMH'];\n}\n",
1119
+ "verdict": "example"
1120
+ },
1121
+ {
1122
+ "id": "variants",
1123
+ "title": "Variants",
1124
+ "note": "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.",
1125
+ "language": "ts",
1126
+ "source": "import { Component } from '@angular/core';\nimport { SlField, SlFieldLabel } from '@slotted/angular/field';\nimport {\n SlMultiSelect,\n SlMultiSelectItem,\n type MultiSelectOption,\n} from '@slotted/angular/multi-select';\nimport { SlStack } from '@slotted/angular/stack';\n\nconst CHANNELS: MultiSelectOption[] = [\n { value: 'web', label: 'Web store' },\n { value: 'marketplace', label: 'Marketplace' },\n { value: 'wholesale', label: 'Wholesale' },\n { value: 'phone', label: 'Phone orders' },\n];\n\nconst VARIANTS = [\n { variant: 'outline', label: 'Sales channels' },\n { variant: 'subtle', label: 'Promotion channels' },\n { variant: 'plain', label: 'Report channels' },\n] as const;\n\n@Component({\n selector: 'app-multi-select-variants',\n imports: [SlField, SlFieldLabel, SlMultiSelect, SlMultiSelectItem, SlStack],\n template: `\n <div slStack [gap]=\"5\">\n @for (entry of variants; track entry.variant) {\n <div slField>\n <label slFieldLabel>{{ entry.label }}</label>\n <sl-multi-select [variant]=\"entry.variant\" [items]=\"channels\" [value]=\"chosen\">\n @for (channel of channels; track channel.value) {\n <sl-multi-select-item [value]=\"channel.value\" [label]=\"channel.label\" />\n }\n </sl-multi-select>\n </div>\n }\n </div>\n `,\n})\nexport class MultiSelectVariants {\n protected readonly variants = VARIANTS;\n protected readonly channels = CHANNELS;\n protected readonly chosen = ['web', 'wholesale'];\n}\n",
1127
+ "verdict": "example"
1128
+ },
1129
+ {
1130
+ "id": "states",
1131
+ "title": "States",
1132
+ "note": "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.",
1133
+ "language": "ts",
1134
+ "source": "import { Component } from '@angular/core';\nimport { SlField, SlFieldDescription, SlFieldError, SlFieldLabel } from '@slotted/angular/field';\nimport {\n SlMultiSelect,\n SlMultiSelectItem,\n type MultiSelectOption,\n} from '@slotted/angular/multi-select';\nimport { SlStack } from '@slotted/angular/stack';\n\nconst WAREHOUSES: MultiSelectOption[] = [\n { value: 'RNO', label: 'Reno, NV' },\n { value: 'CMH', label: 'Columbus, OH' },\n { value: 'SAV', label: 'Savannah, GA' },\n { value: 'DFW', label: 'Dallas, TX' },\n];\n\n@Component({\n selector: 'app-multi-select-states',\n imports: [\n SlField,\n SlFieldDescription,\n SlFieldError,\n SlFieldLabel,\n SlMultiSelect,\n SlMultiSelectItem,\n SlStack,\n ],\n template: `\n <div slStack [gap]=\"5\">\n <div slField invalid required>\n <label slFieldLabel>Stocking warehouses</label>\n <sl-multi-select placeholder=\"Add a warehouse\" [items]=\"warehouses\">\n @for (warehouse of warehouses; track warehouse.value) {\n <sl-multi-select-item [value]=\"warehouse.value\" [label]=\"warehouse.label\" />\n }\n </sl-multi-select>\n <span slFieldError>Choose at least one warehouse before publishing.</span>\n </div>\n <div slField readOnly>\n <label slFieldLabel>Warehouses holding stock</label>\n <sl-multi-select [items]=\"warehouses\" [value]=\"holding\">\n @for (warehouse of warehouses; track warehouse.value) {\n <sl-multi-select-item [value]=\"warehouse.value\" [label]=\"warehouse.label\" />\n }\n </sl-multi-select>\n <span slFieldDescription>Updated by the nightly inventory sync.</span>\n </div>\n <div slField disabled>\n <label slFieldLabel>Transfer warehouses</label>\n <sl-multi-select [items]=\"warehouses\" [value]=\"transfer\">\n @for (warehouse of warehouses; track warehouse.value) {\n <sl-multi-select-item [value]=\"warehouse.value\" [label]=\"warehouse.label\" />\n }\n </sl-multi-select>\n <span slFieldDescription>Transfers open once the purchase order is received.</span>\n </div>\n </div>\n `,\n})\nexport class MultiSelectStates {\n protected readonly warehouses = WAREHOUSES;\n protected readonly holding = ['RNO', 'SAV'];\n protected readonly transfer = ['CMH'];\n}\n",
1135
+ "verdict": "example"
1136
+ },
1137
+ {
1138
+ "id": "loading-and-empty",
1139
+ "title": "Loading, and nothing found",
1140
+ "note": "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.",
1141
+ "language": "html",
1142
+ "source": "<sl-multi-select aria-label=\"Services\" loading />\n\n<sl-multi-select aria-label=\"Services\" [messages]=\"{ empty: 'No service by that name' }\" />\n",
1143
+ "verdict": "excerpt"
1144
+ },
1145
+ {
1146
+ "id": "long-content",
1147
+ "title": "Content the family did not choose",
1148
+ "note": "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.",
1149
+ "language": "html",
1150
+ "source": "<sl-multi-select\n aria-label=\"Affected services\"\n [defaultValue]=\"['notification-relay-eu-west-1-canary']\"\n/>\n",
1151
+ "verdict": "excerpt"
1152
+ },
1153
+ {
1154
+ "id": "keyboard",
1155
+ "title": "The keyboard",
1156
+ "note": "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.",
1157
+ "language": "ts",
1158
+ "source": "import { Component } from '@angular/core';\nimport { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';\nimport {\n SlMultiSelect,\n SlMultiSelectItem,\n type MultiSelectOption,\n} from '@slotted/angular/multi-select';\n\nconst CARRIERS: MultiSelectOption[] = [\n { value: 'ups', label: 'UPS Ground' },\n { value: 'fedex', label: 'FedEx Ground' },\n { value: 'usps', label: 'USPS Priority Mail' },\n { value: 'dhl', label: 'DHL Express' },\n { value: 'ontrac', label: 'OnTrac' },\n];\n\n@Component({\n selector: 'app-multi-select-keyboard',\n imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect, SlMultiSelectItem],\n template: `\n <div slField>\n <label slFieldLabel>Carrier priority</label>\n <sl-multi-select\n reorderable\n placeholder=\"Add a carrier\"\n [items]=\"carriers\"\n [value]=\"priority\"\n >\n @for (carrier of carriers; track carrier.value) {\n <sl-multi-select-item [value]=\"carrier.value\" [label]=\"carrier.label\" />\n }\n </sl-multi-select>\n <span slFieldDescription>\n Rates are requested from the first carrier, then the next. Alt with an arrow moves the\n focused carrier.\n </span>\n </div>\n `,\n})\nexport class MultiSelectKeyboard {\n protected readonly carriers = CARRIERS;\n protected readonly priority = ['usps', 'ups', 'fedex'];\n}\n",
1159
+ "verdict": "example"
1160
+ },
1161
+ {
1162
+ "id": "form",
1163
+ "title": "In a form",
1164
+ "note": "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.",
1165
+ "language": "ts",
1166
+ "source": "import { Component, signal } from '@angular/core';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { SlButton } from '@slotted/angular/button';\nimport { SlField, SlFieldError, SlFieldLabel } from '@slotted/angular/field';\nimport { SlInline } from '@slotted/angular/inline';\nimport {\n SlMultiSelect,\n SlMultiSelectItem,\n type MultiSelectOption,\n} from '@slotted/angular/multi-select';\nimport { SlStack } from '@slotted/angular/stack';\nimport { SlText } from '@slotted/angular/typography';\n\nconst WAREHOUSES: MultiSelectOption[] = [\n { value: 'RNO', label: 'Reno, NV' },\n { value: 'CMH', label: 'Columbus, OH' },\n { value: 'SAV', label: 'Savannah, GA' },\n { value: 'DFW', label: 'Dallas, TX' },\n];\n\nconst CHANNELS: MultiSelectOption[] = [\n { value: 'web', label: 'Web store' },\n { value: 'marketplace', label: 'Marketplace' },\n { value: 'wholesale', label: 'Wholesale' },\n];\n\n@Component({\n selector: 'app-multi-select-form',\n imports: [\n ReactiveFormsModule,\n SlButton,\n SlField,\n SlFieldError,\n SlFieldLabel,\n SlInline,\n SlMultiSelect,\n SlMultiSelectItem,\n SlStack,\n SlText,\n ],\n template: `\n <form novalidate [formGroup]=\"form\" (ngSubmit)=\"submit()\" (reset)=\"clear()\">\n <div slStack [gap]=\"5\">\n <div slField required [invalid]=\"missing() ? true : undefined\">\n <label slFieldLabel>Stocking warehouses</label>\n <sl-multi-select\n name=\"warehouses\"\n placeholder=\"Add a warehouse\"\n formControlName=\"warehouses\"\n [items]=\"warehouses\"\n (valueChange)=\"missing.set(false)\"\n >\n @for (warehouse of warehouses; track warehouse.value) {\n <sl-multi-select-item [value]=\"warehouse.value\" [label]=\"warehouse.label\" />\n }\n </sl-multi-select>\n <span slFieldError live=\"polite\" reserve>{{\n missing() ? 'Choose at least one warehouse to stock this product.' : ''\n }}</span>\n </div>\n <div slField>\n <label slFieldLabel>Sales channels</label>\n <sl-multi-select name=\"channels\" formControlName=\"channels\" [items]=\"channels\">\n @for (channel of channels; track channel.value) {\n <sl-multi-select-item [value]=\"channel.value\" [label]=\"channel.label\" />\n }\n </sl-multi-select>\n </div>\n <div slInline [gap]=\"3\" align=\"center\">\n <button slButton type=\"submit\">Save</button>\n <button slButton type=\"reset\" tone=\"secondary\" variant=\"outline\">Reset</button>\n @if (saved(); as message) {\n <span slText size=\"sm\" tone=\"muted\">{{ message }}</span>\n }\n </div>\n </div>\n </form>\n `,\n})\nexport class MultiSelectForm {\n protected readonly warehouses = WAREHOUSES;\n protected readonly channels = CHANNELS;\n /* The control's own Validator reports required, so none is written here. */\n protected readonly form = new FormGroup({\n warehouses: new FormControl<readonly string[]>([], { nonNullable: true }),\n channels: new FormControl<readonly string[]>(['web'], { nonNullable: true }),\n });\n protected readonly missing = signal(false);\n protected readonly saved = signal<string | null>(null);\n\n protected submit(): void {\n this.missing.set(this.form.controls.warehouses.invalid);\n const { warehouses } = this.form.getRawValue();\n this.saved.set(\n this.form.valid\n ? `Saved with ${warehouses.length} of ${WAREHOUSES.length} warehouses.`\n : null,\n );\n }\n\n protected clear(): void {\n this.missing.set(false);\n this.saved.set(null);\n }\n}\n",
1167
+ "verdict": "example"
1168
+ },
1169
+ {
1170
+ "id": "composition",
1171
+ "title": "Composition, and the defaults an application sets once",
1172
+ "note": "An injection token carries the axes, provideSlotted the language, exportAs reaches the instance from the template, and projected options keep their own content.",
1173
+ "language": "html",
1174
+ "source": "<sl-multi-select #services=\"slMultiSelect\" aria-label=\"Affected services\" />\n\n<button type=\"button\" (click)=\"services.focus()\">Add a service</button>\n",
1175
+ "verdict": "excerpt"
1176
+ },
1177
+ {
1178
+ "id": "async-search",
1179
+ "title": "async-search.ts",
1180
+ "note": null,
1181
+ "language": "ts",
1182
+ "source": "import { Component, effect, signal } from '@angular/core';\nimport { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';\nimport { SlMultiSelect, SlMultiSelectItem } from '@slotted/angular/multi-select';\n\ninterface Customer {\n value: string;\n label: string;\n city: string;\n}\n\nconst CUSTOMERS: Customer[] = [\n { value: 'ALFKI', label: 'Alfreds Futterkiste', city: 'Berlin' },\n { value: 'ANATR', label: 'Ana Trujillo Emparedados', city: 'México D.F.' },\n { value: 'BERGS', label: 'Berglunds snabbköp', city: 'Luleå' },\n { value: 'BLAUS', label: 'Blauer See Delikatessen', city: 'Mannheim' },\n { value: 'BONAP', label: 'Bon app’', city: 'Marseille' },\n { value: 'BOTTM', label: 'Bottom-Dollar Markets', city: 'Tsawassen' },\n { value: 'ERNSH', label: 'Ernst Handel', city: 'Graz' },\n { value: 'FOLKO', label: 'Folk och fä HB', city: 'Bräcke' },\n { value: 'FRANK', label: 'Frankenversand', city: 'München' },\n { value: 'QUICK', label: 'QUICK-Stop', city: 'Cunewalde' },\n { value: 'RATTC', label: 'Rattlesnake Canyon Grocery', city: 'Albuquerque' },\n { value: 'SAVEA', label: 'Save-a-lot Markets', city: 'Boise' },\n];\n\n/** Stands in for the customer search endpoint, which filters on the server. */\nconst searchCustomers = (query: string) =>\n new Promise<Customer[]>((resolve) =>\n setTimeout(() => {\n const needle = query.trim().toLowerCase();\n resolve(CUSTOMERS.filter((customer) => customer.label.toLowerCase().includes(needle)));\n }, 600),\n );\n\n/** The first page of customers, which arrives with the page itself. */\nconst FIRST_PAGE = CUSTOMERS.slice(0, 6);\n\n@Component({\n selector: 'app-multi-select-async-search',\n imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect, SlMultiSelectItem],\n template: `\n <div slField>\n <label slFieldLabel>Customers in this campaign</label>\n <sl-multi-select\n placeholder=\"Search customers\"\n [filter]=\"null\"\n [loading]=\"loading()\"\n [messages]=\"{ empty: 'No customer by that name.', loading: 'Searching customers…' }\"\n (inputValueChange)=\"query.set($event)\"\n >\n @for (customer of results(); track customer.value) {\n <sl-multi-select-item\n [value]=\"customer.value\"\n [label]=\"customer.label\"\n [description]=\"customer.city\"\n />\n }\n </sl-multi-select>\n <span slFieldDescription>Each keystroke searches the customer list on the server.</span>\n </div>\n `,\n})\nexport class MultiSelectAsyncSearch {\n protected readonly query = signal('');\n protected readonly results = signal<Customer[]>(FIRST_PAGE);\n protected readonly loading = signal(false);\n\n constructor() {\n effect((onCleanup) => {\n const query = this.query();\n if (query.trim() === '') {\n this.results.set(FIRST_PAGE);\n this.loading.set(false);\n return;\n }\n let current = true;\n this.loading.set(true);\n void searchCustomers(query).then((found) => {\n if (!current) return;\n this.results.set(found);\n this.loading.set(false);\n });\n onCleanup(() => {\n current = false;\n });\n });\n }\n}\n",
1183
+ "verdict": "example"
1184
+ },
1185
+ {
1186
+ "id": "basic",
1187
+ "title": "basic.ts",
1188
+ "note": null,
1189
+ "language": "ts",
1190
+ "source": "import { Component } from '@angular/core';\nimport { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';\nimport { SlMultiSelect, SlMultiSelectItem } from '@slotted/angular/multi-select';\n\nconst WAREHOUSES = [\n { value: 'RNO', label: 'Reno, NV' },\n { value: 'CMH', label: 'Columbus, OH' },\n { value: 'SAV', label: 'Savannah, GA' },\n { value: 'DFW', label: 'Dallas, TX' },\n { value: 'ONT', label: 'Ontario, CA' },\n { value: 'ABE', label: 'Allentown, PA' },\n];\n\n@Component({\n selector: 'app-multi-select-basic',\n imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect, SlMultiSelectItem],\n template: `\n <div slField>\n <label slFieldLabel>Stocking warehouses</label>\n <sl-multi-select placeholder=\"Add a warehouse\">\n @for (warehouse of warehouses; track warehouse.value) {\n <sl-multi-select-item [value]=\"warehouse.value\" [label]=\"warehouse.label\" />\n }\n </sl-multi-select>\n <span slFieldDescription>Chai tea, 24 bags is reordered at each of these warehouses.</span>\n </div>\n `,\n})\nexport class MultiSelectBasic {\n protected readonly warehouses = WAREHOUSES;\n}\n",
1191
+ "verdict": "example"
1192
+ },
1193
+ {
1194
+ "id": "choose-columns",
1195
+ "title": "choose-columns.ts",
1196
+ "note": null,
1197
+ "language": "ts",
1198
+ "source": "import { Component, computed, signal } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';\nimport { SlInline } from '@slotted/angular/inline';\nimport {\n SlMultiSelect,\n SlMultiSelectItem,\n type MultiSelectOption,\n} from '@slotted/angular/multi-select';\nimport { SlStack } from '@slotted/angular/stack';\nimport {\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n} from '@slotted/angular/table';\n\ntype Column = 'order' | 'customer' | 'placed' | 'items' | 'total';\n\nconst COLUMNS: (MultiSelectOption & { value: Column })[] = [\n { value: 'order', label: 'Order' },\n { value: 'customer', label: 'Customer' },\n { value: 'placed', label: 'Placed' },\n { value: 'items', label: 'Items' },\n { value: 'total', label: 'Total' },\n];\n\nconst ORDERS: Record<Column, string>[] = [\n {\n order: 'SO-10482',\n customer: 'Harbor & Pine',\n placed: 'Oct 2',\n items: '14',\n total: '$1,240.00',\n },\n {\n order: 'SO-10483',\n customer: 'Brightline Studio',\n placed: 'Oct 3',\n items: '3',\n total: '$318.50',\n },\n {\n order: 'SO-10484',\n customer: 'Northgate Labs',\n placed: 'Oct 3',\n items: '41',\n total: '$2,906.10',\n },\n];\n\nconst ALL = COLUMNS.map((column) => column.value);\nconst labelOf = (value: string) => COLUMNS.find((column) => column.value === value)?.label;\n\n@Component({\n selector: 'app-multi-select-choose-columns',\n imports: [\n SlButton,\n SlField,\n SlFieldDescription,\n SlFieldLabel,\n SlInline,\n SlMultiSelect,\n SlMultiSelectItem,\n SlStack,\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n ],\n template: `\n <div slStack [gap]=\"4\">\n <div slField>\n <div slInline [gap]=\"3\" justify=\"between\" align=\"center\">\n <label slFieldLabel>Columns</label>\n <button\n slButton\n size=\"sm\"\n tone=\"secondary\"\n variant=\"ghost\"\n [disabled]=\"shown().length === all.length\"\n (click)=\"shown.set(all)\"\n >\n Show all\n </button>\n </div>\n <sl-multi-select reorderable placeholder=\"Add a column\" [items]=\"options\" [(value)]=\"shown\">\n @for (column of options; track column.value) {\n <sl-multi-select-item [value]=\"column.value\" [label]=\"column.label\" />\n }\n </sl-multi-select>\n <span slFieldDescription>\n The table follows the order of the chips. Alt with an arrow moves a focused column.\n </span>\n </div>\n <div slTable [columns]=\"columnCount()\">\n <div slTableContent aria-label=\"Orders\">\n <thead slTableHead>\n <tr slTableRow>\n @for (column of columns(); track column) {\n <th slTableColumnHeader>{{ labelOf(column) }}</th>\n }\n </tr>\n </thead>\n <tbody slTableBody>\n @for (order of orders; track order.order) {\n <tr slTableRow [value]=\"order.order\">\n @for (column of columns(); track column) {\n <td slTableCell>{{ order[column] }}</td>\n }\n </tr>\n }\n </tbody>\n </div>\n </div>\n </div>\n `,\n})\nexport class MultiSelectChooseColumns {\n protected readonly options = COLUMNS;\n protected readonly orders = ORDERS;\n protected readonly all = ALL;\n protected readonly labelOf = labelOf;\n protected readonly shown = signal<readonly string[]>(['order', 'customer', 'total']);\n protected readonly columns = computed(() => this.shown() as readonly Column[]);\n protected readonly columnCount = computed(() => Math.max(this.columns().length, 1));\n}\n",
1199
+ "verdict": "example"
1200
+ },
1201
+ {
1202
+ "id": "clearing",
1203
+ "title": "clearing.ts",
1204
+ "note": null,
1205
+ "language": "ts",
1206
+ "source": "import { Component } from '@angular/core';\nimport { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';\nimport {\n SlMultiSelect,\n SlMultiSelectItem,\n type MultiSelectOption,\n} from '@slotted/angular/multi-select';\nimport { SlStack } from '@slotted/angular/stack';\n\nconst CHANNELS: MultiSelectOption[] = [\n { value: 'web', label: 'Web store' },\n { value: 'marketplace', label: 'Marketplace' },\n { value: 'wholesale', label: 'Wholesale' },\n { value: 'phone', label: 'Phone orders' },\n];\n\n@Component({\n selector: 'app-multi-select-clearing',\n imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect, SlMultiSelectItem, SlStack],\n template: `\n <div slStack [gap]=\"5\">\n <div slField>\n <label slFieldLabel>Show orders from</label>\n <sl-multi-select placeholder=\"All channels\" [items]=\"channels\" [value]=\"shown\">\n @for (channel of channels; track channel.value) {\n <sl-multi-select-item [value]=\"channel.value\" [label]=\"channel.label\" />\n }\n </sl-multi-select>\n <span slFieldDescription>The clear button empties the filter in one press.</span>\n </div>\n <div slField>\n <label slFieldLabel>Sell through</label>\n <sl-multi-select [clearable]=\"false\" [items]=\"channels\" [value]=\"selling\">\n @for (channel of channels; track channel.value) {\n <sl-multi-select-item [value]=\"channel.value\" [label]=\"channel.label\" />\n }\n </sl-multi-select>\n <span slFieldDescription>No clear button: channels come off one at a time.</span>\n </div>\n </div>\n `,\n})\nexport class MultiSelectClearing {\n protected readonly channels = CHANNELS;\n protected readonly shown = ['web', 'marketplace', 'phone'];\n protected readonly selling = ['web', 'wholesale'];\n}\n",
1207
+ "verdict": "example"
1208
+ },
1209
+ {
1210
+ "id": "controlled",
1211
+ "title": "controlled.ts",
1212
+ "note": null,
1213
+ "language": "ts",
1214
+ "source": "import { Component, computed, signal } from '@angular/core';\nimport { SlField, SlFieldLabel } from '@slotted/angular/field';\nimport {\n SlMultiSelect,\n SlMultiSelectItem,\n type MultiSelectOption,\n} from '@slotted/angular/multi-select';\nimport { SlStack } from '@slotted/angular/stack';\nimport { SlText } from '@slotted/angular/typography';\n\nconst WAREHOUSES: MultiSelectOption[] = [\n { value: 'RNO', label: 'Reno, NV' },\n { value: 'CMH', label: 'Columbus, OH' },\n { value: 'SAV', label: 'Savannah, GA' },\n { value: 'DFW', label: 'Dallas, TX' },\n];\n\nconst labelOf = (value: string) => WAREHOUSES.find((option) => option.value === value)?.label;\n\n@Component({\n selector: 'app-multi-select-controlled',\n imports: [SlField, SlFieldLabel, SlMultiSelect, SlMultiSelectItem, SlStack, SlText],\n template: `\n <div slStack [gap]=\"3\">\n <div slField>\n <label slFieldLabel>Stocking warehouses</label>\n <sl-multi-select\n placeholder=\"Add a warehouse\"\n [items]=\"options\"\n [(value)]=\"warehouses\"\n (valueChangeRequest)=\"reason.set($event.reason)\"\n >\n @for (warehouse of options; track warehouse.value) {\n <sl-multi-select-item [value]=\"warehouse.value\" [label]=\"warehouse.label\" />\n }\n </sl-multi-select>\n </div>\n <span slText size=\"sm\" tone=\"muted\">{{ summary() }}</span>\n </div>\n `,\n})\nexport class MultiSelectControlled {\n protected readonly options = WAREHOUSES;\n protected readonly warehouses = signal<readonly string[]>(['RNO', 'CMH']);\n protected readonly reason = signal<string | null>(null);\n protected readonly summary = computed(() => {\n const held = this.warehouses();\n const stocked =\n held.length === 0 ? 'Not stocked anywhere' : `Stocked at ${held.map(labelOf).join('; ')}`;\n const reason = this.reason();\n return reason === null ? stocked : `${stocked} · last change: ${reason}`;\n });\n}\n",
1215
+ "verdict": "example"
1216
+ },
1217
+ {
1218
+ "id": "creatable",
1219
+ "title": "creatable.ts",
1220
+ "note": null,
1221
+ "language": "ts",
1222
+ "source": "import { Component } from '@angular/core';\nimport { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';\nimport {\n SlMultiSelect,\n SlMultiSelectItem,\n type MultiSelectOption,\n} from '@slotted/angular/multi-select';\n\nconst SUGGESTED: MultiSelectOption[] = [\n { value: 'chai', label: 'chai' },\n { value: 'black tea', label: 'black tea' },\n { value: 'spiced', label: 'spiced' },\n { value: 'loose leaf', label: 'loose leaf' },\n { value: 'caffeinated', label: 'caffeinated' },\n { value: 'gift', label: 'gift' },\n];\n\n@Component({\n selector: 'app-multi-select-creatable',\n imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect, SlMultiSelectItem],\n template: `\n <div slField>\n <label slFieldLabel>Search keywords</label>\n <sl-multi-select creatable placeholder=\"Add a keyword\" [items]=\"suggested\" [value]=\"keywords\">\n @for (keyword of suggested; track keyword.value) {\n <sl-multi-select-item [value]=\"keyword.value\" [label]=\"keyword.label\" />\n }\n </sl-multi-select>\n <span slFieldDescription>\n Type a keyword and press Enter or a comma. Shoppers find Chai tea, 24 bags by these words.\n </span>\n </div>\n `,\n})\nexport class MultiSelectCreatable {\n protected readonly suggested = SUGGESTED;\n protected readonly keywords = ['chai', 'black tea'];\n}\n",
1223
+ "verdict": "example"
1224
+ },
1225
+ {
1226
+ "id": "defaults",
1227
+ "title": "defaults.ts",
1228
+ "note": null,
1229
+ "language": "ts",
1230
+ "source": "import { Component } from '@angular/core';\nimport { SlField, SlFieldLabel } from '@slotted/angular/field';\nimport {\n provideMultiSelectDefaults,\n SlMultiSelect,\n SlMultiSelectItem,\n type MultiSelectOption,\n} from '@slotted/angular/multi-select';\nimport { SlStack } from '@slotted/angular/stack';\n\nconst OWNERS: MultiSelectOption[] = [\n { value: 'avery', label: 'Avery Collins' },\n { value: 'kenji', label: 'Kenji Watanabe' },\n { value: 'lucia', label: 'Lucía Fernández' },\n { value: 'omar', label: 'Omar Haddad' },\n];\n\nconst SEGMENTS: MultiSelectOption[] = [\n { value: 'enterprise', label: 'Enterprise' },\n { value: 'wholesale', label: 'Wholesale' },\n { value: 'retail', label: 'Retail' },\n];\n\n@Component({\n selector: 'app-multi-select-defaults',\n imports: [SlField, SlFieldLabel, SlMultiSelect, SlMultiSelectItem, SlStack],\n providers: [provideMultiSelectDefaults({ size: 'sm', variant: 'subtle', overflow: 'collapse' })],\n template: `\n <div slStack [gap]=\"4\">\n <div slField>\n <label slFieldLabel>Account owners</label>\n <sl-multi-select placeholder=\"Any owner\" [items]=\"owners\" [value]=\"ownersChosen\">\n @for (owner of owners; track owner.value) {\n <sl-multi-select-item [value]=\"owner.value\" [label]=\"owner.label\" />\n }\n </sl-multi-select>\n </div>\n <div slField>\n <label slFieldLabel>Segments</label>\n <sl-multi-select placeholder=\"Any segment\" [items]=\"segments\" [value]=\"segmentsChosen\">\n @for (segment of segments; track segment.value) {\n <sl-multi-select-item [value]=\"segment.value\" [label]=\"segment.label\" />\n }\n </sl-multi-select>\n </div>\n </div>\n `,\n})\nexport class MultiSelectDefaults {\n protected readonly owners = OWNERS;\n protected readonly segments = SEGMENTS;\n protected readonly ownersChosen = ['lucia', 'kenji'];\n protected readonly segmentsChosen = ['wholesale'];\n}\n",
1231
+ "verdict": "example"
1232
+ },
1233
+ {
1234
+ "id": "descriptions",
1235
+ "title": "descriptions.ts",
1236
+ "note": null,
1237
+ "language": "ts",
1238
+ "source": "import { Component } from '@angular/core';\nimport { SlField, SlFieldLabel } from '@slotted/angular/field';\nimport type { GlyphName } from '@slotted/angular/icon';\nimport {\n SlMultiSelect,\n SlMultiSelectItem,\n type MultiSelectOption,\n} from '@slotted/angular/multi-select';\n\nconst DOCUMENTS: (MultiSelectOption & { icon: GlyphName; description: string })[] = [\n {\n value: 'invoice',\n label: 'Invoice',\n icon: 'file-text',\n description: 'PDF, issued when the order ships',\n },\n {\n value: 'packing-slip',\n label: 'Packing slip',\n icon: 'file',\n description: 'PDF, one page per parcel',\n },\n {\n value: 'customs',\n label: 'Customs declaration',\n icon: 'file-spreadsheet',\n description: 'CN23, international orders only',\n },\n {\n value: 'photos',\n label: 'Product photos',\n icon: 'file-image',\n description: 'Up to five images per line item',\n },\n];\n\n@Component({\n selector: 'app-multi-select-descriptions',\n imports: [SlField, SlFieldLabel, SlMultiSelect, SlMultiSelectItem],\n template: `\n <div slField>\n <label slFieldLabel>Attach to the shipping email</label>\n <sl-multi-select placeholder=\"Add a document\" [items]=\"documents\" [value]=\"attached\">\n @for (document of documents; track document.value) {\n <sl-multi-select-item\n [value]=\"document.value\"\n [label]=\"document.label\"\n [description]=\"document.description\"\n [icon]=\"document.icon\"\n />\n }\n </sl-multi-select>\n </div>\n `,\n})\nexport class MultiSelectDescriptions {\n protected readonly documents = DOCUMENTS;\n protected readonly attached = ['invoice'];\n}\n",
1239
+ "verdict": "example"
1240
+ },
1241
+ {
1242
+ "id": "disabled-options",
1243
+ "title": "disabled-options.ts",
1244
+ "note": null,
1245
+ "language": "ts",
1246
+ "source": "import { Component } from '@angular/core';\nimport { SlField, SlFieldLabel } from '@slotted/angular/field';\nimport {\n SlMultiSelect,\n SlMultiSelectItem,\n type MultiSelectOption,\n} from '@slotted/angular/multi-select';\n\nconst WAREHOUSES: (MultiSelectOption & { description: string })[] = [\n { value: 'RNO', label: 'Reno, NV', description: '142 pallet spaces free' },\n { value: 'CMH', label: 'Columbus, OH', description: '38 pallet spaces free' },\n {\n value: 'SAV',\n label: 'Savannah, GA',\n description: 'At capacity until November 3',\n disabled: true,\n },\n { value: 'DFW', label: 'Dallas, TX', description: '210 pallet spaces free' },\n {\n value: 'ONT',\n label: 'Ontario, CA',\n description: 'Closed for a stock count this week',\n disabled: true,\n },\n];\n\n@Component({\n selector: 'app-multi-select-disabled-options',\n imports: [SlField, SlFieldLabel, SlMultiSelect, SlMultiSelectItem],\n template: `\n <div slField>\n <label slFieldLabel>Receiving warehouses</label>\n <sl-multi-select placeholder=\"Add a warehouse\" [items]=\"warehouses\" [value]=\"receiving\">\n @for (warehouse of warehouses; track warehouse.value) {\n <sl-multi-select-item\n [value]=\"warehouse.value\"\n [label]=\"warehouse.label\"\n [description]=\"warehouse.description\"\n [disabled]=\"warehouse.disabled ?? false\"\n />\n }\n </sl-multi-select>\n </div>\n `,\n})\nexport class MultiSelectDisabledOptions {\n protected readonly warehouses = WAREHOUSES;\n protected readonly receiving = ['RNO'];\n}\n",
1247
+ "verdict": "example"
1248
+ },
1249
+ {
1250
+ "id": "editable",
1251
+ "title": "editable.ts",
1252
+ "note": null,
1253
+ "language": "ts",
1254
+ "source": "import { Component } from '@angular/core';\nimport { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';\nimport { SlMultiSelect } from '@slotted/angular/multi-select';\n\n@Component({\n selector: 'app-multi-select-editable',\n imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect],\n template: `\n <div slField>\n <label slFieldLabel>Bin locations</label>\n <sl-multi-select\n creatable\n editable\n placeholder=\"Add a bin\"\n [value]=\"bins\"\n [messages]=\"{ empty: 'Type a bin code and press Enter.' }\"\n />\n <span slFieldDescription>\n Press ArrowLeft to reach a bin, then Enter to correct it in place.\n </span>\n </div>\n `,\n})\nexport class MultiSelectEditable {\n protected readonly bins = ['A-12-03', 'A-12-04', 'C-02-11'];\n}\n",
1255
+ "verdict": "example"
1256
+ },
1257
+ {
1258
+ "id": "email-list",
1259
+ "title": "email-list.ts",
1260
+ "note": null,
1261
+ "language": "ts",
1262
+ "source": "import { Component, signal } from '@angular/core';\nimport { SlField, SlFieldDescription, SlFieldError, SlFieldLabel } from '@slotted/angular/field';\nimport {\n SlMultiSelect,\n SlMultiSelectItem,\n type MultiSelectRefuseCause,\n} from '@slotted/angular/multi-select';\n\nconst TEAMS = [\n { value: 'purchasing@northwind.example', description: 'Purchasing team' },\n { value: 'warehouse-ops@northwind.example', description: 'Warehouse operations' },\n { value: 'category-managers@northwind.example', description: 'Category managers' },\n];\n\nconst isEmail = (text: string) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(text.trim());\n\nconst REASONS: Record<MultiSelectRefuseCause, string> = {\n invalid: 'is not an email address',\n duplicate: 'is already on the list',\n limit: 'is over the limit',\n};\n\n@Component({\n selector: 'app-multi-select-email-list',\n imports: [\n SlField,\n SlFieldDescription,\n SlFieldError,\n SlFieldLabel,\n SlMultiSelect,\n SlMultiSelectItem,\n ],\n template: `\n <div slField [invalid]=\"refused() !== null ? true : undefined\">\n <label slFieldLabel>Stockout alerts</label>\n <sl-multi-select\n creatable\n placeholder=\"name@company.com\"\n [delimiters]=\"delimiters\"\n [value]=\"recipients\"\n [validateValue]=\"isEmail\"\n (valueRefuse)=\"refuse($event)\"\n (valueChange)=\"refused.set(null)\"\n >\n @for (team of teams; track team.value) {\n <sl-multi-select-item\n [value]=\"team.value\"\n [label]=\"team.value\"\n [description]=\"team.description\"\n />\n }\n </sl-multi-select>\n @if (refused(); as message) {\n <span slFieldError live=\"polite\">{{ message }}</span>\n } @else {\n <span slFieldDescription>Paste a list separated by commas, semicolons or spaces.</span>\n }\n </div>\n `,\n})\nexport class MultiSelectEmailList {\n protected readonly teams = TEAMS;\n protected readonly delimiters = [',', ';', ' '];\n protected readonly recipients = ['purchasing@northwind.example'];\n protected readonly isEmail = isEmail;\n protected readonly refused = signal<string | null>(null);\n\n protected refuse(event: { values: readonly string[]; cause: MultiSelectRefuseCause }): void {\n this.refused.set(`${event.values.join(', ')} ${REASONS[event.cause]}.`);\n }\n}\n",
1263
+ "verdict": "example"
1264
+ },
1265
+ {
1266
+ "id": "filter-bar",
1267
+ "title": "filter-bar.ts",
1268
+ "note": null,
1269
+ "language": "ts",
1270
+ "source": "import { Component, computed, signal } from '@angular/core';\nimport { SlGrid } from '@slotted/angular/grid';\nimport {\n SlMultiSelect,\n SlMultiSelectItem,\n type MultiSelectOption,\n} from '@slotted/angular/multi-select';\nimport { SlStack } from '@slotted/angular/stack';\nimport {\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n} from '@slotted/angular/table';\nimport { SlText } from '@slotted/angular/typography';\n\nconst ORDERS = [\n { id: 'SO-10482', customer: 'Harbor & Pine', status: 'open', channel: 'web', total: '$1,240.00' },\n {\n id: 'SO-10483',\n customer: 'Brightline Studio',\n status: 'on-hold',\n channel: 'phone',\n total: '$318.50',\n },\n {\n id: 'SO-10484',\n customer: 'Northgate Labs',\n status: 'shipped',\n channel: 'wholesale',\n total: '$2,906.10',\n },\n { id: 'SO-10485', customer: 'Verde Kitchen', status: 'delayed', channel: 'web', total: '$86.00' },\n {\n id: 'SO-10486',\n customer: 'Quill & Co.',\n status: 'shipped',\n channel: 'marketplace',\n total: '$540.25',\n },\n {\n id: 'SO-10487',\n customer: 'Atlas Freight',\n status: 'open',\n channel: 'wholesale',\n total: '$1,912.00',\n },\n { id: 'SO-10488', customer: 'Lumen Dental', status: 'open', channel: 'web', total: '$472.80' },\n {\n id: 'SO-10489',\n customer: 'Cobalt Outfitters',\n status: 'delayed',\n channel: 'marketplace',\n total: '$1,055.40',\n },\n];\n\nconst STATUSES: MultiSelectOption[] = [\n { value: 'open', label: 'Open' },\n { value: 'on-hold', label: 'On hold' },\n { value: 'delayed', label: 'Delayed' },\n { value: 'shipped', label: 'Shipped' },\n];\n\nconst CHANNELS: MultiSelectOption[] = [\n { value: 'web', label: 'Web store' },\n { value: 'marketplace', label: 'Marketplace' },\n { value: 'wholesale', label: 'Wholesale' },\n { value: 'phone', label: 'Phone orders' },\n];\n\ntype Facet = 'status' | 'channel';\n\nconst labelOf = (options: MultiSelectOption[], value: string) =>\n options.find((option) => option.value === value)?.label;\n\nconst countOf = (facet: Facet, value: string) => {\n const count = ORDERS.filter((order) => order[facet] === value).length;\n return count === 1 ? '1 order' : `${count} orders`;\n};\n\n@Component({\n selector: 'app-multi-select-filter-bar',\n imports: [\n SlGrid,\n SlMultiSelect,\n SlMultiSelectItem,\n SlStack,\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n SlText,\n ],\n template: `\n <div slStack [gap]=\"3\">\n <div slGrid [columns]=\"2\" [gap]=\"3\">\n <sl-multi-select\n aria-label=\"Status\"\n placeholder=\"All statuses\"\n size=\"sm\"\n overflow=\"collapse\"\n [items]=\"statusOptions\"\n [(value)]=\"statuses\"\n >\n @for (status of statusOptions; track status.value) {\n <sl-multi-select-item\n [value]=\"status.value\"\n [label]=\"status.label\"\n [description]=\"countOf('status', status.value)\"\n />\n }\n </sl-multi-select>\n <sl-multi-select\n aria-label=\"Channel\"\n placeholder=\"All channels\"\n size=\"sm\"\n overflow=\"collapse\"\n [items]=\"channelOptions\"\n [(value)]=\"channels\"\n >\n @for (channel of channelOptions; track channel.value) {\n <sl-multi-select-item\n [value]=\"channel.value\"\n [label]=\"channel.label\"\n [description]=\"countOf('channel', channel.value)\"\n />\n }\n </sl-multi-select>\n </div>\n <span slText size=\"sm\" tone=\"muted\">{{ rows().length }} of {{ orders.length }} orders</span>\n <div slTable [columns]=\"5\">\n <div slTableContent aria-label=\"Orders\">\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader>Order</th>\n <th slTableColumnHeader>Customer</th>\n <th slTableColumnHeader>Status</th>\n <th slTableColumnHeader>Channel</th>\n <th slTableColumnHeader numeric>Total</th>\n </tr>\n </thead>\n <tbody slTableBody>\n @for (order of rows(); track order.id) {\n <tr slTableRow [value]=\"order.id\">\n <th slTableRowHeader>{{ order.id }}</th>\n <td slTableCell>{{ order.customer }}</td>\n <td slTableCell>{{ labelOf(statusOptions, order.status) }}</td>\n <td slTableCell>{{ labelOf(channelOptions, order.channel) }}</td>\n <td slTableCell numeric>{{ order.total }}</td>\n </tr>\n }\n </tbody>\n </div>\n </div>\n </div>\n `,\n})\nexport class MultiSelectFilterBar {\n protected readonly orders = ORDERS;\n protected readonly statusOptions = STATUSES;\n protected readonly channelOptions = CHANNELS;\n protected readonly labelOf = labelOf;\n protected readonly countOf = countOf;\n protected readonly statuses = signal<readonly string[]>(['open', 'delayed']);\n protected readonly channels = signal<readonly string[]>([]);\n protected readonly rows = computed(() => {\n const statuses = this.statuses();\n const channels = this.channels();\n return ORDERS.filter(\n (order) =>\n (statuses.length === 0 || statuses.includes(order.status)) &&\n (channels.length === 0 || channels.includes(order.channel)),\n );\n });\n}\n",
1271
+ "verdict": "example"
1272
+ },
1273
+ {
1274
+ "id": "initial-value",
1275
+ "title": "initial-value.ts",
1276
+ "note": null,
1277
+ "language": "ts",
1278
+ "source": "import { Component } from '@angular/core';\nimport { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';\nimport {\n SlMultiSelect,\n SlMultiSelectItem,\n type MultiSelectOption,\n} from '@slotted/angular/multi-select';\n\nconst WAREHOUSES: MultiSelectOption[] = [\n { value: 'RNO', label: 'Reno, NV' },\n { value: 'CMH', label: 'Columbus, OH' },\n { value: 'SAV', label: 'Savannah, GA' },\n { value: 'DFW', label: 'Dallas, TX' },\n { value: 'ONT', label: 'Ontario, CA' },\n { value: 'ABE', label: 'Allentown, PA' },\n];\n\n@Component({\n selector: 'app-multi-select-initial-value',\n imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect, SlMultiSelectItem],\n template: `\n <div slField>\n <label slFieldLabel>Stocking warehouses</label>\n <sl-multi-select placeholder=\"Add a warehouse\" [items]=\"warehouses\" [value]=\"stocked\">\n @for (warehouse of warehouses; track warehouse.value) {\n <sl-multi-select-item [value]=\"warehouse.value\" [label]=\"warehouse.label\" />\n }\n </sl-multi-select>\n <span slFieldDescription>Earl Grey, 100 bags is stocked at two warehouses.</span>\n </div>\n `,\n})\nexport class MultiSelectInitialValue {\n protected readonly warehouses = WAREHOUSES;\n protected readonly stocked = ['RNO', 'CMH'];\n}\n",
1279
+ "verdict": "example"
1280
+ },
1281
+ {
1282
+ "id": "loading",
1283
+ "title": "loading.ts",
1284
+ "note": null,
1285
+ "language": "ts",
1286
+ "source": "import { Component, signal } from '@angular/core';\nimport { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';\nimport {\n SlMultiSelect,\n SlMultiSelectItem,\n type MultiSelectOption,\n} from '@slotted/angular/multi-select';\n\nconst CARRIERS: MultiSelectOption[] = [\n { value: 'ups', label: 'UPS Ground' },\n { value: 'fedex', label: 'FedEx Ground' },\n { value: 'usps', label: 'USPS Priority Mail' },\n { value: 'dhl', label: 'DHL Express' },\n];\n\n/** Stands in for a request to the shipping rates API. */\nconst fetchCarriers = () =>\n new Promise<MultiSelectOption[]>((resolve) => setTimeout(() => resolve(CARRIERS), 1500));\n\n@Component({\n selector: 'app-multi-select-loading',\n imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect, SlMultiSelectItem],\n template: `\n <div slField>\n <label slFieldLabel>Carriers offered at checkout</label>\n <sl-multi-select\n placeholder=\"Add a carrier\"\n [loading]=\"loading()\"\n [items]=\"carriers()\"\n [messages]=\"{ loading: 'Fetching carriers…' }\"\n (openChange)=\"load($event)\"\n >\n @for (carrier of carriers(); track carrier.value) {\n <sl-multi-select-item [value]=\"carrier.value\" [label]=\"carrier.label\" />\n }\n </sl-multi-select>\n <span slFieldDescription>Carriers load from the rates service when the list opens.</span>\n </div>\n `,\n})\nexport class MultiSelectLoading {\n protected readonly carriers = signal<MultiSelectOption[]>([]);\n protected readonly loading = signal(false);\n private loaded = false;\n\n protected async load(open: boolean): Promise<void> {\n if (!open || this.loaded || this.loading()) return;\n this.loading.set(true);\n this.carriers.set(await fetchCarriers());\n this.loading.set(false);\n this.loaded = true;\n }\n}\n",
1287
+ "verdict": "example"
1288
+ },
1289
+ {
1290
+ "id": "long-list",
1291
+ "title": "long-list.ts",
1292
+ "note": null,
1293
+ "language": "ts",
1294
+ "source": "import { Component } from '@angular/core';\nimport { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';\nimport {\n SlMultiSelect,\n SlMultiSelectItem,\n type MultiSelectOption,\n} from '@slotted/angular/multi-select';\n\nconst STATES: MultiSelectOption[] = [\n { value: 'AL', label: 'Alabama' },\n { value: 'AK', label: 'Alaska' },\n { value: 'AZ', label: 'Arizona' },\n { value: 'AR', label: 'Arkansas' },\n { value: 'CA', label: 'California' },\n { value: 'CO', label: 'Colorado' },\n { value: 'CT', label: 'Connecticut' },\n { value: 'DE', label: 'Delaware' },\n { value: 'FL', label: 'Florida' },\n { value: 'GA', label: 'Georgia' },\n { value: 'HI', label: 'Hawaii' },\n { value: 'ID', label: 'Idaho' },\n { value: 'IL', label: 'Illinois' },\n { value: 'IN', label: 'Indiana' },\n { value: 'IA', label: 'Iowa' },\n { value: 'KS', label: 'Kansas' },\n { value: 'KY', label: 'Kentucky' },\n { value: 'LA', label: 'Louisiana' },\n { value: 'ME', label: 'Maine' },\n { value: 'MD', label: 'Maryland' },\n { value: 'MA', label: 'Massachusetts' },\n { value: 'MI', label: 'Michigan' },\n { value: 'MN', label: 'Minnesota' },\n { value: 'MS', label: 'Mississippi' },\n { value: 'MO', label: 'Missouri' },\n { value: 'MT', label: 'Montana' },\n { value: 'NE', label: 'Nebraska' },\n { value: 'NV', label: 'Nevada' },\n { value: 'NH', label: 'New Hampshire' },\n { value: 'NJ', label: 'New Jersey' },\n { value: 'NM', label: 'New Mexico' },\n { value: 'NY', label: 'New York' },\n { value: 'NC', label: 'North Carolina' },\n { value: 'ND', label: 'North Dakota' },\n { value: 'OH', label: 'Ohio' },\n { value: 'OK', label: 'Oklahoma' },\n { value: 'OR', label: 'Oregon' },\n { value: 'PA', label: 'Pennsylvania' },\n { value: 'RI', label: 'Rhode Island' },\n { value: 'SC', label: 'South Carolina' },\n { value: 'SD', label: 'South Dakota' },\n { value: 'TN', label: 'Tennessee' },\n { value: 'TX', label: 'Texas' },\n { value: 'UT', label: 'Utah' },\n { value: 'VT', label: 'Vermont' },\n { value: 'VA', label: 'Virginia' },\n { value: 'WA', label: 'Washington' },\n { value: 'WV', label: 'West Virginia' },\n { value: 'WI', label: 'Wisconsin' },\n { value: 'WY', label: 'Wyoming' },\n];\n\n@Component({\n selector: 'app-multi-select-long-list',\n imports: [SlField, SlFieldDescription, SlFieldLabel, SlMultiSelect, SlMultiSelectItem],\n template: `\n <div slField>\n <label slFieldLabel>Ship-to states</label>\n <sl-multi-select\n chosenOptions=\"hide\"\n placeholder=\"Add a state\"\n [items]=\"states\"\n [value]=\"shipTo\"\n >\n @for (state of states; track state.value) {\n <sl-multi-select-item [value]=\"state.value\" [label]=\"state.label\" />\n }\n </sl-multi-select>\n <span slFieldDescription\n >Ground shipping from Reno, NV reaches these states in two days.</span\n >\n </div>\n `,\n})\nexport class MultiSelectLongList {\n protected readonly states = STATES;\n protected readonly shipTo = ['CA', 'NV', 'OR'];\n}\n",
1295
+ "verdict": "example"
1296
+ },
1297
+ {
1298
+ "id": "narrow",
1299
+ "title": "narrow.ts",
1300
+ "note": null,
1301
+ "language": "ts",
1302
+ "source": "import { Component } from '@angular/core';\nimport { SlField, SlFieldLabel } from '@slotted/angular/field';\nimport {\n SlMultiSelect,\n SlMultiSelectItem,\n type MultiSelectOption,\n} from '@slotted/angular/multi-select';\nimport { SlStack } from '@slotted/angular/stack';\n\nconst CHANNELS: MultiSelectOption[] = [\n { value: 'web', label: 'Web store' },\n { value: 'marketplace', label: 'Marketplace' },\n { value: 'wholesale', label: 'Wholesale' },\n { value: 'phone', label: 'Phone orders' },\n];\n\n@Component({\n selector: 'app-multi-select-narrow',\n imports: [SlField, SlFieldLabel, SlMultiSelect, SlMultiSelectItem, SlStack],\n template: `\n <div slStack [gap]=\"4\" style=\"inline-size: 7rem\">\n <div slField>\n <label slFieldLabel>Channels</label>\n <sl-multi-select size=\"sm\" width=\"content\" [items]=\"channels\" [value]=\"chosen\">\n @for (channel of channels; track channel.value) {\n <sl-multi-select-item [value]=\"channel.value\" [label]=\"channel.label\" />\n }\n </sl-multi-select>\n </div>\n </div>\n `,\n})\nexport class MultiSelectNarrow {\n protected readonly channels = CHANNELS;\n protected readonly chosen = ['web', 'marketplace', 'wholesale'];\n}\n",
1303
+ "verdict": "example"
1304
+ },
1305
+ {
1306
+ "id": "order-tags",
1307
+ "title": "order-tags.ts",
1308
+ "note": null,
1309
+ "language": "ts",
1310
+ "source": "import { Component } from '@angular/core';\nimport {\n SlMultiSelect,\n SlMultiSelectItem,\n type MultiSelectOption,\n} from '@slotted/angular/multi-select';\nimport {\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n} from '@slotted/angular/table';\n\nconst TAGS: MultiSelectOption[] = [\n { value: 'priority', label: 'priority' },\n { value: 'gift wrap', label: 'gift wrap' },\n { value: 'fragile', label: 'fragile' },\n { value: 'backorder', label: 'backorder' },\n { value: 'address check', label: 'address check' },\n { value: 'wholesale', label: 'wholesale' },\n];\n\nconst ORDERS = [\n { id: 'SO-10482', customer: 'Harbor & Pine', tags: ['priority', 'fragile'] },\n { id: 'SO-10483', customer: 'Brightline Studio', tags: ['address check'] },\n { id: 'SO-10484', customer: 'Northgate Labs', tags: ['wholesale', 'backorder', 'priority'] },\n { id: 'SO-10485', customer: 'Verde Kitchen', tags: [] },\n];\n\n@Component({\n selector: 'app-multi-select-order-tags',\n imports: [\n SlMultiSelect,\n SlMultiSelectItem,\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n ],\n template: `\n <div slTable [columns]=\"3\">\n <div slTableContent aria-label=\"Orders\">\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader>Order</th>\n <th slTableColumnHeader>Customer</th>\n <th slTableColumnHeader>Tags</th>\n </tr>\n </thead>\n <tbody slTableBody>\n @for (order of orders; track order.id) {\n <tr slTableRow [value]=\"order.id\">\n <th slTableRowHeader>{{ order.id }}</th>\n <td slTableCell>{{ order.customer }}</td>\n <td slTableCell>\n <sl-multi-select\n variant=\"plain\"\n size=\"sm\"\n overflow=\"collapse\"\n creatable\n placeholder=\"Add a tag\"\n [aria-label]=\"'Tags for ' + order.id\"\n [items]=\"tags\"\n [value]=\"order.tags\"\n >\n @for (tag of tags; track tag.value) {\n <sl-multi-select-item [value]=\"tag.value\" [label]=\"tag.label\" />\n }\n </sl-multi-select>\n </td>\n </tr>\n }\n </tbody>\n </div>\n </div>\n `,\n})\nexport class MultiSelectOrderTags {\n protected readonly tags = TAGS;\n protected readonly orders = ORDERS;\n}\n",
1311
+ "verdict": "example"
1312
+ }
1313
+ ]
1314
+ }