-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path_shell.html
More file actions
165 lines (152 loc) · 20.5 KB
/
_shell.html
File metadata and controls
165 lines (152 loc) · 20.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>Hotdocx | Author, Diagram, Paginate, Share</title><meta name="description" content="Hotdocx (LastRevision) is a browser-first editor for academic writing with Arrowgram diagrams and paged previews. Draft, export, and share documents with a clean public link."/><meta name="keywords" content="academic writing, markdown editor, commutative diagrams, category theory diagrams, lecture notes, research notes, paged.js, pdf export, document sharing"/><meta name="twitter:title" content="Hotdocx | Author, Diagram, Paginate, Share"/><meta name="twitter:description" content="Hotdocx (LastRevision) is a browser-first editor for academic writing with Arrowgram diagrams and paged previews. Draft, export, and share documents with a clean public link."/><meta name="twitter:creator" content="@tannerlinsley"/><meta name="twitter:site" content="@tannerlinsley"/><meta name="og:type" content="website"/><meta name="og:title" content="Hotdocx | Author, Diagram, Paginate, Share"/><meta name="og:description" content="Hotdocx (LastRevision) is a browser-first editor for academic writing with Arrowgram diagrams and paged previews. Draft, export, and share documents with a clean public link."/><link rel="modulepreload" href="/assets/main-CoWZqEGQ.js"/><link rel="modulepreload" href="/assets/index-DPmxHXOd.js"/><link rel="modulepreload" href="/assets/clock-CulA6XYN.js"/><link rel="modulepreload" href="/assets/calendar-DddeM0pb.js"/><link rel="modulepreload" href="/assets/EmailOtpAuthCard-nHcmJ7mS.js"/><link rel="modulepreload" href="/assets/file-text-Cc5JK1Uu.js"/><link rel="modulepreload" href="/assets/users-DV4V05l5.js"/><link rel="modulepreload" href="/assets/book-open-bp0AS6Ex.js"/><link rel="modulepreload" href="/assets/message-square-B6jmEV1a.js"/><link rel="modulepreload" href="/assets/user-plus-BSzJ5r5w.js"/><link rel="modulepreload" href="/assets/globe-4LEX3DMZ.js"/><link rel="modulepreload" href="/assets/PricingCard-D6deIS3T.js"/><link rel="modulepreload" href="/assets/chevron-down-C6aQBdQj.js"/><link rel="modulepreload" href="/assets/input-D-84Au_s.js"/><link rel="modulepreload" href="/assets/panel-CozmIRqM.js"/><link rel="modulepreload" href="/assets/check-BEZQbWG8.js"/><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"/><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"/><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"/><link rel="manifest" href="/site.webmanifest" color="#fffff"/><link rel="icon" href="/favicon.ico"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600&family=Outfit:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500;700&display=swap" crossorigin="anonymous"/><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css" crossorigin="anonymous"/><link rel="stylesheet" href="/assets/app-DRwcFdbX.css"/><script>
(function () {
// Configure TanStack Start server function fetch for split hosting:
// GitHub Pages (static) + Cloud Run (server).
var apiBase = "https://lastrevision-app-28949829032.us-central1.run.app";
if (!apiBase) return;
var tokenKey = 'hotdocx_bearer_token';
var makeFetch = function () {
return function (url, init) {
var fullUrl =
typeof url === 'string' && (url.startsWith('http://') || url.startsWith('https://'))
? url
: apiBase.replace(/\/$/, '') + url;
var headers = new Headers((init && init.headers) || {});
var token = localStorage.getItem(tokenKey);
if (token && !headers.has('Authorization')) {
headers.set('Authorization', 'Bearer ' + token);
}
return fetch(fullUrl, Object.assign({}, init, {
mode: 'cors',
credentials: 'omit',
headers: headers
}));
};
};
// TanStack Start reads this via getStartOptions(). However, the runtime also
// reassigns window.__TSS_START_OPTIONS__ during hydration, which can clobber
// properties set earlier. Define an accessor that merges serverFns.fetch.
var fetchFn = makeFetch();
function attachFetch(opts) {
if (!opts) return;
opts.serverFns = opts.serverFns || {};
opts.serverFns.fetch = fetchFn;
}
if (window.__TSS_START_OPTIONS__) {
attachFetch(window.__TSS_START_OPTIONS__);
} else {
var internalValue;
Object.defineProperty(window, '__TSS_START_OPTIONS__', {
configurable: true,
enumerable: true,
get: function () { return internalValue; },
set: function (v) {
internalValue = v;
attachFetch(internalValue);
}
});
}
})();
</script><script>
(function (l) {
// GitHub Pages SPA redirect support (paired with public/404.html)
// If we were redirected to /_shell.html?/<route>, restore the original route.
if (l.search && l.search[1] === '/') {
var decoded = l.search
.slice(1)
.split('&')
.map(function (s) {
return s.replace(/~and~/g, '&');
})
.join('?');
window.history.replaceState(null, null, decoded + l.hash);
}
})(window.location);
</script><script>
(function () {
// OAuth handoff support:
// Cloud Run redirects back to hotdocx.github.io with #auth_token=... in the fragment.
// Store it and remove from the URL.
var tokenKey = 'hotdocx_bearer_token';
if (!window.location.hash) return;
var params = new URLSearchParams(window.location.hash.slice(1));
var token = params.get('auth_token');
if (!token) return;
try { localStorage.setItem(tokenKey, token); } catch (_) {}
params.delete('auth_token');
var nextHash = params.toString();
var nextUrl = window.location.pathname + window.location.search + (nextHash ? ('#' + nextHash) : '');
window.history.replaceState(null, null, nextUrl);
})();
</script><script>
(function() {
// Constants (must match ThemeProvider.tsx)
const THEME_COOKIE_NAME = 'ui-theme';
const COOKIE_EXPIRY_DAYS = 365;
const MILLISECONDS_PER_DAY = 864e5;
const DARK_MODE_MEDIA_QUERY = '(prefers-color-scheme: dark)';
const THEME_CLASSES = { LIGHT: 'light', DARK: 'dark' };
// Get theme from cookie
let theme = document.cookie.match(new RegExp('(^| )' + THEME_COOKIE_NAME + '=([^;]+)'))?.[2];
let resolvedTheme;
let root = document.documentElement;
// Clear any existing theme classes
root.classList.remove(THEME_CLASSES.LIGHT, THEME_CLASSES.DARK);
if (!theme || theme === 'system') {
// Use system preference for system theme or if no theme is set
resolvedTheme = window.matchMedia(DARK_MODE_MEDIA_QUERY).matches ? THEME_CLASSES.DARK : THEME_CLASSES.LIGHT;
if (!theme) {
// Set cookie with system preference on first visit
const expires = new Date(Date.now() + COOKIE_EXPIRY_DAYS * MILLISECONDS_PER_DAY).toUTCString();
document.cookie = THEME_COOKIE_NAME + '=system; expires=' + expires + '; path=/; SameSite=Lax';
}
} else {
resolvedTheme = theme;
}
root.classList.add(resolvedTheme);
// Add data attribute for debugging
root.setAttribute('data-theme', theme || 'system');
root.setAttribute('data-resolved-theme', resolvedTheme);
})();
</script><style>
#nprogress .bar {
background: var(--primary) !important;
height: 3px;
}
#nprogress .peg {
box-shadow: 0 0 10px var(--primary), 0 0 5px var(--primary);
}
#nprogress .spinner-icon {
display: none;
}
</style></head><body><div class="min-h-screen bg-background pb-20"><div><header class="sticky top-0 z-40 w-full border-b border-border/40 bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60"><div class="max-w-screen-2xl mx-auto px-8 flex h-14 items-center"><div class="mr-4 flex gap-16"><a class="mr-6 flex items-center space-x-2 group active" href="/" data-status="active" aria-current="page"><div class="relative shrink-0"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-code h-5 w-5 text-primary transition-transform group-hover:scale-110" aria-hidden="true"><path d="m16 18 6-6-6-6"></path><path d="m8 6-6 6 6 6"></path></svg><div class="absolute inset-0 bg-primary/20 rounded-full blur-sm opacity-0 group-hover:opacity-100 transition-opacity"></div></div><span class="hidden font-semibold text-sm sm:inline-block bg-gradient-to-r from-primary to-purple-600 bg-clip-text text-transparent whitespace-nowrap leading-none">LastRevision</span></a><nav class="hidden md:flex items-center gap-2 text-sm"><a href="/gallery" class="relative flex items-center gap-2 px-4 py-2 rounded-lg transition-all duration-200 group text-foreground/70 hover:text-foreground"><span class="relative z-10">Gallery</span></a><a class="relative flex items-center gap-2 px-4 py-2 rounded-lg transition-all duration-200 group text-foreground/70 hover:text-foreground active" href="/" data-status="active" aria-current="page"><span class="relative z-10">Pricing</span><span class="absolute inset-0 rounded-lg bg-primary/5 transition-opacity duration-200 opacity-0 group-hover:opacity-100"></span><span class="absolute inset-0 rounded-lg bg-gradient-to-r from-primary/10 to-purple-600/10 blur-sm transition-opacity duration-200 opacity-0 group-hover:opacity-100"></span></a><a href="https://github.com/hotdocx/arrowgram" target="_blank" rel="noreferrer" aria-label="View open-source project on GitHub" class="relative flex items-center gap-2 px-4 py-2 rounded-lg transition-all duration-200 text-foreground/70 hover:text-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-github h-4 w-4" aria-hidden="true"><path d="M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4"></path><path d="M9 18c-4.51 2-5-2-7-2"></path></svg><span class="relative z-10">Open Source</span></a><a href="https://lastrevision.pro" target="_blank" rel="noreferrer" aria-label="Try LastRevision.pro" class="relative flex items-center gap-2 px-4 py-2 rounded-lg transition-all duration-200 text-foreground/70 hover:text-foreground"><span class="relative z-10">Try LastRevision.pro</span></a></nav></div><div class="flex flex-1 items-center justify-between space-x-2 md:justify-end"><div class="w-full flex-1 md:w-auto md:flex-none"></div><nav class="flex items-center gap-4"><a href="https://lastrevision.pro" target="_blank" rel="noreferrer" aria-label="Try LastRevision.pro" class="inline-flex md:hidden items-center justify-center h-9 px-2 rounded-md border border-border/60 text-xs font-medium text-foreground/80 hover:text-foreground hover:bg-accent/40 transition-colors">Pro</a><a href="https://github.com/hotdocx/arrowgram" target="_blank" rel="noreferrer" aria-label="View open-source project on GitHub" class="inline-flex md:hidden items-center justify-center h-9 w-9 rounded-md border border-border/60 text-foreground/80 hover:text-foreground hover:bg-accent/40 transition-colors"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-github h-4 w-4" aria-hidden="true"><path d="M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4"></path><path d="M9 18c-4.51 2-5-2-7-2"></path></svg></a><div class="flex h-9 w-9 items-center justify-center"><div class="h-4 w-4 animate-spin rounded-full border-2 border-primary border-t-transparent"></div></div><button data-slot="dropdown-menu-trigger" class="cursor-pointer inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lg text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:ring-2 focus-visible:ring-primary/50 active:scale-[0.98] border shadow-sm backdrop-blur-sm bg-white border-gray-300 text-gray-700 hover:bg-gray-50 hover:text-gray-900 dark:border-white/10 dark:bg-white/5 dark:text-slate-300 dark:hover:bg-white/10 dark:hover:text-white h-10 w-10" type="button" id="radix-_R_4mj6_" aria-haspopup="menu" aria-expanded="false" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sun h-[1.2rem] w-[1.2rem] scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90" aria-hidden="true"><circle cx="12" cy="12" r="4"></circle><path d="M12 2v2"></path><path d="M12 20v2"></path><path d="m4.93 4.93 1.41 1.41"></path><path d="m17.66 17.66 1.41 1.41"></path><path d="M2 12h2"></path><path d="M20 12h2"></path><path d="m6.34 17.66-1.41 1.41"></path><path d="m19.07 4.93-1.41 1.41"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-moon absolute h-[1.2rem] w-[1.2rem] scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0" aria-hidden="true"><path d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"></path></svg><span class="sr-only">Toggle theme</span></button></nav></div></div></header></div><main><!--$--><!--$--><!--/$--><!--/$--></main><div><footer class="border-t bg-background"><div class="container mx-auto px-4 py-8"><div class="grid grid-cols-2 gap-8 md:grid-cols-4"><div><h3 class="font-semibold mb-3">Product</h3><ul class="space-y-2 text-sm text-muted-foreground"><li><a class="hover:text-foreground transition-colors active" href="/" data-status="active" aria-current="page">Features</a></li><li><a class="hover:text-foreground transition-colors active" href="/" data-status="active" aria-current="page">Pricing</a></li><li><a class="hover:text-foreground transition-colors active" href="/" data-status="active" aria-current="page">Documentation</a></li></ul></div><div><h3 class="font-semibold mb-3">Company</h3><ul class="space-y-2 text-sm text-muted-foreground"><li><a class="hover:text-foreground transition-colors active" href="/" data-status="active" aria-current="page">About</a></li><li><a class="hover:text-foreground transition-colors active" href="/" data-status="active" aria-current="page">Blog</a></li><li><a class="hover:text-foreground transition-colors active" href="/" data-status="active" aria-current="page">Careers</a></li></ul></div><div><h3 class="font-semibold mb-3">Resources</h3><ul class="space-y-2 text-sm text-muted-foreground"><li><a class="hover:text-foreground transition-colors active" href="/" data-status="active" aria-current="page">Community</a></li><li><a class="hover:text-foreground transition-colors active" href="/" data-status="active" aria-current="page">Help Center</a></li><li><a class="hover:text-foreground transition-colors active" href="/" data-status="active" aria-current="page">Contact</a></li></ul></div><div><h3 class="font-semibold mb-3">Legal</h3><ul class="space-y-2 text-sm text-muted-foreground"><li><a class="hover:text-foreground transition-colors active" href="/" data-status="active" aria-current="page">Privacy Policy</a></li><li><a class="hover:text-foreground transition-colors active" href="/" data-status="active" aria-current="page">Terms of Service</a></li><li><a class="hover:text-foreground transition-colors active" href="/" data-status="active" aria-current="page">Cookies</a></li></ul></div></div><div class="mt-8 pt-8 border-t"><div class="flex flex-col items-center justify-between gap-4 md:flex-row"><div class="flex items-center space-x-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-code h-6 w-6 text-primary" aria-hidden="true"><path d="m16 18 6-6-6-6"></path><path d="m8 6-6 6 6 6"></path></svg><span class="font-semibold bg-gradient-to-r from-primary to-purple-600 bg-clip-text text-transparent">Hotdocx</span></div><p class="text-sm text-muted-foreground">© 2026 Hotdocx. All rights reserved.</p></div></div></div></footer></div></div><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section><script class="$tsr" id="$tsr-stream-barrier">(self.$R=self.$R||{})["tsr"]=[];self.$_TSR={h(){this.hydrated=!0,this.c()},e(){this.streamEnded=!0,this.c()},c(){this.hydrated&&this.streamEnded&&(delete self.$_TSR,delete self.$R.tsr)},p(e){this.initialized?e():this.buffer.push(e)},buffer:[]};
;$_TSR.router=($R=>$R[0]={manifest:$R[1]={routes:$R[2]={__root__:$R[3]={preloads:$R[4]=["/assets/main-CoWZqEGQ.js"],assets:$R[5]=[$R[6]={tag:"script",attrs:$R[7]={type:"module",async:!0},children:"import('/assets/main-CoWZqEGQ.js')"}]}}},matches:$R[8]=[$R[9]={i:"__root__/",u:1774352974982,s:"success",ssr:!0}],lastMatchId:"__root__/",dehydratedData:$R[10]={queryStream:$R[11]=($R[12]=(e) => new ReadableStream({ start: (r) => {
e.on({ next: (a) => {
try {
r.enqueue(a);
} catch (t) {
}
}, throw: (a) => {
r.error(a);
}, return: () => {
try {
r.close();
} catch (a) {
}
} });
} }))($R[13]=($R[14]=() => {
let e = [], r = [], t = true, n = false, a = 0, s = (l, g, S) => {
for (S = 0; S < a; S++) r[S] && r[S][g](l);
}, i = (l, g, S, d) => {
for (g = 0, S = e.length; g < S; g++) d = e[g], !t && g === S - 1 ? l[n ? "return" : "throw"](d) : l.next(d);
}, u = (l, g) => (t && (g = a++, r[g] = l), i(l), () => {
t && (r[g] = r[a], r[a--] = void 0);
});
return { __SEROVAL_STREAM__: true, on: (l) => u(l), next: (l) => {
t && (e.push(l), s(l, "next"));
}, throw: (l) => {
t && (e.push(l), s(l, "throw"), t = false, n = false, r.length = 0);
}, return: (l) => {
t && (e.push(l), s(l, "return"), t = false, n = true, r.length = 0);
} };
})())}})($R["tsr"]);($R=>$R[13].next($R[15]={mutations:$R[16]=[],queries:$R[17]=[$R[18]={dehydratedAt:1774352975030,state:$R[19]={data:"system",dataUpdateCount:1,dataUpdatedAt:1774352975029,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:"success",fetchStatus:"idle"},queryKey:$R[20]=["theme"],queryHash:"[\"theme\"]"}]}))($R["tsr"]);document.currentScript.remove()</script><script type="module" async="">import('/assets/main-CoWZqEGQ.js')</script><script>($R=>$R[13].return(void 0))($R["tsr"]);$_TSR.e();document.currentScript.remove()</script></body></html>