ngwr 11.2.0 → 12.0.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 (394) hide show
  1. package/README.md +7 -7
  2. package/burger/styles/_index.scss +1 -1
  3. package/button/styles/_index.scss +2 -2
  4. package/calendar/styles/_index.scss +32 -12
  5. package/calendar-heatmap/styles/_index.scss +20 -0
  6. package/carousel/styles/_index.scss +23 -1
  7. package/cascader/styles/_index.scss +15 -3
  8. package/checkbox/styles/_index.scss +2 -2
  9. package/collapse/styles/_index.scss +2 -2
  10. package/color-picker/styles/_index.scss +3 -3
  11. package/compare/styles/_index.scss +18 -2
  12. package/context-menu/styles/_index.scss +21 -2
  13. package/date-picker/styles/_index.scss +5 -5
  14. package/descriptions/styles/_index.scss +1 -1
  15. package/drag-drop/styles/_index.scss +28 -1
  16. package/drawer/styles/_index.scss +37 -0
  17. package/dropdown/styles/_index.scss +2 -2
  18. package/event-calendar/styles/_index.scss +67 -10
  19. package/fesm2022/ngwr-action-sheet.mjs +3 -3
  20. package/fesm2022/ngwr-affix.mjs +3 -3
  21. package/fesm2022/ngwr-alert.mjs +3 -3
  22. package/fesm2022/ngwr-anchor.mjs +3 -3
  23. package/fesm2022/ngwr-aurora.mjs +3 -3
  24. package/fesm2022/ngwr-avatar.mjs +3 -3
  25. package/fesm2022/ngwr-back-top.mjs +3 -3
  26. package/fesm2022/ngwr-badge.mjs +6 -6
  27. package/fesm2022/ngwr-bar-chart-testing.mjs +20 -2
  28. package/fesm2022/ngwr-bar-chart-testing.mjs.map +1 -1
  29. package/fesm2022/ngwr-bar-chart.mjs +3 -3
  30. package/fesm2022/ngwr-blur-text.mjs +3 -3
  31. package/fesm2022/ngwr-blur-text.mjs.map +1 -1
  32. package/fesm2022/ngwr-border-glow.mjs +4 -4
  33. package/fesm2022/ngwr-border-glow.mjs.map +1 -1
  34. package/fesm2022/ngwr-breadcrumbs.mjs +29 -17
  35. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  36. package/fesm2022/ngwr-burger.mjs +3 -3
  37. package/fesm2022/ngwr-button.mjs +6 -6
  38. package/fesm2022/ngwr-calendar-heatmap.mjs +17 -5
  39. package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
  40. package/fesm2022/ngwr-calendar-testing.mjs +1 -1
  41. package/fesm2022/ngwr-calendar-testing.mjs.map +1 -1
  42. package/fesm2022/ngwr-calendar.mjs +187 -9
  43. package/fesm2022/ngwr-calendar.mjs.map +1 -1
  44. package/fesm2022/ngwr-card.mjs +10 -10
  45. package/fesm2022/ngwr-card.mjs.map +1 -1
  46. package/fesm2022/ngwr-carousel.mjs +124 -24
  47. package/fesm2022/ngwr-carousel.mjs.map +1 -1
  48. package/fesm2022/ngwr-cascader.mjs +48 -5
  49. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  50. package/fesm2022/ngwr-checkbox.mjs +6 -6
  51. package/fesm2022/ngwr-circular-text.mjs +4 -4
  52. package/fesm2022/ngwr-circular-text.mjs.map +1 -1
  53. package/fesm2022/ngwr-click-spark.mjs +27 -7
  54. package/fesm2022/ngwr-click-spark.mjs.map +1 -1
  55. package/fesm2022/ngwr-clipboard.mjs +3 -3
  56. package/fesm2022/ngwr-collapse.mjs +9 -9
  57. package/fesm2022/ngwr-color-picker-testing.mjs +26 -6
  58. package/fesm2022/ngwr-color-picker-testing.mjs.map +1 -1
  59. package/fesm2022/ngwr-color-picker.mjs +98 -8
  60. package/fesm2022/ngwr-color-picker.mjs.map +1 -1
  61. package/fesm2022/ngwr-command-palette.mjs +14 -5
  62. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  63. package/fesm2022/ngwr-compare.mjs +3 -3
  64. package/fesm2022/ngwr-confetti.mjs +31 -6
  65. package/fesm2022/ngwr-confetti.mjs.map +1 -1
  66. package/fesm2022/ngwr-config.mjs +9 -0
  67. package/fesm2022/ngwr-config.mjs.map +1 -1
  68. package/fesm2022/ngwr-context-menu-testing.mjs +30 -11
  69. package/fesm2022/ngwr-context-menu-testing.mjs.map +1 -1
  70. package/fesm2022/ngwr-context-menu.mjs +333 -43
  71. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  72. package/fesm2022/ngwr-cookie.mjs +3 -3
  73. package/fesm2022/ngwr-counter.mjs +25 -9
  74. package/fesm2022/ngwr-counter.mjs.map +1 -1
  75. package/fesm2022/{ngwr-date-adapter-fns.mjs → ngwr-date-adapters-fns.mjs} +37 -10
  76. package/fesm2022/ngwr-date-adapters-fns.mjs.map +1 -0
  77. package/fesm2022/{ngwr-date-adapter-luxon.mjs → ngwr-date-adapters-luxon.mjs} +5 -5
  78. package/fesm2022/ngwr-date-adapters-luxon.mjs.map +1 -0
  79. package/fesm2022/ngwr-date-picker-testing.mjs +11 -6
  80. package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -1
  81. package/fesm2022/ngwr-date-picker.mjs +119 -37
  82. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  83. package/fesm2022/{ngwr-date-adapter.mjs → ngwr-date.mjs} +36 -10
  84. package/fesm2022/ngwr-date.mjs.map +1 -0
  85. package/fesm2022/ngwr-decrypt-text.mjs +3 -3
  86. package/fesm2022/ngwr-density.mjs +6 -6
  87. package/fesm2022/ngwr-descriptions.mjs +6 -6
  88. package/fesm2022/ngwr-dialog.mjs +73 -18
  89. package/fesm2022/ngwr-dialog.mjs.map +1 -1
  90. package/fesm2022/ngwr-directives.mjs +12 -12
  91. package/fesm2022/ngwr-divider.mjs +52 -5
  92. package/fesm2022/ngwr-divider.mjs.map +1 -1
  93. package/fesm2022/ngwr-donut-chart-testing.mjs +8 -4
  94. package/fesm2022/ngwr-donut-chart-testing.mjs.map +1 -1
  95. package/fesm2022/ngwr-donut-chart.mjs +7 -7
  96. package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
  97. package/fesm2022/ngwr-drag-drop.mjs +160 -11
  98. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  99. package/fesm2022/ngwr-drawer.mjs +121 -58
  100. package/fesm2022/ngwr-drawer.mjs.map +1 -1
  101. package/fesm2022/ngwr-dropdown.mjs +26 -10
  102. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  103. package/fesm2022/ngwr-empty.mjs +3 -3
  104. package/fesm2022/ngwr-event-calendar.mjs +28 -15
  105. package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
  106. package/fesm2022/ngwr-falling-text-testing.mjs +5 -3
  107. package/fesm2022/ngwr-falling-text-testing.mjs.map +1 -1
  108. package/fesm2022/ngwr-falling-text.mjs +75 -46
  109. package/fesm2022/ngwr-falling-text.mjs.map +1 -1
  110. package/fesm2022/ngwr-file-upload.mjs +3 -3
  111. package/fesm2022/ngwr-form.mjs +32 -15
  112. package/fesm2022/ngwr-form.mjs.map +1 -1
  113. package/fesm2022/ngwr-fuzzy-text.mjs +21 -11
  114. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
  115. package/fesm2022/ngwr-gauge.mjs +3 -3
  116. package/fesm2022/ngwr-glitch-text-testing.mjs +51 -17
  117. package/fesm2022/ngwr-glitch-text-testing.mjs.map +1 -1
  118. package/fesm2022/ngwr-glitch-text.mjs +7 -7
  119. package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
  120. package/fesm2022/ngwr-gradient-text-testing.mjs +46 -11
  121. package/fesm2022/ngwr-gradient-text-testing.mjs.map +1 -1
  122. package/fesm2022/ngwr-gradient-text.mjs +4 -4
  123. package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
  124. package/fesm2022/ngwr-hotkey.mjs +24 -9
  125. package/fesm2022/ngwr-hotkey.mjs.map +1 -1
  126. package/fesm2022/ngwr-i18n-en.mjs +73 -1
  127. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  128. package/fesm2022/ngwr-i18n-ru.mjs +55 -1
  129. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  130. package/fesm2022/ngwr-i18n.mjs +26 -15
  131. package/fesm2022/ngwr-i18n.mjs.map +1 -1
  132. package/fesm2022/ngwr-icon.mjs +6 -6
  133. package/fesm2022/ngwr-image-cropper-testing.mjs +53 -9
  134. package/fesm2022/ngwr-image-cropper-testing.mjs.map +1 -1
  135. package/fesm2022/ngwr-image-cropper.mjs +150 -12
  136. package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
  137. package/fesm2022/ngwr-input-number-testing.mjs +15 -10
  138. package/fesm2022/ngwr-input-number-testing.mjs.map +1 -1
  139. package/fesm2022/ngwr-input-number.mjs +17 -10
  140. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  141. package/fesm2022/ngwr-input-otp-testing.mjs +12 -6
  142. package/fesm2022/ngwr-input-otp-testing.mjs.map +1 -1
  143. package/fesm2022/ngwr-input-otp.mjs +24 -5
  144. package/fesm2022/ngwr-input-otp.mjs.map +1 -1
  145. package/fesm2022/ngwr-input.mjs +15 -15
  146. package/fesm2022/ngwr-keyboard.mjs +3 -3
  147. package/fesm2022/ngwr-knob.mjs +3 -3
  148. package/fesm2022/ngwr-layout.mjs +15 -15
  149. package/fesm2022/ngwr-lightbox.mjs +4 -4
  150. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  151. package/fesm2022/ngwr-line-chart.mjs +73 -26
  152. package/fesm2022/ngwr-line-chart.mjs.map +1 -1
  153. package/fesm2022/ngwr-list.mjs +7 -7
  154. package/fesm2022/ngwr-list.mjs.map +1 -1
  155. package/fesm2022/ngwr-loading-bar.mjs +7 -7
  156. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  157. package/fesm2022/ngwr-markdown.mjs +66 -8
  158. package/fesm2022/ngwr-markdown.mjs.map +1 -1
  159. package/fesm2022/ngwr-marquee.mjs +4 -4
  160. package/fesm2022/ngwr-marquee.mjs.map +1 -1
  161. package/fesm2022/ngwr-media.mjs +3 -3
  162. package/fesm2022/ngwr-mention.mjs +108 -13
  163. package/fesm2022/ngwr-mention.mjs.map +1 -1
  164. package/fesm2022/ngwr-meta.mjs +6 -6
  165. package/fesm2022/ngwr-meter-group-testing.mjs +26 -6
  166. package/fesm2022/ngwr-meter-group-testing.mjs.map +1 -1
  167. package/fesm2022/ngwr-meter-group.mjs +3 -3
  168. package/fesm2022/ngwr-overlay.mjs +6 -6
  169. package/fesm2022/ngwr-page-header.mjs +3 -3
  170. package/fesm2022/ngwr-pagination-testing.mjs +6 -6
  171. package/fesm2022/ngwr-pagination-testing.mjs.map +1 -1
  172. package/fesm2022/ngwr-pagination.mjs +17 -13
  173. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  174. package/fesm2022/ngwr-pipes.mjs +39 -26
  175. package/fesm2022/ngwr-pipes.mjs.map +1 -1
  176. package/fesm2022/ngwr-platform.mjs +9 -9
  177. package/fesm2022/ngwr-popconfirm.mjs +6 -6
  178. package/fesm2022/ngwr-popover-testing.mjs +7 -2
  179. package/fesm2022/ngwr-popover-testing.mjs.map +1 -1
  180. package/fesm2022/ngwr-popover.mjs +155 -33
  181. package/fesm2022/ngwr-popover.mjs.map +1 -1
  182. package/fesm2022/ngwr-progress.mjs +3 -3
  183. package/fesm2022/ngwr-pull-to-refresh.mjs +3 -3
  184. package/fesm2022/ngwr-qr.mjs +42 -5
  185. package/fesm2022/ngwr-qr.mjs.map +1 -1
  186. package/fesm2022/ngwr-radio.mjs +6 -6
  187. package/fesm2022/ngwr-rating.mjs +3 -3
  188. package/fesm2022/ngwr-result.mjs +21 -30
  189. package/fesm2022/ngwr-result.mjs.map +1 -1
  190. package/fesm2022/ngwr-rotating-text.mjs +3 -3
  191. package/fesm2022/ngwr-scroll.mjs +3 -3
  192. package/fesm2022/ngwr-segmented-testing.mjs +14 -1
  193. package/fesm2022/ngwr-segmented-testing.mjs.map +1 -1
  194. package/fesm2022/ngwr-segmented.mjs +29 -6
  195. package/fesm2022/ngwr-segmented.mjs.map +1 -1
  196. package/fesm2022/ngwr-select.mjs +159 -34
  197. package/fesm2022/ngwr-select.mjs.map +1 -1
  198. package/fesm2022/ngwr-shiny-text.mjs +11 -9
  199. package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
  200. package/fesm2022/ngwr-sidebar.mjs +31 -16
  201. package/fesm2022/ngwr-sidebar.mjs.map +1 -1
  202. package/fesm2022/ngwr-skeleton.mjs +3 -3
  203. package/fesm2022/ngwr-slider.mjs +100 -9
  204. package/fesm2022/ngwr-slider.mjs.map +1 -1
  205. package/fesm2022/ngwr-sparkline.mjs +3 -3
  206. package/fesm2022/ngwr-speed-dial-testing.mjs +15 -13
  207. package/fesm2022/ngwr-speed-dial-testing.mjs.map +1 -1
  208. package/fesm2022/ngwr-speed-dial.mjs +27 -12
  209. package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
  210. package/fesm2022/ngwr-spinner.mjs +3 -3
  211. package/fesm2022/ngwr-splash-cursor.mjs +3 -3
  212. package/fesm2022/ngwr-split-text.mjs +17 -5
  213. package/fesm2022/ngwr-split-text.mjs.map +1 -1
  214. package/fesm2022/ngwr-splitter.mjs +3 -3
  215. package/fesm2022/ngwr-spotlight-card.mjs +7 -7
  216. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  217. package/fesm2022/ngwr-squircle.mjs +6 -6
  218. package/fesm2022/ngwr-star-border.mjs +4 -4
  219. package/fesm2022/ngwr-star-border.mjs.map +1 -1
  220. package/fesm2022/ngwr-statistic.mjs +9 -9
  221. package/fesm2022/ngwr-stepper-testing.mjs +8 -8
  222. package/fesm2022/ngwr-stepper-testing.mjs.map +1 -1
  223. package/fesm2022/ngwr-stepper.mjs +33 -8
  224. package/fesm2022/ngwr-stepper.mjs.map +1 -1
  225. package/fesm2022/ngwr-storage.mjs +17 -5
  226. package/fesm2022/ngwr-storage.mjs.map +1 -1
  227. package/fesm2022/ngwr-switch.mjs +3 -3
  228. package/fesm2022/ngwr-table.mjs +99 -39
  229. package/fesm2022/ngwr-table.mjs.map +1 -1
  230. package/fesm2022/ngwr-tabs-testing.mjs +11 -10
  231. package/fesm2022/ngwr-tabs-testing.mjs.map +1 -1
  232. package/fesm2022/ngwr-tabs.mjs +36 -10
  233. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  234. package/fesm2022/ngwr-textarea.mjs +3 -3
  235. package/fesm2022/ngwr-theme.mjs +181 -4
  236. package/fesm2022/ngwr-theme.mjs.map +1 -1
  237. package/fesm2022/ngwr-tilt-card.mjs +7 -7
  238. package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
  239. package/fesm2022/ngwr-timeline.mjs +6 -6
  240. package/fesm2022/ngwr-toast.mjs +9 -9
  241. package/fesm2022/ngwr-toolbar.mjs +3 -3
  242. package/fesm2022/ngwr-tour.mjs +34 -10
  243. package/fesm2022/ngwr-tour.mjs.map +1 -1
  244. package/fesm2022/ngwr-transfer.mjs +3 -3
  245. package/fesm2022/ngwr-tree.mjs +28 -10
  246. package/fesm2022/ngwr-tree.mjs.map +1 -1
  247. package/fesm2022/ngwr-typewriter-testing.mjs +15 -1
  248. package/fesm2022/ngwr-typewriter-testing.mjs.map +1 -1
  249. package/fesm2022/ngwr-typewriter.mjs +13 -5
  250. package/fesm2022/ngwr-typewriter.mjs.map +1 -1
  251. package/fesm2022/ngwr-typography.mjs +3 -3
  252. package/fesm2022/ngwr-utils.mjs +5 -2
  253. package/fesm2022/ngwr-utils.mjs.map +1 -1
  254. package/fesm2022/ngwr-version.mjs +1 -1
  255. package/fesm2022/ngwr-version.mjs.map +1 -1
  256. package/fesm2022/ngwr-virtual-scroll.mjs +4 -4
  257. package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
  258. package/fesm2022/ngwr-waves.mjs +4 -4
  259. package/fesm2022/ngwr-waves.mjs.map +1 -1
  260. package/fesm2022/ngwr-window.mjs +94 -24
  261. package/fesm2022/ngwr-window.mjs.map +1 -1
  262. package/file-upload/styles/_index.scss +2 -2
  263. package/glitch-text/styles/_index.scss +27 -12
  264. package/i18n/en.json +56 -6
  265. package/i18n/ru.json +56 -6
  266. package/image-cropper/styles/_index.scss +19 -0
  267. package/input/styles/_index.scss +2 -2
  268. package/input-number/styles/_index.scss +2 -2
  269. package/input-otp/styles/_index.scss +9 -2
  270. package/knob/styles/_index.scss +1 -1
  271. package/lightbox/styles/_index.scss +16 -2
  272. package/line-chart/styles/_index.scss +28 -14
  273. package/list/styles/_index.scss +1 -1
  274. package/llms-full.txt +18 -23
  275. package/llms.txt +22 -6
  276. package/markdown/styles/_index.scss +3 -3
  277. package/mcp/api.js +6 -4
  278. package/mcp/catalog.js +40 -3
  279. package/mcp/providers.js +16 -3
  280. package/mcp/tools.js +21 -1
  281. package/meter-group/styles/_index.scss +1 -1
  282. package/overlay/styles/_index.scss +33 -1
  283. package/package.json +17 -12
  284. package/pagination/styles/_index.scss +23 -1
  285. package/popover/styles/_index.scss +16 -7
  286. package/progress/styles/_index.scss +1 -1
  287. package/radio/styles/_index.scss +2 -2
  288. package/rating/styles/_index.scss +1 -1
  289. package/schematics/collection.json +1 -1
  290. package/schematics/migrations/v12/index.js +65 -0
  291. package/schematics/migrations/v7/index.js +12 -1
  292. package/schematics/migrations/v8/index.js +10 -1
  293. package/schematics/migrations.json +5 -0
  294. package/schematics/ng-add/index.js +8 -3
  295. package/schematics/provider/index.js +80 -13
  296. package/schematics/use/index.js +9 -129
  297. package/schematics/use/rule.js +206 -0
  298. package/schematics/use/symbol-map.json +4 -4
  299. package/segmented/styles/_index.scss +14 -3
  300. package/select/styles/_index.scss +14 -2
  301. package/sidebar/styles/_index.scss +12 -10
  302. package/skills/ngwr/SKILL.md +7 -5
  303. package/skills/ngwr/references/catalog.md +9 -9
  304. package/skills/ngwr/references/setup.md +10 -5
  305. package/slider/styles/_index.scss +1 -1
  306. package/speed-dial/styles/_index.scss +1 -1
  307. package/stepper/styles/_index.scss +12 -3
  308. package/switch/styles/_index.scss +2 -2
  309. package/table/styles/_index.scss +61 -12
  310. package/tabs/styles/_index.scss +1 -1
  311. package/textarea/styles/_index.scss +1 -1
  312. package/theme/styles/_colors.scss +142 -56
  313. package/theme/styles/_dark.scss +46 -3
  314. package/theme/styles/_focus.scss +28 -5
  315. package/theme/styles/_mixins.scss +1 -1
  316. package/theme/styles/_variables.scss +67 -0
  317. package/transfer/styles/_index.scss +26 -3
  318. package/tree/styles/_index.scss +29 -6
  319. package/types/ngwr-bar-chart-testing.d.ts +9 -1
  320. package/types/ngwr-blur-text.d.ts +8 -4
  321. package/types/ngwr-breadcrumbs.d.ts +17 -10
  322. package/types/ngwr-calendar-testing.d.ts +1 -1
  323. package/types/ngwr-calendar.d.ts +66 -0
  324. package/types/ngwr-carousel.d.ts +85 -6
  325. package/types/ngwr-cascader.d.ts +17 -0
  326. package/types/ngwr-click-spark.d.ts +4 -0
  327. package/types/ngwr-color-picker-testing.d.ts +8 -0
  328. package/types/ngwr-color-picker.d.ts +21 -1
  329. package/types/ngwr-confetti.d.ts +8 -0
  330. package/types/ngwr-config.d.ts +10 -1
  331. package/types/ngwr-context-menu-testing.d.ts +24 -11
  332. package/types/ngwr-context-menu.d.ts +56 -0
  333. package/types/ngwr-counter.d.ts +1 -0
  334. package/types/{ngwr-date-adapter-fns.d.ts → ngwr-date-adapters-fns.d.ts} +33 -6
  335. package/types/{ngwr-date-adapter-luxon.d.ts → ngwr-date-adapters-luxon.d.ts} +1 -1
  336. package/types/ngwr-date-picker-testing.d.ts +11 -6
  337. package/types/ngwr-date-picker.d.ts +8 -4
  338. package/types/{ngwr-date-adapter.d.ts → ngwr-date.d.ts} +24 -5
  339. package/types/ngwr-dialog.d.ts +38 -1
  340. package/types/ngwr-divider.d.ts +25 -0
  341. package/types/ngwr-donut-chart-testing.d.ts +7 -3
  342. package/types/ngwr-donut-chart.d.ts +3 -3
  343. package/types/ngwr-drag-drop.d.ts +56 -2
  344. package/types/ngwr-drawer.d.ts +56 -5
  345. package/types/ngwr-event-calendar.d.ts +8 -2
  346. package/types/ngwr-falling-text-testing.d.ts +5 -3
  347. package/types/ngwr-falling-text.d.ts +1 -1
  348. package/types/ngwr-form.d.ts +12 -2
  349. package/types/ngwr-glitch-text-testing.d.ts +37 -8
  350. package/types/ngwr-gradient-text-testing.d.ts +16 -3
  351. package/types/ngwr-i18n.d.ts +13 -4
  352. package/types/ngwr-image-cropper-testing.d.ts +49 -10
  353. package/types/ngwr-image-cropper.d.ts +70 -5
  354. package/types/ngwr-input-number-testing.d.ts +15 -10
  355. package/types/ngwr-input-number.d.ts +11 -4
  356. package/types/ngwr-input-otp-testing.d.ts +12 -6
  357. package/types/ngwr-input-otp.d.ts +15 -1
  358. package/types/ngwr-line-chart.d.ts +20 -3
  359. package/types/ngwr-markdown.d.ts +11 -0
  360. package/types/ngwr-mention.d.ts +32 -0
  361. package/types/ngwr-meter-group-testing.d.ts +12 -2
  362. package/types/ngwr-overlay.d.ts +1 -0
  363. package/types/ngwr-pagination-testing.d.ts +4 -4
  364. package/types/ngwr-pipes.d.ts +1 -1
  365. package/types/ngwr-popover-testing.d.ts +7 -2
  366. package/types/ngwr-popover.d.ts +1 -0
  367. package/types/ngwr-result.d.ts +6 -0
  368. package/types/ngwr-segmented-testing.d.ts +9 -0
  369. package/types/ngwr-segmented.d.ts +21 -1
  370. package/types/ngwr-select.d.ts +68 -6
  371. package/types/ngwr-shiny-text.d.ts +4 -2
  372. package/types/ngwr-sidebar.d.ts +14 -5
  373. package/types/ngwr-slider.d.ts +69 -1
  374. package/types/ngwr-speed-dial-testing.d.ts +15 -11
  375. package/types/ngwr-speed-dial.d.ts +22 -3
  376. package/types/ngwr-split-text.d.ts +9 -0
  377. package/types/ngwr-stepper-testing.d.ts +5 -5
  378. package/types/ngwr-stepper.d.ts +8 -0
  379. package/types/ngwr-storage.d.ts +1 -0
  380. package/types/ngwr-table.d.ts +104 -11
  381. package/types/ngwr-tabs-testing.d.ts +11 -10
  382. package/types/ngwr-tabs.d.ts +2 -0
  383. package/types/ngwr-theme.d.ts +82 -1
  384. package/types/ngwr-tour.d.ts +22 -4
  385. package/types/ngwr-tree.d.ts +5 -4
  386. package/types/ngwr-typewriter-testing.d.ts +10 -0
  387. package/types/ngwr-utils.d.ts +5 -2
  388. package/types/ngwr-version.d.ts +1 -1
  389. package/types/ngwr-window.d.ts +39 -11
  390. package/typography/styles/_index.scss +1 -1
  391. package/window/styles/_index.scss +72 -26
  392. package/fesm2022/ngwr-date-adapter-fns.mjs.map +0 -1
  393. package/fesm2022/ngwr-date-adapter-luxon.mjs.map +0 -1
  394. package/fesm2022/ngwr-date-adapter.mjs.map +0 -1
