@slotted/angular 0.1.0-beta.8 → 0.1.0-beta.9

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 (418) hide show
  1. package/docs/code-block.json +92 -92
  2. package/docs/code-block.md +69 -69
  3. package/docs/currency-field.json +7 -0
  4. package/docs/currency-field.md +1 -0
  5. package/docs/data-grid.examples.md +1 -1
  6. package/docs/data-grid.json +21 -4
  7. package/docs/data-grid.md +1 -1
  8. package/docs/data-grid.props.md +5 -3
  9. package/docs/dialog.examples.md +138 -136
  10. package/docs/dialog.json +8 -8
  11. package/docs/filter-bar.json +118 -118
  12. package/docs/filter-bar.md +79 -79
  13. package/docs/guidelines/async-feedback.md +10 -0
  14. package/docs/guidelines/composition.md +11 -7
  15. package/docs/guidelines/index.md +6 -1
  16. package/docs/guidelines/list-pages.md +30 -0
  17. package/docs/guidelines/overviews.md +10 -0
  18. package/docs/markdown.json +79 -79
  19. package/docs/markdown.md +65 -65
  20. package/docs/page-header.json +1 -1
  21. package/docs/skills/compose-screen/SKILL.md +22 -10
  22. package/docs/skills/review-screen/SKILL.md +6 -0
  23. package/docs/skills/waiting-states/SKILL.md +4 -1
  24. package/docs/tags-input.json +28 -2
  25. package/docs/tags-input.md +4 -1
  26. package/docs/timeline.json +131 -131
  27. package/docs/timeline.md +123 -123
  28. package/fesm2022/slotted-angular-accordion.mjs +4 -2
  29. package/fesm2022/slotted-angular-accordion.mjs.map +1 -1
  30. package/fesm2022/slotted-angular-action-bar.mjs +21 -10
  31. package/fesm2022/slotted-angular-action-bar.mjs.map +1 -1
  32. package/fesm2022/slotted-angular-action-sheet.mjs +42 -29
  33. package/fesm2022/slotted-angular-action-sheet.mjs.map +1 -1
  34. package/fesm2022/slotted-angular-alert.mjs +17 -11
  35. package/fesm2022/slotted-angular-alert.mjs.map +1 -1
  36. package/fesm2022/slotted-angular-app-shell.mjs +52 -40
  37. package/fesm2022/slotted-angular-app-shell.mjs.map +1 -1
  38. package/fesm2022/slotted-angular-aspect-ratio.mjs +4 -2
  39. package/fesm2022/slotted-angular-aspect-ratio.mjs.map +1 -1
  40. package/fesm2022/slotted-angular-attachment.mjs +31 -20
  41. package/fesm2022/slotted-angular-attachment.mjs.map +1 -1
  42. package/fesm2022/slotted-angular-avatar-group.mjs +9 -6
  43. package/fesm2022/slotted-angular-avatar-group.mjs.map +1 -1
  44. package/fesm2022/slotted-angular-avatar.mjs +9 -6
  45. package/fesm2022/slotted-angular-avatar.mjs.map +1 -1
  46. package/fesm2022/slotted-angular-badge.mjs +14 -10
  47. package/fesm2022/slotted-angular-badge.mjs.map +1 -1
  48. package/fesm2022/slotted-angular-breadcrumb.mjs +26 -18
  49. package/fesm2022/slotted-angular-breadcrumb.mjs.map +1 -1
  50. package/fesm2022/slotted-angular-button-group.mjs +7 -4
  51. package/fesm2022/slotted-angular-button-group.mjs.map +1 -1
  52. package/fesm2022/slotted-angular-button.mjs +53 -25
  53. package/fesm2022/slotted-angular-button.mjs.map +1 -1
  54. package/fesm2022/slotted-angular-calendar.mjs +68 -26
  55. package/fesm2022/slotted-angular-calendar.mjs.map +1 -1
  56. package/fesm2022/slotted-angular-card.mjs +18 -16
  57. package/fesm2022/slotted-angular-card.mjs.map +1 -1
  58. package/fesm2022/slotted-angular-carousel.mjs +22 -11
  59. package/fesm2022/slotted-angular-carousel.mjs.map +1 -1
  60. package/fesm2022/slotted-angular-cascader.mjs +158 -64
  61. package/fesm2022/slotted-angular-cascader.mjs.map +1 -1
  62. package/fesm2022/slotted-angular-chart.mjs +4 -2
  63. package/fesm2022/slotted-angular-chart.mjs.map +1 -1
  64. package/fesm2022/slotted-angular-checkbox-group.mjs +5 -3
  65. package/fesm2022/slotted-angular-checkbox-group.mjs.map +1 -1
  66. package/fesm2022/slotted-angular-checkbox.mjs +13 -8
  67. package/fesm2022/slotted-angular-checkbox.mjs.map +1 -1
  68. package/fesm2022/slotted-angular-code-block.mjs +29 -15
  69. package/fesm2022/slotted-angular-code-block.mjs.map +1 -1
  70. package/fesm2022/slotted-angular-collapsible.mjs +20 -15
  71. package/fesm2022/slotted-angular-collapsible.mjs.map +1 -1
  72. package/fesm2022/slotted-angular-color-picker.mjs +77 -22
  73. package/fesm2022/slotted-angular-color-picker.mjs.map +1 -1
  74. package/fesm2022/slotted-angular-column-manager.mjs +68 -31
  75. package/fesm2022/slotted-angular-column-manager.mjs.map +1 -1
  76. package/fesm2022/slotted-angular-combobox.mjs +77 -31
  77. package/fesm2022/slotted-angular-combobox.mjs.map +1 -1
  78. package/fesm2022/slotted-angular-command-palette.mjs +128 -51
  79. package/fesm2022/slotted-angular-command-palette.mjs.map +1 -1
  80. package/fesm2022/slotted-angular-container.mjs +6 -4
  81. package/fesm2022/slotted-angular-container.mjs.map +1 -1
  82. package/fesm2022/slotted-angular-context-menu.mjs +5 -4
  83. package/fesm2022/slotted-angular-context-menu.mjs.map +1 -1
  84. package/fesm2022/slotted-angular-currency-field.mjs +98 -32
  85. package/fesm2022/slotted-angular-currency-field.mjs.map +1 -1
  86. package/fesm2022/slotted-angular-dashboard-grid.mjs +127 -44
  87. package/fesm2022/slotted-angular-dashboard-grid.mjs.map +1 -1
  88. package/fesm2022/slotted-angular-data-grid.mjs +309 -104
  89. package/fesm2022/slotted-angular-data-grid.mjs.map +1 -1
  90. package/fesm2022/slotted-angular-data-list.mjs +83 -50
  91. package/fesm2022/slotted-angular-data-list.mjs.map +1 -1
  92. package/fesm2022/slotted-angular-date-field.mjs +38 -12
  93. package/fesm2022/slotted-angular-date-field.mjs.map +1 -1
  94. package/fesm2022/slotted-angular-date-picker.mjs +19 -9
  95. package/fesm2022/slotted-angular-date-picker.mjs.map +1 -1
  96. package/fesm2022/slotted-angular-date-range-picker.mjs +41 -16
  97. package/fesm2022/slotted-angular-date-range-picker.mjs.map +1 -1
  98. package/fesm2022/slotted-angular-datetime-field.mjs +46 -14
  99. package/fesm2022/slotted-angular-datetime-field.mjs.map +1 -1
  100. package/fesm2022/slotted-angular-datetime-picker.mjs +37 -23
  101. package/fesm2022/slotted-angular-datetime-picker.mjs.map +1 -1
  102. package/fesm2022/slotted-angular-datetime-range-picker.mjs +111 -42
  103. package/fesm2022/slotted-angular-datetime-range-picker.mjs.map +1 -1
  104. package/fesm2022/slotted-angular-description-list.mjs +33 -19
  105. package/fesm2022/slotted-angular-description-list.mjs.map +1 -1
  106. package/fesm2022/slotted-angular-detail-panel.mjs +29 -18
  107. package/fesm2022/slotted-angular-detail-panel.mjs.map +1 -1
  108. package/fesm2022/slotted-angular-dialog.mjs +39 -28
  109. package/fesm2022/slotted-angular-dialog.mjs.map +1 -1
  110. package/fesm2022/slotted-angular-divider.mjs +7 -5
  111. package/fesm2022/slotted-angular-divider.mjs.map +1 -1
  112. package/fesm2022/slotted-angular-drawer.mjs +32 -24
  113. package/fesm2022/slotted-angular-drawer.mjs.map +1 -1
  114. package/fesm2022/slotted-angular-entity-picker.mjs +195 -67
  115. package/fesm2022/slotted-angular-entity-picker.mjs.map +1 -1
  116. package/fesm2022/slotted-angular-event-calendar.mjs +259 -102
  117. package/fesm2022/slotted-angular-event-calendar.mjs.map +1 -1
  118. package/fesm2022/slotted-angular-field-group.mjs +14 -7
  119. package/fesm2022/slotted-angular-field-group.mjs.map +1 -1
  120. package/fesm2022/slotted-angular-field.mjs +35 -15
  121. package/fesm2022/slotted-angular-field.mjs.map +1 -1
  122. package/fesm2022/slotted-angular-filter-bar.mjs +104 -43
  123. package/fesm2022/slotted-angular-filter-bar.mjs.map +1 -1
  124. package/fesm2022/slotted-angular-form.mjs +18 -10
  125. package/fesm2022/slotted-angular-form.mjs.map +1 -1
  126. package/fesm2022/slotted-angular-fullscreen.mjs +14 -8
  127. package/fesm2022/slotted-angular-fullscreen.mjs.map +1 -1
  128. package/fesm2022/slotted-angular-grid.mjs +4 -2
  129. package/fesm2022/slotted-angular-grid.mjs.map +1 -1
  130. package/fesm2022/slotted-angular-highlight.mjs +5 -3
  131. package/fesm2022/slotted-angular-highlight.mjs.map +1 -1
  132. package/fesm2022/slotted-angular-hover-card.mjs +5 -4
  133. package/fesm2022/slotted-angular-hover-card.mjs.map +1 -1
  134. package/fesm2022/slotted-angular-icon.mjs +6 -3
  135. package/fesm2022/slotted-angular-icon.mjs.map +1 -1
  136. package/fesm2022/slotted-angular-image.mjs +13 -10
  137. package/fesm2022/slotted-angular-image.mjs.map +1 -1
  138. package/fesm2022/slotted-angular-import-export-center.mjs +167 -99
  139. package/fesm2022/slotted-angular-import-export-center.mjs.map +1 -1
  140. package/fesm2022/slotted-angular-inline-message.mjs +10 -8
  141. package/fesm2022/slotted-angular-inline-message.mjs.map +1 -1
  142. package/fesm2022/slotted-angular-inline.mjs +4 -2
  143. package/fesm2022/slotted-angular-inline.mjs.map +1 -1
  144. package/fesm2022/slotted-angular-kbd.mjs +11 -7
  145. package/fesm2022/slotted-angular-kbd.mjs.map +1 -1
  146. package/fesm2022/slotted-angular-link.mjs +5 -3
  147. package/fesm2022/slotted-angular-link.mjs.map +1 -1
  148. package/fesm2022/slotted-angular-list-item.mjs +21 -18
  149. package/fesm2022/slotted-angular-list-item.mjs.map +1 -1
  150. package/fesm2022/slotted-angular-list.mjs +14 -10
  151. package/fesm2022/slotted-angular-list.mjs.map +1 -1
  152. package/fesm2022/slotted-angular-listbox.mjs +39 -21
  153. package/fesm2022/slotted-angular-listbox.mjs.map +1 -1
  154. package/fesm2022/slotted-angular-loading-overlay.mjs +59 -22
  155. package/fesm2022/slotted-angular-loading-overlay.mjs.map +1 -1
  156. package/fesm2022/slotted-angular-markdown.mjs +31 -19
  157. package/fesm2022/slotted-angular-markdown.mjs.map +1 -1
  158. package/fesm2022/slotted-angular-menu.mjs +41 -27
  159. package/fesm2022/slotted-angular-menu.mjs.map +1 -1
  160. package/fesm2022/slotted-angular-menubar.mjs +4 -2
  161. package/fesm2022/slotted-angular-menubar.mjs.map +1 -1
  162. package/fesm2022/slotted-angular-message-scroller.mjs +28 -15
  163. package/fesm2022/slotted-angular-message-scroller.mjs.map +1 -1
  164. package/fesm2022/slotted-angular-message.mjs +113 -51
  165. package/fesm2022/slotted-angular-message.mjs.map +1 -1
  166. package/fesm2022/slotted-angular-multi-select.mjs +133 -57
  167. package/fesm2022/slotted-angular-multi-select.mjs.map +1 -1
  168. package/fesm2022/slotted-angular-navigation-menu.mjs +34 -26
  169. package/fesm2022/slotted-angular-navigation-menu.mjs.map +1 -1
  170. package/fesm2022/slotted-angular-notification-center.mjs +107 -65
  171. package/fesm2022/slotted-angular-notification-center.mjs.map +1 -1
  172. package/fesm2022/slotted-angular-number-field.mjs +23 -11
  173. package/fesm2022/slotted-angular-number-field.mjs.map +1 -1
  174. package/fesm2022/slotted-angular-otp-input.mjs +13 -8
  175. package/fesm2022/slotted-angular-otp-input.mjs.map +1 -1
  176. package/fesm2022/slotted-angular-page-header.mjs +72 -42
  177. package/fesm2022/slotted-angular-page-header.mjs.map +1 -1
  178. package/fesm2022/slotted-angular-page.mjs +18 -9
  179. package/fesm2022/slotted-angular-page.mjs.map +1 -1
  180. package/fesm2022/slotted-angular-pagination.mjs +35 -22
  181. package/fesm2022/slotted-angular-pagination.mjs.map +1 -1
  182. package/fesm2022/slotted-angular-popover.mjs +25 -18
  183. package/fesm2022/slotted-angular-popover.mjs.map +1 -1
  184. package/fesm2022/slotted-angular-progress-indicator.mjs +122 -30
  185. package/fesm2022/slotted-angular-progress-indicator.mjs.map +1 -1
  186. package/fesm2022/slotted-angular-prompt-composer.mjs +24 -18
  187. package/fesm2022/slotted-angular-prompt-composer.mjs.map +1 -1
  188. package/fesm2022/slotted-angular-prose.mjs +14 -11
  189. package/fesm2022/slotted-angular-prose.mjs.map +1 -1
  190. package/fesm2022/slotted-angular-radio-group.mjs +15 -9
  191. package/fesm2022/slotted-angular-radio-group.mjs.map +1 -1
  192. package/fesm2022/slotted-angular-rating.mjs +138 -82
  193. package/fesm2022/slotted-angular-rating.mjs.map +1 -1
  194. package/fesm2022/slotted-angular-result-state.mjs +16 -12
  195. package/fesm2022/slotted-angular-result-state.mjs.map +1 -1
  196. package/fesm2022/slotted-angular-saved-views.mjs +43 -16
  197. package/fesm2022/slotted-angular-saved-views.mjs.map +1 -1
  198. package/fesm2022/slotted-angular-scroll-area.mjs +9 -5
  199. package/fesm2022/slotted-angular-scroll-area.mjs.map +1 -1
  200. package/fesm2022/slotted-angular-section.mjs +34 -15
  201. package/fesm2022/slotted-angular-section.mjs.map +1 -1
  202. package/fesm2022/slotted-angular-segmented-control.mjs +15 -9
  203. package/fesm2022/slotted-angular-segmented-control.mjs.map +1 -1
  204. package/fesm2022/slotted-angular-select.mjs +135 -53
  205. package/fesm2022/slotted-angular-select.mjs.map +1 -1
  206. package/fesm2022/slotted-angular-side-navigation.mjs +46 -35
  207. package/fesm2022/slotted-angular-side-navigation.mjs.map +1 -1
  208. package/fesm2022/slotted-angular-skeleton.mjs +32 -16
  209. package/fesm2022/slotted-angular-skeleton.mjs.map +1 -1
  210. package/fesm2022/slotted-angular-slider.mjs +31 -11
  211. package/fesm2022/slotted-angular-slider.mjs.map +1 -1
  212. package/fesm2022/slotted-angular-sparkline.mjs +29 -13
  213. package/fesm2022/slotted-angular-sparkline.mjs.map +1 -1
  214. package/fesm2022/slotted-angular-split-button.mjs +25 -11
  215. package/fesm2022/slotted-angular-split-button.mjs.map +1 -1
  216. package/fesm2022/slotted-angular-splitter.mjs +11 -9
  217. package/fesm2022/slotted-angular-splitter.mjs.map +1 -1
  218. package/fesm2022/slotted-angular-stack.mjs +4 -2
  219. package/fesm2022/slotted-angular-stack.mjs.map +1 -1
  220. package/fesm2022/slotted-angular-stat-card.mjs +35 -28
  221. package/fesm2022/slotted-angular-stat-card.mjs.map +1 -1
  222. package/fesm2022/slotted-angular-status-indicator.mjs +22 -8
  223. package/fesm2022/slotted-angular-status-indicator.mjs.map +1 -1
  224. package/fesm2022/slotted-angular-stepper.mjs +40 -15
  225. package/fesm2022/slotted-angular-stepper.mjs.map +1 -1
  226. package/fesm2022/slotted-angular-switch.mjs +15 -10
  227. package/fesm2022/slotted-angular-switch.mjs.map +1 -1
  228. package/fesm2022/slotted-angular-table-of-contents.mjs +29 -21
  229. package/fesm2022/slotted-angular-table-of-contents.mjs.map +1 -1
  230. package/fesm2022/slotted-angular-table.mjs +135 -72
  231. package/fesm2022/slotted-angular-table.mjs.map +1 -1
  232. package/fesm2022/slotted-angular-tabs.mjs +31 -14
  233. package/fesm2022/slotted-angular-tabs.mjs.map +1 -1
  234. package/fesm2022/slotted-angular-tag.mjs +19 -12
  235. package/fesm2022/slotted-angular-tag.mjs.map +1 -1
  236. package/fesm2022/slotted-angular-tags-input.mjs +253 -28
  237. package/fesm2022/slotted-angular-tags-input.mjs.map +1 -1
  238. package/fesm2022/slotted-angular-text-field.mjs +49 -15
  239. package/fesm2022/slotted-angular-text-field.mjs.map +1 -1
  240. package/fesm2022/slotted-angular-textarea.mjs +5 -3
  241. package/fesm2022/slotted-angular-textarea.mjs.map +1 -1
  242. package/fesm2022/slotted-angular-time-field.mjs +46 -12
  243. package/fesm2022/slotted-angular-time-field.mjs.map +1 -1
  244. package/fesm2022/slotted-angular-time-picker.mjs +28 -14
  245. package/fesm2022/slotted-angular-time-picker.mjs.map +1 -1
  246. package/fesm2022/slotted-angular-time-range-picker.mjs +109 -40
  247. package/fesm2022/slotted-angular-time-range-picker.mjs.map +1 -1
  248. package/fesm2022/slotted-angular-timeline.mjs +135 -64
  249. package/fesm2022/slotted-angular-timeline.mjs.map +1 -1
  250. package/fesm2022/slotted-angular-toast.mjs +42 -31
  251. package/fesm2022/slotted-angular-toast.mjs.map +1 -1
  252. package/fesm2022/slotted-angular-toggle-group.mjs +10 -6
  253. package/fesm2022/slotted-angular-toggle-group.mjs.map +1 -1
  254. package/fesm2022/slotted-angular-toggle.mjs +9 -4
  255. package/fesm2022/slotted-angular-toggle.mjs.map +1 -1
  256. package/fesm2022/slotted-angular-toolbar.mjs +21 -10
  257. package/fesm2022/slotted-angular-toolbar.mjs.map +1 -1
  258. package/fesm2022/slotted-angular-tooltip.mjs +8 -5
  259. package/fesm2022/slotted-angular-tooltip.mjs.map +1 -1
  260. package/fesm2022/slotted-angular-top-navigation.mjs +64 -44
  261. package/fesm2022/slotted-angular-top-navigation.mjs.map +1 -1
  262. package/fesm2022/slotted-angular-tour.mjs +46 -21
  263. package/fesm2022/slotted-angular-tour.mjs.map +1 -1
  264. package/fesm2022/slotted-angular-transfer.mjs +69 -30
  265. package/fesm2022/slotted-angular-transfer.mjs.map +1 -1
  266. package/fesm2022/slotted-angular-tree.mjs +74 -26
  267. package/fesm2022/slotted-angular-tree.mjs.map +1 -1
  268. package/fesm2022/slotted-angular-typography.mjs +8 -4
  269. package/fesm2022/slotted-angular-typography.mjs.map +1 -1
  270. package/fesm2022/slotted-angular-upload.mjs +125 -57
  271. package/fesm2022/slotted-angular-upload.mjs.map +1 -1
  272. package/fesm2022/slotted-angular-visually-hidden.mjs +4 -2
  273. package/fesm2022/slotted-angular-visually-hidden.mjs.map +1 -1
  274. package/fesm2022/slotted-angular-wizard.mjs +163 -65
  275. package/fesm2022/slotted-angular-wizard.mjs.map +1 -1
  276. package/package.json +3 -3
  277. package/types/slotted-angular-accordion.d.ts.map +1 -1
  278. package/types/slotted-angular-action-bar.d.ts.map +1 -1
  279. package/types/slotted-angular-action-sheet.d.ts.map +1 -1
  280. package/types/slotted-angular-alert.d.ts +1 -1
  281. package/types/slotted-angular-alert.d.ts.map +1 -1
  282. package/types/slotted-angular-app-shell.d.ts.map +1 -1
  283. package/types/slotted-angular-aspect-ratio.d.ts.map +1 -1
  284. package/types/slotted-angular-attachment.d.ts +1 -1
  285. package/types/slotted-angular-attachment.d.ts.map +1 -1
  286. package/types/slotted-angular-avatar-group.d.ts.map +1 -1
  287. package/types/slotted-angular-avatar.d.ts.map +1 -1
  288. package/types/slotted-angular-badge.d.ts.map +1 -1
  289. package/types/slotted-angular-breadcrumb.d.ts.map +1 -1
  290. package/types/slotted-angular-button-group.d.ts.map +1 -1
  291. package/types/slotted-angular-button.d.ts.map +1 -1
  292. package/types/slotted-angular-calendar.d.ts.map +1 -1
  293. package/types/slotted-angular-card.d.ts.map +1 -1
  294. package/types/slotted-angular-carousel.d.ts.map +1 -1
  295. package/types/slotted-angular-cascader.d.ts.map +1 -1
  296. package/types/slotted-angular-chart.d.ts.map +1 -1
  297. package/types/slotted-angular-checkbox-group.d.ts.map +1 -1
  298. package/types/slotted-angular-checkbox.d.ts.map +1 -1
  299. package/types/slotted-angular-code-block.d.ts +1 -1
  300. package/types/slotted-angular-code-block.d.ts.map +1 -1
  301. package/types/slotted-angular-collapsible.d.ts +1 -1
  302. package/types/slotted-angular-collapsible.d.ts.map +1 -1
  303. package/types/slotted-angular-color-picker.d.ts.map +1 -1
  304. package/types/slotted-angular-column-manager.d.ts.map +1 -1
  305. package/types/slotted-angular-combobox.d.ts +1 -1
  306. package/types/slotted-angular-combobox.d.ts.map +1 -1
  307. package/types/slotted-angular-command-palette.d.ts.map +1 -1
  308. package/types/slotted-angular-container.d.ts.map +1 -1
  309. package/types/slotted-angular-context-menu.d.ts.map +1 -1
  310. package/types/slotted-angular-currency-field.d.ts +39 -13
  311. package/types/slotted-angular-currency-field.d.ts.map +1 -1
  312. package/types/slotted-angular-dashboard-grid.d.ts.map +1 -1
  313. package/types/slotted-angular-data-grid.d.ts +26 -2
  314. package/types/slotted-angular-data-grid.d.ts.map +1 -1
  315. package/types/slotted-angular-data-list.d.ts.map +1 -1
  316. package/types/slotted-angular-date-field.d.ts.map +1 -1
  317. package/types/slotted-angular-date-picker.d.ts.map +1 -1
  318. package/types/slotted-angular-date-range-picker.d.ts.map +1 -1
  319. package/types/slotted-angular-datetime-field.d.ts.map +1 -1
  320. package/types/slotted-angular-datetime-picker.d.ts.map +1 -1
  321. package/types/slotted-angular-datetime-range-picker.d.ts.map +1 -1
  322. package/types/slotted-angular-description-list.d.ts.map +1 -1
  323. package/types/slotted-angular-detail-panel.d.ts.map +1 -1
  324. package/types/slotted-angular-dialog.d.ts +2 -1
  325. package/types/slotted-angular-dialog.d.ts.map +1 -1
  326. package/types/slotted-angular-divider.d.ts.map +1 -1
  327. package/types/slotted-angular-drawer.d.ts.map +1 -1
  328. package/types/slotted-angular-entity-picker.d.ts.map +1 -1
  329. package/types/slotted-angular-event-calendar.d.ts.map +1 -1
  330. package/types/slotted-angular-field-group.d.ts.map +1 -1
  331. package/types/slotted-angular-field.d.ts.map +1 -1
  332. package/types/slotted-angular-filter-bar.d.ts.map +1 -1
  333. package/types/slotted-angular-form.d.ts.map +1 -1
  334. package/types/slotted-angular-fullscreen.d.ts.map +1 -1
  335. package/types/slotted-angular-grid.d.ts.map +1 -1
  336. package/types/slotted-angular-highlight.d.ts.map +1 -1
  337. package/types/slotted-angular-hover-card.d.ts.map +1 -1
  338. package/types/slotted-angular-icon.d.ts +1 -1
  339. package/types/slotted-angular-icon.d.ts.map +1 -1
  340. package/types/slotted-angular-image.d.ts.map +1 -1
  341. package/types/slotted-angular-import-export-center.d.ts.map +1 -1
  342. package/types/slotted-angular-inline-message.d.ts +1 -1
  343. package/types/slotted-angular-inline-message.d.ts.map +1 -1
  344. package/types/slotted-angular-inline.d.ts.map +1 -1
  345. package/types/slotted-angular-kbd.d.ts.map +1 -1
  346. package/types/slotted-angular-link.d.ts.map +1 -1
  347. package/types/slotted-angular-list-item.d.ts.map +1 -1
  348. package/types/slotted-angular-list.d.ts.map +1 -1
  349. package/types/slotted-angular-listbox.d.ts.map +1 -1
  350. package/types/slotted-angular-loading-overlay.d.ts.map +1 -1
  351. package/types/slotted-angular-markdown.d.ts.map +1 -1
  352. package/types/slotted-angular-menu.d.ts.map +1 -1
  353. package/types/slotted-angular-menubar.d.ts.map +1 -1
  354. package/types/slotted-angular-message-scroller.d.ts.map +1 -1
  355. package/types/slotted-angular-message.d.ts.map +1 -1
  356. package/types/slotted-angular-multi-select.d.ts +1 -1
  357. package/types/slotted-angular-multi-select.d.ts.map +1 -1
  358. package/types/slotted-angular-navigation-menu.d.ts.map +1 -1
  359. package/types/slotted-angular-notification-center.d.ts.map +1 -1
  360. package/types/slotted-angular-number-field.d.ts.map +1 -1
  361. package/types/slotted-angular-otp-input.d.ts.map +1 -1
  362. package/types/slotted-angular-page-header.d.ts +1 -1
  363. package/types/slotted-angular-page-header.d.ts.map +1 -1
  364. package/types/slotted-angular-page.d.ts.map +1 -1
  365. package/types/slotted-angular-pagination.d.ts.map +1 -1
  366. package/types/slotted-angular-popover.d.ts.map +1 -1
  367. package/types/slotted-angular-progress-indicator.d.ts.map +1 -1
  368. package/types/slotted-angular-prompt-composer.d.ts.map +1 -1
  369. package/types/slotted-angular-prose.d.ts.map +1 -1
  370. package/types/slotted-angular-radio-group.d.ts.map +1 -1
  371. package/types/slotted-angular-rating.d.ts.map +1 -1
  372. package/types/slotted-angular-result-state.d.ts.map +1 -1
  373. package/types/slotted-angular-saved-views.d.ts.map +1 -1
  374. package/types/slotted-angular-scroll-area.d.ts.map +1 -1
  375. package/types/slotted-angular-section.d.ts.map +1 -1
  376. package/types/slotted-angular-segmented-control.d.ts.map +1 -1
  377. package/types/slotted-angular-select.d.ts +1 -1
  378. package/types/slotted-angular-select.d.ts.map +1 -1
  379. package/types/slotted-angular-side-navigation.d.ts.map +1 -1
  380. package/types/slotted-angular-skeleton.d.ts.map +1 -1
  381. package/types/slotted-angular-slider.d.ts.map +1 -1
  382. package/types/slotted-angular-sparkline.d.ts.map +1 -1
  383. package/types/slotted-angular-split-button.d.ts.map +1 -1
  384. package/types/slotted-angular-splitter.d.ts.map +1 -1
  385. package/types/slotted-angular-stack.d.ts.map +1 -1
  386. package/types/slotted-angular-stat-card.d.ts.map +1 -1
  387. package/types/slotted-angular-status-indicator.d.ts +1 -1
  388. package/types/slotted-angular-status-indicator.d.ts.map +1 -1
  389. package/types/slotted-angular-stepper.d.ts +1 -1
  390. package/types/slotted-angular-stepper.d.ts.map +1 -1
  391. package/types/slotted-angular-switch.d.ts.map +1 -1
  392. package/types/slotted-angular-table-of-contents.d.ts.map +1 -1
  393. package/types/slotted-angular-table.d.ts.map +1 -1
  394. package/types/slotted-angular-tabs.d.ts.map +1 -1
  395. package/types/slotted-angular-tag.d.ts.map +1 -1
  396. package/types/slotted-angular-tags-input.d.ts +33 -1
  397. package/types/slotted-angular-tags-input.d.ts.map +1 -1
  398. package/types/slotted-angular-text-field.d.ts.map +1 -1
  399. package/types/slotted-angular-textarea.d.ts.map +1 -1
  400. package/types/slotted-angular-time-field.d.ts.map +1 -1
  401. package/types/slotted-angular-time-picker.d.ts.map +1 -1
  402. package/types/slotted-angular-time-range-picker.d.ts.map +1 -1
  403. package/types/slotted-angular-timeline.d.ts.map +1 -1
  404. package/types/slotted-angular-toast.d.ts +2 -2
  405. package/types/slotted-angular-toast.d.ts.map +1 -1
  406. package/types/slotted-angular-toggle-group.d.ts.map +1 -1
  407. package/types/slotted-angular-toggle.d.ts.map +1 -1
  408. package/types/slotted-angular-toolbar.d.ts.map +1 -1
  409. package/types/slotted-angular-tooltip.d.ts.map +1 -1
  410. package/types/slotted-angular-top-navigation.d.ts.map +1 -1
  411. package/types/slotted-angular-tour.d.ts.map +1 -1
  412. package/types/slotted-angular-transfer.d.ts.map +1 -1
  413. package/types/slotted-angular-tree.d.ts.map +1 -1
  414. package/types/slotted-angular-typography.d.ts.map +1 -1
  415. package/types/slotted-angular-upload.d.ts +2 -2
  416. package/types/slotted-angular-upload.d.ts.map +1 -1
  417. package/types/slotted-angular-visually-hidden.d.ts.map +1 -1
  418. package/types/slotted-angular-wizard.d.ts.map +1 -1
