Files
TwitchDropsMiner/web/static/styles.css
github-actions[bot] 3d5080b2b2 feat: display benefits as individual lines with icon, name, and type
Enhanced the inventory tab to show each benefit on its own line instead of
an icon grid. Each benefit now displays with:
- Icon (40x40px) on the left
- Benefit name and type on the right in format: "Name (TYPE)"

Changes:
- Backend: Send full benefit data (name, type, image_url) instead of just URLs
- Frontend: Render benefits as vertical list of horizontal lines
- CSS: Add new styles for benefit items (.benefit-item, .benefit-icon, .benefit-info)
- Removed: Icon grid layout (chunks of 3) and rewards text field

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 16:27:10 +11:00

1024 lines
18 KiB
CSS

/* Global Styles */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
:root {
--bg-primary: #ffffff;
--bg-secondary: #f5f5f5;
--bg-panel: #ffffff;
--text-primary: #333333;
--text-secondary: #666666;
--border-color: #dddddd;
--accent-color: #9146ff;
--success-color: #00c853;
--warning-color: #ffa726;
--error-color: #f44336;
--progress-bg: #e0e0e0;
}
body.dark-mode {
--bg-primary: #1a1a1a;
--bg-secondary: #2a2a2a;
--bg-panel: #2a2a2a;
--text-primary: #e0e0e0;
--text-secondary: #a0a0a0;
--border-color: #444444;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
background-color: var(--bg-primary);
color: var(--text-primary);
line-height: 1.6;
}
.container {
max-width: 1400px;
margin: 0 auto;
padding: 20px;
}
/* Header */
header {
background: var(--bg-panel);
border: 1px solid var(--border-color);
border-radius: 8px;
padding: 20px;
margin-bottom: 20px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.header-top {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
}
header h1 {
margin: 0;
color: var(--accent-color);
}
.header-controls {
display: flex;
align-items: center;
gap: 15px;
}
.language-selector {
display: flex;
align-items: center;
gap: 8px;
font-size: 14px;
color: var(--text-primary);
}
.language-selector span {
font-weight: 500;
}
.language-selector select {
padding: 6px 10px;
border: 1px solid var(--border-color);
border-radius: 4px;
background: var(--bg-secondary);
color: var(--text-primary);
font-size: 14px;
cursor: pointer;
transition: border-color 0.2s;
}
.language-selector select:hover {
border-color: var(--accent-color);
}
.language-selector select:focus {
outline: none;
border-color: var(--accent-color);
box-shadow: 0 0 0 2px rgba(145, 70, 255, 0.2);
}
.status-bar {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 14px;
}
#connection-indicator {
font-weight: bold;
}
#connection-indicator.connected {
color: var(--success-color);
}
#connection-indicator.disconnected {
color: var(--error-color);
}
/* Tabs */
.tabs {
display: flex;
gap: 5px;
margin-bottom: 20px;
}
.tab-button {
flex: 1;
padding: 12px;
background: var(--bg-panel);
border: 1px solid var(--border-color);
border-radius: 8px 8px 0 0;
cursor: pointer;
font-size: 16px;
color: var(--text-primary);
transition: background 0.2s;
}
.tab-button:hover {
background: var(--bg-secondary);
}
.tab-button.active {
background: var(--accent-color);
color: white;
border-color: var(--accent-color);
}
/* Tab Content */
.tab-content {
display: none;
}
.tab-content.active {
display: block;
}
/* Panels */
.panel {
background: var(--bg-panel);
border: 1px solid var(--border-color);
border-radius: 8px;
padding: 20px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.panel h2 {
margin-bottom: 15px;
font-size: 18px;
border-bottom: 2px solid var(--accent-color);
padding-bottom: 8px;
}
/* Main Tab Grid */
.main-grid {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: auto auto 1fr;
gap: 20px;
min-height: 70vh;
}
.login-panel {
grid-column: 1;
}
.progress-panel {
grid-column: 2;
}
.console-panel {
grid-column: 1;
grid-row: 2 / 4;
}
.channels-panel {
grid-column: 2;
grid-row: 2 / 4;
}
/* Login */
#login-form input {
display: block;
width: 100%;
padding: 10px;
margin-bottom: 10px;
border: 1px solid var(--border-color);
border-radius: 4px;
background: var(--bg-secondary);
color: var(--text-primary);
}
#login-form button, #oauth-confirm {
width: 100%;
padding: 12px;
background: var(--accent-color);
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
font-weight: bold;
}
#login-form button:hover, #oauth-confirm:hover {
opacity: 0.9;
}
.oauth-code {
font-size: 32px;
font-weight: bold;
text-align: center;
padding: 20px;
background: var(--bg-secondary);
border-radius: 8px;
margin: 15px 0;
letter-spacing: 4px;
}
/* Drop Progress */
.drop-name {
font-weight: bold;
font-size: 16px;
margin-bottom: 5px;
}
.drop-game {
color: var(--text-secondary);
margin-bottom: 15px;
}
.drop-campaign-link {
color: #0066cc;
text-decoration: none;
transition: all 0.2s;
cursor: pointer;
}
.drop-campaign-link:hover {
color: #0052a3;
text-decoration: underline;
}
.progress-bar {
width: 100%;
height: 30px;
background: var(--progress-bg);
border-radius: 15px;
overflow: hidden;
margin-bottom: 10px;
}
.progress-fill {
height: 100%;
background: linear-gradient(90deg, var(--accent-color), var(--success-color));
transition: width 0.3s ease;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-weight: bold;
}
.progress-text {
text-align: center;
font-size: 14px;
}
.progress-time {
text-align: center;
color: var(--text-secondary);
font-size: 12px;
}
/* Console Output */
.console-output {
height: 400px;
overflow-y: auto;
font-family: 'Courier New', monospace;
font-size: 12px;
background: var(--bg-secondary);
border: 1px solid var(--border-color);
border-radius: 4px;
padding: 10px;
}
.console-output div {
margin-bottom: 2px;
}
/* Channels List */
.channels-list {
height: 400px;
overflow-y: auto;
}
/* Game Group Header */
.game-group-header {
display: flex;
align-items: center;
gap: 12px;
padding: 12px;
margin-bottom: 8px;
margin-top: 12px;
background: linear-gradient(135deg, var(--accent-color) 0%, rgba(145, 70, 255, 0.7) 100%);
border-radius: 8px;
color: white;
font-weight: bold;
position: sticky;
top: 0;
z-index: 10;
box-shadow: 0 2px 8px rgba(145, 70, 255, 0.3);
}
.game-group-header:first-child {
margin-top: 0;
}
.game-icon {
width: 40px;
height: 53px;
border-radius: 4px;
object-fit: cover;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
}
.game-group-info {
flex: 1;
}
.game-group-name {
font-size: 16px;
font-weight: bold;
margin-bottom: 2px;
}
.game-group-stats {
font-size: 12px;
opacity: 0.9;
font-weight: normal;
}
.channel-item {
padding: 12px;
margin-bottom: 8px;
margin-left: 16px;
background: var(--bg-secondary);
border: 2px solid var(--border-color);
border-radius: 6px;
cursor: pointer;
transition: all 0.2s;
}
.channel-item:hover {
border-color: var(--accent-color);
}
.channel-item.watching {
border-color: var(--success-color);
background: rgba(145, 70, 255, 0.1);
}
.channel-item.online {
border-left: 4px solid var(--success-color);
}
.channel-item.offline {
opacity: 0.6;
}
.channel-name {
font-weight: bold;
font-size: 14px;
}
.channel-info {
font-size: 12px;
color: var(--text-secondary);
margin-top: 4px;
}
.channel-badge {
display: inline-block;
padding: 2px 6px;
border-radius: 3px;
font-size: 10px;
margin-left: 5px;
}
.channel-badge.drops {
background: var(--success-color);
color: white;
}
.channel-badge.acl {
background: var(--accent-color);
color: white;
}
/* Inventory Grid */
.inventory-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
gap: 20px;
}
.campaign-card {
background: var(--bg-panel);
border: 1px solid var(--border-color);
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.campaign-header {
padding: 15px;
background: var(--bg-secondary);
}
.campaign-game {
font-weight: bold;
font-size: 16px;
}
.campaign-name {
font-size: 14px;
color: var(--text-secondary);
}
.campaign-name-link {
font-size: 14px;
color: #0066cc;
text-decoration: none;
transition: all 0.2s;
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 4px;
}
.campaign-name-link:hover {
color: #0052a3;
text-decoration: underline;
}
.external-link-icon {
font-size: 12px;
opacity: 0.7;
}
.campaign-status {
padding: 10px 15px;
font-size: 12px;
display: flex;
justify-content: space-between;
}
.campaign-drops {
padding: 15px;
}
.drop-item {
padding: 10px;
margin-bottom: 8px;
background: var(--bg-secondary);
border-radius: 4px;
border-left: 3px solid var(--border-color);
}
.drop-item.claimed {
border-left-color: var(--success-color);
opacity: 0.7;
}
.drop-item.active {
border-left-color: var(--accent-color);
}
.drop-item-header {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 8px;
}
.drop-item-info {
flex: 1;
min-width: 0;
}
.benefits-list {
margin-top: 8px;
margin-bottom: 8px;
display: flex;
flex-direction: column;
gap: 8px;
}
.benefit-item {
display: flex;
align-items: center;
gap: 10px;
padding: 8px;
background: var(--bg-panel);
border-radius: 4px;
border: 1px solid var(--border-color);
}
.benefit-icon {
width: 40px;
height: 40px;
border-radius: 4px;
object-fit: cover;
border: 2px solid var(--border-color);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
flex-shrink: 0;
}
.benefit-info {
flex: 1;
display: flex;
align-items: center;
gap: 6px;
min-width: 0;
}
.benefit-name {
font-weight: 500;
font-size: 14px;
color: var(--text-primary);
}
.benefit-type {
font-size: 12px;
color: var(--text-secondary);
font-style: italic;
}
/* Settings */
.settings-container {
max-width: 800px;
}
.settings-section {
background: var(--bg-panel);
border: 1px solid var(--border-color);
border-radius: 8px;
padding: 20px;
margin-bottom: 20px;
}
.settings-section h2 {
margin-bottom: 15px;
}
.settings-section label {
display: block;
margin-bottom: 15px;
}
.settings-section input[type="checkbox"] {
margin-right: 8px;
}
.settings-section select,
.settings-section input[type="number"] {
padding: 8px;
border: 1px solid var(--border-color);
border-radius: 4px;
background: var(--bg-secondary);
color: var(--text-primary);
margin-left: 10px;
}
.list-manager {
margin-top: 20px;
}
.game-list {
min-height: 100px;
max-height: 200px;
overflow-y: auto;
border: 1px solid var(--border-color);
border-radius: 4px;
padding: 10px;
margin-bottom: 10px;
background: var(--bg-secondary);
}
.game-item {
padding: 8px;
margin-bottom: 5px;
background: var(--bg-panel);
border-radius: 4px;
display: flex;
justify-content: space-between;
align-items: center;
}
.game-item button {
padding: 4px 8px;
background: var(--error-color);
color: white;
border: none;
border-radius: 3px;
cursor: pointer;
font-size: 12px;
}
.action-button {
padding: 12px 24px;
margin-right: 10px;
background: var(--bg-secondary);
border: 1px solid var(--border-color);
border-radius: 4px;
cursor: pointer;
font-size: 14px;
color: var(--text-primary);
}
.action-button.primary {
background: var(--accent-color);
color: white;
border-color: var(--accent-color);
}
.action-button:hover {
opacity: 0.9;
}
/* Help */
.help-content {
max-width: 800px;
background: var(--bg-panel);
border: 1px solid var(--border-color);
border-radius: 8px;
padding: 30px;
}
.help-content h2 {
color: var(--accent-color);
margin-bottom: 15px;
}
.help-content h3 {
margin-top: 20px;
margin-bottom: 10px;
}
.help-content ul, .help-content ol {
margin-left: 20px;
margin-bottom: 15px;
}
.help-content li {
margin-bottom: 8px;
}
.help-content a {
color: var(--accent-color);
text-decoration: none;
}
.help-content a:hover {
text-decoration: underline;
}
.help-links {
margin-top: 30px;
padding-top: 20px;
border-top: 1px solid var(--border-color);
}
.help-links a {
display: inline-block;
padding: 10px 20px;
background: var(--accent-color);
color: white;
border-radius: 4px;
margin-right: 10px;
}
/* Games to Watch Styles */
.help-text {
color: var(--text-secondary);
font-size: 14px;
margin-bottom: 15px;
}
.games-filter {
margin-bottom: 20px;
}
.games-filter input {
width: 100%;
padding: 10px;
border: 1px solid var(--border-color);
border-radius: 4px;
background: var(--bg-secondary);
color: var(--text-primary);
font-size: 14px;
margin-bottom: 10px;
}
.filter-actions {
display: flex;
gap: 10px;
}
.small-btn {
padding: 8px 16px;
background: var(--bg-secondary);
border: 1px solid var(--border-color);
border-radius: 4px;
cursor: pointer;
font-size: 13px;
color: var(--text-primary);
transition: all 0.2s;
}
.small-btn:hover {
background: var(--accent-color);
color: white;
border-color: var(--accent-color);
}
.games-container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
margin-top: 20px;
}
.selected-games, .available-games {
border: 1px solid var(--border-color);
border-radius: 8px;
padding: 15px;
background: var(--bg-secondary);
}
.selected-games h3, .available-games h3 {
font-size: 14px;
margin-bottom: 15px;
color: var(--text-secondary);
}
/* Sortable list for selected games */
.sortable-list {
min-height: 200px;
max-height: 400px;
overflow-y: auto;
}
.sortable-item {
display: flex;
align-items: center;
gap: 10px;
padding: 10px;
margin-bottom: 8px;
background: var(--bg-panel);
border: 2px solid var(--border-color);
border-radius: 6px;
cursor: move;
transition: all 0.2s;
user-select: none;
}
.sortable-item:hover {
border-color: var(--accent-color);
background: rgba(145, 70, 255, 0.1);
}
.sortable-item.dragging {
opacity: 0.5;
transform: scale(0.95);
}
.drag-handle {
font-size: 18px;
color: var(--text-secondary);
cursor: grab;
}
.drag-handle:active {
cursor: grabbing;
}
.priority-number {
display: inline-flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
background: var(--accent-color);
color: white;
border-radius: 50%;
font-size: 12px;
font-weight: bold;
}
.game-name {
flex: 1;
font-weight: 500;
}
.remove-btn {
padding: 4px 8px;
background: var(--error-color);
color: white;
border: none;
border-radius: 3px;
cursor: pointer;
font-size: 14px;
font-weight: bold;
opacity: 0.8;
transition: opacity 0.2s;
}
.remove-btn:hover {
opacity: 1;
}
/* Checkbox list for available games */
.checkbox-list {
max-height: 400px;
overflow-y: auto;
}
.game-checkbox {
display: flex;
align-items: center;
padding: 8px;
margin-bottom: 5px;
background: var(--bg-panel);
border-radius: 4px;
cursor: pointer;
transition: background 0.2s;
}
.game-checkbox:hover {
background: rgba(145, 70, 255, 0.1);
}
.game-checkbox input[type="checkbox"] {
margin-right: 10px;
cursor: pointer;
}
.game-checkbox span {
user-select: none;
}
/* Loading Overlay */
.loading-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.7);
display: flex;
align-items: center;
justify-content: center;
z-index: 9999;
}
.loading-content {
background: var(--bg-panel);
border-radius: 12px;
padding: 40px;
text-align: center;
box-shadow: 0 8px 32px rgba(0,0,0,0.3);
}
.loading-spinner {
width: 50px;
height: 50px;
margin: 0 auto 20px;
border: 4px solid var(--border-color);
border-top-color: var(--accent-color);
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
#loading-message {
font-size: 16px;
color: var(--text-primary);
margin-top: 10px;
}
/* Manual Mode Styles */
.mode-badge {
display: inline-block;
padding: 4px 12px;
border-radius: 12px;
font-size: 11px;
font-weight: bold;
letter-spacing: 0.5px;
margin-left: 10px;
transition: all 0.3s ease;
}
#auto-mode-badge {
background: rgba(145, 70, 255, 0.15);
color: var(--accent-color);
border: 1px solid var(--accent-color);
}
#manual-mode-badge {
background: rgba(255, 167, 38, 0.15);
color: var(--warning-color);
border: 1px solid var(--warning-color);
animation: pulse 2s ease-in-out infinite;
}
@keyframes pulse {
0%, 100% {
transform: scale(1);
opacity: 1;
}
50% {
transform: scale(1.05);
opacity: 0.9;
}
}
.manual-mode-controls {
background: rgba(255, 167, 38, 0.1);
border: 2px solid var(--warning-color);
border-radius: 8px;
padding: 12px;
margin-bottom: 15px;
display: flex;
justify-content: space-between;
align-items: center;
gap: 15px;
}
.manual-mode-info {
color: var(--text-primary);
font-size: 14px;
}
.manual-mode-info strong {
color: var(--warning-color);
}
.exit-manual-btn {
padding: 8px 16px;
background: var(--bg-panel);
color: var(--text-primary);
border: 1px solid var(--border-color);
border-radius: 6px;
cursor: pointer;
font-size: 13px;
font-weight: 500;
transition: all 0.2s;
white-space: nowrap;
}
.exit-manual-btn:hover {
background: var(--accent-color);
color: white;
border-color: var(--accent-color);
transform: translateY(-1px);
box-shadow: 0 2px 8px rgba(145, 70, 255, 0.3);
}
/* Utilities */
.hidden {
display: none !important;
}
.empty-message {
text-align: center;
color: var(--text-secondary);
padding: 40px;
}
/* Responsive */
@media (max-width: 1024px) {
.main-grid {
grid-template-columns: 1fr;
grid-template-rows: auto;
}
.login-panel, .progress-panel, .console-panel, .channels-panel {
grid-column: 1;
grid-row: auto;
}
.inventory-grid {
grid-template-columns: 1fr;
}
}