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:20260121T170000
DTEND;TZID=Europe/Kyiv:20260121T174500
DTSTAMP:20260116T153704Z
CREATED:20260110T160759Z
LAST-MODIFIED:20260116T153704Z
UID:10000105-1769014800-1769017500@www.edling.com.ua
SUMMARY:Мисливець за підказками.
DESCRIPTION:Про що: Занурення у світ детективів через гру\, загадки та відомих персонажів для дітей. Що будемо робити: Вивчати корисну детективну лексику\, розвʼязувати цікаві завдання та загадки\, розвивати логічне мислення. Чого навчимося:…  \n\n\nПотрібне членство Повний доступ\n\n Ви повинні бути членом Повний доступ\, щоб отримати доступ до цього контенту. \nПриєднуйся зараз Увійти \n\nAlready a member? Увійдіть тут
URL:https://www.edling.com.ua/event/myslyvets-za-pidkazkamy/
CATEGORIES:Школярі
ATTACH;FMTTYPE=image/jpeg:https://www.edling.com.ua/wp-content/uploads/2025/12/tec-detective-escape-mission-lesson-2-10-12.jpg
LOCATION:https://us05web.zoom.us/j/81088069856?pwd=XpzkHuZp4qRppEUBlwm5s5uMMKHQjF.1
END:VEVENT
BEGIN:VEVENT
DTSTART;TZID=Europe/Kyiv:20260121T190000
DTEND;TZID=Europe/Kyiv:20260121T194500
DTSTAMP:20260110T154535Z
CREATED:20260110T154535Z
LAST-MODIFIED:20260110T154535Z
UID:10000102-1769022000-1769024700@www.edling.com.ua
SUMMARY:Геніальні ідеї людства.
DESCRIPTION:Про що: Про цікаві винаходи та відкриття і про те\, як вони змінюють життя людей. Що будемо робити: Відгадувати відомі винаходи\, вчитися говорити\, для чого потрібні різні речі\, уявляти життя…  \n\n\nПотрібне членство Повний доступ\n\n Ви повинні бути членом Повний доступ\, щоб отримати доступ до цього контенту. \nПриєднуйся зараз Увійти \n\nAlready a member? Увійдіть тут
URL:https://www.edling.com.ua/event/genialni-ideyi-lyudstva/
ATTACH;FMTTYPE=image/jpeg:https://www.edling.com.ua/wp-content/uploads/2025/12/tec-discoveries-great-human-ideas-lesson-2-8-9.jpg
LOCATION:https://us05web.zoom.us/j/89884249241?pwd=rJbjuE14EgzISnETUlkroSr2NsiXvi.1
END:VEVENT
BEGIN:VEVENT
DTSTART;TZID=Europe/Kyiv:20260123T170000
DTEND;TZID=Europe/Kyiv:20260123T174500
DTSTAMP:20260116T153900Z
CREATED:20260110T161516Z
LAST-MODIFIED:20260116T153900Z
UID:10000106-1769187600-1769190300@www.edling.com.ua
SUMMARY:Місія втечі.
DESCRIPTION:Про що: у форматі escape-story\, де діти розгадують історію та створюють власний детективний сценарій. Що будемо робити: Описувати ситуації \, брати участь у творчих завданнях\, створювати інтерактивну історія\, обговорювати та презентувати…  \n\n\nПотрібне членство Повний доступ\n\n Ви повинні бути членом Повний доступ\, щоб отримати доступ до цього контенту. \nПриєднуйся зараз Увійти \n\nAlready a member? Увійдіть тут
URL:https://www.edling.com.ua/event/misiya-vtechi/
CATEGORIES:Школярі
ATTACH;FMTTYPE=image/jpeg:https://www.edling.com.ua/wp-content/uploads/2026/01/escape-mission-11-16-tec-ultra.jpg
LOCATION:https://us05web.zoom.us/j/83862828327?pwd=M6CWNgFzaDodcYyuUQCVIqQtOa8amj.1
END:VEVENT
BEGIN:VEVENT
DTSTART;TZID=Europe/Kyiv:20260123T190000
DTEND;TZID=Europe/Kyiv:20260123T194500
DTSTAMP:20260110T155414Z
CREATED:20260110T155414Z
LAST-MODIFIED:20260110T155414Z
UID:10000103-1769194800-1769197500@www.edling.com.ua
SUMMARY:Майбутнє\, яке ми створюємо.
DESCRIPTION:Що будемо робити: обговорювати\, яким буде світ через 100 років\, уявляти себе винахідниками майбутнього і як наука та винаходи впливають на життя людей у майбутньому. Що будемо робити: Обговорювати майбутнє…  \n\n\nПотрібне членство Повний доступ\n\n Ви повинні бути членом Повний доступ\, щоб отримати доступ до цього контенту. \nПриєднуйся зараз Увійти \n\nAlready a member? Увійдіть тут
URL:https://www.edling.com.ua/event/majbutnye-yake-my-stvoryuyemo/
ATTACH;FMTTYPE=image/jpeg:https://www.edling.com.ua/wp-content/uploads/2026/01/future-we-create-8-10-tec-ultra.jpg
LOCATION:https://us05web.zoom.us/j/84838619335?pwd=q0LThZ3zhoTXJIG7wB37d4JLrzxapP.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
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>
