pinokiod 7.5.52 → 7.5.53
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 +1 -1
- package/server/views/app.ejs +26 -17
- package/test/launch-settings-ui.test.js +40 -2
package/package.json
CHANGED
package/server/views/app.ejs
CHANGED
|
@@ -85,7 +85,7 @@ body.app-page > header.navheader h1 > .home-server-popover {
|
|
|
85
85
|
}
|
|
86
86
|
.app-header-info {
|
|
87
87
|
position: relative;
|
|
88
|
-
flex:
|
|
88
|
+
flex: 0 1 auto;
|
|
89
89
|
min-width: 0;
|
|
90
90
|
display: inline-flex;
|
|
91
91
|
align-items: center;
|
|
@@ -100,8 +100,7 @@ body.app-page > header.navheader h1 > .home-server-popover {
|
|
|
100
100
|
align-items: center;
|
|
101
101
|
gap: 8px;
|
|
102
102
|
min-width: 0;
|
|
103
|
-
width:
|
|
104
|
-
max-width: none;
|
|
103
|
+
max-width: min(260px, 32vw);
|
|
105
104
|
height: 22px;
|
|
106
105
|
padding: 0 4px;
|
|
107
106
|
margin: 0 -4px;
|
|
@@ -325,11 +324,20 @@ body.app-page header.navheader .nav-labeled-action:focus-visible {
|
|
|
325
324
|
color: var(--pinokio-sidebar-tab-active-color);
|
|
326
325
|
}
|
|
327
326
|
@media only screen and (max-width: 1180px) {
|
|
328
|
-
body.app-page header.navheader .app-header-identity
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
327
|
+
body.app-page header.navheader .app-header-identity {
|
|
328
|
+
gap: 5px;
|
|
329
|
+
padding: 0 9px;
|
|
330
|
+
margin-right: 6px;
|
|
331
|
+
}
|
|
332
|
+
body.app-page header.navheader .app-header-info-trigger {
|
|
333
|
+
gap: 6px;
|
|
334
|
+
}
|
|
335
|
+
body.app-page header.navheader .resource-usage-trigger {
|
|
336
|
+
gap: 4px;
|
|
337
|
+
padding: 0 3px;
|
|
338
|
+
}
|
|
339
|
+
body.app-page header.navheader .resource-chip {
|
|
340
|
+
font-size: 10px;
|
|
333
341
|
}
|
|
334
342
|
}
|
|
335
343
|
.resource-usage {
|
|
@@ -6884,10 +6892,10 @@ header.navheader h1 {
|
|
|
6884
6892
|
min-width: 0;
|
|
6885
6893
|
display: flex;
|
|
6886
6894
|
align-items: center;
|
|
6887
|
-
justify-content:
|
|
6895
|
+
justify-content: center;
|
|
6888
6896
|
align-content: center;
|
|
6889
6897
|
flex-wrap: wrap;
|
|
6890
|
-
gap: 2px
|
|
6898
|
+
gap: 2px 8px;
|
|
6891
6899
|
min-height: 38px;
|
|
6892
6900
|
padding: 2px 9px;
|
|
6893
6901
|
border-radius: 999px;
|
|
@@ -6901,11 +6909,11 @@ header.navheader h1 {
|
|
|
6901
6909
|
background: rgba(255,255,255,0.06);
|
|
6902
6910
|
}
|
|
6903
6911
|
.mobile-bottom-nav .app-header-info {
|
|
6904
|
-
flex: 0 1
|
|
6905
|
-
max-width: 42
|
|
6912
|
+
flex: 0 1 auto;
|
|
6913
|
+
max-width: min(260px, 42%);
|
|
6906
6914
|
}
|
|
6907
6915
|
.mobile-bottom-nav .app-header-info-trigger {
|
|
6908
|
-
width:
|
|
6916
|
+
width: auto;
|
|
6909
6917
|
max-width: 100%;
|
|
6910
6918
|
height: auto;
|
|
6911
6919
|
min-height: 18px;
|
|
@@ -6976,14 +6984,15 @@ header.navheader h1 {
|
|
|
6976
6984
|
display: none;
|
|
6977
6985
|
}
|
|
6978
6986
|
.mobile-bottom-nav .resource-usage {
|
|
6979
|
-
flex:
|
|
6980
|
-
max-width:
|
|
6987
|
+
flex: 0 1 auto;
|
|
6988
|
+
max-width: 100%;
|
|
6981
6989
|
}
|
|
6982
6990
|
.mobile-bottom-nav .resource-usage-trigger {
|
|
6983
|
-
width:
|
|
6991
|
+
width: auto;
|
|
6992
|
+
max-width: 100%;
|
|
6984
6993
|
height: auto;
|
|
6985
6994
|
min-height: 0;
|
|
6986
|
-
justify-content:
|
|
6995
|
+
justify-content: center;
|
|
6987
6996
|
align-content: center;
|
|
6988
6997
|
flex-wrap: wrap;
|
|
6989
6998
|
gap: 2px 5px;
|
|
@@ -643,8 +643,23 @@ test("app navbar stays on one line when app identity and Home Server controls ar
|
|
|
643
643
|
assert.match(appView, /body\.app-page > header\.navheader h1 > \.home,[\s\S]*body\.app-page > header\.navheader h1 > \.home-server-popover\s*\{[\s\S]*flex:\s*0 0 auto;/)
|
|
644
644
|
assert.match(appView, /body\.app-page header\.navheader h1 > \.flexible\s*\{[\s\S]*flex:\s*0 0 0;[\s\S]*margin-left:\s*auto;/)
|
|
645
645
|
assert.match(appView, /\.app-header-identity\s*\{[\s\S]*flex:\s*1 1 auto;[\s\S]*max-width:\s*none;/)
|
|
646
|
+
assert.match(appView, /\.app-header-info\s*\{[\s\S]*flex:\s*0 1 auto;/)
|
|
647
|
+
const identityTriggerStart = appView.indexOf(".app-header-info-trigger {")
|
|
648
|
+
const identityTriggerEnd = appView.indexOf("\n}", identityTriggerStart)
|
|
649
|
+
const identityTriggerRule = identityTriggerStart >= 0 && identityTriggerEnd > identityTriggerStart
|
|
650
|
+
? appView.slice(identityTriggerStart, identityTriggerEnd)
|
|
651
|
+
: ""
|
|
652
|
+
assert.match(identityTriggerRule, /max-width:\s*min\(260px, 32vw\);/)
|
|
653
|
+
assert.doesNotMatch(identityTriggerRule, /width:\s*100%;/)
|
|
654
|
+
assert.doesNotMatch(identityTriggerRule, /max-width:\s*none;/)
|
|
646
655
|
assert.doesNotMatch(appView, /nav-action-label\s*\{[^}]*display:\s*none;/)
|
|
647
|
-
|
|
656
|
+
const compactRuleStart = appView.indexOf("@media only screen and (max-width: 1180px)")
|
|
657
|
+
const compactRuleEnd = appView.indexOf(".resource-usage {", compactRuleStart)
|
|
658
|
+
const compactHeaderRule = compactRuleStart >= 0 && compactRuleEnd > compactRuleStart
|
|
659
|
+
? appView.slice(compactRuleStart, compactRuleEnd)
|
|
660
|
+
: ""
|
|
661
|
+
assert.match(compactHeaderRule, /body\.app-page header\.navheader \.resource-usage-trigger\s*\{[\s\S]*gap:\s*4px;[\s\S]*padding:\s*0 3px;/)
|
|
662
|
+
assert.doesNotMatch(compactHeaderRule, /\.resource-chip--(?:cpu|ram|vram)[\s\S]*display:\s*none !important;/)
|
|
648
663
|
})
|
|
649
664
|
|
|
650
665
|
test("download page header does not show browser chrome controls", async () => {
|
|
@@ -970,7 +985,30 @@ test("app identity popover exposes launcher metadata and remote browser link", a
|
|
|
970
985
|
assert.match(appView, /window\.open\(href, "_blank"\)/)
|
|
971
986
|
assert.match(appView, /window\.open\(href, "_blank", "browser"\)/)
|
|
972
987
|
assert.match(appView, /No browser-openable remote detected/)
|
|
973
|
-
|
|
988
|
+
const cssRule = (selector) => {
|
|
989
|
+
const start = appView.indexOf(`${selector} {`)
|
|
990
|
+
if (start < 0) return ""
|
|
991
|
+
const tail = appView.slice(start)
|
|
992
|
+
const end = tail.match(/\n\s*\}/)
|
|
993
|
+
return end ? tail.slice(0, end.index + end[0].length) : ""
|
|
994
|
+
}
|
|
995
|
+
const mobileIdentityRule = cssRule(".mobile-bottom-nav__identity")
|
|
996
|
+
const mobileInfoRule = cssRule(".mobile-bottom-nav .app-header-info")
|
|
997
|
+
const mobileInfoTriggerRule = cssRule(".mobile-bottom-nav .app-header-info-trigger")
|
|
998
|
+
const mobileResourceRule = cssRule(".mobile-bottom-nav .resource-usage")
|
|
999
|
+
const mobileResourceTriggerRule = cssRule(".mobile-bottom-nav .resource-usage-trigger")
|
|
1000
|
+
assert.match(mobileIdentityRule, /justify-content:\s*center;/)
|
|
1001
|
+
assert.match(mobileIdentityRule, /overflow:\s*visible;/)
|
|
1002
|
+
assert.doesNotMatch(mobileIdentityRule, /justify-content:\s*flex-start;/)
|
|
1003
|
+
assert.match(mobileInfoRule, /flex:\s*0 1 auto;/)
|
|
1004
|
+
assert.match(mobileInfoRule, /max-width:\s*min\(260px, 42%\);/)
|
|
1005
|
+
assert.match(mobileInfoTriggerRule, /width:\s*auto;/)
|
|
1006
|
+
assert.doesNotMatch(mobileInfoTriggerRule, /(^|\n)\s*width:\s*100%;/)
|
|
1007
|
+
assert.match(mobileResourceRule, /flex:\s*0 1 auto;/)
|
|
1008
|
+
assert.match(mobileResourceRule, /max-width:\s*100%;/)
|
|
1009
|
+
assert.match(mobileResourceTriggerRule, /width:\s*auto;/)
|
|
1010
|
+
assert.match(mobileResourceTriggerRule, /justify-content:\s*center;/)
|
|
1011
|
+
assert.doesNotMatch(mobileResourceTriggerRule, /justify-content:\s*flex-start;/)
|
|
974
1012
|
assert.match(appView, /\.mobile-bottom-nav \.app-header-info-popover \{[\s\S]*bottom: calc\(100% \+ 9px\);[\s\S]*width: min\(390px, calc\(100vw - 24px\)\);/)
|
|
975
1013
|
assert.match(appView, /\.mobile-bottom-nav \.resource-usage-popover \{[\s\S]*bottom: calc\(100% \+ 9px\);/)
|
|
976
1014
|
assert.doesNotMatch(appView, /Open launcher remote/)
|