Skip to content

Commit 7d8f583

Browse files
committed
feat(mobile): Mobile support.
1 parent ce84991 commit 7d8f583

File tree

4 files changed

+127
-9
lines changed

4 files changed

+127
-9
lines changed

assets/plugin-styles.txt.css

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,51 @@
187187
padding-bottom: 96px;
188188
}
189189

190+
.sidebar-left, .sidebar-right {
191+
transition: left 0.2s linear, right 0.2s linear;
192+
top: 0;
193+
bottom: 0;
194+
}
195+
196+
.sidebar-left-active .sidebar-left {
197+
left: 0 !important;
198+
}
199+
200+
.sidebar-right-active .sidebar-right {
201+
right: 0 !important;
202+
}
203+
204+
.sidebar-mobile-btns {
205+
padding: 5px 10px;
206+
display: flex;
207+
position: fixed;
208+
top: 0;
209+
left: 0;
210+
width: 100%;
211+
justify-content: space-between;
212+
z-index: 1000;
213+
}
214+
215+
.sidebar-mobile-btn--left, .sidebar-mobile-btn--right {
216+
transition: left 0.2s linear, right 0.2s linear;
217+
}
218+
219+
.sidebar-mobile-btn--left {
220+
position: relative;
221+
left: 0;
222+
}
223+
224+
.sidebar-mobile-btn--right {
225+
position: relative;
226+
right: 0;
227+
}
228+
229+
@media (min-width: 750px) {
230+
.sidebar-mobile-btns {
231+
display: none;
232+
}
233+
}
234+
190235
.published-search-icon {
191236
position: absolute;
192237
color: var(--text-faint);

assets/webpage.txt.js

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ function setActiveDocument(url, scrollTo = true, pushHistory = true)
433433
let treeItem = undefined;
434434
for (let item of treeItems)
435435
{
436-
if (item.getAttribute("href") == url)
436+
if (item.getAttribute("href") == decodeURI(url))
437437
{
438438
let parent = item.parentElement.parentElement;
439439

@@ -446,7 +446,7 @@ function setActiveDocument(url, scrollTo = true, pushHistory = true)
446446
parent = parent.parentElement.parentElement;
447447
}
448448

449-
continue;
449+
break;
450450
}
451451
}
452452

@@ -948,22 +948,26 @@ function setupResize(setupOnNode)
948948

949949
if (window.innerWidth < letHideRightThreshold)
950950
{
951-
rightSidebar.style.display = "none";
951+
rightSidebar.style.position = "absolute";
952+
rightSidebar.style.right = "-" + sidebarWidth + "px";
952953
}
953954
else
954955
{
955-
rightSidebar.style.display = "";
956+
rightSidebar.style.position = "";
957+
rightSidebar.style.right = "";
956958
}
957959

958960
let letHideLeftThreshold = lineWidth / 2 + sidebarWidth;
959961

960962
if (window.innerWidth < letHideLeftThreshold)
961963
{
962-
leftSidebar.style.display = "none";
964+
leftSidebar.style.position = "absolute";
965+
leftSidebar.style.left = "-" + sidebarWidth + "px";
963966
}
964967
else
965968
{
966-
leftSidebar.style.display = "";
969+
leftSidebar.style.position = "";
970+
leftSidebar.style.left = "";
967971
}
968972
}
969973

@@ -975,6 +979,44 @@ function setupResize(setupOnNode)
975979
updateSidebars();
976980
}
977981

