register_group( 'a1-tools', array( 'title' => __( 'A1 Tools', 'a1-tools' ), ) ); // Include and register the dynamic tag class. require_once A1TOOLS_PLUGIN_DIR . 'includes/class-a1-tools-elementor-tag.php'; if ( class_exists( 'A1Tools_Elementor_Tag' ) ) { $dynamic_tags_manager->register( new A1Tools_Elementor_Tag() ); } } add_action( 'elementor/dynamic_tags/register', 'a1tools_register_elementor_tags' ); /** * Register Elementor widgets. * * @since 1.2.0 * @param \Elementor\Widgets_Manager $widgets_manager Widgets manager. * @return void */ function a1tools_register_elementor_widgets( $widgets_manager ) { // Include and register the Social Icons widget. require_once A1TOOLS_PLUGIN_DIR . 'includes/class-a1-tools-elementor-widget.php'; if ( class_exists( 'A1Tools_Social_Icons_Elementor_Widget' ) ) { $widgets_manager->register( new A1Tools_Social_Icons_Elementor_Widget() ); } // Include and register the Hours widget. require_once A1TOOLS_PLUGIN_DIR . 'includes/class-a1-tools-hours-widget.php'; if ( class_exists( 'A1Tools_Hours_Elementor_Widget' ) ) { $widgets_manager->register( new A1Tools_Hours_Elementor_Widget() ); } // Include and register info-box widgets (Phone, Email, Location). require_once A1TOOLS_PLUGIN_DIR . 'includes/class-a1-tools-info-box-widget.php'; if ( class_exists( 'A1Tools_Phone_Elementor_Widget' ) ) { $widgets_manager->register( new A1Tools_Phone_Elementor_Widget() ); } if ( class_exists( 'A1Tools_Email_Elementor_Widget' ) ) { $widgets_manager->register( new A1Tools_Email_Elementor_Widget() ); } if ( class_exists( 'A1Tools_Location_Elementor_Widget' ) ) { $widgets_manager->register( new A1Tools_Location_Elementor_Widget() ); } // Include and register combined Contact Info widget. require_once A1TOOLS_PLUGIN_DIR . 'includes/class-a1-tools-contact-info-widget.php'; if ( class_exists( 'A1Tools_Contact_Info_Elementor_Widget' ) ) { $widgets_manager->register( new A1Tools_Contact_Info_Elementor_Widget() ); } // Include and register CTA button widget. require_once A1TOOLS_PLUGIN_DIR . 'includes/class-a1-tools-cta-widget.php'; if ( class_exists( 'A1Tools_CTA_Elementor_Widget' ) ) { $widgets_manager->register( new A1Tools_CTA_Elementor_Widget() ); } // Include and register Franchise Location widget. require_once A1TOOLS_PLUGIN_DIR . 'includes/class-a1-tools-franchise-widget.php'; if ( class_exists( 'A1Tools_Franchise_Elementor_Widget' ) ) { $widgets_manager->register( new A1Tools_Franchise_Elementor_Widget() ); } // Include and register Store Locator widget. require_once A1TOOLS_PLUGIN_DIR . 'includes/class-a1-tools-stores-widget.php'; if ( class_exists( 'A1Tools_Stores_Elementor_Widget' ) ) { $widgets_manager->register( new A1Tools_Stores_Elementor_Widget() ); } // Include and register City List widget. require_once A1TOOLS_PLUGIN_DIR . 'includes/class-a1-tools-city-list-widget.php'; if ( class_exists( 'A1Tools_City_List_Elementor_Widget' ) ) { $widgets_manager->register( new A1Tools_City_List_Elementor_Widget() ); } // Include and register Services widget. require_once A1TOOLS_PLUGIN_DIR . 'includes/class-a1-tools-services-widget.php'; if ( class_exists( 'A1Tools_Services_Elementor_Widget' ) ) { $widgets_manager->register( new A1Tools_Services_Elementor_Widget() ); } // Include and register Reviews widget. require_once A1TOOLS_PLUGIN_DIR . 'includes/class-a1-tools-reviews-widget.php'; if ( class_exists( 'A1Tools_Reviews_Elementor_Widget' ) ) { $widgets_manager->register( new A1Tools_Reviews_Elementor_Widget() ); } // Include and register Before/After widget. require_once A1TOOLS_PLUGIN_DIR . 'includes/class-a1-tools-before-after-widget.php'; if ( class_exists( 'A1Tools_Before_After_Elementor_Widget' ) ) { $widgets_manager->register( new A1Tools_Before_After_Elementor_Widget() ); } // Include and register Team widget. require_once A1TOOLS_PLUGIN_DIR . 'includes/class-a1-tools-team-widget.php'; if ( class_exists( 'A1Tools_Team_Elementor_Widget' ) ) { $widgets_manager->register( new A1Tools_Team_Elementor_Widget() ); } // Include and register FAQ widget. require_once A1TOOLS_PLUGIN_DIR . 'includes/class-a1-tools-faq-widget.php'; if ( class_exists( 'A1Tools_FAQ_Elementor_Widget' ) ) { $widgets_manager->register( new A1Tools_FAQ_Elementor_Widget() ); } // 2.5.0 — Web Form widget (structured lead intake). require_once A1TOOLS_PLUGIN_DIR . 'includes/class-a1-tools-web-form-widget.php'; if ( class_exists( 'A1Tools_Web_Form_Elementor_Widget' ) ) { $widgets_manager->register( new A1Tools_Web_Form_Elementor_Widget() ); } // 2.5.0 — Web Chat widget (floating or inline live-chat). require_once A1TOOLS_PLUGIN_DIR . 'includes/class-a1-tools-web-chat-widget.php'; if ( class_exists( 'A1Tools_Web_Chat_Elementor_Widget' ) ) { $widgets_manager->register( new A1Tools_Web_Chat_Elementor_Widget() ); } // 2.6.0 — Review Funnel widget (star rating → public review / private feedback). require_once A1TOOLS_PLUGIN_DIR . 'includes/class-a1-tools-review-widget.php'; if ( class_exists( 'A1Tools_Review_Funnel_Elementor_Widget' ) ) { $widgets_manager->register( new A1Tools_Review_Funnel_Elementor_Widget() ); } // Video Carousel widget (vertical YouTube Shorts carousel). require_once A1TOOLS_PLUGIN_DIR . 'includes/class-a1-tools-video-carousel-widget.php'; if ( class_exists( 'A1Tools_Video_Carousel_Elementor_Widget' ) ) { $widgets_manager->register( new A1Tools_Video_Carousel_Elementor_Widget() ); } // Gallery widget (filterable / searchable image grid). require_once A1TOOLS_PLUGIN_DIR . 'includes/class-a1-tools-gallery-widget.php'; if ( class_exists( 'A1Tools_Gallery_Elementor_Widget' ) ) { $widgets_manager->register( new A1Tools_Gallery_Elementor_Widget() ); } // Smiley Reviews widget (happy → public review link, sad → private CRM feedback). require_once A1TOOLS_PLUGIN_DIR . 'includes/class-a1-tools-smiley-review-widget.php'; if ( class_exists( 'A1Tools_Smiley_Review_Elementor_Widget' ) ) { $widgets_manager->register( new A1Tools_Smiley_Review_Elementor_Widget() ); } } add_action( 'elementor/widgets/register', 'a1tools_register_elementor_widgets' ); /** * Register + enqueue the Web Form / Web Chat assets (2.5.0). * * Both stylesheets and scripts are versioned with `A1TOOLS_VERSION` so * a plugin update busts the browser cache cleanly. The scripts run on * every page — they're tiny (~10 KB each) and only mount when an * `.a1tools-web-form` / `.a1tools-web-chat` element exists in the DOM. */ function a1tools_register_web_lead_assets() { // (2.5.28) Bundle flatpickr (v4.6.13, MIT) so Web Form custom // fields of type `date` / `time` get a proper popup picker // instead of the native HTML5 input. The native time input // puts AM/PM as a hidden third tab-stop that visitors don't // realise they have to focus, so they submit times with an // ambiguous meridian. Flatpickr exposes AM/PM as a clearly // labeled toggle. Sourced locally (no CDN dependency, no CSP // concerns, works offline) — ~50 KB JS + ~16 KB CSS, ~18 KB // on the wire after gzip. wp_register_style( 'a1tools-flatpickr', A1TOOLS_PLUGIN_URL . 'assets/vendor/flatpickr/flatpickr.min.css', array(), '4.6.13' ); wp_register_script( 'a1tools-flatpickr', A1TOOLS_PLUGIN_URL . 'assets/vendor/flatpickr/flatpickr.min.js', array(), '4.6.13', true ); wp_register_style( 'a1tools-web-form', A1TOOLS_PLUGIN_URL . 'assets/web-form.css', array( 'a1tools-flatpickr' ), A1TOOLS_VERSION ); wp_register_script( 'a1tools-web-form', A1TOOLS_PLUGIN_URL . 'assets/web-form.js', array( 'a1tools-flatpickr' ), A1TOOLS_VERSION, true ); wp_register_style( 'a1tools-web-chat', A1TOOLS_PLUGIN_URL . 'assets/web-chat.css', array(), A1TOOLS_VERSION ); wp_register_script( 'a1tools-web-chat', A1TOOLS_PLUGIN_URL . 'assets/web-chat.js', array(), A1TOOLS_VERSION, true ); // 2.6.0 — Review Funnel assets. Enqueued by the Elementor widget // (get_style_depends/get_script_depends), the [a1tools_review_widget] // shortcode, and the site-wide floating launcher. wp_register_style( 'a1tools-review', A1TOOLS_PLUGIN_URL . 'assets/review.css', array(), A1TOOLS_VERSION ); wp_register_script( 'a1tools-review', A1TOOLS_PLUGIN_URL . 'assets/review.js', array(), A1TOOLS_VERSION, true ); // Video Carousel assets — pulled in by the widget via // get_style_depends()/get_script_depends(). Versioned with A1TOOLS_VERSION // so a plugin bump busts the browser cache. wp_register_style( 'a1tools-video-carousel', A1TOOLS_PLUGIN_URL . 'assets/video-carousel.css', array(), A1TOOLS_VERSION ); wp_register_script( 'a1tools-video-carousel', A1TOOLS_PLUGIN_URL . 'assets/video-carousel.js', array(), A1TOOLS_VERSION, true ); // Gallery widget assets — pulled in by the widget via // get_style_depends()/get_script_depends(). wp_register_style( 'a1tools-gallery', A1TOOLS_PLUGIN_URL . 'assets/gallery.css', array(), A1TOOLS_VERSION ); wp_register_script( 'a1tools-gallery', A1TOOLS_PLUGIN_URL . 'assets/gallery.js', array(), A1TOOLS_VERSION, true ); // Smiley Reviews widget assets — own handle, independent of the Review Funnel's. wp_register_style( 'a1tools-smiley-review', A1TOOLS_PLUGIN_URL . 'assets/smiley-review.css', array(), A1TOOLS_VERSION ); wp_register_script( 'a1tools-smiley-review', A1TOOLS_PLUGIN_URL . 'assets/smiley-review.js', array(), A1TOOLS_VERSION, true ); } add_action( 'wp_enqueue_scripts', 'a1tools_register_web_lead_assets' ); add_action( 'elementor/editor/before_enqueue_scripts', 'a1tools_register_web_lead_assets' ); /** * Register Elementor widget styles. * * Registers the base CSS for the A1 Social Icons Elementor widget as an inline * stylesheet so it loads once and works in both frontend and editor. * * @since 1.4.8 * @return void */ function a1tools_register_elementor_styles() { $css = ' .a1tools-social-icons-styled { display: flex; flex-wrap: wrap; align-items: center; } .a1tools-social-icons-styled .a1tools-social-icon { display: inline-flex; align-items: center; justify-content: center; text-decoration: none !important; transition: all 0.3s ease; box-sizing: border-box; } .a1tools-social-icons-styled .a1tools-social-icon i { color: inherit; line-height: 1; } .a1tools-social-icons-styled .a1tools-social-icon .a1tools-svg-icon { width: 1em; height: 1em; fill: currentColor; } /* Style presets for non-custom styles */ .a1tools-style-default .a1tools-social-icon, .a1tools-style-official .a1tools-social-icon { color: #fff; } .a1tools-style-default .a1tools-social-icon i, .a1tools-style-official .a1tools-social-icon i { color: #fff; } .a1tools-style-outline .a1tools-social-icon { background: transparent; border: 2px solid; } .a1tools-style-minimal .a1tools-social-icon { background: transparent; } .a1tools-style-light .a1tools-social-icon { background: #f5f5f5; } .a1tools-style-dark .a1tools-social-icon { background: #333; color: #fff; } .a1tools-style-dark .a1tools-social-icon i { color: #fff; } /* Hover effects via prefix_class */ .a1tools-hover-scale .a1tools-social-icon:hover { transform: scale(1.1); } .a1tools-hover-lift .a1tools-social-icon:hover { transform: translateY(-3px); box-shadow: 0 4px 12px rgba(0,0,0,0.2); } .a1tools-hover-rotate .a1tools-social-icon:hover { transform: rotate(15deg); } .a1tools-hover-pulse .a1tools-social-icon:hover { animation: a1tools-pulse 0.5s ease; } @keyframes a1tools-pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.15); } } '; wp_register_style( 'a1tools-elementor-icons', false, array(), A1TOOLS_VERSION ); wp_enqueue_style( 'a1tools-elementor-icons' ); wp_add_inline_style( 'a1tools-elementor-icons', $css ); } add_action( 'wp_enqueue_scripts', 'a1tools_register_elementor_styles' ); add_action( 'elementor/editor/before_enqueue_styles', 'a1tools_register_elementor_styles' ); add_action( 'elementor/preview/enqueue_styles', 'a1tools_register_elementor_styles' ); /** * Register Hours Elementor widget styles. * * @since 1.5.2 * @return void */ function a1tools_register_hours_styles() { $css = ' .a1tools-hours-widget { box-sizing: border-box; } .a1tools-hours-title { display: flex; align-items: flex-start; } .a1tools-hours-widget[style*="text-align: center"] .a1tools-hours-title, .a1tools-hours-widget[style*="text-align:center"] .a1tools-hours-title { justify-content: center; } .a1tools-hours-widget[style*="text-align: right"] .a1tools-hours-title, .a1tools-hours-widget[style*="text-align:right"] .a1tools-hours-title { justify-content: flex-end; } .a1tools-hours-title-text { font-size: inherit; font-weight: bold; } .a1tools-hours-icon { display: inline-flex; align-items: center; justify-content: center; line-height: 1; } .a1tools-hours-icon i { color: inherit; margin: 0; padding: 0; line-height: 1; width: 1em; height: 1em; display: inline-flex; align-items: center; justify-content: center; } .a1tools-hours-icon svg { fill: currentColor; margin: 0; padding: 0; } .a1tools-hours-row { display: flex; align-items: baseline; gap: 16px; } .a1tools-hours-has-divider .a1tools-hours-row { border-bottom: 1px solid #e0e0e0; } .a1tools-hours-has-divider .a1tools-hours-row:last-child { border-bottom: none; } .a1tools-hours-day { font-weight: 600; flex-shrink: 0; } /* Fixed-width day column so times always align */ .a1tools-hours-layout-list .a1tools-hours-day, .a1tools-hours-layout-table .a1tools-hours-day { min-width: 110px; } /* Inline layout: horizontal flow */ .a1tools-hours-layout-inline .a1tools-hours-list { display: flex; flex-wrap: wrap; gap: 8px 20px; } .a1tools-hours-layout-inline .a1tools-hours-row { gap: 6px; } '; wp_register_style( 'a1tools-elementor-hours', false, array(), A1TOOLS_VERSION ); wp_enqueue_style( 'a1tools-elementor-hours' ); wp_add_inline_style( 'a1tools-elementor-hours', $css ); } add_action( 'wp_enqueue_scripts', 'a1tools_register_hours_styles' ); add_action( 'elementor/editor/before_enqueue_styles', 'a1tools_register_hours_styles' ); add_action( 'elementor/preview/enqueue_styles', 'a1tools_register_hours_styles' ); /** * Register Info Box / Contact Info Elementor widget styles. * * Shared CSS for Phone, Email, Location, and combined Contact Info widgets. * * @since 1.5.3 * @return void */ function a1tools_register_info_box_styles() { $css = ' /* ── Info Box (Phone, Email, Location) ─────────────────── */ .a1tools-info-box { display: flex; align-items: flex-start; box-sizing: border-box; transition: border-color 0.2s ease; } .a1tools-info-box-icon { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; line-height: 1; } .a1tools-info-box-icon i { color: inherit; margin: 0; padding: 0; line-height: 1; width: 1em; height: 1em; display: inline-flex; align-items: center; justify-content: center; } .a1tools-info-box-icon svg { fill: currentColor; margin: 0; padding: 0; } .a1tools-info-box-content { display: flex; flex-direction: column; min-width: 0; } .a1tools-info-box-title { font-weight: 600; line-height: 1.3; } .a1tools-info-box-value { text-decoration: none; color: inherit; word-break: break-word; } /* Link wrapper – make behave like the
it replaces */ a.a1tools-info-box-link, a.a1tools-info-box-link:visited { text-decoration: none; color: inherit; display: flex; align-items: flex-start; } a.a1tools-info-box-link .a1tools-info-box-icon, a.a1tools-info-box-link .a1tools-info-box-title, a.a1tools-info-box-link .a1tools-info-box-value { transition: color 0.2s ease; } a.a1tools-info-box-link .a1tools-info-box-icon svg { transition: fill 0.2s ease; } /* Hover underline on value only */ a.a1tools-underline-hover:hover .a1tools-info-box-value { text-decoration: underline; } .a1tools-info-box-empty { font-style: italic; opacity: 0.6; } /* ── Contact Info (combined widget) ────────────────────── */ .a1tools-contact-info-widget { display: flex; flex-direction: column; transition: border-color 0.2s ease; } .a1tools-contact-info-item { display: flex; align-items: flex-start; } /* Ensure icons stay top-aligned even if theme/Elementor overrides flex defaults */ .a1tools-contact-info-widget .a1tools-contact-info-item, .a1tools-contact-info-widget a.a1tools-info-box-link { align-items: flex-start; } .a1tools-has-dividers > .a1tools-contact-info-item + .a1tools-contact-info-item { border-top: 1px solid #e0e0e0; padding-top: 20px; } '; wp_register_style( 'a1tools-elementor-info-box', false, array(), A1TOOLS_VERSION ); wp_enqueue_style( 'a1tools-elementor-info-box' ); wp_add_inline_style( 'a1tools-elementor-info-box', $css ); } add_action( 'wp_enqueue_scripts', 'a1tools_register_info_box_styles' ); add_action( 'elementor/editor/before_enqueue_styles', 'a1tools_register_info_box_styles' ); add_action( 'elementor/preview/enqueue_styles', 'a1tools_register_info_box_styles' ); /** * Register CTA button widget styles. * * @since 1.5.9 * @return void */ function a1tools_register_cta_styles() { $css = ' /* ── CTA Button ───────────────────────────────────────── */ .a1tools-cta-wrapper { display: flex; } .a1tools-cta-button { display: inline-flex; align-items: center; justify-content: center; text-decoration: none; cursor: pointer; box-sizing: border-box; transition: color 0.2s ease, background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease; line-height: 1; color: inherit; } .a1tools-cta-button:visited { color: inherit; } .a1tools-cta-icon { display: inline-flex; align-items: center; justify-content: center; line-height: 1; } .a1tools-cta-icon i { color: inherit; } .a1tools-cta-icon svg { fill: currentColor; } /* ── CTA Animations (continuous) ──────────────────────── */ .a1tools-anim--pulse { animation: a1ctaPulse 1.5s ease infinite; } .a1tools-anim--heartbeat { animation: a1ctaHeartbeat 1.5s ease infinite; } .a1tools-anim--bounce { animation: a1ctaBounce 1.5s ease infinite; } .a1tools-anim--shake { animation: a1ctaShake 1.5s ease infinite; } .a1tools-anim--glow { animation: a1ctaGlow 1.5s ease infinite; } .a1tools-anim--wiggle { animation: a1ctaWiggle 1.5s ease infinite; } .a1tools-anim--flash { animation: a1ctaFlash 1.5s ease infinite; } .a1tools-anim--swing { animation: a1ctaSwing 1.5s ease infinite; transform-origin: top center; } .a1tools-anim--rubberband { animation: a1ctaRubberBand 1.5s ease infinite; } .a1tools-anim--tada { animation: a1ctaTada 1.5s ease infinite; } /* ── CTA Animations (hover-only) ─────────────────────── */ .a1tools-anim-hover { animation: none; } .a1tools-anim-hover--pulse:hover { animation: a1ctaPulse 1.5s ease infinite; } .a1tools-anim-hover--heartbeat:hover { animation: a1ctaHeartbeat 1.5s ease infinite; } .a1tools-anim-hover--bounce:hover { animation: a1ctaBounce 1.5s ease infinite; } .a1tools-anim-hover--shake:hover { animation: a1ctaShake 1.5s ease infinite; } .a1tools-anim-hover--glow:hover { animation: a1ctaGlow 1.5s ease infinite; } .a1tools-anim-hover--wiggle:hover { animation: a1ctaWiggle 1.5s ease infinite; } .a1tools-anim-hover--flash:hover { animation: a1ctaFlash 1.5s ease infinite; } .a1tools-anim-hover--swing:hover { animation: a1ctaSwing 1.5s ease infinite; transform-origin: top center; } .a1tools-anim-hover--rubberband:hover { animation: a1ctaRubberBand 1.5s ease infinite; } .a1tools-anim-hover--tada:hover { animation: a1ctaTada 1.5s ease infinite; } /* 1. Pulse — gentle scale up/down */ @keyframes a1ctaPulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.06); } } /* 2. Heartbeat — double-beat like a heart */ @keyframes a1ctaHeartbeat { 0% { transform: scale(1); } 14% { transform: scale(1.1); } 28% { transform: scale(1); } 42% { transform: scale(1.1); } 70% { transform: scale(1); } 100% { transform: scale(1); } } /* 3. Bounce — hops up and down */ @keyframes a1ctaBounce { 0%, 100% { transform: translateY(0); } 30% { transform: translateY(-8px); } 50% { transform: translateY(0); } 65% { transform: translateY(-4px); } 80% { transform: translateY(0); } } /* 4. Shake — side-to-side */ @keyframes a1ctaShake { 0%, 100% { transform: translateX(0); } 10% { transform: translateX(-5px); } 20% { transform: translateX(5px); } 30% { transform: translateX(-5px); } 40% { transform: translateX(5px); } 50% { transform: translateX(0); } } /* 5. Glow — pulsing box-shadow (uses --a1-glow-color CSS var) */ .a1tools-cta-button { --a1-glow-color: #ffffff; } @keyframes a1ctaGlow { 0%, 100% { box-shadow: 0 0 5px var(--a1-glow-color); opacity: 0.9; } 50% { box-shadow: 0 0 20px var(--a1-glow-color), 0 0 40px var(--a1-glow-color); opacity: 1; } } /* 6. Wiggle — rotates back and forth */ @keyframes a1ctaWiggle { 0%, 100% { transform: rotate(0deg); } 15% { transform: rotate(-4deg); } 30% { transform: rotate(4deg); } 45% { transform: rotate(-4deg); } 60% { transform: rotate(4deg); } 75% { transform: rotate(0deg); } } /* 7. Flash — opacity blink */ @keyframes a1ctaFlash { 0%, 50%, 100% { opacity: 1; } 25%, 75% { opacity: 0.4; } } /* 8. Swing — pendulum from top */ @keyframes a1ctaSwing { 0%, 100% { transform: rotate(0deg); } 20% { transform: rotate(8deg); } 40% { transform: rotate(-6deg); } 60% { transform: rotate(4deg); } 80% { transform: rotate(-2deg); } } /* 9. Rubber Band — stretch and snap */ @keyframes a1ctaRubberBand { 0%, 100% { transform: scaleX(1) scaleY(1); } 30% { transform: scaleX(1.15) scaleY(0.9); } 40% { transform: scaleX(0.9) scaleY(1.1); } 50% { transform: scaleX(1.05) scaleY(0.95); } 65% { transform: scaleX(0.98) scaleY(1.02); } 75% { transform: scaleX(1); } } /* 10. Tada — scale + rotation for attention */ @keyframes a1ctaTada { 0%, 100% { transform: scale(1) rotate(0deg); } 10% { transform: scale(0.95) rotate(-3deg); } 20% { transform: scale(0.95) rotate(-3deg); } 30% { transform: scale(1.08) rotate(3deg); } 40% { transform: scale(1.08) rotate(-3deg); } 50% { transform: scale(1.08) rotate(3deg); } 60% { transform: scale(1.08) rotate(-3deg); } 70% { transform: scale(1.08) rotate(3deg); } 80% { transform: scale(1) rotate(0deg); } } '; wp_register_style( 'a1tools-elementor-cta', false, array(), A1TOOLS_VERSION ); wp_enqueue_style( 'a1tools-elementor-cta' ); wp_add_inline_style( 'a1tools-elementor-cta', $css ); } add_action( 'wp_enqueue_scripts', 'a1tools_register_cta_styles' ); add_action( 'elementor/editor/before_enqueue_styles', 'a1tools_register_cta_styles' ); add_action( 'elementor/preview/enqueue_styles', 'a1tools_register_cta_styles' );