replace todo with embedder; add fullscreen support
This commit is contained in:
parent
2043937909
commit
44da6f3720
7 changed files with 130 additions and 42 deletions
|
@ -69,7 +69,7 @@ function onError(error: any) {
|
|||
}
|
||||
|
||||
db.serialize(function() {
|
||||
// create the database schema for the todos app
|
||||
// create the database schema for the embedders app
|
||||
db.run("CREATE TABLE IF NOT EXISTS users ( \
|
||||
id INTEGER PRIMARY KEY, \
|
||||
username TEXT UNIQUE, \
|
||||
|
|
|
@ -114,3 +114,31 @@ label {
|
|||
line-height: 20px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.modal {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: rgba(0, 0, 0, 0.8);
|
||||
z-index: 9999;
|
||||
}
|
||||
|
||||
.modal img {
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
}
|
||||
|
||||
.modal video {
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
}
|
|
@ -1,9 +1,9 @@
|
|||
.todohome {
|
||||
.embedderhome {
|
||||
margin: 130px 0 40px 0;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.todohome h1 {
|
||||
.embedderhome h1 {
|
||||
position: absolute;
|
||||
top: -140px;
|
||||
width: 100%;
|
||||
|
@ -16,19 +16,19 @@
|
|||
text-rendering: optimizeLegibility;
|
||||
}
|
||||
|
||||
.todohome section {
|
||||
.embedderhome section {
|
||||
padding-top: 1px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.todohome h2 {
|
||||
.embedderhome h2 {
|
||||
padding-bottom: 48px;
|
||||
font-size: 28px;
|
||||
font-weight: 300;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.todohome .button {
|
||||
.embedderhome .button {
|
||||
padding: 13px 45px;
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
|
@ -37,6 +37,6 @@
|
|||
background: #d83f45;
|
||||
}
|
||||
|
||||
.todohome a.button {
|
||||
.embedderhome a.button {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
|
|
@ -41,7 +41,7 @@ body {
|
|||
display: none;
|
||||
}
|
||||
|
||||
.todoapp {
|
||||
.embedderapp {
|
||||
background: #121212;
|
||||
margin: 130px 0 40px 0;
|
||||
position: relative;
|
||||
|
@ -49,28 +49,28 @@ body {
|
|||
0 25px 50px 0 rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.todoapp input::-webkit-input-placeholder {
|
||||
.embedderapp input::-webkit-input-placeholder {
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
color: #f5f5f5;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.todoapp input::-moz-placeholder {
|
||||
.embedderapp input::-moz-placeholder {
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
color: #f5f5f5;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.todoapp input::input-placeholder {
|
||||
.embedderapp input::input-placeholder {
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
color: #f5f5f5;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.todoapp h1 {
|
||||
.embedderapp h1 {
|
||||
position: absolute;
|
||||
top: -140px;
|
||||
width: 100%;
|
||||
|
@ -83,7 +83,7 @@ body {
|
|||
text-rendering: optimizeLegibility;
|
||||
}
|
||||
|
||||
.new-todo,
|
||||
.new-embedder,
|
||||
.edit {
|
||||
position: relative;
|
||||
margin: 0;
|
||||
|
@ -98,7 +98,7 @@ body {
|
|||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.new-todo {
|
||||
.new-embedder {
|
||||
padding: 16px 16px 16px 60px;
|
||||
height: 65px;
|
||||
border: none;
|
||||
|
@ -147,38 +147,38 @@ body {
|
|||
color: #484848;
|
||||
}
|
||||
|
||||
.todo-list {
|
||||
.embedder-list {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.todo-list li {
|
||||
.embedder-list li {
|
||||
position: relative;
|
||||
font-size: 24px;
|
||||
}
|
||||
|
||||
.todo-list li:last-child {
|
||||
.embedder-list li:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.todo-list li.editing {
|
||||
.embedder-list li.editing {
|
||||
border-bottom: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.todo-list li.editing .edit {
|
||||
.embedder-list li.editing .edit {
|
||||
display: block;
|
||||
width: calc(100% - 43px);
|
||||
padding: 12px 16px;
|
||||
margin: 0 0 0 43px;
|
||||
}
|
||||
|
||||
.todo-list li.editing .view {
|
||||
.embedder-list li.editing .view {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.todo-list li .toggle {
|
||||
.embedder-list li .toggle {
|
||||
text-align: center;
|
||||
width: 40px;
|
||||
/* auto, since non-WebKit browsers doesn't support input styling */
|
||||
|
@ -192,11 +192,11 @@ body {
|
|||
appearance: none;
|
||||
}
|
||||
|
||||
.todo-list li .toggle {
|
||||
.embedder-list li .toggle {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.todo-list li .toggle + label {
|
||||
.embedder-list li .toggle + label {
|
||||
/*
|
||||
Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
|
||||
IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
|
||||
|
@ -206,11 +206,11 @@ body {
|
|||
background-position: center left;
|
||||
}
|
||||
|
||||
.todo-list li .toggle:checked + label {
|
||||
.embedder-list li .toggle:checked + label {
|
||||
background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%2359A193%22%20stroke-width%3D%223%22%2F%3E%3Cpath%20fill%3D%22%233EA390%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22%2F%3E%3C%2Fsvg%3E');
|
||||
}
|
||||
|
||||
.todo-list li label {
|
||||
.embedder-list li label {
|
||||
word-break: break-all;
|
||||
padding: 15px 15px 15px 60px;
|
||||
display: block;
|
||||
|
@ -220,16 +220,16 @@ body {
|
|||
color: #BB86FC;
|
||||
}
|
||||
|
||||
.todo-list li.completed label {
|
||||
.embedder-list li.completed label {
|
||||
color: #949494;
|
||||
text-decoration: line-through;
|
||||
}
|
||||
|
||||
.todo-list li .destroy {
|
||||
.embedder-list li .fullsize {
|
||||
display: none;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 10px;
|
||||
left: 0px;
|
||||
bottom: 0;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
|
@ -239,27 +239,57 @@ body {
|
|||
transition: color 0.2s ease-out;
|
||||
}
|
||||
|
||||
.todo-list li .destroy:hover,
|
||||
.todo-list li .destroy:focus {
|
||||
.embedder-list li .fullsize:hover,
|
||||
.embedder-list li .fullsize:focus {
|
||||
color: #C18585;
|
||||
}
|
||||
|
||||
.todo-list li .destroy:after {
|
||||
.embedder-list li .fullsize:after {
|
||||
content: '[]';
|
||||
display: block;
|
||||
height: 100%;
|
||||
line-height: 1.1;
|
||||
}
|
||||
|
||||
.embedder-list li:hover .fullsize {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.embedder-list li .destroy {
|
||||
display: none;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0px;
|
||||
bottom: 0;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
margin: auto 0;
|
||||
font-size: 30px;
|
||||
color: #949494;
|
||||
transition: color 0.2s ease-out;
|
||||
}
|
||||
|
||||
.embedder-list li .destroy:hover,
|
||||
.embedder-list li .destroy:focus {
|
||||
color: #C18585;
|
||||
}
|
||||
|
||||
.embedder-list li .destroy:after {
|
||||
content: '×';
|
||||
display: block;
|
||||
height: 100%;
|
||||
line-height: 1.1;
|
||||
}
|
||||
|
||||
.todo-list li:hover .destroy {
|
||||
.embedder-list li:hover .destroy {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.todo-list li .edit {
|
||||
.embedder-list li .edit {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.todo-list li.editing:last-child {
|
||||
.embedder-list li.editing:last-child {
|
||||
margin-bottom: -1px;
|
||||
}
|
||||
|
||||
|
@ -286,12 +316,12 @@ body {
|
|||
0 17px 2px -6px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
.todo-count {
|
||||
.embedder-count {
|
||||
float: left;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.todo-count strong {
|
||||
.embedder-count strong {
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
|
@ -366,11 +396,11 @@ html .clear-completed:active {
|
|||
*/
|
||||
@media screen and (-webkit-min-device-pixel-ratio:0) {
|
||||
.toggle-all,
|
||||
.todo-list li .toggle {
|
||||
.embedder-list li .toggle {
|
||||
background: none;
|
||||
}
|
||||
|
||||
.todo-list li .toggle {
|
||||
.embedder-list li .toggle {
|
||||
height: 40px;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -141,3 +141,32 @@ function uploadFile(file) {
|
|||
console.log(formData);
|
||||
xhr.send(formData);
|
||||
}
|
||||
|
||||
function openFullSize(imageUrl) {
|
||||
let modal = document.createElement("div");
|
||||
modal.classList.add("modal");
|
||||
let img = document.createElement("img");
|
||||
let video = document.createElement("video");
|
||||
img.src = imageUrl;
|
||||
video.src = imageUrl;
|
||||
video.controls = true;
|
||||
|
||||
if (extension(imageUrl) == ".jpg" || extension(imageUrl) == ".png" || extension(imageUrl) == ".gif" || extension(imageUrl) == ".jpeg" || extension(imageUrl) == ".webp") {
|
||||
modal.appendChild(img);
|
||||
}
|
||||
else if (extension(imageUrl) == ".mp4" || extension(imageUrl) == ".webm" || extension(imageUrl) == ".mov") {
|
||||
modal.appendChild(video);
|
||||
}
|
||||
|
||||
// Add the modal to the page
|
||||
document.body.appendChild(modal);
|
||||
|
||||
// Add an event listener to close the modal when the user clicks on it
|
||||
modal.addEventListener('click', function() {
|
||||
modal.remove();
|
||||
});
|
||||
}
|
||||
|
||||
function extension(string) {
|
||||
return string.slice((string.lastIndexOf(".") - 2 >>> 0) + 2);
|
||||
}
|
|
@ -13,7 +13,7 @@
|
|||
<link rel="manifest" href="/site.webmanifest">
|
||||
</head>
|
||||
<body>
|
||||
<section class="todohome">
|
||||
<section class="embedderhome">
|
||||
<header>
|
||||
<h1>Embedder</h1>
|
||||
</header>
|
||||
|
|
|
@ -18,7 +18,7 @@ return string.slice((string.lastIndexOf(".") - 2 >>> 0) + 2);
|
|||
%>
|
||||
</head>
|
||||
<body>
|
||||
<section class="todoapp">
|
||||
<section class="embedderapp">
|
||||
<nav class="nav">
|
||||
<ul>
|
||||
<li class="user"><%= user.name || user.username %></li>
|
||||
|
@ -55,7 +55,7 @@ return string.slice((string.lastIndexOf(".") - 2 >>> 0) + 2);
|
|||
</header>
|
||||
<% if (Count > 0) { %>
|
||||
<section class="main">
|
||||
<ul class="todo-list">
|
||||
<ul class="embedder-list">
|
||||
<% files.forEach(function(file) { %>
|
||||
<li>
|
||||
<form action="<%= file.url %>" method="post">
|
||||
|
@ -71,7 +71,7 @@ return string.slice((string.lastIndexOf(".") - 2 >>> 0) + 2);
|
|||
</div>
|
||||
<% } else if (extension(file.path) == ".gif") { %>
|
||||
<div class="video">
|
||||
<img class="image" src="/uploads/<%=file.path %>" width="100%" onclick="copyURI(event)" loading="lazy">
|
||||
<img class="image" src="/uploads/<%=file.path %>" width="100%" onclick="copyURI(event);" loading="lazy">
|
||||
<div class="overlay">
|
||||
<a href="/gifv/<%=file.path %>" onclick="copyA(event)">Copy as GIFv</a>
|
||||
</div>
|
||||
|
@ -85,6 +85,7 @@ return string.slice((string.lastIndexOf(".") - 2 >>> 0) + 2);
|
|||
<% } %>
|
||||
<label><%= file.path %></label>
|
||||
<button class="destroy" form="delete-<%= file.path %>"></button>
|
||||
<button type="button" class="fullsize" onclick="openFullSize('/uploads/<%=file.path%>')"></button>
|
||||
</div>
|
||||
</form>
|
||||
<form name="delete-<%= file.path %>" id="delete-<%= file.path %>" action="<%= file.url %>/delete" method="post">
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue