pinokiod 7.5.19 → 7.5.21

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.
Files changed (34) hide show
  1. package/kernel/bin/index.js +0 -5
  2. package/kernel/bin/setup.js +0 -1
  3. package/kernel/index.js +0 -3
  4. package/package.json +1 -1
  5. package/server/public/common.js +1 -1
  6. package/server/public/style.css +34 -0
  7. package/server/public/urldropdown.css +272 -0
  8. package/server/public/urldropdown.js +44 -12
  9. package/server/views/app.ejs +190 -146
  10. package/server/views/autolaunch.ejs +10 -1
  11. package/server/views/columns.ejs +13 -1
  12. package/server/views/d.ejs +54 -137
  13. package/server/views/index.ejs +14 -6
  14. package/server/views/partials/app_autolaunch_modal_helpers.ejs +4 -0
  15. package/server/views/partials/d_column_subtitle.ejs +10 -0
  16. package/server/views/partials/d_menu_column.ejs +18 -0
  17. package/server/views/partials/d_terminal_column.ejs +2 -11
  18. package/server/views/partials/d_terminal_options.ejs +1 -18
  19. package/server/views/partials/d_tool_tab.ejs +32 -0
  20. package/server/views/partials/main_sidebar.ejs +3 -0
  21. package/server/views/rows.ejs +13 -1
  22. package/system/plugin/antigravity-cli/common.js +10 -16
  23. package/test/antigravity-cli-plugin.test.js +26 -19
  24. package/test/home-autolaunch-live-ui.test.js +70 -0
  25. package/test/launch-requirements-browser.test.js +259 -3
  26. package/test/plugin-dev-iframe.test.js +67 -1
  27. package/test/plugin-sources.test.js +1 -1
  28. package/test/url-split-modal.test.js +107 -0
  29. package/system/plugin/crush/crush.png +0 -0
  30. package/system/plugin/crush/pinokio.js +0 -15
  31. package/system/plugin/qwen/pinokio.js +0 -34
  32. package/system/plugin/qwen/qwen.png +0 -0
  33. package/system/plugin/windsurf/pinokio.js +0 -23
  34. package/system/plugin/windsurf/windsurf.png +0 -0
@@ -348,6 +348,7 @@ body.dark .snapshot-comment {
348
348
  padding: 0;
349
349
  border-radius: 9px;
350
350
  box-sizing: border-box;
351
+ transition: background-color 140ms cubic-bezier(0.25, 1, 0.5, 1), box-shadow 140ms cubic-bezier(0.25, 1, 0.5, 1), color 140ms cubic-bezier(0.25, 1, 0.5, 1);
351
352
  }
352
353
  body.dark #sidebar-toggle {
353
354
  color: rgba(248, 250, 252, 0.92);
@@ -383,7 +384,8 @@ body.dark #sidebar-toggle[aria-expanded="true"] {
383
384
  width: 4px;
384
385
  border-radius: 1px;
385
386
  background: currentColor;
386
- transition: opacity 0.15s ease, background 0.15s ease, border-color 0.15s ease;
387
+ transform-origin: left center;
388
+ transition: opacity 150ms cubic-bezier(0.25, 1, 0.5, 1), transform 150ms cubic-bezier(0.25, 1, 0.5, 1), background-color 150ms cubic-bezier(0.25, 1, 0.5, 1), border-color 150ms cubic-bezier(0.25, 1, 0.5, 1);
387
389
  }
388
390
  .sidebar-toggle-content {
389
391
  position: absolute;
@@ -395,12 +397,18 @@ body.dark #sidebar-toggle[aria-expanded="true"] {
395
397
  background: currentColor;
396
398
  opacity: 0.32;
397
399
  box-shadow: 0 3.8px 0 currentColor, 0 7.6px 0 currentColor;
400
+ transition: opacity 150ms cubic-bezier(0.25, 1, 0.5, 1), transform 150ms cubic-bezier(0.25, 1, 0.5, 1);
398
401
  }
399
402
  #sidebar-toggle[aria-expanded="false"] .sidebar-toggle-panel {
400
403
  background: transparent;
401
404
  outline: 1.5px solid currentColor;
402
405
  outline-offset: -1px;
403
406
  opacity: 0.35;
407
+ transform: translateX(-1px) scaleX(0.8);
408
+ }
409
+ #sidebar-toggle[aria-expanded="false"] .sidebar-toggle-content {
410
+ opacity: 0.42;
411
+ transform: translateX(-2px);
404
412
  }
405
413
  #devtab {
406
414
  align-items: center;
@@ -1999,6 +2007,7 @@ body.dark .appcanvas_filler {
1999
2007
  cursor: col-resize;
2000
2008
  touch-action: none;
2001
2009
  outline: none;
2010
+ opacity: 1;
2002
2011
  }
