ngwr 10.2.1 → 11.1.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 (431) hide show
  1. package/README.md +39 -19
  2. package/action-sheet/styles/_index.scss +4 -1
  3. package/anchor/styles/_index.scss +6 -5
  4. package/back-top/styles/_index.scss +6 -1
  5. package/blur-text/styles/_index.scss +13 -0
  6. package/button/styles/_index.scss +11 -6
  7. package/calendar/styles/_index.scss +11 -2
  8. package/carousel/styles/_index.scss +13 -2
  9. package/cascader/styles/_index.scss +5 -3
  10. package/circular-text/styles/_index.scss +2 -0
  11. package/collapse/styles/_index.scss +1 -1
  12. package/color-picker/styles/_index.scss +6 -1
  13. package/command-palette/styles/_index.scss +2 -1
  14. package/compare/styles/_index.scss +1 -2
  15. package/context-menu/styles/_index.scss +8 -2
  16. package/descriptions/styles/_index.scss +2 -2
  17. package/dialog/styles/_index.scss +7 -0
  18. package/drawer/styles/_index.scss +20 -1
  19. package/dropdown/styles/_index.scss +19 -5
  20. package/empty/styles/_index.scss +10 -0
  21. package/falling-text/styles/_index.scss +2 -1
  22. package/fesm2022/ngwr-action-sheet.mjs +13 -3
  23. package/fesm2022/ngwr-action-sheet.mjs.map +1 -1
  24. package/fesm2022/ngwr-affix.mjs +40 -13
  25. package/fesm2022/ngwr-affix.mjs.map +1 -1
  26. package/fesm2022/ngwr-anchor.mjs +18 -6
  27. package/fesm2022/ngwr-anchor.mjs.map +1 -1
  28. package/fesm2022/ngwr-aurora.mjs +2 -2
  29. package/fesm2022/ngwr-aurora.mjs.map +1 -1
  30. package/fesm2022/ngwr-avatar.mjs +31 -7
  31. package/fesm2022/ngwr-avatar.mjs.map +1 -1
  32. package/fesm2022/ngwr-back-top.mjs +6 -2
  33. package/fesm2022/ngwr-back-top.mjs.map +1 -1
  34. package/fesm2022/ngwr-badge.mjs +1 -1
  35. package/fesm2022/ngwr-badge.mjs.map +1 -1
  36. package/fesm2022/ngwr-bar-chart.mjs +30 -9
  37. package/fesm2022/ngwr-bar-chart.mjs.map +1 -1
  38. package/fesm2022/ngwr-blur-text.mjs +2 -2
  39. package/fesm2022/ngwr-blur-text.mjs.map +1 -1
  40. package/fesm2022/ngwr-border-glow.mjs +2 -2
  41. package/fesm2022/ngwr-border-glow.mjs.map +1 -1
  42. package/fesm2022/ngwr-breadcrumbs.mjs +2 -2
  43. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  44. package/fesm2022/ngwr-burger.mjs +9 -4
  45. package/fesm2022/ngwr-burger.mjs.map +1 -1
  46. package/fesm2022/ngwr-button-testing.mjs +96 -0
  47. package/fesm2022/ngwr-button-testing.mjs.map +1 -0
  48. package/fesm2022/ngwr-button.mjs +31 -14
  49. package/fesm2022/ngwr-button.mjs.map +1 -1
  50. package/fesm2022/ngwr-calendar-heatmap.mjs +40 -8
  51. package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
  52. package/fesm2022/ngwr-calendar.mjs +20 -1
  53. package/fesm2022/ngwr-calendar.mjs.map +1 -1
  54. package/fesm2022/ngwr-card.mjs +2 -2
  55. package/fesm2022/ngwr-card.mjs.map +1 -1
  56. package/fesm2022/ngwr-carousel-testing.mjs +377 -0
  57. package/fesm2022/ngwr-carousel-testing.mjs.map +1 -0
  58. package/fesm2022/ngwr-carousel.mjs +67 -13
  59. package/fesm2022/ngwr-carousel.mjs.map +1 -1
  60. package/fesm2022/ngwr-cascader-testing.mjs +534 -0
  61. package/fesm2022/ngwr-cascader-testing.mjs.map +1 -0
  62. package/fesm2022/ngwr-cascader.mjs +2 -2
  63. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  64. package/fesm2022/ngwr-checkbox-testing.mjs +90 -0
  65. package/fesm2022/ngwr-checkbox-testing.mjs.map +1 -0
  66. package/fesm2022/ngwr-checkbox.mjs +9 -3
  67. package/fesm2022/ngwr-checkbox.mjs.map +1 -1
  68. package/fesm2022/ngwr-circular-text.mjs +2 -2
  69. package/fesm2022/ngwr-circular-text.mjs.map +1 -1
  70. package/fesm2022/ngwr-click-spark.mjs +2 -2
  71. package/fesm2022/ngwr-click-spark.mjs.map +1 -1
  72. package/fesm2022/ngwr-collapse-testing.mjs +368 -0
  73. package/fesm2022/ngwr-collapse-testing.mjs.map +1 -0
  74. package/fesm2022/ngwr-color-picker.mjs +134 -14
  75. package/fesm2022/ngwr-color-picker.mjs.map +1 -1
  76. package/fesm2022/ngwr-command-palette-testing.mjs +589 -0
  77. package/fesm2022/ngwr-command-palette-testing.mjs.map +1 -0
  78. package/fesm2022/ngwr-command-palette.mjs +58 -8
  79. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  80. package/fesm2022/ngwr-compare.mjs +103 -13
  81. package/fesm2022/ngwr-compare.mjs.map +1 -1
  82. package/fesm2022/ngwr-config.mjs +106 -0
  83. package/fesm2022/ngwr-config.mjs.map +1 -0
  84. package/fesm2022/ngwr-context-menu-testing.mjs +631 -0
  85. package/fesm2022/ngwr-context-menu-testing.mjs.map +1 -0
  86. package/fesm2022/ngwr-context-menu.mjs +94 -8
  87. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  88. package/fesm2022/ngwr-cookie.mjs +5 -1
  89. package/fesm2022/ngwr-cookie.mjs.map +1 -1
  90. package/fesm2022/ngwr-counter.mjs +11 -3
  91. package/fesm2022/ngwr-counter.mjs.map +1 -1
  92. package/fesm2022/ngwr-date-adapter-luxon.mjs +52 -4
  93. package/fesm2022/ngwr-date-adapter-luxon.mjs.map +1 -1
  94. package/fesm2022/ngwr-date-adapter.mjs +54 -8
  95. package/fesm2022/ngwr-date-adapter.mjs.map +1 -1
  96. package/fesm2022/ngwr-date-picker-testing.mjs +766 -0
  97. package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -0
  98. package/fesm2022/ngwr-date-picker.mjs +73 -3
  99. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  100. package/fesm2022/ngwr-decrypt-text.mjs +27 -9
  101. package/fesm2022/ngwr-decrypt-text.mjs.map +1 -1
  102. package/fesm2022/ngwr-dialog-testing.mjs +89 -0
  103. package/fesm2022/ngwr-dialog-testing.mjs.map +1 -0
  104. package/fesm2022/ngwr-directives.mjs +36 -12
  105. package/fesm2022/ngwr-directives.mjs.map +1 -1
  106. package/fesm2022/ngwr-donut-chart.mjs +22 -5
  107. package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
  108. package/fesm2022/ngwr-drag-drop.mjs +2 -2
  109. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  110. package/fesm2022/ngwr-drawer-testing.mjs +250 -0
  111. package/fesm2022/ngwr-drawer-testing.mjs.map +1 -0
  112. package/fesm2022/ngwr-dropdown-testing.mjs +291 -0
  113. package/fesm2022/ngwr-dropdown-testing.mjs.map +1 -0
  114. package/fesm2022/ngwr-dropdown.mjs +10 -2
  115. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  116. package/fesm2022/ngwr-empty.mjs +24 -7
  117. package/fesm2022/ngwr-empty.mjs.map +1 -1
  118. package/fesm2022/ngwr-event-calendar.mjs +57 -10
  119. package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
  120. package/fesm2022/ngwr-falling-text.mjs +2 -2
  121. package/fesm2022/ngwr-falling-text.mjs.map +1 -1
  122. package/fesm2022/ngwr-file-upload-testing.mjs +332 -0
  123. package/fesm2022/ngwr-file-upload-testing.mjs.map +1 -0
  124. package/fesm2022/ngwr-form-testing.mjs +451 -0
  125. package/fesm2022/ngwr-form-testing.mjs.map +1 -0
  126. package/fesm2022/ngwr-form.mjs +19 -3
  127. package/fesm2022/ngwr-form.mjs.map +1 -1
  128. package/fesm2022/ngwr-fuzzy-text.mjs +9 -2
  129. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
  130. package/fesm2022/ngwr-gauge.mjs +19 -5
  131. package/fesm2022/ngwr-gauge.mjs.map +1 -1
  132. package/fesm2022/ngwr-glitch-text.mjs +2 -2
  133. package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
  134. package/fesm2022/ngwr-gradient-text.mjs +2 -2
  135. package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
  136. package/fesm2022/ngwr-i18n-en.mjs +50 -0
  137. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  138. package/fesm2022/ngwr-i18n-ru.mjs +48 -0
  139. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  140. package/fesm2022/ngwr-image-cropper.mjs +23 -0
  141. package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
  142. package/fesm2022/ngwr-input-number-testing.mjs +306 -0
  143. package/fesm2022/ngwr-input-number-testing.mjs.map +1 -0
  144. package/fesm2022/ngwr-input-number.mjs +35 -3
  145. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  146. package/fesm2022/ngwr-input-otp-testing.mjs +419 -0
  147. package/fesm2022/ngwr-input-otp-testing.mjs.map +1 -0
  148. package/fesm2022/ngwr-input-otp.mjs +36 -5
  149. package/fesm2022/ngwr-input-otp.mjs.map +1 -1
  150. package/fesm2022/ngwr-input-testing.mjs +102 -0
  151. package/fesm2022/ngwr-input-testing.mjs.map +1 -0
  152. package/fesm2022/ngwr-input.mjs +47 -10
  153. package/fesm2022/ngwr-input.mjs.map +1 -1
  154. package/fesm2022/ngwr-knob.mjs +44 -8
  155. package/fesm2022/ngwr-knob.mjs.map +1 -1
  156. package/fesm2022/ngwr-layout.mjs +21 -5
  157. package/fesm2022/ngwr-layout.mjs.map +1 -1
  158. package/fesm2022/ngwr-lightbox.mjs +33 -6
  159. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  160. package/fesm2022/ngwr-line-chart.mjs +17 -4
  161. package/fesm2022/ngwr-line-chart.mjs.map +1 -1
  162. package/fesm2022/ngwr-list.mjs +2 -2
  163. package/fesm2022/ngwr-list.mjs.map +1 -1
  164. package/fesm2022/ngwr-loading-bar.mjs +2 -2
  165. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  166. package/fesm2022/ngwr-markdown-testing.mjs +516 -0
  167. package/fesm2022/ngwr-markdown-testing.mjs.map +1 -0
  168. package/fesm2022/ngwr-markdown.mjs +1492 -0
  169. package/fesm2022/ngwr-markdown.mjs.map +1 -0
  170. package/fesm2022/ngwr-marquee.mjs +17 -6
  171. package/fesm2022/ngwr-marquee.mjs.map +1 -1
  172. package/fesm2022/ngwr-mention-testing.mjs +513 -0
  173. package/fesm2022/ngwr-mention-testing.mjs.map +1 -0
  174. package/fesm2022/ngwr-mention.mjs +10 -1
  175. package/fesm2022/ngwr-mention.mjs.map +1 -1
  176. package/fesm2022/ngwr-meta.mjs +22 -7
  177. package/fesm2022/ngwr-meta.mjs.map +1 -1
  178. package/fesm2022/ngwr-meter-group.mjs +19 -5
  179. package/fesm2022/ngwr-meter-group.mjs.map +1 -1
  180. package/fesm2022/ngwr-overlay.mjs +41 -1
  181. package/fesm2022/ngwr-overlay.mjs.map +1 -1
  182. package/fesm2022/ngwr-pagination-testing.mjs +389 -0
  183. package/fesm2022/ngwr-pagination-testing.mjs.map +1 -0
  184. package/fesm2022/ngwr-pagination.mjs +14 -2
  185. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  186. package/fesm2022/ngwr-popconfirm-testing.mjs +309 -0
  187. package/fesm2022/ngwr-popconfirm-testing.mjs.map +1 -0
  188. package/fesm2022/ngwr-popconfirm.mjs +95 -17
  189. package/fesm2022/ngwr-popconfirm.mjs.map +1 -1
  190. package/fesm2022/ngwr-popover-testing.mjs +316 -0
  191. package/fesm2022/ngwr-popover-testing.mjs.map +1 -0
  192. package/fesm2022/ngwr-popover.mjs +21 -3
  193. package/fesm2022/ngwr-popover.mjs.map +1 -1
  194. package/fesm2022/ngwr-pull-to-refresh.mjs +17 -2
  195. package/fesm2022/ngwr-pull-to-refresh.mjs.map +1 -1
  196. package/fesm2022/ngwr-qr.mjs +13 -3
  197. package/fesm2022/ngwr-qr.mjs.map +1 -1
  198. package/fesm2022/ngwr-radio-testing.mjs +392 -0
  199. package/fesm2022/ngwr-radio-testing.mjs.map +1 -0
  200. package/fesm2022/ngwr-radio.mjs +10 -3
  201. package/fesm2022/ngwr-radio.mjs.map +1 -1
  202. package/fesm2022/ngwr-rating-testing.mjs +384 -0
  203. package/fesm2022/ngwr-rating-testing.mjs.map +1 -0
  204. package/fesm2022/ngwr-rating.mjs +37 -2
  205. package/fesm2022/ngwr-rating.mjs.map +1 -1
  206. package/fesm2022/ngwr-segmented-testing.mjs +512 -0
  207. package/fesm2022/ngwr-segmented-testing.mjs.map +1 -0
  208. package/fesm2022/ngwr-select-testing.mjs +268 -0
  209. package/fesm2022/ngwr-select-testing.mjs.map +1 -0
  210. package/fesm2022/ngwr-select.mjs +87 -16
  211. package/fesm2022/ngwr-select.mjs.map +1 -1
  212. package/fesm2022/ngwr-shiny-text.mjs +2 -2
  213. package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
  214. package/fesm2022/ngwr-sidebar.mjs +65 -12
  215. package/fesm2022/ngwr-sidebar.mjs.map +1 -1
  216. package/fesm2022/ngwr-slider-testing.mjs +478 -0
  217. package/fesm2022/ngwr-slider-testing.mjs.map +1 -0
  218. package/fesm2022/ngwr-slider.mjs +57 -13
  219. package/fesm2022/ngwr-slider.mjs.map +1 -1
  220. package/fesm2022/ngwr-sparkline.mjs +26 -6
  221. package/fesm2022/ngwr-sparkline.mjs.map +1 -1
  222. package/fesm2022/ngwr-speed-dial.mjs +37 -4
  223. package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
  224. package/fesm2022/ngwr-spinner.mjs +12 -3
  225. package/fesm2022/ngwr-spinner.mjs.map +1 -1
  226. package/fesm2022/ngwr-splash-cursor.mjs +2 -2
  227. package/fesm2022/ngwr-splash-cursor.mjs.map +1 -1
  228. package/fesm2022/ngwr-split-text.mjs +2 -2
  229. package/fesm2022/ngwr-split-text.mjs.map +1 -1
  230. package/fesm2022/ngwr-splitter.mjs +70 -9
  231. package/fesm2022/ngwr-splitter.mjs.map +1 -1
  232. package/fesm2022/ngwr-spotlight-card.mjs +2 -2
  233. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  234. package/fesm2022/ngwr-star-border.mjs +2 -2
  235. package/fesm2022/ngwr-star-border.mjs.map +1 -1
  236. package/fesm2022/ngwr-statistic.mjs +24 -7
  237. package/fesm2022/ngwr-statistic.mjs.map +1 -1
  238. package/fesm2022/ngwr-stepper-testing.mjs +477 -0
  239. package/fesm2022/ngwr-stepper-testing.mjs.map +1 -0
  240. package/fesm2022/ngwr-switch-testing.mjs +77 -0
  241. package/fesm2022/ngwr-switch-testing.mjs.map +1 -0
  242. package/fesm2022/ngwr-switch.mjs +9 -3
  243. package/fesm2022/ngwr-switch.mjs.map +1 -1
  244. package/fesm2022/ngwr-table-testing.mjs +580 -0
  245. package/fesm2022/ngwr-table-testing.mjs.map +1 -0
  246. package/fesm2022/ngwr-table.mjs +87 -14
  247. package/fesm2022/ngwr-table.mjs.map +1 -1
  248. package/fesm2022/ngwr-tabs-testing.mjs +617 -0
  249. package/fesm2022/ngwr-tabs-testing.mjs.map +1 -0
  250. package/fesm2022/ngwr-tabs.mjs +38 -6
  251. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  252. package/fesm2022/ngwr-textarea-testing.mjs +238 -0
  253. package/fesm2022/ngwr-textarea-testing.mjs.map +1 -0
  254. package/fesm2022/ngwr-textarea.mjs +32 -4
  255. package/fesm2022/ngwr-textarea.mjs.map +1 -1
  256. package/fesm2022/ngwr-tilt-card.mjs +2 -2
  257. package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
  258. package/fesm2022/ngwr-toast-testing.mjs +101 -0
  259. package/fesm2022/ngwr-toast-testing.mjs.map +1 -0
  260. package/fesm2022/ngwr-toast.mjs +2 -2
  261. package/fesm2022/ngwr-toast.mjs.map +1 -1
  262. package/fesm2022/ngwr-tour.mjs +61 -9
  263. package/fesm2022/ngwr-tour.mjs.map +1 -1
  264. package/fesm2022/ngwr-transfer-testing.mjs +538 -0
  265. package/fesm2022/ngwr-transfer-testing.mjs.map +1 -0
  266. package/fesm2022/ngwr-transfer.mjs +45 -14
  267. package/fesm2022/ngwr-transfer.mjs.map +1 -1
  268. package/fesm2022/ngwr-tree-testing.mjs +734 -0
  269. package/fesm2022/ngwr-tree-testing.mjs.map +1 -0
  270. package/fesm2022/ngwr-tree.mjs +73 -7
  271. package/fesm2022/ngwr-tree.mjs.map +1 -1
  272. package/fesm2022/ngwr-typewriter.mjs +5 -3
  273. package/fesm2022/ngwr-typewriter.mjs.map +1 -1
  274. package/fesm2022/ngwr-version.mjs +1 -1
  275. package/fesm2022/ngwr-version.mjs.map +1 -1
  276. package/fesm2022/ngwr-virtual-scroll.mjs +31 -5
  277. package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
  278. package/fesm2022/ngwr-waves.mjs +3 -3
  279. package/fesm2022/ngwr-waves.mjs.map +1 -1
  280. package/fesm2022/ngwr-window.mjs +8 -0
  281. package/fesm2022/ngwr-window.mjs.map +1 -1
  282. package/file-upload/styles/_index.scss +7 -2
  283. package/gauge/styles/_index.scss +1 -1
  284. package/glitch-text/styles/_index.scss +4 -0
  285. package/i18n/en.json +48 -0
  286. package/i18n/ru.json +48 -0
  287. package/image-cropper/styles/_index.scss +13 -1
  288. package/input/styles/_index.scss +2 -2
  289. package/input-number/styles/_index.scss +7 -2
  290. package/knob/styles/_index.scss +8 -1
  291. package/layout/styles/_index.scss +3 -3
  292. package/lightbox/styles/_index.scss +10 -2
  293. package/line-chart/styles/_index.scss +6 -0
  294. package/llms-full.txt +151 -4
  295. package/llms.txt +57 -8
  296. package/loading-bar/styles/_index.scss +1 -2
  297. package/markdown/styles/_index.scss +296 -0
  298. package/marquee/styles/_index.scss +12 -0
  299. package/mcp/api.js +512 -0
  300. package/mcp/catalog.js +157 -0
  301. package/mcp/server.js +273 -0
  302. package/mcp/tools.js +366 -0
  303. package/meter-group/styles/_index.scss +1 -1
  304. package/package.json +186 -35
  305. package/pagination/styles/_index.scss +6 -6
  306. package/popover/styles/_index.scss +37 -5
  307. package/rating/styles/_index.scss +10 -0
  308. package/result/styles/_index.scss +3 -1
  309. package/schematics/use/symbol-map.json +2 -0
  310. package/segmented/styles/_index.scss +12 -1
  311. package/select/styles/_index.scss +32 -10
  312. package/sidebar/styles/_index.scss +30 -5
  313. package/slider/styles/_index.scss +15 -0
  314. package/speed-dial/styles/_index.scss +20 -0
  315. package/split-text/styles/_index.scss +13 -0
  316. package/star-border/styles/_index.scss +2 -0
  317. package/stepper/styles/_index.scss +19 -3
  318. package/styles/_grid.scss +4 -4
  319. package/styles.scss +1 -0
  320. package/switch/styles/_index.scss +5 -3
  321. package/table/styles/_index.scss +25 -12
  322. package/tabs/styles/_index.scss +11 -1
  323. package/textarea/styles/_index.scss +5 -0
  324. package/theme/styles/_colors.scss +44 -15
  325. package/theme/styles/_dark.scss +35 -15
  326. package/theme/styles/_mixins.scss +3 -0
  327. package/timeline/styles/_index.scss +2 -2
  328. package/toast/styles/_index.scss +17 -8
  329. package/toolbar/styles/_index.scss +3 -3
  330. package/tour/styles/_index.scss +7 -1
  331. package/tree/styles/_index.scss +9 -5
  332. package/types/ngwr-action-sheet.d.ts +9 -1
  333. package/types/ngwr-affix.d.ts +7 -1
  334. package/types/ngwr-anchor.d.ts +8 -1
  335. package/types/ngwr-avatar.d.ts +13 -3
  336. package/types/ngwr-bar-chart.d.ts +16 -0
  337. package/types/ngwr-burger.d.ts +6 -2
  338. package/types/ngwr-button-testing.d.ts +85 -0
  339. package/types/ngwr-button.d.ts +26 -10
  340. package/types/ngwr-calendar-heatmap.d.ts +16 -2
  341. package/types/ngwr-calendar.d.ts +10 -0
  342. package/types/ngwr-carousel-testing.d.ts +257 -0
  343. package/types/ngwr-carousel.d.ts +20 -4
  344. package/types/ngwr-cascader-testing.d.ts +392 -0
  345. package/types/ngwr-checkbox-testing.d.ts +77 -0
  346. package/types/ngwr-checkbox.d.ts +7 -2
  347. package/types/ngwr-collapse-testing.d.ts +290 -0
  348. package/types/ngwr-color-picker.d.ts +20 -11
  349. package/types/ngwr-command-palette-testing.d.ts +437 -0
  350. package/types/ngwr-command-palette.d.ts +25 -2
  351. package/types/ngwr-compare.d.ts +50 -2
  352. package/types/ngwr-config.d.ts +176 -0
  353. package/types/ngwr-context-menu-testing.d.ts +401 -0
  354. package/types/ngwr-context-menu.d.ts +65 -17
  355. package/types/ngwr-counter.d.ts +6 -1
  356. package/types/ngwr-date-adapter-luxon.d.ts +26 -0
  357. package/types/ngwr-date-picker-testing.d.ts +518 -0
  358. package/types/ngwr-date-picker.d.ts +4 -0
  359. package/types/ngwr-dialog-testing.d.ts +79 -0
  360. package/types/ngwr-directives.d.ts +10 -1
  361. package/types/ngwr-donut-chart.d.ts +8 -1
  362. package/types/ngwr-drawer-testing.d.ts +196 -0
  363. package/types/ngwr-dropdown-testing.d.ts +202 -0
  364. package/types/ngwr-dropdown.d.ts +7 -1
  365. package/types/ngwr-empty.d.ts +19 -4
  366. package/types/ngwr-event-calendar.d.ts +26 -1
  367. package/types/ngwr-file-upload-testing.d.ts +194 -0
  368. package/types/ngwr-form-testing.d.ts +379 -0
  369. package/types/ngwr-form.d.ts +17 -0
  370. package/types/ngwr-gauge.d.ts +13 -1
  371. package/types/ngwr-image-cropper.d.ts +10 -0
  372. package/types/ngwr-input-number-testing.d.ts +226 -0
  373. package/types/ngwr-input-number.d.ts +29 -1
  374. package/types/ngwr-input-otp-testing.d.ts +299 -0
  375. package/types/ngwr-input-otp.d.ts +23 -2
  376. package/types/ngwr-input-testing.d.ts +84 -0
  377. package/types/ngwr-input.d.ts +20 -6
  378. package/types/ngwr-knob.d.ts +18 -0
  379. package/types/ngwr-layout.d.ts +1 -0
  380. package/types/ngwr-lightbox.d.ts +17 -3
  381. package/types/ngwr-line-chart.d.ts +9 -2
  382. package/types/ngwr-markdown-testing.d.ts +462 -0
  383. package/types/ngwr-markdown.d.ts +534 -0
  384. package/types/ngwr-marquee.d.ts +12 -2
  385. package/types/ngwr-mention-testing.d.ts +359 -0
  386. package/types/ngwr-meta.d.ts +4 -2
  387. package/types/ngwr-meter-group.d.ts +11 -1
  388. package/types/ngwr-overlay.d.ts +33 -2
  389. package/types/ngwr-pagination-testing.d.ts +291 -0
  390. package/types/ngwr-pagination.d.ts +1 -0
  391. package/types/ngwr-popconfirm-testing.d.ts +235 -0
  392. package/types/ngwr-popconfirm.d.ts +31 -21
  393. package/types/ngwr-popover-testing.d.ts +221 -0
  394. package/types/ngwr-popover.d.ts +9 -0
  395. package/types/ngwr-pull-to-refresh.d.ts +7 -0
  396. package/types/ngwr-qr.d.ts +9 -1
  397. package/types/ngwr-radio-testing.d.ts +296 -0
  398. package/types/ngwr-radio.d.ts +8 -2
  399. package/types/ngwr-rating-testing.d.ts +291 -0
  400. package/types/ngwr-rating.d.ts +23 -0
  401. package/types/ngwr-segmented-testing.d.ts +401 -0
  402. package/types/ngwr-select-testing.d.ts +175 -0
  403. package/types/ngwr-select.d.ts +45 -4
  404. package/types/ngwr-sidebar.d.ts +17 -2
  405. package/types/ngwr-slider-testing.d.ts +329 -0
  406. package/types/ngwr-slider.d.ts +35 -1
  407. package/types/ngwr-sparkline.d.ts +12 -2
  408. package/types/ngwr-speed-dial.d.ts +17 -18
  409. package/types/ngwr-spinner.d.ts +8 -1
  410. package/types/ngwr-splitter.d.ts +24 -1
  411. package/types/ngwr-statistic.d.ts +12 -2
  412. package/types/ngwr-stepper-testing.d.ts +346 -0
  413. package/types/ngwr-switch-testing.d.ts +66 -0
  414. package/types/ngwr-switch.d.ts +7 -2
  415. package/types/ngwr-table-testing.d.ts +423 -0
  416. package/types/ngwr-table.d.ts +42 -0
  417. package/types/ngwr-tabs-testing.d.ts +470 -0
  418. package/types/ngwr-tabs.d.ts +9 -0
  419. package/types/ngwr-textarea-testing.d.ts +184 -0
  420. package/types/ngwr-textarea.d.ts +7 -2
  421. package/types/ngwr-toast-testing.d.ts +80 -0
  422. package/types/ngwr-tour.d.ts +27 -0
  423. package/types/ngwr-transfer-testing.d.ts +444 -0
  424. package/types/ngwr-transfer.d.ts +16 -1
  425. package/types/ngwr-tree-testing.d.ts +501 -0
  426. package/types/ngwr-tree.d.ts +33 -0
  427. package/types/ngwr-version.d.ts +1 -1
  428. package/types/ngwr-virtual-scroll.d.ts +13 -1
  429. package/typewriter/styles/_index.scss +1 -1
  430. package/typography/styles/_index.scss +1 -1
  431. package/window/styles/_index.scss +32 -9