@@ -642,6 +642,144 @@ Excerpt — not a complete module
642
642
  padding-inline: var(--slotted-dialog-inset-inline); } -->
643
643
  ```
644
644
 
645
+ ### A dialog that is a form
646
+
647
+ A dialog that edits a record submits with Enter from any field and with the footer’s submit. A form written around the header, the body and the footer draws no box of its own, so the parts stay the panel’s rows and keep its inset.
648
+
649
+ Example
650
+
651
+ ```ts
652
+ import { Component, computed, signal } from '@angular/core';
653
+ import { SlButton } from '@slotted/angular/button';
654
+ import {
655
+ SlDialog,
656
+ SlDialogBody,
657
+ SlDialogClose,
658
+ SlDialogDescription,
659
+ SlDialogFooter,
660
+ SlDialogHeader,
661
+ SlDialogTitle,
662
+ SlDialogTrigger,
663
+ } from '@slotted/angular/dialog';
664
+ import { SlField, SlFieldError, SlFieldLabel } from '@slotted/angular/field';
665
+ import { SlInline } from '@slotted/angular/inline';
666
+ import { SlStack } from '@slotted/angular/stack';
667
+ import { SlTextField, SlTextFieldInput } from '@slotted/angular/text-field';
668
+ import { SlText } from '@slotted/angular/typography';
669
+
670
+ function nameError(value: string): string {
671
+ return value.trim() === '' ? 'Enter the contact’s full name.' : '';
672
+ }
673
+
674
+ function emailError(value: string): string {
675
+ if (value.trim() === '') return 'Enter the address the contact reads.';
676
+ if (!/^\S+@\S+\.\S+$/.test(value)) return 'Enter an address like ana@contoso.com.';
677
+ return '';
678
+ }
679
+
680
+ @Component({
681
+ selector: 'app-dialog-form',
682
+ imports: [
683
+ SlButton,
684
+ SlDialog,
685
+ SlDialogBody,
686
+ SlDialogClose,
687
+ SlDialogDescription,
688
+ SlDialogFooter,
689
+ SlDialogHeader,
690
+ SlDialogTitle,
691
+ SlDialogTrigger,
692
+ SlField,
693
+ SlFieldError,
694
+ SlFieldLabel,
695
+ SlInline,
696
+ SlStack,
697
+ SlText,
698
+ SlTextField,
699
+ SlTextFieldInput,
700
+ ],
701
+ template: `
702
+ <div slInline align="center" [gap]="3">
703
+ <button slButton [slDialogTrigger]="dialog">Add contact</button>
704
+ <sl-dialog #dialog="slDialog" [open]="open()" (openChange)="toggle($event)">
705
+ <header slDialogHeader>
706
+ <h2 slDialogTitle>New contact</h2>
707
+ <p slDialogDescription>Contoso Foods, Seattle.</p>
708
+ <button slDialogClose></button>
709
+ </header>
710
+ <div slDialogBody>
711
+ <form id="new-contact" novalidate (submit)="submit($event)">
712
+ <div slStack [gap]="4">
713
+ <div slField required [invalid]="errors()?.name ? true : undefined">
714
+ <label slFieldLabel>Full name</label>
715
+ <div slTextField>
716
+ <input
717
+ slTextFieldInput
718
+ autocomplete="name"
719
+ [value]="name()"
720
+ (valueChange)="name.set($event.value)"
721
+ />
722
+ </div>
723
+ <span slFieldError live="polite" reserve>{{ errors()?.name }}</span>
724
+ </div>
725
+ <div slField required [invalid]="errors()?.email ? true : undefined">
726
+ <label slFieldLabel>Email</label>
727
+ <div slTextField>
728
+ <input
729
+ slTextFieldInput
730
+ autocomplete="email"
731
+ type="email"
732
+ [value]="email()"
733
+ (valueChange)="email.set($event.value)"
734
+ />
735
+ </div>
736
+ <span slFieldError live="polite" reserve>{{ errors()?.email }}</span>
737
+ </div>
738
+ </div>
739
+ </form>
740
+ </div>
741
+ <footer slDialogFooter>
742
+ <button slButton variant="ghost" tone="secondary" (click)="open.set(false)">
743
+ Cancel
744
+ </button>
745
+ <button slButton type="submit" form="new-contact">Add contact</button>
746
+ </footer>
747
+ </sl-dialog>
748
+ @if (added(); as message) {
749
+ <span slText role="status" size="sm" tone="muted">{{ message }}</span>
750
+ }
751
+ </div>
752
+ `,
753
+ })
754
+ export class DialogForm {
755
+ readonly open = signal(false);
756
+ readonly name = signal('');
757
+ readonly email = signal('');
758
+ readonly submitted = signal(false);
759
+ readonly added = signal<string | null>(null);
760
+ readonly errors = computed(() =>
761
+ this.submitted() ? { name: nameError(this.name()), email: emailError(this.email()) } : null,
762
+ );
763
+
764
+ toggle(next: boolean): void {
765
+ if (next) {
766
+ this.name.set('');
767
+ this.email.set('');
768
+ this.submitted.set(false);
769
+ }
770
+ this.open.set(next);
771
+ }
772
+
773
+ submit(event: Event): void {
774
+ event.preventDefault();
775
+ this.submitted.set(true);
776
+ if (nameError(this.name()) !== '' || emailError(this.email()) !== '') return;
777
+ this.added.set(`${this.name().trim()} was added to Contoso Foods.`);
778
+ this.open.set(false);
779
+ }
780
+ }
781
+ ```
782
+
645
783
  ### Deciding once for the application
646
784
 
647
785
  Eight decisions an application takes once instead of eight props on every dialog in a product. Angular Material is the only surveyed library with an equivalent, and a dialog that states one itself still wins.
@@ -1639,142 +1777,6 @@ export class DialogDismiss {
1639
1777
  }
1640
1778
  ```
1641
1779
 
1642
- ### form.ts
1643
-
1644
- Example
1645
-
1646
- ```ts
1647
- import { Component, computed, signal } from '@angular/core';
1648
- import { SlButton } from '@slotted/angular/button';
1649
- import {
1650
- SlDialog,
1651
- SlDialogBody,
1652
- SlDialogClose,
1653
- SlDialogDescription,
1654
- SlDialogFooter,
1655
- SlDialogHeader,
1656
- SlDialogTitle,
1657
- SlDialogTrigger,
1658
- } from '@slotted/angular/dialog';
1659
- import { SlField, SlFieldError, SlFieldLabel } from '@slotted/angular/field';
1660
- import { SlInline } from '@slotted/angular/inline';
1661
- import { SlStack } from '@slotted/angular/stack';
1662
- import { SlTextField, SlTextFieldInput } from '@slotted/angular/text-field';
1663
- import { SlText } from '@slotted/angular/typography';
1664
-
1665
- function nameError(value: string): string {
1666
- return value.trim() === '' ? 'Enter the contact’s full name.' : '';
1667
- }
1668
-
1669
- function emailError(value: string): string {
1670
- if (value.trim() === '') return 'Enter the address the contact reads.';
1671
- if (!/^\S+@\S+\.\S+$/.test(value)) return 'Enter an address like ana@contoso.com.';
1672
- return '';
1673
- }
1674
-
1675
- @Component({
1676
- selector: 'app-dialog-form',
1677
- imports: [
1678
- SlButton,
1679
- SlDialog,
1680
- SlDialogBody,
1681
- SlDialogClose,
1682
- SlDialogDescription,
1683
- SlDialogFooter,
1684
- SlDialogHeader,
1685
- SlDialogTitle,
1686
- SlDialogTrigger,
1687
- SlField,
1688
- SlFieldError,
1689
- SlFieldLabel,
1690
- SlInline,
1691
- SlStack,
1692
- SlText,
1693
- SlTextField,
1694
- SlTextFieldInput,
1695
- ],
1696
- template: `
1697
- <div slInline align="center" [gap]="3">
1698
- <button slButton [slDialogTrigger]="dialog">Add contact</button>
1699
- <sl-dialog #dialog="slDialog" [open]="open()" (openChange)="toggle($event)">
1700
- <header slDialogHeader>
1701
- <h2 slDialogTitle>New contact</h2>
1702
- <p slDialogDescription>Contoso Foods, Seattle.</p>
1703
- <button slDialogClose></button>
1704
- </header>
1705
- <div slDialogBody>
1706
- <form id="new-contact" novalidate (submit)="submit($event)">
1707
- <div slStack [gap]="4">
1708
- <div slField required [invalid]="errors()?.name ? true : undefined">
1709
- <label slFieldLabel>Full name</label>
1710
- <div slTextField>
1711
- <input
1712
- slTextFieldInput
1713
- autocomplete="name"
1714
- [value]="name()"
1715
- (valueChange)="name.set($event.value)"
1716
- />
1717
- </div>
1718
- <span slFieldError live="polite" reserve>{{ errors()?.name }}</span>
1719
- </div>
1720
- <div slField required [invalid]="errors()?.email ? true : undefined">
1721
- <label slFieldLabel>Email</label>
1722
- <div slTextField>
1723
- <input
1724
- slTextFieldInput
1725
- autocomplete="email"
1726
- type="email"
1727
- [value]="email()"
1728
- (valueChange)="email.set($event.value)"
1729
- />
1730
- </div>
1731
- <span slFieldError live="polite" reserve>{{ errors()?.email }}</span>
1732
- </div>
1733
- </div>
1734
- </form>
1735
- </div>
1736
- <footer slDialogFooter>
1737
- <button slButton variant="ghost" tone="secondary" (click)="open.set(false)">
1738
- Cancel
1739
- </button>
1740
- <button slButton type="submit" form="new-contact">Add contact</button>
1741
- </footer>
1742
- </sl-dialog>
1743
- @if (added(); as message) {
1744
- <span slText role="status" size="sm" tone="muted">{{ message }}</span>
1745
- }
1746
- </div>
1747
- `,
1748
- })
1749
- export class DialogForm {
1750
- readonly open = signal(false);
1751
- readonly name = signal('');
1752
- readonly email = signal('');
1753
- readonly submitted = signal(false);
1754
- readonly added = signal<string | null>(null);
1755
- readonly errors = computed(() =>
1756
- this.submitted() ? { name: nameError(this.name()), email: emailError(this.email()) } : null,
1757
- );
1758
-
1759
- toggle(next: boolean): void {
1760
- if (next) {
1761
- this.name.set('');
1762
- this.email.set('');
1763
- this.submitted.set(false);
1764
- }
1765
- this.open.set(next);
1766
- }
1767
-
1768
- submit(event: Event): void {
1769
- event.preventDefault();
1770
- this.submitted.set(true);
1771
- if (nameError(this.name()) !== '' || emailError(this.email()) !== '') return;
1772
- this.added.set(`${this.name().trim()} was added to Contoso Foods.`);
1773
- this.open.set(false);
1774
- }
1775
- }
1776
- ```
1777
-
1778
1780
  ### full-screen.ts
