@ghia/native 0.0.0 → 0.11.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/LICENSE +201 -0
- package/browser.mjs +7 -0
- package/dist/aria.d.ts +72 -0
- package/dist/aria.d.ts.map +1 -0
- package/dist/aria.js +2 -0
- package/dist/aria.js.map +1 -0
- package/dist/automation/client.d.ts +243 -0
- package/dist/automation/client.d.ts.map +1 -0
- package/dist/automation/client.js +801 -0
- package/dist/automation/client.js.map +1 -0
- package/dist/automation/index.d.ts +5 -0
- package/dist/automation/index.d.ts.map +1 -0
- package/dist/automation/index.js +4 -0
- package/dist/automation/index.js.map +1 -0
- package/dist/automation/protocol.d.ts +309 -0
- package/dist/automation/protocol.d.ts.map +1 -0
- package/dist/automation/protocol.js +320 -0
- package/dist/automation/protocol.js.map +1 -0
- package/dist/blob-images.d.ts +32 -0
- package/dist/blob-images.d.ts.map +1 -0
- package/dist/blob-images.js +55 -0
- package/dist/blob-images.js.map +1 -0
- package/dist/bounds.d.ts +61 -0
- package/dist/bounds.d.ts.map +1 -0
- package/dist/bounds.js +85 -0
- package/dist/bounds.js.map +1 -0
- package/dist/clipboard-global.d.ts +11 -0
- package/dist/clipboard-global.d.ts.map +1 -0
- package/dist/clipboard-global.js +2 -0
- package/dist/clipboard-global.js.map +1 -0
- package/dist/clipboard.d.ts +19 -0
- package/dist/clipboard.d.ts.map +1 -0
- package/dist/clipboard.js +41 -0
- package/dist/clipboard.js.map +1 -0
- package/dist/cpu-throttle.d.ts +6 -0
- package/dist/cpu-throttle.d.ts.map +1 -0
- package/dist/cpu-throttle.js +42 -0
- package/dist/cpu-throttle.js.map +1 -0
- package/dist/events/data-transfer.d.ts +23 -0
- package/dist/events/data-transfer.d.ts.map +1 -0
- package/dist/events/data-transfer.js +97 -0
- package/dist/events/data-transfer.js.map +1 -0
- package/dist/events/dispatch.d.ts +144 -0
- package/dist/events/dispatch.d.ts.map +1 -0
- package/dist/events/dispatch.js +241 -0
- package/dist/events/dispatch.js.map +1 -0
- package/dist/events/drag.d.ts +21 -0
- package/dist/events/drag.d.ts.map +1 -0
- package/dist/events/drag.js +111 -0
- package/dist/events/drag.js.map +1 -0
- package/dist/events/event-props.d.ts +19 -0
- package/dist/events/event-props.d.ts.map +1 -0
- package/dist/events/event-props.js +104 -0
- package/dist/events/event-props.js.map +1 -0
- package/dist/events/keyboard-defaults.d.ts +18 -0
- package/dist/events/keyboard-defaults.d.ts.map +1 -0
- package/dist/events/keyboard-defaults.js +121 -0
- package/dist/events/keyboard-defaults.js.map +1 -0
- package/dist/events/listeners.d.ts +18 -0
- package/dist/events/listeners.d.ts.map +1 -0
- package/dist/events/listeners.js +49 -0
- package/dist/events/listeners.js.map +1 -0
- package/dist/events/route.d.ts +17 -0
- package/dist/events/route.d.ts.map +1 -0
- package/dist/events/route.js +36 -0
- package/dist/events/route.js.map +1 -0
- package/dist/events/types.d.ts +269 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +2 -0
- package/dist/events/types.js.map +1 -0
- package/dist/events/window-target.d.ts +120 -0
- package/dist/events/window-target.d.ts.map +1 -0
- package/dist/events/window-target.js +311 -0
- package/dist/events/window-target.js.map +1 -0
- package/dist/eyedropper.d.ts +33 -0
- package/dist/eyedropper.d.ts.map +1 -0
- package/dist/eyedropper.js +66 -0
- package/dist/eyedropper.js.map +1 -0
- package/dist/focus.d.ts +18 -0
- package/dist/focus.d.ts.map +1 -0
- package/dist/focus.js +26 -0
- package/dist/focus.js.map +1 -0
- package/dist/fonts.d.ts +12 -0
- package/dist/fonts.d.ts.map +1 -0
- package/dist/fonts.js +17 -0
- package/dist/fonts.js.map +1 -0
- package/dist/forms.d.ts +10 -0
- package/dist/forms.d.ts.map +1 -0
- package/dist/forms.js +9 -0
- package/dist/forms.js.map +1 -0
- package/dist/host-runtime.d.ts +108 -0
- package/dist/host-runtime.d.ts.map +1 -0
- package/dist/host-runtime.js +213 -0
- package/dist/host-runtime.js.map +1 -0
- package/dist/host.d.ts +2403 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +30 -0
- package/dist/host.js.map +1 -0
- package/dist/idle-gc.d.ts +36 -0
- package/dist/idle-gc.d.ts.map +1 -0
- package/dist/idle-gc.js +70 -0
- package/dist/idle-gc.js.map +1 -0
- package/dist/keyframes.d.ts +108 -0
- package/dist/keyframes.d.ts.map +1 -0
- package/dist/keyframes.js +107 -0
- package/dist/keyframes.js.map +1 -0
- package/dist/layout-animation.d.ts +38 -0
- package/dist/layout-animation.d.ts.map +1 -0
- package/dist/layout-animation.js +41 -0
- package/dist/layout-animation.js.map +1 -0
- package/dist/match-media.d.ts +62 -0
- package/dist/match-media.d.ts.map +1 -0
- package/dist/match-media.js +272 -0
- package/dist/match-media.js.map +1 -0
- package/dist/media-query.d.ts +21 -0
- package/dist/media-query.d.ts.map +1 -0
- package/dist/media-query.js +599 -0
- package/dist/media-query.js.map +1 -0
- package/dist/motion-bindings.d.ts +36 -0
- package/dist/motion-bindings.d.ts.map +1 -0
- package/dist/motion-bindings.js +107 -0
- package/dist/motion-bindings.js.map +1 -0
- package/dist/motion-config.d.ts +20 -0
- package/dist/motion-config.d.ts.map +1 -0
- package/dist/motion-config.js +51 -0
- package/dist/motion-config.js.map +1 -0
- package/dist/motion-span.d.ts +57 -0
- package/dist/motion-span.d.ts.map +1 -0
- package/dist/motion-span.js +150 -0
- package/dist/motion-span.js.map +1 -0
- package/dist/motion-value.d.ts +269 -0
- package/dist/motion-value.d.ts.map +1 -0
- package/dist/motion-value.js +941 -0
- package/dist/motion-value.js.map +1 -0
- package/dist/motion-variants.d.ts +190 -0
- package/dist/motion-variants.d.ts.map +1 -0
- package/dist/motion-variants.js +249 -0
- package/dist/motion-variants.js.map +1 -0
- package/dist/mutations.d.ts +65 -0
- package/dist/mutations.d.ts.map +1 -0
- package/dist/mutations.js +320 -0
- package/dist/mutations.js.map +1 -0
- package/dist/nativeview.d.ts +10 -0
- package/dist/nativeview.d.ts.map +1 -0
- package/dist/nativeview.js +92 -0
- package/dist/nativeview.js.map +1 -0
- package/dist/observers.d.ts +92 -0
- package/dist/observers.d.ts.map +1 -0
- package/dist/observers.js +579 -0
- package/dist/observers.js.map +1 -0
- package/dist/presence.d.ts +63 -0
- package/dist/presence.d.ts.map +1 -0
- package/dist/presence.js +54 -0
- package/dist/presence.js.map +1 -0
- package/dist/renderer-state.d.ts +155 -0
- package/dist/renderer-state.d.ts.map +1 -0
- package/dist/renderer-state.js +302 -0
- package/dist/renderer-state.js.map +1 -0
- package/dist/reorder.d.ts +63 -0
- package/dist/reorder.d.ts.map +1 -0
- package/dist/reorder.js +303 -0
- package/dist/reorder.js.map +1 -0
- package/dist/runtime.d.ts +23 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +157 -0
- package/dist/runtime.js.map +1 -0
- package/dist/screen.d.ts +8 -0
- package/dist/screen.d.ts.map +1 -0
- package/dist/screen.js +16 -0
- package/dist/screen.js.map +1 -0
- package/dist/scroll.d.ts +79 -0
- package/dist/scroll.d.ts.map +1 -0
- package/dist/scroll.js +170 -0
- package/dist/scroll.js.map +1 -0
- package/dist/style-images.d.ts +20 -0
- package/dist/style-images.d.ts.map +1 -0
- package/dist/style-images.js +57 -0
- package/dist/style-images.js.map +1 -0
- package/dist/svg.d.ts +16 -0
- package/dist/svg.d.ts.map +1 -0
- package/dist/svg.js +119 -0
- package/dist/svg.js.map +1 -0
- package/dist/testing.d.ts +811 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +1187 -0
- package/dist/testing.js.map +1 -0
- package/dist/text-match.d.ts +8 -0
- package/dist/text-match.d.ts.map +1 -0
- package/dist/text-match.js +10 -0
- package/dist/text-match.js.map +1 -0
- package/dist/text-selection.d.ts +34 -0
- package/dist/text-selection.d.ts.map +1 -0
- package/dist/text-selection.js +23 -0
- package/dist/text-selection.js.map +1 -0
- package/dist/universal-style.d.ts +22 -0
- package/dist/universal-style.d.ts.map +1 -0
- package/dist/universal-style.js +58 -0
- package/dist/universal-style.js.map +1 -0
- package/dist/web-animations.d.ts +300 -0
- package/dist/web-animations.d.ts.map +1 -0
- package/dist/web-animations.js +1032 -0
- package/dist/web-animations.js.map +1 -0
- package/dist/webview.d.ts +39 -0
- package/dist/webview.d.ts.map +1 -0
- package/dist/webview.js +26 -0
- package/dist/webview.js.map +1 -0
- package/gpuix-native.darwin-arm64.node +4 -0
- package/index.cjs +789 -0
- package/index.d.ts +2603 -0
- package/index.js +729 -0
- package/package.json +96 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../js/presence.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,CAAA;AAExD;;;;GAIG;AACH,MAAM,MAAM,UAAU,CAAC,KAAK,SAAS,MAAM,IACvC,KAAK,GAEL;IAAE,IAAI,CAAC,MAAM,EAAE,OAAO,GAAG,KAAK,CAAA;CAAE,CAAC,MAAM,CAAC,CAAA;AAE5C,wBAAgB,WAAW,CAAC,KAAK,SAAS,MAAM,EAC9C,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,SAAS,EACnC,MAAM,EAAE,OAAO,GACd,KAAK,GAAG,SAAS,CAEnB;AAED,+EAA+E;AAC/E,MAAM,MAAM,gBAAgB,CAAC,KAAK,SAAS;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG;IACpF,IAAI,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAC7C,uGAAuG;IACvG,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,UAAU,CAAA;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,CAAC,CAAA;IACT,SAAS,EAAE,CAAC,CAAA;IACZ,WAAW,EAAE,CAAC,CAAA;IACd,YAAY,EAAE,CAAC,CAAA;IACf,UAAU,EAAE,CAAC,CAAA;CACd,CAAA;AAED,sGAAsG;AACtG,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,aAAa,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG,SAAS,GAAG,cAAc,CAexG;AAED,KAAK,UAAU,GAAG;IAChB,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,aAAa,GAAG,IAAI,CAAA;IAC9D,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA;CAC/D,CAAA;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,UAAU,EACpB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,cAAc,GAAG,SAAS,CAgB5B"}
|
package/dist/presence.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/// What `AnimatePresence` means to the adapters, shared by React and Solid:
|
|
2
|
+
/// the `mode` prop, `exit` as a function of `custom`, and the box a
|
|
3
|
+
/// `popLayout` child keeps while it leaves.
|
|
4
|
+
export function resolveExit(exit, custom) {
|
|
5
|
+
return typeof exit === "function" ? exit(custom) : exit;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* The style that paints `child` exactly where it painted before it left the
|
|
9
|
+
* flow. An absolute box is placed from the parent's padding box (inside its
|
|
10
|
+
* border), moves with the parent's scrolled content, and sits `margin` away
|
|
11
|
+
* from its offsets, so the margin is zeroed rather than counted twice.
|
|
12
|
+
* `parent` is `undefined` for a child of the window root, which sits at the
|
|
13
|
+
* window origin.
|
|
14
|
+
*/
|
|
15
|
+
export function popLayoutStyle(child, parent) {
|
|
16
|
+
const originX = parent === undefined ? 0 : parent.bounds.x + parent.bounds.clientLeft - parent.scrollLeft;
|
|
17
|
+
const originY = parent === undefined ? 0 : parent.bounds.y + parent.bounds.clientTop - parent.scrollTop;
|
|
18
|
+
return {
|
|
19
|
+
position: "absolute",
|
|
20
|
+
top: child.y - originY,
|
|
21
|
+
left: child.x - originX,
|
|
22
|
+
width: child.width,
|
|
23
|
+
height: child.height,
|
|
24
|
+
margin: 0,
|
|
25
|
+
marginTop: 0,
|
|
26
|
+
marginRight: 0,
|
|
27
|
+
marginBottom: 0,
|
|
28
|
+
marginLeft: 0,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The style that keeps an element where it last painted, or `undefined` when
|
|
33
|
+
* it has not painted (nothing to hold in place).
|
|
34
|
+
*/
|
|
35
|
+
export function measurePopLayout(renderer, childId, parentId) {
|
|
36
|
+
if (!renderer.getElementBounds) {
|
|
37
|
+
throw new Error('AnimatePresence mode="popLayout" needs a renderer with getElementBounds');
|
|
38
|
+
}
|
|
39
|
+
const child = renderer.getElementBounds(childId);
|
|
40
|
+
if (child === null)
|
|
41
|
+
return undefined;
|
|
42
|
+
if (parentId === undefined)
|
|
43
|
+
return popLayoutStyle(child, undefined);
|
|
44
|
+
if (!renderer.getScrollMetrics) {
|
|
45
|
+
throw new Error('AnimatePresence mode="popLayout" needs a renderer with getScrollMetrics');
|
|
46
|
+
}
|
|
47
|
+
const bounds = renderer.getElementBounds(parentId);
|
|
48
|
+
const metrics = renderer.getScrollMetrics(parentId);
|
|
49
|
+
if (bounds === null || metrics === null) {
|
|
50
|
+
throw new Error(`AnimatePresence mode="popLayout": parent element ${parentId} has not painted`);
|
|
51
|
+
}
|
|
52
|
+
return popLayoutStyle(child, { bounds, scrollLeft: metrics[0], scrollTop: metrics[1] });
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=presence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presence.js","sourceRoot":"","sources":["../js/presence.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,oEAAoE;AACpE,4CAA4C;AAsB5C,MAAM,UAAU,WAAW,CACzB,IAAmC,EACnC,MAAe;IAEf,OAAO,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACzD,CAAC;AA6BD;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,KAAoB,EAAE,MAAmC;IACtF,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAA;IACzG,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAA;IACvG,OAAO;QACL,QAAQ,EAAE,UAAU;QACpB,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,OAAO;QACvB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;QACZ,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;QACf,UAAU,EAAE,CAAC;KACd,CAAA;AACH,CAAC;AAOD;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAoB,EACpB,OAAe,EACf,QAA4B;IAE5B,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAA;IAC5F,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAChD,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAA;IACpC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;IACnE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAA;IAC5F,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;IAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;IACnD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,oDAAoD,QAAQ,kBAAkB,CAAC,CAAA;IACjG,CAAC;IACD,OAAO,cAAc,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AACzF,CAAC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import type { EventPayload } from "../index.js";
|
|
2
|
+
import { type DomDispatchResult } from "./events/dispatch.js";
|
|
3
|
+
import { GpuixEventTarget } from "./events/window-target.js";
|
|
4
|
+
import type { ElementIdAllocator, EventHandlerMap, HostEventHandler, KeyEvent, NativeRenderer, WindowEventHandler, WindowKeyEventHandler } from "./host.js";
|
|
5
|
+
export interface RendererRootHandlers {
|
|
6
|
+
eventHandlers?: EventHandlerMap;
|
|
7
|
+
onWindowKeyDown?: WindowKeyEventHandler;
|
|
8
|
+
onWindowKeyUp?: WindowKeyEventHandler;
|
|
9
|
+
onSelectionChange?: WindowEventHandler;
|
|
10
|
+
onAppearanceChange?: WindowEventHandler;
|
|
11
|
+
/** See `WindowKeyEventHandlers.tabNavigation`. Defaults to true. */
|
|
12
|
+
tabNavigation?: boolean;
|
|
13
|
+
onEvent?: (event: EventPayload) => void;
|
|
14
|
+
/**
|
|
15
|
+
* Wraps each dispatch, for a framework that must flush around it. Synchronous
|
|
16
|
+
* events need their outcome before native continues, so it has to call
|
|
17
|
+
* `dispatch` before it returns.
|
|
18
|
+
*/
|
|
19
|
+
schedule?: (dispatch: () => void) => void;
|
|
20
|
+
}
|
|
21
|
+
export interface RendererRootBinding {
|
|
22
|
+
readonly ids: ElementIdAllocator;
|
|
23
|
+
readonly eventHandlers: EventHandlerMap;
|
|
24
|
+
readonly windowKeyEventId: number;
|
|
25
|
+
readonly windowSelectionEventId: number;
|
|
26
|
+
readonly windowAppearanceEventId: number;
|
|
27
|
+
detach(): boolean;
|
|
28
|
+
}
|
|
29
|
+
/** What a synchronous handler tells native about an event. */
|
|
30
|
+
export interface SyncDispatchResult {
|
|
31
|
+
defaultPrevented: boolean;
|
|
32
|
+
propagationStopped: boolean;
|
|
33
|
+
/** Set for a `dragover`: what the drop would do. Native tells the OS, for a drag of files. */
|
|
34
|
+
dropEffect?: DomDispatchResult["dropEffect"];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* One open overlay: a dialog, menu, popover or tooltip. Only the top layer
|
|
38
|
+
* closes on Escape. A layer is above its parent and above every layer that
|
|
39
|
+
* opened before it.
|
|
40
|
+
*/
|
|
41
|
+
export interface DismissLayer {
|
|
42
|
+
/** The layer this one is nested in, such as the Dialog around a Select. */
|
|
43
|
+
readonly parent?: DismissLayer;
|
|
44
|
+
/** Escape reached the window and no handler prevented it. */
|
|
45
|
+
onEscapeKeyDown(event: KeyEvent): void;
|
|
46
|
+
/**
|
|
47
|
+
* Element to focus when the layer opens, or null to leave focus. Called
|
|
48
|
+
* only when the layer lands on top, so the innermost of several layers that
|
|
49
|
+
* open together takes focus.
|
|
50
|
+
*/
|
|
51
|
+
initialFocus?(): number | null;
|
|
52
|
+
/**
|
|
53
|
+
* Element to focus when the layer closes, or null to leave focus.
|
|
54
|
+
* `previous` is the focus from before the layer opened. Not called when the
|
|
55
|
+
* parent layer closed first, because the parent restores for both.
|
|
56
|
+
*/
|
|
57
|
+
finalFocus?(previous: number | null): number | null;
|
|
58
|
+
}
|
|
59
|
+
export interface PushLayerOptions {
|
|
60
|
+
/**
|
|
61
|
+
* The focused element from before this layer's elements were committed.
|
|
62
|
+
* Read it before the commit: once committed, an `autoFocus` inside the
|
|
63
|
+
* layer may already have taken focus.
|
|
64
|
+
*/
|
|
65
|
+
previousFocus?: number | null;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Sends an error thrown while a synchronous handler ran to `report`, and tells
|
|
69
|
+
* native the event was not handled. Errors a DOM handler throws never get this
|
|
70
|
+
* far: the dispatch reports them itself and carries on.
|
|
71
|
+
*/
|
|
72
|
+
export declare function reportSyncErrors(dispatch: (event: EventPayload) => SyncDispatchResult, report: (error: unknown) => void): (event: EventPayload) => SyncDispatchResult;
|
|
73
|
+
/** What a motion value hears from the renderer's per-frame sampling. */
|
|
74
|
+
export interface MotionValueSink {
|
|
75
|
+
change(value: unknown): void;
|
|
76
|
+
animationStart(): void;
|
|
77
|
+
animationComplete(): void;
|
|
78
|
+
}
|
|
79
|
+
export interface RendererState {
|
|
80
|
+
readonly ids: ElementIdAllocator;
|
|
81
|
+
attach(handlers?: RendererRootHandlers): RendererRootBinding;
|
|
82
|
+
/**
|
|
83
|
+
* Handles an event native queued. Returns whether anything was there to
|
|
84
|
+
* handle it.
|
|
85
|
+
*/
|
|
86
|
+
dispatch(event: EventPayload): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* Handles an event native is waiting on and returns what its handlers
|
|
89
|
+
* decided. The handler for `setSyncEventHandler`. Everything `dispatch` does,
|
|
90
|
+
* but now: native acts on the outcome as soon as this returns.
|
|
91
|
+
*/
|
|
92
|
+
dispatchSync(event: EventPayload): SyncDispatchResult;
|
|
93
|
+
/**
|
|
94
|
+
* Where an error thrown by an event handler goes: the renderer's `onError`.
|
|
95
|
+
* Without one it is reported as uncaught, like a DOM listener's.
|
|
96
|
+
*/
|
|
97
|
+
reportError(error: unknown): void;
|
|
98
|
+
setErrorHandler(onError: ((error: unknown) => void) | undefined): void;
|
|
99
|
+
current(): RendererRootBinding | undefined;
|
|
100
|
+
/** Open a layer. Call the returned function when it closes. */
|
|
101
|
+
pushLayer(layer: DismissLayer, options?: PushLayerOptions): () => void;
|
|
102
|
+
/**
|
|
103
|
+
* Listen for the window environment `matchMedia` reads changing: the OS
|
|
104
|
+
* accessibility preferences, or the appearance. Independent of any mounted
|
|
105
|
+
* root. The renderer sends `mediaChange` only while a listener exists.
|
|
106
|
+
*/
|
|
107
|
+
subscribeMedia(listener: () => void): () => void;
|
|
108
|
+
/**
|
|
109
|
+
* Receive the `motionValue*` events of one value. Independent of any mounted
|
|
110
|
+
* root. A renderer holds one sink per value id.
|
|
111
|
+
*/
|
|
112
|
+
subscribeMotionValue(id: number, sink: MotionValueSink): () => void;
|
|
113
|
+
}
|
|
114
|
+
export type ActiveRoot = RendererRootBinding & {
|
|
115
|
+
handlers: RendererRootHandlers;
|
|
116
|
+
/** Where an error a handler of this root throws goes. See `RendererState.reportError`. */
|
|
117
|
+
reportError(error: unknown): void;
|
|
118
|
+
/** The element the adapter installed for an id with `installElementSource`. */
|
|
119
|
+
elementById(id: number): object | undefined;
|
|
120
|
+
/** Listens at the window level for this root only: the `onKeyDown` / `onKeyUp` options. */
|
|
121
|
+
scoped: GpuixEventTarget;
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* The renderer of the most recently mounted root that is still mounted, which
|
|
125
|
+
* is "the window" for code that has no component to ask, such as the global
|
|
126
|
+
* `matchMedia`.
|
|
127
|
+
*/
|
|
128
|
+
export declare function mountedRenderer(): NativeRenderer | undefined;
|
|
129
|
+
/** Register an open overlay on this renderer's layer stack. */
|
|
130
|
+
export declare function pushDismissLayer(renderer: NativeRenderer, layer: DismissLayer, options?: PushLayerOptions): () => void;
|
|
131
|
+
export declare function createRendererState(renderer: NativeRenderer): RendererState;
|
|
132
|
+
export declare function registerEventHandler(eventHandlers: EventHandlerMap, elementId: number, eventType: string, handler: HostEventHandler): void;
|
|
133
|
+
export declare function unregisterEventHandler(eventHandlers: EventHandlerMap, elementId: number, eventType: string): void;
|
|
134
|
+
export declare function unregisterEventHandlers(eventHandlers: EventHandlerMap, elementId: number): void;
|
|
135
|
+
/** Anything a framework hands out for a mounted host element. */
|
|
136
|
+
export interface FocusableNode {
|
|
137
|
+
readonly id: number;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Where an overlay moves focus when it opens or closes, like Base UI's
|
|
141
|
+
* `initialFocus` / `finalFocus`:
|
|
142
|
+
*
|
|
143
|
+
* - `true` or unset: the overlay's default target
|
|
144
|
+
* - `false`: focus does not move
|
|
145
|
+
* - an element or a ref to one: that element
|
|
146
|
+
* - a function: returns one of the above; `null` means the default
|
|
147
|
+
*/
|
|
148
|
+
type FocusTargetValue<Node extends FocusableNode> = boolean | Node | {
|
|
149
|
+
readonly current: Node | null;
|
|
150
|
+
};
|
|
151
|
+
export type FocusTarget<Node extends FocusableNode = FocusableNode> = FocusTargetValue<Node> | (() => FocusTargetValue<Node> | null | undefined);
|
|
152
|
+
/** Resolve a `FocusTarget` to an element id, or null when focus must stay. */
|
|
153
|
+
export declare function resolveFocusTarget<Node extends FocusableNode>(target: FocusTarget<Node> | undefined, fallback: () => number | null): number | null;
|
|
154
|
+
export {};
|
|
155
|
+
//# sourceMappingURL=renderer-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer-state.d.ts","sourceRoot":"","sources":["../js/renderer-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import { reportUncaught } from "./events/dispatch.js";
|
|
2
|
+
import { createDragDispatcher } from "./events/drag.js";
|
|
3
|
+
import { handlesEvent, normalizeEventType, runRootEvent } from "./events/keyboard-defaults.js";
|
|
4
|
+
import { elementOf, GpuixEventTarget, noteFocusEvent } from "./events/window-target.js";
|
|
5
|
+
import { deliverObservation } from "./observers.js";
|
|
6
|
+
import { shapeScrollEvent } from "./scroll.js";
|
|
7
|
+
import { deliverWebAnimationEvent, isWebAnimationEvent } from "./web-animations.js";
|
|
8
|
+
function isAncestor(ancestor, layer) {
|
|
9
|
+
for (let current = layer.parent; current; current = current.parent) {
|
|
10
|
+
if (current === ancestor)
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Sends an error thrown while a synchronous handler ran to `report`, and tells
|
|
17
|
+
* native the event was not handled. Errors a DOM handler throws never get this
|
|
18
|
+
* far: the dispatch reports them itself and carries on.
|
|
19
|
+
*/
|
|
20
|
+
export function reportSyncErrors(dispatch, report) {
|
|
21
|
+
return (event) => {
|
|
22
|
+
try {
|
|
23
|
+
return dispatch(event);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
report(error);
|
|
27
|
+
return { defaultPrevented: false, propagationStopped: false };
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const STATE_KEY = Symbol.for("@ghia/native/renderer-states");
|
|
32
|
+
const MOUNTED_KEY = Symbol.for("@ghia/native/mounted-renderer");
|
|
33
|
+
/** Mount order, oldest first. Shared through `globalThis` like the renderer states. */
|
|
34
|
+
function mountedRenderers() {
|
|
35
|
+
const existing = Reflect.get(globalThis, MOUNTED_KEY);
|
|
36
|
+
if (existing)
|
|
37
|
+
return existing;
|
|
38
|
+
const created = [];
|
|
39
|
+
Reflect.set(globalThis, MOUNTED_KEY, created);
|
|
40
|
+
return created;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The renderer of the most recently mounted root that is still mounted, which
|
|
44
|
+
* is "the window" for code that has no component to ask, such as the global
|
|
45
|
+
* `matchMedia`.
|
|
46
|
+
*/
|
|
47
|
+
export function mountedRenderer() {
|
|
48
|
+
return mountedRenderers().at(-1);
|
|
49
|
+
}
|
|
50
|
+
/** Register an open overlay on this renderer's layer stack. */
|
|
51
|
+
export function pushDismissLayer(renderer, layer, options) {
|
|
52
|
+
return createRendererState(renderer).pushLayer(layer, options);
|
|
53
|
+
}
|
|
54
|
+
function allStates() {
|
|
55
|
+
const existing = Reflect.get(globalThis, STATE_KEY);
|
|
56
|
+
if (existing)
|
|
57
|
+
return existing;
|
|
58
|
+
const states = new WeakMap();
|
|
59
|
+
Reflect.set(globalThis, STATE_KEY, states);
|
|
60
|
+
return states;
|
|
61
|
+
}
|
|
62
|
+
export function createRendererState(renderer) {
|
|
63
|
+
const existing = allStates().get(renderer);
|
|
64
|
+
if (existing)
|
|
65
|
+
return existing;
|
|
66
|
+
const ids = { nextElementId: 0 };
|
|
67
|
+
let generation = 0;
|
|
68
|
+
let active;
|
|
69
|
+
const layers = [];
|
|
70
|
+
const dispatchDrag = createDragDispatcher(() => {
|
|
71
|
+
if (!renderer.cancelDrag)
|
|
72
|
+
throw new Error("This renderer does not support cancelDrag");
|
|
73
|
+
renderer.cancelDrag();
|
|
74
|
+
});
|
|
75
|
+
const runEvent = (root, event) => runRootEvent(root, event, {
|
|
76
|
+
renderer,
|
|
77
|
+
topLayer: () => layers.at(-1)?.layer,
|
|
78
|
+
dispatchDrag,
|
|
79
|
+
});
|
|
80
|
+
let onError;
|
|
81
|
+
const mediaListeners = new Set();
|
|
82
|
+
const motionValueSinks = new Map();
|
|
83
|
+
const state = {
|
|
84
|
+
ids,
|
|
85
|
+
attach(handlers = {}) {
|
|
86
|
+
if (active) {
|
|
87
|
+
throw new Error("This renderer already drives a mounted GPUIX root. One renderer owns one window, one native root id, and one event map, so a second root would silently take both over. Unmount the first root first.");
|
|
88
|
+
}
|
|
89
|
+
generation += 1;
|
|
90
|
+
const eventHandlers = handlers.eventHandlers ?? new Map();
|
|
91
|
+
const scoped = new GpuixEventTarget();
|
|
92
|
+
if (handlers.onWindowKeyDown) {
|
|
93
|
+
const onKeyDown = handlers.onWindowKeyDown;
|
|
94
|
+
scoped.addEventListener("keydown", (event) => onKeyDown(event, renderer));
|
|
95
|
+
}
|
|
96
|
+
if (handlers.onWindowKeyUp) {
|
|
97
|
+
const onKeyUp = handlers.onWindowKeyUp;
|
|
98
|
+
scoped.addEventListener("keyup", (event) => onKeyUp(event, renderer));
|
|
99
|
+
}
|
|
100
|
+
const binding = {
|
|
101
|
+
ids,
|
|
102
|
+
handlers,
|
|
103
|
+
eventHandlers,
|
|
104
|
+
reportError: (error) => state.reportError(error),
|
|
105
|
+
elementById: (id) => elementOf(renderer, id),
|
|
106
|
+
scoped,
|
|
107
|
+
windowKeyEventId: generation,
|
|
108
|
+
windowSelectionEventId: generation,
|
|
109
|
+
windowAppearanceEventId: generation,
|
|
110
|
+
detach() {
|
|
111
|
+
if (active !== binding)
|
|
112
|
+
return false;
|
|
113
|
+
active = undefined;
|
|
114
|
+
const mounted = mountedRenderers();
|
|
115
|
+
mounted.splice(mounted.indexOf(renderer), 1);
|
|
116
|
+
return true;
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
active = binding;
|
|
120
|
+
mountedRenderers().push(renderer);
|
|
121
|
+
return binding;
|
|
122
|
+
},
|
|
123
|
+
dispatch(received) {
|
|
124
|
+
if (received.eventType === "mediaChange") {
|
|
125
|
+
for (const listener of [...mediaListeners])
|
|
126
|
+
listener();
|
|
127
|
+
return mediaListeners.size > 0;
|
|
128
|
+
}
|
|
129
|
+
if (received.eventType.startsWith("motionValue")) {
|
|
130
|
+
const sink = motionValueSinks.get(received.elementId);
|
|
131
|
+
if (!sink)
|
|
132
|
+
return false;
|
|
133
|
+
switch (received.eventType) {
|
|
134
|
+
case "motionValueChange":
|
|
135
|
+
if (received.value === undefined) {
|
|
136
|
+
throw new Error("A motionValueChange event arrived without its value");
|
|
137
|
+
}
|
|
138
|
+
sink.change(JSON.parse(received.value));
|
|
139
|
+
return true;
|
|
140
|
+
case "motionValueAnimationStart":
|
|
141
|
+
sink.animationStart();
|
|
142
|
+
return true;
|
|
143
|
+
case "motionValueAnimationComplete":
|
|
144
|
+
sink.animationComplete();
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (isWebAnimationEvent(received.eventType)) {
|
|
149
|
+
// Not a DOM event: no app listener, `on*` prop or `onEvent` hears it.
|
|
150
|
+
deliverWebAnimationEvent(renderer, received);
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
const root = active;
|
|
154
|
+
if (!root)
|
|
155
|
+
return false;
|
|
156
|
+
if (received.eventType === "focusin")
|
|
157
|
+
noteFocusEvent(renderer);
|
|
158
|
+
const event = shapeScrollEvent(normalizeEventType(received));
|
|
159
|
+
if (deliverObservation(renderer, event))
|
|
160
|
+
return true;
|
|
161
|
+
if (!handlesEvent(root, event))
|
|
162
|
+
return false;
|
|
163
|
+
const run = () => {
|
|
164
|
+
runEvent(root, event);
|
|
165
|
+
root.handlers.onEvent?.(received);
|
|
166
|
+
};
|
|
167
|
+
if (root.handlers.schedule)
|
|
168
|
+
root.handlers.schedule(run);
|
|
169
|
+
else
|
|
170
|
+
run();
|
|
171
|
+
return true;
|
|
172
|
+
},
|
|
173
|
+
dispatchSync(received) {
|
|
174
|
+
const root = active;
|
|
175
|
+
if (received.eventType === "focusin")
|
|
176
|
+
noteFocusEvent(renderer);
|
|
177
|
+
const event = normalizeEventType(received);
|
|
178
|
+
if (!root || !handlesEvent(root, event)) {
|
|
179
|
+
// Nobody can accept a drop here, and native would otherwise leave the OS its default.
|
|
180
|
+
return event.eventType === "dragover"
|
|
181
|
+
? { defaultPrevented: false, propagationStopped: false, dropEffect: "none" }
|
|
182
|
+
: { defaultPrevented: false, propagationStopped: false };
|
|
183
|
+
}
|
|
184
|
+
let result;
|
|
185
|
+
const run = () => {
|
|
186
|
+
result = runEvent(root, event);
|
|
187
|
+
root.handlers.onEvent?.(received);
|
|
188
|
+
};
|
|
189
|
+
if (root.handlers.schedule)
|
|
190
|
+
root.handlers.schedule(run);
|
|
191
|
+
else
|
|
192
|
+
run();
|
|
193
|
+
if (!result) {
|
|
194
|
+
throw new Error("The schedule handler did not run the dispatch before returning. A synchronous event needs its outcome now, so schedule must call it synchronously.");
|
|
195
|
+
}
|
|
196
|
+
return result;
|
|
197
|
+
},
|
|
198
|
+
reportError: (error) => (onError ?? reportUncaught)(error),
|
|
199
|
+
setErrorHandler(handler) {
|
|
200
|
+
onError = handler;
|
|
201
|
+
},
|
|
202
|
+
current: () => active,
|
|
203
|
+
subscribeMedia(listener) {
|
|
204
|
+
mediaListeners.add(listener);
|
|
205
|
+
if (mediaListeners.size === 1) {
|
|
206
|
+
try {
|
|
207
|
+
renderer.setWindowMediaChange?.(true);
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
mediaListeners.delete(listener);
|
|
211
|
+
throw error;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return () => {
|
|
215
|
+
if (!mediaListeners.delete(listener))
|
|
216
|
+
return;
|
|
217
|
+
if (mediaListeners.size === 0)
|
|
218
|
+
renderer.setWindowMediaChange?.(false);
|
|
219
|
+
};
|
|
220
|
+
},
|
|
221
|
+
subscribeMotionValue(id, sink) {
|
|
222
|
+
if (motionValueSinks.has(id)) {
|
|
223
|
+
throw new Error(`Motion value ${id} already has a sink on this renderer`);
|
|
224
|
+
}
|
|
225
|
+
motionValueSinks.set(id, sink);
|
|
226
|
+
return () => {
|
|
227
|
+
if (motionValueSinks.get(id) === sink)
|
|
228
|
+
motionValueSinks.delete(id);
|
|
229
|
+
};
|
|
230
|
+
},
|
|
231
|
+
pushLayer(layer, options = {}) {
|
|
232
|
+
const entry = {
|
|
233
|
+
layer,
|
|
234
|
+
previous: options.previousFocus ?? renderer.getFocusedElementId?.() ?? null,
|
|
235
|
+
};
|
|
236
|
+
// A framework can open a nested layer before its parent in one commit
|
|
237
|
+
// (React runs child effects first), so nesting decides, not call order.
|
|
238
|
+
const firstChild = layers.findIndex((open) => isAncestor(layer, open.layer));
|
|
239
|
+
if (firstChild < 0) {
|
|
240
|
+
layers.push(entry);
|
|
241
|
+
const target = layer.initialFocus?.() ?? null;
|
|
242
|
+
if (target !== null)
|
|
243
|
+
renderer.focusElement?.(target);
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
layers.splice(firstChild, 0, entry);
|
|
247
|
+
// The children opened in the same commit and captured the same
|
|
248
|
+
// pre-open focus. Closing one alone must return into this layer.
|
|
249
|
+
const inside = layer.initialFocus?.() ?? null;
|
|
250
|
+
for (const child of layers.slice(firstChild + 1)) {
|
|
251
|
+
if (isAncestor(layer, child.layer) && child.previous === entry.previous) {
|
|
252
|
+
child.previous = inside;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return () => {
|
|
257
|
+
const index = layers.indexOf(entry);
|
|
258
|
+
if (index < 0)
|
|
259
|
+
return;
|
|
260
|
+
layers.splice(index, 1);
|
|
261
|
+
// A parent that closed first already restored focus for its subtree.
|
|
262
|
+
if (layer.parent && !layers.some((open) => open.layer === layer.parent))
|
|
263
|
+
return;
|
|
264
|
+
const target = layer.finalFocus?.(entry.previous) ?? null;
|
|
265
|
+
if (target !== null)
|
|
266
|
+
renderer.focusElement?.(target);
|
|
267
|
+
};
|
|
268
|
+
},
|
|
269
|
+
};
|
|
270
|
+
allStates().set(renderer, state);
|
|
271
|
+
return state;
|
|
272
|
+
}
|
|
273
|
+
export function registerEventHandler(eventHandlers, elementId, eventType, handler) {
|
|
274
|
+
const handlers = eventHandlers.get(elementId) ?? new Map();
|
|
275
|
+
handlers.set(eventType, handler);
|
|
276
|
+
eventHandlers.set(elementId, handlers);
|
|
277
|
+
}
|
|
278
|
+
export function unregisterEventHandler(eventHandlers, elementId, eventType) {
|
|
279
|
+
const handlers = eventHandlers.get(elementId);
|
|
280
|
+
if (!handlers)
|
|
281
|
+
return;
|
|
282
|
+
handlers.delete(eventType);
|
|
283
|
+
if (handlers.size === 0)
|
|
284
|
+
eventHandlers.delete(elementId);
|
|
285
|
+
}
|
|
286
|
+
export function unregisterEventHandlers(eventHandlers, elementId) {
|
|
287
|
+
eventHandlers.delete(elementId);
|
|
288
|
+
}
|
|
289
|
+
/** Resolve a `FocusTarget` to an element id, or null when focus must stay. */
|
|
290
|
+
export function resolveFocusTarget(target, fallback) {
|
|
291
|
+
const value = typeof target === "function" ? target() : target;
|
|
292
|
+
if (value === undefined && typeof target === "function")
|
|
293
|
+
return null;
|
|
294
|
+
if (value === undefined || value === null || value === true)
|
|
295
|
+
return fallback();
|
|
296
|
+
if (value === false)
|
|
297
|
+
return null;
|
|
298
|
+
if ("current" in value)
|
|
299
|
+
return value.current?.id ?? fallback();
|
|
300
|
+
return value.id;
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=renderer-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer-state.js","sourceRoot":"","sources":["../js/renderer-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { ElementBounds } from "../index.js";
|
|
2
|
+
import type { PublicEventFields } from "./events/dispatch.js";
|
|
3
|
+
import type { LayoutDrag } from "./layout-animation.js";
|
|
4
|
+
export type ReorderAxis = "x" | "y";
|
|
5
|
+
export type ReorderOptions<Value> = {
|
|
6
|
+
/** The axis items are laid out and dragged along. */
|
|
7
|
+
axis: ReorderAxis;
|
|
8
|
+
/** The current order. Every value needs a registered item. */
|
|
9
|
+
values: readonly Value[];
|
|
10
|
+
/** Called with the order a drag proposes. The group never reorders by itself: pass the result back as `values`. */
|
|
11
|
+
onReorder: (values: Value[]) => void;
|
|
12
|
+
/** Where item boxes are read from, when a drag starts and again as the order changes during it. */
|
|
13
|
+
renderer: {
|
|
14
|
+
getElementBounds?: (elementId: number) => ElementBounds | null;
|
|
15
|
+
} | null;
|
|
16
|
+
};
|
|
17
|
+
export type ReorderItem = {
|
|
18
|
+
/** The element id of the item's box, once it has one. */
|
|
19
|
+
elementId(): number | undefined;
|
|
20
|
+
/** Routes the pointer's events to the item until it is released. Throws while the item is not in the tree. */
|
|
21
|
+
capturePointer(pointerId: number): void;
|
|
22
|
+
/** Ends the capture `capturePointer` asked for. Does nothing once the item is gone or the capture is over. */
|
|
23
|
+
releasePointerCapture(pointerId: number): void;
|
|
24
|
+
drag: LayoutDrag;
|
|
25
|
+
};
|
|
26
|
+
/** The `pointerdown` that starts a drag. */
|
|
27
|
+
export type ReorderPress = PublicEventFields & {
|
|
28
|
+
pointerId: number;
|
|
29
|
+
};
|
|
30
|
+
export declare function createReorderDrag(): LayoutDrag;
|
|
31
|
+
/** The slots the items had when the drag began: their sizes on the axis and the spaces between consecutive slots. */
|
|
32
|
+
export type ReorderSlots<Value> = {
|
|
33
|
+
sizes: Map<Value, number>;
|
|
34
|
+
gaps: number[];
|
|
35
|
+
firstStart: number;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* The order after dragging `value` until its centre is at `centre`: past a
|
|
39
|
+
* neighbour's centre it takes that neighbour's place.
|
|
40
|
+
*/
|
|
41
|
+
export declare function reorderedValues<Value>(slots: ReorderSlots<Value>, order: readonly Value[], value: Value, centre: number): Value[];
|
|
42
|
+
export declare class ReorderController<Value> {
|
|
43
|
+
#private;
|
|
44
|
+
/** Takes the group's latest props. Call it whenever they change. */
|
|
45
|
+
configure(options: ReorderOptions<Value>): void;
|
|
46
|
+
/** Makes `item` the one that `value` stands for. Returns what undoes it. */
|
|
47
|
+
register(value: Value, item: ReorderItem): () => void;
|
|
48
|
+
isDragging(value: Value): boolean;
|
|
49
|
+
/** The pointer went down on the item for `value`. */
|
|
50
|
+
pointerDown(value: Value, event: ReorderPress): void;
|
|
51
|
+
/** The pointer moved. Does nothing unless an item is held. */
|
|
52
|
+
pointerMove(event: PublicEventFields): void;
|
|
53
|
+
/**
|
|
54
|
+
* The press ended (`pointerup`, `pointercancel` or `lostpointercapture`) on
|
|
55
|
+
* the item for `value`: the held item glides to its slot. An event for another
|
|
56
|
+
* item or pointer is ignored, because a `lostpointercapture` can arrive after
|
|
57
|
+
* a later drag has begun and must not end that one.
|
|
58
|
+
*/
|
|
59
|
+
pointerEnd(value: Value, event: {
|
|
60
|
+
pointerId: number;
|
|
61
|
+
}): void;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=reorder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reorder.d.ts","sourceRoot":"","sources":["../js/reorder.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAGvD,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,CAAA;AAEnC,MAAM,MAAM,cAAc,CAAC,KAAK,IAAI;IAClC,qDAAqD;IACrD,IAAI,EAAE,WAAW,CAAA;IACjB,8DAA8D;IAC9D,MAAM,EAAE,SAAS,KAAK,EAAE,CAAA;IACxB,mHAAmH;IACnH,SAAS,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAA;IACpC,mGAAmG;IACnG,QAAQ,EAAE;QAAE,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,aAAa,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAA;CACpF,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,yDAAyD;IACzD,SAAS,IAAI,MAAM,GAAG,SAAS,CAAA;IAC/B,8GAA8G;IAC9G,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACvC,8GAA8G;IAC9G,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9C,IAAI,EAAE,UAAU,CAAA;CACjB,CAAA;AAED,4CAA4C;AAC5C,MAAM,MAAM,YAAY,GAAG,iBAAiB,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAA;AAEpE,wBAAgB,iBAAiB,IAAI,UAAU,CAE9C;AAED,qHAAqH;AACrH,MAAM,MAAM,YAAY,CAAC,KAAK,IAAI;IAChC,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACzB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AA8CD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EACnC,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAC1B,KAAK,EAAE,SAAS,KAAK,EAAE,EACvB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GACb,KAAK,EAAE,CAkBT;AA6CD,qBAAa,iBAAiB,CAAC,KAAK;;IAOlC,oEAAoE;IACpE,SAAS,CAAC,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,IAAI;IAK/C,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,IAAI;IASrD,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAIjC,qDAAqD;IACrD,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI;IAepD,8DAA8D;IAC9D,WAAW,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IA2B3C;;;;;OAKG;IACH,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;CA6G7D"}
|