@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.
- package/dist/_internal/components/data-display/Alert/Alert.content.js +4 -2
- package/dist/_internal/components/data-display/Alert/Alert.ink.js +27 -0
- package/dist/_internal/components/data-display/Alert/Alert.js +6 -5
- package/dist/_internal/components/data-display/Alert/Alert.metrics.js +5 -1
- package/dist/_internal/components/data-display/Alert/Alert.styles.js +2 -2
- package/dist/_internal/components/data-display/Banner/Banner.js +3 -3
- package/dist/_internal/components/data-display/Banner/Banner.styles.js +2 -2
- package/dist/_internal/components/data-display/CardKit/card-actions-context.js +8 -7
- package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +9 -8
- package/dist/_internal/components/data-display/Carousel/Carousel.js +2 -2
- package/dist/_internal/components/data-display/Chart/SpecChart.js +3 -3
- package/dist/_internal/components/data-display/DataGrid/DataGrid.js +1 -1
- package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +17 -17
- package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +26 -25
- package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +1 -1
- package/dist/_internal/components/data-display/DataViews/base-list-card-layout.js +1 -1
- package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +1 -1
- package/dist/_internal/components/data-display/DataViews/base-list-card.js +4 -4
- package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +14 -14
- package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +6 -6
- package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +8 -7
- package/dist/_internal/components/data-display/DataViews/list-card-rails.js +1 -1
- package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +2 -2
- package/dist/_internal/components/data-display/DayRuler/DayRuler.footer.js +2 -2
- package/dist/_internal/components/data-display/DayRuler/DayRuler.js +7 -7
- package/dist/_internal/components/data-display/DayRuler/DayRuler.keyboard.js +2 -2
- package/dist/_internal/components/data-display/DayRuler/DayRuler.parts.js +3 -3
- package/dist/_internal/components/data-display/DayRuler/useRulerDrag.js +2 -2
- package/dist/_internal/components/data-display/FleetMap/FleetBody.js +6 -6
- package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +5 -5
- package/dist/_internal/components/data-display/FleetMap/FleetMap.js +7 -7
- package/dist/_internal/components/data-display/HoverCard/HoverCard.js +2 -2
- package/dist/_internal/components/data-display/Lightbox/Lightbox.js +3 -3
- package/dist/_internal/components/data-display/MapPreview/MapLayers.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapPreview.js +4 -4
- package/dist/_internal/components/data-display/Progress/Progress.js +2 -2
- package/dist/_internal/components/data-display/RegionMap/RegionMap.fixtures.js +1 -1
- package/dist/_internal/components/data-display/RegionMap/RegionMap.helpers.js +3 -1
- package/dist/_internal/components/data-display/RegionMap/RegionMap.hooks.js +3 -3
- package/dist/_internal/components/data-display/RegionMap/RegionMap.js +6 -5
- package/dist/_internal/components/data-display/RegionMap/RegionMap.view.js +2 -2
- package/dist/_internal/components/data-display/RegionMap/RegionMapDrawing.js +3 -2
- package/dist/_internal/components/data-display/RegionMap/RegionMapPin.js +26 -0
- package/dist/_internal/components/data-display/index.js +60 -50
- package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js +7 -6
- package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.frame.js +4 -4
- package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.header.js +3 -3
- package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.js +14 -13
- package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.overview.js +9 -8
- package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.parts.js +8 -7
- package/dist/_internal/components/feedback/index.js +15 -14
- package/dist/_internal/components/index.js +66 -56
- package/dist/charts.js +11 -11
- package/dist/{chunk-WYNGH2WL.js → chunk-255WTBZ5.js} +8 -8
- package/dist/{chunk-QIP37Y2C.js → chunk-2RC6EAGD.js} +2 -2
- package/dist/{chunk-ZKVSFVIA.js → chunk-37MJZLQU.js} +2 -2
- package/dist/{chunk-BQBEN44R.js → chunk-3I7KE2N6.js} +2 -2
- package/dist/{chunk-L4FWEI2P.js → chunk-3V3Z4EML.js} +5 -5
- package/dist/{chunk-E4MJA52O.js → chunk-3V5V44UP.js} +16 -18
- package/dist/chunk-3V5V44UP.js.map +1 -0
- package/dist/{chunk-6RYSSNOO.js → chunk-54DOLCJ3.js} +2 -2
- package/dist/{chunk-74IH3ZGD.js → chunk-643YFWNK.js} +2 -2
- package/dist/{chunk-FRQGZIYU.js → chunk-6WAP7BJS.js} +2 -2
- package/dist/chunk-AG4F6NVT.js +1 -0
- package/dist/chunk-AG4F6NVT.js.map +1 -0
- package/dist/{chunk-3CXRHRGE.js → chunk-AYDVNXGR.js} +7 -3
- package/dist/chunk-AYDVNXGR.js.map +1 -0
- package/dist/{chunk-JO6D7YGN.js → chunk-CWRQGA2T.js} +2 -2
- package/dist/chunk-DRYBA76G.js +293 -0
- package/dist/chunk-DRYBA76G.js.map +1 -0
- package/dist/{chunk-ZW7Q3IRL.js → chunk-FYJL432J.js} +4 -4
- package/dist/{chunk-G6TKWNF2.js → chunk-GZITNT7O.js} +11 -11
- package/dist/{chunk-RFMQBIE6.js → chunk-HBHBRRSW.js} +4 -4
- package/dist/{chunk-U4Z6GZDW.js → chunk-HN36UVOE.js} +4 -4
- package/dist/{chunk-WK577LQL.js → chunk-J2IQ6FJ5.js} +4 -4
- package/dist/{chunk-HCTHY66U.js → chunk-KAGXV3ID.js} +4 -4
- package/dist/{chunk-FWAY2SAI.js → chunk-KAZWBDIH.js} +2 -2
- package/dist/{chunk-DKPELKGL.js → chunk-KV7LTOWC.js} +5 -5
- package/dist/{chunk-UC7DLGMP.js → chunk-KVP5A3YK.js} +2 -2
- package/dist/chunk-LNZJJFZQ.js +41 -0
- package/dist/chunk-LNZJJFZQ.js.map +1 -0
- package/dist/{chunk-EGBQR5GH.js → chunk-LOLYBFYY.js} +5 -5
- package/dist/{chunk-SOXO2VN3.js → chunk-MEMVZW64.js} +3 -3
- package/dist/{chunk-COOSJKZL.js → chunk-MNJZPJ5S.js} +2 -1
- package/dist/chunk-MNJZPJ5S.js.map +1 -0
- package/dist/{chunk-G2NVBCF7.js → chunk-NWUMGE6T.js} +3 -3
- package/dist/{chunk-NQCTANF3.js → chunk-Q5SCBQLY.js} +18 -11
- package/dist/chunk-Q5SCBQLY.js.map +1 -0
- package/dist/{chunk-64LNNC54.js → chunk-QLKUWDMQ.js} +4 -4
- package/dist/{chunk-MPVH2GM5.js → chunk-RAQD5QCM.js} +4 -4
- package/dist/{chunk-KXDLLS62.js → chunk-REHGWN5M.js} +4 -4
- package/dist/{chunk-Z4ZFJ565.js → chunk-SRAIV6U6.js} +3 -3
- package/dist/{chunk-5ZY3IIIG.js → chunk-TBQR5VCN.js} +11 -1
- package/dist/chunk-TBQR5VCN.js.map +1 -0
- package/dist/{chunk-3N2HWNKT.js → chunk-UIJLDAV7.js} +2 -2
- package/dist/{chunk-7HZ36QDH.js → chunk-UN5WU2OX.js} +9 -3
- package/dist/chunk-UN5WU2OX.js.map +1 -0
- package/dist/{chunk-A27J4CIZ.js → chunk-UTIYB6VE.js} +11 -11
- package/dist/{chunk-5V7IZBRY.js → chunk-VRSW7PIO.js} +5 -5
- package/dist/{chunk-U4PV2ZKK.js → chunk-WDEVKND3.js} +3 -3
- package/dist/chunk-WGKLBVDZ.js +1 -0
- package/dist/chunk-WGKLBVDZ.js.map +1 -0
- package/dist/{chunk-AP7GEUJS.js → chunk-XFOKLWJZ.js} +2 -2
- package/dist/{chunk-6D5AMANO.js → chunk-XQAFSC66.js} +2 -2
- package/dist/{chunk-YNZUYZ2O.js → chunk-XR474YYX.js} +2 -2
- package/dist/{chunk-L5RS6QAT.js → chunk-YBF2WUGQ.js} +2 -2
- package/dist/{chunk-RCTHCXS6.js → chunk-YQ5GQ32T.js} +2 -2
- package/dist/{chunk-YLZXIR6B.js → chunk-Z5V5E3JW.js} +4 -4
- package/dist/data-display/Alert.js +10 -6
- package/dist/data-display/Banner.js +3 -3
- package/dist/data-display/CardKit.js +9 -8
- package/dist/data-display/Carousel.js +2 -2
- package/dist/data-display/Chart.js +11 -11
- package/dist/data-display/DataGrid.js +1 -1
- package/dist/data-display/DataViews.js +33 -32
- package/dist/data-display/DayRuler.js +7 -7
- package/dist/data-display/FleetMap.js +7 -7
- package/dist/data-display/HoverCard.js +2 -2
- package/dist/data-display/Lightbox.js +3 -3
- package/dist/data-display/MapPreview.js +4 -4
- package/dist/data-display/Progress.js +2 -2
- package/dist/data-display/RegionMap.js +14 -8
- package/dist/feedback/NotificationStatusNotice.js +7 -6
- package/dist/feedback/SequenceResolver.js +14 -13
- package/dist/native/data-display/Alert.js +10 -0
- package/dist/native/data-display/Alert.js.map +1 -1
- package/dist/types/components/data-display/Alert/Alert.content.d.ts.map +1 -1
- package/dist/types/components/data-display/Alert/Alert.d.ts.map +1 -1
- package/dist/types/components/data-display/Alert/Alert.ink.d.ts +65 -0
- package/dist/types/components/data-display/Alert/Alert.ink.d.ts.map +1 -0
- package/dist/types/components/data-display/Alert/Alert.metrics.d.ts +73 -5
- package/dist/types/components/data-display/Alert/Alert.metrics.d.ts.map +1 -1
- package/dist/types/components/data-display/Alert/index.d.ts +1 -0
- package/dist/types/components/data-display/Alert/index.d.ts.map +1 -1
- package/dist/types/components/data-display/RegionMap/RegionMap.d.ts +1 -1
- package/dist/types/components/data-display/RegionMap/RegionMap.d.ts.map +1 -1
- package/dist/types/components/data-display/RegionMap/RegionMap.helpers.d.ts +9 -0
- package/dist/types/components/data-display/RegionMap/RegionMap.helpers.d.ts.map +1 -1
- package/dist/types/components/data-display/RegionMap/RegionMap.types.d.ts +45 -1
- package/dist/types/components/data-display/RegionMap/RegionMap.types.d.ts.map +1 -1
- package/dist/types/components/data-display/RegionMap/RegionMapDrawing.d.ts +4 -1
- package/dist/types/components/data-display/RegionMap/RegionMapDrawing.d.ts.map +1 -1
- package/dist/types/components/data-display/RegionMap/RegionMapPin.d.ts +102 -0
- package/dist/types/components/data-display/RegionMap/RegionMapPin.d.ts.map +1 -0
- package/dist/types/components/data-display/RegionMap/index.d.ts +2 -1
- package/dist/types/components/data-display/RegionMap/index.d.ts.map +1 -1
- package/dist/types-native/components/data-display/Alert/Alert.metrics.d.ts +73 -5
- package/dist/types-native/components/data-display/Alert/Alert.metrics.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/data-display/Alert/Alert.content.tsx +16 -1
- package/src/components/data-display/Alert/Alert.ink.ts +106 -0
- package/src/components/data-display/Alert/Alert.md +40 -0
- package/src/components/data-display/Alert/Alert.metrics.ts +57 -5
- package/src/components/data-display/Alert/Alert.tsx +18 -7
- package/src/components/data-display/Alert/index.ts +1 -0
- package/src/components/data-display/RegionMap/RegionMap.helpers.ts +1 -1
- package/src/components/data-display/RegionMap/RegionMap.md +19 -2
- package/src/components/data-display/RegionMap/RegionMap.tsx +4 -0
- package/src/components/data-display/RegionMap/RegionMap.types.ts +49 -1
- package/src/components/data-display/RegionMap/RegionMapDrawing.tsx +11 -13
- package/src/components/data-display/RegionMap/RegionMapPin.tsx +388 -0
- package/src/components/data-display/RegionMap/index.ts +5 -0
- package/dist/chunk-3CXRHRGE.js.map +0 -1
- package/dist/chunk-5ZY3IIIG.js.map +0 -1
- package/dist/chunk-7HZ36QDH.js.map +0 -1
- package/dist/chunk-COOSJKZL.js.map +0 -1
- package/dist/chunk-DY2I6LMX.js +0 -1
- package/dist/chunk-E4MJA52O.js.map +0 -1
- package/dist/chunk-NQCTANF3.js.map +0 -1
- package/dist/chunk-NUGT7LMR.js +0 -1
- /package/dist/{chunk-DY2I6LMX.js.map → _internal/components/data-display/Alert/Alert.ink.js.map} +0 -0
- /package/dist/{chunk-NUGT7LMR.js.map → _internal/components/data-display/RegionMap/RegionMapPin.js.map} +0 -0
- /package/dist/{chunk-WYNGH2WL.js.map → chunk-255WTBZ5.js.map} +0 -0
- /package/dist/{chunk-QIP37Y2C.js.map → chunk-2RC6EAGD.js.map} +0 -0
- /package/dist/{chunk-ZKVSFVIA.js.map → chunk-37MJZLQU.js.map} +0 -0
- /package/dist/{chunk-BQBEN44R.js.map → chunk-3I7KE2N6.js.map} +0 -0
- /package/dist/{chunk-L4FWEI2P.js.map → chunk-3V3Z4EML.js.map} +0 -0
- /package/dist/{chunk-6RYSSNOO.js.map → chunk-54DOLCJ3.js.map} +0 -0
- /package/dist/{chunk-74IH3ZGD.js.map → chunk-643YFWNK.js.map} +0 -0
- /package/dist/{chunk-FRQGZIYU.js.map → chunk-6WAP7BJS.js.map} +0 -0
- /package/dist/{chunk-JO6D7YGN.js.map → chunk-CWRQGA2T.js.map} +0 -0
- /package/dist/{chunk-ZW7Q3IRL.js.map → chunk-FYJL432J.js.map} +0 -0
- /package/dist/{chunk-G6TKWNF2.js.map → chunk-GZITNT7O.js.map} +0 -0
- /package/dist/{chunk-RFMQBIE6.js.map → chunk-HBHBRRSW.js.map} +0 -0
- /package/dist/{chunk-U4Z6GZDW.js.map → chunk-HN36UVOE.js.map} +0 -0
- /package/dist/{chunk-WK577LQL.js.map → chunk-J2IQ6FJ5.js.map} +0 -0
- /package/dist/{chunk-HCTHY66U.js.map → chunk-KAGXV3ID.js.map} +0 -0
- /package/dist/{chunk-FWAY2SAI.js.map → chunk-KAZWBDIH.js.map} +0 -0
- /package/dist/{chunk-DKPELKGL.js.map → chunk-KV7LTOWC.js.map} +0 -0
- /package/dist/{chunk-UC7DLGMP.js.map → chunk-KVP5A3YK.js.map} +0 -0
- /package/dist/{chunk-EGBQR5GH.js.map → chunk-LOLYBFYY.js.map} +0 -0
- /package/dist/{chunk-SOXO2VN3.js.map → chunk-MEMVZW64.js.map} +0 -0
- /package/dist/{chunk-G2NVBCF7.js.map → chunk-NWUMGE6T.js.map} +0 -0
- /package/dist/{chunk-64LNNC54.js.map → chunk-QLKUWDMQ.js.map} +0 -0
- /package/dist/{chunk-MPVH2GM5.js.map → chunk-RAQD5QCM.js.map} +0 -0
- /package/dist/{chunk-KXDLLS62.js.map → chunk-REHGWN5M.js.map} +0 -0
- /package/dist/{chunk-Z4ZFJ565.js.map → chunk-SRAIV6U6.js.map} +0 -0
- /package/dist/{chunk-3N2HWNKT.js.map → chunk-UIJLDAV7.js.map} +0 -0
- /package/dist/{chunk-A27J4CIZ.js.map → chunk-UTIYB6VE.js.map} +0 -0
- /package/dist/{chunk-5V7IZBRY.js.map → chunk-VRSW7PIO.js.map} +0 -0
- /package/dist/{chunk-U4PV2ZKK.js.map → chunk-WDEVKND3.js.map} +0 -0
- /package/dist/{chunk-AP7GEUJS.js.map → chunk-XFOKLWJZ.js.map} +0 -0
- /package/dist/{chunk-6D5AMANO.js.map → chunk-XQAFSC66.js.map} +0 -0
- /package/dist/{chunk-YNZUYZ2O.js.map → chunk-XR474YYX.js.map} +0 -0
- /package/dist/{chunk-L5RS6QAT.js.map → chunk-YBF2WUGQ.js.map} +0 -0
- /package/dist/{chunk-RCTHCXS6.js.map → chunk-YQ5GQ32T.js.map} +0 -0
- /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":"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"}
|
|
@@ -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
|
|
148
|
-
*
|
|
149
|
-
*
|
|
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
|
|
172
|
-
*
|
|
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":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,EAAgB,KAAK,UAAU,EAAE,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEpF;;;;;;;;;;GAUG;AAEH,oFAAoF;AACpF,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,mBAAmB;;;CAA6C,CAAC;AAC9E,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,eAAO,MAAM,YAAY,iCAAiC,CAAC;AAE3D,4EAA4E;AAC5E,eAAO,MAAM,OAAO;;;;CAA8C,CAAC;AACnE,eAAO,MAAM,SAAS;;;;CAA4C,CAAC;AACnE,oEAAoE;AACpE,eAAO,MAAM,WAAW,MAAM,CAAC;AAC/B,eAAO,MAAM,cAAc,MAAM,CAAC;AAElC,4FAA4F;AAC5F,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,2FAA2F;AAC3F,eAAO,MAAM,cAAc;;;CAAsD,CAAC;AAElF,2GAA2G;AAC3G,eAAO,MAAM,KAAK;;;;;CAAsF,CAAC;AACzG,iDAAiD;AACjD,eAAO,MAAM,WAAW;;;CAA4C,CAAC;AAErE,qHAAqH;AACrH,eAAO,MAAM,UAAU;;;CAA+C,CAAC;AACvE,qGAAqG;AACrG,eAAO,MAAM,SAAS;;;;;;CAAuG,CAAC;AAC9H,oGAAoG;AACpG,eAAO,MAAM,WAAW;;;;CAAmE,CAAC;AAC5F,mFAAmF;AACnF,eAAO,MAAM,YAAY;;;;;CAAsE,CAAC;AAEhG;;;;GAIG;AACH,eAAO,MAAM,gBAAgB;;;;;;;CAA4E,CAAC;AAC1G,oEAAoE;AACpE,eAAO,MAAM,KAAK;;;;;CAAuF,CAAC;AAC1G;;;;;;;;;GASG;AACH,eAAO,MAAM,QAAQ;;;;;;CAMX,CAAC;AAEX,oEAAoE;AACpE,eAAO,MAAM,IAAI;;;;;CAAiE,CAAC;AACnF,eAAO,MAAM,KAAK;;;;CAAgD,CAAC;AAEnE
|
|
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
|
@@ -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
|
|
98
|
-
*
|
|
99
|
-
*
|
|
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
|
|
121
|
-
*
|
|
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,
|
|
52
|
-
*
|
|
53
|
-
*
|
|
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
|
|
65
|
-
// the
|
|
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`.
|
|
@@ -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 {
|