Skip to content

Instantly share code, notes, and snippets.

View b-aleksei's full-sized avatar

Алексей b-aleksei

View GitHub Profile
@b-aleksei
b-aleksei / multi-modal.js
Last active December 7, 2021 11:18
multi-modal
const focusableEls = `a[href]:not(:disabled), input:not(:disabled):not([type="hidden"]),
select:not(:disabled), textarea:not(:disabled), button:not(:disabled), [contenteditable],
[tabindex]:not([tabindex="-1"])`;
const isTouchSupported = () => ('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch);
const getHtmlElement = (selector, ctx = document) => {
const node = typeof selector === 'string' ? ctx.querySelector(selector) : selector;
if (node instanceof HTMLElement) {
return node;
}
@b-aleksei
b-aleksei / cookie.js
Created October 25, 2021 10:07
cookie
(function() {
const fileLoaderContainers = document.querySelectorAll('.file-loader');
const renderFileLoader = function(fileLoaderContainer) {
const wrapper = fileLoaderContainer.querySelector('.file-loader__wrapper');
const btnAdd = fileLoaderContainer.querySelector('.js-fileloader-open');
if (!wrapper || !btnAdd) {
return;
}
const inputFileLoader = wrapper.querySelector('.file-loader__item');
@b-aleksei
b-aleksei / tab.js
Last active September 19, 2021 18:22
tab-panel-ally
export const changeTab = (currentTab) => {
const emptyEl = document.createElement('div');
const tabContainer = currentTab.closest('.tab-container');
if (!tabContainer) return;
const activeTab = tabContainer.querySelector('.tab-title[aria-selected="true"]') || emptyEl;
activeTab.removeAttribute('aria-selected');
activeTab.setAttribute('tabindex', '-1');
currentTab.setAttribute('aria-selected', 'true');
currentTab.removeAttribute('tabindex');
@b-aleksei
b-aleksei / smoothScroll.js
Last active September 16, 2021 15:24
smoothScroll
const easingOutQuint = (x, t, b, c, d) => c * ((t = t / d - 1) * t * t * t * t + 1) + b;
const makeScroll = (node, value, key = 'scrollTop') => {
let startTime = null;
const offset = node[key];
const gap = value - offset;
const duration = 1000;
const step = (t) => {
if (!startTime) {
@b-aleksei
b-aleksei / tooltip.js
Created September 2, 2021 17:53
ToolTip
export const tooltipToggle = (btn) => {
const content = btn.nextElementSibling;
if (!content) return;
content.classList.toggle('active');
if (content.classList.contains('active')) {
const closeContent = ({target}) => {
if (!content.contains(target) ) {
content.classList.remove('active');
document.removeEventListener('click', closeContent);
}
@b-aleksei
b-aleksei / RotateNumbers.js
Created September 2, 2021 06:54
вращение счетчика
import ResizeObserver from 'resize-observer-polyfill';
export class RotateNumber {
constructor(selector) {
this.$el = typeof selector === 'string' ? document.querySelector(selector) : selector;
if (!(this.$el instanceof HTMLElement)) {
return;
}
this.digits = this.$el.querySelectorAll('.payout__container');
this.maxNumberValue = 9;
@b-aleksei
b-aleksei / accordion.js
Last active August 27, 2021 07:08
accordion-classic
const accordionToggle = (selector) => {
const accordion = document.querySelector(selector);
if (!accordion) return;
let previousContent = null;
let previousTitle = null;
accordion.addEventListener('click', (e) => {
const accTitle = e.target.closest('.accordion__title');
if (accTitle) {
const accContent = accTitle.nextElementSibling;
if (previousContent) {
@b-aleksei
b-aleksei / ValidForm.js
Last active August 22, 2021 09:19
ValidForm
import {onFocusPhoneInput} from './onFocusPhoneInput';
const validationData = {};
const urlData = 'data/sendForm.json';
fetch(urlData).then((res) => res.json()).then((res) => {
Object.assign(validationData, res);
}).catch(() => {});
/*const getDataFromJson = function(url) {
const xhr = new XMLHttpRequest();
@b-aleksei
b-aleksei / range-native.js
Last active August 7, 2021 18:36
range-native
export default class Range {
constructor(selector) {
this.$el = this.getHtmlElement(selector);
if (!this.$el) return;
this.min = +this.$el.dataset.min ?? 0;
this.max = +this.$el.dataset.max ?? 100;
this.dom = this.mapDOM(this.$el);
this.eventNames = {
pointerdown: 'pointerdown',
pointermove: 'pointermove',