Description

Brand: Besuki Raya Cigar
Series: Java Sunrise
- Wooden box of 10
- Vitola: Robusto
- Shape: Parejo
- Ring Gauge: 50 (20mm)
- Length: 5″ (125 mm)
- Duration: 45 – 60 minute
- Filler: Long
- Body: Light to Medium
- Strength: 6/9
- Wrapper : Indonesian Javabo
- Binder : Indonesian Javano
- Filler : Mix of Indonesian Tobacco
- Flavor Profile:
1/3: Chocolate, Creamy, Floral
2/3: Cinamon, Hooney, Roasted Nuts
3/3: Coffee, Chilli Pepper, Salty
Citarasa Java Sunrise Robusto memberikan kesan taste ringan, lembut dan umami, sesaat setelah hisapan. Cocok buat penggemar cerutu pemula dan sebgai cerutu harian.
griyacerutu.com
/* CSS Styling */
.tour-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 20px;
padding: 15px 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}
.tour-card {
display: flex;
flex-direction: column;
background: #ffffff;
border: 1px solid #e2e8f0;
border-radius: 12px;
overflow: hidden;
text-decoration: none;
color: #333333;
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.tour-card:hover {
transform: translateY(-4px);
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
}
.tour-image-wrap {
position: relative;
height: 200px;
overflow: hidden;
}
.tour-image {
width: 100%;
height: 100%;
object-fit: cover;
}
.tour-badge-location {
position: absolute;
top: 12px;
left: 12px;
background: rgba(0, 0, 0, 0.6);
color: #ffffff;
padding: 4px 10px;
border-radius: 20px;
font-size: 0.75rem;
font-weight: 600;
}
.tour-badge-popular {
position: absolute;
top: 12px;
right: 12px;
background: #ef4444;
color: #ffffff;
padding: 4px 10px;
border-radius: 20px;
font-size: 0.75rem;
font-weight: 700;
}
.tour-title-overlay {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
margin: 0;
padding: 20px 15px 12px;
background: linear-gradient(to top, rgba(0,0,0,0.8), transparent);
color: #ffffff;
font-size: 1.2rem;
box-sizing: border-box;
}
.tour-content {
padding: 15px;
display: flex;
flex-direction: column;
flex-grow: 1;
}
.tour-meta {
display: flex;
justify-content: space-between;
font-size: 0.85rem;
color: #64748b;
margin-bottom: 10px;
font-weight: 500;
}
.tour-highlight {
font-size: 0.9rem;
line-height: 1.4;
color: #475569;
margin: 0 0 15px 0;
flex-grow: 1;
}
.tour-footer {
display: flex;
justify-content: space-between;
align-items: flex-end;
border-top: 1px solid #f1f5f9;
padding-top: 12px;
}
.tour-price-box {
display: flex;
flex-direction: column;
}
.tour-price-label {
font-size: 0.7rem;
color: #94a3b8;
text-transform: uppercase;
}
.tour-price-value {
font-size: 1.1rem;
font-weight: 700;
color: #0f172a;
}
.status-badge {
display: inline-flex;
align-items: center;
gap: 5px;
padding: 5px 10px;
border-radius: 6px;
font-size: 0.8rem;
font-weight: 600;
}
.status-badge.available {
background: #dcfce7;
color: #166534;
}
.status-badge.booked {
background: #fee2e2;
color: #991b1b;
}
.status-dot {
width: 8px;
height: 8px;
border-radius: 50%;
}
.status-dot.green { background: #22c55e; }
.status-dot.red { background: #ef4444; }
/* JavaScript - IIFE Wrapped to Prevent Global Variable Collisions */
(function() {
const SHEET_ID = "1A6cbxdRFYNbG6VLDlaBIDuAOuTUfkBlPs5eCpOZG4pg";
async function fetchAndRenderToursForContainer(container) {
const sheetName = container.dataset.sheet;
if (!sheetName) return;
// Added nocache to bypass stale browser data
const gvizUrl = `https://docs.google.com/spreadsheets/d/${SHEET_ID}/gviz/tq?tqx=out:json&sheet=${encodeURIComponent(sheetName)}&nocache=${Date.now()}`;
try {
const response = await fetch(gvizUrl);
const rawText = await response.text();
const jsonString = rawText.substring(rawText.indexOf("{"), rawText.lastIndexOf("}") + 1);
const parsedData = JSON.parse(jsonString);
const rows = parsedData.table?.rows || [];
const tours = rows.map(row => {
const c = row.c;
if (!c) return null;
let rawDate = c[7] ? (c[7].f || c[7].v || "") : "";
let formattedDate = String(rawDate).trim().replace(/\//g, "-");
return {
location: c[0] && c[0].v ? c[0].v : "",
imageUrl: c[1] && c[1].v ? c[1].v : "https://debako.com/wp-content/uploads/2025/09/trip-1.jpg",
title: c[2] && c[2].v ? c[2].v : "",
reviews: c[3] && c[3].v ? c[3].v : 0,
timeRequired: c[4] && c[4].v ? c[4].v : "-",
highlight: c[5] && c[5].v ? c[5].v : "",
price: c[6] && c[6].v ? c[6].v : "",
bookedDate: formattedDate,
pageLink: c[8] && c[8].v ? c[8].v : "#",
isPopular: c[9] && c[9].v ? c[9].v : ""
};
}).filter(tour => tour && tour.title && tour.title.toLowerCase() !== "title");
renderTourCards(container, tours);
} catch (error) {
console.error(`Error fetching tour data for ${sheetName}:`, error);
container.innerHTML = `
Failed to load tour packages. Please check Google Sheet permissions.
`;
}
}
function renderTourCards(container, data) {
if (!data || data.length === 0) {
container.innerHTML = `
No tours available.
`;
return;
}
container.innerHTML = data.map(tour => {
const isBooked = tour.bookedDate && tour.bookedDate !== "";
const statusHtml = isBooked
? `
Booked: ${tour.bookedDate}`
: `
Available`;
const showPopular = (tour.isPopular && (tour.isPopular.toLowerCase() === 'yes' || tour.isPopular.toLowerCase() === 'popular')) || Number(tour.reviews) >= 5;
const popularBadgeHtml = showPopular ? `
🔥 Popular` : '';
return `

${tour.location ? `
${tour.location}` : ''}
${popularBadgeHtml}
${tour.title}
⏱ ${tour.timeRequired}
⭐ ${tour.reviews} Reviews
${tour.highlight}
`;
}).join('');
}
// Interval Checker: Solves DOM racing issues in desktop environments[cite: 7]
function initAllTourGrids() {
const checkExist = setInterval(() => {
const grids = document.querySelectorAll(".tour-grid[data-sheet]:not([data-initialized='true'])");
if (grids.length > 0) {
clearInterval(checkExist);
grids.forEach(grid => {
grid.dataset.initialized = 'true';
fetchAndRenderToursForContainer(grid);
});
}
}, 100);
setTimeout(() => clearInterval(checkExist), 10000);
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", initAllTourGrids);
} else {
initAllTourGrids();
}
})();