first commit

This commit is contained in:
Roman Pyrih
2026-04-21 15:48:41 +02:00
commit 7483681901
10216 changed files with 3236626 additions and 0 deletions

View File

@@ -0,0 +1 @@
.elementor-widget-custom-slider .custom-slider-wrapper{position:relative;width:100%;overflow:hidden;height:500px}@media(max-width: 768px){.elementor-widget-custom-slider .custom-slider-wrapper{height:400px}}.elementor-widget-custom-slider .custom-slider-wrapper .custom-slider-swiper{width:100%;height:100%}.elementor-widget-custom-slider .custom-slider-wrapper .swiper-wrapper{height:100%}.elementor-widget-custom-slider .custom-slider-wrapper .swiper-slide{height:100%}.elementor-widget-custom-slider .custom-slider-wrapper .swiper-slide .custom-slider-slide-inner{width:100%;height:100%;overflow:hidden}.elementor-widget-custom-slider .custom-slider-wrapper .swiper-slide .custom-slider-slide-inner img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;filter:brightness(0.5);transform:scale(1.05)}.elementor-widget-custom-slider .custom-slider-wrapper .swiper-slide-active .custom-slider-slide-inner img{animation:customSliderZoom 4.5s ease-out forwards}@keyframes customSliderZoom{from{transform:scale(1)}to{transform:scale(1.05)}}.elementor-widget-custom-slider .custom-slider-wrapper .custom-slider-overlay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;pointer-events:none;z-index:1}.elementor-widget-custom-slider .custom-slider-wrapper .custom-slider-overlay .custom-slider-overlay-inner{max-width:700px;text-align:center;padding:20px;pointer-events:auto;color:#fff}@media(max-width: 768px){.elementor-widget-custom-slider .custom-slider-wrapper .custom-slider-overlay .custom-slider-overlay-inner{padding:15px}}.elementor-widget-custom-slider .custom-slider-wrapper .custom-slider-overlay .custom-slider-overlay-inner .custom-slider-title{margin:0 0 10px;font-size:clamp(26px,4vw,42px);font-family:"Inconsolata",Sans-serif;font-weight:700}.elementor-widget-custom-slider .custom-slider-wrapper .custom-slider-overlay .custom-slider-overlay-inner .custom-slider-text{margin:0 0 20px;font-size:clamp(14px,2vw,18px);font-family:"Inconsolata",Sans-serif;letter-spacing:2px;font-weight:300}.elementor-widget-custom-slider .custom-slider-wrapper .custom-slider-overlay .custom-slider-overlay-inner .custom-slider-button{display:inline-block;border-radius:0;border:none;text-decoration:none;transition:.35s ease all;color:#fff;font-family:"Inconsolata",Sans-serif;font-size:14px;font-weight:400;letter-spacing:2px;padding:15px 40px;background:#bc1834;outline:0;text-transform:uppercase}.elementor-widget-custom-slider .custom-slider-wrapper .custom-slider-overlay .custom-slider-overlay-inner .custom-slider-button:hover{background:#021526}.elementor-widget-custom-slider .custom-slider-wrapper .swiper-button-prev,.elementor-widget-custom-slider .custom-slider-wrapper .swiper-button-next{color:#fff;transition:opacity .3s ease}.elementor-widget-custom-slider .custom-slider-wrapper .swiper-button-prev:hover,.elementor-widget-custom-slider .custom-slider-wrapper .swiper-button-next:hover{opacity:.7}.elementor-widget-custom-slider .custom-slider-wrapper .swiper-pagination-bullet{background:hsla(0,0%,100%,.6);opacity:1}.elementor-widget-custom-slider .custom-slider-wrapper .swiper-pagination-bullet-active{background:#fff}/*# sourceMappingURL=main.css.map */

View File

@@ -0,0 +1 @@
{"version":3,"sources":["main.scss"],"names":[],"mappings":"AACE,uDACE,iBAAA,CACA,UAAA,CACA,eAAA,CACA,YAAA,CAEA,yBANF,uDAOI,YAAA,CAAA,CAGF,6EACE,UAAA,CACA,WAAA,CAGF,uEACE,WAAA,CAGF,qEACE,WAAA,CAEA,gGACE,UAAA,CACA,WAAA,CACA,eAAA,CAEA,oGACE,UAAA,CACA,WAAA,CACA,mBAAA,CAAA,gBAAA,CACA,sBAAA,CAEA,qBAAA,CAKN,2GACE,iDAAA,CAGF,4BACE,KACE,kBAAA,CAGF,GACE,qBAAA,CAAA,CAIJ,8EACE,iBAAA,CACA,OAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,mBAAA,CACA,SAAA,CAEA,2GACE,eAAA,CACA,iBAAA,CACA,YAAA,CACA,mBAAA,CACA,UAAA,CAEA,yBAPF,2GAQI,YAAA,CAAA,CAGF,gIACE,eAAA,CACA,8BAAA,CACA,oCAAA,CACA,eAAA,CAGF,+HACE,eAAA,CACA,8BAAA,CACA,oCAAA,CACA,kBAAA,CACA,eAAA,CAGF,iIACE,oBAAA,CACA,eAAA,CACA,WAAA,CACA,oBAAA,CACA,wBAAA,CACA,UAAA,CACA,oCAAA,CACA,cAAA,CACA,eAAA,CACA,kBAAA,CACA,iBAAA,CACA,kBAAA,CACA,SAAA,CACA,wBAAA,CAEA,uIACE,kBAAA,CAMR,sJAEE,UAAA,CACA,2BAAA,CAEA,kKACE,UAAA,CAIJ,iFACE,6BAAA,CACA,SAAA,CAEA,wFACE,eAAA","file":"main.css"}

View File

@@ -0,0 +1,131 @@
.elementor-widget-custom-slider {
.custom-slider-wrapper {
position: relative;
width: 100%;
overflow: hidden;
height: 500px;
@media (max-width: 768px) {
height: 400px;
}
.custom-slider-swiper {
width: 100%;
height: 100%;
}
.swiper-wrapper {
height: 100%;
}
.swiper-slide {
height: 100%;
.custom-slider-slide-inner {
width: 100%;
height: 100%;
overflow: hidden;
img {
width: 100%;
height: 100%;
object-fit: cover;
filter: brightness(0.5);
transform: scale(1.05);
}
}
}
.swiper-slide-active .custom-slider-slide-inner img {
animation: customSliderZoom 4.5s ease-out forwards;
}
@keyframes customSliderZoom {
from {
transform: scale(1);
}
to {
transform: scale(1.05);
}
}
.custom-slider-overlay {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
pointer-events: none;
z-index: 1;
.custom-slider-overlay-inner {
max-width: 700px;
text-align: center;
padding: 20px;
pointer-events: auto;
color: #fff;
@media (max-width: 768px) {
padding: 15px;
}
.custom-slider-title {
margin: 0 0 10px;
font-size: clamp(26px, 4vw, 42px);
font-family: 'Inconsolata', Sans-serif;
font-weight: 700;
}
.custom-slider-text {
margin: 0 0 20px;
font-size: clamp(14px, 2vw, 18px);
font-family: 'Inconsolata', Sans-serif;
letter-spacing: 2px;
font-weight: 300;
}
.custom-slider-button {
display: inline-block;
border-radius: 0;
border: none;
text-decoration: none;
transition: 0.35s ease all;
color: #fff;
font-family: "Inconsolata", Sans-serif;
font-size: 14px;
font-weight: 400;
letter-spacing: 2px;
padding: 15px 40px;
background: #bc1834;
outline: 0;
text-transform: uppercase;
&:hover {
background: #021526;
}
}
}
}
.swiper-button-prev,
.swiper-button-next {
color: #fff;
transition: opacity 0.3s ease;
&:hover {
opacity: 0.7;
}
}
.swiper-pagination-bullet {
background: rgba(255, 255, 255, 0.6);
opacity: 1;
&-active {
background: #fff;
}
}
}
}

View File

@@ -0,0 +1,63 @@
;(function ($) {
function initCustomSlider($scope) {
var $wrappers = $scope.find('.custom-slider-wrapper')
if (!$wrappers.length) {
return
}
$wrappers.each(function () {
var $wrapper = $(this)
var $swiperEl = $wrapper.find('.custom-slider-swiper')[0]
if (!$swiperEl) {
return
}
var autoplayDelay = parseInt($wrapper.data('autoplay-delay'), 10) || 4000
var transitionSpeed =
parseInt($wrapper.data('transition-speed'), 10) || 1200
if ($wrapper.data('swiper-initialized')) {
return
}
var swiper = new Swiper($swiperEl, {
loop: true,
slidesPerView: 1,
effect: 'fade',
fadeEffect: {
crossFade: true,
},
speed: transitionSpeed,
autoplay: {
delay: autoplayDelay,
disableOnInteraction: false,
},
pagination: {
el: $wrapper.find('.custom-slider-pagination')[0],
clickable: true,
},
navigation: {
nextEl: $wrapper.find('.custom-slider-button-next')[0],
prevEl: $wrapper.find('.custom-slider-button-prev')[0],
},
})
$wrapper.data('swiper-initialized', true)
})
}
$(document).ready(function () {
initCustomSlider($(document))
})
$(window).on('elementor/frontend/init', function () {
elementorFrontend.hooks.addAction(
'frontend/element_ready/custom-slider.default',
function ($scope) {
initCustomSlider($scope)
}
)
})
})(jQuery)

View File

@@ -0,0 +1,66 @@
<?php
/**
* Plugin Name: Elementor Addon
* Description: Simple hello world widgets for Elementor.
* Version: 1.0.0
* Author: Elementor Developer
* Author URI: https://developers.elementor.com/
* Text Domain: elementor-addon
*
* Requires Plugins: elementor
* Elementor tested up to: 3.21.0
* Elementor Pro tested up to: 3.21.0
*/
function register_hello_world_widget( $widgets_manager ) {
require_once( __DIR__ . '/widgets/custom-slider.php' );
$widgets_manager->register( new \Elementor_Custom_Slider() );
}
add_action( 'elementor/widgets/register', 'register_hello_world_widget' );
function enqueue_elementor_addon_styles() {
if ( did_action( 'elementor/loaded' ) ) {
wp_enqueue_style(
'elementor-addon-main-css',
plugins_url( 'assets/css/main.css', __FILE__ ),
[],
'1.0.0'
);
}
}
add_action( 'wp_enqueue_scripts', 'enqueue_elementor_addon_styles' );
function enqueue_elementor_addon_scripts() {
if ( did_action( 'elementor/loaded' ) ) {
wp_enqueue_script(
'elementor-addon-main-js',
plugins_url( 'assets/js/main.js', __FILE__ ),
[ 'jquery' ],
'1.0.0',
true
);
}
}
add_action( 'wp_enqueue_scripts', 'enqueue_elementor_addon_scripts' );
function enqueue_elementor_addon_swiper() {
if ( did_action( 'elementor/loaded' ) ) {
wp_enqueue_style(
'elementor-addon-swiper-css',
plugins_url( 'plugins/swiper/swiper-bundle.min.css', __FILE__ ),
[],
'11.2.3'
);
wp_enqueue_script(
'elementor-addon-swiper-js',
plugins_url( 'plugins/swiper/swiper-bundle.min.js', __FILE__ ),
[],
'11.2.3',
true
);
}
}
add_action( 'wp_enqueue_scripts', 'enqueue_elementor_addon_swiper' );

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,220 @@
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
use Elementor\Controls_Manager;
use Elementor\Widget_Base;
class Elementor_Custom_Slider extends Widget_Base {
public function get_name() {
return 'custom-slider';
}
public function get_title() {
return esc_html__( 'Custom Slider', 'elementor-addon' );
}
public function get_icon() {
return 'eicon-slides';
}
public function get_categories() {
return [ 'basic' ];
}
public function get_keywords() {
return [ 'slider', 'custom', 'swiper' ];
}
protected function register_controls() {
// ---- Слайди (галерея) ----
$this->start_controls_section(
'slides_section',
[
'label' => esc_html__( 'Slides', 'elementor-addon' ),
'tab' => Controls_Manager::TAB_CONTENT,
]
);
$this->add_control(
'slides',
[
'label' => esc_html__( 'Images', 'elementor-addon' ),
'type' => Controls_Manager::GALLERY,
'default' => [],
]
);
$this->end_controls_section();
// ---- Текстовий блок поверх ----
$this->start_controls_section(
'overlay_section',
[
'label' => esc_html__( 'Overlay Content', 'elementor-addon' ),
'tab' => Controls_Manager::TAB_CONTENT,
]
);
$this->add_control(
'overlay_title',
[
'label' => esc_html__( 'Title', 'elementor-addon' ),
'type' => Controls_Manager::TEXT,
'default' => esc_html__( 'Custom Slider Title', 'elementor-addon' ),
'placeholder' => esc_html__( 'Enter title', 'elementor-addon' ),
'label_block' => true,
]
);
$this->add_control(
'overlay_text',
[
'label' => esc_html__( 'Text', 'elementor-addon' ),
'type' => Controls_Manager::TEXTAREA,
'default' => esc_html__( 'Your description goes here.', 'elementor-addon' ),
'placeholder' => esc_html__( 'Enter description', 'elementor-addon' ),
'rows' => 3,
]
);
$this->add_control(
'overlay_link',
[
'label' => esc_html__( 'Button Link', 'elementor-addon' ),
'type' => Controls_Manager::URL,
'placeholder' => 'https://example.com',
'default' => [
'url' => '',
'is_external' => false,
'nofollow' => false,
],
]
);
$this->add_control(
'overlay_link_text',
[
'label' => esc_html__( 'Button Text', 'elementor-addon' ),
'type' => Controls_Manager::TEXT,
'default' => esc_html__( 'Learn more', 'elementor-addon' ),
'placeholder' => esc_html__( 'Enter button text', 'elementor-addon' ),
'condition' => [
'overlay_link[url]!' => '',
],
]
);
$this->end_controls_section();
// ---- Налаштування анімації (необов’язково) ----
$this->start_controls_section(
'settings_section',
[
'label' => esc_html__( 'Slider Settings', 'elementor-addon' ),
'tab' => Controls_Manager::TAB_CONTENT,
]
);
$this->add_control(
'autoplay_delay',
[
'label' => esc_html__( 'Autoplay Delay (ms)', 'elementor-addon' ),
'type' => Controls_Manager::NUMBER,
'default' => 4000,
'min' => 1000,
'step' => 500,
]
);
$this->add_control(
'transition_speed',
[
'label' => esc_html__( 'Transition Speed (ms)', 'elementor-addon' ),
'type' => Controls_Manager::NUMBER,
'default' => 1200,
'min' => 200,
'step' => 100,
]
);
$this->end_controls_section();
}
protected function render() {
$settings = $this->get_settings_for_display();
if ( empty( $settings['slides'] ) ) {
return;
}
$slider_id = 'custom-slider-' . $this->get_id();
$autoplay_delay = ! empty( $settings['autoplay_delay'] ) ? (int) $settings['autoplay_delay'] : 4000;
$transition_speed = ! empty( $settings['transition_speed'] ) ? (int) $settings['transition_speed'] : 1200;
$overlay_title = ! empty( $settings['overlay_title'] ) ? $settings['overlay_title'] : '';
$overlay_text = ! empty( $settings['overlay_text'] ) ? $settings['overlay_text'] : '';
$overlay_link = ! empty( $settings['overlay_link']['url'] ) ? $settings['overlay_link'] : null;
$overlay_link_text = ! empty( $settings['overlay_link_text'] ) ? $settings['overlay_link_text'] : '';
?>
<div id="<?php echo esc_attr( $slider_id ); ?>"
class="custom-slider-wrapper"
data-autoplay-delay="<?php echo esc_attr( $autoplay_delay ); ?>"
data-transition-speed="<?php echo esc_attr( $transition_speed ); ?>">
<div class="swiper custom-slider-swiper">
<div class="swiper-wrapper">
<?php foreach ( $settings['slides'] as $item ) :
$image_url = ! empty( $item['url'] ) ? $item['url'] : '';
if ( ! $image_url ) {
continue;
}
?>
<div class="swiper-slide">
<div class="custom-slider-slide-inner">
<img src="<?php echo esc_url( $image_url ); ?>"
alt="<?php echo esc_attr( get_post_meta( $item['id'], '_wp_attachment_image_alt', true ) ); ?>">
</div>
</div>
<?php endforeach; ?>
</div>
<div class="custom-slider-pagination swiper-pagination"></div>
</div>
<?php if ( $overlay_title || $overlay_text ) : ?>
<div class="custom-slider-overlay">
<div class="custom-slider-overlay-inner">
<?php if ( $overlay_title ) : ?>
<h2 class="custom-slider-title">
<?php echo esc_html( $overlay_title ); ?>
</h2>
<?php endif; ?>
<?php if ( $overlay_text ) : ?>
<p class="custom-slider-text">
<?php echo wp_kses_post( $overlay_text ); ?>
</p>
<?php endif; ?>
<?php if ( $overlay_link && ! empty( $overlay_link['url'] ) ) :
$target = $overlay_link['is_external'] ? ' target="_blank"' : '';
$rel = $overlay_link['nofollow'] ? ' rel="nofollow"' : '';
?>
<a class="custom-slider-button"
href="<?php echo esc_url( $overlay_link['url'] ); ?>"<?php echo $target . $rel; ?>>
<?php echo $overlay_link_text ? esc_html( $overlay_link_text ) : esc_html__( 'Learn more', 'elementor-addon' ); ?>
</a>
<?php endif; ?>
</div>
</div>
<?php endif; ?>
</div>
<?php
}
}