mirror of
https://github.com/mwisnowski/mtg_python_deckbuilder.git
synced 2025-12-18 00:20:13 +01:00
feat(card-browser): advanced filters, keyboard shortcuts, and responsive design
This commit is contained in:
parent
e0fe8a36e6
commit
a8dc1835eb
12 changed files with 2591 additions and 8 deletions
|
|
@ -727,3 +727,339 @@ img.lqip.loaded { filter: blur(0); opacity: 1; }
|
|||
border: 1px solid var(--border);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
/* ========================================
|
||||
Card Browser Styles
|
||||
======================================== */
|
||||
|
||||
/* Card browser container */
|
||||
.card-browser-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
/* Filter panel */
|
||||
.card-browser-filters {
|
||||
background: var(--panel);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 8px;
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.filter-section {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.75rem;
|
||||
}
|
||||
|
||||
.filter-row {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.5rem;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.filter-row label {
|
||||
font-weight: 600;
|
||||
min-width: 80px;
|
||||
color: var(--text);
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
|
||||
.filter-row select,
|
||||
.filter-row input[type="text"],
|
||||
.filter-row input[type="search"] {
|
||||
flex: 1;
|
||||
min-width: 150px;
|
||||
max-width: 300px;
|
||||
}
|
||||
|
||||
/* Search bar styling */
|
||||
.card-search-wrapper {
|
||||
position: relative;
|
||||
flex: 1;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.card-search-wrapper input[type="search"] {
|
||||
width: 100%;
|
||||
padding: 0.5rem 0.75rem;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
/* Results count and info bar */
|
||||
.card-browser-info {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.5rem;
|
||||
padding: 0.5rem 0;
|
||||
}
|
||||
|
||||
.results-count {
|
||||
font-size: 0.95rem;
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
.page-indicator {
|
||||
font-size: 0.95rem;
|
||||
color: var(--text);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
/* Card browser grid */
|
||||
.card-browser-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(240px, 240px));
|
||||
gap: 0.5rem;
|
||||
padding: 0.5rem;
|
||||
background: var(--panel);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 8px;
|
||||
min-height: 480px;
|
||||
justify-content: start;
|
||||
}
|
||||
|
||||
/* Individual card tile in browser */
|
||||
.card-browser-tile {
|
||||
break-inside: avoid;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background: var(--card-bg, #1a1d24);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.card-browser-tile:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
|
||||
border-color: color-mix(in srgb, var(--border) 50%, var(--ring) 50%);
|
||||
}
|
||||
|
||||
.card-browser-tile-image {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
aspect-ratio: 488/680;
|
||||
overflow: hidden;
|
||||
background: #0a0b0e;
|
||||
}
|
||||
|
||||
.card-browser-tile-image img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: contain;
|
||||
transition: transform 0.3s ease;
|
||||
}
|
||||
|
||||
.card-browser-tile:hover .card-browser-tile-image img {
|
||||
transform: scale(1.05);
|
||||
}
|
||||
|
||||
.card-browser-tile-info {
|
||||
padding: 0.75rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.card-browser-tile-name {
|
||||
font-weight: 600;
|
||||
font-size: 0.95rem;
|
||||
word-wrap: break-word;
|
||||
overflow-wrap: break-word;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.card-browser-tile-type {
|
||||
font-size: 0.85rem;
|
||||
color: var(--muted);
|
||||
word-wrap: break-word;
|
||||
overflow-wrap: break-word;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.card-browser-tile-stats {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
|
||||
.card-browser-tile-tags {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.25rem;
|
||||
margin-top: 0.25rem;
|
||||
}
|
||||
|
||||
.card-browser-tile-tags .tag {
|
||||
font-size: 0.7rem;
|
||||
padding: 0.15rem 0.4rem;
|
||||
background: rgba(148, 163, 184, 0.15);
|
||||
color: var(--muted);
|
||||
border-radius: 3px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* Pagination controls */
|
||||
.card-browser-pagination {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
padding: 1rem 0;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.card-browser-pagination .btn {
|
||||
min-width: 120px;
|
||||
}
|
||||
|
||||
.card-browser-pagination .page-info {
|
||||
font-size: 0.95rem;
|
||||
color: var(--text);
|
||||
padding: 0 1rem;
|
||||
}
|
||||
|
||||
/* No results message */
|
||||
.no-results {
|
||||
text-align: center;
|
||||
padding: 3rem 1rem;
|
||||
background: var(--panel);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.no-results-title {
|
||||
font-size: 1.25rem;
|
||||
font-weight: 600;
|
||||
color: var(--text);
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.no-results-message {
|
||||
color: var(--muted);
|
||||
margin-bottom: 1rem;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.no-results-filters {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.5rem;
|
||||
justify-content: center;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.no-results-filter-tag {
|
||||
padding: 0.25rem 0.75rem;
|
||||
background: rgba(148, 163, 184, 0.15);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 6px;
|
||||
font-size: 0.9rem;
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
/* Loading indicator */
|
||||
.card-browser-loading {
|
||||
text-align: center;
|
||||
padding: 2rem;
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
/* Responsive adjustments */
|
||||
/* Large tablets and below - reduce to ~180px cards */
|
||||
@media (max-width: 1024px) {
|
||||
.card-browser-grid {
|
||||
grid-template-columns: repeat(auto-fill, minmax(200px, 200px));
|
||||
}
|
||||
}
|
||||
|
||||
/* Tablets - reduce to ~160px cards */
|
||||
@media (max-width: 768px) {
|
||||
.card-browser-grid {
|
||||
grid-template-columns: repeat(auto-fill, minmax(180px, 180px));
|
||||
gap: 0.5rem;
|
||||
padding: 0.5rem;
|
||||
}
|
||||
|
||||
.filter-row {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.filter-row label {
|
||||
min-width: auto;
|
||||
}
|
||||
|
||||
.filter-row select,
|
||||
.filter-row input {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.card-browser-info {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
}
|
||||
}
|
||||
|
||||
/* Small tablets/large phones - reduce to ~140px cards */
|
||||
@media (max-width: 600px) {
|
||||
.card-browser-grid {
|
||||
grid-template-columns: repeat(auto-fill, minmax(160px, 160px));
|
||||
gap: 0.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
/* Phones - 2 column layout with flexible width */
|
||||
@media (max-width: 480px) {
|
||||
.card-browser-grid {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 0.375rem;
|
||||
}
|
||||
|
||||
.card-browser-tile-name {
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
|
||||
.card-browser-tile-type {
|
||||
font-size: 0.75rem;
|
||||
}
|
||||
|
||||
.card-browser-tile-info {
|
||||
padding: 0.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
/* Theme chips for multi-select */
|
||||
.theme-chip {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
background: var(--primary-bg);
|
||||
color: var(--primary-fg);
|
||||
padding: 0.25rem 0.75rem;
|
||||
border-radius: 1rem;
|
||||
font-size: 0.9rem;
|
||||
border: 1px solid var(--border-color);
|
||||
}
|
||||
|
||||
.theme-chip button {
|
||||
margin-left: 0.5rem;
|
||||
background: none;
|
||||
border: none;
|
||||
color: inherit;
|
||||
cursor: pointer;
|
||||
padding: 0;
|
||||
font-weight: bold;
|
||||
font-size: 1.2rem;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.theme-chip button:hover {
|
||||
color: var(--error-color);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue