small refactor

This commit is contained in:
2026-04-21 06:00:03 +02:00
parent 4b62a9a64b
commit 26924a5c01
27 changed files with 2149 additions and 789 deletions
-16
View File
@@ -1,16 +0,0 @@
package view
templ base(title string) {
<!DOCTYPE html>
<html lang="zxx">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>{ title }</title>
<link rel="stylesheet" href="/style.css"/>
</head>
<body>
{ children... }
</body>
</html>
}
-61
View File
@@ -1,61 +0,0 @@
// Code generated by templ - DO NOT EDIT.
// templ: version: v0.3.943
package view
//lint:file-ignore SA4006 This context is only used if a nested component is present.
import "github.com/a-h/templ"
import templruntime "github.com/a-h/templ/runtime"
func base(title string) templ.Component {
return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
return templ_7745c5c3_CtxErr
}
templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
if !templ_7745c5c3_IsBuffer {
defer func() {
templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
if templ_7745c5c3_Err == nil {
templ_7745c5c3_Err = templ_7745c5c3_BufErr
}
}()
}
ctx = templ.InitializeContext(ctx)
templ_7745c5c3_Var1 := templ.GetChildren(ctx)
if templ_7745c5c3_Var1 == nil {
templ_7745c5c3_Var1 = templ.NopComponent
}
ctx = templ.ClearChildren(ctx)
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<!doctype html><html lang=\"zxx\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title>")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var2 string
templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(title)
if templ_7745c5c3_Err != nil {
return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/base.templ`, Line: 9, Col: 17}
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "</title><link rel=\"stylesheet\" href=\"/style.css\"></head><body>")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
templ_7745c5c3_Err = templ_7745c5c3_Var1.Render(ctx, templ_7745c5c3_Buffer)
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "</body></html>")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
return nil
})
}
var _ = templruntime.GeneratedTemplate
-34
View File
@@ -1,34 +0,0 @@
package view
templ BinPreviewPage(id, content string) {
@base("bin@" + id) {
@templ.Raw(content)
}
}
templ BinEditorPage() {
@base("bin") {
<form action="/" method="post">
<label for="content-editor" class="sr-only">Paste Content</label>
<textarea
id="content-editor"
name="content"
placeholder="bin something"
autofocus
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"
></textarea>
<button type="submit">Save</button>
</form>
<script>
document.addEventListener('keydown', (e) => {
if (e.ctrlKey && e.key === 's') {
e.preventDefault();
document.querySelector('form').submit();
}
});
</script>
}
}
-105
View File
@@ -1,105 +0,0 @@
// Code generated by templ - DO NOT EDIT.
// templ: version: v0.3.943
package view
//lint:file-ignore SA4006 This context is only used if a nested component is present.
import "github.com/a-h/templ"
import templruntime "github.com/a-h/templ/runtime"
func BinPreviewPage(id, content string) templ.Component {
return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
return templ_7745c5c3_CtxErr
}
templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
if !templ_7745c5c3_IsBuffer {
defer func() {
templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
if templ_7745c5c3_Err == nil {
templ_7745c5c3_Err = templ_7745c5c3_BufErr
}
}()
}
ctx = templ.InitializeContext(ctx)
templ_7745c5c3_Var1 := templ.GetChildren(ctx)
if templ_7745c5c3_Var1 == nil {
templ_7745c5c3_Var1 = templ.NopComponent
}
ctx = templ.ClearChildren(ctx)
templ_7745c5c3_Var2 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
if !templ_7745c5c3_IsBuffer {
defer func() {
templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
if templ_7745c5c3_Err == nil {
templ_7745c5c3_Err = templ_7745c5c3_BufErr
}
}()
}
ctx = templ.InitializeContext(ctx)
templ_7745c5c3_Err = templ.Raw(content).Render(ctx, templ_7745c5c3_Buffer)
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
return nil
})
templ_7745c5c3_Err = base("bin@"+id).Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer)
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
return nil
})
}
func BinEditorPage() templ.Component {
return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
return templ_7745c5c3_CtxErr
}
templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
if !templ_7745c5c3_IsBuffer {
defer func() {
templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
if templ_7745c5c3_Err == nil {
templ_7745c5c3_Err = templ_7745c5c3_BufErr
}
}()
}
ctx = templ.InitializeContext(ctx)
templ_7745c5c3_Var3 := templ.GetChildren(ctx)
if templ_7745c5c3_Var3 == nil {
templ_7745c5c3_Var3 = templ.NopComponent
}
ctx = templ.ClearChildren(ctx)
templ_7745c5c3_Var4 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
if !templ_7745c5c3_IsBuffer {
defer func() {
templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
if templ_7745c5c3_Err == nil {
templ_7745c5c3_Err = templ_7745c5c3_BufErr
}
}()
}
ctx = templ.InitializeContext(ctx)
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<form action=\"/\" method=\"post\"><label for=\"content-editor\" class=\"sr-only\">Paste Content</label> <textarea id=\"content-editor\" name=\"content\" placeholder=\"bin something\" autofocus autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\"></textarea> <button type=\"submit\">Save</button></form><script>\n document.addEventListener('keydown', (e) => {\n if (e.ctrlKey && e.key === 's') {\n e.preventDefault();\n document.querySelector('form').submit();\n }\n });\n </script>")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
return nil
})
templ_7745c5c3_Err = base("bin").Render(templ.WithChildren(ctx, templ_7745c5c3_Var4), templ_7745c5c3_Buffer)
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
return nil
})
}
var _ = templruntime.GeneratedTemplate
+10
View File
@@ -0,0 +1,10 @@
pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
Theme: GitHub Dark
Description: Dark theme as seen on github.com
Author: github.com
Maintainer: @Hirse
Updated: 2021-05-15
Outdated base version: https://github.com/primer/github-syntax-dark
Current colors taken from GitHub's CSS
*/.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#79c0ff}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-code,.hljs-comment,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}
+1244
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
!function(r,o){"use strict";var e,a="hljs-ln",l="hljs-ln-line",h="hljs-ln-code",s="hljs-ln-numbers",c="hljs-ln-n",m="data-line-number",i=/\r\n|\r|\n/g;function u(e){for(var n=e.toString(),t=e.anchorNode;"TD"!==t.nodeName;)t=t.parentNode;for(var r=e.focusNode;"TD"!==r.nodeName;)r=r.parentNode;var o=parseInt(t.dataset.lineNumber),i=parseInt(r.dataset.lineNumber);if(o==i)return n;var a,l=t.textContent,s=r.textContent;for(i<o&&(a=o,o=i,i=a,a=l,l=s,s=a);0!==n.indexOf(l);)l=l.slice(1);for(;-1===n.lastIndexOf(s);)s=s.slice(0,-1);for(var c=l,u=function(e){for(var n=e;"TABLE"!==n.nodeName;)n=n.parentNode;return n}(t),d=o+1;d<i;++d){var f=p('.{0}[{1}="{2}"]',[h,m,d]);c+="\n"+u.querySelector(f).textContent}return c+="\n"+s}function n(e){try{var n=o.querySelectorAll("code.hljs,code.nohighlight");for(var t in n)n.hasOwnProperty(t)&&(n[t].classList.contains("nohljsln")||d(n[t],e))}catch(e){r.console.error("LineNumbers error: ",e)}}function d(e,n){"object"==typeof e&&r.setTimeout(function(){e.innerHTML=f(e,n)},0)}function f(e,n){var t,r,o=(t=e,{singleLine:function(e){return!!e.singleLine&&e.singleLine}(r=(r=n)||{}),startFrom:function(e,n){var t=1;isFinite(n.startFrom)&&(t=n.startFrom);var r=function(e,n){return e.hasAttribute(n)?e.getAttribute(n):null}(e,"data-ln-start-from");return null!==r&&(t=function(e,n){if(!e)return n;var t=Number(e);return isFinite(t)?t:n}(r,1)),t}(t,r)});return function e(n){var t=n.childNodes;for(var r in t){var o;t.hasOwnProperty(r)&&(o=t[r],0<(o.textContent.trim().match(i)||[]).length&&(0<o.childNodes.length?e(o):v(o.parentNode)))}}(e),function(e,n){var t=g(e);""===t[t.length-1].trim()&&t.pop();if(1<t.length||n.singleLine){for(var r="",o=0,i=t.length;o<i;o++)r+=p('<tr><td class="{0} {1}" {3}="{5}"><div class="{2}" {3}="{5}"></div></td><td class="{0} {4}" {3}="{5}">{6}</td></tr>',[l,s,c,m,h,o+n.startFrom,0<t[o].length?t[o]:" "]);return p('<table class="{0}">{1}</table>',[a,r])}return e}(e.innerHTML,o)}function v(e){var n=e.className;if(/hljs-/.test(n)){for(var t=g(e.innerHTML),r=0,o="";r<t.length;r++){o+=p('<span class="{0}">{1}</span>\n',[n,0<t[r].length?t[r]:" "])}e.innerHTML=o.trim()}}function g(e){return 0===e.length?[]:e.split(i)}function p(e,t){return e.replace(/\{(\d+)\}/g,function(e,n){return void 0!==t[n]?t[n]:e})}r.hljs?(r.hljs.initLineNumbersOnLoad=function(e){"interactive"===o.readyState||"complete"===o.readyState?n(e):r.addEventListener("DOMContentLoaded",function(){n(e)})},r.hljs.lineNumbersBlock=d,r.hljs.lineNumbersBlockSync=function(e,n){if("object"!=typeof e)return;e.innerHTML=f(e,n)},r.hljs.lineNumbersValue=function(e,n){if("string"!=typeof e)return;var t=document.createElement("code");return t.innerHTML=e,f(t,n)},(e=o.createElement("style")).type="text/css",e.innerHTML=p(".{0}{border-collapse:collapse}.{0} td{padding:0}.{1}:before{content:attr({2})}",[a,c,m]),o.getElementsByTagName("head")[0].appendChild(e)):r.console.error("highlight.js not detected!"),document.addEventListener("copy",function(e){var n,t=window.getSelection();!function(e){for(var n=e;n;){if(n.className&&-1!==n.className.indexOf("hljs-ln-code"))return 1;n=n.parentNode}}(t.anchorNode)||(n=-1!==window.navigator.userAgent.indexOf("Edge")?u(t):t.toString(),e.clipboardData.setData("text/plain",n),e.preventDefault())})}(window,document);
+228
View File
@@ -0,0 +1,228 @@
:root {
/* Unix/Terminal Aesthetic Palette */
--bg: #0d1117;
--text: #c9d1d9;
--text-dim: #8b949e;
--border: #30363d;
--primary: #238636;
--primary-hover: #2ea043;
--secondary: #21262d;
--secondary-hover: #30363d;
--accent: #58a6ff;
--highlight: rgba(241, 250, 140, 0.1); /* Subtle Dracula Yellow */
--margin: 1rem;
--line-height: 1.5;
--font-mono: "Fira Code", "JetBrains Mono", "Cascadia Code", "Source Code Pro", "Menlo", "Monaco", "Consolas", monospace;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html, body {
height: 100%;
width: 100%;
font-family: var(--font-mono);
background-color: var(--bg);
color: var(--text);
overflow: hidden;
}
body {
display: flex;
flex-direction: column;
}
#nav {
display: flex;
height: 3.5rem;
padding: 0 var(--margin);
align-items: center;
justify-content: space-between;
background-color: var(--bg);
flex-shrink: 0;
}
.nav-left {
display: flex;
align-items: center;
gap: 1rem;
}
.nav-left .title {
font-size: 1.1rem;
font-weight: 600;
text-decoration: none;
color: var(--text-dim);
letter-spacing: -0.02em;
}
.nav-left .title:hover { color: var(--text); }
.source-link {
font-size: 0.75rem !important;
padding: 0.2rem 0.5rem !important;
opacity: 0.7;
}
.nav-right {
display: flex;
align-items: center;
gap: 1rem;
}
.nav-btn {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0.4rem 0.8rem;
border-radius: 4px;
font-size: 0.85rem;
font-weight: 500;
text-decoration: none;
cursor: pointer;
border: 1px solid var(--border);
font-family: inherit;
transition: all 0.1s ease;
}
.primary { background-color: var(--primary); color: #ffffff; }
.secondary { background-color: var(--secondary); color: var(--text); }
#metadata {
display: flex;
align-items: center;
gap: 0.75rem;
font-size: 0.8rem;
color: var(--text-dim);
}
main {
flex-grow: 1;
overflow: hidden;
display: flex;
flex-direction: column;
padding: 0 var(--margin) var(--margin) var(--margin);
}
.content-wrapper {
flex-grow: 1;
overflow-y: auto;
overflow-x: hidden;
width: 100%;
height: 100%;
scroll-behavior: smooth;
}
#paste-form {
height: 100%;
display: flex;
flex-direction: column;
}
textarea {
flex-grow: 1;
width: 100%;
font-family: inherit;
font-size: 0.95rem;
line-height: var(--line-height);
border: none;
outline: none;
background-color: transparent !important;
color: inherit;
resize: none;
padding: 0.5rem;
white-space: pre;
overflow: auto;
}
pre, code {
background: transparent !important;
padding: 0 !important;
margin: 0 !important;
font-family: inherit !important;
font-size: inherit !important;
line-height: var(--line-height) !important;
}
code.with-line-numbers {
display: block;
}
.line {
display: grid;
grid-template-columns: calc(var(--digits, 1) * 1ch + 2rem) minmax(0, 1fr);
width: 100%;
min-height: calc(1em * var(--line-height));
/* Breathing room when targeting a line */
scroll-margin-top: 2rem;
}
.line-number {
grid-column: 1;
text-align: right;
padding-right: 1rem;
color: var(--text-dim);
opacity: 0.3;
border-right: 1px solid var(--border);
user-select: none;
text-decoration: none;
cursor: pointer;
font-size: 0.9rem;
}
.line-number:hover {
opacity: 0.8;
color: var(--accent);
}
.line-code {
grid-column: 2;
padding-left: 1rem;
white-space: pre-wrap;
word-break: break-all;
}
/*
Line Highlight via URL Hash (#L315)
*/
.line:target {
background-color: var(--highlight);
}
.line:target .line-number {
opacity: 1;
color: #f1fa8c; /* Dracula Yellow */
border-right-color: #f1fa8c;
border-right-width: 2px;
}
/* Selection */
::selection { background: rgba(59, 130, 246, 0.4); color: #ffffff; }
/* Scrollbar */
::-webkit-scrollbar { width: 6px; height: 6px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--secondary); }
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
@media (max-width: 640px) {
#metadata { display: none; }
.line { grid-template-columns: 1fr; }
.line-number { display: none; }
.line-code { padding-left: 0; }
}
-119
View File
@@ -1,119 +0,0 @@
:root {
--background-color: #212121;
--text-color: #b0bec5;
--scrollbar-track-color: #2c2c2c;
--scrollbar-thumb-color: #555;
--scrollbar-thumb-hover-color: #888;
--spacing: 2rem;
}
* {
box-sizing: border-box;
}
html,
body {
margin: 0;
padding: 0;
height: 100%;
width: 100%;
font-family: monospace;
font-size: 16px;
}
body {
background: var(--background-color);
color: var(--text-color);
display: flex;
flex-direction: column;
}
form {
display: flex;
flex-direction: column;
flex-grow: 1;
}
textarea,
pre {
flex-grow: 1;
margin: 0;
padding: var(--spacing);
background: none;
border: none;
outline: none;
resize: none;
color: inherit;
font-size: 1rem;
line-height: 1.6;
font-family: inherit;
overflow: auto;
white-space: pre-wrap;
word-break: break-all;
}
pre {
background-color: transparent !important;
}
button[type="submit"] {
display: none;
}
textarea::-webkit-scrollbar,
pre::-webkit-scrollbar {
width: 12px;
height: 12px;
}
textarea::-webkit-scrollbar-track,
pre::-webkit-scrollbar-track {
background: var(--scrollbar-track-color);
}
textarea::-webkit-scrollbar-thumb,
pre::-webkit-scrollbar-thumb {
background-color: var(--scrollbar-thumb-color);
border-radius: 6px;
border: 3px solid var(--scrollbar-track-color);
}
textarea::-webkit-scrollbar-thumb:hover,
pre::-webkit-scrollbar-thumb:hover {
background-color: var(--scrollbar-thumb-hover-color);
}
textarea,
pre {
scrollbar-width: thin;
scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-track-color);
}
pre > code > span > span:first-child {
display: inline-block;
width: 4em;
color: #555;
user-select: none;
-webkit-user-select: none;
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
@media (max-width: 768px) {
:root {
--spacing: 1rem;
}
html {
font-size: 14px;
}
}
+19
View File
@@ -0,0 +1,19 @@
{{ define "base" }}
<!DOCTYPE html>
<html lang="zxx">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ .Title }}</title>
<link rel="stylesheet" href="/static/github-dark.min.css">
<link rel="stylesheet" href="/static/style.css">
<script src="/static/highlight.min.js"></script>
</head>
<body>
{{ template "content" . }}
</body>
</html>
{{ end }}
+80
View File
@@ -0,0 +1,80 @@
{{ define "content" }}
<nav id="nav">
<div class="nav-left">
<a href="/" class="title">pastebin</a>
<a href="https://github.com/skidoodle/pastebin" class="nav-btn secondary source-link" target="_blank"
rel="noopener">Source</a>
</div>
<div class="nav-right">
{{ if .IsPreview }}
<div id="metadata">
<a href="/" class="nav-btn secondary">New</a>
<a href="/raw/{{ .ID }}" class="nav-btn secondary">Raw</a>
<span class="meta-item">{{ .TimeAgo }}</span>
<span class="meta-separator">/</span>
<span class="meta-item">{{ .LineCount }} lines</span>
</div>
{{ else }}
<button id="save-button" class="nav-btn primary" onclick="document.getElementById('paste-form').submit()">Save
Paste</button>
{{ end }}
</div>
</nav>
<main>
{{ if .IsPreview }}
<div id="paste-content" class="content-wrapper" style="--digits: {{ .GutterSize }};">
<pre><code id="code-block">{{ .Content }}</code></pre>
</div>
<script>
(function () {
const code = document.getElementById('code-block');
const lineCount = {{ .LineCount}
};
hljs.highlightElement(code);
if (lineCount < 5000) {
const lines = code.innerHTML.split(/\r?\n/);
let finalHtml = '';
for (let i = 0; i < lines.length; i++) {
const num = i + 1;
finalHtml += '<div class="line" id="L' + num + '"><a href="#L' + num + '" class="line-number">' + num + '</a><div class="line-code">' + (lines[i] || ' ') + '</div></div>';
}
code.innerHTML = finalHtml;
code.classList.add('with-line-numbers');
}
document.addEventListener('keydown', (e) => {
if ((e.ctrlKey || e.metaKey) && e.key === 'a') {
if (e.target.tagName !== 'TEXTAREA' && e.target.tagName !== 'INPUT') {
e.preventDefault();
const range = document.createRange();
range.selectNodeContents(code);
const selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
}
}
});
}) ();
</script>
{{ else }}
<div class="content-wrapper">
<form id="paste-form" action="/" method="post">
<label for="content-editor" class="sr-only">Paste Content</label>
<textarea id="content-editor" name="content" placeholder="Paste something interesting here..." autofocus
autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"></textarea>
</form>
</div>
<script>
document.addEventListener('keydown', (e) => {
if ((e.ctrlKey || e.metaKey) && e.key === 's') {
e.preventDefault();
document.getElementById('paste-form').submit();
}
});
</script>
{{ end }}
</main>
{{ end }}