diff --git a/src/presentation/web/views/bags.rs b/src/presentation/web/views/bags.rs index 615d87e..9d10c16 100644 --- a/src/presentation/web/views/bags.rs +++ b/src/presentation/web/views/bags.rs @@ -9,7 +9,8 @@ pub struct BagView { pub remaining: String, pub closed: bool, pub finished_at: String, - pub created_at: String, + pub created_date: String, + pub created_time: String, pub roast_name: String, pub roaster_name: String, pub roast_slug: String, @@ -29,7 +30,8 @@ impl BagView { .bag .finished_at .map_or_else(|| "—".to_string(), |d| d.to_string()), - created_at: bag.bag.created_at.format("%Y-%m-%d").to_string(), + created_date: bag.bag.created_at.format("%Y-%m-%d").to_string(), + created_time: bag.bag.created_at.format("%H:%M").to_string(), roast_name: bag.roast_name, roaster_name: bag.roaster_name, roast_slug: bag.roast_slug, diff --git a/src/presentation/web/views/brews.rs b/src/presentation/web/views/brews.rs index ccf5a4e..783a7b7 100644 --- a/src/presentation/web/views/brews.rs +++ b/src/presentation/web/views/brews.rs @@ -21,7 +21,8 @@ pub struct BrewView { pub water_volume: String, pub water_temp: String, pub ratio: String, - pub created_at: String, + pub created_date: String, + pub created_time: String, pub relative_date_label: String, // Raw values for "brew again" feature pub coffee_weight_raw: f64, @@ -62,7 +63,8 @@ impl BrewView { water_volume: format!("{}ml", brew.brew.water_volume), water_temp: format!("{:.1}\u{00B0}C", brew.brew.water_temp), ratio, - created_at: brew.brew.created_at.format("%Y-%m-%d %H:%M").to_string(), + created_date: brew.brew.created_at.format("%Y-%m-%d").to_string(), + created_time: brew.brew.created_at.format("%H:%M").to_string(), relative_date_label: relative_date(brew.brew.created_at), coffee_weight_raw: brew.brew.coffee_weight, grind_setting_raw: brew.brew.grind_setting, diff --git a/src/presentation/web/views/cafes.rs b/src/presentation/web/views/cafes.rs index 7d93ab5..cf7c40b 100644 --- a/src/presentation/web/views/cafes.rs +++ b/src/presentation/web/views/cafes.rs @@ -13,7 +13,8 @@ pub struct CafeView { pub has_website: bool, pub website_url: String, pub website_label: String, - pub created_at: String, + pub created_date: String, + pub created_time: String, pub created_at_sort_key: i64, } @@ -38,7 +39,8 @@ impl From for CafeView { let map_url = format!("https://www.google.com/maps?q={latitude},{longitude}"); let created_at_sort_key = created_at.timestamp(); - let created_at_label = created_at.format("%Y-%m-%d").to_string(); + let created_date = created_at.format("%Y-%m-%d").to_string(); + let created_time = created_at.format("%H:%M").to_string(); Self { detail_path, @@ -52,7 +54,8 @@ impl From for CafeView { has_website, website_url: website.clone(), website_label: website, - created_at: created_at_label, + created_date, + created_time, created_at_sort_key, } } diff --git a/src/presentation/web/views/cups.rs b/src/presentation/web/views/cups.rs index 08f5731..4ed977a 100644 --- a/src/presentation/web/views/cups.rs +++ b/src/presentation/web/views/cups.rs @@ -9,7 +9,8 @@ pub struct CupView { pub roaster_slug: String, pub cafe_name: String, pub cafe_slug: String, - pub created_at: String, + pub created_date: String, + pub created_time: String, } impl CupView { @@ -22,7 +23,8 @@ impl CupView { roaster_slug: cup.roaster_slug, cafe_name: cup.cafe_name, cafe_slug: cup.cafe_slug, - created_at: cup.cup.created_at.format("%Y-%m-%d %H:%M").to_string(), + created_date: cup.cup.created_at.format("%Y-%m-%d").to_string(), + created_time: cup.cup.created_at.format("%H:%M").to_string(), } } } diff --git a/src/presentation/web/views/gear.rs b/src/presentation/web/views/gear.rs index 7e185c7..5e103f2 100644 --- a/src/presentation/web/views/gear.rs +++ b/src/presentation/web/views/gear.rs @@ -8,7 +8,8 @@ pub struct GearView { pub make: String, pub model: String, pub full_name: String, - pub created_at: String, + pub created_date: String, + pub created_time: String, } impl GearView { @@ -20,7 +21,8 @@ impl GearView { make: gear.make.clone(), model: gear.model.clone(), full_name: format!("{} {}", gear.make, gear.model), - created_at: gear.created_at.format("%Y-%m-%d").to_string(), + created_date: gear.created_at.format("%Y-%m-%d").to_string(), + created_time: gear.created_at.format("%H:%M").to_string(), } } } diff --git a/src/presentation/web/views/roasters.rs b/src/presentation/web/views/roasters.rs index 29878ca..0f6d36f 100644 --- a/src/presentation/web/views/roasters.rs +++ b/src/presentation/web/views/roasters.rs @@ -32,7 +32,8 @@ pub struct RoasterView { pub has_homepage: bool, pub homepage_url: String, pub homepage_label: String, - pub created_at: String, + pub created_date: String, + pub created_time: String, pub created_at_sort_key: i64, } @@ -53,7 +54,8 @@ impl From for RoasterView { let detail_path = format!("/roasters/{slug}"); let created_at_sort_key = created_at.timestamp(); - let created_at_label = created_at.format("%Y-%m-%d").to_string(); + let created_date = created_at.format("%Y-%m-%d").to_string(); + let created_time = created_at.format("%H:%M").to_string(); Self { detail_path, @@ -64,7 +66,8 @@ impl From for RoasterView { has_homepage, homepage_url: homepage.clone(), homepage_label: homepage, - created_at: created_at_label, + created_date, + created_time, created_at_sort_key, } } diff --git a/src/presentation/web/views/roasts.rs b/src/presentation/web/views/roasts.rs index 5106fb8..912e3fa 100644 --- a/src/presentation/web/views/roasts.rs +++ b/src/presentation/web/views/roasts.rs @@ -10,7 +10,8 @@ pub struct RoastView { pub region: String, pub producer: String, pub process: String, - pub created_at: String, + pub created_date: String, + pub created_time: String, pub created_at_sort_key: i64, pub tasting_notes: Vec, } @@ -64,7 +65,8 @@ impl RoastView { .collect::>() }) .collect(); - let created_at = created_at.format("%Y-%m-%d").to_string(); + let created_date = created_at.format("%Y-%m-%d").to_string(); + let created_time = created_at.format("%H:%M").to_string(); let detail_path = format!("/roasters/{roaster_slug}/roasts/{slug}"); Self { @@ -77,7 +79,8 @@ impl RoastView { region, producer, process, - created_at, + created_date, + created_time, created_at_sort_key, tasting_notes, } diff --git a/static/css/input.css b/static/css/input.css index a680140..907c5ae 100644 --- a/static/css/input.css +++ b/static/css/input.css @@ -142,6 +142,28 @@ a { background-color: var(--surface-alt); } +.pill-warning { + border-color: rgba(217, 119, 6, 0.4); + color: #92400e; + background-color: #fffbeb; +} + +[data-theme="dark"] .pill-warning { + color: #fbbf24; + background-color: rgba(217, 119, 6, 0.1); +} + +.pill-success { + border-color: rgba(5, 150, 105, 0.4); + color: #065f46; + background-color: #ecfdf5; +} + +[data-theme="dark"] .pill-success { + color: #34d399; + background-color: rgba(5, 150, 105, 0.1); +} + /* ── Tabs ──────────────────────────────────────────────────────── */ .tab { @@ -367,8 +389,8 @@ a { /* "Added" date: footer section with top divider */ .responsive-table td.card-date { order: 99; - padding-top: 0.5rem; - margin-top: 0.5rem; + margin: 0.5rem -1rem -1rem !important; + padding: 0.75rem 1rem !important; border-top: 1px solid var(--border-muted) !important; font-size: 0.75rem; color: var(--text-secondary); @@ -396,84 +418,29 @@ a { display: none; } - /* Three-dot dropdown menu */ - .card-menu { - position: relative; + /* Hide detail row on mobile — inline card-detail is used instead */ + .responsive-table .detail-row { + display: none !important; } - .card-menu summary { - list-style: none; - cursor: pointer; - display: inline-flex; - height: 2rem; - width: 2rem; - align-items: center; + /* Inline detail content within cards */ + .responsive-table .card-detail { + order: -1; + margin: 0 -1rem 0.25rem !important; + padding: 0.5rem 1rem !important; + border-bottom: 1px solid var(--border-muted) !important; + background-color: var(--surface-alt); justify-content: center; - border-radius: 0.375rem; - color: var(--text-secondary); - transition: color 150ms ease, background-color 150ms ease; } - .card-menu summary:hover { - color: var(--accent); - background-color: var(--surface-alt); + .responsive-table .card-detail.hidden { + display: none !important; } - .card-menu summary::-webkit-details-marker { + .responsive-table .card-detail::before { display: none; } - .card-menu[open] summary { - color: var(--accent); - background-color: var(--surface-alt); - } - - .card-menu .card-menu-items { - position: absolute; - right: 0; - top: 100%; - z-index: 20; - min-width: 10rem; - margin-top: 0.25rem; - border-radius: 0.5rem; - border: 1px solid var(--border); - background-color: var(--surface); - padding: 0.25rem 0; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1); - } - - .card-menu .card-menu-items a, - .card-menu .card-menu-items button, - .card-menu .card-menu-items form button { - display: flex; - width: 100%; - align-items: center; - gap: 0.5rem; - padding: 0.5rem 0.75rem; - font-size: 0.875rem; - color: var(--text); - text-align: left; - background: none; - border: none; - cursor: pointer; - transition: background-color 150ms ease; - text-decoration: none; - } - - .card-menu .card-menu-items a:hover, - .card-menu .card-menu-items button:hover, - .card-menu .card-menu-items form button:hover { - background-color: var(--surface-alt); - } - - .card-menu .card-menu-items .menu-item-danger { - color: #dc2626; - } - - .card-menu .card-menu-items .menu-item-danger:hover { - background-color: rgba(254, 202, 202, 0.3); - } - .pagination-controls { display: none; } @@ -482,6 +449,11 @@ a { /* ── Desktop timeline ──────────────────────────────────────────── */ @media (min-width: 768px) { + /* Hide inline card-detail on desktop — detail row is used instead */ + .responsive-table .card-detail { + display: none !important; + } + .timeline-list { display: flex; flex-direction: column; diff --git a/templates/partials/lists/bag_list.html b/templates/partials/lists/bag_list.html index a404f2e..1a9fff8 100644 --- a/templates/partials/lists/bag_list.html +++ b/templates/partials/lists/bag_list.html @@ -38,7 +38,8 @@ {% for bag in bags.items %} - {{ bag.created_at }} +
{{ bag.created_date }}
+ {{ bag.roaster_name }} @@ -58,47 +59,53 @@ {% endif %} {{ bag.finished_at }} {% if is_authenticated %} - -