1779
1781
 
1780
1782
  Example
package/docs/dialog.json CHANGED
@@ -933,6 +933,14 @@
933
933
  "source": "<sl-dialog #d=\"slDialog\">\n <div class=\"rename\">\n <h2 slDialogTitle>Rename file</h2>\n <input slTextField aria-label=\"Name\" value=\"report-q3.pdf\" />\n <img alt=\"First page of report-q3.pdf\" [src]=\"preview\" />\n </div>\n <footer slDialogFooter><button slButton size=\"sm\">Rename</button></footer>\n</sl-dialog>\n<!-- .rename { display: grid; gap: var(--slotted-space-5);\n padding-block: var(--slotted-dialog-inset-block);\n padding-inline: var(--slotted-dialog-inset-inline); } -->\n",
934
934
  "verdict": "excerpt"
935
935
  },
936
+ {
937
+ "id": "form",
938
+ "title": "A dialog that is a form",
939
+ "note": "A dialog that edits a record submits with Enter from any field and with the footer’s submit. A form written around the header, the body and the footer draws no box of its own, so the parts stay the panel’s rows and keep its inset.",
940
+ "language": "ts",
941
+ "source": "import { Component, computed, signal } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n} from '@slotted/angular/dialog';\nimport { SlField, SlFieldError, SlFieldLabel } from '@slotted/angular/field';\nimport { SlInline } from '@slotted/angular/inline';\nimport { SlStack } from '@slotted/angular/stack';\nimport { SlTextField, SlTextFieldInput } from '@slotted/angular/text-field';\nimport { SlText } from '@slotted/angular/typography';\n\nfunction nameError(value: string): string {\n return value.trim() === '' ? 'Enter the contact’s full name.' : '';\n}\n\nfunction emailError(value: string): string {\n if (value.trim() === '') return 'Enter the address the contact reads.';\n if (!/^\\S+@\\S+\\.\\S+$/.test(value)) return 'Enter an address like ana@contoso.com.';\n return '';\n}\n\n@Component({\n selector: 'app-dialog-form',\n imports: [\n SlButton,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlField,\n SlFieldError,\n SlFieldLabel,\n SlInline,\n SlStack,\n SlText,\n SlTextField,\n SlTextFieldInput,\n ],\n template: `\n <div slInline align=\"center\" [gap]=\"3\">\n <button slButton [slDialogTrigger]=\"dialog\">Add contact</button>\n <sl-dialog #dialog=\"slDialog\" [open]=\"open()\" (openChange)=\"toggle($event)\">\n <header slDialogHeader>\n <h2 slDialogTitle>New contact</h2>\n <p slDialogDescription>Contoso Foods, Seattle.</p>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <form id=\"new-contact\" novalidate (submit)=\"submit($event)\">\n <div slStack [gap]=\"4\">\n <div slField required [invalid]=\"errors()?.name ? true : undefined\">\n <label slFieldLabel>Full name</label>\n <div slTextField>\n <input\n slTextFieldInput\n autocomplete=\"name\"\n [value]=\"name()\"\n (valueChange)=\"name.set($event.value)\"\n />\n </div>\n <span slFieldError live=\"polite\" reserve>{{ errors()?.name }}</span>\n </div>\n <div slField required [invalid]=\"errors()?.email ? true : undefined\">\n <label slFieldLabel>Email</label>\n <div slTextField>\n <input\n slTextFieldInput\n autocomplete=\"email\"\n type=\"email\"\n [value]=\"email()\"\n (valueChange)=\"email.set($event.value)\"\n />\n </div>\n <span slFieldError live=\"polite\" reserve>{{ errors()?.email }}</span>\n </div>\n </div>\n </form>\n </div>\n <footer slDialogFooter>\n <button slButton variant=\"ghost\" tone=\"secondary\" (click)=\"open.set(false)\">\n Cancel\n </button>\n <button slButton type=\"submit\" form=\"new-contact\">Add contact</button>\n </footer>\n </sl-dialog>\n @if (added(); as message) {\n <span slText role=\"status\" size=\"sm\" tone=\"muted\">{{ message }}</span>\n }\n </div>\n `,\n})\nexport class DialogForm {\n readonly open = signal(false);\n readonly name = signal('');\n readonly email = signal('');\n readonly submitted = signal(false);\n readonly added = signal<string | null>(null);\n readonly errors = computed(() =>\n this.submitted() ? { name: nameError(this.name()), email: emailError(this.email()) } : null,\n );\n\n toggle(next: boolean): void {\n if (next) {\n this.name.set('');\n this.email.set('');\n this.submitted.set(false);\n }\n this.open.set(next);\n }\n\n submit(event: Event): void {\n event.preventDefault();\n this.submitted.set(true);\n if (nameError(this.name()) !== '' || emailError(this.email()) !== '') return;\n this.added.set(`${this.name().trim()} was added to Contoso Foods.`);\n this.open.set(false);\n }\n}\n",
942
+ "verdict": "example"
943
+ },
936
944
  {
937
945
  "id": "defaults",
938
946
  "title": "Deciding once for the application",
@@ -1077,14 +1085,6 @@
1077
1085
  "source": "import { Component, signal } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlDialog,\n SlDialogBody,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n} from '@slotted/angular/dialog';\nimport { SlText } from '@slotted/angular/typography';\n\n@Component({\n selector: 'app-dialog-dismiss',\n imports: [\n SlButton,\n SlDialog,\n SlDialogBody,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlText,\n ],\n template: `\n <button slButton [slDialogTrigger]=\"dialog\">Import products</button>\n <sl-dialog #dialog=\"slDialog\" escape=\"none\" outsidePress=\"none\" [(open)]=\"open\">\n <header slDialogHeader>\n <h2 slDialogTitle>Import 1,240 products</h2>\n <p slDialogDescription>From spring-catalogue.csv into the Northwind price list.</p>\n </header>\n <div slDialogBody>\n <span slText size=\"sm\">\n 38 rows update existing products and 1,202 add new ones. Escape and a press outside the\n panel leave this dialog open; choose one of the actions.\n </span>\n </div>\n <footer slDialogFooter>\n <button slButton variant=\"ghost\" tone=\"secondary\" (click)=\"open.set(false)\">\n Cancel import\n </button>\n <button slButton (click)=\"open.set(false)\">Start import</button>\n </footer>\n </sl-dialog>\n `,\n})\nexport class DialogDismiss {\n readonly open = signal(false);\n}\n",
1078
1086
  "verdict": "example"
1079
1087
  },
