ngwr 11.2.0 → 12.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 (395) hide show
  1. package/README.md +85 -26
  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 +83 -16
  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 +85 -1
  193. package/fesm2022/ngwr-segmented-testing.mjs.map +1 -1
  194. package/fesm2022/ngwr-segmented.mjs +123 -10
  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 +19 -24
  275. package/llms.txt +46 -8
  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-pagination.d.ts +11 -0
  365. package/types/ngwr-pipes.d.ts +1 -1
  366. package/types/ngwr-popover-testing.d.ts +7 -2
  367. package/types/ngwr-popover.d.ts +1 -0
  368. package/types/ngwr-result.d.ts +6 -0
  369. package/types/ngwr-segmented-testing.d.ts +53 -0
  370. package/types/ngwr-segmented.d.ts +107 -5
  371. package/types/ngwr-select.d.ts +68 -6
  372. package/types/ngwr-shiny-text.d.ts +4 -2
  373. package/types/ngwr-sidebar.d.ts +14 -5
  374. package/types/ngwr-slider.d.ts +69 -1
  375. package/types/ngwr-speed-dial-testing.d.ts +15 -11
  376. package/types/ngwr-speed-dial.d.ts +22 -3
  377. package/types/ngwr-split-text.d.ts +9 -0
  378. package/types/ngwr-stepper-testing.d.ts +5 -5
  379. package/types/ngwr-stepper.d.ts +8 -0
  380. package/types/ngwr-storage.d.ts +1 -0
  381. package/types/ngwr-table.d.ts +104 -11
  382. package/types/ngwr-tabs-testing.d.ts +11 -10
  383. package/types/ngwr-tabs.d.ts +2 -0
  384. package/types/ngwr-theme.d.ts +82 -1
  385. package/types/ngwr-tour.d.ts +22 -4
  386. package/types/ngwr-tree.d.ts +5 -4
  387. package/types/ngwr-typewriter-testing.d.ts +10 -0
  388. package/types/ngwr-utils.d.ts +5 -2
  389. package/types/ngwr-version.d.ts +1 -1
  390. package/types/ngwr-window.d.ts +39 -11
  391. package/typography/styles/_index.scss +1 -1
  392. package/window/styles/_index.scss +72 -26
  393. package/fesm2022/ngwr-date-adapter-fns.mjs.map +0 -1
  394. package/fesm2022/ngwr-date-adapter-luxon.mjs.map +0 -1
  395. package/fesm2022/ngwr-date-adapter.mjs.map +0 -1
@@ -3,8 +3,8 @@
3
3
  .wr-table {
4
4
  --wr-table-bg: var(--wr-color-surface);
5
5
  --wr-table-border: var(--wr-color-outline);
6
- --wr-table-head-bg: rgba(var(--wr-color-outline-rgb), 0.25);
7
- --wr-table-row-hover: rgba(var(--wr-color-outline-rgb), 0.15);
6
+ --wr-table-head-bg: var(--wr-color-fill);
7
+ --wr-table-row-hover: var(--wr-color-fill-subtle);
8
8
  // Head casing. The library renders column titles as the author wrote them —
9
9
  // forcing `uppercase` mutates their content, and a header written "ID" or
10
10
  // "created at" is the consumer's decision to make, not ours. Both halves stay
@@ -188,6 +188,15 @@
188
188
  transform: rotate(90deg);
189
189
  }
190
190
 
191
+ // The glyph is a chevron-RIGHT, so a closed row points into its own content
192
+ // under `dir="rtl"` instead of at the direction the children will indent.
193
+ // Turn it around with the tree, the way the cascader's branch arrow does.
194
+ // Scoped to the CLOSED state deliberately: `scaleX(-1)` composed over the open
195
+ // state's `rotate(90deg)` resolves to "up", not "down".
196
+ [dir='rtl'] &__tree-toggle:not(.wr-table__tree-toggle--open) &__tree-icon {
197
+ transform: scaleX(-1);
198
+ }
199
+
191
200
  // Card mode stacks label / value with `justify-content: space-between`, so an
192
201
  // extra inline child would strand the chevron mid-row. Fold the lead into the
193
202
  // value side instead.
@@ -255,9 +264,14 @@
255
264
  transform: rotate(90deg);
256
265
  }
257
266
 
267
+ // Same chevron-right, same mirror — closed state only. See `__tree-icon` above.
268
+ [dir='rtl'] &__expand-btn:not(.wr-table__expand-btn--open) &__expand-icon {
269
+ transform: scaleX(-1);
270
+ }
271
+
258
272
  &__detail-row > &__detail {
259
273
  padding: 0.875rem 1rem;
260
- background: rgba(var(--wr-color-outline-rgb), 0.08);
274
+ background: var(--wr-color-fill-subtle);
261
275
  border-bottom: 1px solid var(--wr-table-border);
262
276
  }
263
277
 
@@ -322,21 +336,36 @@
322
336
  }
323
337
 
324
338
  // 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.
339
+ // no logical form — its offset is always physical — while the cell it belongs
340
+ // to is anchored by `[style.inset-inline-start.px]` / `[style.inset-inline-end.px]`
341
+ // in table.html, written from `leftPin()` / `rightPin()`. The shadow leans the
342
+ // way the offset pins, so the sign has to be set per direction by hand.
328
343
  &__th--pin-edge-left,
329
344
  &__td--pin-edge-left {
330
- // rtl-ok: physical offset matching the physical `left` pin set by the component
345
+ // rtl-ok: `box-shadow` has no logical form; the RTL sign is set explicitly below
331
346
  box-shadow: 0.375rem 0 0.375rem -0.25rem rgba(0, 0, 0, 0.18);
332
347
  }
333
348
 
