From 8b11af527d3b5b430f997bbb68b676676c4d41a3 Mon Sep 17 00:00:00 2001 From: abose Date: Fri, 24 Apr 2026 21:32:25 +0530 Subject: [PATCH 1/8] fix: md editor integ test F-key shortcut triggering pro upsell MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit F8 is bound to the Live Preview edit toggle (_handlePreviewBtnClick), which calls LiveDevelopment.setMode(LIVE_EDIT_MODE) and shows the UPSELL_TYPE_LIVE_EDIT dialog for free users. The F-key forwarding tests dispatched F8 into the mdviewer iframe, which was then forwarded to Phoenix's document-level F8 handler — stacking 2 upsell dialogs in the test runner. Swap to F9 (unbound) — the test only needs to verify that F-keys are forwarded from the iframe, it doesn't need F8 specifically. Also rename the outer describe to "livepreview:Markdown Editor 1" to match sibling suites ("Edit Mode", "Edit More", "Table Editing"). --- test/spec/md-editor-integ-test.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/test/spec/md-editor-integ-test.js b/test/spec/md-editor-integ-test.js index 3dc43a1056..47f5e5576e 100644 --- a/test/spec/md-editor-integ-test.js +++ b/test/spec/md-editor-integ-test.js @@ -222,7 +222,7 @@ define(function (require, exports, module) { }, "md preview synced with editor content", 5000); } - describe("livepreview:Markdown Editor", function () { + describe("livepreview:Markdown Editor 1", function () { if (Phoenix.browser.desktop.isFirefox || (Phoenix.isTestWindowPlaywright && !Phoenix.browser.desktop.isChromeBased)) { @@ -527,18 +527,20 @@ define(function (require, exports, module) { await _enterEditMode(); await _focusMdContent(); - const listener = _listenForShortcut("F8"); - _dispatchPlainKeyInMdIframe("F8", { keyCode: 119, code: "F8" }); - await awaitsFor(() => listener.check(), "F8 shortcut to be forwarded in edit mode"); + // Use F9 (unbound) — F8 is bound to the Live Preview edit toggle which shows + // a pro upsell dialog for free users and blocks tests. + const listener = _listenForShortcut("F9"); + _dispatchPlainKeyInMdIframe("F9", { keyCode: 120, code: "F9" }); + await awaitsFor(() => listener.check(), "F9 shortcut to be forwarded in edit mode"); listener.cleanup(); }, 10000); it("should F-key shortcuts work in reader mode", async function () { await _enterReaderMode(); - const listener = _listenForShortcut("F8"); - _dispatchPlainKeyInMdIframe("F8", { keyCode: 119, code: "F8" }); - await awaitsFor(() => listener.check(), "F8 shortcut to be forwarded in reader mode"); + const listener = _listenForShortcut("F9"); + _dispatchPlainKeyInMdIframe("F9", { keyCode: 120, code: "F9" }); + await awaitsFor(() => listener.check(), "F9 shortcut to be forwarded in reader mode"); listener.cleanup(); }, 10000); From c8400539653f1e0ae5879646e08b0d8a65aae9a1 Mon Sep 17 00:00:00 2001 From: abose Date: Fri, 24 Apr 2026 21:46:01 +0530 Subject: [PATCH 2/8] chore: string changes --- src/nls/root/strings.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/nls/root/strings.js b/src/nls/root/strings.js index 5e797fc578..50d8748a91 100644 --- a/src/nls/root/strings.js +++ b/src/nls/root/strings.js @@ -523,8 +523,8 @@ define({ "LIVE_DEV_IMAGE_FOLDER_DIALOG_HELP": "💡 Type folder path or leave empty to download in 'images' folder.", "LIVE_DEV_IMAGE_FOLDER_DIALOG_REMEMBER": "Don't ask again for this project", "AVAILABLE_IN_PRO_TITLE": "Available in Phoenix Pro", - "DEVICE_SIZE_LIMIT_MESSAGE": "See how your page looks on phones, tablets, desktops, and your CSS breakpoints. Upgrade to Phoenix Pro.", - "DEVICE_SIZE_NOT_ENOUGH_SPACE": "Not enough space for this screen size - try zooming out", + "DEVICE_SIZE_LIMIT_MESSAGE": "To switch between mobile, tablet, and desktop views, upgrade to Phoenix Pro.", + "DEVICE_SIZE_NOT_ENOUGH_SPACE": "This screen doesn’t fit in the current window size — try expanding the window", "DEVICE_SIZE_CYCLE_TOOLTIP": "Switch between mobile, tablet, and desktop", "DEVICE_SIZE_DROPDOWN_TOOLTIP": "All device sizes", "DEVICE_SIZE_FIT_TO_PANEL": "Fit to panel", @@ -1561,9 +1561,8 @@ define({ "BOTTOM_PANEL_MINIMIZE": "Minimize Panel", "BOTTOM_PANEL_SHOW": "Show Bottom Panel", "BOTTOM_PANEL_HIDE_TOGGLE": "Hide Bottom Panel", - "BOTTOM_PANEL_DEFAULT_TITLE": "Quick Access - Tools", - "BOTTOM_PANEL_DEFAULT_HEADING": "Open a Panel", - "BOTTOM_PANEL_OPEN_PANEL": "Open a Panel", + "BOTTOM_PANEL_DEFAULT_TITLE": "Tools", + "BOTTOM_PANEL_DEFAULT_HEADING": "Tools", "BOTTOM_PANEL_MAXIMIZE": "Maximize Panel", "BOTTOM_PANEL_RESTORE": "Restore Panel Size", From c588acb0610a603bd439d827c22ce848380884e8 Mon Sep 17 00:00:00 2001 From: abose Date: Fri, 24 Apr 2026 22:20:16 +0530 Subject: [PATCH 3/8] feat: add device size cycle no-fit string New string used by the device-size cycle button in phoenix-pro when no other cycle target fits the available width in normal preview mode. --- src/nls/root/strings.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/nls/root/strings.js b/src/nls/root/strings.js index 50d8748a91..8dc5d11a85 100644 --- a/src/nls/root/strings.js +++ b/src/nls/root/strings.js @@ -525,6 +525,7 @@ define({ "AVAILABLE_IN_PRO_TITLE": "Available in Phoenix Pro", "DEVICE_SIZE_LIMIT_MESSAGE": "To switch between mobile, tablet, and desktop views, upgrade to Phoenix Pro.", "DEVICE_SIZE_NOT_ENOUGH_SPACE": "This screen doesn’t fit in the current window size — try expanding the window", + "DEVICE_SIZE_CYCLE_NO_FIT": "Screen too small to switch to another device size — increase the window size", "DEVICE_SIZE_CYCLE_TOOLTIP": "Switch between mobile, tablet, and desktop", "DEVICE_SIZE_DROPDOWN_TOOLTIP": "All device sizes", "DEVICE_SIZE_FIT_TO_PANEL": "Fit to panel", From 906c86644ecac425ba3601f864dff1f4fb9b9de9 Mon Sep 17 00:00:00 2001 From: abose Date: Fri, 24 Apr 2026 22:35:01 +0530 Subject: [PATCH 4/8] refactor: remove fit-to-panel button and its string/css The fit-to-panel button only appeared in design mode when a responsive viewport was active. Its role is now folded into the device size cycle button in phoenix-pro, which treats "fit" as a 4th cycle state when in design mode. Drops the dedicated button, its CSS, and the unused DEVICE_SIZE_FIT_TO_PANEL string. --- .../Phoenix-live-preview/live-preview.css | 18 ------------------ src/nls/root/strings.js | 1 - 2 files changed, 19 deletions(-) diff --git a/src/extensionsIntegrated/Phoenix-live-preview/live-preview.css b/src/extensionsIntegrated/Phoenix-live-preview/live-preview.css index 8c72ac0fbc..98451f774e 100644 --- a/src/extensionsIntegrated/Phoenix-live-preview/live-preview.css +++ b/src/extensionsIntegrated/Phoenix-live-preview/live-preview.css @@ -250,24 +250,6 @@ margin-top: 0; } -.lp-fit-to-panel-btn { - color: #a0a0a0; - flex-shrink: 0; - margin: 0 2px; - background: transparent; - border: 1px solid transparent; - box-shadow: none; - font-size: 12px; -} - -.lp-fit-to-panel-btn:hover, -.lp-fit-to-panel-btn:focus, -.lp-fit-to-panel-btn:active { - background: transparent !important; - border: 1px solid rgba(255, 255, 255, 0.1) !important; - box-shadow: none !important; -} - .lp-device-size-btn-group { display: flex; align-items: center; diff --git a/src/nls/root/strings.js b/src/nls/root/strings.js index 8dc5d11a85..f9a7e4c461 100644 --- a/src/nls/root/strings.js +++ b/src/nls/root/strings.js @@ -528,7 +528,6 @@ define({ "DEVICE_SIZE_CYCLE_NO_FIT": "Screen too small to switch to another device size — increase the window size", "DEVICE_SIZE_CYCLE_TOOLTIP": "Switch between mobile, tablet, and desktop", "DEVICE_SIZE_DROPDOWN_TOOLTIP": "All device sizes", - "DEVICE_SIZE_FIT_TO_PANEL": "Fit to panel", "MD_EDIT_UPSELL_MESSAGE": "Write Markdown like a document. {APP_NAME} handles the formatting so you can stay focused on writing.", "IMAGE_UPLOADING": "Uploading", "IMAGE_UPLOAD_FAILED": "Failed to upload image", From 2c7bf9a71743ec0cb42e11bf87b572d5ec644822 Mon Sep 17 00:00:00 2001 From: abose Date: Fri, 24 Apr 2026 22:45:23 +0530 Subject: [PATCH 5/8] feat: add device size fit-to-screen string Used by the "Fit to screen" item in the live preview device size dropdown in phoenix-pro (visible only in design mode). --- src/nls/root/strings.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/nls/root/strings.js b/src/nls/root/strings.js index f9a7e4c461..e906ea580e 100644 --- a/src/nls/root/strings.js +++ b/src/nls/root/strings.js @@ -528,6 +528,7 @@ define({ "DEVICE_SIZE_CYCLE_NO_FIT": "Screen too small to switch to another device size — increase the window size", "DEVICE_SIZE_CYCLE_TOOLTIP": "Switch between mobile, tablet, and desktop", "DEVICE_SIZE_DROPDOWN_TOOLTIP": "All device sizes", + "DEVICE_SIZE_FIT_TO_SCREEN": "Fit to screen", "MD_EDIT_UPSELL_MESSAGE": "Write Markdown like a document. {APP_NAME} handles the formatting so you can stay focused on writing.", "IMAGE_UPLOADING": "Uploading", "IMAGE_UPLOAD_FAILED": "Failed to upload image", From 10116bd11713de4c54d60ba1d824fd953f7c530c Mon Sep 17 00:00:00 2001 From: abose Date: Fri, 24 Apr 2026 22:47:00 +0530 Subject: [PATCH 6/8] build: update pro deps --- tracking-repos.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracking-repos.json b/tracking-repos.json index 2f81c3ed31..254ac2aff7 100644 --- a/tracking-repos.json +++ b/tracking-repos.json @@ -1,5 +1,5 @@ { "phoenixPro": { - "commitID": "0bb0ed293e70501363fa3cd9916319ea1dbf38bb" + "commitID": "309f8d32ef5de7103dcc83c6275d49fba7cf048e" } } From 89e8f337f00c8306c1ce35adca2faae31312bdff Mon Sep 17 00:00:00 2001 From: abose Date: Sat, 25 Apr 2026 18:20:41 +0530 Subject: [PATCH 7/8] build: update pro deps --- tracking-repos.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracking-repos.json b/tracking-repos.json index 254ac2aff7..8e084e487d 100644 --- a/tracking-repos.json +++ b/tracking-repos.json @@ -1,5 +1,5 @@ { "phoenixPro": { - "commitID": "309f8d32ef5de7103dcc83c6275d49fba7cf048e" + "commitID": "cbd55399cc8907d7bf072038b70319b1d4b5ef87" } } From a941802c23a59aca48d289dd783ac4c9485f13e4 Mon Sep 17 00:00:00 2001 From: abose Date: Sat, 25 Apr 2026 18:51:23 +0530 Subject: [PATCH 8/8] fix(ccb): cover subpixel gaps next to control bar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit At non-integer DPR (e.g. 110% browser zoom), subpixel rounding could leave a ~1px strip of body bg visible between #centralControlBar and its neighbors — sidebar on the left, editor on the right. Add a solid zero-blur box-shadow on both sides so CCB-colored pixels paint into those gaps without changing any geometry. --- src/styles/CentralControlBar.less | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/styles/CentralControlBar.less b/src/styles/CentralControlBar.less index 2c8d992c44..6f82550f48 100644 --- a/src/styles/CentralControlBar.less +++ b/src/styles/CentralControlBar.less @@ -41,6 +41,14 @@ still staying on-theme in light mode. */ background-color: #222; border-right: 1px solid rgba(0, 0, 0, 0.45); + /* Extend CCB's paint by 2px on each side without affecting layout. Under + non-integer DPR (e.g. 110% browser zoom) subpixel rounding can leave a + 1px gap between CCB and the sidebar on the left, and between CCB and the + editor on the right. A solid box-shadow with zero blur paints CCB-colored + pixels into those gaps without shifting any geometry. */ + box-shadow: + -2px 0 0 0 #222, + 2px 0 0 0 #222; .ccb-group { display: flex;