ngwr 7.3.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 (261) hide show
  1. package/README.md +5 -4
  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 +1 -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 +11 -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 +3 -3
  23. package/dialog/styles/_index.scss +3 -3
  24. package/divider/styles/_index.scss +1 -1
  25. package/drawer/styles/_index.scss +11 -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 +6 -6
  48. package/fesm2022/ngwr-cascader.mjs +12 -35
  49. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  50. package/fesm2022/ngwr-checkbox.mjs +13 -30
  51. package/fesm2022/ngwr-checkbox.mjs.map +1 -1
  52. package/fesm2022/ngwr-circular-text.mjs +3 -3
  53. package/fesm2022/ngwr-click-spark.mjs +25 -6
  54. package/fesm2022/ngwr-click-spark.mjs.map +1 -1
  55. package/fesm2022/ngwr-clipboard.mjs +27 -6
  56. package/fesm2022/ngwr-clipboard.mjs.map +1 -1
  57. package/fesm2022/ngwr-collapse.mjs +9 -9
  58. package/fesm2022/ngwr-color-picker.mjs +7 -7
  59. package/fesm2022/ngwr-color-picker.mjs.map +1 -1
  60. package/fesm2022/ngwr-command-palette.mjs +3 -3
  61. package/fesm2022/ngwr-compare.mjs +3 -3
  62. package/fesm2022/ngwr-confetti.mjs +3 -3
  63. package/fesm2022/ngwr-context-menu.mjs +40 -88
  64. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  65. package/fesm2022/ngwr-cookie.mjs +3 -3
  66. package/fesm2022/ngwr-counter.mjs +12 -8
  67. package/fesm2022/ngwr-counter.mjs.map +1 -1
  68. package/fesm2022/ngwr-date-adapter-fns.mjs +3 -3
  69. package/fesm2022/ngwr-date-adapter-luxon.mjs +3 -3
  70. package/fesm2022/ngwr-date-adapter.mjs +3 -3
  71. package/fesm2022/ngwr-date-picker.mjs +25 -11
  72. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  73. package/fesm2022/ngwr-decrypt-text.mjs +3 -3
  74. package/fesm2022/ngwr-density.mjs +14 -14
  75. package/fesm2022/ngwr-density.mjs.map +1 -1
  76. package/fesm2022/ngwr-descriptions.mjs +6 -6
  77. package/fesm2022/ngwr-dialog.mjs +15 -15
  78. package/fesm2022/ngwr-directives.mjs +15 -87
  79. package/fesm2022/ngwr-directives.mjs.map +1 -1
  80. package/fesm2022/ngwr-divider.mjs +3 -3
  81. package/fesm2022/ngwr-donut-chart.mjs +10 -4
  82. package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
  83. package/fesm2022/ngwr-drag-drop.mjs +6 -6
  84. package/fesm2022/ngwr-drawer.mjs +15 -15
  85. package/fesm2022/ngwr-dropdown.mjs +9 -9
  86. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  87. package/fesm2022/ngwr-empty.mjs +3 -3
  88. package/fesm2022/ngwr-falling-text.mjs +3 -3
  89. package/fesm2022/ngwr-file-upload.mjs +3 -3
  90. package/fesm2022/ngwr-form.mjs +9 -9
  91. package/fesm2022/ngwr-fuzzy-text.mjs +8 -7
  92. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
  93. package/fesm2022/ngwr-gauge.mjs +3 -3
  94. package/fesm2022/ngwr-glitch-text.mjs +15 -7
  95. package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
  96. package/fesm2022/ngwr-gradient-text.mjs +3 -3
  97. package/fesm2022/ngwr-hotkey.mjs +6 -6
  98. package/fesm2022/ngwr-i18n.mjs +9 -9
  99. package/fesm2022/ngwr-icon.mjs +3 -3
  100. package/fesm2022/ngwr-image-cropper.mjs +3 -3
  101. package/fesm2022/ngwr-input-number.mjs +4 -4
  102. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  103. package/fesm2022/ngwr-input-otp.mjs +10 -4
  104. package/fesm2022/ngwr-input-otp.mjs.map +1 -1
  105. package/fesm2022/ngwr-input.mjs +25 -16
  106. package/fesm2022/ngwr-input.mjs.map +1 -1
  107. package/fesm2022/ngwr-keyboard.mjs +3 -3
  108. package/fesm2022/ngwr-knob.mjs +3 -3
  109. package/fesm2022/ngwr-layout.mjs +15 -15
  110. package/fesm2022/ngwr-lightbox.mjs +17 -5
  111. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  112. package/fesm2022/ngwr-line-chart.mjs +3 -3
  113. package/fesm2022/ngwr-list.mjs +7 -7
  114. package/fesm2022/ngwr-list.mjs.map +1 -1
  115. package/fesm2022/ngwr-loading-bar.mjs +6 -6
  116. package/fesm2022/ngwr-marquee.mjs +3 -3
  117. package/fesm2022/ngwr-media.mjs +3 -3
  118. package/fesm2022/ngwr-mention.mjs +6 -6
  119. package/fesm2022/ngwr-meta.mjs +6 -6
  120. package/fesm2022/ngwr-meter-group.mjs +3 -3
  121. package/fesm2022/ngwr-overlay.mjs +3 -3
  122. package/fesm2022/ngwr-page-header.mjs +3 -3
  123. package/fesm2022/ngwr-pagination.mjs +5 -15
  124. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  125. package/fesm2022/ngwr-pipes.mjs +21 -21
  126. package/fesm2022/ngwr-platform.mjs +3 -3
  127. package/fesm2022/ngwr-popconfirm.mjs +6 -6
  128. package/fesm2022/ngwr-popover.mjs +6 -6
  129. package/fesm2022/ngwr-progress.mjs +3 -3
  130. package/fesm2022/ngwr-qr.mjs +3 -3
  131. package/fesm2022/ngwr-radio.mjs +28 -26
  132. package/fesm2022/ngwr-radio.mjs.map +1 -1
  133. package/fesm2022/ngwr-rating.mjs +12 -23
  134. package/fesm2022/ngwr-rating.mjs.map +1 -1
  135. package/fesm2022/ngwr-result.mjs +12 -12
  136. package/fesm2022/ngwr-rotating-text.mjs +3 -3
  137. package/fesm2022/ngwr-scroll.mjs +3 -3
  138. package/fesm2022/ngwr-segmented.mjs +10 -22
  139. package/fesm2022/ngwr-segmented.mjs.map +1 -1
  140. package/fesm2022/ngwr-select.mjs +26 -13
  141. package/fesm2022/ngwr-select.mjs.map +1 -1
  142. package/fesm2022/ngwr-shiny-text.mjs +6 -6
  143. package/fesm2022/ngwr-sidebar.mjs +3 -3
  144. package/fesm2022/ngwr-skeleton.mjs +3 -3
  145. package/fesm2022/ngwr-slider.mjs +3 -3
  146. package/fesm2022/ngwr-sparkline.mjs +3 -3
  147. package/fesm2022/ngwr-speed-dial.mjs +3 -3
  148. package/fesm2022/ngwr-spinner.mjs +3 -3
  149. package/fesm2022/ngwr-splash-cursor.mjs +3 -3
  150. package/fesm2022/ngwr-split-text.mjs +3 -3
  151. package/fesm2022/ngwr-splitter.mjs +3 -3
  152. package/fesm2022/ngwr-spotlight-card.mjs +8 -8
  153. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  154. package/fesm2022/ngwr-squircle.mjs +6 -6
  155. package/fesm2022/ngwr-star-border.mjs +3 -3
  156. package/fesm2022/ngwr-statistic.mjs +79 -10
  157. package/fesm2022/ngwr-statistic.mjs.map +1 -1
  158. package/fesm2022/ngwr-stepper.mjs +6 -6
  159. package/fesm2022/ngwr-storage.mjs +3 -3
  160. package/fesm2022/ngwr-switch.mjs +10 -14
  161. package/fesm2022/ngwr-switch.mjs.map +1 -1
  162. package/fesm2022/ngwr-table.mjs +12 -12
  163. package/fesm2022/ngwr-tabs.mjs +8 -6
  164. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  165. package/fesm2022/ngwr-textarea.mjs +84 -25
  166. package/fesm2022/ngwr-textarea.mjs.map +1 -1
  167. package/fesm2022/ngwr-theme.mjs +3 -3
  168. package/fesm2022/ngwr-tilt-card.mjs +6 -6
  169. package/fesm2022/ngwr-timeline.mjs +6 -6
  170. package/fesm2022/ngwr-toast.mjs +46 -24
  171. package/fesm2022/ngwr-toast.mjs.map +1 -1
  172. package/fesm2022/ngwr-toolbar.mjs +3 -3
  173. package/fesm2022/ngwr-tree.mjs +3 -3
  174. package/fesm2022/ngwr-typewriter.mjs +3 -3
  175. package/fesm2022/ngwr-typography.mjs +3 -3
  176. package/fesm2022/ngwr-validators.mjs +41 -3
  177. package/fesm2022/ngwr-validators.mjs.map +1 -1
  178. package/fesm2022/ngwr-version.mjs +1 -1
  179. package/fesm2022/ngwr-version.mjs.map +1 -1
  180. package/fesm2022/ngwr-virtual-scroll.mjs +3 -3
  181. package/fesm2022/ngwr-waves.mjs +3 -3
  182. package/fesm2022/ngwr-window.mjs +12 -12
  183. package/file-upload/styles/_index.scss +3 -3
  184. package/form/styles/_index.scss +5 -5
  185. package/glitch-text/styles/_index.scss +3 -6
  186. package/image-cropper/styles/_index.scss +3 -3
  187. package/input/styles/_index.scss +26 -7
  188. package/input-otp/styles/_index.scss +23 -5
  189. package/keyboard/styles/_index.scss +6 -4
  190. package/knob/styles/_index.scss +1 -1
  191. package/lightbox/styles/_index.scss +29 -10
  192. package/list/styles/_index.scss +3 -3
  193. package/llms-full.txt +14 -19
  194. package/mention/styles/_index.scss +2 -2
  195. package/overlay/styles/_index.scss +1 -1
  196. package/package.json +1 -6
  197. package/pagination/styles/_index.scss +3 -26
  198. package/popconfirm/styles/_index.scss +1 -1
  199. package/popover/styles/_index.scss +2 -2
  200. package/radio/styles/_index.scss +20 -5
  201. package/rating/styles/_index.scss +12 -1
  202. package/schematics/migrations/v8/index.js +122 -0
  203. package/schematics/migrations.json +5 -0
  204. package/schematics/ng-add/index.js +3 -3
  205. package/schematics/ng-add/schema.json +6 -6
  206. package/schematics/provider/schema.json +1 -1
  207. package/schematics/use/symbol-map.json +11 -2
  208. package/segmented/styles/_index.scss +31 -8
  209. package/select/styles/_index.scss +73 -25
  210. package/sidebar/styles/_index.scss +3 -3
  211. package/slider/styles/_index.scss +2 -3
  212. package/speed-dial/styles/_index.scss +1 -0
  213. package/splitter/styles/_index.scss +4 -4
  214. package/spotlight-card/styles/_index.scss +8 -4
  215. package/stepper/styles/_index.scss +4 -4
  216. package/styles/_animations.scss +0 -23
  217. package/styles.scss +0 -1
  218. package/switch/styles/_index.scss +25 -6
  219. package/table/styles/_index.scss +9 -9
  220. package/tabs/styles/_index.scss +22 -3
  221. package/textarea/styles/_index.scss +59 -4
  222. package/theme/styles/_colors.scss +57 -0
  223. package/theme/styles/_dark.scss +22 -8
  224. package/theme/styles/_focus.scss +5 -0
  225. package/theme/styles/_variables.scss +24 -0
  226. package/timeline/styles/_index.scss +11 -2
  227. package/toast/styles/_index.scss +13 -5
  228. package/toolbar/styles/_index.scss +1 -1
  229. package/tree/styles/_index.scss +18 -17
  230. package/types/ngwr-alert.d.ts +16 -6
  231. package/types/ngwr-cascader.d.ts +5 -2
  232. package/types/ngwr-checkbox.d.ts +5 -2
  233. package/types/ngwr-click-spark.d.ts +13 -1
  234. package/types/ngwr-clipboard.d.ts +12 -1
  235. package/types/ngwr-context-menu.d.ts +20 -25
  236. package/types/ngwr-date-picker.d.ts +3 -0
  237. package/types/ngwr-density.d.ts +7 -7
  238. package/types/ngwr-directives.d.ts +17 -49
  239. package/types/ngwr-fuzzy-text.d.ts +1 -1
  240. package/types/ngwr-glitch-text.d.ts +9 -3
  241. package/types/ngwr-input-otp.d.ts +6 -2
  242. package/types/ngwr-input.d.ts +27 -13
  243. package/types/ngwr-lightbox.d.ts +9 -1
  244. package/types/ngwr-pagination.d.ts +3 -9
  245. package/types/ngwr-radio.d.ts +14 -3
  246. package/types/ngwr-rating.d.ts +5 -1
  247. package/types/ngwr-segmented.d.ts +5 -2
  248. package/types/ngwr-select.d.ts +6 -2
  249. package/types/ngwr-spotlight-card.d.ts +1 -1
  250. package/types/ngwr-statistic.d.ts +35 -1
  251. package/types/ngwr-switch.d.ts +5 -1
  252. package/types/ngwr-textarea.d.ts +25 -3
  253. package/types/ngwr-toast.d.ts +7 -1
  254. package/types/ngwr-validators.d.ts +3 -1
  255. package/types/ngwr-version.d.ts +1 -1
  256. package/window/styles/_index.scss +8 -8
  257. package/fesm2022/ngwr-scramble-text.mjs +0 -165
  258. package/fesm2022/ngwr-scramble-text.mjs.map +0 -1
  259. package/scramble-text/scramble-text.scss +0 -1
  260. package/scramble-text/styles/_index.scss +0 -8
  261. package/types/ngwr-scramble-text.d.ts +0 -49
