Scroll Father β ΡΡΠΎ Π»ΡΠ³ΠΊΠ°Ρ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π½Π° JavaScript/TypeScript, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΠ°Ρ Π½Π°Π±ΠΎΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΡΠΎ ΡΠΊΡΠΎΠ»Π»ΠΎΠΌ Π² Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ . ΠΠ½Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ Π»Π΅Π³ΠΊΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ, ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½ΡΠΆΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΡΠΎ ΡΠΏΠΎΡΠΎΠ±ΡΡΠ²ΡΠ΅Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΈ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ.
- ΠΠΎΠ΄ΡΠ»ΡΠ½ΠΎΡΡΡ: ΠΠΌΠΏΠΎΡΡΠΈΡΡΠΉΡΠ΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡ.
- ΠΠΎΠ³Π°ΡΡΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»: Π€ΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠΊΡΠΎΠ»Π»Π°, ΠΏΠ»Π°Π²Π½ΠΎΠΉ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ, ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ΅ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄ΡΡΠ³ΠΎΠ΅.
- ΠΡΡΠΎΠΊΠ°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ: ΠΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΠ΄ Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΌ Π²Π»ΠΈΡΠ½ΠΈΠ΅ΠΌ Π½Π° ΡΠ°Π·ΠΌΠ΅Ρ Π±Π°Π½Π΄Π»Π°.
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° TypeScript: ΠΠΎΠ»Π½ΡΠ΅ ΡΠΈΠΏΡ Π΄Π»Ρ ΡΠ΄ΠΎΠ±Π½ΠΎΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈ Π°Π²ΡΠΎΠ΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
- ΠΡΠ³ΠΊΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ: ΠΡΠΎΡΡΡΠ΅ ΠΈ ΠΏΠΎΠ½ΡΡΠ½ΡΠ΅ API Π΄Π»Ρ Π±ΡΡΡΡΠΎΠΉ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ ΡΠ΅ΡΠ΅Π· npm:
npm i scroll-fatherΠΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠ΅ΡΠ΅Π· CDN:
<script src="https://cdn.jsdelivr.net/npm/scroll-father/dist/ScrollFather.min.js"></script>ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Π°ΠΌ Π½ΡΠΆΠ½Ρ:
// ΠΠΌΠΏΠΎΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ
ΡΡΠ½ΠΊΡΠΈΠΉ
import { trackScrollState, smoothScrollToElement } from 'scroll-father';ΠΠ»ΠΈ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΡ ΡΡΠ°Π·Ρ (Π½Π΅ ΡΡΠΎΠΈΡ ΡΠ°ΠΊ Π΄Π΅Π»Π°ΡΡ):
// ΠΠΌΠΏΠΎΡΡ Π²ΡΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ
import * as ScrollFather from 'scroll-father';ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π°ΡΡΠΈΠ±ΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, data-scrolled) ΠΊ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΏΡΠΈ ΠΏΡΠΎΠΊΡΡΡΠΊΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ.
import { trackScrollState } from 'scroll-father';
trackScrollState({
attribute: 'data-scrolled', // ΠΠΌΡ Π°ΡΡΠΈΠ±ΡΡΠ° (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ 'data-scrolled')
element: document.body, // ΠΠ»Π΅ΠΌΠ΅Π½Ρ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π°ΡΡΠΈΠ±ΡΡΠ° (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ document.body)
onScrollStart: () => console.log('Π‘ΠΊΡΠΎΠ»Π» Π½Π°ΡΠ°Π»ΡΡ!'),
onScrollReset: () => console.log('Π‘ΠΊΡΠΎΠ»Π» ΡΠ±ΡΠΎΡΠ΅Π½!'),
});ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΊΡΠΎΠ»Π»Π° ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π°ΡΡΠΈΠ±ΡΡ (data-scroll-direction="up" ΠΈΠ»ΠΈ "down") Π½Π° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ΅ <body>.
import { initScrollDirectionTracking } from 'scroll-father';
initScrollDirectionTracking();ΠΠ°Π³ΡΡΠΆΠ°Π΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅Π½Ρ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄ΠΎΡΡΠΈΠ³Π°Π΅Ρ ΠΊΠΎΠ½ΡΠ° ΡΡΡΠ°Π½ΠΈΡΡ.
import { initInfiniteScroll } from 'scroll-father';
initInfiniteScroll(
async () => {
// ΠΠ°Ρ ΠΊΠΎΠ΄ Π΄Π»Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°
await fetchMoreData();
},
{
threshold: 300, // ΠΠΎΡΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΏΠΈΠΊΡΠ΅Π»ΡΡ
Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° ΡΡΡΠ°Π½ΠΈΡΡ (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ 300)
},
);ΠΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ Ρ Π΄Π΅Π±Π°ΡΠ½ΡΠΎΠΌ, Π³Π°ΡΠ°Π½ΡΠΈΡΡΡ, ΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠΉ ΠΊΠΎΠ»Π±ΡΠΊ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π½Π΅ ΡΠ°ΡΠ΅, ΡΠ΅ΠΌ Ρ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π·Π°Π΄Π΅ΡΠΆΠΊΠΎΠΉ.
import { debounceScroll } from 'scroll-father';
debounceScroll(() => {
// ΠΠ°Ρ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΏΡΠΈ ΠΏΡΠΎΠΊΡΡΡΠΊΠ΅ Ρ Π΄Π΅Π±Π°ΡΠ½ΡΠΎΠΌ
}, 200); // ΠΠ°Π΄Π΅ΡΠΆΠΊΠ° Π² ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
ΠΏΠ΅ΡΠ΅Π΄ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ 200)ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ IntersectionObserver. ΠΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΈ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ ΠΈΡΡΠ΅Π·Π½ΠΎΠ²Π΅Π½ΠΈΠΈ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈΠ· ΠΎΠ±Π»Π°ΡΡΠΈ ΠΏΡΠΎΡΠΌΠΎΡΡΠ°.
import { initIntersectionSection } from 'scroll-father';
const $section = document.querySelector('#my-section');
initIntersectionSection(
$section,
() => {
// Π€ΡΠ½ΠΊΡΠΈΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π²Ρ
ΠΎΠ΄ΠΈΡ Π² ΠΎΠ±Π»Π°ΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ
console.log('ΠΠ»Π΅ΠΌΠ΅Π½Ρ ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ Π² ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ');
},
() => {
// Π€ΡΠ½ΠΊΡΠΈΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π²ΡΡ
ΠΎΠ΄ΠΈΡ ΠΈΠ· ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ
console.log('ΠΠ»Π΅ΠΌΠ΅Π½Ρ Π²ΡΡΠ΅Π» ΠΈΠ· ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ');
},
{
rootMargin: '-50% 0px', // ΠΡΡΡΡΠΏΡ Π΄Π»Ρ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ '-50% 0px')
threshold: 0, // ΠΠΎΡΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ 0)
},
);ΠΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΏΠ»Π°Π²Π½ΡΡ ΠΏΡΠΎΠΊΡΡΡΠΊΡ ΠΊΠΎ Π²ΡΠ΅ΠΌ ΡΡΡΠ»ΠΊΠ°ΠΌ-ΡΠΊΠΎΡΡΠΌ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ΅.
import { smootherAllAnchorLinks } from 'scroll-father';
smootherAllAnchorLinks(); let offset = 0;
if (window.innerWidth >= breakpoints['2xl']) offset = 96;
else offset = 60;
smootherAllAnchorLinks({
offset,
});ΠΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΎΡΡΡΡΠΏ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΠ΅ΡΠ΅Π΄ ΠΊΠ°ΠΆΠ΄ΡΠΌ Π½ΠΎΠ²ΡΠΌ ΡΠΊΡΠΎΠ»Π»ΠΎΠΌ
const setOffsetBeforeScroll = () => {
if (document.body.getAttribute('data-scroll-direction') === 'up') {
if (window.innerWidth >= breakpoints['2xl']) {
return 96;
}
return 60;
}
return 0;
};
smootherAllAnchorLinks({
setOffsetBeforeScroll,
});-
debounceScroll(callback, delay?) ΠΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ Ρ Π΄Π΅Π±Π°ΡΠ½ΡΠΎΠΌ. ΠΠΎΠ»Π±ΡΠΊ
callbackΠ±ΡΠ΄Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π½Π΅ ΡΠ°ΡΠ΅, ΡΠ΅ΠΌ ΡΠ°Π· Π²delayΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄. -
initInfiniteScroll(loadMoreCallback, options?) Π Π΅Π°Π»ΠΈΠ·ΡΠ΅Ρ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΡ ΠΏΡΠΎΠΊΡΡΡΠΊΡ, Π²ΡΠ·ΡΠ²Π°Ρ
loadMoreCallback, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄ΠΎΡΡΠΈΠ³Π°Π΅Ρ ΠΊΠΎΠ½ΡΠ° ΡΡΡΠ°Π½ΠΈΡΡ. ΠΠ°ΡΠ°ΠΌΠ΅ΡΡoptions.thresholdΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, Π·Π° ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° ΡΡΡΠ°Π½ΠΈΡΡ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ ΠΊΠΎΠ»Π±ΡΠΊ. -
initIntersectionSection($section, onStart, onEnd, options?) ΠΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½Ρ
$sectionΡ ΠΏΠΎΠΌΠΎΡΡΡIntersectionObserver. ΠΡΠ·ΡΠ²Π°Π΅ΡonStart, ΠΊΠΎΠ³Π΄Π° ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ Π² ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ, ΠΈonEnd, ΠΊΠΎΠ³Π΄Π° ΠΈΡΡΠ΅Π·Π°Π΅Ρ. -
initScrollDirectionTracking() ΠΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΊΡΠΎΠ»Π»Π° ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π°ΡΡΠΈΠ±ΡΡ
data-scroll-directionΠ½Π°<body>ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ"up"ΠΈΠ»ΠΈ"down". -
trackScrollState(options?) ΠΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠΊΡΠΎΠ»Π»Π° ΡΡΡΠ°Π½ΠΈΡΡ ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π°ΡΡΠΈΠ±ΡΡ (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ
data-scrolled) Π½Π° ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ΅ ΠΏΡΠΈ ΠΏΡΠΎΠΊΡΡΡΠΊΠ΅. -
smootherAllAnchorLinks() ΠΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΏΠ»Π°Π²Π½ΡΡ ΠΏΡΠΎΠΊΡΡΡΠΊΡ ΠΊΠΎ Π²ΡΠ΅ΠΌ ΡΡΡΠ»ΠΊΠ°ΠΌ-ΡΠΊΠΎΡΡΠΌ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ΅, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Ρ Π±ΠΎΠ»Π΅Π΅ ΠΏΠ»Π°Π²Π½ΡΠΉ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ ΠΊ ΡΠ΅Π»Π΅Π²ΡΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ.
ΠΡ ΠΏΡΠΈΠ²Π΅ΡΡΡΠ²ΡΠ΅ΠΌ Π²ΠΊΠ»Π°Π΄! ΠΠ΅ ΡΡΠ΅ΡΠ½ΡΠΉΡΠ΅ΡΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΈΠ»ΠΈ ΠΏΡΠ»-ΡΠ΅ΠΊΠ²Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π· Π½Π°Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π½Π° GitHub.
ΠΡΠΎΠ΅ΠΊΡ Π»ΠΈΡΠ΅Π½Π·ΠΈΡΠΎΠ²Π°Π½ ΠΏΠΎΠ΄ Π»ΠΈΡΠ΅Π½Π·ΠΈΠ΅ΠΉ MIT β ΡΠΌ. ΡΠ°ΠΉΠ» LICENSE Π΄Π»Ρ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠ΅ΠΉ.