Skip to content
Draft
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
1,608 changes: 1,500 additions & 108 deletions package-lock.json

Large diffs are not rendered by default.

10 changes: 8 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
"build": "tsc && vite build",
"preview": "vite preview",
"type-check": "tsc --noEmit",
"generate-manifest": "node scripts/generate-manifest.js"
"generate-manifest": "node scripts/generate-manifest.js",
"test": "vitest run",
"test:watch": "vitest",
"test:coverage": "vitest run --coverage"
},
"dependencies": {
"react": "^19.0.0",
Expand All @@ -19,8 +22,11 @@
"@types/react": "^19.0.10",
"@types/react-dom": "^19.0.10",
"@vitejs/plugin-react": "^4.3.4",
"@vitest/coverage-v8": "^3.2.4",
"happy-dom": "^20.8.3",
"typescript": "^5.8.3",
"vite": "^6.0.11",
"vite-plugin-static-copy": "^2.1.0"
"vite-plugin-static-copy": "^2.1.0",
"vitest": "^3.2.4"
}
}
315 changes: 314 additions & 1 deletion src/popup/popup.css
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,17 @@
margin-top: 2px;
}

.header-actions {
display: flex;
align-items: center;
gap: 12px;
}

.header-buttons {
display: flex;
gap: 8px;
}

.icon-button {
background: rgba(255, 255, 255, 0.2);
border: none;
Expand Down Expand Up @@ -73,6 +84,56 @@
border-bottom: 1px solid #e0e0e0;
}

.capture-mode-toggle {
display: flex;
gap: 4px;
margin-bottom: 12px;
background: rgba(0, 0, 0, 0.1);
border-radius: 8px;
padding: 4px;
}

.mode-button {
flex: 1;
padding: 8px 12px;
border: none;
border-radius: 6px;
cursor: pointer;
font-size: 12px;
font-weight: 500;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
background: transparent;
color: #666;
box-shadow: none;
transition: all 0.2s ease;
}

.mode-button.active {
background: white;
color: #1a1a1a;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}

.capture-button-content {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
}

.spinner-small {
display: inline-block;
width: 16px;
height: 16px;
border: 2px solid rgba(255, 255, 255, 0.3);
border-top: 2px solid white;
border-radius: 50%;
animation: spin 1s linear infinite;
}

.capture-button {
width: 100%;
padding: 14px;
Expand Down Expand Up @@ -221,6 +282,12 @@
text-overflow: ellipsis;
}

.asset-website-row {
display: flex;
align-items: center;
gap: 3px;
}

.asset-status {
font-size: 9px;
color: white;
Expand All @@ -230,6 +297,20 @@
text-transform: uppercase;
cursor: pointer;
transition: opacity 0.2s;
display: flex;
align-items: center;
gap: 4px;
}

.asset-status-col {
display: flex;
flex-direction: column;
gap: 4px;
}

.hunt-share-buttons {
display: flex;
gap: 4px;
}

.asset-status:hover {
Expand All @@ -254,12 +335,14 @@
right: 0;
height: 3px;
background: rgba(0, 0, 0, 0.3);
overflow: hidden;
}

.upload-progress-bar {
height: 100%;
background: linear-gradient(90deg, #EC4899 0%, #3B82F6 100%);
transition: width 0.3s ease;
animation: indeterminate-progress 1.4s ease-in-out infinite;
width: 40%;
}

.footer {
Expand Down Expand Up @@ -604,6 +687,226 @@
opacity: 0.9;
}

/* Show More Button */
.show-more-button {
width: 100%;
margin-top: 12px;
padding: 8px;
background: transparent;
border: 1px solid #e0e0e0;
border-radius: 8px;
color: #666;
font-size: 13px;
cursor: pointer;
transition: background 0.2s, border-color 0.2s;
}

.show-more-button:hover {
background: #f0f0f0;
border-color: #bbb;
}

/* Error Toast */
.error-toast {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
padding: 10px 14px;
background: #FEE2E2;
border-left: 4px solid #EF4444;
color: #991B1B;
font-size: 13px;
}

.error-toast-message {
flex: 1;
}

.error-toast-close {
background: transparent;
border: none;
color: #991B1B;
font-size: 16px;
line-height: 1;
cursor: pointer;
padding: 2px 4px;
border-radius: 4px;
transition: background 0.2s;
}

.error-toast-close:hover {
background: rgba(0, 0, 0, 0.1);
}

/* Confirm Dialog */
.confirm-dialog {
border-top: 4px solid #EF4444;
}

.confirm-dialog-confirm {
background: #EF4444 !important;
}

.confirm-dialog-confirm:hover {
background: #DC2626 !important;
}

/* Share Prompt Modal */
.share-modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.6);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
padding: 20px;
}

.share-modal {
background: white;
border-radius: 16px;
padding: 24px;
max-width: 300px;
width: 100%;
text-align: center;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
}

.share-modal-emoji {
font-size: 48px;
margin-bottom: 16px;
}

.share-modal-title {
margin: 0 0 8px 0;
font-size: 18px;
font-weight: 600;
color: #1d1d1f;
}

.share-modal-description {
margin: 0 0 20px 0;
font-size: 14px;
color: #86868b;
line-height: 1.5;
}

.share-modal-preview {
margin-bottom: 16px;
border-radius: 8px;
overflow: hidden;
border: 1px solid #e5e5e7;
}

.share-modal-preview img {
width: 100%;
height: 80px;
object-fit: cover;
}

.share-modal-actions {
display: flex;
flex-direction: column;
gap: 10px;
}

.share-modal-btn-x {
width: 100%;
padding: 12px 16px;
border: none;
border-radius: 8px;
background: #000;
color: #fff;
font-size: 14px;
font-weight: 600;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
transition: transform 0.2s, box-shadow 0.2s;
}

.share-modal-btn-x:hover {
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}

.share-modal-btn-copy {
width: 100%;
padding: 12px 16px;
border: 1px solid #d2d2d7;
border-radius: 8px;
background: #fff;
color: #1d1d1f;
font-size: 14px;
font-weight: 500;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
transition: background 0.2s;
}

.share-modal-btn-copy:hover {
background: #f5f5f7;
}

.share-modal-btn-dismiss {
width: 100%;
padding: 10px;
border: none;
border-radius: 8px;
background: transparent;
color: #86868b;
font-size: 13px;
cursor: pointer;
transition: color 0.2s;
}

.share-modal-btn-dismiss:hover {
color: #1d1d1f;
}

/* Hunt Mode share buttons inside asset thumbnails */
.share-btn {
padding: 4px 6px;
border: none;
border-radius: 4px;
font-size: 10px;
font-weight: 500;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
}

.share-x {
flex: 1;
background: #000;
color: #fff;
gap: 3px;
}

.share-x:hover {
background: #333;
}

.share-copy {
background: #e5e5e7;
color: #1d1d1f;
}

.share-copy:hover {
background: #d0d0d3;
}

/* Animations */
@keyframes spin {
from {
Expand All @@ -613,4 +916,14 @@
to {
transform: rotate(360deg);
}
}

@keyframes indeterminate-progress {
0% {
transform: translateX(-100%);
}

100% {
transform: translateX(350%);
}
}
Loading