ngwr 9.1.0 → 10.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 (276) hide show
  1. package/README.md +23 -8
  2. package/action-sheet/styles/_index.scss +6 -1
  3. package/badge/styles/_index.scss +17 -7
  4. package/badge/styles/_tag.scss +12 -3
  5. package/border-glow/styles/_index.scss +5 -0
  6. package/button/styles/_index.scss +48 -1
  7. package/calendar/styles/_index.scss +9 -1
  8. package/circular-text/styles/_index.scss +6 -1
  9. package/density/styles/_index.scss +3 -1
  10. package/dialog/styles/_index.scss +66 -2
  11. package/drag-drop/styles/_index.scss +20 -7
  12. package/drawer/styles/_index.scss +61 -1
  13. package/event-calendar/styles/_index.scss +284 -0
  14. package/falling-text/styles/_index.scss +5 -0
  15. package/fesm2022/ngwr-action-sheet.mjs +1 -1
  16. package/fesm2022/ngwr-action-sheet.mjs.map +1 -1
  17. package/fesm2022/ngwr-alert.mjs +8 -3
  18. package/fesm2022/ngwr-alert.mjs.map +1 -1
  19. package/fesm2022/ngwr-back-top.mjs +6 -4
  20. package/fesm2022/ngwr-back-top.mjs.map +1 -1
  21. package/fesm2022/ngwr-border-glow.mjs +12 -9
  22. package/fesm2022/ngwr-border-glow.mjs.map +1 -1
  23. package/fesm2022/ngwr-breadcrumbs.mjs +2 -2
  24. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  25. package/fesm2022/ngwr-calendar.mjs +5 -3
  26. package/fesm2022/ngwr-calendar.mjs.map +1 -1
  27. package/fesm2022/ngwr-card.mjs +2 -2
  28. package/fesm2022/ngwr-card.mjs.map +1 -1
  29. package/fesm2022/ngwr-carousel.mjs +17 -4
  30. package/fesm2022/ngwr-carousel.mjs.map +1 -1
  31. package/fesm2022/ngwr-cascader.mjs +35 -7
  32. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  33. package/fesm2022/ngwr-checkbox.mjs +12 -3
  34. package/fesm2022/ngwr-checkbox.mjs.map +1 -1
  35. package/fesm2022/ngwr-circular-text.mjs +2 -2
  36. package/fesm2022/ngwr-circular-text.mjs.map +1 -1
  37. package/fesm2022/ngwr-color-picker.mjs +6 -5
  38. package/fesm2022/ngwr-color-picker.mjs.map +1 -1
  39. package/fesm2022/ngwr-command-palette.mjs +7 -3
  40. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  41. package/fesm2022/ngwr-context-menu.mjs +7 -7
  42. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  43. package/fesm2022/ngwr-counter.mjs +9 -1
  44. package/fesm2022/ngwr-counter.mjs.map +1 -1
  45. package/fesm2022/ngwr-date-picker.mjs +37 -15
  46. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  47. package/fesm2022/ngwr-density.mjs +10 -2
  48. package/fesm2022/ngwr-density.mjs.map +1 -1
  49. package/fesm2022/ngwr-descriptions.mjs +5 -4
  50. package/fesm2022/ngwr-descriptions.mjs.map +1 -1
  51. package/fesm2022/ngwr-dialog.mjs +10 -1
  52. package/fesm2022/ngwr-dialog.mjs.map +1 -1
  53. package/fesm2022/ngwr-drag-drop.mjs +2 -2
  54. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  55. package/fesm2022/ngwr-drawer.mjs +37 -16
  56. package/fesm2022/ngwr-drawer.mjs.map +1 -1
  57. package/fesm2022/ngwr-dropdown.mjs +8 -3
  58. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  59. package/fesm2022/ngwr-event-calendar.mjs +723 -0
  60. package/fesm2022/ngwr-event-calendar.mjs.map +1 -0
  61. package/fesm2022/ngwr-falling-text.mjs +2 -2
  62. package/fesm2022/ngwr-falling-text.mjs.map +1 -1
  63. package/fesm2022/ngwr-file-upload.mjs +2 -2
  64. package/fesm2022/ngwr-file-upload.mjs.map +1 -1
  65. package/fesm2022/ngwr-form.mjs +258 -42
  66. package/fesm2022/ngwr-form.mjs.map +1 -1
  67. package/fesm2022/ngwr-fuzzy-text.mjs +15 -1
  68. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
  69. package/fesm2022/ngwr-gauge.mjs +8 -3
  70. package/fesm2022/ngwr-gauge.mjs.map +1 -1
  71. package/fesm2022/ngwr-glitch-text.mjs +2 -2
  72. package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
  73. package/fesm2022/ngwr-gradient-text.mjs +2 -2
  74. package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
  75. package/fesm2022/ngwr-i18n-en.mjs +89 -5
  76. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  77. package/fesm2022/ngwr-i18n-ru.mjs +90 -5
  78. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  79. package/fesm2022/ngwr-i18n.mjs +94 -3
  80. package/fesm2022/ngwr-i18n.mjs.map +1 -1
  81. package/fesm2022/ngwr-icon.mjs +79 -35
  82. package/fesm2022/ngwr-icon.mjs.map +1 -1
  83. package/fesm2022/ngwr-input-number.mjs +19 -3
  84. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  85. package/fesm2022/ngwr-input.mjs +48 -6
  86. package/fesm2022/ngwr-input.mjs.map +1 -1
  87. package/fesm2022/ngwr-knob.mjs +8 -3
  88. package/fesm2022/ngwr-knob.mjs.map +1 -1
  89. package/fesm2022/ngwr-lightbox.mjs +32 -3
  90. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  91. package/fesm2022/ngwr-line-chart.mjs +3 -3
  92. package/fesm2022/ngwr-line-chart.mjs.map +1 -1
  93. package/fesm2022/ngwr-list.mjs +2 -2
  94. package/fesm2022/ngwr-list.mjs.map +1 -1
  95. package/fesm2022/ngwr-loading-bar.mjs +2 -2
  96. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  97. package/fesm2022/ngwr-marquee.mjs +2 -2
  98. package/fesm2022/ngwr-marquee.mjs.map +1 -1
  99. package/fesm2022/ngwr-media.mjs +3 -0
  100. package/fesm2022/ngwr-media.mjs.map +1 -1
  101. package/fesm2022/ngwr-mention.mjs +166 -10
  102. package/fesm2022/ngwr-mention.mjs.map +1 -1
  103. package/fesm2022/ngwr-meter-group.mjs +14 -3
  104. package/fesm2022/ngwr-meter-group.mjs.map +1 -1
  105. package/fesm2022/ngwr-overlay.mjs +173 -3
  106. package/fesm2022/ngwr-overlay.mjs.map +1 -1
  107. package/fesm2022/ngwr-page-header.mjs +2 -2
  108. package/fesm2022/ngwr-page-header.mjs.map +1 -1
  109. package/fesm2022/ngwr-pagination.mjs +17 -4
  110. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  111. package/fesm2022/ngwr-popconfirm.mjs +4 -3
  112. package/fesm2022/ngwr-popconfirm.mjs.map +1 -1
  113. package/fesm2022/ngwr-popover.mjs +10 -3
  114. package/fesm2022/ngwr-popover.mjs.map +1 -1
  115. package/fesm2022/ngwr-progress.mjs +8 -2
  116. package/fesm2022/ngwr-progress.mjs.map +1 -1
  117. package/fesm2022/ngwr-qr.mjs.map +1 -1
  118. package/fesm2022/ngwr-rating.mjs +6 -4
  119. package/fesm2022/ngwr-rating.mjs.map +1 -1
  120. package/fesm2022/ngwr-result.mjs +19 -12
  121. package/fesm2022/ngwr-result.mjs.map +1 -1
  122. package/fesm2022/ngwr-segmented.mjs +2 -2
  123. package/fesm2022/ngwr-segmented.mjs.map +1 -1
  124. package/fesm2022/ngwr-select.mjs +40 -13
  125. package/fesm2022/ngwr-select.mjs.map +1 -1
  126. package/fesm2022/ngwr-shiny-text.mjs +4 -6
  127. package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
  128. package/fesm2022/ngwr-speed-dial.mjs +11 -3
  129. package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
  130. package/fesm2022/ngwr-spotlight-card.mjs +2 -2
  131. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  132. package/fesm2022/ngwr-squircle.mjs +1 -1
  133. package/fesm2022/ngwr-squircle.mjs.map +1 -1
  134. package/fesm2022/ngwr-star-border.mjs +2 -2
  135. package/fesm2022/ngwr-star-border.mjs.map +1 -1
  136. package/fesm2022/ngwr-switch.mjs +10 -3
  137. package/fesm2022/ngwr-switch.mjs.map +1 -1
  138. package/fesm2022/ngwr-table.mjs +233 -19
  139. package/fesm2022/ngwr-table.mjs.map +1 -1
  140. package/fesm2022/ngwr-tabs.mjs +21 -4
  141. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  142. package/fesm2022/ngwr-textarea.mjs +20 -4
  143. package/fesm2022/ngwr-textarea.mjs.map +1 -1
  144. package/fesm2022/ngwr-theme.mjs +13 -3
  145. package/fesm2022/ngwr-theme.mjs.map +1 -1
  146. package/fesm2022/ngwr-tilt-card.mjs +2 -2
  147. package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
  148. package/fesm2022/ngwr-toolbar.mjs +2 -2
  149. package/fesm2022/ngwr-toolbar.mjs.map +1 -1
  150. package/fesm2022/ngwr-tour.mjs +264 -0
  151. package/fesm2022/ngwr-tour.mjs.map +1 -0
  152. package/fesm2022/ngwr-transfer.mjs +184 -0
  153. package/fesm2022/ngwr-transfer.mjs.map +1 -0
  154. package/fesm2022/ngwr-tree.mjs +27 -9
  155. package/fesm2022/ngwr-tree.mjs.map +1 -1
  156. package/fesm2022/ngwr-typewriter.mjs +2 -2
  157. package/fesm2022/ngwr-typewriter.mjs.map +1 -1
  158. package/fesm2022/ngwr-validators.mjs +118 -2
  159. package/fesm2022/ngwr-validators.mjs.map +1 -1
  160. package/fesm2022/ngwr-version.mjs +2 -2
  161. package/fesm2022/ngwr-version.mjs.map +1 -1
  162. package/fesm2022/ngwr-virtual-scroll.mjs +2 -2
  163. package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
  164. package/fesm2022/ngwr-waves.mjs +25 -3
  165. package/fesm2022/ngwr-waves.mjs.map +1 -1
  166. package/form/styles/_index.scss +8 -4
  167. package/glitch-text/styles/_index.scss +5 -0
  168. package/gradient-text/styles/_index.scss +5 -0
  169. package/i18n/en.json +233 -0
  170. package/i18n/ru.json +233 -0
  171. package/icon/styles/_index.scss +15 -1
  172. package/input/styles/_index.scss +16 -0
  173. package/input-number/styles/_index.scss +8 -1
  174. package/keyboard/styles/_index.scss +15 -3
  175. package/llms-full.txt +124 -63
  176. package/llms.txt +29 -8
  177. package/loading-bar/styles/_index.scss +5 -0
  178. package/marquee/styles/_index.scss +7 -2
  179. package/mention/styles/_index.scss +23 -0
  180. package/overlay/styles/_index.scss +5 -0
  181. package/package.json +15 -1
  182. package/pagination/styles/_index.scss +12 -0
  183. package/popover/styles/_index.scss +165 -45
  184. package/pull-to-refresh/styles/_index.scss +5 -0
  185. package/result/styles/_index.scss +3 -3
  186. package/schematics/icon-set/index.js +80 -34
  187. package/schematics/icon-set/schema.json +8 -3
  188. package/schematics/ng-add/index.js +23 -6
  189. package/schematics/package.json +3 -0
  190. package/schematics/page/templates.js +17 -21
  191. package/schematics/provider/index.js +31 -13
  192. package/schematics/provider/schema.json +40 -24
  193. package/schematics/use/index.js +5 -1
  194. package/schematics/use/schema.json +8 -3
  195. package/schematics/use/symbol-map.json +7 -176
  196. package/segmented/styles/_index.scss +1 -1
  197. package/select/styles/_index.scss +20 -3
  198. package/shiny-text/styles/_index.scss +5 -0
  199. package/speed-dial/styles/_index.scss +12 -1
  200. package/splitter/styles/_index.scss +7 -1
  201. package/spotlight-card/styles/_index.scss +5 -0
  202. package/squircle/styles/_index.scss +5 -0
  203. package/star-border/styles/_index.scss +5 -0
  204. package/statistic/styles/_index.scss +2 -2
  205. package/styles/_animations.scss +6 -0
  206. package/styles.scss +3 -0
  207. package/table/styles/_index.scss +128 -12
  208. package/theme/styles/_box-model.scss +29 -0
  209. package/theme/styles/_colors.scss +116 -15
  210. package/theme/styles/_dark.scss +65 -7
  211. package/theme/styles/_focus.scss +2 -8
  212. package/theme/styles/_index.scss +1 -0
  213. package/tilt-card/styles/_index.scss +5 -0
  214. package/toast/styles/_index.scss +6 -3
  215. package/tour/styles/_index.scss +63 -0
  216. package/transfer/styles/_index.scss +105 -0
  217. package/types/ngwr-alert.d.ts +4 -1
  218. package/types/ngwr-avatar.d.ts +1 -1
  219. package/types/ngwr-back-top.d.ts +3 -2
  220. package/types/ngwr-badge.d.ts +1 -1
  221. package/types/ngwr-border-glow.d.ts +0 -1
  222. package/types/ngwr-carousel.d.ts +10 -1
  223. package/types/ngwr-cascader.d.ts +13 -1
  224. package/types/ngwr-checkbox.d.ts +9 -1
  225. package/types/ngwr-color-picker.d.ts +1 -0
  226. package/types/ngwr-command-palette.d.ts +4 -1
  227. package/types/ngwr-context-menu.d.ts +1 -0
  228. package/types/ngwr-date-picker.d.ts +14 -4
  229. package/types/ngwr-density.d.ts +9 -2
  230. package/types/ngwr-dialog.d.ts +9 -0
  231. package/types/ngwr-divider.d.ts +1 -1
  232. package/types/ngwr-drawer.d.ts +20 -4
  233. package/types/ngwr-dropdown.d.ts +1 -0
  234. package/types/ngwr-event-calendar.d.ts +358 -0
  235. package/types/ngwr-form.d.ts +177 -20
  236. package/types/ngwr-fuzzy-text.d.ts +8 -0
  237. package/types/ngwr-gauge.d.ts +4 -1
  238. package/types/ngwr-i18n.d.ts +80 -2
  239. package/types/ngwr-icon.d.ts +11 -19
  240. package/types/ngwr-input-number.d.ts +8 -1
  241. package/types/ngwr-input.d.ts +50 -20
  242. package/types/ngwr-knob.d.ts +4 -1
  243. package/types/ngwr-lightbox.d.ts +7 -1
  244. package/types/ngwr-line-chart.d.ts +1 -1
  245. package/types/ngwr-media.d.ts +1 -1
  246. package/types/ngwr-mention.d.ts +45 -1
  247. package/types/ngwr-meter-group.d.ts +9 -1
  248. package/types/ngwr-overlay.d.ts +80 -2
  249. package/types/ngwr-page-header.d.ts +2 -2
  250. package/types/ngwr-pagination.d.ts +15 -2
  251. package/types/ngwr-popconfirm.d.ts +1 -0
  252. package/types/ngwr-popover.d.ts +1 -0
  253. package/types/ngwr-progress.d.ts +4 -1
  254. package/types/ngwr-rating.d.ts +3 -2
  255. package/types/ngwr-result.d.ts +12 -6
  256. package/types/ngwr-segmented.d.ts +6 -0
  257. package/types/ngwr-select.d.ts +19 -7
  258. package/types/ngwr-shiny-text.d.ts +2 -4
  259. package/types/ngwr-speed-dial.d.ts +7 -1
  260. package/types/ngwr-squircle.d.ts +1 -1
  261. package/types/ngwr-switch.d.ts +7 -1
  262. package/types/ngwr-table.d.ts +126 -6
  263. package/types/ngwr-tabs.d.ts +1 -4
  264. package/types/ngwr-textarea.d.ts +8 -1
  265. package/types/ngwr-theme.d.ts +8 -1
  266. package/types/ngwr-toolbar.d.ts +2 -2
  267. package/types/ngwr-tour.d.ts +132 -0
  268. package/types/ngwr-transfer.d.ts +118 -0
  269. package/types/ngwr-tree.d.ts +11 -2
  270. package/types/ngwr-validators.d.ts +62 -2
  271. package/types/ngwr-version.d.ts +2 -2
  272. package/types/ngwr-waves.d.ts +10 -0
  273. package/typewriter/styles/_index.scss +5 -0
  274. package/typography/styles/_index.scss +3 -3
  275. package/virtual-scroll/styles/_index.scss +6 -1
  276. package/waves/styles/_index.scss +26 -0
@@ -1,12 +1,27 @@
1
1
  @use '../../theme/styles' as theme;
2
2
 
3
3
  .wr-table {
4
+ --wr-table-bg: var(--wr-color-surface);
4
5
  --wr-table-border: var(--wr-color-outline);
5
6
  --wr-table-head-bg: rgba(var(--wr-color-outline-rgb), 0.25);
6
7
  --wr-table-row-hover: rgba(var(--wr-color-outline-rgb), 0.15);
8
+ // Head casing. The library renders column titles as the author wrote them —
9
+ // forcing `uppercase` mutates their content, and a header written "ID" or
10
+ // "created at" is the consumer's decision to make, not ours. Both halves stay
11
+ // tokens, so opting back into the old treatment is one rule:
12
+ // .wr-table { --wr-table-head-transform: uppercase;
13
+ // --wr-table-head-letter-spacing: 0.04em; }
14
+ // The tracking moves with the casing on purpose — 0.04em is there to open up
15
+ // capitals and looks wrong on sentence case.
16
+ --wr-table-head-transform: none;
17
+ --wr-table-head-letter-spacing: var(--wr-tracking-normal);
7
18
 
8
19
  display: block;
9
20
  position: relative;
21
+ // The table paints its own surface. Sticky pinned cells already fill with
22
+ // --wr-color-surface, so leaving the table transparent let a page background
23
+ // show through the normal rows while the pinned ones stayed opaque.
24
+ background: var(--wr-table-bg);
10
25
  // Own stacking context so the loading overlay reliably outranks the sticky
11
26
  // pinned cells regardless of the surrounding page z-index.
12
27
  isolation: isolate;
@@ -50,8 +65,8 @@
50
65
  color: var(--wr-color-on-surface-muted);
51
66
  font-weight: 600;
52
67
  font-size: var(--wr-text-xs);
53
- letter-spacing: 0.04em;
54
- text-transform: uppercase;
68
+ letter-spacing: var(--wr-table-head-letter-spacing);
69
+ text-transform: var(--wr-table-head-transform);
55
70
  white-space: nowrap;
56
71
  }
57
72
 
@@ -111,8 +126,67 @@
111
126
  opacity: 0.35;
112
127
  }
113
128
 
114
- .cdk-drag-animating {
115
- transition: transform 0.18s cubic-bezier(0, 0, 0.2, 1);
129
+ // NOTE: `.cdk-drag-animating` is NOT here. CDK puts it on the preview clone,
130
+ // which lives in `<body>` — see the rule at the end of this file.
131
+
132
+
133
+ // --- Tree rows ------------------------------------------------------------
134
+ // Depth lives on the `<tr>` as `--wr-table-depth` and is spent inside the tree
135
+ // column's cell, not as a lead column: a new column would break `columnOrder`
136
+ // indexes and the pin measurements, and a child would stop being an ordinary
137
+ // `<tr>` going through the same cell loop.
138
+ &__tree-lead {
139
+ display: inline-flex;
140
+ align-items: center;
141
+ vertical-align: middle;
142
+ margin-inline-end: 0.25rem;
143
+ padding-inline-start: calc(var(--wr-table-depth, 0) * var(--wr-table-indent, 1.25rem));
144
+ }
145
+
146
+ &__tree-toggle {
147
+ appearance: none;
148
+ flex: 0 0 auto;
149
+ display: inline-flex;
150
+ align-items: center;
151
+ justify-content: center;
152
+ width: 1.25rem;
153
+ height: 1.25rem;
154
+ padding: 0;
155
+ background: transparent;
156
+ border: 0;
157
+ border-radius: var(--wr-border-radius-sm);
158
+ color: var(--wr-color-on-surface-muted);
159
+ cursor: pointer;
160
+
161
+ &:hover {
162
+ background: var(--wr-color-hover);
163
+ color: var(--wr-color-on-surface);
164
+ }
165
+
166
+ // A leaf keeps the slot so labels line up down a column, but is not a
167
+ // button and is hidden from assistive tech.
168
+ &--leaf {
169
+ cursor: default;
170
+ visibility: hidden;
171
+ }
172
+ }
173
+
174
+ &__tree-icon {
175
+ width: 0.875rem;
176
+ height: 0.875rem;
177
+ transition: transform var(--wr-transition-base);
178
+ }
179
+
180
+ &__tree-toggle--open &__tree-icon,
181
+ &__tree-toggle--open .wr-table__tree-icon {
182
+ transform: rotate(90deg);
183
+ }
184
+
185
+ // Card mode stacks label / value with `justify-content: space-between`, so an
186
+ // extra inline child would strand the chevron mid-row. Fold the lead into the
187
+ // value side instead.
188
+ &--responsive &__tree-lead {
189
+ margin-inline-end: 0.375rem;
116
190
  }
117
191
 
118
192
  // --- Row selection --------------------------------------------------------
@@ -191,6 +265,9 @@
191
265
  }
