ngwr 14.8.0 → 14.9.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 (447) hide show
  1. package/README.md +66 -332
  2. package/alert/styles/_index.scss +10 -0
  3. package/avatar/styles/_index.scss +18 -7
  4. package/badge/styles/_index.scss +7 -0
  5. package/badge/styles/_tag.scss +7 -1
  6. package/button/styles/_index.scss +6 -0
  7. package/cascader/styles/_rules.scss +1 -1
  8. package/checkbox/styles/_index.scss +4 -0
  9. package/command-palette/styles/_index.scss +1 -1
  10. package/divider/styles/_index.scss +2 -0
  11. package/editor/styles/_index.scss +441 -0
  12. package/fesm2022/ngwr-action-sheet-testing.mjs.map +1 -1
  13. package/fesm2022/ngwr-action-sheet.mjs +3 -3
  14. package/fesm2022/ngwr-action-sheet.mjs.map +1 -1
  15. package/fesm2022/ngwr-affix.mjs +3 -3
  16. package/fesm2022/ngwr-affix.mjs.map +1 -1
  17. package/fesm2022/ngwr-alert.mjs +3 -3
  18. package/fesm2022/ngwr-alert.mjs.map +1 -1
  19. package/fesm2022/ngwr-anchor.mjs +3 -3
  20. package/fesm2022/ngwr-anchor.mjs.map +1 -1
  21. package/fesm2022/ngwr-aurora.mjs +3 -3
  22. package/fesm2022/ngwr-aurora.mjs.map +1 -1
  23. package/fesm2022/ngwr-avatar.mjs +3 -3
  24. package/fesm2022/ngwr-avatar.mjs.map +1 -1
  25. package/fesm2022/ngwr-back-top.mjs +3 -3
  26. package/fesm2022/ngwr-back-top.mjs.map +1 -1
  27. package/fesm2022/ngwr-badge.mjs +28 -13
  28. package/fesm2022/ngwr-badge.mjs.map +1 -1
  29. package/fesm2022/ngwr-bar-chart-testing.mjs.map +1 -1
  30. package/fesm2022/ngwr-bar-chart.mjs +3 -3
  31. package/fesm2022/ngwr-bar-chart.mjs.map +1 -1
  32. package/fesm2022/ngwr-blur-text-testing.mjs.map +1 -1
  33. package/fesm2022/ngwr-blur-text.mjs +3 -3
  34. package/fesm2022/ngwr-blur-text.mjs.map +1 -1
  35. package/fesm2022/ngwr-border-glow-testing.mjs.map +1 -1
  36. package/fesm2022/ngwr-border-glow.mjs +3 -3
  37. package/fesm2022/ngwr-border-glow.mjs.map +1 -1
  38. package/fesm2022/ngwr-breadcrumbs.mjs +6 -6
  39. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  40. package/fesm2022/ngwr-burger.mjs +3 -3
  41. package/fesm2022/ngwr-burger.mjs.map +1 -1
  42. package/fesm2022/ngwr-button-testing.mjs.map +1 -1
  43. package/fesm2022/ngwr-button.mjs +6 -6
  44. package/fesm2022/ngwr-button.mjs.map +1 -1
  45. package/fesm2022/ngwr-calendar-heatmap-testing.mjs.map +1 -1
  46. package/fesm2022/ngwr-calendar-heatmap.mjs +3 -3
  47. package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
  48. package/fesm2022/ngwr-calendar-testing.mjs.map +1 -1
  49. package/fesm2022/ngwr-calendar.mjs +3 -3
  50. package/fesm2022/ngwr-calendar.mjs.map +1 -1
  51. package/fesm2022/ngwr-card.mjs +9 -9
  52. package/fesm2022/ngwr-card.mjs.map +1 -1
  53. package/fesm2022/ngwr-carousel-testing.mjs.map +1 -1
  54. package/fesm2022/ngwr-carousel.mjs +6 -6
  55. package/fesm2022/ngwr-carousel.mjs.map +1 -1
  56. package/fesm2022/ngwr-cascader-testing.mjs.map +1 -1
  57. package/fesm2022/ngwr-cascader.mjs +4 -4
  58. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  59. package/fesm2022/ngwr-checkbox-testing.mjs.map +1 -1
  60. package/fesm2022/ngwr-checkbox.mjs +6 -6
  61. package/fesm2022/ngwr-checkbox.mjs.map +1 -1
  62. package/fesm2022/ngwr-circular-text-testing.mjs.map +1 -1
  63. package/fesm2022/ngwr-circular-text.mjs +3 -3
  64. package/fesm2022/ngwr-circular-text.mjs.map +1 -1
  65. package/fesm2022/ngwr-click-spark.mjs +3 -3
  66. package/fesm2022/ngwr-click-spark.mjs.map +1 -1
  67. package/fesm2022/ngwr-clipboard.mjs +3 -3
  68. package/fesm2022/ngwr-clipboard.mjs.map +1 -1
  69. package/fesm2022/ngwr-collapse-testing.mjs.map +1 -1
  70. package/fesm2022/ngwr-collapse.mjs +9 -9
  71. package/fesm2022/ngwr-collapse.mjs.map +1 -1
  72. package/fesm2022/ngwr-color-picker-testing.mjs.map +1 -1
  73. package/fesm2022/ngwr-color-picker.mjs +6 -6
  74. package/fesm2022/ngwr-color-picker.mjs.map +1 -1
  75. package/fesm2022/ngwr-command-palette-testing.mjs.map +1 -1
  76. package/fesm2022/ngwr-command-palette.mjs +3 -3
  77. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  78. package/fesm2022/ngwr-compare.mjs +3 -3
  79. package/fesm2022/ngwr-compare.mjs.map +1 -1
  80. package/fesm2022/ngwr-confetti.mjs +3 -3
  81. package/fesm2022/ngwr-confetti.mjs.map +1 -1
  82. package/fesm2022/ngwr-config.mjs.map +1 -1
  83. package/fesm2022/ngwr-context-menu-testing.mjs.map +1 -1
  84. package/fesm2022/ngwr-context-menu.mjs +12 -12
  85. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  86. package/fesm2022/ngwr-cookie.mjs +3 -3
  87. package/fesm2022/ngwr-cookie.mjs.map +1 -1
  88. package/fesm2022/ngwr-counter.mjs +6 -6
  89. package/fesm2022/ngwr-counter.mjs.map +1 -1
  90. package/fesm2022/ngwr-date-adapters-fns.mjs +3 -3
  91. package/fesm2022/ngwr-date-adapters-fns.mjs.map +1 -1
  92. package/fesm2022/ngwr-date-adapters-luxon.mjs +3 -3
  93. package/fesm2022/ngwr-date-adapters-luxon.mjs.map +1 -1
  94. package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -1
  95. package/fesm2022/ngwr-date-picker.mjs +21 -21
  96. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  97. package/fesm2022/ngwr-date.mjs +3 -3
  98. package/fesm2022/ngwr-date.mjs.map +1 -1
  99. package/fesm2022/ngwr-decrypt-text-testing.mjs.map +1 -1
  100. package/fesm2022/ngwr-decrypt-text.mjs +3 -3
  101. package/fesm2022/ngwr-decrypt-text.mjs.map +1 -1
  102. package/fesm2022/ngwr-density.mjs +6 -6
  103. package/fesm2022/ngwr-density.mjs.map +1 -1
  104. package/fesm2022/ngwr-descriptions.mjs +6 -6
  105. package/fesm2022/ngwr-descriptions.mjs.map +1 -1
  106. package/fesm2022/ngwr-dialog-testing.mjs.map +1 -1
  107. package/fesm2022/ngwr-dialog.mjs +15 -15
  108. package/fesm2022/ngwr-dialog.mjs.map +1 -1
  109. package/fesm2022/ngwr-directives.mjs +12 -12
  110. package/fesm2022/ngwr-directives.mjs.map +1 -1
  111. package/fesm2022/ngwr-divider.mjs +3 -3
  112. package/fesm2022/ngwr-divider.mjs.map +1 -1
  113. package/fesm2022/ngwr-donut-chart-testing.mjs.map +1 -1
  114. package/fesm2022/ngwr-donut-chart.mjs +3 -3
  115. package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
  116. package/fesm2022/ngwr-drag-drop.mjs +6 -6
  117. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  118. package/fesm2022/ngwr-drawer-testing.mjs.map +1 -1
  119. package/fesm2022/ngwr-drawer.mjs +18 -18
  120. package/fesm2022/ngwr-drawer.mjs.map +1 -1
  121. package/fesm2022/ngwr-dropdown-testing.mjs.map +1 -1
  122. package/fesm2022/ngwr-dropdown.mjs +9 -9
  123. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  124. package/fesm2022/ngwr-editor-testing.mjs +568 -0
  125. package/fesm2022/ngwr-editor-testing.mjs.map +1 -0
  126. package/fesm2022/ngwr-editor.mjs +2601 -0
  127. package/fesm2022/ngwr-editor.mjs.map +1 -0
  128. package/fesm2022/ngwr-empty.mjs +3 -3
  129. package/fesm2022/ngwr-empty.mjs.map +1 -1
  130. package/fesm2022/ngwr-event-calendar-testing.mjs.map +1 -1
  131. package/fesm2022/ngwr-event-calendar.mjs +6 -6
  132. package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
  133. package/fesm2022/ngwr-falling-text-testing.mjs.map +1 -1
  134. package/fesm2022/ngwr-falling-text.mjs +3 -3
  135. package/fesm2022/ngwr-falling-text.mjs.map +1 -1
  136. package/fesm2022/ngwr-file-upload-testing.mjs.map +1 -1
  137. package/fesm2022/ngwr-file-upload.mjs +3 -3
  138. package/fesm2022/ngwr-file-upload.mjs.map +1 -1
  139. package/fesm2022/ngwr-form-testing.mjs.map +1 -1
  140. package/fesm2022/ngwr-form.mjs +9 -9
  141. package/fesm2022/ngwr-form.mjs.map +1 -1
  142. package/fesm2022/ngwr-fuzzy-text-testing.mjs.map +1 -1
  143. package/fesm2022/ngwr-fuzzy-text.mjs +3 -3
  144. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
  145. package/fesm2022/ngwr-gauge-testing.mjs.map +1 -1
  146. package/fesm2022/ngwr-gauge.mjs +3 -3
  147. package/fesm2022/ngwr-gauge.mjs.map +1 -1
  148. package/fesm2022/ngwr-glitch-text-testing.mjs.map +1 -1
  149. package/fesm2022/ngwr-glitch-text.mjs +3 -3
  150. package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
  151. package/fesm2022/ngwr-gradient-text-testing.mjs.map +1 -1
  152. package/fesm2022/ngwr-gradient-text.mjs +3 -3
  153. package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
  154. package/fesm2022/ngwr-graph-testing.mjs.map +1 -1
  155. package/fesm2022/ngwr-graph.mjs +6 -6
  156. package/fesm2022/ngwr-graph.mjs.map +1 -1
  157. package/fesm2022/ngwr-hotkey.mjs +6 -6
  158. package/fesm2022/ngwr-hotkey.mjs.map +1 -1
  159. package/fesm2022/ngwr-i18n-ar.mjs +29 -0
  160. package/fesm2022/ngwr-i18n-ar.mjs.map +1 -1
  161. package/fesm2022/ngwr-i18n-cs.mjs +29 -0
  162. package/fesm2022/ngwr-i18n-cs.mjs.map +1 -1
  163. package/fesm2022/ngwr-i18n-de.mjs +29 -0
  164. package/fesm2022/ngwr-i18n-de.mjs.map +1 -1
  165. package/fesm2022/ngwr-i18n-en.mjs +34 -0
  166. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  167. package/fesm2022/ngwr-i18n-es.mjs +29 -0
  168. package/fesm2022/ngwr-i18n-es.mjs.map +1 -1
  169. package/fesm2022/ngwr-i18n-fr.mjs +29 -0
  170. package/fesm2022/ngwr-i18n-fr.mjs.map +1 -1
  171. package/fesm2022/ngwr-i18n-he.mjs +29 -0
  172. package/fesm2022/ngwr-i18n-he.mjs.map +1 -1
  173. package/fesm2022/ngwr-i18n-hi.mjs +29 -0
  174. package/fesm2022/ngwr-i18n-hi.mjs.map +1 -1
  175. package/fesm2022/ngwr-i18n-id.mjs +29 -0
  176. package/fesm2022/ngwr-i18n-id.mjs.map +1 -1
  177. package/fesm2022/ngwr-i18n-it.mjs +29 -0
  178. package/fesm2022/ngwr-i18n-it.mjs.map +1 -1
  179. package/fesm2022/ngwr-i18n-ja.mjs +29 -0
  180. package/fesm2022/ngwr-i18n-ja.mjs.map +1 -1
  181. package/fesm2022/ngwr-i18n-ko.mjs +29 -0
  182. package/fesm2022/ngwr-i18n-ko.mjs.map +1 -1
  183. package/fesm2022/ngwr-i18n-nl.mjs +29 -0
  184. package/fesm2022/ngwr-i18n-nl.mjs.map +1 -1
  185. package/fesm2022/ngwr-i18n-pl.mjs +29 -0
  186. package/fesm2022/ngwr-i18n-pl.mjs.map +1 -1
  187. package/fesm2022/ngwr-i18n-pt.mjs +29 -0
  188. package/fesm2022/ngwr-i18n-pt.mjs.map +1 -1
  189. package/fesm2022/ngwr-i18n-ru.mjs +29 -0
  190. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  191. package/fesm2022/ngwr-i18n-sv.mjs +29 -0
  192. package/fesm2022/ngwr-i18n-sv.mjs.map +1 -1
  193. package/fesm2022/ngwr-i18n-tr.mjs +29 -0
  194. package/fesm2022/ngwr-i18n-tr.mjs.map +1 -1
  195. package/fesm2022/ngwr-i18n-uk.mjs +29 -0
  196. package/fesm2022/ngwr-i18n-uk.mjs.map +1 -1
  197. package/fesm2022/ngwr-i18n-vi.mjs +29 -0
  198. package/fesm2022/ngwr-i18n-vi.mjs.map +1 -1
  199. package/fesm2022/ngwr-i18n-zh-TW.mjs +29 -0
  200. package/fesm2022/ngwr-i18n-zh-TW.mjs.map +1 -1
  201. package/fesm2022/ngwr-i18n-zh.mjs +29 -0
  202. package/fesm2022/ngwr-i18n-zh.mjs.map +1 -1
  203. package/fesm2022/ngwr-i18n.mjs +9 -9
  204. package/fesm2022/ngwr-i18n.mjs.map +1 -1
  205. package/fesm2022/ngwr-icon-adapters-feather.mjs.map +1 -1
  206. package/fesm2022/ngwr-icon-adapters-lucide.mjs.map +1 -1
  207. package/fesm2022/ngwr-icon.mjs +6 -6
  208. package/fesm2022/ngwr-icon.mjs.map +1 -1
  209. package/fesm2022/ngwr-image-cropper-testing.mjs.map +1 -1
  210. package/fesm2022/ngwr-image-cropper.mjs +3 -3
  211. package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
  212. package/fesm2022/ngwr-input-number-testing.mjs.map +1 -1
  213. package/fesm2022/ngwr-input-number.mjs +3 -3
  214. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  215. package/fesm2022/ngwr-input-otp-testing.mjs.map +1 -1
  216. package/fesm2022/ngwr-input-otp.mjs +3 -3
  217. package/fesm2022/ngwr-input-otp.mjs.map +1 -1
  218. package/fesm2022/ngwr-input-testing.mjs.map +1 -1
  219. package/fesm2022/ngwr-input.mjs +15 -15
  220. package/fesm2022/ngwr-input.mjs.map +1 -1
  221. package/fesm2022/ngwr-keyboard.mjs +3 -3
  222. package/fesm2022/ngwr-keyboard.mjs.map +1 -1
  223. package/fesm2022/ngwr-knob-testing.mjs.map +1 -1
  224. package/fesm2022/ngwr-knob.mjs +3 -3
  225. package/fesm2022/ngwr-knob.mjs.map +1 -1
  226. package/fesm2022/ngwr-layout.mjs +15 -15
  227. package/fesm2022/ngwr-layout.mjs.map +1 -1
  228. package/fesm2022/ngwr-lightbox-testing.mjs.map +1 -1
  229. package/fesm2022/ngwr-lightbox.mjs +3 -3
  230. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  231. package/fesm2022/ngwr-line-chart-testing.mjs.map +1 -1
  232. package/fesm2022/ngwr-line-chart.mjs +3 -3
  233. package/fesm2022/ngwr-line-chart.mjs.map +1 -1
  234. package/fesm2022/ngwr-list.mjs +6 -6
  235. package/fesm2022/ngwr-list.mjs.map +1 -1
  236. package/fesm2022/ngwr-loading-bar-router.mjs.map +1 -1
  237. package/fesm2022/ngwr-loading-bar.mjs +6 -6
  238. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  239. package/fesm2022/ngwr-markdown-testing.mjs.map +1 -1
  240. package/fesm2022/ngwr-markdown.mjs +798 -17
  241. package/fesm2022/ngwr-markdown.mjs.map +1 -1
  242. package/fesm2022/ngwr-marquee-testing.mjs.map +1 -1
  243. package/fesm2022/ngwr-marquee.mjs +3 -3
  244. package/fesm2022/ngwr-marquee.mjs.map +1 -1
  245. package/fesm2022/ngwr-media.mjs +3 -3
  246. package/fesm2022/ngwr-media.mjs.map +1 -1
  247. package/fesm2022/ngwr-mention-testing.mjs.map +1 -1
  248. package/fesm2022/ngwr-mention.mjs +6 -6
  249. package/fesm2022/ngwr-mention.mjs.map +1 -1
  250. package/fesm2022/ngwr-meta.mjs +6 -6
  251. package/fesm2022/ngwr-meta.mjs.map +1 -1
  252. package/fesm2022/ngwr-meter-group-testing.mjs.map +1 -1
  253. package/fesm2022/ngwr-meter-group.mjs +3 -3
  254. package/fesm2022/ngwr-meter-group.mjs.map +1 -1
  255. package/fesm2022/ngwr-overlay.mjs +6 -6
  256. package/fesm2022/ngwr-overlay.mjs.map +1 -1
  257. package/fesm2022/ngwr-page-header.mjs +3 -3
  258. package/fesm2022/ngwr-page-header.mjs.map +1 -1
  259. package/fesm2022/ngwr-pagination-testing.mjs.map +1 -1
  260. package/fesm2022/ngwr-pagination.mjs +3 -3
  261. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  262. package/fesm2022/ngwr-pipes.mjs +21 -21
  263. package/fesm2022/ngwr-pipes.mjs.map +1 -1
  264. package/fesm2022/ngwr-platform.mjs +9 -9
  265. package/fesm2022/ngwr-platform.mjs.map +1 -1
  266. package/fesm2022/ngwr-popconfirm-testing.mjs.map +1 -1
  267. package/fesm2022/ngwr-popconfirm.mjs +6 -6
  268. package/fesm2022/ngwr-popconfirm.mjs.map +1 -1
  269. package/fesm2022/ngwr-popover-testing.mjs.map +1 -1
  270. package/fesm2022/ngwr-popover.mjs +12 -12
  271. package/fesm2022/ngwr-popover.mjs.map +1 -1
  272. package/fesm2022/ngwr-progress.mjs +3 -3
  273. package/fesm2022/ngwr-progress.mjs.map +1 -1
  274. package/fesm2022/ngwr-pull-to-refresh.mjs +3 -3
  275. package/fesm2022/ngwr-pull-to-refresh.mjs.map +1 -1
  276. package/fesm2022/ngwr-qr.mjs +3 -3
  277. package/fesm2022/ngwr-qr.mjs.map +1 -1
  278. package/fesm2022/ngwr-radio-testing.mjs.map +1 -1
  279. package/fesm2022/ngwr-radio.mjs +6 -6
  280. package/fesm2022/ngwr-radio.mjs.map +1 -1
  281. package/fesm2022/ngwr-rating-testing.mjs.map +1 -1
  282. package/fesm2022/ngwr-rating.mjs +3 -3
  283. package/fesm2022/ngwr-rating.mjs.map +1 -1
  284. package/fesm2022/ngwr-result.mjs +12 -12
  285. package/fesm2022/ngwr-result.mjs.map +1 -1
  286. package/fesm2022/ngwr-rotating-text-testing.mjs.map +1 -1
  287. package/fesm2022/ngwr-rotating-text.mjs +3 -3
  288. package/fesm2022/ngwr-rotating-text.mjs.map +1 -1
  289. package/fesm2022/ngwr-schema-form.mjs +3 -3
  290. package/fesm2022/ngwr-schema-form.mjs.map +1 -1
  291. package/fesm2022/ngwr-scroll.mjs +3 -3
  292. package/fesm2022/ngwr-scroll.mjs.map +1 -1
  293. package/fesm2022/ngwr-segmented-testing.mjs.map +1 -1
  294. package/fesm2022/ngwr-segmented.mjs +3 -3
  295. package/fesm2022/ngwr-segmented.mjs.map +1 -1
  296. package/fesm2022/ngwr-select-testing.mjs.map +1 -1
  297. package/fesm2022/ngwr-select.mjs +12 -12
  298. package/fesm2022/ngwr-select.mjs.map +1 -1
  299. package/fesm2022/ngwr-shiny-text-testing.mjs.map +1 -1
  300. package/fesm2022/ngwr-shiny-text.mjs +6 -6
  301. package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
  302. package/fesm2022/ngwr-sidebar.mjs +3 -3
  303. package/fesm2022/ngwr-sidebar.mjs.map +1 -1
  304. package/fesm2022/ngwr-skeleton.mjs +3 -3
  305. package/fesm2022/ngwr-skeleton.mjs.map +1 -1
  306. package/fesm2022/ngwr-slider-testing.mjs.map +1 -1
  307. package/fesm2022/ngwr-slider.mjs +3 -3
  308. package/fesm2022/ngwr-slider.mjs.map +1 -1
  309. package/fesm2022/ngwr-sparkline-testing.mjs.map +1 -1
  310. package/fesm2022/ngwr-sparkline.mjs +3 -3
  311. package/fesm2022/ngwr-sparkline.mjs.map +1 -1
  312. package/fesm2022/ngwr-speed-dial-testing.mjs.map +1 -1
  313. package/fesm2022/ngwr-speed-dial.mjs +3 -3
  314. package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
  315. package/fesm2022/ngwr-spinner.mjs +3 -3
  316. package/fesm2022/ngwr-spinner.mjs.map +1 -1
  317. package/fesm2022/ngwr-splash-cursor-testing.mjs.map +1 -1
  318. package/fesm2022/ngwr-splash-cursor.mjs +3 -3
  319. package/fesm2022/ngwr-splash-cursor.mjs.map +1 -1
  320. package/fesm2022/ngwr-split-text-testing.mjs.map +1 -1
  321. package/fesm2022/ngwr-split-text.mjs +3 -3
  322. package/fesm2022/ngwr-split-text.mjs.map +1 -1
  323. package/fesm2022/ngwr-splitter-testing.mjs.map +1 -1
  324. package/fesm2022/ngwr-splitter.mjs +3 -3
  325. package/fesm2022/ngwr-splitter.mjs.map +1 -1
  326. package/fesm2022/ngwr-spotlight-card-testing.mjs.map +1 -1
  327. package/fesm2022/ngwr-spotlight-card.mjs +6 -6
  328. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  329. package/fesm2022/ngwr-squircle.mjs +6 -6
  330. package/fesm2022/ngwr-squircle.mjs.map +1 -1
  331. package/fesm2022/ngwr-star-border-testing.mjs.map +1 -1
  332. package/fesm2022/ngwr-star-border.mjs +3 -3
  333. package/fesm2022/ngwr-star-border.mjs.map +1 -1
  334. package/fesm2022/ngwr-statistic.mjs +9 -9
  335. package/fesm2022/ngwr-statistic.mjs.map +1 -1
  336. package/fesm2022/ngwr-stepper-testing.mjs.map +1 -1
  337. package/fesm2022/ngwr-stepper.mjs +6 -6
  338. package/fesm2022/ngwr-stepper.mjs.map +1 -1
  339. package/fesm2022/ngwr-storage.mjs +3 -3
  340. package/fesm2022/ngwr-storage.mjs.map +1 -1
  341. package/fesm2022/ngwr-switch-testing.mjs.map +1 -1
  342. package/fesm2022/ngwr-switch.mjs +3 -3
  343. package/fesm2022/ngwr-switch.mjs.map +1 -1
  344. package/fesm2022/ngwr-table-testing.mjs.map +1 -1
  345. package/fesm2022/ngwr-table.mjs +18 -18
  346. package/fesm2022/ngwr-table.mjs.map +1 -1
  347. package/fesm2022/ngwr-tabs-router.mjs +3 -3
  348. package/fesm2022/ngwr-tabs-router.mjs.map +1 -1
  349. package/fesm2022/ngwr-tabs-testing.mjs.map +1 -1
  350. package/fesm2022/ngwr-tabs.mjs +6 -6
  351. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  352. package/fesm2022/ngwr-textarea-testing.mjs.map +1 -1
  353. package/fesm2022/ngwr-textarea.mjs +3 -3
  354. package/fesm2022/ngwr-textarea.mjs.map +1 -1
  355. package/fesm2022/ngwr-theme.mjs +3 -3
  356. package/fesm2022/ngwr-theme.mjs.map +1 -1
  357. package/fesm2022/ngwr-tilt-card-testing.mjs.map +1 -1
  358. package/fesm2022/ngwr-tilt-card.mjs +6 -6
  359. package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
  360. package/fesm2022/ngwr-timeline.mjs +6 -6
  361. package/fesm2022/ngwr-timeline.mjs.map +1 -1
  362. package/fesm2022/ngwr-toast-testing.mjs.map +1 -1
  363. package/fesm2022/ngwr-toast.mjs +9 -9
  364. package/fesm2022/ngwr-toast.mjs.map +1 -1
  365. package/fesm2022/ngwr-toolbar.mjs +3 -3
  366. package/fesm2022/ngwr-toolbar.mjs.map +1 -1
  367. package/fesm2022/ngwr-tour-testing.mjs.map +1 -1
  368. package/fesm2022/ngwr-tour.mjs +6 -6
  369. package/fesm2022/ngwr-tour.mjs.map +1 -1
  370. package/fesm2022/ngwr-transfer-testing.mjs.map +1 -1
  371. package/fesm2022/ngwr-transfer.mjs +3 -3
  372. package/fesm2022/ngwr-transfer.mjs.map +1 -1
  373. package/fesm2022/ngwr-tree-testing.mjs.map +1 -1
  374. package/fesm2022/ngwr-tree.mjs +3 -3
  375. package/fesm2022/ngwr-tree.mjs.map +1 -1
  376. package/fesm2022/ngwr-typewriter-testing.mjs.map +1 -1
  377. package/fesm2022/ngwr-typewriter.mjs +3 -3
  378. package/fesm2022/ngwr-typewriter.mjs.map +1 -1
  379. package/fesm2022/ngwr-typography.mjs +7 -3
  380. package/fesm2022/ngwr-typography.mjs.map +1 -1
  381. package/fesm2022/ngwr-utils.mjs.map +1 -1
  382. package/fesm2022/ngwr-validators.mjs.map +1 -1
  383. package/fesm2022/ngwr-version.mjs +1 -1
  384. package/fesm2022/ngwr-version.mjs.map +1 -1
  385. package/fesm2022/ngwr-virtual-scroll.mjs +3 -3
  386. package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
  387. package/fesm2022/ngwr-waves-testing.mjs.map +1 -1
  388. package/fesm2022/ngwr-waves.mjs +3 -3
  389. package/fesm2022/ngwr-waves.mjs.map +1 -1
  390. package/fesm2022/ngwr-window-testing.mjs.map +1 -1
  391. package/fesm2022/ngwr-window.mjs +12 -12
  392. package/fesm2022/ngwr-window.mjs.map +1 -1
  393. package/form/styles/_index.scss +5 -0
  394. package/i18n/ar.json +29 -0
  395. package/i18n/cs.json +29 -0
  396. package/i18n/de.json +29 -0
  397. package/i18n/en.json +29 -0
  398. package/i18n/es.json +29 -0
  399. package/i18n/fr.json +29 -0
  400. package/i18n/he.json +29 -0
  401. package/i18n/hi.json +29 -0
  402. package/i18n/id.json +29 -0
  403. package/i18n/it.json +29 -0
  404. package/i18n/ja.json +29 -0
  405. package/i18n/ko.json +29 -0
  406. package/i18n/nl.json +29 -0
  407. package/i18n/pl.json +29 -0
  408. package/i18n/pt.json +29 -0
  409. package/i18n/ru.json +29 -0
  410. package/i18n/sv.json +29 -0
  411. package/i18n/tr.json +29 -0
  412. package/i18n/uk.json +29 -0
  413. package/i18n/vi.json +29 -0
  414. package/i18n/zh-TW.json +29 -0
  415. package/i18n/zh.json +29 -0
  416. package/input/styles/_index.scss +5 -1
  417. package/input-otp/styles/_index.scss +5 -5
  418. package/llms-full.txt +11 -1
  419. package/llms.txt +188 -132
  420. package/mcp/providers.js +2 -2
  421. package/mcp/server.js +1 -1
  422. package/overlay/styles/_arrow.scss +3 -0
  423. package/package.json +43 -2
  424. package/progress/styles/_index.scss +4 -0
  425. package/radio/styles/_index.scss +4 -1
  426. package/schematics/use/symbol-map.json +1 -0
  427. package/select/styles/_index.scss +3 -3
  428. package/sidebar/styles/_index.scss +10 -0
  429. package/skeleton/styles/_index.scss +3 -0
  430. package/skills/ngwr/SKILL.md +5 -5
  431. package/skills/ngwr/references/catalog.md +2 -0
  432. package/skills/ngwr/references/setup.md +3 -3
  433. package/styles.scss +1 -0
  434. package/table/styles/_index.scss +7 -0
  435. package/textarea/styles/_index.scss +12 -3
  436. package/theme/styles/_colors.scss +39 -13
  437. package/theme/styles/_contrast.scss +9 -7
  438. package/toast/styles/_index.scss +4 -0
  439. package/tree/styles/_index.scss +1 -1
  440. package/types/ngwr-badge.d.ts +22 -7
  441. package/types/ngwr-config.d.ts +12 -0
  442. package/types/ngwr-editor-testing.d.ts +378 -0
  443. package/types/ngwr-editor.d.ts +449 -0
  444. package/types/ngwr-markdown.d.ts +61 -2
  445. package/types/ngwr-typography.d.ts +4 -0
  446. package/types/ngwr-version.d.ts +1 -1
  447. package/typography/styles/_index.scss +16 -0
