Compare commits

...

5 Commits

Author SHA1 Message Date
ac9fd4cf42 Fix schedule 2026-05-06 20:49:10 +07:00
c76e471161 Fix BOM 2026-05-04 12:10:35 +07:00
f3c9f54c37 Disallow Robots 2026-05-04 11:56:52 +07:00
94415def5a SEO 2026-05-04 11:55:20 +07:00
b9309b8276 Add fireflies 2 2026-05-04 11:24:25 +07:00
11 changed files with 581 additions and 138 deletions

View File

@@ -13,8 +13,16 @@
<link
href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..60,700;12..60,800&family=Caveat+Brush&family=JetBrains+Mono:wght@400;500&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap"
rel="stylesheet">
<link rel="stylesheet" href="../css/style.css?v=254e174d">
<link rel="stylesheet" href="../css/style.css?v=0a14c10d">
<link rel="stylesheet" href="../css/fireflies.css">
<link rel="canonical" href="https://saborflow.ai1.ovh/classes/">
<meta property="og:type" content="website">
<meta property="og:site_name" content="Sabor Flow Da Nang">
<meta property="og:title" content="Dance Classes — Sabor Flow Da Nang">
<meta property="og:description" content="Latin dance classes in Da Nang. Find Salsa, Bachata, Kizomba, and Zouk classes for all levels.">
<meta property="og:url" content="https://saborflow.ai1.ovh/classes/">
<meta property="og:image" content="https://saborflow.ai1.ovh/assets/logo.jpg">
<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"Sabor Flow Da Nang","url":"https://saborflow.ai1.ovh","logo":"https://saborflow.ai1.ovh/assets/logo.jpg","sameAs":["https://www.instagram.com/saborflowdanang/","https://www.facebook.com/groups/sbkdanang"]}</script>
</head>
<body>
@@ -22,17 +30,17 @@
<div class="sfB-bg" aria-hidden="true">
<span></span><span></span><span></span><span></span><span></span>
<div class="sfB-palms">
<img class="sfB-palm corner-tl" src="../assets/palm-fronds-left.png" alt=""
<img class="sfB-palm corner-tl" src="../assets/palm-fronds-left.png" alt="Decorative palm frond"
style="--sway:10deg;animation-duration:8s;animation-delay:0s">
<img class="sfB-palm corner-tr" src="../assets/palm-fronds-right.png" alt=""
<img class="sfB-palm corner-tr" src="../assets/palm-fronds-right.png" alt="Decorative palm frond"
style="--sway:12deg;animation-duration:9s;animation-delay:-2s">
<img class="sfB-palm corner-bl" src="../assets/palm-fronds-left.png" alt=""
<img class="sfB-palm corner-bl" src="../assets/palm-fronds-left.png" alt="Decorative palm frond"
style="--sway:11deg;animation-duration:10s;animation-delay:-4s;--flip:scaleY(-1)">
<img class="sfB-palm corner-br" src="../assets/palm-fronds-right.png" alt=""
<img class="sfB-palm corner-br" src="../assets/palm-fronds-right.png" alt="Decorative palm frond"
style="--sway:9deg;animation-duration:11s;animation-delay:-1.5s;--flip:scaleY(-1)">
<img class="sfB-palm corner-ml" src="../assets/palm-fronds-left.png" alt=""
<img class="sfB-palm corner-ml" src="../assets/palm-fronds-left.png" alt="Decorative palm frond"
style="--sway:13deg;animation-duration:9.5s;animation-delay:-3s">
<img class="sfB-palm corner-mr" src="../assets/palm-fronds-right.png" alt=""
<img class="sfB-palm corner-mr" src="../assets/palm-fronds-right.png" alt="Decorative palm frond"
style="--sway:10deg;animation-duration:11.5s;animation-delay:-1s">
</div>
</div>
@@ -379,7 +387,7 @@
</div>
</footer>
<script src="../js/main.js?v=254e174d"></script>
<script src="../js/main.js?v=0a14c10d"></script>
</body>
</html>

View File

@@ -13,8 +13,16 @@
<link
href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..60,700;12..60,800&family=Caveat+Brush&family=JetBrains+Mono:wght@400;500&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap"
rel="stylesheet">
<link rel="stylesheet" href="../css/style.css?v=7ecaa9f3">
<link rel="stylesheet" href="../css/style.css?v=0a14c10d">
<link rel="stylesheet" href="../css/fireflies.css">
<link rel="canonical" href="https://saborflow.ai1.ovh/connect/">
<meta property="og:type" content="website">
<meta property="og:site_name" content="Sabor Flow Da Nang">
<meta property="og:title" content="Connect — Sabor Flow Da Nang">
<meta property="og:description" content="Follow Sabor Flow Da Nang on Instagram and get in touch with the Latin dance community.">
<meta property="og:url" content="https://saborflow.ai1.ovh/connect/">
<meta property="og:image" content="https://saborflow.ai1.ovh/assets/logo.jpg">
<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"Sabor Flow Da Nang","url":"https://saborflow.ai1.ovh","logo":"https://saborflow.ai1.ovh/assets/logo.jpg","sameAs":["https://www.instagram.com/saborflowdanang/","https://www.facebook.com/groups/sbkdanang"]}</script>
</head>
<body>
@@ -22,17 +30,17 @@
<div class="sfB-bg" aria-hidden="true">
<span></span><span></span><span></span><span></span><span></span>
<div class="sfB-palms">
<img class="sfB-palm corner-tl" src="../assets/palm-fronds-left.png" alt=""
<img class="sfB-palm corner-tl" src="../assets/palm-fronds-left.png" alt="Decorative palm frond"
style="--sway:10deg;animation-duration:8s;animation-delay:0s">
<img class="sfB-palm corner-tr" src="../assets/palm-fronds-right.png" alt=""
<img class="sfB-palm corner-tr" src="../assets/palm-fronds-right.png" alt="Decorative palm frond"
style="--sway:12deg;animation-duration:9s;animation-delay:-2s">
<img class="sfB-palm corner-bl" src="../assets/palm-fronds-left.png" alt=""
<img class="sfB-palm corner-bl" src="../assets/palm-fronds-left.png" alt="Decorative palm frond"
style="--sway:11deg;animation-duration:10s;animation-delay:-4s;--flip:scaleY(-1)">
<img class="sfB-palm corner-br" src="../assets/palm-fronds-right.png" alt=""
<img class="sfB-palm corner-br" src="../assets/palm-fronds-right.png" alt="Decorative palm frond"
style="--sway:9deg;animation-duration:11s;animation-delay:-1.5s;--flip:scaleY(-1)">
<img class="sfB-palm corner-ml" src="../assets/palm-fronds-left.png" alt=""
<img class="sfB-palm corner-ml" src="../assets/palm-fronds-left.png" alt="Decorative palm frond"
style="--sway:13deg;animation-duration:9.5s;animation-delay:-3s">
<img class="sfB-palm corner-mr" src="../assets/palm-fronds-right.png" alt=""
<img class="sfB-palm corner-mr" src="../assets/palm-fronds-right.png" alt="Decorative palm frond"
style="--sway:10deg;animation-duration:11.5s;animation-delay:-1s">
</div>
</div>
@@ -197,7 +205,7 @@
</div>
</footer>
<script src="../js/main.js?v=7ecaa9f3"></script>
<script src="../js/main.js?v=0a14c10d"></script>
</body>
</html>

