@12-apps/ui 6.98.0 → 6.99.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 (210) hide show
  1. package/dist/_internal/components/data-display/Alert/Alert.content.js +4 -2
  2. package/dist/_internal/components/data-display/Alert/Alert.ink.js +27 -0
  3. package/dist/_internal/components/data-display/Alert/Alert.js +6 -5
  4. package/dist/_internal/components/data-display/Alert/Alert.metrics.js +5 -1
  5. package/dist/_internal/components/data-display/Alert/Alert.styles.js +2 -2
  6. package/dist/_internal/components/data-display/Banner/Banner.js +3 -3
  7. package/dist/_internal/components/data-display/Banner/Banner.styles.js +2 -2
  8. package/dist/_internal/components/data-display/CardKit/card-actions-context.js +8 -7
  9. package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +9 -8
  10. package/dist/_internal/components/data-display/Carousel/Carousel.js +2 -2
  11. package/dist/_internal/components/data-display/Chart/SpecChart.js +3 -3
  12. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +1 -1
  13. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +17 -17
  14. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +26 -25
  15. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +1 -1
  16. package/dist/_internal/components/data-display/DataViews/base-list-card-layout.js +1 -1
  17. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +1 -1
  18. package/dist/_internal/components/data-display/DataViews/base-list-card.js +4 -4
  19. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +2 -2
  20. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +14 -14
  21. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +6 -6
  22. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +2 -2
  23. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +3 -3
  24. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +8 -7
  25. package/dist/_internal/components/data-display/DataViews/list-card-rails.js +1 -1
  26. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +2 -2
  27. package/dist/_internal/components/data-display/DayRuler/DayRuler.footer.js +2 -2
  28. package/dist/_internal/components/data-display/DayRuler/DayRuler.js +7 -7
  29. package/dist/_internal/components/data-display/DayRuler/DayRuler.keyboard.js +2 -2
  30. package/dist/_internal/components/data-display/DayRuler/DayRuler.parts.js +3 -3
  31. package/dist/_internal/components/data-display/DayRuler/useRulerDrag.js +2 -2
  32. package/dist/_internal/components/data-display/FleetMap/FleetBody.js +6 -6
  33. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +5 -5
  34. package/dist/_internal/components/data-display/FleetMap/FleetMap.js +7 -7
  35. package/dist/_internal/components/data-display/HoverCard/HoverCard.js +2 -2
  36. package/dist/_internal/components/data-display/Lightbox/Lightbox.js +3 -3
  37. package/dist/_internal/components/data-display/MapPreview/MapLayers.js +2 -2
  38. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +4 -4
  39. package/dist/_internal/components/data-display/Progress/Progress.js +2 -2
  40. package/dist/_internal/components/data-display/RegionMap/RegionMap.fixtures.js +1 -1
  41. package/dist/_internal/components/data-display/RegionMap/RegionMap.helpers.js +3 -1
  42. package/dist/_internal/components/data-display/RegionMap/RegionMap.hooks.js +3 -3
  43. package/dist/_internal/components/data-display/RegionMap/RegionMap.js +6 -5
  44. package/dist/_internal/components/data-display/RegionMap/RegionMap.view.js +2 -2
  45. package/dist/_internal/components/data-display/RegionMap/RegionMapDrawing.js +3 -2
  46. package/dist/_internal/components/data-display/RegionMap/RegionMapPin.js +26 -0
  47. package/dist/_internal/components/data-display/index.js +60 -50
  48. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js +7 -6
  49. package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.frame.js +4 -4
  50. package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.header.js +3 -3
  51. package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.js +14 -13
  52. package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.overview.js +9 -8
  53. package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.parts.js +8 -7
  54. package/dist/_internal/components/feedback/index.js +15 -14
  55. package/dist/_internal/components/index.js +66 -56
  56. package/dist/charts.js +11 -11
  57. package/dist/{chunk-WYNGH2WL.js → chunk-255WTBZ5.js} +8 -8
  58. package/dist/{chunk-QIP37Y2C.js → chunk-2RC6EAGD.js} +2 -2
  59. package/dist/{chunk-ZKVSFVIA.js → chunk-37MJZLQU.js} +2 -2
  60. package/dist/{chunk-BQBEN44R.js → chunk-3I7KE2N6.js} +2 -2
  61. package/dist/{chunk-L4FWEI2P.js → chunk-3V3Z4EML.js} +5 -5
  62. package/dist/{chunk-E4MJA52O.js → chunk-3V5V44UP.js} +16 -18
  63. package/dist/chunk-3V5V44UP.js.map +1 -0
  64. package/dist/{chunk-6RYSSNOO.js → chunk-54DOLCJ3.js} +2 -2
  65. package/dist/{chunk-74IH3ZGD.js → chunk-643YFWNK.js} +2 -2
  66. package/dist/{chunk-FRQGZIYU.js → chunk-6WAP7BJS.js} +2 -2
  67. package/dist/chunk-AG4F6NVT.js +1 -0
  68. package/dist/chunk-AG4F6NVT.js.map +1 -0
  69. package/dist/{chunk-3CXRHRGE.js → chunk-AYDVNXGR.js} +7 -3
  70. package/dist/chunk-AYDVNXGR.js.map +1 -0
  71. package/dist/{chunk-JO6D7YGN.js → chunk-CWRQGA2T.js} +2 -2
  72. package/dist/chunk-DRYBA76G.js +293 -0
  73. package/dist/chunk-DRYBA76G.js.map +1 -0
  74. package/dist/{chunk-ZW7Q3IRL.js → chunk-FYJL432J.js} +4 -4
  75. package/dist/{chunk-G6TKWNF2.js → chunk-GZITNT7O.js} +11 -11
  76. package/dist/{chunk-RFMQBIE6.js → chunk-HBHBRRSW.js} +4 -4
  77. package/dist/{chunk-U4Z6GZDW.js → chunk-HN36UVOE.js} +4 -4
  78. package/dist/{chunk-WK577LQL.js → chunk-J2IQ6FJ5.js} +4 -4
  79. package/dist/{chunk-HCTHY66U.js → chunk-KAGXV3ID.js} +4 -4
  80. package/dist/{chunk-FWAY2SAI.js → chunk-KAZWBDIH.js} +2 -2
  81. package/dist/{chunk-DKPELKGL.js → chunk-KV7LTOWC.js} +5 -5
  82. package/dist/{chunk-UC7DLGMP.js → chunk-KVP5A3YK.js} +2 -2
  83. package/dist/chunk-LNZJJFZQ.js +41 -0
  84. package/dist/chunk-LNZJJFZQ.js.map +1 -0
  85. package/dist/{chunk-EGBQR5GH.js → chunk-LOLYBFYY.js} +5 -5
  86. package/dist/{chunk-SOXO2VN3.js → chunk-MEMVZW64.js} +3 -3
  87. package/dist/{chunk-COOSJKZL.js → chunk-MNJZPJ5S.js} +2 -1
  88. package/dist/chunk-MNJZPJ5S.js.map +1 -0
  89. package/dist/{chunk-G2NVBCF7.js → chunk-NWUMGE6T.js} +3 -3
  90. package/dist/{chunk-NQCTANF3.js → chunk-Q5SCBQLY.js} +18 -11
  91. package/dist/chunk-Q5SCBQLY.js.map +1 -0
  92. package/dist/{chunk-64LNNC54.js → chunk-QLKUWDMQ.js} +4 -4
  93. package/dist/{chunk-MPVH2GM5.js → chunk-RAQD5QCM.js} +4 -4
  94. package/dist/{chunk-KXDLLS62.js → chunk-REHGWN5M.js} +4 -4
  95. package/dist/{chunk-Z4ZFJ565.js → chunk-SRAIV6U6.js} +3 -3
  96. package/dist/{chunk-5ZY3IIIG.js → chunk-TBQR5VCN.js} +11 -1
  97. package/dist/chunk-TBQR5VCN.js.map +1 -0
  98. package/dist/{chunk-3N2HWNKT.js → chunk-UIJLDAV7.js} +2 -2
  99. package/dist/{chunk-7HZ36QDH.js → chunk-UN5WU2OX.js} +9 -3
  100. package/dist/chunk-UN5WU2OX.js.map +1 -0
  101. package/dist/{chunk-A27J4CIZ.js → chunk-UTIYB6VE.js} +11 -11
  102. package/dist/{chunk-5V7IZBRY.js → chunk-VRSW7PIO.js} +5 -5
  103. package/dist/{chunk-U4PV2ZKK.js → chunk-WDEVKND3.js} +3 -3
  104. package/dist/chunk-WGKLBVDZ.js +1 -0
  105. package/dist/chunk-WGKLBVDZ.js.map +1 -0
  106. package/dist/{chunk-AP7GEUJS.js → chunk-XFOKLWJZ.js} +2 -2
  107. package/dist/{chunk-6D5AMANO.js → chunk-XQAFSC66.js} +2 -2
  108. package/dist/{chunk-YNZUYZ2O.js → chunk-XR474YYX.js} +2 -2
  109. package/dist/{chunk-L5RS6QAT.js → chunk-YBF2WUGQ.js} +2 -2
  110. package/dist/{chunk-RCTHCXS6.js → chunk-YQ5GQ32T.js} +2 -2
  111. package/dist/{chunk-YLZXIR6B.js → chunk-Z5V5E3JW.js} +4 -4
  112. package/dist/data-display/Alert.js +10 -6
  113. package/dist/data-display/Banner.js +3 -3
  114. package/dist/data-display/CardKit.js +9 -8
  115. package/dist/data-display/Carousel.js +2 -2
  116. package/dist/data-display/Chart.js +11 -11
  117. package/dist/data-display/DataGrid.js +1 -1
  118. package/dist/data-display/DataViews.js +33 -32
  119. package/dist/data-display/DayRuler.js +7 -7
  120. package/dist/data-display/FleetMap.js +7 -7
  121. package/dist/data-display/HoverCard.js +2 -2
  122. package/dist/data-display/Lightbox.js +3 -3
  123. package/dist/data-display/MapPreview.js +4 -4
  124. package/dist/data-display/Progress.js +2 -2
  125. package/dist/data-display/RegionMap.js +14 -8
  126. package/dist/feedback/NotificationStatusNotice.js +7 -6
  127. package/dist/feedback/SequenceResolver.js +14 -13
  128. package/dist/native/data-display/Alert.js +10 -0
  129. package/dist/native/data-display/Alert.js.map +1 -1
  130. package/dist/types/components/data-display/Alert/Alert.content.d.ts.map +1 -1
  131. package/dist/types/components/data-display/Alert/Alert.d.ts.map +1 -1
  132. package/dist/types/components/data-display/Alert/Alert.ink.d.ts +65 -0
  133. package/dist/types/components/data-display/Alert/Alert.ink.d.ts.map +1 -0
  134. package/dist/types/components/data-display/Alert/Alert.metrics.d.ts +73 -5
  135. package/dist/types/components/data-display/Alert/Alert.metrics.d.ts.map +1 -1
  136. package/dist/types/components/data-display/Alert/index.d.ts +1 -0
  137. package/dist/types/components/data-display/Alert/index.d.ts.map +1 -1
  138. package/dist/types/components/data-display/RegionMap/RegionMap.d.ts +1 -1
  139. package/dist/types/components/data-display/RegionMap/RegionMap.d.ts.map +1 -1
  140. package/dist/types/components/data-display/RegionMap/RegionMap.helpers.d.ts +9 -0
  141. package/dist/types/components/data-display/RegionMap/RegionMap.helpers.d.ts.map +1 -1
  142. package/dist/types/components/data-display/RegionMap/RegionMap.types.d.ts +45 -1
  143. package/dist/types/components/data-display/RegionMap/RegionMap.types.d.ts.map +1 -1
  144. package/dist/types/components/data-display/RegionMap/RegionMapDrawing.d.ts +4 -1
  145. package/dist/types/components/data-display/RegionMap/RegionMapDrawing.d.ts.map +1 -1
  146. package/dist/types/components/data-display/RegionMap/RegionMapPin.d.ts +102 -0
  147. package/dist/types/components/data-display/RegionMap/RegionMapPin.d.ts.map +1 -0
  148. package/dist/types/components/data-display/RegionMap/index.d.ts +2 -1
  149. package/dist/types/components/data-display/RegionMap/index.d.ts.map +1 -1
  150. package/dist/types-native/components/data-display/Alert/Alert.metrics.d.ts +73 -5
  151. package/dist/types-native/components/data-display/Alert/Alert.metrics.d.ts.map +1 -1
  152. package/package.json +1 -1
  153. package/src/components/data-display/Alert/Alert.content.tsx +16 -1
  154. package/src/components/data-display/Alert/Alert.ink.ts +106 -0
  155. package/src/components/data-display/Alert/Alert.md +40 -0
  156. package/src/components/data-display/Alert/Alert.metrics.ts +57 -5
  157. package/src/components/data-display/Alert/Alert.tsx +18 -7
  158. package/src/components/data-display/Alert/index.ts +1 -0
  159. package/src/components/data-display/RegionMap/RegionMap.helpers.ts +1 -1
  160. package/src/components/data-display/RegionMap/RegionMap.md +19 -2
  161. package/src/components/data-display/RegionMap/RegionMap.tsx +4 -0
  162. package/src/components/data-display/RegionMap/RegionMap.types.ts +49 -1
  163. package/src/components/data-display/RegionMap/RegionMapDrawing.tsx +11 -13
  164. package/src/components/data-display/RegionMap/RegionMapPin.tsx +388 -0
  165. package/src/components/data-display/RegionMap/index.ts +5 -0
  166. package/dist/chunk-3CXRHRGE.js.map +0 -1
  167. package/dist/chunk-5ZY3IIIG.js.map +0 -1
  168. package/dist/chunk-7HZ36QDH.js.map +0 -1
  169. package/dist/chunk-COOSJKZL.js.map +0 -1
  170. package/dist/chunk-DY2I6LMX.js +0 -1
  171. package/dist/chunk-E4MJA52O.js.map +0 -1
  172. package/dist/chunk-NQCTANF3.js.map +0 -1
  173. package/dist/chunk-NUGT7LMR.js +0 -1
  174. /package/dist/{chunk-DY2I6LMX.js.map → _internal/components/data-display/Alert/Alert.ink.js.map} +0 -0
  175. /package/dist/{chunk-NUGT7LMR.js.map → _internal/components/data-display/RegionMap/RegionMapPin.js.map} +0 -0
  176. /package/dist/{chunk-WYNGH2WL.js.map → chunk-255WTBZ5.js.map} +0 -0
  177. /package/dist/{chunk-QIP37Y2C.js.map → chunk-2RC6EAGD.js.map} +0 -0
  178. /package/dist/{chunk-ZKVSFVIA.js.map → chunk-37MJZLQU.js.map} +0 -0
  179. /package/dist/{chunk-BQBEN44R.js.map → chunk-3I7KE2N6.js.map} +0 -0
  180. /package/dist/{chunk-L4FWEI2P.js.map → chunk-3V3Z4EML.js.map} +0 -0
  181. /package/dist/{chunk-6RYSSNOO.js.map → chunk-54DOLCJ3.js.map} +0 -0
  182. /package/dist/{chunk-74IH3ZGD.js.map → chunk-643YFWNK.js.map} +0 -0
  183. /package/dist/{chunk-FRQGZIYU.js.map → chunk-6WAP7BJS.js.map} +0 -0
  184. /package/dist/{chunk-JO6D7YGN.js.map → chunk-CWRQGA2T.js.map} +0 -0
  185. /package/dist/{chunk-ZW7Q3IRL.js.map → chunk-FYJL432J.js.map} +0 -0
  186. /package/dist/{chunk-G6TKWNF2.js.map → chunk-GZITNT7O.js.map} +0 -0
  187. /package/dist/{chunk-RFMQBIE6.js.map → chunk-HBHBRRSW.js.map} +0 -0
  188. /package/dist/{chunk-U4Z6GZDW.js.map → chunk-HN36UVOE.js.map} +0 -0
  189. /package/dist/{chunk-WK577LQL.js.map → chunk-J2IQ6FJ5.js.map} +0 -0
  190. /package/dist/{chunk-HCTHY66U.js.map → chunk-KAGXV3ID.js.map} +0 -0
  191. /package/dist/{chunk-FWAY2SAI.js.map → chunk-KAZWBDIH.js.map} +0 -0
  192. /package/dist/{chunk-DKPELKGL.js.map → chunk-KV7LTOWC.js.map} +0 -0
  193. /package/dist/{chunk-UC7DLGMP.js.map → chunk-KVP5A3YK.js.map} +0 -0
  194. /package/dist/{chunk-EGBQR5GH.js.map → chunk-LOLYBFYY.js.map} +0 -0
  195. /package/dist/{chunk-SOXO2VN3.js.map → chunk-MEMVZW64.js.map} +0 -0
  196. /package/dist/{chunk-G2NVBCF7.js.map → chunk-NWUMGE6T.js.map} +0 -0
  197. /package/dist/{chunk-64LNNC54.js.map → chunk-QLKUWDMQ.js.map} +0 -0
  198. /package/dist/{chunk-MPVH2GM5.js.map → chunk-RAQD5QCM.js.map} +0 -0
  199. /package/dist/{chunk-KXDLLS62.js.map → chunk-REHGWN5M.js.map} +0 -0
  200. /package/dist/{chunk-Z4ZFJ565.js.map → chunk-SRAIV6U6.js.map} +0 -0
  201. /package/dist/{chunk-3N2HWNKT.js.map → chunk-UIJLDAV7.js.map} +0 -0
  202. /package/dist/{chunk-A27J4CIZ.js.map → chunk-UTIYB6VE.js.map} +0 -0
  203. /package/dist/{chunk-5V7IZBRY.js.map → chunk-VRSW7PIO.js.map} +0 -0
  204. /package/dist/{chunk-U4PV2ZKK.js.map → chunk-WDEVKND3.js.map} +0 -0
  205. /package/dist/{chunk-AP7GEUJS.js.map → chunk-XFOKLWJZ.js.map} +0 -0
  206. /package/dist/{chunk-6D5AMANO.js.map → chunk-XQAFSC66.js.map} +0 -0
  207. /package/dist/{chunk-YNZUYZ2O.js.map → chunk-XR474YYX.js.map} +0 -0
  208. /package/dist/{chunk-L5RS6QAT.js.map → chunk-YBF2WUGQ.js.map} +0 -0
  209. /package/dist/{chunk-RCTHCXS6.js.map → chunk-YQ5GQ32T.js.map} +0 -0
  210. /package/dist/{chunk-YLZXIR6B.js.map → chunk-Z5V5E3JW.js.map} +0 -0