192
266
 
193
267
  // --- Summary / footer row -------------------------------------------------
268
+ // `&__foot-cell--lead` is emitted on the selection / expand footer cells and
269
+ // carries no styles of its own — it exists as a public hook so consumers can
270
+ // target those two cells without matching on position.
194
271
  &__foot-cell {
195
272
  padding: calc(0.625rem * var(--wr-density-y, 1)) calc(0.875rem * var(--wr-density-x, 1));
196
273
  background: var(--wr-table-head-bg);
@@ -203,7 +280,7 @@
203
280
  // Pinned footer cells need an opaque base (over the head tint) to stay sticky.
204
281
  &__foot-cell#{&}__td--pin-left,
205
282
  &__foot-cell#{&}__td--pin-right {
206
- background-color: var(--wr-color-surface);
283
+ background-color: var(--wr-table-bg);
207
284
  background-image: linear-gradient(var(--wr-table-head-bg), var(--wr-table-head-bg));
208
285
  }
209
286
 
@@ -221,14 +298,14 @@
221
298
  &__td--pin-left,
222
299
  &__td--pin-right {
223
300
  z-index: 1;
224
- background-color: var(--wr-color-surface);
301
+ background-color: var(--wr-table-bg);
225
302
  }
226
303
 
227
304
  // Header cells lay the head tint over the opaque base so the row stays seamless.
228
305
  &__th--pin-left,
229
306
  &__th--pin-right {
230
307
  z-index: 2;
231
- background-color: var(--wr-color-surface);
308
+ background-color: var(--wr-table-bg);
232
309
  background-image: linear-gradient(var(--wr-table-head-bg), var(--wr-table-head-bg));
233
310
  }
234
311
 
@@ -392,7 +469,7 @@
392
469
  &__group-foot-row > &__foot-cell {
393
470
  border-top: 0;
394
471
  border-bottom: 1px solid var(--wr-table-border);
395
- background-color: var(--wr-color-surface);
472
+ background-color: var(--wr-table-bg);
396
473
  background-image: linear-gradient(var(--wr-table-group-bg), var(--wr-table-group-bg));
397
474
  }
398
475
 
@@ -424,7 +501,7 @@
424
501
  }
425
502
 
426
503
  thead th:not(.wr-table__th--pin-left):not(.wr-table__th--pin-right) {
427
- background-color: var(--wr-color-surface);
504
+ background-color: var(--wr-table-bg);
428
505
  background-image: linear-gradient(var(--wr-table-head-bg), var(--wr-table-head-bg));
429
506
  }
430
507
 
@@ -456,7 +533,7 @@
456
533
  }
457
534
 
458
535
  tfoot .wr-table__foot-cell:not(.wr-table__td--pin-left):not(.wr-table__td--pin-right) {
459
- background-color: var(--wr-color-surface);
536
+ background-color: var(--wr-table-bg);
460
537
  background-image: linear-gradient(var(--wr-table-head-bg), var(--wr-table-head-bg));
461
538
  }
462
539
 
@@ -518,8 +595,11 @@
518
595
  color: var(--wr-color-on-surface-muted);
519
596
  font-size: var(--wr-text-xs);
520
597
  font-weight: 600;
521
- letter-spacing: 0.04em;
522
- text-transform: uppercase;
598
+ // Route through the same tokens as `&__th` instead of re-hard-coding the
599
+ // treatment — card mode used to ignore `--wr-table-head-transform` entirely,
600
+ // so a consumer who opted out still got capitals on mobile.
601
+ letter-spacing: var(--wr-table-head-letter-spacing);
602
+ text-transform: var(--wr-table-head-transform);
523
603
  text-align: left;
