feat: initialize warpbox.dev project structure and backend

Initialize the repository with the core Go backend architecture and a frontend mockup for warpbox.dev, a self-hosted file-sharing application.

- Set up Go backend modules for configuration, HTTP server, middleware, handlers, and templates.
- Add local development scripts, environment templates, and basic project configuration.
- Include a React-based frontend mockup under the docs directory.
This commit is contained in:
2026-05-25 15:36:49 +03:00
parent 84e5aee87c
commit 9b8ef16474
129 changed files with 19863 additions and 0 deletions

329
backend/static/css/app.css Normal file
View File

@@ -0,0 +1,329 @@
:root {
color-scheme: light;
--background: #ffffff;
--foreground: #09090b;
--card: #ffffff;
--card-foreground: #09090b;
--muted: #f4f4f5;
--muted-foreground: #71717a;
--border: #e4e4e7;
--input: #e4e4e7;
--primary: #18181b;
--primary-foreground: #fafafa;
--ring: #a1a1aa;
--radius: 0.5rem;
--shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
}
* {
box-sizing: border-box;
}
html {
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
background: var(--background);
color: var(--foreground);
}
body {
min-height: 100vh;
margin: 0;
display: flex;
flex-direction: column;
background: radial-gradient(circle at top, #fafafa 0, var(--background) 34rem);
}
a {
color: inherit;
}
:focus-visible {
outline: 2px solid var(--ring);
outline-offset: 2px;
}
.skip-link {
position: absolute;
left: 1rem;
top: -4rem;
z-index: 10;
padding: 0.75rem 1rem;
border-radius: var(--radius);
background: var(--primary);
color: var(--primary-foreground);
}
.skip-link:focus {
top: 1rem;
}
.site-header {
border-bottom: 1px solid var(--border);
background: rgba(255, 255, 255, 0.84);
backdrop-filter: blur(14px);
}
.nav {
width: min(1180px, calc(100% - 2rem));
min-height: 4.5rem;
margin: 0 auto;
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
}
.brand,
.nav-links {
display: inline-flex;
align-items: center;
gap: 0.7rem;
}
.brand {
font-weight: 800;
text-decoration: none;
letter-spacing: 0;
}
.brand-mark {
width: 2rem;
height: 2rem;
display: grid;
place-items: center;
border-radius: calc(var(--radius) - 0.125rem);
background: var(--primary);
color: var(--primary-foreground);
font-size: 0.9rem;
}
.nav-links a {
text-decoration: none;
}
main {
flex: 1;
}
.upload-view {
width: min(620px, calc(100% - 2rem));
min-height: calc(100vh - 9rem);
margin: 0 auto;
padding: 3rem 0;
display: flex;
align-items: center;
justify-content: center;
}
h1 {
margin: 0;
color: var(--card-foreground);
font-size: 1.8rem;
line-height: 1.15;
font-weight: 700;
}
.panel-header {
display: grid;
gap: 0.5rem;
text-align: center;
}
.panel-header p {
margin: 0;
color: var(--muted-foreground);
font-size: 0.95rem;
line-height: 1.5;
}
.upload-panel {
width: 100%;
display: grid;
gap: 1rem;
padding: 1.25rem;
border: 1px solid var(--border);
border-radius: var(--radius);
background: var(--card);
box-shadow: var(--shadow);
}
.drop-zone {
min-height: 17rem;
display: grid;
place-items: center;
align-content: center;
gap: 0.65rem;
padding: 2rem;
border: 1px dashed var(--input);
border-radius: var(--radius);
background: var(--muted);
text-align: center;
cursor: pointer;
transition: border-color 160ms ease, background 160ms ease;
}
.drop-zone:hover,
.drop-zone.is-dragging {
border-color: var(--primary);
background: #fafafa;
}
.drop-zone input {
position: absolute;
inline-size: 1px;
block-size: 1px;
opacity: 0;
pointer-events: none;
}
.drop-icon {
width: 3rem;
height: 3rem;
display: grid;
place-items: center;
border: 1px solid var(--border);
border-radius: var(--radius);
background: var(--background);
color: var(--foreground);
font-size: 2rem;
font-weight: 400;
}
.drop-title {
font-size: 1rem;
font-weight: 650;
}
.drop-copy {
color: var(--muted-foreground);
font-size: 0.9rem;
}
.advanced-options {
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 0.8rem 0.9rem;
}
.advanced-options summary {
color: var(--foreground);
cursor: pointer;
font-size: 0.9rem;
font-weight: 650;
}
.option-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 0.9rem;
margin-top: 1rem;
}
label span {
display: block;
margin-bottom: 0.35rem;
color: var(--foreground);
font-size: 0.85rem;
font-weight: 600;
}
input,
select,
button {
font: inherit;
}
input,
select {
width: 100%;
min-height: 2.25rem;
border: 1px solid var(--input);
border-radius: calc(var(--radius) - 0.125rem);
padding: 0.6rem 0.75rem;
background: var(--background);
color: var(--foreground);
}
input::placeholder {
color: var(--muted-foreground);
}
.form-footer {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
}
.form-footer p {
margin: 0;
color: var(--muted-foreground);
font-size: 0.85rem;
}
.button,
button {
min-height: 2.25rem;
display: inline-flex;
align-items: center;
justify-content: center;
border: 1px solid transparent;
border-radius: calc(var(--radius) - 0.125rem);
padding: 0.45rem 0.85rem;
color: var(--foreground);
background: transparent;
font: inherit;
font-size: 0.9rem;
font-weight: 600;
line-height: 1;
cursor: pointer;
}
.button-primary {
background: var(--primary);
color: var(--primary-foreground);
}
.button-primary:hover {
background: #27272a;
}
.button-outline {
border-color: var(--border);
background: var(--background);
}
.button-outline:hover,
.button-ghost:hover {
background: var(--muted);
}
.site-footer {
width: min(1180px, calc(100% - 2rem));
margin: 0 auto;
padding: 1.5rem 0;
display: flex;
justify-content: space-between;
gap: 1rem;
color: var(--muted-foreground);
font-size: 0.85rem;
}
@media (max-width: 840px) {
.upload-view {
min-height: calc(100vh - 9rem);
padding: 2.5rem 0;
}
.option-grid,
.form-footer,
.site-footer {
grid-template-columns: 1fr;
flex-direction: column;
align-items: stretch;
}
.drop-zone {
min-height: 14rem;
}
}