2025-01-22 14:10:43 +08:00
|
|
|
<!-- app/views/cities/index.html.erb -->
|
2025-01-22 14:04:58 +08:00
|
|
|
<div class="min-h-screen">
|
2025-01-22 14:10:43 +08:00
|
|
|
<!-- 页面标题和背景 -->
|
|
|
|
<% featured_art = WeatherArt.includes(:city).joins(:image_attachment).order(created_at: :desc).first %>
|
|
|
|
<div class="relative bg-base-100">
|
|
|
|
<!-- 背景图像和渐变 -->
|
|
|
|
<% if featured_art&.image&.attached? %>
|
|
|
|
<div class="absolute inset-0 h-[60vh] overflow-hidden">
|
|
|
|
<%= image_tag featured_art.image,
|
|
|
|
class: "w-full h-full object-cover object-center" %>
|
|
|
|
<div class="absolute inset-0 bg-gradient-to-b from-base-100/40 via-base-100/80 to-base-100"></div>
|
|
|
|
</div>
|
|
|
|
<% end %>
|
2025-01-22 14:04:58 +08:00
|
|
|
|
2025-01-22 14:10:43 +08:00
|
|
|
<!-- 标题内容 -->
|
2025-01-22 14:12:29 +08:00
|
|
|
<div class="relative pt-24 pb-32">
|
2025-01-22 14:10:43 +08:00
|
|
|
<div class="container mx-auto px-4">
|
|
|
|
<div class="max-w-3xl mx-auto text-center space-y-6">
|
|
|
|
<h1 class="text-5xl md:text-6xl font-display font-bold leading-tight">
|
|
|
|
Explore Cities
|
|
|
|
</h1>
|
|
|
|
<p class="text-xl md:text-2xl text-base-content/70 font-light max-w-2xl mx-auto">
|
|
|
|
Discover AI-generated weather art from cities around the world
|
|
|
|
</p>
|
|
|
|
|
|
|
|
<!-- 特色图片信息 -->
|
|
|
|
<% if featured_art %>
|
|
|
|
<div class="inline-block mt-6 px-4 py-2 bg-base-100/80 backdrop-blur-sm rounded-full text-sm">
|
|
|
|
Latest from
|
|
|
|
<span class="font-semibold"><%= featured_art.city.name %></span>,
|
|
|
|
<%= featured_art.city.country.name %>
|
|
|
|
<span class="mx-2">•</span>
|
|
|
|
<%= featured_art.weather_date.strftime("%B %d, %Y") %>
|
|
|
|
</div>
|
|
|
|
<% end %>
|
|
|
|
</div>
|
|
|
|
</div>
|
2025-01-22 14:04:58 +08:00
|
|
|
</div>
|
2025-01-20 18:02:28 +08:00
|
|
|
</div>
|
2025-01-19 22:08:05 +08:00
|
|
|
|
2025-01-22 14:12:29 +08:00
|
|
|
<!-- 筛选导航 - 使用下拉菜单 -->
|
|
|
|
<div class="sticky top-16 z-20 bg-base-100/95 backdrop-blur-sm border-b border-base-200">
|
2025-01-22 14:10:43 +08:00
|
|
|
<div class="container mx-auto px-4">
|
2025-01-22 14:12:29 +08:00
|
|
|
<div class="py-3 flex items-center justify-between gap-4">
|
|
|
|
<!-- 左侧筛选器 -->
|
|
|
|
<div class="flex items-center gap-4">
|
|
|
|
<!-- 区域选择下拉框 -->
|
|
|
|
<div class="dropdown">
|
|
|
|
<button class="btn btn-ghost gap-2">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
|
|
|
|
</svg>
|
|
|
|
<%= @current_region&.name || 'All Regions' %>
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
|
|
|
|
</svg>
|
|
|
|
</button>
|
|
|
|
<ul class="dropdown-content z-[1] menu p-2 shadow-lg bg-base-100 rounded-box w-52">
|
|
|
|
<li>
|
|
|
|
<%= link_to cities_path,
|
|
|
|
class: "#{@current_region ? '' : 'active'}" do %>
|
|
|
|
All Regions
|
|
|
|
<% end %>
|
|
|
|
</li>
|
|
|
|
<div class="divider my-1"></div>
|
|
|
|
<% @regions.each do |region| %>
|
|
|
|
<li>
|
|
|
|
<%= link_to region.name,
|
|
|
|
cities_path(region: region.slug),
|
|
|
|
class: "#{@current_region == region ? 'active' : ''}" %>
|
|
|
|
</li>
|
|
|
|
<% end %>
|
|
|
|
</ul>
|
2025-01-22 14:10:43 +08:00
|
|
|
</div>
|
2025-01-20 18:02:28 +08:00
|
|
|
|
2025-01-22 14:12:29 +08:00
|
|
|
<!-- 国家选择下拉框 (如果选择了区域) -->
|
|
|
|
<% if @current_region %>
|
|
|
|
<div class="dropdown">
|
|
|
|
<button class="btn btn-ghost gap-2">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 21v-4m0 0V5a2 2 0 012-2h6.5l1 1H21l-3 6 3 6h-8.5l-1-1H5a2 2 0 00-2 2zm9-13.5V9" />
|
|
|
|
</svg>
|
|
|
|
<%= @current_country&.name || "All Countries" %>
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
|
|
|
|
</svg>
|
|
|
|
</button>
|
|
|
|
<ul class="dropdown-content z-[1] menu p-2 shadow-lg bg-base-100 rounded-box w-52">
|
2025-01-22 14:10:43 +08:00
|
|
|
<li>
|
2025-01-22 14:12:29 +08:00
|
|
|
<%= link_to "All in #{@current_region.name}",
|
|
|
|
cities_path(region: @current_region.slug),
|
|
|
|
class: "#{@current_country ? '' : 'active'}" %>
|
2025-01-22 14:10:43 +08:00
|
|
|
</li>
|
2025-01-22 14:12:29 +08:00
|
|
|
<div class="divider my-1"></div>
|
|
|
|
<% @current_region.countries.order(:name).each do |country| %>
|
|
|
|
<li>
|
|
|
|
<%= link_to country.name,
|
|
|
|
cities_path(region: @current_region.slug, country: country.slug),
|
|
|
|
class: "#{@current_country == country ? 'active' : ''}" %>
|
|
|
|
</li>
|
2025-01-22 14:10:43 +08:00
|
|
|
<% end %>
|
|
|
|
</ul>
|
|
|
|
</div>
|
2025-01-22 14:12:29 +08:00
|
|
|
<% end %>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<!-- 右侧结果统计 -->
|
|
|
|
<div class="text-sm text-base-content/70">
|
|
|
|
<%= @cities.count %> <%= 'city'.pluralize(@cities.count) %>
|
|
|
|
<% if @current_country %>
|
|
|
|
in <%= @current_country.name %>
|
|
|
|
<% elsif @current_region %>
|
|
|
|
in <%= @current_region.name %>
|
|
|
|
<% end %>
|
|
|
|
</div>
|
2025-01-22 14:04:58 +08:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<!-- 城市网格 -->
|
2025-01-22 14:10:43 +08:00
|
|
|
<div class="container mx-auto px-4 py-8">
|
|
|
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
|
|
|
|
<%= render partial: 'city', collection: @cities %>
|
|
|
|
</div>
|
2025-01-19 22:08:05 +08:00
|
|
|
</div>
|
|
|
|
</div>
|