334
349
  &__th--pin-edge-right,
335
350
  &__td--pin-edge-right {
336
- // rtl-ok: physical offset matching the physical `right` pin set by the component
351
+ // rtl-ok: `box-shadow` has no logical form; the RTL sign is set explicitly below
352
+ box-shadow: -0.375rem 0 0.375rem -0.25rem rgba(0, 0, 0, 0.18);
353
+ }
354
+
355
+ // Under `dir="rtl"` the start-pinned group sits at the physical right and the
356
+ // end-pinned group at the physical left, so both shadows point the other way.
357
+ [dir='rtl'] &__th--pin-edge-left,
358
+ [dir='rtl'] &__td--pin-edge-left {
359
+ // rtl-ok: this IS the RTL sign for the rule above
337
360
  box-shadow: -0.375rem 0 0.375rem -0.25rem rgba(0, 0, 0, 0.18);
338
361
  }
339
362
 
363
+ [dir='rtl'] &__th--pin-edge-right,
364
+ [dir='rtl'] &__td--pin-edge-right {
365
+ // rtl-ok: this IS the RTL sign for the rule above
366
+ box-shadow: 0.375rem 0 0.375rem -0.25rem rgba(0, 0, 0, 0.18);
367
+ }
368
+
340
369
  &__th-inner {
341
370
  display: inline-flex;
342
371
  align-items: center;
@@ -393,10 +422,15 @@
393
422
  backdrop-filter: blur(2px);
394
423
  // Above the pinned sticky cells (th z-index 2), so loading veils them too.
395
424
  z-index: 3;
425
+ // A positioned box over the whole table swallowed every click while leaving
426
+ // the keyboard untouched — sort headers, row checkboxes and the pager all
427
+ // stayed operable by Tab + Enter. The veil is a marker (the host carries
428
+ // `aria-busy`), not a shield, so it stops eating the pointer too.
429
+ pointer-events: none;
396
430
  }
397
431
 
398
432
  // --- Row grouping ---------------------------------------------------------
399
- --wr-table-group-bg: rgba(var(--wr-color-outline-rgb), 0.18);
433
+ --wr-table-group-bg: var(--wr-color-fill-subtle);
400
434
 
401
435
  &__group-cell {
402
436
  // NOTE: never add `overflow` here — the inner box below is `position: sticky`
@@ -451,6 +485,14 @@
451
485
  transform: none; // collapsed — chevron points right
452
486
  }
453
487
 
488
+ // …which is the wrong way round under `dir="rtl"`, where the label the arrow
489
+ // discloses sits to its left. Mirror the collapsed state only — the expanded
490
+ // one already points down, and `scaleX(-1)` over its `rotate(90deg)` would
491
+ // point it up. See `__tree-icon` above.
492
+ [dir='rtl'] &__group-row--collapsed &__group-icon {
493
+ transform: scaleX(-1);
494
+ }
495
+
454
496
  &__group-label {
455
497
  // Cap intrinsic width: in the default (auto) layout a colspan cell's
456
498
  // min-content is spread across columns, so an ellipsizing shrinkable label
@@ -465,7 +507,14 @@
465
507
  flex: 0 0 auto;
466
508
  padding: 0 0.375rem;
467
509
  border-radius: var(--wr-border-radius-pill);
468
- background: rgba(var(--wr-color-outline-rgb), 0.5);
510
+ // `-subtle`, not `-strong`: this chip is the SECOND tint in the stack — it
511
+ // sits on the group row, which already paints `--wr-table-group-bg`
512
+ // (`-fill-subtle`) over the table's own surface. At `-strong` the pair
513
+ // composited to #dee5ed, and `--wr-color-on-surface-muted` is calibrated
514
+ // against the plain surface (5.35:1) and the lightest one the library
515
+ // paints (4.63:1) — on that composite it fell to 4.21:1, under AA. The same
516
+ // double-tint trap the event-calendar header comment records.
517
+ background: var(--wr-color-fill-subtle);
469
518
  color: var(--wr-color-on-surface-muted);
470
519
  font-size: var(--wr-text-xs);
471
520
  font-weight: 500;
@@ -784,7 +833,7 @@
784
833
  cursor: pointer;
785
834
 
786
835
  &:hover {
787
- background: rgba(var(--wr-color-outline-rgb), 0.35);
836
+ background: var(--wr-color-fill);
788
837
  }
789
838
  }
790
839
 
@@ -853,7 +902,7 @@
853
902
  // the same defaults that block sets. `--wr-density-*` and `--wr-color-*` are
854
903
  // root-level and resolve as-is.
855
904
  padding: calc(0.625rem * var(--wr-density-y, 1)) calc(0.875rem * var(--wr-density-x, 1));
856
- background: var(--wr-table-head-bg, rgba(var(--wr-color-outline-rgb), 0.25));
905
+ background: var(--wr-table-head-bg, var(--wr-color-fill));
857
906
  color: var(--wr-color-on-surface-muted);
858
907
  font-family: var(--wr-font-family-base);
859
908
  font-weight: 600;
@@ -113,7 +113,7 @@
113
113
 
114
114
  &--disabled,
115
115
  &:disabled {
116
- opacity: 0.5;
116
+ opacity: var(--wr-disabled-opacity);
117
117
  cursor: not-allowed;
118
118
  }
119
119
  }
@@ -33,7 +33,7 @@
33
33
 
34
34
  &--disabled {
35
35
  --wr-textarea-color: var(--wr-color-on-surface-muted);
36
- --wr-textarea-bg: rgba(var(--wr-color-outline-rgb), 0.35);
36
+ --wr-textarea-bg: var(--wr-color-fill);
37
37
  cursor: not-allowed;
38
38
  }
39
39
 
@@ -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`