@@ -113,33 +113,47 @@ $contrast-light: #ffffff !default;
113
113
 
114
114
  // CSS variables
115
115
 
116
- :root {
117
- // Declared here so the light token set also claims the light UA scheme.
118
- // Without it the browser fell back to the OS preference, and an app running
119
- // ngwr's LIGHT theme on a dark-mode machine got dark scrollbars and dark
120
- // native controls (<textarea>, date/colour inputs) against light surfaces.
121
- // `_dark.scss` still flips it to `dark` under [data-theme='dark'], which wins
122
- // on specificity.
123
- color-scheme: light;
124
-
125
- --wr-color-white: #ffffff;
126
- --wr-color-white-rgb: 255, 255, 255;
127
- --wr-color-black: #000000;
128
- --wr-color-black-rgb: 0, 0, 0;
129
-
130
- // Overlay dim — used by dialog / drawer / image preview / command
131
- // palette / image cropper for the behind-the-panel scrim. Always
132
- // black so the dim reads as "covered" regardless of theme. Don't
133
- // wire to `--wr-color-dark-rgb` — that flips to light in dark mode
134
- // and turns the backdrop into a white wash.
135
- --wr-color-backdrop-rgb: 0, 0, 0;
136
-
116
+ /// Every public token whose value is COMPOSED out of another token.
117
+ ///
118
+ /// They live in a mixin rather than straight in `:root` because a custom
119
+ /// property's `var()` references are substituted at computed-value time ON THE
120
+ /// ELEMENT THAT DECLARES IT, and what inherits down the tree is the substituted
121
+ /// LITERAL. Declared once at `:root`, `--wr-color-surface: var(--wr-color-white)`
122
+ /// computes to `#ffffff` there and every descendant inherits `#ffffff` — not the
123
+ /// reference. Re-tuning `--wr-color-white` further down the tree does nothing to
124
+ /// it afterwards.
125
+ ///
126
+ /// That costs nothing for the whole-page dark theme: `[data-theme='dark']`
127
+ /// matches the same `<html>` that `:root` does, so the bases it re-tunes and the
128
+ /// tokens composed off them resolve on ONE element and stay consistent. It
129
+ /// breaks the moment the attribute goes on a SUBTREE — a forced-dark preview, a
130
+ /// dark hero on a light page — where the bases flip and fifty composed tokens
131
+ /// keep their light values. The docs' own colours guide does exactly that, and
132
+ /// its forced-dark panel painted muted text at 3.27:1 with `--wr-color-surface`
133
+ /// still reading `#ffffff` beside a `--wr-color-muted-text` that had correctly
134
+ /// flipped.
135
+ ///
136
+ /// So `_dark.scss` includes this too: re-declaring the compositions ON the themed
137
+ /// element is what makes them re-resolve against that element's own bases. A new
138
+ /// token written in terms of `var()` gets that for free if it is added HERE, and
139
+ /// is frozen again if it is added to `:root` directly — that is the whole rule.
140
+ @mixin derived() {
137
141
  // Generic subtle hover-surface tint (icon buttons, list rows) — one place
138
142
  // so the hover strength stays consistent everywhere.
139
143
  --wr-color-hover: rgba(var(--wr-color-light-rgb), 0.4);
140
144
 
141
145
  // Border / divider strengths — translucent so they read on any surface and
142
146
  // auto-adapt in dark (via the flipping `light` channels). One place each.
147
+ //
148
+ // unused-ok: for `-subtle` and `-strong`. The catalog draws its hairlines with
149
+ // the opaque `--wr-color-outline`, and `--wr-color-border` has one consumer
150
+ // (`wr-avatar`'s ring), so these two are the weaker and stronger ends of a
151
+ // scale offered to consumers rather than one we paint with. They were NOT the
152
+ // answer to the twenty-two files that hand-rolled
153
+ // `rgba(var(--wr-color-outline-rgb), α)` at eight alphas — four of which
154
+ // computed to exactly these values. Those were FILLS, and naming a fill after a
155
+ // hairline is how a token layer starts lying, so the `--wr-color-fill*` scale
156
+ // below absorbed them instead; not one of those hand-rolls is left.
143
157
  --wr-color-border: rgba(var(--wr-color-light-rgb), 0.5);
144
158
  --wr-color-border-subtle: rgba(var(--wr-color-light-rgb), 0.35);
145
159
  --wr-color-border-strong: rgba(var(--wr-color-light-rgb), 0.6);
@@ -148,15 +162,23 @@ $contrast-light: #ffffff !default;
148
162
  // regardless of theme.
149
163
  --wr-color-overlay: rgba(var(--wr-color-backdrop-rgb), 0.45);
150
164
 
151
- // Muted TEXT, deliberately its own token rather than an alias of the `medium`
152
- // intent. The two roles pull in opposite directions and cannot share a value:
153
- // as text it needs >= 4.5:1 against the lightest surface (#ebeff4), while as a
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.
158
- --wr-color-muted-text: #5f6c7d;
159
- --wr-color-muted-text-rgb: 95, 108, 125;
165
+ // Neutral FILL scale — the low-contrast wash a table header, a track, a
166
+ // readonly field or a code chip sits on. Three steps, because the catalog had
167
+ // **thirty-three declarations at eight alphas** hand-rolled across 22 files,
168
+ // and `wr-table` alone used six of them; the values below are the weighted
169
+ // centre of the three clusters those eight actually formed.
170
+ //
171
+ // **Off `light-rgb`, deliberately NOT off `--wr-color-outline-rgb`**, even
172
+ // though the two resolve to the same channel today. That is the bug this scale
173
+ // exists to prevent: every one of those hand-rolls read the OUTLINE channel, so
174
+ // a hairline retuned for its own job — a plausible contrast fix — would have
175
+ // dragged 33 unrelated fills with it, and one measured pair in `wr-table` goes
176
+ // from 6.58:1 to 4.05:1 that way. A fill is not a hairline, which is also why
177
+ // these are not `--wr-color-border-*` under a new name: those three carry the
178
+ // right VALUES under the wrong noun.
179
+ --wr-color-fill-subtle: rgba(var(--wr-color-light-rgb), 0.15);
180
+ --wr-color-fill: rgba(var(--wr-color-light-rgb), 0.3);
181
+ --wr-color-fill-strong: rgba(var(--wr-color-light-rgb), 0.55);
160
182
 
161
183
  // De-emphasized text — the muted ink dimmed to two canonical strengths so
162
184
  // labels / captions / placeholders read consistently. One place each.
@@ -169,22 +191,6 @@ $contrast-light: #ffffff !default;
169
191
  --wr-color-text-muted: rgba(var(--wr-color-muted-text-rgb), 0.95);
170
192
  --wr-color-text-faint: rgba(var(--wr-color-muted-text-rgb), 0.6);
171
193
 
172
- // Neutral gray ramp — a FIXED primitive scale (slate). Each step is a stable
173
- // job (50 = subtlest surface tint … 950 = strongest ink) and, unlike the
174
- // semantic neutrals, does NOT flip in dark mode. For theme-aware surface /
175
- // text jobs reach for the role aliases below instead.
176
- --wr-color-gray-50: #f8fafc;
177
- --wr-color-gray-100: #f1f5f9;
178
- --wr-color-gray-200: #e2e8f0;
179
- --wr-color-gray-300: #cbd5e1;
180
- --wr-color-gray-400: #94a3b8;
181
- --wr-color-gray-500: #64748b;
182
- --wr-color-gray-600: #475569;
183
- --wr-color-gray-700: #334155;
184
- --wr-color-gray-800: #1e293b;
185
- --wr-color-gray-900: #0f172a;
186
- --wr-color-gray-950: #020617;
187
-
188
194
  // Semantic role aliases over the flipping neutrals — prefer these in new code
189
195
  // for intent-free surface / text / outline jobs. They resolve through
190
196
  // `white` / `dark` / `medium` / `light`, so they flip with the theme
@@ -214,18 +220,14 @@ $contrast-light: #ffffff !default;
214
220
  // with today. Both are kept: swapping one for the other changes appearance,
215
221
  // not just naming.
216
222
  --wr-color-outline: var(--wr-color-light);
223
+ // unused-ok: the channel form of the hairline, kept for a consumer writing
224
+ // their own `rgba()` rule. The library's twenty-two hand-rolls read it and
225
+ // moved to `--wr-color-fill*` above — deliberately off `light-rgb`, for the
226
+ // reason stated there — so nothing paints with the channels today. Until this
227
+ // check stopped counting comments as consumers, the paragraph at :152 was the
228
+ // only thing keeping it green.
217
229
  --wr-color-outline-rgb: var(--wr-color-light-rgb);
218
230
 
219
- @each $name, $base in $base-colors {
220
- --wr-color-#{$name}: #{$base};
221
- --wr-color-#{$name}-rgb: #{_rgb-channels($base)};
222
- --wr-color-#{$name}-contrast: #{_contrast($base)};
223
- --wr-color-#{$name}-dark: #{color.adjust($base, $lightness: -5%)};
224
- --wr-color-#{$name}-darker: #{color.adjust($base, $lightness: -10%)};
225
- --wr-color-#{$name}-light: #{color.adjust($base, $lightness: 5%)};
226
- --wr-color-#{$name}-lighter: #{color.adjust($base, $lightness: 10%)};
227
- }
228
-
229
231
  // Soft trio per intent (+ `medium` for neutral surfaces) — tokenizes the
230
232
  // ad-hoc `rgba(var(--*-rgb), α)` fills components hand-rolled at ~8
231
233
  // different alphas, so each alpha lives in ONE place. `-soft` is the
@@ -236,6 +238,10 @@ $contrast-light: #ffffff !default;
236
238
  @each $name in (primary, secondary, success, warning, danger, info, medium) {
237
239
  --wr-color-#{$name}-soft: rgba(var(--wr-color-#{$name}-rgb), 0.12);
238
240
  --wr-color-#{$name}-soft-border: rgba(var(--wr-color-#{$name}-rgb), 0.3);
241
+ // unused-ok: superseded in practice by `-ink`, which is calibrated to 5.0:1
242
+ // against this very tint while this one is a flat 62% mix that was never
243
+ // measured. Kept because it is public and predates `-ink`; do not reach for
244
+ // it in new code, and do not delete it in a minor.
239
245
  --wr-color-#{$name}-soft-contrast: color-mix(in srgb, var(--wr-color-#{$name}) 62%, var(--wr-color-dark));
240
246
  --wr-color-#{$name}-active: rgba(var(--wr-color-#{$name}-rgb), 0.2);
241
247
  }
@@ -304,10 +310,90 @@ $contrast-light: #ffffff !default;
304
310
  // either theme — so there is no darkening that keeps it recognisable AND
305
311
  // readable. It borrows the page's own ink; the border still carries the
306
312
  // intent. `dark` already IS the ink.
313
+ // unused-ok: the two ends of the ink ramp that resolve to something already
314
+ // named. `light` borrows the page's own ink and `dark` IS the ink, so a
315
+ // component would write the role directly — these exist so that
316
+ // `var(--wr-color-#{$intent}-ink)` in a loop resolves for all nine intents
317
+ // instead of nine minus two.
307
318
  --wr-color-light-ink: var(--wr-color-on-surface);
308
319
  --wr-color-dark-ink: var(--wr-color-dark);
309
320
  }
310
321
 
322
+ :root {
323
+ // Declared here so the light token set also claims the light UA scheme.
324
+ // Without it the browser fell back to the OS preference, and an app running
325
+ // ngwr's LIGHT theme on a dark-mode machine got dark scrollbars and dark
326
+ // native controls (<textarea>, date/colour inputs) against light surfaces.
327
+ // `_dark.scss` still flips it to `dark` under [data-theme='dark'], which wins
328
+ // on specificity.
329
+ color-scheme: light;
330
+
331
+ --wr-color-white: #ffffff;
332
+ --wr-color-white-rgb: 255, 255, 255;
333
+ // unused-ok: the flat primitive. Only `-black-rgb` is painted with (eleven
334
+ // sites, all of them building an `rgba()` scrim), but a library that ships
335
+ // `--wr-color-white` and not its opposite reads as an omission.
336
+ --wr-color-black: #000000;
337
+ --wr-color-black-rgb: 0, 0, 0;
338
+
339
+ // Overlay dim — used by dialog / drawer / image preview / command
340
+ // palette / image cropper for the behind-the-panel scrim. Always
341
+ // black so the dim reads as "covered" regardless of theme. Don't
342
+ // wire to `--wr-color-dark-rgb` — that flips to light in dark mode
343
+ // and turns the backdrop into a white wash.
344
+ --wr-color-backdrop-rgb: 0, 0, 0;
345
+
346
+ // Muted TEXT, deliberately its own token rather than an alias of the `medium`
347
+ // intent. The two roles pull in opposite directions and cannot share a value:
348
+ // as text it needs >= 4.5:1 against the lightest surface (#ebeff4), while as a
349
+ // fill it has to clear the bar the other way, against its own label. v11 pulled
350
+ // them further apart rather than closer — the `medium` fill went deeper
351
+ // (#6a7683, whose label is now white at 4.63) while this token stayed where a
352
+ // light canvas needs it. Aliasing them left secondary text at 2.69:1.
353
+ --wr-color-muted-text: #5f6c7d;
354
+ --wr-color-muted-text-rgb: 95, 108, 125;
355
+
356
+ // Neutral gray ramp — a FIXED primitive scale (slate). Each step is a stable
357
+ // job (50 = subtlest surface tint … 950 = strongest ink) and, unlike the
358
+ // semantic neutrals, does NOT flip in dark mode. For theme-aware surface /
359
+ // text jobs reach for the role aliases in `derived()` above instead.
360
+ //
361
+ // unused-ok: and deliberately so — the sentence above IS the reason. A fixed
362
+ // ramp cannot serve a component that has to work in both themes, so the
363
+ // library paints with the flipping roles and ships this for consumers who want
364
+ // a stable step. Reaching for one of these inside a component would be the bug
365
+ // it exists to prevent.
366
+ --wr-color-gray-50: #f8fafc;
367
+ --wr-color-gray-100: #f1f5f9;
368
+ --wr-color-gray-200: #e2e8f0;
369
+ --wr-color-gray-300: #cbd5e1;
370
+ --wr-color-gray-400: #94a3b8;
371
+ --wr-color-gray-500: #64748b;
372
+ --wr-color-gray-600: #475569;
373
+ --wr-color-gray-700: #334155;
374
+ --wr-color-gray-800: #1e293b;
375
+ --wr-color-gray-900: #0f172a;
376
+ --wr-color-gray-950: #020617;
377
+
378
+ @each $name, $base in $base-colors {
379
+ --wr-color-#{$name}: #{$base};
380
+ --wr-color-#{$name}-rgb: #{_rgb-channels($base)};
381
+ --wr-color-#{$name}-contrast: #{_contrast($base)};
382
+ --wr-color-#{$name}-dark: #{color.adjust($base, $lightness: -5%)};
383
+ --wr-color-#{$name}-darker: #{color.adjust($base, $lightness: -10%)};
384
+ // unused-ok: the symmetric half. Hover and active DEEPEN an intent, so the
385
+ // catalog reads `-dark` / `-darker` and never these two — but a shade set
386
+ // with holes in it is worse than one half of which is for consumers, and the
387
+ // dark theme re-derives all four for the same reason.
388
+ --wr-color-#{$name}-light: #{color.adjust($base, $lightness: 5%)};
389
+ --wr-color-#{$name}-lighter: #{color.adjust($base, $lightness: 10%)};
390
+ }
391
+
392
+ // Re-resolved per themed element — see the mixin above. Anything composed
393
+ // out of another token belongs in there, not here.
394
+ @include derived;
395
+ }
396
+
311
397
  // Public SCSS list
312
398
  //
313
399
  // Color names available for `@each` loops in component styles.
@@ -1,6 +1,7 @@
1
1
  @use 'sass:color';
2
2
 
3
3
  @use 'colors';
4
+ @use 'variables';
4
5
 
5
6
  // Dark theme overrides — opt-in via `[data-theme="dark"]` on <html>.
6
7
  // Drive the toggle from `WrTheme` (provided automatically with
@@ -53,6 +54,11 @@ $_dark: #e6ebf3;
53
54
  // `--wr-color-white` are reassigned for dark mode. Tooltip-style
54
55
  // surfaces (`bg: dark; color: dark-contrast`) would render
55
56
  // white-on-white without this override; re-pair them by hand here.
57
+ // unused-ok: for `-white-contrast`. Both are re-paired here because the light
58
+ // palette baked them, and a tooltip painting `bg: dark; color: dark-contrast`
59
+ // would render white-on-white without it. Only the `dark` half is painted with
60
+ // today; the `white` one has to be right anyway, or a consumer reaching for it
61
+ // in dark mode gets the light theme's answer.
56
62
  --wr-color-dark-contrast: #0b1120;
57
63
  --wr-color-white-contrast: #e6ebf3;
58
64
  // Same story as the contrast pair: the shades were baked from the light
@@ -67,6 +73,11 @@ $_dark: #e6ebf3;
67
73
  // percentage of the REMAINING headroom, so it approaches white without ever
68
74
  // leaving the gamut. 70% reproduces the previous `-light` to within a rounding
69
75
  // step; 85% is the distinct step beyond it.
76
+ // unused-ok: for `-light` / `-lighter`. The catalog's intent loops run over
77
+ // `dark` like any other intent, so `.wr-btn--dark` really does paint `-dark`
78
+ // on hover and `-darker` on active — leaving those inherited is what once made
79
+ // that hover almost black under near-black text. Nothing reaches for the two
80
+ // lighter steps; they keep the shade set symmetric.
70
81
  --wr-color-dark-light: #{color.scale($_dark, $lightness: 70%)};
71
82
  --wr-color-dark-lighter: #{color.scale($_dark, $lightness: 85%)};
72
83
  --wr-color-dark-dark: #{color.adjust($_dark, $lightness: -5%)};
@@ -83,7 +94,8 @@ $_dark: #e6ebf3;
83
94
  --wr-color-light-rgb:
84
95
  #{color.channel($_light, 'red')}, #{color.channel($_light, 'green')}, #{color.channel($_light, 'blue')};
85
96
  // The baked contrast pairs with the LIGHT value (#cbd5e1 → dark text);
86
- // the dark surface above needs light text instead.
97
+ // the dark surface above needs light text instead. Painted: it is the label
98
+ // `.wr-btn--light` puts on the fill.
87
99
  --wr-color-light-contrast: #e6ebf3;
88
100
  // `*-lighter` / `*-darker` are baked at SCSS compile time from the
89
101
  // LIGHT palette (slate-300 ± 10% lightness ≈ #e8eef5), so without
@@ -92,14 +104,20 @@ $_dark: #e6ebf3;
92
104
  // semantics inverted: "lighter" still means "subtler hairline"
93
105
  // (closer to canvas, so darker absolute color), "darker" still
94
106
  // means "stronger divider" (further from canvas, so lighter).
107
+ // Both are painted: `-lighter` by the showcase chrome's hairline, `-darker` by
108
+ // `.wr-btn--light:active` through the intent loop.
95
109
  --wr-color-light-lighter: #1a2236;
96
110
  --wr-color-light-darker: #3a4661;
97
- // `-light` / `-dark` were the two the hand block forgot, and they are what
98
- // `.wr-btn--light` uses for hover / active. Left inherited, hover swapped in
111
+ // `-light` / `-dark` were the two the hand block forgot, and `-dark` is what
112
+ // `.wr-btn--light` uses for hover. Left inherited, hover swapped in
99
113
  // the LIGHT palette's slate-300 — a near-white fill under the near-white
100
114
  // `-contrast` text above, so the button simply disappeared under the cursor.
101
115
  // Half-steps of the tuned pair, same inverted reading: toward the canvas for
102
116
  // `-light`, away from it for `-dark`, which also makes hover read as a lift.
117
+ // unused-ok: for `-light`. Only its opposite is reached for — `.wr-btn--light`
118
+ // takes the `-dark` step on hover and nothing takes this one — but a half-step
119
+ // that exists in one direction and not the other is the kind of hole the hand
120
+ // block already shipped once.
103
121
  --wr-color-light-light: #{color.adjust($_light, $lightness: -2.5%)};
104
122
  --wr-color-light-dark: #{color.adjust($_light, $lightness: 5%)};
105
123
 
@@ -111,6 +129,10 @@ $_dark: #e6ebf3;
111
129
  #{color.channel($_medium, 'red')}, #{color.channel($_medium, 'green')}, #{color.channel($_medium, 'blue')};
112
130
  // This block shipped base + rgb only, so contrast and all four shades still
113
131
  // came from the light palette's slate. Ink token, plain shades.
132
+ // unused-ok: for `-light` / `-lighter`. `.wr-btn--medium` paints `-contrast`,
133
+ // `-dark` and `-darker` through the intent loop, and inheriting the light
134
+ // palette's slate for those is the bug this block fixes. Nothing reaches for
135
+ // the two lighter steps; they keep the set symmetric.
114
136
  --wr-color-medium-contrast: #{colors.contrast($_medium)};
115
137
  --wr-color-medium-light: #{color.adjust($_medium, $lightness: 5%)};
116
138
  --wr-color-medium-lighter: #{color.adjust($_medium, $lightness: 10%)};
@@ -144,6 +166,10 @@ $_dark: #e6ebf3;
144
166
  --wr-color-primary-contrast: #{colors.contrast(#3567ff)};
145
167
  --wr-color-primary-rgb: 53, 103, 255;
146
168
  // The same lightness steps as before, taken off the new base.
169
+ // unused-ok: for `-light` / `-lighter`. `.wr-btn--primary` paints `-dark` on
170
+ // hover and `-darker` on active; the two lighter steps keep the set symmetric
171
+ // with the light palette, which is what makes an intent swap-in-place for a
172
+ // consumer.
147
173
  --wr-color-primary-light: #547eff;
148
174
  --wr-color-primary-dark: #2848aa;
149
175
  --wr-color-primary-lighter: #7396ff;
@@ -158,6 +184,10 @@ $_dark: #e6ebf3;
158
184
  --wr-color-#{$name}-contrast: #{colors.contrast($base)};
159
185
  --wr-color-#{$name}-rgb:
160
186
  #{color.channel($base, 'red')}, #{color.channel($base, 'green')}, #{color.channel($base, 'blue')};
187
+ // unused-ok: for `-light` / `-lighter`, the symmetric half — same reasoning
188
+ // as the light palette's loop. `-dark` and `-darker` below are painted by
189
+ // hover and active; they fall inside this marker's run only because the four
190
+ // shades are written as one block.
161
191
  --wr-color-#{$name}-light: #{color.adjust($base, $lightness: 5%)};
162
192
  --wr-color-#{$name}-lighter: #{color.adjust($base, $lightness: 10%)};
163
193
  --wr-color-#{$name}-dark: #{color.adjust($base, $lightness: -5%)};
@@ -173,5 +203,18 @@ $_dark: #e6ebf3;
173
203
  --wr-shadow-float: 0 8px 24px rgb(0 0 0 / 55%);
174
204
  --wr-shadow-modal: 0 24px 56px rgb(0 0 0 / 60%);
175
205
 
206
+ // Re-declare every token that is COMPOSED out of the bases above, so the
207
+ // composition resolves against THIS element's values instead of the ones
208
+ // `:root` already substituted. Without it the block is only correct when it
209
+ // lands on `:root` itself; put `data-theme="dark"` on a SUBTREE — a forced-dark
210
+ // preview, a dark hero on a light page — and the bases flip while fifty
211
+ // derived tokens stay light. `--wr-color-surface` read `#ffffff` inside a dark
212
+ // panel, which is how the docs' own colours guide got to 3.27:1. The two
213
+ // mixins are the single source of those compositions; see the long note above
214
+ // `colors.derived()` for why a `var()` in a custom property cannot do this on
215
+ // its own.
216
+ @include colors.derived;
217
+ @include variables.derived-focus-ring;
218
+
176
219
  color-scheme: dark;
177
220
  }