2003
2012
  /*
2004
2013
  .appcanvas.vertical .appcanvas-resizer:hover::before {
@@ -2063,6 +2072,26 @@ body.dark .appcanvas > aside {
2063
2072
  --sidebar-tab-radius: 6px;
2064
2073
  --sidebar-tab-selected-translate: 0;
2065
2074
  --sidebar-tab-outline: var(--pinokio-sidebar-tabbar-border);
2075
+ opacity: 1;
2076
+ transform: translateX(0);
2077
+ }
2078
+
2079
+ .appcanvas.vertical > aside {
2080
+ flex: 0 0 var(--appcanvas-sidebar-width);
2081
+ width: var(--appcanvas-sidebar-width);
2082
+ max-width: var(--appcanvas-sidebar-width);
2083
+ }
2084
+
2085
+ .appcanvas.sidebar-motion-ready > aside,
2086
+ .appcanvas.sidebar-motion-ready > aside .menu-container,
2087
+ .appcanvas.sidebar-motion-ready .appcanvas-resizer {
2088
+ transition: flex-basis 190ms cubic-bezier(0.25, 1, 0.5, 1), width 190ms cubic-bezier(0.25, 1, 0.5, 1), max-width 190ms cubic-bezier(0.25, 1, 0.5, 1), margin 190ms cubic-bezier(0.25, 1, 0.5, 1), opacity 140ms cubic-bezier(0.25, 1, 0.5, 1), transform 190ms cubic-bezier(0.25, 1, 0.5, 1);
2089
+ }
2090
+
2091
+ .appcanvas.sidebar-resizing > aside,
2092
+ .appcanvas.sidebar-resizing > aside .menu-container,
2093
+ .appcanvas.sidebar-resizing .appcanvas-resizer {
2094
+ transition: none !important;
2066
2095
  }
2067
2096
 
2068
2097
  .appcanvas.sidebar-collapsed > aside {
@@ -2073,6 +2102,7 @@ body.dark .appcanvas > aside {
2073
2102
  opacity: 0;
2074
2103
  pointer-events: none;
2075
2104
  overflow: hidden;
2105
+ transform: translateX(-10px);
2076
2106
  }
2077
2107
 
2078
2108
  .appcanvas.sidebar-collapsed > aside .menu-container {
@@ -2080,7 +2110,24 @@ body.dark .appcanvas > aside {
2080
2110
  }
2081
2111
 
2082
2112
  .appcanvas.sidebar-collapsed .appcanvas-resizer {
2083
- display: none;
2113
+ flex-basis: 0;
2114
+ width: 0;
2115
+ min-width: 0;
2116
+ margin-left: 0;
2117
+ margin-right: 0;
2118
+ opacity: 0;
2119
+ pointer-events: none;
2120
+ }
2121
+
2122
+ @media (prefers-reduced-motion: reduce) {
2123
+ #sidebar-toggle,
2124
+ .sidebar-toggle-panel,
2125
+ .sidebar-toggle-content,
2126
+ .appcanvas.sidebar-motion-ready > aside,
2127
+ .appcanvas.sidebar-motion-ready > aside .menu-container,
2128
+ .appcanvas.sidebar-motion-ready .appcanvas-resizer {
2129
+ transition-duration: 0.01ms !important;
2130
+ }
2084
2131
  }
2085
2132
 
2086
2133
  /*
@@ -6634,7 +6681,7 @@ header.navheader h1 {
6634
6681
  width: min(280px, calc(100vw - 40px));
6635
6682
  max-width: 100%;
6636
6683
  margin: 0 !important;
6637
- padding: calc(12px + env(safe-area-inset-top)) 12px 18px;
6684
+ padding: calc(12px + env(safe-area-inset-top)) 12px 0;
6638
6685
  box-sizing: border-box;
6639
6686
  overflow-y: auto;
6640
6687
  background: var(--pinokio-sidebar-tabbar-bg);
@@ -6663,18 +6710,18 @@ header.navheader h1 {
6663
6710
  width: min(280px, calc(100vw - 40px));
6664
6711
  max-width: 100%;
6665
6712
  margin: 0 !important;
6666
- padding: calc(12px + env(safe-area-inset-top)) 12px 18px;
6713
+ padding: calc(12px + env(safe-area-inset-top)) 12px 0;
6667
6714
  box-sizing: border-box;
6668
6715
  overflow-y: auto;
6669
6716
  pointer-events: none;
6670
- background: var(--pinokio-sidebar-tabbar-bg);
6671
- border-right: 1px solid var(--pinokio-sidebar-separator);
6672
- border-left: 0;
6673
- box-shadow: 24px 0 48px rgba(15, 23, 42, 0.12);
6674
- transform: translateX(-100%);
6675
- transition: transform 180ms ease;
6676
- z-index: 10000020;
6677
- }
6717
+ background: var(--pinokio-sidebar-tabbar-bg);
6718
+ border-right: 1px solid var(--pinokio-sidebar-separator);
6719
+ border-left: 0;
6720
+ box-shadow: none;
6721
+ transform: translateX(-100%);
6722
+ transition: transform 180ms ease;
6723
+ z-index: 10000020;
6724
+ }
6678
6725
  body.mobile-menu-open .appcanvas.sidebar-collapsed > aside {
6679
6726
  width: min(280px, calc(100vw - 40px));
6680
6727
  min-width: 0;
@@ -6719,6 +6766,9 @@ header.navheader h1 {
6719
6766
  }
6720
6767
  body.dark.mobile-menu-open .appcanvas > aside .disk-usage {
6721
6768
  color: rgba(148, 163, 184, 0.9);
6769
+ }
6770
+ body.mobile-menu-open .appcanvas > aside .menu-container {
6771
+ padding: 0;
6722
6772
  }
6723
6773
  body.mobile-menu-open .appcanvas > aside .menu-scroller {
6724
6774
  flex-direction: column;
@@ -6726,7 +6776,7 @@ header.navheader h1 {
6726
6776
  overflow-y: auto;
6727
6777
  overflow-x: hidden;
6728
6778
  width: 100%;
6729
- padding: 0 0 8px;
6779
+ padding: 0;
6730
6780
  gap: 8px;
6731
6781
  box-sizing: border-box;
6732
6782
  }
@@ -6760,78 +6810,86 @@ header.navheader h1 {
6760
6810
  gap: 4px;
6761
6811
  width: 100%;
6762
6812
  }
6763
- body.mobile-menu-open .appcanvas > aside .mobile-sheet-actions {
6764
- display: none;
6765
- align-items: center;
6766
- gap: 8px;
6767
- width: 100%;
6768
- overflow-x: auto;
6769
- overflow-y: hidden;
6770
- padding-bottom: 2px;
6771
- scrollbar-width: none;
6813
+ body.mobile-menu-open .appcanvas > aside .mobile-sheet-actions,
6814
+ body.mobile-menu-open[data-view='files'] .mobile-menu-fallback .mobile-sheet-actions {
6815
+ display: flex;
6816
+ align-items: center;
6817
+ gap: 6px;
6818
+ width: 100%;
6819
+ margin: 2px 0 0;
6820
+ padding: 4px 0 0;
6821
+ border-top: 1px solid var(--pinokio-sidebar-separator);
6822
+ box-sizing: border-box;
6772
6823
  }
6773
6824
  body.mobile-menu-open .appcanvas > aside .mobile-sheet-actions::-webkit-scrollbar,
6774
6825
  body.mobile-menu-open .mobile-menu-fallback .mobile-sheet-actions::-webkit-scrollbar {
6775
6826
  display: none;
6776
6827
  }
6828
+ body.mobile-menu-open .appcanvas > aside .mobile-sheet-action-grid,
6829
+ body.mobile-menu-open .mobile-menu-fallback .mobile-sheet-action-grid {
6830
+ display: flex;
6831
+ align-items: center;
6832
+ gap: 6px;
6833
+ flex: 0 0 auto;
6834
+ width: auto;
6835
+ }
6777
6836
  body.mobile-menu-open .appcanvas > aside .mobile-sheet-action,
6778
6837
  body.mobile-menu-open .mobile-menu-fallback .mobile-sheet-action {
6779
- flex: 0 0 auto;
6780
- width: 40px;
6781
- height: 40px;
6782
- min-width: 40px;
6783
- min-height: 40px;
6838
+ flex: 0 0 32px;
6839
+ width: 32px;
6840
+ height: 32px;
6841
+ min-width: 32px;
6842
+ min-height: 32px;
6784
6843
  padding: 0;
6785
- border-radius: 12px;
6786
- border: 1px solid rgba(0,0,0,0.06);
6787
- background: #fff;
6788
- color: #0f172a;
6789
- box-shadow: 0 1px 2px rgba(15, 23, 42, 0.05);
6844
+ border-radius: 6px;
6845
+ border: 0;
6846
+ background: transparent;
6847
+ color: var(--app-mobile-drawer-icon-active);
6848
+ box-shadow: none;
6790
6849
  box-sizing: border-box;
6791
6850
  text-decoration: none;
6792
6851
  display: inline-flex;
6793
6852
  align-items: center;
6794
6853
  justify-content: center;
6854
+ gap: 0;
6855
+ font-size: 12px;
6856
+ font-weight: 500;
6857
+ line-height: 1.2;
6795
6858
  }
6796
6859
  body.dark.mobile-menu-open .appcanvas > aside .mobile-sheet-action,
6797
6860
  body.dark.mobile-menu-open .mobile-menu-fallback .mobile-sheet-action {
6798
- background: rgba(15, 17, 21, 0.82);
6799
- border-color: rgba(255,255,255,0.08);
6861
+ background: transparent;
6862
+ border-color: transparent;
6800
6863
  color: rgba(226, 232, 240, 0.92);
6801
- box-shadow: 0 1px 2px rgba(2, 6, 20, 0.4);
6864
+ box-shadow: none;
6865
+ }
6866
+ body.mobile-menu-open .appcanvas > aside .mobile-sheet-action:hover,
6867
+ body.mobile-menu-open .appcanvas > aside .mobile-sheet-action:focus-visible,
6868
+ body.mobile-menu-open .mobile-menu-fallback .mobile-sheet-action:hover,
6869
+ body.mobile-menu-open .mobile-menu-fallback .mobile-sheet-action:focus-visible {
6870
+ background: var(--app-mobile-drawer-tab-hover);
6802
6871
  }
6803
6872
  body.mobile-menu-open .appcanvas > aside .mobile-sheet-action i,
6804
6873
  body.mobile-menu-open .mobile-menu-fallback .mobile-sheet-action i {
6805
- font-size: 15px;
6806
- }
6807
- body.mobile-menu-open .appcanvas > aside .mobile-sheet-action span,
6808
- body.mobile-menu-open .mobile-menu-fallback .mobile-sheet-action span {
6809
- display: none;
6874
+ width: 15px;
6875
+ flex: 0 0 15px;
6876
+ font-size: 14px;
6877
+ text-align: center;
6810
6878
  }
6811
- body.mobile-menu-open .appcanvas > aside .menu-scroller .mobile-sheet-action,
6812
- body.mobile-menu-open .mobile-menu-fallback .mobile-sheet-action {
6813
- width: 40px !important;
6814
- height: 40px !important;
6815
- min-width: 40px !important;
6816
- min-height: 40px !important;
6817
- padding: 0 !important;
6818
- border-radius: 12px !important;
6819
- display: inline-flex;
6820
- align-items: center;
6821
- justify-content: center;
6822
- gap: 0;
6879
+ body.mobile-menu-open .appcanvas > aside .mobile-sheet-action--close-pane,
6880
+ body.mobile-menu-open .mobile-menu-fallback .mobile-sheet-action--close-pane {
6881
+ border-color: transparent;
6882
+ background: transparent;
6883
+ color: #b91c1c;
6823
6884
  }
6824
- body.mobile-menu-open[data-view='files'] .mobile-menu-fallback .mobile-sheet-actions {
6825
- display: none;
6826
- align-items: center;
6827
- gap: 8px;
6828
- width: 100%;
6829
- overflow-x: auto;
6830
- overflow-y: hidden;
6831
- padding-bottom: 2px;
6885
+ body.dark.mobile-menu-open .appcanvas > aside .mobile-sheet-action--close-pane,
6886
+ body.dark.mobile-menu-open .mobile-menu-fallback .mobile-sheet-action--close-pane {
6887
+ border-color: transparent;
6888
+ background: transparent;
6889
+ color: #f87171;
6832
6890
  }
6833
- body.mobile-menu-open .appcanvas > aside .menu-scroller .btn:not(.btn2),
6834
- body.mobile-menu-open .appcanvas > aside .menu-actions .btn:not(.btn2) {
6891
+ body.mobile-menu-open .appcanvas > aside .menu-scroller .btn:not(.btn2):not(.mobile-sheet-action),
6892
+ body.mobile-menu-open .appcanvas > aside .menu-actions .btn:not(.btn2):not(.mobile-sheet-action) {
6835
6893
  max-width: none;
6836
6894
  min-width: 0;
6837
6895
  width: 100%;
@@ -6844,22 +6902,22 @@ header.navheader h1 {
6844
6902
  box-shadow: none;
6845
6903
  box-sizing: border-box;
6846
6904
  }
6847
- body.dark.mobile-menu-open .appcanvas > aside .menu-scroller .btn:not(.btn2),
6848
- body.dark.mobile-menu-open .appcanvas > aside .menu-actions .btn:not(.btn2) {
6905
+ body.dark.mobile-menu-open .appcanvas > aside .menu-scroller .btn:not(.btn2):not(.mobile-sheet-action),
6906
+ body.dark.mobile-menu-open .appcanvas > aside .menu-actions .btn:not(.btn2):not(.mobile-sheet-action) {
6849
6907
  background: transparent;
6850
6908
  border-color: transparent;
6851
6909
  color: var(--app-mobile-drawer-tab-muted);
6852
6910
  box-shadow: none;
6853
6911
  }
6854
- body.mobile-menu-open .appcanvas > aside .menu-scroller .btn:not(.btn2):hover,
6855
- body.mobile-menu-open .appcanvas > aside .menu-scroller .btn:not(.btn2):focus-visible,
6856
- body.mobile-menu-open .appcanvas > aside .menu-actions .btn:not(.btn2):hover,
6857
- body.mobile-menu-open .appcanvas > aside .menu-actions .btn:not(.btn2):focus-visible {
6912
+ body.mobile-menu-open .appcanvas > aside .menu-scroller .btn:not(.btn2):not(.mobile-sheet-action):hover,
6913
+ body.mobile-menu-open .appcanvas > aside .menu-scroller .btn:not(.btn2):not(.mobile-sheet-action):focus-visible,
6914
+ body.mobile-menu-open .appcanvas > aside .menu-actions .btn:not(.btn2):not(.mobile-sheet-action):hover,
6915
+ body.mobile-menu-open .appcanvas > aside .menu-actions .btn:not(.btn2):not(.mobile-sheet-action):focus-visible {
6858
6916
  background: var(--app-mobile-drawer-tab-hover);
6859
6917
  color: var(--app-mobile-drawer-tab-active-color);
6860
6918
  }
6861
- body.mobile-menu-open .appcanvas > aside .menu-scroller .btn.selected:not(.btn2),
6862
- body.mobile-menu-open .appcanvas > aside .menu-actions .btn.selected:not(.btn2) {
6919
+ body.mobile-menu-open .appcanvas > aside .menu-scroller .btn.selected:not(.btn2):not(.mobile-sheet-action),
6920
+ body.mobile-menu-open .appcanvas > aside .menu-actions .btn.selected:not(.btn2):not(.mobile-sheet-action) {
6863
6921
  background: var(--app-mobile-drawer-tab-active-bg) !important;
6864
6922
  color: var(--app-mobile-drawer-tab-active-color);
6865
6923
  }
@@ -7006,7 +7064,7 @@ header.navheader h1 {
7006
7064
  max-width: 100%;
7007
7065
  z-index: 10000020;
7008
7066
  flex-direction: column;
7009
- padding: calc(12px + env(safe-area-inset-top)) 12px 18px;
7067
+ padding: calc(12px + env(safe-area-inset-top)) 12px 0;
7010
7068
  box-sizing: border-box;
7011
7069
  overflow-y: auto;
7012
7070
  background: var(--pinokio-sidebar-tabbar-bg);
@@ -7037,7 +7095,7 @@ header.navheader h1 {
7037
7095
  .mobile-menu-fallback__body {
7038
7096
  flex: 1 1 auto;
7039
7097
  overflow-y: auto;
7040
- padding: 0 0 16px;
7098
+ padding: 0;
7041
7099
  box-sizing: border-box;
7042
7100
  }
7043
7101
  .mobile-menu-fallback .workspace-mode-switch {
@@ -7794,32 +7852,6 @@ body.dark .pinokio-custom-terminal-header {
7794
7852
  <span>Dev</span>
7795
7853
  </a>
7796
7854
  </div>
7797
- <div class='mobile-sheet-actions' aria-label="Workspace actions">
7798
- <button type='button' id='menu-mobile-close' class='btn mobile-sheet-action' data-tippy-content="Close menu" aria-label="Close menu" title="Close menu">
7799
- <i class="fa-solid fa-xmark"></i>
7800
- </button>
7801
- <button type='button' class='btn mobile-sheet-action' data-mobile-proxy="#refresh-page" data-mobile-close-menu="true" aria-label="Refresh" title="Refresh">
7802
- <i class="fa-solid fa-rotate-right"></i>
7803
- </button>
7804
- <button type='button' class='btn mobile-sheet-action' data-mobile-proxy="#back" data-mobile-close-menu="true" aria-label="Back" title="Back">
7805
- <i class="fa-solid fa-chevron-left"></i>
7806
- </button>
7807
- <button type='button' class='btn mobile-sheet-action' data-mobile-proxy="#forward" data-mobile-close-menu="true" aria-label="Forward" title="Forward">
7808
- <i class="fa-solid fa-chevron-right"></i>
7809
- </button>
7810
- <a class='btn mobile-sheet-action' href="/columns" aria-label="2 Columns" title="2 Columns">
7811
- <i class="fa-solid fa-table-columns"></i>
7812
- </a>
7813
- <a class='btn mobile-sheet-action' href="/rows" aria-label="2 Rows" title="2 Rows">
7814
- <i class="fa-solid fa-table-columns fa-rotate-270"></i>
7815
- </a>
7816
- <button type='button' class='btn mobile-sheet-action' data-mobile-proxy="#new-window" data-mobile-close-menu="true" aria-label="New Window" title="New Window">
7817
- <i class="fa-solid fa-plus"></i>
7818
- </button>
7819
- <button type='button' class='btn mobile-sheet-action mobile-close-window-action hidden' data-mobile-proxy="#close-window" data-mobile-close-menu="true" aria-label="Close Section" title="Close Section">
7820
- <i class="fa-solid fa-xmark"></i>
7821
- </button>
7822
- </div>
7823
7855
  <%if (type==='browse') { %>
7824
7856
  <div class='m n system' data-type="n">
7825
7857
  <a id='devtab' data-mode="refresh" target="<%=dev_link%>" href="<%=dev_link%>" class="btn frame-link <%=dev_initial_tab === 'files' ? '' : 'selected'%>" data-index="10">
@@ -7896,14 +7928,26 @@ body.dark .pinokio-custom-terminal-header {
7896
7928
  </div>
7897
7929
  </button>
7898
7930
  <% } %>
7899
- <a class='btn header-item mobile-drawer-home' href="/home" aria-label="Home">
7900
- <div class='tab'>
7901
- <i class="fa-solid fa-house menu-action-leading-icon"></i>
7902
- <div class='display'>Home</div>
7903
- <div class='flexible'></div>
7904
- </div>
7905
- </a>
7906
7931
  </div>
7932
+ <div class='mobile-sheet-actions' aria-label="Navigation and pane actions">
7933
+ <div class='mobile-sheet-action-grid'>
7934
+ <a class='btn mobile-sheet-action mobile-drawer-home' href="/home" aria-label="Home" title="Home">
7935
+ <i class="fa-solid fa-house"></i>
7936
+ </a>
7937
+ <a class='btn mobile-sheet-action' href="/columns" aria-label="Split right" title="Split right">
7938
+ <i class="fa-solid fa-table-columns"></i>
7939
+ </a>
7940
+ <a class='btn mobile-sheet-action' href="/rows" aria-label="Split down" title="Split down">
7941
+ <i class="fa-solid fa-table-columns fa-rotate-270"></i>
7942
+ </a>
7943
+ <button type='button' class='btn mobile-sheet-action' data-mobile-proxy="#new-window" data-mobile-close-menu="true" aria-label="New window" title="New window">
7944
+ <i class="fa-solid fa-plus"></i>
7945
+ </button>
7946
+ <button type='button' class='btn mobile-sheet-action mobile-sheet-action--close-pane mobile-close-window-action hidden' data-mobile-proxy="#close-window" data-mobile-close-menu="true" aria-label="Close pane" title="Close pane">
7947
+ <i class="fa-solid fa-xmark"></i>
7948
+ </button>
7949
+ </div>
7950
+ </div>
7907
7951
  <div class='menu-actions <%= type === "browse" ? "dev-menu-actions" : "" %>'>
7908
7952
  <% if (type === 'browse') { %>
7909
7953
  <%- include('./partials/fs_status') %>
@@ -8289,29 +8333,6 @@ body.dark .pinokio-custom-terminal-header {
8289
8333
  <span>Dev</span>
8290
8334
  </a>
8291
8335
  </div>
8292
- <div class='mobile-sheet-actions' aria-label="Workspace actions">
8293
- <button type='button' class='btn mobile-sheet-action' data-mobile-proxy="#refresh-page" data-mobile-close-menu="true" aria-label="Refresh" title="Refresh">
8294
- <i class="fa-solid fa-rotate-right"></i>
8295
- </button>
8296
- <button type='button' class='btn mobile-sheet-action' data-mobile-proxy="#back" data-mobile-close-menu="true" aria-label="Back" title="Back">
8297
- <i class="fa-solid fa-chevron-left"></i>
8298
- </button>
8299
- <button type='button' class='btn mobile-sheet-action' data-mobile-proxy="#forward" data-mobile-close-menu="true" aria-label="Forward" title="Forward">
8300
- <i class="fa-solid fa-chevron-right"></i>
8301
- </button>
8302
- <a class='btn mobile-sheet-action' href="/columns" aria-label="2 Columns" title="2 Columns">
8303
- <i class="fa-solid fa-table-columns"></i>
8304
- </a>
8305
- <a class='btn mobile-sheet-action' href="/rows" aria-label="2 Rows" title="2 Rows">
8306
- <i class="fa-solid fa-table-columns fa-rotate-270"></i>
8307
- </a>
8308
- <button type='button' class='btn mobile-sheet-action' data-mobile-proxy="#new-window" data-mobile-close-menu="true" aria-label="New Window" title="New Window">
8309
- <i class="fa-solid fa-plus"></i>
8310
- </button>
8311
- <button type='button' class='btn mobile-sheet-action mobile-close-window-action hidden' data-mobile-proxy="#close-window" data-mobile-close-menu="true" aria-label="Close Section" title="Close Section">
8312
- <i class="fa-solid fa-xmark"></i>
8313
- </button>
8314
- </div>
8315
8336
  <div class='mobile-drawer-actions' aria-label="App actions">
8316
8337
  <button type='button' class='btn header-item mobile-nav-logs' data-mobile-proxy="#fs-status .fs-logs .fs-status-btn" data-mobile-panel="logs" data-mobile-close-menu="true" aria-pressed="false" aria-label="Logs">
8317
8338
  <div class='tab'>
@@ -8329,13 +8350,25 @@ body.dark .pinokio-custom-terminal-header {
8329
8350
  </div>
8330
8351
  </button>
8331
8352
  <% } %>
8332
- <a class='btn header-item mobile-drawer-home' href="/home" aria-label="Home">
8333
- <div class='tab'>
8334
- <i class="fa-solid fa-house menu-action-leading-icon"></i>
8335
- <div class='display'>Home</div>
8336
- <div class='flexible'></div>
8337
- </div>
8338
- </a>
8353
+ </div>
8354
+ <div class='mobile-sheet-actions' aria-label="Navigation and pane actions">
8355
+ <div class='mobile-sheet-action-grid'>
8356
+ <a class='btn mobile-sheet-action mobile-drawer-home' href="/home" aria-label="Home" title="Home">
8357
+ <i class="fa-solid fa-house"></i>
8358
+ </a>
8359
+ <a class='btn mobile-sheet-action' href="/columns" aria-label="Split right" title="Split right">
8360
+ <i class="fa-solid fa-table-columns"></i>
8361
+ </a>
8362
+ <a class='btn mobile-sheet-action' href="/rows" aria-label="Split down" title="Split down">
8363
+ <i class="fa-solid fa-table-columns fa-rotate-270"></i>
8364
+ </a>
8365
+ <button type='button' class='btn mobile-sheet-action' data-mobile-proxy="#new-window" data-mobile-close-menu="true" aria-label="New window" title="New window">
8366
+ <i class="fa-solid fa-plus"></i>
8367
+ </button>
8368
+ <button type='button' class='btn mobile-sheet-action mobile-sheet-action--close-pane mobile-close-window-action hidden' data-mobile-proxy="#close-window" data-mobile-close-menu="true" aria-label="Close pane" title="Close pane">
8369
+ <i class="fa-solid fa-xmark"></i>
8370
+ </button>
8371
+ </div>
8339
8372
  </div>
8340
8373
  </div>
8341
8374
  </div>
@@ -11150,7 +11183,7 @@ const rerenderMenuSection = (container, html) => {
11150
11183
  const communityModeActive = !!(appcanvas && appcanvas.classList.contains("community-mode"))
11151
11184
  const askAiOpen = !!(appcanvas && appcanvas.classList.contains("panel-open"))
11152
11185
  const mobileMenuFallback = document.querySelector(".mobile-menu-fallback")
11153
- const closeSectionVisible = !!(closeWindowButton && !closeWindowButton.classList.contains("hidden"))
11186
+ const closePaneAvailable = !!(closeWindowButton && !closeWindowButton.classList.contains("hidden"))
11154
11187
 
11155
11188
  document.querySelectorAll(".mobile-nav-menu").forEach((button) => {
11156
11189
  button.classList.toggle("selected", mobileMenuOpen)
@@ -11171,8 +11204,8 @@ const rerenderMenuSection = (container, html) => {
11171
11204
  syncLogsSelectedState()
11172
11205
  }
11173
11206
  document.querySelectorAll(".mobile-close-window-action").forEach((button) => {
11174
- button.classList.toggle("hidden", !closeSectionVisible)
11175
- button.setAttribute("aria-hidden", closeSectionVisible ? "false" : "true")
11207
+ button.classList.toggle("hidden", !closePaneAvailable)
11208
+ button.setAttribute("aria-hidden", closePaneAvailable ? "false" : "true")
11176
11209
  })
11177
11210
  if (mobileMenuFallback) {
11178
11211
  const showFallback = mobileMenuOpen && document.body.getAttribute("data-view") === "files"
@@ -11217,13 +11250,13 @@ const rerenderMenuSection = (container, html) => {
11217
11250
  setMobileMenuOpen(!isMobileMenuOpen())
11218
11251
  })
11219
11252
  }
11220
- if (document.querySelector("#menu-mobile-close")) {
11221
- document.querySelector("#menu-mobile-close").addEventListener("click", (e) => {
11222
- e.preventDefault()
11223
- setMobileMenuOpen(false, { skipRefresh: true })
11224
- })
11225
- }
11226
- if (mobileMenuBackdrop) {
11253
+ if (document.querySelector("#menu-mobile-close")) {
11254
+ document.querySelector("#menu-mobile-close").addEventListener("click", (e) => {
11255
+ e.preventDefault()
11256
+ setMobileMenuOpen(false, { skipRefresh: true })
11257
+ })
11258
+ }
11259
+ if (mobileMenuBackdrop) {
11227
11260
  mobileMenuBackdrop.addEventListener("click", () => {
11228
11261
  setMobileMenuOpen(false, { skipRefresh: true })
11229
11262
  })
@@ -11904,6 +11937,7 @@ const rerenderMenuSection = (container, html) => {
11904
11937
  }
11905
11938
 
11906
11939
  const finishResizing = () => {
11940
+ appcanvas.classList.remove("sidebar-resizing")
11907
11941
  if (!isResizing) {
11908
11942
  if (document.activeElement === sidebarResizer) {
11909
11943
  sidebarResizer.blur()
@@ -11972,6 +12006,7 @@ const rerenderMenuSection = (container, html) => {
11972
12006
  }
11973
12007
  event.preventDefault()
11974
12008
  isResizing = true
12009
+ appcanvas.classList.add("sidebar-resizing")
11975
12010
  pointerId = event.pointerId
11976
12011
  try {
11977
12012
  sidebarResizer.setPointerCapture(event.pointerId)
@@ -16027,6 +16062,9 @@ const rerenderMenuSection = (container, html) => {
16027
16062
  initialCollapsed = window.localStorage.getItem(storageKey) === "1"
16028
16063
  } catch (_) {}
16029
16064
  setCollapsed(initialCollapsed, { persist: false })
16065
+ requestAnimationFrame(() => {
16066
+ appcanvas.classList.add("sidebar-motion-ready")
16067
+ })
16030
16068
 
16031
16069
  toggle.addEventListener("click", (event) => {
16032
16070
  event.preventDefault()
@@ -18616,6 +18654,12 @@ document.addEventListener("DOMContentLoaded", () => {
18616
18654
  if (!candidateState) return []
18617
18655
  return [].concat(candidateState.menu || [], candidateState.other || [])
18618
18656
  }
18657
+ const eligibleDefaultScript = () => {
18658
+ const defaults = allCandidates().filter((candidate) => {
18659
+ return candidate && candidate.script && candidate.menu_default && !candidate.has_params
18660
+ })
18661
+ return defaults.length === 1 ? defaults[0].script : ""
18662
+ }
18619
18663
  <%- include('partials/app_autolaunch_modal_helpers') %>
18620
18664
  const hasLaunchRequirementConfig = () => {
18621
18665
  return !!(
@@ -18792,7 +18836,7 @@ document.addEventListener("DOMContentLoaded", () => {
18792
18836
  if (!candidateState) {
18793
18837
  await loadCandidates()
18794
18838
  }
18795
- const script = selectedScript || ""
18839
+ const script = selectedScript || eligibleDefaultScript()
18796
18840
  if (!script) {
18797
18841
  setFeedback("Choose a launch script first.", true)
18798
18842
  return
@@ -748,6 +748,15 @@ const renderScriptSection = (title, note, candidates) => {
748
748
  };
749
749
 
750
750
  const configuredScript = (data) => data && data.current ? data.current : "";
751
+ const allScriptCandidates = () => candidateState
752
+ ? [].concat(candidateState.menu || [], candidateState.other || [])
753
+ : [];
754
+ const eligibleDefaultScript = () => {
755
+ const defaults = allScriptCandidates().filter((candidate) => {
756
+ return candidate && candidate.script && candidate.menu_default && !candidate.has_params;
757
+ });
758
+ return defaults.length === 1 ? defaults[0].script : "";
759
+ };
751
760
 
752
761
  <%- include('partials/autolaunch_dependency_helpers') %>
753
762
  const bindDetailControls = () => {
@@ -950,7 +959,7 @@ const toggleAutolaunch = () => {
950
959
  return;
951
960
  }
952
961
  const manual = detailEl.querySelector("[data-manual-script]");
953
- const script = manual && manual.value.trim() ? manual.value.trim() : (selectedScript || "");
962
+ const script = manual && manual.value.trim() ? manual.value.trim() : (selectedScript || eligibleDefaultScript());
954
963
  if (!script) {
955
964
  setFeedback("Choose a launch script first.", true);
956
965
  return;
@@ -309,8 +309,20 @@ body[data-agent='electron'] {
309
309
  }
310
310
  });
311
311
  window.addEventListener('message', (event) => {
312
+ if (event.data && event.data.e === "layout-state-request") {
313
+ const closable = Array.from(document.querySelectorAll('iframe')).some((iframe) => {
314
+ return event.source === iframe.contentWindow;
315
+ });
316
+ if (event.source && typeof event.source.postMessage === "function") {
317
+ event.source.postMessage({
318
+ e: "layout-state",
319
+ closable
320
+ }, "*");
321
+ }
322
+ return;
323
+ }
312
324
  if (event.data && event.data.e === "close") {
313
- // find the frame
325
+ // find the frame
314
326
  // Find which iframe sent the message
315
327
  const col0 = document.getElementById('col0');
316
328
  const col1 = document.getElementById('col1');