@lexho111/plainblog 0.6.4 → 0.6.6
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.
- package/Article.js +1 -1
- package/Blog.js +249 -138
- package/Formatter.js +5 -7
- package/model/DataModel.js +6 -2
- package/model/datastructures/BinarySearchTree.js +27 -0
- package/model/datastructures/BinarySearchTreeHashMap.js +14 -5
- package/package.json +1 -1
- package/public/favicon.ico +0 -0
- package/public/index.html +17 -0
- package/public/main-LAI5FAZI.js +7 -0
- package/public/main-SKL6R4NB.js +7 -0
- package/public/scripts.min.js +2 -2
- package/public/styles-I55BTQOK.css +1 -0
- package/public/styles.min.css +2 -2
- package/src/fetchData.js +53 -29
- package/src/styles.css +152 -42
- package/.vscode/settings.json +0 -2
- package/blog_test_empty.db +0 -0
- package/blog_test_load.db +0 -0
- package/coverage/clover.xml +0 -1051
- package/coverage/coverage-final.json +0 -20
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +0 -161
- package/coverage/lcov-report/package/Article.js.html +0 -406
- package/coverage/lcov-report/package/Blog.js.html +0 -2674
- package/coverage/lcov-report/package/Formatter.js.html +0 -379
- package/coverage/lcov-report/package/build-scripts.js.html +0 -247
- package/coverage/lcov-report/package/build-styles.js.html +0 -367
- package/coverage/lcov-report/package/index.html +0 -191
- package/coverage/lcov-report/package/model/APIModel.js.html +0 -190
- package/coverage/lcov-report/package/model/ArrayList.js.html +0 -382
- package/coverage/lcov-report/package/model/ArrayListHashMap.js.html +0 -379
- package/coverage/lcov-report/package/model/BinarySearchTree.js.html +0 -856
- package/coverage/lcov-report/package/model/BinarySearchTreeHashMap.js.html +0 -346
- package/coverage/lcov-report/package/model/DataModel.js.html +0 -325
- package/coverage/lcov-report/package/model/DatabaseModel.js.html +0 -235
- package/coverage/lcov-report/package/model/FileAdapter.js.html +0 -397
- package/coverage/lcov-report/package/model/FileList.js.html +0 -244
- package/coverage/lcov-report/package/model/FileModel.js.html +0 -361
- package/coverage/lcov-report/package/model/SequelizeAdapter.js.html +0 -538
- package/coverage/lcov-report/package/model/SqliteAdapter.js.html +0 -247
- package/coverage/lcov-report/package/model/datastructures/ArrayList.js.html +0 -439
- package/coverage/lcov-report/package/model/datastructures/ArrayListHashMap.js.html +0 -196
- package/coverage/lcov-report/package/model/datastructures/BinarySearchTree.js.html +0 -916
- package/coverage/lcov-report/package/model/datastructures/BinarySearchTreeHashMap.js.html +0 -355
- package/coverage/lcov-report/package/model/datastructures/FileList.js.html +0 -244
- package/coverage/lcov-report/package/model/datastructures/index.html +0 -176
- package/coverage/lcov-report/package/model/index.html +0 -206
- package/coverage/lcov-report/package/utilities.js.html +0 -511
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -210
- package/coverage/lcov.info +0 -2078
- package/eslint.config.js +0 -27
- package/plainblog - Verkn/303/274pfung.lnk +0 -0
package/public/scripts.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
let isLoading=!1;function debounce(t,n=300){let a;return(...e)=>{clearTimeout(a),a=setTimeout(()=>{t.apply(this,e)},n)}}async function handleScroll(){isLoading||document.documentElement.scrollHeight-window.innerHeight-window.scrollY<100&&await loadMore()}async function loadMore(){console.log("load more");var e=document.getElementById("articles"),t=Array.from(e.querySelectorAll("article"));let n=NaN;for(let e=t.length-1;0<=e;e--){var a=t[e].getAttribute("data-date");if(a){a=parseInt(a,10);if(!isNaN(a)){n=a;break}}}if(console.log("lastTimestamp "+n),isNaN(n))window.removeEventListener("scroll",handleScroll);else{var e=n,
|
|
2
|
-
/* source-hash:
|
|
1
|
+
let isLoading=!1;function debounce(t,n=300){let a;return(...e)=>{clearTimeout(a),a=setTimeout(()=>{t.apply(this,e)},n)}}async function handleScroll(){isLoading||document.documentElement.scrollHeight-window.innerHeight-window.scrollY<100&&await loadMore()}async function loadMore(){console.log("load more");var e=document.getElementById("articles"),t=Array.from(e.querySelectorAll("article"));let n=NaN;for(let e=t.length-1;0<=e;e--){var a=t[e].getAttribute("data-date");if(a){a=parseInt(a,10);if(!isNaN(a)){n=a;break}}}if(console.log("lastTimestamp "+n),isNaN(n))window.removeEventListener("scroll",handleScroll);else{var e=n,l=(isLoading=!0,`/api/articles?enddate=${e}&limit=51`);console.log("load more "+l),console.log("endDate: "+new Date(e));try{var o=await fetch(l);if(o.ok){var i=(await o.json()).articles||[];if(0<i.length){let e=0;var r,d=document.createDocumentFragment();for(r of i)fillWithContent(r.title,r.content,r.createdAt,r.id,d)&&e++;document.getElementById("articles").appendChild(d),e<50&&window.removeEventListener("scroll",handleScroll)}else window.removeEventListener("scroll",handleScroll)}}catch(e){console.error("Failed to load articles:",e)}isLoading=!1}}function getFormattedDate(e){return e.getFullYear()+`/${String(e.getMonth()+1).padStart(2,"0")}/${String(e.getDate()).padStart(2,"0")} ${String(e.getHours()).padStart(2,"0")}:`+String(e.getMinutes()).padStart(2,"0")}async function handleArticleAction(e,t,n,a,l){var o;"delete"===e?confirm("Delete this article?")&&((o=await fetch("/api/articles?id="+t,{method:"DELETE"})).ok?l.remove():alert("Error: "+o.statusText)):"edit"===e&&(l=prompt("New Title",n),o=prompt("New Content",a),l)&&o&&((e=await fetch("/api/articles?id="+t,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:l,content:o})})).ok?window.location.reload():alert("Error: "+e.statusText))}function fillWithContent(a,l,e,o,t){if(o&&document.querySelector(`#articles > article[data-id='${o}']`))return console.log("article found. not adding it."),console.log(o+` ${a} `+e),!1;let i=document.createElement("article");var e=new Date(e),n=(null!=o&&i.setAttribute("data-id",o),i.setAttribute("data-date",e.getTime()),document.createElement("h2")),r=document.createElement("span"),d=document.createElement("p");if(null!==document.querySelector('a[href="/logout"]')){let n=document.createElement("div");var c=document.createElement("div"),s=document.createElement("div"),m=document.createElement("div");n.setAttribute("class","buttons"),c.setAttribute("class","btn edit"),s.setAttribute("class","btn delete"),m.setAttribute("class","btn light"),c.textContent="edit",s.textContent="delete",m.textContent="something else",n.appendChild(c),n.appendChild(s),n.appendChild(m),[{label:"edit",type:"edit",class:"btn edit"},{label:"delete",type:"delete",class:"btn delete"},{label:"something else",type:"other",class:"btn light"}].forEach(e=>{var t=document.createElement("div");t.className=e.class,t.textContent=e.label,t.addEventListener("click",()=>handleArticleAction(e.type,o,a,l,i)),n.appendChild(t)}),i.appendChild(n)}return n.textContent=a,r.textContent=getFormattedDate(e),d.textContent=l,i.appendChild(n),i.appendChild(r),i.appendChild(d),(t||document.getElementById("articles")).appendChild(i),!0}document.addEventListener("DOMContentLoaded",()=>{window.addEventListener("scroll",handleScroll);var e=document.getElementById("search");e&&e.addEventListener("input",debounce(async e=>{e=e.target.value;if(0<e.length){var e=await(await fetch("/api/articles?q="+encodeURIComponent(e))).json(),n=document.getElementById("articles");n.innerHTML="";let t=document.createDocumentFragment();(e.articles?e.articles.slice(0,50):[]).forEach(e=>fillWithContent(e.title,e.content,e.createdAt,e.id,t)),n.appendChild(t)}else window.location.reload()},300))});
|
|
2
|
+
/* source-hash: 1fffde3e00f56a4fe51e53474262fcf2482e14e10c8acd05b62e87eee32ce5a3 */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--blue: hsl(224, 100%, 41%);--yellow: hsl(53, 100%, 50%);--orange: hsl(44, 100%, 50%);--poisongreen: hsl(88, 100%, 50%);--green: hsl(85, 100%, 40%);--pink: hsl(303, 100%, 40%);--basecolor: var(--orange);--primary: var(--basecolor);--primary-inverted: rgb(from var(--primary) calc(1 - r) calc(1 - g) calc(1 - b) );--header_bg: var(--basecolor);--header_darker: hsl(from var(--primary) h s l / .4);--header_darker_high-contrast: hsl(from var(--primary) h s l);--gray: rgba(255, 255, 255, .3);--darkgray: rgba(54, 54, 54, .5);--white: #fefefe;--white_darker: #eeeeee;--red: hsla(0, 100%, 38%, .7);--black: black;--contrast_text: rgb( from var(--header_darker) clamp(0, (r * .299 + g * .587 + b * .114 - 128) * -1000, 255) clamp(0, (r * .299 + g * .587 + b * .114 - 128) * -1000, 255) clamp(0, (r * .299 + g * .587 + b * .114 - 128) * -1000, 255) );--text-primary: var(--black);--text-secondary: var(--white)}html,body{margin:0}body{color:var(--text-primary);background:var(--white_darker);font-family:Arial,sans-serif}header{background-color:var(--header_darker)}header h1{color:var(--header_darker_high-contrast);text-shadow:1px 1px black,-1px -1px black,1px -1px black,-1px 1px black}.article-card{background-color:var(--white)}label{display:block;margin-bottom:.5rem}input,textarea{width:100%;padding:.5rem;box-sizing:border-box}button{padding:.5rem 1rem;cursor:pointer}.btn{background-color:var(--primary);border:none;color:var(--text-secondary);font-size:1rem;font-weight:500;text-decoration:none;cursor:pointer;padding:.5rem 1rem;border-radius:4px;width:fit-content;border:1px solid var(--white);box-shadow:3px 2px 2px var(--darkgray)}.btn:hover{color:#000;background-color:#fff;border:2px solid var(--black)}.btn-secondary{background-color:var(--darkgray)}.btn-text{background-color:var(--header_darker)}.btn-text:hover{background-color:var(--white);color:#0034c2b3;border:2px solid black;font-weight:700}.btn-danger{background-color:var(--red)}.btn-danger:hover{background-color:var(--white);color:#c20000b3;border:2px solid var(--black);font-weight:700}.btn-electric{padding:15px 30px;cursor:pointer;overflow:hidden;display:inline-block;font-weight:900;font-size:1.5rem;color:#000;animation:wackel-color 2.5s infinite}@keyframes wackel-color{0%,19.9%,22.1%,24.9%,60.1%,62.9%,to{color:#000;filter:drop-shadow(0 0 0px transparent)}20%,22%,25%,60%,63%{color:#fff;filter:drop-shadow(0 0 2px rgba(0,0,0,.5))}}@keyframes wackel-jitter{0%{transform:translate(0)}25%{transform:translate(-1.5px,.5px)}50%{transform:translate(1.5px,-.5px)}75%{transform:translate(-.5px,-1.5px)}to{transform:translate(0)}}.inverted{background-color:var(--white);color:var(--black);font-weight:700}.inverted:hover{background-color:hsl(from var(--primary) hsl / .2);color:var(--black);font-weight:700;border:2px solid var(--white)}.main-nav{background-color:var(--header_bg)}.nav-brand .brand-link{color:var(--mainfont)}.brand-link:hover{color:var(--primary-inverted)}.form-group{margin-bottom:1rem}.error-message{color:red;font-size:.875rem;margin-top:.25rem}.error{color:red}@media print{.no-print,nav,footer,button{display:none!important}body{font-size:12pt;color:#000;background:#fff}header h1{color:#000}}.glow{text-shadow:0 0 .1em,0 0 .3em}
|
package/public/styles.min.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
body{font-family:Arial,sans-serif}h1{color:#333}body{font-family:Arial
|
|
2
|
-
/* source-hash:
|
|
1
|
+
body{font-family:Arial,sans-serif}h1{color:#333}:root{--black:#111;--clearwhite:#fefefe;--white:#eee;--darkgray:rgba(54,54,54,.5);--text-primary:var(--black);--text-secondary:var(--clearwhite)}body,html{margin:0}html{font-size:clamp(1rem,1.5vw + .5rem,1.25rem)}body{background:var(--white_darker);color:var(--text-primary);font-family:Arial}nav{margin-top:10px}#header h1,nav{margin-left:25px}form{font-size:clamp(1rem,1.5vw + .5rem,1.25rem)}button,form input,form textarea{font-size:90%}button{width:-moz-fit-content;width:fit-content;field-sizing:content;padding:10px}.form_element{display:block;margin-bottom:10px;padding:4px}.wide{width:100%}.password{width:250px}.new_title{padding:10px}.new_content{height:500px;padding:10px;resize:none}#search{float:right;font-size:100%;margin:5px}.articles{border:0 solid #000;display:grid;gap:.25rem;grid-template-columns:1fr;max-width:800px}.articles article{border:2px solid #a9a9a9;border-radius:4px;margin-bottom:10px;min-width:0;overflow-wrap:break-word;padding:.4rem}.articles article h2{color:#353535;margin-bottom:5px}.articles article .datetime{color:#757575;margin:0}.articles article p{margin-bottom:0;margin-top:10px}article a,article a:visited,h1{color:#696969}h2{border:0 solid #000;margin-top:0}nav a{color:#3b40c1;font-size:20px;text-decoration:underline}nav a:visited{color:#3b40c1;text-decoration-color:#3b40c1}.loginform{margin-left:25px}#wrapper{margin-left:5px;max-width:1200px;padding:0 20px}#wrapper,.buttons{box-sizing:border-box;width:100%}.buttons{align-items:center;border:0 solid #000;display:flex;gap:5px;height:25px;list-style:none;margin:0 0 16px;padding:15px 15px 15px 0}.box{margin-left:25px}.btn{border:none;border:1px solid var(--text-primary);border-radius:0;box-shadow:3px 2px 2px var(--darkgray);color:var(--text-primary);cursor:pointer;font-size:1rem;font-weight:500;padding:.25rem .5rem;text-decoration:none;width:-moz-fit-content;width:fit-content}.btn:hover{background-color:#fff;border:2px solid var(--black);color:#000}.light{background:var(--clearwhite);color:var(--black)}.light:hover{background:var(--black);color:var(--clearwhite)}.hide-image{display:none}@media screen and (min-width:1000px){#wrapper{font-size:.75rem;margin:0 auto;max-width:1400px;padding:0 40px;width:90%}}.edit{background-color:blue}.delete,.edit{color:var(--clearwhite)}.delete{background-color:red}
|
|
2
|
+
/* source-hash: 4fcd9901ab776e735cba281aaa4865ed96f897dd0aa4eaef774dee803966b720 */
|
package/src/fetchData.js
CHANGED
|
@@ -137,6 +137,37 @@ function getFormattedDate(date) {
|
|
|
137
137
|
const minutes = String(date.getMinutes()).padStart(2, "0");
|
|
138
138
|
return `${year}/${month}/${day} ${hours}:${minutes}`;
|
|
139
139
|
}
|
|
140
|
+
async function handleArticleAction(
|
|
141
|
+
type,
|
|
142
|
+
id,
|
|
143
|
+
currentTitle,
|
|
144
|
+
currentContent,
|
|
145
|
+
element,
|
|
146
|
+
) {
|
|
147
|
+
if (type === "delete") {
|
|
148
|
+
if (!confirm("Delete this article?")) return;
|
|
149
|
+
|
|
150
|
+
const res = await fetch(`/api/articles?id=${id}`, { method: "DELETE" });
|
|
151
|
+
if (res.ok) {
|
|
152
|
+
element.remove();
|
|
153
|
+
} else {
|
|
154
|
+
alert(`Error: ${res.statusText}`);
|
|
155
|
+
}
|
|
156
|
+
} else if (type === "edit") {
|
|
157
|
+
const title = prompt("New Title", currentTitle);
|
|
158
|
+
const content = prompt("New Content", currentContent);
|
|
159
|
+
if (!title || !content) return;
|
|
160
|
+
|
|
161
|
+
const res = await fetch(`/api/articles?id=${id}`, {
|
|
162
|
+
method: "PUT",
|
|
163
|
+
headers: { "Content-Type": "application/json" },
|
|
164
|
+
body: JSON.stringify({ title, content }),
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
if (res.ok) window.location.reload();
|
|
168
|
+
else alert(`Error: ${res.statusText}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
140
171
|
function fillWithContent(title, content, date, id, targetContainer) {
|
|
141
172
|
if (id) {
|
|
142
173
|
// Check if an article with this ID already exists in the container.
|
|
@@ -164,42 +195,35 @@ function fillWithContent(title, content, date, id, targetContainer) {
|
|
|
164
195
|
const deleteButton = document.createElement("div");
|
|
165
196
|
const somethingButton = document.createElement("div");
|
|
166
197
|
buttons.setAttribute("class", "buttons");
|
|
167
|
-
editButton.setAttribute("class", "
|
|
168
|
-
deleteButton.setAttribute("class", "
|
|
169
|
-
somethingButton.setAttribute("class", "
|
|
198
|
+
editButton.setAttribute("class", "btn edit");
|
|
199
|
+
deleteButton.setAttribute("class", "btn delete");
|
|
200
|
+
somethingButton.setAttribute("class", "btn light");
|
|
170
201
|
editButton.textContent = "edit";
|
|
171
202
|
deleteButton.textContent = "delete";
|
|
172
|
-
somethingButton.textContent = "something";
|
|
203
|
+
somethingButton.textContent = "something else";
|
|
173
204
|
buttons.appendChild(editButton);
|
|
174
205
|
buttons.appendChild(deleteButton);
|
|
175
206
|
buttons.appendChild(somethingButton);
|
|
176
207
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
208
|
+
const actions = [
|
|
209
|
+
{ label: "edit", type: "edit", class: "btn edit" },
|
|
210
|
+
{ label: "delete", type: "delete", class: "btn delete" },
|
|
211
|
+
{ label: "something else", type: "other", class: "btn light" },
|
|
212
|
+
];
|
|
181
213
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
method: "PUT",
|
|
196
|
-
body: JSON.stringify({ title: newTitle, content: newContent }),
|
|
197
|
-
}).then((res) => {
|
|
198
|
-
if (res.ok) window.location.reload();
|
|
199
|
-
else alert("Error: " + res.statusText);
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
}
|
|
214
|
+
actions.forEach((action) => {
|
|
215
|
+
const btn = document.createElement("div");
|
|
216
|
+
btn.className = action.class;
|
|
217
|
+
btn.textContent = action.label;
|
|
218
|
+
|
|
219
|
+
// Attach the single summarized handler
|
|
220
|
+
btn.addEventListener("click", () =>
|
|
221
|
+
handleArticleAction(action.type, id, title, content, article),
|
|
222
|
+
);
|
|
223
|
+
|
|
224
|
+
buttons.appendChild(btn);
|
|
225
|
+
});
|
|
226
|
+
article.appendChild(buttons);
|
|
203
227
|
}
|
|
204
228
|
|
|
205
229
|
heading.textContent = title;
|
package/src/styles.css
CHANGED
|
@@ -1,41 +1,108 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--black: #111;
|
|
3
|
+
--clearwhite: #fefefe;
|
|
4
|
+
--white: #eeeeee;
|
|
5
|
+
--darkgray: rgba(54, 54, 54, 0.5);
|
|
6
|
+
--text-primary: var(--black);
|
|
7
|
+
--text-secondary: var(--clearwhite);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
html,
|
|
1
11
|
body {
|
|
2
12
|
margin: 0;
|
|
13
|
+
}
|
|
14
|
+
html {
|
|
15
|
+
font-size: clamp(1rem, 1.5vw + 0.5rem, 1.25rem);
|
|
16
|
+
}
|
|
17
|
+
body {
|
|
18
|
+
color: var(--text-primary);
|
|
19
|
+
background: var(--white_darker);
|
|
3
20
|
font-family: Arial;
|
|
4
21
|
}
|
|
5
22
|
nav {
|
|
6
23
|
margin-top: 10px;
|
|
7
24
|
}
|
|
8
25
|
nav,
|
|
9
|
-
h1 {
|
|
10
|
-
margin-left:
|
|
26
|
+
#header h1 {
|
|
27
|
+
margin-left: 25px;
|
|
11
28
|
}
|
|
12
|
-
|
|
13
|
-
|
|
29
|
+
|
|
30
|
+
form {
|
|
31
|
+
font-size: clamp(1rem, 1.5vw + 0.5rem, 1.25rem);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
form input,
|
|
35
|
+
form textarea,
|
|
36
|
+
button {
|
|
37
|
+
font-size: 90%;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
button {
|
|
41
|
+
width: fit-content;
|
|
42
|
+
field-sizing: content;
|
|
43
|
+
padding: 10px;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.form_element {
|
|
47
|
+
display: block;
|
|
48
|
+
margin-bottom: 10px;
|
|
49
|
+
padding: 4px;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.wide {
|
|
53
|
+
width: 100%;
|
|
14
54
|
}
|
|
15
|
-
|
|
55
|
+
|
|
56
|
+
.password {
|
|
57
|
+
width: 250px;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.new_title {
|
|
61
|
+
padding: 10px;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.new_content {
|
|
65
|
+
height: 500px;
|
|
66
|
+
resize: none;
|
|
67
|
+
padding: 10px;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
#search {
|
|
71
|
+
float: right;
|
|
72
|
+
margin: 5px;
|
|
73
|
+
font-size: 100%;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
hr {
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.articles {
|
|
16
80
|
border: 0 solid #000;
|
|
17
81
|
display: grid;
|
|
18
82
|
gap: 0.25rem;
|
|
19
83
|
grid-template-columns: 1fr;
|
|
84
|
+
max-width: 800px;
|
|
20
85
|
}
|
|
21
|
-
.
|
|
86
|
+
.articles article {
|
|
22
87
|
border: 0 solid #ccc;
|
|
23
88
|
border-radius: 4px;
|
|
24
89
|
min-width: 0;
|
|
25
90
|
overflow-wrap: break-word;
|
|
26
|
-
padding: 0.
|
|
91
|
+
padding: 0.4rem;
|
|
92
|
+
margin-bottom: 10px;
|
|
93
|
+
border: 2px solid darkgray;
|
|
27
94
|
}
|
|
28
|
-
.
|
|
95
|
+
.articles article h2 {
|
|
29
96
|
color: rgb(53, 53, 53);
|
|
30
97
|
margin-bottom: 5px;
|
|
31
98
|
}
|
|
32
99
|
|
|
33
|
-
.
|
|
100
|
+
.articles article .datetime {
|
|
34
101
|
margin: 0;
|
|
35
102
|
color: rgb(117, 117, 117);
|
|
36
103
|
}
|
|
37
104
|
|
|
38
|
-
.
|
|
105
|
+
.articles article p {
|
|
39
106
|
margin-top: 10px;
|
|
40
107
|
margin-bottom: 0;
|
|
41
108
|
}
|
|
@@ -51,63 +118,106 @@ article a:visited {
|
|
|
51
118
|
h1 {
|
|
52
119
|
color: #696969;
|
|
53
120
|
}
|
|
121
|
+
|
|
122
|
+
h2 {
|
|
123
|
+
margin-top: 0;
|
|
124
|
+
border: 0px solid black;
|
|
125
|
+
}
|
|
126
|
+
|
|
54
127
|
nav a {
|
|
55
128
|
color: #3b40c1;
|
|
56
129
|
font-size: 20px;
|
|
57
130
|
text-decoration: underline;
|
|
58
131
|
}
|
|
132
|
+
|
|
59
133
|
nav a:visited {
|
|
60
134
|
color: #3b40c1;
|
|
61
135
|
text-decoration-color: #3b40c1;
|
|
62
136
|
}
|
|
63
137
|
|
|
138
|
+
.loginform {
|
|
139
|
+
margin-left: 25px;
|
|
140
|
+
}
|
|
141
|
+
|
|
64
142
|
#wrapper {
|
|
65
|
-
max-width:
|
|
143
|
+
max-width: 1200px; /* Limits width on big PC screens */
|
|
144
|
+
/*margin: 0 auto; /* Centers the layout on PC */
|
|
145
|
+
padding: 0 20px; /* Consistent spacing on edges */
|
|
66
146
|
width: 100%;
|
|
147
|
+
margin-left: 5px;
|
|
148
|
+
box-sizing: border-box;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.buttons {
|
|
152
|
+
box-sizing: border-box; /* This ensures 100% width includes the 15px padding */
|
|
153
|
+
display: flex;
|
|
154
|
+
align-items: center;
|
|
155
|
+
gap: 5px;
|
|
156
|
+
list-style: none;
|
|
157
|
+
margin: 0;
|
|
158
|
+
margin-bottom: 16px;
|
|
159
|
+
padding: 15px;
|
|
160
|
+
padding-left: 0px;
|
|
161
|
+
border: 0px solid black;
|
|
162
|
+
width: 100%; /* Now 100% will respect the parent's boundaries */
|
|
163
|
+
height: 25px;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.box {
|
|
167
|
+
margin-left: 25px;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.btn {
|
|
171
|
+
border: none;
|
|
172
|
+
color: var(--text-primary);
|
|
173
|
+
font-size: 1rem;
|
|
174
|
+
font-weight: 500;
|
|
175
|
+
text-decoration: none;
|
|
176
|
+
cursor: pointer;
|
|
177
|
+
padding: 0.25rem 0.5rem;
|
|
178
|
+
border-radius: 0px;
|
|
179
|
+
width: fit-content;
|
|
180
|
+
border: 1px solid var(--text-primary);
|
|
181
|
+
box-shadow: 3px 2px 2px var(--darkgray);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.btn:hover {
|
|
185
|
+
color: black;
|
|
186
|
+
background-color: white;
|
|
187
|
+
border: 2px solid var(--black);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.light {
|
|
191
|
+
color: var(--black);
|
|
192
|
+
background: var(--clearwhite);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
.light:hover {
|
|
196
|
+
color: var(--clearwhite);
|
|
197
|
+
background: var(--black);
|
|
67
198
|
}
|
|
68
199
|
|
|
69
200
|
.hide-image {
|
|
70
201
|
display: none;
|
|
71
202
|
}
|
|
72
203
|
|
|
73
|
-
/*
|
|
74
|
-
@media screen and (
|
|
75
|
-
* {
|
|
76
|
-
font-size: 4vw;
|
|
77
|
-
}
|
|
204
|
+
/* 2. DESKTOP ADJUSTMENTS (Screens larger than 1000px) */
|
|
205
|
+
@media screen and (min-width: 1000px) {
|
|
78
206
|
#wrapper {
|
|
79
|
-
|
|
80
|
-
width:
|
|
81
|
-
padding: 0
|
|
82
|
-
|
|
207
|
+
width: 90%; /* Gives some breathing room on large monitors */
|
|
208
|
+
max-width: 1400px; /* Prevents it from getting absurdly wide */
|
|
209
|
+
padding: 0 40px;
|
|
210
|
+
margin: 0 auto;
|
|
211
|
+
/*zoom: 0.75; /* Reduces the entire layout to 80% of its current size */
|
|
212
|
+
font-size: 0.75rem; /* Instead of zoom, use a smaller base font size if you want things "smaller" */
|
|
83
213
|
}
|
|
84
214
|
}
|
|
85
215
|
|
|
86
|
-
h2 {
|
|
87
|
-
margin-top: 0;
|
|
88
|
-
border: 0px solid black;
|
|
89
|
-
}
|
|
90
|
-
.buttons {
|
|
91
|
-
width: 100%;
|
|
92
|
-
height: 25px;
|
|
93
|
-
border: 0px solid black;
|
|
94
|
-
margin-bottom: 0px;
|
|
95
|
-
}
|
|
96
|
-
.button {
|
|
97
|
-
border: 1px solid black;
|
|
98
|
-
width: 100px;
|
|
99
|
-
height: 19px;
|
|
100
|
-
float: left;
|
|
101
|
-
padding: 2px;
|
|
102
|
-
cursor: pointer;
|
|
103
|
-
user-select: none; /* Prevents text selection on double-click */
|
|
104
|
-
}
|
|
105
|
-
.button:focus {
|
|
106
|
-
outline: 2px solid orange; /* Vital for keyboard accessibility */
|
|
107
|
-
}
|
|
108
216
|
.edit {
|
|
217
|
+
color: var(--clearwhite);
|
|
109
218
|
background-color: blue;
|
|
110
219
|
}
|
|
111
220
|
.delete {
|
|
221
|
+
color: var(--clearwhite);
|
|
112
222
|
background-color: red;
|
|
113
223
|
}
|
package/.vscode/settings.json
DELETED
package/blog_test_empty.db
DELETED
|
Binary file
|
package/blog_test_load.db
DELETED
|
Binary file
|