SamTV12345 41cb6803d2
7139 let user maintain a single session across multiple browsers (#7228)
* chore: started with implementation

* chore: finished index page

* chore: started with double sided modal

* chore: continue

* chore: completed implementation of transfer token

* chore: fixed typescript checks
2025-11-18 12:23:55 +01:00

246 lines
11 KiB
HTML

<!doctype html>
<html>
<title><%=settings.title%></title>
<meta charset="utf-8">
<link rel="manifest" href="/manifest.json" />
<meta name="referrer" content="no-referrer">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<link rel="shortcut icon" href="favicon.ico">
<link rel="localizations" type="application/l10n+json" href="locales.json">
<style>
html, body {
height: 100%;
}
body {
margin: 0;
color: #333;
font: 14px helvetica, sans-serif;
background: #ddd;
background: -webkit-radial-gradient(circle,#aaa,#eee 60%) center fixed;
background: -moz-radial-gradient(circle,#aaa,#eee 60%) center fixed;
background: -ms-radial-gradient(circle,#aaa,#eee 60%) center fixed;
background: -o-radial-gradient(circle,#aaa,#eee 60%) center fixed;
border-top: 8px solid rgba(51,51,51,.8);
}
#wrapper {
border-top: 1px solid #999;
margin-top: 160px;
padding: 15px;
background: #eee;
background: -webkit-linear-gradient(#fff,#ccc);
background: -moz-linear-gradient(#fff,#ccc);
background: -ms-linear-gradient(#fff,#ccc);
background: -o-linear-gradient(#fff,#ccc);
box-shadow: 0 1px 8px rgba(0,0,0,0.3);
}
#inner {
position:relative;
max-width: 300px;
margin: 0 auto;
}
#button {
margin: 0 auto;
text-align: center;
width:300px;
border:none;
color: white;
text-shadow: 0 -1px 0 rgba(0,0,0,.8);
height: 70px;
line-height: 70px;
background: #555;
background: -webkit-linear-gradient(#5F5F5F,#565656 50%,#4C4C4C 51%,#373737);
background: -moz-linear-gradient(#5F5F5F,#565656 50%,#4C4C4C 51%,#373737);
background: -ms-linear-gradient(#5F5F5F,#565656 50%,#4C4C4C 51%,#373737);
background: -o-linear-gradient(#5F5F5F,#565656 50%,#4C4C4C 51%,#373737);
box-shadow: inset 0 1px 3px rgba(0,0,0,0.9);
}
#button:hover {
cursor: pointer;
background: #666;
background: -webkit-linear-gradient(#707070,#666666 50%,#5B5B5B 51%,#474747);
background: -moz-linear-gradient(#707070,#666666 50%,#5B5B5B 51%,#474747);
background: -ms-linear-gradient(#707070,#666666 50%,#5B5B5B 51%,#474747);
background: -o-linear-gradient(#707070,#666666 50%,#5B5B5B 51%,#474747);
}
#button:active {
box-shadow: inset 0 1px 12px rgba(0,0,0,0.9);
background: #444;
}
#label {
text-align: left;
text-shadow: 0 1px 1px #fff;
margin: 16px auto 0;
display:block;
}
#padname{
max-width:280px;
}
#go2Name {
height: 38px;
background: #fff;
border: 1px solid #bbb;
border-radius: 3px;
position: relative;
}
button, input {
font-weight: bold;
font-size: 15px;
}
input[type="text"] {
border-radius: 3px;
box-sizing: border-box;
-moz-box-sizing: border-box;
line-height:36px; /* IE8 hack */
padding: 0px 45px 0 10px;
*padding: 0; /* IE7 hack */
width: 100%;
height: 100%;
outline: none;
border: none;
position: absolute;
}
button[type="submit"] {
position: absolute;
left:253px;
}
nav, .mission-statement, .pad-datalist {
display: none;
}
.settings-button {
color: inherit;
border: none;
padding: 0;
font: inherit;
cursor: pointer;
outline: inherit;
}
#settings-dialog {
border: none;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0,0,0,0.2);
padding: 20px;
}
@media (min-device-width: 320px) and (min-device-width: 800px) {
body {
background: #bbb;
background: -webkit-linear-gradient(#aaa,#eee 60%) center fixed;
background: -moz-linear-gradient(#aaa,#eee 60%) center fixed;
background: -ms-linear-gradient(#aaa,#eee 60%) center fixed;
}
#settings-dialog {
max-width: 50%;
}
#wrapper {
margin-top: 0;
}
#inner {
width: 95%;
}
#label {
text-align: center;
}
}
</style>
<% e.begin_block("indexCustomStyles"); %>
<link href="static/skins/<%=encodeURI(settings.skinName)%>/index.css?v=<%=settings.randomVersionString%>" rel="stylesheet">
<% e.end_block(); %>
<nav>
<div class="logo-box">
<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-file-text w-5 h-5 text-white"><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"></path><path d="M14 2v4a2 2 0 0 0 2 2h4"></path><path d="M10 9H8"></path><path d="M16 13H8"></path><path d="M16 17H8"></path></svg>
</div>
<h1>Etherpad</h1>
<div style="flex-grow: 1"></div>
<button class="settings-button" aria-label="Settings">
<svg width="30px" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="settings-icon">
<path stroke-linecap="round" stroke-linejoin="round" d="M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.325.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 0 1 1.37.49l1.296 2.247a1.125 1.125 0 0 1-.26 1.431l-1.003.827c-.293.241-.438.613-.43.992a7.723 7.723 0 0 1 0 .255c-.008.378.137.75.43.991l1.004.827c.424.35.534.955.26 1.43l-1.298 2.247a1.125 1.125 0 0 1-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.47 6.47 0 0 1-.22.128c-.331.183-.581.495-.644.869l-.213 1.281c-.09.543-.56.94-1.11.94h-2.594c-.55 0-1.019-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 0 1-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 0 1-1.369-.49l-1.297-2.247a1.125 1.125 0 0 1 .26-1.431l1.004-.827c.292-.24.437-.613.43-.991a6.932 6.932 0 0 1 0-.255c.007-.38-.138-.751-.43-.992l-1.004-.827a1.125 1.125 0 0 1-.26-1.43l1.297-2.247a1.125 1.125 0 0 1 1.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.086.22-.128.332-.183.582-.495.644-.869l.214-1.28Z" />
<path stroke-linecap="round" stroke-linejoin="round" d="M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z" />
</svg>
</button>
</nav>
<!-- Settings menu-->
<dialog id="settings-dialog">
<div id="button-bar">
<button data-l10n-id="index.transferSessionTitle" class="active-btn"></button>
<button data-l10n-id="index.receiveSessionTitle"></button>
</div>
<div>
<!-- Initial link button -->
<h3 data-l10n-id="index.transferSession"></h3>
<div data-l10n-id="index.transferSessionDescription"></div>
<button type="button" class="btn-secondary" style="margin-top: 20px" data-l10n-id="index.transferSessionNow"></button>
<!-- Copy link button -->
<div style="display: none" id="copy-link-section">
<h3 data-l10n-id="index.copyLink"></h3>
<div data-l10n-id="index.copyLinkDescription"></div>
<button type="button" class="btn-secondary" style="margin-top: 20px" data-l10n-id="index.copyLinkButton"></button>
</div>
</div>
<div id="transfer-to-system-section" style="display: none; margin-top: 30px;">
<h3 data-l10n-id="index.transferToSystem"></h3>
<div data-l10n-id="index.transferToSystemDescription"></div>
<p data-l10n-id="index.receiveSessionDescription"></p>
<div>
<label for="codeInput" data-l10n-id="index.code"></label>
<input type="text" id="codeInput"/>
</div>
<button data-l10n-id="index.transferSessionTitle" id="transferSessionButton" disabled></button>
</div>
<div>
</div>
</dialog>
<div class="body">
<div class="mission-statement">
<h2 data-l10n-id="index.createAndShareDocuments"></h2>
<p data-l10n-id="index.createAndShareDocumentsDescription"></p>
</div>
<div id="wrapper">
<% e.begin_block("indexWrapper"); %>
<div id="inner">
<% if (!settings.requireSession) { %>
<% if (settings.editOnly) { %>
<button data-l10n-id="index.openPad"></button>
<% } else {%>
<button id="button" data-l10n-id="index.generateNewPad"></button>
<% } %>
<form action="#" id="go2Name">
<label id="label" for="padname" data-l10n-id="index.labelPad"></label>
<input type="text" id="padname" maxlength="50" autofocus placeholder="Enter pad name...">
<button type="submit" data-l10n-id="index.createOpenPad"></button>
</form>
<% } %>
</div>
<% e.end_block(); %>
</div>
<div style="display: none" data-l10n-id="index.placeholderPadEnter"></div>
<% if (settings.showRecentPads) { %>
<div class="pad-datalist">
<h2 data-l10n-id="index.recentPads"></h2>
<ul id="recent-pads">
</ul>
</div>
<% } %>
</div>
<script src="<%=entrypoint%>"></script>
<% e.begin_block("indexCustomScripts"); %>
<script src="static/skins/<%=encodeURI(settings.skinName)%>/index.js?v=<%=settings.randomVersionString%>"></script>
<% e.end_block(); %>
<div style="display:none"><a href="/javascript" data-jslicense="1">JavaScript license information</a></div>
</html>