retold-remote 0.0.4 → 0.0.6

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 (63) hide show
  1. package/docs/README.md +181 -0
  2. package/docs/_cover.md +14 -0
  3. package/docs/_sidebar.md +10 -0
  4. package/docs/_topbar.md +3 -0
  5. package/docs/audio-viewer.md +133 -0
  6. package/docs/ebook-reader.md +90 -0
  7. package/docs/image-viewer.md +90 -0
  8. package/docs/server-setup.md +262 -0
  9. package/docs/video-viewer.md +134 -0
  10. package/html/docs.html +59 -0
  11. package/package.json +21 -7
  12. package/source/Pict-Application-RetoldRemote.js +143 -2
  13. package/source/RetoldRemote-ExtensionMaps.js +33 -0
  14. package/source/cli/RetoldRemote-Server-Setup.js +82 -67
  15. package/source/cli/commands/RetoldRemote-Command-Serve.js +5 -26
  16. package/source/providers/Pict-Provider-CollectionManager.js +934 -0
  17. package/source/providers/Pict-Provider-FormattingUtilities.js +109 -0
  18. package/source/providers/Pict-Provider-GalleryFilterSort.js +2 -11
  19. package/source/providers/Pict-Provider-GalleryNavigation.js +270 -353
  20. package/source/providers/Pict-Provider-RetoldRemoteIcons.js +52 -0
  21. package/source/providers/Pict-Provider-ToastNotification.js +96 -0
  22. package/source/providers/keyboard-handlers/KeyHandler-AudioExplorer.js +88 -0
  23. package/source/providers/keyboard-handlers/KeyHandler-Gallery.js +190 -0
  24. package/source/providers/keyboard-handlers/KeyHandler-Sidebar.js +65 -0
  25. package/source/providers/keyboard-handlers/KeyHandler-VideoExplorer.js +57 -0
  26. package/source/providers/keyboard-handlers/KeyHandler-Viewer.js +197 -0
  27. package/source/server/RetoldRemote-ArchiveService.js +2 -12
  28. package/source/server/RetoldRemote-AudioWaveformService.js +7 -16
  29. package/source/server/RetoldRemote-CollectionService.js +684 -0
  30. package/source/server/RetoldRemote-EbookService.js +7 -16
  31. package/source/server/RetoldRemote-MediaService.js +3 -14
  32. package/source/server/RetoldRemote-ParimeCache.js +349 -0
  33. package/source/server/RetoldRemote-ThumbnailCache.js +52 -20
  34. package/source/server/RetoldRemote-VideoFrameService.js +7 -15
  35. package/source/views/PictView-Remote-AudioExplorer.js +10 -43
  36. package/source/views/PictView-Remote-CollectionsPanel.js +1087 -0
  37. package/source/views/PictView-Remote-Gallery.js +237 -44
  38. package/source/views/PictView-Remote-ImageViewer.js +1 -34
  39. package/source/views/PictView-Remote-Layout.js +410 -20
  40. package/source/views/PictView-Remote-MediaViewer.js +338 -51
  41. package/source/views/PictView-Remote-SettingsPanel.js +155 -138
  42. package/source/views/PictView-Remote-TopBar.js +615 -14
  43. package/source/views/PictView-Remote-VLCSetup.js +766 -0
  44. package/source/views/PictView-Remote-VideoExplorer.js +20 -54
  45. package/web-application/css/docuserve.css +73 -0
  46. package/web-application/docs/README.md +181 -0
  47. package/web-application/docs/_cover.md +14 -0
  48. package/web-application/docs/_sidebar.md +10 -0
  49. package/web-application/docs/_topbar.md +3 -0
  50. package/web-application/docs/audio-viewer.md +133 -0
  51. package/web-application/docs/ebook-reader.md +90 -0
  52. package/web-application/docs/image-viewer.md +90 -0
  53. package/web-application/docs/server-setup.md +262 -0
  54. package/web-application/docs/video-viewer.md +134 -0
  55. package/web-application/docs.html +59 -0
  56. package/web-application/js/pict-docuserve.min.js +58 -0
  57. package/web-application/js/pict.min.js +2 -2
  58. package/web-application/js/pict.min.js.map +1 -1
  59. package/web-application/retold-remote.js +2558 -439
  60. package/web-application/retold-remote.js.map +1 -1
  61. package/web-application/retold-remote.min.js +41 -11
  62. package/web-application/retold-remote.min.js.map +1 -1
  63. package/server.js +0 -43
