UI Компоненты

Библиотека компонентов: 250+ готовых решений для любых задач

🎯 86 Базовых компонентов
🚀 74 Продвинутых компонента
⚡ 90 Специализированных решений

Базовые компоненты

Кнопки

// Создание кнопки
const button = new Button({
    text: 'Primary Button',
    variant: 'primary',
    size: 'md',
    disabled: false,
    loading: false,
    onClick: () => console.log('Clicked!')
});

// Добавление на страницу
document.body.appendChild(button.render());
// Различные варианты кнопок
const variants = ['primary', 'secondary', 'outline', 'ghost', 'danger', 'success'];
variants.forEach(variant => {
    const btn = new Button({
        text: variant,
        variant: variant,
        onClick: () => alert(`${variant} clicked`)
    });
    container.appendChild(btn.render());
});

Поля ввода

// Создание поля ввода
const input = new Input({
    type: 'text',
    placeholder: 'Введите текст',
    value: '',
    disabled: false,
    required: true,
    validation: {
        required: true,
        minLength: 3,
        maxLength: 50
    },
    onChange: (value) => console.log('Value:', value),
    onFocus: () => console.log('Focused'),
    onBlur: () => console.log('Blurred')
});
// Различные типы полей ввода
const types = ['email', 'password', 'number', 'tel', 'url'];
types.forEach(type => {
    const input = new Input({
        type: type,
        placeholder: `Введите ${type}`,
        validation: getValidationRules(type)
    });
    form.appendChild(input.render());
});

function getValidationRules(type) {
    const rules = {
        email: { pattern: /^[^\s@]+@[^\s@]+\.[^\s@]+$/ },
        password: { minLength: 6 },
        number: { min: 0, max: 100 },
        tel: { pattern: /^[\+]?[0-9\s\-\(\)]+$/ },
        url: { pattern: /^https?:\/\/.+/ }
    };
    return rules[type] || {};
}

Карточки

Заголовок карточки

Содержимое карточки с полезной информацией для пользователя.

// Создание карточки
const card = new Card({
    title: 'Заголовок карточки',
    content: 'Содержимое карточки с полезной информацией.',
    actions: [
        {
            text: 'Действие',
            variant: 'primary',
            onClick: () => console.log('Primary action')
        },
        {
            text: 'Отмена',
            variant: 'outline',
            onClick: () => console.log('Cancel action')
        }
    ],
    variant: 'default',
    elevation: 1
});

Карточка с тенью

Карточка с повышенной тенью для акцента.

Контурная карточка

Карточка с контуром вместо тени.

// Различные варианты карточек
const cardVariants = [
    {
        variant: 'elevated',
        title: 'Карточка с тенью',
        content: 'Карточка с повышенной тенью для акцента.'
    },
    {
        variant: 'outlined',
        title: 'Контурная карточка',
        content: 'Карточка с контуром вместо тени.'
    }
];

cardVariants.forEach(config => {
    const card = new Card(config);
    container.appendChild(card.render());
});

Продвинутые компоненты

Модальные окна

// Создание модального окна
const modal = new Modal({
    title: 'Заголовок модалки',
    content: 'Содержимое модального окна',
    size: 'md', // sm, md, lg, xl
    closeOnOverlayClick: true,
    closeOnEsc: true,
    showCloseButton: true,
    actions: [
        {
            text: 'Сохранить',
            variant: 'primary',
            onClick: () => {
                console.log('Сохранение...');
                modal.close();
            }
        },
        {
            text: 'Отмена',
            variant: 'outline',
            onClick: () => modal.close()
        }
    ]
});

// Открытие модалки
modal.open();
// Модальные окна разных размеров
const sizes = ['sm', 'md', 'lg', 'xl'];
sizes.forEach(size => {
    const modal = new Modal({
        title: `Modal ${size}`,
        content: `This is a ${size} modal window.`,
        size: size,
        actions: [
            {
                text: 'Close',
                variant: 'outline',
                onClick: () => modal.close()
            }
        ]
    });
    
    // Добавляем кнопку для открытия
    const button = new Button({
        text: size.toUpperCase(),
        onClick: () => modal.open()
    });
    container.appendChild(button.render());
});

