ngwr 7.2.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. package/README.md +8 -7
  2. package/alert/styles/_index.scss +44 -17
  3. package/avatar/styles/_index.scss +2 -2
  4. package/badge/styles/_index.scss +11 -7
  5. package/badge/styles/_tag.scss +1 -1
  6. package/bar-chart/styles/_index.scss +1 -2
  7. package/breadcrumbs/styles/_index.scss +4 -2
  8. package/burger/styles/_index.scss +2 -2
  9. package/button/styles/_index.scss +30 -20
  10. package/calendar/styles/_index.scss +11 -9
  11. package/calendar-heatmap/styles/_index.scss +2 -0
  12. package/card/styles/_index.scss +1 -1
  13. package/carousel/styles/_index.scss +3 -1
  14. package/cascader/styles/_index.scss +54 -14
  15. package/checkbox/styles/_index.scss +21 -4
  16. package/collapse/styles/_index.scss +1 -1
  17. package/color-picker/styles/_index.scss +18 -12
  18. package/command-palette/styles/_index.scss +3 -3
  19. package/compare/styles/_index.scss +3 -3
  20. package/context-menu/styles/_index.scss +1 -1
  21. package/date-picker/styles/_index.scss +5 -6
  22. package/density/styles/_index.scss +13 -3
  23. package/dialog/styles/_index.scss +3 -3
  24. package/divider/styles/_index.scss +1 -1
  25. package/drawer/styles/_index.scss +13 -11
  26. package/dropdown/styles/_index.scss +2 -2
  27. package/fesm2022/ngwr-affix.mjs +3 -3
  28. package/fesm2022/ngwr-alert.mjs +22 -10
  29. package/fesm2022/ngwr-alert.mjs.map +1 -1
  30. package/fesm2022/ngwr-anchor.mjs +3 -3
  31. package/fesm2022/ngwr-aurora.mjs +3 -3
  32. package/fesm2022/ngwr-avatar.mjs +3 -3
  33. package/fesm2022/ngwr-back-top.mjs +3 -3
  34. package/fesm2022/ngwr-badge.mjs +6 -6
  35. package/fesm2022/ngwr-bar-chart.mjs +3 -3
  36. package/fesm2022/ngwr-blur-text.mjs +3 -3
  37. package/fesm2022/ngwr-border-glow.mjs +3 -3
  38. package/fesm2022/ngwr-breadcrumbs.mjs +7 -7
  39. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  40. package/fesm2022/ngwr-burger.mjs +3 -3
  41. package/fesm2022/ngwr-button.mjs +6 -6
  42. package/fesm2022/ngwr-calendar-heatmap.mjs +3 -3
  43. package/fesm2022/ngwr-calendar.mjs +4 -4
  44. package/fesm2022/ngwr-calendar.mjs.map +1 -1
  45. package/fesm2022/ngwr-card.mjs +10 -10
  46. package/fesm2022/ngwr-card.mjs.map +1 -1
  47. package/fesm2022/ngwr-carousel.mjs +50 -9
  48. package/fesm2022/ngwr-carousel.mjs.map +1 -1
  49. package/fesm2022/ngwr-cascader.mjs +12 -35
  50. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  51. package/fesm2022/ngwr-checkbox.mjs +13 -30
  52. package/fesm2022/ngwr-checkbox.mjs.map +1 -1
  53. package/fesm2022/ngwr-circular-text.mjs +3 -3
  54. package/fesm2022/ngwr-click-spark.mjs +25 -6
  55. package/fesm2022/ngwr-click-spark.mjs.map +1 -1
  56. package/fesm2022/ngwr-clipboard.mjs +27 -6
  57. package/fesm2022/ngwr-clipboard.mjs.map +1 -1
  58. package/fesm2022/ngwr-collapse.mjs +9 -9
  59. package/fesm2022/ngwr-color-picker.mjs +7 -7
  60. package/fesm2022/ngwr-color-picker.mjs.map +1 -1
  61. package/fesm2022/ngwr-command-palette.mjs +3 -3
  62. package/fesm2022/ngwr-compare.mjs +3 -3
  63. package/fesm2022/ngwr-confetti.mjs +3 -3
  64. package/fesm2022/ngwr-context-menu.mjs +39 -15
  65. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  66. package/fesm2022/ngwr-cookie.mjs +3 -3
  67. package/fesm2022/ngwr-counter.mjs +12 -8
  68. package/fesm2022/ngwr-counter.mjs.map +1 -1
  69. package/fesm2022/ngwr-date-adapter-fns.mjs +3 -3
  70. package/fesm2022/ngwr-date-adapter-luxon.mjs +3 -3
  71. package/fesm2022/ngwr-date-adapter.mjs +3 -3
  72. package/fesm2022/ngwr-date-picker.mjs +25 -11
  73. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  74. package/fesm2022/ngwr-decrypt-text.mjs +3 -3
  75. package/fesm2022/ngwr-density.mjs +14 -14
  76. package/fesm2022/ngwr-density.mjs.map +1 -1
  77. package/fesm2022/ngwr-descriptions.mjs +6 -6
  78. package/fesm2022/ngwr-dialog.mjs +15 -15
  79. package/fesm2022/ngwr-directives.mjs +15 -87
  80. package/fesm2022/ngwr-directives.mjs.map +1 -1
  81. package/fesm2022/ngwr-divider.mjs +3 -3
  82. package/fesm2022/ngwr-donut-chart.mjs +10 -4
  83. package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
  84. package/fesm2022/ngwr-drag-drop.mjs +18 -8
  85. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  86. package/fesm2022/ngwr-drawer.mjs +80 -19
  87. package/fesm2022/ngwr-drawer.mjs.map +1 -1
  88. package/fesm2022/ngwr-dropdown.mjs +9 -9
  89. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  90. package/fesm2022/ngwr-empty.mjs +3 -3
  91. package/fesm2022/ngwr-falling-text.mjs +3 -3
  92. package/fesm2022/ngwr-file-upload.mjs +3 -3
  93. package/fesm2022/ngwr-form.mjs +9 -9
  94. package/fesm2022/ngwr-fuzzy-text.mjs +8 -7
  95. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
  96. package/fesm2022/ngwr-gauge.mjs +3 -3
  97. package/fesm2022/ngwr-glitch-text.mjs +15 -7
  98. package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
  99. package/fesm2022/ngwr-gradient-text.mjs +3 -3
  100. package/fesm2022/ngwr-hotkey.mjs +6 -6
  101. package/fesm2022/ngwr-i18n.mjs +9 -9
  102. package/fesm2022/ngwr-icon.mjs +3 -3
  103. package/fesm2022/ngwr-image-cropper.mjs +3 -3
  104. package/fesm2022/ngwr-input-number.mjs +4 -4
  105. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  106. package/fesm2022/ngwr-input-otp.mjs +10 -4
  107. package/fesm2022/ngwr-input-otp.mjs.map +1 -1
  108. package/fesm2022/ngwr-input.mjs +25 -16
  109. package/fesm2022/ngwr-input.mjs.map +1 -1
  110. package/fesm2022/ngwr-keyboard.mjs +3 -3
  111. package/fesm2022/ngwr-knob.mjs +3 -3
  112. package/fesm2022/ngwr-layout.mjs +15 -15
  113. package/fesm2022/ngwr-lightbox.mjs +60 -5
  114. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  115. package/fesm2022/ngwr-line-chart.mjs +3 -3
  116. package/fesm2022/ngwr-list.mjs +7 -7
  117. package/fesm2022/ngwr-list.mjs.map +1 -1
  118. package/fesm2022/ngwr-loading-bar.mjs +6 -6
  119. package/fesm2022/ngwr-marquee.mjs +3 -3
  120. package/fesm2022/ngwr-media.mjs +3 -3
  121. package/fesm2022/ngwr-mention.mjs +6 -6
  122. package/fesm2022/ngwr-meta.mjs +6 -6
  123. package/fesm2022/ngwr-meter-group.mjs +3 -3
  124. package/fesm2022/ngwr-overlay.mjs +3 -3
  125. package/fesm2022/ngwr-page-header.mjs +3 -3
  126. package/fesm2022/ngwr-pagination.mjs +14 -16
  127. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  128. package/fesm2022/ngwr-pipes.mjs +21 -21
  129. package/fesm2022/ngwr-platform.mjs +3 -3
  130. package/fesm2022/ngwr-popconfirm.mjs +6 -6
  131. package/fesm2022/ngwr-popover.mjs +6 -6
  132. package/fesm2022/ngwr-progress.mjs +3 -3
  133. package/fesm2022/ngwr-qr.mjs +3 -3
  134. package/fesm2022/ngwr-radio.mjs +28 -26
  135. package/fesm2022/ngwr-radio.mjs.map +1 -1
  136. package/fesm2022/ngwr-rating.mjs +12 -23
  137. package/fesm2022/ngwr-rating.mjs.map +1 -1
  138. package/fesm2022/ngwr-result.mjs +12 -12
  139. package/fesm2022/ngwr-rotating-text.mjs +18 -7
  140. package/fesm2022/ngwr-rotating-text.mjs.map +1 -1
  141. package/fesm2022/ngwr-scroll.mjs +3 -3
  142. package/fesm2022/ngwr-segmented.mjs +10 -22
  143. package/fesm2022/ngwr-segmented.mjs.map +1 -1
  144. package/fesm2022/ngwr-select.mjs +26 -13
  145. package/fesm2022/ngwr-select.mjs.map +1 -1
  146. package/fesm2022/ngwr-shiny-text.mjs +6 -6
  147. package/fesm2022/ngwr-sidebar.mjs +3 -3
  148. package/fesm2022/ngwr-skeleton.mjs +3 -3
  149. package/fesm2022/ngwr-slider.mjs +3 -3
  150. package/fesm2022/ngwr-sparkline.mjs +3 -3
  151. package/fesm2022/ngwr-speed-dial.mjs +3 -3
  152. package/fesm2022/ngwr-spinner.mjs +3 -3
  153. package/fesm2022/ngwr-splash-cursor.mjs +3 -3
  154. package/fesm2022/ngwr-split-text.mjs +3 -3
  155. package/fesm2022/ngwr-splitter.mjs +3 -3
  156. package/fesm2022/ngwr-spotlight-card.mjs +8 -8
  157. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  158. package/fesm2022/ngwr-squircle.mjs +6 -6
  159. package/fesm2022/ngwr-star-border.mjs +3 -3
  160. package/fesm2022/ngwr-statistic.mjs +79 -10
  161. package/fesm2022/ngwr-statistic.mjs.map +1 -1
  162. package/fesm2022/ngwr-stepper.mjs +6 -6
  163. package/fesm2022/ngwr-storage.mjs +3 -3
  164. package/fesm2022/ngwr-switch.mjs +10 -14
  165. package/fesm2022/ngwr-switch.mjs.map +1 -1
  166. package/fesm2022/ngwr-table.mjs +20 -14
  167. package/fesm2022/ngwr-table.mjs.map +1 -1
  168. package/fesm2022/ngwr-tabs.mjs +45 -11
  169. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  170. package/fesm2022/ngwr-textarea.mjs +84 -25
  171. package/fesm2022/ngwr-textarea.mjs.map +1 -1
  172. package/fesm2022/ngwr-theme.mjs +3 -3
  173. package/fesm2022/ngwr-tilt-card.mjs +6 -6
  174. package/fesm2022/ngwr-timeline.mjs +6 -6
  175. package/fesm2022/ngwr-toast.mjs +99 -25
  176. package/fesm2022/ngwr-toast.mjs.map +1 -1
  177. package/fesm2022/ngwr-toolbar.mjs +13 -6
  178. package/fesm2022/ngwr-toolbar.mjs.map +1 -1
  179. package/fesm2022/ngwr-tree.mjs +3 -3
  180. package/fesm2022/ngwr-typewriter.mjs +3 -3
  181. package/fesm2022/ngwr-typography.mjs +3 -3
  182. package/fesm2022/ngwr-validators.mjs +41 -3
  183. package/fesm2022/ngwr-validators.mjs.map +1 -1
  184. package/fesm2022/ngwr-version.mjs +1 -1
  185. package/fesm2022/ngwr-version.mjs.map +1 -1
  186. package/fesm2022/ngwr-virtual-scroll.mjs +3 -3
  187. package/fesm2022/ngwr-waves.mjs +3 -3
  188. package/fesm2022/ngwr-window.mjs +12 -12
  189. package/file-upload/styles/_index.scss +3 -3
  190. package/form/styles/_index.scss +5 -5
  191. package/glitch-text/styles/_index.scss +3 -6
  192. package/image-cropper/styles/_index.scss +3 -3
  193. package/input/styles/_index.scss +26 -7
  194. package/input-otp/styles/_index.scss +23 -5
  195. package/keyboard/styles/_index.scss +6 -4
  196. package/knob/styles/_index.scss +1 -1
  197. package/lightbox/styles/_index.scss +31 -10
  198. package/list/styles/_index.scss +3 -3
  199. package/llms-full.txt +668 -0
  200. package/llms.txt +106 -0
  201. package/mention/styles/_index.scss +2 -2
  202. package/overlay/styles/_index.scss +1 -1
  203. package/package.json +1 -6
  204. package/pagination/styles/_index.scss +36 -25
  205. package/popconfirm/styles/_index.scss +1 -1
  206. package/popover/styles/_index.scss +2 -2
  207. package/radio/styles/_index.scss +20 -5
  208. package/rating/styles/_index.scss +12 -1
  209. package/schematics/migrations/v8/index.js +122 -0
  210. package/schematics/migrations.json +5 -0
  211. package/schematics/ng-add/index.js +3 -3
  212. package/schematics/ng-add/schema.json +6 -6
  213. package/schematics/provider/schema.json +1 -1
  214. package/schematics/use/symbol-map.json +11 -2
  215. package/segmented/styles/_index.scss +31 -8
  216. package/select/styles/_index.scss +73 -25
  217. package/sidebar/styles/_index.scss +3 -3
  218. package/slider/styles/_index.scss +5 -3
  219. package/speed-dial/styles/_index.scss +1 -0
  220. package/splitter/styles/_index.scss +7 -4
  221. package/spotlight-card/styles/_index.scss +8 -4
  222. package/stepper/styles/_index.scss +4 -4
  223. package/styles/_animations.scss +0 -23
  224. package/styles.scss +0 -1
  225. package/switch/styles/_index.scss +25 -6
  226. package/table/styles/_index.scss +69 -8
  227. package/tabs/styles/_index.scss +46 -3
  228. package/textarea/styles/_index.scss +59 -4
  229. package/theme/styles/_colors.scss +57 -0
  230. package/theme/styles/_dark.scss +22 -8
  231. package/theme/styles/_focus.scss +5 -0
  232. package/theme/styles/_variables.scss +24 -0
  233. package/timeline/styles/_index.scss +11 -2
  234. package/toast/styles/_index.scss +15 -5
  235. package/toolbar/styles/_index.scss +30 -1
  236. package/tree/styles/_index.scss +18 -17
  237. package/types/ngwr-alert.d.ts +16 -6
  238. package/types/ngwr-carousel.d.ts +8 -1
  239. package/types/ngwr-cascader.d.ts +5 -2
  240. package/types/ngwr-checkbox.d.ts +5 -2
  241. package/types/ngwr-click-spark.d.ts +13 -1
  242. package/types/ngwr-clipboard.d.ts +12 -1
  243. package/types/ngwr-context-menu.d.ts +20 -3
  244. package/types/ngwr-date-picker.d.ts +3 -0
  245. package/types/ngwr-density.d.ts +7 -7
  246. package/types/ngwr-directives.d.ts +17 -49
  247. package/types/ngwr-drag-drop.d.ts +13 -1
  248. package/types/ngwr-drawer.d.ts +11 -3
  249. package/types/ngwr-fuzzy-text.d.ts +1 -1
  250. package/types/ngwr-glitch-text.d.ts +9 -3
  251. package/types/ngwr-input-otp.d.ts +6 -2
  252. package/types/ngwr-input.d.ts +27 -13
  253. package/types/ngwr-lightbox.d.ts +14 -1
  254. package/types/ngwr-pagination.d.ts +10 -10
  255. package/types/ngwr-radio.d.ts +14 -3
  256. package/types/ngwr-rating.d.ts +5 -1
  257. package/types/ngwr-rotating-text.d.ts +1 -0
  258. package/types/ngwr-segmented.d.ts +5 -2
  259. package/types/ngwr-select.d.ts +6 -2
  260. package/types/ngwr-spotlight-card.d.ts +1 -1
  261. package/types/ngwr-statistic.d.ts +35 -1
  262. package/types/ngwr-switch.d.ts +5 -1
  263. package/types/ngwr-table.d.ts +7 -1
  264. package/types/ngwr-tabs.d.ts +6 -0
  265. package/types/ngwr-textarea.d.ts +25 -3
  266. package/types/ngwr-toast.d.ts +7 -1
  267. package/types/ngwr-toolbar.d.ts +7 -1
  268. package/types/ngwr-validators.d.ts +3 -1
  269. package/types/ngwr-version.d.ts +1 -1
  270. package/window/styles/_index.scss +8 -8
  271. package/fesm2022/ngwr-scramble-text.mjs +0 -165
  272. package/fesm2022/ngwr-scramble-text.mjs.map +0 -1
  273. package/scramble-text/scramble-text.scss +0 -1
  274. package/scramble-text/styles/_index.scss +0 -8
  275. package/types/ngwr-scramble-text.d.ts +0 -49