@@ -0,0 +1,449 @@
1
+ import * as ngwr_form from 'ngwr/form';
2
+ import { WrFormFieldContext } from 'ngwr/form';
3
+ import * as _angular_core from '@angular/core';
4
+ import { Signal } from '@angular/core';
5
+ import { FormValueControl } from '@angular/forms/signals';
6
+
7
+ /**
8
+ * @license
9
+ *
10
+ * Use of this source code is governed by an MIT-style license that can be
11
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
12
+ */
13
+ /**
14
+ * What `<wr-editor>` reads from and writes into its `value` model.
15
+ *
16
+ * - `html` — an HTML string, parsed without executing anything and rebuilt from
17
+ * the editor's own schema on the way out, so only what the schema allows comes
18
+ * back. `''` for an empty document.
19
+ * - `markdown` — the dialect `ngwr/markdown` reads and `<wr-markdown>` renders,
20
+ * written back by `serializeMarkdown`. Markdown has no underline, so the
21
+ * underline tool and its shortcut are absent in this format. `''` for an empty
22
+ * document.
23
+ * - `json` — the document as a {@link WrEditorJson} tree. `null` for an empty
24
+ * document.
25
+ */
26
+ type WrEditorFormat = 'html' | 'markdown' | 'json';
27
+
28
+ /**
29
+ * @license
30
+ *
31
+ * Use of this source code is governed by an MIT-style license that can be
32
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
33
+ */
34
+ /**
35
+ * One mark on a {@link WrEditorJson} node — `strong`, `em`, `underline`,
36
+ * `strike`, `code`, or `link` with `{ href, title }`.
37
+ */
38
+ interface WrEditorMarkJson {
39
+ readonly type: string;
40
+ readonly attrs?: Readonly<Record<string, unknown>>;
41
+ }
42
+ /**
43
+ * The editor's document as plain data — the shape ProseMirror's `toJSON()`
44
+ * writes, declared here so no ProseMirror type reaches the public API.
45
+ *
46
+ * Nodes: `doc`, `paragraph`, `heading` (`level` 1–3), `blockquote`,
47
+ * `code_block` (`language`), `horizontal_rule`, `bullet_list` (`tight`),
48
+ * `ordered_list` (`order`, `tight`), `list_item` (`checked`: `true`, `false`
49
+ * or `null` for an ordinary item), `hard_break`, `image` (`src`, `alt`,
50
+ * `title`), `table`, `table_row`, `table_header` / `table_cell` (`align`) and
51
+ * `text`.
52
+ *
53
+ * A value bound in `json` format is VALIDATED, not trusted: an unknown node or
54
+ * mark, an attribute outside its allowed set, a content rule broken, or a link
55
+ * or image whose URL `safeMarkdownUrl` refuses, and the whole value is refused —
56
+ * the editor keeps what it had and warns in dev mode.
57
+ */
58
+ interface WrEditorJson {
59
+ readonly type: string;
60
+ readonly attrs?: Readonly<Record<string, unknown>>;
61
+ readonly content?: readonly WrEditorJson[];
62
+ readonly marks?: readonly WrEditorMarkJson[];
63
+ readonly text?: string;
64
+ }
65
+
66
+ /**
67
+ * @license
68
+ *
69
+ * Use of this source code is governed by an MIT-style license that can be
70
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
71
+ */
72
+ /**
73
+ * One entry of `<wr-editor>`'s `toolbar` input.
74
+ *
75
+ * - Marks: `bold`, `italic`, `underline` (absent in `markdown` format, which
76
+ * cannot express it), `strike`, `code`.
77
+ * - Blocks: `paragraph`, `heading1`, `heading2`, `heading3`, `bulletList`,
78
+ * `orderedList`, `blockquote`, `codeBlock`.
79
+ * - Inserts: `link` (opens the link panel), `horizontalRule`.
80
+ * - History: `undo`, `redo`.
81
+ * - `'|'` draws a separator between two groups.
82
+ */
83
+ type WrEditorTool = 'bold' | 'italic' | 'underline' | 'strike' | 'code' | 'paragraph' | 'heading1' | 'heading2' | 'heading3' | 'bulletList' | 'orderedList' | 'blockquote' | 'codeBlock' | 'link' | 'horizontalRule' | 'undo' | 'redo' | '|';
84
+
85
+ /**
86
+ * @license
87
+ *
88
+ * Use of this source code is governed by an MIT-style license that can be
89
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
90
+ */
91
+
92
+ /**
93
+ * The `value` model of `<wr-editor>`: a string in `html` and `markdown` format,
94
+ * a {@link WrEditorJson} tree in `json` format.
95
+ *
96
+ * An empty document is written as `''` in the two string formats and as `null`
97
+ * in `json`, so a Signal Forms `required()` rule reports an empty editor as
98
+ * empty — `'<p></p>'` would be a non-empty string. `null` and `''` are both
99
+ * read as an empty document in every format.
100
+ */
101
+ type WrEditorValue = string | WrEditorJson | null;
102
+
103
+ /**
104
+ * @license
105
+ *
106
+ * Use of this source code is governed by an MIT-style license that can be
107
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
108
+ */
109
+
110
+ /** Every tool but the separator. */
111
+ type WrEditorCommandTool = Exclude<WrEditorTool, '|'>;
112
+
113
+ /**
114
+ * The field the link panel's URL input belongs to — provided as `WR_FORM_FIELD`
115
+ * for the editor's whole subtree.
116
+ *
117
+ * It does two jobs at once. It is the SHIELD every composite control needs: the
118
+ * editor is the control a `<wr-form-field>` wraps, and without a nearer provider
119
+ * the `[wrInput]` in its link panel would adopt the outer field's id, take over
120
+ * its label and announce its error as its own. And it is the input's own field:
121
+ * `[wrInput]` binds `id`, `aria-invalid` and `aria-describedby` from whatever
122
+ * field it finds, so answering here is how a refused URL reaches a screen reader
123
+ * without binding attributes the directive already owns.
124
+ *
125
+ * @internal
126
+ */
127
+ declare class WrEditorLinkField implements WrFormFieldContext {
128
+ private readonly id;
129
+ /** The URL just submitted was refused by the link policy. */
130
+ readonly invalid: _angular_core.WritableSignal<boolean>;
131
+ readonly controlId: _angular_core.Signal<string>;
132
+ readonly errorId: string;
133
+ readonly panelId: string;
134
+ readonly errorKeys: _angular_core.Signal<readonly string[]>;
135
+ readonly describedBy: _angular_core.Signal<string | null>;
136
+ readonly labelId: _angular_core.Signal<string | null>;
137
+ adoptControlId(): void;
138
+ }
139
+
140
+ /** One toolbar button's state at the current selection. */
141
+ interface WrToolState {
142
+ readonly tool: WrEditorCommandTool;
143
+ readonly active: boolean;
144
+ readonly available: boolean;
145
+ }
146
+ /**
147
+ * Rich-text editor on ProseMirror, with a toolbar, a link panel, keyboard
148
+ * shortcuts and markdown-style block shortcuts (`# `, `> `, `- `, `1. `,
149
+ * ` ``` `).
150
+ *
151
+ * A signal-forms native control: it implements `FormValueControl<WrEditorValue>`,
152
+ * so `[formField]` binds straight to its `value` model — no
153
+ * `ControlValueAccessor` in between. `[(value)]` works standalone.
154
+ *
155
+ * The value is an HTML string, a markdown string or the document as JSON, chosen
156
+ * by `format`. Whatever arrives is treated as untrusted and rebuilt from the
157
+ * editor's schema, so only what the schema allows survives, and links and images
158
+ * go through `safeMarkdownUrl` in all three. A value the editor cannot read is
159
+ * refused — the document it already shows is kept, a warning names the reason in
160
+ * dev mode, and nothing is written back. Until a value it CAN read arrives the
161
+ * editor is read-only and carries `wr-editor--refused`: the model still holds the
162
+ * refused value, and an edit would write the document on screen over it.
163
+ *
164
+ * Headings stop at three levels: an h4–h6 read from HTML or markdown becomes an
165
+ * h3 rather than a paragraph. Underline exists in `html` and `json` only —
166
+ * markdown cannot spell it, so in that format the tool, the shortcut and the mark
167
+ * itself are absent.
168
+ *
169
+ * ProseMirror is an OPTIONAL peer dependency: only an app that imports
170
+ * `ngwr/editor` installs `prosemirror-model`, `-state`, `-view`, `-commands`,
171
+ * `-keymap`, `-history`, `-schema-list` and `-inputrules`.
172
+ *
173
+ * @example
174
+ * ```html
175
+ * <!-- signal forms -->
176
+ * <wr-editor format="markdown" placeholder="Describe the change" [formField]="form.body" />
177
+ *
178
+ * <!-- standalone two-way binding -->
179
+ * <wr-editor [(value)]="html" />
180
+ * ```
181
+ *
182
+ * @see https://ngwr.dev/reference/components/editor
183
+ */
184
+ declare class WrEditor implements FormValueControl<WrEditorValue> {
185
+ /**
186
+ * The document. A string in `html` and `markdown` format, a
187
+ * {@link WrEditorJson} tree in `json`; `''` / `null` when nothing is written.
188
+ * Bound by `[formField]`, or two-way via `[(value)]`.
189
+ */
190
+ readonly value: _angular_core.ModelSignal<WrEditorValue>;
191
+ /** Emitted on blur so a bound field can mark itself touched. */
192
+ readonly touch: _angular_core.OutputEmitterRef<void>;
193
+ /**
194
+ * Disable the editor and its toolbar. Bound automatically from the field's
195
+ * disabled state when used with `[formField]`.
196
+ *
197
+ * @default false
198
+ */
199
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, any>;
200
+ /**
201
+ * Refuse edits while the text stays focusable, selectable and announced.
202
+ * Bound automatically from the field's readonly state when used with
203
+ * `[formField]`.
204
+ *
205
+ * The surface keeps its tab stop and reports `aria-readonly`; typing, paste,
206
+ * drop, the shortcuts and every toolbar command are refused. The toolbar goes
207
+ * inert, since none of its tools can apply.
208
+ *
209
+ * @default false
210
+ */
211
+ readonly readonly: _angular_core.InputSignalWithTransform<boolean, any>;
212
+ /**
213
+ * Hint shown while the document is empty, and exposed as `aria-placeholder`.
214
+ *
215
+ * @default ''
216
+ */
217
+ readonly placeholder: _angular_core.InputSignal<string>;
218
+ /**
219
+ * Accessible name of the text surface. Falls back to the surrounding
220
+ * `<wr-form-field>`'s label, then to `editor.label`.
221
+ */
222
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
223
+ /**
224
+ * What `value` holds — see {@link WrEditorFormat}. Unset, it falls back to
225
+ * `provideWrConfig({ editor: { format } })`. Changing it re-reads `value` in
226
+ * the new format.
227
+ *
228
+ * @default 'html'
229
+ */
230
+ readonly format: _angular_core.InputSignal<WrEditorFormat | null>;
231
+ protected readonly resolvedFormat: Signal<"html" | "markdown" | "json">;
232
+ /**
233
+ * The toolbar's tools, in order, with `'|'` between groups; `false` hides it.
234
+ * `underline` is left out in `markdown` format, which cannot store it.
235
+ *
236
+ * @default WR_EDITOR_TOOLBAR
237
+ */
238
+ readonly toolbar: _angular_core.InputSignal<false | readonly WrEditorTool[]>;
239
+ private readonly document;
240
+ private readonly injector;
241
+ private readonly destroyRef;
242
+ private readonly host;
243
+ private readonly platform;
244
+ private readonly isBrowser;
245
+ /**
246
+ * Ambient reading direction, read by the toolbar's arrow keys. Optional so a
247
+ * bare `TestBed` needs no provider; `null` means LTR.
248
+ */
249
+ private readonly dir;
250
+ /** @internal */
251
+ protected readonly linkField: WrEditorLinkField;
252
+ /** The surrounding `<wr-form-field>`'s error state, read past the editor's own shield. @internal */
253
+ protected readonly fieldAria: ngwr_form.WrFormFieldAria;
254
+ protected readonly resolvedAriaLabel: Signal<string>;
255
+ /**
256
+ * The field's label names the surface, when there is one — a
257
+ * `contenteditable` is not labelable, so the field's `<label for>` cannot
258
+ * reach it. An explicit `ariaLabel` still wins over both.
259
+ */
260
+ protected readonly labelledBy: Signal<string | null>;
261
+ /** `null` while the field's label carries the name. */
262
+ protected readonly accessibleName: Signal<string | null>;
263
+ protected readonly surfaceId: string;
264
+ /** ProseMirror owns the surface from here on; until then the preview stands in. */
265
+ protected readonly mounted: _angular_core.WritableSignal<boolean>;
266
+ protected readonly focused: _angular_core.WritableSignal<boolean>;
267
+ private readonly editorState;
268
+ /**
269
+ * Whether `value` holds something the editor could not read, so the document
270
+ * on screen is not the one the model holds — empty at mount, or the previous
271
+ * record after a write. Edits are refused until a readable value arrives:
272
+ * the first keystroke would otherwise replace the stored value with whatever
273
+ * is on screen, and the only sign of it was a dev-mode warning.
274
+ */
275
+ private readonly refused;
276
+ /** Read-only by the input, or because the value was refused. @internal */
277
+ protected readonly locked: Signal<boolean>;
278
+ /** Apple keyboards name the modifier ⌘. Read in the browser only — see `mount()`. */
279
+ private readonly apple;
280
+ private readonly surface;
281
+ private readonly toolButtons;
282
+ private readonly linkPopover;
283
+ private view;
284
+ /** The format the live document was read in, which is the format it is written in. */
285
+ private viewFormat;
286
+ /**
287
+ * The value the live document was last read from or written as. A write from
288
+ * outside that equals it is the document already on screen — an echo of the
289
+ * editor's own emit, or a consumer writing back what it was handed — and must
290
+ * neither re-parse nor reset the selection.
291
+ */
292
+ private lastSerialized;
293
+ private linkToSurface;
294
+ protected readonly toolbarLabel: Signal<string>;
295
+ protected readonly linkUrlLabel: Signal<string>;
296
+ protected readonly linkApplyLabel: Signal<string>;
297
+ protected readonly linkRemoveLabel: Signal<string>;
298
+ protected readonly linkInvalidLabel: Signal<string>;
299
+ protected readonly taskDoneLabel: Signal<string>;
300
+ protected readonly taskTodoLabel: Signal<string>;
301
+ private readonly keyCtrl;
302
+ private readonly keyShift;
303
+ private readonly keyAlt;
304
+ private readonly headingLabel;
305
+ private readonly shortcutLabel;
306
+ private readonly toolLabels;
307
+ /**
308
+ * The bound tools as drawn: underline dropped where the format cannot store
309
+ * it, and separators only BETWEEN two groups — a leading, trailing or doubled
310
+ * one would be left behind by that filter or by a hand-built list.
311
+ */
312
+ protected readonly tools: Signal<readonly WrEditorTool[]>;
313
+ /** The tools that are buttons, in order — what the roving tab stop moves over. */
314
+ private readonly buttons;
315
+ /** Each drawn entry's index among the buttons, `-1` for a separator. @internal */
316
+ protected readonly buttonIndex: Signal<number[]>;
317
+ private readonly commands;
318
+ /** Every button's pressed and available state at the current selection. @internal */
319
+ protected readonly toolStates: Signal<ReadonlyMap<WrEditorCommandTool, WrToolState>>;
320
+ private readonly rovingIndex;
321
+ /**
322
+ * The one button in the tab order. It follows the user, and moves off a tool
323
+ * that stopped applying so the toolbar never loses its tab stop — unless NO
324
+ * tool applies (read-only, disabled), where it stays put, because there is
325
+ * nothing to reach.
326
+ */
327
+ private readonly tabStop;
328
+ /** Whether the live document is empty — pre-mount, whether the value is. */
329
+ private readonly empty;
330
+ /** The task-item words, handed to ProseMirror through its node views. */
331
+ private readonly nodeViews;
332
+ protected readonly ariaPlaceholder: Signal<string | null>;
333
+ protected readonly linkDraft: _angular_core.WritableSignal<string>;
334
+ /** Whether the selection is in a link — what the panel's remove button needs. */
335
+ protected readonly linkActive: Signal<boolean>;
336
+ /**
337
+ * The value rendered by Angular until ProseMirror takes over: on the server,
338
+ * and for the first browser frame. Read from the doc JSON, so it shows exactly
339
+ * what the schema kept — the same sanitised document the editor will mount.
340
+ */
341
+ protected readonly preview: Signal<WrEditorJson | null>;
342
+ protected readonly classes: Signal<string>;
343
+ constructor();
344
+ /** Focus the text surface — what Signal Forms calls to focus this control. */
345
+ focus(options?: FocusOptions): void;
346
+ protected label(tool: WrEditorCommandTool): string;
347
+ protected icon(tool: WrEditorCommandTool): readonly string[];
348
+ protected isToggle(tool: WrEditorCommandTool): boolean;
349
+ /** The tooltip: the label, with the shortcut when the tool has one. */
350
+ protected tooltip(tool: WrEditorCommandTool): string;
351
+ /** `aria-keyshortcuts` — key names from the ARIA spec, never localised. */
352
+ protected keyShortcuts(tool: WrEditorCommandTool): string | null;
353
+ protected state(tool: WrEditorCommandTool): WrToolState | undefined;
354
+ /**
355
+ * A toolbar button was activated.
356
+ *
357
+ * By pointer, focus never left the text (`mousedown` is cancelled), so the
358
+ * caret is put back where the command left it. By keyboard, focus stays on the
359
+ * button, as the toolbar pattern asks — unless the tool no longer applies,
360
+ * which disables it: a disabled button drops its focus on `<body>`, so the text
361
+ * takes it first.
362
+ */
363
+ protected onToolClick(tool: WrEditorCommandTool, event: MouseEvent): void;
364
+ protected onToolFocus(index: number): void;
365
+ /** The APG toolbar keys: the arrows rove and wrap, Home and End jump. */
366
+ protected onToolbarKeydown(event: KeyboardEvent): void;
367
+ /** `touch` once focus leaves the whole control — not when it moves between its own parts. */
368
+ protected onFocusOut(event: FocusEvent): void;
369
+ protected onLinkOpened(): void;
370
+ protected onLinkClosed(): void;
371
+ protected onLinkInput(event: Event): void;
372
+ protected applyLink(event: Event): void;
373
+ protected removeLink(): void;
374
+ protected nodesOf(raw: unknown): readonly WrEditorJson[];
375
+ protected nodeOf(raw: unknown): WrEditorJson;
376
+ protected markAt(node: WrEditorJson, depth: number): WrEditorMarkJson | null;
377
+ protected attr(node: WrEditorJson | WrEditorMarkJson, name: string): unknown;
378
+ protected text(node: WrEditorJson | WrEditorMarkJson, name: string): string | null;
379
+ protected textOf(node: WrEditorJson): string;
380
+ /** Whether an edit may happen at all — not while read-only, disabled or refused. */
381
+ private canEdit;
382
+ private mount;
383
+ private createState;
384
+ private dispatch;
385
+ private emit;
386
+ /**
387
+ * Bring an outside write into the view.
388
+ *
389
+ * Compared as DOCUMENTS, never as strings: `<b>` comes back as `<strong>`, so a
390
+ * normalised string differs from what the consumer wrote while the documents
391
+ * are equal — and an equal document is left alone, selection and history
392
+ * included. A different one replaces the state wholesale, history with it,
393
+ * which is right for a form reset or a server load: undo back into content the
394
+ * app replaced would be wrong. The normalised form is never written back —
395
+ * that would mark the field dirty on load. A write that arrives mid-composition
396
+ * (IME) replaces the composition too: the model is the source of truth.
397
+ */
398
+ private sync;
399
+ /**
400
+ * A new format whose value could not be read: keep the document, moved into
401
+ * the new format's schema — markdown's lacks underline, so that mark is
402
+ * dropped on the way. What is written from here on is in the new format.
403
+ */
404
+ private switchFormat;
405
+ private replaceState;
406
+ private placeholderDecorations;
407
+ /**
408
+ * Mod-K opens the link panel. Its propagation stops here: `<wr-command-palette>`
409
+ * binds the same chord on the document, and `WrHotkey` deliberately does not
410
+ * skip an event another listener already handled.
411
+ */
412
+ private onSurfaceKeydown;
413
+ private focusLinkInput;
414
+ /**
415
+ * Focus left the link panel for somewhere outside the control — Tab, Shift+Tab,
416
+ * a click elsewhere. The panel is not a focus trap, and left open it stays
417
+ * anchored to a control the user has left, whose next close would then pull
418
+ * focus back into the text. Closed with focus left where it went.
419
+ */
420
+ private leaveLinkPanel;
421
+ /** Whether a node is part of this control: the host, or its link panel. */
422
+ private withinControl;
423
+ private inLinkPanel;
424
+ private warnRefused;
425
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrEditor, never>;
426
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrEditor, "wr-editor", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "toolbar": { "alias": "toolbar"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
427
+ }
428
+
429
+ /**
430
+ * @license
431
+ *
432
+ * Use of this source code is governed by an MIT-style license that can be
433
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
434
+ */
435
+
436
+ /**
437
+ * The toolbar `<wr-editor>` draws when `toolbar` is not bound — every tool, in
438
+ * five groups. Exported so a toolbar can be built from it rather than retyped:
439
+ *
440
+ * ```ts
441
+ * readonly tools = WR_EDITOR_TOOLBAR.filter(tool => tool !== 'code');
442
+ * ```
443
+ *
444
+ * `underline` is dropped in `markdown` format whether it is listed or not.
445
+ */
446
+ declare const WR_EDITOR_TOOLBAR: readonly WrEditorTool[];
447
+
448
+ export { WR_EDITOR_TOOLBAR, WrEditor };
449
+ export type { WrEditorFormat, WrEditorJson, WrEditorMarkJson, WrEditorTool, WrEditorValue };
@@ -475,7 +475,11 @@ declare function parseMarkdown(source: string, options?: WrMarkdownParseOptions)
475
475
  *
476
476
  * Whitespace and control characters are stripped before the scheme is read,
477
477
  * because `java\nscript:` and `java script:` are the same URL to a browser and
478
- * different strings to a naive check.
478
+ * different strings to a naive check. So are character references:
479
+ * `javascript&colon;` has no scheme to this check, but a CommonMark renderer
480
+ * decodes it in a destination, so any markdown the URL is written into — an
481
+ * editor's output, say — hands a browser `javascript:`. The scheme is read from
482
+ * the decoded form; what comes back is still the URL as written.
479
483
  */
480
484
  declare function safeMarkdownUrl(raw: string, kind: 'link' | 'image'): string | null;
481
485
  /** Inline markdown to nodes. */
@@ -483,6 +487,61 @@ declare function parseInlines(source: string, options?: WrMarkdownParseOptions):
483
487
  /** Text content of an inline tree — for `alt` and for heading slugs. */
484
488
  declare function plainText(inlines: readonly WrMarkdownInline[]): string;
485
489
 
490
+ /**
491
+ * @license
492
+ *
493
+ * Use of this source code is governed by an MIT-style license that can be
494
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
495
+ */
496
+
497
+ /**
498
+ * A block tree back to markdown — the inverse of {@link parseMarkdown}.
499
+ *
500
+ * **Written against this library's parser, not against CommonMark.** The two
501
+ * disagree in places (no setext headings, no indented code, no entities, a
502
+ * simplified reading of emphasis), and a serializer that escapes for the wrong
503
+ * dialect writes text that comes back as something else. So every escape here is
504
+ * derived from a question `parseMarkdown` actually asks — several of them by
505
+ * calling the parser's own predicates — and the spec holds the pair to one
506
+ * property: `parseMarkdown(serializeMarkdown(tree))` returns `tree`.
507
+ *
508
+ * **What markdown cannot say is normalised, never guessed at.** The output is the
509
+ * nearest document this dialect can express, and reading it back gives a tree
510
+ * that serializes to the same string. The losses, all of them structural:
511
+ *
512
+ * - Whitespace at the edges of a paragraph, heading or cell is dropped, and so is
513
+ * whitespace just inside `**` / `*` / `~~` — a delimiter next to a space is not
514
+ * a delimiter. A soft line break inside a text node becomes a space, and a hard
515
+ * break at the very end of a block (a trailing `\` stays literal) is dropped;
516
+ * inside a heading or a table cell every hard break becomes a space.
517
+ * - An empty paragraph, an empty list and a table with no header cell vanish.
518
+ * - Two adjacent lists of the same kind merge on the way back — there is no
519
+ * raw-HTML comment to put between them. A single-item list with one block
520
+ * cannot be loose, and a loose list nested in a tight one loosens it. Nesting
521
+ * deeper than the parser's twelve levels reads back as text.
522
+ * - Inline marks are rewritten in one canonical nesting — link outside strong
523
+ * outside strikethrough outside emphasis — which is also how a mark SET, the
524
+ * shape an editor holds, becomes a tree. An image carries no emphasis (none of
525
+ * it paints on an image); where an emphasis run touches a strong one and
526
+ * neither can switch to `_`, the emphasis is dropped rather than written as
527
+ * markup that reads back as literal asterisks.
528
+ * - A link or image whose URL `safeMarkdownUrl` refuses is written as its text,
529
+ * exactly as the renderer would show it. A destination is percent-encoded
530
+ * where this parser cannot carry a character (`<`, `>`, an unbalanced
531
+ * parenthesis, a `\` it would read as an escape — and `[`, `]`, a backtick for
532
+ * an image inside a link label), loses a tab or line break the way a browser's
533
+ * URL parser does, a title that cannot be delimited is dropped, and a link
534
+ * whose label is too long for the parser's label cap is written as plain text.
535
+ * - A fence's info string keeps its first word, lowercased, and `closed` is not
536
+ * written: a serialized fence is always closed. A tab that indents a line reads
537
+ * back as four spaces, as the parser expands it. Heading ids are the parser's,
538
+ * recomputed on the way back.
539
+ *
540
+ * @param blocks a block tree, typically from {@link parseMarkdown} or an editor
541
+ * @returns markdown, with no trailing newline; `''` for an empty tree
542
+ */
543
+ declare function serializeMarkdown(blocks: readonly WrMarkdownBlock[]): string;
544
+
486
545
  /**
487
546
  * @license
488
547
  *
@@ -541,5 +600,5 @@ declare function provideWrMarkdownHighlighter(highlighter: WrMarkdownHighlighter
541
600
  */
542
601
  declare const WR_MARKDOWN_HIGHLIGHTER: InjectionToken<WrMarkdownHighlighter | null>;
543
602
 
544
- export { WR_MARKDOWN_HIGHLIGHTER, WrMarkdown, WrMarkdownHighlight, parseInlines, parseMarkdown, plainText, provideWrMarkdownHighlighter, safeMarkdownUrl };
603
+ export { WR_MARKDOWN_HIGHLIGHTER, WrMarkdown, WrMarkdownHighlight, parseInlines, parseMarkdown, plainText, provideWrMarkdownHighlighter, safeMarkdownUrl, serializeMarkdown };
545
604
  export type { WrHighlightLine, WrHighlightSpan, WrMarkdownAlign, WrMarkdownBlock, WrMarkdownCell, WrMarkdownHighlighter, WrMarkdownInline, WrMarkdownListItem, WrMarkdownParseOptions };
@@ -39,6 +39,10 @@ declare class WrTypography {
39
39
  /**
40
40
  * Color tone. `null` (default) keeps the variant's own color — the base
41
41
  * dark for headings/body, medium for lead/caption, primary for links.
42
+ * Emphasis only: a tone never carries a state on its own. Six of the nine
43
+ * intents share one lightness, and `success` against `danger` is 1.05:1 as
44
+ * text, so the words have to name the state (`500 Server Error`, not a red
45
+ * `Request`) — or reach for `<wr-alert>`, which draws a glyph per type.
42
46
  */
43
47
  readonly tone: _angular_core.InputSignal<WrTypographyTone | null>;
44
48
  /** Horizontal alignment. */
@@ -16,7 +16,7 @@ import { InjectionToken } from '@angular/core';
16
16
  * Distinct from `Version` exported by `@angular/core`, which reports the
17
17
  * loaded Angular runtime version (e.g. `'22.0.0'`), not ngwr's.
18
18
  */
19
- declare const NGWR_VERSION = "14.8.0";
19
+ declare const NGWR_VERSION = "14.9.0";
20
20
 
21
21
  /**
22
22
  * @license
@@ -186,21 +186,37 @@
186
186
  }
187
187
 
188
188
  // Tones
189
+ // color-ok: a text ROLE, not a state — body copy. Like every tone it is
190
+ // emphasis only, and the words carry whatever state there is.
189
191
  &--tone-dark {
190
192
  color: var(--wr-color-on-surface);
191
193
  }
194
+ // color-ok: a text ROLE, not a state — muted prose rather than body copy.
195
+ // Like every tone it is emphasis only.
192
196
  &--tone-medium {
193
197
  color: var(--wr-color-on-surface-muted);
194
198
  }
199
+ // color-ok: emphasis only, never the sole carrier of a state — the words
200
+ // carry it, as "500 Server Error" does, because `success` against `danger` is
201
+ // 1.05:1 as text in light.
195
202
  &--tone-primary {
196
203
  color: var(--wr-color-primary-ink);
197
204
  }
205
+ // color-ok: emphasis only, never the sole carrier of a state — the words
206
+ // carry it, as "500 Server Error" does, because `success` against `danger` is
207
+ // 1.05:1 as text in light.
198
208
  &--tone-success {
199
209
  color: var(--wr-color-success-ink);
200
210
  }
211
+ // color-ok: emphasis only, never the sole carrier of a state — the words
212
+ // carry it, as "500 Server Error" does, because `success` against `danger` is
213
+ // 1.05:1 as text in light.
201
214
  &--tone-warning {
202
215
  color: var(--wr-color-warning-ink);
203
216
  }
217
+ // color-ok: emphasis only, never the sole carrier of a state — the words
218
+ // carry it, as "500 Server Error" does, because `success` against `danger` is
219
+ // 1.05:1 as text in light.
204
220
  &--tone-danger {
205
221
  color: var(--wr-color-danger-ink);
206
222
  }