markdown-os 0.7.2__tar.gz → 0.7.4__tar.gz
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.
- {markdown_os-0.7.2 → markdown_os-0.7.4}/PKG-INFO +1 -6
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/server.py +1 -18
- {markdown_os-0.7.2/site → markdown_os-0.7.4/markdown_os/static/css}/styles.css +0 -61
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/static/index.html +0 -30
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/static/js/editor.js +0 -66
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/static/js/theme.js +1 -1
- {markdown_os-0.7.2 → markdown_os-0.7.4}/pyproject.toml +1 -10
- {markdown_os-0.7.2 → markdown_os-0.7.4}/site/index.html +9 -92
- {markdown_os-0.7.2/markdown_os/static/css → markdown_os-0.7.4/site}/styles.css +0 -61
- {markdown_os-0.7.2 → markdown_os-0.7.4}/uv.lock +1 -283
- markdown_os-0.7.2/.github/workflows/desktop-release.yml +0 -109
- markdown_os-0.7.2/markdown_os/desktop.py +0 -233
- markdown_os-0.7.2/markdown_os/static/welcome.html +0 -354
- markdown_os-0.7.2/markdown_os.spec +0 -113
- markdown_os-0.7.2/scripts/build_desktop.py +0 -52
- markdown_os-0.7.2/scripts/download_vendor.py +0 -165
- markdown_os-0.7.2/site/downloads.html +0 -913
- markdown_os-0.7.2/tests/test_desktop.py +0 -222
- {markdown_os-0.7.2 → markdown_os-0.7.4}/.github/workflows/publish.yml +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/.gitignore +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/.python-version +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/AGENTS.md +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/CLAUDE.md +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/LICENSE +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/README.md +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/docs/plans/feature-001-pdf-export.md +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/docs/plans/feature-002-file-operations.md +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/docs/plans/feature-003-focus-mode.md +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/__init__.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/cli.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/directory_handler.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/file_handler.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/static/css/themes.css +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/static/favicon.svg +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/static/js/dialogs.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/static/js/file-tree.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/static/js/focus-mode.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/static/js/pdf-export.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/static/js/search.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/static/js/shared-utils.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/static/js/tabs.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/static/js/toc.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/static/js/websocket.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/static/js/wysiwyg-toolbar.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/static/js/wysiwyg.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/markdown_os/templates/example_template.md +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/site/demo-frame.html +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/site/favicon.svg +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/site/images/hero-screenshot.png +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/site/themes.css +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/tests/test_cli.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/tests/test_directory_handler.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/tests/test_file_handler.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/tests/test_frontend_navigation_sync.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/tests/test_server.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/tests/test_version.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.4}/vercel.json +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: markdown-os
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.4
|
|
4
4
|
Summary: Developer-focused markdown editor served from a local CLI.
|
|
5
5
|
Project-URL: Homepage, https://github.com/elena-cabrera/markdown-os
|
|
6
6
|
Project-URL: Repository, https://github.com/elena-cabrera/markdown-os
|
|
@@ -30,11 +30,6 @@ Requires-Dist: typer>=0.23.1
|
|
|
30
30
|
Requires-Dist: uvicorn[standard]>=0.40.0
|
|
31
31
|
Requires-Dist: watchdog>=6.0.0
|
|
32
32
|
Requires-Dist: websockets>=16.0
|
|
33
|
-
Provides-Extra: desktop
|
|
34
|
-
Requires-Dist: pyqt5>=5.15; (sys_platform == 'linux') and extra == 'desktop'
|
|
35
|
-
Requires-Dist: pyqtwebengine>=5.15; (sys_platform == 'linux') and extra == 'desktop'
|
|
36
|
-
Requires-Dist: pywebview>=5.0; extra == 'desktop'
|
|
37
|
-
Requires-Dist: qtpy>=2.0; (sys_platform == 'linux') and extra == 'desktop'
|
|
38
33
|
Description-Content-Type: text/markdown
|
|
39
34
|
|
|
40
35
|
# Markdown-OS
|
|
@@ -249,18 +249,13 @@ class MarkdownPathEventHandler(FileSystemEventHandler):
|
|
|
249
249
|
return event_path.suffix.lower() in {".md", ".markdown"}
|
|
250
250
|
|
|
251
251
|
|
|
252
|
-
def create_app(
|
|
253
|
-
handler: FileHandler | DirectoryHandler,
|
|
254
|
-
mode: str = "file",
|
|
255
|
-
desktop: bool = False,
|
|
256
|
-
) -> FastAPI:
|
|
252
|
+
def create_app(handler: FileHandler | DirectoryHandler, mode: str = "file") -> FastAPI:
|
|
257
253
|
"""
|
|
258
254
|
Create the FastAPI application for the markdown editor.
|
|
259
255
|
|
|
260
256
|
Args:
|
|
261
257
|
- handler (FileHandler | DirectoryHandler): File or folder access service.
|
|
262
258
|
- mode (str): Editor mode, either "file" or "folder".
|
|
263
|
-
- desktop (bool): Whether the app is running in desktop (pywebview) mode.
|
|
264
259
|
|
|
265
260
|
Returns:
|
|
266
261
|
- FastAPI: Configured application with routes, static assets, and websocket support.
|
|
@@ -341,7 +336,6 @@ def create_app(
|
|
|
341
336
|
|
|
342
337
|
app.state.handler = handler
|
|
343
338
|
app.state.mode = mode
|
|
344
|
-
app.state.desktop = desktop
|
|
345
339
|
app.state.current_file = None
|
|
346
340
|
app.state.websocket_hub = WebSocketHub()
|
|
347
341
|
app.state.last_internal_write_at = 0.0
|
|
@@ -379,17 +373,6 @@ def create_app(
|
|
|
379
373
|
|
|
380
374
|
return {"mode": app.state.mode}
|
|
381
375
|
|
|
382
|
-
@app.get("/api/desktop")
|
|
383
|
-
async def get_desktop_mode() -> dict[str, bool]:
|
|
384
|
-
"""
|
|
385
|
-
Return whether the server is running in desktop (pywebview) mode.
|
|
386
|
-
|
|
387
|
-
Returns:
|
|
388
|
-
- dict[str, bool]: Desktop mode flag.
|
|
389
|
-
"""
|
|
390
|
-
|
|
391
|
-
return {"desktop": app.state.desktop}
|
|
392
|
-
|
|
393
376
|
@app.get("/api/file-tree")
|
|
394
377
|
async def get_file_tree() -> dict[str, Any]:
|
|
395
378
|
"""
|
|
@@ -513,67 +513,6 @@ body {
|
|
|
513
513
|
gap: 6px;
|
|
514
514
|
}
|
|
515
515
|
|
|
516
|
-
.desktop-open-group {
|
|
517
|
-
position: relative;
|
|
518
|
-
display: inline-flex;
|
|
519
|
-
align-items: center;
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
.desktop-open-group.hidden {
|
|
523
|
-
display: none;
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
.desktop-open-btn svg {
|
|
527
|
-
width: 16px;
|
|
528
|
-
height: 16px;
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
.desktop-open-menu {
|
|
532
|
-
position: absolute;
|
|
533
|
-
top: calc(100% + 4px);
|
|
534
|
-
left: 0;
|
|
535
|
-
z-index: 100;
|
|
536
|
-
min-width: 180px;
|
|
537
|
-
background: var(--panel-bg);
|
|
538
|
-
border: 1px solid var(--border);
|
|
539
|
-
border-radius: 8px;
|
|
540
|
-
box-shadow: var(--shadow);
|
|
541
|
-
padding: 4px;
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
.desktop-open-menu.hidden {
|
|
545
|
-
display: none;
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
.desktop-open-menu-item {
|
|
549
|
-
display: flex;
|
|
550
|
-
align-items: center;
|
|
551
|
-
gap: 8px;
|
|
552
|
-
width: 100%;
|
|
553
|
-
padding: 8px 12px;
|
|
554
|
-
border: none;
|
|
555
|
-
border-radius: 6px;
|
|
556
|
-
background: none;
|
|
557
|
-
color: var(--text);
|
|
558
|
-
font-size: 13px;
|
|
559
|
-
cursor: pointer;
|
|
560
|
-
text-align: left;
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
.desktop-open-menu-item:hover {
|
|
564
|
-
background: var(--accent-soft);
|
|
565
|
-
color: var(--accent);
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
.desktop-open-menu-item svg {
|
|
569
|
-
flex-shrink: 0;
|
|
570
|
-
color: var(--text-muted);
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
.desktop-open-menu-item:hover svg {
|
|
574
|
-
color: var(--accent);
|
|
575
|
-
}
|
|
576
|
-
|
|
577
516
|
.history-button {
|
|
578
517
|
width: 32px;
|
|
579
518
|
height: 32px;
|
|
@@ -218,36 +218,6 @@
|
|
|
218
218
|
<main id="main-content">
|
|
219
219
|
<div class="tab-nav">
|
|
220
220
|
<div class="nav-left-group">
|
|
221
|
-
<div id="desktop-open-group" class="desktop-open-group hidden" aria-label="Open file or folder">
|
|
222
|
-
<button
|
|
223
|
-
id="desktop-open-btn"
|
|
224
|
-
class="history-button desktop-open-btn"
|
|
225
|
-
type="button"
|
|
226
|
-
title="Open file or folder"
|
|
227
|
-
aria-label="Open file or folder"
|
|
228
|
-
aria-haspopup="menu"
|
|
229
|
-
aria-expanded="false"
|
|
230
|
-
>
|
|
231
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
|
232
|
-
<path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/>
|
|
233
|
-
</svg>
|
|
234
|
-
</button>
|
|
235
|
-
<div id="desktop-open-menu" class="desktop-open-menu hidden" role="menu">
|
|
236
|
-
<button id="desktop-open-file" class="desktop-open-menu-item" type="button" role="menuitem">
|
|
237
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" width="16" height="16">
|
|
238
|
-
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/>
|
|
239
|
-
<polyline points="14 2 14 8 20 8"/>
|
|
240
|
-
</svg>
|
|
241
|
-
<span>Open File...</span>
|
|
242
|
-
</button>
|
|
243
|
-
<button id="desktop-open-folder" class="desktop-open-menu-item" type="button" role="menuitem">
|
|
244
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" width="16" height="16">
|
|
245
|
-
<path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/>
|
|
246
|
-
</svg>
|
|
247
|
-
<span>Open Folder...</span>
|
|
248
|
-
</button>
|
|
249
|
-
</div>
|
|
250
|
-
</div>
|
|
251
221
|
<div class="undo-redo-group" aria-label="Edit history controls">
|
|
252
222
|
<button
|
|
253
223
|
id="undo-button"
|
|
@@ -619,76 +619,10 @@
|
|
|
619
619
|
}
|
|
620
620
|
});
|
|
621
621
|
|
|
622
|
-
async function detectDesktopMode() {
|
|
623
|
-
try {
|
|
624
|
-
const response = await fetch("/api/desktop");
|
|
625
|
-
if (!response.ok) return false;
|
|
626
|
-
const payload = await response.json();
|
|
627
|
-
return payload.desktop === true;
|
|
628
|
-
} catch {
|
|
629
|
-
return false;
|
|
630
|
-
}
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
function initDesktopOpenButton() {
|
|
634
|
-
const group = document.getElementById("desktop-open-group");
|
|
635
|
-
const btn = document.getElementById("desktop-open-btn");
|
|
636
|
-
const menu = document.getElementById("desktop-open-menu");
|
|
637
|
-
const openFileBtn = document.getElementById("desktop-open-file");
|
|
638
|
-
const openFolderBtn = document.getElementById("desktop-open-folder");
|
|
639
|
-
|
|
640
|
-
if (!group || !btn || !menu) return;
|
|
641
|
-
group.classList.remove("hidden");
|
|
642
|
-
|
|
643
|
-
btn.addEventListener("click", () => {
|
|
644
|
-
const isOpen = !menu.classList.contains("hidden");
|
|
645
|
-
menu.classList.toggle("hidden", isOpen);
|
|
646
|
-
btn.setAttribute("aria-expanded", String(!isOpen));
|
|
647
|
-
});
|
|
648
|
-
|
|
649
|
-
document.addEventListener("click", (e) => {
|
|
650
|
-
if (!group.contains(e.target)) {
|
|
651
|
-
menu.classList.add("hidden");
|
|
652
|
-
btn.setAttribute("aria-expanded", "false");
|
|
653
|
-
}
|
|
654
|
-
});
|
|
655
|
-
|
|
656
|
-
async function openViaDialog(dialogFn) {
|
|
657
|
-
menu.classList.add("hidden");
|
|
658
|
-
btn.setAttribute("aria-expanded", "false");
|
|
659
|
-
if (!window.pywebview?.api?.[dialogFn]) return;
|
|
660
|
-
try {
|
|
661
|
-
const path = await window.pywebview.api[dialogFn]();
|
|
662
|
-
if (!path) return;
|
|
663
|
-
const result = await window.pywebview.api.open_path(path);
|
|
664
|
-
if (result.error) {
|
|
665
|
-
console.error("Desktop open error:", result.error);
|
|
666
|
-
return;
|
|
667
|
-
}
|
|
668
|
-
if (result.url) window.location.href = result.url;
|
|
669
|
-
} catch (err) {
|
|
670
|
-
console.error("Desktop open failed:", err);
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
|
-
|
|
674
|
-
if (openFileBtn) {
|
|
675
|
-
openFileBtn.addEventListener("click", () => openViaDialog("open_file_dialog"));
|
|
676
|
-
}
|
|
677
|
-
if (openFolderBtn) {
|
|
678
|
-
openFolderBtn.addEventListener("click", () => openViaDialog("open_folder_dialog"));
|
|
679
|
-
}
|
|
680
|
-
}
|
|
681
|
-
|
|
682
622
|
document.addEventListener("DOMContentLoaded", async () => {
|
|
683
623
|
window.wysiwyg?.init?.();
|
|
684
624
|
|
|
685
625
|
editorState.mode = await detectMode();
|
|
686
|
-
|
|
687
|
-
const isDesktop = await detectDesktopMode();
|
|
688
|
-
if (isDesktop) {
|
|
689
|
-
initDesktopOpenButton();
|
|
690
|
-
}
|
|
691
|
-
|
|
692
626
|
bindEvents();
|
|
693
627
|
|
|
694
628
|
if (editorState.mode === "file") {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "markdown-os"
|
|
3
|
-
version = "0.7.
|
|
3
|
+
version = "0.7.4"
|
|
4
4
|
description = "Developer-focused markdown editor served from a local CLI."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "Apache-2.0"
|
|
@@ -32,14 +32,6 @@ dependencies = [
|
|
|
32
32
|
"websockets>=16.0",
|
|
33
33
|
]
|
|
34
34
|
|
|
35
|
-
[project.optional-dependencies]
|
|
36
|
-
desktop = [
|
|
37
|
-
"pywebview>=5.0",
|
|
38
|
-
"PyQtWebEngine>=5.15; sys_platform == 'linux'",
|
|
39
|
-
"PyQt5>=5.15; sys_platform == 'linux'",
|
|
40
|
-
"qtpy>=2.0; sys_platform == 'linux'",
|
|
41
|
-
]
|
|
42
|
-
|
|
43
35
|
[dependency-groups]
|
|
44
36
|
dev = [
|
|
45
37
|
"httpx>=0.28.1",
|
|
@@ -49,7 +41,6 @@ dev = [
|
|
|
49
41
|
|
|
50
42
|
[project.scripts]
|
|
51
43
|
markdown-os = "markdown_os.cli:run"
|
|
52
|
-
markdown-os-desktop = "markdown_os.desktop:main"
|
|
53
44
|
|
|
54
45
|
[project.urls]
|
|
55
46
|
Homepage = "https://github.com/elena-cabrera/markdown-os"
|
|
@@ -121,7 +121,7 @@
|
|
|
121
121
|
padding: 16px 0;
|
|
122
122
|
display: flex;
|
|
123
123
|
align-items: center;
|
|
124
|
-
justify-content:
|
|
124
|
+
justify-content: flex-start;
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
.logo {
|
|
@@ -255,37 +255,9 @@
|
|
|
255
255
|
}
|
|
256
256
|
|
|
257
257
|
.hero-cta {
|
|
258
|
-
display: flex;
|
|
259
|
-
align-items: center;
|
|
260
|
-
gap: 12px;
|
|
261
|
-
flex-wrap: wrap;
|
|
262
258
|
margin-bottom: 16px;
|
|
263
259
|
}
|
|
264
260
|
|
|
265
|
-
.download-secondary {
|
|
266
|
-
display: block;
|
|
267
|
-
margin-top: 4px;
|
|
268
|
-
font-size: 13px;
|
|
269
|
-
color: var(--color-text-secondary);
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
.download-secondary a {
|
|
273
|
-
text-decoration: underline;
|
|
274
|
-
text-underline-offset: 2px;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
.download-secondary a:hover {
|
|
278
|
-
color: var(--color-text);
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
.cta-buttons {
|
|
282
|
-
display: flex;
|
|
283
|
-
align-items: center;
|
|
284
|
-
gap: 12px;
|
|
285
|
-
flex-wrap: wrap;
|
|
286
|
-
justify-content: center;
|
|
287
|
-
}
|
|
288
|
-
|
|
289
261
|
/* Install widget — white box, gray border, less rounded */
|
|
290
262
|
.install-widget {
|
|
291
263
|
max-width: 380px;
|
|
@@ -1638,15 +1610,6 @@
|
|
|
1638
1610
|
</svg>
|
|
1639
1611
|
markdown-os
|
|
1640
1612
|
</a>
|
|
1641
|
-
<nav class="header-nav">
|
|
1642
|
-
<a href="downloads">Downloads</a>
|
|
1643
|
-
<a
|
|
1644
|
-
href="https://github.com/elena-cabrera/markdown-os"
|
|
1645
|
-
target="_blank"
|
|
1646
|
-
rel="noopener"
|
|
1647
|
-
>GitHub</a
|
|
1648
|
-
>
|
|
1649
|
-
</nav>
|
|
1650
1613
|
</div>
|
|
1651
1614
|
</header>
|
|
1652
1615
|
|
|
@@ -1662,24 +1625,14 @@
|
|
|
1662
1625
|
</p>
|
|
1663
1626
|
|
|
1664
1627
|
<div class="hero-cta">
|
|
1665
|
-
<a
|
|
1666
|
-
id="hero-download-btn"
|
|
1667
|
-
href="downloads"
|
|
1668
|
-
class="btn btn-primary"
|
|
1669
|
-
style="display: none"
|
|
1670
|
-
>Download Desktop App</a
|
|
1671
|
-
>
|
|
1672
1628
|
<a
|
|
1673
1629
|
href="https://github.com/elena-cabrera/markdown-os"
|
|
1674
|
-
class="btn btn-
|
|
1630
|
+
class="btn btn-primary"
|
|
1675
1631
|
target="_blank"
|
|
1676
1632
|
rel="noopener"
|
|
1677
1633
|
>View on GitHub</a
|
|
1678
1634
|
>
|
|
1679
1635
|
</div>
|
|
1680
|
-
<div class="download-secondary" id="hero-download-secondary" style="display: none">
|
|
1681
|
-
<a href="downloads">All platforms & versions</a>
|
|
1682
|
-
</div>
|
|
1683
1636
|
|
|
1684
1637
|
<div class="install-widget">
|
|
1685
1638
|
<div class="install-tabs">
|
|
@@ -2314,21 +2267,13 @@
|
|
|
2314
2267
|
<div class="reveal">
|
|
2315
2268
|
<h2>Start using markdown-os</h2>
|
|
2316
2269
|
<p>The new way to work with markdown files</p>
|
|
2317
|
-
<
|
|
2318
|
-
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
>
|
|
2323
|
-
|
|
2324
|
-
href="https://github.com/elena-cabrera/markdown-os"
|
|
2325
|
-
class="btn btn-white"
|
|
2326
|
-
target="_blank"
|
|
2327
|
-
rel="noopener"
|
|
2328
|
-
style="background: transparent; color: white; border-color: rgba(255,255,255,0.3)"
|
|
2329
|
-
>View on GitHub</a
|
|
2330
|
-
>
|
|
2331
|
-
</div>
|
|
2270
|
+
<a
|
|
2271
|
+
href="https://github.com/elena-cabrera/markdown-os"
|
|
2272
|
+
class="btn btn-white"
|
|
2273
|
+
target="_blank"
|
|
2274
|
+
rel="noopener"
|
|
2275
|
+
>View on GitHub</a
|
|
2276
|
+
>
|
|
2332
2277
|
</div>
|
|
2333
2278
|
</div>
|
|
2334
2279
|
</section>
|
|
@@ -2341,7 +2286,6 @@
|
|
|
2341
2286
|
· <span id="footer-version">v—</span>
|
|
2342
2287
|
</div>
|
|
2343
2288
|
<nav class="footer-links">
|
|
2344
|
-
<a href="downloads">Downloads</a>
|
|
2345
2289
|
<a
|
|
2346
2290
|
href="https://github.com/elena-cabrera/markdown-os"
|
|
2347
2291
|
target="_blank"
|
|
@@ -2544,33 +2488,6 @@
|
|
|
2544
2488
|
window.addEventListener("resize", updateScale);
|
|
2545
2489
|
})();
|
|
2546
2490
|
|
|
2547
|
-
// ---- OS-detecting download button ----
|
|
2548
|
-
(() => {
|
|
2549
|
-
const btn = document.getElementById("hero-download-btn");
|
|
2550
|
-
const secondary = document.getElementById("hero-download-secondary");
|
|
2551
|
-
if (!btn) return;
|
|
2552
|
-
|
|
2553
|
-
const ua = navigator.userAgent || "";
|
|
2554
|
-
const platform = navigator.platform || "";
|
|
2555
|
-
const baseUrl = "https://github.com/elena-cabrera/markdown-os/releases/latest/download/";
|
|
2556
|
-
let os = null;
|
|
2557
|
-
|
|
2558
|
-
if (/Mac|iPhone|iPad|iPod/.test(platform) || /Macintosh/.test(ua)) {
|
|
2559
|
-
os = "macOS";
|
|
2560
|
-
btn.href = baseUrl + "Markdown-OS-macos.dmg";
|
|
2561
|
-
btn.textContent = "Download for macOS";
|
|
2562
|
-
} else if (/Win/.test(platform)) {
|
|
2563
|
-
os = "Windows";
|
|
2564
|
-
btn.href = baseUrl + "Markdown-OS-windows.zip";
|
|
2565
|
-
btn.textContent = "Download for Windows";
|
|
2566
|
-
}
|
|
2567
|
-
|
|
2568
|
-
if (os) {
|
|
2569
|
-
btn.style.display = "";
|
|
2570
|
-
if (secondary) secondary.style.display = "";
|
|
2571
|
-
}
|
|
2572
|
-
})();
|
|
2573
|
-
|
|
2574
2491
|
// ---- Scroll reveal animations ----
|
|
2575
2492
|
(() => {
|
|
2576
2493
|
const observer = new IntersectionObserver(
|
|
@@ -513,67 +513,6 @@ body {
|
|
|
513
513
|
gap: 6px;
|
|
514
514
|
}
|
|
515
515
|
|
|
516
|
-
.desktop-open-group {
|
|
517
|
-
position: relative;
|
|
518
|
-
display: inline-flex;
|
|
519
|
-
align-items: center;
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
.desktop-open-group.hidden {
|
|
523
|
-
display: none;
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
.desktop-open-btn svg {
|
|
527
|
-
width: 16px;
|
|
528
|
-
height: 16px;
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
.desktop-open-menu {
|
|
532
|
-
position: absolute;
|
|
533
|
-
top: calc(100% + 4px);
|
|
534
|
-
left: 0;
|
|
535
|
-
z-index: 100;
|
|
536
|
-
min-width: 180px;
|
|
537
|
-
background: var(--panel-bg);
|
|
538
|
-
border: 1px solid var(--border);
|
|
539
|
-
border-radius: 8px;
|
|
540
|
-
box-shadow: var(--shadow);
|
|
541
|
-
padding: 4px;
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
.desktop-open-menu.hidden {
|
|
545
|
-
display: none;
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
.desktop-open-menu-item {
|
|
549
|
-
display: flex;
|
|
550
|
-
align-items: center;
|
|
551
|
-
gap: 8px;
|
|
552
|
-
width: 100%;
|
|
553
|
-
padding: 8px 12px;
|
|
554
|
-
border: none;
|
|
555
|
-
border-radius: 6px;
|
|
556
|
-
background: none;
|
|
557
|
-
color: var(--text);
|
|
558
|
-
font-size: 13px;
|
|
559
|
-
cursor: pointer;
|
|
560
|
-
text-align: left;
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
.desktop-open-menu-item:hover {
|
|
564
|
-
background: var(--accent-soft);
|
|
565
|
-
color: var(--accent);
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
.desktop-open-menu-item svg {
|
|
569
|
-
flex-shrink: 0;
|
|
570
|
-
color: var(--text-muted);
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
.desktop-open-menu-item:hover svg {
|
|
574
|
-
color: var(--accent);
|
|
575
|
-
}
|
|
576
|
-
|
|
577
516
|
.history-button {
|
|
578
517
|
width: 32px;
|
|
579
518
|
height: 32px;
|