@@ -14,6 +14,13 @@
14
14
  font-family: var(--wr-font-family-base);
15
15
  color: var(--wr-color-dark);
16
16
 
17
+ // Opt-in (`responsive`): query the table's own width so each row collapses to
18
+ // a labelled card when it's too narrow for columns. Already width:100%, so
19
+ // containment is safe.
20
+ &--responsive {
21
+ container: wr-table / inline-size;
22
+ }
23
+
17
24
  &__scroll {
18
25
  width: 100%;
19
26
  overflow-x: auto;
@@ -22,7 +29,7 @@
22
29
  &__table {
23
30
  width: 100%;
24
31
  border-collapse: collapse;
25
- font-size: 0.875rem;
32
+ font-size: var(--wr-text-sm);
26
33
  line-height: 1.25rem;
27
34
  }
28
35
 
@@ -38,7 +45,7 @@
38
45
  background: var(--wr-table-head-bg);
39
46
  color: var(--wr-color-medium);
40
47
  font-weight: 600;
41
- font-size: 0.6875rem;
48
+ font-size: var(--wr-text-xs);
42
49
  letter-spacing: 0.04em;
43
50
  text-transform: uppercase;
44
51
  white-space: nowrap;
@@ -102,6 +109,60 @@
102
109
  }
103
110
  }