@@ -2,32 +2,55 @@
2
2
  // library. Component-specific focus styles still win via higher specificity;
3
3
  // this is a safety net so every keyboard-reachable target has a visible
4
4
  // focus indicator out of the box.
5
+ //
6
+ // The ring is an outline plus a halo, both read from `--wr-focus-ring-*` — see
7
+ // `_variables.scss` for why, and for the measured ratios. The short version:
8
+ // the halo alone was 1.41:1 and this mixin also cleared the UA outline, so
9
+ // "visible focus indicator out of the box" was not true of the forty-one
10
+ // selectors that rely on it.
11
+ //
12
+ // Override the offset AFTER the include, the way `list` and `window` do, when
13
+ // the target sits inside a clipping container.
5
14
 
6
15
  @mixin focus-ring {
7
- outline: none;
8
- box-shadow: 0 0 0 3px rgba(var(--wr-color-primary-rgb), 0.25);
16
+ outline: var(--wr-focus-ring-width) solid var(--wr-focus-ring-color);
17
+ outline-offset: var(--wr-focus-ring-offset);
18
+ box-shadow: 0 0 0 var(--wr-focus-ring-offset) var(--wr-focus-ring-halo);
9
19
  }
10
20
 
11
- // Tabs
21
+ // Tabs — `.wr-tabs__strip` is `overflow-y: hidden` (to suppress a stray
22
+ // vertical scrollbar) and its box is exactly the tab's height, so an outset
23
+ // ring loses both horizontal strokes and renders as two disconnected bars.
12
24
  .wr-tabs__tab:focus-visible {
13
25
  @include focus-ring;
26
+ outline-offset: -2px;
14
27
  }
15
28
 
16
29
  // Sidebar
17
30
  .wr-sidebar__entry:focus-visible,
18
- .wr-sidebar__item:focus-visible,
19
31
  .wr-sidebar__group-toggle:focus-visible {
20
32
  @include focus-ring;
21
33
  }
22
34
 
35
+ // `.wr-sidebar__group-body` is `overflow: hidden` so the group can animate
36
+ // `grid-template-rows` from 1fr to 0fr, and the item runs flush to its inline
37
+ // end — an outset ring loses its whole inline-end stroke there.
38
+ .wr-sidebar__item:focus-visible {
39
+ @include focus-ring;
40
+ outline-offset: -2px;
41
+ }
42
+
23
43
  // Anchor
24
44
  .wr-anchor__link:focus-visible {
25
45
  @include focus-ring;
26
46
  }
27
47
 
28
- // Collapse / accordion header
48
+ // Collapse / accordion header — `.wr-collapse` is `overflow: hidden` and the
49
+ // header fills it but for the 1px border, so an outset ring is clipped down to
50
+ // a single row of halo.
29
51
  .wr-collapse__header:focus-visible {
30
52
  @include focus-ring;
53
+ outline-offset: -2px;
31
54
  }
32
55
 
33
56
  // Command palette options
@@ -1,7 +1,7 @@
1
1
  // Shared SCSS mixins.
