dsh-mobile 0.8.1 → 0.8.3
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/CHANGELOG.md +33 -0
- package/CONTRIBUTORS.md +30 -2
- package/README.en.md +7 -5
- package/README.md +7 -5
- package/SECURITY.md +1 -1
- package/THIRD_PARTY_NOTICES.md +1 -1
- package/apps/mobile/README.md +8 -4
- package/apps/mobile/README.zh-CN.md +8 -4
- package/apps/mobile/release.json +3 -3
- package/docs/ATTACH_EXISTING_FRPS.en.md +2 -0
- package/docs/ATTACH_EXISTING_FRPS.md +2 -0
- package/docs/CLIENT_MODULES.en.md +6 -2
- package/docs/CLIENT_MODULES.md +6 -2
- package/docs/CONNECTION_DIAGNOSTICS.en.md +56 -0
- package/docs/CONNECTION_DIAGNOSTICS.md +56 -0
- package/docs/IROH.en.md +7 -1
- package/docs/IROH.md +7 -1
- package/docs/MOBILE_PLUGIN_ADAPTATION.en.md +1 -1
- package/docs/MOBILE_PLUGIN_ADAPTATION.md +1 -1
- package/docs/README.md +1 -0
- package/docs/SKIN_COMPATIBILITY.en.md +1 -1
- package/docs/SKIN_COMPATIBILITY.md +1 -1
- package/docs/SLOW_CONNECTIONS.en.md +6 -2
- package/docs/SLOW_CONNECTIONS.md +6 -2
- package/lib/cli.js +6 -12
- package/lib/cli.js.map +1 -1
- package/lib/client.js +772 -248
- package/lib/client.js.map +1 -1
- package/lib/extension-worker-runtime.mjs +4 -8
- package/lib/extension-worker-runtime.mjs.map +1 -1
- package/lib/index.d.mts +19 -89
- package/lib/index.mjs +397 -273
- package/lib/index.mjs.map +1 -1
- package/lib/mobile-compat.js +2 -2
- package/lib/mobile-compat.js.map +1 -1
- package/lib/mobile-layout.js +116 -33
- package/lib/mobile-layout.js.map +1 -1
- package/package.json +9 -7
- package/packages/question-fixes/lib/client.js +1 -2
- package/packages/question-fixes/lib/index.mjs +1 -2
- package/packages/question-fixes/package.json +1 -1
package/lib/mobile-layout.js
CHANGED
|
@@ -5,7 +5,21 @@ window.__ModuleLoader__.load({
|
|
|
5
5
|
var exports = module.exports;
|
|
6
6
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
7
7
|
let react = require("react");
|
|
8
|
-
|
|
8
|
+
// src/mobile-layout-attributes.ts
|
|
9
|
+
/**
|
|
10
|
+
* Root marker the dedicated layout publishes for its wide/narrow band.
|
|
11
|
+
*
|
|
12
|
+
* The band depends on the device screen size, which a media query cannot read,
|
|
13
|
+
* so the layout decides it in JS and writes this attribute on `.dshm-shell`:
|
|
14
|
+
* `"1"` docks the sidebar, anything else — `"0"`, or no marker — is the overlay
|
|
15
|
+
* drawer. The stylesheet and the sidebar scroll adapter both follow the marker,
|
|
16
|
+
* so the band has exactly one owner.
|
|
17
|
+
*
|
|
18
|
+
* This module stays free of imports: the dedicated layout bundle and the native
|
|
19
|
+
* client bundle both use it, and neither should pull the other in.
|
|
20
|
+
*/
|
|
21
|
+
const WIDE_LAYOUT_ATTRIBUTE = "data-dshm-wide";
|
|
22
|
+
// src/mobile-layout-messages.ts
|
|
9
23
|
const MOBILE_LAYOUT_MESSAGES = Object.freeze({
|
|
10
24
|
it: Object.freeze({
|
|
11
25
|
closePanels: "Chiudi pannelli",
|
|
@@ -23,8 +37,7 @@ window.__ModuleLoader__.load({
|
|
|
23
37
|
backToConversation: "返回会话"
|
|
24
38
|
})
|
|
25
39
|
});
|
|
26
|
-
|
|
27
|
-
//#region src/mobile-layout.ts
|
|
40
|
+
// src/mobile-layout.ts
|
|
28
41
|
/** Whether an optional service value supports the public right-Sidebar controls. */
|
|
29
42
|
function isSidebarRightControl(value) {
|
|
30
43
|
if (typeof value !== "object" || value === null) return false;
|
|
@@ -37,24 +50,62 @@ window.__ModuleLoader__.load({
|
|
|
37
50
|
* keep the overlay behavior byte-for-byte.
|
|
38
51
|
*/
|
|
39
52
|
const WIDE_LAYOUT_MIN_WIDTH_PX = 900;
|
|
53
|
+
/**
|
|
54
|
+
* Shorter-side floor for the persistent sidebar, measured on the *device*: a
|
|
55
|
+
* landscape phone is wider than the width threshold while its screen's short
|
|
56
|
+
* side is still a phone's. Docking a 932x430 phone hid the conversation behind a
|
|
57
|
+
* permanent rail and removed the panel return bar, so width alone is not enough
|
|
58
|
+
* evidence of a tablet-sized viewport.
|
|
59
|
+
*
|
|
60
|
+
* The measurement must come from `screen`, not the viewport: a Pad 9 Pro Max in
|
|
61
|
+
* landscape (1363x860 viewport, 1364x909 screen) reports `innerHeight: 441`
|
|
62
|
+
* while the soft keyboard is open, and a viewport-height floor would flip a
|
|
63
|
+
* docked tablet into the drawer layout mid-sentence.
|
|
64
|
+
*/
|
|
65
|
+
const WIDE_LAYOUT_MIN_SHORTER_SIDE_PX = 600;
|
|
66
|
+
/**
|
|
67
|
+
* Narrow band that still has room for a folded 56px rail beside the
|
|
68
|
+
* conversation: the pre-existing 721-899px phone rule plus any narrow viewport
|
|
69
|
+
* that is wide enough for the rail, such as a landscape phone.
|
|
70
|
+
*/
|
|
71
|
+
const FOLDED_RAIL_OFFSET_QUERY = "(min-width:721px)";
|
|
40
72
|
const RIGHTBAR_MIN_WIDTH_PX = 300;
|
|
41
73
|
const RIGHTBAR_MAX_WIDTH_PX = 460;
|
|
42
74
|
const RIGHTBAR_CENTER_MIN_WIDTH_PX = 400;
|
|
43
75
|
const RIGHTBAR_DEFAULT_RATIO = .45;
|
|
44
76
|
const SIDEBAR_EXPANDED_WIDTH_PX = 340;
|
|
45
77
|
const SIDEBAR_COLLAPSED_WIDTH_PX = 56;
|
|
46
|
-
|
|
47
|
-
|
|
78
|
+
/**
|
|
79
|
+
* The device's shorter side in CSS pixels, independent of rotation and of the
|
|
80
|
+
* soft keyboard. Falls back to the viewport only where `screen` reports nothing
|
|
81
|
+
* usable (SSR, minimal DOM stubs).
|
|
82
|
+
* @param screenWidth - `screen.width`, or `undefined` without a screen.
|
|
83
|
+
* @param screenHeight - `screen.height`, or `undefined` without a screen.
|
|
84
|
+
* @param viewportWidth - the viewport width, used for the fallback.
|
|
85
|
+
* @param viewportHeight - the viewport height, used for the fallback.
|
|
86
|
+
* @returns the shorter side in CSS pixels.
|
|
87
|
+
*/
|
|
88
|
+
function resolveDeviceShortSide(screenWidth, screenHeight, viewportWidth, viewportHeight) {
|
|
89
|
+
return typeof screenWidth === "number" && typeof screenHeight === "number" && screenWidth > 0 && screenHeight > 0 ? Math.min(screenWidth, screenHeight) : Math.min(viewportWidth, viewportHeight);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Whether the dedicated layout should dock the sidebar as a persistent column.
|
|
93
|
+
* @param viewportWidth - the viewport width in CSS pixels; a narrow window is
|
|
94
|
+
* never wide, whatever the screen behind it measures.
|
|
95
|
+
* @param deviceShortSide - the device's shorter side, from {@link resolveDeviceShortSide}.
|
|
96
|
+
* @returns whether the viewport and the device are both large enough.
|
|
97
|
+
*/
|
|
98
|
+
function isWideViewportLayout(viewportWidth, deviceShortSide) {
|
|
99
|
+
return viewportWidth >= 900 && deviceShortSide >= 600;
|
|
48
100
|
}
|
|
49
101
|
/** Preserve a readable conversation width before turning a requested right track into a docked column. */
|
|
50
|
-
function resolveMobileRightbarLayout(viewportWidth, sidebarOpen, track, fullscreen) {
|
|
51
|
-
const overlayWidth =
|
|
52
|
-
if (!track || fullscreen || !
|
|
102
|
+
function resolveMobileRightbarLayout(viewportWidth, wideViewport, sidebarOpen, track, fullscreen) {
|
|
103
|
+
const overlayWidth = wideViewport ? Math.min(viewportWidth * .94, RIGHTBAR_MAX_WIDTH_PX) : viewportWidth;
|
|
104
|
+
if (!track || fullscreen || !wideViewport && sidebarOpen) return Object.freeze({
|
|
53
105
|
docked: false,
|
|
54
106
|
width: overlayWidth
|
|
55
107
|
});
|
|
56
|
-
const
|
|
57
|
-
const available = Math.floor(viewportWidth - sidebarWidth - RIGHTBAR_CENTER_MIN_WIDTH_PX);
|
|
108
|
+
const available = Math.floor(viewportWidth - (wideViewport && sidebarOpen ? SIDEBAR_EXPANDED_WIDTH_PX : SIDEBAR_COLLAPSED_WIDTH_PX) - RIGHTBAR_CENTER_MIN_WIDTH_PX);
|
|
58
109
|
if (available < RIGHTBAR_MIN_WIDTH_PX) return Object.freeze({
|
|
59
110
|
docked: false,
|
|
60
111
|
width: overlayWidth
|
|
@@ -250,10 +301,26 @@ window.__ModuleLoader__.load({
|
|
|
250
301
|
if (isSidebarRightControl(sidebarRight) && sidebarRight.isExpanded()) sidebarRight.toggleExpanded();
|
|
251
302
|
closeDetails();
|
|
252
303
|
}
|
|
253
|
-
/**
|
|
304
|
+
/** The device and viewport facts the layout decision needs, read live. */
|
|
305
|
+
function readViewport() {
|
|
306
|
+
const width = window.innerWidth;
|
|
307
|
+
const height = window.innerHeight;
|
|
308
|
+
const screen = window.screen;
|
|
309
|
+
return {
|
|
310
|
+
width,
|
|
311
|
+
height,
|
|
312
|
+
shortSide: resolveDeviceShortSide(screen?.width, screen?.height, width, height)
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Reads the live device and viewport; unknown environments (SSR, tests) stay
|
|
317
|
+
* narrow. `screen` is what distinguishes a tablet from a landscape phone and
|
|
318
|
+
* what keeps a docked tablet docked while its soft keyboard is open.
|
|
319
|
+
*/
|
|
254
320
|
function viewportIsWide() {
|
|
255
|
-
if (typeof window === "undefined"
|
|
256
|
-
|
|
321
|
+
if (typeof window === "undefined") return false;
|
|
322
|
+
const viewport = readViewport();
|
|
323
|
+
return isWideViewportLayout(viewport.width, viewport.shortSide);
|
|
257
324
|
}
|
|
258
325
|
/** Resolve the supported language used by the dedicated mobile layout. */
|
|
259
326
|
function resolveMobileLayoutLanguage(documentLanguage, browserLanguages) {
|
|
@@ -408,10 +475,12 @@ html,body,#root{width:100%;height:100%;overflow:hidden}
|
|
|
408
475
|
shell descendants below positive-z-index portals attached to document.body. */
|
|
409
476
|
.dshm-shell{-webkit-text-size-adjust:100%;text-size-adjust:100%;position:relative;isolation:isolate;display:grid;grid-template-rows:minmax(0,1fr);width:100%;height:100%;height:100dvh;min-width:0;overflow:hidden;background:var(--dsw-alias-bg-base,#fff)}
|
|
410
477
|
/* The mobile root owns its Grid geometry. Layered important rules keep broad
|
|
411
|
-
unlayered skin rules from collapsing virtualized views to the header height.
|
|
478
|
+
unlayered skin rules from collapsing virtualized views to the header height.
|
|
479
|
+
The wide/narrow band is the root attribute, not a media query: the decision
|
|
480
|
+
needs the device screen size, which a media query cannot read. */
|
|
412
481
|
@layer dsh-mobile-layout{
|
|
413
482
|
.dshm-shell{display:grid!important;grid-template-rows:minmax(0,1fr)!important;grid-template-columns:minmax(0,1fr)!important}
|
|
414
|
-
|
|
483
|
+
.dshm-shell[${WIDE_LAYOUT_ATTRIBUTE}="1"]{grid-template-columns:auto minmax(0,1fr)!important}
|
|
415
484
|
}
|
|
416
485
|
.dshm-main{grid-area:1/1;position:relative;display:flex;flex-direction:column;min-width:0;min-height:0;margin-right:0;overflow:hidden;transition:margin-right var(--ds-transition-duration-slow,190ms) var(--ds-ease-in-out,ease)}
|
|
417
486
|
.dshm-mainContent{position:relative;flex:1;min-width:0;min-height:0;overflow:hidden}
|
|
@@ -433,14 +502,19 @@ html,body,#root{width:100%;height:100%;overflow:hidden}
|
|
|
433
502
|
.dshm-drawer[data-open=true]>*{transform:translateX(0);opacity:1}
|
|
434
503
|
.dshm-drawer[data-open=false]>*{width:56px!important}
|
|
435
504
|
/* Folded icon rail: on narrow viewports the drawer is fixed, so give the main
|
|
436
|
-
content the same 56px offset the wide grid
|
|
437
|
-
|
|
505
|
+
content the same 56px offset the wide grid already provides. The width floor
|
|
506
|
+
keeps phone-width headers on their own inset; the band itself is the root
|
|
507
|
+
attribute, so a landscape phone gets the offset too. */
|
|
508
|
+
@media${FOLDED_RAIL_OFFSET_QUERY}{.dshm-shell:not([${WIDE_LAYOUT_ATTRIBUTE}="1"]):has(.dshm-drawer[data-sidebar-collapsed]:not([data-right-modal=true])) .dshm-main{margin-left:56px}}
|
|
438
509
|
/* display:none also suppresses fixed descendants installed by the phone adapter. */
|
|
439
510
|
.dshm-drawer[data-right-modal=true]{display:none!important}
|
|
440
511
|
.dshm-details{position:fixed;z-index:80;inset:0 0 0 auto;box-sizing:border-box;width:min(94vw,460px);max-width:100%;padding-top:env(safe-area-inset-top);overflow:hidden;background-color:Canvas;background-image:linear-gradient(var(--dsw-alias-bg-layer-1,#fff),var(--dsw-alias-bg-layer-1,#fff));box-shadow:-18px 0 46px rgb(15 23 42 / 18%);transform:translateX(104%);transition:transform 190ms cubic-bezier(.22,1,.36,1)}
|
|
441
512
|
.dshm-details[data-open=true]{transform:translateX(0)}
|
|
442
513
|
.dshm-details[data-open=false]{pointer-events:none;visibility:hidden;transition:transform 190ms cubic-bezier(.22,1,.36,1),visibility 0s linear 190ms}
|
|
443
|
-
|
|
514
|
+
/* An absent marker is the narrow default: static fixtures and the first paint
|
|
515
|
+
before React mounts keep the overlay geometry rather than a half-docked shell. */
|
|
516
|
+
.dshm-shell:not([${WIDE_LAYOUT_ATTRIBUTE}="1"]) .dshm-details{width:100%;max-width:100%;box-shadow:none}
|
|
517
|
+
.dshm-shell:not([${WIDE_LAYOUT_ATTRIBUTE}="1"]) .dshm-details [data-sidebar-right-toggle],.dshm-shell:not([${WIDE_LAYOUT_ATTRIBUTE}="1"]) .dshm-details [data-sidebar-right-mode]{min-width:48px;min-height:48px}
|
|
444
518
|
.dshm-scrim{position:fixed;z-index:65;inset:0;border:0;background:rgb(15 23 42 / 40%);opacity:0;pointer-events:none;transition:opacity 180ms ease-out}
|
|
445
519
|
.dshm-scrim[data-open=true]{opacity:1;pointer-events:auto}
|
|
446
520
|
.dshm-overlay{position:fixed;z-index:90;inset:0;pointer-events:none}.dshm-overlay>*{pointer-events:auto}
|
|
@@ -452,7 +526,9 @@ html,body,#root{width:100%;height:100%;overflow:hidden}
|
|
|
452
526
|
.dshm-panelBack:disabled{opacity:.5;cursor:default}
|
|
453
527
|
.dshm-panelBack:focus-visible{outline:2px solid var(--dsw-alias-label-primary,#171a21);outline-offset:2px}
|
|
454
528
|
.dshm-panelBack svg{width:20px;height:20px;flex-shrink:0}
|
|
455
|
-
.dshm-shell header{min-width:0
|
|
529
|
+
.dshm-shell header{min-width:0}
|
|
530
|
+
/* A panel owns its header padding; only conversation content clears the rail. */
|
|
531
|
+
.dshm-shell :where(.dshm-main:not([data-dsh-panel="1"])) header{padding-left:52px}
|
|
456
532
|
/* Keep focused editables above Safari's 16px zoom threshold while retaining
|
|
457
533
|
the DSH content-font preference and larger inherited text. Stock menus
|
|
458
534
|
portal into document.body, so the floor scopes from the body itself. */
|
|
@@ -481,30 +557,33 @@ body:has(.dshm-shell) :is(input,textarea,[contenteditable=true],[contenteditable
|
|
|
481
557
|
.dshm-shell [data-plan-review-key]>section>div:last-child>div:last-child>button:first-child{grid-column:1/-1}
|
|
482
558
|
.dshm-shell [data-plan-review-key]>section>div:last-child button{width:100%;min-height:44px}
|
|
483
559
|
}
|
|
484
|
-
|
|
485
|
-
.
|
|
560
|
+
/* Wide band: the shell carries the decision, so these rules follow the same
|
|
561
|
+
device+viewport test as the JS. An absent attribute is the narrow default. */
|
|
562
|
+
.dshm-shell[${WIDE_LAYOUT_ATTRIBUTE}="1"]{grid-template-columns:auto minmax(0,1fr)}
|
|
486
563
|
/* The wide drawer is a static grid column, not an overlay: it occupies its own
|
|
487
564
|
track and never overlaps the conversation. Keeping a z-index here made it
|
|
488
565
|
outrank the conversation column, so a dialog a plugin mounts inside the
|
|
489
566
|
composer's own stacking context lost its left edge behind the opaque rail.
|
|
490
567
|
A static column needs no layer, so it stays in normal flow order. */
|
|
491
|
-
.dshm-drawer{position:static;grid-area:1/1;box-shadow:none;z-index:auto}
|
|
492
|
-
.dshm-drawer[data-open=true]{width:340px;box-shadow:none}
|
|
493
|
-
.dshm-drawer[data-open=false]{width:56px}
|
|
568
|
+
.dshm-shell[${WIDE_LAYOUT_ATTRIBUTE}="1"] .dshm-drawer{position:static;grid-area:1/1;box-shadow:none;z-index:auto}
|
|
569
|
+
.dshm-shell[${WIDE_LAYOUT_ATTRIBUTE}="1"] .dshm-drawer[data-open=true]{width:340px;box-shadow:none}
|
|
570
|
+
.dshm-shell[${WIDE_LAYOUT_ATTRIBUTE}="1"] .dshm-drawer[data-open=false]{width:56px}
|
|
494
571
|
/* The conversation column outranks that column so an in-shell modal opened from
|
|
495
572
|
it is not clipped by the navigation rail. It stays below the scrim (65), the
|
|
496
573
|
detail panel (80) and the shell overlay (90), so a modal shell surface still
|
|
497
574
|
dims and covers it. Only the wide grid needs this: on a phone the drawer is a
|
|
498
575
|
floating overlay and must keep covering the conversation. */
|
|
499
|
-
.dshm-main{grid-area:1/2;z-index:1}
|
|
500
|
-
}
|
|
576
|
+
.dshm-shell[${WIDE_LAYOUT_ATTRIBUTE}="1"] .dshm-main{grid-area:1/2;z-index:1}
|
|
501
577
|
@media(prefers-reduced-motion:reduce){.dshm-drawer,.dshm-details,.dshm-scrim,.dshm-drawer>*,.dshm-main{transition:none!important}}
|
|
502
578
|
/* Touch adaptation changes control boxes, not invisible hit regions. Root opt-out
|
|
503
|
-
retains pane geometry too; nested opt-out preserves a widget's own controls.
|
|
579
|
+
retains pane geometry too; nested opt-out preserves a widget's own controls.
|
|
580
|
+
DSH's plugin cards open through a cardTitle/cardOpen button whose ::after
|
|
581
|
+
overlay already owns the whole card hit area; the floor only inflated that
|
|
582
|
+
title box and pushed each description away from its card title. */
|
|
504
583
|
@media(pointer:coarse){
|
|
505
584
|
.dshm-main[data-dsh-panel="1"] .dshm-mainContent:has(>[data-slot="main"]>:not([data-dsh-adapt="off"])):not(:has(>[data-slot="main"]>[data-dsh-adapt="off"])){overflow-y:auto;overscroll-behavior:contain}
|
|
506
585
|
.dshm-main[data-dsh-panel="1"] .dshm-mainContent>[data-slot="main"]>:not([data-dsh-adapt="off"]){max-width:100%;box-sizing:border-box}
|
|
507
|
-
.dshm-main[data-dsh-panel="1"] [data-slot="main"]>:not([data-dsh-adapt="off"]) :is(button,[role="button"],select,input:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=hidden]):not([type=color]):not([type=file]):not([type=image])):not([role="switch"],[role="checkbox"],[role="radio"],[role="slider"],[data-dsh-adapt="off"],[data-dsh-adapt="off"] *){min-width:44px!important;min-height:44px!important}
|
|
586
|
+
.dshm-main[data-dsh-panel="1"] [data-slot="main"]>:not([data-dsh-adapt="off"]) :is(button,[role="button"],select,input:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=hidden]):not([type=color]):not([type=file]):not([type=image])):not([role="switch"],[role="checkbox"],[role="radio"],[role="slider"],button[class*="_cardTitle"][class*="_cardOpen"],[data-dsh-adapt="off"],[data-dsh-adapt="off"] *){min-width:44px!important;min-height:44px!important}
|
|
508
587
|
.dshm-main[data-dsh-panel="1"] [data-slot="main"]>:not([data-dsh-adapt="off"]) :is(button,[role="button"],a):not([data-dsh-adapt="off"],[data-dsh-adapt="off"] *){touch-action:manipulation}
|
|
509
588
|
}
|
|
510
589
|
`;
|
|
@@ -531,14 +610,14 @@ body:has(.dshm-shell) :is(input,textarea,[contenteditable=true],[contenteditable
|
|
|
531
610
|
const active = document.activeElement;
|
|
532
611
|
if (active instanceof HTMLElement && active.matches(COMPOSER_EDITOR_SELECTOR)) active.blur();
|
|
533
612
|
}, [state.panelInfo.activePanelId]);
|
|
534
|
-
const [
|
|
613
|
+
const [viewport, setViewport] = (0, react.useState)(readViewport);
|
|
535
614
|
(0, react.useEffect)(() => {
|
|
536
615
|
let frame;
|
|
537
616
|
const resize = () => {
|
|
538
617
|
if (frame !== void 0) return;
|
|
539
618
|
frame = window.requestAnimationFrame(() => {
|
|
540
619
|
frame = void 0;
|
|
541
|
-
|
|
620
|
+
setViewport(readViewport());
|
|
542
621
|
});
|
|
543
622
|
};
|
|
544
623
|
window.addEventListener("resize", resize);
|
|
@@ -547,8 +626,9 @@ body:has(.dshm-shell) :is(input,textarea,[contenteditable=true],[contenteditable
|
|
|
547
626
|
if (frame !== void 0) window.cancelAnimationFrame(frame);
|
|
548
627
|
};
|
|
549
628
|
}, []);
|
|
550
|
-
const
|
|
551
|
-
const
|
|
629
|
+
const viewportWidth = viewport.width;
|
|
630
|
+
const wideViewport = isWideViewportLayout(viewport.width, viewport.shortSide);
|
|
631
|
+
const rightbar = resolveMobileRightbarLayout(viewport.width, wideViewport, state.sidebarOpen, state.rightbarTrack, state.rightbarFullscreen);
|
|
552
632
|
const rightbarDocked = state.detailsOpen && rightbar.docked;
|
|
553
633
|
const rightbarFullscreen = state.detailsOpen && state.rightbarFullscreen;
|
|
554
634
|
const rightbarFullWidth = state.detailsOpen && !rightbarDocked && (!wideViewport || rightbarFullscreen);
|
|
@@ -665,6 +745,7 @@ body:has(.dshm-shell) :is(input,textarea,[contenteditable=true],[contenteditable
|
|
|
665
745
|
return (0, react.createElement)("div", {
|
|
666
746
|
className: "dshm-shell",
|
|
667
747
|
lang: language,
|
|
748
|
+
[WIDE_LAYOUT_ATTRIBUTE]: wideViewport ? "1" : "0",
|
|
668
749
|
"data-rightbar-docked": rightbarDocked,
|
|
669
750
|
"data-rightbar-fullscreen": rightbarFullscreen,
|
|
670
751
|
style: { "--dshm-rightbar-width": `${rightbar.width}px` }
|
|
@@ -834,10 +915,11 @@ body:has(.dshm-shell) :is(input,textarea,[contenteditable=true],[contenteditable
|
|
|
834
915
|
}
|
|
835
916
|
/** Preserve the official layout module's dependency ordering. */
|
|
836
917
|
const inject = ["slots", "theme"];
|
|
837
|
-
//#endregion
|
|
838
918
|
exports.MOBILE_LAYOUT_MESSAGES = MOBILE_LAYOUT_MESSAGES;
|
|
839
919
|
exports.MOBILE_LAYOUT_STYLES = MOBILE_LAYOUT_STYLES;
|
|
840
920
|
exports.TOUCH_PRIMARY_QUERY = TOUCH_PRIMARY_QUERY;
|
|
921
|
+
exports.WIDE_LAYOUT_ATTRIBUTE = WIDE_LAYOUT_ATTRIBUTE;
|
|
922
|
+
exports.WIDE_LAYOUT_MIN_SHORTER_SIDE_PX = WIDE_LAYOUT_MIN_SHORTER_SIDE_PX;
|
|
841
923
|
exports.WIDE_LAYOUT_MIN_WIDTH_PX = WIDE_LAYOUT_MIN_WIDTH_PX;
|
|
842
924
|
exports.apply = apply;
|
|
843
925
|
exports.closeDetailsFromScrim = closeDetailsFromScrim;
|
|
@@ -850,6 +932,7 @@ body:has(.dshm-shell) :is(input,textarea,[contenteditable=true],[contenteditable
|
|
|
850
932
|
exports.isSidebarRightControl = isSidebarRightControl;
|
|
851
933
|
exports.isWideViewportLayout = isWideViewportLayout;
|
|
852
934
|
exports.resolveComposerImePolicy = resolveComposerImePolicy;
|
|
935
|
+
exports.resolveDeviceShortSide = resolveDeviceShortSide;
|
|
853
936
|
exports.resolveMobileLayoutLanguage = resolveMobileLayoutLanguage;
|
|
854
937
|
exports.resolveMobileRightbarLayout = resolveMobileRightbarLayout;
|
|
855
938
|
return module.exports;
|