@@ -49,6 +49,15 @@
49
49
  .wr-sidebar__icon {
50
50
  color: var(--wr-color-primary);
51
51
  }
52
+
53
+ // The badge measured 3.97:1 on the active row. Its own outline wash over
54
+ // the primary tint is what broke the pairing: `-ink` is calibrated against
55
+ // `-soft` ITSELF, so the fix is to let the row's tint show through and
56
+ // inherit the colour that was calibrated for it.
57
+ .wr-sidebar__badge {
58
+ color: inherit;
59
+ background: transparent;
60
+ }
52
61
  }
53
62
 
54
63
  &--disabled {
@@ -75,7 +84,7 @@
75
84
  border-radius: var(--wr-border-radius-sm);
76
85
  color: var(--wr-color-on-surface);
77
86
  cursor: pointer;
78
- text-align: left;
87
+ text-align: start;
79
88
  transition: background var(--wr-transition-base);
80
89
 
81
90
  &:hover {
@@ -118,18 +127,27 @@
118
127
  }
119
128
 
120
129
  &__group--collapsed &__chevron {
130
+ // Disclosure affordance, and it IS reading-order: the collapsed chevron
131
+ // should point at the trailing edge. `rotate` has no logical form, so under
132
+ // RTL the chevron-down still swings to point right — into the sidebar's
133
+ // content rather than away from it. Flipping it needs a `[dir]` rule (or a
134
+ // direction-aware sign from sidebar.ts), which is beyond a property-level
135
+ // rewrite; same call as the segmented thumb and the button seam.
136
+ // rtl-ok: transform rotation has no logical equivalent — see above
121
137
  transform: rotate(-90deg);
122
138
  }
123
139
 
124
140
  // Child items (inside an expanded group)
125
141
  &__list {
126
142
  list-style: none;
127
- margin: 0.125rem 0 0.375rem 0.5rem;
128
- padding: 0 0 0 0.625rem;
143
+ margin: 0.125rem 0 0.375rem;
144
+ margin-inline-start: 0.5rem;
145
+ padding: 0;
146
+ padding-inline-start: 0.625rem;
129
147
  display: flex;
130
148
  flex-direction: column;
131
149
  gap: 0.0625rem;
132
- border-left: 1px solid var(--wr-color-outline);
150
+ border-inline-start: 1px solid var(--wr-color-outline);
133
151
  }
134
152
 
135
153
  &__item {
@@ -153,7 +171,7 @@
153
171
  position: absolute;
154
172
  top: 0.125rem;
155
173
  bottom: 0.125rem;
156
- left: -0.6875rem;
174
+ inset-inline-start: -0.6875rem;
157
175
  width: 2px;
158
176
  border-radius: 1px;
159
177
  background: transparent;
@@ -178,6 +196,13 @@
178
196
  background: var(--wr-color-primary-soft);
179
197
  pointer-events: none;
180
198
 
199
+ // Same reasoning as the flat entry above: `-ink` on the row's own tint is
200
+ // the calibrated pairing, and the badge's wash is what pushed it under.
201
+ .wr-sidebar__badge {
202
+ color: inherit;
203
+ background: transparent;
204
+ }
205
+
181
206
  &::before {
182
207
  background: var(--wr-color-primary);
183
208
  }
@@ -38,6 +38,11 @@
38
38
  top: 50%;
39
39
  width: var(--wr-slider-thumb-size);
40
40
  height: var(--wr-slider-thumb-size);
41
+ // The inline half of the centring pair follows the inset it centres:
42
+ // `slider.html` positions the thumb with `inset-inline-start`, which is the
43
+ // RIGHT edge under `dir="rtl"`, so a fixed `-50%` would drag the thumb — and
44
+ // the 44px tap area pinned to it — a whole thumb-width past its own value.
45
+ // The block half is symmetric and stays put.
41
46
  transform: translate(-50%, -50%);
42
47
  appearance: none;
43
48
  background: var(--wr-slider-thumb);
@@ -60,6 +65,16 @@
60
65
  cursor: grabbing;
61
66
  transform: translate(-50%, -50%) scale(1.1);
62
67
  }
68
+
69
+ // Mirrored last, and with the `:active` pair spelled out, so the RTL rules
70
+ // outrank the LTR ones they replace at every state.
71
+ [dir='rtl'] & {
72
+ transform: translate(50%, -50%);
73
+
74
+ &:active {
75
+ transform: translate(50%, -50%) scale(1.1);
76
+ }
77
+ }
63
78
  }