2
2
  //
3
3
  // Available via:
4
- // @use 'ngwr/theme/mixins' as wr;
4
+ // @use 'ngwr/theme' as wr;
5
5
  // .thing { @include wr.smooth-br(0.625rem); }
6
6
 
7
7
  /// Smooth border-radius — opts into the native `corner-shape: squircle`
@@ -3,6 +3,20 @@
3
3
  // These are the canonical knobs every component reads from. Consumers
4
4
  // override them on `:root` (or any subtree) without touching SCSS.
5
5
 
6
+ /// The tokens here that are composed out of one the THEME re-tunes, kept in a
7
+ /// mixin so `_dark.scss` can re-declare them on the themed element. See the long
8
+ /// note above `colors.derived()`: a `var()` inside a custom property is
9
+ /// substituted where it is DECLARED, so a `:root` composition inherits into a
10
+ /// scoped `[data-theme="dark"]` subtree as the light literal.
11
+ ///
12
+ /// Only the ring. The other compositions in this file — `--wr-control-font-size-*`,
13
+ /// `--wr-transition-*`, `--wr-overlay-*` — read sizes and durations, which no
14
+ /// theme flips, so freezing them is the same value either way.
15
+ @mixin derived-focus-ring() {
16
+ --wr-focus-ring-color: var(--wr-color-primary);
17
+ --wr-focus-ring-halo: rgba(var(--wr-color-primary-rgb), 0.25);
18
+ }
19
+
6
20
  :root {
7
21
  // Border radius
8
22
  --wr-border-radius-sm: 0.375rem;
@@ -45,11 +59,16 @@
45
59
  --wr-duration-fast: 0.1s;
46
60
  --wr-duration-base: 0.15s;
47
61
  --wr-duration-slow: 0.3s;
62
+ // unused-ok: the slow end of a public scale. The catalog's own animations top
63
+ // out at `-slow`; a consumer's need not.
48
64
  --wr-duration-slower: 0.5s;
49
65
 
50
66
  // Transition shorthands
51
67
  --wr-transition-short: var(--wr-duration-fast) var(--wr-ease-out);
52
68
  --wr-transition-base: var(--wr-duration-base) var(--wr-ease-linear);
69
+ // unused-ok: the third shorthand. Components compose `-slow` with an easing
70
+ // themselves where they need it, but dropping one rung out of three would make
71
+ // the set look arbitrary.
53
72
  --wr-transition-long: var(--wr-duration-slow) var(--wr-ease-out);
54
73
 
55
74
  // Elevation
@@ -65,6 +84,52 @@
65
84
  --wr-shadow-float: 0 8px 24px rgb(0 0 0 / 18%);
66
85
  --wr-shadow-modal: 0 20px 48px rgb(0 0 0 / 25%);
67
86
 
87
+ // Disabled
88
+ //
89
+ // How far a control fades when it will not respond. One number, because the
90
+ // catalog had **seven** — 0.6 in eighteen places, then 0.5, 0.7, 0.55, 0.4,
91
+ // 0.35 and 0.65 — spread over 29 entry points, and two components disagreed
92
+ // with THEMSELVES three ways inside one file (`date-picker` at 0.5 / 0.4 / 0.7,
93
+ // `calendar` at 0.5 / 0.35 / 0.6). Sibling text fields fading differently is
94
+ // not a design decision anyone made; it is what happens when the value has no
95
+ // name.
96
+ //
97
+ // 0.6 is the value eighteen of them already used. A component that genuinely
98
+ // needs another strength overrides this token in its own block, with the reason
99
+ // — the point is that the exception has to be argued rather than typed.
100
+ --wr-disabled-opacity: 0.6;
101
+
102
+ // Focus ring
103
+ //
104
+ // The keyboard indicator, as tokens rather than a recipe baked into SCSS —
105
+ // the ring was the one surface a consumer could not retheme, because
106
+ // `theme.focus-ring` hard-coded it.
107
+ //
108
+ // It is an OUTLINE now, and the halo is a second channel rather than the only
109
+ // one. The halo alone is a 25% tint of the primary over the page: **1.41:1 in
110
+ // light, 1.31:1 in dark**, where WCAG 1.4.11 asks 3:1 of a focus indicator —
111
+ // and the mixin also set `outline: none`, so for the forty-one selectors whose
112
+ // entire focus style is that mixin, nothing on screen met the bar. The solid
113
+ // token measures 4.89:1 and 4.07:1. Two components had already worked this out
114
+ // on their own, in three places, and hand-rolled
115
+ // `outline: 2px solid var(--wr-color-primary)` (`event-calendar` twice,
116
+ // `lightbox` once), and four more wrote an `outline-offset` next to the include
117
+ // that could never apply.
118
+ //
119
+ // An outline is also the only form the indicator survives in under
120
+ // `forced-colors`, which drops every `box-shadow` outright, and it is exempt
121
+ // from layout, so focus never reflows the box.
122
+ //
123
+ // Halo spread equals the offset on purpose: the halo fills exactly the gap the
124
+ // outline leaves, so the two read as one ring instead of two. A component that
125
+ // insets its outline (`outline-offset: -2px`, the idiom for a row inside an
126
+ // `overflow: hidden` container) keeps the halo outside, where its own clipping
127
+ // hides it.
128
+ // `-color` and `-halo` are composed off `--wr-color-primary`, so they live in
129
+ // `derived-focus-ring()` at the top of this file, included at the end of `:root`.
130
+ --wr-focus-ring-width: 2px;
131
+ --wr-focus-ring-offset: 2px;
132
+
68
133
  // Z-index scale
69
134
  //
70
135
  // Overlay panels inside the CDK container inherit its stacking; these
@@ -124,6 +189,8 @@
124
189
  --wr-tracking-wide: 0.025em;
125
190
  --wr-tracking-wider: 0.05em;
126
191
  --wr-tracking-widest: 0.1em;
192
+
193
+ @include derived-focus-ring;
127
194
  }
