Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Changed

- Download page (`site/download.html`): centered OS picker, clearer prerequisites table, tighter install steps, condensed trust section.
- Landing page (`site/index.html`): external CSS/JS, SEO (dashboard screenshot, manifest, sitemap.xml), security panel, aligned copy and Octicons; tentacle preview unchanged.
- Download page (`site/download.html`): static manifest, shared nav styles via `common.css`, centered OS picker, clearer prerequisites, tighter install steps.
- README header uses `site/gitdock-logo-removebg-preview.png` (transparent logo for GitHub light and dark themes).
- `server.js` imports validation helpers from `lib/` (behavior preserved; easier to test).
- Account name validation now rejects names that require stripping unsafe characters (e.g. `bad name!`, `work;rm`).
Expand Down
277 changes: 277 additions & 0 deletions site/css/common.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,277 @@
:root {
--bg0: #0d1117;
--bg1: #161b22;
--bg2: #21262d;
--bg3: #30363d;
--border: #30363d;
--t1: #e6edf3;
--t2: #8b949e;
--t3: #6e7681;
--blue: #58a6ff;
--green: #3fb950;
--yellow: #d29922;
--red: #f85149;
--purple: #bc8cff;
--orange: #f0883e;
--cyan: #39c5cf;
--grad: linear-gradient(135deg, #58a6ff, #bc8cff);
}

* {
margin: 0;
padding: 0;
box-sizing: border-box;
}

html {
scroll-behavior: smooth;
}

body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: var(--bg0);
color: var(--t1);
line-height: 1.6;
overflow-x: hidden;
}

a {
color: var(--blue);
text-decoration: none;
}

a:hover {
text-decoration: underline;
}

.skip-link {
position: absolute;
top: -100px;
left: 16px;
z-index: 200;
padding: 8px 16px;
border-radius: 6px;
background: var(--blue);
color: #fff;
font-size: 14px;
font-weight: 600;
text-decoration: none;
}

.skip-link:focus {
top: 16px;
outline: 2px solid var(--cyan);
outline-offset: 2px;
}

/* Navigation */
.nav {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
background: rgba(13, 17, 23, 0.85);
backdrop-filter: blur(12px);
border-bottom: 1px solid var(--border);
padding: 0 24px;
}

.nav-inner {
max-width: 1200px;
margin: 0 auto;
display: flex;
align-items: center;
justify-content: space-between;
height: 56px;
}

.nav-brand {
display: flex;
align-items: center;
gap: 10px;
font-weight: 600;
font-size: 15px;
color: var(--t1);
text-decoration: none;
}

.nav-brand:hover {
text-decoration: none;
color: var(--t1);
}

.nav-logo {
width: 28px;
height: 28px;
border-radius: 6px;
overflow: hidden;
display: inline-flex;
align-items: center;
justify-content: center;
flex: 0 0 28px;
transform: scale(1.25);
transform-origin: center;
}

.nav-logo img {
width: 100%;
height: 100%;
object-fit: cover;
transform: scale(1.25);
transform-origin: center;
}

.nav-links {
display: flex;
gap: 24px;
align-items: center;
}

.nav-links a {
color: var(--t2);
font-size: 13px;
text-decoration: none;
transition: color 0.2s;
}

.nav-links a:hover {
color: var(--t1);
text-decoration: none;
}

.btn-nav {
padding: 6px 16px;
border-radius: 6px;
background: var(--blue);
color: #fff !important;
font-weight: 500;
font-size: 13px;
transition: opacity 0.2s;
}

.btn-nav:hover {
opacity: 0.9;
text-decoration: none !important;
}

/* Section base */
.section {
padding: 100px 24px;
}

.section-inner {
max-width: 1100px;
margin: 0 auto;
}

.section-label {
font-size: 11px;
text-transform: uppercase;
letter-spacing: 1.5px;
color: var(--blue);
font-weight: 600;
margin-bottom: 8px;
}

.section-title {
font-size: clamp(28px, 4vw, 40px);
font-weight: 700;
margin-bottom: 16px;
letter-spacing: -0.01em;
}

.section-desc {
font-size: 16px;
color: var(--t2);
max-width: 600px;
line-height: 1.6;
}

.section-header {
margin-bottom: 56px;
}

/* Buttons */
.btn-hero {
padding: 12px 28px;
border-radius: 8px;
font-size: 15px;
font-weight: 600;
cursor: pointer;
border: none;
transition: all 0.2s;
text-decoration: none;
display: inline-flex;
align-items: center;
gap: 8px;
}

.btn-hero:hover {
text-decoration: none;
}

.btn-primary {
background: var(--blue);
color: #fff;
}

.btn-primary:hover {
background: #4a96ef;
box-shadow: 0 0 20px rgba(88, 166, 255, 0.3);
}

.btn-secondary {
background: transparent;
color: var(--t1);
border: 1px solid var(--border);
}

.btn-secondary:hover {
border-color: var(--t2);
background: var(--bg1);
}

/* Animations */
.fade-in {
opacity: 0;
transform: translateY(24px);
}

.fade-in.visible {
animation: fadeInUp 0.7s cubic-bezier(0.16, 1, 0.3, 1) var(--stagger, 0s) both;
}

@keyframes fadeInUp {
to {
opacity: 1;
transform: none;
}
}

/* Footer */
.footer {
padding: 32px 24px;
border-top: 1px solid var(--border);
text-align: center;
}

.footer p {
font-size: 12px;
color: var(--t3);
}

.footer-links {
margin-bottom: 8px;
}

.footer-links a {
color: var(--t3);
margin: 0 8px;
font-size: 12px;
text-decoration: none;
}

.footer-links a:hover {
color: var(--t1);
}
Loading
Loading