main
Ilham Wara Nugroho 2026-07-13 11:18:35 +07:00
parent 36d77a7c38
commit d14804c8b9
31 changed files with 703 additions and 251 deletions

View File

@ -33,177 +33,177 @@ namespace kehati.Controllers
FeaturedSpesies = new List<SpesiesModel>
{
new()
{
Slug = "pohon-trembesi",
Type = "flora",
CommonName = "Pohon Trembesi",
ScientificName = "Samanea saman",
Description =
"Pohon peneduh raksasa dengan tajuk lebar menyerupai payung. Sangat efektif menyerap karbon dioksida sehingga banyak ditanam di ruang publik Jakarta.",
Habitat = "Tumbuh baik di dataran rendah tropis, tanah subur, sinar matahari penuh.",
ConservationStatus = "Aman",
Image = "sp-trembesi.jpg",
LocationSlugs = new List<string>
{
"tebet-eco-park",
"hutan-kota-gbk",
"taman-menteng"
Slug = "pohon-trembesi",
Type = "flora",
CommonName = "Pohon Trembesi",
ScientificName = "Samanea saman",
Description =
"Pohon peneduh raksasa dengan tajuk lebar menyerupai payung. Sangat efektif menyerap karbon dioksida sehingga banyak ditanam di ruang publik Jakarta.",
Habitat = "Tumbuh baik di dataran rendah tropis, tanah subur, sinar matahari penuh.",
ConservationStatus = "Aman",
Image = "sp-trembesi.jpg",
LocationSlugs = new List<string>
{
"tebet-eco-park",
"hutan-kota-gbk",
"taman-menteng"
}
},
new()
{
Slug= "pohon-beringin",
Type= "flora",
CommonName= "Pohon Beringin",
ScientificName= "Ficus benjamina",
Description=
"Pohon rindang dengan akar udara khas yang menjuntai. Simbol keteduhan dan sering dijumpai di taman kota serta ruang publik Jakarta.",
Habitat= "Iklim tropis, tanah lembab, tahan terhadap polusi udara perkotaan.",
ConservationStatus= "Aman",
Image= "sp-beringin.jpg",
LocationSlugs = new List<string>
{"hutan-kota-srengseng", "taman-menteng", "hutan-kota-gbk"}
},
new()
{
Slug= "mangrove-rhizophora",
Type= "flora",
CommonName= "Bakau Merah",
ScientificName= "Rhizophora mucronata",
Description=
"Tumbuhan bakau dengan akar tunjang khas. Berfungsi sebagai benteng alami pesisir Jakarta terhadap abrasi dan intrusi air laut.",
Habitat= "Kawasan pesisir berlumpur, muara sungai, air payau.",
ConservationStatus= "Dilindungi",
Image= "sp-mangrove.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
},
new()
{
Slug= "bunga-kamboja",
Type= "flora",
CommonName= "Kamboja Putih",
ScientificName= "Plumeria alba",
Description=
"Pohon hias berbunga harum dengan kelopak putih dan kuning di tengah. Populer di pekarangan dan taman kota.",
Habitat= "Daerah tropis kering, tanah berdrainase baik.",
ConservationStatus= "Aman",
Image= "sp-kamboja.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "taman-menteng"}
},
new()
{
Slug= "anggrek-bulan",
Type= "flora",
CommonName= "Anggrek Bulan",
ScientificName= "Phalaenopsis amabilis",
Description=
"Bunga nasional Indonesia (Puspa Pesona). Berkelopak lebar putih murni, tumbuh menempel pada batang pohon.",
Habitat= "Epifit pada pohon di hutan tropis lembab.",
ConservationStatus= "Rentan",
Image= "sp-anggrek.jpg",
LocationSlugs = new List<string>
{"hutan-kota-srengseng", "tebet-eco-park"}
},
new()
{
Slug= "bambu-kuning",
Type= "flora",
CommonName= "Bambu Kuning",
ScientificName= "Bambusa vulgaris",
Description=
"Rumpun bambu berbatang kuning cerah yang tumbuh cepat. Berperan penting menyerap air tanah dan mencegah erosi.",
Habitat= "Tanah lembab di tepi sungai, taman, dan hutan kota.",
ConservationStatus= "Aman",
Image= "sp-bambu.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "hutan-kota-srengseng"}
},
new()
{
Slug= "burung-kutilang",
Type= "fauna",
CommonName= "Burung Kutilang",
ScientificName= "Pycnonotus aurigaster",
Description=
"Burung pengicau kecil dengan tunggir kuning cerah. Salah satu burung liar paling umum di taman-taman Jakarta.",
Habitat= "Taman kota, pekarangan, hutan sekunder.",
ConservationStatus= "Aman",
Image= "sp-kutilang.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "taman-menteng", "hutan-kota-gbk"}
},
new()
{
Slug= "burung-madu-sriganti",
Type= "fauna",
CommonName= "Burung Madu Sriganti",
ScientificName= "Cinnyris jugularis",
Description=
"Burung kecil berwarna cerah, jantan berdada hitam berkilau. Penghisap nektar bunga di taman dan hutan kota.",
Habitat= "Taman berbunga, semak berbunga, pinggir hutan.",
ConservationStatus= "Dilindungi",
Image= "sp-madu-sriganti.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "hutan-kota-srengseng", "mangrove-pik"}
},
new()
{
Slug= "kupu-kupu-raja",
Type= "fauna",
CommonName= "Kupu-kupu Raja",
ScientificName= "Papilio memnon",
Description=
"Kupu-kupu besar berwarna hitam kebiruan dengan sayap lebar. Penyerbuk penting bagi berbagai tanaman berbunga.",
Habitat= "Taman berbunga, hutan sekunder, pinggir sungai.",
ConservationStatus= "Aman",
Image= "sp-kupu-kupu.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "hutan-kota-srengseng"}
},
new()
{
Slug= "biawak-air",
Type= "fauna",
CommonName= "Biawak Air",
ScientificName= "Varanus salvator",
Description=
"Reptil besar semi-akuatik dengan lidah bercabang. Predator alami yang membantu mengendalikan populasi tikus di ekosistem kota.",
Habitat= "Rawa, sungai, hutan mangrove.",
ConservationStatus= "Dilindungi",
Image= "sp-biawak.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
},
new()
{
Slug= "monyet-ekor-panjang",
Type= "fauna",
CommonName= "Monyet Ekor Panjang",
ScientificName= "Macaca fascicularis",
Description=
"Primata berbulu abu-abu kecoklatan dengan ekor panjang. Hidup berkelompok di kawasan hutan yang tersisa.",
Habitat= "Hutan mangrove, hutan sekunder, tepi sungai.",
ConservationStatus= "Rentan",
Image= "sp-monyet.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
},
new()
{
Slug= "elang-bondol",
Type= "fauna",
CommonName= "Elang Bondol",
ScientificName= "Haliastur indus",
Description=
"Elang berkepala putih dengan tubuh coklat kemerahan. Maskot Provinsi DKI Jakarta dan simbol kekayaan hayati pesisir.",
Habitat= "Pesisir, mangrove, muara sungai.",
ConservationStatus= "Dilindungi",
Image= "sp-elang-bondol.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
}
},
new()
{
Slug= "pohon-beringin",
Type= "flora",
CommonName= "Pohon Beringin",
ScientificName= "Ficus benjamina",
Description=
"Pohon rindang dengan akar udara khas yang menjuntai. Simbol keteduhan dan sering dijumpai di taman kota serta ruang publik Jakarta.",
Habitat= "Iklim tropis, tanah lembab, tahan terhadap polusi udara perkotaan.",
ConservationStatus= "Aman",
Image= "sp-beringin.jpg",
LocationSlugs = new List<string>
{"hutan-kota-srengseng", "taman-menteng", "hutan-kota-gbk"}
},
new()
{
Slug= "mangrove-rhizophora",
Type= "flora",
CommonName= "Bakau Merah",
ScientificName= "Rhizophora mucronata",
Description=
"Tumbuhan bakau dengan akar tunjang khas. Berfungsi sebagai benteng alami pesisir Jakarta terhadap abrasi dan intrusi air laut.",
Habitat= "Kawasan pesisir berlumpur, muara sungai, air payau.",
ConservationStatus= "Dilindungi",
Image= "sp-mangrove.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
},
new()
{
Slug= "bunga-kamboja",
Type= "flora",
CommonName= "Kamboja Putih",
ScientificName= "Plumeria alba",
Description=
"Pohon hias berbunga harum dengan kelopak putih dan kuning di tengah. Populer di pekarangan dan taman kota.",
Habitat= "Daerah tropis kering, tanah berdrainase baik.",
ConservationStatus= "Aman",
Image= "sp-kamboja.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "taman-menteng"}
},
new()
{
Slug= "anggrek-bulan",
Type= "flora",
CommonName= "Anggrek Bulan",
ScientificName= "Phalaenopsis amabilis",
Description=
"Bunga nasional Indonesia (Puspa Pesona). Berkelopak lebar putih murni, tumbuh menempel pada batang pohon.",
Habitat= "Epifit pada pohon di hutan tropis lembab.",
ConservationStatus= "Rentan",
Image= "sp-anggrek.jpg",
LocationSlugs = new List<string>
{"hutan-kota-srengseng", "tebet-eco-park"}
},
new()
{
Slug= "bambu-kuning",
Type= "flora",
CommonName= "Bambu Kuning",
ScientificName= "Bambusa vulgaris",
Description=
"Rumpun bambu berbatang kuning cerah yang tumbuh cepat. Berperan penting menyerap air tanah dan mencegah erosi.",
Habitat= "Tanah lembab di tepi sungai, taman, dan hutan kota.",
ConservationStatus= "Aman",
Image= "sp-bambu.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "hutan-kota-srengseng"}
},
new()
{
Slug= "burung-kutilang",
Type= "fauna",
CommonName= "Burung Kutilang",
ScientificName= "Pycnonotus aurigaster",
Description=
"Burung pengicau kecil dengan tunggir kuning cerah. Salah satu burung liar paling umum di taman-taman Jakarta.",
Habitat= "Taman kota, pekarangan, hutan sekunder.",
ConservationStatus= "Aman",
Image= "sp-kutilang.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "taman-menteng", "hutan-kota-gbk"}
},
new()
{
Slug= "burung-madu-sriganti",
Type= "fauna",
CommonName= "Burung Madu Sriganti",
ScientificName= "Cinnyris jugularis",
Description=
"Burung kecil berwarna cerah, jantan berdada hitam berkilau. Penghisap nektar bunga di taman dan hutan kota.",
Habitat= "Taman berbunga, semak berbunga, pinggir hutan.",
ConservationStatus= "Dilindungi",
Image= "sp-madu-sriganti.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "hutan-kota-srengseng", "mangrove-pik"}
},
new()
{
Slug= "kupu-kupu-raja",
Type= "fauna",
CommonName= "Kupu-kupu Raja",
ScientificName= "Papilio memnon",
Description=
"Kupu-kupu besar berwarna hitam kebiruan dengan sayap lebar. Penyerbuk penting bagi berbagai tanaman berbunga.",
Habitat= "Taman berbunga, hutan sekunder, pinggir sungai.",
ConservationStatus= "Aman",
Image= "sp-kupu-kupu.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "hutan-kota-srengseng"}
},
new()
{
Slug= "biawak-air",
Type= "fauna",
CommonName= "Biawak Air",
ScientificName= "Varanus salvator",
Description=
"Reptil besar semi-akuatik dengan lidah bercabang. Predator alami yang membantu mengendalikan populasi tikus di ekosistem kota.",
Habitat= "Rawa, sungai, hutan mangrove.",
ConservationStatus= "Dilindungi",
Image= "sp-biawak.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
},
new()
{
Slug= "monyet-ekor-panjang",
Type= "fauna",
CommonName= "Monyet Ekor Panjang",
ScientificName= "Macaca fascicularis",
Description=
"Primata berbulu abu-abu kecoklatan dengan ekor panjang. Hidup berkelompok di kawasan hutan yang tersisa.",
Habitat= "Hutan mangrove, hutan sekunder, tepi sungai.",
ConservationStatus= "Rentan",
Image= "sp-monyet.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
},
new()
{
Slug= "elang-bondol",
Type= "fauna",
CommonName= "Elang Bondol",
ScientificName= "Haliastur indus",
Description=
"Elang berkepala putih dengan tubuh coklat kemerahan. Maskot Provinsi DKI Jakarta dan simbol kekayaan hayati pesisir.",
Habitat= "Pesisir, mangrove, muara sungai.",
ConservationStatus= "Dilindungi",
Image= "sp-elang-bondol.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
},
}
};
return View(model);

