BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Школа Edling - ECPv6.16.5.1//NONSGML v1.0//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:Школа Edling
X-ORIGINAL-URL:https://www.edling.com.ua
X-WR-CALDESC:Події за Школа Edling
REFRESH-INTERVAL;VALUE=DURATION:PT1H
X-Robots-Tag:noindex
X-PUBLISHED-TTL:PT1H
BEGIN:VTIMEZONE
TZID:Europe/Kyiv
BEGIN:DAYLIGHT
TZOFFSETFROM:+0200
TZOFFSETTO:+0300
TZNAME:EEST
DTSTART:20250330T010000
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0300
TZOFFSETTO:+0200
TZNAME:EET
DTSTART:20251026T010000
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETFROM:+0200
TZOFFSETTO:+0300
TZNAME:EEST
DTSTART:20260329T010000
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0300
TZOFFSETTO:+0200
TZNAME:EET
DTSTART:20261025T010000
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETFROM:+0200
TZOFFSETTO:+0300
TZNAME:EEST
DTSTART:20270328T010000
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0300
TZOFFSETTO:+0200
TZNAME:EET
DTSTART:20271031T010000
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTART;TZID=Europe/Kyiv:20260525T190000
DTEND;TZID=Europe/Kyiv:20260525T194500
DTSTAMP:20260515T123138Z
CREATED:20260417T070853Z
LAST-MODIFIED:20260515T123138Z
UID:10000763-1779735600-1779738300@www.edling.com.ua
SUMMARY:My Day\, My Story! / Мій день — моя історія. ⭐Безкоштовний урок.
DESCRIPTION:Урок 2. Про що: Перетворюємо звичайний день на маленьку пригоду! Що будемо робити: Називати частини дня та дії\, створювати міні-історію про свої пригоди сьогодні. Чого навчимося: Розповідати про день цікаво й легко англійською\, використовувати прості речення в дії. 🎧 Пройдіть короткий self-prep урок\, щоб впевненіше говорити на цьому занятті:…  \n\n\nПотрібне членство Безкоштовно\n\n Ви повинні бути членом Безкоштовно\, щоб отримати доступ до цього контенту. \nПриєднуйся зараз Увійти \n\nAlready a member? Увійдіть тут
URL:https://www.edling.com.ua/event/my-day-my-story-mij-den-moya-istoriya-bezkoshtovnyj-urok-3/
ATTACH;FMTTYPE=image/jpeg:https://www.edling.com.ua/wp-content/uploads/2026/01/tec-my-life-quest-a-day-in-my-life-8-10.jpg
LOCATION:https://us05web.zoom.us/j/87430525671?pwd=64TOosNJmWlSYWiPbJuarmZlLbJFwf.1
END:VEVENT
BEGIN:VEVENT
DTSTART;TZID=Europe/Kyiv:20260525T200000
DTEND;TZID=Europe/Kyiv:20260525T204500
DTSTAMP:20260515T123153Z
CREATED:20260417T070955Z
LAST-MODIFIED:20260515T123153Z
UID:10000764-1779739200-1779741900@www.edling.com.ua
SUMMARY:☀️ Teen’s Day / День підлітка. ⭐Безкоштовний урок.
DESCRIPTION:Урок 2. Про що: Розповідаємо про свій звичайний день. Що будемо робити: Описувати свій день у коротких інтерактивних вправах\, дізнаватися про життя однокласників\, робити швидкі «мінідіалоги». Чого навчимося: Говорити про щоденні дії англійською\, формувати базові речення для опису дня. 🎧 Пройдіть короткий self-prep урок\, щоб впевненіше говорити на цьому занятті:…  \n\n\nПотрібне членство Безкоштовно\n\n Ви повинні бути членом Безкоштовно\, щоб отримати доступ до цього контенту. \nПриєднуйся зараз Увійти \n\nAlready a member? Увійдіть тут
URL:https://www.edling.com.ua/event/teen-s-day-den-pidlitka-bezkoshtovnyj-urok-3/
CATEGORIES:Школярі
ATTACH;FMTTYPE=image/jpeg:https://www.edling.com.ua/wp-content/uploads/2026/01/tec-teens-day-real-life-11-16.jpg
LOCATION:https://us05web.zoom.us/j/86779594761?pwd=C0ioPOhby06SI8vQjeywMaym0S8aDz.1
END:VEVENT
BEGIN:VEVENT
DTSTART;TZID=Europe/Kyiv:20260527T190000
DTEND;TZID=Europe/Kyiv:20260527T194500
DTSTAMP:20260525T104817Z
CREATED:20260511T075817Z
LAST-MODIFIED:20260525T104817Z
UID:10000772-1779908400-1779911100@www.edling.com.ua
SUMMARY:🎨My Hobby World / Світ моїх хобі.
DESCRIPTION:Урок 5 Про що: Улюблені захоплення. Що будемо робити: Називати хобі\, вгадувати\, що робить друг. Чого навчимося: Говорити про інтереси англійською. 🎧 Пройдіть короткий self-prep урок\, щоб впевненіше говорити на цьому занятті:…  \n\n\nПотрібне членство Безкоштовно\n\n Ви повинні бути членом Безкоштовно\, щоб отримати доступ до цього контенту. \nПриєднуйся зараз Увійти \n\nAlready a member? Увійдіть тут
URL:https://www.edling.com.ua/event/my-hobby-world-svit-moyih-hobi/
ATTACH;FMTTYPE=image/jpeg:https://www.edling.com.ua/wp-content/uploads/2026/02/tec_my_hobby_world_8_10_v1.jpg
LOCATION:https://us05web.zoom.us/j/89978023521?pwd=aAc5qpbaBByRjOtvkvbxfb9URa9lEl.1
END:VEVENT
BEGIN:VEVENT
DTSTART;TZID=Europe/Kyiv:20260527T200000
DTEND;TZID=Europe/Kyiv:20260527T204500
DTSTAMP:20260511T083734Z
CREATED:20260511T083519Z
LAST-MODIFIED:20260511T083734Z
UID:10000778-1779912000-1779914700@www.edling.com.ua
SUMMARY:⚡ What I Do for Fun / Місія: Розважайся!
DESCRIPTION:Урок 5. Про що: Досліджуємо\, що приносить радість у вільний час. Що будемо робити: Ділитися улюбленими заняттями\, розповідати смішні або цікаві історії про свої хобі\, слухати інших. Чого навчимося: Легко і впевнено говорити про свої інтереси англійською та заводити розмову. 🎧 Пройдіть короткий self-prep урок\, щоб впевненіше говорити на цьому занятті:…  \n\n\nПотрібне членство Безкоштовно\n\n Ви повинні бути членом Безкоштовно\, щоб отримати доступ до цього контенту. \nПриєднуйся зараз Увійти \n\nAlready a member? Увійдіть тут
URL:https://www.edling.com.ua/event/what-i-do-for-fun-misiya-rozvazhajsya/
CATEGORIES:Школярі
ATTACH;FMTTYPE=image/jpeg:https://www.edling.com.ua/wp-content/uploads/2026/02/tec_what_i_do_for_fun_11_16_v1.jpg
LOCATION:https://us05web.zoom.us/j/84070485874?pwd=vUEz44zZG3F1h1jKjXBnMVajKBbciX.1
END:VEVENT
BEGIN:VEVENT
DTSTART;TZID=Europe/Kyiv:20260529T190000
DTEND;TZID=Europe/Kyiv:20260529T194500
DTSTAMP:20260511T080357Z
CREATED:20260511T080357Z
LAST-MODIFIED:20260511T080357Z
UID:10000773-1780081200-1780083900@www.edling.com.ua
SUMMARY:😊How Do You Feel? / Як ти почуваєшся?
DESCRIPTION:Урок 6. Про що: Розпізнавання і називання емоцій. Що будемо робити: Вказувати на настрій\, показувати емоції\, відповідати на запитання. Чого навчимося: Називати власні емоції англійською. 🎧 Пройдіть короткий self-prep урок\, щоб впевненіше говорити на цьому занятті:…  \n\n\nПотрібне членство Безкоштовно\n\n Ви повинні бути членом Безкоштовно\, щоб отримати доступ до цього контенту. \nПриєднуйся зараз Увійти \n\nAlready a member? Увійдіть тут
URL:https://www.edling.com.ua/event/how-do-you-feel-yak-ty-pochuvayeshsya/
ATTACH;FMTTYPE=image/jpeg:https://www.edling.com.ua/wp-content/uploads/2026/02/edling_how_do_you_feel_8-10_realistic_hero.jpg
LOCATION:https://us05web.zoom.us/j/86463990498?pwd=ZyeQaXyazdWr94LtQgcFO8RDTaBCJ4.1
END:VEVENT
BEGIN:VEVENT
DTSTART;TZID=Europe/Kyiv:20260529T200000
DTEND;TZID=Europe/Kyiv:20260529T204500
DTSTAMP:20260511T083927Z
CREATED:20260221T133631Z
LAST-MODIFIED:20260511T083927Z
UID:10000144-1780084800-1780087500@www.edling.com.ua
SUMMARY:🕹️ Game On! / Мій ігровий світ.
DESCRIPTION:Урок 6. Про що: Твої улюблені онлайн та офлайн ігри. Що будемо робити: Називати ігри\, жанри\, платформи\, обговорювати\, чому вони цікаві. Чого навчимося: Вільно говорити про ігри простими фразами англійською. 🎧 Пройдіть короткий self-prep урок\, щоб впевненіше говорити на цьому занятті:…  \n\n\nПотрібне членство Безкоштовно\n\n Ви повинні бути членом Безкоштовно\, щоб отримати доступ до цього контенту. \nПриєднуйся зараз Увійти \n\nAlready a member? Увійдіть тут
URL:https://www.edling.com.ua/event/6-1-game-on-mij-igrovyj-svit-bezkoshtovnyj-urok/
CATEGORIES:Школярі
ATTACH;FMTTYPE=image/jpeg:https://www.edling.com.ua/wp-content/uploads/2026/02/tec_game_on_my_gaming_world_11-16_edling.jpg
LOCATION:https://us05web.zoom.us/j/88145953422?pwd=leYmrnXbbohahRZxIKI457M929pOxZ.1
END:VEVENT
END:VCALENDAR
<script id="edla-tracker-inline" data-no-optimize="1" data-no-defer="1" data-no-async="1">window.EDLA_CFG={"endpoint":"https:\/\/www.edling.com.ua\/wp-json\/edling-analytics\/v1\/event","vidCookie":"edl_vid"};
(function () {
    'use strict';

    var CFG = window.EDLA_CFG || {};
    if ( ! CFG.endpoint ) return;

    var VID = CFG.vidCookie || 'edl_vid';

    function getCookie( name ) {
        var safe = name.replace( /[$()*+?.\\^|]/g, '\\$&' );
        var m = document.cookie.match( new RegExp( '(?:^|; )' + safe + '=([^;]*)' ) );
        return m ? decodeURIComponent( m[ 1 ] ) : '';
    }

    function setCookie( name, value, days ) {
        var expires = new Date( Date.now() + days * 86400000 ).toUTCString();
        document.cookie = name + '=' + encodeURIComponent( value ) +
            '; expires=' + expires + '; path=/; SameSite=Lax';
    }

    function uuid() {
        if ( window.crypto && crypto.randomUUID ) {
            return crypto.randomUUID();
        }
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace( /[xy]/g, function ( c ) {
            var r = Math.random() * 16 | 0;
            var v = c === 'x' ? r : ( r & 0x3 | 0x8 );
            return v.toString( 16 );
        } );
    }

    function visitorId() {
        var v = getCookie( VID );
        if ( ! v ) {
            v = uuid();
            setCookie( VID, v, 365 );
        }
        return v;
    }

    function currentUtm() {
        try {
            if ( window.EdlingUTM && typeof EdlingUTM.all === 'function' ) {
                return EdlingUTM.all();
            }
        } catch ( e ) {}
        return {};
    }

    function send( event, props ) {
        if ( ! event ) return;
        var body = JSON.stringify( {
            event: event,
            vid:   visitorId(),
            props: props || {},
            utm:   currentUtm(),
            url:   location.pathname
        } );
        try {
            if ( navigator.sendBeacon ) {
                var blob = new Blob( [ body ], { type: 'application/json' } );
                if ( navigator.sendBeacon( CFG.endpoint, blob ) ) return;
            }
        } catch ( e ) {}
        try {
            fetch( CFG.endpoint, {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: body,
                keepalive: true,
                credentials: 'same-origin'
            } ).catch( function () {} );
        } catch ( e ) {}
    }

    // Публічне API для подальших продуктових подій.
    window.EdlaTrack = send;

    // visit — один раз на сесію (щоб не дублювати на кожній сторінці).
    try {
        if ( ! sessionStorage.getItem( 'edla_visit' ) ) {
            sessionStorage.setItem( 'edla_visit', '1' );
            send( 'visit', {} );
        }
    } catch ( e ) {
        send( 'visit', {} );
    }
})();</script>