@@ -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
@@ -147,7 +155,7 @@ $toast-colors: (
147
155
  &__title {
148
156
  margin: 0 0 0.125rem;
149
157
  color: var(--wr-toast-title);
150
- font-size: 0.875rem;
158
+ font-size: var(--wr-text-sm);
151
159
  font-weight: 600;
152
160
  line-height: 1.25rem;
153
161
  }
@@ -155,7 +163,7 @@ $toast-colors: (
155
163
  &__message {
156
164
  margin: 0;
157
165
  color: var(--wr-toast-message);
158
- font-size: 0.8125rem;
166
+ font-size: var(--wr-text-sm);
159
167
  line-height: 1.125rem;
160
168
  overflow-wrap: break-word;
161
169
  }
@@ -183,7 +191,7 @@ $toast-colors: (
183
191
 
184
192
  &:hover {
185
193
  color: var(--wr-color-dark);
186
- background: rgba(var(--wr-color-light-rgb), 0.5);
194
+ background: var(--wr-color-hover);
187
195
  }
188
196
  }
189
197
 
@@ -243,12 +251,12 @@ $toast-colors: (
243
251
  padding: 0.375rem 0.75rem;
244
252
  color: var(--wr-color-medium);
245
253
  font-family: var(--wr-font-family-base);
246
- font-size: 0.75rem;
254
+ font-size: var(--wr-text-xs);
247
255
  font-weight: 500;
248
256
  line-height: 1rem;
249
257
  text-align: center;
250
258
  cursor: pointer;
251
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);
259
+ box-shadow: var(--wr-shadow-xs);
252
260
  transition:
253
261
  color var(--wr-transition-base),
254
262
  background var(--wr-transition-base),
@@ -16,7 +16,7 @@
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
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  display: block;
7
7
  font-family: var(--wr-font-family-base);
8
- font-size: 0.875rem;
8
+ font-size: var(--wr-text-sm);
9
9
  color: var(--wr-color-dark);
10
10
 
11
11
  &__list {
@@ -29,19 +29,18 @@
29
29
  color var(--wr-transition-base);
30
30
 
31
31
  &:hover:not(.wr-tree__row--disabled) {
32
- background: rgba(var(--wr-color-light-rgb), 0.5);
32
+ background: var(--wr-color-hover);
33
33
  }
34
34
 
35
35
  &--selected {
36
- background: rgba(var(--wr-color-primary-rgb), 0.1);
36
+ background: var(--wr-color-primary-soft);
37
37
  color: var(--wr-color-primary);
38
38
  }
39
39
 
40
40
  // Visible ring only when the row truly has keyboard focus — not
41
41
  // just because it's the roving-tabindex cursor row.
42
42
  &:focus-visible {
43
- outline: none;
44
- box-shadow: 0 0 0 2px rgba(var(--wr-color-primary-rgb), 0.25);
43
+ @include theme.focus-ring;
45
44
  }
46
45
 
47
46
  &--disabled {
@@ -100,11 +99,13 @@
100
99
  --wr-tree-trigger-color: var(--wr-color-dark);
101
100
  --wr-tree-trigger-bg: var(--wr-color-white);
102
101
  --wr-tree-trigger-border: var(--wr-color-light);
103
- --wr-tree-trigger-radius: var(--wr-border-radius-base);
104
- --wr-tree-trigger-padding-y: 0.4375rem;
105
- --wr-tree-trigger-padding-x: 0.75rem;
106
- --wr-tree-trigger-font-size: 0.875rem;
107
- --wr-tree-trigger-line-height: 1.25rem;
102
+ // Combobox trigger on the md control contract (30px, radius 6) so it lines
103
+ // up with select / input / button when used as a tree-select.
104
+ --wr-tree-trigger-radius: var(--wr-control-radius-md);
105
+ --wr-tree-trigger-padding-y: var(--wr-control-padding-y-md);
106
+ --wr-tree-trigger-padding-x: var(--wr-control-padding-x-md);
107
+ --wr-tree-trigger-font-size: var(--wr-control-font-size-md);
108
+ --wr-tree-trigger-line-height: var(--wr-control-line-height-md);
108
109
  --wr-tree-panel-max-height: 18rem;
109
110
 
110
111
  display: inline-flex;
@@ -138,9 +139,8 @@
138
139
  box-shadow var(--wr-transition-base);
139
140
 
140
141
  &:focus-visible {
141
- outline: none;
142
142
  border-color: var(--wr-color-primary);
143
- box-shadow: 0 0 0 3px rgba(var(--wr-color-primary-rgb), 0.15);
143
+ @include theme.focus-ring;
144
144
  }
145
145
 
146
146
  &:disabled {
@@ -162,7 +162,7 @@
162
162
  }
163
163
 
164
164
  &__placeholder {
165
- color: rgba(var(--wr-color-medium-rgb), 0.85);
165
+ color: var(--wr-color-text-muted);
166
166
  }
167
167
 
168
168
  &__chevron {
@@ -202,7 +202,8 @@
202
202
  flex-wrap: wrap;
203
203
  align-items: center;
204
204
  padding: 0.25rem 0.5rem;
205
- min-height: calc(var(--wr-tree-trigger-line-height) + var(--wr-tree-trigger-padding-y) * 2);
205
+ // Empty / one-row floor = single-mode height (+2px for the border).
206
+ min-height: calc(var(--wr-tree-trigger-line-height) + var(--wr-tree-trigger-padding-y) * 2 + 2px);
206
207
  }
207
208
 
208
209
  &__chips {
@@ -221,9 +222,9 @@
221
222
  max-width: 100%;
222
223
  padding: 0.125rem 0.25rem 0.125rem 0.5rem;
223
224
  border-radius: 999px;
224
- background: rgba(var(--wr-color-primary-rgb), 0.1);
225
+ background: var(--wr-color-primary-soft);
225
226
  color: var(--wr-color-primary);
226
- font-size: 0.8125rem;
227
+ font-size: var(--wr-text-sm);
227
228
  line-height: 1.4;
228
229
  user-select: none;
229
230
  }
@@ -246,7 +247,7 @@
246
247
  transition: background 0.12s ease;
247
248
 
248
249
  &:hover {
249
- background: rgba(var(--wr-color-primary-rgb), 0.2);
250
+ background: var(--wr-color-primary-active);
250
251
  }
251
252
  }
252
253
 
@@ -9,7 +9,7 @@ import * as _angular_core from '@angular/core';
9
9
  /**
10
10
  * Visual variant of the alert.
11
11
  */
12
- type WrAlertType = 'info' | 'success' | 'warning' | 'danger';
12
+ type WrAlertType = 'info' | 'success' | 'warning' | 'danger' | 'neutral' | 'offline';
13
13
 
14
14
  /**
15
15
  * Inline status banner. Use for feedback messages — saved/failed/notice etc.
@@ -23,14 +23,24 @@ type WrAlertType = 'info' | 'success' | 'warning' | 'danger';
23
23
  * @see https://ngwr.dev/components/alert
24
24
  */
25
25
  declare class WrAlert {
26
- /** Required headline shown at the top of the alert. */
27
- readonly title: _angular_core.InputSignal<string>;
26
+ /**
27
+ * Optional headline shown at the top of the alert.
28
+ *
29
+ * @default null
30
+ */
31
+ readonly title: _angular_core.InputSignal<string | null>;
28
32
  /**
29
33
  * Visual variant.
30
34
  *
31
35
  * @default 'info'
32
36
  */
33
37
  readonly type: _angular_core.InputSignal<WrAlertType>;
38
+ /**
39
+ * Override the default per-type icon with any ngwr icon name.
40
+ *
41
+ * @default null
42
+ */
43
+ readonly iconName: _angular_core.InputSignal<string | null>;
34
44
  /**
35
45
  * Optional secondary message rendered below the title.
36
46
  *
@@ -38,8 +48,8 @@ declare class WrAlert {
38
48
  */
39
49
  readonly message: _angular_core.InputSignal<string | null>;
40
50
  /**
41
- * When `true`, renders a leading status icon matching the `type`
42
- * (info / success / warning / danger). Pass `false` to hide.
51
+ * When `true`, renders a leading status icon matching the `type`.
52
+ * Pass `false` to hide. Ignored when `iconName` is set.
43
53
  *
44
54
  * @default true
45
55
  */
@@ -61,7 +71,7 @@ declare class WrAlert {
61
71
  protected readonly liveLevel: _angular_core.Signal<"assertive" | "polite" | null>;
62
72
  protected onClose(): void;
63
73
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrAlert, never>;
64
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrAlert, "wr-alert", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "closeable": { "alias": "closeable"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, never, true, never>;
74
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrAlert, "wr-alert", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "iconName": { "alias": "iconName"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "closeable": { "alias": "closeable"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, never, true, never>;
65
75
  }
66
76
 
67
77
  export { WrAlert };
@@ -43,6 +43,7 @@ interface WrCascaderOption<T = string> {
43
43
  *
44
44
  * @see https://ngwr.dev/components/cascader
45
45
  */
46
+ type WrCascaderSize = 'sm' | 'md' | 'lg';
46
47
  declare class WrCascader<T = string> implements ControlValueAccessor {
47
48
  /** Root-level options. Each may have `children` for deeper levels. */
48
49
  readonly options: _angular_core.InputSignal<readonly WrCascaderOption<T>[]>;
@@ -50,6 +51,8 @@ declare class WrCascader<T = string> implements ControlValueAccessor {
50
51
  readonly placeholder: _angular_core.InputSignal<string>;
51
52
  /** Disable the cascader. */
52
53
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, any>;
54
+ /** Control size — shares the `--wr-control-*` contract. @default 'md' */
55
+ readonly size: _angular_core.InputSignal<WrCascaderSize>;
53
56
  /** Show a clear-all (×) button on the trigger when a path is selected. @default true */
54
57
  readonly clearable: _angular_core.InputSignalWithTransform<boolean, any>;
55
58
  /**
@@ -100,8 +103,8 @@ declare class WrCascader<T = string> implements ControlValueAccessor {
100
103
  private openOverlay;
101
104
  private closeOverlay;
102
105
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrCascader<any>, never>;
103
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrCascader<any>, "wr-cascader", never, { "options": { "alias": "options"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "changeOnSelect": { "alias": "changeOnSelect"; "required": false; "isSignal": true; }; "separator": { "alias": "separator"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
106
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrCascader<any>, "wr-cascader", never, { "options": { "alias": "options"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "changeOnSelect": { "alias": "changeOnSelect"; "required": false; "isSignal": true; }; "separator": { "alias": "separator"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
104
107
  }
105
108
 
106
109
  export { WrCascader };
107
- export type { WrCascaderOption };
110
+ export type { WrCascaderOption, WrCascaderSize };
@@ -25,6 +25,7 @@ import { ControlValueAccessor } from '@angular/forms';
25
25
  *
26
26
  * @see https://ngwr.dev/components/checkbox
27
27
  */
28
+ type WrCheckboxSize = 'sm' | 'md' | 'lg';
28
29
  declare class WrCheckbox implements ControlValueAccessor {
29
30
  /**
30
31
  * Stable id used to associate the native input with its label.
@@ -43,6 +44,8 @@ declare class WrCheckbox implements ControlValueAccessor {
43
44
  * @default false
44
45
  */
45
46
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, any>;
47
+ /** Control size — shares the `--wr-control-*` contract. @default 'md' */
48
+ readonly size: _angular_core.InputSignal<WrCheckboxSize>;
46
49
  /**
47
50
  * Optional icon name rendered inside the box when checked, in place of the
48
51
  * default checkmark. Use any registered NGWR icon.
@@ -65,7 +68,7 @@ declare class WrCheckbox implements ControlValueAccessor {
65
68
  protected onInputChange(event: Event): void;
66
69
  protected onInputBlur(): void;
67
70
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrCheckbox, never>;
68
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrCheckbox, "wr-checkbox", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
71
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrCheckbox, "wr-checkbox", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
69
72
  }
70
73
 
71
74
  /**
@@ -136,4 +139,4 @@ declare class WrCheckboxGroup implements ControlValueAccessor, WrCheckboxGroupCo
136
139
  }
137
140
 
138
141
  export { WR_CHECKBOX_GROUP, WrCheckbox, WrCheckboxGroup };
139
- export type { WrCheckboxGroupContext };
142
+ export type { WrCheckboxGroupContext, WrCheckboxSize };
@@ -19,7 +19,12 @@ type WrClickSparkEasing = 'linear' | 'ease-in' | 'ease-in-out' | 'ease-out';
19
19
  * @see https://www.reactbits.dev/animations/click-spark
20
20
  */
21
21
  declare class WrClickSpark {
22
- /** Spark line colour. @default '#fff' */
22
+ /**
23
+ * Spark line colour. Accepts any CSS colour, or a `var(--wr-…)` token which is
24
+ * resolved against the host so it tracks the theme. The default flips with the
25
+ * theme — dark sparks in light mode, light sparks in dark.
26
+ * @default 'var(--wr-color-dark)'
27
+ */
23
28
  readonly sparkColor: _angular_core.InputSignal<string>;
24
29
  /** Length of each spark line in pixels (at t=0; tapers to 0 at t=1). @default 10 */
25
30
  readonly sparkSize: _angular_core.InputSignalWithTransform<number, unknown>;
@@ -41,6 +46,13 @@ declare class WrClickSpark {
41
46
  private sparks;
42
47
  constructor();
43
48
  protected onClick(event: MouseEvent): void;
49
+ /**
50
+ * Canvas `strokeStyle` can't read CSS custom properties, so a `var(--wr-…)`
51
+ * token is resolved against the host's computed style here. Plain colours
52
+ * pass through untouched. Falls back to a dark literal if the custom
53
+ * property resolves to nothing.
54
+ */
55
+ private resolveColor;
44
56
  private syncCanvasSize;
45
57
  private watchResize;
46
58
  private startLoop;
@@ -41,7 +41,18 @@ declare class WrClipboard {
41
41
  * when the user denied the permission prompt.
42
42
  */
43
43
  read(): Promise<string | null>;
44
- /** Probe the Permissions API for `clipboard-read` / `clipboard-write`. */
44
+ /**
45
+ * Report whether clipboard read / write is available and, when the
46
+ * browser exposes it, what the user has granted.
47
+ *
48
+ * The answer is grounded in the actual Clipboard API capability
49
+ * (`writeText` / `readText`), then refined by the Permissions API when
50
+ * it can speak for the requested name. `clipboard-read` / `clipboard-write`
51
+ * are not recognised everywhere — Firefox and Safari throw on the query —
52
+ * so a missing or throwing Permissions API is treated as "supported,
53
+ * will resolve at use time" (`'prompt'`), not `'unsupported'`. We only
54
+ * return `'unsupported'` when the capability genuinely isn't there.
55
+ */
45
56
  permission(name: 'read' | 'write'): Promise<WrClipboardPermission>;
46
57
  /** Hidden-textarea + `execCommand('copy')` write. Synchronous, no permissions. */
47
58
  private legacyWrite;