128
195
 
129
196
  // Shared open animation for overlay panels. Every overlay component
@@ -11,7 +11,7 @@
11
11
  color: var(--wr-color-on-surface);
12
12
 
13
13
  &--disabled {
14
- opacity: 0.6;
14
+ opacity: var(--wr-disabled-opacity);
15
15
  }
16
16
 
17
17
  &__pane {
@@ -31,11 +31,24 @@
31
31
  gap: 0.5rem;
32
32
  padding: 0.5rem 0.625rem;
33
33
  border-bottom: 1px solid var(--wr-color-outline);
34
- background: rgba(var(--wr-color-outline-rgb), 0.25);
34
+ background: var(--wr-color-fill);
35
+ // The checkbox and the count are intrinsically sized, so on a narrow pane
36
+ // the title absorbed the entire shortfall: at 375px it was 26px of a 91px
37
+ // track and the headers read "A…" and "S…". Let the count drop to its own
38
+ // line before that happens — it is the one part of the row that reads fine
39
+ // anywhere. Nothing moves while the row fits (measured: identical at 190px
40
+ // and 430px panes).
41
+ flex-wrap: wrap;
35
42
  }
36
43
 
37
44
  &__title {
38
- flex: 1 1 auto;
45
+ // A small basis rather than `auto`: the title has to be the item that
46
+ // yields, and with a content-sized basis a long title pushes ITSELF onto
47
+ // the next line, leaving the select-all checkbox alone on a row and the
48
+ // two panes of one transfer with headers of different heights. 3.5rem is
49
+ // the widest basis that still shares a row with the checkbox in the
50
+ // narrowest pane the component reaches (113px).
51
+ flex: 1 1 3.5rem;
39
52
  min-width: 0;
40
53
  overflow: hidden;
41
54
  text-overflow: ellipsis;
@@ -98,6 +111,16 @@
98
111
  height: 1rem;
99
112
  }
100
113
 
114
+ // The panes are a plain flex row, so they already swap: under `dir="rtl"` the
115
+ // source pane lays out at the right. The move chevrons are drawn to physical
116
+ // directions, though, so "move to target" ends up pointing at the pane it
117
+ // moves away from. Turn them around with the panes, the same way the
118
+ // pagination and carousel arrows do. Both move buttons are icon-only, so
119
+ // nothing textual is caught.
120
+ [dir='rtl'] &__move .wr-icon__svg {
121
+ transform: scaleX(-1);
122
+ }
123
+
101
124
  // No container query here on purpose: `@container` only styles DESCENDANTS, so
102
125
  // a rule that reflows `.wr-transfer` itself could never match its own query.
103
126
  // Doing it properly means the house `responsive` opt-in modifier (a wrapper