<!-- EDL_TTS_MARKER_HEAD -->

<style>
/* ===== Edling TTS Minimal UI ===== */

/* Force tight spacing even if LMS/theme adds margins */
.edl-phrase,
.edl-ua{
  display:block !important;
  margin:0 !important;
  padding:0 !important;
  line-height:1.35 !important;
}

/* EN line */
.edl-phrase{
  display:flex !important;
  align-items:center !important;
  gap:8px !important;
  font-size:18px !important;
}

/* Make UA sit close to EN */
.edl-phrase + .edl-ua{
  margin-top:2px !important;      /* EN -> UA */
  padding-left:10px !important;
  border-left:2px solid #e5e7eb !important;
}

/* Space between pairs (UA -> next EN) */
.edl-ua + .edl-phrase{
  margin-top:16px !important;     /* between pairs */
}

/* EN text */
.edl-text{
  line-height:1.35 !important;
}

/* Button */
.edl-tts{
  font-size:18px !important;
  text-decoration:none !important;
  cursor:pointer !important;
  user-select:none !important;
}

.edl-tts:hover{
  opacity:0.8 !important;
}

/* UA style */
.edl-ua{
  font-size:14px !important;
  color:#6b7280 !important;
}
</style>

<script>
(function () {
  if (window.__EDL_TTS_INIT__) return;
  window.__EDL_TTS_INIT__ = true;

  if (!('speechSynthesis' in window) || !('SpeechSynthesisUtterance' in window)) {
    console.warn('[EDL TTS] Not supported');
    return;
  }

  // Remove emojis / pictographs / flags / variation-selectors so TTS doesn't read them aloud.
  // Uses numeric code-point checks (no \u{} escapes — those get mangled inside PHP heredoc).
  function stripEmoji(s) {
    try {
      var str = String(s);
      var out = '';
      for (var i = 0; i < str.length;) {
        var cp = str.codePointAt(i);
        var size = cp > 0xFFFF ? 2 : 1;
        var isEmoji =
          (cp >= 0x1F000 && cp <= 0x1FAFF) ||  // emoji & pictographs
          (cp >= 0x2600  && cp <= 0x27BF)  ||  // misc symbols & dingbats
          (cp >= 0x2190  && cp <= 0x21FF)  ||  // arrows
          (cp >= 0x2B00  && cp <= 0x2BFF)  ||  // misc symbols/arrows
          (cp >= 0x1F1E6 && cp <= 0x1F1FF) ||  // regional indicators (flags)
          cp === 0xFE0F  ||                     // variation selector-16
          cp === 0x200D;                        // zero-width joiner
        if (!isEmoji) out += String.fromCodePoint(cp);
        i += size;
      }
      return out.replace(/\s+/g, ' ').trim();
    } catch (e) {
      return String(s);
    }
  }

  function speak(text, rate) {
    try {
      text = stripEmoji(text);
      if (!text) return;
      window.speechSynthesis.cancel();
      var u = new SpeechSynthesisUtterance(text);
      u.lang = 'en-US';
      u.rate = (typeof rate === 'number' && !isNaN(rate)) ? rate : 0.9;
      u.pitch = 1.0;
      u.volume = 1.0;
      setTimeout(function () {
        window.speechSynthesis.speak(u);
      }, 0);
    } catch (e) {
      console.warn('[EDL TTS] error', e);
    }
  }

  document.addEventListener('click', function (e) {
    var target = e.target;
    if (!target || !target.closest) return;

    // 1) Speak-links: href="#tts=<encoded>&r=<rate>" — survive sanitized community feeds
    //    (class/data-* get stripped by wp_kses, but <a href> is whitelisted).
    var link = target.closest('a[href*="#tts="]');
    if (link) {
      var raw = link.getAttribute('href') || link.href || '';
      var hashIdx = raw.indexOf('#tts=');
      if (hashIdx !== -1) {
        e.preventDefault();
        e.stopPropagation();
        try {
          var params = new URLSearchParams(raw.slice(hashIdx + 1));
          var t = (params.get('tts') || '').trim();
          var r = params.get('r') ? Number(params.get('r')) : undefined;
          if (t) speak(t, r);
        } catch (err) {
          console.warn('[EDL TTS] href parse error', err);
        }
        return;
      }
    }

    // 2) Explicit .edl-tts elements (lessons) — original behaviour
    var el = target.closest('.edl-tts');
    if (!el) return;

    if (el.tagName === 'A') e.preventDefault();

    var text = (el.getAttribute('data-text') || '').trim();
    if (!text) return;

    var rateAttr = el.getAttribute('data-rate');
    var rate = rateAttr ? Number(rateAttr) : undefined;

    speak(text, rate);
  }, true);

  console.log('[EDL TTS] ready');
})();
</script>