64
79
 
65
80
  &__label {
@@ -19,9 +19,14 @@
19
19
  padding-top: env(safe-area-inset-top);
20
20
  }
21
21
  &--safe-area.wr-speed-dial--left {
22
+ // Pads toward the physical fan direction below, and
23
+ // `env(safe-area-inset-right)` names the device's own edge — it does not
24
+ // flip with direction, so it has to stay on the side it describes.
25
+ // rtl-ok: physical fan direction, physical `env()` inset
22
26
  padding-right: env(safe-area-inset-right);
23
27
  }
24
28
  &--safe-area.wr-speed-dial--right {
29
+ // rtl-ok: same pair as above — physical fan direction, physical inset.
25
30
  padding-left: env(safe-area-inset-left);
26
31
  }
27
32
 
@@ -90,11 +95,13 @@
90
95
  &--up {
91
96
  .wr-speed-dial__actions {
92
97
  bottom: 100%;
98
+ // rtl-ok: centred with a physical translateX, so the pair must stay physical
93
99
  left: 50%;
94
100
  transform: translateX(-50%);
95
101
  }
96
102
  .wr-speed-dial__action-wrap {
97
103
  bottom: 0;
104
+ // rtl-ok: centred with a physical translate(-50%, …), so the pair must stay physical
98
105
  left: 50%;
99
106
  transform: translate(-50%, 0.5rem);
100
107
  }
@@ -107,11 +114,13 @@
107
114
  &--down {
108
115
  .wr-speed-dial__actions {
109
116
  top: 100%;
117
+ // rtl-ok: centred with a physical translateX, so the pair must stay physical
110
118
  left: 50%;
111
119
  transform: translateX(-50%);
112
120
  }
113
121
  .wr-speed-dial__action-wrap {
114
122
  top: 0;
123
+ // rtl-ok: centred with a physical translate(-50%, …), so the pair must stay physical
115
124
  left: 50%;
116
125
  transform: translate(-50%, -0.5rem);
117
126
  }
@@ -123,11 +132,18 @@
123
132
 
124
133
  &--left {
125
134
  .wr-speed-dial__actions {
135
+ // The anchor and the fan offset are one pair — the actions travel on a
136
+ // physical `translateX` (`translate(calc(-1 * $offset), -50%)` below,
137
+ // which no logical property can mirror). Flip only the anchor and the
138
+ // dial fans back over its own trigger in RTL. A direction-aware fan is a
139
+ // TS/`Directionality` change, out of scope for this CSS sweep.
140
+ // rtl-ok: anchor paired with a physical translateX fan
126
141
  right: 100%;
127
142
  top: 50%;
128
143
  transform: translateY(-50%);
129
144
  }
130
145
  .wr-speed-dial__action-wrap {
146
+ // rtl-ok: same anchor/transform pair as above.
131
147
  right: 0;
132
148
  top: 50%;
133
149
  transform: translate(0.5rem, -50%);
@@ -140,11 +156,15 @@
140
156
 
141
157
  &--right {
142
158
  .wr-speed-dial__actions {
159
+ // Anchor paired with the physical `translate($offset, -50%)` fan below —
160
+ // see `--left` for why converting one half breaks the other.
161
+ // rtl-ok: anchor paired with a physical translateX fan
143
162
  left: 100%;
144
163
  top: 50%;
145
164
  transform: translateY(-50%);
146
165
  }
147
166
  .wr-speed-dial__action-wrap {
167
+ // rtl-ok: same anchor/transform pair as above.
148
168
  left: 0;
149
169
  top: 50%;
150
170
  transform: translate(-0.5rem, -50%);
@@ -9,6 +9,19 @@
9
9
  overflow-wrap: break-word;
10
10
  will-change: transform, opacity;
11
11
 
12
+ // Same shape as `wr-rotating-text`: the animated pieces are per-character
13
+ // spans, which a screen reader may read out one letter at a time, so the real
14
+ // string is carried once here and the pieces are taken out of the tree.
15
+ &__sr-only {
16
+ position: absolute;
17
+ width: 1px;
18
+ height: 1px;
19
+ overflow: hidden;
20
+ clip: rect(0 0 0 0);
21
+ clip-path: inset(50%);
22
+ white-space: nowrap;
23
+ }
24
+
12
25
  &__piece {
13
26
  display: inline-block;
14
27
  will-change: transform, opacity;
@@ -39,11 +39,13 @@
39
39
 
40
40
  &--bottom {
41
41
  bottom: -12px;
42
+ // rtl-ok: the comet's off-screen start mark — `wr-star-border-bottom` sweeps it by `translate(-100%, 0%)`
42
43
  right: -250%;
43
44
  }
44
45
 
45
46
  &--top {
46
47
  top: -12px;
48
+ // rtl-ok: the comet's off-screen start mark — `wr-star-border-top` sweeps it by `translate(100%, 0%)`
47
49
  left: -250%;
48
50
  animation-name: wr-star-border-top;
49
51
  }
@@ -45,8 +45,17 @@
45
45
  }
46
46
  }
47
47
 
48
+ // A column, because the connector is a SIBLING of the button inside the `<li>`:
49
+ // in a row it lands to the right of the label, where nothing connects. The
50
+ // giveaway was already in the connector's own rule — a `margin-left` of half
51
+ // the indicator only means anything when the line runs beneath the circle.
52
+ // `flex-start` rather than `stretch`: in a column that is the horizontal axis,
53
+ // so stretch would pull the button to full width and unstick the label from its
54
+ // circle. `gap: 0` because the base rule's 0.75rem would break the line.
48
55
  &--vertical &__header {
49
- align-items: stretch;
56
+ flex-direction: column;
57
+ align-items: flex-start;
58
+ gap: 0;
50
59
  flex: 0 0 auto;
51
60
  }
52
61
 
@@ -60,7 +69,7 @@
60
69
  gap: 0.625rem;
61
70
  color: var(--wr-color-on-surface);
62
71
  cursor: pointer;
63
- text-align: left;
72
+ text-align: start;
64
73
  flex: 0 0 auto;
65
74
 
66
75
  &:disabled {
@@ -141,6 +150,10 @@
141
150
 
142
151
  &--vertical &__connector {
143
152
  width: 1.5px;
153
+ // The shared rule's `min-width: 1rem` is a minimum LENGTH for the horizontal
154
+ // line, and it outranks `width` — so without this reset the vertical connector
155
+ // paints as a 16px block instead of a 1.5px thread.
156
+ min-width: 0;
144
157
  min-height: 1.25rem;
145
158
  height: auto;
146
159
  margin: 0.25rem 0 0.25rem calc(var(--wr-stepper-indicator-size) / 2);
@@ -167,12 +180,15 @@
167
180
  }
168
181
 
169
182
  .wr-stepper--responsive:not(.wr-stepper--vertical) .wr-stepper__header {
170
- align-items: stretch;
183
+ flex-direction: column;
184
+ align-items: flex-start;
185
+ gap: 0;
171
186
  flex: 0 0 auto;
172
187
  }
173
188
 
174
189
  .wr-stepper--responsive:not(.wr-stepper--vertical) .wr-stepper__connector {
175
190
  width: 1.5px;
191
+ min-width: 0;
176
192
  min-height: 1.25rem;
177
193
  height: auto;
178
194
  margin: 0.25rem 0 0.25rem calc(var(--wr-stepper-indicator-size) / 2);
package/styles/_grid.scss CHANGED
@@ -18,10 +18,10 @@ $gutter: var(--wr-grid-gutter);
18
18
  .container,
19
19
  .container-fluid {
20
20
  width: 100%;
21
- padding-right: calc(#{$gutter} * 0.5);
22
- padding-left: calc(#{$gutter} * 0.5);
23
- margin-left: auto;
24
- margin-right: auto;
21
+ padding-inline-end: calc(#{$gutter} * 0.5);
22
+ padding-inline-start: calc(#{$gutter} * 0.5);
23
+ margin-inline-start: auto;
24
+ margin-inline-end: auto;
25
25
  }
26
26
 
27
27
  @each $name, $max-width in bp.$container-widths {
package/styles.scss CHANGED
@@ -73,6 +73,7 @@
73
73
  @forward './line-chart/styles';
74
74
  @forward './list/styles';
75
75
  @forward './loading-bar/styles';
76
+ @forward './markdown/styles';
76
77
  @forward './marquee/styles';
77
78
  @forward './mention/styles';
78
79
  @forward './meter-group/styles';
@@ -55,14 +55,16 @@
55
55
  &__thumb {
56
56
  position: absolute;
57
57
  top: 50%;
58
- left: calc((var(--wr-switch-track-height) - var(--wr-switch-thumb-size)) / 2);
58
+ inset-inline-start: calc((var(--wr-switch-track-height) - var(--wr-switch-thumb-size)) / 2);
59
59
  transform: translateY(-50%);
60
60
  width: var(--wr-switch-thumb-size);
61
61
  height: var(--wr-switch-thumb-size);
62
62
  background: var(--wr-switch-thumb);
63
63
  border-radius: 50%;
64
64
  box-shadow: var(--wr-shadow-xs);
65
- transition: left var(--wr-transition-base);
65
+ // Follows the property above — a `transition: left` would no longer name the
66
+ // property that moves, and the thumb would snap instead of glide.
67
+ transition: inset-inline-start var(--wr-transition-base);
66
68
  }
67
69
 
68
70
  // Sizes — track, thumb, label font + line-height scale together.
@@ -86,7 +88,7 @@
86
88
  --wr-switch-bg: var(--wr-switch-bg-checked);
87
89
 
88
90
  .wr-switch__thumb {
89
- left: calc(
91
+ inset-inline-start: calc(
90
92
  var(--wr-switch-track-width) - var(--wr-switch-thumb-size) -
91
93
  ((var(--wr-switch-track-height) - var(--wr-switch-thumb-size)) / 2)
92
94
  );
@@ -54,7 +54,7 @@
54
54
  &__th,
55
55
  &__td {
56
56
  padding: calc(0.625rem * var(--wr-density-y, 1)) calc(0.875rem * var(--wr-density-x, 1));
57
- text-align: left;
57
+ text-align: start;
58
58
  vertical-align: middle;
59
59
  border-bottom: 1px solid var(--wr-table-border);
60
60
  }
@@ -91,7 +91,11 @@
91
91
  &__resize-handle {
92
92
  position: absolute;
93
93
  top: 0;
94
- right: 0;
94
+ // The grab edge is the side a growing width extends toward, and `table.ts`
95
+ // now signs that travel from `Directionality` (`resizeDelta()`): rightward
96
+ // in LTR, leftward in RTL. The two are a pair — flipping one without the
97
+ // other leaves the grip standing still while the column resizes.
98
+ inset-inline-end: 0;
95
99
  z-index: 1;
96
100
  width: 0.5rem;
97
101
  height: 100%;
@@ -103,7 +107,9 @@
103
107
  content: '';
104
108
  position: absolute;
105
109
  inset: 20% 0.1875rem;
106
- left: auto;
110
+ // Cancels the inline-START inset so the grip bar hugs the handle's own
111
+ // grab edge, whichever physical side that lands on.
112
+ inset-inline-start: auto;
107
113
  width: 2px;
108
114
  border-radius: 1px;
109
115
  background: var(--wr-color-outline);
@@ -315,14 +321,19 @@
315
321
  background-image: linear-gradient(var(--wr-table-row-hover), var(--wr-table-row-hover));
316
322
  }
317
323
 
318
- // Separating shadow on the inner edge of each pinned group.
324
+ // Separating shadow on the inner edge of each pinned group. `box-shadow` has
325
+ // no logical form — its offset is always physical — and the cell it belongs to
326
+ // is anchored by `[style.left.px]` / `[style.right.px]` in table.html, written
327
+ // from `leftPin()` / `rightPin()`. The shadow leans the way the offset pins.
319
328
  &__th--pin-edge-left,
320
329
  &__td--pin-edge-left {
330
+ // rtl-ok: physical offset matching the physical `left` pin set by the component
321
331
  box-shadow: 0.375rem 0 0.375rem -0.25rem rgba(0, 0, 0, 0.18);
322
332
  }
323
333
 
324
334
  &__th--pin-edge-right,
325
335
  &__td--pin-edge-right {
336
+ // rtl-ok: physical offset matching the physical `right` pin set by the component
326
337
  box-shadow: -0.375rem 0 0.375rem -0.25rem rgba(0, 0, 0, 0.18);
327
338
  }
328
339
 
@@ -398,10 +409,10 @@
398
409
  }
399
410
 
400
411
  // The band cell is full table width, so a sticky inline box inside it rides
401
- // horizontal scroll and keeps the label at the left edge. No measurement.
412
+ // horizontal scroll and keeps the label at the leading edge. No measurement.
402
413
  &__group-inner {
403
414
  position: sticky;
404
- left: 0;
415
+ inset-inline-start: 0;
405
416
  display: inline-flex;
406
417
  align-items: center;
407
418
  gap: 0.5rem;
@@ -586,7 +597,7 @@
586
597
  gap: 1rem;
587
598
  padding: 0.25rem 0.875rem;
588
599
  border-bottom: 0;
589
- text-align: right;
600
+ text-align: end;
590
601
  }
591
602
 
592
603
  .wr-table--responsive .wr-table__td::before {
@@ -600,7 +611,7 @@
600
611
  // so a consumer who opted out still got capitals on mobile.
601
612
  letter-spacing: var(--wr-table-head-letter-spacing);
602
613
  text-transform: var(--wr-table-head-transform);
603
- text-align: left;
614
+ text-align: start;
604
615
  white-space: nowrap;
605
616
  }
606
617
 
@@ -653,7 +664,7 @@
653
664
 
654
665
  .wr-table--responsive .wr-table__group-toggle {
655
666
  flex: 1 1 auto;
656
- text-align: left;
667
+ text-align: start;
657
668
  }
658
669
 
659
670
  // Per-group subtotals don't translate to cards either — hide like the grand footer.
@@ -769,7 +780,7 @@
769
780
  color: var(--wr-color-on-surface);
770
781
  font: inherit;
771
782
  font-size: var(--wr-text-sm);
772
- text-align: left;
783
+ text-align: start;
773
784
  cursor: pointer;
774
785
 
775
786
  &:hover {
@@ -813,11 +824,13 @@
813
824
  border: 0;
814
825
  padding: 0.375rem 0.5rem;
815
826
  border-radius: var(--wr-border-radius-sm);
816
- color: var(--wr-color-primary);
827
+ // A real "Reset" text button, so `-ink`. The sort / filter GLYPHS above keep
828
+ // the bare intent: graphics are held to 3:1, which they clear.
829
+ color: var(--wr-color-primary-ink);
817
830
  font: inherit;
818
831
  font-size: var(--wr-text-sm);
819
832
  cursor: pointer;
820
- text-align: left;
833
+ text-align: start;
821
834
 
822
835
  &:hover {
823
836
  background: var(--wr-color-primary-soft);
@@ -57,13 +57,23 @@
57
57
  --wr-tabs-fade: 1.5rem;
58
58
  --wr-tabs-fade-start: 0px;
59
59
  --wr-tabs-fade-end: 0px;
60
+ // A gradient has no logical direction keyword, so the axis is a variable the
61
+ // RTL rule below turns around. The two stops are LOGICAL — `updateFades()`
62
+ // measures the distance from the inline start — and the inline start is the
63
+ // right edge under `dir="rtl"`, so the gradient has to run the other way for
64
+ // the fade to land on the edge that still has tabs behind it.
65
+ --wr-tabs-fade-axis: to right;
60
66
  mask-image: linear-gradient(
61
- to right,
67
+ var(--wr-tabs-fade-axis),
62
68
  transparent 0,
63
69
  #000 var(--wr-tabs-fade-start),
64
70
  #000 calc(100% - var(--wr-tabs-fade-end)),
65
71
  transparent 100%
66
72
  );
73
+
74
+ [dir='rtl'] & {
75
+ --wr-tabs-fade-axis: to left;
76
+ }
67
77
  }
68
78
 
69
79
  &--fade-start &__strip {
@@ -94,6 +94,11 @@
94
94
  // cursor follow the `resize` direction.
95
95
  &__resize {
96
96
  position: absolute;
97
+ // `textarea.ts` starts the drag from `event.clientX` and applies
98
+ // `startWidth + (clientX - startX)`, so the grip has to sit on the physical
99
+ // side a growing width extends toward. Flip it only together with that sign,
100
+ // once the drag maths itself reads `Directionality`.
101
+ // rtl-ok: paired with the physical clientX drag maths in textarea.ts
97
102
  right: 0.25rem;
98
103
  bottom: 0.25rem;
99
104
  display: inline-flex;
@@ -9,15 +9,27 @@
9
9
  // $base-colors: (primary: #...)
10
10
  // );
11
11
 
12
+ // Five intents are deliberately deeper than their "brand" tone, and the reason is
13
+ // arithmetic rather than taste. `_contrast()` picks whichever of black / white
14
+ // scores HIGHER against the fill, and those two are equal at √21 ≈ 4.58 — so an
15
+ // intent lighter than that gets a black label whatever anyone prefers. At the old
16
+ // tones white measured 3.10–3.99 (below AA) and black 5.26–6.77, so black won on
17
+ // merit and the labels read muddy on a saturated mid-tone.
18
+ //
19
+ // Each of the five now sits just past the flip: white 4.60–4.64, black 4.52–4.56.
20
+ // The shift is 8–20% of the previous tone. `warning` and `light` are NOT in that
21
+ // set and cannot be — white needs `#906900` on warning, which is brown, not a
22
+ // warning colour; those two keep their black label, which is correct at 12.28 and
23
+ // 14.14.
12
24
  $base-colors: (
13
25
  primary: #3969e2,
14
- secondary: #f51c6a,
15
- success: #00a400,
26
+ secondary: #e21a62,
27
+ success: #008800,
16
28
  warning: #ffba00,
17
- danger: #fa383e,
18
- info: #3b82f6,
29
+ danger: #dc3137,
30
+ info: #3472d9,
19
31
  light: #cbd5e1,
20
- medium: #8594a4,
32
+ medium: #6a7683,
21
33
  dark: #0f172a,
22
34
  ) !default;
23
35
 
@@ -139,9 +151,10 @@ $contrast-light: #ffffff !default;
139
151
  // Muted TEXT, deliberately its own token rather than an alias of the `medium`
140
152
  // intent. The two roles pull in opposite directions and cannot share a value:
141
153
  // as text it needs >= 4.5:1 against the lightest surface (#ebeff4), while as a
142
- // button fill it carries dark text and needs >= 4.5:1 the other way. The best
143
- // candidate for either fails the other — the window closes around #6b7a8a
144
- // (3.81 as text, 4.11 as fill). Aliasing them left secondary text at 2.69:1.
154
+ // fill it has to clear the bar the other way, against its own label. v11 pulled
155
+ // them further apart rather than closer — the `medium` fill went deeper
156
+ // (#6a7683, whose label is now white at 4.63) while this token stayed where a
157
+ // light canvas needs it. Aliasing them left secondary text at 2.69:1.
145
158
  --wr-color-muted-text: #5f6c7d;
146
159
  --wr-color-muted-text-rgb: 95, 108, 125;
147
160
 
@@ -230,11 +243,14 @@ $contrast-light: #ffffff !default;
230
243
  // `-ink`: the intent used as TEXT on `--wr-color-surface`.
231
244
  //
232
245
  // v10 fixed the opposite direction — `-contrast`, the label ON a filled
233
- // intent. The inverse was never covered, and the light theme fails WCAG AA
234
- // everywhere an outlined / bordered variant paints the hue as its own label:
235
- // warning lands at 1.71:1 against a 4.5 bar, medium 3.10, success 3.33,
236
- // danger and info 3.68, secondary 3.99. Dark passes on all of them, because
237
- // its bases were retuned lighter for a dark canvas and that happens to be the
246
+ // intent. The inverse was never covered: an outlined / bordered variant paints
247
+ // the hue as its own label, and on a TINTED surface the light theme still
248
+ // fails there. Measured on #ebeff4, the lightest surface, after v11 deepened
249
+ // five of them: medium 4.01, success 4.02, danger 4.01, info and secondary
250
+ // 3.99 — all under the 4.5 bar — and warning 1.48, which nothing rescues.
251
+ // (On pure white those five now clear it at 4.61–4.64; the tint is what makes
252
+ // `-ink` necessary rather than optional.) Dark passes on all of them, because
253
+ // its bases are lighter for a dark canvas and that happens to be the
238
254
  // accessible direction.
239
255
  //
240
256
  // Same recipe as `-soft-contrast`: mixing toward `--wr-color-dark` darkens in
@@ -256,9 +272,22 @@ $contrast-light: #ffffff !default;
256
272
  // 4.42. Half a point of headroom absorbs that, for 2–7 points of share.
257
273
  //
258
274
  // Going further is not free: 5.25 costs 7–11 points and 5.5 up to 14, which
259
- // on `primary` means 93% -> 79% and a visibly muddier blue.
275
+ // on `primary` meant 93% -> 79% and a visibly muddier blue. (That trade was
276
+ // priced on the PRE-v11 bases; moving a base reprices it, as `primary` below
277
+ // shows — 78% now buys 5.0, not 5.5.)
278
+ //
279
+ // `primary` was re-derived when the DARK base deepened to #3567ff so its label
280
+ // could go white: a deeper base makes the ink deeper too, which on a dark tint
281
+ // is the losing direction. axe measured the old 86% at 4.48:1 on the sidebar's
282
+ // own tint — under AA, never mind the target. 78% is the most saturated share
283
+ // that reaches 5.0 there (5.04), and it only helps the light theme, where a
284
+ // lower share means MORE `--wr-color-dark` and a deeper ink on a pale tint.
285
+ // Solved against the exact pair axe resolved on the page (#4e79fd on #0f1a36),
286
+ // because a hand-rolled composite of the tint over the canvas does not
287
+ // reproduce what the browser paints — this file's own numbers are arithmetic,
288
+ // and `pnpm check:contrast` is the authority.
260
289
  $ink-mix: (
261
- primary: 86%,
290
+ primary: 78%,
262
291
  secondary: 75%,
263
292
  success: 67%,
264
293
  warning: 48%,
@@ -13,10 +13,15 @@
13
13
  // FULL symmetric shade set — the hand blocks used to ship only base+rgb,
14
14
  // leaving -light/-dark/-lighter/-darker baked from the LIGHT palette.
15
15
  // (primary keeps its hand-tuned block; info stays its light values.)
16
+ // `success` and `danger` are past the black/white flip point here too — see the
17
+ // note above `$base-colors`. The dark canvas wants a LIGHTER fill, so the deepening
18
+ // costs more here than in the light theme (33% and 21%), and that is the trade:
19
+ // a duller green, in exchange for a label that is legible rather than muddy.
20
+ // `warning` stays as it is — white cannot reach it at any tone worth shipping.
16
21
  $dark-intents: (
17
- success: #34c759,
22
+ success: #23863c,
18
23
  warning: #ffcc33,
19
- danger: #ff5c5c,
24
+ danger: #ca4949,
20
25
  );
21
26
 
22
27
  // The surface / ink bases below are re-tuned for the dark canvas too, but they
@@ -25,7 +30,10 @@ $dark-intents: (
25
30
  // the shade derivations read from the value that actually ships, instead of
26
31
  // being re-typed next to it.
27
32
  $_light: #262f44;
28
- $_medium: #9aa6b8;
33
+ // The medium FILL, past the flip point. Not the muted-text role: that reads from
34
+ // `--wr-color-muted-text` below, which stays #9aa6b8 — it is text on the canvas,
35
+ // where lighter is what makes it legible, the opposite direction from a fill.
36
+ $_medium: #6d7682;
29
37
  $_dark: #e6ebf3;
30
38
 
31
39
  [data-theme='dark'] {
@@ -116,18 +124,30 @@ $_dark: #e6ebf3;
116
124
  --wr-color-muted-text-rgb: 154, 166, 184;
117
125
 
118
126
  // Brand-color retune
119
- // The default primary (#3969e2) reads a touch dim on the deep
120
- // canvas. Bump the base + shade derivations so hover / focus rings
121
- // stay visible against slate-900.
122
- --wr-color-primary: #5b85ff;
123
- // Same reason as the loop above — the light primary pairs with white, but the
124
- // lightened dark-theme primary only reaches 3.36:1 against it.
125
- --wr-color-primary-contrast: #{colors.contrast(#5b85ff)};
126
- --wr-color-primary-rgb: 91, 133, 255;
127
- --wr-color-primary-light: #7a9eff;
128
- --wr-color-primary-dark: #2f56c9;
129
- --wr-color-primary-lighter: #99b6ff;
130
- --wr-color-primary-darker: #1f3a99;
127
+ // The default primary (#3969e2) reads a touch dim on the deep canvas. What
128
+ // carries here is SATURATION, not lightness: #3567ff is only ~7% more luminous
129
+ // than the light base but runs the blue channel to 255, and the shades follow it
130
+ // so hover / focus rings stay visible against slate-900.
131
+ //
132
+ // Deep enough for a WHITE label, and no deeper. `_contrast()` takes whichever
133
+ // of black / white scores higher, and the two are equal at √21 ≈ 4.58 — the
134
+ // previous #5b85ff sat at white 3.36 / black 6.24, so it took a BLACK label
135
+ // while the light theme's primary took white: one intent labelled two
136
+ // different ways across the themes. #3567ff reads white 4.63 / black 4.54.
137
+ //
138
+ // Saturation stays at 100%. Scaling the channels toward black reaches the same
139
+ // ratio at #4c6fd6, but that is S 63% — duller, which is the opposite of what
140
+ // this block exists for. Dropping lightness at full saturation keeps the colour
141
+ // vivid, and keeps it distinct from the light theme's #3969e2 rather than
142
+ // collapsing onto it.
143
+ --wr-color-primary: #3567ff;
144
+ --wr-color-primary-contrast: #{colors.contrast(#3567ff)};
145
+ --wr-color-primary-rgb: 53, 103, 255;
146
+ // The same lightness steps as before, taken off the new base.
147
+ --wr-color-primary-light: #547eff;
148
+ --wr-color-primary-dark: #2848aa;
149
+ --wr-color-primary-lighter: #7396ff;
150
+ --wr-color-primary-darker: #183179;
131
151
 
132
152
  // success / warning / danger — retuned bases now get the FULL symmetric
133
153
  // shade set in dark too (generated, so no intent can silently drift).
@@ -93,6 +93,9 @@
93
93
  content: '';
94
94
  position: absolute;
95
95
  top: 50%;
96
+ // rtl-ok: centred with a physical `translate(-50%, -50%)` below, so the
97
+ // pair must stay physical — mirroring only this half would shift the
98
+ // hit area off the control by its own width under `dir="rtl"`.
96
99
  left: 50%;
97
100
  width: 100%;
98
101
  height: 100%;