@@ -145,6 +145,34 @@ const _ViewConfiguration =
145
145
  {
146
146
  display: none;
147
147
  }
148
+ /* Hide the ugly white + button from the breadcrumb bar */
149
+ #ContentEditor-Sidebar-Container .pict-fb-breadcrumb-addfolder
150
+ {
151
+ display: none;
152
+ }
153
+ /* Subtle add-folder button at bottom of file list */
154
+ .retold-remote-sidebar-addfolder
155
+ {
156
+ display: block;
157
+ width: 100%;
158
+ padding: 8px 12px;
159
+ margin-top: 4px;
160
+ border: 1px dashed var(--retold-border);
161
+ border-radius: 4px;
162
+ background: transparent;
163
+ color: var(--retold-text-dim);
164
+ font-size: 0.72rem;
165
+ font-family: inherit;
166
+ cursor: pointer;
167
+ text-align: center;
168
+ transition: color 0.15s, border-color 0.15s, background 0.15s;
169
+ }
170
+ .retold-remote-sidebar-addfolder:hover
171
+ {
172
+ color: var(--retold-text-muted);
173
+ border-color: var(--retold-text-dim);
174
+ background: rgba(128, 128, 128, 0.06);
175
+ }
148
176
  #ContentEditor-Sidebar-Container .pict-fb-detail-row