View File

@@ -156,7 +156,7 @@ button {
mix-blend-mode: overlay;
}
body>*:not(.sfB-bg) {
body>*:not(.sfB-bg):not(.sfB-topbar) {
position: relative;
z-index: 1;
}
@@ -1253,7 +1253,7 @@ body>*:not(.sfB-bg) {
.sfB-row {
display: grid;
grid-template-columns: 130px 75px 1fr 1fr 1fr 95px;
grid-template-columns: 140px 130px 1fr 1fr 1fr 1fr;
align-items: center;
gap: 14px;
padding: 18px 22px;
@@ -1360,14 +1360,20 @@ body>*:not(.sfB-bg) {
font-weight: 500;
}
.sfB-row .col-social .sub {
display: block;
font-family: 'JetBrains Mono', monospace;
font-size: 9px;
letter-spacing: 0.5px;
color: rgba(255, 246, 232, 0.6);
margin-top: 4px;
text-transform: uppercase;
.sfB-row .col-org {
font-size: 15px;
font-weight: 700;
background: linear-gradient(135deg, var(--sf-coral), var(--sf-gold));
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
.sfB-row .col-org a {
background: linear-gradient(135deg, var(--sf-coral), var(--sf-gold));
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
.sfB-row .col-music {
@@ -1398,14 +1404,6 @@ body>*:not(.sfB-bg) {
color: #7ed4dd;
}
.sfB-row .col-org {
font-size: 11px;
color: rgba(255, 246, 232, 0.5);
text-align: right;
letter-spacing: 0.3px;
line-height: 1.4;
}
.sfB-row.today .tonight-label {
font-family: 'JetBrains Mono', monospace;
font-size: 8px;
@@ -2261,6 +2259,147 @@ body>*:not(.sfB-bg) {
}
}
/* ── Schedule: click hint ── */
.sfB-sched-hint {
font-family: 'JetBrains Mono', monospace;
font-size: 10px;
letter-spacing: 0.5px;
color: rgba(255, 246, 232, 0.75);
text-align: center;
margin: -4px 0 12px;
}
/* ── Schedule: organizer links inside row ── */
.sfB-row .col-org a {
text-decoration: none;
}
.sfB-row .col-org a:hover {
background: none;
-webkit-background-clip: unset;
background-clip: unset;
color: var(--sf-teal);
}
/* ── Event detail modal ── */
.sfB-ev-modal {
display: none;
position: fixed;
inset: 0;
z-index: 9000;
align-items: center;
justify-content: center;
}
.sfB-ev-modal.open {
display: flex;
}
.sfB-ev-modal-box {
position: relative;
z-index: 1;
background: #1a1a1a;
border: 1px solid rgba(255, 246, 232, 0.12);
border-radius: 20px;
width: min(520px, calc(100vw - 32px));
max-height: calc(100vh - 64px);
overflow-y: auto;
}
.sfB-ev-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px;
padding: 22px 24px 18px;
border-bottom: 1px solid rgba(255, 246, 232, 0.08);
position: sticky;
top: 0;
background: #1a1a1a;
z-index: 1;
}
.sfB-ev-day-time {
font-family: 'JetBrains Mono', monospace;
font-size: 13px;
letter-spacing: 1px;
text-transform: uppercase;
color: var(--sf-coral);
margin-bottom: 6px;
}
.sfB-ev-name {
font-family: 'Bricolage Grotesque', sans-serif;
font-size: 22px;
font-weight: 800;
color: var(--sf-paper);
letter-spacing: -0.5px;
line-height: 1.1;
}
.sfB-ev-body {
padding: 20px 24px 24px;
display: flex;
flex-direction: column;
gap: 14px;
}
.sfB-ev-row {
display: grid;
grid-template-columns: 64px 1fr;
gap: 10px;
align-items: flex-start;
}
.sfB-ev-label {
font-family: 'JetBrains Mono', monospace;
font-size: 9px;
letter-spacing: 1.2px;
text-transform: uppercase;
color: rgba(255, 246, 232, 0.35);
padding-top: 3px;
}
.sfB-ev-val {
font-size: 13px;
color: rgba(255, 246, 232, 0.85);
display: flex;
flex-direction: column;
gap: 3px;
}
.sfB-ev-val a {
color: #5dd6df;
text-decoration: none;
}
.sfB-ev-val a:hover {
color: #a8eef2;
}
.sfB-ev-address {
font-size: 11px;
color: rgba(255, 246, 232, 0.75);
}
.sfB-ev-fee {
font-family: 'JetBrains Mono', monospace;
font-size: 15px;
font-weight: 600;
color: var(--sf-gold);
}
.sfB-ev-chips {
display: flex;
flex-direction: row;
flex-wrap: wrap;
gap: 4px;
}
.sfB-ev-offer {
color: var(--sf-gold) !important;
}
/* ── Playlists page ── */
.sfB-pl-section {
margin-top: 40px;

View File

@@ -13,8 +13,16 @@
<link
href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..60,700;12..60,800&family=Caveat+Brush&family=JetBrains+Mono:wght@400;500&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap"
rel="stylesheet">
<link rel="stylesheet" href="../css/style.css?v=254e174d">
<link rel="stylesheet" href="../css/style.css?v=0a14c10d">
<link rel="stylesheet" href="../css/fireflies.css">
<link rel="canonical" href="https://saborflow.ai1.ovh/festivals/">
<meta property="og:type" content="website">
<meta property="og:site_name" content="Sabor Flow Da Nang">
<meta property="og:title" content="Festivals — Sabor Flow Da Nang">
<meta property="og:description" content="Latin dance festivals in Da Nang, Vietnam. Multi-day events with international artists, workshops, and social dancing.">
<meta property="og:url" content="https://saborflow.ai1.ovh/festivals/">
<meta property="og:image" content="https://saborflow.ai1.ovh/assets/logo.jpg">
<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"Sabor Flow Da Nang","url":"https://saborflow.ai1.ovh","logo":"https://saborflow.ai1.ovh/assets/logo.jpg","sameAs":["https://www.instagram.com/saborflowdanang/","https://www.facebook.com/groups/sbkdanang"]}</script>
</head>
<body>
@@ -22,17 +30,17 @@
<div class="sfB-bg" aria-hidden="true">
<span></span><span></span><span></span><span></span><span></span>
<div class="sfB-palms">
<img class="sfB-palm corner-tl" src="../assets/palm-fronds-left.png" alt=""
<img class="sfB-palm corner-tl" src="../assets/palm-fronds-left.png" alt="Decorative palm frond"
style="--sway:10deg;animation-duration:8s;animation-delay:0s">
<img class="sfB-palm corner-tr" src="../assets/palm-fronds-right.png" alt=""
<img class="sfB-palm corner-tr" src="../assets/palm-fronds-right.png" alt="Decorative palm frond"
style="--sway:12deg;animation-duration:9s;animation-delay:-2s">
<img class="sfB-palm corner-bl" src="../assets/palm-fronds-left.png" alt=""
<img class="sfB-palm corner-bl" src="../assets/palm-fronds-left.png" alt="Decorative palm frond"
style="--sway:11deg;animation-duration:10s;animation-delay:-4s;--flip:scaleY(-1)">
<img class="sfB-palm corner-br" src="../assets/palm-fronds-right.png" alt=""
<img class="sfB-palm corner-br" src="../assets/palm-fronds-right.png" alt="Decorative palm frond"
style="--sway:9deg;animation-duration:11s;animation-delay:-1.5s;--flip:scaleY(-1)">
<img class="sfB-palm corner-ml" src="../assets/palm-fronds-left.png" alt=""
<img class="sfB-palm corner-ml" src="../assets/palm-fronds-left.png" alt="Decorative palm frond"
style="--sway:13deg;animation-duration:9.5s;animation-delay:-3s">
<img class="sfB-palm corner-mr" src="../assets/palm-fronds-right.png" alt=""
<img class="sfB-palm corner-mr" src="../assets/palm-fronds-right.png" alt="Decorative palm frond"
style="--sway:10deg;animation-duration:11.5s;animation-delay:-1s">
</div>
</div>
@@ -248,7 +256,7 @@
</div>
</footer>
<script src="../js/main.js?v=254e174d"></script>
<script src="../js/main.js?v=0a14c10d"></script>
</body>
</html>

View File

@@ -13,8 +13,17 @@
<link
href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..60,700;12..60,800&family=Caveat+Brush&family=JetBrains+Mono:wght@400;500&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap"
rel="stylesheet">
<link rel="stylesheet" href="css/style.css?v=254e174d">
<link rel="stylesheet" href="css/style.css?v=0a14c10d">
<link rel="stylesheet" href="css/fireflies.css">
<link rel="canonical" href="https://saborflow.ai1.ovh/">
<meta property="og:type" content="website">
<meta property="og:site_name" content="Sabor Flow Da Nang">
<meta property="og:title" content="Sabor Flow Da Nang — Dance community">
<meta property="og:description" content="Da Nang's Latin dance community. Weekly socials, studios, classes, and festivals for Salsa, Bachata, Kizomba, and Zouk.">
<meta property="og:url" content="https://saborflow.ai1.ovh/">
<meta property="og:image" content="https://saborflow.ai1.ovh/assets/logo.jpg">
<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"Sabor Flow Da Nang","url":"https://saborflow.ai1.ovh","logo":"https://saborflow.ai1.ovh/assets/logo.jpg","sameAs":["https://www.instagram.com/saborflowdanang/","https://www.facebook.com/groups/sbkdanang"]}</script>
<script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","name":"Sabor Flow Da Nang","url":"https://saborflow.ai1.ovh"}</script>
</head>
<body>
@@ -23,17 +32,17 @@
<div class="sfB-bg" aria-hidden="true">
<span></span><span></span><span></span><span></span><span></span>
<div class="sfB-palms">
<img class="sfB-palm corner-tl" src="assets/palm-fronds-left.png" alt=""
<img class="sfB-palm corner-tl" src="assets/palm-fronds-left.png" alt="Decorative palm frond"
style="--sway:10deg;animation-duration:8s;animation-delay:0s">
<img class="sfB-palm corner-tr" src="assets/palm-fronds-right.png" alt=""
<img class="sfB-palm corner-tr" src="assets/palm-fronds-right.png" alt="Decorative palm frond"
style="--sway:12deg;animation-duration:9s;animation-delay:-2s">
<img class="sfB-palm corner-bl" src="assets/palm-fronds-left.png" alt=""
<img class="sfB-palm corner-bl" src="assets/palm-fronds-left.png" alt="Decorative palm frond"
style="--sway:11deg;animation-duration:10s;animation-delay:-4s;--flip:scaleY(-1)">
<img class="sfB-palm corner-br" src="assets/palm-fronds-right.png" alt=""
<img class="sfB-palm corner-br" src="assets/palm-fronds-right.png" alt="Decorative palm frond"
style="--sway:9deg;animation-duration:11s;animation-delay:-1.5s;--flip:scaleY(-1)">
<img class="sfB-palm corner-ml" src="assets/palm-fronds-left.png" alt=""
<img class="sfB-palm corner-ml" src="assets/palm-fronds-left.png" alt="Decorative palm frond"
style="--sway:13deg;animation-duration:9.5s;animation-delay:-3s">
<img class="sfB-palm corner-mr" src="assets/palm-fronds-right.png" alt=""
<img class="sfB-palm corner-mr" src="assets/palm-fronds-right.png" alt="Decorative palm frond"
style="--sway:10deg;animation-duration:11.5s;animation-delay:-1s">
</div>
</div>
@@ -277,7 +286,7 @@
</div>
</footer>
<script src="js/main.js?v=254e174d"></script>
<script src="js/main.js?v=0a14c10d"></script>
</body>
</html>

View File

@@ -4,16 +4,126 @@
// ============================================================
const SCHEDULE = [
{ day: 'Monday', when: '8:30 pm', venue: 'Webe Coffee', social: 'BOM', music: '8 Bachata · 1 Salsa · 1 Kizomba', city: 'Da Nang', organizer: 'Luu Phuong & Shai', mapUrl: 'https://maps.app.goo.gl/sznmGXHmiiaWf1ke6' },
{ day: 'Tuesday', when: '9 pm', venue: 'La Riva', social: 'Latino Dancing', music: '2 Salsa · 2 Bachata · 2 Kizomba', city: 'Hoi An', organizer: 'David Tavares', mapUrl: 'https://maps.app.goo.gl/3ZyB8icd8oswRghE7' },
{ day: 'Tuesday', when: '9 pm', venue: 'Caliz Bar', social: 'Sensual Night', music: '3 Bachata · 2 Salsa · 2 Kizomba', city: 'Da Nang', organizer: 'Daisy Nguyen', mapUrl: 'https://maps.app.goo.gl/YagFKw2gcTJp9PJc7' },
{ day: 'Wednesday', when: '7:30 pm', venue: 'Ket Fai Bar', social: 'Bachata Kiz Night', music: 'Kizomba 7:30 · Bachata 9 pm', city: 'Da Nang', organizer: 'Sean Kim', mapUrl: 'https://maps.app.goo.gl/XYxY4UCnnJjCAomK6' },
{ day: 'Thursday', when: '9 pm', venue: 'Malibu', social: 'Salsa Nights', music: '2 Salsa · 2 Bachata', city: 'Da Nang', organizer: 'Lucho Giraldes', mapUrl: 'https://maps.app.goo.gl/hZttmc9UcymnKfWP8' },
{ day: 'Friday', when: '9 pm', venue: 'An Thuong By Night', social: 'Dance Unity Party', music: '2 Salsa · 2 Bachata · 2 Kizomba', city: 'Da Nang', organizer: 'Nadiya Yagfarova', mapUrl: 'https://maps.app.goo.gl/9cHcJcDgan9ntowt9' },
{ day: 'Saturday', when: '9 pm', venue: 'La Riva', social: 'Latino Dancing', music: '2 Salsa · 2 Bachata · 2 Kizomba', city: 'Hoi An', organizer: 'David Tavares', mapUrl: 'https://maps.app.goo.gl/3ZyB8icd8oswRghE7' },
{ day: 'Saturday', when: '9 pm', venue: 'An Thuong By Night', social: 'Bachata Party', music: 'Only Bachata', city: 'Da Nang', organizer: 'Vaclav & Kseniya', mapUrl: 'https://maps.app.goo.gl/9cHcJcDgan9ntowt9' },
{ day: 'Sunday', when: '9 pm', venue: 'Last Call', social: 'Latin Dance Social', music: '3 Bachata · 2 Salsa', city: 'Da Nang', organizer: 'Vaclav & Kseniya', mapUrl: 'https://maps.app.goo.gl/1tEE4itDEeErhEmG6' },
{ day: 'Sunday', when: '9 pm', venue: 'Corner Bar', social: 'Sunday Latin', music: '3 Bachata · 2 Salsa · 3 Kizomba', city: 'Da Nang', organizer: 'Daisy Nguyen', mapUrl: 'https://maps.app.goo.gl/QyuWvCg2DZoFiRyd6' },
{
day: 'Monday',
name: 'Bachata on Mondays',
when: '8:00 PM 11:00 PM',
fee: '100k VND',
venue: 'Webe Coffee',
address: '1416 Nguyễn Hữu Thông, An Hải, Đà Nẵng',
mapUrl: 'https://maps.app.goo.gl/DiRPZrr4wyW1Wy1eA',
music: '8 Bachata · 1 Salsa · 1 Kizomba',
city: 'Da Nang',
organizer: ['Frog and Goose'],
organizerUrl: ['https://www.instagram.com/fgbachata/'],
offer: '1 drink included · Workshop included',
vibe: 'Workshop (8PM9:30PM) & Social',
},
{
day: 'Tuesday',
name: 'SBK',
when: '9:00 PM 11:30 PM',
fee: '100k VND',
venue: 'Cáliz',
address: '4749 An Thượng 3, Ngũ Hành Sơn, Đà Nẵng',
mapUrl: 'https://maps.app.goo.gl/JUBLZ5qHxkwXCe5u7',
music: '2 Salsa · 3 Bachata · 2 Kizomba',
city: 'Da Nang',
organizer: ['Daisy Nguyen'],
organizerUrl: ['https://www.facebook.com/minhtrang610'],
offer: '50k for first 10 ladies',
vibe: 'Elegant Wine Bar',
},
{
day: 'Wednesday',
name: 'Kiz & Bachata',
when: '7:30 PM Late',
fee: 'FREE',
venue: 'Kết Fai',
address: '138 Đỗ Bá, Ngũ Hành Sơn, Đà Nẵng',
mapUrl: 'https://maps.app.goo.gl/W6nRJfwr2Vhy8iK66',
music: 'Kizomba · Bachata',
city: 'Da Nang',
organizer: ['Sean Kim'],
organizerUrl: ['https://www.facebook.com/happynowkkop'],
offer: 'Buy 1 Cocktail, Get 1 Wine',
vibe: 'Kizomba (7:30PM9:15PM) & Bachata (9:30PMLate) · Chill bar',
},
{
day: 'Thursday',
name: 'Salsa & Bachata',
when: '9:00 PM 11:30 PM',
fee: '100k VND',
venue: 'Malibu Beach Club',
address: 'Bãi tắm, 3 Võ Nguyên Giáp, An Hải, Đà Nẵng',
mapUrl: 'https://maps.app.goo.gl/GZQC5micBRunbVNP8',
music: '2 Salsa · 2 Bachata',
city: 'Da Nang',
organizer: ['Lucho Giraldes'],
organizerUrl: ['https://www.facebook.com/luchogiraldespersonal'],
offer: 'Beach club snacks available',
vibe: 'Open-air Sea Breeze',
},
{
day: 'Friday',
name: 'Salsa & Bachata',
when: '8:00 PM Late',
fee: '100k VND',
venue: 'An Thượng By Night',
address: '100 Lã Xuân Oai, Ngũ Hành Sơn, Đà Nẵng',
mapUrl: 'https://maps.app.goo.gl/R6mH4uQfAZtUWiH87',
music: '2 Salsa · 2 Bachata · 2 Kizomba',
city: 'Da Nang',
organizer: ['Nadya Yafarova'],
organizerUrl: ['https://www.facebook.com/yagfarova'],
offer: 'Free for first 10 ladies',
vibe: 'Community Family',
},
{
day: 'Saturday',
name: '100% Kizomba',
when: '8:00 PM 11:00 PM',
fee: '100k VND',
venue: 'LiiDy Studio',
address: '75 Thái Phiên, Hải Châu, Đà Nẵng',
mapUrl: 'https://maps.app.goo.gl/GZ5UtDPFafW1BCSP9',
music: 'Kizomba',
city: 'Da Nang',
organizer: ['Kate Bvote'],
organizerUrl: ['https://www.facebook.com/kate.bovt'],
offer: '1 Drinking water included',
vibe: 'Deep Connection',
},
{
day: 'Sunday',
name: 'SBK',
when: '8:30 PM Late',
fee: '50k VND',
venue: 'The Workshop',
address: '35 Chế Lan Viên, Ngũ Hành Sơn, Đà Nẵng',
mapUrl: 'https://maps.app.goo.gl/xxVwTocSQHKU1Ejd8',
music: '2 Salsa · 3 Bachata · 3 Kizomba',
city: 'Da Nang',
organizer: ['Daisy Nguyen'],
organizerUrl: ['https://www.facebook.com/minhtrang610'],
offer: '1-hr Kiz session included',
vibe: 'Festival style rotation',
},
{
day: 'Sunday',
name: 'Salsa & Bachata',
when: '8:00 PM 11:30 PM',
fee: '100k VND',
venue: 'An Thượng By Night',
address: '100 Lã Xuân Oai, Ngũ Hành Sơn, Đà Nẵng',
mapUrl: 'https://maps.app.goo.gl/R6mH4uQfAZtUWiH87',
music: '2 Salsa · 2 Bachata',
city: 'Da Nang',
organizer: ['Vaclav', 'Ksenia Tokareva'],
organizerUrl: ['https://www.facebook.com/vasek.nemec.1', 'https://www.facebook.com/omks234'],
offer: '1 drink included & 10% discount on meals',
vibe: 'Workshop (8PM9PM) & Social',
},
];
const DAYS_ORDER = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
@@ -34,6 +144,15 @@ function musicToChips(music) {
}).join('');
}
// Build organizer name(s) as linked text
function organizerLinks(organizer, organizerUrl, stopProp) {
const stop = stopProp ? ' onclick="event.stopPropagation()"' : '';
return organizer.map((name, i) => {
const url = organizerUrl && organizerUrl[i];
return url ? `<a href="${url}" target="_blank" rel="noopener"${stop}>${name}</a>` : name;
}).join(' & ');
}
// ---- Nav (mobile) ----
function initNav() {
const hamburger = document.getElementById('sfB-hamburger');
@@ -49,12 +168,123 @@ function initNav() {
link.addEventListener('click', () => mobileNav.classList.remove('open'));
});
// close on backdrop click
mobileNav.addEventListener('click', e => {
if (e.target === mobileNav) mobileNav.classList.remove('open');
});
}
// ---- Event detail modal ----
let _sortedSchedule = [];
function openEventModal(row) {
const modal = document.getElementById('sfB-ev-modal');
if (!modal) return;
const now = new Date();
const offset = (DAYS_ORDER.indexOf(row.day) - now.getDay() + 7) % 7;
const date = new Date(now);
date.setDate(now.getDate() + offset);
const dateLabel = `${date.getDate()}/${date.getMonth() + 1}`;
document.getElementById('sfB-ev-modal-day').textContent = `${dateLabel} · ${row.day} · ${row.when}`;
document.getElementById('sfB-ev-modal-name').textContent = row.name;
const orgLinks = organizerLinks(row.organizer, row.organizerUrl, false);
document.getElementById('sfB-ev-modal-body').innerHTML = `
<div class="sfB-ev-row">
<span class="sfB-ev-label">Venue</span>
<span class="sfB-ev-val">
<a href="${row.mapUrl}" target="_blank" rel="noopener">📍 ${row.venue}</a>
<span class="sfB-ev-address">${row.address}</span>
</span>
</div>
<div class="sfB-ev-row">
<span class="sfB-ev-label">Music</span>
<span class="sfB-ev-val sfB-ev-chips">${musicToChips(row.music)}</span>
</div>
<div class="sfB-ev-row">
<span class="sfB-ev-label">Host</span>
<span class="sfB-ev-val"><span>${orgLinks}</span></span>
</div>
<div class="sfB-ev-row">
<span class="sfB-ev-label">Entry</span>
<span class="sfB-ev-val sfB-ev-fee">${row.fee}</span>
</div>
<div class="sfB-ev-row">
<span class="sfB-ev-label">Offer</span>
<span class="sfB-ev-val sfB-ev-offer">${row.offer}</span>
</div>
<div class="sfB-ev-row">
<span class="sfB-ev-label">Vibe</span>
<span class="sfB-ev-val">${row.vibe}</span>
</div>
`;
modal.classList.add('open');
document.body.style.overflow = 'hidden';
}
function initEventModal() {
const modal = document.getElementById('sfB-ev-modal');
if (!modal) return;
function closeModal() {
modal.classList.remove('open');
document.body.style.overflow = '';
}
document.getElementById('sfB-ev-modal-close').addEventListener('click', closeModal);
document.getElementById('sfB-ev-modal-overlay').addEventListener('click', closeModal);
document.addEventListener('keydown', e => {
if (e.key === 'Escape' && modal.classList.contains('open')) closeModal();
});
}
// ---- Schedule: dynamic filter pills ----
function renderScheduleFilters(events) {
const container = document.getElementById('sfB-schedule-pills');
if (!container) return;
const styleOptions = [
{ key: 'salsa', label: 'Salsa' },
{ key: 'bachata', label: 'Bachata' },
{ key: 'kizomba', label: 'Kizomba' },
{ key: 'zouk', label: 'Zouk' },
];
const cityOptions = [
{ key: 'hoian', label: 'Hoi An', match: 'hoi an' },
];
const activeStyles = styleOptions.filter(s =>
events.some(e => e.music.toLowerCase().includes(s.key))
);
const activeCities = cityOptions.filter(c =>
events.some(e => e.city.toLowerCase().includes(c.match))
);
container.innerHTML = [
'<button class="filter-pill active" data-filter="all">All</button>',
...activeStyles.map(s => `<button class="filter-pill" data-filter="${s.key}">${s.label}</button>`),
...activeCities.map(c => `<button class="filter-pill" data-filter="${c.key}">${c.label}</button>`),
].join('');
container.querySelectorAll('.filter-pill').forEach(pill => {
pill.addEventListener('click', () => {
container.querySelectorAll('.filter-pill').forEach(p => p.classList.remove('active'));
pill.classList.add('active');
const f = pill.dataset.filter;
document.querySelectorAll('#sfB-schedule-list .sfB-row').forEach(row => {
if (f === 'all') { row.style.display = ''; return; }
const music = row.dataset.music || '';
const city = row.dataset.city || '';
const matchCity = f === 'danang' ? 'da nang' : f === 'hoian' ? 'hoi an' : f;
row.style.display = (music.includes(f) || city.includes(matchCity)) ? '' : 'none';
});
});
});
}
// ---- Schedule: full list (schedule.html) ----
function renderScheduleList() {
const list = document.getElementById('sfB-schedule-list');
@@ -64,28 +294,29 @@ function renderScheduleList() {
const todayName = DAYS_ORDER[now.getDay()];
const startIdx = DAYS_ORDER.indexOf(todayName);
// Map each day name to how many days from today it is (06)
const dayOffset = {};
DAYS_ORDER.forEach(name => {
dayOffset[name] = (DAYS_ORDER.indexOf(name) - startIdx + 7) % 7;
});
const sorted = [...SCHEDULE].sort((a, b) => dayOffset[a.day] - dayOffset[b.day]);
_sortedSchedule = [...SCHEDULE].sort((a, b) => dayOffset[a.day] - dayOffset[b.day]);
list.innerHTML = sorted.map(row => {
renderScheduleFilters(_sortedSchedule);
list.innerHTML = _sortedSchedule.map((row, i) => {
const isToday = row.day === todayName;
const offset = dayOffset[row.day];
const date = new Date(now);
date.setDate(now.getDate() + offset);
const dayNum = `${date.getDate()}/${date.getMonth() + 1}`;
const cityClass = row.city === 'Hoi An' ? 'hoian' : 'danang';
const venueEl = row.mapUrl
? `<a href="${row.mapUrl}" target="_blank" rel="noopener">${row.venue}</a>`
: row.venue;
const orgHtml = organizerLinks(row.organizer, row.organizerUrl, true);
return `
<div class="sfB-row${isToday ? ' today' : ''}">
<div class="sfB-row${isToday ? ' today' : ''}" data-idx="${i}"
data-music="${row.music.toLowerCase()}"
data-city="${row.city.toLowerCase()}"
tabindex="0" role="button" aria-label="View details for ${row.name}">
<div class="col-day">
<div class="day-line">
<span class="date-num">${dayNum}</span>
@@ -93,19 +324,27 @@ function renderScheduleList() {
</div>
${isToday ? '<span class="tonight-label">▶ Tonight</span>' : ''}
</div>
<div class="col-when">${row.when || ''}</div>
<div class="col-social">
${row.social}
<span class="sub">${row.organizer}</span>
</div>
<div class="col-when">${row.when}</div>
<div class="col-social">${row.name}</div>
<div class="col-org">${orgHtml}</div>
<div class="col-music">${musicToChips(row.music)}</div>
<div class="col-venue">
<span class="pin">📍</span>
${venueEl}
<a href="${row.mapUrl}" target="_blank" rel="noopener" onclick="event.stopPropagation()">${row.venue}</a>
</div>
<div><span class="col-city ${cityClass}">${row.city}</span></div>
</div>`;
}).join('');
list.querySelectorAll('.sfB-row').forEach(el => {
function openRow() {
const idx = parseInt(el.dataset.idx, 10);
openEventModal(_sortedSchedule[idx]);
}
el.addEventListener('click', openRow);
el.addEventListener('keydown', e => {
if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); openRow(); }
});
});
}
// ---- Home: "Coming up" teaser (4 cards starting from today) ----
@@ -132,12 +371,13 @@ function renderScheduleTeaser() {
const date = new Date(now);
date.setDate(now.getDate() + offset);
const dayNum = `${date.getDate()}/${date.getMonth() + 1}`;
const orgText = row.organizer.join(' & ');
return `
<a href="/schedule/" class="sfB-tcard">
<div class="day"><span class="day-date">${dayNum}</span> ${row.day}</div>
<div class="when">${row.when || ''}</div>
<h4>${row.social}</h4>
<div class="organizer">${row.organizer}</div>
<h4>${row.name}</h4>
<div class="organizer">${orgText}</div>
<div class="at">@ ${row.venue} · ${row.city}</div>
<div class="chips">${musicToChips(row.music)}</div>
</a>
@@ -147,6 +387,9 @@ function renderScheduleTeaser() {
// ---- Filter pills (studios.html / classes.html) ----
function initFilters() {
const cards = document.querySelectorAll('.filterable-card');
if (!cards.length) return;
const pills = document.querySelectorAll('.filter-pill');
if (!pills.length) return;
@@ -156,7 +399,7 @@ function initFilters() {
pill.classList.add('active');
const filter = pill.dataset.filter;
document.querySelectorAll('.filterable-card').forEach(card => {
cards.forEach(card => {
if (filter === 'all') {
card.classList.remove('hidden');
} else {
@@ -176,7 +419,6 @@ function lockPalmSizes() {
const vh = window.innerHeight;
const clamp = (val, min, max) => Math.min(Math.max(val, min), max);
// Each entry: [size, { top|bottom, left|right } in px]
const config = {
'corner-tl': { size: clamp(vw * 0.40, 100, 620), pos: { top: vh * -0.08, left: vw * -0.15 } },
'corner-tr': { size: clamp(vw * 0.40, 100, 620), pos: { top: vh * -0.08, right: vw * -0.10 } },
@@ -222,6 +464,7 @@ document.addEventListener('DOMContentLoaded', () => {
renderScheduleList();
renderScheduleTeaser();
initFilters();
initEventModal();
const yearEl = document.getElementById('footer-year');
if (yearEl) yearEl.textContent = new Date().getFullYear();
lockPalmSizes();

View File

@@ -13,8 +13,16 @@
<link
href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..60,700;12..60,800&family=Caveat+Brush&family=JetBrains+Mono:wght@400;500&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap"
rel="stylesheet">
<link rel="stylesheet" href="../css/style.css?v=254e174d">
<link rel="stylesheet" href="../css/style.css?v=0a14c10d">
<link rel="stylesheet" href="../css/fireflies.css">
<link rel="canonical" href="https://saborflow.ai1.ovh/playlists/">
<meta property="og:type" content="website">
<meta property="og:site_name" content="Sabor Flow Da Nang">
<meta property="og:title" content="Playlists — Sabor Flow Da Nang">
<meta property="og:description" content="Curated Spotify and YouTube Music playlists for Bachata, Salsa, Kizomba and Zouk. Practice, social dance, or just enjoy.">
<meta property="og:url" content="https://saborflow.ai1.ovh/playlists/">
<meta property="og:image" content="https://saborflow.ai1.ovh/assets/logo.jpg">
<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"Sabor Flow Da Nang","url":"https://saborflow.ai1.ovh","logo":"https://saborflow.ai1.ovh/assets/logo.jpg","sameAs":["https://www.instagram.com/saborflowdanang/","https://www.facebook.com/groups/sbkdanang"]}</script>
</head>
<body>
@@ -22,17 +30,17 @@
<div class="sfB-bg" aria-hidden="true">
<span></span><span></span><span></span><span></span><span></span>
<div class="sfB-palms">
<img class="sfB-palm corner-tl" src="../assets/palm-fronds-left.png" alt=""
<img class="sfB-palm corner-tl" src="../assets/palm-fronds-left.png" alt="Decorative palm frond"
style="--sway:10deg;animation-duration:8s;animation-delay:0s">
<img class="sfB-palm corner-tr" src="../assets/palm-fronds-right.png" alt=""
<img class="sfB-palm corner-tr" src="../assets/palm-fronds-right.png" alt="Decorative palm frond"
style="--sway:12deg;animation-duration:9s;animation-delay:-2s">
<img class="sfB-palm corner-bl" src="../assets/palm-fronds-left.png" alt=""
<img class="sfB-palm corner-bl" src="../assets/palm-fronds-left.png" alt="Decorative palm frond"
style="--sway:11deg;animation-duration:10s;animation-delay:-4s;--flip:scaleY(-1)">
<img class="sfB-palm corner-br" src="../assets/palm-fronds-right.png" alt=""
<img class="sfB-palm corner-br" src="../assets/palm-fronds-right.png" alt="Decorative palm frond"
style="--sway:9deg;animation-duration:11s;animation-delay:-1.5s;--flip:scaleY(-1)">
<img class="sfB-palm corner-ml" src="../assets/palm-fronds-left.png" alt=""
<img class="sfB-palm corner-ml" src="../assets/palm-fronds-left.png" alt="Decorative palm frond"
style="--sway:13deg;animation-duration:9.5s;animation-delay:-3s">
<img class="sfB-palm corner-mr" src="../assets/palm-fronds-right.png" alt=""
<img class="sfB-palm corner-mr" src="../assets/palm-fronds-right.png" alt="Decorative palm frond"
style="--sway:10deg;animation-duration:11.5s;animation-delay:-1s">
</div>
</div>
@@ -577,7 +585,7 @@
<div class="sfB-modal-box">
<div class="sfB-modal-head">
<div class="sfB-modal-title-wrap">
<img src="" alt="" class="sfB-modal-logo" id="sfB-modal-logo">
<img src="" alt="Decorative palm frond" class="sfB-modal-logo" id="sfB-modal-logo">
<h3 id="sfB-modal-title"></h3>
</div>
<button class="sfB-modal-close" id="sfB-modal-close" aria-label="Close"></button>
@@ -586,7 +594,7 @@
</div>
</div>
<script src="../js/main.js?v=254e174d"></script>
<script src="../js/main.js?v=0a14c10d"></script>
<script src="../js/playlists-data.js"></script>
<script src="../js/playlists-data-yt.js"></script>
<script>

4
robots.txt Normal file
View File

@@ -0,0 +1,4 @@
User-agent: *
Disallow: /
Sitemap: https://saborflow.ai1.ovh/sitemap.xml

View File

@@ -13,8 +13,16 @@
<link
href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..60,700;12..60,800&family=Caveat+Brush&family=JetBrains+Mono:wght@400;500&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap"
rel="stylesheet">
<link rel="stylesheet" href="../css/style.css?v=254e174d">
<link rel="stylesheet" href="../css/style.css?v=0a14c10d">
<link rel="stylesheet" href="../css/fireflies.css">
<link rel="canonical" href="https://saborflow.ai1.ovh/schedule/">
<meta property="og:type" content="website">
<meta property="og:site_name" content="Sabor Flow Da Nang">
<meta property="og:title" content="Weekly Schedule — Sabor Flow Da Nang">
<meta property="og:description" content="The weekly Latin social dance schedule in Da Nang and Hoi An. Salsa, Bachata, Kizomba, Zouk — every day of the week.">
<meta property="og:url" content="https://saborflow.ai1.ovh/schedule/">
<meta property="og:image" content="https://saborflow.ai1.ovh/assets/logo.jpg">
<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"Sabor Flow Da Nang","url":"https://saborflow.ai1.ovh","logo":"https://saborflow.ai1.ovh/assets/logo.jpg","sameAs":["https://www.instagram.com/saborflowdanang/","https://www.facebook.com/groups/sbkdanang"]}</script>
</head>
<body>
@@ -22,17 +30,17 @@
<div class="sfB-bg" aria-hidden="true">
<span></span><span></span><span></span><span></span><span></span>
<div class="sfB-palms">
<img class="sfB-palm corner-tl" src="../assets/palm-fronds-left.png" alt=""
<img class="sfB-palm corner-tl" src="../assets/palm-fronds-left.png" alt="Decorative palm frond"
style="--sway:10deg;animation-duration:8s;animation-delay:0s">
<img class="sfB-palm corner-tr" src="../assets/palm-fronds-right.png" alt=""
<img class="sfB-palm corner-tr" src="../assets/palm-fronds-right.png" alt="Decorative palm frond"
style="--sway:12deg;animation-duration:9s;animation-delay:-2s">
<img class="sfB-palm corner-bl" src="../assets/palm-fronds-left.png" alt=""
<img class="sfB-palm corner-bl" src="../assets/palm-fronds-left.png" alt="Decorative palm frond"
style="--sway:11deg;animation-duration:10s;animation-delay:-4s;--flip:scaleY(-1)">
<img class="sfB-palm corner-br" src="../assets/palm-fronds-right.png" alt=""
<img class="sfB-palm corner-br" src="../assets/palm-fronds-right.png" alt="Decorative palm frond"
style="--sway:9deg;animation-duration:11s;animation-delay:-1.5s;--flip:scaleY(-1)">
<img class="sfB-palm corner-ml" src="../assets/palm-fronds-left.png" alt=""
<img class="sfB-palm corner-ml" src="../assets/palm-fronds-left.png" alt="Decorative palm frond"
style="--sway:13deg;animation-duration:9.5s;animation-delay:-3s">
<img class="sfB-palm corner-mr" src="../assets/palm-fronds-right.png" alt=""
<img class="sfB-palm corner-mr" src="../assets/palm-fronds-right.png" alt="Decorative palm frond"
style="--sway:10deg;animation-duration:11.5s;animation-delay:-1s">
</div>
</div>
@@ -89,19 +97,26 @@
</div>
<div class="sfB-toolbar">
<div class="sfB-pills">
<button class="filter-pill active" data-filter="all">All</button>
<button class="filter-pill" data-filter="salsa">Salsa</button>
<button class="filter-pill" data-filter="bachata">Bachata</button>
<button class="filter-pill" data-filter="kizomba">Kizomba</button>
<button class="filter-pill" data-filter="zouk">Zouk</button>
<button class="filter-pill" data-filter="danang">Da Nang</button>
<button class="filter-pill" data-filter="hoian">Hoi An</button>
</div>
<div class="sfB-pills" id="sfB-schedule-pills"></div>
</div>
<p class="sfB-sched-hint">Tap any event to see entry fee, special offers &amp; vibe.</p>
<div class="sfB-list" id="sfB-schedule-list"></div>
<div class="sfB-ev-modal" id="sfB-ev-modal" role="dialog" aria-modal="true" aria-labelledby="sfB-ev-modal-name">
<div class="sfB-modal-overlay" id="sfB-ev-modal-overlay"></div>
<div class="sfB-ev-modal-box">
<div class="sfB-ev-head">
<div>
<div class="sfB-ev-day-time" id="sfB-ev-modal-day"></div>
<div class="sfB-ev-name" id="sfB-ev-modal-name"></div>
</div>
<button class="sfB-modal-close" id="sfB-ev-modal-close" aria-label="Close"></button>
</div>
<div class="sfB-ev-body" id="sfB-ev-modal-body"></div>
</div>
</div>
<p class="footnote">Schedule updated monthly &mdash; last update: <strong style="color:var(--sf-gold)"
id="schedule-last-update"></strong></p>
</main>
@@ -123,7 +138,7 @@
</div>
</footer>
<script src="../js/main.js?v=254e174d"></script>
<script src="../js/main.js?v=0a14c10d"></script>
<script>
// Dynamic last-update label
(function () {
@@ -134,23 +149,6 @@
}
})();
// Schedule-page filter by city / style
document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('.sfB-pills .filter-pill').forEach(pill => {
pill.addEventListener('click', () => {
document.querySelectorAll('.sfB-pills .filter-pill').forEach(p => p.classList.remove('active'));
pill.classList.add('active');
const f = pill.dataset.filter;
document.querySelectorAll('.sfB-row').forEach(row => {
if (f === 'all') { row.style.display = ''; return; }
const music = row.querySelector('.col-music')?.textContent.toLowerCase() || '';
const city = row.querySelector('.col-city')?.textContent.toLowerCase() || '';
const show = music.includes(f) || city.includes(f === 'danang' ? 'da nang' : f === 'hoian' ? 'hoi an' : f);
row.style.display = show ? '' : 'none';
});
});
});
});
</script>
</body>

10
sitemap.xml Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>https://saborflow.ai1.ovh/</loc><priority>1.0</priority></url>
<url><loc>https://saborflow.ai1.ovh/schedule/</loc><priority>0.9</priority></url>
<url><loc>https://saborflow.ai1.ovh/studios/</loc><priority>0.8</priority></url>
<url><loc>https://saborflow.ai1.ovh/classes/</loc><priority>0.8</priority></url>
<url><loc>https://saborflow.ai1.ovh/festivals/</loc><priority>0.8</priority></url>
<url><loc>https://saborflow.ai1.ovh/connect/</loc><priority>0.7</priority></url>
<url><loc>https://saborflow.ai1.ovh/playlists/</loc><priority>0.6</priority></url>
</urlset>

View File

@@ -13,8 +13,16 @@
<link
href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..60,700;12..60,800&family=Caveat+Brush&family=JetBrains+Mono:wght@400;500&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap"
rel="stylesheet">
<link rel="stylesheet" href="../css/style.css?v=254e174d">
<link rel="stylesheet" href="../css/style.css?v=0a14c10d">
<link rel="stylesheet" href="../css/fireflies.css">
<link rel="canonical" href="https://saborflow.ai1.ovh/studios/">
<meta property="og:type" content="website">
<meta property="og:site_name" content="Sabor Flow Da Nang">
<meta property="og:title" content="Dance Studios — Sabor Flow Da Nang">
<meta property="og:description" content="Latin dance studios in Da Nang, Vietnam. Find schools teaching Salsa, Bachata, Kizomba, and Zouk.">
<meta property="og:url" content="https://saborflow.ai1.ovh/studios/">
<meta property="og:image" content="https://saborflow.ai1.ovh/assets/logo.jpg">
<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"Sabor Flow Da Nang","url":"https://saborflow.ai1.ovh","logo":"https://saborflow.ai1.ovh/assets/logo.jpg","sameAs":["https://www.instagram.com/saborflowdanang/","https://www.facebook.com/groups/sbkdanang"]}</script>
</head>
<body>
@@ -22,17 +30,17 @@
<div class="sfB-bg" aria-hidden="true">
<span></span><span></span><span></span><span></span><span></span>
<div class="sfB-palms">
<img class="sfB-palm corner-tl" src="../assets/palm-fronds-left.png" alt=""
<img class="sfB-palm corner-tl" src="../assets/palm-fronds-left.png" alt="Decorative palm frond"
style="--sway:10deg;animation-duration:8s;animation-delay:0s">
<img class="sfB-palm corner-tr" src="../assets/palm-fronds-right.png" alt=""
<img class="sfB-palm corner-tr" src="../assets/palm-fronds-right.png" alt="Decorative palm frond"
style="--sway:12deg;animation-duration:9s;animation-delay:-2s">
<img class="sfB-palm corner-bl" src="../assets/palm-fronds-left.png" alt=""
<img class="sfB-palm corner-bl" src="../assets/palm-fronds-left.png" alt="Decorative palm frond"
style="--sway:11deg;animation-duration:10s;animation-delay:-4s;--flip:scaleY(-1)">
<img class="sfB-palm corner-br" src="../assets/palm-fronds-right.png" alt=""
<img class="sfB-palm corner-br" src="../assets/palm-fronds-right.png" alt="Decorative palm frond"
style="--sway:9deg;animation-duration:11s;animation-delay:-1.5s;--flip:scaleY(-1)">
<img class="sfB-palm corner-ml" src="../assets/palm-fronds-left.png" alt=""
<img class="sfB-palm corner-ml" src="../assets/palm-fronds-left.png" alt="Decorative palm frond"
style="--sway:13deg;animation-duration:9.5s;animation-delay:-3s">
<img class="sfB-palm corner-mr" src="../assets/palm-fronds-right.png" alt=""
<img class="sfB-palm corner-mr" src="../assets/palm-fronds-right.png" alt="Decorative palm frond"
style="--sway:10deg;animation-duration:11.5s;animation-delay:-1s">
</div>
</div>
@@ -241,7 +249,7 @@
</div>
</footer>
<script src="../js/main.js?v=254e174d"></script>
<script src="../js/main.js?v=0a14c10d"></script>
</body>
</html>