today_ai_weather/app/views/cities/index.html.erb

123 lines
5.2 KiB
Plaintext
Raw Normal View History

<!-- app/views/cities/index.html.erb -->
<div class="min-h-screen">
<!-- 页面标题和背景 -->
<% 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 %>
<!-- 标题内容 -->
<div class="relative pt-24 pb-48">
<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>
</div>
</div>
<!-- 筛选导航 -->
<div class="sticky top-16 z-10 bg-base-100 shadow-lg">
<div class="container mx-auto px-4">
<div class="py-4">
<!-- 区域选择 -->
<div class="flex flex-wrap gap-3 items-center justify-center mb-4">
<%= link_to cities_path,
class: "btn btn-sm #{'btn-primary' unless @current_region} btn-outline" do %>
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4 mr-1" 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>
All Regions
<% end %>
<% @regions.each do |region| %>
<%= link_to region.name,
cities_path(region: region.slug),
class: "btn btn-sm #{'btn-primary' if @current_region == region} btn-outline" %>
<% end %>
</div>
<!-- 国家选择 (如果选择了区域) -->
<% if @current_region %>
<div class="flex flex-wrap gap-2 items-center justify-center">
<%= link_to cities_path(region: @current_region.slug),
class: "btn btn-sm btn-ghost #{'btn-active' unless @current_country}" do %>
All in <%= @current_region.name %>
<% end %>
<% @current_region.countries.order(:name).each do |country| %>
<%= link_to country.name,
cities_path(region: @current_region.slug, country: country.slug),
class: "btn btn-sm btn-ghost #{'btn-active' if @current_country == country}" %>
<% end %>
</div>
<% end %>
<!-- 面包屑导航 -->
<% if @current_region || @current_country %>
<div class="flex justify-center mt-4">
<div class="breadcrumbs text-sm">
<ul>
<li>
<%= link_to cities_path do %>
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4 mr-1" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" />
</svg>
Home
<% end %>
</li>
<% if @current_region %>
<li><%= @current_region.name %></li>
<% end %>
<% if @current_country %>
<li><%= @current_country.name %></li>
<% end %>
</ul>
</div>
</div>
<% end %>
</div>
</div>
</div>
<!-- 城市网格 -->
<div class="container mx-auto px-4 py-8">
<!-- 结果统计 -->
<div class="text-center text-base-content/70 mb-8">
Showing <%= @cities.count %> <%= 'city'.pluralize(@cities.count) %>
<% if @current_country %>
in <%= @current_country.name %>
<% elsif @current_region %>
in <%= @current_region.name %>
<% end %>
</div>
<!-- 城市卡片网格 -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
<%= render partial: 'city', collection: @cities %>
</div>
</div>
</div>