@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,1059 @@
1
+ {
2
+ "family": "table",
3
+ "ui": "table",
4
+ "binding": "angular",
5
+ "catalog": {
6
+ "group": "Data display",
7
+ "summary": "Semantic table with sorting, filters and selection."
8
+ },
9
+ "axes": {
10
+ "variant": [
11
+ "plain",
12
+ "ruled",
13
+ "framed"
14
+ ],
15
+ "striped": [
16
+ true,
17
+ false
18
+ ],
19
+ "stickyHeader": [
20
+ true,
21
+ false
22
+ ],
23
+ "stickyFooter": [
24
+ true,
25
+ false
26
+ ],
27
+ "stickyTo": [
28
+ "scroll",
29
+ "page"
30
+ ],
31
+ "layout": [
32
+ "auto",
33
+ "fixed"
34
+ ],
35
+ "cellAlign": [
36
+ "start",
37
+ "center",
38
+ "end"
39
+ ],
40
+ "selectionMode": [
41
+ "none",
42
+ "single",
43
+ "multiple"
44
+ ],
45
+ "align": [
46
+ "start",
47
+ "center",
48
+ "end"
49
+ ],
50
+ "numeric": [
51
+ true,
52
+ false
53
+ ],
54
+ "text": [
55
+ "wrap",
56
+ "truncate",
57
+ "nowrap"
58
+ ],
59
+ "sticky": [
60
+ "start",
61
+ "end"
62
+ ],
63
+ "blockAlign": [
64
+ "start",
65
+ "center",
66
+ "end"
67
+ ]
68
+ },
69
+ "members": {
70
+ "table": {
71
+ "nativeElement": "div",
72
+ "defaults": {
73
+ "variant": "ruled",
74
+ "striped": false,
75
+ "stickyHeader": false,
76
+ "stickyTo": "scroll",
77
+ "layout": "auto",
78
+ "selectionMode": "none",
79
+ "align": "start",
80
+ "numeric": false,
81
+ "text": "wrap",
82
+ "sticky": "start",
83
+ "loading": false,
84
+ "columns": 1,
85
+ "skeletonRows": 5,
86
+ "cellAlign": "center",
87
+ "blockAlign": "center",
88
+ "stickyFooter": false,
89
+ "searchThreshold": 8
90
+ },
91
+ "capabilities": [
92
+ "sort",
93
+ "filter",
94
+ "selection",
95
+ "open",
96
+ "overflow",
97
+ "appearance",
98
+ "arrangement",
99
+ "content",
100
+ "loading",
101
+ "disabled",
102
+ "wiring"
103
+ ],
104
+ "states": [
105
+ "default",
106
+ "hover",
107
+ "active",
108
+ "focus-visible",
109
+ "selected",
110
+ "expanded",
111
+ "disabled",
112
+ "loading"
113
+ ],
114
+ "parts": [
115
+ "root",
116
+ "scroll",
117
+ "table",
118
+ "caption",
119
+ "head",
120
+ "body",
121
+ "summary",
122
+ "row",
123
+ "column-header",
124
+ "row-header",
125
+ "cell",
126
+ "sort",
127
+ "column-actions",
128
+ "filter",
129
+ "filter-panel",
130
+ "filter-condition",
131
+ "filter-operator",
132
+ "filter-operand",
133
+ "filter-join",
134
+ "filter-search",
135
+ "filter-list",
136
+ "filter-option",
137
+ "filter-empty",
138
+ "filter-actions",
139
+ "selection",
140
+ "expander",
141
+ "detail",
142
+ "empty",
143
+ "loader",
144
+ "footer"
145
+ ]
146
+ }
147
+ },
148
+ "docs": {
149
+ "table": {
150
+ "imports": {
151
+ "source": "import {\n SlTable,\n SlTableBody,\n SlTableCaption,\n SlTableCell,\n SlTableColumnActions,\n SlTableColumnHeader,\n SlTableContent,\n SlTableDetail,\n SlTableEmpty,\n SlTableExpander,\n SlTableFooter,\n SlTableHead,\n SlTableLoader,\n SlTableRow,\n SlTableRowHeader,\n SlTableSelect,\n SlTableSelectAll,\n SlTableSort,\n SlTableSummary,\n provideTableDefaults,\n} from '@slotted/angular/table';",
152
+ "selector": "div[slTable]",
153
+ "exportAs": "slTable"
154
+ },
155
+ "anatomy": [
156
+ {
157
+ "part": "root",
158
+ "element": "div[slTable], exportAs=\"slTable\"",
159
+ "required": true,
160
+ "purpose": "The frame, and your own div. It carries every axis and holds what must not move when the table is scrolled sideways: the border, the radius and the footer bar."
161
+ },
162
+ {
163
+ "part": "scroll",
164
+ "element": "div[slTableContent], exportAs=\"slTableContent\"",
165
+ "required": true,
166
+ "purpose": "The scroller, and the element a sticky header resolves against. It becomes a named region with a tab stop only while the table overflows."
167
+ },
168
+ {
169
+ "part": "table",
170
+ "element": "table, drawn by slTableContent",
171
+ "required": true,
172
+ "purpose": "The tabular structure itself. Angular pays one element for the host and draws the other in its template, which is why one directive owns both."
173
+ },
174
+ {
175
+ "part": "caption",
176
+ "element": "caption[slTableCaption]",
177
+ "required": false,
178
+ "purpose": "The table name, and the accessible name whether it is read or hidden. The family writes no aria-labelledby restating what the browser already states."
179
+ },
180
+ {
181
+ "part": "head",
182
+ "element": "thead[slTableHead]",
183
+ "required": false,
184
+ "purpose": "The header row group. It sticks to the scroller when stickyHeader is on."
185
+ },
186
+ {
187
+ "part": "body",
188
+ "element": "tbody[slTableBody]",
189
+ "required": true,
190
+ "purpose": "The rows. A table may hold more than one, which is how a set is grouped by section."
191
+ },
192
+ {
193
+ "part": "summary",
194
+ "element": "tfoot[slTableSummary]",
195
+ "required": false,
196
+ "purpose": "The column summaries, which is the HTML Standard own word for a tfoot: a total, a count, a unit. It is not the footer bar."
197
+ },
198
+ {
199
+ "part": "footer",
200
+ "element": "div[slTableFooter]",
201
+ "required": false,
202
+ "purpose": "The bar under the table and inside the frame, where a paged listing puts its control. It is a sibling of the scroller, so a table scrolled sideways does not take its pagination with it."
203
+ },
204
+ {
205
+ "part": "row",
206
+ "element": "tr[slTableRow], exportAs=\"slTableRow\"",
207
+ "required": true,
208
+ "purpose": "One record. It carries data-selected and data-expanded for the stylesheet and data-value for the range and the select-all."
209
+ },
210
+ {
211
+ "part": "column-header",
212
+ "element": "th[slTableColumnHeader]",
213
+ "required": false,
214
+ "purpose": "A column name, scoped to its column. It carries aria-sort when it is the sorted one, and on no other header. A name its box cuts — text=\"truncate\" on a column with no room — opens a hint with the whole of it, shown rather than read, because the header already states the words."
215
+ },
216
+ {
217
+ "part": "row-header",
218
+ "element": "th[slTableRowHeader]",
219
+ "required": false,
220
+ "purpose": "The cell that identifies the record, scoped to its row, which a screen reader repeats in each cell beside it."
221
+ },
222
+ {
223
+ "part": "cell",
224
+ "element": "td[slTableCell]",
225
+ "required": true,
226
+ "purpose": "One value, and the four axes a cell answers: align, numeric, text and sticky."
227
+ },
228
+ {
229
+ "part": "sort",
230
+ "element": "button[slTableSort]",
231
+ "required": false,
232
+ "purpose": "The column name wrapped in a button, which is what the APG sortable example does. The whole header is the target."
233
+ },
234
+ {
235
+ "part": "column-actions",
236
+ "element": "span[slTableColumnActions]",
237
+ "required": false,
238
+ "purpose": "The slot beside a column name for the controls it carries: a filter trigger, a column menu, a help hint. The family holds the place; the query is yours."
239
+ },
240
+ {
241
+ "part": "filter",
242
+ "element": "button, inside span[slTableSetFilter] and its four siblings",
243
+ "required": false,
244
+ "purpose": "The trigger the table draws in that slot, and everything behind it. It marks itself while the column is filtered and states what is applied in its own name."
245
+ },
246
+ {
247
+ "part": "filter-panel",
248
+ "element": "div",
249
+ "required": false,
250
+ "purpose": "The surface the trigger opens: the conditions, the join between them and the two actions. It edits a draft — nothing reaches you until Apply."
251
+ },
252
+ {
253
+ "part": "filter-condition",
254
+ "element": "div",
255
+ "required": false,
256
+ "purpose": "One condition: an operator and the operands that operator takes. Two of them at most, and the second appears once the first is complete."
257
+ },
258
+ {
259
+ "part": "filter-operator",
260
+ "element": "div",
261
+ "required": false,
262
+ "purpose": "The chooser, which is sl-select. What it offers is the kind own list, narrowed by operators."
263
+ },
264
+ {
265
+ "part": "filter-operand",
266
+ "element": "div",
267
+ "required": false,
268
+ "purpose": "The field the operator asks for: none for is empty, one for a comparison, two for between. The kind own ng-template draws it, once per condition."
269
+ },
270
+ {
271
+ "part": "filter-join",
272
+ "element": "div",
273
+ "required": false,
274
+ "purpose": "And or Or between two conditions, which is also the word between the ends of a range."
275
+ },
276
+ {
277
+ "part": "filter-search",
278
+ "element": "div",
279
+ "required": false,
280
+ "purpose": "The field that narrows a set filter values, through the same locale collator Combobox filters with. It appears once there are searchThreshold values."
281
+ },
282
+ {
283
+ "part": "filter-list",
284
+ "element": "div",
285
+ "required": false,
286
+ "purpose": "The values, scrolling inside the panel rather than making the panel taller than the screen."
287
+ },
288
+ {
289
+ "part": "filter-option",
290
+ "element": "div",
291
+ "required": false,
292
+ "purpose": "One value, its checkbox and its count. The first is the covering checkbox, which answers for exactly what the search left."
293
+ },
294
+ {
295
+ "part": "filter-empty",
296
+ "element": "p",
297
+ "required": false,
298
+ "purpose": "The word shown when the search matches nothing, so the panel is never a blank box."
299
+ },
300
+ {
301
+ "part": "filter-actions",
302
+ "element": "div",
303
+ "required": false,
304
+ "purpose": "The footer: Clear at the leading edge and Apply at the trailing one."
305
+ },
306
+ {
307
+ "part": "selection",
308
+ "element": "td[slTableSelect] and th[slTableSelectAll]",
309
+ "required": false,
310
+ "purpose": "The cell holding the checkbox, in the header and in every row. The cell is this family and the chooser is slCheckbox, named by a visually hidden label."
311
+ },
312
+ {
313
+ "part": "expander",
314
+ "element": "button[slTableExpander]",
315
+ "required": false,
316
+ "purpose": "Opens and closes one row detail. It carries aria-expanded, and aria-controls naming the detail row while that row is open. It is the APG Disclosure pattern, borrowed whole."
317
+ },
318
+ {
319
+ "part": "detail",
320
+ "element": "tr[slTableDetail]",
321
+ "required": false,
322
+ "purpose": "The open row detail, one cell spanning every column. Control flow in the template keeps a closed one out of the DOM, which a host element cannot do for itself."
323
+ },
324
+ {
325
+ "part": "empty",
326
+ "element": "td[slTableEmpty]",
327
+ "required": false,
328
+ "purpose": "What is shown when there is nothing, spanning every column. It takes an slResultState, which already separates an empty set from a set a filter emptied."
329
+ },
330
+ {
331
+ "part": "loader",
332
+ "element": "tbody[slTableLoader]",
333
+ "required": false,
334
+ "purpose": "The skeleton rows of a first load: the table shape before its content. A refresh over rows already read is the other state and dims the body instead."
335
+ }
336
+ ],
337
+ "api": [
338
+ {
339
+ "name": "sort",
340
+ "type": "model<TableSortDescriptor | null>",
341
+ "defaultValue": "null",
342
+ "appliesTo": "slTable",
343
+ "description": "The column the rows are ordered by, two-way"
344
+ },
345
+ {
346
+ "name": "defaultSort",
347
+ "type": "model initial value",
348
+ "defaultValue": "null",
349
+ "appliesTo": "slTable",
350
+ "description": "The order an unbound table starts in: the model own initial value"
351
+ },
352
+ {
353
+ "name": "value",
354
+ "type": "model<readonly string[]>",
355
+ "defaultValue": "[]",
356
+ "appliesTo": "slTable",
357
+ "description": "The chosen rows, two-way, and the value a form control holds"
358
+ },
359
+ {
360
+ "name": "defaultValue",
361
+ "type": "model initial value",
362
+ "defaultValue": "[]",
363
+ "appliesTo": "slTable",
364
+ "description": "The rows an unbound table starts with"
365
+ },
366
+ {
367
+ "name": "expanded",
368
+ "type": "model<readonly string[]>",
369
+ "defaultValue": "[]",
370
+ "appliesTo": "slTable",
371
+ "description": "The rows whose detail is open, two-way"
372
+ },
373
+ {
374
+ "name": "defaultExpanded",
375
+ "type": "model initial value",
376
+ "defaultValue": "[]",
377
+ "appliesTo": "slTable",
378
+ "description": "The details an unbound table starts with"
379
+ },
380
+ {
381
+ "name": "variant",
382
+ "type": "'plain' | 'ruled' | 'framed'",
383
+ "defaultValue": "ruled",
384
+ "appliesTo": "slTable",
385
+ "description": "How much of a frame the set is given"
386
+ },
387
+ {
388
+ "name": "striped",
389
+ "type": "boolean",
390
+ "defaultValue": "false",
391
+ "appliesTo": "slTable",
392
+ "description": "A tinted ground on every second record"
393
+ },
394
+ {
395
+ "name": "stickyHeader",
396
+ "type": "boolean",
397
+ "defaultValue": "false",
398
+ "appliesTo": "slTable",
399
+ "description": "Whether the header stays while the body scrolls"
400
+ },
401
+ {
402
+ "name": "stickyFooter",
403
+ "type": "boolean",
404
+ "defaultValue": "false",
405
+ "appliesTo": "slTable",
406
+ "description": "Whether the summary rows stay while the body scrolls. It pins the tfoot and not the footer bar, which never scrolls."
407
+ },
408
+ {
409
+ "name": "stickyTo",
410
+ "type": "'scroll' | 'page'",
411
+ "defaultValue": "scroll",
412
+ "appliesTo": "slTable",
413
+ "description": "What the header stays inside: this table own scroller, or whatever scrolls outside it. page releases the scroller, so the table stops scrolling sideways in its frame."
414
+ },
415
+ {
416
+ "name": "options",
417
+ "type": "readonly TableFilterOption[]",
418
+ "defaultValue": "[]",
419
+ "appliesTo": "slTableSetFilter",
420
+ "description": "The values the column can be filtered to, each with an optional count of its own. With operand tags they are a datalist and the set a typed value must belong to; without them any value is admitted."
421
+ },
422
+ {
423
+ "name": "operand",
424
+ "type": "'list' | 'tags'",
425
+ "defaultValue": "list",
426
+ "appliesTo": "slTableSetFilter",
427
+ "description": "How the values are chosen: the search, the covering checkbox and the list, or sl-tags-input holding the chosen values as chips. The descriptor is the same list either way."
428
+ },
429
+ {
430
+ "name": "presets",
431
+ "type": "TemplateRef",
432
+ "defaultValue": "—",
433
+ "appliesTo": "slTableDateFilter, slTableTimeFilter, slTableDateTimeFilter",
434
+ "description": "A template of slDateRangePickerPreset, slTimeRangePickerPreset or slDateTimeRangePickerPreset buttons offered inside the range picker between draws. The descriptor still receives two ISO values."
435
+ },
436
+ {
437
+ "name": "granularity",
438
+ "type": "'hour' | 'minute' | 'second'",
439
+ "defaultValue": "minute",
440
+ "appliesTo": "slTableTimeFilter, slTableDateTimeFilter",
441
+ "description": "The last unit the picker writes, and the precision the engine compares at: a minute-precision operand matches every second of its minute."
442
+ },
443
+ {
444
+ "name": "value",
445
+ "type": "TextFilter | NumberFilter | DateFilter | TimeFilter | DateTimeFilter | BooleanFilter | SetFilter | null",
446
+ "defaultValue": "null",
447
+ "appliesTo": "slTable*Filter",
448
+ "description": "The descriptor the column is filtered by, typed as its own kind. Two-way through [(value)], and valueChangeRequest carries the reason; both fire once, on Apply."
449
+ },
450
+ {
451
+ "name": "operators",
452
+ "type": "readonly string[]",
453
+ "defaultValue": "the kind own list",
454
+ "appliesTo": "slTable*Filter",
455
+ "description": "Narrows what the chooser offers, in the order given. defaultOperator picks the one the panel opens on."
456
+ },
457
+ {
458
+ "name": "conditions",
459
+ "type": "number",
460
+ "defaultValue": "2",
461
+ "appliesTo": "slTable*Filter",
462
+ "description": "How many conditions the panel offers. The second appears once the first is complete."
463
+ },
464
+ {
465
+ "name": "searchThreshold",
466
+ "type": "number",
467
+ "defaultValue": "8",
468
+ "appliesTo": "slTableSetFilter",
469
+ "description": "How many values bring a search with them. searchable states it outright."
470
+ },
471
+ {
472
+ "name": "cellAlign",
473
+ "type": "'start' | 'center' | 'end'",
474
+ "defaultValue": "center",
475
+ "appliesTo": "slTable",
476
+ "description": "Where every cell content sits in a row as tall as its tallest cell. A cell states blockAlign to answer differently."
477
+ },
478
+ {
479
+ "name": "layout",
480
+ "type": "'auto' | 'fixed'",
481
+ "defaultValue": "auto",
482
+ "appliesTo": "slTable",
483
+ "description": "Whether the browser sizes the columns from their content or from what you state"
484
+ },
485
+ {
486
+ "name": "selectionMode",
487
+ "type": "'none' | 'single' | 'multiple'",
488
+ "defaultValue": "none",
489
+ "appliesTo": "slTable",
490
+ "description": "How many records may be chosen at once"
491
+ },
492
+ {
493
+ "name": "columns",
494
+ "type": "number",
495
+ "defaultValue": "1",
496
+ "appliesTo": "slTable",
497
+ "description": "How many columns the spanning parts span"
498
+ },
499
+ {
500
+ "name": "loading",
501
+ "type": "boolean",
502
+ "defaultValue": "false",
503
+ "appliesTo": "slTable",
504
+ "description": "A refresh over rows already shown: aria-busy, and nothing moves"
505
+ },
506
+ {
507
+ "name": "messages",
508
+ "type": "Partial<TableMessages>",
509
+ "defaultValue": "—",
510
+ "appliesTo": "slTable",
511
+ "description": "Words laid over the language in force, key by key: selection, expansion, sort and every word of the column filters"
512
+ },
513
+ {
514
+ "name": "skeletonRows",
515
+ "type": "number",
516
+ "defaultValue": "5",
517
+ "appliesTo": "slTableLoader",
518
+ "description": "How many skeleton rows a first load draws"
519
+ },
520
+ {
521
+ "name": "totalRowCount",
522
+ "type": "number",
523
+ "defaultValue": "—",
524
+ "appliesTo": "slTableContent",
525
+ "description": "The size of the set behind a page, written as aria-rowcount"
526
+ },
527
+ {
528
+ "name": "aria-label",
529
+ "type": "string",
530
+ "defaultValue": "—",
531
+ "appliesTo": "slTableContent",
532
+ "description": "The table’s name when it has no caption, written on the table element"
533
+ },
534
+ {
535
+ "name": "scrollLabel",
536
+ "type": "string",
537
+ "defaultValue": "—",
538
+ "appliesTo": "slTableContent",
539
+ "description": "The name the scrolling region takes while it overflows, over the catalog’s"
540
+ },
541
+ {
542
+ "name": "scrollLabelledBy",
543
+ "type": "string",
544
+ "defaultValue": "—",
545
+ "appliesTo": "slTableContent",
546
+ "description": "The element that names the region instead, usually the caption"
547
+ },
548
+ {
549
+ "name": "value",
550
+ "type": "string",
551
+ "defaultValue": "—",
552
+ "appliesTo": "slTableRow",
553
+ "description": "The record key the selection and the expansion are held by"
554
+ },
555
+ {
556
+ "name": "disabled",
557
+ "type": "boolean",
558
+ "defaultValue": "false",
559
+ "appliesTo": "slTableRow",
560
+ "description": "A record the reader may not choose; it leaves the set the header covers"
561
+ },
562
+ {
563
+ "name": "rowIndex",
564
+ "type": "number",
565
+ "defaultValue": "—",
566
+ "appliesTo": "slTableRow",
567
+ "description": "The record position in the whole set, written as aria-rowindex"
568
+ },
569
+ {
570
+ "name": "column",
571
+ "type": "string",
572
+ "defaultValue": "—",
573
+ "appliesTo": "slTableColumnHeader, slTableSort",
574
+ "description": "The column key the sort descriptor names"
575
+ },
576
+ {
577
+ "name": "align",
578
+ "type": "'start' | 'center' | 'end'",
579
+ "defaultValue": "start",
580
+ "appliesTo": "the three cell parts",
581
+ "description": "Which edge the value stands on, resolved logically"
582
+ },
583
+ {
584
+ "name": "numeric",
585
+ "type": "boolean",
586
+ "defaultValue": "false",
587
+ "appliesTo": "the three cell parts",
588
+ "description": "Tabular figures, and the end edge unless align says otherwise"
589
+ },
590
+ {
591
+ "name": "blockAlign",
592
+ "type": "'start' | 'center' | 'end'",
593
+ "defaultValue": "center",
594
+ "appliesTo": "the three cell parts and both selection cells",
595
+ "description": "Where this cell content sits in its row, overriding the table own cellAlign"
596
+ },
597
+ {
598
+ "name": "text",
599
+ "type": "'wrap' | 'truncate' | 'nowrap'",
600
+ "defaultValue": "wrap",
601
+ "appliesTo": "the three cell parts",
602
+ "description": "What a value longer than its column does"
603
+ },
604
+ {
605
+ "name": "sticky",
606
+ "type": "'start' | 'end'",
607
+ "defaultValue": "start",
608
+ "appliesTo": "the three cell parts and both selection cells",
609
+ "description": "Which edge the column is pinned to while the table scrolls past it"
610
+ },
611
+ {
612
+ "name": "stickyOffset",
613
+ "type": "string",
614
+ "defaultValue": "0",
615
+ "appliesTo": "the three cell parts and both selection cells",
616
+ "description": "Where the pinned column stops, as a CSS length. Two columns pinned to the same edge need the second to state how wide the first is — beside a selection column that is --slotted-table-selection-size, which is 3rem."
617
+ },
618
+ {
619
+ "name": "colSpan",
620
+ "type": "number",
621
+ "defaultValue": "—",
622
+ "appliesTo": "slTableDetail, slTableEmpty",
623
+ "description": "How many columns the part spans, defaulting to the table own count"
624
+ }
625
+ ],
626
+ "composition": [
627
+ {
628
+ "name": "exportAs",
629
+ "type": "slTable, slTableRow, slTableContent",
630
+ "defaultValue": "—",
631
+ "appliesTo": "every part",
632
+ "description": "Reaches the instance from the template: row.expanded(), table.rows(), content.scrollToRow()"
633
+ },
634
+ {
635
+ "name": "provideTableDefaults()",
636
+ "type": "Partial<TableDefaults>",
637
+ "defaultValue": "—",
638
+ "appliesTo": "Application",
639
+ "description": "Sets the frame, the layout and the selection once; an input on the table still wins"
640
+ },
641
+ {
642
+ "name": "ControlValueAccessor",
643
+ "type": "readonly string[]",
644
+ "defaultValue": "—",
645
+ "appliesTo": "slTable",
646
+ "description": "The selection as a form value: [formControl] or [(ngModel)] on the table itself"
647
+ },
648
+ {
649
+ "name": "ng-content",
650
+ "type": "projected",
651
+ "defaultValue": "—",
652
+ "appliesTo": "slTableContent",
653
+ "description": "Your caption, header, body, summary and footer are projected into the table the directive draws"
654
+ },
655
+ {
656
+ "name": "SL_TABLE_PARTS",
657
+ "type": "readonly Type[]",
658
+ "defaultValue": "—",
659
+ "appliesTo": "a standalone component",
660
+ "description": "Every part in one import, for a template that uses most of them"
661
+ }
662
+ ],
663
+ "events": [
664
+ {
665
+ "name": "sortChange",
666
+ "payload": "TableSortDescriptor | null",
667
+ "when": "The two-way half of the model: the column and the direction, or null when the third press clears it."
668
+ },
669
+ {
670
+ "name": "sortChangeRequest",
671
+ "payload": "ChangeRequest<TableSortDescriptor | null>",
672
+ "when": "The same transition with the reason — pointer, keyboard, clear or programmatic — the value it replaces and cancel()."
673
+ },
674
+ {
675
+ "name": "valueChange",
676
+ "payload": "readonly string[]",
677
+ "when": "The chosen rows, in the collection order rather than the order they were pressed."
678
+ },
679
+ {
680
+ "name": "valueChangeRequest",
681
+ "payload": "ChangeRequest<readonly string[]>",
682
+ "when": "The selection with its reason: select for a range or a select-all, clear when the set is emptied, pointer otherwise."
683
+ },
684
+ {
685
+ "name": "expandedChange",
686
+ "payload": "readonly string[]",
687
+ "when": "The rows whose detail is open, after the press that opened or closed one."
688
+ },
689
+ {
690
+ "name": "expandedChangeRequest",
691
+ "payload": "ChangeRequest<readonly string[]>",
692
+ "when": "The same transition, with the reason and the originating event."
693
+ }
694
+ ],
695
+ "accessibility": [
696
+ "The role is table and not grid, and the difference is the whole boundary with data-grid. The APG says a table \"is not an interactive widget. Thus, its cells are not focusable or selectable\", so every control inside is its own tab stop and the family binds no key. Column resizing, virtualisation, multi-column sort and row activation all need the grid pattern and are deferred to the family that has it.",
697
+ "Every role comes from the platform: table, thead, tbody, tfoot, tr, th and td already carry table, rowgroup, row, columnheader, rowheader and cell. The family writes none of them, and it writes no aria-labelledby either — a caption is the accessible name by the browser own rule, whether it is visible or visually hidden.",
698
+ "scope=\"col\" on a column header and scope=\"row\" on a row header are what make a screen reader repeat the column name and the record name in each cell. They are the two attributes §12 of the feature guide asks for by name.",
699
+ "aria-sort is written on the sorted header and removed from every other, because ARIA has no way to state a sort level and a second sorted column would be silent or a lie. The change is also announced politely with the column and the direction: a property that changes silently is a change no reader hears.",
700
+ "A row is not selectable under this role, so it carries no aria-selected. The state is painted with data-selected and announced by the checkbox that owns it, whose name is a visually hidden label rather than an aria-label on the wrapper — the wrapper is not the control.",
701
+ "aria-rowcount and aria-rowindex are written exactly when you state a total larger than the DOM, which is what the Grid and Table Properties practice requires. The practice warns that writing aria-rowindex on some rows and not others has devastating effects, so the family writes neither unless you state both.",
702
+ "The scroller becomes a region with a tab stop and a name only while the table overflows, measured after the first render rather than assumed. A wide table with no tab stop is unreachable without a pointer — a WCAG 2.2 level A failure — and a tab stop on a table that fits is one a reader presses for nothing.",
703
+ "The expander is the Disclosure pattern: a button with aria-expanded, and with aria-controls naming the detail row while it is open. Your own @if keeps a closed detail out of the DOM, because a component whose host is the tr cannot remove that tr from inside itself and an empty row is a row a screen reader still counts.",
704
+ "A selected row is said by its ground and its ink together, and by the checkbox mark. R1 of this repository forbids the rail two families reached for, and in the high-contrast scheme every tone ground is the page own white — so the mark is what survives."
705
+ ]
706
+ }
707
+ },
708
+ "tokens": [
709
+ "--slotted-border-strong",
710
+ "--slotted-border-subtle",
711
+ "--slotted-border-width-thin",
712
+ "--slotted-control-font-family",
713
+ "--slotted-control-font-size-md",
714
+ "--slotted-control-gap-md",
715
+ "--slotted-control-height-md",
716
+ "--slotted-control-icon-size-md",
717
+ "--slotted-control-padding-inline-md",
718
+ "--slotted-control-transition-duration",
719
+ "--slotted-control-transition-easing",
720
+ "--slotted-disabled-foreground",
721
+ "--slotted-duration-short",
722
+ "--slotted-easing-standard",
723
+ "--slotted-focus-ring-color",
724
+ "--slotted-focus-ring-offset",
725
+ "--slotted-focus-ring-width",
726
+ "--slotted-font-size-xs",
727
+ "--slotted-font-weight-medium",
728
+ "--slotted-font-weight-regular",
729
+ "--slotted-font-weight-semibold",
730
+ "--slotted-ground",
731
+ "--slotted-line-height-md",
732
+ "--slotted-radius-md",
733
+ "--slotted-radius-sm",
734
+ "--slotted-shadow-xs",
735
+ "--slotted-space-2",
736
+ "--slotted-space-5",
737
+ "--slotted-space-9",
738
+ "--slotted-surface",
739
+ "--slotted-table-border-color",
740
+ "--slotted-table-border-color-strong",
741
+ "--slotted-table-border-width",
742
+ "--slotted-table-cell-padding-block",
743
+ "--slotted-table-cell-padding-inline",
744
+ "--slotted-table-color",
745
+ "--slotted-table-color-muted",
746
+ "--slotted-table-column-actions-size",
747
+ "--slotted-table-control-radius",
748
+ "--slotted-table-font-family",
749
+ "--slotted-table-font-size",
750
+ "--slotted-table-gap",
751
+ "--slotted-table-header-surface",
752
+ "--slotted-table-header-surface-hover",
753
+ "--slotted-table-icon-size",
754
+ "--slotted-table-radius",
755
+ "--slotted-table-row-color-selected",
756
+ "--slotted-table-row-min-block-size",
757
+ "--slotted-table-row-surface-hover",
758
+ "--slotted-table-row-surface-selected",
759
+ "--slotted-table-row-surface-selected-hover",
760
+ "--slotted-table-row-surface-stripe",
761
+ "--slotted-table-selection-size",
762
+ "--slotted-table-shadow",
763
+ "--slotted-table-sticky-inset",
764
+ "--slotted-table-sticky-offset",
765
+ "--slotted-table-sticky-offset-end",
766
+ "--slotted-table-surface",
767
+ "--slotted-target-comfortable",
768
+ "--slotted-target-min",
769
+ "--slotted-text",
770
+ "--slotted-text-muted",
771
+ "--slotted-tone-accent-subtle-hover",
772
+ "--slotted-tone-accent-surface",
773
+ "--slotted-tone-accent-text",
774
+ "--slotted-tone-secondary-subtle-hover",
775
+ "--slotted-z-index-sticky"
776
+ ],
777
+ "examples": [
778
+ {
779
+ "id": "playground",
780
+ "title": "Playground",
781
+ "note": "Every axis on one table, driven by the controls below the canvas. Change the variant, turn the stripes on, then narrow the window: the table scrolls inside its own frame rather than pushing the page over.",
782
+ "language": "html",
783
+ "source": "<div slTable [columns]=\"3\">\n <div slTableContent>\n <caption slTableCaption>\n Invoices\n </caption>\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader>Invoice</th>\n <th slTableColumnHeader>Client</th>\n <th slTableColumnHeader numeric>Amount</th>\n </tr>\n </thead>\n <tbody slTableBody>\n @for (invoice of invoices(); track invoice.id) {\n <tr slTableRow [value]=\"invoice.id\">\n <th slTableRowHeader>{{ invoice.id }}</th>\n <td slTableCell>{{ invoice.client }}</td>\n <td slTableCell numeric>{{ invoice.amount }}</td>\n </tr>\n }\n </tbody>\n </div>\n</div>\n",
784
+ "verdict": "excerpt"
785
+ },
786
+ {
787
+ "id": "variant",
788
+ "title": "Nothing, a rule, or a frame",
789
+ "note": "Plain is the form that belongs inside a card, where the card already draws the box. Ruled puts a hairline between records. Framed is the listing screen: the set reads as one object, and the footer bar sits inside it.",
790
+ "language": "html",
791
+ "source": "<div slTable variant=\"plain\"></div>\n<div slTable variant=\"ruled\"></div>\n<div slTable variant=\"framed\"></div>\n",
792
+ "verdict": "excerpt"
793
+ },
794
+ {
795
+ "id": "striped",
796
+ "title": "A stripe to carry the eye across",
797
+ "note": "Off by default, because a stripe costs a row its own state colours. It is mixed from the ink at five per cent, one step under the header band, and every state is painted over it: a striped row that is selected reads as selected.",
798
+ "language": "ts",
799
+ "source": "import { Component } from '@angular/core';\nimport {\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n} from '@slotted/angular/table';\n\nconst STOCK = [\n { sku: 'PRD-0412', product: 'Chai', warehouse: 'Reno', onHand: 390, reserved: 42 },\n { sku: 'PRD-0413', product: 'Chang', warehouse: 'Reno', onHand: 170, reserved: 12 },\n { sku: 'PRD-0414', product: 'Aniseed Syrup', warehouse: 'Columbus', onHand: 130, reserved: 70 },\n {\n sku: 'PRD-0415',\n product: \"Chef Anton's Cajun Seasoning\",\n warehouse: 'Savannah',\n onHand: 530,\n reserved: 0,\n },\n {\n sku: 'PRD-0416',\n product: \"Grandma's Boysenberry Spread\",\n warehouse: 'Columbus',\n onHand: 120,\n reserved: 25,\n },\n {\n sku: 'PRD-0417',\n product: 'Northwoods Cranberry Sauce',\n warehouse: 'Reno',\n onHand: 60,\n reserved: 60,\n },\n];\n\n@Component({\n selector: 'app-table-striped',\n imports: [\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n ],\n template: `\n <div slTable [columns]=\"5\" striped>\n <div slTableContent aria-label=\"Stock on hand\">\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader>SKU</th>\n <th slTableColumnHeader>Product</th>\n <th slTableColumnHeader>Warehouse</th>\n <th slTableColumnHeader numeric>On hand</th>\n <th slTableColumnHeader numeric>Reserved</th>\n </tr>\n </thead>\n <tbody slTableBody>\n @for (item of stock; track item.sku) {\n <tr slTableRow [value]=\"item.sku\">\n <th slTableRowHeader text=\"nowrap\">{{ item.sku }}</th>\n <td slTableCell>{{ item.product }}</td>\n <td slTableCell>{{ item.warehouse }}</td>\n <td slTableCell numeric>{{ item.onHand }}</td>\n <td slTableCell numeric>{{ item.reserved }}</td>\n </tr>\n }\n </tbody>\n </div>\n </div>\n `,\n})\nexport class TableStriped {\n readonly stock = STOCK;\n}\n",
800
+ "verdict": "example"
801
+ },
802
+ {
803
+ "id": "sorting",
804
+ "title": "Ordered by one column, and said out loud",
805
+ "note": "Press a header: ascending, then descending, then none. The family holds the descriptor and reorders nothing — the rows are yours — so apply it to your own array or send it to your query. The change is announced, because aria-sort alone is silent.",
806
+ "language": "ts",
807
+ "source": "import { Component, computed, signal } from '@angular/core';\nimport {\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n SlTableSort,\n type TableSortDescriptor,\n} from '@slotted/angular/table';\n\nconst USD = new Intl.NumberFormat('en-US', { currency: 'USD', style: 'currency' });\n\nconst ORDERS = [\n { id: 'SO-10421', customer: 'Alfreds Futterkiste', placed: '2026-09-28', total: 1240 },\n { id: 'SO-10422', customer: \"Bon app'\", placed: '2026-09-29', total: 860.5 },\n { id: 'SO-10423', customer: 'Ernst Handel', placed: '2026-09-27', total: 3410.25 },\n { id: 'SO-10424', customer: 'Folk och fä HB', placed: '2026-09-30', total: 512 },\n];\n\ntype Order = (typeof ORDERS)[number];\n\nfunction sortOrders(rows: readonly Order[], sort: TableSortDescriptor | null): readonly Order[] {\n if (sort === null) return rows;\n const key = sort.column as keyof Order;\n const sign = sort.direction === 'ascending' ? 1 : -1;\n return [...rows].sort((a, b) =>\n typeof a[key] === 'number'\n ? ((a[key] as number) - (b[key] as number)) * sign\n : String(a[key]).localeCompare(String(b[key])) * sign,\n );\n}\n\n@Component({\n selector: 'app-table-sorting',\n imports: [\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n SlTableSort,\n ],\n template: `\n <div slTable [columns]=\"4\" [(sort)]=\"sort\">\n <div slTableContent aria-label=\"Recent orders\">\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader column=\"id\"><button slTableSort>Order</button></th>\n <th slTableColumnHeader column=\"customer\"><button slTableSort>Customer</button></th>\n <th slTableColumnHeader column=\"placed\"><button slTableSort>Placed</button></th>\n <th slTableColumnHeader column=\"total\" numeric><button slTableSort>Total</button></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 text=\"nowrap\">{{ order.id }}</th>\n <td slTableCell>{{ order.customer }}</td>\n <td slTableCell text=\"nowrap\">{{ order.placed }}</td>\n <td slTableCell numeric>{{ usd.format(order.total) }}</td>\n </tr>\n }\n </tbody>\n </div>\n </div>\n `,\n})\nexport class TableSorting {\n readonly sort = signal<TableSortDescriptor | null>({ column: 'placed', direction: 'descending' });\n readonly rows = computed(() => sortOrders(ORDERS, this.sort()));\n readonly usd = USD;\n}\n",
808
+ "verdict": "example"
809
+ },
810
+ {
811
+ "id": "column-controls",
812
+ "title": "A filter, beside the name it filters",
813
+ "note": "The family draws the filter: a trigger on the column boundary and a panel that searches, covers what the search left, counts what you counted, and edits a draft. Nothing reaches you until Apply — Escape and a press outside put back the set the panel opened with. What the set means is still your query.",
814
+ "language": "html",
815
+ "source": "<th slTableColumnHeader column=\"client\">\n <button slTableSort>Client</button>\n <span slTableColumnActions>\n <span slTableTextFilter columnLabel=\"client\" [(value)]=\"client\"></span>\n </span>\n</th>\n",
816
+ "verdict": "excerpt"
817
+ },
818
+ {
819
+ "id": "filter",
820
+ "title": "A column filtered to the values you named",
821
+ "note": "The set filter: a list, a search past eight values through the same locale collator Combobox uses, and a checkbox that covers exactly what the search left. Counts are yours to supply. Nothing reaches you until Apply — Escape and a press outside put back the descriptor the panel opened with — and a filtered column says what is applied in the trigger own name.",
822
+ "language": "ts",
823
+ "source": "import { Component, computed, signal } from '@angular/core';\nimport { createFilterPredicate, type SetFilter } from '@slotted/core/filter';\nimport {\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnActions,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n SlTableSetFilter,\n} from '@slotted/angular/table';\n\nconst ORDERS = [\n { id: 'SO-10421', customer: 'Alfreds Futterkiste', warehouse: 'Reno', status: 'Shipped' },\n { id: 'SO-10422', customer: \"Bon app'\", warehouse: 'Columbus', status: 'Processing' },\n { id: 'SO-10423', customer: 'Ernst Handel', warehouse: 'Savannah', status: 'On hold' },\n { id: 'SO-10424', customer: 'Folk och fä HB', warehouse: 'Reno', status: 'Delivered' },\n { id: 'SO-10425', customer: 'QUICK-Stop', warehouse: 'Columbus', status: 'Shipped' },\n { id: 'SO-10426', customer: 'Hanari Carnes', warehouse: 'Savannah', status: 'Processing' },\n];\n\nconst STATUSES = ['Processing', 'On hold', 'Shipped', 'Delivered'].map((value) => ({\n value,\n count: ORDERS.filter((order) => order.status === value).length,\n}));\n\n@Component({\n selector: 'app-table-filter',\n imports: [\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnActions,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n SlTableSetFilter,\n ],\n template: `\n <div slTable [columns]=\"4\">\n <div slTableContent aria-label=\"Open orders\">\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader>Order</th>\n <th slTableColumnHeader>Customer</th>\n <th slTableColumnHeader>Warehouse</th>\n <th slTableColumnHeader>\n Status\n <span slTableColumnActions>\n <span\n slTableSetFilter\n columnLabel=\"status\"\n [options]=\"statuses\"\n [(value)]=\"status\"\n ></span>\n </span>\n </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 text=\"nowrap\">{{ order.id }}</th>\n <td slTableCell>{{ order.customer }}</td>\n <td slTableCell>{{ order.warehouse }}</td>\n <td slTableCell>{{ order.status }}</td>\n </tr>\n }\n </tbody>\n </div>\n </div>\n `,\n})\nexport class TableFilter {\n readonly statuses = STATUSES;\n readonly status = signal<SetFilter | null>(null);\n readonly rows = computed(() => {\n const keep = createFilterPredicate(this.status());\n return ORDERS.filter((order) => keep(order.status));\n });\n}\n",
824
+ "verdict": "example"
825
+ },
826
+ {
827
+ "id": "filter-types",
828
+ "title": "Four columns, four kinds, one predicate",
829
+ "note": "Text, number, date and boolean, each with the operators its type has and each typed as itself — a slTableTextFilter value is a TextFilter model, and you never unwrap a union to read it. createRowPredicate joins the four, so the screen filters without a switch of its own.",
830
+ "language": "html",
831
+ "source": "<span slTableTextFilter columnLabel=\"client\" [(value)]=\"client\"></span>\n<span slTableNumberFilter columnLabel=\"amount\" [(value)]=\"total\"></span>\n<span slTableDateFilter columnLabel=\"due\" [(value)]=\"dueAt\"></span>\n<span slTableBooleanFilter columnLabel=\"overdue\" [(value)]=\"overdue\"></span>\n",
832
+ "verdict": "excerpt"
833
+ },
834
+ {
835
+ "id": "filter-conditions",
836
+ "title": "Two conditions, and the shapes an operator makes",
837
+ "note": "Between takes two operands and is empty takes none, so the panel grows a field or loses both — and says so, because a form that changes shape under a reader who cannot see it says nothing otherwise. The second condition appears once the first is complete, joined by And or Or; past two, a rule set is Filter Bar work.",
838
+ "language": "html",
839
+ "source": "<span slTableNumberFilter columnLabel=\"amount\" [(value)]=\"amount\"></span>\n<span slTableTextFilter columnLabel=\"client\" [conditions]=\"1\" [(value)]=\"client\"></span>\n",
840
+ "verdict": "excerpt"
841
+ },
842
+ {
843
+ "id": "filter-time",
844
+ "title": "A time column, and a window that crosses midnight",
845
+ "note": "slTableTimeFilter draws the time picker, and one time range picker for between, and holds ISO text at the column granularity — 22:00 at a minute, 22:00:00 at a second — which is the precision the engine compares at. A between whose start is later than its end is the overnight window, not an empty set: 22:00 to 02:00 keeps 23:30 and 01:15. The range picker marks that pair out of order until its wrap capability lands; the filter applies it as the window either way. Your shifts go in through presets.",
846
+ "language": "html",
847
+ "source": "<ng-template #shifts>\n <button slTimeRangePickerPreset [range]=\"morning\">Morning</button>\n</ng-template>\n<span\n slTableTimeFilter\n columnLabel=\"cut-off\"\n granularity=\"minute\"\n [presets]=\"shifts\"\n [(value)]=\"cutoff\"\n></span>\n",
848
+ "verdict": "excerpt"
849
+ },
850
+ {
851
+ "id": "filter-datetime",
852
+ "title": "A date-time column, at the precision you wrote",
853
+ "note": "slTableDateTimeFilter draws the date-time picker, and one date-time range picker for between, and holds 2026-09-14T09:00 as text. Compared at the operand own precision, so after 2026-09-14T09 starts at ten o clock and is 2026-09-14 matches the whole day. A condition with one half missing is inactive until both halves exist, and Apply reports nothing for it. Your windows go in through presets.",
854
+ "language": "html",
855
+ "source": "<ng-template #windows>\n <button slDateTimeRangePickerPreset [range]=\"earlyOctober\">Early October</button>\n</ng-template>\n<span\n slTableDateTimeFilter\n columnLabel=\"scheduled\"\n timeZone=\"Europe/Lisbon\"\n [presets]=\"windows\"\n [(value)]=\"scheduled\"\n></span>\n",
856
+ "verdict": "excerpt"
857
+ },
858
+ {
859
+ "id": "filter-range",
860
+ "title": "Between two dates, as one range picker",
861
+ "note": "The between of a date column is one date-range-picker rather than two pickers: it says the run length while it is drawn, takes the ends in either order and carries your presets as a template of slDateRangePickerPreset buttons. The descriptor is unchanged — between, an ISO day and another — so a saved view written with two pickers opens in the range picker.",
862
+ "language": "html",
863
+ "source": "<ng-template #presets>\n <button slDateRangePickerPreset [range]=\"september\">September</button>\n <button slDateRangePickerPreset [range]=\"quarter\">Q4</button>\n</ng-template>\n<span slTableDateFilter columnLabel=\"due\" [presets]=\"presets\" [(value)]=\"dueAt\"></span>\n",
864
+ "verdict": "excerpt"
865
+ },
866
+ {
867
+ "id": "filter-tags",
868
+ "title": "A set typed as chips",
869
+ "note": "operand of tags draws tags-input where the checkbox list stood, for a list too long to tick. With options, they are a native datalist of suggestions and a typed value outside them is refused; without options any value is admitted. The chips hold the same readonly string[] the list held, so the operator stays anyOf or noneOf and a saved view is read by either operand.",
870
+ "language": "html",
871
+ "source": "<span\n slTableSetFilter\n columnLabel=\"client\"\n operand=\"tags\"\n [options]=\"clients\"\n [(value)]=\"client\"\n></span>\n<span slTableSetFilter columnLabel=\"invoice\" operand=\"tags\" [(value)]=\"invoice\"></span>\n",
872
+ "verdict": "excerpt"
873
+ },
874
+ {
875
+ "id": "editing",
876
+ "title": "A plain control in a cell",
877
+ "note": "A cell whose child is a plain control gives up its inset: padding goes to zero and the control reads the cell padding and the row height through the control tokens, so the edited value stands where the read value stood and the row does not grow. The rule names the fourteen plain field families and nothing else. The control width is its own, as in a form.",
878
+ "language": "ts",
879
+ "source": "import { Component, signal } from '@angular/core';\nimport { SlNumberField, SlNumberFieldInput } from '@slotted/angular/number-field';\nimport { SlSelect, SlSelectItem, type SelectSelection } from '@slotted/angular/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 BINS = ['A-04', 'A-07', 'B-12', 'C-01'];\n\nconst STOCK = [\n { sku: 'PRD-0412', product: 'Chai', counted: 390, bin: 'A-04' },\n { sku: 'PRD-0413', product: 'Chang', counted: 170, bin: 'A-04' },\n { sku: 'PRD-0414', product: 'Aniseed Syrup', counted: 130, bin: 'B-12' },\n { sku: 'PRD-0415', product: \"Chef Anton's Cajun Seasoning\", counted: 53, bin: 'C-01' },\n];\n\ntype Line = (typeof STOCK)[number];\n\n@Component({\n selector: 'app-table-editing',\n imports: [\n SlNumberField,\n SlNumberFieldInput,\n SlSelect,\n SlSelectItem,\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n ],\n template: `\n <div slTable [columns]=\"4\">\n <div slTableContent aria-label=\"Stock take, Reno\">\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader>SKU</th>\n <th slTableColumnHeader>Product</th>\n <th slTableColumnHeader numeric>Counted</th>\n <th slTableColumnHeader>Bin</th>\n </tr>\n </thead>\n <tbody slTableBody>\n @for (line of lines(); track line.sku) {\n <tr slTableRow [value]=\"line.sku\">\n <th slTableRowHeader text=\"nowrap\">{{ line.sku }}</th>\n <td slTableCell>{{ line.product }}</td>\n <td slTableCell numeric>\n <div slNumberField size=\"sm\" stepper=\"none\" variant=\"plain\">\n <input\n slNumberFieldInput\n min=\"0\"\n [attr.aria-label]=\"'Counted for ' + line.sku\"\n [value]=\"line.counted\"\n (valueChange)=\"update(line.sku, { counted: $event.value ?? 0 })\"\n />\n </div>\n </td>\n <td slTableCell>\n <sl-select\n size=\"sm\"\n variant=\"plain\"\n [aria-label]=\"'Bin of ' + line.sku\"\n [value]=\"line.bin\"\n (valueChange)=\"setBin(line.sku, $event)\"\n >\n @for (bin of bins; track bin) {\n <sl-select-item [value]=\"bin\">{{ bin }}</sl-select-item>\n }\n </sl-select>\n </td>\n </tr>\n }\n </tbody>\n </div>\n </div>\n `,\n})\nexport class TableEditing {\n readonly bins = BINS;\n readonly lines = signal<readonly Line[]>(STOCK);\n\n setBin(sku: string, bin: SelectSelection): void {\n if (typeof bin === 'string') this.update(sku, { bin });\n }\n\n update(sku: string, change: Partial<Line>): void {\n this.lines.update((current) =>\n current.map((line) => (line.sku === sku ? { ...line, ...change } : line)),\n );\n }\n}\n",
880
+ "verdict": "example"
881
+ },
882
+ {
883
+ "id": "selection",
884
+ "title": "Choosing records, and what all means",
885
+ "note": "Hold Shift and press a second checkbox to take everything between. The header checkbox covers the rows in the DOM and says how many in its own name — a selection over a whole result set is a decision only your query can make.",
886
+ "language": "ts",
887
+ "source": "import { Component, computed, signal } from '@angular/core';\nimport {\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableFooter,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n SlTableSelect,\n SlTableSelectAll,\n} from '@slotted/angular/table';\nimport { SlText } from '@slotted/angular/typography';\n\nconst USD = new Intl.NumberFormat('en-US', { currency: 'USD', style: 'currency' });\n\nconst INVOICES = [\n { id: 'INV-2041', customer: 'Alfreds Futterkiste', status: 'Overdue', amount: 1240 },\n { id: 'INV-2042', customer: 'Great Lakes Food Market', status: 'Overdue', amount: 18402.75 },\n { id: 'INV-2043', customer: 'Hanari Carnes', status: 'Draft', amount: 86.4 },\n { id: 'INV-2044', customer: 'Island Trading', status: 'Sent', amount: 2310 },\n { id: 'INV-2045', customer: 'Lonesome Pine Restaurant', status: 'Sent', amount: 645.2 },\n];\n\n@Component({\n selector: 'app-table-selection',\n imports: [\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableFooter,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n SlTableSelect,\n SlTableSelectAll,\n SlText,\n ],\n template: `\n <div slTable [columns]=\"5\" selectionMode=\"multiple\" [(value)]=\"chosen\">\n <div slTableContent aria-label=\"Invoices to send reminders for\">\n <thead slTableHead>\n <tr slTableRow>\n <th slTableSelectAll></th>\n <th slTableColumnHeader>Invoice</th>\n <th slTableColumnHeader>Customer</th>\n <th slTableColumnHeader>Status</th>\n <th slTableColumnHeader numeric>Amount</th>\n </tr>\n </thead>\n <tbody slTableBody>\n @for (invoice of invoices; track invoice.id) {\n <tr slTableRow [value]=\"invoice.id\" [disabled]=\"invoice.status === 'Draft'\">\n <td slTableSelect></td>\n <th slTableRowHeader text=\"nowrap\">{{ invoice.id }}</th>\n <td slTableCell>{{ invoice.customer }}</td>\n <td slTableCell>{{ invoice.status }}</td>\n <td slTableCell numeric>{{ usd.format(invoice.amount) }}</td>\n </tr>\n }\n </tbody>\n </div>\n <div slTableFooter>\n <span slText size=\"sm\" tone=\"muted\"\n >{{ chosen().length }} selected · {{ usd.format(total()) }}</span\n >\n </div>\n </div>\n `,\n})\nexport class TableSelection {\n readonly invoices = INVOICES;\n readonly usd = USD;\n readonly chosen = signal<readonly string[]>(['INV-2041']);\n readonly total = computed(() =>\n INVOICES.filter((invoice) => this.chosen().includes(invoice.id)).reduce(\n (sum, invoice) => sum + invoice.amount,\n 0,\n ),\n );\n}\n",
888
+ "verdict": "example"
889
+ },
890
+ {
891
+ "id": "expansion",
892
+ "title": "A record with more to say",
893
+ "note": "The expander is the Disclosure pattern: a button carrying aria-expanded and naming the row it opens. Control flow in the template keeps a closed detail out of the DOM, which is the one asymmetry with React and belongs to the frameworks rather than the family.",
894
+ "language": "ts",
895
+ "source": "import { Component, signal } from '@angular/core';\nimport {\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableDetail,\n SlTableExpander,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n} from '@slotted/angular/table';\n\nconst USD = new Intl.NumberFormat('en-US', { currency: 'USD', style: 'currency' });\n\nconst RETURNS = [\n {\n id: 'RMA-0811',\n order: 'SO-10398',\n customer: 'Ernst Handel',\n refund: 214.5,\n detail:\n 'Two cases of Chang arrived crushed. Carrier claim filed with UPS on Sep 24; refund issued to the original card.',\n },\n {\n id: 'RMA-0812',\n order: 'SO-10402',\n customer: 'QUICK-Stop',\n refund: 58,\n detail:\n 'Wrong flavour shipped. Replacement sent from Columbus; the returned jar goes back to stock after inspection.',\n },\n {\n id: 'RMA-0813',\n order: 'SO-10407',\n customer: 'Hanari Carnes',\n refund: 1120,\n detail:\n 'Order cancelled after dispatch. Pallet returned to Savannah unopened; restocking fee waived by account manager.',\n },\n];\n\n@Component({\n selector: 'app-table-expansion',\n imports: [\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableDetail,\n SlTableExpander,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n ],\n template: `\n <div slTable [columns]=\"5\" [(expanded)]=\"expanded\">\n <div slTableContent aria-label=\"Returns\">\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader></th>\n <th slTableColumnHeader>Return</th>\n <th slTableColumnHeader>Order</th>\n <th slTableColumnHeader>Customer</th>\n <th slTableColumnHeader numeric>Refund</th>\n </tr>\n </thead>\n <tbody slTableBody>\n @for (item of returns; track item.id) {\n <tr slTableRow [value]=\"item.id\" #row=\"slTableRow\">\n <td slTableCell><button slTableExpander></button></td>\n <th slTableRowHeader text=\"nowrap\">{{ item.id }}</th>\n <td slTableCell>{{ item.order }}</td>\n <td slTableCell>{{ item.customer }}</td>\n <td slTableCell numeric>{{ usd.format(item.refund) }}</td>\n </tr>\n @if (row.expanded()) {\n <tr slTableDetail [value]=\"item.id\">\n {{\n item.detail\n }}\n </tr>\n }\n }\n </tbody>\n </div>\n </div>\n `,\n})\nexport class TableExpansion {\n readonly returns = RETURNS;\n readonly usd = USD;\n readonly expanded = signal<readonly string[]>(['RMA-0811']);\n}\n",
896
+ "verdict": "example"
897
+ },
898
+ {
899
+ "id": "sticky",
900
+ "title": "A header, a summary and a column that stay",
901
+ "note": "stickyHeader holds the head against the top of the scroller and stickyFooter holds the summary against the bottom of it, so the total is on screen at the first row and the last. stickyTo says which box that is: this table own scroller, or whatever scrolls outside it. A pinned column darkens its edge exactly while something is hidden under it, and all of it mirrors in a right-to-left document.",
902
+ "language": "ts",
903
+ "source": "import { Component } from '@angular/core';\nimport {\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n SlTableSummary,\n} from '@slotted/angular/table';\n\nconst USD = new Intl.NumberFormat('en-US', { currency: 'USD', style: 'currency' });\n\nconst CUSTOMERS = [\n 'Alfreds Futterkiste',\n \"Bon app'\",\n 'Ernst Handel',\n 'Folk och fä HB',\n 'Hanari Carnes',\n 'Island Trading',\n 'QUICK-Stop',\n 'Wartian Herkku',\n];\nconst WAREHOUSES = ['Reno', 'Columbus', 'Savannah'];\n\nconst ORDERS = Array.from({ length: 30 }, (_, index) => ({\n id: `SO-${10400 + index}`,\n customer: CUSTOMERS[index % CUSTOMERS.length],\n warehouse: WAREHOUSES[index % WAREHOUSES.length],\n total: 180 + ((index * 397) % 2400),\n}));\n\n@Component({\n selector: 'app-table-sticky',\n imports: [\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n SlTableSummary,\n ],\n template: `\n <div slTable [columns]=\"4\" stickyFooter stickyHeader>\n <div slTableContent aria-label=\"September orders\" style=\"max-block-size: 20rem\">\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader>Order</th>\n <th slTableColumnHeader>Customer</th>\n <th slTableColumnHeader>Warehouse</th>\n <th slTableColumnHeader numeric>Total</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 text=\"nowrap\">{{ order.id }}</th>\n <td slTableCell>{{ order.customer }}</td>\n <td slTableCell>{{ order.warehouse }}</td>\n <td slTableCell numeric>{{ usd.format(order.total) }}</td>\n </tr>\n }\n </tbody>\n <tfoot slTableSummary>\n <tr slTableRow>\n <td slTableCell [attr.colspan]=\"3\">{{ orders.length }} orders</td>\n <td slTableCell numeric>{{ usd.format(total) }}</td>\n </tr>\n </tfoot>\n </div>\n </div>\n `,\n})\nexport class TableSticky {\n readonly orders = ORDERS;\n readonly total = ORDERS.reduce((sum, order) => sum + order.total, 0);\n readonly usd = USD;\n}\n",
904
+ "verdict": "example"
905
+ },
906
+ {
907
+ "id": "scroll",
908
+ "title": "Wider than the space it has",
909
+ "note": "The scroller takes a tab stop, a role and a name only while it overflows, so a table that fits costs a keyboard reader nothing. Tab to it and the arrow keys, Page keys, Home and End all scroll it.",
910
+ "language": "ts",
911
+ "source": "import { Component } from '@angular/core';\nimport {\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n} from '@slotted/angular/table';\n\nconst USD = new Intl.NumberFormat('en-US', { currency: 'USD', style: 'currency' });\n\nconst SHIPMENTS = [\n {\n id: 'SH-3301',\n order: 'SO-10421',\n customer: 'Alfreds Futterkiste',\n origin: 'Reno, NV',\n destination: 'Berlin, DE',\n carrier: 'UPS Worldwide',\n shipped: 'Sep 28, 2026',\n cost: 412.8,\n },\n {\n id: 'SH-3302',\n order: 'SO-10422',\n customer: \"Bon app'\",\n origin: 'Columbus, OH',\n destination: 'Marseille, FR',\n carrier: 'FedEx International',\n shipped: 'Sep 29, 2026',\n cost: 288.15,\n },\n {\n id: 'SH-3303',\n order: 'SO-10423',\n customer: 'Ernst Handel',\n origin: 'Savannah, GA',\n destination: 'Graz, AT',\n carrier: 'DHL Express',\n shipped: 'Sep 29, 2026',\n cost: 506.4,\n },\n {\n id: 'SH-3304',\n order: 'SO-10425',\n customer: 'QUICK-Stop',\n origin: 'Columbus, OH',\n destination: 'Cunewalde, DE',\n carrier: 'UPS Worldwide',\n shipped: 'Sep 30, 2026',\n cost: 347.9,\n },\n];\n\n@Component({\n selector: 'app-table-scroll',\n imports: [\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n ],\n template: `\n <div slTable [columns]=\"8\">\n <div slTableContent aria-label=\"International shipments\">\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader sticky=\"start\" text=\"nowrap\">Shipment</th>\n <th slTableColumnHeader text=\"nowrap\">Order</th>\n <th slTableColumnHeader text=\"nowrap\">Customer</th>\n <th slTableColumnHeader text=\"nowrap\">Origin</th>\n <th slTableColumnHeader text=\"nowrap\">Destination</th>\n <th slTableColumnHeader text=\"nowrap\">Carrier</th>\n <th slTableColumnHeader text=\"nowrap\">Shipped</th>\n <th slTableColumnHeader numeric text=\"nowrap\">Cost</th>\n </tr>\n </thead>\n <tbody slTableBody>\n @for (shipment of shipments; track shipment.id) {\n <tr slTableRow [value]=\"shipment.id\">\n <th slTableRowHeader sticky=\"start\" text=\"nowrap\">{{ shipment.id }}</th>\n <td slTableCell text=\"nowrap\">{{ shipment.order }}</td>\n <td slTableCell text=\"nowrap\">{{ shipment.customer }}</td>\n <td slTableCell text=\"nowrap\">{{ shipment.origin }}</td>\n <td slTableCell text=\"nowrap\">{{ shipment.destination }}</td>\n <td slTableCell text=\"nowrap\">{{ shipment.carrier }}</td>\n <td slTableCell text=\"nowrap\">{{ shipment.shipped }}</td>\n <td slTableCell numeric>{{ usd.format(shipment.cost) }}</td>\n </tr>\n }\n </tbody>\n </div>\n </div>\n `,\n})\nexport class TableScroll {\n readonly shipments = SHIPMENTS;\n readonly usd = USD;\n}\n",
912
+ "verdict": "example"
913
+ },
914
+ {
915
+ "id": "alignment",
916
+ "title": "Where a value stands, and how its digits line up",
917
+ "note": "Alignment is logical, so a column aligned to the end is on the right in English and on the left in Arabic. Numeric is a separate fact: it sets tabular figures, and aligns to the end unless you say otherwise.",
918
+ "language": "ts",
919
+ "source": "import { Component } from '@angular/core';\nimport {\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n} from '@slotted/angular/table';\n\nconst USD = new Intl.NumberFormat('en-US', { currency: 'USD', style: 'currency' });\n\nconst INVOICES = [\n { id: 'INV-2041', customer: 'Alfreds Futterkiste', region: 'EU', due: 'Oct 4', amount: 1240 },\n {\n id: 'INV-2042',\n customer: 'Great Lakes Food Market',\n region: 'NA',\n due: 'Oct 9',\n amount: 18402.75,\n },\n { id: 'INV-2043', customer: 'Hanari Carnes', region: 'SA', due: 'Oct 12', amount: 86.4 },\n];\n\n@Component({\n selector: 'app-table-alignment',\n imports: [\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n ],\n template: `\n <div slTable [columns]=\"4\">\n <div slTableContent aria-label=\"Invoices due\">\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader>Customer</th>\n <th slTableColumnHeader align=\"center\">Region</th>\n <th slTableColumnHeader align=\"end\">Due</th>\n <th slTableColumnHeader numeric>Amount</th>\n </tr>\n </thead>\n <tbody slTableBody>\n @for (invoice of invoices; track invoice.id) {\n <tr slTableRow [value]=\"invoice.id\">\n <th slTableRowHeader>{{ invoice.customer }}</th>\n <td slTableCell align=\"center\">{{ invoice.region }}</td>\n <td slTableCell align=\"end\">{{ invoice.due }}</td>\n <td slTableCell numeric>{{ usd.format(invoice.amount) }}</td>\n </tr>\n }\n </tbody>\n </div>\n </div>\n `,\n})\nexport class TableAlignment {\n readonly invoices = INVOICES;\n readonly usd = USD;\n}\n",
920
+ "verdict": "example"
921
+ },
922
+ {
923
+ "id": "text",
924
+ "title": "A value longer than its column",
925
+ "note": "Wrap breaks an unbroken token — a hash, a URL, an identifier — rather than letting it set the column width. Truncate keeps one line with the whole value still in the DOM. Nowrap never breaks. None of the three removes anything.",
926
+ "language": "ts",
927
+ "source": "import { Component } from '@angular/core';\nimport {\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n} from '@slotted/angular/table';\n\nconst NOTES = [\n {\n id: 'SO-10421',\n note: 'Leave at the loading dock behind the warehouse; the front office closes at noon on Fridays.',\n tracking: '1Z999AA10123456784',\n },\n {\n id: 'SO-10422',\n note: 'Customer asked for the invoice to be emailed to accounts payable rather than printed.',\n tracking: '1Z999AA10123456785',\n },\n];\n\n@Component({\n selector: 'app-table-text',\n imports: [\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n ],\n template: `\n <div slTable [columns]=\"3\" layout=\"fixed\">\n <div slTableContent aria-label=\"Delivery notes\">\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader>Order</th>\n <th slTableColumnHeader>Note</th>\n <th slTableColumnHeader>Tracking</th>\n </tr>\n </thead>\n <tbody slTableBody>\n @for (row of notes; track row.id) {\n <tr slTableRow [value]=\"row.id\">\n <th slTableRowHeader text=\"nowrap\">{{ row.id }}</th>\n <td slTableCell text=\"truncate\">{{ row.note }}</td>\n <td slTableCell text=\"wrap\">{{ row.tracking }}</td>\n </tr>\n }\n </tbody>\n </div>\n </div>\n `,\n})\nexport class TableText {\n readonly notes = NOTES;\n}\n",
928
+ "verdict": "example"
929
+ },
930
+ {
931
+ "id": "footer",
932
+ "title": "The totals, and the page",
933
+ "note": "Two different feet. The summary is a tfoot inside the table, where a total belongs beside the column it totals. The footer is a bar outside it and inside the frame, which is where the paging control goes and where it does not scroll sideways.",
934
+ "language": "html",
935
+ "source": "<div slTable>\n <div slTableContent [totalRowCount]=\"128\">\n <tfoot slTableSummary>\n <tr slTableRow>\n <td slTableCell numeric>11,061.25</td>\n </tr>\n </tfoot>\n </div>\n <div slTableFooter>\n <span>3 of 128 invoices</span>\n <nav slPagination [count]=\"128\" [pageSize]=\"3\"></nav>\n </div>\n</div>\n",
936
+ "verdict": "excerpt"
937
+ },
938
+ {
939
+ "id": "empty-and-loading",
940
+ "title": "Nothing yet, nothing at all, and something arriving",
941
+ "note": "A first load draws skeleton rows, so the shape is visible before the content. A refresh over rows already read writes aria-busy and dims them without moving anything — a reader looking at row forty stays there.",
942
+ "language": "html",
943
+ "source": "@if (loading() && rows().length === 0) {\n <tbody slTableLoader [skeletonRows]=\"5\"></tbody>\n} @else if (rows().length === 0) {\n <tbody slTableBody>\n <tr slTableRow>\n <td slTableEmpty>\n <section slResultState status=\"no-results\"></section>\n </td>\n </tr>\n </tbody>\n} @else {\n <tbody slTableBody></tbody>\n}\n",
944
+ "verdict": "excerpt"
945
+ },
946
+ {
947
+ "id": "density",
948
+ "title": "The same table, three sizes",
949
+ "note": "The row reads the control height, the cell reads the control inset and the type reads the control step, so one theme decision retunes the rows, the buttons and the fields together. Density changes the size and never the meaning.",
950
+ "language": "html",
951
+ "source": "<div data-slotted-density=\"dense\">\n <div slTable></div>\n</div>\n",
952
+ "verdict": "excerpt"
953
+ },
954
+ {
955
+ "id": "content",
956
+ "title": "Content the table did not choose",
957
+ "note": "A forty-character identifier, a translated header twice as long as its English, a cell holding a tag and a link. The table is a grid of your own content, so the parts hold whatever a record needs rather than a string.",
958
+ "language": "ts",
959
+ "source": "import { Component } from '@angular/core';\nimport { SlAvatar } from '@slotted/angular/avatar';\nimport { SlInline } from '@slotted/angular/inline';\nimport { SlLink } from '@slotted/angular/link';\nimport { SlStatusIndicator } from '@slotted/angular/status-indicator';\nimport {\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n} from '@slotted/angular/table';\n\nconst USD = new Intl.NumberFormat('en-US', { currency: 'USD', style: 'currency' });\n\nconst ACCOUNTS = [\n {\n id: 'ALFKI',\n name: 'Alfreds Futterkiste',\n manager: 'Nancy Davolio',\n sync: 'success',\n syncLabel: 'In sync',\n balance: 1240,\n },\n {\n id: 'ERNSH',\n name: 'Ernst Handel',\n manager: 'Andrew Fuller',\n sync: 'warning',\n syncLabel: 'Delayed',\n balance: 3410.25,\n },\n {\n id: 'QUICK',\n name: 'QUICK-Stop',\n manager: 'Janet Leverling',\n sync: 'danger',\n syncLabel: 'Failed',\n balance: 2088.9,\n },\n] as const;\n\n@Component({\n selector: 'app-table-content',\n imports: [\n SlAvatar,\n SlInline,\n SlLink,\n SlStatusIndicator,\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n ],\n template: `\n <div slTable [columns]=\"4\">\n <div slTableContent aria-label=\"Key accounts\">\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader>Account</th>\n <th slTableColumnHeader>Account manager</th>\n <th slTableColumnHeader>ERP sync</th>\n <th slTableColumnHeader numeric>Balance</th>\n </tr>\n </thead>\n <tbody slTableBody>\n @for (account of accounts; track account.id) {\n <tr slTableRow [value]=\"account.id\">\n <th slTableRowHeader text=\"nowrap\">\n <a slLink [href]=\"'#' + account.id\">{{ account.name }}</a>\n </th>\n <td slTableCell text=\"nowrap\">\n <div slInline align=\"center\" [gap]=\"2\">\n <span slAvatar size=\"sm\" [name]=\"account.manager\"></span>\n {{ account.manager }}\n </div>\n </td>\n <td slTableCell text=\"nowrap\">\n <span slStatusIndicator [status]=\"account.sync\">{{ account.syncLabel }}</span>\n </td>\n <td slTableCell numeric>{{ usd.format(account.balance) }}</td>\n </tr>\n }\n </tbody>\n </div>\n </div>\n `,\n})\nexport class TableContentExample {\n readonly accounts = ACCOUNTS;\n readonly usd = USD;\n}\n",
960
+ "verdict": "example"
961
+ },
962
+ {
963
+ "id": "listing",
964
+ "title": "The screen this is reached for",
965
+ "note": "Sorting, selection with a bulk action, a filter in a header, an identifier pinned at the start and actions pinned at the end, a paging control in the footer. Every piece beside the table is another family, composed rather than built in.",
966
+ "language": "html",
967
+ "source": "<div\n slTable\n variant=\"framed\"\n stickyHeader\n selectionMode=\"multiple\"\n [columns]=\"5\"\n [(value)]=\"chosen\"\n [(sort)]=\"sort\"\n>\n <div slTableContent [totalRowCount]=\"128\"></div>\n <div slTableFooter>\n <nav slPagination [count]=\"128\"></nav>\n </div>\n</div>\n",
968
+ "verdict": "excerpt"
969
+ },
970
+ {
971
+ "id": "composition",
972
+ "title": "Setting the table once, and reaching past it",
973
+ "note": "provideTableDefaults sets the frame and the layout for everything under that injector, provideSlotted the language, and a table that states an axis itself still wins. Every part is a directive on your own element, so nothing is wrapped that you did not write.",
974
+ "language": "ts",
975
+ "source": "bootstrapApplication(App, {\n providers: [\n provideTableDefaults({\n variant: 'framed',\n stickyHeader: true,\n }),\n ],\n});\n",
976
+ "verdict": "excerpt"
977
+ },
978
+ {
979
+ "id": "keyboard",
980
+ "title": "Every control is its own tab stop",
981
+ "note": "A table is not a composite widget, so the table binds no key: Tab reaches the scroller, then each sort button, checkbox and expander in DOM order. Shift with Space on a checkbox takes the range, which is the one gesture the family adds.",
982
+ "language": "html",
983
+ "source": "<!-- Enter and Space activate the buttons the table renders. -->\n<!-- Shift + Space on a row checkbox selects from the anchor. -->\n<!-- The scroller answers the arrow, Page, Home and End keys. -->\n",
984
+ "verdict": "excerpt"
985
+ },
986
+ {
987
+ "id": "accessibility",
988
+ "title": "What a reader hears",
989
+ "note": "The caption names the table, scope ties every value to its column and its record, aria-sort says the order and the announcer says it changed. A paged table states aria-rowcount so row three of twenty is row three of four hundred.",
990
+ "language": "html",
991
+ "source": "<div slTableContent [totalRowCount]=\"412\">\n <tbody slTableBody>\n <tr slTableRow value=\"INV-1042\" [rowIndex]=\"41\">\n <th slTableRowHeader>INV-1042</th>\n </tr>\n </tbody>\n</div>\n",
992
+ "verdict": "excerpt"
993
+ },
994
+ {
995
+ "id": "basic",
996
+ "title": "basic.ts",
997
+ "note": null,
998
+ "language": "ts",
999
+ "source": "import { Component } from '@angular/core';\nimport {\n SlTable,\n SlTableBody,\n SlTableCaption,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n} from '@slotted/angular/table';\nimport { SlTag, SlTagBody } from '@slotted/angular/tag';\n\nconst USD = new Intl.NumberFormat('en-US', { currency: 'USD', style: 'currency' });\n\nconst TONE = {\n Delivered: 'success',\n 'On hold': 'warning',\n Processing: 'accent',\n Shipped: 'secondary',\n} as const;\n\nconst ORDERS = [\n {\n id: 'SO-10421',\n customer: 'Alfreds Futterkiste',\n warehouse: 'Reno',\n status: 'Shipped',\n total: 1240,\n },\n {\n id: 'SO-10422',\n customer: \"Bon app'\",\n warehouse: 'Columbus',\n status: 'Processing',\n total: 860.5,\n },\n {\n id: 'SO-10423',\n customer: 'Ernst Handel',\n warehouse: 'Savannah',\n status: 'On hold',\n total: 3410.25,\n },\n {\n id: 'SO-10424',\n customer: 'Folk och fä HB',\n warehouse: 'Reno',\n status: 'Delivered',\n total: 512,\n },\n {\n id: 'SO-10425',\n customer: 'QUICK-Stop',\n warehouse: 'Columbus',\n status: 'Shipped',\n total: 2088.9,\n },\n] as const;\n\n@Component({\n selector: 'app-table-basic',\n imports: [\n SlTable,\n SlTableBody,\n SlTableCaption,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n SlTag,\n SlTagBody,\n ],\n template: `\n <div slTable [columns]=\"5\">\n <div slTableContent>\n <caption slTableCaption>\n Orders placed today\n </caption>\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader>Order</th>\n <th slTableColumnHeader>Customer</th>\n <th slTableColumnHeader>Warehouse</th>\n <th slTableColumnHeader>Status</th>\n <th slTableColumnHeader numeric>Total</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 text=\"nowrap\">{{ order.id }}</th>\n <td slTableCell>{{ order.customer }}</td>\n <td slTableCell>{{ order.warehouse }}</td>\n <td slTableCell>\n <span slTag [tone]=\"tone[order.status]\"\n ><span slTagBody>{{ order.status }}</span></span\n >\n </td>\n <td slTableCell numeric>{{ usd.format(order.total) }}</td>\n </tr>\n }\n </tbody>\n </div>\n </div>\n `,\n})\nexport class TableBasic {\n readonly orders = ORDERS;\n readonly tone = TONE;\n readonly usd = USD;\n}\n",
1000
+ "verdict": "example"
1001
+ },
1002
+ {
1003
+ "id": "empty",
1004
+ "title": "empty.ts",
1005
+ "note": null,
1006
+ "language": "ts",
1007
+ "source": "import { Component } from '@angular/core';\nimport {\n SlResultState,\n SlResultStateContent,\n SlResultStateDescription,\n SlResultStateTitle,\n} from '@slotted/angular/result-state';\nimport {\n SlTable,\n SlTableBody,\n SlTableColumnHeader,\n SlTableContent,\n SlTableEmpty,\n SlTableHead,\n SlTableRow,\n} from '@slotted/angular/table';\n\n@Component({\n selector: 'app-table-empty',\n imports: [\n SlResultState,\n SlResultStateContent,\n SlResultStateDescription,\n SlResultStateTitle,\n SlTable,\n SlTableBody,\n SlTableColumnHeader,\n SlTableContent,\n SlTableEmpty,\n SlTableHead,\n SlTableRow,\n ],\n template: `\n <div slTable [columns]=\"4\">\n <div slTableContent aria-label=\"Returns this week\">\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader>Return</th>\n <th slTableColumnHeader>Order</th>\n <th slTableColumnHeader>Customer</th>\n <th slTableColumnHeader numeric>Refund</th>\n </tr>\n </thead>\n <tbody slTableBody>\n <tr slTableRow>\n <td slTableEmpty>\n <section slResultState status=\"empty\">\n <div slResultStateContent>\n <h3 slResultStateTitle>No returns this week</h3>\n <p slResultStateDescription>\n Returns appear here as soon as a customer opens one from their order page.\n </p>\n </div>\n </section>\n </td>\n </tr>\n </tbody>\n </div>\n </div>\n `,\n})\nexport class TableEmptyExample {}\n",
1008
+ "verdict": "example"
1009
+ },
1010
+ {
1011
+ "id": "loading",
1012
+ "title": "loading.ts",
1013
+ "note": null,
1014
+ "language": "ts",
1015
+ "source": "import { Component } from '@angular/core';\nimport {\n SlTable,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableLoader,\n SlTableRow,\n} from '@slotted/angular/table';\n\n@Component({\n selector: 'app-table-loading',\n imports: [SlTable, SlTableColumnHeader, SlTableContent, SlTableHead, SlTableLoader, SlTableRow],\n template: `\n <div slTable [columns]=\"4\">\n <div slTableContent aria-label=\"Purchase orders\">\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader>Purchase order</th>\n <th slTableColumnHeader>Supplier</th>\n <th slTableColumnHeader>Expected</th>\n <th slTableColumnHeader numeric>Value</th>\n </tr>\n </thead>\n <tbody slTableLoader [skeletonRows]=\"4\"></tbody>\n </div>\n </div>\n `,\n})\nexport class TableLoading {}\n",
1016
+ "verdict": "example"
1017
+ },
1018
+ {
1019
+ "id": "orders-list",
1020
+ "title": "orders-list.ts",
1021
+ "note": null,
1022
+ "language": "ts",
1023
+ "source": "import { Component, computed, signal } from '@angular/core';\nimport { createFilterPredicate, type SetFilter } from '@slotted/core/filter';\nimport { SlButton } from '@slotted/angular/button';\nimport { SlInline } from '@slotted/angular/inline';\nimport {\n SlPagination,\n SlPaginationItems,\n SlPaginationNext,\n SlPaginationPrevious,\n} from '@slotted/angular/pagination';\nimport {\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnActions,\n SlTableColumnHeader,\n SlTableContent,\n SlTableFooter,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n SlTableSelect,\n SlTableSelectAll,\n SlTableSetFilter,\n SlTableSort,\n type TableSortDescriptor,\n} from '@slotted/angular/table';\nimport { SlText } from '@slotted/angular/typography';\n\nconst USD = new Intl.NumberFormat('en-US', { currency: 'USD', style: 'currency' });\n\nconst CUSTOMERS = [\n 'Alfreds Futterkiste',\n \"Bon app'\",\n 'Ernst Handel',\n 'Folk och fä HB',\n 'Hanari Carnes',\n 'Island Trading',\n 'QUICK-Stop',\n];\nconst STATUS_CYCLE = ['Processing', 'Shipped', 'On hold', 'Delivered', 'Processing'];\n\nconst ORDERS = Array.from({ length: 20 }, (_, index) => ({\n id: `SO-${10421 + index}`,\n customer: CUSTOMERS[index % CUSTOMERS.length],\n status: STATUS_CYCLE[index % STATUS_CYCLE.length],\n total: 140 + ((index * 733) % 4100),\n}));\n\ntype Order = (typeof ORDERS)[number];\n\nconst STATUSES = ['Processing', 'On hold', 'Shipped', 'Delivered'].map((value) => ({\n value,\n count: ORDERS.filter((order) => order.status === value).length,\n}));\n\nconst PAGE_SIZE = 6;\n\nfunction sortOrders(rows: readonly Order[], sort: TableSortDescriptor | null): readonly Order[] {\n if (sort === null) return rows;\n const key = sort.column as keyof Order;\n const sign = sort.direction === 'ascending' ? 1 : -1;\n return [...rows].sort((a, b) =>\n typeof a[key] === 'number'\n ? ((a[key] as number) - (b[key] as number)) * sign\n : String(a[key]).localeCompare(String(b[key])) * sign,\n );\n}\n\n@Component({\n selector: 'app-table-orders-list',\n imports: [\n SlButton,\n SlInline,\n SlPagination,\n SlPaginationItems,\n SlPaginationNext,\n SlPaginationPrevious,\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnActions,\n SlTableColumnHeader,\n SlTableContent,\n SlTableFooter,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n SlTableSelect,\n SlTableSelectAll,\n SlTableSetFilter,\n SlTableSort,\n SlText,\n ],\n template: `\n <div slTable [columns]=\"5\" selectionMode=\"multiple\" [(sort)]=\"sort\" [(value)]=\"chosen\">\n <div slTableContent aria-label=\"Orders\" [totalRowCount]=\"matching().length\">\n <thead slTableHead>\n <tr slTableRow>\n <th slTableSelectAll></th>\n <th slTableColumnHeader column=\"id\"><button slTableSort>Order</button></th>\n <th slTableColumnHeader column=\"customer\"><button slTableSort>Customer</button></th>\n <th slTableColumnHeader>\n Status\n <span slTableColumnActions>\n <span\n slTableSetFilter\n columnLabel=\"status\"\n [options]=\"statuses\"\n [value]=\"status()\"\n (valueChange)=\"filter($event)\"\n ></span>\n </span>\n </th>\n <th slTableColumnHeader column=\"total\" numeric><button slTableSort>Total</button></th>\n </tr>\n </thead>\n <tbody slTableBody>\n @for (order of rows(); track order.id; let index = $index) {\n <tr slTableRow [value]=\"order.id\" [rowIndex]=\"first() + index + 1\">\n <td slTableSelect></td>\n <th slTableRowHeader text=\"nowrap\">{{ order.id }}</th>\n <td slTableCell>{{ order.customer }}</td>\n <td slTableCell>{{ order.status }}</td>\n <td slTableCell numeric>{{ usd.format(order.total) }}</td>\n </tr>\n }\n </tbody>\n </div>\n <div slTableFooter>\n <div slInline align=\"center\" [gap]=\"3\">\n <span slText size=\"sm\" tone=\"muted\">{{ chosen().length }} selected</span>\n <button\n slButton\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n [disabled]=\"chosen().length === 0\"\n >\n Print packing slips\n </button>\n </div>\n <nav\n slPagination\n [count]=\"matching().length\"\n [page]=\"page()\"\n [pageSize]=\"pageSize\"\n (pageChange)=\"page.set($event.value)\"\n >\n <button slPaginationPrevious type=\"button\"></button>\n <sl-pagination-items></sl-pagination-items>\n <button slPaginationNext type=\"button\"></button>\n </nav>\n </div>\n </div>\n `,\n})\nexport class TableOrdersList {\n readonly statuses = STATUSES;\n readonly pageSize = PAGE_SIZE;\n readonly usd = USD;\n readonly sort = signal<TableSortDescriptor | null>({ column: 'id', direction: 'descending' });\n readonly status = signal<SetFilter | null>(null);\n readonly chosen = signal<readonly string[]>([]);\n readonly page = signal(1);\n\n readonly matching = computed(() => {\n const keep = createFilterPredicate(this.status());\n return sortOrders(\n ORDERS.filter((order) => keep(order.status)),\n this.sort(),\n );\n });\n readonly first = computed(() => (this.page() - 1) * PAGE_SIZE);\n readonly rows = computed(() => this.matching().slice(this.first(), this.first() + PAGE_SIZE));\n\n filter(next: SetFilter | null): void {\n this.status.set(next);\n this.page.set(1);\n }\n}\n",
1024
+ "verdict": "example"
1025
+ },
1026
+ {
1027
+ "id": "pagination",
1028
+ "title": "pagination.ts",
1029
+ "note": null,
1030
+ "language": "ts",
1031
+ "source": "import { Component, computed, signal } from '@angular/core';\nimport {\n SlPagination,\n SlPaginationItems,\n SlPaginationNext,\n SlPaginationPrevious,\n} from '@slotted/angular/pagination';\nimport {\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableFooter,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n} from '@slotted/angular/table';\nimport { SlText } from '@slotted/angular/typography';\n\nconst USD = new Intl.NumberFormat('en-US', { currency: 'USD', style: 'currency' });\n\nconst CUSTOMERS = [\n 'Alfreds Futterkiste',\n \"Bon app'\",\n 'Ernst Handel',\n 'Folk och fä HB',\n 'Hanari Carnes',\n 'Island Trading',\n 'QUICK-Stop',\n];\n\nconst INVOICES = Array.from({ length: 23 }, (_, index) => ({\n id: `INV-${2041 + index}`,\n customer: CUSTOMERS[index % CUSTOMERS.length],\n amount: 120 + ((index * 613) % 3900),\n}));\n\nconst PAGE_SIZE = 5;\n\n@Component({\n selector: 'app-table-pagination',\n imports: [\n SlPagination,\n SlPaginationItems,\n SlPaginationNext,\n SlPaginationPrevious,\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableFooter,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n SlText,\n ],\n template: `\n <div slTable [columns]=\"3\">\n <div slTableContent aria-label=\"Invoices\" [totalRowCount]=\"invoices.length\">\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader>Invoice</th>\n <th slTableColumnHeader>Customer</th>\n <th slTableColumnHeader numeric>Amount</th>\n </tr>\n </thead>\n <tbody slTableBody>\n @for (invoice of rows(); track invoice.id; let index = $index) {\n <tr slTableRow [value]=\"invoice.id\" [rowIndex]=\"first() + index + 1\">\n <th slTableRowHeader text=\"nowrap\">{{ invoice.id }}</th>\n <td slTableCell>{{ invoice.customer }}</td>\n <td slTableCell numeric>{{ usd.format(invoice.amount) }}</td>\n </tr>\n }\n </tbody>\n </div>\n <div slTableFooter>\n <span slText size=\"sm\" tone=\"muted\"\n >{{ first() + 1 }}–{{ first() + rows().length }} of {{ invoices.length }}</span\n >\n <nav\n slPagination\n [count]=\"invoices.length\"\n [page]=\"page()\"\n [pageSize]=\"pageSize\"\n (pageChange)=\"page.set($event.value)\"\n >\n <button slPaginationPrevious type=\"button\"></button>\n <sl-pagination-items></sl-pagination-items>\n <button slPaginationNext type=\"button\"></button>\n </nav>\n </div>\n </div>\n `,\n})\nexport class TablePagination {\n readonly invoices = INVOICES;\n readonly pageSize = PAGE_SIZE;\n readonly usd = USD;\n readonly page = signal(1);\n readonly first = computed(() => (this.page() - 1) * PAGE_SIZE);\n readonly rows = computed(() => INVOICES.slice(this.first(), this.first() + PAGE_SIZE));\n}\n",
1032
+ "verdict": "example"
1033
+ },
1034
+ {
1035
+ "id": "refreshing",
1036
+ "title": "refreshing.ts",
1037
+ "note": null,
1038
+ "language": "ts",
1039
+ "source": "import { Component, DestroyRef, inject, signal } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\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';\n\nconst USD = new Intl.NumberFormat('en-US', { currency: 'USD', style: 'currency' });\n\nconst PURCHASE_ORDERS = [\n { id: 'PO-7710', supplier: 'Exotic Liquids', expected: 'Oct 3', value: 4120 },\n { id: 'PO-7711', supplier: 'Tokyo Traders', expected: 'Oct 6', value: 2875.5 },\n { id: 'PO-7712', supplier: 'Pavlova, Ltd.', expected: 'Oct 8', value: 9310 },\n];\n\n@Component({\n selector: 'app-table-refreshing',\n imports: [\n SlButton,\n SlStack,\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n ],\n template: `\n <div slStack align=\"start\" [gap]=\"3\">\n <button\n slButton\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n [loading]=\"loading()\"\n (click)=\"refresh()\"\n >\n Refresh\n </button>\n <div slTable [columns]=\"4\" [loading]=\"loading()\">\n <div slTableContent aria-label=\"Purchase orders\">\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader>Purchase order</th>\n <th slTableColumnHeader>Supplier</th>\n <th slTableColumnHeader>Expected</th>\n <th slTableColumnHeader numeric>Value</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 text=\"nowrap\">{{ order.id }}</th>\n <td slTableCell>{{ order.supplier }}</td>\n <td slTableCell>{{ order.expected }}</td>\n <td slTableCell numeric>{{ usd.format(order.value) }}</td>\n </tr>\n }\n </tbody>\n </div>\n </div>\n </div>\n `,\n})\nexport class TableRefreshing {\n readonly orders = PURCHASE_ORDERS;\n readonly usd = USD;\n readonly loading = signal(false);\n private timer: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n inject(DestroyRef).onDestroy(() => clearTimeout(this.timer));\n }\n\n refresh(): void {\n this.loading.set(true);\n clearTimeout(this.timer);\n this.timer = setTimeout(() => this.loading.set(false), 1500);\n }\n}\n",
1040
+ "verdict": "example"
1041
+ },
1042
+ {
1043
+ "id": "single-selection",
1044
+ "title": "single-selection.ts",
1045
+ "note": null,
1046
+ "language": "ts",
1047
+ "source": "import { Component, signal } from '@angular/core';\nimport {\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n SlTableSelect,\n} from '@slotted/angular/table';\n\nconst RATES = [\n { id: 'ups-ground', carrier: 'UPS Ground', days: '3–5 days', price: '$18.40' },\n { id: 'fedex-2day', carrier: 'FedEx 2Day', days: '2 days', price: '$31.15' },\n { id: 'usps-priority', carrier: 'USPS Priority', days: '1–3 days', price: '$24.90' },\n];\n\n@Component({\n selector: 'app-table-single-selection',\n imports: [\n SlTable,\n SlTableBody,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n SlTableSelect,\n ],\n template: `\n <div slTable [columns]=\"4\" selectionMode=\"single\" [(value)]=\"rate\">\n <div slTableContent aria-label=\"Shipping rates for SO-10423\">\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader></th>\n <th slTableColumnHeader>Carrier</th>\n <th slTableColumnHeader>Transit</th>\n <th slTableColumnHeader numeric>Price</th>\n </tr>\n </thead>\n <tbody slTableBody>\n @for (option of rates; track option.id) {\n <tr slTableRow [value]=\"option.id\">\n <td slTableSelect></td>\n <th slTableRowHeader>{{ option.carrier }}</th>\n <td slTableCell>{{ option.days }}</td>\n <td slTableCell numeric>{{ option.price }}</td>\n </tr>\n }\n </tbody>\n </div>\n </div>\n `,\n})\nexport class TableSingleSelection {\n readonly rates = RATES;\n readonly rate = signal<readonly string[]>(['ups-ground']);\n}\n",
1048
+ "verdict": "example"
1049
+ },
1050
+ {
1051
+ "id": "variants",
1052
+ "title": "variants.ts",
1053
+ "note": null,
1054
+ "language": "ts",
1055
+ "source": "import { Component } from '@angular/core';\nimport { SlStack } from '@slotted/angular/stack';\nimport {\n SlTable,\n SlTableBody,\n SlTableCaption,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n} from '@slotted/angular/table';\n\nconst SHIPMENTS = [\n { id: 'SH-3301', carrier: 'UPS Ground', cartons: 12 },\n { id: 'SH-3302', carrier: 'FedEx Express', cartons: 3 },\n { id: 'SH-3303', carrier: 'USPS Priority', cartons: 1 },\n];\n\nconst VARIANTS = [\n { variant: 'plain', caption: 'Plain: inside a card that already draws the box' },\n { variant: 'ruled', caption: 'Ruled: the default, a rule between rows' },\n { variant: 'framed', caption: 'Framed: the table is its own panel' },\n] as const;\n\n@Component({\n selector: 'app-table-variants',\n imports: [\n SlStack,\n SlTable,\n SlTableBody,\n SlTableCaption,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTableRowHeader,\n ],\n template: `\n <div slStack [gap]=\"6\">\n @for (item of variants; track item.variant) {\n <div slTable [columns]=\"3\" [variant]=\"item.variant\">\n <div slTableContent>\n <caption slTableCaption>\n {{\n item.caption\n }}\n </caption>\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader>Shipment</th>\n <th slTableColumnHeader>Carrier</th>\n <th slTableColumnHeader numeric>Cartons</th>\n </tr>\n </thead>\n <tbody slTableBody>\n @for (shipment of shipments; track shipment.id) {\n <tr slTableRow [value]=\"shipment.id\">\n <th slTableRowHeader>{{ shipment.id }}</th>\n <td slTableCell>{{ shipment.carrier }}</td>\n <td slTableCell numeric>{{ shipment.cartons }}</td>\n </tr>\n }\n </tbody>\n </div>\n </div>\n }\n </div>\n `,\n})\nexport class TableVariants {\n readonly shipments = SHIPMENTS;\n readonly variants = VARIANTS;\n}\n",
1056
+ "verdict": "example"
1057
+ }
1058
+ ]
1059
+ }