@nativedesktop/react 0.4.40 → 0.4.42

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/index.js CHANGED
@@ -595,7 +595,7 @@ var widgetEvents = {
595
595
  tabview: [{ name: "selectionChanged", handler: "onSelectionChanged", payload: "index" }, { name: "dragStarted", handler: "onDragStarted", payload: "text" }, { name: "dragEnded", handler: "onDragEnded", payload: "none" }, { name: "dragOver", handler: "onDragOver", payload: "dragPoint" }, { name: "dropped", handler: "onDropped", payload: "dragPoint" }],
596
596
  grid: [{ name: "dragStarted", handler: "onDragStarted", payload: "text" }, { name: "dragEnded", handler: "onDragEnded", payload: "none" }, { name: "dragOver", handler: "onDragOver", payload: "dragPoint" }, { name: "dropped", handler: "onDropped", payload: "dragPoint" }],
597
597
  listview: [{ name: "rowActivated", handler: "onRowActivated", payload: "index" }, { name: "dragStarted", handler: "onDragStarted", payload: "text" }, { name: "dragEnded", handler: "onDragEnded", payload: "none" }, { name: "dragOver", handler: "onDragOver", payload: "dragPoint" }, { name: "dropped", handler: "onDropped", payload: "dragPoint" }],
598
- webview: [{ name: "navigate", handler: "onNavigate", payload: "text" }, { name: "titleChanged", handler: "onTitleChanged", payload: "text" }, { name: "loadingChanged", handler: "onLoadingChanged", payload: "checked" }, { name: "backAvailable", handler: "onBackAvailable", payload: "checked" }, { name: "forwardAvailable", handler: "onForwardAvailable", payload: "checked" }, { name: "loadProgress", handler: "onLoadProgress", payload: "value" }, { name: "loadFailed", handler: "onLoadFailed", payload: "data" }, { name: "newWindow", handler: "onNewWindow", payload: "text" }, { name: "browserCommand", handler: "onBrowserCommand", payload: "text" }, { name: "downloadRequested", handler: "onDownloadRequested", payload: "data" }, { name: "downloadUpdated", handler: "onDownloadUpdated", payload: "data" }, { name: "javaScriptResult", handler: "onJavaScriptResult", payload: "data" }, { name: "scriptMessage", handler: "onScriptMessage", payload: "data" }, { name: "schemeRequest", handler: "onSchemeRequest", payload: "data" }, { name: "cookiesResult", handler: "onCookiesResult", payload: "data" }, { name: "cookiesChanged", handler: "onCookiesChanged", payload: "data" }, { name: "faviconChanged", handler: "onFaviconChanged", payload: "data" }, { name: "findResult", handler: "onFindResult", payload: "data" }, { name: "securityChanged", handler: "onSecurityChanged", payload: "data" }, { name: "linkHover", handler: "onLinkHover", payload: "text" }, { name: "contextMenu", handler: "onContextMenu", payload: "data" }, { name: "contextMenuItemClicked", handler: "onContextMenuItemClicked", payload: "data" }, { name: "sessionSaved", handler: "onSessionSaved", payload: "data" }, { name: "audioStateChanged", handler: "onAudioStateChanged", payload: "data" }, { name: "extensionsList", handler: "onExtensionsList", payload: "data" }, { name: "extensionActions", handler: "onExtensionActions", payload: "data" }, { name: "extensionsChanged", handler: "onExtensionsChanged", payload: "data" }, { name: "chromeDialog", handler: "onChromeDialog", payload: "data" }, { name: "permissionRequest", handler: "onPermissionRequest", payload: "data" }, { name: "permissionRequestDismissed", handler: "onPermissionRequestDismissed", payload: "data" }, { name: "zoomChanged", handler: "onZoomChanged", payload: "data" }, { name: "dragStarted", handler: "onDragStarted", payload: "text" }, { name: "dragEnded", handler: "onDragEnded", payload: "none" }, { name: "dragOver", handler: "onDragOver", payload: "dragPoint" }, { name: "dropped", handler: "onDropped", payload: "dragPoint" }],
598
+ webview: [{ name: "navigate", handler: "onNavigate", payload: "text" }, { name: "titleChanged", handler: "onTitleChanged", payload: "text" }, { name: "loadingChanged", handler: "onLoadingChanged", payload: "checked" }, { name: "focusChanged", handler: "onFocusChanged", payload: "checked" }, { name: "backAvailable", handler: "onBackAvailable", payload: "checked" }, { name: "forwardAvailable", handler: "onForwardAvailable", payload: "checked" }, { name: "loadProgress", handler: "onLoadProgress", payload: "value" }, { name: "loadFailed", handler: "onLoadFailed", payload: "data" }, { name: "newWindow", handler: "onNewWindow", payload: "text" }, { name: "browserCommand", handler: "onBrowserCommand", payload: "text" }, { name: "downloadRequested", handler: "onDownloadRequested", payload: "data" }, { name: "downloadUpdated", handler: "onDownloadUpdated", payload: "data" }, { name: "javaScriptResult", handler: "onJavaScriptResult", payload: "data" }, { name: "scriptMessage", handler: "onScriptMessage", payload: "data" }, { name: "schemeRequest", handler: "onSchemeRequest", payload: "data" }, { name: "cookiesResult", handler: "onCookiesResult", payload: "data" }, { name: "cookiesChanged", handler: "onCookiesChanged", payload: "data" }, { name: "faviconChanged", handler: "onFaviconChanged", payload: "data" }, { name: "findResult", handler: "onFindResult", payload: "data" }, { name: "securityChanged", handler: "onSecurityChanged", payload: "data" }, { name: "linkHover", handler: "onLinkHover", payload: "text" }, { name: "contextMenu", handler: "onContextMenu", payload: "data" }, { name: "contextMenuItemClicked", handler: "onContextMenuItemClicked", payload: "data" }, { name: "sessionSaved", handler: "onSessionSaved", payload: "data" }, { name: "audioStateChanged", handler: "onAudioStateChanged", payload: "data" }, { name: "extensionsList", handler: "onExtensionsList", payload: "data" }, { name: "extensionActions", handler: "onExtensionActions", payload: "data" }, { name: "extensionsChanged", handler: "onExtensionsChanged", payload: "data" }, { name: "chromeDialog", handler: "onChromeDialog", payload: "data" }, { name: "permissionRequest", handler: "onPermissionRequest", payload: "data" }, { name: "permissionRequestDismissed", handler: "onPermissionRequestDismissed", payload: "data" }, { name: "zoomChanged", handler: "onZoomChanged", payload: "data" }, { name: "dragStarted", handler: "onDragStarted", payload: "text" }, { name: "dragEnded", handler: "onDragEnded", payload: "none" }, { name: "dragOver", handler: "onDragOver", payload: "dragPoint" }, { name: "dropped", handler: "onDropped", payload: "dragPoint" }],
599
599
  nativeview: [{ name: "nativeEvent", handler: "onNativeEvent", payload: "data" }, { name: "dragStarted", handler: "onDragStarted", payload: "text" }, { name: "dragEnded", handler: "onDragEnded", payload: "none" }, { name: "dragOver", handler: "onDragOver", payload: "dragPoint" }, { name: "dropped", handler: "onDropped", payload: "dragPoint" }],
600
600
  splitview: [{ name: "revealChanged", handler: "onRevealChanged", payload: "checked" }, { name: "dragStarted", handler: "onDragStarted", payload: "text" }, { name: "dragEnded", handler: "onDragEnded", payload: "none" }, { name: "dragOver", handler: "onDragOver", payload: "dragPoint" }, { name: "dropped", handler: "onDropped", payload: "dragPoint" }],
601
601
  headerbar: [{ name: "back", handler: "onBack", payload: "none" }, { name: "forward", handler: "onForward", payload: "none" }, { name: "dragStarted", handler: "onDragStarted", payload: "text" }, { name: "dragEnded", handler: "onDragEnded", payload: "none" }, { name: "dragOver", handler: "onDragOver", payload: "dragPoint" }, { name: "dropped", handler: "onDropped", payload: "dragPoint" }],
@@ -672,7 +672,7 @@ var handlerPropNames = {
672
672
  tabview: ["onSelectionChanged", "onDragStarted", "onDragEnded", "onDragOver", "onDropped"],
673
673
  grid: ["onDragStarted", "onDragEnded", "onDragOver", "onDropped"],
674
674
  listview: ["onRowActivated", "onDragStarted", "onDragEnded", "onDragOver", "onDropped"],
675
- webview: ["onNavigate", "onTitleChanged", "onLoadingChanged", "onBackAvailable", "onForwardAvailable", "onLoadProgress", "onLoadFailed", "onNewWindow", "onBrowserCommand", "onDownloadRequested", "onDownloadUpdated", "onJavaScriptResult", "onScriptMessage", "onSchemeRequest", "onCookiesResult", "onCookiesChanged", "onFaviconChanged", "onFindResult", "onSecurityChanged", "onLinkHover", "onContextMenu", "onContextMenuItemClicked", "onSessionSaved", "onAudioStateChanged", "onExtensionsList", "onExtensionActions", "onExtensionsChanged", "onChromeDialog", "onPermissionRequest", "onPermissionRequestDismissed", "onZoomChanged", "onDragStarted", "onDragEnded", "onDragOver", "onDropped"],
675
+ webview: ["onNavigate", "onTitleChanged", "onLoadingChanged", "onFocusChanged", "onBackAvailable", "onForwardAvailable", "onLoadProgress", "onLoadFailed", "onNewWindow", "onBrowserCommand", "onDownloadRequested", "onDownloadUpdated", "onJavaScriptResult", "onScriptMessage", "onSchemeRequest", "onCookiesResult", "onCookiesChanged", "onFaviconChanged", "onFindResult", "onSecurityChanged", "onLinkHover", "onContextMenu", "onContextMenuItemClicked", "onSessionSaved", "onAudioStateChanged", "onExtensionsList", "onExtensionActions", "onExtensionsChanged", "onChromeDialog", "onPermissionRequest", "onPermissionRequestDismissed", "onZoomChanged", "onDragStarted", "onDragEnded", "onDragOver", "onDropped"],
676
676
  nativeview: ["onNativeEvent", "onDragStarted", "onDragEnded", "onDragOver", "onDropped"],
677
677
  splitview: ["onRevealChanged", "onDragStarted", "onDragEnded", "onDragOver", "onDropped"],
678
678
  headerbar: ["onBack", "onForward", "onDragStarted", "onDragEnded", "onDragOver", "onDropped"],
@@ -746,7 +746,7 @@ var widgetCommands = {
746
746
  tabview: [],
747
747
  grid: [],
748
748
  listview: [],
749
- webview: ["goBack", "goForward", "reload", "stop", "executeJavaScript", "setZoom", "setUserAgent", "openDevTools", "addUserScript", "removeUserScript", "clearUserScripts", "registerScriptMessage", "unregisterScriptMessage", "respondScheme", "respondPermission", "resetPermissions", "respondDownload", "getCookies", "setCookie", "deleteCookie", "findStart", "findNext", "findPrevious", "findStop", "saveSession", "restoreSession", "setMuted", "setContextMenuItems", "listExtensions", "watchExtensions", "listExtensionActions", "readExtensionAction", "installExtension", "uninstallExtension", "setExtensionEnabled", "focus"],
749
+ webview: ["goBack", "goForward", "reload", "stop", "executeJavaScript", "setZoom", "setUserAgent", "openDevTools", "addUserScript", "removeUserScript", "clearUserScripts", "registerScriptMessage", "unregisterScriptMessage", "respondScheme", "respondPermission", "resetPermissions", "respondDownload", "startDownload", "pauseDownload", "resumeDownload", "cancelDownload", "getCookies", "setCookie", "deleteCookie", "findStart", "findNext", "findPrevious", "findStop", "saveSession", "restoreSession", "setMuted", "setContextMenuItems", "listExtensions", "watchExtensions", "listExtensionActions", "readExtensionAction", "triggerExtensionAction", "installExtension", "uninstallExtension", "setExtensionEnabled", "focus"],
750
750
  nativeview: [],
751
751
  splitview: ["revealSidebar", "concealSidebar"],
752
752
  headerbar: [],
@@ -909,6 +909,10 @@ class Batch {
909
909
  return this.ops.length;
910
910
  }
911
911
  }
912
+ var removalListeners = new Set;
913
+ function onNodeRemoved(listener) {
914
+ removalListeners.add(listener);
915
+ }
912
916
 
913
917
  class NodeRegistry {
914
918
  byId = new Map;
@@ -919,7 +923,10 @@ class NodeRegistry {
919
923
  return this.byId.get(id);
920
924
  }
921
925
  unregister(id) {
922
- this.byId.delete(id);
926
+ if (!this.byId.delete(id))
927
+ return;
928
+ for (const listener of removalListeners)
929
+ listener(id);
923
930
  }
924
931
  }
925
932
 
@@ -1400,7 +1407,9 @@ var hostConfig = {
1400
1407
  hideTextInstance() {},
1401
1408
  unhideTextInstance() {},
1402
1409
  getPublicInstance: (i) => i,
1403
- detachDeletedInstance() {},
1410
+ detachDeletedInstance(inst) {
1411
+ registry.unregister(inst.id);
1412
+ },
1404
1413
  maySuspendCommit: () => false,
1405
1414
  preloadInstance: () => true,
1406
1415
  startSuspendingCommit() {},
@@ -1445,6 +1454,13 @@ function dispatchSystemEvent(channel, data) {
1445
1454
  globalThis.__nd_app_active = true;
1446
1455
  else if (channel === "app.deactivate")
1447
1456
  globalThis.__nd_app_active = false;
1457
+ else if (channel === "webview.engine") {
1458
+ const d = data;
1459
+ globalThis.__nd_webview_engine = {
1460
+ engine: d?.engine === "chromium" ? "chromium" : "system",
1461
+ style: d?.style === "chrome" || d?.style === "alloy" ? d.style : null
1462
+ };
1463
+ }
1448
1464
  for (const handler of registry2().get(channel) ?? [])
1449
1465
  handler(data);
1450
1466
  if (channel === "notification.click") {
@@ -1553,6 +1569,12 @@ var system = {
1553
1569
  }
1554
1570
  };
1555
1571
  var webviewEngine = {
1572
+ active() {
1573
+ return globalThis.__nd_webview_engine?.engine ?? "system";
1574
+ },
1575
+ cefStyle() {
1576
+ return globalThis.__nd_webview_engine?.style ?? null;
1577
+ },
1556
1578
  async registerScheme(scheme, options = {}) {
1557
1579
  await call("webviewEngine.registerScheme", {
1558
1580
  scheme,
@@ -1947,17 +1969,61 @@ var pendingExtensions = new Map;
1947
1969
  var pendingActions = new Map;
1948
1970
  var pendingWatches = new Map;
1949
1971
  var pendingActionState = new Map;
1972
+ var pendingTriggers = new Map;
1950
1973
  var seq2 = 0;
1951
1974
  function nextId(prefix) {
1952
1975
  return `${prefix}${++seq2}`;
1953
1976
  }
1954
- function executeJavaScript(node, code, world) {
1955
- const id = nextId("js");
1977
+ var inFlight = new Map;
1978
+ onNodeRemoved((nodeId) => {
1979
+ const calls = inFlight.get(nodeId);
1980
+ if (!calls)
1981
+ return;
1982
+ inFlight.delete(nodeId);
1983
+ for (const [id, reject2] of calls)
1984
+ reject2(new Error(`the <webview> was removed before request ${id} was answered`));
1985
+ });
1986
+ function request(node, pending, prefix, command, args) {
1987
+ const id = nextId(prefix);
1956
1988
  return new Promise((resolve2, reject2) => {
1957
- pendingEvals.set(id, { resolve: resolve2, reject: reject2 });
1958
- sendCommand(node, "executeJavaScript", world ? { id, code, world } : { id, code });
1989
+ if (!registry.get(node.id)) {
1990
+ reject2(new Error(`${command}: the <webview> is no longer mounted`));
1991
+ return;
1992
+ }
1993
+ let calls = inFlight.get(node.id);
1994
+ if (!calls)
1995
+ inFlight.set(node.id, calls = new Map);
1996
+ const forget = () => {
1997
+ pending.delete(id);
1998
+ calls.delete(id);
1999
+ if (calls.size === 0 && inFlight.get(node.id) === calls)
2000
+ inFlight.delete(node.id);
2001
+ };
2002
+ pending.set(id, {
2003
+ resolve: (value) => {
2004
+ forget();
2005
+ resolve2(value);
2006
+ },
2007
+ reject: (reason) => {
2008
+ forget();
2009
+ reject2(reason);
2010
+ }
2011
+ });
2012
+ calls.set(id, (reason) => {
2013
+ forget();
2014
+ reject2(reason);
2015
+ });
2016
+ try {
2017
+ sendCommand(node, command, { id, ...args });
2018
+ } catch (error) {
2019
+ forget();
2020
+ reject2(error);
2021
+ }
1959
2022
  });
1960
2023
  }
2024
+ function executeJavaScript(node, code, world) {
2025
+ return request(node, pendingEvals, "js", "executeJavaScript", world ? { code, world } : { code });
2026
+ }
1961
2027
  function onJavaScriptResult(e) {
1962
2028
  const result = e.data;
1963
2029
  const call2 = pendingEvals.get(result.id);
@@ -1970,11 +2036,7 @@ function onJavaScriptResult(e) {
1970
2036
  call2.reject(new Error(result.error ?? "executeJavaScript failed"));
1971
2037
  }
1972
2038
  function getCookies(node, url) {
1973
- const id = nextId("ck");
1974
- return new Promise((resolve2, reject2) => {
1975
- pendingCookies.set(id, { resolve: resolve2, reject: reject2 });
1976
- sendCommand(node, "getCookies", url ? { id, url } : { id });
1977
- });
2039
+ return request(node, pendingCookies, "ck", "getCookies", url ? { url } : {});
1978
2040
  }
1979
2041
  function onCookiesResult(e) {
1980
2042
  const result = e.data;
@@ -1988,11 +2050,7 @@ function onCookiesResult(e) {
1988
2050
  call2.reject(new Error(result.error ?? "getCookies failed"));
1989
2051
  }
1990
2052
  function saveSession(node) {
1991
- const id = nextId("ss");
1992
- return new Promise((resolve2, reject2) => {
1993
- pendingSessions.set(id, { resolve: resolve2, reject: reject2 });
1994
- sendCommand(node, "saveSession", { id });
1995
- });
2053
+ return request(node, pendingSessions, "ss", "saveSession", {});
1996
2054
  }
1997
2055
  function onSessionSaved(e) {
1998
2056
  const result = e.data;
@@ -2003,11 +2061,7 @@ function onSessionSaved(e) {
2003
2061
  call2.resolve(result.state ?? "");
2004
2062
  }
2005
2063
  function listExtensions(node) {
2006
- const id = nextId("ext");
2007
- return new Promise((resolve2, reject2) => {
2008
- pendingExtensions.set(id, { resolve: resolve2, reject: reject2 });
2009
- sendCommand(node, "listExtensions", { id });
2010
- });
2064
+ return request(node, pendingExtensions, "ext", "listExtensions", {});
2011
2065
  }
2012
2066
  function onExtensionsList(e) {
2013
2067
  const result = e.data;
@@ -2030,20 +2084,12 @@ function setExtensionEnabled(node, extensionId, enabled) {
2030
2084
  return extensionMutation(node, "setExtensionEnabled", { extensionId, enabled });
2031
2085
  }
2032
2086
  function extensionMutation(node, command, args) {
2033
- const id = nextId("ext");
2034
- return new Promise((resolve2, reject2) => {
2035
- pendingExtensions.set(id, { resolve: resolve2, reject: reject2 });
2036
- sendCommand(node, command, { id, ...args });
2037
- });
2087
+ return request(node, pendingExtensions, "ext", command, args);
2038
2088
  }
2039
2089
  var extensionsWatchers = [];
2040
2090
  function watchExtensions(node, listener) {
2041
- const id = nextId("ext");
2042
- return new Promise((resolve2, reject2) => {
2043
- pendingWatches.set(id, { resolve: resolve2, reject: reject2 });
2044
- extensionsWatchers.push(listener);
2045
- sendCommand(node, "watchExtensions", { id });
2046
- });
2091
+ extensionsWatchers.push(listener);
2092
+ return request(node, pendingWatches, "ext", "watchExtensions", {});
2047
2093
  }
2048
2094
  function onExtensionsChanged(e) {
2049
2095
  const result = e.data;
@@ -2062,21 +2108,29 @@ function onExtensionsChanged(e) {
2062
2108
  listener({ reason: result.reason ?? "" });
2063
2109
  }
2064
2110
  function readExtensionAction(node) {
2111
+ return request(node, pendingActionState, "ext", "readExtensionAction", {});
2112
+ }
2113
+ function triggerExtensionAction(node, extensionId) {
2065
2114
  const id = nextId("ext");
2066
2115
  return new Promise((resolve2, reject2) => {
2067
- pendingActionState.set(id, { resolve: resolve2, reject: reject2 });
2068
- sendCommand(node, "readExtensionAction", { id });
2116
+ pendingTriggers.set(id, { resolve: resolve2, reject: reject2 });
2117
+ sendCommand(node, "triggerExtensionAction", { id, extensionId });
2069
2118
  });
2070
2119
  }
2071
2120
  function listExtensionActions(node) {
2072
- const id = nextId("ext");
2073
- return new Promise((resolve2, reject2) => {
2074
- pendingActions.set(id, { resolve: resolve2, reject: reject2 });
2075
- sendCommand(node, "listExtensionActions", { id });
2076
- });
2121
+ return request(node, pendingActions, "ext", "listExtensionActions", {});
2077
2122
  }
2078
2123
  function onExtensionActions(e) {
2079
2124
  const result = e.data;
2125
+ const trigger = pendingTriggers.get(result.id);
2126
+ if (trigger) {
2127
+ pendingTriggers.delete(result.id);
2128
+ if (result.ok)
2129
+ trigger.resolve();
2130
+ else
2131
+ trigger.reject(new Error(result.error ?? "triggerExtensionAction failed"));
2132
+ return;
2133
+ }
2080
2134
  const state3 = pendingActionState.get(result.id);
2081
2135
  if (state3) {
2082
2136
  pendingActionState.delete(result.id);
@@ -2098,6 +2152,21 @@ function onExtensionActions(e) {
2098
2152
  function setContextMenuItems(node, items) {
2099
2153
  sendCommand(node, "setContextMenuItems", { items });
2100
2154
  }
2155
+ function respondDownload(node, id, path) {
2156
+ sendCommand(node, "respondDownload", path ? { id, path } : { id });
2157
+ }
2158
+ function startDownload(node, url) {
2159
+ sendCommand(node, "startDownload", { url });
2160
+ }
2161
+ function pauseDownload(node, id) {
2162
+ sendCommand(node, "pauseDownload", { id });
2163
+ }
2164
+ function resumeDownload(node, id) {
2165
+ sendCommand(node, "resumeDownload", { id });
2166
+ }
2167
+ function cancelDownload(node, id) {
2168
+ sendCommand(node, "cancelDownload", { id });
2169
+ }
2101
2170
  // src/dialogs.ts
2102
2171
  var pending = new Map;
2103
2172
  function checkAvailable(node, reject2) {
@@ -2466,8 +2535,10 @@ export {
2466
2535
  useCallback,
2467
2536
  use,
2468
2537
  uninstallExtension,
2538
+ triggerExtensionAction,
2469
2539
  system,
2470
2540
  startTransition,
2541
+ startDownload,
2471
2542
  showToast,
2472
2543
  showTabOverview,
2473
2544
  showAlert,
@@ -2480,11 +2551,14 @@ export {
2480
2551
  saveSession,
2481
2552
  saveFile,
2482
2553
  revealPath,
2554
+ resumeDownload,
2555
+ respondDownload,
2483
2556
  render,
2484
2557
  registerExports,
2485
2558
  recentDocuments,
2486
2559
  readExtensionAction,
2487
2560
  performRefresh,
2561
+ pauseDownload,
2488
2562
  openPath,
2489
2563
  openFile,
2490
2564
  openExternal,
@@ -2523,6 +2597,7 @@ export {
2523
2597
  createPool,
2524
2598
  createContext,
2525
2599
  clipboard,
2600
+ cancelDownload,
2526
2601
  audio,
2527
2602
  app,
2528
2603
  Suspense2 as Suspense,
@@ -10,6 +10,8 @@ export interface ShowAlertOptions {
10
10
  title: string;
11
11
  body?: string;
12
12
  buttons: DialogButton[];
13
+ defaultId?: string;
14
+ closeId?: string;
13
15
  }
14
16
  export interface AlertResult {
15
17
  buttonId: string;
@@ -242,6 +242,7 @@ export declare namespace JSX {
242
242
  label: {
243
243
  text?: string;
244
244
  ellipsize?: boolean;
245
+ ellipsizeMode?: "end" | "middle" | "start";
245
246
  variant?: "body" | "title1" | "title2" | "title3" | "title4" | "heading" | "caption" | "captionHeading" | "monospace";
246
247
  enabled?: boolean;
247
248
  tooltip?: string;
@@ -952,6 +953,9 @@ export declare namespace JSX {
952
953
  onLoadingChanged?: (e: {
953
954
  checked: boolean;
954
955
  }) => void;
956
+ onFocusChanged?: (e: {
957
+ checked: boolean;
958
+ }) => void;
955
959
  onBackAvailable?: (e: {
956
960
  checked: boolean;
957
961
  }) => void;
@@ -29,7 +29,7 @@ export type WidgetCommandNames = {
29
29
  "checkbox": "focus";
30
30
  "radio": "focus";
31
31
  "select": "focus";
32
- "webview": "goBack" | "goForward" | "reload" | "stop" | "executeJavaScript" | "setZoom" | "setUserAgent" | "openDevTools" | "addUserScript" | "removeUserScript" | "clearUserScripts" | "registerScriptMessage" | "unregisterScriptMessage" | "respondScheme" | "respondPermission" | "resetPermissions" | "respondDownload" | "getCookies" | "setCookie" | "deleteCookie" | "findStart" | "findNext" | "findPrevious" | "findStop" | "saveSession" | "restoreSession" | "setMuted" | "setContextMenuItems" | "listExtensions" | "watchExtensions" | "listExtensionActions" | "readExtensionAction" | "installExtension" | "uninstallExtension" | "setExtensionEnabled" | "focus";
32
+ "webview": "goBack" | "goForward" | "reload" | "stop" | "executeJavaScript" | "setZoom" | "setUserAgent" | "openDevTools" | "addUserScript" | "removeUserScript" | "clearUserScripts" | "registerScriptMessage" | "unregisterScriptMessage" | "respondScheme" | "respondPermission" | "resetPermissions" | "respondDownload" | "startDownload" | "pauseDownload" | "resumeDownload" | "cancelDownload" | "getCookies" | "setCookie" | "deleteCookie" | "findStart" | "findNext" | "findPrevious" | "findStop" | "saveSession" | "restoreSession" | "setMuted" | "setContextMenuItems" | "listExtensions" | "watchExtensions" | "listExtensionActions" | "readExtensionAction" | "triggerExtensionAction" | "installExtension" | "uninstallExtension" | "setExtensionEnabled" | "focus";
33
33
  "splitview": "revealSidebar" | "concealSidebar";
34
34
  "toolbarview": "revealTopBars" | "concealTopBars";
35
35
  "searchinput": "focus" | "activateLeadingIcon" | "activateTrailingIcon";
@@ -55,7 +55,7 @@ export declare const hostConfig: {
55
55
  hideTextInstance(): void;
56
56
  unhideTextInstance(): void;
57
57
  getPublicInstance: (i: Instance) => Instance;
58
- detachDeletedInstance(): void;
58
+ detachDeletedInstance(inst: Instance): void;
59
59
  maySuspendCommit: () => boolean;
60
60
  preloadInstance: () => boolean;
61
61
  startSuspendingCommit(): void;
@@ -7,8 +7,8 @@ export type { SpacingScale } from "./metrics.ts";
7
7
  export { getAppDataDir, ensureAppDataDir } from "./paths.ts";
8
8
  export { defineNativeComponent } from "./native-component.ts";
9
9
  export type { NativeComponentOptions, NativeComponentProps, NativeComponentRef } from "./native-component.ts";
10
- export { executeJavaScript, onJavaScriptResult, getCookies, onCookiesResult, saveSession, onSessionSaved, setContextMenuItems, listExtensions, onExtensionsList, listExtensionActions, readExtensionAction, onExtensionActions, watchExtensions, onExtensionsChanged, installExtension, uninstallExtension, setExtensionEnabled, } from "./webview.ts";
11
- export type { Cookie, ContextMenuContext, ContextMenuItem, ContextMenuItemClick, ExtensionAction, ExtensionActionState, ExtensionsChange, InstalledExtension, } from "./webview.ts";
10
+ export { executeJavaScript, onJavaScriptResult, getCookies, onCookiesResult, saveSession, onSessionSaved, setContextMenuItems, listExtensions, onExtensionsList, listExtensionActions, readExtensionAction, triggerExtensionAction, onExtensionActions, watchExtensions, onExtensionsChanged, installExtension, uninstallExtension, setExtensionEnabled, respondDownload, startDownload, pauseDownload, resumeDownload, cancelDownload, } from "./webview.ts";
11
+ export type { Cookie, DownloadRequest, DownloadState, DownloadUpdate, ContextMenuContext, ContextMenuItem, ContextMenuItemClick, ExtensionAction, ExtensionActionState, ExtensionsChange, InstalledExtension, } from "./webview.ts";
12
12
  export { showAlert, openFile, saveFile, showAbout, showTabOverview, onAlertResult, onOpenFileResult, onSaveFileResult, } from "./dialogs.ts";
13
13
  export type { DialogButton, ShowAlertOptions, AlertResult, OpenFileOptions as WindowOpenFileOptions, OpenFileResult as WindowOpenFileResult, SaveFileOptions as WindowSaveFileOptions, SaveFileResult as WindowSaveFileResult, ShowAboutOptions, } from "./dialogs.ts";
14
14
  export { showToast, dismissToast, onToastButtonClicked, onToastDismissed } from "./toast.ts";
@@ -12,6 +12,7 @@ export interface NodeRecord {
12
12
  props: Record<string, unknown>;
13
13
  handlers: Record<string, Handler>;
14
14
  }
15
+ export declare function onNodeRemoved(listener: (id: number) => void): void;
15
16
  export declare class NodeRegistry {
16
17
  private byId;
17
18
  register(rec: NodeRecord): void;
@@ -3,6 +3,10 @@ declare global {
3
3
  var __nd_system_events: Map<string, Set<SystemEventHandler>> | undefined;
4
4
  var __nd_notification_data: Map<string, unknown> | undefined;
5
5
  var __nd_app_active: boolean | undefined;
6
+ var __nd_webview_engine: {
7
+ engine: WebviewEngineName;
8
+ style: CefStyle;
9
+ } | undefined;
6
10
  }
7
11
  /** Wired up by renderer.ts from `ndp.onSystemEvent()` — not part of the public API. */
8
12
  export declare function dispatchSystemEvent(channel: string, data: unknown): void;
@@ -141,8 +145,29 @@ export interface RegisterSchemeOptions {
141
145
  */
142
146
  secure?: boolean;
143
147
  }
148
+ /** Which web engine the host actually started. */
149
+ export type WebviewEngineName = "chromium" | "system";
150
+ /** CEF's browser style, or null when the host is not running CEF at all. */
151
+ export type CefStyle = "chrome" | "alloy" | null;
144
152
  /** Engine-level `<webview>` configuration. `core:webview` is default-granted. */
145
153
  export declare const webviewEngine: {
154
+ /**
155
+ * Which engine this host actually started, synchronously. Asking for
156
+ * `chromium` is not the same as getting it: a host with no usable CEF
157
+ * distribution falls back to the system engine, and before this the only
158
+ * way to tell was to read `navigator.userAgent` out of a live view.
159
+ *
160
+ * Backed by the host's `webview.engine` stream, replayed right after the
161
+ * handshake like `app.isActive()`, so it is correct from the first render.
162
+ * "system" against a host that predates the stream.
163
+ */
164
+ active(): WebviewEngineName;
165
+ /**
166
+ * CEF's browser style: "chrome" (Chromium's own browser runtime, which is
167
+ * what runs the extension system) or "alloy". Null whenever `active()` is
168
+ * not "chromium".
169
+ */
170
+ cefStyle(): CefStyle;
146
171
  /**
147
172
  * Registers a custom URI scheme (`crx`, `app`, …) with the web engine.
148
173
  * Requests for it arrive as the `schemeRequest` event on the `<webview>`
@@ -70,6 +70,7 @@ export interface ExtensionActionState {
70
70
  enabled: boolean;
71
71
  }
72
72
  export declare function readExtensionAction(node: NdNodeRef<"webview">): Promise<ExtensionActionState>;
73
+ export declare function triggerExtensionAction(node: NdNodeRef<"webview">, extensionId: string): Promise<void>;
73
74
  export declare function listExtensionActions(node: NdNodeRef<"webview">): Promise<ExtensionAction[]>;
74
75
  export declare function onExtensionActions(e: {
75
76
  data: unknown;
@@ -96,3 +97,23 @@ export interface ContextMenuItemClick {
96
97
  wasChecked?: boolean;
97
98
  }
98
99
  export declare function setContextMenuItems(node: NdNodeRef<"webview">, items: ContextMenuItem[]): void;
100
+ export interface DownloadRequest {
101
+ id?: string;
102
+ url: string;
103
+ suggestedFilename?: string;
104
+ }
105
+ export type DownloadState = "running" | "done" | "failed" | "cancelled";
106
+ export interface DownloadUpdate {
107
+ id: string;
108
+ state: DownloadState;
109
+ received: number;
110
+ total: number;
111
+ path: string;
112
+ speed?: number;
113
+ paused?: boolean;
114
+ }
115
+ export declare function respondDownload(node: NdNodeRef<"webview">, id: string, path?: string): void;
116
+ export declare function startDownload(node: NdNodeRef<"webview">, url: string): void;
117
+ export declare function pauseDownload(node: NdNodeRef<"webview">, id: string): void;
118
+ export declare function resumeDownload(node: NdNodeRef<"webview">, id: string): void;
119
+ export declare function cancelDownload(node: NdNodeRef<"webview">, id: string): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nativedesktop/react",
3
- "version": "0.4.40",
3
+ "version": "0.4.42",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/FormalSnake/NativeDesktop#readme",