@sociallane/elements 1.0.9 → 1.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/admin/views/onboarding.php +1 -1
- package/admin/views/partials/step-complete.php +1 -1
- package/admin/views/partials/step-requirements.php +2 -2
- package/admin/views/settings.php +1 -1
- package/admin/views/setup-widget-catalog.php +2 -2
- package/assets/css/tailwind.css +1 -28
- package/elements/button/button.php +13 -9
- package/elements/button/templates/render.php +8 -24
- package/includes/button-presets.php +15 -5
- package/package.json +1 -1
- package/packages/core/assets/css/tailwind.css +1 -28
- package/packages/core/assets/dist/.vite/manifest.json +15 -3
- package/packages/core/assets/dist/animations-tqJYzwcE.js +252 -0
- package/packages/core/assets/dist/animations-tqJYzwcE.js.map +1 -0
- package/packages/core/assets/dist/tailwind-DOt-nulx.css +6303 -0
- package/packages/core/assets/dist/vendor-gsap-DG3BZlja.js +6581 -0
- package/packages/core/assets/dist/vendor-gsap-DG3BZlja.js.map +1 -0
- package/packages/core/assets/dist/vendor-lenis-yRRXrftv.js +1099 -0
- package/packages/core/assets/dist/vendor-lenis-yRRXrftv.js.map +1 -0
- package/packages/core/includes/helpers.php +3 -0
- package/packages/core/package.json +1 -1
- package/packages/core/vite.config.js +25 -5
- package/packages/widgets/bento-grid/data/view.php +8 -8
- package/packages/widgets/bento-grid/templates/partials/tcsr-row1-left.php +1 -1
- package/packages/widgets/bento-grid/templates/partials/two-row-deploys.php +1 -1
- package/packages/widgets/bento-grid/templates/partials/two-row-overview.php +1 -1
- package/packages/widgets/bento-grid/templates/partials/two-row-security.php +1 -1
- package/packages/widgets/bento-grid-4/data/view.php +8 -8
- package/packages/widgets/bento-grid-4/templates/partials/tcsr-row1-left.php +1 -1
- package/packages/widgets/bento-grid-4/templates/partials/two-row-deploys.php +1 -1
- package/packages/widgets/bento-grid-4/templates/partials/two-row-overview.php +1 -1
- package/packages/widgets/bento-grid-4/templates/partials/two-row-security.php +1 -1
- package/packages/widgets/bento-grid-5/data/view.php +8 -8
- package/packages/widgets/bento-grid-5/templates/partials/tcsr-row1-left.php +1 -1
- package/packages/widgets/bento-grid-5/templates/partials/two-row-deploys.php +1 -1
- package/packages/widgets/bento-grid-5/templates/partials/two-row-overview.php +1 -1
- package/packages/widgets/bento-grid-5/templates/partials/two-row-security.php +1 -1
- package/packages/widgets/bento-grid-6/data/view.php +8 -8
- package/packages/widgets/bento-grid-6/templates/partials/tcsr-row1-left.php +1 -1
- package/packages/widgets/bento-grid-6/templates/partials/two-row-deploys.php +1 -1
- package/packages/widgets/bento-grid-6/templates/partials/two-row-overview.php +1 -1
- package/packages/widgets/bento-grid-6/templates/partials/two-row-security.php +1 -1
- package/packages/widgets/bento-portfolio/data/view.php +3 -3
- package/packages/widgets/bento-portfolio/templates/partials/portfolio-card.php +2 -2
- package/packages/widgets/bento-portfolio-4/data/view.php +3 -3
- package/packages/widgets/bento-portfolio-4/templates/partials/portfolio-card.php +2 -2
- package/packages/widgets/bento-portfolio-5/data/view.php +3 -3
- package/packages/widgets/bento-portfolio-5/templates/partials/portfolio-card.php +2 -2
- package/packages/widgets/bento-portfolio-6/data/view.php +3 -3
- package/packages/widgets/bento-portfolio-6/templates/partials/portfolio-card.php +2 -2
- package/packages/widgets/blog-grid/data/view.php +1 -1
- package/packages/widgets/card-hover-reveal/data/view.php +1 -1
- package/packages/widgets/content-block/data/view.php +4 -4
- package/packages/widgets/cta-banner/data/view.php +3 -3
- package/packages/widgets/cta-banner/templates/wrapper.php +2 -2
- package/packages/widgets/cta-split/data/view.php +4 -4
- package/packages/widgets/faq-centered/data/view.php +7 -7
- package/packages/widgets/faq-centered/templates/partials/accordion.php +4 -4
- package/packages/widgets/faq-split/data/view.php +7 -7
- package/packages/widgets/faq-split/templates/partials/accordion.php +4 -4
- package/packages/widgets/faq-stacked/data/view.php +7 -7
- package/packages/widgets/faq-stacked/templates/partials/accordion.php +4 -4
- package/packages/widgets/feature-grid/data/view.php +8 -8
- package/packages/widgets/feature-grid-centered/data/view.php +8 -8
- package/packages/widgets/feature-list/data/view.php +4 -4
- package/packages/widgets/feature-list-cta/data/view.php +6 -6
- package/packages/widgets/feature-list-cta/templates/partials/feature-item.php +1 -1
- package/packages/widgets/footer/data/view.php +4 -4
- package/packages/widgets/footer-brand/data/view.php +15 -15
- package/packages/widgets/footer-links-contact/data/view.php +2 -2
- package/packages/widgets/form-contact/data/view.php +4 -4
- package/packages/widgets/grid-team/data/view.php +4 -4
- package/packages/widgets/grid-team/templates/partials/team-card.php +1 -1
- package/packages/widgets/hero-announcement/data/view.php +1 -1
- package/packages/widgets/hero-centered-image/data/view.php +1 -1
- package/packages/widgets/hero-centered-image/templates/wrapper.php +1 -1
- package/packages/widgets/hero-collage/data/view.php +3 -3
- package/packages/widgets/hero-overlay/data/view.php +1 -1
- package/packages/widgets/hero-overlay-single/data/view.php +1 -1
- package/packages/widgets/hero-overlay-slider/data/view.php +1 -1
- package/packages/widgets/hero-saas-centered/data/view.php +5 -5
- package/packages/widgets/hero-saas-split/data/view.php +5 -5
- package/packages/widgets/hero-saas-stacked/data/view.php +5 -5
- package/packages/widgets/hero-split/data/view.php +3 -3
- package/packages/widgets/hero-stacked-image/templates/wrapper.php +4 -4
- package/packages/widgets/intro-text/data/view.php +3 -3
- package/packages/widgets/logo-grid-centered/data/view.php +4 -4
- package/packages/widgets/logo-grid-row/data/view.php +4 -4
- package/packages/widgets/logo-grid-split/data/view.php +4 -4
- package/packages/widgets/nav-centered/data/view.php +8 -8
- package/packages/widgets/nav-compact/data/view.php +8 -8
- package/packages/widgets/nav-default/data/view.php +8 -8
- package/packages/widgets/nav-floating/data/view.php +8 -8
- package/packages/widgets/nav-minimal/data/view.php +8 -8
- package/packages/widgets/newsletter/data/view.php +5 -5
- package/packages/widgets/newsletter-card/data/view.php +5 -5
- package/packages/widgets/newsletter-section/data/view.php +5 -5
- package/packages/widgets/outreach-dashboard/data/view.php +2 -2
- package/packages/widgets/outreach-dashboard/templates/partials/card-meetings.php +1 -1
- package/packages/widgets/page-hero-center/data/view.php +3 -3
- package/packages/widgets/page-hero-left/data/view.php +3 -3
- package/packages/widgets/pipeline-dashboard/data/view.php +3 -3
- package/packages/widgets/posts-grid/data/view.php +6 -6
- package/packages/widgets/posts-grid/templates/partials/card.php +3 -3
- package/packages/widgets/posts-grid-overlay/data/view.php +6 -6
- package/packages/widgets/posts-grid-overlay/templates/partials/card.php +3 -3
- package/packages/widgets/pricing-table/data/view.php +2 -2
- package/packages/widgets/sales-dashboard/data/view.php +3 -3
- package/packages/widgets/sales-dashboard/templates/partials/card-competitors.php +1 -1
- package/packages/widgets/sales-dashboard/templates/partials/card-feature.php +6 -6
- package/packages/widgets/section-stats/data/view.php +3 -3
- package/packages/widgets/section-stats/templates/partials/stat-card.php +1 -1
- package/packages/widgets/simple-page-hero/data/view.php +3 -3
- package/packages/widgets/social-proof/data/view.php +5 -5
- package/packages/widgets/social-proof/templates/partials/layout-trust.php +2 -2
- package/packages/widgets/social-proof/templates/partials/stat-card.php +1 -1
- package/packages/widgets/social-proof-trust/data/view.php +12 -12
- package/packages/widgets/social-proof-trust/templates/partials/layout-trust.php +2 -2
- package/packages/widgets/social-proof-trust/templates/partials/stat-card.php +1 -1
- package/packages/widgets/testimonials-bento/data/view.php +1 -1
- package/packages/widgets/testimonials-grid/data/view.php +1 -1
- package/packages/widgets/testimonials-masonry/data/view.php +1 -1
- package/packages/widgets/widget-filter/data/view.php +1 -1
- package/packages/widgets/widget-filter/templates/wrapper.php +63 -2
- package/packages/widgets/widget-filter/widget-filter.php +1 -1
- package/scripts/postinstall.js +22 -1
- package/vite.config.js +25 -5
- package/widgets/bento-grid/data/view.php +8 -8
- package/widgets/bento-grid/templates/partials/tcsr-row1-left.php +1 -1
- package/widgets/bento-grid/templates/partials/two-row-deploys.php +1 -1
- package/widgets/bento-grid/templates/partials/two-row-overview.php +1 -1
- package/widgets/bento-grid/templates/partials/two-row-security.php +1 -1
- package/widgets/bento-portfolio/data/view.php +3 -3
- package/widgets/bento-portfolio/templates/partials/portfolio-card.php +2 -2
- package/widgets/blog-grid/data/view.php +1 -1
- package/widgets/card-hover-reveal/data/view.php +1 -1
- package/widgets/content-block/data/view.php +4 -4
- package/widgets/cta-banner/data/view.php +3 -3
- package/widgets/cta-banner/templates/wrapper.php +2 -2
- package/widgets/cta-split/data/view.php +4 -4
- package/widgets/faq/data/view.php +7 -7
- package/widgets/faq/templates/partials/accordion.php +4 -4
- package/widgets/feature-grid/data/view.php +8 -8
- package/widgets/feature-list/data/view.php +4 -4
- package/widgets/feature-list-cta/data/view.php +6 -6
- package/widgets/feature-list-cta/templates/partials/feature-item.php +1 -1
- package/widgets/footer/data/view.php +4 -4
- package/widgets/footer-brand/data/view.php +15 -15
- package/widgets/footer-links-contact/data/view.php +2 -2
- package/widgets/form-contact/data/view.php +4 -4
- package/widgets/grid-posts/data/view.php +6 -6
- package/widgets/grid-posts/templates/partials/card.php +3 -3
- package/widgets/grid-team/data/view.php +4 -4
- package/widgets/grid-team/templates/partials/team-card.php +1 -1
- package/widgets/grid-testimonials/data/view.php +1 -1
- package/widgets/hero-announcement/data/view.php +1 -1
- package/widgets/hero-centered-image/data/view.php +1 -1
- package/widgets/hero-centered-image/templates/wrapper.php +1 -1
- package/widgets/hero-collage/data/view.php +3 -3
- package/widgets/hero-overlay/data/view.php +1 -1
- package/widgets/hero-saas/data/view.php +5 -5
- package/widgets/hero-split/data/view.php +3 -3
- package/widgets/hero-stacked-image/templates/wrapper.php +4 -4
- package/widgets/intro-text/data/view.php +2 -2
- package/widgets/logo-grid/data/view.php +4 -4
- package/widgets/newsletter/data/view.php +5 -5
- package/widgets/outreach-dashboard/data/view.php +2 -2
- package/widgets/outreach-dashboard/templates/partials/card-meetings.php +1 -1
- package/widgets/pipeline-dashboard/data/view.php +3 -3
- package/widgets/pricing-table/data/view.php +2 -2
- package/widgets/sales-dashboard/data/view.php +3 -3
- package/widgets/sales-dashboard/templates/partials/card-competitors.php +1 -1
- package/widgets/sales-dashboard/templates/partials/card-feature.php +6 -6
- package/widgets/section-stats/data/view.php +3 -3
- package/widgets/section-stats/templates/partials/stat-card.php +1 -1
- package/widgets/simple-page-hero/data/view.php +3 -3
- package/widgets/social-proof/data/view.php +12 -12
- package/widgets/social-proof/templates/partials/layout-trust.php +2 -2
- package/widgets/social-proof/templates/partials/stat-card.php +1 -1
- package/packages/core/assets/dist/animations-BySooxN8.js +0 -37
- package/packages/core/assets/dist/tailwind-BMzFIA_O.css +0 -1
|
@@ -33,7 +33,7 @@ $steps = [
|
|
|
33
33
|
<?php
|
|
34
34
|
$is_active = ( $key === $step );
|
|
35
35
|
$is_completed = ( $s['number'] < $steps[ $step ]['number'] );
|
|
36
|
-
$dot_class = $is_active ? 'bg-primary text-white' : ( $is_completed ? 'bg-
|
|
36
|
+
$dot_class = $is_active ? 'bg-primary text-white' : ( $is_completed ? 'bg-neutral-500 text-white' : 'bg-neutral-200 text-neutral-500' );
|
|
37
37
|
?>
|
|
38
38
|
<div class="flex items-center gap-2">
|
|
39
39
|
<span class="w-8 h-8 rounded-full flex items-center justify-center text-sm font-bold <?php echo esc_attr( $dot_class ); ?>">
|
|
@@ -15,7 +15,7 @@ $enabled_count = (int) ( $data['enabled_count'] ?? 0 );
|
|
|
15
15
|
$total_count = (int) ( $data['total_count'] ?? 0 );
|
|
16
16
|
?>
|
|
17
17
|
<div class="text-center py-6">
|
|
18
|
-
<div class="inline-flex items-center justify-center w-16 h-16 rounded-full bg-
|
|
18
|
+
<div class="inline-flex items-center justify-center w-16 h-16 rounded-full bg-neutral-100 text-neutral-600 mb-6" aria-hidden="true">
|
|
19
19
|
<svg class="w-8 h-8" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd" /></svg>
|
|
20
20
|
</div>
|
|
21
21
|
<h2 class="text-2xl font-bold text-neutral-900 mb-2">
|
|
@@ -17,8 +17,8 @@ $all_pass = $data['all_pass'] ?? false;
|
|
|
17
17
|
<div class="space-y-4">
|
|
18
18
|
<?php foreach ( $requirements as $req ) : ?>
|
|
19
19
|
<?php $pass = ! empty( $req['pass'] ); ?>
|
|
20
|
-
<div class="flex items-center gap-3 p-4 rounded-lg <?php echo $pass ? 'bg-
|
|
21
|
-
<span class="shrink-0 w-8 h-8 rounded-full flex items-center justify-center <?php echo $pass ? 'text-
|
|
20
|
+
<div class="flex items-center gap-3 p-4 rounded-lg <?php echo $pass ? 'bg-neutral-50 dark:bg-neutral-900/20' : 'bg-neutral-50 dark:bg-neutral-900/20'; ?>">
|
|
21
|
+
<span class="shrink-0 w-8 h-8 rounded-full flex items-center justify-center <?php echo $pass ? 'text-neutral-600 bg-neutral-100' : 'text-neutral-600 bg-neutral-100'; ?>">
|
|
22
22
|
<?php if ( $pass ) : ?>
|
|
23
23
|
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20" aria-hidden="true"><path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd" /></svg>
|
|
24
24
|
<?php else : ?>
|
package/admin/views/settings.php
CHANGED
|
@@ -28,7 +28,7 @@ $grid_class = 'settings-widget-grid';
|
|
|
28
28
|
</p>
|
|
29
29
|
|
|
30
30
|
<?php if ( $saved ) : ?>
|
|
31
|
-
<div class="mb-6 p-4 bg-
|
|
31
|
+
<div class="mb-6 p-4 bg-neutral-50 border border-neutral-200 rounded-lg text-neutral-800" role="alert">
|
|
32
32
|
<?php esc_html_e( 'Settings saved.', 'sociallane-elements' ); ?>
|
|
33
33
|
</div>
|
|
34
34
|
<?php endif; ?>
|
|
@@ -16,10 +16,10 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
|
16
16
|
<p class="text-neutral-500 mb-8">
|
|
17
17
|
<?php esc_html_e( 'How to add the Widget Catalog to a page and which commands to run so visitors can browse and copy npm install commands for your components.', 'sociallane-elements' ); ?>
|
|
18
18
|
</p>
|
|
19
|
-
<div class="mb-8 p-4 bg-
|
|
19
|
+
<div class="mb-8 p-4 bg-neutral-50 border border-neutral-200 rounded-lg text-neutral-800 text-sm">
|
|
20
20
|
<strong><?php esc_html_e( 'Front-end setup page', 'sociallane-elements' ); ?></strong>
|
|
21
21
|
<?php esc_html_e( 'To give your team a page they can consult anytime, create a new page (e.g. “Widget catalog setup”), add the shortcode', 'sociallane-elements' ); ?>
|
|
22
|
-
<code class="bg-
|
|
22
|
+
<code class="bg-neutral-100 px-1 rounded">[sociallane_widget_catalog_setup]</code>
|
|
23
23
|
<?php esc_html_e( 'and publish. Anyone with the link can view the same setup guide and commands.', 'sociallane-elements' ); ?>
|
|
24
24
|
</div>
|
|
25
25
|
|
package/assets/css/tailwind.css
CHANGED
|
@@ -24,33 +24,6 @@
|
|
|
24
24
|
|--------------------------------------------------------------------------
|
|
25
25
|
*/
|
|
26
26
|
@theme {
|
|
27
|
-
/* Blue Chill (SocialLane Primary) */
|
|
28
|
-
--color-blue-chill-50: oklch(0.984 0.012 192.5);
|
|
29
|
-
--color-blue-chill-100: oklch(0.964 0.034 192.4);
|
|
30
|
-
--color-blue-chill-200: oklch(0.937 0.063 192.3);
|
|
31
|
-
--color-blue-chill-300: oklch(0.882 0.118 192.2);
|
|
32
|
-
--color-blue-chill-400: oklch(0.827 0.165 192.9);
|
|
33
|
-
--color-blue-chill-500: oklch(0.778 0.138 192.7);
|
|
34
|
-
--color-blue-chill-600: oklch(0.652 0.119 192.5);
|
|
35
|
-
--color-blue-chill-700: oklch(0.523 0.098 192.4);
|
|
36
|
-
--color-blue-chill-800: oklch(0.443 0.075 192.3);
|
|
37
|
-
--color-blue-chill-900: oklch(0.382 0.058 192.2);
|
|
38
|
-
--color-blue-chill-950: oklch(0.279 0.042 192.1);
|
|
39
|
-
|
|
40
|
-
/* Web Orange (SocialLane Secondary) */
|
|
41
|
-
|
|
42
|
-
--color-web-orange-50: oklch(0.984 0.038 95.8);
|
|
43
|
-
--color-web-orange-100: oklch(0.958 0.088 95.5);
|
|
44
|
-
--color-web-orange-200: oklch(0.912 0.158 95.2);
|
|
45
|
-
--color-web-orange-300: oklch(0.858 0.188 94.9);
|
|
46
|
-
--color-web-orange-400: oklch(0.818 0.178 85.2);
|
|
47
|
-
--color-web-orange-500: oklch(0.768 0.168 70.5);
|
|
48
|
-
--color-web-orange-600: oklch(0.652 0.158 55.2);
|
|
49
|
-
--color-web-orange-700: oklch(0.532 0.138 45.1);
|
|
50
|
-
--color-web-orange-800: oklch(0.448 0.108 48.2);
|
|
51
|
-
--color-web-orange-900: oklch(0.398 0.088 55.3);
|
|
52
|
-
--color-web-orange-950: oklch(0.268 0.068 45.5);
|
|
53
|
-
|
|
54
27
|
/* Primary - dark gray (emphasis, buttons, links) */
|
|
55
28
|
--color-primary: oklch(0.45 0 0);
|
|
56
29
|
--color-primary-light: oklch(0.65 0 0);
|
|
@@ -590,7 +563,7 @@
|
|
|
590
563
|
}
|
|
591
564
|
.sl-cta-notify-form input[type='email'],
|
|
592
565
|
.sl-cta-notify-form input[type='text'] {
|
|
593
|
-
@apply w-full px-4 py-3 text-base leading-normal font-sans bg-neutral-800 border border-neutral-600 rounded-lg text-neutral-100 placeholder:text-neutral-500 focus:outline-none focus:ring-2 focus:ring-
|
|
566
|
+
@apply w-full px-4 py-3 text-base leading-normal font-sans bg-neutral-800 border border-neutral-600 rounded-lg text-neutral-100 placeholder:text-neutral-500 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-0;
|
|
594
567
|
}
|
|
595
568
|
.sl-cta-notify-form input[type='submit'],
|
|
596
569
|
.sl-cta-notify-form button[type='submit'] {
|
|
@@ -73,12 +73,14 @@ class Button extends Widget_Base {
|
|
|
73
73
|
'label' => esc_html__( 'Style', 'sociallane-elements' ),
|
|
74
74
|
'type' => Controls_Manager::SELECT,
|
|
75
75
|
'default' => 'primary',
|
|
76
|
-
'options' =>
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
76
|
+
'options' => function_exists( 'sociallane_get_button_preset_options' )
|
|
77
|
+
? sociallane_get_button_preset_options()
|
|
78
|
+
: [
|
|
79
|
+
'primary' => esc_html__( 'Primary', 'sociallane-elements' ),
|
|
80
|
+
'secondary' => esc_html__( 'Secondary', 'sociallane-elements' ),
|
|
81
|
+
'ghost' => esc_html__( 'Ghost', 'sociallane-elements' ),
|
|
82
|
+
'outline' => esc_html__( 'Outline', 'sociallane-elements' ),
|
|
83
|
+
],
|
|
82
84
|
]
|
|
83
85
|
);
|
|
84
86
|
|
|
@@ -88,8 +90,8 @@ class Button extends Widget_Base {
|
|
|
88
90
|
'label' => esc_html__( 'Color', 'sociallane-elements' ),
|
|
89
91
|
'type' => Controls_Manager::SELECT,
|
|
90
92
|
'default' => 'default',
|
|
91
|
-
'options' => function_exists( 'sociallane_get_button_color_options' ) ? sociallane_get_button_color_options() : [ 'default' => esc_html__( 'Default
|
|
92
|
-
'description' => esc_html__( '
|
|
93
|
+
'options' => function_exists( 'sociallane_get_button_color_options' ) ? sociallane_get_button_color_options() : [ 'default' => esc_html__( 'Default', 'sociallane-elements' ) ],
|
|
94
|
+
'description' => esc_html__( 'Uses the default theme color.', 'sociallane-elements' ),
|
|
93
95
|
]
|
|
94
96
|
);
|
|
95
97
|
|
|
@@ -140,7 +142,9 @@ class Button extends Widget_Base {
|
|
|
140
142
|
'url' => esc_url( $url_data['url'] ?? '#' ),
|
|
141
143
|
'variant' => $settings['variant'] ?? 'primary',
|
|
142
144
|
'size' => $settings['size'] ?? 'md',
|
|
143
|
-
'color' =>
|
|
145
|
+
'color' => function_exists( 'sociallane_normalize_button_color' )
|
|
146
|
+
? sociallane_normalize_button_color( (string) ( $settings['color'] ?? 'default' ) )
|
|
147
|
+
: 'default',
|
|
144
148
|
'icon' => $settings['icon'] ?? null,
|
|
145
149
|
'icon_position' => $settings['icon_position'] ?? 'right',
|
|
146
150
|
'attrs' => '',
|
|
@@ -25,37 +25,21 @@ $icon = $button['icon'] ?? null;
|
|
|
25
25
|
$icon_position = $button['icon_position'] ?? 'right';
|
|
26
26
|
$attrs = $button['attrs'] ?? '';
|
|
27
27
|
$extra_class = $button['class'] ?? '';
|
|
28
|
+
// Keep color key for backward compatibility; palette is default-only.
|
|
29
|
+
if ( function_exists( 'sociallane_normalize_button_color' ) ) {
|
|
30
|
+
$color = sociallane_normalize_button_color( (string) $color );
|
|
31
|
+
} else {
|
|
32
|
+
$color = 'default';
|
|
33
|
+
}
|
|
28
34
|
|
|
29
35
|
// Variant styles: Primary, Secondary, Ghost, Outline
|
|
30
36
|
$variant_classes = [
|
|
31
|
-
'primary' => 'bg-
|
|
32
|
-
'secondary' => 'bg-
|
|
37
|
+
'primary' => 'bg-primary text-white hover:bg-primary-dark focus:ring-2 focus:ring-primary focus:ring-offset-2 dark:bg-primary-light dark:text-neutral-900 dark:hover:bg-primary',
|
|
38
|
+
'secondary' => 'bg-secondary text-white hover:bg-secondary-dark focus:ring-2 focus:ring-secondary focus:ring-offset-2 dark:bg-secondary-light dark:text-neutral-900 dark:hover:bg-secondary',
|
|
33
39
|
'ghost' => 'bg-transparent text-primary hover:bg-primary/10 focus:ring-2 focus:ring-primary focus:ring-offset-2 dark:text-primary-light dark:hover:bg-white/10 dark:focus:ring-offset-neutral-900',
|
|
34
40
|
'outline' => 'bg-transparent text-primary border border-primary hover:bg-primary hover:text-white focus:ring-2 focus:ring-primary focus:ring-offset-2 dark:text-primary-light dark:border-primary-light dark:hover:bg-primary dark:hover:text-white dark:focus:ring-offset-neutral-900',
|
|
35
41
|
];
|
|
36
42
|
|
|
37
|
-
// Optional accent color override: same style, different palette
|
|
38
|
-
$accent_classes = [
|
|
39
|
-
'primary' => [
|
|
40
|
-
'default' => null,
|
|
41
|
-
'blue-chill' => 'bg-blue-chill-500 text-white hover:bg-blue-chill-600 focus:ring-2 focus:ring-blue-chill-500 focus:ring-offset-2 dark:focus:ring-offset-neutral-900',
|
|
42
|
-
'web-orange' => 'bg-web-orange-500 text-white hover:bg-web-orange-600 focus:ring-2 focus:ring-web-orange-500 focus:ring-offset-2 dark:focus:ring-offset-neutral-900',
|
|
43
|
-
],
|
|
44
|
-
'outline' => [
|
|
45
|
-
'default' => null,
|
|
46
|
-
'blue-chill' => 'bg-transparent text-blue-chill-500 border border-blue-chill-500 hover:bg-blue-chill-500 hover:text-white focus:ring-2 focus:ring-blue-chill-500 focus:ring-offset-2 dark:text-blue-chill-300 dark:border-blue-chill-300 dark:hover:bg-blue-chill-500 dark:hover:text-white dark:focus:ring-offset-neutral-900',
|
|
47
|
-
'web-orange' => 'bg-transparent text-web-orange-500 border border-web-orange-500 hover:bg-web-orange-500 hover:text-white focus:ring-2 focus:ring-web-orange-500 focus:ring-offset-2 dark:text-web-orange-400 dark:border-web-orange-400 dark:hover:bg-web-orange-500 dark:hover:text-white dark:focus:ring-offset-neutral-900',
|
|
48
|
-
],
|
|
49
|
-
'ghost' => [
|
|
50
|
-
'default' => null,
|
|
51
|
-
'blue-chill' => 'bg-transparent text-blue-chill-500 hover:bg-blue-chill-500/10 focus:ring-2 focus:ring-blue-chill-500 focus:ring-offset-2 dark:text-blue-chill-300 dark:hover:bg-blue-chill-500/10 dark:focus:ring-offset-neutral-900',
|
|
52
|
-
'web-orange' => 'bg-transparent text-web-orange-500 hover:bg-web-orange-500/10 focus:ring-2 focus:ring-web-orange-500 focus:ring-offset-2 dark:text-web-orange-400 dark:hover:bg-web-orange-500/10 dark:focus:ring-offset-neutral-900',
|
|
53
|
-
],
|
|
54
|
-
];
|
|
55
|
-
if ( in_array( $variant, [ 'primary', 'outline', 'ghost' ], true ) && $color !== 'default' && isset( $accent_classes[ $variant ][ $color ] ) ) {
|
|
56
|
-
$variant_classes[ $variant ] = $accent_classes[ $variant ][ $color ];
|
|
57
|
-
}
|
|
58
|
-
|
|
59
43
|
$size_classes = [
|
|
60
44
|
'sm' => 'px-4 py-2 text-sm gap-1.5',
|
|
61
45
|
'md' => 'px-6 py-3 text-base gap-2',
|
|
@@ -57,15 +57,25 @@ function sociallane_parse_button_preset( string $preset ): array {
|
|
|
57
57
|
/**
|
|
58
58
|
* Get button color (accent) options for an optional "Button color" dropdown
|
|
59
59
|
*
|
|
60
|
-
*
|
|
61
|
-
* Pass the selected value as $button['color'] when rendering; default means use variant default.
|
|
60
|
+
* Default-only palette to keep button styling consistent across widgets.
|
|
62
61
|
*
|
|
63
62
|
* @return array<string, string> Option key => label
|
|
64
63
|
*/
|
|
65
64
|
function sociallane_get_button_color_options(): array {
|
|
66
65
|
return [
|
|
67
|
-
'default'
|
|
68
|
-
'blue-chill' => esc_html__( 'Blue Chilli', 'sociallane-elements' ),
|
|
69
|
-
'web-orange' => esc_html__( 'Web Orange', 'sociallane-elements' ),
|
|
66
|
+
'default' => esc_html__( 'Default', 'sociallane-elements' ),
|
|
70
67
|
];
|
|
71
68
|
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Normalize a button color key to an allowed option.
|
|
72
|
+
*
|
|
73
|
+
* @param string $color Requested button color key.
|
|
74
|
+
* @return string Allowed color key; defaults to 'default'.
|
|
75
|
+
*/
|
|
76
|
+
function sociallane_normalize_button_color( string $color ): string {
|
|
77
|
+
$color = trim( $color );
|
|
78
|
+
$options = sociallane_get_button_color_options();
|
|
79
|
+
|
|
80
|
+
return isset( $options[ $color ] ) ? $color : 'default';
|
|
81
|
+
}
|
package/package.json
CHANGED
|
@@ -24,33 +24,6 @@
|
|
|
24
24
|
|--------------------------------------------------------------------------
|
|
25
25
|
*/
|
|
26
26
|
@theme {
|
|
27
|
-
/* Blue Chill (SocialLane Primary) */
|
|
28
|
-
--color-blue-chill-50: oklch(0.984 0.012 192.5);
|
|
29
|
-
--color-blue-chill-100: oklch(0.964 0.034 192.4);
|
|
30
|
-
--color-blue-chill-200: oklch(0.937 0.063 192.3);
|
|
31
|
-
--color-blue-chill-300: oklch(0.882 0.118 192.2);
|
|
32
|
-
--color-blue-chill-400: oklch(0.827 0.165 192.9);
|
|
33
|
-
--color-blue-chill-500: oklch(0.778 0.138 192.7);
|
|
34
|
-
--color-blue-chill-600: oklch(0.652 0.119 192.5);
|
|
35
|
-
--color-blue-chill-700: oklch(0.523 0.098 192.4);
|
|
36
|
-
--color-blue-chill-800: oklch(0.443 0.075 192.3);
|
|
37
|
-
--color-blue-chill-900: oklch(0.382 0.058 192.2);
|
|
38
|
-
--color-blue-chill-950: oklch(0.279 0.042 192.1);
|
|
39
|
-
|
|
40
|
-
/* Web Orange (SocialLane Secondary) */
|
|
41
|
-
|
|
42
|
-
--color-web-orange-50: oklch(0.984 0.038 95.8);
|
|
43
|
-
--color-web-orange-100: oklch(0.958 0.088 95.5);
|
|
44
|
-
--color-web-orange-200: oklch(0.912 0.158 95.2);
|
|
45
|
-
--color-web-orange-300: oklch(0.858 0.188 94.9);
|
|
46
|
-
--color-web-orange-400: oklch(0.818 0.178 85.2);
|
|
47
|
-
--color-web-orange-500: oklch(0.768 0.168 70.5);
|
|
48
|
-
--color-web-orange-600: oklch(0.652 0.158 55.2);
|
|
49
|
-
--color-web-orange-700: oklch(0.532 0.138 45.1);
|
|
50
|
-
--color-web-orange-800: oklch(0.448 0.108 48.2);
|
|
51
|
-
--color-web-orange-900: oklch(0.398 0.088 55.3);
|
|
52
|
-
--color-web-orange-950: oklch(0.268 0.068 45.5);
|
|
53
|
-
|
|
54
27
|
/* Primary - dark gray (emphasis, buttons, links) */
|
|
55
28
|
--color-primary: oklch(0.45 0 0);
|
|
56
29
|
--color-primary-light: oklch(0.65 0 0);
|
|
@@ -590,7 +563,7 @@
|
|
|
590
563
|
}
|
|
591
564
|
.sl-cta-notify-form input[type='email'],
|
|
592
565
|
.sl-cta-notify-form input[type='text'] {
|
|
593
|
-
@apply w-full px-4 py-3 text-base leading-normal font-sans bg-neutral-800 border border-neutral-600 rounded-lg text-neutral-100 placeholder:text-neutral-500 focus:outline-none focus:ring-2 focus:ring-
|
|
566
|
+
@apply w-full px-4 py-3 text-base leading-normal font-sans bg-neutral-800 border border-neutral-600 rounded-lg text-neutral-100 placeholder:text-neutral-500 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-0;
|
|
594
567
|
}
|
|
595
568
|
.sl-cta-notify-form input[type='submit'],
|
|
596
569
|
.sl-cta-notify-form button[type='submit'] {
|
|
@@ -1,13 +1,25 @@
|
|
|
1
1
|
{
|
|
2
|
+
"_vendor-gsap-DG3BZlja.js": {
|
|
3
|
+
"file": "vendor-gsap-DG3BZlja.js",
|
|
4
|
+
"name": "vendor-gsap"
|
|
5
|
+
},
|
|
6
|
+
"_vendor-lenis-yRRXrftv.js": {
|
|
7
|
+
"file": "vendor-lenis-yRRXrftv.js",
|
|
8
|
+
"name": "vendor-lenis"
|
|
9
|
+
},
|
|
2
10
|
"assets/css/tailwind.css": {
|
|
3
|
-
"file": "tailwind-
|
|
11
|
+
"file": "tailwind-DOt-nulx.css",
|
|
4
12
|
"src": "assets/css/tailwind.css",
|
|
5
13
|
"isEntry": true
|
|
6
14
|
},
|
|
7
15
|
"assets/js/animations.js": {
|
|
8
|
-
"file": "animations-
|
|
16
|
+
"file": "animations-tqJYzwcE.js",
|
|
9
17
|
"name": "animations",
|
|
10
18
|
"src": "assets/js/animations.js",
|
|
11
|
-
"isEntry": true
|
|
19
|
+
"isEntry": true,
|
|
20
|
+
"imports": [
|
|
21
|
+
"_vendor-gsap-DG3BZlja.js",
|
|
22
|
+
"_vendor-lenis-yRRXrftv.js"
|
|
23
|
+
]
|
|
12
24
|
}
|
|
13
25
|
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { g as gsapWithCSS, S as SplitText, a as ScrollTrigger } from "./vendor-gsap-DG3BZlja.js";
|
|
2
|
+
import { L as Lenis } from "./vendor-lenis-yRRXrftv.js";
|
|
3
|
+
const REVEAL_TYPES = {
|
|
4
|
+
"fade-up": { opacity: 0, y: 30 },
|
|
5
|
+
"fade-down": { opacity: 0, y: -30 },
|
|
6
|
+
"fade-left": { opacity: 0, x: 30 },
|
|
7
|
+
"fade-right": { opacity: 0, x: -30 },
|
|
8
|
+
"scale": { opacity: 0, scale: 0.95 },
|
|
9
|
+
"rotate": { opacity: 0, rotation: -5 }
|
|
10
|
+
};
|
|
11
|
+
function initReveal(scope = document) {
|
|
12
|
+
scope instanceof Document ? scope : scope.ownerDocument ?? document;
|
|
13
|
+
const container = scope instanceof Document ? scope.body : scope;
|
|
14
|
+
const els = container.querySelectorAll("[data-sl-reveal]");
|
|
15
|
+
els.forEach((el) => {
|
|
16
|
+
const type = el.getAttribute("data-sl-reveal") || "fade-up";
|
|
17
|
+
const delay = parseFloat(el.getAttribute("data-sl-delay") || 0);
|
|
18
|
+
const duration = parseFloat(el.getAttribute("data-sl-duration") || 0.6);
|
|
19
|
+
const from = REVEAL_TYPES[type] ?? REVEAL_TYPES["fade-up"];
|
|
20
|
+
gsapWithCSS.fromTo(
|
|
21
|
+
el,
|
|
22
|
+
from,
|
|
23
|
+
{
|
|
24
|
+
opacity: 1,
|
|
25
|
+
x: 0,
|
|
26
|
+
y: 0,
|
|
27
|
+
scale: 1,
|
|
28
|
+
rotation: 0,
|
|
29
|
+
duration,
|
|
30
|
+
delay,
|
|
31
|
+
ease: "power2.out",
|
|
32
|
+
scrollTrigger: {
|
|
33
|
+
trigger: el,
|
|
34
|
+
start: "top 85%",
|
|
35
|
+
toggleActions: "play none none none"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function initStagger(scope = document) {
|
|
42
|
+
const container = scope instanceof Document ? scope.body : scope;
|
|
43
|
+
const parents = container.querySelectorAll("[data-sl-stagger]");
|
|
44
|
+
parents.forEach((parent) => {
|
|
45
|
+
const delayStr = parent.getAttribute("data-sl-stagger");
|
|
46
|
+
const staggerDelay = delayStr ? parseFloat(delayStr) : 0.1;
|
|
47
|
+
const children = Array.from(parent.children).filter(
|
|
48
|
+
(c) => !c.hasAttribute("data-sl-stagger-skip")
|
|
49
|
+
);
|
|
50
|
+
if (children.length === 0) return;
|
|
51
|
+
gsapWithCSS.fromTo(
|
|
52
|
+
children,
|
|
53
|
+
{ opacity: 0, y: 20 },
|
|
54
|
+
{
|
|
55
|
+
opacity: 1,
|
|
56
|
+
y: 0,
|
|
57
|
+
duration: 0.5,
|
|
58
|
+
stagger: staggerDelay,
|
|
59
|
+
ease: "power2.out",
|
|
60
|
+
scrollTrigger: {
|
|
61
|
+
trigger: parent,
|
|
62
|
+
start: "top 85%",
|
|
63
|
+
toggleActions: "play none none none"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
const splitInstances = /* @__PURE__ */ new WeakMap();
|
|
70
|
+
function initSplitText(scope = document) {
|
|
71
|
+
const container = scope instanceof Document ? scope.body : scope;
|
|
72
|
+
const els = container.querySelectorAll("[data-sl-split]");
|
|
73
|
+
els.forEach((el) => {
|
|
74
|
+
const type = el.getAttribute("data-sl-split") || "words";
|
|
75
|
+
const staggerVal = parseFloat(el.getAttribute("data-sl-split-stagger") || 0.02);
|
|
76
|
+
if (!el.textContent.trim()) return;
|
|
77
|
+
const typeMap = { chars: "chars", words: "words", lines: "lines" };
|
|
78
|
+
const splitType = typeMap[type] || "words";
|
|
79
|
+
const split = new SplitText(el, {
|
|
80
|
+
type: splitType,
|
|
81
|
+
charsClass: "sl-split-char",
|
|
82
|
+
wordsClass: "sl-split-word",
|
|
83
|
+
linesClass: "sl-split-line"
|
|
84
|
+
});
|
|
85
|
+
splitInstances.set(el, split);
|
|
86
|
+
const targets = split[splitType] ?? split.chars ?? split.words ?? split.lines;
|
|
87
|
+
if (!targets || targets.length === 0) return;
|
|
88
|
+
gsapWithCSS.fromTo(
|
|
89
|
+
targets,
|
|
90
|
+
{ opacity: 0, y: 15 },
|
|
91
|
+
{
|
|
92
|
+
opacity: 1,
|
|
93
|
+
y: 0,
|
|
94
|
+
duration: 0.5,
|
|
95
|
+
stagger: staggerVal,
|
|
96
|
+
ease: "power2.out",
|
|
97
|
+
scrollTrigger: {
|
|
98
|
+
trigger: el,
|
|
99
|
+
start: "top 85%",
|
|
100
|
+
toggleActions: "play none none none"
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
function initPin(scope = document) {
|
|
107
|
+
const container = scope instanceof Document ? scope.body : scope;
|
|
108
|
+
const els = container.querySelectorAll("[data-sl-pin]");
|
|
109
|
+
els.forEach((el) => {
|
|
110
|
+
const end = el.getAttribute("data-sl-pin-end") || "+=100%";
|
|
111
|
+
ScrollTrigger.create({
|
|
112
|
+
trigger: el,
|
|
113
|
+
start: "top top",
|
|
114
|
+
end,
|
|
115
|
+
pin: true,
|
|
116
|
+
pinSpacing: true
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
const DURATION_HEIGHT = 0.35;
|
|
121
|
+
const EASE = "power2.out";
|
|
122
|
+
function initHoverReveal(scope = document) {
|
|
123
|
+
const root = scope instanceof Document ? scope : scope.ownerDocument ?? document;
|
|
124
|
+
const container = scope instanceof Document ? root.body : scope;
|
|
125
|
+
if (!container || typeof container.querySelectorAll !== "function") return;
|
|
126
|
+
const cards = container.querySelectorAll("[data-sl-hover-reveal]");
|
|
127
|
+
cards.forEach((card) => {
|
|
128
|
+
const collapsibleItems = card.querySelectorAll("[data-sl-hover-reveal-collapsible]");
|
|
129
|
+
const reducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
130
|
+
if (reducedMotion) {
|
|
131
|
+
collapsibleItems.forEach((item) => {
|
|
132
|
+
gsapWithCSS.set(item, { height: "auto", opacity: 1, transform: "none", overflow: "visible" });
|
|
133
|
+
});
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
collapsibleItems.forEach((item) => {
|
|
137
|
+
gsapWithCSS.set(item, { height: 0, opacity: 0, transform: "translateY(10px)", overflow: "hidden" });
|
|
138
|
+
});
|
|
139
|
+
let tlEnter = null;
|
|
140
|
+
let tlLeave = null;
|
|
141
|
+
const onEnter = () => {
|
|
142
|
+
if (tlLeave) tlLeave.kill();
|
|
143
|
+
tlEnter = gsapWithCSS.timeline({ overwrite: true });
|
|
144
|
+
collapsibleItems.forEach((item, index) => {
|
|
145
|
+
const autoHeight = item.scrollHeight;
|
|
146
|
+
tlEnter.to(item, {
|
|
147
|
+
height: autoHeight,
|
|
148
|
+
opacity: 1,
|
|
149
|
+
transform: "translateY(0)",
|
|
150
|
+
overflow: "visible",
|
|
151
|
+
duration: DURATION_HEIGHT,
|
|
152
|
+
ease: EASE
|
|
153
|
+
}, index * 0.05);
|
|
154
|
+
});
|
|
155
|
+
};
|
|
156
|
+
const onLeave = () => {
|
|
157
|
+
if (tlEnter) tlEnter.kill();
|
|
158
|
+
tlLeave = gsapWithCSS.timeline({ overwrite: true });
|
|
159
|
+
collapsibleItems.forEach((item, index) => {
|
|
160
|
+
tlLeave.to(item, {
|
|
161
|
+
height: 0,
|
|
162
|
+
opacity: 0,
|
|
163
|
+
transform: "translateY(10px)",
|
|
164
|
+
overflow: "hidden",
|
|
165
|
+
duration: DURATION_HEIGHT * 0.8,
|
|
166
|
+
ease: EASE
|
|
167
|
+
}, index * 0.03);
|
|
168
|
+
});
|
|
169
|
+
};
|
|
170
|
+
card.addEventListener("mouseenter", onEnter);
|
|
171
|
+
card.addEventListener("mouseleave", onLeave);
|
|
172
|
+
card.addEventListener("focusin", onEnter);
|
|
173
|
+
card.addEventListener("focusout", onLeave);
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
gsapWithCSS.registerPlugin(ScrollTrigger, SplitText);
|
|
177
|
+
const prefersReducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
178
|
+
const isElementorPreview = () => typeof document !== "undefined" && document.body && document.body.classList.contains("elementor-editor-active");
|
|
179
|
+
const isElementorEditor = () => typeof window !== "undefined" && window.elementorFrontend;
|
|
180
|
+
let lenis = null;
|
|
181
|
+
function initAnimationsInScope(scope = document) {
|
|
182
|
+
const root = scope instanceof Document ? scope : scope?.ownerDocument ?? document;
|
|
183
|
+
const container = scope instanceof Document ? root.body : scope;
|
|
184
|
+
if (!container) return;
|
|
185
|
+
initReveal(container);
|
|
186
|
+
initStagger(container);
|
|
187
|
+
initSplitText(container);
|
|
188
|
+
initPin(container);
|
|
189
|
+
initHoverReveal(container);
|
|
190
|
+
}
|
|
191
|
+
function killTriggersInScope(scope) {
|
|
192
|
+
const container = scope instanceof Document ? scope.body : scope;
|
|
193
|
+
if (!container || typeof container.contains !== "function") return;
|
|
194
|
+
ScrollTrigger.getAll().forEach((t) => {
|
|
195
|
+
if (t.trigger && container.contains(t.trigger)) {
|
|
196
|
+
t.kill();
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
function initAllAnimations() {
|
|
201
|
+
if (prefersReducedMotion) {
|
|
202
|
+
const targets = document.querySelectorAll(
|
|
203
|
+
"[data-sl-reveal], [data-sl-split], [data-sl-stagger]"
|
|
204
|
+
);
|
|
205
|
+
gsapWithCSS.set(targets, { opacity: 1, transform: "none" });
|
|
206
|
+
document.querySelectorAll("[data-sl-stagger]").forEach((parent) => {
|
|
207
|
+
gsapWithCSS.set(parent.children, { opacity: 1, transform: "none" });
|
|
208
|
+
});
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
initAnimationsInScope(document);
|
|
212
|
+
}
|
|
213
|
+
function run() {
|
|
214
|
+
if (prefersReducedMotion) {
|
|
215
|
+
initAllAnimations();
|
|
216
|
+
window.SocialLaneAnimations = { gsap: gsapWithCSS, ScrollTrigger, SplitText, lenis: null, init: initAllAnimations };
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
if (!isElementorPreview()) {
|
|
220
|
+
lenis = new Lenis({ lerp: 0.1, smoothWheel: true });
|
|
221
|
+
lenis.on("scroll", ScrollTrigger.update);
|
|
222
|
+
gsapWithCSS.ticker.add((time) => lenis.raf(time * 1e3));
|
|
223
|
+
gsapWithCSS.ticker.lagSmoothing(0);
|
|
224
|
+
}
|
|
225
|
+
initAllAnimations();
|
|
226
|
+
window.SocialLaneAnimations = {
|
|
227
|
+
gsap: gsapWithCSS,
|
|
228
|
+
ScrollTrigger,
|
|
229
|
+
SplitText,
|
|
230
|
+
lenis,
|
|
231
|
+
init: initAllAnimations,
|
|
232
|
+
initInScope: initAnimationsInScope
|
|
233
|
+
};
|
|
234
|
+
if (isElementorEditor() && window.elementorFrontend?.hooks) {
|
|
235
|
+
window.elementorFrontend.hooks.addAction(
|
|
236
|
+
"frontend/element_ready/global",
|
|
237
|
+
($scope) => {
|
|
238
|
+
const el = $scope && $scope[0];
|
|
239
|
+
if (el) {
|
|
240
|
+
killTriggersInScope(el);
|
|
241
|
+
initAnimationsInScope(el);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (document.readyState === "loading") {
|
|
248
|
+
document.addEventListener("DOMContentLoaded", run);
|
|
249
|
+
} else {
|
|
250
|
+
run();
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=animations-tqJYzwcE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animations-tqJYzwcE.js","sources":["../js/utilities/reveal.js","../js/utilities/stagger.js","../js/utilities/split-text.js","../js/utilities/pin.js","../js/utilities/hover-reveal.js","../js/animations.js"],"sourcesContent":["/**\n * Scroll reveal animation utility.\n * Elements with data-sl-reveal animate into view on scroll.\n *\n * @package SocialLane_Elements\n */\n\nimport gsap from 'gsap';\nimport { ScrollTrigger } from 'gsap/ScrollTrigger';\n\nconst REVEAL_TYPES = {\n 'fade-up': { opacity: 0, y: 30 },\n 'fade-down': { opacity: 0, y: -30 },\n 'fade-left': { opacity: 0, x: 30 },\n 'fade-right': { opacity: 0, x: -30 },\n 'scale': { opacity: 0, scale: 0.95 },\n 'rotate': { opacity: 0, rotation: -5 },\n};\n\n/**\n * Initialize reveal animations within a scope.\n *\n * @param {Element|Document} scope Root element or document to search.\n */\nexport function initReveal(scope = document) {\n const root = scope instanceof Document ? scope : scope.ownerDocument ?? document;\n const container = scope instanceof Document ? scope.body : scope;\n const els = container.querySelectorAll('[data-sl-reveal]');\n\n els.forEach((el) => {\n const type = el.getAttribute('data-sl-reveal') || 'fade-up';\n const delay = parseFloat(el.getAttribute('data-sl-delay') || 0);\n const duration = parseFloat(el.getAttribute('data-sl-duration') || 0.6);\n const from = REVEAL_TYPES[type] ?? REVEAL_TYPES['fade-up'];\n\n gsap.fromTo(\n el,\n from,\n {\n opacity: 1,\n x: 0,\n y: 0,\n scale: 1,\n rotation: 0,\n duration,\n delay,\n ease: 'power2.out',\n scrollTrigger: {\n trigger: el,\n start: 'top 85%',\n toggleActions: 'play none none none',\n },\n }\n );\n });\n}\n","/**\n * Stagger animation utility.\n * Children of elements with data-sl-stagger animate in sequence.\n *\n * @package SocialLane_Elements\n */\n\nimport gsap from 'gsap';\nimport { ScrollTrigger } from 'gsap/ScrollTrigger';\n\n/**\n * Initialize stagger animations within a scope.\n *\n * @param {Element|Document} scope Root element or document to search.\n */\nexport function initStagger(scope = document) {\n const container = scope instanceof Document ? scope.body : scope;\n const parents = container.querySelectorAll('[data-sl-stagger]');\n\n parents.forEach((parent) => {\n const delayStr = parent.getAttribute('data-sl-stagger');\n const staggerDelay = delayStr ? parseFloat(delayStr) : 0.1;\n const children = Array.from(parent.children).filter(\n (c) => !c.hasAttribute('data-sl-stagger-skip')\n );\n\n if (children.length === 0) return;\n\n gsap.fromTo(\n children,\n { opacity: 0, y: 20 },\n {\n opacity: 1,\n y: 0,\n duration: 0.5,\n stagger: staggerDelay,\n ease: 'power2.out',\n scrollTrigger: {\n trigger: parent,\n start: 'top 85%',\n toggleActions: 'play none none none',\n },\n }\n );\n });\n}\n","/**\n * Split text animation utility.\n * Text elements with data-sl-split animate characters/words/lines on scroll.\n *\n * @package SocialLane_Elements\n */\n\nimport gsap from 'gsap';\nimport { ScrollTrigger } from 'gsap/ScrollTrigger';\nimport SplitText from 'gsap/SplitText';\n\nconst splitInstances = new WeakMap();\n\n/**\n * Initialize split text animations within a scope.\n *\n * @param {Element|Document} scope Root element or document to search.\n */\nexport function initSplitText(scope = document) {\n const container = scope instanceof Document ? scope.body : scope;\n const els = container.querySelectorAll('[data-sl-split]');\n\n els.forEach((el) => {\n const type = el.getAttribute('data-sl-split') || 'words';\n const staggerVal = parseFloat(el.getAttribute('data-sl-split-stagger') || 0.02);\n\n if (!el.textContent.trim()) return;\n\n const typeMap = { chars: 'chars', words: 'words', lines: 'lines' };\n const splitType = typeMap[type] || 'words';\n\n const split = new SplitText(el, {\n type: splitType,\n charsClass: 'sl-split-char',\n wordsClass: 'sl-split-word',\n linesClass: 'sl-split-line',\n });\n\n splitInstances.set(el, split);\n\n const targets = split[splitType] ?? split.chars ?? split.words ?? split.lines;\n if (!targets || targets.length === 0) return;\n\n gsap.fromTo(\n targets,\n { opacity: 0, y: 15 },\n {\n opacity: 1,\n y: 0,\n duration: 0.5,\n stagger: staggerVal,\n ease: 'power2.out',\n scrollTrigger: {\n trigger: el,\n start: 'top 85%',\n toggleActions: 'play none none none',\n },\n }\n );\n });\n}\n\n/**\n * Revert split text and clean up.\n *\n * @param {Element} el Element that was split.\n */\nexport function revertSplitText(el) {\n const split = splitInstances.get(el);\n if (split && typeof split.revert === 'function') {\n split.revert();\n splitInstances.delete(el);\n }\n}\n","/**\n * Pin (sticky scroll) animation utility.\n * Elements with data-sl-pin stay pinned during scroll.\n *\n * @package SocialLane_Elements\n */\n\nimport gsap from 'gsap';\nimport { ScrollTrigger } from 'gsap/ScrollTrigger';\n\n/**\n * Initialize pin animations within a scope.\n *\n * @param {Element|Document} scope Root element or document to search.\n */\nexport function initPin(scope = document) {\n const container = scope instanceof Document ? scope.body : scope;\n const els = container.querySelectorAll('[data-sl-pin]');\n\n els.forEach((el) => {\n const end = el.getAttribute('data-sl-pin-end') || '+=100%';\n\n ScrollTrigger.create({\n trigger: el,\n start: 'top top',\n end,\n pin: true,\n pinSpacing: true,\n });\n });\n}\n","/**\n * Hover reveal: backdrop bar is visible with gradient; collapsible content animates height + opacity.\n * Elements with [data-sl-hover-reveal] get bar [data-sl-hover-reveal-bar].\n * Elements with [data-sl-hover-reveal-collapsible] animate height + opacity.\n *\n * @package SocialLane_Elements\n */\n\nimport gsap from 'gsap';\n\nconst DURATION_HEIGHT = 0.35;\nconst DURATION_ITEMS = 0.2;\nconst STAGGER = 0.05;\nconst EASE = 'power2.out';\n\n/**\n * Initialize hover-reveal animations within a scope.\n *\n * @param {Element|Document} scope Root element or document to search.\n */\nexport function initHoverReveal(scope = document) {\n const root = scope instanceof Document ? scope : scope.ownerDocument ?? document;\n const container = scope instanceof Document ? root.body : scope;\n if (!container || typeof container.querySelectorAll !== 'function') return;\n\n const cards = container.querySelectorAll('[data-sl-hover-reveal]');\n cards.forEach((card) => {\n const collapsibleItems = card.querySelectorAll('[data-sl-hover-reveal-collapsible]');\n\n const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (reducedMotion) {\n collapsibleItems.forEach((item) => {\n gsap.set(item, { height: 'auto', opacity: 1, transform: 'none', overflow: 'visible' });\n });\n return;\n }\n\n // Set initial state: collapsed\n collapsibleItems.forEach((item) => {\n gsap.set(item, { height: 0, opacity: 0, transform: 'translateY(10px)', overflow: 'hidden' });\n });\n\n let tlEnter = null;\n let tlLeave = null;\n\n const onEnter = () => {\n if (tlLeave) tlLeave.kill();\n tlEnter = gsap.timeline({ overwrite: true });\n\n // Animate each collapsible item\n collapsibleItems.forEach((item, index) => {\n // Get the auto height for this item\n const autoHeight = item.scrollHeight;\n\n tlEnter.to(item, {\n height: autoHeight,\n opacity: 1,\n transform: 'translateY(0)',\n overflow: 'visible',\n duration: DURATION_HEIGHT,\n ease: EASE,\n }, index * 0.05);\n });\n };\n\n const onLeave = () => {\n if (tlEnter) tlEnter.kill();\n tlLeave = gsap.timeline({ overwrite: true });\n\n // Collapse all items\n collapsibleItems.forEach((item, index) => {\n tlLeave.to(item, {\n height: 0,\n opacity: 0,\n transform: 'translateY(10px)',\n overflow: 'hidden',\n duration: DURATION_HEIGHT * 0.8,\n ease: EASE,\n }, index * 0.03);\n });\n };\n\n card.addEventListener('mouseenter', onEnter);\n card.addEventListener('mouseleave', onLeave);\n card.addEventListener('focusin', onEnter);\n card.addEventListener('focusout', onLeave);\n });\n}\n","/**\n * GSAP + Lenis Animation Entry Point\n *\n * Initializes scroll animations, split text, stagger effects, and smooth scroll.\n * Supports Elementor editor (reinit on content change) and prefers-reduced-motion.\n *\n * @package SocialLane_Elements\n */\n\nimport gsap from 'gsap';\nimport { ScrollTrigger } from 'gsap/ScrollTrigger';\nimport SplitText from 'gsap/SplitText';\nimport Lenis from 'lenis';\nimport { initReveal } from './utilities/reveal.js';\nimport { initStagger } from './utilities/stagger.js';\nimport { initSplitText } from './utilities/split-text.js';\nimport { initPin } from './utilities/pin.js';\nimport { initHoverReveal } from './utilities/hover-reveal.js';\n\ngsap.registerPlugin(ScrollTrigger, SplitText);\n\nconst prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\nconst isElementorPreview = () =>\n typeof document !== 'undefined' &&\n document.body &&\n document.body.classList.contains('elementor-editor-active');\n\nconst isElementorEditor = () => typeof window !== 'undefined' && window.elementorFrontend;\n\nlet lenis = null;\n\nfunction initAnimationsInScope(scope = document) {\n const root = scope instanceof Document ? scope : scope?.ownerDocument ?? document;\n const container = scope instanceof Document ? root.body : scope;\n if (!container) return;\n\n initReveal(container);\n initStagger(container);\n initSplitText(container);\n initPin(container);\n initHoverReveal(container);\n}\n\nfunction killTriggersInScope(scope) {\n const container = scope instanceof Document ? scope.body : scope;\n if (!container || typeof container.contains !== 'function') return;\n ScrollTrigger.getAll().forEach((t) => {\n if (t.trigger && container.contains(t.trigger)) {\n t.kill();\n }\n });\n}\n\nfunction initAllAnimations() {\n if (prefersReducedMotion) {\n const targets = document.querySelectorAll(\n '[data-sl-reveal], [data-sl-split], [data-sl-stagger]'\n );\n gsap.set(targets, { opacity: 1, transform: 'none' });\n document.querySelectorAll('[data-sl-stagger]').forEach((parent) => {\n gsap.set(parent.children, { opacity: 1, transform: 'none' });\n });\n return;\n }\n\n initAnimationsInScope(document);\n}\n\nfunction run() {\n if (prefersReducedMotion) {\n initAllAnimations();\n window.SocialLaneAnimations = { gsap, ScrollTrigger, SplitText, lenis: null, init: initAllAnimations };\n return;\n }\n\n if (!isElementorPreview()) {\n lenis = new Lenis({ lerp: 0.1, smoothWheel: true });\n lenis.on('scroll', ScrollTrigger.update);\n gsap.ticker.add((time) => lenis.raf(time * 1000));\n gsap.ticker.lagSmoothing(0);\n }\n\n initAllAnimations();\n\n window.SocialLaneAnimations = {\n gsap,\n ScrollTrigger,\n SplitText,\n lenis,\n init: initAllAnimations,\n initInScope: initAnimationsInScope,\n };\n\n if (isElementorEditor() && window.elementorFrontend?.hooks) {\n window.elementorFrontend.hooks.addAction(\n 'frontend/element_ready/global',\n ($scope) => {\n const el = $scope && $scope[0];\n if (el) {\n killTriggersInScope(el);\n initAnimationsInScope(el);\n }\n }\n );\n }\n}\n\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', run);\n} else {\n run();\n}\n"],"names":["gsap"],"mappings":"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"}
|