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:20260706T200000
DTEND;TZID=Europe/Kyiv:20260706T204500
DTSTAMP:20260627T101114Z
CREATED:20260531T094147Z
LAST-MODIFIED:20260627T101114Z
UID:10000785-1783368000-1783370700@www.edling.com.ua
SUMMARY:🎭 Mood Check / Як я сьогодні почуваюсь. ⭐Безкоштовний урок.
DESCRIPTION:Урок 4. Про що: Вчимося розпізнавати і називати свої емоції. Що будемо робити: Ділитися\, як ти почуваєшся\, грати у інтерактивні вправи «Емоційна карта»\, дізнаватися\, що відчувають однокласники. Чого навчимося: Вільно говорити про свої почуття англійською\, описувати настрій у різних ситуаціях. 🎧 Пройдіть короткий self-prep урок\, щоб впевненіше говорити на цьому занятті:…  \n\n\nПотрібне членство Безкоштовно\n\n Ви повинні бути членом Безкоштовно\, щоб отримати доступ до цього контенту. \nПриєднуйся зараз Увійти \n\nAlready a member? Увійдіть тут
URL:https://www.edling.com.ua/event/mood-check-yak-ya-sogodni-pochuvayus-bezkoshtovnyj-urok-4/
CATEGORIES:Школярі
ATTACH;FMTTYPE=image/jpeg:https://www.edling.com.ua/wp-content/uploads/2026/02/tec_mood_check_11-16_emotions_speaking_club1.jpg
LOCATION:https://us05web.zoom.us/j/84295274809?pwd=7Lq0xHepEvbEMloD96ZW1ZuKieq0PD.1
END:VEVENT
BEGIN:VEVENT
DTSTART;TZID=Europe/Kyiv:20260708T200000
DTEND;TZID=Europe/Kyiv:20260708T204500
DTSTAMP:20260617T081048Z
CREATED:20260617T081048Z
LAST-MODIFIED:20260617T081048Z
UID:10000807-1783540800-1783543500@www.edling.com.ua
SUMMARY:🤖 Tech in My Life / Технології в моєму житті. 🎟️Урок за підпискою.
DESCRIPTION:Урок 17. Про що: Де і як ми використовуємо технології щодня. Що будемо робити: Ділитися прикладами з життя\, обговорювати улюблені гаджети\, гра «Мій гаджет-герой». Чого навчимося: Говорити про технології простими словами\, описувати власний досвід. 🎧 Пройдіть короткий self-prep урок\, щоб впевненіше говорити на цьому занятті:…  \n\n\nПотрібне членство Безкоштовно\n\n Ви повинні бути членом Безкоштовно\, щоб отримати доступ до цього контенту. \nПриєднуйся зараз Увійти \n\nAlready a member? Увійдіть тут
URL:https://www.edling.com.ua/event/tech-in-my-life-tehnologiyi-v-moyemu-zhytti-urok-za-pidpyskoyu/
CATEGORIES:Школярі
ATTACH;FMTTYPE=image/jpeg:https://www.edling.com.ua/wp-content/uploads/2026/03/17.1-11-16.jpg
LOCATION:https://us05web.zoom.us/j/83241426274?pwd=if91vnoQBUv0qnqEaHX7n1CMFZFK89.1
END:VEVENT
BEGIN:VEVENT
DTSTART;TZID=Europe/Kyiv:20260710T200000
DTEND;TZID=Europe/Kyiv:20260710T204500
DTSTAMP:20260617T081221Z
CREATED:20260617T081221Z
LAST-MODIFIED:20260617T081221Z
UID:10000808-1783713600-1783716300@www.edling.com.ua
SUMMARY:💼 Jobs I Know / Професії\, які я знаю. 🎟️Урок за підпискою.
DESCRIPTION:Урок 18. Про що: Відомі та знайомі професії. Що будемо робити: Називати професії\, обговорювати\, чим займаються люди\, гра «Хто я за професією?» Чого навчимося: Говорити про роботу простими словами\, описувати професійні обов’язки. 🎧 Пройдіть короткий self-prep урок\, щоб впевненіше говорити на цьому занятті:…  \n\n\nПотрібне членство Безкоштовно\n\n Ви повинні бути членом Безкоштовно\, щоб отримати доступ до цього контенту. \nПриєднуйся зараз Увійти \n\nAlready a member? Увійдіть тут
URL:https://www.edling.com.ua/event/jobs-i-know-profesiyi-yaki-ya-znayu-urok-za-pidpyskoyu/
CATEGORIES:Школярі
ATTACH;FMTTYPE=image/jpeg:https://www.edling.com.ua/wp-content/uploads/2026/03/18.1-11-16.jpg
LOCATION:https://us05web.zoom.us/j/84934509681?pwd=g5ihkm2QSaBV1aA2ahcppfGS8SdAXy.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>
