@domicile-desktop/manganese-window-management 1.0.0 → 1.2.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/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "dependencies": {
3
3
  "@cprussin/option-result": "^2.0.1",
4
- "@domicile-desktop/component-library": "1.0.0",
5
- "@domicile-desktop/manganese-address": "1.0.0",
6
- "@domicile-desktop/manganese-bar": "1.0.0",
7
- "@domicile-desktop/manganese-host": "1.0.0",
8
- "@domicile-desktop/manganese-page-requests": "1.0.0",
9
- "@domicile-desktop/sdk": "1.0.0",
10
- "@domicile-desktop/system-apps": "1.0.0",
4
+ "@domicile-desktop/component-library": "2.0.1",
5
+ "@domicile-desktop/manganese-address": "1.0.2",
6
+ "@domicile-desktop/manganese-bar": "1.1.1",
7
+ "@domicile-desktop/manganese-host": "2.0.1",
8
+ "@domicile-desktop/manganese-page-requests": "1.1.1",
9
+ "@domicile-desktop/sdk": "2.1.0",
10
+ "@domicile-desktop/system-apps": "1.1.1",
11
11
  "@pandacss/dev": "^1.12.1",
12
12
  "@phosphor-icons/react": "^2.1.10",
13
13
  "react": "^19.2.8",
@@ -16,7 +16,7 @@
16
16
  "description": "Manganese's window management: sway's layout tree, tiling, floating, workspaces, keybindings and the windows' chrome.",
17
17
  "devDependencies": {
18
18
  "@cprussin/tsconfig": "^5.0.0",
19
- "@domicile-desktop/test-support": "0.0.1",
19
+ "@domicile-desktop/test-support": "0.0.2",
20
20
  "@pandacss/preset-panda": "^1.12.1",
21
21
  "@testing-library/react": "^16.3.3",
22
22
  "@testing-library/user-event": "^14.6.7",
@@ -85,5 +85,5 @@
85
85
  "test:unit": "bun test"
86
86
  },
87
87
  "type": "module",
88
- "version": "1.0.0"
88
+ "version": "1.2.0"
89
89
  }
@@ -657,9 +657,15 @@ export const BrowserWindow = ({
657
657
  onBack={drive((loaded) => {
658
658
  loaded.goBack();
659
659
  })}
660
+ onBackInNewWindow={drive((loaded) => {
661
+ loaded.goBackInNewWindow();
662
+ })}
660
663
  onForward={drive((loaded) => {
661
664
  loaded.goForward();
662
665
  })}
666
+ onForwardInNewWindow={drive((loaded) => {
667
+ loaded.goForwardInNewWindow();
668
+ })}
663
669
  onNavigate={navigate}
664
670
  onReload={drive((loaded) => {
665
671
  loaded.reload();
@@ -22,7 +22,7 @@ import { ClockCounterClockwiseIcon } from "@phosphor-icons/react/dist/ssr/ClockC
22
22
  import { DetectiveIcon } from "@phosphor-icons/react/dist/ssr/Detective";
23
23
  import { GlobeSimpleIcon } from "@phosphor-icons/react/dist/ssr/GlobeSimple";
24
24
  import { MagnifyingGlassIcon } from "@phosphor-icons/react/dist/ssr/MagnifyingGlass";
25
- import type { CSSProperties, FormEvent } from "react";
25
+ import type { CSSProperties, FormEvent, MouseEvent } from "react";
26
26
  import { useState } from "react";
27
27
  import { css } from "../../styled-system/css";
28
28
  import { hstack } from "../../styled-system/patterns";
@@ -61,7 +61,11 @@ type Props = {
61
61
  /** Whether a page is loading, which turns Reload into Stop. */
62
62
  loading: boolean;
63
63
  onBack: () => void;
64
+ /** Goes back in a new window, for a middle click on Back. */
65
+ onBackInNewWindow: () => void;
64
66
  onForward: () => void;
67
+ /** Goes forward in a new window, for a middle click on Forward. */
68
+ onForwardInNewWindow: () => void;
65
69
  /** Loads `url`, already resolved from what was typed. */
66
70
  onNavigate: (url: string) => void;
67
71
  onReload: () => void;
@@ -103,7 +107,9 @@ export const AddressBar = ({
103
107
  loading,
104
108
  mediaDevices,
105
109
  onBack,
110
+ onBackInNewWindow,
106
111
  onForward,
112
+ onForwardInNewWindow,
107
113
  onNavigate,
108
114
  onReload,
109
115
  onSetSitePermission,
@@ -148,6 +154,7 @@ export const AddressBar = ({
148
154
  <Button
149
155
  disabled={!canGoBack}
150
156
  label="Back"
157
+ onAuxClick={onMiddleClick(onBackInNewWindow)}
151
158
  onClick={onBack}
152
159
  rounded
153
160
  size="sm"
@@ -158,6 +165,7 @@ export const AddressBar = ({
158
165
  <Button
159
166
  disabled={!canGoForward}
160
167
  label="Forward"
168
+ onAuxClick={onMiddleClick(onForwardInNewWindow)}
161
169
  onClick={onForward}
162
170
  rounded
163
171
  size="sm"
@@ -267,6 +275,21 @@ export const AddressBar = ({
267
275
  );
268
276
  };
269
277
 
278
+ /** `MouseEvent.button` for the middle button. */
279
+ const MIDDLE_BUTTON = 1;
280
+
281
+ /**
282
+ * An `onAuxClick` that calls `open` for a middle click, as Chrome opens a
283
+ * middle-clicked Back or Forward in a new tab. A right click is left alone.
284
+ */
285
+ const onMiddleClick =
286
+ (open: () => void) =>
287
+ (event: MouseEvent): void => {
288
+ if (event.button === MIDDLE_BUTTON) {
289
+ open();
290
+ }
291
+ };
292
+
270
293
  /**
271
294
  * Inline style handing `progress` to `loadingStyles` as `--load-progress`.
272
295
  * Inline because Panda only extracts build-time literals.