104
111
 
112
+ // Responsive tables: when the box is too narrow for columns, each row becomes a
113
+ // card and every cell shows its column title (from `data-label`) as a label.
114
+ @container wr-table (max-width: 36rem) {
115
+ .wr-table--responsive .wr-table__scroll {
116
+ overflow-x: visible;
117
+ }
118
+
119
+ // Break the table grid down to blocks; the header row is replaced by per-cell
120
+ // labels.
121
+ .wr-table--responsive .wr-table__table,
122
+ .wr-table--responsive .wr-table__table tbody,
123
+ .wr-table--responsive .wr-table__tr,
124
+ .wr-table--responsive .wr-table__td {
125
+ display: block;
126
+ }
127
+
128
+ .wr-table--responsive .wr-table__table thead {
129
+ display: none;
130
+ }
131
+
132
+ // One card per row.
133
+ .wr-table--responsive .wr-table__tr {
134
+ padding: 0.375rem 0;
135
+ border-bottom: 1px solid var(--wr-table-border);
136
+ }
137
+
138
+ .wr-table--responsive .wr-table__tr:last-child {
139
+ border-bottom: 0;
140
+ }
141
+
142
+ // Each cell is a `LABEL ......... value` line.
143
+ .wr-table--responsive .wr-table__td {
144
+ display: flex;
145
+ justify-content: space-between;
146
+ align-items: baseline;
147
+ gap: 1rem;
148
+ padding: 0.25rem 0.875rem;
149
+ border-bottom: 0;
150
+ text-align: right;
151
+ }
152
+
153
+ .wr-table--responsive .wr-table__td::before {
154
+ content: attr(data-label);
155
+ flex: 0 0 auto;
156
+ color: var(--wr-color-medium);
157
+ font-size: var(--wr-text-xs);
158
+ font-weight: 600;
159
+ letter-spacing: 0.04em;
160
+ text-transform: uppercase;
161
+ text-align: left;
162
+ white-space: nowrap;
163
+ }
164
+ }
165
+
105
166
  .wr-table-sort {
106
167
  display: inline-flex;
107
168
  --wr-icon-size: 0.875rem;
@@ -153,7 +214,7 @@
153
214
  border-radius: var(--wr-border-radius-pill);
154
215
  background: var(--wr-color-primary);
155
216
  color: var(--wr-color-primary-contrast);
156
- font-size: 0.625rem;
217
+ font-size: 0.625rem; // 10px — intentional micro-count badge, below --wr-text-xs
157
218
  font-weight: 600;
158
219
  }