982+
function sidebarClickHandler(event, btnEl, side, sidebarWidth) {
983+
const sides = "leftright";
984+
const opposite = sides.replace(side, "");
985+
event.preventDefault();
986+
event.stopImmediatePropagation();
987+
988+
let containerEl = document.querySelector(".webpage-container");
989+
990+
const width = sidebarWidth;
991+
if (containerEl.classList.contains(`sidebar-${side}-active`)) {
992+
containerEl.classList.remove(`sidebar-${side}-active`);
993+
btnEl.style[side] = "";
994+
} else {
995+
containerEl.classList.add(`sidebar-${side}-active`);
996+
btnEl.style[side] = `${width}px`;
997+
998+
if (containerEl.classList.contains(`sidebar-${opposite}-active`)) {
999+
containerEl.classList.remove(`sidebar-${opposite}-active`);
1000+
document.querySelector(`.sidebar-mobile-btn--${opposite}`).style[opposite] = "";
1001+
}
1002+
}
1003+
}
1004+
1005+
function setupMobileSidebar(setupOnNode)
1006+
{
1007+
if (setupOnNode != document) return;
1008+
1009+
let sidebarBtns = document.querySelector(".sidebar-mobile-btns");
1010+
1011+
let leftBtn = sidebarBtns.querySelector(".sidebar-mobile-btn--left");
1012+
let rightBtn = sidebarBtns.querySelector(".sidebar-mobile-btn--right");
1013+
let sidebarWidth = document.querySelector(".sidebar-left").getBoundingClientRect().width;
1014+
1015+
leftBtn.addEventListener("click", (e) => sidebarClickHandler(e, leftBtn, "left", sidebarWidth));
1016+
rightBtn.addEventListener("click", (e) => sidebarClickHandler(e, rightBtn, "right", sidebarWidth));
1017+
}
1018+
1019+
9781020
function setupRootPath(fromDocument)
9791021
{
9801022
let basePath = fromDocument.querySelector("#root-path").getAttribute("root-path");
@@ -996,6 +1038,7 @@ function initializePage(setupOnNode)
9961038
setupCodeblocks(setupOnNode);
9971039
setupLinks(setupOnNode);
9981040
setupResize(setupOnNode);
1041+
setupMobileSidebar(setupOnNode);
9991042

10001043
setupOnNode.querySelectorAll("*").forEach(function(element)
10011044
{

src/export-settings.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export interface ExportSettingsData
2020
// Export Options
2121
dataviewBlockWaitTime: number;
2222
showWarningsInExportLog: boolean;
23+
incrementalExport: boolean;
2324

2425
// Page Features
2526
addDarkModeToggle: boolean;
@@ -67,6 +68,7 @@ export const DEFAULT_SETTINGS: ExportSettingsData =
6768
// Export Options
6869
dataviewBlockWaitTime: 700,
6970
showWarningsInExportLog: true,
71+
incrementalExport: false,
7072

7173
// Page Features
7274
addDarkModeToggle: true,

src/html-generation/html-generator.ts

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { MarkdownRenderer } from "./markdown-renderer";
55
import { AssetHandler } from "./asset-handler";
66
import { ExportFile } from "./export-file";
77
import { Downloadable } from "src/utils/downloadable";
8-
import { TFile } from "obsidian";
8+
import { TFile, setIcon } from "obsidian";
99
import { log } from "../moreOnLog";
1010
import { StatsView } from "src/statsView";
1111
import InvioPlugin from "src/main";
@@ -61,6 +61,7 @@ export class HTMLGenerator {
6161
let usingDocument = file.document;
6262

6363
let sidebars = this.generateSideBars(file.contentElement, file);
64+
this.generateSideBarBtns(file, sidebars);
6465
let rightSidebar = sidebars.right;
6566
let leftSidebar = sidebars.left;
6667
usingDocument.body.appendChild(sidebars.container);
@@ -201,11 +202,10 @@ export class HTMLGenerator {
201202

202203
// make sure the page scales correctly at different widths
203204
file.sizerElement.style.paddingBottom = "";
204-
file.sizerElement.style.paddingBottom = "32px";
205-
file.sizerElement.style.padding = "var(--file-margins)";
206205
file.sizerElement.style.paddingTop = "var(--file-margins)";
207206
file.sizerElement.style.paddingLeft = "var(--file-margins)";
208207
file.sizerElement.style.paddingRight = "var(--file-margins)";
208+
file.sizerElement.style.paddingBottom = "50vh";
209209
file.sizerElement.style.width = "100%";
210210
file.sizerElement.style.position = "absolute";
211211

@@ -268,6 +268,7 @@ export class HTMLGenerator {
268268

269269
/*
270270
- div.webpage-container
271+
- div.sidebar-mobile-btns
271272
272273
- div.sidebar-left
273274
- div.sidebar-content
@@ -315,6 +316,33 @@ export class HTMLGenerator {
315316
return { container: pageContainer, left: leftContent, leftScroll: leftSidebarScroll, right: rightContent, rightScroll: rightSidebarScroll, center: documentContainer };
316317
}
317318

319+
private static generateSideBarBtns(file: ExportFile, {left, right, container}: {left: HTMLElement, right: HTMLElement, container: HTMLElement}): {leftBtn: HTMLElement, rightBtn: HTMLElement, mobileSideBarBtns: HTMLElement}
320+
{
321+
const docEl = file.document;
322+
/*
323+
- div.sidebar-mobile-btns
324+
- a.sidebar-mobile-btn--left
325+
- a.sidebar-mobile-btn--right
326+
*/
327+
328+
let mobileSideBarBtns = docEl.createElement("div");
329+
const leftBtn = docEl.createElement("a");
330+
const rightBtn = docEl.createElement("a");
331+
332+
mobileSideBarBtns.setAttribute("class", "sidebar-mobile-btns");
333+
leftBtn.setAttribute("class", "sidebar-mobile-btn--left");
334+
rightBtn.setAttribute("class", "sidebar-mobile-btn--right");
335+
336+
setIcon(leftBtn, "sidebar-left");
337+
setIcon(rightBtn, "sidebar-right");
338+
339+
mobileSideBarBtns.appendChild(leftBtn);
340+
mobileSideBarBtns.appendChild(rightBtn);
341+
container.appendChild(mobileSideBarBtns);
342+
343+
return {leftBtn, rightBtn, mobileSideBarBtns};
344+
}
345+
318346
private static getRelativePaths(file: ExportFile): { mediaPath: Path, jsPath: Path, cssPath: Path, rootPath: Path } {
319347
let rootPath = file.pathToRoot;
320348
let imagePath = AssetHandler.mediaFolderName.makeUnixStyle();

0 commit comments

Comments
 (0)