1080
- {
1081
- "id": "form",
1082
- "title": "form.ts",
1083
- "note": null,
1084
- "language": "ts",
1085
- "source": "import { Component, computed, signal } from '@angular/core';\nimport { SlButton } from '@slotted/angular/button';\nimport {\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n} from '@slotted/angular/dialog';\nimport { SlField, SlFieldError, SlFieldLabel } from '@slotted/angular/field';\nimport { SlInline } from '@slotted/angular/inline';\nimport { SlStack } from '@slotted/angular/stack';\nimport { SlTextField, SlTextFieldInput } from '@slotted/angular/text-field';\nimport { SlText } from '@slotted/angular/typography';\n\nfunction nameError(value: string): string {\n return value.trim() === '' ? 'Enter the contact’s full name.' : '';\n}\n\nfunction emailError(value: string): string {\n if (value.trim() === '') return 'Enter the address the contact reads.';\n if (!/^\\S+@\\S+\\.\\S+$/.test(value)) return 'Enter an address like ana@contoso.com.';\n return '';\n}\n\n@Component({\n selector: 'app-dialog-form',\n imports: [\n SlButton,\n SlDialog,\n SlDialogBody,\n SlDialogClose,\n SlDialogDescription,\n SlDialogFooter,\n SlDialogHeader,\n SlDialogTitle,\n SlDialogTrigger,\n SlField,\n SlFieldError,\n SlFieldLabel,\n SlInline,\n SlStack,\n SlText,\n SlTextField,\n SlTextFieldInput,\n ],\n template: `\n <div slInline align=\"center\" [gap]=\"3\">\n <button slButton [slDialogTrigger]=\"dialog\">Add contact</button>\n <sl-dialog #dialog=\"slDialog\" [open]=\"open()\" (openChange)=\"toggle($event)\">\n <header slDialogHeader>\n <h2 slDialogTitle>New contact</h2>\n <p slDialogDescription>Contoso Foods, Seattle.</p>\n <button slDialogClose></button>\n </header>\n <div slDialogBody>\n <form id=\"new-contact\" novalidate (submit)=\"submit($event)\">\n <div slStack [gap]=\"4\">\n <div slField required [invalid]=\"errors()?.name ? true : undefined\">\n <label slFieldLabel>Full name</label>\n <div slTextField>\n <input\n slTextFieldInput\n autocomplete=\"name\"\n [value]=\"name()\"\n (valueChange)=\"name.set($event.value)\"\n />\n </div>\n <span slFieldError live=\"polite\" reserve>{{ errors()?.name }}</span>\n </div>\n <div slField required [invalid]=\"errors()?.email ? true : undefined\">\n <label slFieldLabel>Email</label>\n <div slTextField>\n <input\n slTextFieldInput\n autocomplete=\"email\"\n type=\"email\"\n [value]=\"email()\"\n (valueChange)=\"email.set($event.value)\"\n />\n </div>\n <span slFieldError live=\"polite\" reserve>{{ errors()?.email }}</span>\n </div>\n </div>\n </form>\n </div>\n <footer slDialogFooter>\n <button slButton variant=\"ghost\" tone=\"secondary\" (click)=\"open.set(false)\">\n Cancel\n </button>\n <button slButton type=\"submit\" form=\"new-contact\">Add contact</button>\n </footer>\n </sl-dialog>\n @if (added(); as message) {\n <span slText role=\"status\" size=\"sm\" tone=\"muted\">{{ message }}</span>\n }\n </div>\n `,\n})\nexport class DialogForm {\n readonly open = signal(false);\n readonly name = signal('');\n readonly email = signal('');\n readonly submitted = signal(false);\n readonly added = signal<string | null>(null);\n readonly errors = computed(() =>\n this.submitted() ? { name: nameError(this.name()), email: emailError(this.email()) } : null,\n );\n\n toggle(next: boolean): void {\n if (next) {\n this.name.set('');\n this.email.set('');\n this.submitted.set(false);\n }\n this.open.set(next);\n }\n\n submit(event: Event): void {\n event.preventDefault();\n this.submitted.set(true);\n if (nameError(this.name()) !== '' || emailError(this.email()) !== '') return;\n this.added.set(`${this.name().trim()} was added to Contoso Foods.`);\n this.open.set(false);\n }\n}\n",
1086
- "verdict": "example"
1087
- },
1088
1088
  {
1089
1089
  "id": "full-screen",
1090
1090
  "title": "full-screen.ts",