@@ -0,0 +1,102 @@
1
+ import { type Theme } from '@mui/material/styles/index.js';
2
+ import React from 'react';
3
+ import { type PlaneBox, type PlanePoint, type Projection } from './RegionMap.helpers';
4
+ import type { RegionMapModel } from './RegionMap.hooks';
5
+ import type { RegionMapCenter, RegionMapCopy, RegionMapDot, RegionMapGhost, RegionMapPin } from './RegionMap.types';
6
+ /**
7
+ * The movable centre of a `RegionMap` (`pin`, `ghost`, `dots`): a pin the
8
+ * viewer drags with a mouse or one finger, or focuses and nudges with the
9
+ * arrow keys, while the VIEW stays where `center` put it — so the areas never
10
+ * slide under a dragging finger. The circles follow the pin; a dashed ring
11
+ * and dot stay at `ghost`; `dots` are small points (filled or hollow).
12
+ *
13
+ * The pin is HTML over the drawing, at its point by percent like the labels,
14
+ * carrying `data-region-pin` so a host that zooms the drawing's layers can
15
+ * move it with them. Its moves are reported, never applied: the host passes
16
+ * the new point back.
17
+ */
18
+ /** The movable centre and what is drawn with it, as the drawing receives it. */
19
+ export interface Moving {
20
+ center: RegionMapCenter;
21
+ pin?: RegionMapPin;
22
+ ghost?: RegionMapGhost;
23
+ dots?: readonly RegionMapDot[];
24
+ copy: RegionMapCopy;
25
+ }
26
+ type DrawnModel = Pick<RegionMapModel, 'projection' | 'radii'> & {
27
+ view: PlaneBox;
28
+ };
29
+ /**
30
+ * What the movable centre draws inside the SVG: the circles around the pin
31
+ * (else `fallback`, the centre's own circles), the ghost, and the dots.
32
+ */
33
+ export declare function PinShapes({ model, moving, testId, theme, fallback }: {
34
+ model: DrawnModel;
35
+ moving: Moving | undefined;
36
+ testId: string;
37
+ theme: Theme;
38
+ fallback: React.ReactNode;
39
+ }): React.JSX.Element;
40
+ /** What the movable centre draws over the SVG, in HTML: the pin and the scale bar. */
41
+ export declare function PinOverlay({ model, moving, svgRef, testId, theme, }: {
42
+ model: DrawnModel;
43
+ moving: Moving | undefined;
44
+ svgRef: React.RefObject<SVGSVGElement | null>;
45
+ testId: string;
46
+ theme: Theme;
47
+ }): React.JSX.Element | null;
48
+ /** The flat projection's inverse around `center` — it is linear. */
49
+ export declare function latLngAt(center: RegionMapCenter, point: PlanePoint): RegionMapCenter;
50
+ interface PinLayerProps {
51
+ pin: RegionMapPin;
52
+ center: RegionMapCenter;
53
+ projection: Projection;
54
+ view: PlaneBox;
55
+ /** The drawing's SVG, whose on-screen box maps a pointer to the plane (zoomed or not). */
56
+ svgRef: React.RefObject<SVGSVGElement | null>;
57
+ testId: string;
58
+ theme: Theme;
59
+ }
60
+ /** The draggable pin, as HTML over the drawing. */
61
+ export declare function PinMarker({ pin, center, projection, view, svgRef, testId, theme }: PinLayerProps): React.JSX.Element;
62
+ /** The circles around the pin: solid in the primary colour, faintly filled. */
63
+ export declare function PinCircles({ at, radii, theme }: {
64
+ at: PlanePoint;
65
+ radii: readonly number[];
66
+ theme: Theme;
67
+ }): React.JSX.Element;
68
+ /** Where the circles stood: a dashed ring and dot at `ghost`, and a dashed line from it to the pin. */
69
+ export declare function GhostShapes({ ghost, pinAt, projection, view, testId, theme, }: {
70
+ ghost: RegionMapGhost;
71
+ pinAt: PlanePoint;
72
+ projection: Projection;
73
+ view: PlaneBox;
74
+ testId: string;
75
+ theme: Theme;
76
+ }): React.JSX.Element;
77
+ /** The dots: filled with the ink, or hollow (paper with an ink ring). */
78
+ export declare function Dots({ dots, projection, view, testId, theme }: {
79
+ dots: readonly RegionMapDot[];
80
+ projection: Projection;
81
+ view: PlaneBox;
82
+ testId: string;
83
+ theme: Theme;
84
+ }): React.JSX.Element;
85
+ /** The longest nice length that fits in a quarter of the drawing's width. */
86
+ export declare function scaleMetres(view: PlaneBox): number;
87
+ /**
88
+ * A scale bar, bottom-left, when the host gives `copy.scale`. It reads what is
89
+ * on screen: a host that zooms the drawing's layers (a CSS scale on the SVG)
90
+ * shows fewer metres per pixel, so after every render the bar compares the
91
+ * SVG's drawn width with its laid-out width — both off the SVG itself — and
92
+ * spans the drawing's own width, so its share of it is a share of the view.
93
+ */
94
+ export declare function ScaleBar({ view, copy, svgRef, testId, theme, }: {
95
+ view: PlaneBox;
96
+ copy: RegionMapCopy;
97
+ svgRef: React.RefObject<SVGSVGElement | null>;
98
+ testId: string;
99
+ theme: Theme;
100
+ }): React.JSX.Element | null;
101
+ export {};
102
+ //# sourceMappingURL=RegionMapPin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RegionMapPin.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/RegionMap/RegionMapPin.tsx"],"names":[],"mappings":"AACA,OAAO,EAAS,KAAK,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAqB,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACzG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEpH;;;;;;;;;;;GAWG;AAEH,gFAAgF;AAChF,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,eAAe,CAAC;IACxB,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,IAAI,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAC/B,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,KAAK,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEpF;;;GAGG;AACH,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAWnM;AAED,sFAAsF;AACtF,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,MAAM,EACN,MAAM,EACN,MAAM,EACN,KAAK,GACN,EAAE;IACD,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;CACd,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAQ3B;AAED,oEAAoE;AACpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,GAAG,eAAe,CAGpF;AAsBD,UAAU,aAAa;IACrB,GAAG,EAAE,YAAY,CAAC;IAClB,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,0FAA0F;IAC1F,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;CACd;AAED,mDAAmD;AACnD,wBAAgB,SAAS,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA0EpH;AAoED,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IAAE,EAAE,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAkB9H;AAED,uGAAuG;AACvG,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,KAAK,EACL,UAAU,EACV,IAAI,EACJ,MAAM,EACN,KAAK,GACN,EAAE;IACD,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;CACd,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAWpB;AAED,yEAAyE;AACzE,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;IAAE,IAAI,EAAE,SAAS,YAAY,EAAE,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAsB1L;AAKD,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAGlD;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,MAAM,EACN,KAAK,GACN,EAAE;IACD,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;CACd,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CA+B3B"}
@@ -1,6 +1,7 @@
1
1
  export { RegionMap } from './RegionMap';
