Files
Trackeep/browser-extension/options.html
T
2026-04-10 12:06:01 +02:00

914 lines
24 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en" data-kb-theme="dark">
<head>
<meta charset="UTF-8" />
<title>Trackeep Saver Options</title>
<style>
/* Modern Inter Font */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
/* Modern CSS Variables - Proton Pass Inspired */
:root {
--bg-primary: #0f0f0f;
--bg-secondary: #1a1a1a;
--bg-tertiary: #262626;
--bg-hover: #2a2a2a;
--bg-active: #333333;
--border-primary: #2a2a2a;
--border-secondary: #333333;
--text-primary: #ffffff;
--text-secondary: #a3a3a3;
--text-tertiary: #737373;
--accent-primary: #3b82f6;
--accent-hover: #2563eb;
--success: #10b981;
--warning: #f59e0b;
--error: #ef4444;
--gradient-primary: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%);
--gradient-secondary: linear-gradient(135deg, #1a1a1a 0%, #262626 100%);
--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3);
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.4);
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.5);
--radius-sm: 6px;
--radius-md: 8px;
--radius-lg: 12px;
--radius-xl: 16px;
}
* {
box-sizing: border-box;
}
body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
margin: 0;
padding: 0;
min-height: 100vh;
background: var(--bg-primary);
color: var(--text-primary);
line-height: 1.6;
font-size: 14px;
color-scheme: dark;
}
/* Container */
.container {
max-width: 800px;
margin: 0 auto;
padding: 40px;
background: var(--bg-primary);
min-height: 100vh;
}
/* Header */
.header {
background: var(--gradient-secondary);
padding: 32px 20px 20px;
border-bottom: 1px solid var(--border-primary);
position: relative;
overflow: hidden;
}
.header::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
background: var(--gradient-primary);
}
.header-content {
max-width: 800px;
margin: 0 auto;
display: flex;
align-items: center;
gap: 16px;
}
.logo-container {
display: flex;
align-items: center;
gap: 16px;
}
.logo {
width: 48px;
height: 48px;
border-radius: var(--radius-lg);
background: var(--gradient-primary);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-weight: 700;
font-size: 20px;
box-shadow: var(--shadow-lg);
position: relative;
overflow: hidden;
}
.logo::after {
content: '';
position: absolute;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
background: linear-gradient(45deg, transparent, rgba(255,255,255,0.1), transparent);
transform: rotate(45deg);
animation: shimmer 3s infinite;
}
@keyframes shimmer {
0% { transform: translateX(-100%) translateY(-100%) rotate(45deg); }
100% { transform: translateX(100%) translateY(100%) rotate(45deg); }
}
.title-section {
flex: 1;
}
.title {
font-size: 28px;
font-weight: 700;
color: var(--text-primary);
margin: 0 0 4px 0;
}
.subtitle {
font-size: 14px;
color: var(--text-secondary);
margin: 0;
}
/* Main Content */
.main-content {
max-width: 800px;
margin: 0 auto;
}
/* Section */
.section {
background: var(--bg-secondary);
border-radius: var(--radius-lg);
padding: 32px;
margin-bottom: 24px;
border: 1px solid var(--border-primary);
box-shadow: var(--shadow-lg);
}
.section-header {
display: flex;
align-items: center;
gap: 16px;
margin-bottom: 24px;
padding-bottom: 16px;
border-bottom: 1px solid var(--border-primary);
}
.section-icon {
width: 48px;
height: 48px;
background: var(--gradient-primary);
border-radius: var(--radius-md);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 16px;
}
.section-title {
font-size: 18px;
font-weight: 600;
color: var(--text-primary);
margin: 0;
}
.section-description {
font-size: 14px;
color: var(--text-secondary);
margin: 4px 0 0 0;
}
/* Form Elements */
.form {
max-width: 100%;
}
.form-group {
margin-bottom: 20px;
}
.form-group:last-child {
margin-bottom: 0;
}
label {
display: block;
font-size: 13px;
font-weight: 500;
margin-bottom: 8px;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
}
/* Install Welcome Styles */
.install-welcome {
padding: 40px 20px;
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
.install-card {
background: var(--bg-secondary);
border-radius: var(--radius-xl);
border: 1px solid var(--border-primary);
box-shadow: var(--shadow-lg);
max-width: 600px;
width: 100%;
overflow: hidden;
}
.install-header {
background: var(--gradient-primary);
padding: 32px;
text-align: center;
color: white;
}
.install-icon {
font-size: 48px;
margin-bottom: 16px;
}
.install-header h2 {
margin: 0 0 8px 0;
font-size: 24px;
font-weight: 700;
}
.install-header p {
margin: 0;
opacity: 0.9;
font-size: 16px;
}
.setup-steps {
padding: 32px;
}
.step {
display: flex;
gap: 20px;
margin-bottom: 32px;
align-items: flex-start;
}
.step-number {
background: var(--accent-primary);
color: white;
width: 32px;
height: 32px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 16px;
flex-shrink: 0;
}
.step-content h3 {
margin: 0 0 8px 0;
font-size: 18px;
font-weight: 600;
color: var(--text-primary);
}
.step-content p {
margin: 0 0 12px 0;
color: var(--text-secondary);
line-height: 1.5;
}
.security-note {
background: rgba(16, 185, 129, 0.1);
border: 1px solid rgba(16, 185, 129, 0.2);
border-radius: var(--radius-md);
padding: 12px;
margin-top: 16px;
display: flex;
align-items: center;
gap: 8px;
}
.security-note .icon {
color: var(--success);
flex-shrink: 0;
}
.security-note strong {
color: var(--success);
}
.main-options {
display: none;
}
/* Setup Form Styles */
.setup-form {
margin-top: 16px;
padding: 16px;
background: var(--bg-tertiary);
border-radius: var(--radius-md);
border: 1px solid var(--border-primary);
}
.setup-form .form-group {
margin-bottom: 16px;
}
.setup-form .form-group:last-child {
margin-bottom: 0;
}
.setup-form label {
display: block;
font-size: 13px;
font-weight: 500;
color: var(--text-primary);
margin-bottom: 6px;
}
.setup-form .form-input {
width: 100%;
padding: 12px 14px;
border-radius: var(--radius-sm);
border: 1px solid var(--border-primary);
background: var(--bg-secondary);
color: var(--text-primary);
font-size: 14px;
font-family: 'Inter', sans-serif;
transition: all 0.2s ease;
outline: none;
}
.setup-form .form-input:focus {
border-color: var(--accent-primary);
background: var(--bg-hover);
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
}
.setup-form .input-help {
font-size: 12px;
color: var(--text-secondary);
margin-top: 4px;
}
.setup-actions {
display: flex;
gap: 12px;
margin-top: 24px;
width: 100%;
}
.setup-actions .btn {
flex: 1;
}
/* Button Groups */
.btn-group {
display: flex;
gap: 12px;
margin-top: 20px;
width: 100%;
}
.btn-group .btn {
flex: 1;
}
/* Full Width Elements */
.btn-block {
width: 100%;
display: flex;
justify-content: center;
align-items: center;
}
/* Instructions */
.instructions {
background: var(--bg-tertiary);
border-radius: var(--radius-md);
padding: 16px;
border: 1px solid var(--border-primary);
margin-top: 16px;
width: 100%;
}
input[type="url"],
input[type="password"] {
width: 100%;
padding: 14px 16px;
border-radius: var(--radius-md);
border: 1px solid var(--border-primary);
background: var(--bg-tertiary);
color: var(--text-primary);
font-size: 14px;
font-family: 'Inter', sans-serif;
font-weight: 400;
transition: all 0.2s ease;
outline: none;
}
input[type="text"]:focus,
input[type="url"]:focus,
input[type="password"]:focus {
border-color: var(--accent-primary);
background: var(--bg-hover);
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
}
/* Instructions */
.instructions {
background: var(--bg-tertiary);
border-radius: var(--radius-md);
padding: 16px;
border: 1px solid var(--border-primary);
margin-top: 16px;
}
.instructions-title {
font-size: 13px;
font-weight: 600;
color: var(--text-primary);
margin: 0 0 8px 0;
display: flex;
align-items: center;
gap: 6px;
}
.instructions-list {
font-size: 13px;
color: var(--text-secondary);
margin: 0;
padding-left: 16px;
line-height: 1.6;
}
.instructions-list li {
margin-bottom: 4px;
}
.instructions-list li:last-child {
margin-bottom: 0;
}
/* Buttons */
.btn {
padding: 14px 24px;
border-radius: var(--radius-md);
border: none;
font-size: 14px;
font-weight: 500;
font-family: 'Inter', sans-serif;
cursor: pointer;
transition: all 0.2s ease;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
outline: none;
position: relative;
overflow: hidden;
}
.btn::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.1), transparent);
transition: left 0.5s;
}
.btn:hover::before {
left: 100%;
}
.btn-primary {
background: var(--gradient-primary);
color: white;
box-shadow: var(--shadow-sm);
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: var(--shadow-md);
}
.btn-primary:active {
transform: translateY(0);
}
.btn:disabled {
opacity: 0.5;
cursor: not-allowed;
transform: none !important;
}
/* Status Messages */
.status-message {
padding: 16px 20px;
border-radius: var(--radius-md);
font-size: 13px;
font-weight: 500;
margin-top: 20px;
display: flex;
align-items: center;
gap: 10px;
animation: slideUp 0.3s ease;
}
@keyframes slideUp {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
.status-message.success {
background: rgba(16, 185, 129, 0.1);
color: var(--success);
border: 1px solid rgba(16, 185, 129, 0.2);
}
.security-badge {
background: rgba(16, 185, 129, 0.1);
border: 1px solid rgba(16, 185, 129, 0.2);
border-radius: var(--radius-sm);
padding: 6px 10px;
font-size: 11px;
font-weight: 600;
color: var(--success);
display: flex;
align-items: center;
gap: 6px;
margin-bottom: 8px;
}
.security-badge .icon {
flex-shrink: 0;
}
.connection-status {
background: var(--bg-tertiary);
border-radius: var(--radius-md);
padding: 16px;
margin-top: 20px;
border: 1px solid var(--border-primary);
}
.connection-status.connected {
border-color: var(--success);
background: rgba(16, 185, 129, 0.05);
}
.connection-status.error {
border-color: var(--error);
background: rgba(239, 68, 68, 0.05);
}
.status-message.info {
background: rgba(59, 130, 246, 0.1);
color: var(--accent-primary);
border: 1px solid rgba(59, 130, 246, 0.2);
}
/* Code styling */
code {
background: var(--bg-tertiary);
padding: 3px 8px;
border-radius: var(--radius-sm);
font-size: 12px;
color: var(--text-primary);
border: 1px solid var(--border-primary);
font-family: 'Fira Code', 'Monaco', 'Consolas', monospace;
}
/* Icon System */
.icon {
width: 16px;
height: 16px;
display: inline-block;
vertical-align: middle;
transition: all 0.2s ease;
fill: white;
stroke: white;
}
.icon-sm {
width: 12px;
height: 12px;
fill: white;
stroke: white;
}
.icon-lg {
width: 20px;
height: 20px;
fill: white;
stroke: white;
}
.icon-xl {
width: 24px;
height: 24px;
fill: white;
stroke: white;
}
/* External SVG Icons */
img.icon {
filter: brightness(0) invert(1);
}
img.icon-sm {
filter: brightness(0) invert(1);
}
img.icon-lg {
filter: brightness(0) invert(1);
}
img.icon-xl {
filter: brightness(0) invert(1);
}
/* Icon animations */
.icon-spin {
animation: spin 1s linear infinite;
}
.icon-pulse {
animation: pulse 2s ease-in-out infinite;
}
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
@keyframes pulse {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.8; transform: scale(1.05); }
}
/* Enhanced button icons */
.btn .icon {
transition: transform 0.2s ease;
}
.btn:hover .icon {
transform: scale(1.1);
}
.btn:active .icon {
transform: scale(0.95);
}
/* Section icon enhancements */
.section-icon {
transition: all 0.3s ease;
}
.section:hover .section-icon {
transform: scale(1.05) rotate(5deg);
box-shadow: var(--shadow-md);
}
/* Responsive */
@media (max-width: 640px) {
.container {
padding: 20px 16px;
}
.section {
padding: 20px;
}
.header {
padding: 24px 16px 16px;
}
.title {
font-size: 24px;
}
}
</style>
</head>
<body>
<!-- First-time Install Welcome -->
<div id="installWelcome" class="install-welcome" style="display: none;">
<div class="install-card">
<div class="install-header">
<div class="install-icon">🎉</div>
<h2>Welcome to Trackeep Saver!</h2>
<p>Let's set up your connection to get started.</p>
</div>
<div class="setup-steps">
<div class="step">
<div class="step-number">1</div>
<div class="step-content">
<h3>Get Your API Key</h3>
<p>Log into your Trackeep account and generate an API key in Settings → Security.</p>
<div class="security-note">
<img src="https://www.svgrepo.com/show/381193/secure-shield-password-protect-safe.svg" alt="Security" class="icon" style="width: 16px; height: 16px;" />
<strong>Secure:</strong> API keys are safer than JWT tokens and can be revoked anytime.
</div>
</div>
</div>
<div class="step">
<div class="step-number">2</div>
<div class="step-content">
<h3>Configure Connection</h3>
<p>Enter your Trackeep URL and API key below.</p>
<div class="setup-form">
<div class="form-group">
<label for="setupApiUrl">Trackeep URL</label>
<input type="url" id="setupApiUrl" placeholder="https://your-trackeep.com/api/v1" class="form-input" />
<div class="input-help">Your Trackeep instance API URL</div>
</div>
<div class="form-group">
<label for="setupApiKey">API Key</label>
<input type="password" id="setupApiKey" placeholder="tk_..." class="form-input" />
<div class="input-help">
<div class="security-badge">
<img src="https://www.svgrepo.com/show/381193/secure-shield-password-protect-safe.svg" alt="Security" class="icon" style="width: 16px; height: 16px;" />
<span>Secure API Key</span>
</div>
More secure than JWT tokens, revocable anytime
</div>
</div>
</div>
</div>
</div>
<div class="step">
<div class="step-number">3</div>
<div class="step-content">
<h3>
<img src="https://www.svgrepo.com/show/448375/connection-gateway.svg" alt="Test" class="icon" style="width: 20px; height: 20px; margin-right: 8px;" />
Test Connection
</h3>
<p>Verify your connection works before saving bookmarks.</p>
<div id="setupConnectionStatus" class="connection-status" style="display: none;">
<div class="status-content">
<img src="https://www.svgrepo.com/show/448375/connection-gateway.svg" alt="Status" class="icon" style="width: 16px; height: 16px;" />
<div>
<strong id="setupStatusTitle">Testing Connection...</strong>
<p id="setupStatusMessage">Please wait</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="setup-actions">
<button id="testSetupConnectionBtn" class="btn btn-primary">
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M9 11l3 3L22 8l-3-3-6-6z"></path>
<path d="M21 12v.01M5 12c0-4.41 3.58-8 8s8 3.58 8 8-3.58 8-8-8z"></path>
</svg>
Test Connection
</button>
<button id="completeSetupBtn" class="btn btn-secondary">
<img src="https://www.svgrepo.com/show/521819/save.svg" alt="Complete" class="icon" style="width: 16px; height: 16px;" />
Complete Setup
</button>
</div>
</div>
</div>
</div>
<!-- Main Options -->
<div id="mainOptions" class="container">
<header class="header">
<div class="header-content">
<div class="logo-container">
<div class="logo">
<img src="https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/trackeep.svg" alt="Trackeep" class="icon-xl" style="width: 24px; height: 24px; fill: white;" />
</div>
<div>
<h1 class="title">Trackeep Saver</h1>
<p class="subtitle">Browser Extension Settings</p>
</div>
</div>
</div>
</header>
<main class="main-content">
<section class="section">
<div class="section-header">
<div class="section-icon">
<img src="https://www.svgrepo.com/show/505495/settings.svg" alt="Settings" class="icon-xl" style="width: 24px; height: 24px;" />
</div>
<h2 class="section-title">Connection Settings</h2>
<p class="section-description">Configure your Trackeep connection and API key</p>
</div>
<form id="optionsForm" class="form">
<div class="form-group">
<label for="trackeepApiUrl">Trackeep URL</label>
<input type="url" id="trackeepApiUrl" placeholder="https://your-trackeep.com/api/v1" class="form-input" />
<div class="input-help">Your Trackeep instance API URL</div>
</div>
<div class="form-group">
<label for="trackeepApiKey">API Key</label>
<input type="password" id="trackeepApiKey" placeholder="tk_..." class="form-input" />
<div class="input-help">
<div class="security-badge">
<img src="https://www.svgrepo.com/show/381193/secure-shield-password-protect-safe.svg" alt="Security" class="icon" style="width: 16px; height: 16px;" />
<span>Secure API Key</span>
</div>
More secure than JWT tokens, revocable anytime
</div>
</div>
<div class="form-group">
<label for="youtubeAutoPrompt">YouTube Auto Prompt</label>
<div class="input-help">
<label style="display: inline-flex; align-items: center; gap: 8px; cursor: pointer; text-transform: none; letter-spacing: normal; margin: 0;">
<input type="checkbox" id="youtubeAutoPrompt" style="width: 16px; height: 16px;" />
<span>Ask to save when a YouTube video is detected</span>
</label>
</div>
</div>
<div id="connectionStatus" class="connection-status" style="display: none;">
<div class="status-content">
<img src="https://www.svgrepo.com/show/448375/connection-gateway.svg" alt="Status" class="icon" style="width: 16px; height: 16px;" />
<div>
<strong id="statusTitle">Testing Connection...</strong>
<p id="connectionStatusMessage">Please wait</p>
</div>
</div>
</div>
</form>
<div class="btn-group">
<button id="testConnectionBtn" class="btn btn-primary">
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M9 11l3 3L22 8l-3-3-6-6z"></path>
<path d="M21 12v.01M5 12c0-4.41 3.58-8 8s8 3.58 8 8-3.58 8-8-8z"></path>
</svg>
Test Connection
</button>
<button id="generateKeyBtn" class="btn btn-secondary">
<img src="https://www.svgrepo.com/show/532805/file-shredder.svg" alt="Generate" class="icon" style="width: 16px; height: 16px;" />
Generate API Key
</button>
</div>
<div class="instructions">
<div class="instructions-title">
<img src="https://www.svgrepo.com/show/447845/website-click.svg" alt="Instructions" class="icon" style="width: 16px; height: 16px;" />
<span>How to get your API key:</span>
</div>
<ol class="instructions-list">
<li>Log into your Trackeep account</li>
<li>Go to Settings → Security</li>
<li>Click "Generate New API Key"</li>
<li>Copy the generated key (starts with <code>tk_</code>)</li>
<li>Paste the key in the field above</li>
<li><strong>API keys are more secure than JWT tokens</strong> - they can be revoked anytime and have limited permissions</li>
</ol>
</div>
<button class="btn btn-primary" id="saveBtn" style="margin-top: 24px;">
<img src="https://www.svgrepo.com/show/521819/save.svg" alt="Save" class="icon" style="width: 16px; height: 16px;" />
<span>Save Settings</span>
</button>
<div id="statusMessage" class="status-message" style="display: none;"></div>
</section>
</main>
</div>
<script src="options.js"></script>
</body>
</html>