524
604
  white-space: nowrap;
525
605
  }
@@ -744,3 +824,39 @@
744
824
  }
745
825
  }
746
826
  }
827
+
828
+ // The dragged header's preview is a clone CDK moves to `document.body`, so it
829
+ // leaves `.wr-table` behind and no ancestor selector reaches it — the clone's
830
+ // own `wr-table__th` class does. Declared here rather than inherited: until the
831
+ // drag-drop entry point's rules were scoped, this preview silently wore
832
+ // `wr-sortable-list`'s lift shadow, and scoping them without this would have
833
+ // left the column preview with no chrome at all.
834
+ .cdk-drag-preview.wr-table__th {
835
+ box-sizing: border-box;
836
+ display: flex;
837
+ align-items: center;
838
+ // Every value has to resolve in `<body>`: the `--wr-table-*` tokens are
839
+ // declared on `.wr-table`, which the preview has left, so they are passed with
840
+ // the same defaults that block sets. `--wr-density-*` and `--wr-color-*` are
841
+ // root-level and resolve as-is.
842
+ padding: calc(0.625rem * var(--wr-density-y, 1)) calc(0.875rem * var(--wr-density-x, 1));
843
+ background: var(--wr-table-head-bg, rgba(var(--wr-color-outline-rgb), 0.25));
844
+ color: var(--wr-color-on-surface-muted);
845
+ font-family: var(--wr-font-family-base);
846
+ font-weight: 600;
847
+ font-size: var(--wr-text-xs);
848
+ letter-spacing: var(--wr-table-head-letter-spacing, var(--wr-tracking-normal));
849
+ text-transform: var(--wr-table-head-transform, none);
850
+ white-space: nowrap;
851
+ border-radius: var(--wr-border-radius-sm);
852
+ box-shadow: 0 8px 12px rgba(var(--wr-color-backdrop-rgb), 0.24);
853
+ // The preview must track the cursor 1:1 — never animate its transform.
854
+ transition: none;
855
+ }
856
+
857
+ // The settle animation after a drop. Same element as the rule above — CDK adds
858
+ // `cdk-drag-animating` to the preview while it flies back to the drop slot — so
859
+ // it must come after it to beat that `transition: none` at equal specificity.
860
+ .cdk-drag-animating.wr-table__th {
861
+ transition: transform 0.18s var(--wr-ease-out);
862
+ }
@@ -0,0 +1,29 @@
1
+ // Box model baseline for ngwr's own elements.
2
+ //
3
+ // `ngwr/reset` (which does set `box-sizing: border-box` globally) is opt-in by
4
+ // design, and the umbrella `@use 'ngwr'` deliberately leaves it out — so a
5
+ // consumer following the documented "import once, everything works" path lands
6
+ // in a `content-box` world. Components can't assume otherwise, and several of
7
+ // them did: any `.wr-*` element that pairs `width: 100%` with padding or a
8
+ // border overflowed its container by exactly padding + border. Measured in a
9
+ // stock Angular app on `@use 'ngwr'`:
10
+ //
11
+ // .wr-btn--block → 30px over (14+14 padding, 1+1 border)
12
+ // .wr-input (sm / md / lg) → 18 / 26 / 34px over
13
+ // .wr-textarea__native → 16 / 24 / 32px over
14
+ // .wr-input-group → 2px over (border only)
15
+ //
16
+ // Which is where the stray horizontal scrollbars came from.
17
+ //
18
+ // Scoped to the `wr-` namespace so it can never change the box model of
19
+ // consumer markup — that stays their call, via `ngwr/reset` or their own reset.
20
+ //
21
+ // `:where()` contributes zero specificity on purpose: this is a baseline, not an
22
+ // override. `.wr-icon` and `.wr-spinner` declare `content-box` deliberately (the
23
+ // declared size IS the glyph box) and keep winning without needing `!important`
24
+ // or a particular load order.
25
+ :where([class^='wr-'], [class*=' wr-']),
26
+ :where([class^='wr-'], [class*=' wr-'])::before,
27
+ :where([class^='wr-'], [class*=' wr-'])::after {
28
+ box-sizing: border-box;
29
+ }
@@ -21,11 +21,10 @@ $base-colors: (
21
21
  dark: #0f172a,
22
22
  ) !default;
23
23
 
24
- // YIQ luminosity threshold (0–255) above which a color is treated as
25
- // "light" and pairs with dark text. Uses the classic Bootstrap formula —
26
- // it weights the green channel higher than blue, which matches human
27
- // perception of brightness far better than HSL lightness (HSL classes
28
- // pure blue as 50%-lightness even though it reads as dark).
24
+ // Deprecated: the old YIQ brightness cut-off. No longer read — `_contrast()`
25
+ // compares real WCAG contrast ratios, which needs no threshold. Kept declared
26
+ // so `@use 'ngwr/theme' with ($contrast-threshold: …)` in an existing app still
27
+ // compiles instead of erroring on an unknown variable.
29
28
  $contrast-threshold: 150 !default;
30
29
 
31
30
  // Dark text used on light backgrounds.
@@ -40,20 +39,69 @@ $contrast-light: #ffffff !default;
40
39
  @return color.channel($c, 'red'), color.channel($c, 'green'), color.channel($c, 'blue');
41
40
  }
42
41
 
