(function () { function init() { var root = document.querySelector('[data-jmd-lang="zh"]'); if (!root || root.dataset.ready) return; root.dataset.ready = "1"; var pill = root.querySelector('.jmd-lang__pill'); var link = root.querySelector('a.jmd-lang__opt'); var thumb = root.querySelector('.jmd-lang__opt--active'); var dir = 1; /* 1 = slide right to switch, -1 = slide left to switch */ var maxShift = link.offsetLeft - thumb.offsetLeft; var startX = null, startY = null, dx = 0, swiped = false; function go() { swiped = false; link.click(); } function reset() { thumb.style.transform = ""; pill.classList.remove("is-dragging"); startX = null; } pill.addEventListener("pointerdown", function (e) { startX = e.clientX; startY = e.clientY; dx = 0; swiped = false; try { pill.setPointerCapture(e.pointerId); } catch (err) {} maxShift = link.offsetLeft - thumb.offsetLeft; }); pill.addEventListener("pointermove", function (e) { if (startX === null) return; dx = e.clientX - startX; var dy = e.clientY - startY; if (Math.abs(dx) < 6 || Math.abs(dx) < Math.abs(dy)) return; pill.classList.add("is-dragging"); var shift = Math.max(Math.min(dx, Math.max(maxShift, 0)), Math.min(maxShift, 0)); thumb.style.transform = "translateX(" + shift + "px)"; }); pill.addEventListener("pointerup", function () { if (startX === null) return; var moved = Math.abs(dx) >= 25; if (moved) { swiped = true; if (dx * dir > 0) { thumb.style.transition = "transform 0.15s ease"; thumb.style.transform = "translateX(" + maxShift + "px)"; setTimeout(function () { thumb.style.transition = ""; reset(); go(); }, 150); return; } } reset(); }); pill.addEventListener("pointercancel", reset); /* Tap anywhere on the switch (including the current language) toggles it */ pill.addEventListener("click", function (e) { if (swiped) { e.preventDefault(); swiped = false; return; } if (e.target.closest("a.jmd-lang__opt")) return; /* the link handles itself */ go(); }); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", init); } else { init(); } window.addEventListener("load", init); })();

Hi, I'm Jessica!

6年前從法律轉職,隻身從香港來到倫敦追尋演奏夢。
現在,我是一位在倫敦生活、在英國與亞洲演出的鋼琴家。
🎹 現在進行中:100日報考音樂學院
記錄我再次準備英國音樂學院考試的100天。

Video

考上了嗎?第一時間告訴你 🎵

加入我的電郵名單,收到考試結果、音樂會消息,還有社交媒體上看不到的故事。
不會常常打擾你,只在有特別演出或重要里程碑時才寄出! ✉️


(function () { function init() { var root = document.querySelector('[data-jmd-lang="en"]'); if (!root || root.dataset.ready) return; root.dataset.ready = "1"; var pill = root.querySelector('.jmd-lang__pill'); var link = root.querySelector('a.jmd-lang__opt'); var thumb = root.querySelector('.jmd-lang__opt--active'); var dir = -1; /* 1 = slide right to switch, -1 = slide left to switch */ var maxShift = link.offsetLeft - thumb.offsetLeft; var startX = null, startY = null, dx = 0, swiped = false; function go() { swiped = false; link.click(); } function reset() { thumb.style.transform = ""; pill.classList.remove("is-dragging"); startX = null; } pill.addEventListener("pointerdown", function (e) { startX = e.clientX; startY = e.clientY; dx = 0; swiped = false; try { pill.setPointerCapture(e.pointerId); } catch (err) {} maxShift = link.offsetLeft - thumb.offsetLeft; }); pill.addEventListener("pointermove", function (e) { if (startX === null) return; dx = e.clientX - startX; var dy = e.clientY - startY; if (Math.abs(dx) < 6 || Math.abs(dx) < Math.abs(dy)) return; pill.classList.add("is-dragging"); var shift = Math.max(Math.min(dx, Math.max(maxShift, 0)), Math.min(maxShift, 0)); thumb.style.transform = "translateX(" + shift + "px)"; }); pill.addEventListener("pointerup", function () { if (startX === null) return; var moved = Math.abs(dx) >= 25; if (moved) { swiped = true; if (dx * dir > 0) { thumb.style.transition = "transform 0.15s ease"; thumb.style.transform = "translateX(" + maxShift + "px)"; setTimeout(function () { thumb.style.transition = ""; reset(); go(); }, 150); return; } } reset(); }); pill.addEventListener("pointercancel", reset); /* Tap anywhere on the switch (including the current language) toggles it */ pill.addEventListener("click", function (e) { if (swiped) { e.preventDefault(); swiped = false; return; } if (e.target.closest("a.jmd-lang__opt")) return; /* the link handles itself */ go(); }); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", init); } else { init(); } window.addEventListener("load", init); })();

Hi, I'm Jessica!

Six years ago, I left law in Hong Kong to pursue piano in London.
Today, I’m a London-based pianist performing in the UK and Asia.
🎹 Now in progress:100 Days to Conservatoire Audition
Documenting 100 days of preparing for another UK conservatoire audition.

Video

Be the first to know if I get in 🎵

Join my mailing list for audition results, concert news and stories you won’t find on social media.
You won’t see my emails often. Only for special concerts and big milestones! ✉️