149
177
  {
150
178
  color: var(--retold-text-secondary);
@@ -171,16 +199,42 @@ const _ViewConfiguration =
171
199
  {
172
200
  box-shadow: inset 0 0 0 1px var(--retold-accent);
173
201
  }
174
- #ContentEditor-Sidebar-Container .pict-fb-breadcrumbs
202
+ #ContentEditor-Sidebar-Container .pict-fb-breadcrumb-bar
175
203
  {
176
- color: var(--retold-text-muted);
177
204
  background: var(--retold-bg-secondary);
178
205
  border-bottom-color: var(--retold-border);
179
206
  }
207
+ #ContentEditor-Sidebar-Container .pict-fb-breadcrumbs
208
+ {
209
+ color: var(--retold-text-muted);
210
+ background: transparent;
211
+ border-bottom: none;
212
+ }
180
213
  #ContentEditor-Sidebar-Container .pict-fb-breadcrumb-link
181
214
  {
182
215
  color: var(--retold-accent);
183
216
  }
217
+ /* Insert button: hidden by default, visible on row hover for ALL files */
218
+ #ContentEditor-Sidebar-Container .pict-fb-insert-btn
219
+ {
220
+ display: none;
221
+ background: var(--retold-bg-hover);
222
+ color: var(--retold-text-muted);
223
+ border: 1px solid var(--retold-border);
224
+ border-radius: 3px;
225
+ font-size: 0.72rem;
226
+ padding: 1px 6px;
227
+ }
228
+ #ContentEditor-Sidebar-Container .pict-fb-insert-btn:hover
229
+ {
230
+ background: var(--retold-accent);
231
+ color: var(--retold-bg-primary);
232
+ border-color: var(--retold-accent);
233
+ }
234
+ #ContentEditor-Sidebar-Container .pict-fb-detail-row:hover .pict-fb-insert-btn
235
+ {
236
+ display: inline-block;
237
+ }
184
238
  /* Main content area */
185
239
  #RetoldRemote-Content-Container
186
240
  {
@@ -208,6 +262,134 @@ const _ViewConfiguration =
208
262
  {
209
263
  display: none;
210
264
  }
265
+
266
+ /* ============================================================
267
+ MOBILE: Sidebar becomes a top drawer
268
+ ============================================================ */
269
+ @media (max-width: 600px)
270
+ {
271
+ .content-editor-body
272
+ {
273
+ flex-direction: column;
274
+ }
275
+
276
+ /* Sidebar becomes a top section with a height instead of width */
277
+ .content-editor-sidebar-wrap
278
+ {
279
+ width: 100% !important;
280
+ height: 33vh;
281
+ transition: height 0.2s ease;
282
+ flex-direction: column;
283
+ }
284
+
285
+ .content-editor-sidebar-wrap.collapsed
286
+ {
287
+ width: 100% !important;
288
+ height: 0 !important;
289
+ }
290
+
291
+ /* Resize handle becomes horizontal bar at the bottom of the drawer */
292
+ .content-editor-resize-handle
293
+ {
294
+ width: 100%;
295
+ height: 8px;
296
+ cursor: row-resize;
297
+ border-right: none;
298
+ border-bottom: 1px solid var(--retold-border);
299
+ display: flex;
300
+ align-items: center;
301
+ justify-content: center;
302
+ }
303
+
304
+ .content-editor-resize-handle::after
305
+ {
306
+ content: '';
307
+ display: block;
308
+ width: 36px;
309
+ height: 3px;
310
+ border-radius: 2px;
311
+ background: var(--retold-text-placeholder);
312
+ opacity: 0.5;
313
+ }
314
+
315
+ .content-editor-resize-handle:hover::after,
316
+ .content-editor-resize-handle.dragging::after
317
+ {
318
+ background: var(--retold-accent);
319
+ opacity: 1;
320
+ }
321
+
322
+ /* Sidebar inner fills the drawer */
323
+ .content-editor-sidebar-inner
324
+ {
325
+ flex: 1;
326
+ min-height: 0;
327
+ }
328
+
329
+ /* Content takes remaining space */
330
+ #RetoldRemote-Content-Container
331
+ {
332
+ flex: 1;
333
+ min-height: 0;
334
+ }
335
+
336
+ /* Collections panel: hide in mobile */
337
+ .retold-remote-collections-wrap
338
+ {
339
+ display: none;
340
+ }
341
+ }
342
+
343
+ /* ---- Right-side Collections Panel ---- */
344
+ .retold-remote-collections-wrap
345
+ {
346
+ display: flex;
347
+ flex-shrink: 0;
348
+ position: relative;
349
+ transition: width 0.2s ease;
350
+ border-left: 1px solid var(--retold-border);
351
+ }
352
+ .retold-remote-collections-wrap.collapsed
353
+ {
354
+ width: 0 !important;
355
+ border-left: none;
356
+ }
357
+ .retold-remote-collections-wrap.collapsed .retold-remote-collections-inner
358
+ {
359
+ visibility: hidden;
360
+ }
361
+ .retold-remote-collections-wrap.collapsed .retold-remote-collections-resize-handle
362
+ {
363
+ display: none;
364
+ }
365
+ .retold-remote-collections-inner
366
+ {
367
+ display: flex;
368
+ flex-direction: column;
369
+ flex: 1;
370
+ min-width: 0;
371
+ min-height: 0;
372
+ overflow: hidden;
373
+ background: var(--retold-bg-primary);
374
+ }
375
+ .retold-remote-collections-resize-handle
376
+ {
377
+ position: absolute;
378
+ left: 0;
379
+ top: 0;
380
+ bottom: 0;
381
+ width: 5px;
382
+ cursor: col-resize;
383
+ z-index: 10;
384
+ display: flex;
385
+ align-items: center;
386
+ justify-content: center;
387
+ }
388
+ .retold-remote-collections-resize-handle:hover
389
+ {
390
+ background: var(--retold-accent);
391
+ opacity: 0.3;
392
+ }
211
393
  `,
212
394
 
213
395
  Templates:
@@ -232,6 +414,12 @@ const _ViewConfiguration =
232
414
  <div id="RetoldRemote-Gallery-Container"></div>
233
415
  <div id="RetoldRemote-Viewer-Container"></div>
234
416
  </div>
417
+ <div class="retold-remote-collections-wrap collapsed" id="RetoldRemote-Collections-Wrap" style="width: 300px;">
418
+ <div class="retold-remote-collections-resize-handle"></div>
419
+ <div class="retold-remote-collections-inner">
420
+ <div id="RetoldRemote-Collections-Container"></div>
421
+ </div>
422
+ </div>
235
423
  </div>
236
424
  `
237
425
  }
@@ -254,6 +442,7 @@ class RetoldRemoteLayoutView extends libPictView
254
442
  super(pFable, pOptions, pServiceHash);
255
443
 
256
444
  this._sidebarDragging = false;
445
+ this._collectionsDragging = false;
257
446
  }
258
447
 
259
448
  onAfterRender()
@@ -276,7 +465,7 @@ class RetoldRemoteLayoutView extends libPictView
276
465
  tmpWrap.classList.add('collapsed');
277
466
  }
278
467
  }