159
220
 
@@ -176,7 +237,7 @@
176
237
  background: transparent;
177
238
  color: var(--wr-color-dark);
178
239
  font: inherit;
179
- font-size: 0.8125rem;
240
+ font-size: var(--wr-text-sm);
180
241
  }
181
242
 
182
243
  &__list {
@@ -197,7 +258,7 @@
197
258
  border-radius: var(--wr-border-radius-sm);
198
259
  color: var(--wr-color-dark);
199
260
  font: inherit;
200
- font-size: 0.8125rem;
261
+ font-size: var(--wr-text-sm);
201
262
  text-align: left;
202
263
  cursor: pointer;
203
264
 
@@ -232,7 +293,7 @@
232
293
  &__empty {
233
294
  padding: 0.625rem 0.5rem;
234
295
  color: var(--wr-color-medium);
235
- font-size: 0.8125rem;
296
+ font-size: var(--wr-text-sm);
236
297
  text-align: center;
237
298
  }
238
299
 
@@ -244,12 +305,12 @@
244
305
  border-radius: var(--wr-border-radius-sm);
245
306
  color: var(--wr-color-primary);
246
307
  font: inherit;
247
- font-size: 0.8125rem;
308
+ font-size: var(--wr-text-sm);
248
309
  cursor: pointer;
249
310
  text-align: left;
250
311
 
251
312
  &:hover {
252
- background: rgba(var(--wr-color-primary-rgb), 0.08);
313
+ background: var(--wr-color-primary-soft);
253
314
  }
254
315
  }
255
316
  }
@@ -6,6 +6,10 @@
6
6
  --wr-tabs-color-hover: var(--wr-color-dark);