2
2
  export { decodePolyline, hitRegion, projectionAt } from './RegionMap.helpers';
3
+ export { latLngAt, scaleMetres } from './RegionMapPin';
3
4
  export { boundsOfRings, regionMapView } from './RegionMap.view';
4
5
  export type { AreaGeometry, PlaneBox, PlanePoint, PlaneRegion, Projection } from './RegionMap.helpers';
5
- export type { RegionMapBounds, RegionMapCircle, RegionMapCopy, RegionMapLayer, RegionMapListMode, RegionMapListSort, RegionMapPoint, RegionMapProps, RegionMapReach, RegionMapRegion, RegionMapRing, } from './RegionMap.types';
6
+ export type { RegionMapBounds, RegionMapCircle, RegionMapCenter, RegionMapCopy, RegionMapDot, RegionMapGhost, RegionMapLayer, RegionMapListMode, RegionMapListSort, RegionMapPin, RegionMapPoint, RegionMapProps, RegionMapReach, RegionMapRegion, RegionMapRing, } from './RegionMap.types';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/RegionMap/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACvG,YAAY,EACV,eAAe,EACf,eAAe,EACf,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,cAAc,EACd,eAAe,EACf,aAAa,GACd,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/RegionMap/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACvG,YAAY,EACV,eAAe,EACf,eAAe,EACf,eAAe,EACf,aAAa,EACb,YAAY,EACZ,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,cAAc,EACd,eAAe,EACf,aAAa,GACd,MAAM,mBAAmB,CAAC"}
@@ -144,9 +144,12 @@ export declare const PULSE: {
144
144
  * dark one. A `filter: brightness()` fixed the direction but is MULTIPLICATIVE,
145
145
  * so it moved a near-black `glass` by four counts (ΔE76 1.71, under the JND)
146
146
  * and Banner's 10%-alpha wash by ΔE76 0.44. A layer is additive: it reads the
147
- * same on an opaque tint, a translucent wash and a gradient, and because it
148
- * paints above the background and below the content the ink keeps its own
149
- * contrast.
147
+ * same on an opaque tint, a translucent wash and a gradient.
148
+ *
149
+ * Painting above the background and below the content keeps the layer off the
150
+ * INK, but not off the ink's CONTRAST: the layer moves the surface toward the
151
+ * mode's absolute, which is the side the ink is on, so the two close in. That
152
+ * is what {@link POINTER_INK_STEP} answers (FUT-4506).
150
153
  */
151
154
  export declare const HOVER: {
152
155
  readonly tintAlpha: 0.06;
@@ -168,8 +171,11 @@ export declare const HOVER: {
168
171
  *
169
172
  * An inset shadow at 100vmax is a flat tint over the whole surface: ADDITIVE,
170
173
  * so it reads the same on an opaque tint, a translucent wash and a gradient;
171
- * painted above the background and below the content, so the ink keeps its
172
- * own contrast; and animatable, which `background-image` is not.
174
+ * painted above the background and below the content, so it never dims the
175
+ * ink itself; and animatable, which `background-image` is not. It DOES dim the
176
+ * ink's contrast, because it darkens a light surface toward a dark ink (and
177
+ * lightens a dark one toward a light ink) — on Alert, {@link POINTER_INK_STEP}
178
+ * is the other half of the press.
173
179
  *
174
180
  * `ms` is 250 and not the 1000 first asked for, and the reason is that ONE
175
181
  * property carries both states. CSS runs a transition from the DESTINATION
@@ -186,6 +192,68 @@ export declare const ACTIVE: {
186
192
  readonly tintAlpha: 0.2;
187
193
  readonly ms: 250;
188
194
  };
195
+ /**
196
+ * How far the MESSAGE ink — title, description and children — steps toward the
197
+ * absolute on its own side while the alert is hovered or pressed (FUT-4506,
198
+ * option C).
199
+ *
200
+ * The tint layer above moves the surface toward the mode's absolute — black in
201
+ * light mode, white in dark — which is the side the ink sits on, so every
202
+ * pointer state CLOSED the gap the ink is read across. Measured on a host pane
203
+ * whose summary sat at 4.71:1 idle: 4.22 hovered, 3.17 pressed in light mode,
204
+ * and down to 2.68 pressed in dark. The title, at 16.8px/600, is not WCAG
205
+ * "large" text, so it is held to 4.5:1 as well.
206
+ *
207
+ * The answer keeps the layer (the pointer still gets its feedback) and moves
208
+ * the ink FURTHER the same way, so the gap re-opens. The amounts are the
209
+ * prototype's measured steps on that host pane, the worst case in reach: they
210
+ * hold the 0.9 summary at 4.75–6.07:1 there, and at 6.38:1 or more on this
211
+ * package's default palette in both modes. White needs the bigger step because
212
+ * a light ink has less room above it than a dark ink has below it, and dark
213
+ * mode's pressed step needs at least 0.55.
214
+ *
215
+ * Keyed by the absolute the ink moves TOWARD, which is the mode's: black in
216
+ * light mode, white in dark. The web applies the step as `color-mix()` over
217
+ * `currentColor`, so its AMOUNT lands on whatever ink is actually painted — a
218
+ * host's repaint of a semantic or `glass` alert included. Its DIRECTION is the
219
+ * mode's, which is only safe where the surface tracks the mode, so `gradient`
220
+ * is not stepped at all (`inkAbsolute` in `Alert.ink.ts`): a host that
221
+ * repaints it to a light pane and a dark ink would otherwise have its ink
222
+ * stepped toward white under a black layer. DOM only; native has no pointer
223
+ * states. `Banner` paints the same tint and does not step yet.
224
+ */
225
+ export declare const POINTER_INK_STEP: {
226
+ readonly hover: {
227
+ readonly black: 0.15;
228
+ readonly white: 0.2;
229
+ };
230
+ readonly press: {
231
+ readonly black: 0.35;
232
+ readonly white: 0.6;
233
+ };
234
+ };
235
+ /**
236
+ * Both pointer states as a host reads them: the tint layer's alpha and the ink
237
+ * step, per absolute. Exported (as `ALERT_POINTER_STATES`) so a theme that
238
+ * repaints the alert's pane and ink can assert its own tones still clear 4.5:1
239
+ * hovered and pressed, against the numbers the package actually draws with.
240
+ */
241
+ export declare const POINTER_STATES: {
242
+ readonly hover: {
243
+ readonly tintAlpha: 0.06;
244
+ readonly inkStep: {
245
+ readonly black: 0.15;
246
+ readonly white: 0.2;
247
+ };
248
+ };
249
+ readonly press: {
250
+ readonly tintAlpha: 0.2;
251
+ readonly inkStep: {
252
+ readonly black: 0.35;
253
+ readonly white: 0.6;
254
+ };
255
+ };
256
+ };
189
257
  export declare const FOCUS: {
190
258
  readonly ringWidth: 2;
191
259
  readonly ringAlpha: 1;
@@ -1 +1 @@
1
- {"version":3,"file":"Alert.metrics.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/Alert/Alert.metrics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Alert.metrics.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/Alert/Alert.metrics.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@12-apps/ui",
3
- "version": "6.98.0",
3
+ "version": "6.99.0",
4
4
  "license": "MIT",
5
5
  "packageManager": "pnpm@10.34.5",
6
6
  "type": "module",
@@ -5,6 +5,7 @@ import React from 'react';
5
5
  import { sxRem } from '../../../tokens/relative';
6
6
 
7
7
  import { testIdFor } from './Alert.helpers';
8
+ import { ALERT_CHILDREN_CLASS, ALERT_DESCRIPTION_CLASS } from './Alert.ink';
8
9
  import { DESCRIPTION, ICON_SLOT, TITLE, TITLE_ICON } from './Alert.metrics';
9
10
  import type { AlertProps } from './Alert.types';
10
11
 
@@ -14,6 +15,19 @@ const BREAK_WORDS = {
14
15
  wordBreak: 'break-word',
15
16
  } as const;
16
17
 
18
+ /**
19
+ * The caller's `children`, wrapped so the pointer step (`Alert.ink.ts`) reaches
20
+ * children-only text without reaching the title row's icon. `display: contents`
21
+ * gives the wrapper no box, so the column's flex layout is exactly what it was
22
+ * and a bare text node still inherits the stepped colour.
23
+ */
24
+ const ChildrenInk: React.FC<{ children?: React.ReactNode }> = ({ children }) =>
25
+ children === undefined || children === null || children === false ? null : (
26
+ <Box component="span" className={ALERT_CHILDREN_CLASS} sx={{ display: 'contents' }}>
27
+ {children}
28
+ </Box>
29
+ );
30
+
17
31
  /**
18
32
  * The message column: title, description, then whatever the caller put inside.
19
33
  *
@@ -78,13 +92,14 @@ export const AlertContent: React.FC<{
78
92
  {description && (
79
93
  <Box
80
94
  component="div"
95
+ className={ALERT_DESCRIPTION_CLASS}
81
96
  data-testid={testIdFor(dataTestId, 'message')}
82
97
  sx={{ opacity: DESCRIPTION.opacity, fontSize: sxRem(DESCRIPTION.fontSize), ...BREAK_WORDS }}
83
98
  >
84
99
  {description}
85
100
  </Box>
86
101
  )}
87
- {children}
102
+ <ChildrenInk>{children}</ChildrenInk>
88
103
  </>
89
104
  );
90
105
  };
@@ -0,0 +1,106 @@
1
+ import type { CSSObject, Theme } from '@mui/material/styles/index.js';
2
+
3
+ import { absoluteInk } from '../../../tokens/ink';
4
+
5
+ import { ACTIVE, ALERT_EASING, POINTER_INK_STEP, seconds } from './Alert.metrics';
6
+
7
+ /**
8
+ * THE INK HALF OF THE POINTER STATES (FUT-4506, option C).
9
+ *
10
+ * The hover and press tint (`pointerShadow` in `Alert.tsx`) moves the SURFACE
11
+ * toward an absolute. On every surface that tracks the mode that is the side
12
+ * the ink is on, so the gap the message is read across closed under the
13
+ * pointer — a host summary at 4.71:1 idle fell to 3.17:1 pressed. These rules
14
+ * move the INK further the same way, by {@link POINTER_INK_STEP}, so it
15
+ * re-opens.
16
+ */
17
+
18
+ /** The summary's class, so the pointer states can reach it without a test id. */
19
+ export const ALERT_DESCRIPTION_CLASS = 'alert-description';
20
+ /**
21
+ * The wrapper `AlertContent` puts around `children`, at `display: contents`:
22
+ * no box of its own, so the column's flex layout is what it was, and a bare
23
+ * text node still inherits its colour.
24
+ */
25
+ export const ALERT_CHILDREN_CLASS = 'alert-children';
26
+
27
+ /**
28
+ * What steps: the WORDS of the message — the title, the description and
29
+ * whatever the caller passed as `children` — each one step, none nested in
30
+ * another. Stepping only the title and the description left a children-only
31
+ * alert (about one in six in the first host measured) at its rest ink under
32
+ * the press tint.
33
+ *
34
+ * Not the whole message column, because the column is not only words: with
35
+ * `iconPlacement: 'title'` the icon sits in it, on the title's row, beside
36
+ * `.MuiAlertTitle-root` rather than inside it. The icon is the variant's
37
+ * meaning, not an affordance, so it stays still in both placements; the close
38
+ * button (`.MuiAlert-action`) is outside the column altogether. A control
39
+ * inside `children` keeps its own colour, because it declares one; only a
40
+ * `color="inherit"` one follows the step, on the same tinted surface as the
41
+ * words around it.
42
+ */
43
+ const MESSAGE_INK = `& .MuiAlertTitle-root, & .${ALERT_DESCRIPTION_CLASS}, & .${ALERT_CHILDREN_CLASS}`;
44
+
45
+ export type PointerInkState = keyof typeof POINTER_INK_STEP;
46
+ export type InkAbsolute = 'black' | 'white';
47
+
48
+ /**
49
+ * The absolute the ink steps toward — the mode's, the side the ink is on — or
50
+ * `null` for `gradient`, which does not step at all.
51
+ *
52
+ * Every other variant's surface tracks the mode: a dark ink on a light tint,
53
+ * a light ink on a dark one, so the step is toward black in light mode and
54
+ * toward white in dark, the same absolute the tint layer moves the surface to.
55
+ *
56
+ * `gradient` is the one surface where the package cannot know which side its
57
+ * ink is on. Its own ink is `getContrastText` of the hue, but a host that
58
+ * repaints alerts repaints the gradient too: a light pane and a dark ink under
59
+ * the variant's BLACK layer. Stepping by the package's own ink then moved that
60
+ * dark ink toward white — 1.02:1 pressed. A step that reads `currentColor` for
61
+ * its amount but not for its direction is only safe where the direction is the
62
+ * mode's, so `gradient` keeps today's ink. Its rest contrast and its dark ink
63
+ * on dark mode's light hues are FUT-4516's.
64
+ */
65
+ export function inkAbsolute(theme: Theme, variant: string | undefined): InkAbsolute | null {
66
+ if (variant === 'gradient') return null;
67
+ return theme.palette.mode === 'dark' ? 'white' : 'black';
68
+ }
69
+
70
+ /**
71
+ * The CSS for the ink at one pointer state: the ink actually painted
72
+ * (`currentColor`, inherited from the root — a host's repaint included) mixed
73
+ * toward the absolute by the state's step.
74
+ *
75
+ * `currentColor` in a `color` declaration is the PARENT's colour, which is why
76
+ * this sits on the message's parts and never on the root: on the root it would
77
+ * read the page's text colour instead of the alert's ink. None of the three
78
+ * parts is nested in another, so nothing steps twice.
79
+ */
80
+ export function steppedInkCss(absolute: string, step: number): string {
81
+ return `color-mix(in srgb, currentColor ${Math.round((1 - step) * 100)}%, ${absolute})`;
82
+ }
83
+
84
+ /**
85
+ * The three pieces of the ink's pointer behaviour, spread into the root's
86
+ * blocks by `Alert.tsx`:
87
+ *
88
+ * - `rest` eases the ink on the box-shadow's own clock, so ink and tint arrive
89
+ * together rather than the ink snapping while the surface eases;
90
+ * - `hover` and `press` step it. The press declares `transition: none` for the
91
+ * same reason the root's `:active` does: a click's `:active` is too short to
92
+ * ease into. A `:hover` block declares no transition, ever (see `ACTIVE`).
93
+ *
94
+ * All three are empty for a variant that does not step.
95
+ */
96
+ export function pointerInkStyles(theme: Theme, variant: string | undefined): Record<'rest' | PointerInkState, CSSObject> {
97
+ const side = inkAbsolute(theme, variant);
98
+ if (side === null) return { rest: {}, hover: {}, press: {} };
99
+ const absolute = absoluteInk(theme)[side];
100
+ const at = (state: PointerInkState): string => steppedInkCss(absolute, POINTER_INK_STEP[state][side]);
101
+ return {
102
+ rest: { [MESSAGE_INK]: { transition: `color ${seconds(ACTIVE.ms)} ${ALERT_EASING}` } },
103
+ hover: { [MESSAGE_INK]: { color: at('hover') } },
104
+ press: { [MESSAGE_INK]: { color: at('press'), transition: 'none' } },
105
+ };
106
+ }
@@ -145,6 +145,46 @@ The Alert component implements comprehensive accessibility features:
145
145
  - High contrast colors meeting WCAG guidelines
146
146
  - Screen reader compatible content structure
147
147
 
148
+ ### Hover and press keep the words at 4.5:1
149
+
150
+ An alert answers a pointer with a flat tint layer (`HOVER.tintAlpha` 0.06,
151
+ `ACTIVE.tintAlpha` 0.2, eased back over `ACTIVE.ms`), and nothing moves. That
152
+ layer moves the surface toward the mode's absolute — black in light mode, white
153
+ in dark — which is the side the ink is on, so on its own it CLOSED the gap the
154
+ words are read across: a summary at 4.71:1 idle fell to 3.17:1 pressed in
155
+ light mode and 2.68:1 in dark (FUT-4506).
156
+
157
+ So while the tint is on, the **message** — title, description and whatever
158
+ is passed as `children` — steps its ink toward
159
+ that same absolute (`POINTER_INK_STEP`; both states' tint and step are
160
+ exported as `ALERT_POINTER_STATES` for a theme that asserts its own tones):
161
+
162
+ | state | toward black (light mode) | toward white (dark mode) |
163
+ |---|---|---|
164
+ | hover | 0.15 | 0.2 |
165
+ | press | 0.35 | 0.6 |
166
+
167
+ The message holds 4.5:1 at rest, hovered and pressed — the title too, since
168
+ 16.8px/600 is not WCAG "large" text. The step sits on the title
169
+ (`.MuiAlertTitle-root`), the description (`.alert-description`) and the
170
+ children (wrapped in `.alert-children` at `display: contents`, so the layout
171
+ does not change), each one step. It is a `color-mix()` over `currentColor`:
172
+ its amount lands on whatever ink is actually painted, so a theme that repaints
173
+ a semantic or `glass` alert's `color` gets the same step on its own ink. It
174
+ eases on the tint's clock and lands at once on a press, like the tint.
175
+
176
+ The icon does not step, in either placement: in the gutter (`.MuiAlert-icon`)
177
+ and on the title's row (`iconPlacement: 'title'`), where it sits in the
178
+ message column beside the title rather than inside it. The close button
179
+ (`.MuiAlert-action`), the focus ring and any control in `children` that
180
+ declares its own colour keep their colours and states; a `color="inherit"`
181
+ control in `children` steps with the words around it.
182
+
183
+ `gradient` is not stepped. The step's direction is the mode's, and a host that
184
+ repaints a gradient to a light pane with a dark ink would have had that ink
185
+ stepped toward white under the variant's black layer. Its rest contrast is
186
+ FUT-4516's.
187
+
148
188
  ### `announce` — whether the alert interrupts
149
189
 
150
190
  `role` and `aria-live` are two attributes with one meaning between them, and by
@@ -94,9 +94,12 @@ export const PULSE = { alpha: 0.2, ms: 2000, spread: 10 } as const;
94
94
  * dark one. A `filter: brightness()` fixed the direction but is MULTIPLICATIVE,
95
95
  * so it moved a near-black `glass` by four counts (ΔE76 1.71, under the JND)
96
96
  * and Banner's 10%-alpha wash by ΔE76 0.44. A layer is additive: it reads the
97
- * same on an opaque tint, a translucent wash and a gradient, and because it
98
- * paints above the background and below the content the ink keeps its own
99
- * contrast.
97
+ * same on an opaque tint, a translucent wash and a gradient.
98
+ *
99
+ * Painting above the background and below the content keeps the layer off the
100
+ * INK, but not off the ink's CONTRAST: the layer moves the surface toward the
101
+ * mode's absolute, which is the side the ink is on, so the two close in. That
102
+ * is what {@link POINTER_INK_STEP} answers (FUT-4506).
100
103
  */
101
104
  export const HOVER = { tintAlpha: 0.06 } as const;
102
105
 
@@ -117,8 +120,11 @@ export const HOVER = { tintAlpha: 0.06 } as const;
117
120
  *
118
121
  * An inset shadow at 100vmax is a flat tint over the whole surface: ADDITIVE,
119
122
  * so it reads the same on an opaque tint, a translucent wash and a gradient;
120
- * painted above the background and below the content, so the ink keeps its
121
- * own contrast; and animatable, which `background-image` is not.
123
+ * painted above the background and below the content, so it never dims the
124
+ * ink itself; and animatable, which `background-image` is not. It DOES dim the
125
+ * ink's contrast, because it darkens a light surface toward a dark ink (and
126
+ * lightens a dark one toward a light ink) — on Alert, {@link POINTER_INK_STEP}
127
+ * is the other half of the press.
122
128
  *
123
129
  * `ms` is 250 and not the 1000 first asked for, and the reason is that ONE
124
130
  * property carries both states. CSS runs a transition from the DESTINATION
@@ -133,6 +139,52 @@ export const HOVER = { tintAlpha: 0.06 } as const;
133
139
  */
134
140
  export const ACTIVE = { tintAlpha: 0.2, ms: 250 } as const;
135
141
 
142
+ /**
143
+ * How far the MESSAGE ink — title, description and children — steps toward the
144
+ * absolute on its own side while the alert is hovered or pressed (FUT-4506,
145
+ * option C).
146
+ *
147
+ * The tint layer above moves the surface toward the mode's absolute — black in
148
+ * light mode, white in dark — which is the side the ink sits on, so every
149
+ * pointer state CLOSED the gap the ink is read across. Measured on a host pane
150
+ * whose summary sat at 4.71:1 idle: 4.22 hovered, 3.17 pressed in light mode,
151
+ * and down to 2.68 pressed in dark. The title, at 16.8px/600, is not WCAG
152
+ * "large" text, so it is held to 4.5:1 as well.
153
+ *
154
+ * The answer keeps the layer (the pointer still gets its feedback) and moves
155
+ * the ink FURTHER the same way, so the gap re-opens. The amounts are the
156
+ * prototype's measured steps on that host pane, the worst case in reach: they
157
+ * hold the 0.9 summary at 4.75–6.07:1 there, and at 6.38:1 or more on this
158
+ * package's default palette in both modes. White needs the bigger step because
159
+ * a light ink has less room above it than a dark ink has below it, and dark
160
+ * mode's pressed step needs at least 0.55.
161
+ *
162
+ * Keyed by the absolute the ink moves TOWARD, which is the mode's: black in
163
+ * light mode, white in dark. The web applies the step as `color-mix()` over
164
+ * `currentColor`, so its AMOUNT lands on whatever ink is actually painted — a
165
+ * host's repaint of a semantic or `glass` alert included. Its DIRECTION is the
166
+ * mode's, which is only safe where the surface tracks the mode, so `gradient`
167
+ * is not stepped at all (`inkAbsolute` in `Alert.ink.ts`): a host that
168
+ * repaints it to a light pane and a dark ink would otherwise have its ink
169
+ * stepped toward white under a black layer. DOM only; native has no pointer
170
+ * states. `Banner` paints the same tint and does not step yet.
171
+ */
172
+ export const POINTER_INK_STEP = {
173
+ hover: { black: 0.15, white: 0.2 },
174
+ press: { black: 0.35, white: 0.6 },
175
+ } as const;
176
+
177
+ /**
178
+ * Both pointer states as a host reads them: the tint layer's alpha and the ink
179
+ * step, per absolute. Exported (as `ALERT_POINTER_STATES`) so a theme that
180
+ * repaints the alert's pane and ink can assert its own tones still clear 4.5:1
181
+ * hovered and pressed, against the numbers the package actually draws with.
182
+ */
183
+ export const POINTER_STATES = {
184
+ hover: { tintAlpha: HOVER.tintAlpha, inkStep: POINTER_INK_STEP.hover },
185
+ press: { tintAlpha: ACTIVE.tintAlpha, inkStep: POINTER_INK_STEP.press },
186
+ } as const;
187
+
136
188
  export const FOCUS = { ringWidth: 2, ringAlpha: 1, offset: 2 } as const;
137
189
 
138
190
  /** `neutral` has no palette slot; the web has always drawn it from three greys. */
@@ -10,6 +10,7 @@ import React from 'react';
10
10
  import { absoluteInk, modeInk } from '../../../tokens/ink';
11
11
 
12
12
  import { AlertContent } from './Alert.content';
13
+ import { pointerInkStyles } from './Alert.ink';
13
14
  import { resolveAlertProps, resolveAnnouncement, testIdFor } from './Alert.helpers';
14
15
  import { resolveIconPlacement, type AlertIconPlacement } from './Alert.placement';
15
16
  import type { AlertPalette } from './Alert.metrics';
@@ -48,9 +49,11 @@ const transition = `all ${seconds(ALERT_TRANSITION_MS)} ${ALERT_EASING}`;
48
49
  *
49
50
  * The tint is an inset spread at 100vmax, which always exceeds the element, so
50
51
  * it covers the surface edge to edge. It paints ABOVE the background and BELOW
51
- * the content, which is what keeps the ink's own contrast out of these states
52
- * entirely — see `ACTIVE` in `Alert.metrics.ts` for why a layer replaced the
53
- * opacity dip and the brightness multiplier that each preceded it.
52
+ * the content, so it never dims the ink itself — see `ACTIVE` in
53
+ * `Alert.metrics.ts` for why a layer replaced the opacity dip and the
54
+ * brightness multiplier that each preceded it. It does move the surface toward
55
+ * the ink's side, which is the contrast `pointerInkStyles` (`Alert.ink.ts`)
56
+ * wins back by stepping the message's words the same way.
54
57
  *
55
58
  * The glow is COMPOSED rather than replaced, so hovering a glowing alert keeps
56
59
  * its glow; `glowStyles` gave up its `!important` for this.
@@ -61,15 +64,19 @@ function pointerShadow(
61
64
  glow: boolean,
62
65
  variant: string | undefined,
63
66
  ): (alpha_: number) => string {
64
- // The tint moves the surface AWAY from its own ink, which is why this reads
65
- // the variant and not only the mode.
67
+ // The tint's colour reads the variant and not only the mode. On every
68
+ // surface that tracks the mode it moves the surface TOWARD its ink's side —
69
+ // the contrast cost `pointerInkStyles` pays back.
66
70
  //
67
71
  // `gradient` is the one variant where the two disagree: it paints a
68
72
  // mid-lightness sweep (L* 42–61) under WHITE ink in BOTH modes, so the
69
73
  // mode-keyed answer tinted it white in dark mode — toward the text. Measured:
70
74
  // white-on-gradient fell to 2.90:1 on hover and 2.41:1 pressed, under the 3:1
71
75
  // floor and below its own idle. Every other variant's surface tracks the mode,
72
- // so for them the two rules agree.
76
+ // so for them the two rules agree. (Not quite WHITE in both modes: dark
77
+ // mode's light hues get a dark `getContrastText` ink, which this black layer
78
+ // closes on. That ink is not stepped (`inkAbsolute`); its rest contrast is
79
+ // FUT-4516's.)
73
80
  const ink = variant === 'gradient' ? absoluteInk(theme).black : modeInk(theme);
74
81
  const glowShadow = glow
75
82
  ? `0 0 ${rems(theme, GLOW.blur, GLOW.spread)} ${alpha(colorPalette.main, GLOW.alpha)}`
@@ -91,6 +98,7 @@ const StyledAlert = styled(MuiAlert, {
91
98
  const colorPalette = getColorFromTheme(theme, customColor || customVariant || 'info');
92
99
 
93
100
  const withTint = pointerShadow(theme, colorPalette, Boolean(glow), customVariant);
101
+ const ink = pointerInkStyles(theme, customVariant);
94
102
 
95
103
  return {
96
104
  borderRadius: theme.spacing(ALERT_RADIUS_UNITS),
@@ -101,13 +109,15 @@ const StyledAlert = styled(MuiAlert, {
101
109
  willChange: 'transform, opacity',
102
110
 
103
111
  ...alertLayoutStyles(theme, colorPalette, animate),
112
+ ...ink.rest,
104
113
 
105
114
  // Hover: one tint step, and nothing that moves. An alert is a surface
106
115
  // rather than a control, so the pointer only needs telling it is here. The
107
116
  // icon keeps its own place for the same reason — it is the variant's
108
- // meaning, not an affordance to animate.
117
+ // meaning, not an affordance to animate. The message's ink steps too.
109
118
  '&:hover': {
110
119
  boxShadow: withTint(HOVER.tintAlpha),
120
+ ...ink.hover,
111
121
 
112
122
  '&::before': {
113
123
  opacity: 1,
@@ -136,6 +146,7 @@ const StyledAlert = styled(MuiAlert, {
136
146
  '&:active:not(:has(button:active, a:active, [role="button"]:active))': {
137
147
  boxShadow: withTint(ACTIVE.tintAlpha),
138
148
  transition: 'none',
149
+ ...ink.press,
139
150
  },
140
151
 
141
152
  // Focus: `:focus-visible`, not `:focus-within`.
@@ -6,3 +6,4 @@ export type {
6
6
  AlertVariant,
7
7
  UiAlertTheme,
8
8
  } from './Alert.types';
9
+ export { POINTER_STATES as ALERT_POINTER_STATES } from './Alert.metrics';
@@ -9,7 +9,7 @@ import type { RegionMapPoint, RegionMapRegion, RegionMapRing } from './RegionMap
9
9
  */
10
10
 
11
11
  /** Metres per degree of latitude on the mean sphere. */
12
- const METRES_PER_DEGREE = 111_195;
12
+ export const METRES_PER_DEGREE = 111_195;
13
13
 
14
14
  /** A projected point, metres east (`x`) and south (`y`) of the centre. */
15
15
  export interface PlanePoint {