deckhearth/components/BulkSelectionToolbar.js

195 lines
8.3 KiB
JavaScript
Raw Normal View History

import { useState } from 'react';
import { VOCAB } from '../lib/collection-vocabulary.js';
export default function BulkSelectionToolbar({
selectedCards,
onClearSelection,
onAddToCollection,
onAddToDeck,
onMarkAsOwned,
onRemoveFromOwned,
onBulkFavorite,
onBulkDelete
}) {
const [showActions, setShowActions] = useState(false);
const selectedCount = selectedCards.length;
if (selectedCount === 0) return null;
const handleAddToCollection = () => {
onAddToCollection(selectedCards);
};
const handleAddToDeck = () => {
onAddToDeck(selectedCards);
};
const handleMarkAsOwned = () => {
onMarkAsOwned(selectedCards);
};
const handleRemoveFromOwned = () => {
onRemoveFromOwned(selectedCards);
};
const handleBulkFavorite = () => {
onBulkFavorite(selectedCards);
};
const handleBulkDelete = () => {
if (confirm(`Are you sure you want to delete ${selectedCount} selected cards?`)) {
onBulkDelete(selectedCards);
}
};
return (
📱 Implement Mobile-First Responsive Design 🎯 Mobile Slide-In Navigation: - Added mobile menu button with hamburger icon - Implemented slide-in sidebar with smooth transitions - Added mobile overlay with click-to-close functionality - Mobile menu auto-closes when navigating to new pages - Proper z-index layering for mobile interactions 🃏 Smart Card Panel Positioning: - Panels now open on opposite side for right-edge cards - Added cardIndex and cardsPerRow props to CardItem - Dynamic positioning based on card's position in grid - Prevents panels from extending off-screen edges - Maintains hover functionality on desktop 📱 Mobile-Optimized Bulk Actions: - Toolbar now spans full width on mobile devices - Icon-only buttons on mobile, full labels on desktop - Responsive spacing and padding adjustments - Improved touch targets for mobile interaction - Maintains functionality across all screen sizes 🎨 Enhanced Grid Layout: - Improved mobile grid: 2 columns with tighter spacing - Better space utilization on all device sizes - Responsive gap spacing that adapts to screen size - Optimized padding for mobile vs desktop - Cards now fill available space properly ✅ Cross-Device Experience: - Mobile: Slide-in nav, icon-only actions, 2-column grid - Tablet: Responsive layout with appropriate spacing - Desktop: Full sidebar, labeled actions, hover panels - Large screens: Maximum columns with side panel space The app now provides an optimal mobile experience while maintaining desktop functionality! ��💻🖥️
2025-07-26 01:49:42 -04:00
<div className="fixed bottom-4 left-4 right-4 sm:bottom-6 sm:left-1/2 sm:right-auto sm:transform sm:-translate-x-1/2 z-50">
refactor(bulk-toolbar): migrate to .glass-panel-strong + token sweep Brief 4 of unify-glass-panel-surfaces convoy. The bulk-select toolbar was a critical dark-mode bug (bg-white invisible against dark backgrounds); migrating to .glass-panel-strong is both a unification win and a correctness fix. Outer toolbar: - Replaces `bg-white rounded-xl shadow-2xl border border-gray-200` with `glass-panel-strong rounded-2xl`. - Inline boxShadow override: `var(--rim-light-inner), var(--elevation-pronounced)` — keeps the toolbar reading as elevated over arbitrary page content (matches the design audit's "floating chrome" elevation tier). More-actions dropdown: - Replaces `absolute bottom-full right-0 mb-2 bg-white rounded-lg shadow-xl border border-gray-200` with `glass-panel-strong absolute bottom-full right-0 mb-2 rounded-xl`. Class's default rim+ambient stack is the right weight here. Interior token sweep (per Brief 4 acceptance criteria): - text-gray-700 → style={{ color: 'var(--text-primary)' }} - text-gray-{400,600} on the action triggers → style={{ color: 'var(--text-secondary)' }} - hover:text-gray-{600,800} + hover:bg-gray-{50,100} → nav-item-hover - text-red-600 hover:bg-red-50 → style={{ color: 'rgb(239, 68, 68)' }} + nav-item-hover. (--accent-danger token does not exist yet; brief pre-authorized this fallback. A future design-system PR can introduce the token and swap the literal.) - bg-gray-300 divider → style={{ backgroundColor: 'var(--border)' }} - border-gray-200 menu separator → style={{ borderColor: 'var(--border)' }} - rounded-lg → rounded-xl on action triggers (Brief 4 + convoy-wide consistency). UNCHANGED per brief scope: - The 3 quick-action buttons (Collection / Deck / My Collection) — they already use --accent-flame / --accent-gold / --accent-wood and the onMouseEnter/Leave swap pattern. Touching them is scope expansion. Verification: - rg "text-gray-|bg-gray-|hover:bg-gray-|text-red-|hover:bg-red-| border-gray-" components/BulkSelectionToolbar.js → 0 matches. - npm run lint passes (1 pre-existing unrelated warning). - npm run test:run: 116/116 tests pass (no test changes needed for a pure className/style swap per Brief 4 § Test Plan). Acceptance criteria from .convoys/unify-glass-panel-surfaces/brief-4-bulk-selection-toolbar.md all met. No edits outside components/BulkSelectionToolbar.js. Dark-mode QA reminder for reviewers: before this change, the toolbar was bg-white — invisible against the dark theme. Verify in BOTH themes before merge; before/after dark-mode screenshot attached to PR description. Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-04 16:37:58 -04:00
<div
className="glass-panel-strong rounded-2xl px-3 sm:px-6 py-3 sm:py-4 flex items-center justify-between sm:justify-start sm:space-x-4 sm:min-w-96"
style={{
boxShadow:
'var(--rim-light-inner), var(--elevation-pronounced)',
}}
>
{/* Selection Count */}
<div className="flex items-center space-x-2">
🔥 Transform to Deck Hearth Fire-Inspired Design 🎨 Complete Brand Transformation: - Rebranded from 'TCG Vault' to 'Deck Hearth' - Updated logo initials from 'TCG' to 'DH' - Changed app name throughout the application 🔥 Fire-Themed Color Palette: Light Theme (Warm Daylight by the Hearth): - Primary: Warm cream (#fefcf8) like sunlit stone - Secondary: Soft beige (#f7f3ed) like aged parchment - Tertiary: Light wood tone (#f0e6d6) - Text: Dark chocolate brown (#2d1810) - Accents: Ember orange, flame orange, golden yellow Dark Theme (Cozy Evening by the Fire): - Primary: Deep charcoal (#1a0f0a) like burnt wood - Secondary: Rich dark brown (#2d1b12) like oak - Tertiary: Medium brown (#3d2317) like mahogany - Text: Warm white (#fff8f0) like firelight - Accents: Bright flame, glowing ember, golden glow 🎨 Fire-Inspired Design Elements: - Flame gradient: Orange to ember red - Golden gradient: Golden yellow to flame orange - Fire glow effects with warm shadows - Wood-toned borders and accents - Ember and flame-colored interactive elements 🔧 Enhanced Component Styling: - Updated BulkSelectionToolbar with fire colors - New CSS classes: btn-flame, btn-ember, btn-gold - Fire glow and ember glow effects - Gradient backgrounds: gradient-bg-fire, gradient-bg-golden - Tailwind color palette: hearth.flame, hearth.ember, etc. ✨ Warm & Inviting Experience: - Light mode: Cozy daytime fireplace atmosphere - Dark mode: Intimate evening hearth ambiance - Maintains accessibility with proper contrast - Smooth transitions between themes The app now perfectly captures the warm, inviting feeling of gathering around a hearth! 🔥🏠✨
2025-07-26 09:30:07 -04:00
<div className="w-8 h-8 rounded-full flex items-center justify-center" style={{ backgroundColor: 'var(--accent-ember)' }}>
<span className="text-white text-sm font-bold">{selectedCount}</span>
</div>
refactor(bulk-toolbar): migrate to .glass-panel-strong + token sweep Brief 4 of unify-glass-panel-surfaces convoy. The bulk-select toolbar was a critical dark-mode bug (bg-white invisible against dark backgrounds); migrating to .glass-panel-strong is both a unification win and a correctness fix. Outer toolbar: - Replaces `bg-white rounded-xl shadow-2xl border border-gray-200` with `glass-panel-strong rounded-2xl`. - Inline boxShadow override: `var(--rim-light-inner), var(--elevation-pronounced)` — keeps the toolbar reading as elevated over arbitrary page content (matches the design audit's "floating chrome" elevation tier). More-actions dropdown: - Replaces `absolute bottom-full right-0 mb-2 bg-white rounded-lg shadow-xl border border-gray-200` with `glass-panel-strong absolute bottom-full right-0 mb-2 rounded-xl`. Class's default rim+ambient stack is the right weight here. Interior token sweep (per Brief 4 acceptance criteria): - text-gray-700 → style={{ color: 'var(--text-primary)' }} - text-gray-{400,600} on the action triggers → style={{ color: 'var(--text-secondary)' }} - hover:text-gray-{600,800} + hover:bg-gray-{50,100} → nav-item-hover - text-red-600 hover:bg-red-50 → style={{ color: 'rgb(239, 68, 68)' }} + nav-item-hover. (--accent-danger token does not exist yet; brief pre-authorized this fallback. A future design-system PR can introduce the token and swap the literal.) - bg-gray-300 divider → style={{ backgroundColor: 'var(--border)' }} - border-gray-200 menu separator → style={{ borderColor: 'var(--border)' }} - rounded-lg → rounded-xl on action triggers (Brief 4 + convoy-wide consistency). UNCHANGED per brief scope: - The 3 quick-action buttons (Collection / Deck / My Collection) — they already use --accent-flame / --accent-gold / --accent-wood and the onMouseEnter/Leave swap pattern. Touching them is scope expansion. Verification: - rg "text-gray-|bg-gray-|hover:bg-gray-|text-red-|hover:bg-red-| border-gray-" components/BulkSelectionToolbar.js → 0 matches. - npm run lint passes (1 pre-existing unrelated warning). - npm run test:run: 116/116 tests pass (no test changes needed for a pure className/style swap per Brief 4 § Test Plan). Acceptance criteria from .convoys/unify-glass-panel-surfaces/brief-4-bulk-selection-toolbar.md all met. No edits outside components/BulkSelectionToolbar.js. Dark-mode QA reminder for reviewers: before this change, the toolbar was bg-white — invisible against the dark theme. Verify in BOTH themes before merge; before/after dark-mode screenshot attached to PR description. Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-04 16:37:58 -04:00
<span
className="font-medium text-sm sm:text-base"
style={{ color: 'var(--text-primary)' }}
>
📱 Implement Mobile-First Responsive Design 🎯 Mobile Slide-In Navigation: - Added mobile menu button with hamburger icon - Implemented slide-in sidebar with smooth transitions - Added mobile overlay with click-to-close functionality - Mobile menu auto-closes when navigating to new pages - Proper z-index layering for mobile interactions 🃏 Smart Card Panel Positioning: - Panels now open on opposite side for right-edge cards - Added cardIndex and cardsPerRow props to CardItem - Dynamic positioning based on card's position in grid - Prevents panels from extending off-screen edges - Maintains hover functionality on desktop 📱 Mobile-Optimized Bulk Actions: - Toolbar now spans full width on mobile devices - Icon-only buttons on mobile, full labels on desktop - Responsive spacing and padding adjustments - Improved touch targets for mobile interaction - Maintains functionality across all screen sizes 🎨 Enhanced Grid Layout: - Improved mobile grid: 2 columns with tighter spacing - Better space utilization on all device sizes - Responsive gap spacing that adapts to screen size - Optimized padding for mobile vs desktop - Cards now fill available space properly ✅ Cross-Device Experience: - Mobile: Slide-in nav, icon-only actions, 2-column grid - Tablet: Responsive layout with appropriate spacing - Desktop: Full sidebar, labeled actions, hover panels - Large screens: Maximum columns with side panel space The app now provides an optimal mobile experience while maintaining desktop functionality! ��💻🖥️
2025-07-26 01:49:42 -04:00
<span className="hidden sm:inline">{selectedCount} card{selectedCount !== 1 ? 's' : ''} selected</span>
<span className="sm:hidden">{selectedCount}</span>
</span>
</div>
📱 Implement Mobile-First Responsive Design 🎯 Mobile Slide-In Navigation: - Added mobile menu button with hamburger icon - Implemented slide-in sidebar with smooth transitions - Added mobile overlay with click-to-close functionality - Mobile menu auto-closes when navigating to new pages - Proper z-index layering for mobile interactions 🃏 Smart Card Panel Positioning: - Panels now open on opposite side for right-edge cards - Added cardIndex and cardsPerRow props to CardItem - Dynamic positioning based on card's position in grid - Prevents panels from extending off-screen edges - Maintains hover functionality on desktop 📱 Mobile-Optimized Bulk Actions: - Toolbar now spans full width on mobile devices - Icon-only buttons on mobile, full labels on desktop - Responsive spacing and padding adjustments - Improved touch targets for mobile interaction - Maintains functionality across all screen sizes 🎨 Enhanced Grid Layout: - Improved mobile grid: 2 columns with tighter spacing - Better space utilization on all device sizes - Responsive gap spacing that adapts to screen size - Optimized padding for mobile vs desktop - Cards now fill available space properly ✅ Cross-Device Experience: - Mobile: Slide-in nav, icon-only actions, 2-column grid - Tablet: Responsive layout with appropriate spacing - Desktop: Full sidebar, labeled actions, hover panels - Large screens: Maximum columns with side panel space The app now provides an optimal mobile experience while maintaining desktop functionality! ��💻🖥️
2025-07-26 01:49:42 -04:00
{/* Divider - Hidden on mobile */}
refactor(bulk-toolbar): migrate to .glass-panel-strong + token sweep Brief 4 of unify-glass-panel-surfaces convoy. The bulk-select toolbar was a critical dark-mode bug (bg-white invisible against dark backgrounds); migrating to .glass-panel-strong is both a unification win and a correctness fix. Outer toolbar: - Replaces `bg-white rounded-xl shadow-2xl border border-gray-200` with `glass-panel-strong rounded-2xl`. - Inline boxShadow override: `var(--rim-light-inner), var(--elevation-pronounced)` — keeps the toolbar reading as elevated over arbitrary page content (matches the design audit's "floating chrome" elevation tier). More-actions dropdown: - Replaces `absolute bottom-full right-0 mb-2 bg-white rounded-lg shadow-xl border border-gray-200` with `glass-panel-strong absolute bottom-full right-0 mb-2 rounded-xl`. Class's default rim+ambient stack is the right weight here. Interior token sweep (per Brief 4 acceptance criteria): - text-gray-700 → style={{ color: 'var(--text-primary)' }} - text-gray-{400,600} on the action triggers → style={{ color: 'var(--text-secondary)' }} - hover:text-gray-{600,800} + hover:bg-gray-{50,100} → nav-item-hover - text-red-600 hover:bg-red-50 → style={{ color: 'rgb(239, 68, 68)' }} + nav-item-hover. (--accent-danger token does not exist yet; brief pre-authorized this fallback. A future design-system PR can introduce the token and swap the literal.) - bg-gray-300 divider → style={{ backgroundColor: 'var(--border)' }} - border-gray-200 menu separator → style={{ borderColor: 'var(--border)' }} - rounded-lg → rounded-xl on action triggers (Brief 4 + convoy-wide consistency). UNCHANGED per brief scope: - The 3 quick-action buttons (Collection / Deck / My Collection) — they already use --accent-flame / --accent-gold / --accent-wood and the onMouseEnter/Leave swap pattern. Touching them is scope expansion. Verification: - rg "text-gray-|bg-gray-|hover:bg-gray-|text-red-|hover:bg-red-| border-gray-" components/BulkSelectionToolbar.js → 0 matches. - npm run lint passes (1 pre-existing unrelated warning). - npm run test:run: 116/116 tests pass (no test changes needed for a pure className/style swap per Brief 4 § Test Plan). Acceptance criteria from .convoys/unify-glass-panel-surfaces/brief-4-bulk-selection-toolbar.md all met. No edits outside components/BulkSelectionToolbar.js. Dark-mode QA reminder for reviewers: before this change, the toolbar was bg-white — invisible against the dark theme. Verify in BOTH themes before merge; before/after dark-mode screenshot attached to PR description. Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-04 16:37:58 -04:00
<div
className="hidden sm:block h-6 w-px"
style={{ backgroundColor: 'var(--border)' }}
></div>
{/* Quick Actions */}
📱 Implement Mobile-First Responsive Design 🎯 Mobile Slide-In Navigation: - Added mobile menu button with hamburger icon - Implemented slide-in sidebar with smooth transitions - Added mobile overlay with click-to-close functionality - Mobile menu auto-closes when navigating to new pages - Proper z-index layering for mobile interactions 🃏 Smart Card Panel Positioning: - Panels now open on opposite side for right-edge cards - Added cardIndex and cardsPerRow props to CardItem - Dynamic positioning based on card's position in grid - Prevents panels from extending off-screen edges - Maintains hover functionality on desktop 📱 Mobile-Optimized Bulk Actions: - Toolbar now spans full width on mobile devices - Icon-only buttons on mobile, full labels on desktop - Responsive spacing and padding adjustments - Improved touch targets for mobile interaction - Maintains functionality across all screen sizes 🎨 Enhanced Grid Layout: - Improved mobile grid: 2 columns with tighter spacing - Better space utilization on all device sizes - Responsive gap spacing that adapts to screen size - Optimized padding for mobile vs desktop - Cards now fill available space properly ✅ Cross-Device Experience: - Mobile: Slide-in nav, icon-only actions, 2-column grid - Tablet: Responsive layout with appropriate spacing - Desktop: Full sidebar, labeled actions, hover panels - Large screens: Maximum columns with side panel space The app now provides an optimal mobile experience while maintaining desktop functionality! ��💻🖥️
2025-07-26 01:49:42 -04:00
<div className="flex items-center space-x-1 sm:space-x-2">
<button
onClick={handleAddToCollection}
🔥 Transform to Deck Hearth Fire-Inspired Design 🎨 Complete Brand Transformation: - Rebranded from 'TCG Vault' to 'Deck Hearth' - Updated logo initials from 'TCG' to 'DH' - Changed app name throughout the application 🔥 Fire-Themed Color Palette: Light Theme (Warm Daylight by the Hearth): - Primary: Warm cream (#fefcf8) like sunlit stone - Secondary: Soft beige (#f7f3ed) like aged parchment - Tertiary: Light wood tone (#f0e6d6) - Text: Dark chocolate brown (#2d1810) - Accents: Ember orange, flame orange, golden yellow Dark Theme (Cozy Evening by the Fire): - Primary: Deep charcoal (#1a0f0a) like burnt wood - Secondary: Rich dark brown (#2d1b12) like oak - Tertiary: Medium brown (#3d2317) like mahogany - Text: Warm white (#fff8f0) like firelight - Accents: Bright flame, glowing ember, golden glow 🎨 Fire-Inspired Design Elements: - Flame gradient: Orange to ember red - Golden gradient: Golden yellow to flame orange - Fire glow effects with warm shadows - Wood-toned borders and accents - Ember and flame-colored interactive elements 🔧 Enhanced Component Styling: - Updated BulkSelectionToolbar with fire colors - New CSS classes: btn-flame, btn-ember, btn-gold - Fire glow and ember glow effects - Gradient backgrounds: gradient-bg-fire, gradient-bg-golden - Tailwind color palette: hearth.flame, hearth.ember, etc. ✨ Warm & Inviting Experience: - Light mode: Cozy daytime fireplace atmosphere - Dark mode: Intimate evening hearth ambiance - Maintains accessibility with proper contrast - Smooth transitions between themes The app now perfectly captures the warm, inviting feeling of gathering around a hearth! 🔥🏠✨
2025-07-26 09:30:07 -04:00
className="px-2 sm:px-3 py-2 text-white rounded-lg text-sm font-medium flex items-center space-x-1 transition-colors"
style={{ backgroundColor: 'var(--accent-flame)' }}
onMouseEnter={(e) => e.target.style.backgroundColor = 'var(--accent-ember)'}
onMouseLeave={(e) => e.target.style.backgroundColor = 'var(--accent-flame)'}
>
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" />
</svg>
📱 Implement Mobile-First Responsive Design 🎯 Mobile Slide-In Navigation: - Added mobile menu button with hamburger icon - Implemented slide-in sidebar with smooth transitions - Added mobile overlay with click-to-close functionality - Mobile menu auto-closes when navigating to new pages - Proper z-index layering for mobile interactions 🃏 Smart Card Panel Positioning: - Panels now open on opposite side for right-edge cards - Added cardIndex and cardsPerRow props to CardItem - Dynamic positioning based on card's position in grid - Prevents panels from extending off-screen edges - Maintains hover functionality on desktop 📱 Mobile-Optimized Bulk Actions: - Toolbar now spans full width on mobile devices - Icon-only buttons on mobile, full labels on desktop - Responsive spacing and padding adjustments - Improved touch targets for mobile interaction - Maintains functionality across all screen sizes 🎨 Enhanced Grid Layout: - Improved mobile grid: 2 columns with tighter spacing - Better space utilization on all device sizes - Responsive gap spacing that adapts to screen size - Optimized padding for mobile vs desktop - Cards now fill available space properly ✅ Cross-Device Experience: - Mobile: Slide-in nav, icon-only actions, 2-column grid - Tablet: Responsive layout with appropriate spacing - Desktop: Full sidebar, labeled actions, hover panels - Large screens: Maximum columns with side panel space The app now provides an optimal mobile experience while maintaining desktop functionality! ��💻🖥️
2025-07-26 01:49:42 -04:00
<span className="hidden sm:inline">Collection</span>
</button>
<button
onClick={handleAddToDeck}
🔥 Transform to Deck Hearth Fire-Inspired Design 🎨 Complete Brand Transformation: - Rebranded from 'TCG Vault' to 'Deck Hearth' - Updated logo initials from 'TCG' to 'DH' - Changed app name throughout the application 🔥 Fire-Themed Color Palette: Light Theme (Warm Daylight by the Hearth): - Primary: Warm cream (#fefcf8) like sunlit stone - Secondary: Soft beige (#f7f3ed) like aged parchment - Tertiary: Light wood tone (#f0e6d6) - Text: Dark chocolate brown (#2d1810) - Accents: Ember orange, flame orange, golden yellow Dark Theme (Cozy Evening by the Fire): - Primary: Deep charcoal (#1a0f0a) like burnt wood - Secondary: Rich dark brown (#2d1b12) like oak - Tertiary: Medium brown (#3d2317) like mahogany - Text: Warm white (#fff8f0) like firelight - Accents: Bright flame, glowing ember, golden glow 🎨 Fire-Inspired Design Elements: - Flame gradient: Orange to ember red - Golden gradient: Golden yellow to flame orange - Fire glow effects with warm shadows - Wood-toned borders and accents - Ember and flame-colored interactive elements 🔧 Enhanced Component Styling: - Updated BulkSelectionToolbar with fire colors - New CSS classes: btn-flame, btn-ember, btn-gold - Fire glow and ember glow effects - Gradient backgrounds: gradient-bg-fire, gradient-bg-golden - Tailwind color palette: hearth.flame, hearth.ember, etc. ✨ Warm & Inviting Experience: - Light mode: Cozy daytime fireplace atmosphere - Dark mode: Intimate evening hearth ambiance - Maintains accessibility with proper contrast - Smooth transitions between themes The app now perfectly captures the warm, inviting feeling of gathering around a hearth! 🔥🏠✨
2025-07-26 09:30:07 -04:00
className="px-2 sm:px-3 py-2 text-white rounded-lg text-sm font-medium flex items-center space-x-1 transition-colors"
style={{ backgroundColor: 'var(--accent-gold)' }}
onMouseEnter={(e) => e.target.style.backgroundColor = '#e6830b'}
onMouseLeave={(e) => e.target.style.backgroundColor = 'var(--accent-gold)'}
>
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" />
</svg>
📱 Implement Mobile-First Responsive Design 🎯 Mobile Slide-In Navigation: - Added mobile menu button with hamburger icon - Implemented slide-in sidebar with smooth transitions - Added mobile overlay with click-to-close functionality - Mobile menu auto-closes when navigating to new pages - Proper z-index layering for mobile interactions 🃏 Smart Card Panel Positioning: - Panels now open on opposite side for right-edge cards - Added cardIndex and cardsPerRow props to CardItem - Dynamic positioning based on card's position in grid - Prevents panels from extending off-screen edges - Maintains hover functionality on desktop 📱 Mobile-Optimized Bulk Actions: - Toolbar now spans full width on mobile devices - Icon-only buttons on mobile, full labels on desktop - Responsive spacing and padding adjustments - Improved touch targets for mobile interaction - Maintains functionality across all screen sizes 🎨 Enhanced Grid Layout: - Improved mobile grid: 2 columns with tighter spacing - Better space utilization on all device sizes - Responsive gap spacing that adapts to screen size - Optimized padding for mobile vs desktop - Cards now fill available space properly ✅ Cross-Device Experience: - Mobile: Slide-in nav, icon-only actions, 2-column grid - Tablet: Responsive layout with appropriate spacing - Desktop: Full sidebar, labeled actions, hover panels - Large screens: Maximum columns with side panel space The app now provides an optimal mobile experience while maintaining desktop functionality! ��💻🖥️
2025-07-26 01:49:42 -04:00
<span className="hidden sm:inline">Deck</span>
</button>
<button
onClick={handleMarkAsOwned}
🔥 Transform to Deck Hearth Fire-Inspired Design 🎨 Complete Brand Transformation: - Rebranded from 'TCG Vault' to 'Deck Hearth' - Updated logo initials from 'TCG' to 'DH' - Changed app name throughout the application 🔥 Fire-Themed Color Palette: Light Theme (Warm Daylight by the Hearth): - Primary: Warm cream (#fefcf8) like sunlit stone - Secondary: Soft beige (#f7f3ed) like aged parchment - Tertiary: Light wood tone (#f0e6d6) - Text: Dark chocolate brown (#2d1810) - Accents: Ember orange, flame orange, golden yellow Dark Theme (Cozy Evening by the Fire): - Primary: Deep charcoal (#1a0f0a) like burnt wood - Secondary: Rich dark brown (#2d1b12) like oak - Tertiary: Medium brown (#3d2317) like mahogany - Text: Warm white (#fff8f0) like firelight - Accents: Bright flame, glowing ember, golden glow 🎨 Fire-Inspired Design Elements: - Flame gradient: Orange to ember red - Golden gradient: Golden yellow to flame orange - Fire glow effects with warm shadows - Wood-toned borders and accents - Ember and flame-colored interactive elements 🔧 Enhanced Component Styling: - Updated BulkSelectionToolbar with fire colors - New CSS classes: btn-flame, btn-ember, btn-gold - Fire glow and ember glow effects - Gradient backgrounds: gradient-bg-fire, gradient-bg-golden - Tailwind color palette: hearth.flame, hearth.ember, etc. ✨ Warm & Inviting Experience: - Light mode: Cozy daytime fireplace atmosphere - Dark mode: Intimate evening hearth ambiance - Maintains accessibility with proper contrast - Smooth transitions between themes The app now perfectly captures the warm, inviting feeling of gathering around a hearth! 🔥🏠✨
2025-07-26 09:30:07 -04:00
className="px-2 sm:px-3 py-2 text-white rounded-lg text-sm font-medium flex items-center space-x-1 transition-colors"
style={{ backgroundColor: 'var(--accent-wood)' }}
onMouseEnter={(e) => e.target.style.backgroundColor = '#6d4c41'}
onMouseLeave={(e) => e.target.style.backgroundColor = 'var(--accent-wood)'}
>
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
</svg>
<span className="hidden sm:inline">{VOCAB.MY_COLLECTION}</span>
</button>
</div>
{/* More Actions Button */}
<div className="relative">
<button
onClick={() => setShowActions(!showActions)}
refactor(bulk-toolbar): migrate to .glass-panel-strong + token sweep Brief 4 of unify-glass-panel-surfaces convoy. The bulk-select toolbar was a critical dark-mode bug (bg-white invisible against dark backgrounds); migrating to .glass-panel-strong is both a unification win and a correctness fix. Outer toolbar: - Replaces `bg-white rounded-xl shadow-2xl border border-gray-200` with `glass-panel-strong rounded-2xl`. - Inline boxShadow override: `var(--rim-light-inner), var(--elevation-pronounced)` — keeps the toolbar reading as elevated over arbitrary page content (matches the design audit's "floating chrome" elevation tier). More-actions dropdown: - Replaces `absolute bottom-full right-0 mb-2 bg-white rounded-lg shadow-xl border border-gray-200` with `glass-panel-strong absolute bottom-full right-0 mb-2 rounded-xl`. Class's default rim+ambient stack is the right weight here. Interior token sweep (per Brief 4 acceptance criteria): - text-gray-700 → style={{ color: 'var(--text-primary)' }} - text-gray-{400,600} on the action triggers → style={{ color: 'var(--text-secondary)' }} - hover:text-gray-{600,800} + hover:bg-gray-{50,100} → nav-item-hover - text-red-600 hover:bg-red-50 → style={{ color: 'rgb(239, 68, 68)' }} + nav-item-hover. (--accent-danger token does not exist yet; brief pre-authorized this fallback. A future design-system PR can introduce the token and swap the literal.) - bg-gray-300 divider → style={{ backgroundColor: 'var(--border)' }} - border-gray-200 menu separator → style={{ borderColor: 'var(--border)' }} - rounded-lg → rounded-xl on action triggers (Brief 4 + convoy-wide consistency). UNCHANGED per brief scope: - The 3 quick-action buttons (Collection / Deck / My Collection) — they already use --accent-flame / --accent-gold / --accent-wood and the onMouseEnter/Leave swap pattern. Touching them is scope expansion. Verification: - rg "text-gray-|bg-gray-|hover:bg-gray-|text-red-|hover:bg-red-| border-gray-" components/BulkSelectionToolbar.js → 0 matches. - npm run lint passes (1 pre-existing unrelated warning). - npm run test:run: 116/116 tests pass (no test changes needed for a pure className/style swap per Brief 4 § Test Plan). Acceptance criteria from .convoys/unify-glass-panel-surfaces/brief-4-bulk-selection-toolbar.md all met. No edits outside components/BulkSelectionToolbar.js. Dark-mode QA reminder for reviewers: before this change, the toolbar was bg-white — invisible against the dark theme. Verify in BOTH themes before merge; before/after dark-mode screenshot attached to PR description. Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-04 16:37:58 -04:00
className="nav-item-hover p-2 rounded-xl transition-colors"
style={{ color: 'var(--text-secondary)' }}
>
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z" />
</svg>
</button>
{/* Dropdown Actions */}
{showActions && (
refactor(bulk-toolbar): migrate to .glass-panel-strong + token sweep Brief 4 of unify-glass-panel-surfaces convoy. The bulk-select toolbar was a critical dark-mode bug (bg-white invisible against dark backgrounds); migrating to .glass-panel-strong is both a unification win and a correctness fix. Outer toolbar: - Replaces `bg-white rounded-xl shadow-2xl border border-gray-200` with `glass-panel-strong rounded-2xl`. - Inline boxShadow override: `var(--rim-light-inner), var(--elevation-pronounced)` — keeps the toolbar reading as elevated over arbitrary page content (matches the design audit's "floating chrome" elevation tier). More-actions dropdown: - Replaces `absolute bottom-full right-0 mb-2 bg-white rounded-lg shadow-xl border border-gray-200` with `glass-panel-strong absolute bottom-full right-0 mb-2 rounded-xl`. Class's default rim+ambient stack is the right weight here. Interior token sweep (per Brief 4 acceptance criteria): - text-gray-700 → style={{ color: 'var(--text-primary)' }} - text-gray-{400,600} on the action triggers → style={{ color: 'var(--text-secondary)' }} - hover:text-gray-{600,800} + hover:bg-gray-{50,100} → nav-item-hover - text-red-600 hover:bg-red-50 → style={{ color: 'rgb(239, 68, 68)' }} + nav-item-hover. (--accent-danger token does not exist yet; brief pre-authorized this fallback. A future design-system PR can introduce the token and swap the literal.) - bg-gray-300 divider → style={{ backgroundColor: 'var(--border)' }} - border-gray-200 menu separator → style={{ borderColor: 'var(--border)' }} - rounded-lg → rounded-xl on action triggers (Brief 4 + convoy-wide consistency). UNCHANGED per brief scope: - The 3 quick-action buttons (Collection / Deck / My Collection) — they already use --accent-flame / --accent-gold / --accent-wood and the onMouseEnter/Leave swap pattern. Touching them is scope expansion. Verification: - rg "text-gray-|bg-gray-|hover:bg-gray-|text-red-|hover:bg-red-| border-gray-" components/BulkSelectionToolbar.js → 0 matches. - npm run lint passes (1 pre-existing unrelated warning). - npm run test:run: 116/116 tests pass (no test changes needed for a pure className/style swap per Brief 4 § Test Plan). Acceptance criteria from .convoys/unify-glass-panel-surfaces/brief-4-bulk-selection-toolbar.md all met. No edits outside components/BulkSelectionToolbar.js. Dark-mode QA reminder for reviewers: before this change, the toolbar was bg-white — invisible against the dark theme. Verify in BOTH themes before merge; before/after dark-mode screenshot attached to PR description. Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-04 16:37:58 -04:00
<div className="glass-panel-strong absolute bottom-full right-0 mb-2 rounded-xl py-2 min-w-48">
<button
onClick={() => {
handleBulkFavorite();
setShowActions(false);
}}
refactor(bulk-toolbar): migrate to .glass-panel-strong + token sweep Brief 4 of unify-glass-panel-surfaces convoy. The bulk-select toolbar was a critical dark-mode bug (bg-white invisible against dark backgrounds); migrating to .glass-panel-strong is both a unification win and a correctness fix. Outer toolbar: - Replaces `bg-white rounded-xl shadow-2xl border border-gray-200` with `glass-panel-strong rounded-2xl`. - Inline boxShadow override: `var(--rim-light-inner), var(--elevation-pronounced)` — keeps the toolbar reading as elevated over arbitrary page content (matches the design audit's "floating chrome" elevation tier). More-actions dropdown: - Replaces `absolute bottom-full right-0 mb-2 bg-white rounded-lg shadow-xl border border-gray-200` with `glass-panel-strong absolute bottom-full right-0 mb-2 rounded-xl`. Class's default rim+ambient stack is the right weight here. Interior token sweep (per Brief 4 acceptance criteria): - text-gray-700 → style={{ color: 'var(--text-primary)' }} - text-gray-{400,600} on the action triggers → style={{ color: 'var(--text-secondary)' }} - hover:text-gray-{600,800} + hover:bg-gray-{50,100} → nav-item-hover - text-red-600 hover:bg-red-50 → style={{ color: 'rgb(239, 68, 68)' }} + nav-item-hover. (--accent-danger token does not exist yet; brief pre-authorized this fallback. A future design-system PR can introduce the token and swap the literal.) - bg-gray-300 divider → style={{ backgroundColor: 'var(--border)' }} - border-gray-200 menu separator → style={{ borderColor: 'var(--border)' }} - rounded-lg → rounded-xl on action triggers (Brief 4 + convoy-wide consistency). UNCHANGED per brief scope: - The 3 quick-action buttons (Collection / Deck / My Collection) — they already use --accent-flame / --accent-gold / --accent-wood and the onMouseEnter/Leave swap pattern. Touching them is scope expansion. Verification: - rg "text-gray-|bg-gray-|hover:bg-gray-|text-red-|hover:bg-red-| border-gray-" components/BulkSelectionToolbar.js → 0 matches. - npm run lint passes (1 pre-existing unrelated warning). - npm run test:run: 116/116 tests pass (no test changes needed for a pure className/style swap per Brief 4 § Test Plan). Acceptance criteria from .convoys/unify-glass-panel-surfaces/brief-4-bulk-selection-toolbar.md all met. No edits outside components/BulkSelectionToolbar.js. Dark-mode QA reminder for reviewers: before this change, the toolbar was bg-white — invisible against the dark theme. Verify in BOTH themes before merge; before/after dark-mode screenshot attached to PR description. Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-04 16:37:58 -04:00
className="nav-item-hover w-full px-4 py-2 text-left text-sm flex items-center space-x-2"
style={{ color: 'var(--text-primary)' }}
>
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" />
</svg>
<span>Add to Favorites</span>
</button>
<button
onClick={() => {
handleRemoveFromOwned();
setShowActions(false);
}}
refactor(bulk-toolbar): migrate to .glass-panel-strong + token sweep Brief 4 of unify-glass-panel-surfaces convoy. The bulk-select toolbar was a critical dark-mode bug (bg-white invisible against dark backgrounds); migrating to .glass-panel-strong is both a unification win and a correctness fix. Outer toolbar: - Replaces `bg-white rounded-xl shadow-2xl border border-gray-200` with `glass-panel-strong rounded-2xl`. - Inline boxShadow override: `var(--rim-light-inner), var(--elevation-pronounced)` — keeps the toolbar reading as elevated over arbitrary page content (matches the design audit's "floating chrome" elevation tier). More-actions dropdown: - Replaces `absolute bottom-full right-0 mb-2 bg-white rounded-lg shadow-xl border border-gray-200` with `glass-panel-strong absolute bottom-full right-0 mb-2 rounded-xl`. Class's default rim+ambient stack is the right weight here. Interior token sweep (per Brief 4 acceptance criteria): - text-gray-700 → style={{ color: 'var(--text-primary)' }} - text-gray-{400,600} on the action triggers → style={{ color: 'var(--text-secondary)' }} - hover:text-gray-{600,800} + hover:bg-gray-{50,100} → nav-item-hover - text-red-600 hover:bg-red-50 → style={{ color: 'rgb(239, 68, 68)' }} + nav-item-hover. (--accent-danger token does not exist yet; brief pre-authorized this fallback. A future design-system PR can introduce the token and swap the literal.) - bg-gray-300 divider → style={{ backgroundColor: 'var(--border)' }} - border-gray-200 menu separator → style={{ borderColor: 'var(--border)' }} - rounded-lg → rounded-xl on action triggers (Brief 4 + convoy-wide consistency). UNCHANGED per brief scope: - The 3 quick-action buttons (Collection / Deck / My Collection) — they already use --accent-flame / --accent-gold / --accent-wood and the onMouseEnter/Leave swap pattern. Touching them is scope expansion. Verification: - rg "text-gray-|bg-gray-|hover:bg-gray-|text-red-|hover:bg-red-| border-gray-" components/BulkSelectionToolbar.js → 0 matches. - npm run lint passes (1 pre-existing unrelated warning). - npm run test:run: 116/116 tests pass (no test changes needed for a pure className/style swap per Brief 4 § Test Plan). Acceptance criteria from .convoys/unify-glass-panel-surfaces/brief-4-bulk-selection-toolbar.md all met. No edits outside components/BulkSelectionToolbar.js. Dark-mode QA reminder for reviewers: before this change, the toolbar was bg-white — invisible against the dark theme. Verify in BOTH themes before merge; before/after dark-mode screenshot attached to PR description. Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-04 16:37:58 -04:00
className="nav-item-hover w-full px-4 py-2 text-left text-sm flex items-center space-x-2"
style={{ color: 'var(--text-primary)' }}
>
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
</svg>
<span>{VOCAB.REMOVE_FROM_MY_COLLECTION}</span>
</button>
refactor(bulk-toolbar): migrate to .glass-panel-strong + token sweep Brief 4 of unify-glass-panel-surfaces convoy. The bulk-select toolbar was a critical dark-mode bug (bg-white invisible against dark backgrounds); migrating to .glass-panel-strong is both a unification win and a correctness fix. Outer toolbar: - Replaces `bg-white rounded-xl shadow-2xl border border-gray-200` with `glass-panel-strong rounded-2xl`. - Inline boxShadow override: `var(--rim-light-inner), var(--elevation-pronounced)` — keeps the toolbar reading as elevated over arbitrary page content (matches the design audit's "floating chrome" elevation tier). More-actions dropdown: - Replaces `absolute bottom-full right-0 mb-2 bg-white rounded-lg shadow-xl border border-gray-200` with `glass-panel-strong absolute bottom-full right-0 mb-2 rounded-xl`. Class's default rim+ambient stack is the right weight here. Interior token sweep (per Brief 4 acceptance criteria): - text-gray-700 → style={{ color: 'var(--text-primary)' }} - text-gray-{400,600} on the action triggers → style={{ color: 'var(--text-secondary)' }} - hover:text-gray-{600,800} + hover:bg-gray-{50,100} → nav-item-hover - text-red-600 hover:bg-red-50 → style={{ color: 'rgb(239, 68, 68)' }} + nav-item-hover. (--accent-danger token does not exist yet; brief pre-authorized this fallback. A future design-system PR can introduce the token and swap the literal.) - bg-gray-300 divider → style={{ backgroundColor: 'var(--border)' }} - border-gray-200 menu separator → style={{ borderColor: 'var(--border)' }} - rounded-lg → rounded-xl on action triggers (Brief 4 + convoy-wide consistency). UNCHANGED per brief scope: - The 3 quick-action buttons (Collection / Deck / My Collection) — they already use --accent-flame / --accent-gold / --accent-wood and the onMouseEnter/Leave swap pattern. Touching them is scope expansion. Verification: - rg "text-gray-|bg-gray-|hover:bg-gray-|text-red-|hover:bg-red-| border-gray-" components/BulkSelectionToolbar.js → 0 matches. - npm run lint passes (1 pre-existing unrelated warning). - npm run test:run: 116/116 tests pass (no test changes needed for a pure className/style swap per Brief 4 § Test Plan). Acceptance criteria from .convoys/unify-glass-panel-surfaces/brief-4-bulk-selection-toolbar.md all met. No edits outside components/BulkSelectionToolbar.js. Dark-mode QA reminder for reviewers: before this change, the toolbar was bg-white — invisible against the dark theme. Verify in BOTH themes before merge; before/after dark-mode screenshot attached to PR description. Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-04 16:37:58 -04:00
<div
className="my-1 border-t"
style={{ borderColor: 'var(--border)' }}
></div>
<button
onClick={() => {
handleBulkDelete();
setShowActions(false);
}}
refactor(bulk-toolbar): migrate to .glass-panel-strong + token sweep Brief 4 of unify-glass-panel-surfaces convoy. The bulk-select toolbar was a critical dark-mode bug (bg-white invisible against dark backgrounds); migrating to .glass-panel-strong is both a unification win and a correctness fix. Outer toolbar: - Replaces `bg-white rounded-xl shadow-2xl border border-gray-200` with `glass-panel-strong rounded-2xl`. - Inline boxShadow override: `var(--rim-light-inner), var(--elevation-pronounced)` — keeps the toolbar reading as elevated over arbitrary page content (matches the design audit's "floating chrome" elevation tier). More-actions dropdown: - Replaces `absolute bottom-full right-0 mb-2 bg-white rounded-lg shadow-xl border border-gray-200` with `glass-panel-strong absolute bottom-full right-0 mb-2 rounded-xl`. Class's default rim+ambient stack is the right weight here. Interior token sweep (per Brief 4 acceptance criteria): - text-gray-700 → style={{ color: 'var(--text-primary)' }} - text-gray-{400,600} on the action triggers → style={{ color: 'var(--text-secondary)' }} - hover:text-gray-{600,800} + hover:bg-gray-{50,100} → nav-item-hover - text-red-600 hover:bg-red-50 → style={{ color: 'rgb(239, 68, 68)' }} + nav-item-hover. (--accent-danger token does not exist yet; brief pre-authorized this fallback. A future design-system PR can introduce the token and swap the literal.) - bg-gray-300 divider → style={{ backgroundColor: 'var(--border)' }} - border-gray-200 menu separator → style={{ borderColor: 'var(--border)' }} - rounded-lg → rounded-xl on action triggers (Brief 4 + convoy-wide consistency). UNCHANGED per brief scope: - The 3 quick-action buttons (Collection / Deck / My Collection) — they already use --accent-flame / --accent-gold / --accent-wood and the onMouseEnter/Leave swap pattern. Touching them is scope expansion. Verification: - rg "text-gray-|bg-gray-|hover:bg-gray-|text-red-|hover:bg-red-| border-gray-" components/BulkSelectionToolbar.js → 0 matches. - npm run lint passes (1 pre-existing unrelated warning). - npm run test:run: 116/116 tests pass (no test changes needed for a pure className/style swap per Brief 4 § Test Plan). Acceptance criteria from .convoys/unify-glass-panel-surfaces/brief-4-bulk-selection-toolbar.md all met. No edits outside components/BulkSelectionToolbar.js. Dark-mode QA reminder for reviewers: before this change, the toolbar was bg-white — invisible against the dark theme. Verify in BOTH themes before merge; before/after dark-mode screenshot attached to PR description. Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-04 16:37:58 -04:00
className="nav-item-hover w-full px-4 py-2 text-left text-sm flex items-center space-x-2"
style={{ color: 'rgb(239, 68, 68)' }}
>
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
</svg>
<span>Delete Selected</span>
</button>
</div>
)}
</div>
{/* Clear Selection */}
<button
onClick={onClearSelection}
refactor(bulk-toolbar): migrate to .glass-panel-strong + token sweep Brief 4 of unify-glass-panel-surfaces convoy. The bulk-select toolbar was a critical dark-mode bug (bg-white invisible against dark backgrounds); migrating to .glass-panel-strong is both a unification win and a correctness fix. Outer toolbar: - Replaces `bg-white rounded-xl shadow-2xl border border-gray-200` with `glass-panel-strong rounded-2xl`. - Inline boxShadow override: `var(--rim-light-inner), var(--elevation-pronounced)` — keeps the toolbar reading as elevated over arbitrary page content (matches the design audit's "floating chrome" elevation tier). More-actions dropdown: - Replaces `absolute bottom-full right-0 mb-2 bg-white rounded-lg shadow-xl border border-gray-200` with `glass-panel-strong absolute bottom-full right-0 mb-2 rounded-xl`. Class's default rim+ambient stack is the right weight here. Interior token sweep (per Brief 4 acceptance criteria): - text-gray-700 → style={{ color: 'var(--text-primary)' }} - text-gray-{400,600} on the action triggers → style={{ color: 'var(--text-secondary)' }} - hover:text-gray-{600,800} + hover:bg-gray-{50,100} → nav-item-hover - text-red-600 hover:bg-red-50 → style={{ color: 'rgb(239, 68, 68)' }} + nav-item-hover. (--accent-danger token does not exist yet; brief pre-authorized this fallback. A future design-system PR can introduce the token and swap the literal.) - bg-gray-300 divider → style={{ backgroundColor: 'var(--border)' }} - border-gray-200 menu separator → style={{ borderColor: 'var(--border)' }} - rounded-lg → rounded-xl on action triggers (Brief 4 + convoy-wide consistency). UNCHANGED per brief scope: - The 3 quick-action buttons (Collection / Deck / My Collection) — they already use --accent-flame / --accent-gold / --accent-wood and the onMouseEnter/Leave swap pattern. Touching them is scope expansion. Verification: - rg "text-gray-|bg-gray-|hover:bg-gray-|text-red-|hover:bg-red-| border-gray-" components/BulkSelectionToolbar.js → 0 matches. - npm run lint passes (1 pre-existing unrelated warning). - npm run test:run: 116/116 tests pass (no test changes needed for a pure className/style swap per Brief 4 § Test Plan). Acceptance criteria from .convoys/unify-glass-panel-surfaces/brief-4-bulk-selection-toolbar.md all met. No edits outside components/BulkSelectionToolbar.js. Dark-mode QA reminder for reviewers: before this change, the toolbar was bg-white — invisible against the dark theme. Verify in BOTH themes before merge; before/after dark-mode screenshot attached to PR description. Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-04 16:37:58 -04:00
className="nav-item-hover p-2 rounded-xl transition-colors"
style={{ color: 'var(--text-secondary)' }}
title="Clear selection"
>
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
</div>
</div>
);
}