7
7
  --wr-tabs-color-active: var(--wr-color-primary);
8
8
  --wr-tabs-indicator: var(--wr-color-primary);
9
+ --wr-tabs-font-size: var(--wr-control-font-size-md);
10
+ --wr-tabs-line-height: var(--wr-control-line-height-md);
11
+ --wr-tabs-padding-y: 0.625rem;
12
+ --wr-tabs-padding-x: 1rem;
9
13
 
10
14
  display: block;
11
15
  // Claim the full row even when nested in a flex-row demo wrapper.
@@ -14,6 +18,21 @@
14
18
  min-width: 0;
15
19
  font-family: var(--wr-font-family-base);
16
20
 
21
+ // Sizes — wire the (previously inert) `size` input to the control fonts.
22
+ &--sm {
23
+ --wr-tabs-font-size: var(--wr-control-font-size-sm);
24
+ --wr-tabs-line-height: var(--wr-control-line-height-sm);
25
+ --wr-tabs-padding-y: 0.5rem;
26
+ --wr-tabs-padding-x: 0.75rem;
27
+ }
28
+
29
+ &--lg {
30
+ --wr-tabs-font-size: var(--wr-control-font-size-lg);
31
+ --wr-tabs-line-height: var(--wr-control-line-height-lg);
32
+ --wr-tabs-padding-y: 0.75rem;
33
+ --wr-tabs-padding-x: 1.25rem;
34
+ }
35
+
17
36
  &__strip {
18
37
  display: flex;
19
38
  align-items: stretch;
@@ -29,6 +48,30 @@
29
48
  // the y-axis since the strip is always a single row.
30
49
  overflow-x: auto;
31
50
  overflow-y: hidden;
51
+
52
+ // Edge fades — when the strip overflows, the side that still has tabs to
53
+ // scroll to fades out, cueing that there's more. `--wr-tabs-fade-*` default
54
+ // to 0 (no fade); the `--fade-start` / `--fade-end` modifiers below turn an
55
+ // edge on from the component's scroll metrics, so a non-scrolling strip is
56
+ // never masked.
57
+ --wr-tabs-fade: 1.5rem;
58
+ --wr-tabs-fade-start: 0px;
59
+ --wr-tabs-fade-end: 0px;
60
+ mask-image: linear-gradient(
61
+ to right,
62
+ transparent 0,
63
+ #000 var(--wr-tabs-fade-start),
64
+ #000 calc(100% - var(--wr-tabs-fade-end)),
65
+ transparent 100%
66
+ );
67
+ }
68
+
69
+ &--fade-start &__strip {
70
+ --wr-tabs-fade-start: var(--wr-tabs-fade);
71
+ }
72
+
73
+ &--fade-end &__strip {
74
+ --wr-tabs-fade-end: var(--wr-tabs-fade);
32
75
  }
33
76
 
34
77
  &__tab {
@@ -36,12 +79,12 @@
36
79
  background: transparent;
37
80
  border: 0;
38
81
  text-decoration: none;
39
- padding: 0.625rem 1rem;
82
+ padding: var(--wr-tabs-padding-y) var(--wr-tabs-padding-x);
40
83
  color: var(--wr-tabs-color);
41
84
  font: inherit;
42
- font-size: 0.875rem;
85
+ font-size: var(--wr-tabs-font-size);
43
86
  font-weight: 500;
44
- line-height: 1.25rem;
87
+ line-height: var(--wr-tabs-line-height);
45
88
  border-bottom: 2px solid transparent;
46
89
  cursor: pointer;
47
90
  white-space: nowrap;
@@ -9,11 +9,11 @@
9
9
  --wr-textarea-placeholder: rgba(var(--wr-color-medium-rgb), 0.7);
10
10
  --wr-textarea-bg: var(--wr-color-white);
11
11
  --wr-textarea-border: var(--wr-color-light);
12
- --wr-textarea-radius: var(--wr-border-radius-base);
12
+ --wr-textarea-radius: var(--wr-control-radius-md);
13
13
  --wr-textarea-ring: transparent;
14
14
  --wr-textarea-padding-y: 0.5rem;
15
- --wr-textarea-padding-x: 0.75rem;
16
- --wr-textarea-font-size: 0.875rem;
15
+ --wr-textarea-padding-x: var(--wr-control-padding-x-md);
16
+ --wr-textarea-font-size: var(--wr-text-sm);
17
17
  --wr-textarea-line-height: 1.375rem;
18
18
 
19
19
  background: var(--wr-textarea-bg);
@@ -37,6 +37,29 @@
37
37
  cursor: not-allowed;
38
38
  }
39
39
 
40
+ // Horizontal resize needs a shrinkable, explicit-width box (not full-width block).
41
+ &--resize-x {
42
+ display: inline-block;
43
+ max-width: 100%;
44
+ }
45
+
46
+ // Sizes — radius, padding, font + line-height scale; height stays content-driven.
47
+ &--sm {
48
+ --wr-textarea-radius: var(--wr-control-radius-sm);
49
+ --wr-textarea-padding-y: 0.375rem;
50
+ --wr-textarea-padding-x: var(--wr-control-padding-x-sm);
51
+ --wr-textarea-font-size: var(--wr-text-xs);
52
+ --wr-textarea-line-height: 1.125rem;
53
+ }
54
+
55
+ &--lg {
56
+ --wr-textarea-radius: var(--wr-control-radius-lg);
57
+ --wr-textarea-padding-y: 0.625rem;
58
+ --wr-textarea-padding-x: var(--wr-control-padding-x-lg);
59
+ --wr-textarea-font-size: var(--wr-text-base);
60
+ --wr-textarea-line-height: 1.625rem;
61
+ }
62
+
40
63
  &--no-resize &__native {
41
64
  resize: none;
42
65
  }
@@ -55,7 +78,8 @@
55
78
  line-height: var(--wr-textarea-line-height);
56
79
  padding: calc(var(--wr-textarea-padding-y) * var(--wr-density-y, 1))
57
80
  calc(var(--wr-textarea-padding-x) * var(--wr-density-x, 1));
58
- resize: vertical;
81
+ // Native grip removed — we draw our own corner grip (&__resize) instead.
82
+ resize: none;
59
83
 
60
84
  &::placeholder {
61
85
  color: var(--wr-textarea-placeholder);
@@ -65,4 +89,35 @@
65
89
  cursor: not-allowed;
66
90
  }
67
91
  }
92
+
93
+ // Corner resize grip — icon (move-vertical / -horizontal / -diagonal-2) and
94
+ // cursor follow the `resize` direction.
95
+ &__resize {
96
+ position: absolute;
97
+ right: 0.25rem;
98
+ bottom: 0.25rem;
99
+ display: inline-flex;
100
+ color: var(--wr-color-text-faint);
101
+ touch-action: none;
102
+ transition: color var(--wr-transition-base);
103
+
104
+ &--vertical {
105
+ cursor: ns-resize;
106
+ }
107
+ &--horizontal {
108
+ cursor: ew-resize;
109
+ }
110
+ &--both {
111
+ cursor: nwse-resize;
112
+ }
113
+
114
+ .wr-icon__svg {
115
+ width: 0.875rem;
116
+ height: 0.875rem;
117
+ }
118
+
119
+ &:hover {
120
+ color: var(--wr-color-medium);
121
+ }
122
+ }
68
123
  }
@@ -15,6 +15,7 @@ $base-colors: (
15
15
  success: #00a400,
16
16
  warning: #ffba00,
17
17
  danger: #fa383e,
18
+ info: #3b82f6,
18
19
  light: #cbd5e1,
19
20
  medium: #8594a4,
20
21
  dark: #0f172a,
@@ -65,6 +66,48 @@ $contrast-light: #ffffff !default;
65
66
  // and turns the backdrop into a white wash.
66
67
  --wr-color-backdrop-rgb: 0, 0, 0;
67
68
 
69
+ // Generic subtle hover-surface tint (icon buttons, list rows) — one place
70
+ // so the hover strength stays consistent everywhere.
71
+ --wr-color-hover: rgba(var(--wr-color-light-rgb), 0.4);
72
+
73
+ // Border / divider strengths — translucent so they read on any surface and
74
+ // auto-adapt in dark (via the flipping `light` channels). One place each.
75
+ --wr-color-border: rgba(var(--wr-color-light-rgb), 0.5);
76
+ --wr-color-border-subtle: rgba(var(--wr-color-light-rgb), 0.35);
77
+ --wr-color-border-strong: rgba(var(--wr-color-light-rgb), 0.6);
78
+
79
+ // Scrim behind modals / drawers — always black so the dim reads as "covered"
80
+ // regardless of theme.
81
+ --wr-color-overlay: rgba(var(--wr-color-backdrop-rgb), 0.45);
82
+
83
+ // De-emphasized text — `medium` dimmed to two canonical strengths so muted
84
+ // 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);
87
+
88
+ // Neutral gray ramp — a FIXED primitive scale (slate). Each step is a stable
89
+ // job (50 = subtlest surface tint … 950 = strongest ink) and, unlike the
90
+ // semantic neutrals, does NOT flip in dark mode. For theme-aware surface /
91
+ // text jobs reach for the role aliases below instead.
92
+ --wr-color-gray-50: #f8fafc;
93
+ --wr-color-gray-100: #f1f5f9;
94
+ --wr-color-gray-200: #e2e8f0;
95
+ --wr-color-gray-300: #cbd5e1;
96
+ --wr-color-gray-400: #94a3b8;
97
+ --wr-color-gray-500: #64748b;
98
+ --wr-color-gray-600: #475569;
99
+ --wr-color-gray-700: #334155;
100
+ --wr-color-gray-800: #1e293b;
101
+ --wr-color-gray-900: #0f172a;
102
+ --wr-color-gray-950: #020617;
103
+
104
+ // Semantic role aliases over the flipping neutrals — prefer these in new code
105
+ // for intent-free surface / text jobs. They resolve through `white` / `dark`
106
+ // / `medium`, so they flip with the theme automatically.
107
+ --wr-color-surface: var(--wr-color-white);
108
+ --wr-color-on-surface: var(--wr-color-dark);
109
+ --wr-color-on-surface-muted: var(--wr-color-medium);
110
+
68
111
  @each $name, $base in $base-colors {
69
112
  --wr-color-#{$name}: #{$base};
70
113
  --wr-color-#{$name}-rgb: #{_rgb-channels($base)};
@@ -74,6 +117,20 @@ $contrast-light: #ffffff !default;
74
117
  --wr-color-#{$name}-light: #{color.adjust($base, $lightness: 5%)};
75
118
  --wr-color-#{$name}-lighter: #{color.adjust($base, $lightness: 10%)};
76
119
  }
120
+
121
+ // Soft trio per intent (+ `medium` for neutral surfaces) — tokenizes the
122
+ // ad-hoc `rgba(var(--*-rgb), α)` fills components hand-rolled at ~8
123
+ // different alphas, so each alpha lives in ONE place. `-soft` is the
124
+ // canonical low-alpha fill, `-soft-border` the matching hairline, and
125
+ // `-soft-contrast` the readable same-hue text on it (deep in light,
126
+ // light in dark — follows `--wr-color-dark`). All theme-correct over any
127
+ // background via the -rgb channels.
128
+ @each $name in (primary, secondary, success, warning, danger, info, medium) {
129
+ --wr-color-#{$name}-soft: rgba(var(--wr-color-#{$name}-rgb), 0.12);
130
+ --wr-color-#{$name}-soft-border: rgba(var(--wr-color-#{$name}-rgb), 0.3);
131
+ --wr-color-#{$name}-soft-contrast: color-mix(in srgb, var(--wr-color-#{$name}) 62%, var(--wr-color-dark));
132
+ --wr-color-#{$name}-active: rgba(var(--wr-color-#{$name}-rgb), 0.2);
133
+ }
77
134
  }
