@g9tm/lynxcontrols-progress-overlay 1.4.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.
@@ -0,0 +1,156 @@
1
+ .g9-progress {
2
+ pointer-events: auto;
3
+ background-color: var(--g9-surface-container-high);
4
+ border: 1px solid var(--g9-outline-variant);
5
+ border-radius: 16px;
6
+ padding: 12px;
7
+ position: absolute;
8
+ left: 16px;
9
+ right: 16px;
10
+ }
11
+
12
+ .g9-progress--success {
13
+ background-color: var(--g9-primary);
14
+ }
15
+
16
+ .g9-progress--error {
17
+ background-color: var(--g9-error);
18
+ }
19
+
20
+ .g9-progress__running, .g9-progress__terminal {
21
+ flex-direction: row;
22
+ align-items: center;
23
+ gap: 12px;
24
+ display: flex;
25
+ }
26
+
27
+ .g9-progress__texts {
28
+ flex-direction: column;
29
+ flex: 1;
30
+ gap: 2px;
31
+ display: flex;
32
+ }
33
+
34
+ .g9-progress__title {
35
+ color: var(--g9-on-surface);
36
+ font-size: 14px;
37
+ font-weight: 600;
38
+ }
39
+
40
+ .g9-progress__subtitle {
41
+ color: var(--g9-on-surface-variant);
42
+ font-size: 12px;
43
+ }
44
+
45
+ .g9-progress--success .g9-progress__title, .g9-progress--success .g9-progress__subtitle, .g9-progress--error .g9-progress__title, .g9-progress--error .g9-progress__subtitle, .g9-progress__retry-text {
46
+ color: var(--g9-on-primary);
47
+ }
48
+
49
+ .g9-progress__bar {
50
+ background-color: var(--g9-outline-variant);
51
+ border-radius: 2px;
52
+ height: 4px;
53
+ margin-top: 6px;
54
+ overflow: hidden;
55
+ }
56
+
57
+ .g9-progress__fill {
58
+ transform-origin: 0;
59
+ background-color: var(--g9-primary);
60
+ width: 100%;
61
+ height: 4px;
62
+ transition: transform .24s ease-out;
63
+ }
64
+
65
+ .g9-progress__queued {
66
+ background-color: var(--g9-primary-container);
67
+ border-radius: 10px;
68
+ justify-content: center;
69
+ align-items: center;
70
+ min-width: 28px;
71
+ height: 20px;
72
+ padding: 0 6px;
73
+ display: flex;
74
+ }
75
+
76
+ .g9-progress__queued-text {
77
+ color: var(--g9-on-primary-container);
78
+ font-size: 11px;
79
+ }
80
+
81
+ .g9-progress__cancel, .g9-progress__close {
82
+ justify-content: center;
83
+ align-items: center;
84
+ width: 44px;
85
+ height: 44px;
86
+ display: flex;
87
+ }
88
+
89
+ .g9-progress__actions {
90
+ flex-direction: row;
91
+ align-items: center;
92
+ display: flex;
93
+ }
94
+
95
+ .g9-progress__retry {
96
+ border: 1px solid var(--g9-on-primary);
97
+ border-radius: 18px;
98
+ align-items: center;
99
+ height: 36px;
100
+ padding: 0 12px;
101
+ display: flex;
102
+ }
103
+
104
+ .g9-progress__countdown {
105
+ background-color: var(--g9-on-primary);
106
+ transform-origin: 0;
107
+ width: 100%;
108
+ height: 3px;
109
+ animation-name: g9-progress-countdown;
110
+ animation-timing-function: linear;
111
+ animation-fill-mode: forwards;
112
+ position: absolute;
113
+ bottom: 0;
114
+ left: 0;
115
+ }
116
+
117
+ @keyframes g9-progress-countdown {
118
+ from {
119
+ transform: scaleX(1);
120
+ }
121
+
122
+ to {
123
+ transform: scaleX(0);
124
+ }
125
+ }
126
+
127
+ .g9-progress__bubble-drag {
128
+ pointer-events: auto;
129
+ width: 72px;
130
+ height: 72px;
131
+ position: absolute;
132
+ right: 16px;
133
+ }
134
+
135
+ .g9-progress__bubble {
136
+ background-color: var(--g9-primary);
137
+ border-radius: 36px;
138
+ justify-content: center;
139
+ align-items: center;
140
+ width: 72px;
141
+ height: 72px;
142
+ display: flex;
143
+ }
144
+
145
+ .g9-progress__bubble-ring {
146
+ position: absolute;
147
+ }
148
+
149
+ .g9-progress__bubble-text {
150
+ color: var(--g9-on-primary);
151
+ font-size: 14px;
152
+ font-weight: 700;
153
+ }
154
+
155
+
156
+ /*# sourceMappingURL=progress-overlay.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["webpack://./src/progress-overlay.css"],"names":[],"mappings":"AACA;EAAE,oBAAoB;EACpB,kDAAkD;EAClD,2CAA2C;EAC3C,mBAAmB;EACnB,aAAa;EACb,kBAAkB;EAClB,UAAU;EACV,WAAW;AACb;;AAGA;EAAE,mCAAmC;AACrC;;AAGA;EAAE,iCAAiC;AACnC;;AAGA;EAAE,mBAAmB;EACnB,mBAAmB;EACnB,SAAS;EACT,aAAa;AACf;;AAIA;EADE,sBAAsB;EACtB,OAAO;EACP,QAAQ;EACR,aAAa;AACf;;AAIA;EADE,2BAA2B;EAC3B,eAAe;EACf,gBAAgB;AAClB;;AAIA;EADE,mCAAmC;EACnC,eAAe;AACjB;;AAIA;EADE,2BAA2B;AAC7B;;AAQA;EALE,2CAA2C;EAC3C,kBAAkB;EAClB,WAAW;EACX,eAAe;EACf,gBAAgB;AAClB;;AAQA;EALE,mBAAmB;EACnB,mCAAmC;EACnC,WAAW;EACX,WAAW;EACX,mCAAmC;AACrC;;AAQA;EALE,6CAA6C;EAC7C,mBAAmB;EACnB,uBAAuB;EACvB,mBAAmB;EACnB,eAAe;EACf,YAAY;EACZ,cAAc;EACd,aAAa;AACf;;AAQA;EALE,qCAAqC;EACrC,eAAe;AACjB;;AAQA;EALE,uBAAuB;EACvB,mBAAmB;EACnB,WAAW;EACX,YAAY;EACZ,aAAa;AACf;;AASA;EANE,mBAAmB;EACnB,mBAAmB;EACnB,aAAa;AACf;;AASA;EANE,sCAAsC;EACtC,mBAAmB;EACnB,mBAAmB;EACnB,YAAY;EACZ,eAAe;EACf,aAAa;AACf;;AASA;EANE,sCAAsC;EACtC,mBAAmB;EACnB,WAAW;EACX,WAAW;EACX,qCAAqC;EACrC,iCAAiC;EACjC,6BAA6B;EAC7B,kBAAkB;EAClB,SAAS;EACT,OAAO;AACT;;AASA;EANE;IACE,oBAAoB;EACtB;;EAEA;IACE,oBAAoB;EACtB;AACF;;AAQA;EALE,oBAAoB;EACpB,WAAW;EACX,YAAY;EACZ,kBAAkB;EAClB,WAAW;AACb;;AAQA;EALE,mCAAmC;EACnC,mBAAmB;EACnB,uBAAuB;EACvB,mBAAmB;EACnB,WAAW;EACX,YAAY;EACZ,aAAa;AACf;;AAQA;EALE,kBAAkB;AACpB;;AAQA;EALE,2BAA2B;EAC3B,eAAe;EACf,gBAAgB;AAClB","sourcesContent":["/* G9ProgressOverlay (MAUI G9ProgressOverlayView): a card anchored top or bottom, or a draggable bubble. No shadows. */\n.g9-progress {\n position: absolute;\n left: 16px;\n right: 16px;\n border-radius: 16px;\n padding: 12px;\n pointer-events: auto;\n background-color: var(--g9-surface-container-high);\n border: 1px solid var(--g9-outline-variant);\n}\n\n.g9-progress--success {\n background-color: var(--g9-primary);\n}\n\n.g9-progress--error {\n background-color: var(--g9-error);\n}\n\n.g9-progress__running,\n.g9-progress__terminal {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n}\n\n.g9-progress__texts {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.g9-progress__title {\n font-size: 14px;\n font-weight: 600;\n color: var(--g9-on-surface);\n}\n\n.g9-progress__subtitle {\n font-size: 12px;\n color: var(--g9-on-surface-variant);\n}\n\n.g9-progress--success .g9-progress__title,\n.g9-progress--success .g9-progress__subtitle,\n.g9-progress--error .g9-progress__title,\n.g9-progress--error .g9-progress__subtitle,\n.g9-progress__retry-text {\n color: var(--g9-on-primary);\n}\n\n.g9-progress__bar {\n height: 4px;\n border-radius: 2px;\n margin-top: 6px;\n overflow: hidden;\n background-color: var(--g9-outline-variant);\n}\n\n.g9-progress__fill {\n height: 4px;\n width: 100%;\n transform-origin: left center;\n background-color: var(--g9-primary);\n transition: transform 240ms ease-out;\n}\n\n.g9-progress__queued {\n min-width: 28px;\n height: 20px;\n border-radius: 10px;\n padding: 0 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--g9-primary-container);\n}\n\n.g9-progress__queued-text {\n font-size: 11px;\n color: var(--g9-on-primary-container);\n}\n\n.g9-progress__cancel,\n.g9-progress__close {\n width: 44px;\n height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.g9-progress__actions {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.g9-progress__retry {\n height: 36px;\n padding: 0 12px;\n border-radius: 18px;\n display: flex;\n align-items: center;\n border: 1px solid var(--g9-on-primary);\n}\n\n.g9-progress__countdown {\n position: absolute;\n left: 0;\n bottom: 0;\n height: 3px;\n width: 100%;\n background-color: var(--g9-on-primary);\n transform-origin: left center;\n animation-name: g9-progress-countdown;\n animation-timing-function: linear;\n animation-fill-mode: forwards;\n}\n\n@keyframes g9-progress-countdown {\n from {\n transform: scaleX(1);\n }\n to {\n transform: scaleX(0);\n }\n}\n\n.g9-progress__bubble-drag {\n position: absolute;\n right: 16px;\n width: 72px;\n height: 72px;\n pointer-events: auto;\n}\n\n.g9-progress__bubble {\n width: 72px;\n height: 72px;\n border-radius: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--g9-primary);\n}\n\n.g9-progress__bubble-ring {\n position: absolute;\n}\n\n.g9-progress__bubble-text {\n font-size: 14px;\n font-weight: 700;\n color: var(--g9-on-primary);\n}\n"],"sourceRoot":""}
@@ -0,0 +1,66 @@
1
+ import './progress-overlay.css';
2
+ import { type G9HostHandle } from '@g9tm/lynxcontrols/host';
3
+ import { type G9ProgressOverlayHandle, type G9ProgressOverlayPlacement, type G9ProgressOverlayPosition, type G9ProgressReport, G9ProgressSession } from './model.js';
4
+ /** Layout constants (MAUI helper and view constants). */
5
+ export declare const g9ProgressMetrics: Readonly<{
6
+ horizontalGap: 16;
7
+ verticalGap: 14;
8
+ bubbleSize: 72;
9
+ cancelTarget: 44;
10
+ dragTapThreshold: 12;
11
+ dragEdgeInset: 8;
12
+ }>;
13
+ /**
14
+ * Decides where the overlay sits on the screen a host is showing (MAUI 1.3.0 `G9ProgressOverlayHelper.PlacementProvider`):
15
+ * receives the host, returns a placement or `null`/`undefined` for the default (bottom). Read when an overlay mounts
16
+ * and on `refreshPlacement()`; keep it cheap and free of side effects. A throwing provider falls back to the default.
17
+ */
18
+ export type G9ProgressPlacementProvider = (host: G9HostHandle) => G9ProgressOverlayPlacement | null | undefined;
19
+ /** The progress overlay service of a host (MAUI `G9ProgressOverlayHelper`). One shared overlay per host. */
20
+ export interface G9ProgressOverlayService {
21
+ /**
22
+ * Takes a lease on the shared overlay (MAUI `ShowAsync`); concurrent operations share one visual. An explicit
23
+ * `position` wins and is fixed for the overlay's life; without one (MAUI 1.3.0 `null`) the `placementProvider`
24
+ * decides and `refreshPlacement()` can move it later. Only a newly mounted overlay takes either.
25
+ */
26
+ show(contextText: string, position?: G9ProgressOverlayPosition | null): Promise<G9ProgressOverlayHandle>;
27
+ /**
28
+ * A failure banner with nothing running (MAUI `ShowStandaloneFailureAsync`); stays until retry or close. `position` as
29
+ * in `show`.
30
+ */
31
+ showStandaloneFailure(reason: string, retryText: string, retryAction: (() => Promise<void> | void) | null, position?: G9ProgressOverlayPosition | null): Promise<boolean>;
32
+ /**
33
+ * Where an overlay shown without a position sits on this host's current screen (MAUI 1.3.0 `PlacementProvider`):
34
+ * set it once, and call `refreshPlacement()` when the screen under the overlay changes. `null` (default): bottom.
35
+ */
36
+ placementProvider: G9ProgressPlacementProvider | null;
37
+ /**
38
+ * Re-reads `placementProvider` and moves a live overlay to its answer (MAUI 1.3.0 `RefreshPlacementAsync`): call it
39
+ * on a tab switch or when a full-screen sheet opens or closes. `animate` (default true): an edge change fades out and
40
+ * back in at the new edge, an offset change glides; `false` jumps. Resolves at once when nothing is mounted, when the
41
+ * overlay was shown with an explicit position, and while it is minimized (a bubble stays where the user dragged it).
42
+ */
43
+ refreshPlacement(animate?: boolean): Promise<void>;
44
+ /** Success terminal on the mounted overlay (2.2 s dwell); `false` when nothing is mounted. */
45
+ tryShowCurrentSuccess(message: string | null, subtitle?: string | null): Promise<boolean>;
46
+ /** Failure terminal on the mounted overlay (retry / close); `false` when nothing is mounted. */
47
+ tryShowCurrentFailure(reason: string, retryText: string, retryAction: (() => Promise<void> | void) | null): Promise<boolean>;
48
+ /** Progress in (MAUI `Report`): a report object, or `(ratio, stage?, detail?)`; ignored when nothing is mounted. */
49
+ report(report: G9ProgressReport): void;
50
+ report(ratio: number | null, stage?: string | null, detail?: string | null): void;
51
+ /** "+N waiting" (MAUI `ReportQueued`). */
52
+ reportQueued(count: number): void;
53
+ /** The user tapped cancel (MAUI `CancelRequested`); the overlay is already showing Canceling. */
54
+ onCancelRequested(listener: () => void): () => void;
55
+ /** Re-anchor after the bottom inset changed (tab bar shown / hidden); glides 220 ms. */
56
+ refreshBottomInset(animate?: boolean): Promise<void>;
57
+ /** @internal the live session, for the view and tests */
58
+ readonly session: G9ProgressSession | null;
59
+ }
60
+ /** The progress overlay of a host (created once as a host feature). */
61
+ export declare function progressOverlayServiceOf(host: G9HostHandle): G9ProgressOverlayService;
62
+ /** The progress overlay of the nearest `G9Host`. */
63
+ export declare function useG9ProgressOverlay(): G9ProgressOverlayService;
64
+ /** The progress overlay of the active host, for code outside components (MAUI's static helper). */
65
+ export declare function g9ProgressOverlay(): G9ProgressOverlayService;
66
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.tsx"],"names":[],"mappings":"AAAA,OAAO,wBAAwB,CAAC;AAGhC,OAAO,EAAE,KAAK,YAAY,EAAuC,MAAM,yBAAyB,CAAC;AAOjG,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACrB,iBAAiB,EAIlB,MAAM,SAAS,CAAC;AAEjB,yDAAyD;AACzD,eAAO,MAAM,iBAAiB;;;;;;;EAO5B,CAAC;AAEH;;;;GAIG;AACH,MAAM,MAAM,2BAA2B,GAAG,CAAC,IAAI,EAAE,YAAY,KAAK,0BAA0B,GAAG,IAAI,GAAG,SAAS,CAAC;AAEhH,4GAA4G;AAC5G,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,yBAAyB,GAAG,IAAI,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACzG;;;OAGG;IACH,qBAAqB,CACnB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,EAChD,QAAQ,CAAC,EAAE,yBAAyB,GAAG,IAAI,GAC1C,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB;;;OAGG;IACH,iBAAiB,EAAE,2BAA2B,GAAG,IAAI,CAAC;IACtD;;;;;OAKG;IACH,gBAAgB,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,8FAA8F;IAC9F,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1F,gGAAgG;IAChG,qBAAqB,CACnB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,GAC/C,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,oHAAoH;IACpH,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACvC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAClF,0CAA0C;IAC1C,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,iGAAiG;IACjG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IACpD,wFAAwF;IACxF,kBAAkB,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,yDAAyD;IACzD,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAC5C;AAyTD,uEAAuE;AACvE,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,YAAY,GAAG,wBAAwB,CAGrF;AAED,oDAAoD;AACpD,wBAAgB,oBAAoB,IAAI,wBAAwB,CAE/D;AAED,mGAAmG;AACnG,wBAAgB,iBAAiB,IAAI,wBAAwB,CAE5D"}
@@ -0,0 +1,274 @@
1
+ import "./progress-overlay.css";
2
+ import { startTimer, stopTimer } from "@g9tm/lynxcontrols/base";
3
+ import { G9ActivityIndicator } from "@g9tm/lynxcontrols/display";
4
+ import { g9Hosts, useG9Host, useG9HostInsets } from "@g9tm/lynxcontrols/host";
5
+ import { G9Icon } from "@g9tm/lynxcontrols/icon";
6
+ import { useG9Culture, useG9Strings } from "@g9tm/lynxcontrols/provider";
7
+ import { toastServiceOf } from "@g9tm/lynxcontrols/toast";
8
+ import { G9StringKey, toNativeDigits } from "@g9tm/lynxcontrols-foundation";
9
+ import { Draggable } from "@lynx-js/lynx-ui-draggable";
10
+ import { useEffect, useState, useSyncExternalStore } from "@lynx-js/react";
11
+ import { G9ProgressSession, g9ProgressOverlayPlacement, g9ProgressReport, g9ProgressTimings } from "./model.jsx";
12
+ const g9ProgressMetrics = Object.freeze({
13
+ horizontalGap: 16,
14
+ verticalGap: 14,
15
+ bubbleSize: 72,
16
+ cancelTarget: 44,
17
+ dragTapThreshold: 12,
18
+ dragEdgeInset: 8
19
+ });
20
+ const FEATURE = 'g9.progressOverlay';
21
+ const TOAST_KEY = 'g9.progressOverlay';
22
+ function ProgressLayer(props) {
23
+ props.state.strings = useG9Strings();
24
+ const session = useSyncExternalStore((listener)=>{
25
+ props.state.sessionListeners.add(listener);
26
+ return ()=>props.state.sessionListeners.delete(listener);
27
+ }, ()=>props.state.session);
28
+ useEffect(()=>()=>{
29
+ var _props_state_session;
30
+ null == (_props_state_session = props.state.session) || _props_state_session.dispose();
31
+ }, []);
32
+ return session ? <ProgressOverlayView key="overlay" session={session} host={props.host}/> : null;
33
+ }
34
+ function ProgressOverlayView(props) {
35
+ var _ref, _snap_detail, _snap_stage, _snap_ratio;
36
+ var _snap_terminalTitle, _snap_retryText;
37
+ const session = props.session;
38
+ const snap = useSyncExternalStore(session.subscribe, session.getSnapshot);
39
+ const strings = useG9Strings();
40
+ const culture = useG9Culture();
41
+ const row = {
42
+ flexDirection: 'rtl' === culture.direction ? 'row-reverse' : 'row',
43
+ direction: 'ltr'
44
+ };
45
+ const textStart = {
46
+ textAlign: 'rtl' === culture.direction ? 'right' : 'left'
47
+ };
48
+ const insets = useG9HostInsets();
49
+ const [entered, setEntered] = useState(false);
50
+ const [cardHeight, setCardHeight] = useState(0);
51
+ const [anchor, setAnchor] = useState(()=>insets.bottomWithTabBar);
52
+ useEffect(()=>setAnchor(insets.bottomWithTabBar), [
53
+ snap.insetVersion
54
+ ]);
55
+ const gap = g9ProgressMetrics.verticalGap + snap.offset;
56
+ useEffect(()=>{
57
+ if (!snap.mounted) return void setEntered(false);
58
+ const t = startTimer(()=>setEntered(true), 16);
59
+ return ()=>stopTimer(t);
60
+ }, [
61
+ snap.mounted
62
+ ]);
63
+ const toasts = toastServiceOf(props.host);
64
+ const bottomRoom = snap.mounted && !snap.leaving && 'bottom' === snap.position && !snap.minimized && cardHeight > 0;
65
+ useEffect(()=>{
66
+ toasts.setBottomOverlay(TOAST_KEY, bottomRoom ? cardHeight + gap : null);
67
+ }, [
68
+ bottomRoom,
69
+ cardHeight,
70
+ gap
71
+ ]);
72
+ useEffect(()=>()=>toasts.setBottomOverlay(TOAST_KEY, null), []);
73
+ if (!snap.mounted) return null;
74
+ const shown = entered && !snap.leaving && null === snap.relocating;
75
+ const percent = null == snap.ratio ? null : toNativeDigits(`${Math.round(100 * snap.ratio)}%`, culture.numberingSystem);
76
+ const bottomEdge = 'bottom' === snap.position;
77
+ const edge = bottomEdge ? 'bottom' : 'top';
78
+ const offset = (bottomEdge ? anchor : insets.top) + gap;
79
+ const glide = snap.insetAnimated ? `${edge} ${g9ProgressTimings.insetGlideMs}ms cubic-bezier(0.215, 0.61, 0.355, 1)` : 'none';
80
+ const motion = `opacity ${shown ? g9ProgressTimings.appearMs : g9ProgressTimings.disappearMs}ms ease-out, transform ${shown ? g9ProgressTimings.appearMs : g9ProgressTimings.disappearMs}ms ease-out`;
81
+ const travel = bottomEdge ? 24 : -24;
82
+ if (snap.minimized) return <Draggable className="g9-progress__bubble-drag" trigger="immediate" style={{
83
+ [edge]: `${offset}px`
84
+ }} draggableProps={{
85
+ bindtap: ()=>session.setMinimized(false)
86
+ }}>
87
+ <view className="g9-progress__bubble" accessibility-element accessibility-traits="button" accessibility-label={snap.contextText}>
88
+ <G9ActivityIndicator running size={64} color="var(--g9-on-primary)" className="g9-progress__bubble-ring"/>
89
+ <text className="g9-progress__bubble-text">{null != percent ? percent : '…'}</text>
90
+ </view>
91
+ </Draggable>;
92
+ const terminal = 'success' === snap.state || 'error' === snap.state;
93
+ const tone = 'error' === snap.state ? 'error' : 'success' === snap.state ? 'success' : 'running';
94
+ const stageLine = 'canceling' === snap.state ? '' : null != (_ref = null != (_snap_detail = snap.detail) ? _snap_detail : percent) ? _ref : strings.get(G9StringKey.Loading);
95
+ return <view className={`g9-progress g9-progress--${tone} g9-progress--${edge}`} style={{
96
+ [edge]: `${offset}px`,
97
+ opacity: shown ? 1 : 0,
98
+ transform: `translateY(${shown ? 0 : travel}px)`,
99
+ transition: `${motion}${'none' === glide ? '' : `, ${glide}`}`
100
+ }} bindlayoutchange={(e)=>{
101
+ var _e_detail;
102
+ const h = Number(null == (_e_detail = e.detail) ? void 0 : _e_detail.height);
103
+ if (Number.isFinite(h) && h > 0 && h !== cardHeight) setCardHeight(h);
104
+ }}>
105
+ {terminal ? <view className="g9-progress__terminal" style={row}>
106
+ <G9Icon icon={'success' === snap.state ? 'check' : 'refresh'} size={22} color="var(--g9-on-primary)"/>
107
+ <view className="g9-progress__texts">
108
+ <text className="g9-progress__title" style={textStart}>
109
+ {(null == (_snap_terminalTitle = snap.terminalTitle) ? void 0 : _snap_terminalTitle.trim()) || strings.get('success' === snap.state ? G9StringKey.Success : G9StringKey.Error)}
110
+ </text>
111
+ {snap.terminalSubtitle ? <text className="g9-progress__subtitle" style={textStart}>
112
+ {snap.terminalSubtitle}
113
+ </text> : null}
114
+ </view>
115
+ {'error' === snap.state ? <view className="g9-progress__actions" style={row}>
116
+ {snap.canRetry ? <view className="g9-progress__retry" accessibility-element accessibility-traits="button" bindtap={()=>void session.retry()}>
117
+ <text className="g9-progress__retry-text">
118
+ {(null == (_snap_retryText = snap.retryText) ? void 0 : _snap_retryText.trim()) || strings.get(G9StringKey.Retry)}
119
+ </text>
120
+ </view> : null}
121
+ <view className="g9-progress__close" accessibility-element accessibility-traits="button" accessibility-label={strings.get(G9StringKey.Close)} bindtap={()=>session.acknowledgeFailure()}>
122
+ <G9Icon icon="close" size={18} color="var(--g9-on-primary)"/>
123
+ </view>
124
+ </view> : null}
125
+ {'success' === snap.state && snap.countdownMs > 0 ? <view className="g9-progress__countdown" style={{
126
+ animationDuration: `${snap.countdownMs}ms`
127
+ }}/> : null}
128
+ </view> : <view className="g9-progress__running" bindtap={'running' === snap.state ? ()=>session.setMinimized(true) : void 0}>
129
+ <G9ActivityIndicator running size={22}/>
130
+ <view className="g9-progress__texts">
131
+ <text className="g9-progress__title" style={textStart}>
132
+ {'canceling' === snap.state ? strings.get(G9StringKey.CancelFinishingStep) : null != (_snap_stage = snap.stage) ? _snap_stage : snap.contextText}
133
+ </text>
134
+ <text className="g9-progress__subtitle" style={textStart}>
135
+ {stageLine}
136
+ </text>
137
+ <view className="g9-progress__bar">
138
+ <view className="g9-progress__fill" style={{
139
+ transform: `scaleX(${null != (_snap_ratio = snap.ratio) ? _snap_ratio : 0})`
140
+ }}/>
141
+ </view>
142
+ </view>
143
+ {snap.queued > 0 && 'running' === snap.state ? <view className="g9-progress__queued">
144
+ <text className="g9-progress__queued-text">{`+${toNativeDigits(String(snap.queued), culture.numberingSystem)}`}</text>
145
+ </view> : null}
146
+ {'running' === snap.state ? <view className="g9-progress__cancel" accessibility-element accessibility-traits="button" accessibility-label={strings.get(G9StringKey.Cancel)} catchtap={()=>session.cancel()}>
147
+ <G9Icon icon="close" size={18} color="var(--g9-on-surface)"/>
148
+ </view> : null}
149
+ </view>}
150
+ </view>;
151
+ }
152
+ function createService(host) {
153
+ const state = {
154
+ session: null,
155
+ provider: null,
156
+ strings: null,
157
+ cancelListeners: new Set(),
158
+ sessionListeners: new Set(),
159
+ service: null
160
+ };
161
+ const publish = ()=>{
162
+ for (const listener of Array.from(state.sessionListeners))listener();
163
+ };
164
+ const toast = (key, icon)=>{
165
+ var _ref;
166
+ var _state_strings;
167
+ toastServiceOf(host).showToast(null != (_ref = null == (_state_strings = state.strings) ? void 0 : _state_strings.get(key)) ? _ref : key, 'information', {
168
+ icon
169
+ });
170
+ };
171
+ const providedPlacement = ()=>{
172
+ try {
173
+ var _state_provider;
174
+ return g9ProgressOverlayPlacement.normalize(null == (_state_provider = state.provider) ? void 0 : _state_provider.call(state, host));
175
+ } catch (error) {
176
+ console.warn('[G9] G9ProgressOverlay: the placement provider failed; using the default placement.', error);
177
+ return g9ProgressOverlayPlacement["default"];
178
+ }
179
+ };
180
+ const acquire = (position)=>{
181
+ var _state_session;
182
+ if (state.session && !state.session.disposed && state.session.getSnapshot().mounted) return state.session;
183
+ null == (_state_session = state.session) || _state_session.dispose();
184
+ const follows = null == position;
185
+ const session = new G9ProgressSession({
186
+ setTimer: (cb, ms)=>startTimer(cb, ms),
187
+ clearTimer: (h)=>stopTimer(h),
188
+ now: ()=>host.services.clock.monotonicNow(),
189
+ onCancelRequested: ()=>{
190
+ for (const listener of Array.from(state.cancelListeners))listener();
191
+ },
192
+ onCancelled: ()=>toast(G9StringKey.Cancelled, 'info'),
193
+ onCancelSlow: ()=>toast(G9StringKey.CancelFinishingStep, 'clock'),
194
+ onError: (error)=>console.warn('[G9] G9ProgressOverlay: a callback failed.', error)
195
+ }, follows ? providedPlacement() : position, follows);
196
+ state.session = session;
197
+ publish();
198
+ return session;
199
+ };
200
+ const active = ()=>state.session && !state.session.disposed && state.session.getSnapshot().mounted ? state.session : null;
201
+ state.service = {
202
+ show: (contextText, position)=>Promise.resolve(acquire(position).addLease(contextText)),
203
+ async showStandaloneFailure (reason, retryText, retryAction, position) {
204
+ const session = acquire(position);
205
+ const handle = session.addLease(reason);
206
+ session.showFailure(reason, retryText, retryAction);
207
+ handle.dispose();
208
+ return true;
209
+ },
210
+ async tryShowCurrentSuccess (message, subtitle = null) {
211
+ const session = active();
212
+ if (!session) return false;
213
+ session.showSuccess(message, subtitle);
214
+ return true;
215
+ },
216
+ async tryShowCurrentFailure (reason, retryText, retryAction) {
217
+ const session = active();
218
+ if (!session) return false;
219
+ session.showFailure(reason, retryText, retryAction);
220
+ return true;
221
+ },
222
+ report (first, stage, detail) {
223
+ var _active;
224
+ const value = null !== first && 'object' == typeof first ? first : null === first ? g9ProgressReport.indeterminate(stage, detail) : g9ProgressReport.at(first, stage, detail);
225
+ null == (_active = active()) || _active.report(value);
226
+ },
227
+ reportQueued: (count)=>{
228
+ var _active;
229
+ return null == (_active = active()) ? void 0 : _active.reportQueued(count);
230
+ },
231
+ onCancelRequested (listener) {
232
+ state.cancelListeners.add(listener);
233
+ return ()=>state.cancelListeners.delete(listener);
234
+ },
235
+ async refreshBottomInset (animate = true) {
236
+ var _active;
237
+ null == (_active = active()) || _active.refreshBottomInset(animate);
238
+ },
239
+ get placementProvider () {
240
+ return state.provider;
241
+ },
242
+ set placementProvider (provider){
243
+ state.provider = null != provider ? provider : null;
244
+ },
245
+ refreshPlacement (animate = true) {
246
+ const session = active();
247
+ if (!(null == session ? void 0 : session.followsProvider) || session.getSnapshot().minimized) return Promise.resolve();
248
+ return session.moveTo(providedPlacement(), animate);
249
+ },
250
+ get session () {
251
+ return state.session;
252
+ }
253
+ };
254
+ host.attachFeature(FEATURE, state);
255
+ host.registerLayerItem('feedback', {
256
+ key: FEATURE,
257
+ element: <ProgressLayer state={state} host={host}/>,
258
+ order: 1
259
+ });
260
+ return state;
261
+ }
262
+ function progressOverlayServiceOf(host) {
263
+ const existing = host.getFeature(FEATURE);
264
+ return (null != existing ? existing : createService(host)).service;
265
+ }
266
+ function useG9ProgressOverlay() {
267
+ return progressOverlayServiceOf(useG9Host());
268
+ }
269
+ function g9ProgressOverlay() {
270
+ return progressOverlayServiceOf(g9Hosts.require());
271
+ }
272
+ export { g9ProgressMetrics, g9ProgressOverlay, progressOverlayServiceOf, useG9ProgressOverlay };
273
+
274
+ //# sourceMappingURL=service.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.jsx","sources":["../src/service.tsx"],"sourcesContent":["import './progress-overlay.css';\nimport { startTimer, stopTimer } from '@g9tm/lynxcontrols/base';\nimport { G9ActivityIndicator } from '@g9tm/lynxcontrols/display';\nimport { type G9HostHandle, g9Hosts, useG9Host, useG9HostInsets } from '@g9tm/lynxcontrols/host';\nimport { G9Icon } from '@g9tm/lynxcontrols/icon';\nimport { useG9Culture, useG9Strings } from '@g9tm/lynxcontrols/provider';\nimport { toastServiceOf } from '@g9tm/lynxcontrols/toast';\nimport { G9StringKey, toNativeDigits } from '@g9tm/lynxcontrols-foundation';\nimport { Draggable } from '@lynx-js/lynx-ui-draggable';\nimport { type ReactNode, useEffect, useState, useSyncExternalStore } from '@lynx-js/react';\nimport {\n type G9ProgressOverlayHandle,\n type G9ProgressOverlayPlacement,\n type G9ProgressOverlayPosition,\n type G9ProgressReport,\n G9ProgressSession,\n g9ProgressOverlayPlacement,\n g9ProgressReport,\n g9ProgressTimings,\n} from './model';\n\n/** Layout constants (MAUI helper and view constants). */\nexport const g9ProgressMetrics = Object.freeze({\n horizontalGap: 16,\n verticalGap: 14,\n bubbleSize: 72,\n cancelTarget: 44,\n dragTapThreshold: 12,\n dragEdgeInset: 8,\n});\n\n/**\n * Decides where the overlay sits on the screen a host is showing (MAUI 1.3.0 `G9ProgressOverlayHelper.PlacementProvider`):\n * receives the host, returns a placement or `null`/`undefined` for the default (bottom). Read when an overlay mounts\n * and on `refreshPlacement()`; keep it cheap and free of side effects. A throwing provider falls back to the default.\n */\nexport type G9ProgressPlacementProvider = (host: G9HostHandle) => G9ProgressOverlayPlacement | null | undefined;\n\n/** The progress overlay service of a host (MAUI `G9ProgressOverlayHelper`). One shared overlay per host. */\nexport interface G9ProgressOverlayService {\n /**\n * Takes a lease on the shared overlay (MAUI `ShowAsync`); concurrent operations share one visual. An explicit\n * `position` wins and is fixed for the overlay's life; without one (MAUI 1.3.0 `null`) the `placementProvider`\n * decides and `refreshPlacement()` can move it later. Only a newly mounted overlay takes either.\n */\n show(contextText: string, position?: G9ProgressOverlayPosition | null): Promise<G9ProgressOverlayHandle>;\n /**\n * A failure banner with nothing running (MAUI `ShowStandaloneFailureAsync`); stays until retry or close. `position` as\n * in `show`.\n */\n showStandaloneFailure(\n reason: string,\n retryText: string,\n retryAction: (() => Promise<void> | void) | null,\n position?: G9ProgressOverlayPosition | null,\n ): Promise<boolean>;\n /**\n * Where an overlay shown without a position sits on this host's current screen (MAUI 1.3.0 `PlacementProvider`):\n * set it once, and call `refreshPlacement()` when the screen under the overlay changes. `null` (default): bottom.\n */\n placementProvider: G9ProgressPlacementProvider | null;\n /**\n * Re-reads `placementProvider` and moves a live overlay to its answer (MAUI 1.3.0 `RefreshPlacementAsync`): call it\n * on a tab switch or when a full-screen sheet opens or closes. `animate` (default true): an edge change fades out and\n * back in at the new edge, an offset change glides; `false` jumps. Resolves at once when nothing is mounted, when the\n * overlay was shown with an explicit position, and while it is minimized (a bubble stays where the user dragged it).\n */\n refreshPlacement(animate?: boolean): Promise<void>;\n /** Success terminal on the mounted overlay (2.2 s dwell); `false` when nothing is mounted. */\n tryShowCurrentSuccess(message: string | null, subtitle?: string | null): Promise<boolean>;\n /** Failure terminal on the mounted overlay (retry / close); `false` when nothing is mounted. */\n tryShowCurrentFailure(\n reason: string,\n retryText: string,\n retryAction: (() => Promise<void> | void) | null,\n ): Promise<boolean>;\n /** Progress in (MAUI `Report`): a report object, or `(ratio, stage?, detail?)`; ignored when nothing is mounted. */\n report(report: G9ProgressReport): void;\n report(ratio: number | null, stage?: string | null, detail?: string | null): void;\n /** \"+N waiting\" (MAUI `ReportQueued`). */\n reportQueued(count: number): void;\n /** The user tapped cancel (MAUI `CancelRequested`); the overlay is already showing Canceling. */\n onCancelRequested(listener: () => void): () => void;\n /** Re-anchor after the bottom inset changed (tab bar shown / hidden); glides 220 ms. */\n refreshBottomInset(animate?: boolean): Promise<void>;\n /** @internal the live session, for the view and tests */\n readonly session: G9ProgressSession | null;\n}\n\ninterface State {\n session: G9ProgressSession | null;\n provider: G9ProgressPlacementProvider | null;\n /** The provider strings, captured by the layer (toasts raised outside render need them). */\n strings: { get(key: G9StringKey): string } | null;\n readonly cancelListeners: Set<() => void>;\n readonly sessionListeners: Set<() => void>;\n service: G9ProgressOverlayService;\n}\n\nconst FEATURE = 'g9.progressOverlay';\nconst TOAST_KEY = 'g9.progressOverlay';\n\nfunction ProgressLayer(props: { readonly state: State; readonly host: G9HostHandle }): ReactNode {\n props.state.strings = useG9Strings();\n const session = useSyncExternalStore(\n (listener) => {\n props.state.sessionListeners.add(listener);\n return () => props.state.sessionListeners.delete(listener);\n },\n () => props.state.session,\n );\n useEffect(\n () => () => {\n props.state.session?.dispose();\n },\n [],\n );\n return session ? <ProgressOverlayView key=\"overlay\" session={session} host={props.host} /> : null;\n}\n\nfunction ProgressOverlayView(props: { readonly session: G9ProgressSession; readonly host: G9HostHandle }): ReactNode {\n const session = props.session;\n const snap = useSyncExternalStore(session.subscribe, session.getSnapshot);\n const strings = useG9Strings();\n const culture = useG9Culture();\n // A row in reading order on every engine: Lynxtron ignores CSS `direction`, so RTL reverses explicitly and pins the\n // row's own direction (as the controls' rows do, plan/specs/02 §2).\n const row = {\n flexDirection: culture.direction === 'rtl' ? ('row-reverse' as const) : ('row' as const),\n direction: 'ltr' as const,\n };\n const textStart = { textAlign: culture.direction === 'rtl' ? ('right' as const) : ('left' as const) };\n const insets = useG9HostInsets();\n const [entered, setEntered] = useState(false);\n const [cardHeight, setCardHeight] = useState(0);\n // The bottom inset is read when the overlay mounts and on refreshBottomInset (MAUI: computed, not observed).\n const [anchor, setAnchor] = useState(() => insets.bottomWithTabBar);\n useEffect(() => setAnchor(insets.bottomWithTabBar), [snap.insetVersion]);\n // The overlay's own gap plus the host's extra offset (G9ProgressOverlayPlacement, MAUI 1.3.0).\n const gap = g9ProgressMetrics.verticalGap + snap.offset;\n useEffect(() => {\n if (!snap.mounted) {\n setEntered(false);\n return;\n }\n const t = startTimer(() => setEntered(true), 16);\n return () => stopTimer(t);\n }, [snap.mounted]);\n // Toasts sit above the overlay (MAUI IG9BottomAnchoredOverlay): tell the toast stack how much room it takes.\n const toasts = toastServiceOf(props.host);\n const bottomRoom = snap.mounted && !snap.leaving && snap.position === 'bottom' && !snap.minimized && cardHeight > 0;\n useEffect(() => {\n toasts.setBottomOverlay(TOAST_KEY, bottomRoom ? cardHeight + gap : null);\n }, [bottomRoom, cardHeight, gap]);\n useEffect(() => () => toasts.setBottomOverlay(TOAST_KEY, null), []);\n\n if (!snap.mounted) return null;\n const shown = entered && !snap.leaving && snap.relocating === null;\n const percent =\n snap.ratio == null ? null : toNativeDigits(`${Math.round(snap.ratio * 100)}%`, culture.numberingSystem);\n const bottomEdge = snap.position === 'bottom';\n const edge = bottomEdge ? 'bottom' : 'top';\n const offset = (bottomEdge ? anchor : insets.top) + gap;\n const glide = snap.insetAnimated\n ? `${edge} ${g9ProgressTimings.insetGlideMs}ms cubic-bezier(0.215, 0.61, 0.355, 1)`\n : 'none';\n const motion = `opacity ${shown ? g9ProgressTimings.appearMs : g9ProgressTimings.disappearMs}ms ease-out, transform ${shown ? g9ProgressTimings.appearMs : g9ProgressTimings.disappearMs}ms ease-out`;\n const travel = bottomEdge ? 24 : -24;\n\n if (snap.minimized) {\n return (\n <Draggable\n className=\"g9-progress__bubble-drag\"\n trigger=\"immediate\"\n style={{ [edge]: `${offset}px` }}\n draggableProps={{ bindtap: () => session.setMinimized(false) }}\n >\n <view\n className=\"g9-progress__bubble\"\n accessibility-element\n accessibility-traits=\"button\"\n accessibility-label={snap.contextText}\n >\n <G9ActivityIndicator running size={64} color=\"var(--g9-on-primary)\" className=\"g9-progress__bubble-ring\" />\n <text className=\"g9-progress__bubble-text\">{percent ?? '…'}</text>\n </view>\n </Draggable>\n );\n }\n\n const terminal = snap.state === 'success' || snap.state === 'error';\n const tone = snap.state === 'error' ? 'error' : snap.state === 'success' ? 'success' : 'running';\n const stageLine = snap.state === 'canceling' ? '' : (snap.detail ?? percent ?? strings.get(G9StringKey.Loading));\n return (\n <view\n className={`g9-progress g9-progress--${tone} g9-progress--${edge}`}\n style={{\n [edge]: `${offset}px`,\n opacity: shown ? 1 : 0,\n transform: `translateY(${shown ? 0 : travel}px)`,\n transition: `${motion}${glide === 'none' ? '' : `, ${glide}`}`,\n }}\n bindlayoutchange={(e: { detail?: { height?: number } }) => {\n const h = Number(e.detail?.height);\n if (Number.isFinite(h) && h > 0 && h !== cardHeight) setCardHeight(h);\n }}\n >\n {terminal ? (\n <view className=\"g9-progress__terminal\" style={row}>\n <G9Icon icon={snap.state === 'success' ? 'check' : 'refresh'} size={22} color=\"var(--g9-on-primary)\" />\n <view className=\"g9-progress__texts\">\n <text className=\"g9-progress__title\" style={textStart}>\n {snap.terminalTitle?.trim() ||\n strings.get(snap.state === 'success' ? G9StringKey.Success : G9StringKey.Error)}\n </text>\n {snap.terminalSubtitle ? (\n <text className=\"g9-progress__subtitle\" style={textStart}>\n {snap.terminalSubtitle}\n </text>\n ) : null}\n </view>\n {snap.state === 'error' ? (\n <view className=\"g9-progress__actions\" style={row}>\n {snap.canRetry ? (\n <view\n className=\"g9-progress__retry\"\n accessibility-element\n accessibility-traits=\"button\"\n bindtap={() => void session.retry()}\n >\n <text className=\"g9-progress__retry-text\">\n {snap.retryText?.trim() || strings.get(G9StringKey.Retry)}\n </text>\n </view>\n ) : null}\n <view\n className=\"g9-progress__close\"\n accessibility-element\n accessibility-traits=\"button\"\n accessibility-label={strings.get(G9StringKey.Close)}\n bindtap={() => session.acknowledgeFailure()}\n >\n <G9Icon icon=\"close\" size={18} color=\"var(--g9-on-primary)\" />\n </view>\n </view>\n ) : null}\n {snap.state === 'success' && snap.countdownMs > 0 ? (\n <view className=\"g9-progress__countdown\" style={{ animationDuration: `${snap.countdownMs}ms` }} />\n ) : null}\n </view>\n ) : (\n <view\n className=\"g9-progress__running\"\n bindtap={snap.state === 'running' ? () => session.setMinimized(true) : undefined}\n >\n <G9ActivityIndicator running size={22} />\n <view className=\"g9-progress__texts\">\n <text className=\"g9-progress__title\" style={textStart}>\n {snap.state === 'canceling'\n ? strings.get(G9StringKey.CancelFinishingStep)\n : (snap.stage ?? snap.contextText)}\n </text>\n <text className=\"g9-progress__subtitle\" style={textStart}>\n {stageLine}\n </text>\n <view className=\"g9-progress__bar\">\n <view className=\"g9-progress__fill\" style={{ transform: `scaleX(${snap.ratio ?? 0})` }} />\n </view>\n </view>\n {snap.queued > 0 && snap.state === 'running' ? (\n <view className=\"g9-progress__queued\">\n <text className=\"g9-progress__queued-text\">{`+${toNativeDigits(String(snap.queued), culture.numberingSystem)}`}</text>\n </view>\n ) : null}\n {snap.state === 'running' ? (\n <view\n className=\"g9-progress__cancel\"\n accessibility-element\n accessibility-traits=\"button\"\n accessibility-label={strings.get(G9StringKey.Cancel)}\n catchtap={() => session.cancel()}\n >\n <G9Icon icon=\"close\" size={18} color=\"var(--g9-on-surface)\" />\n </view>\n ) : null}\n </view>\n )}\n </view>\n );\n}\n\nfunction createService(host: G9HostHandle): State {\n const state: State = {\n session: null,\n provider: null,\n strings: null,\n cancelListeners: new Set(),\n sessionListeners: new Set(),\n service: null as never,\n };\n const publish = () => {\n for (const listener of Array.from(state.sessionListeners)) listener();\n };\n const toast = (key: G9StringKey, icon: string) => {\n toastServiceOf(host).showToast(state.strings?.get(key) ?? key, 'information', { icon });\n };\n // The provider's answer for this host, or the default (a host callback must never stop progress from showing).\n const providedPlacement = (): G9ProgressOverlayPlacement => {\n try {\n return g9ProgressOverlayPlacement.normalize(state.provider?.(host));\n } catch (error) {\n console.warn('[G9] G9ProgressOverlay: the placement provider failed; using the default placement.', error);\n return g9ProgressOverlayPlacement.default;\n }\n };\n // An explicit position is fixed for the session; none asks the provider and keeps following it. Only a new session\n // takes either: a live overlay keeps its placement (moving it is refreshPlacement's job).\n const acquire = (position: G9ProgressOverlayPosition | null | undefined): G9ProgressSession => {\n if (state.session && !state.session.disposed && state.session.getSnapshot().mounted) return state.session;\n state.session?.dispose();\n const follows = position === null || position === undefined;\n const session: G9ProgressSession = new G9ProgressSession(\n {\n setTimer: (cb, ms) => startTimer(cb, ms),\n clearTimer: (h) => stopTimer(h as never),\n now: () => host.services.clock.monotonicNow(),\n onCancelRequested: () => {\n for (const listener of Array.from(state.cancelListeners)) listener();\n },\n onCancelled: () => toast(G9StringKey.Cancelled, 'info'),\n onCancelSlow: () => toast(G9StringKey.CancelFinishingStep, 'clock'),\n onError: (error) => console.warn('[G9] G9ProgressOverlay: a callback failed.', error),\n },\n follows ? providedPlacement() : position,\n follows,\n );\n state.session = session;\n publish();\n return session;\n };\n const active = () =>\n state.session && !state.session.disposed && state.session.getSnapshot().mounted ? state.session : null;\n state.service = {\n show: (contextText, position) => Promise.resolve(acquire(position).addLease(contextText)),\n async showStandaloneFailure(reason, retryText, retryAction, position) {\n const session = acquire(position);\n const handle = session.addLease(reason);\n session.showFailure(reason, retryText, retryAction);\n void handle.dispose();\n return true;\n },\n async tryShowCurrentSuccess(message, subtitle = null) {\n const session = active();\n if (!session) return false;\n session.showSuccess(message, subtitle);\n return true;\n },\n async tryShowCurrentFailure(reason, retryText, retryAction) {\n const session = active();\n if (!session) return false;\n session.showFailure(reason, retryText, retryAction);\n return true;\n },\n report(first: G9ProgressReport | number | null, stage?: string | null, detail?: string | null) {\n const value =\n first !== null && typeof first === 'object'\n ? first\n : first === null\n ? g9ProgressReport.indeterminate(stage, detail)\n : g9ProgressReport.at(first, stage, detail);\n active()?.report(value);\n },\n reportQueued: (count) => active()?.reportQueued(count),\n onCancelRequested(listener) {\n state.cancelListeners.add(listener);\n return () => state.cancelListeners.delete(listener);\n },\n async refreshBottomInset(animate = true) {\n active()?.refreshBottomInset(animate);\n },\n get placementProvider() {\n return state.provider;\n },\n set placementProvider(provider: G9ProgressPlacementProvider | null) {\n state.provider = provider ?? null;\n },\n refreshPlacement(animate = true) {\n const session = active();\n if (!session?.followsProvider || session.getSnapshot().minimized) return Promise.resolve();\n return session.moveTo(providedPlacement(), animate);\n },\n get session() {\n return state.session;\n },\n };\n host.attachFeature(FEATURE, state);\n host.registerLayerItem('feedback', { key: FEATURE, element: <ProgressLayer state={state} host={host} />, order: 1 });\n return state;\n}\n\n/** The progress overlay of a host (created once as a host feature). */\nexport function progressOverlayServiceOf(host: G9HostHandle): G9ProgressOverlayService {\n const existing = host.getFeature(FEATURE) as State | undefined;\n return (existing ?? createService(host)).service;\n}\n\n/** The progress overlay of the nearest `G9Host`. */\nexport function useG9ProgressOverlay(): G9ProgressOverlayService {\n return progressOverlayServiceOf(useG9Host());\n}\n\n/** The progress overlay of the active host, for code outside components (MAUI's static helper). */\nexport function g9ProgressOverlay(): G9ProgressOverlayService {\n return progressOverlayServiceOf(g9Hosts.require());\n}\n"],"names":["g9ProgressMetrics","Object","FEATURE","TOAST_KEY","ProgressLayer","props","useG9Strings","session","useSyncExternalStore","listener","useEffect","_props_state_session","ProgressOverlayView","_ref","_snap_stage","_snap_ratio","_snap_terminalTitle","_snap_retryText","snap","strings","culture","useG9Culture","row","textStart","insets","useG9HostInsets","entered","setEntered","useState","cardHeight","setCardHeight","anchor","setAnchor","gap","t","startTimer","stopTimer","toasts","toastServiceOf","bottomRoom","shown","percent","toNativeDigits","Math","bottomEdge","edge","offset","glide","g9ProgressTimings","motion","travel","Draggable","view","G9ActivityIndicator","text","terminal","tone","stageLine","G9StringKey","e","_e_detail","h","Number","G9Icon","undefined","String","createService","host","state","Set","publish","Array","toast","key","icon","_state_strings","providedPlacement","g9ProgressOverlayPlacement","error","console","acquire","position","_state_session","follows","G9ProgressSession","cb","ms","active","contextText","Promise","reason","retryText","retryAction","handle","message","subtitle","first","stage","detail","_active","value","g9ProgressReport","count","animate","provider","progressOverlayServiceOf","existing","useG9ProgressOverlay","useG9Host","g9ProgressOverlay","g9Hosts"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@g9tm/lynxcontrols-progress-overlay",
3
+ "version": "1.4.0",
4
+ "description": "G9ProgressOverlay: long-running operation progress with leases, cancel, minimize and retry.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "sideEffects": [
8
+ "**/*.css"
9
+ ],
10
+ "exports": {
11
+ ".": {
12
+ "source": "./src/index.ts",
13
+ "types": "./dist/index.d.ts",
14
+ "default": "./dist/index.jsx"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "README.md"
20
+ ],
21
+ "scripts": {
22
+ "build": "rslib build"
23
+ },
24
+ "dependencies": {
25
+ "@g9tm/lynxcontrols": "1.4.0",
26
+ "@g9tm/lynxcontrols-foundation": "1.4.0",
27
+ "@lynx-js/lynx-ui-draggable": "3.139.0"
28
+ },
29
+ "peerDependencies": {
30
+ "@lynx-js/react": ">=0.126.2 <0.127.0"
31
+ }
32
+ }