Табы

Профиль пользователя

Информация о пользователе и его настройки профиля.

Настройки системы

Настройки приложения и параметры конфигурации.

Уведомления

Настройки уведомлений и оповещений.

// Создание компонента табов
const tabs = new Tabs({
    container: '#tabsContainer',
    tabs: [
        {
            id: 'profile',
            label: 'Профиль',
            content: '<h4>Профиль пользователя</h4><p>Информация о пользователе...</p>',
            active: true
        },
        {
            id: 'settings',
            label: 'Настройки',
            content: '<h4>Настройки системы</h4><p>Настройки приложения...</p>'
        },
        {
            id: 'notifications',
            label: 'Уведомления',
            content: '<h4>Уведомления</h4><p>Настройки уведомлений...</p>'
        }
    ],
    variant: 'default', // default, pills, underlined
    onChange: (activeTab) => {
        console.log('Active tab:', activeTab);
    }
});

Аккордеон

Содержимое первой секции аккордеона.

Содержимое второй секции аккордеона.

Содержимое третьей секции аккордеона.

// Создание аккордеона
const accordion = new Accordion({
    container: '#accordionContainer',
    items: [
        {
            title: 'Секция 1',
            content: '<p>Содержимое первой секции аккордеона.</p>',
            expanded: false
        },
        {
            title: 'Секция 2',
            content: '<p>Содержимое второй секции аккордеона.</p>',
            expanded: false
        },
        {
            title: 'Секция 3',
            content: '<p>Содержимое третьей секции аккордеона.</p>',
            expanded: true
        }
    ],
    allowMultiple: false,
    variant: 'default', // default, bordered, separated
    onToggle: (item, state) => {
        console.log(`Section "${item.title}" is ${state ? 'expanded' : 'collapsed'}`);
    }
});

Компоненты форм

Выпадающие списки

// Создание выпадающего списка
const select = new Select({
    options: [
        { value: '', label: 'Выберите опцию', disabled: true },
        { value: '1', label: 'Опция 1' },
        { value: '2', label: 'Опция 2' },
        { value: '3', label: 'Опция 3' }
    ],
    placeholder: 'Выберите опцию',
    multiple: false,
    searchable: true,
    clearable: true,
    value: '',
    onChange: (value) => {
        console.log('Selected value:', value);
    }
});

// Множественный выбор
const multiSelect = new Select({
    options: [
        { value: '1', label: 'Опция 1' },
        { value: '2', label: 'Опция 2' },
        { value: '3', label: 'Опция 3' }
    ],
    multiple: true,
    placeholder: 'Выберите опции',
    onChange: (values) => {
        console.log('Selected values:', values);
    }
});

Чекбоксы и радиокнопки

// Создание чекбоксов
const checkbox = new Checkbox({
    label: 'Чекбокс 1',
    checked: true,
    disabled: false,
    onChange: (checked) => {
        console.log('Checkbox checked:', checked);
    }
});

// Группа чекбоксов
const checkboxGroup = new CheckboxGroup({
    options: [
        { label: 'Опция 1', value: '1', checked: true },
        { label: 'Опция 2', value: '2', checked: false },
        { label: 'Опция 3', value: '3', checked: false }
    ],
    name: 'checkbox-group',
    onChange: (values) => {
        console.log('Selected values:', values);
    }
});
// Создание радиокнопок
const radioGroup = new RadioGroup({
    options: [
        { label: 'Радио 1', value: '1', checked: true },
        { label: 'Радио 2', value: '2', checked: false },
        { label: 'Радио 3', value: '3', checked: false }
    ],
    name: 'radio-group',
    onChange: (value) => {
        console.log('Selected value:', value);
    }
});