78
135
 
79
136
  // Public SCSS list
@@ -1,3 +1,5 @@
1
+ @use 'sass:color';
2
+
1
3
  // Dark theme overrides — opt-in via `[data-theme="dark"]` on <html>.
2
4
  // Drive the toggle from `WrTheme` (provided automatically with
3
5
  // `provideWrTheme(...)`).
@@ -5,6 +7,16 @@
5
7
  // Only semantic tokens flip — palette hues stay so brand-coloured
6
8
  // elements look the same regardless of theme.
7
9
 
10
+ // Intents re-tuned for the dark canvas. Looped (below) so each gets the
11
+ // FULL symmetric shade set — the hand blocks used to ship only base+rgb,
12
+ // leaving -light/-dark/-lighter/-darker baked from the LIGHT palette.
13
+ // (primary keeps its hand-tuned block; info stays its light values.)
14
+ $dark-intents: (
15
+ success: #34c759,
16
+ warning: #ffcc33,
17
+ danger: #ff5c5c,
18
+ );
19
+
8
20
  [data-theme='dark'] {
9
21
  // Canvas (was `--wr-color-white` in light mode)
10
22
  // Deeper than slate-900 so an elevated surface in slate-800 reads
@@ -63,14 +75,16 @@
63
75
  --wr-color-primary-lighter: #99b6ff;
64
76
  --wr-color-primary-darker: #1f3a99;
65
77
 
66
- --wr-color-success: #34c759;
67
- --wr-color-success-rgb: 52, 199, 89;
68
-
69
- --wr-color-warning: #ffcc33;
70
- --wr-color-warning-rgb: 255, 204, 51;
71
-
72
- --wr-color-danger: #ff5c5c;
73
- --wr-color-danger-rgb: 255, 92, 92;
78
+ // success / warning / danger — retuned bases now get the FULL symmetric
79
+ // shade set in dark too (generated, so no intent can silently drift).
80
+ @each $name, $base in $dark-intents {
81
+ --wr-color-#{$name}: #{$base};
82
+ --wr-color-#{$name}-rgb: #{color.channel($base, 'red')}, #{color.channel($base, 'green')}, #{color.channel($base, 'blue')};
83
+ --wr-color-#{$name}-light: #{color.adjust($base, $lightness: 5%)};
84
+ --wr-color-#{$name}-lighter: #{color.adjust($base, $lightness: 10%)};
85
+ --wr-color-#{$name}-dark: #{color.adjust($base, $lightness: -5%)};
86
+ --wr-color-#{$name}-darker: #{color.adjust($base, $lightness: -10%)};
87
+ }
74
88
 
75
89
  // Elevation
76
90
  // Black shadows at light-mode alphas vanish on the deep canvas; same
@@ -91,3 +91,8 @@
91
91
  .wr-dropdown-item:focus-visible {
92
92
  @include focus-ring;
93
93
  }
94
+
95
+ // Alert close
96
+ .wr-alert__close:focus-visible {
97
+ @include focus-ring;
98
+ }
@@ -10,6 +10,30 @@
10
10
  --wr-border-radius-lg: 1rem;
11
11
  --wr-border-radius-pill: 50rem;
12
12
 
13
+ // Control sizing
14
+ //
15
+ // The shared contract every form control reads (button, input, select, …)
16
+ // so they line up pixel-for-pixel at each size. Height is NOT fixed — it's
17
+ // the sum of `line-height + 2×padding-y + 2×border(1px)`, so padding-y can
18
+ // stay density-aware (`* var(--wr-density-y)`) and controls track density
19
+ // together. Keep the three parts in sync if you retune a size.
20
+ // sm → 22px · md → 30px · lg → 36px (radius 5 / 6 / 7)
21
+ --wr-control-padding-y-sm: 0.125rem; // 2px → 16 + 4 + 2 = 22
22
+ --wr-control-padding-y-md: 0.25rem; // 4px → 20 + 8 + 2 = 30
23
+ --wr-control-padding-y-lg: 0.3125rem; // 5px → 24 + 10 + 2 = 36
24
+ --wr-control-padding-x-sm: 0.5rem; // 8px
25
+ --wr-control-padding-x-md: 0.75rem; // 12px
26
+ --wr-control-padding-x-lg: 1rem; // 16px
27
+ --wr-control-line-height-sm: 1rem; // 16px
28
+ --wr-control-line-height-md: 1.25rem; // 20px
29
+ --wr-control-line-height-lg: 1.5rem; // 24px
30
+ --wr-control-font-size-sm: var(--wr-text-xs); // 12px
31
+ --wr-control-font-size-md: var(--wr-text-sm); // 14px
32
+ --wr-control-font-size-lg: var(--wr-text-base); // 16px
33
+ --wr-control-radius-sm: 5px;
34
+ --wr-control-radius-md: 6px;
35
+ --wr-control-radius-lg: 7px;
36
+
13
37
  // Easing curves
14
38
  --wr-ease-linear: linear;
15
39
  --wr-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
@@ -101,19 +101,28 @@
101
101
 
102
102
  // Horizontal: row layout with line through dots.
103
103
  .wr-timeline--horizontal & {
104
+ // Equal-width columns so every dot sits at the same horizontal pitch
105
+ // and the connectors line up across items.
106
+ flex: 1 1 0;
104
107
  flex-direction: column;
105
108
  align-items: center;
106
109
  text-align: center;
107
110
  min-width: 8rem;
111
+ padding-bottom: 0;
108
112
 
113
+ // Connector runs from this dot's centre to the next dot's centre:
114
+ // half of this item + the 2rem gap + half of the next item. With equal
115
+ // widths that is `100% of the item + the gap`, anchored at the centre.
109
116
  &::before {
110
117
  content: '';
111
118
  position: absolute;
112
- top: 0.625rem;
119
+ // Dot centre: margin-top 0.125rem + half of the 0.75rem dot = 0.5rem.
120
+ top: 0.5rem;
113
121
  left: 50%;
114
- right: -2rem;
122
+ width: calc(100% + 2rem);
115
123
  height: 1.5px;
116
124
  background: var(--wr-color-light);
125
+ z-index: 0;
117
126
  }
118
127
 
119
128
  &:last-child::before {
@@ -33,6 +33,14 @@ $toast-colors: (
33
33
  pointer-events: auto;
34
34
  }
35
35
 
36
+ // While expanded the toasts spread into a column with gaps. Those gaps are
37
+ // dead space under `pointer-events: none`, so the cursor crossing them fires
38
+ // mouseleave/mouseenter and toggles `expanded` (jitter). Make the whole host
39
+ // hit-testable while expanded so the inter-toast gaps stay "inside" it.
40
+ &--expanded {
41
+ pointer-events: auto;
42
+ }
43
+
36
44
  // Sonner-style stack
37
45
  // Collapsed: every toast except the front one collapses behind it with a
38
46
  // scale-down + tiny offset. Hovering the host expands them into the
@@ -130,6 +138,8 @@ $toast-colors: (
130
138
  padding: 0.75rem 0.875rem;
131
139
  background: var(--wr-toast-bg);
132
140
  border: 1px solid var(--wr-toast-border);
141
+ // Capture horizontal swipe-to-dismiss; let vertical scroll pass through.
142
+ touch-action: pan-y;
133
143
  border-left: 3px solid var(--wr-toast-accent);
134
144
  @include theme.smooth-br(var(--wr-border-radius-base));
135
145
  box-shadow: var(--wr-shadow-overlay);
@@ -145,7 +155,7 @@ $toast-colors: (
145
155
  &__title {
146
156
  margin: 0 0 0.125rem;
147
157
  color: var(--wr-toast-title);
148
- font-size: 0.875rem;
158
+ font-size: var(--wr-text-sm);
149
159
  font-weight: 600;
150
160
  line-height: 1.25rem;
151
161
  }
@@ -153,7 +163,7 @@ $toast-colors: (
153
163
  &__message {
154
164
  margin: 0;
155
165
  color: var(--wr-toast-message);
156
- font-size: 0.8125rem;
166
+ font-size: var(--wr-text-sm);
157
167
  line-height: 1.125rem;
158
168
  overflow-wrap: break-word;
159
169
  }
@@ -181,7 +191,7 @@ $toast-colors: (
181
191
 
182
192
  &:hover {
183
193
  color: var(--wr-color-dark);
184
- background: rgba(var(--wr-color-light-rgb), 0.5);
194
+ background: var(--wr-color-hover);
185
195
  }
186
196
  }
187
197
 
@@ -241,12 +251,12 @@ $toast-colors: (
241
251
  padding: 0.375rem 0.75rem;
242
252
  color: var(--wr-color-medium);
243
253
  font-family: var(--wr-font-family-base);
244
- font-size: 0.75rem;
254
+ font-size: var(--wr-text-xs);
245
255
  font-weight: 500;
246
256
  line-height: 1rem;
247
257
  text-align: center;
248
258
  cursor: pointer;
249
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);
259
+ box-shadow: var(--wr-shadow-xs);
250
260
  transition:
251
261
  color var(--wr-transition-base),
252
262
  background var(--wr-transition-base),
@@ -16,10 +16,20 @@
16
16
  background: var(--wr-color-white);
17
17
  border: 1px solid var(--wr-color-light);
18
18
  @include theme.smooth-br(var(--wr-border-radius-base));
19
- box-shadow: 0 1px 0 rgba(0, 0, 0, 0.02);
19
+ box-shadow: var(--wr-shadow-xs);
20
20
  font-family: var(--wr-font-family-base);
21
21
  color: var(--wr-color-dark);
22
22
 
23
+ // Opt-in (`responsive`): query the toolbar's own width so the zones stack
24
+ // when it's too narrow for a row. Already full-width, so containment is safe.
25
+ // `flex-wrap` lives here (not in the `@container` below) because a container
26
+ // query can't style the query container itself — only its descendants; wrap
27
+ // only kicks in once the zones go full-width at the breakpoint.
28
+ &--responsive {
29
+ container: wr-toolbar / inline-size;
30
+ flex-wrap: wrap;
31
+ }
32
+
23
33
  &__zone {
24
34
  display: flex;
25
35
  align-items: center;
@@ -63,3 +73,22 @@
63
73
  }
64
74
  }
65
75
  }
76
+
77
+ // Responsive toolbars stack their zones when the bar is too narrow for a row.
78
+ @container wr-toolbar (max-width: 32rem) {
79
+ .wr-toolbar--responsive .wr-toolbar__zone {
80
+ flex: 1 1 100%;
81
+ justify-content: flex-start;
82
+ }
83
+
84
+ .wr-toolbar--responsive .wr-toolbar__zone--end {
85
+ margin-left: 0;
86
+ }
87
+
88
+ // The vertical hairline dividers are a horizontal-row affordance — drop them
89
+ // once the zones stack.
90
+ .wr-toolbar--responsive .wr-toolbar__zone--start + .wr-toolbar__zone--center::before,
91
+ .wr-toolbar--responsive .wr-toolbar__zone--center + .wr-toolbar__zone--end::before {
92
+ display: none;
93
+ }
94
+ }