View File

@ -50,7 +50,200 @@ namespace kehati.Controllers
public IActionResult Detail(string slug)
{
ViewBag.Slug = slug;
return View();
var lokasi = new LokasiModel
{
Slug = "tebet-eco-park",
Name = "Tebet Eco Park",
Region = "Jakarta Selatan",
Area = "15.3 Ha",
FloraCount = 45,
FaunaCount = 20,
Total = 100,
Description = "Taman kota modern yang mengintegrasikan ekologi dan ruang publik. Rumah bagi puluhan jenis tanaman lokal serta berbagai burung dan serangga penyerbuk.",
Image = "loc-tebet.jpg"
};
var model = new HomeViewModel
{
Location = lokasi,
FeaturedSpesies = new List<SpesiesModel>
{
new()
{
Slug = "pohon-trembesi",
Type = "flora",
CommonName = "Pohon Trembesi",
ScientificName = "Samanea saman",
Description =
"Pohon peneduh raksasa dengan tajuk lebar menyerupai payung. Sangat efektif menyerap karbon dioksida sehingga banyak ditanam di ruang publik Jakarta.",
Habitat = "Tumbuh baik di dataran rendah tropis, tanah subur, sinar matahari penuh.",
ConservationStatus = "Aman",
Image = "sp-trembesi.jpg",
LocationSlugs = new List<string>
{
"tebet-eco-park",
"hutan-kota-gbk",
"taman-menteng"
}
},
new()
{
Slug= "pohon-beringin",
Type= "flora",
CommonName= "Pohon Beringin",
ScientificName= "Ficus benjamina",
Description=
"Pohon rindang dengan akar udara khas yang menjuntai. Simbol keteduhan dan sering dijumpai di taman kota serta ruang publik Jakarta.",
Habitat= "Iklim tropis, tanah lembab, tahan terhadap polusi udara perkotaan.",
ConservationStatus= "Aman",
Image= "sp-beringin.jpg",
LocationSlugs = new List<string>
{"hutan-kota-srengseng", "taman-menteng", "hutan-kota-gbk"}
},
new()
{
Slug= "mangrove-rhizophora",
Type= "flora",
CommonName= "Bakau Merah",
ScientificName= "Rhizophora mucronata",
Description=
"Tumbuhan bakau dengan akar tunjang khas. Berfungsi sebagai benteng alami pesisir Jakarta terhadap abrasi dan intrusi air laut.",
Habitat= "Kawasan pesisir berlumpur, muara sungai, air payau.",
ConservationStatus= "Dilindungi",
Image= "sp-mangrove.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
},
new()
{
Slug= "bunga-kamboja",
Type= "flora",
CommonName= "Kamboja Putih",
ScientificName= "Plumeria alba",
Description=
"Pohon hias berbunga harum dengan kelopak putih dan kuning di tengah. Populer di pekarangan dan taman kota.",
Habitat= "Daerah tropis kering, tanah berdrainase baik.",
ConservationStatus= "Aman",
Image= "sp-kamboja.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "taman-menteng"}
},
new()
{
Slug= "anggrek-bulan",
Type= "flora",
CommonName= "Anggrek Bulan",
ScientificName= "Phalaenopsis amabilis",
Description=
"Bunga nasional Indonesia (Puspa Pesona). Berkelopak lebar putih murni, tumbuh menempel pada batang pohon.",
Habitat= "Epifit pada pohon di hutan tropis lembab.",
ConservationStatus= "Rentan",
Image= "sp-anggrek.jpg",
LocationSlugs = new List<string>
{"hutan-kota-srengseng", "tebet-eco-park"}
},
new()
{
Slug= "bambu-kuning",
Type= "flora",
CommonName= "Bambu Kuning",
ScientificName= "Bambusa vulgaris",
Description=
"Rumpun bambu berbatang kuning cerah yang tumbuh cepat. Berperan penting menyerap air tanah dan mencegah erosi.",
Habitat= "Tanah lembab di tepi sungai, taman, dan hutan kota.",
ConservationStatus= "Aman",
Image= "sp-bambu.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "hutan-kota-srengseng"}
},
new()
{
Slug= "burung-kutilang",
Type= "fauna",
CommonName= "Burung Kutilang",
ScientificName= "Pycnonotus aurigaster",
Description=
"Burung pengicau kecil dengan tunggir kuning cerah. Salah satu burung liar paling umum di taman-taman Jakarta.",
Habitat= "Taman kota, pekarangan, hutan sekunder.",
ConservationStatus= "Aman",
Image= "sp-kutilang.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "taman-menteng", "hutan-kota-gbk"}
},
new()
{
Slug= "burung-madu-sriganti",
Type= "fauna",
CommonName= "Burung Madu Sriganti",
ScientificName= "Cinnyris jugularis",
Description=
"Burung kecil berwarna cerah, jantan berdada hitam berkilau. Penghisap nektar bunga di taman dan hutan kota.",
Habitat= "Taman berbunga, semak berbunga, pinggir hutan.",
ConservationStatus= "Dilindungi",
Image= "sp-madu-sriganti.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "hutan-kota-srengseng", "mangrove-pik"}
},
new()
{
Slug= "kupu-kupu-raja",
Type= "fauna",
CommonName= "Kupu-kupu Raja",
ScientificName= "Papilio memnon",
Description=
"Kupu-kupu besar berwarna hitam kebiruan dengan sayap lebar. Penyerbuk penting bagi berbagai tanaman berbunga.",
Habitat= "Taman berbunga, hutan sekunder, pinggir sungai.",
ConservationStatus= "Aman",
Image= "sp-kupu-kupu.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "hutan-kota-srengseng"}
},
new()
{
Slug= "biawak-air",
Type= "fauna",
CommonName= "Biawak Air",
ScientificName= "Varanus salvator",
Description=
"Reptil besar semi-akuatik dengan lidah bercabang. Predator alami yang membantu mengendalikan populasi tikus di ekosistem kota.",
Habitat= "Rawa, sungai, hutan mangrove.",
ConservationStatus= "Dilindungi",
Image= "sp-biawak.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
},
new()
{
Slug= "monyet-ekor-panjang",
Type= "fauna",
CommonName= "Monyet Ekor Panjang",
ScientificName= "Macaca fascicularis",
Description=
"Primata berbulu abu-abu kecoklatan dengan ekor panjang. Hidup berkelompok di kawasan hutan yang tersisa.",
Habitat= "Hutan mangrove, hutan sekunder, tepi sungai.",
ConservationStatus= "Rentan",
Image= "sp-monyet.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
},
new()
{
Slug= "elang-bondol",
Type= "fauna",
CommonName= "Elang Bondol",
ScientificName= "Haliastur indus",
Description=
"Elang berkepala putih dengan tubuh coklat kemerahan. Maskot Provinsi DKI Jakarta dan simbol kekayaan hayati pesisir.",
Habitat= "Pesisir, mangrove, muara sungai.",
ConservationStatus= "Dilindungi",
Image= "sp-elang-bondol.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
}
}
};
return View(model);
}
}
}

