From 673c6fb8e858dcfaacfaeae37875853291cef33b Mon Sep 17 00:00:00 2001 From: James Manuel Date: Tue, 2 Jun 2026 01:29:43 +0200 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=90=9B=20fix(ios):=20disable=20keyboa?= =?UTF-8?q?rd=20overlay=20when=20exiting=20document=20edit=20mode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the user taps Done to exit edit mode, the iOS contenteditable overlay (used for keyboard persistence) was not being deactivated. Any subsequent tap in the document refocused the contenteditable and showed the keyboard unexpectedly. Call preventVirtualKeyboard_Hard() in turnOnViewerMode to disable the overlay, mirroring the showKeyboard() call in turnOffViewerMode. Uses window.AscCommon.AscBrowser.isSafariMobile rather than Device.ios as Device is minified in the production bundle. Note: dist/js/app.js is gitignored. The deployed bundle was patched directly from the original production image. A full rebuild via vendor/framework7-react/build (deploy-word) produces an extra CSS chunk (apps_..._less.js) that breaks the FAB on all platforms — this build config issue needs investigation before the source change can be rebuilt cleanly. Co-Authored-By: Claude Sonnet 4.6 Signed-off-by: James Manuel --- apps/documenteditor/mobile/src/controller/Toolbar.jsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/documenteditor/mobile/src/controller/Toolbar.jsx b/apps/documenteditor/mobile/src/controller/Toolbar.jsx index 1ff6548bcd..196d8f3822 100644 --- a/apps/documenteditor/mobile/src/controller/Toolbar.jsx +++ b/apps/documenteditor/mobile/src/controller/Toolbar.jsx @@ -232,6 +232,12 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeReview', 'sto appOptions.changeViewerMode(true); api.asc_addRestriction(Asc.c_oAscRestrictionType.View); Common.Notifications.trigger('draw:stop'); + + // Disable the iOS keyboard overlay — mirrors showKeyboard() in turnOffViewerMode. + // Use AscBrowser.isSafariMobile (not Device.ios) — Device is minified in the bundle. + if (window.AscCommon && window.AscCommon.AscBrowser && window.AscCommon.AscBrowser.isSafariMobile && window.AscCommon.g_inputContext) { + window.AscCommon.g_inputContext.preventVirtualKeyboard_Hard(); + } } const changeMobileView = () => { From dfeedeafa3e9e49a32f5b1c320eea38e15447649 Mon Sep 17 00:00:00 2001 From: James Manuel Date: Tue, 2 Jun 2026 12:36:42 +0200 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=90=9B=20fix(build):=20use=20static?= =?UTF-8?q?=20LESS=20import=20to=20prevent=20spurious=20webpack=20chunk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dynamic import('./less/app.less') caused webpack to emit a separate apps_documenteditor_mobile_src_less_app_less.js chunk. This chunk is not referenced by index.html, so deploying app.js without it broke CSS loading entirely — no FAB, black document area on all platforms. Change to a static import so MiniCssExtractPlugin extracts the LESS to the main CSS output file with no separate JS chunk. A clean build now produces only app.js + css/app.[hash].css, matching the original deployment structure. Co-Authored-By: Claude Sonnet 4.6 Signed-off-by: James Manuel --- apps/documenteditor/mobile/src/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/documenteditor/mobile/src/app.js b/apps/documenteditor/mobile/src/app.js index c7746e5394..a50e70dd4f 100644 --- a/apps/documenteditor/mobile/src/app.js +++ b/apps/documenteditor/mobile/src/app.js @@ -19,7 +19,7 @@ window.$ = jQuery; // Import Icons and App Custom Styles // import '../css/icons.css'; import '../../../common/mobile/resources/less/icons-preload.less'; -import('./less/app.less'); +import './less/app.less'; // Import App Component From 62ac583c6c6c6bf42add2784e8523392a6711f45 Mon Sep 17 00:00:00 2001 From: James Manuel Date: Tue, 2 Jun 2026 23:59:47 +0200 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=90=9B=20fix(ios):=20restore=20FAB=20?= =?UTF-8?q?visibility=20in=20WKWebView=20after=20static=20CSS=20import=20c?= =?UTF-8?q?hange?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With the static LESS import (dfeedeafa3), app.css loads via a before framework7.css is injected by load_stylesheet(). This reversed the CSS cascade order, causing framework7's .fab{z-index:1500} to override the app's .fab{z-index:10000}, and making getNavbarTotalHeight() return a real value at engine creation time instead of 0. The latter caused SetMobileTopOffset to fire onMobileScrollDelta immediately on document load, which the scroll handler interpreted as a downward scroll, hiding the FAB before the user could see it. Fixes: - Toolbar.jsx: guard scrollHandler with userHasScrolled ref so programmatic scroll deltas during init don't trigger FAB hide - app.less: use .page .fab selector to beat framework7.css specificity regardless of CSS load order Co-Authored-By: Claude Sonnet 4.6 Signed-off-by: James Manuel --- apps/documenteditor/mobile/index.html | 2 +- apps/documenteditor/mobile/src/controller/Toolbar.jsx | 3 +++ apps/documenteditor/mobile/src/less/app.less | 4 ++-- apps/documenteditor/mobile/src/page/main.jsx | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/documenteditor/mobile/index.html b/apps/documenteditor/mobile/index.html index ead2b07d50..58bed853c4 100644 --- a/apps/documenteditor/mobile/index.html +++ b/apps/documenteditor/mobile/index.html @@ -218,7 +218,7 @@ width: 24px; height: 24px; fill: var(--skl-toolbar-icons); -}