279
- if (tmpRemote && tmpRemote.SidebarWidth)
468
+ if (!this.isMobileDrawer() && tmpRemote && tmpRemote.SidebarWidth)
280
469
  {
281
470
  let tmpWrap = document.querySelector('.content-editor-sidebar-wrap');
282
471
  if (tmpWrap && !tmpWrap.classList.contains('collapsed'))
@@ -284,6 +473,31 @@ class RetoldRemoteLayoutView extends libPictView
284
473
  tmpWrap.style.width = tmpRemote.SidebarWidth + 'px';
285
474
  }
286
475
  }
476
+ if (this.isMobileDrawer() && tmpRemote && tmpRemote.SidebarDrawerHeight)
477
+ {
478
+ let tmpWrap = document.querySelector('.content-editor-sidebar-wrap');
479
+ if (tmpWrap && !tmpWrap.classList.contains('collapsed'))
480
+ {
481
+ tmpWrap.style.height = tmpRemote.SidebarDrawerHeight + 'px';
482
+ }
483
+ }
484
+
485
+ // Restore collections panel state from settings
486
+ if (tmpRemote && tmpRemote.CollectionsPanelOpen)
487
+ {
488
+ let tmpCollWrap = document.getElementById('RetoldRemote-Collections-Wrap');
489
+ if (tmpCollWrap)
490
+ {
491
+ tmpCollWrap.classList.remove('collapsed');
492
+ if (tmpRemote.CollectionsPanelWidth)
493
+ {
494
+ tmpCollWrap.style.width = tmpRemote.CollectionsPanelWidth + 'px';
495
+ }
496
+ }
497
+ }
498
+
499
+ // Set up collections panel resize handle
500
+ this._setupCollectionsResizeHandle();
287
501
 
288
502
  // Listen for hash changes (browser back/forward)
289
503
  let tmpSelf = this;
@@ -293,6 +507,14 @@ class RetoldRemoteLayoutView extends libPictView
293
507
  });
294
508
  }
295
509
 
510
+ /**
511
+ * Detect if we are in mobile drawer mode (narrow viewport).
512
+ */
513
+ isMobileDrawer()
514
+ {
515
+ return window.innerWidth <= 600;
516
+ }
517
+
296
518
  toggleSidebar()
297
519
  {
298
520
  let tmpWrap = document.querySelector('.content-editor-sidebar-wrap');
@@ -304,7 +526,23 @@ class RetoldRemoteLayoutView extends libPictView
304
526
  tmpWrap.classList.toggle('collapsed');
305
527
 
306
528
  let tmpRemote = this.pict.AppData.RetoldRemote;
307
- tmpRemote.SidebarCollapsed = tmpWrap.classList.contains('collapsed');
529
+ let tmpIsCollapsed = tmpWrap.classList.contains('collapsed');
530
+ tmpRemote.SidebarCollapsed = tmpIsCollapsed;
531
+
532
+ // Restore saved dimensions when opening
533
+ if (!tmpIsCollapsed)
534
+ {
535
+ if (this.isMobileDrawer())
536
+ {
537
+ let tmpHeight = tmpRemote.SidebarDrawerHeight || Math.round(window.innerHeight * 0.33);
538
+ tmpWrap.style.height = tmpHeight + 'px';
539
+ }
540
+ else if (tmpRemote.SidebarWidth)
541
+ {
542
+ tmpWrap.style.width = tmpRemote.SidebarWidth + 'px';
543
+ }
544
+ }
545
+
308
546
  this.pict.PictApplication.saveSettings();
309
547
 
310
548
  // Recalculate gallery columns after sidebar resize
@@ -340,6 +578,7 @@ class RetoldRemoteLayoutView extends libPictView
340
578
  tmpSettingsView.render();
341
579
  }
342
580
  }
581
+
343
582
  }
344
583
 
345
584
  _setupResizeHandle()
@@ -354,37 +593,84 @@ class RetoldRemoteLayoutView extends libPictView
354
593
  }
355
594
 
356
595
  let tmpStartX = 0;
596
+ let tmpStartY = 0;
357
597
  let tmpStartWidth = 0;
598
+ let tmpStartHeight = 0;
599
+
600
+ function getClientPos(pEvent)
601
+ {
602
+ if (pEvent.touches && pEvent.touches.length > 0)
603
+ {
604
+ return { x: pEvent.touches[0].clientX, y: pEvent.touches[0].clientY };
605
+ }
606
+ return { x: pEvent.clientX, y: pEvent.clientY };
607
+ }
358
608
 