View File

@ -10,6 +10,7 @@ public class HomeViewModel
public string lokasi { get; set; } = "";
public string Results { get; set; } = "";
public StatistikHomeModel Statistik { get; set; } = new();
public LokasiModel Location { get; set; } = new();
public List<LokasiModel> FeaturedLocations { get; set; } = new();
public List<SpesiesModel> FeaturedSpesies { get; set; } = new();

View File

@ -9,12 +9,14 @@ public class LokasiModel
public string Image { get; set; } = "";
public string Region { get; set; } = "";
public string Description { get; set; } = "";
public string Area { get; set; } = "";
public string Latitude { get; set; } = "";
public string Longitude { get; set; } = "";
public int FloraCount { get; set; }
public int Total { get; set; }
public int FaunaCount { get; set; }

View File

@ -1,3 +1,273 @@
@{
ViewData["Title"] = "Lokasi Detail";
var statusColor = new Dictionary<string, string>
{
{ "Aman", "bg-primary/10 text-primary border-primary/20" },
{ "Rentan", "bg-amber-100 text-amber-800 border-amber-200" },
{ "Terancam", "bg-orange-100 text-orange-800 border-orange-200" },
{ "Kritis", "bg-red-100 text-red-800 border-red-200" },
{ "Dilindungi", "bg-emerald-100 text-emerald-800 border-emerald-200" }
};
@model kehati.Models.HomeViewModel
var flora = Model.FeaturedSpesies.Where(x => x.Type == "flora").ToList();
var fauna = Model.FeaturedSpesies.Where(x => x.Type == "fauna").ToList();
}
<div>
<div class="relative h-[45vh] min-h-[320px] overflow-hidden">
<img src="~/images/@Model.Location.Image" asp-append-version="true" alt="@Model.Location.Name" class="h-full w-full object-cover"/>
<div class="absolute inset-0 bg-gradient-to-t from-background via-background/40 to-background/10"></div>
</div>
</div>
<div class="mx-auto mt-24 max-w-5xl px-4 sm:px-6 lg:px-8">
<div class="rounded-2xl border border-border bg-card p-8 shadow-sm sm:p-10">
<a asp-controller="lokasi"
asp-action="index"
class="inline-flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground">
<i data-lucide="arrow-left" class="h-4 w-4"></i>
Semua lokasi
</a>
<h1 class="mt-4 font-serif text-4xl leading-tight text-foreground sm:text-5xl">
@Model.Location.Name
</h1>
<div class="mt-4 flex flex-wrap gap-x-6 gap-y-2 text-sm text-muted-foreground">
<span class="inline-flex items-center gap-1.5">
<i data-lucide="map-pin" class="h-4 w-4 text-primary"></i>
@Model.Location.Region
</span>
<span class="inline-flex items-center gap-1.5">
<i data-lucide="ruler" class="h-4 w-4 text-primary"></i>
@Model.Location.Area
</span>
</div>
<p class="mt-6 max-w-3xl text-base leading-relaxed text-muted-foreground">
@Model.Location.Description
</p>
<div class="mt-6 flex gap-8 text-sm">
<div>
<div class="font-serif text-3xl text-primary">
@Model.Location.FloraCount
</div>
<div class="text-xs uppercase tracking-widest text-muted-foreground">
Flora
</div>
</div>
<div>
<div class="font-serif text-3xl text-primary">
@Model.Location.FaunaCount
</div>
<div class="text-xs uppercase tracking-widest text-muted-foreground">
Fauna
</div>
</div>
</div>
</div>
</div>
<div class="mx-auto max-w-5xl px-4 py-16 sm:px-6 lg:px-8">
<div class="flex flex-wrap gap-3">
<button class="tab-btn active" data-tab="all">
Semua (@Model.FeaturedSpesies.Count)
</button>
<button class="tab-btn" data-tab="flora">
Flora (@flora.Count)
</button>
<button class="tab-btn" data-tab="fauna">
Fauna (@fauna.Count)
</button>
</div>
<div id="tab-all" class="tab-content mt-8">
<div class="grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
@foreach(SpesiesModel s in Model.FeaturedSpesies)
{
<a asp-controller="katalog" asp-action="detail" asp-route-slug="@s.Slug" class="group block overflow-hidden rounded-2xl border border-border bg-card transition-all hover:-translate-y-1 hover:shadow-lg">
<!-- Image -->
<div class="relative aspect-[4/3] overflow-hidden bg-muted">
<img src="~/images/@s.Image"
alt="@s.CommonName"
loading="lazy"
asp-append-version="true"
class="h-full w-full object-cover transition-transform duration-500 group-hover:scale-105" />
<!-- Type Badge -->
<div class="absolute left-3 top-3 flex items-center gap-1.5 rounded-full bg-background/90 px-2.5 py-1 text-[11px] font-medium capitalize backdrop-blur">
@if(s.Type == "Flora")
{
<i data-lucide="leaf" class="h-3 w-3"></i>
}
else
{
<i data-lucide="bird" class="h-3 w-3"></i>
}
@s.Type
</div>
</div>
<!-- Content -->
<div class="p-4">
<div class="flex items-start justify-between gap-2">
<h3 class="font-serif text-lg leading-tight text-foreground">
@s.CommonName
</h3>
</div>
<p class="mt-0.5 text-xs italic text-muted-foreground">
@s.ScientificName
</p>
<!-- Status Badge -->
<div class="mt-3">
<span class="inline-flex items-center rounded-md border px-2.5 py-1 text-xs font-medium
@(statusColor.ContainsKey(s.ConservationStatus)
? statusColor[s.ConservationStatus]
: "")">
@s.ConservationStatus
</span>
</div>
</div>
</a>
}
</div>
</div>
<div id="tab-flora" class="tab-content mt-8 hidden">
<div class="grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
@foreach(var s in flora)
{
<a asp-controller="katalog" asp-action="detail" asp-route-slug="@s.Slug" class="group block overflow-hidden rounded-2xl border border-border bg-card transition-all hover:-translate-y-1 hover:shadow-lg">
<!-- Image -->
<div class="relative aspect-[4/3] overflow-hidden bg-muted">
<img src="~/images/@s.Image"
alt="@s.CommonName"
loading="lazy"
asp-append-version="true"
class="h-full w-full object-cover transition-transform duration-500 group-hover:scale-105" />
<!-- Type Badge -->
<div class="absolute left-3 top-3 flex items-center gap-1.5 rounded-full bg-background/90 px-2.5 py-1 text-[11px] font-medium capitalize backdrop-blur">
@if(s.Type == "Flora")
{
<i data-lucide="leaf" class="h-3 w-3"></i>
}
else
{
<i data-lucide="bird" class="h-3 w-3"></i>
}
@s.Type
</div>
</div>
<!-- Content -->
<div class="p-4">
<div class="flex items-start justify-between gap-2">
<h3 class="font-serif text-lg leading-tight text-foreground">
@s.CommonName
</h3>
</div>
<p class="mt-0.5 text-xs italic text-muted-foreground">
@s.ScientificName
</p>
<!-- Status Badge -->
<div class="mt-3">
<span class="inline-flex items-center rounded-md border px-2.5 py-1 text-xs font-medium
@(statusColor.ContainsKey(s.ConservationStatus)
? statusColor[s.ConservationStatus]
: "")">
@s.ConservationStatus
</span>
</div>
</div>
</a>
}
</div>
</div>
<div id="tab-fauna" class="tab-content mt-8 hidden">
<div class="grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
@foreach(SpesiesModel s in fauna)
{
<a asp-controller="katalog" asp-action="detail" asp-route-slug="@s.Slug" class="group block overflow-hidden rounded-2xl border border-border bg-card transition-all hover:-translate-y-1 hover:shadow-lg">
<!-- Image -->
<div class="relative aspect-[4/3] overflow-hidden bg-muted">
<img src="~/images/@s.Image"
alt="@s.CommonName"
loading="lazy"
asp-append-version="true"
class="h-full w-full object-cover transition-transform duration-500 group-hover:scale-105" />
<!-- Type Badge -->
<div class="absolute left-3 top-3 flex items-center gap-1.5 rounded-full bg-background/90 px-2.5 py-1 text-[11px] font-medium capitalize backdrop-blur">
@if(s.Type == "Flora")
{
<i data-lucide="leaf" class="h-3 w-3"></i>
}
else
{
<i data-lucide="bird" class="h-3 w-3"></i>
}
@s.Type
</div>
</div>
<!-- Content -->
<div class="p-4">
<div class="flex items-start justify-between gap-2">
<h3 class="font-serif text-lg leading-tight text-foreground">
@s.CommonName
</h3>
</div>
<p class="mt-0.5 text-xs italic text-muted-foreground">
@s.ScientificName
</p>
<!-- Status Badge -->
<div class="mt-3">
<span class="inline-flex items-center rounded-md border px-2.5 py-1 text-xs font-medium
@(statusColor.ContainsKey(s.ConservationStatus)
? statusColor[s.ConservationStatus]
: "")">
@s.ConservationStatus
</span>
</div>
</div>
</a>
}
</div>
</div>
</div>
@section Scripts{
<script>
document.querySelectorAll(".tab-btn").forEach(btn=>{
btn.addEventListener("click",function(){
document.querySelectorAll(".tab-btn")
.forEach(x=>x.classList.remove("active"));
this.classList.add("active");
document.querySelectorAll(".tab-content")
.forEach(x=>x.classList.add("hidden"));
document
.getElementById("tab-"+this.dataset.tab)
.classList.remove("hidden");
});
});
</script>
}

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("kehati")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+90e28904fae88ecb9ed4f0f1220d37650387567d")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+36d77a7c38b1047de7c7b3c46f2b91dae14000b7")]
[assembly: System.Reflection.AssemblyProductAttribute("kehati")]
[assembly: System.Reflection.AssemblyTitleAttribute("kehati")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@ -1 +1 @@
9c01b1841f9a1c818d0dd43165fccf462e7f9dcfc3e798c4f8042450d4e2f399
3cd5cf29dc56f470419d695e943e0b42bb96d0b035c5dd5a2a973054ec85c27a

View File

@ -21,7 +21,6 @@
/Applications/MAMP/htdocs/kehati/obj/Debug/net9.0/scopedcss/Views/Shared/_Layout.cshtml.rz.scp.css
/Applications/MAMP/htdocs/kehati/obj/Debug/net9.0/scopedcss/bundle/kehati.styles.css
/Applications/MAMP/htdocs/kehati/obj/Debug/net9.0/scopedcss/projectbundle/kehati.bundle.scp.css
/Applications/MAMP/htdocs/kehati/obj/Debug/net9.0/compressed/y5cxcra3jr-b9sayid5wm.gz
/Applications/MAMP/htdocs/kehati/obj/Debug/net9.0/compressed/mrrvpgzc9b-61n19gt1b8.gz
/Applications/MAMP/htdocs/kehati/obj/Debug/net9.0/compressed/rsssl4ehv7-xtxxf3hu2r.gz
/Applications/MAMP/htdocs/kehati/obj/Debug/net9.0/compressed/jkx4m99mlx-bqjiyaj88i.gz
@ -96,4 +95,5 @@
/Applications/MAMP/htdocs/kehati/obj/Debug/net9.0/ref/kehati.dll
/Applications/MAMP/htdocs/kehati/bin/Debug/net9.0/package-lock.json
/Applications/MAMP/htdocs/kehati/bin/Debug/net9.0/package.json
/Applications/MAMP/htdocs/kehati/obj/Debug/net9.0/compressed/nskz5oaabv-rpkmhdruhm.gz
/Applications/MAMP/htdocs/kehati/obj/Debug/net9.0/compressed/y5cxcra3jr-ibxsq7mcux.gz
/Applications/MAMP/htdocs/kehati/obj/Debug/net9.0/compressed/nskz5oaabv-trnh2byzch.gz

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

View File

@ -1 +1 @@
{"GlobalPropertiesHash":"hc8FL4d4SDyJq22ZKuiHZVVsIHQC48YE/mA5pBHYKc4=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"R7Rea/YQmcweqCbKffD9oUelggfpJQX85r65aYZsas0=","InputHashes":["w16VN9xOimoxck1LjBNXWd9fHMNU3UnlFI\u002B\u002ByZnoFg0=","VOxc8xcqWt6gAM\u002BRuyfRLL1iQY9qPYh4n8cvKjwI3NY=","Sncp4ww/tjimD30ejpDv5D5eCiY\u002BGNCBHG31XvywcgE=","RSbekUJC7incuVtr7C0tXRzZN4BZamYDVsEZmrfQMcY=","0dj\u002B7dC25IeuLKXvwnTzfQVy\u002BUdHnl40sHhE/lKWrRI=","KPTC6joZ0rLn0eml9/Lsh6v1w6OotgKIxbWPkQPSc2U=","oc5dZJn7YA7RsQ0gtAnGAh7rgEphv3dYfFRixIhMKuU=","IBx1Zpi0iRpuwQy5fUr\u002B0BIjRN/f7k\u002BLtsRCoyIqdKg=","x60hTcC5q95RUcHEJci6kZJX\u002BOP5ZncNTZnLKMrK9TQ=","NQukUql2iNTO4MQCyXa8T8bDU1wDElRnV\u002BBc2yCjEHg=","MgtQemV1N1h3/pFRW/IBNT4EgLJYsuxU0zbAcfbRCb4=","Goe41XQAQHCAcUIB4rTr07EWxMhW4VLC35VQ3i8zogk=","8bEfz8MdGCT\u002BUqVKCJhjT0KyMmRaMYgY/zLLZ1asfpE=","Ibz6Ix07csPbM7Pw2WcZZH0awAHeeZ0osg23I/UHwso=","icl4Xuqd3wVKdyQVGN6K0RJuiPUiZ1J3ZMQUAoAzfT0=","dweympdBNxv56b5xEWZUlkihih0FcF9WdEhWCjq2cXc=","fiFS/KvqSehFNqqcPmIkVbUMcMmBAjue0bCe3g32ZYs=","T3X1M\u002BUddK1SoFQOwNXuQKnudpv8ohop7rTlXDRkn4A=","QDGCJ/H0sJVm29CRqaE0VjtfDzWSx48qBmGqriGN89I=","WWNvV\u002BI7oSnu9ecmCS0Mck2eCGJvRs9a5UgkPxCOjRA=","Xc9BeHGukGDOMxRJ4DWKsD4Hl/eb6mEQZL6YmMBPRoY=","fOkK1386yU0SP0SXkMTynAZIbKu8kDOYliwg0q\u002BNskY=","oct6eD0w1zvUhMj0MXoNwhWFE2YjuoYqg3X96Ucuj4s=","67V7nn6u9b0acsh53M2HmglNpcktUtvOaw3gSRkwjx4=","ma1u/4RE/To974RJYUPGyGaqvCCeme6zJysx9w1ss3c=","o55JlXqf9P5uAQ2khL\u002B6zb9Tdmwm6I1og1gMy1YLpYY=","e0xtx5OOXKYFYOH5RifNbjh4spMMZ4OJe/5WIl23q7I=","5tm4FTjJTYh\u002BIfly7jRHNn4wSziZxSIN8wAEvIw\u002Bqjw=","BHdvCHnZlyS4zwSKcVy3ayvJezMLJXLcVN9R8deaH0g=","ntzaTVX8xBXsH995gvvXvmliXlCQotIsZXpZcglhOaE=","5kR/aL1DviNsyODfcczgmMzxSZCePCH9RPdTfI\u002BcgyA=","85jPWChWoCRZbXQRGb0iFqvZVPOqR7ev3FjdbkOn3N8=","Nbx2WCrP2GEddQzxS83sJa0zFj93vdmpK4GM2nty9uc=","QJPJj2QugL4XCdpHR\u002BUjqru7nIH7z/53/LJfz\u002B2u78E=","0OChFB9xM4RUbmHFnou7uAEh\u002BDlF54KM6B6j00g5Tmw=","ykyMr/QcfGzV063qPhl8tX3/1moBCOJG611QWUQ\u002BbHY=","/CLnWX/m7JPrsLGY\u002BXHRNWDTPsPKGvhpoUNMvUVySdk=","CkYBQvKkMzORePi8WPMM9aW2Lc3xVg5GJyDtKLXwYmY=","xwGlvpWqKnaz0RVaeRVxQ0PJMwOhvULJb3PN/FnF55I=","4xahvZCLorqqeX8Bk5JA9YF2zYf76VJFw\u002BFYV0Le/k0=","5SqPyjpm7H9Zc\u002BBbXBtZiOjmSi5f2cQeYLc7FuoB/ek=","0O4aVW29Vzt0B4Iet0T1oBGOM020UM\u002BLK2/yEbKH2dU=","HMwYA0Zexo0VNDlvtKgkk/e28ujKc1aNC91bm0MLMdk=","iNfcu84P3JCmFtqZp1chAvwyIZTOhH2RqhEneyvLrhs=","2hARyYn7NC4gbrlXbXtVzxaTHpcnwtUTyyjbnSGMmcs=","wHeoBQH8D12d4FpBCQgSAl7Y98J2wIbXVO87I4Oqnmo=","8cQHbaseDOOEdr82\u002B4L1dLbZfVOBGCzj7m1oStCM4RY=","8WGZEIW0hbJT1XkzSCtnaB50AHFRFH4MihnUs34mxhA=","3ZZyBE\u002BdA6aG7oGYzH8eisN1SphrAdQG8rxBn\u002BDzo/w=","BfFJRPyrADpgktkNNc2mfyFFZoBqauN9MCmAUWxe9Ug=","97Ja5zuGdMucJqedxH7CguZ\u002BiLSY4xYuyTXfJE/3mUs=","Gd2mz0U9mny2BKIeKQ\u002BRDt3csebXGOTHzvpBKmzTj9M=","ymiC674Nr\u002BpzpfZQAvz7VgMKWyqBem/OjSN8QeM3478=","tXqEhWxbNOqNYKJvB\u002B6TTsEx8KNlmzLfTndlyi8dcpg=","nYQ\u002BrXWj8wJ\u002BUt/T6U/wVc9UHvQjMUXDgcAtNNlnlcA=","qkZKbEyxkxbCDFtQ06Z9p3Fqpr6AUZHUiFlVpL00cJY=","mb/vdMDaE9L3J1vibUT8coaPWWPSUbGacfV5H5IP\u002BwU=","\u002BHDgqKS6Nqa5bRN/WtecsLITGr6T6whhbWPV0RjwQwM=","Gig3DQsXKloHGlDlRN26sGVUvT8\u002Bu50xYCWb/DK3fTE=","k5m16lGuQyO6e9aY4k1OYGzBolX0sixXAbsVhNDa7fQ=","MrFgmWKVAxban9XX2uqZQO23DWw0NGjsnWiIu9p11jo=","YQgUcWz2ue2oRWm0L9A\u002B\u002BDN/X2SNcdMG3yyz/5A0N4w=","XsOFFGStfZmGs4rkShh2uK3eN2ongLE0d9KBNjaXb6o=","7ITk8hLOO4uilCzXKB1iYKDtCVKMZ2vApR6K0z9qx0c=","RG4n1qULpz4qGNsyBiHJ1ebTfk9LKVz89pL0eSC8gPc=","4EfJtzv9kg3WWFzBqUt8CbF91bcAtW2ocJG4JUrULj8=","S2dH4yX4W/BjGC7Cp1Ov1rAVBSZJlC1sZbKwQRqMA4M=","krL8lBCCkIWVGoLQQThjIfoe6qs/xBAVnhPU3ywnuSs=","5Ad\u002Bef7REpth\u002B1aDMBr3B0HUtzchjmHZ69ipQ7F2ztQ=","0wADQAsURdwl9hsWFMFxN8u51iyhIefZ0\u002BfAdgRzQBM=","6omG1NdZNuYtZDubEy\u002BDST7\u002BfwfA5A3g2vDv80vluVI=","rRoeWHDFv91Dmdy9uNkQCarQ5nvPkifcZ5GBvZJDKDc=","4bsNytNaXkRk3ePwPIbWzq4IwszFAfZcWbCknkEszmA=","eLvoEvqRTPWrPYwFjRNV8D92N\u002BkvcZnoiJi9t9njyTo=","uoiinJcNOciOgqlO0GZQN2smtr6KoTAnah6dv5mVzek=","YoagLoMl49bUAbErIjNPzkNdCDgBDT514c90F9nGnfE=","uzjUeW\u002BKe/Mh7NhfiBvuinD0gzUKuynWF2VbhEIulVQ=","LdNXSSS5DEGYhs9mcjWxtU5uYD9N3kfGTAPRl6j6qWg=","g0y10m2DgfWcR\u002BBdcBNPC0hbivhMAc0z5cHhsqH1Tzc=","TgJ8XvI1vjoz8U9BMJ1maLQnqweAMT4a8ZSbLYUzoAE=","x8umpBTg0fvarcVhS22jEVXuAcL5hqCQF3JRc1qsxro=","s44dS6GzxTQjxM/Pb8o8DITAn8xEEod4rcdnoe\u002BHnjU=","9IICJ536DO5SnYafRqGlL5Pf3mmi/qGFXYfX522YIl4="],"CachedAssets":{},"CachedCopyCandidates":{}}
{"GlobalPropertiesHash":"hc8FL4d4SDyJq22ZKuiHZVVsIHQC48YE/mA5pBHYKc4=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"R7Rea/YQmcweqCbKffD9oUelggfpJQX85r65aYZsas0=","InputHashes":["b8AT0bFrK41LbwjEdo/ilJjsEuj3Q2\u002Bzzd6Fb6hDHow=","VOxc8xcqWt6gAM\u002BRuyfRLL1iQY9qPYh4n8cvKjwI3NY=","Sncp4ww/tjimD30ejpDv5D5eCiY\u002BGNCBHG31XvywcgE=","RSbekUJC7incuVtr7C0tXRzZN4BZamYDVsEZmrfQMcY=","0dj\u002B7dC25IeuLKXvwnTzfQVy\u002BUdHnl40sHhE/lKWrRI=","KPTC6joZ0rLn0eml9/Lsh6v1w6OotgKIxbWPkQPSc2U=","oc5dZJn7YA7RsQ0gtAnGAh7rgEphv3dYfFRixIhMKuU=","IBx1Zpi0iRpuwQy5fUr\u002B0BIjRN/f7k\u002BLtsRCoyIqdKg=","x60hTcC5q95RUcHEJci6kZJX\u002BOP5ZncNTZnLKMrK9TQ=","NQukUql2iNTO4MQCyXa8T8bDU1wDElRnV\u002BBc2yCjEHg=","MgtQemV1N1h3/pFRW/IBNT4EgLJYsuxU0zbAcfbRCb4=","Goe41XQAQHCAcUIB4rTr07EWxMhW4VLC35VQ3i8zogk=","8bEfz8MdGCT\u002BUqVKCJhjT0KyMmRaMYgY/zLLZ1asfpE=","Ibz6Ix07csPbM7Pw2WcZZH0awAHeeZ0osg23I/UHwso=","icl4Xuqd3wVKdyQVGN6K0RJuiPUiZ1J3ZMQUAoAzfT0=","dweympdBNxv56b5xEWZUlkihih0FcF9WdEhWCjq2cXc=","fiFS/KvqSehFNqqcPmIkVbUMcMmBAjue0bCe3g32ZYs=","T3X1M\u002BUddK1SoFQOwNXuQKnudpv8ohop7rTlXDRkn4A=","QDGCJ/H0sJVm29CRqaE0VjtfDzWSx48qBmGqriGN89I=","WWNvV\u002BI7oSnu9ecmCS0Mck2eCGJvRs9a5UgkPxCOjRA=","Xc9BeHGukGDOMxRJ4DWKsD4Hl/eb6mEQZL6YmMBPRoY=","fOkK1386yU0SP0SXkMTynAZIbKu8kDOYliwg0q\u002BNskY=","oct6eD0w1zvUhMj0MXoNwhWFE2YjuoYqg3X96Ucuj4s=","67V7nn6u9b0acsh53M2HmglNpcktUtvOaw3gSRkwjx4=","ma1u/4RE/To974RJYUPGyGaqvCCeme6zJysx9w1ss3c=","o55JlXqf9P5uAQ2khL\u002B6zb9Tdmwm6I1og1gMy1YLpYY=","e0xtx5OOXKYFYOH5RifNbjh4spMMZ4OJe/5WIl23q7I=","5tm4FTjJTYh\u002BIfly7jRHNn4wSziZxSIN8wAEvIw\u002Bqjw=","BHdvCHnZlyS4zwSKcVy3ayvJezMLJXLcVN9R8deaH0g=","ntzaTVX8xBXsH995gvvXvmliXlCQotIsZXpZcglhOaE=","5kR/aL1DviNsyODfcczgmMzxSZCePCH9RPdTfI\u002BcgyA=","85jPWChWoCRZbXQRGb0iFqvZVPOqR7ev3FjdbkOn3N8=","Nbx2WCrP2GEddQzxS83sJa0zFj93vdmpK4GM2nty9uc=","QJPJj2QugL4XCdpHR\u002BUjqru7nIH7z/53/LJfz\u002B2u78E=","0OChFB9xM4RUbmHFnou7uAEh\u002BDlF54KM6B6j00g5Tmw=","ykyMr/QcfGzV063qPhl8tX3/1moBCOJG611QWUQ\u002BbHY=","/CLnWX/m7JPrsLGY\u002BXHRNWDTPsPKGvhpoUNMvUVySdk=","CkYBQvKkMzORePi8WPMM9aW2Lc3xVg5GJyDtKLXwYmY=","xwGlvpWqKnaz0RVaeRVxQ0PJMwOhvULJb3PN/FnF55I=","4xahvZCLorqqeX8Bk5JA9YF2zYf76VJFw\u002BFYV0Le/k0=","5SqPyjpm7H9Zc\u002BBbXBtZiOjmSi5f2cQeYLc7FuoB/ek=","0O4aVW29Vzt0B4Iet0T1oBGOM020UM\u002BLK2/yEbKH2dU=","HMwYA0Zexo0VNDlvtKgkk/e28ujKc1aNC91bm0MLMdk=","iNfcu84P3JCmFtqZp1chAvwyIZTOhH2RqhEneyvLrhs=","2hARyYn7NC4gbrlXbXtVzxaTHpcnwtUTyyjbnSGMmcs=","wHeoBQH8D12d4FpBCQgSAl7Y98J2wIbXVO87I4Oqnmo=","8cQHbaseDOOEdr82\u002B4L1dLbZfVOBGCzj7m1oStCM4RY=","8WGZEIW0hbJT1XkzSCtnaB50AHFRFH4MihnUs34mxhA=","3ZZyBE\u002BdA6aG7oGYzH8eisN1SphrAdQG8rxBn\u002BDzo/w=","BfFJRPyrADpgktkNNc2mfyFFZoBqauN9MCmAUWxe9Ug=","97Ja5zuGdMucJqedxH7CguZ\u002BiLSY4xYuyTXfJE/3mUs=","Gd2mz0U9mny2BKIeKQ\u002BRDt3csebXGOTHzvpBKmzTj9M=","ymiC674Nr\u002BpzpfZQAvz7VgMKWyqBem/OjSN8QeM3478=","tXqEhWxbNOqNYKJvB\u002B6TTsEx8KNlmzLfTndlyi8dcpg=","nYQ\u002BrXWj8wJ\u002BUt/T6U/wVc9UHvQjMUXDgcAtNNlnlcA=","qkZKbEyxkxbCDFtQ06Z9p3Fqpr6AUZHUiFlVpL00cJY=","mb/vdMDaE9L3J1vibUT8coaPWWPSUbGacfV5H5IP\u002BwU=","\u002BHDgqKS6Nqa5bRN/WtecsLITGr6T6whhbWPV0RjwQwM=","Gig3DQsXKloHGlDlRN26sGVUvT8\u002Bu50xYCWb/DK3fTE=","k5m16lGuQyO6e9aY4k1OYGzBolX0sixXAbsVhNDa7fQ=","MrFgmWKVAxban9XX2uqZQO23DWw0NGjsnWiIu9p11jo=","YQgUcWz2ue2oRWm0L9A\u002B\u002BDN/X2SNcdMG3yyz/5A0N4w=","XsOFFGStfZmGs4rkShh2uK3eN2ongLE0d9KBNjaXb6o=","7ITk8hLOO4uilCzXKB1iYKDtCVKMZ2vApR6K0z9qx0c=","RG4n1qULpz4qGNsyBiHJ1ebTfk9LKVz89pL0eSC8gPc=","4EfJtzv9kg3WWFzBqUt8CbF91bcAtW2ocJG4JUrULj8=","S2dH4yX4W/BjGC7Cp1Ov1rAVBSZJlC1sZbKwQRqMA4M=","krL8lBCCkIWVGoLQQThjIfoe6qs/xBAVnhPU3ywnuSs=","5Ad\u002Bef7REpth\u002B1aDMBr3B0HUtzchjmHZ69ipQ7F2ztQ=","0wADQAsURdwl9hsWFMFxN8u51iyhIefZ0\u002BfAdgRzQBM=","6omG1NdZNuYtZDubEy\u002BDST7\u002BfwfA5A3g2vDv80vluVI=","rRoeWHDFv91Dmdy9uNkQCarQ5nvPkifcZ5GBvZJDKDc=","4bsNytNaXkRk3ePwPIbWzq4IwszFAfZcWbCknkEszmA=","eLvoEvqRTPWrPYwFjRNV8D92N\u002BkvcZnoiJi9t9njyTo=","uoiinJcNOciOgqlO0GZQN2smtr6KoTAnah6dv5mVzek=","YoagLoMl49bUAbErIjNPzkNdCDgBDT514c90F9nGnfE=","uzjUeW\u002BKe/Mh7NhfiBvuinD0gzUKuynWF2VbhEIulVQ=","LdNXSSS5DEGYhs9mcjWxtU5uYD9N3kfGTAPRl6j6qWg=","g0y10m2DgfWcR\u002BBdcBNPC0hbivhMAc0z5cHhsqH1Tzc=","TgJ8XvI1vjoz8U9BMJ1maLQnqweAMT4a8ZSbLYUzoAE=","x8umpBTg0fvarcVhS22jEVXuAcL5hqCQF3JRc1qsxro=","s44dS6GzxTQjxM/Pb8o8DITAn8xEEod4rcdnoe\u002BHnjU=","P6p1PivC7LaQdOqjFCUMRjw6\u002BMvlE3W9ElnOgEcy/mk="],"CachedAssets":{},"CachedCopyCandidates":{}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
BxMG25HaC4cDx43ATP16A26Fd1LourrI+W15Xsp+loU=
kzGxoKXWby4yRRWxtx4csqoxm3jxzD8L8LsSAHk9d4E=

File diff suppressed because one or more lines are too long

View File

@ -25,6 +25,7 @@
--container-sm: 24rem;
--container-xl: 36rem;
--container-2xl: 42rem;
--container-3xl: 48rem;
--container-5xl: 64rem;
--container-7xl: 80rem;
--text-xs: 0.75rem;
@ -39,6 +40,8 @@
--text-xl--line-height: calc(1.75 / 1.25);
--text-2xl: 1.5rem;
--text-2xl--line-height: calc(2 / 1.5);
--text-3xl: 1.875rem;
--text-3xl--line-height: calc(2.25 / 1.875);
--text-4xl: 2.25rem;
--text-4xl--line-height: calc(2.5 / 2.25);
--text-5xl: 3rem;
@ -500,6 +503,9 @@
.me-auto {
margin-inline-end: auto;
}
.-mt-24 {
margin-top: calc(var(--spacing) * -24);
}
.mt-0 {
margin-top: 0;
}
@ -641,6 +647,9 @@
.h-100 {
height: calc(var(--spacing) * 100);
}
.h-\[45vh\] {
height: 45vh;
}
.h-\[600px\] {
height: 600px;
}
@ -650,6 +659,9 @@
.h-full {
height: 100%;
}
.min-h-\[320px\] {
min-height: 320px;
}
.w-3 {
width: calc(var(--spacing) * 3);
}
@ -689,6 +701,9 @@
.max-w-2xl {
max-width: var(--container-2xl);
}
.max-w-3xl {
max-width: var(--container-3xl);
}
.max-w-5xl {
max-width: var(--container-5xl);
}
@ -830,6 +845,12 @@
margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)));
}
}
.gap-x-6 {
column-gap: calc(var(--spacing) * 6);
}
.gap-y-2 {
row-gap: calc(var(--spacing) * 2);
}
.divide-x {
:where(& > :not(:last-child)) {
--tw-divide-x-reverse: 0;
@ -1082,6 +1103,14 @@
}
--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
}
.via-background\/40 {
--tw-gradient-via: var(--background);
@supports (color: color-mix(in lab, red, red)) {
--tw-gradient-via: color-mix(in oklab, var(--background) 40%, transparent);
}
--tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);
--tw-gradient-stops: var(--tw-gradient-via-stops);
}
.via-background\/85 {
--tw-gradient-via: var(--background);
@supports (color: color-mix(in lab, red, red)) {
@ -1098,6 +1127,13 @@
--tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);
--tw-gradient-stops: var(--tw-gradient-via-stops);
}
.to-background\/10 {
--tw-gradient-to: var(--background);
@supports (color: color-mix(in lab, red, red)) {
--tw-gradient-to: color-mix(in oklab, var(--background) 10%, transparent);
}
--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
}
.to-background\/40 {
--tw-gradient-to: var(--background);
@supports (color: color-mix(in lab, red, red)) {
@ -1317,6 +1353,10 @@
font-size: var(--text-2xl);
line-height: var(--tw-leading, var(--text-2xl--line-height));
}
.text-3xl {
font-size: var(--text-3xl);
line-height: var(--tw-leading, var(--text-3xl--line-height));
}
.text-4xl {
font-size: var(--text-4xl);
line-height: var(--tw-leading, var(--text-4xl--line-height));
@ -1553,39 +1593,6 @@
}
}
}
.file\:border-0 {
&::file-selector-button {
border-style: var(--tw-border-style);
border-width: 0px;
}
}
.file\:bg-transparent {
&::file-selector-button {
background-color: transparent;
}
}
.file\:text-sm {
&::file-selector-button {
font-size: var(--text-sm);
line-height: var(--tw-leading, var(--text-sm--line-height));
}
}
.file\:font-medium {
&::file-selector-button {
--tw-font-weight: var(--font-weight-medium);
font-weight: var(--font-weight-medium);
}
}
.file\:text-foreground {
&::file-selector-button {
color: var(--foreground);
}
}
.placeholder\:text-muted-foreground {
&::placeholder {
color: var(--muted-foreground);
}
}
.hover\:-translate-y-1 {
&:hover {
@media (hover: hover) {
@ -1641,33 +1648,6 @@
}
}
}
.focus-visible\:ring-1 {
&:focus-visible {
--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
}
}
.focus-visible\:ring-ring {
&:focus-visible {
--tw-ring-color: var(--ring);
}
}
.focus-visible\:outline-none {
&:focus-visible {
--tw-outline-style: none;
outline-style: none;
}
}
.disabled\:cursor-not-allowed {
&:disabled {
cursor: not-allowed;
}
}
.disabled\:opacity-50 {
&:disabled {
opacity: 50%;
}
}
.sm\:inline-flex {
@media (width >= 40rem) {
display: inline-flex;
@ -1730,12 +1710,6 @@
grid-template-columns: repeat(3, minmax(0, 1fr));
}
}
.md\:text-sm {
@media (width >= 48rem) {
font-size: var(--text-sm);
line-height: var(--tw-leading, var(--text-sm--line-height));
}
}
.lg\:col-span-2 {
@media (width >= 64rem) {
grid-column: span 2 / span 2;

View File

@ -2,6 +2,18 @@ html {
font-size: 14px;
}
.tab-btn{
@apply rounded-lg border border-border px-4 py-2 text-sm transition;
}
.tab-btn:hover{
@apply bg-secondary;
}
.tab-btn.active{
@apply bg-primary text-primary-foreground;
}
@media (min-width: 768px) {
html {
font-size: 16px;