42
+ /** One channel, linearised per WCAG 2.x. */
43
+ @function _linear($channel) {
44
+ $s: math.div($channel, 255);
45
+ @if $s <= 0.03928 {
46
+ @return math.div($s, 12.92);
47
+ }
48
+ @return math.pow(math.div($s + 0.055, 1.055), 2.4);
49
+ }
50
+
51
+ /** WCAG relative luminance of a colour. */
52
+ @function _luminance($c) {
53
+ @return 0.2126 * _linear(color.channel($c, 'red')) + 0.7152 * _linear(color.channel($c, 'green')) + 0.0722 *
54
+ _linear(color.channel($c, 'blue'));
55
+ }
56
+
57
+ /** WCAG contrast ratio between two colours. */
58
+ @function _ratio($a, $b) {
59
+ $la: _luminance($a);
60
+ $lb: _luminance($b);
61
+ $hi: math.max($la, $lb);
62
+ $lo: math.min($la, $lb);
63
+ @return math.div($hi + 0.05, $lo + 0.05);
64
+ }
65
+
66
+ /**
67
+ * Foreground that actually reads best on `$c` — whichever of the two candidates
68
+ * wins on WCAG contrast ratio.
69
+ *
70
+ * Was a YIQ brightness threshold, which is a brightness *estimate*, not the
71
+ * metric accessibility is judged by, and it mispicked on every mid-saturation
72
+ * colour: five of the nine shipped intents got white text below AA
73
+ * (success 3.33:1, medium 3.10:1, danger and info 3.68:1, secondary 3.99:1)
74
+ * where dark text would have cleared it (5.43 / 5.82 / 4.90 / 4.91 / 4.52).
75
+ * Comparing the real ratios needs no threshold to tune.
76
+ */
43
77
  @function _contrast($c) {
44
- $r: color.channel($c, 'red');
45
- $g: color.channel($c, 'green');
46
- $b: color.channel($c, 'blue');
47
- $yiq: math.div($r * 299 + $g * 587 + $b * 114, 1000);
48
- @if $yiq >= $contrast-threshold {
78
+ @if _ratio($c, $contrast-dark) >= _ratio($c, $contrast-light) {
49
79
  @return $contrast-dark;
50
80
  }
51
81
  @return $contrast-light;
52
82
  }
53
83
 
84
+ /**
85
+ * Public alias of {@link _contrast}. Any theme partial that re-tunes an intent
86
+ * has to re-derive its `-contrast` token too, otherwise the token stays baked
87
+ * from the light palette — which is how the dark theme ended up putting white
88
+ * text on its lightened primary at 3.36:1.
89
+ */
90
+ @function contrast($c) {
91
+ @return _contrast($c);
92
+ }
93
+
54
94
  // CSS variables
55
95
 
56
96
  :root {
97
+ // Declared here so the light token set also claims the light UA scheme.
98
+ // Without it the browser fell back to the OS preference, and an app running
99
+ // ngwr's LIGHT theme on a dark-mode machine got dark scrollbars and dark
100
+ // native controls (<textarea>, date/colour inputs) against light surfaces.
101
+ // `_dark.scss` still flips it to `dark` under [data-theme='dark'], which wins
102
+ // on specificity.
103
+ color-scheme: light;
104
+
57
105
  --wr-color-white: #ffffff;
58
106
  --wr-color-white-rgb: 255, 255, 255;
59
107
  --wr-color-black: #000000;
@@ -80,10 +128,25 @@ $contrast-light: #ffffff !default;
80
128
  // regardless of theme.
81
129
  --wr-color-overlay: rgba(var(--wr-color-backdrop-rgb), 0.45);
82
130
 
83
- // De-emphasized text — `medium` dimmed to two canonical strengths so muted
131
+ // Muted TEXT, deliberately its own token rather than an alias of the `medium`
132
+ // intent. The two roles pull in opposite directions and cannot share a value:
133
+ // as text it needs >= 4.5:1 against the lightest surface (#ebeff4), while as a
134
+ // button fill it carries dark text and needs >= 4.5:1 the other way. The best
135
+ // candidate for either fails the other — the window closes around #6b7a8a
136
+ // (3.81 as text, 4.11 as fill). Aliasing them left secondary text at 2.69:1.
137
+ --wr-color-muted-text: #5f6c7d;
138
+ --wr-color-muted-text-rgb: 95, 108, 125;
139
+
140
+ // De-emphasized text — the muted ink dimmed to two canonical strengths so
84
141
  // labels / captions / placeholders read consistently. One place each.
85
- --wr-color-text-muted: rgba(var(--wr-color-medium-rgb), 0.85);
86
- --wr-color-text-faint: rgba(var(--wr-color-medium-rgb), 0.6);
142
+ // Only the full-opacity token above is AA-safe for body text; these two are
143
+ // decorative by design (0.85 reaches ~3.5:1, 0.6 ~2.3:1 on a light surface).
144
+ // 0.95, not 0.85: the role itself is 5.35:1 on the light surface, but wrapping
145
+ // it at 0.85 composited to #778291 — 3.90:1, under the AA bar. 0.95 is the
146
+ // most softening that still clears it (4.81), which leaves this token barely
147
+ // distinguishable from the flat role it wraps.
148
+ --wr-color-text-muted: rgba(var(--wr-color-muted-text-rgb), 0.95);
149
+ --wr-color-text-faint: rgba(var(--wr-color-muted-text-rgb), 0.6);
87
150
 
88
151
  // Neutral gray ramp — a FIXED primitive scale (slate). Each step is a stable
89
152
  // job (50 = subtlest surface tint … 950 = strongest ink) and, unlike the
@@ -121,8 +184,8 @@ $contrast-light: #ffffff !default;
121
184
  --wr-color-surface-rgb: var(--wr-color-white-rgb);
122
185
  --wr-color-on-surface: var(--wr-color-dark);
123
186
  --wr-color-on-surface-rgb: var(--wr-color-dark-rgb);
124
- --wr-color-on-surface-muted: var(--wr-color-medium);
125
- --wr-color-on-surface-muted-rgb: var(--wr-color-medium-rgb);
187
+ --wr-color-on-surface-muted: var(--wr-color-muted-text);
188
+ --wr-color-on-surface-muted-rgb: var(--wr-color-muted-text-rgb);
126
189
 
127
190
  // Solid hairline / divider colour. Distinct from `--wr-color-border` above,
128
191
  // which is deliberately translucent (`light` at 50%) so it reads on any
@@ -155,6 +218,44 @@ $contrast-light: #ffffff !default;
155
218
  --wr-color-#{$name}-soft-contrast: color-mix(in srgb, var(--wr-color-#{$name}) 62%, var(--wr-color-dark));
156
219
  --wr-color-#{$name}-active: rgba(var(--wr-color-#{$name}-rgb), 0.2);
157
220
  }
221
+
222
+ // `-ink`: the intent used as TEXT on `--wr-color-surface`.
223
+ //
224
+ // v10 fixed the opposite direction — `-contrast`, the label ON a filled
225
+ // intent. The inverse was never covered, and the light theme fails WCAG AA
226
+ // everywhere an outlined / bordered variant paints the hue as its own label:
227
+ // warning lands at 1.71:1 against a 4.5 bar, medium 3.10, success 3.33,
228
+ // danger and info 3.68, secondary 3.99. Dark passes on all of them, because
229
+ // its bases were retuned lighter for a dark canvas and that happens to be the
230
+ // accessible direction.
231
+ //
232
+ // Same recipe as `-soft-contrast`: mixing toward `--wr-color-dark` darkens in
233
+ // light and lightens in dark from ONE declaration, because that token itself
234
+ // flips. The share is per intent rather than uniform — warning has to travel
235
+ // furthest (a yellow readable on white is not yellow), and forcing every
236
+ // intent to warning's share would drag primary to near-navy for no reason.
237
+ // Each is the measured minimum that clears 4.5:1 in BOTH themes on the surface
238
+ // and on the tag's 6% / 10% tints, with 3pp of headroom.
239
+ $ink-mix: (
240
+ primary: 93%,
241
+ secondary: 80%,
242
+ success: 72%,
243
+ warning: 50%,
244
+ danger: 77%,
245
+ info: 76%,
246
+ medium: 69%,
247
+ );
248
+
249
+ @each $name, $share in $ink-mix {
250
+ --wr-color-#{$name}-ink: color-mix(in srgb, var(--wr-color-#{$name}) #{$share}, var(--wr-color-dark));
251
+ }
252
+
253
+ // `light` is a surface tone by definition — a hair off the page background in
254
+ // either theme — so there is no darkening that keeps it recognisable AND
255
+ // readable. It borrows the page's own ink; the border still carries the
256
+ // intent. `dark` already IS the ink.
257
+ --wr-color-light-ink: var(--wr-color-on-surface);
258
+ --wr-color-dark-ink: var(--wr-color-dark);
158
259
  }
