diff --git a/.gitignore b/.gitignore index aa0926a..caf428f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ node_modules/ dist/ .env *.log +data/ diff --git a/docker-compose.yml b/docker-compose.yml index a1ec12f..9a0458c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,5 +13,10 @@ services: - STRIPE_WEBHOOK_SECRET=${STRIPE_WEBHOOK_SECRET} - BASE_URL=${BASE_URL:-https://docfast.dev} - PRO_KEYS=${PRO_KEYS} + volumes: + - docfast-data:/app/data mem_limit: 512m cpus: 1.0 + +volumes: + docfast-data: diff --git a/public/index.html b/public/index.html index 4d58cd4..ec99b8d 100644 --- a/public/index.html +++ b/public/index.html @@ -11,7 +11,6 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: var(--bg); color: var(--fg); line-height: 1.6; } a { color: var(--accent); text-decoration: none; } a:hover { text-decoration: underline; } - .container { max-width: 960px; margin: 0 auto; padding: 0 24px; } /* Hero */ @@ -20,10 +19,10 @@ a:hover { text-decoration: underline; } .hero h1 span { color: var(--accent); } .hero p { font-size: 1.25rem; color: var(--muted); max-width: 600px; margin: 0 auto 40px; } .hero-actions { display: flex; gap: 16px; justify-content: center; flex-wrap: wrap; } -.btn { display: inline-block; padding: 14px 32px; border-radius: 8px; font-size: 1rem; font-weight: 600; transition: all 0.2s; } +.btn { display: inline-block; padding: 14px 32px; border-radius: 8px; font-size: 1rem; font-weight: 600; transition: all 0.2s; border: none; cursor: pointer; } .btn-primary { background: var(--accent); color: #000; } .btn-primary:hover { background: #6fb; text-decoration: none; } -.btn-secondary { border: 1px solid var(--border); color: var(--fg); } +.btn-secondary { border: 1px solid var(--border); color: var(--fg); background: transparent; } .btn-secondary:hover { border-color: var(--muted); text-decoration: none; } /* Code block */ @@ -65,6 +64,24 @@ a:hover { text-decoration: underline; } /* Footer */ footer { padding: 40px 0; text-align: center; color: var(--muted); font-size: 0.85rem; border-top: 1px solid var(--border); } + +/* Modal */ +.modal-overlay { display: none; position: fixed; inset: 0; background: rgba(0,0,0,0.7); z-index: 100; align-items: center; justify-content: center; } +.modal-overlay.active { display: flex; } +.modal { background: var(--card); border: 1px solid var(--border); border-radius: 16px; padding: 40px; max-width: 440px; width: 90%; } +.modal h2 { margin-bottom: 8px; font-size: 1.5rem; } +.modal p { color: var(--muted); margin-bottom: 24px; font-size: 0.95rem; } +.modal input { width: 100%; padding: 14px 16px; border-radius: 8px; border: 1px solid var(--border); background: var(--bg); color: var(--fg); font-size: 1rem; margin-bottom: 16px; outline: none; } +.modal input:focus { border-color: var(--accent); } +.modal .btn { width: 100%; text-align: center; } +.modal .error { color: #f66; font-size: 0.85rem; margin-bottom: 12px; display: none; } +.modal .close { position: absolute; top: 16px; right: 20px; color: var(--muted); font-size: 1.5rem; cursor: pointer; background: none; border: none; } + +/* Key result */ +.key-result { display: none; } +.key-result .key-box { background: var(--bg); border: 1px solid var(--accent); border-radius: 8px; padding: 16px; font-family: monospace; font-size: 0.85rem; word-break: break-all; margin: 16px 0; cursor: pointer; transition: background 0.2s; } +.key-result .key-box:hover { background: #111; } +.key-result .copy-hint { color: var(--muted); font-size: 0.8rem; text-align: center; }
@@ -74,12 +91,12 @@ footer { padding: 40px 0; text-align: center; color: var(--muted); font-size: 0.One API call. Beautiful PDFs. Built-in invoice templates. No headless browser setup, no dependencies, no hassle.