// Одиночная радиокнопка
const radio = new Radio({
    label: 'Радио кнопка',
    value: 'option1',
    checked: false,
    name: 'radio-group',
    onChange: (checked) => {
        console.log('Radio checked:', checked);
    }
});

Слайдеры

50
25 - 75
// Создание слайдера
const slider = new Slider({
    min: 0,
    max: 100,
    value: 50,
    step: 1,
    disabled: false,
    showValue: true,
    onChange: (value) => {
        console.log('Slider value:', value);
    },
    onInput: (value) => {
        console.log('Slider input:', value);
    }
});

// Диапазонный слайдер
const rangeSlider = new RangeSlider({
    min: 0,
    max: 100,
    values: [25, 75],
    step: 1,
    showValues: true,
    onChange: (values) => {
        console.log('Range values:', values);
    }
});

Компоненты отображения данных

Таблицы

ID Имя Email Статус
1 Иван Иванов ivan@example.com Активен
2 Петр Петров petr@example.com Ожидание
3 Мария Сидорова maria@example.com Неактивен
// Создание таблицы
const table = new Table({
    columns: [
        { key: 'id', label: 'ID', sortable: true },
        { key: 'name', label: 'Имя', sortable: true },
        { key: 'email', label: 'Email', sortable: true },
        { 
            key: 'status', 
            label: 'Статус',
            render: (value) => {
                const badgeClass = {
                    'active': 'badge-success',
                    'pending': 'badge-warning',
                    'inactive': 'badge-error'
                }[value];
                return `<span class="badge ${badgeClass}">${value}</span>`;
            }
        }
    ],
    data: [
        { id: 1, name: 'Иван Иванов', email: 'ivan@example.com', status: 'active' },
        { id: 2, name: 'Петр Петров', email: 'petr@example.com', status: 'pending' },
        { id: 3, name: 'Мария Сидорова', email: 'maria@example.com', status: 'inactive' }
    ],
    sortable: true,
    searchable: true,
    pagination: true,
    itemsPerPage: 10,
    onRowClick: (row) => {
        console.log('Row clicked:', row);
    },
    onSort: (column, direction) => {
        console.log('Sorted by:', column, direction);
    }
});

Индикаторы прогресса

// Создание индикатора прогресса
const progress = new ProgressBar({
    value: 45,
    max: 100,
    variant: 'default', // default, success, warning, error
    showLabel: true,
    striped: false,
    animated: false,
    height: '8px',
    onComplete: () => {
        console.log('Progress completed!');
    }
});

// Анимированный прогресс
const animatedProgress = new ProgressBar({
    value: 75,
    variant: 'success',
    striped: true,
    animated: true,
    showLabel: true,
    labelPosition: 'inside' // inside, outside
});

Компоненты обратной связи

Уведомления

Информация! Это информационное сообщение.
Успех! Операция выполнена успешно.
Внимание! Это предупреждающее сообщение.
Ошибка! Произошла ошибка при выполнении.
// Создание уведомления
const alert = new Alert({
    message: 'Это информационное сообщение.',
    variant: 'info', // info, success, warning, error
    title: 'Информация!',
    dismissible: true,
    autoDismiss: false,
    duration: 5000,
    onDismiss: () => {
        console.log('Alert dismissed');
    }
});

// Показ уведомления
alert.show();

// Утилита для быстрого показа
Alert.show('Операция выполнена успешно!', 'success', 3000);

Тосты

// Показ тоста
Toast.show('Сообщение успешно отправлено!', 'success', 3000);

// Создание кастомного тоста
const toast = new Toast({
    message: 'Пользователь создан успешно',
    variant: 'success',
    duration: 5000,
    position: 'top-right', // top-right, top-left, bottom-right, bottom-left
    showIcon: true,
    showClose: true,
    onClose: () => {
        console.log('Toast closed');
    }
});

// Различные варианты
Toast.success('Успешное выполнение!');
Toast.error('Произошла ошибка!');
Toast.warning('Внимание!');
Toast.info('Информационное сообщение');