159
260
 
160
261
  // Public SCSS list
@@ -1,5 +1,7 @@
1
1
  @use 'sass:color';
2
2
 
3
+ @use 'colors';
4
+
3
5
  // Dark theme overrides — opt-in via `[data-theme="dark"]` on <html>.
4
6
  // Drive the toggle from `WrTheme` (provided automatically with
5
7
  // `provideWrTheme(...)`).
@@ -17,6 +19,15 @@ $dark-intents: (
17
19
  danger: #ff5c5c,
18
20
  );
19
21
 
22
+ // The surface / ink bases below are re-tuned for the dark canvas too, but they
23
+ // live in hand-written blocks (each one documents a judgement call the loop
24
+ // can't express). Holding the values in variables lets the `-rgb` triplets and
25
+ // the shade derivations read from the value that actually ships, instead of
26
+ // being re-typed next to it.
27
+ $_light: #262f44;
28
+ $_medium: #9aa6b8;
29
+ $_dark: #e6ebf3;
30
+
20
31
  [data-theme='dark'] {
21
32
  // Canvas (was `--wr-color-white` in light mode)
22
33
  // Deeper than slate-900 so an elevated surface in slate-800 reads
@@ -26,8 +37,9 @@ $dark-intents: (
26
37
 
27
38
  // Text
28
39
  // Softer than pure-white — easier on the eyes for long reading.
29
- --wr-color-dark: #e6ebf3;
30
- --wr-color-dark-rgb: 230, 235, 243;
40
+ --wr-color-dark: #{$_dark};
41
+ --wr-color-dark-rgb:
42
+ #{color.channel($_dark, 'red')}, #{color.channel($_dark, 'green')}, #{color.channel($_dark, 'blue')};
31
43
  // `*-contrast` values are baked at SCSS compile time from the light
32
44
  // palette, so they don't auto-flip when `--wr-color-dark` /
33
45
  // `--wr-color-white` are reassigned for dark mode. Tooltip-style
@@ -35,6 +47,22 @@ $dark-intents: (
35
47
  // white-on-white without this override; re-pair them by hand here.
36
48
  --wr-color-dark-contrast: #0b1120;
37
49
  --wr-color-white-contrast: #e6ebf3;
50
+ // Same story as the contrast pair: the shades were baked from the light
51
+ // palette's near-black ink, so `.wr-btn--dark:hover` painted itself almost
52
+ // black while keeping the near-black `-contrast` text. `dark` is an INK token,
53
+ // so unlike `light` below its shades mean exactly what they say.
54
+ // `color.scale`, not `color.adjust`, for the two lighter steps. In dark mode
55
+ // `dark` IS the near-white ink (#e6ebf3, L 92.7%), so `adjust(+10%)` asks for
56
+ // L 102.7% — out of gamut. Sass then cannot emit rgb and falls back to legacy
57
+ // comma-hsl with an out-of-range lightness, which browsers clamp: the token
58
+ // silently became pure white instead of a controlled step. `scale` moves a
59
+ // percentage of the REMAINING headroom, so it approaches white without ever
60
+ // leaving the gamut. 70% reproduces the previous `-light` to within a rounding
61
+ // step; 85% is the distinct step beyond it.
62
+ --wr-color-dark-light: #{color.scale($_dark, $lightness: 70%)};
63
+ --wr-color-dark-lighter: #{color.scale($_dark, $lightness: 85%)};
64
+ --wr-color-dark-dark: #{color.adjust($_dark, $lightness: -5%)};
65
+ --wr-color-dark-darker: #{color.adjust($_dark, $lightness: -10%)};
38
66
 
39
67
  // Borders / tints (was `--wr-color-light`)
40
68
  // Used for two jobs at once: 1-px borders and translucent surface
@@ -43,8 +71,9 @@ $dark-intents: (
43
71
  // looks like glowing pencil lines). This value reads as a real
44
72
  // divider on cards / inputs without shouting — matches what Vercel
45
73
  // and shadcn ship for the same job.
46
- --wr-color-light: #262f44;
47
- --wr-color-light-rgb: 38, 47, 68;
74
+ --wr-color-light: #{$_light};
75
+ --wr-color-light-rgb:
76
+ #{color.channel($_light, 'red')}, #{color.channel($_light, 'green')}, #{color.channel($_light, 'blue')};
48
77
  // The baked contrast pairs with the LIGHT value (#cbd5e1 → dark text);
49
78
  // the dark surface above needs light text instead.
50
79
  --wr-color-light-contrast: #e6ebf3;
@@ -57,18 +86,43 @@ $dark-intents: (
57
86
  // means "stronger divider" (further from canvas, so lighter).
58
87
  --wr-color-light-lighter: #1a2236;
59
88
  --wr-color-light-darker: #3a4661;
89
+ // `-light` / `-dark` were the two the hand block forgot, and they are what
90
+ // `.wr-btn--light` uses for hover / active. Left inherited, hover swapped in
91
+ // the LIGHT palette's slate-300 — a near-white fill under the near-white
92
+ // `-contrast` text above, so the button simply disappeared under the cursor.
93
+ // Half-steps of the tuned pair, same inverted reading: toward the canvas for
94
+ // `-light`, away from it for `-dark`, which also makes hover read as a lift.
95
+ --wr-color-light-light: #{color.adjust($_light, $lightness: -2.5%)};
96
+ --wr-color-light-dark: #{color.adjust($_light, $lightness: 5%)};
60
97
 
61
98
  // Secondary text (was `--wr-color-medium`)
62
99
  // Lifted from slate-400 → slate-300-ish for better legibility on
63
100
  // the deeper canvas.
64
- --wr-color-medium: #9aa6b8;
65
- --wr-color-medium-rgb: 154, 166, 184;
101
+ --wr-color-medium: #{$_medium};
102
+ --wr-color-medium-rgb:
103
+ #{color.channel($_medium, 'red')}, #{color.channel($_medium, 'green')}, #{color.channel($_medium, 'blue')};
104
+ // This block shipped base + rgb only, so contrast and all four shades still
105
+ // came from the light palette's slate. Ink token, plain shades.
106
+ --wr-color-medium-contrast: #{colors.contrast($_medium)};
107
+ --wr-color-medium-light: #{color.adjust($_medium, $lightness: 5%)};
108
+ --wr-color-medium-lighter: #{color.adjust($_medium, $lightness: 10%)};
109
+ --wr-color-medium-dark: #{color.adjust($_medium, $lightness: -5%)};
110
+ --wr-color-medium-darker: #{color.adjust($_medium, $lightness: -10%)};
111
+
112
+ // Muted TEXT is its own token now (the light theme could not serve both text
113
+ // and fill from one value), so the dark canvas needs its own version too —
114
+ // otherwise it would inherit the light theme's dark ink. 7.64:1 here.
115
+ --wr-color-muted-text: #9aa6b8;
116
+ --wr-color-muted-text-rgb: 154, 166, 184;
66
117
 
67
118
  // Brand-color retune
68
119
  // The default primary (#3969e2) reads a touch dim on the deep
69
120
  // canvas. Bump the base + shade derivations so hover / focus rings
70
121
  // stay visible against slate-900.
71
122
  --wr-color-primary: #5b85ff;
123
+ // Same reason as the loop above — the light primary pairs with white, but the
124
+ // lightened dark-theme primary only reaches 3.36:1 against it.
125
+ --wr-color-primary-contrast: #{colors.contrast(#5b85ff)};
72
126
  --wr-color-primary-rgb: 91, 133, 255;
73
127
  --wr-color-primary-light: #7a9eff;
74
128
  --wr-color-primary-dark: #2f56c9;
@@ -79,7 +133,11 @@ $dark-intents: (
79
133
  // shade set in dark too (generated, so no intent can silently drift).
80
134
  @each $name, $base in $dark-intents {
81
135
  --wr-color-#{$name}: #{$base};
82
- --wr-color-#{$name}-rgb: #{color.channel($base, 'red')}, #{color.channel($base, 'green')}, #{color.channel($base, 'blue')};
136
+ // Re-derived, not inherited: the light-palette token would pair the wrong
137
+ // foreground with a re-tuned base.
138
+ --wr-color-#{$name}-contrast: #{colors.contrast($base)};
139
+ --wr-color-#{$name}-rgb:
140
+ #{color.channel($base, 'red')}, #{color.channel($base, 'green')}, #{color.channel($base, 'blue')};
83
141
  --wr-color-#{$name}-light: #{color.adjust($base, $lightness: 5%)};
84
142
  --wr-color-#{$name}-lighter: #{color.adjust($base, $lightness: 10%)};
85
143
  --wr-color-#{$name}-dark: #{color.adjust($base, $lightness: -5%)};
@@ -37,7 +37,7 @@
37
37
  }
38
38
 
39
39
  // Mention option rows
40
- .wr-mention__option:focus-visible {
40
+ .wr-mention-panel__option:focus-visible {
41
41
  @include focus-ring;
42
42
  }
43
43
 
@@ -64,13 +64,7 @@
64
64
  }
65
65
 
66
66
  // Stepper step headers
67
- .wr-stepper__step:focus-visible {
68
- @include focus-ring;
69
- }
70
-
71
- // Toast close/copy
72
- .wr-toast__close:focus-visible,
73
- .wr-toast__copy:focus-visible {
67
+ .wr-stepper__header:focus-visible {
74
68
  @include focus-ring;
75
69
  }
76
70
 
@@ -1,3 +1,4 @@
1
+ @forward 'box-model';
1
2
  @forward 'colors';
2
3
  @forward 'variables';
3
4
  @forward 'dark';
@@ -1,3 +1,8 @@
1
+ // Pull the whole theme so a standalone `@use 'ngwr/<name>'` brings in every
2
+ // design token this stylesheet references. Sass deduplicates `@use` per
3
+ // compilation, so the umbrella sheet still emits the theme only once.
4
+ @use '../../theme/styles' as theme;
5
+
1
6
  // 3D mouse-tilt card. The transform is set imperatively by `[wrTilt]`,
2
7
  // so this stylesheet just covers the card chrome + the optional glare
3
8
  // overlay that the directive appends when `[glare]="true"`.
@@ -1,7 +1,10 @@
1
1
  @use '../../theme/styles' as theme;
2
2
 
3
+ // `info` mapped to `primary` before the `info` intent existed; alert has used
4
+ // the real intent since it landed, so the same toast and alert read as two
5
+ // different colours for the same meaning.
3
6
  $toast-colors: (
4
- info: primary,
7
+ info: info,
5
8
  success: success,
6
9
  warning: warning,
7
10
  danger: danger,
@@ -59,7 +62,7 @@ $toast-colors: (
59
62
  width: auto;
60
63
  max-width: calc(100% - 2rem);
61
64
  transition:
62
- transform 240ms cubic-bezier(0.4, 0, 0.2, 1),
65
+ transform 240ms var(--wr-ease-out),
63
66
  opacity 240ms ease,
64
67
  box-shadow 240ms ease;
65
68
  transform-origin: center top;
@@ -89,7 +92,7 @@ $toast-colors: (
89
92
 
90
93
  &--stack.wr-toast-host--expanded .wr-toast {
91
94
  transition:
92
- transform 240ms cubic-bezier(0.4, 0, 0.2, 1),
95
+ transform 240ms var(--wr-ease-out),
93
96
  opacity 240ms ease;
94
97
  }
95
98