359
- function onMouseDown(pEvent)
609
+ function onDragStart(pEvent)
360
610
  {
361
611
  tmpSelf._sidebarDragging = true;
362
- tmpStartX = pEvent.clientX;
612
+ let tmpPos = getClientPos(pEvent);
613
+ tmpStartX = tmpPos.x;
614
+ tmpStartY = tmpPos.y;
363
615
  tmpStartWidth = tmpWrap.offsetWidth;
616
+ tmpStartHeight = tmpWrap.offsetHeight;
364
617
  tmpHandle.classList.add('dragging');
365
- document.addEventListener('mousemove', onMouseMove);
366
- document.addEventListener('mouseup', onMouseUp);
618
+
619
+ document.addEventListener('mousemove', onDragMove);
620
+ document.addEventListener('mouseup', onDragEnd);
621
+ document.addEventListener('touchmove', onDragMove, { passive: false });
622
+ document.addEventListener('touchend', onDragEnd);
367
623
  pEvent.preventDefault();
368
624
  }
369
625
 
370
- function onMouseMove(pEvent)
626
+ function onDragMove(pEvent)
371
627
  {
372
- if (!tmpSelf._sidebarDragging) return;
373
- let tmpNewWidth = tmpStartWidth + (pEvent.clientX - tmpStartX);
374
- tmpNewWidth = Math.max(150, Math.min(tmpNewWidth, 600));
375
- tmpWrap.style.width = tmpNewWidth + 'px';
628
+ if (!tmpSelf._sidebarDragging)
629
+ {
630
+ return;
631
+ }
632
+
633
+ let tmpPos = getClientPos(pEvent);
634
+
635
+ if (tmpSelf.isMobileDrawer())
636
+ {
637
+ // Vertical resize (top drawer)
638
+ let tmpNewHeight = tmpStartHeight + (tmpPos.y - tmpStartY);
639
+ let tmpMaxHeight = Math.round(window.innerHeight * 0.7);
640
+ tmpNewHeight = Math.max(80, Math.min(tmpNewHeight, tmpMaxHeight));
641
+ tmpWrap.style.height = tmpNewHeight + 'px';
642
+ }
643
+ else
644
+ {
645
+ // Horizontal resize (sidebar)
646
+ let tmpNewWidth = tmpStartWidth + (tmpPos.x - tmpStartX);
647
+ tmpNewWidth = Math.max(150, Math.min(tmpNewWidth, 600));
648
+ tmpWrap.style.width = tmpNewWidth + 'px';
649
+ }
650
+
651
+ pEvent.preventDefault();
376
652
  }
377
653
 
378
- function onMouseUp()
654
+ function onDragEnd()
379
655
  {
380
656
  tmpSelf._sidebarDragging = false;
381
657
  tmpHandle.classList.remove('dragging');
382
- document.removeEventListener('mousemove', onMouseMove);
383
- document.removeEventListener('mouseup', onMouseUp);
384
658
 
385
- // Persist width
659
+ document.removeEventListener('mousemove', onDragMove);
660
+ document.removeEventListener('mouseup', onDragEnd);
661
+ document.removeEventListener('touchmove', onDragMove);
662
+ document.removeEventListener('touchend', onDragEnd);
663
+
664
+ // Persist dimensions
386
665
  let tmpRemote = tmpSelf.pict.AppData.RetoldRemote;
387
- tmpRemote.SidebarWidth = tmpWrap.offsetWidth;
666
+ if (tmpSelf.isMobileDrawer())
667
+ {
668
+ tmpRemote.SidebarDrawerHeight = tmpWrap.offsetHeight;
669
+ }
670
+ else
671
+ {
672
+ tmpRemote.SidebarWidth = tmpWrap.offsetWidth;
673
+ }
388
674
  tmpSelf.pict.PictApplication.saveSettings();
389
675
 
390
676
  // Recalculate gallery columns
@@ -395,15 +681,119 @@ class RetoldRemoteLayoutView extends libPictView
395
681
  }
396
682
  }
397
683
 
398
- tmpHandle.addEventListener('mousedown', onMouseDown);
684
+ tmpHandle.addEventListener('mousedown', onDragStart);
685
+ tmpHandle.addEventListener('touchstart', onDragStart, { passive: false });
399
686
 
400
- // Double-click on resize handle collapses the sidebar
687
+ // Double-click/tap on resize handle collapses the sidebar
401
688
  tmpHandle.addEventListener('dblclick', function (pEvent)
402
689
  {
403
690
  pEvent.preventDefault();
404
691
  tmpSelf.toggleSidebar();
405
692
  });
406
693
  }
694
+
695
+ /**
696
+ * Toggle the right-side collections panel open/closed.
697
+ */
698
+ toggleCollectionsPanel()
699
+ {
700
+ let tmpManager = this.pict.providers['RetoldRemote-CollectionManager'];
701
+ if (tmpManager)
702
+ {
703
+ tmpManager.togglePanel();
704
+ }
705
+ }
706
+
707
+ /**
708
+ * Set up the resize handle for the collections panel (right side).
709
+ * Dragging LEFT increases width, dragging RIGHT decreases width.
710
+ */
711
+ _setupCollectionsResizeHandle()
712
+ {
713
+ let tmpHandle = document.querySelector('.retold-remote-collections-resize-handle');
714
+ let tmpWrap = document.getElementById('RetoldRemote-Collections-Wrap');
715
+ if (!tmpHandle || !tmpWrap)
716
+ {
717
+ return;
718
+ }
719
+
720
+ let tmpSelf = this;
721
+ let tmpStartX = 0;
722
+ let tmpStartWidth = 0;
723
+
724
+ function onDragStart(pEvent)
725
+ {
726
+ if (tmpWrap.classList.contains('collapsed'))
727
+ {
728
+ return;
729
+ }
730
+
731
+ pEvent.preventDefault();
732
+ tmpSelf._collectionsDragging = true;
733
+ tmpHandle.classList.add('dragging');
734
+
735
+ let tmpClientX = pEvent.touches ? pEvent.touches[0].clientX : pEvent.clientX;
736
+ tmpStartX = tmpClientX;
737
+ tmpStartWidth = tmpWrap.getBoundingClientRect().width;
738
+
739
+ document.addEventListener('mousemove', onDragMove);
740
+ document.addEventListener('mouseup', onDragEnd);
741
+ document.addEventListener('touchmove', onDragMove, { passive: false });
742
+ document.addEventListener('touchend', onDragEnd);
743
+ }
744
+
745
+ function onDragMove(pEvent)
746
+ {
747
+ if (!tmpSelf._collectionsDragging)
748
+ {
749
+ return;
750
+ }
751
+ pEvent.preventDefault();
752
+
753
+ let tmpClientX = pEvent.touches ? pEvent.touches[0].clientX : pEvent.clientX;
754
+ // Dragging left (negative deltaX) increases width
755
+ let tmpDelta = tmpStartX - tmpClientX;
756
+ let tmpNewWidth = Math.max(150, Math.min(600, tmpStartWidth + tmpDelta));
757
+ tmpWrap.style.width = tmpNewWidth + 'px';
758
+ }
759
+
760
+ function onDragEnd()
761
+ {
762
+ if (!tmpSelf._collectionsDragging)
763
+ {
764
+ return;
765
+ }
766
+
767
+ tmpSelf._collectionsDragging = false;
768
+ tmpHandle.classList.remove('dragging');
769
+
770
+ let tmpRemote = tmpSelf.pict.AppData.RetoldRemote;
771
+ tmpRemote.CollectionsPanelWidth = tmpWrap.getBoundingClientRect().width;
772
+ tmpSelf.pict.PictApplication.saveSettings();
773
+
774
+ document.removeEventListener('mousemove', onDragMove);
775
+ document.removeEventListener('mouseup', onDragEnd);
776
+ document.removeEventListener('touchmove', onDragMove);
777
+ document.removeEventListener('touchend', onDragEnd);
778
+
779
+ // Recalculate gallery columns
780
+ let tmpGalleryNav = tmpSelf.pict.providers['RetoldRemote-GalleryNavigation'];
781
+ if (tmpGalleryNav && typeof tmpGalleryNav.recalculateColumns === 'function')
782
+ {
783
+ tmpGalleryNav.recalculateColumns();
784
+ }
785
+ }
786
+
787
+ tmpHandle.addEventListener('mousedown', onDragStart);
788
+ tmpHandle.addEventListener('touchstart', onDragStart, { passive: false });
789
+
790
+ // Double-click collapses the collections panel
791
+ tmpHandle.addEventListener('dblclick', function (pEvent)
792
+ {
793
+ pEvent.preventDefault();
794
+ tmpSelf.toggleCollectionsPanel();
795
+ });
796
+ }
407
797
  }
408
798
 
409
799
  RetoldRemoteLayoutView.default_configuration = _ViewConfiguration;