@sociallane/elements 1.0.13 → 1.0.15

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.
@@ -0,0 +1,58 @@
1
+ name: SocialLane npm/npx Gates
2
+
3
+ on:
4
+ pull_request:
5
+ paths:
6
+ - 'sociallane-elements/**'
7
+ push:
8
+ branches:
9
+ - main
10
+ paths:
11
+ - 'sociallane-elements/**'
12
+ workflow_dispatch:
13
+
14
+ jobs:
15
+ cli-smoke:
16
+ runs-on: ubuntu-latest
17
+ defaults:
18
+ run:
19
+ working-directory: sociallane-elements
20
+ steps:
21
+ - name: Checkout
22
+ uses: actions/checkout@v4
23
+
24
+ - name: Setup Node
25
+ uses: actions/setup-node@v4
26
+ with:
27
+ node-version: '20'
28
+
29
+ - name: CLI smoke tests
30
+ run: node scripts/test-cli-smoke.js
31
+
32
+ - name: List command sanity check
33
+ run: node scripts/install.js list --json
34
+
35
+ - name: Doctor command sanity check
36
+ run: node scripts/install.js doctor --json --target .
37
+
38
+ release-gate:
39
+ if: github.event_name == 'workflow_dispatch'
40
+ runs-on: ubuntu-latest
41
+ needs: cli-smoke
42
+ defaults:
43
+ run:
44
+ working-directory: sociallane-elements
45
+ steps:
46
+ - name: Checkout
47
+ uses: actions/checkout@v4
48
+
49
+ - name: Setup Node
50
+ uses: actions/setup-node@v4
51
+ with:
52
+ node-version: '20'
53
+
54
+ - name: Sync canonical widget manifest
55
+ run: node scripts/generate-widget-manifest.js
56
+
57
+ - name: Release gate (strict)
58
+ run: node scripts/release-gate.js --strict
@@ -45,7 +45,7 @@ $sections = [
45
45
  <?php esc_html_e( 'Widget Catalog Setup', 'sociallane-elements' ); ?>
46
46
  </h1>
47
47
  <p class="text-neutral-500 dark:text-neutral-400">
48
- <?php esc_html_e( 'Install SocialLane Elements via npx (cherry-pick widgets or full install), add the Widget Catalog to a page, and run the commands you need. No manual widgets.json editing when using npx add.', 'sociallane-elements' ); ?>
48
+ <?php esc_html_e( 'Install SocialLane Elements via npx (full install or component install), add the Widget Catalog to a page, and run copy-ready commands. No manual widgets.json editing when using npx add.', 'sociallane-elements' ); ?>
49
49
  </p>
50
50
  </header>
51
51
 
@@ -84,16 +84,25 @@ $sections = [
84
84
 
85
85
  <div>
86
86
  <h3 class="text-sm font-semibold text-neutral-800 dark:text-neutral-200 mb-2"><?php esc_html_e( 'Option A: Install via npx (recommended)', 'sociallane-elements' ); ?></h3>
87
- <p class="text-sm mb-2"><?php esc_html_e( 'From your WordPress root (the folder that contains wp-content), run one of:', 'sociallane-elements' ); ?></p>
88
- <p class="text-xs font-medium text-neutral-500 dark:text-neutral-400 mb-1"><?php esc_html_e( 'Cherry-pick widgets (no manual widgets.json):', 'sociallane-elements' ); ?></p>
89
- <pre class="bg-neutral-100 dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-600 rounded-lg p-4 text-sm overflow-x-auto text-neutral-800 dark:text-neutral-200"><code>npx @sociallane/elements --minimal</code></pre>
90
- <p class="text-neutral-500 dark:text-neutral-400 text-sm mt-1"><?php esc_html_e( 'Then add only the widgets you need (run from WordPress root or from the plugin directory):', 'sociallane-elements' ); ?></p>
87
+ <p class="text-sm mb-2"><?php esc_html_e( 'From your WordPress root (the folder that contains wp-content), use one of these install flows:', 'sociallane-elements' ); ?></p>
88
+
89
+ <p class="text-xs font-medium text-neutral-500 dark:text-neutral-400 mb-1"><?php esc_html_e( 'Full install (all widget components):', 'sociallane-elements' ); ?></p>
90
+ <pre class="bg-neutral-100 dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-600 rounded-lg p-4 text-sm overflow-x-auto text-neutral-800 dark:text-neutral-200"><code>npx @sociallane/elements</code></pre>
91
+ <p class="text-neutral-500 dark:text-neutral-400 text-sm mt-1"><?php esc_html_e( 'Installs the full plugin to wp-content/plugins/sociallane-elements and runs install/build automatically.', 'sociallane-elements' ); ?></p>
92
+
93
+ <p class="text-xs font-medium text-neutral-500 dark:text-neutral-400 mt-3 mb-1"><?php esc_html_e( 'Base install + add selected components/widgets:', 'sociallane-elements' ); ?></p>
94
+ <pre class="bg-neutral-100 dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-600 rounded-lg p-4 text-sm overflow-x-auto text-neutral-800 dark:text-neutral-200"><code>npx @sociallane/elements --base</code></pre>
95
+ <p class="text-neutral-500 dark:text-neutral-400 text-sm mt-1"><?php esc_html_e( 'Then add only the widgets you need:', 'sociallane-elements' ); ?></p>
91
96
  <pre class="bg-neutral-100 dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-600 rounded-lg p-4 text-sm overflow-x-auto text-neutral-800 dark:text-neutral-200 mt-2"><code>npx @sociallane/elements add hero-split faq-stacked content-block widget-filter</code></pre>
92
97
  <p class="text-neutral-500 dark:text-neutral-400 text-sm mt-2"><?php esc_html_e( 'Each add updates widgets.json and runs the build automatically. Include widget-filter if you want the Widget Catalog in Elementor.', 'sociallane-elements' ); ?></p>
93
- <p class="text-xs font-medium text-neutral-500 dark:text-neutral-400 mt-3 mb-1"><?php esc_html_e( 'Or install with all widgets:', 'sociallane-elements' ); ?></p>
94
- <pre class="bg-neutral-100 dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-600 rounded-lg p-4 text-sm overflow-x-auto text-neutral-800 dark:text-neutral-200"><code>npx @sociallane/elements</code></pre>
95
- <p class="text-neutral-500 dark:text-neutral-400 text-sm mt-1"><?php esc_html_e( 'Copies the full plugin to wp-content/plugins/sociallane-elements, runs npm install and build. Activate in WordPress → Plugins.', 'sociallane-elements' ); ?></p>
96
- <p class="text-neutral-500 dark:text-neutral-400 text-sm mt-2"><?php esc_html_e( 'Custom path: npx @sociallane/elements --minimal path/to/wp-content/plugins/sociallane-elements', 'sociallane-elements' ); ?></p>
98
+
99
+ <p class="text-xs font-medium text-neutral-500 dark:text-neutral-400 mt-3 mb-1"><?php esc_html_e( 'Custom target path:', 'sociallane-elements' ); ?></p>
100
+ <pre class="bg-neutral-100 dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-600 rounded-lg p-4 text-sm overflow-x-auto text-neutral-800 dark:text-neutral-200"><code>npx @sociallane/elements --base path/to/wp-content/plugins/sociallane-elements
101
+ npx @sociallane/elements add --target path/to/wp-content/plugins/sociallane-elements hero-split faq-stacked</code></pre>
102
+
103
+ <p class="text-xs font-medium text-neutral-500 dark:text-neutral-400 mt-3 mb-1"><?php esc_html_e( 'Helper commands:', 'sociallane-elements' ); ?></p>
104
+ <pre class="bg-neutral-100 dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-600 rounded-lg p-4 text-sm overflow-x-auto text-neutral-800 dark:text-neutral-200"><code>npx @sociallane/elements list
105
+ npx @sociallane/elements doctor --target wp-content/plugins/sociallane-elements</code></pre>
97
106
  </div>
98
107
 
99
108
  <div>
@@ -158,7 +167,14 @@ npm run build</code></pre>
158
167
  <p class="text-sm mb-2"><?php esc_html_e( 'If you add or remove widget folders by hand (e.g. submodules), sync widgets.json then build:', 'sociallane-elements' ); ?></p>
159
168
  <pre class="bg-neutral-100 dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-600 rounded-lg p-4 text-sm overflow-x-auto text-neutral-800 dark:text-neutral-200"><code>npm run sync-widgets
160
169
  npm run build</code></pre>
161
- <p class="text-neutral-500 dark:text-neutral-400 text-sm mt-2"><?php esc_html_e( 'Or use npx @sociallane/elements add &lt;slug&gt; to add widgets without editing widgets.json.', 'sociallane-elements' ); ?></p>
170
+ <p class="text-neutral-500 dark:text-neutral-400 text-sm mt-2"><?php esc_html_e( 'Or use npx @sociallane/elements add <slug> to add widgets without editing widgets.json.', 'sociallane-elements' ); ?></p>
171
+ <pre class="bg-neutral-100 dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-600 rounded-lg p-4 text-sm overflow-x-auto text-neutral-800 dark:text-neutral-200 mt-2"><code>npx @sociallane/elements add hero-split faq-stacked
172
+ npx @sociallane/elements add --only widget-filter</code></pre>
173
+ </div>
174
+ <div>
175
+ <h3 class="text-sm font-semibold text-neutral-800 dark:text-neutral-200 mb-2"><?php esc_html_e( 'Diagnostics', 'sociallane-elements' ); ?></h3>
176
+ <pre class="bg-neutral-100 dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-600 rounded-lg p-4 text-sm overflow-x-auto text-neutral-800 dark:text-neutral-200"><code>npx @sociallane/elements doctor --target wp-content/plugins/sociallane-elements
177
+ npx @sociallane/elements list --json</code></pre>
162
178
  </div>
163
179
  <div>
164
180
  <h3 class="text-sm font-semibold text-neutral-800 dark:text-neutral-200 mb-2"><?php esc_html_e( 'Clean reinstall (node_modules)', 'sociallane-elements' ); ?></h3>
@@ -184,8 +200,8 @@ npm run build</code></pre>
184
200
  </summary>
185
201
  <div class="p-5 pt-0 border-t border-neutral-200 dark:border-neutral-700">
186
202
  <ul class="space-y-2 list-disc list-inside ml-2">
187
- <li><strong><?php esc_html_e( 'Copy single widget', 'sociallane-elements' ); ?></strong> — <?php esc_html_e( 'Each card shows the full npm install command; use the Copy button next to it.', 'sociallane-elements' ); ?></li>
188
- <li><strong><?php esc_html_e( 'Collection', 'sociallane-elements' ); ?></strong> — <?php esc_html_e( 'Check “Add to collection” on the widgets you want, then use “Copy npm install in the sidebar to get one command that installs all selected packages.', 'sociallane-elements' ); ?></li>
203
+ <li><strong><?php esc_html_e( 'Copy single widget', 'sociallane-elements' ); ?></strong> — <?php esc_html_e( 'Each card shows the install command in the selected format (npm install or npx add); use the Copy button next to it.', 'sociallane-elements' ); ?></li>
204
+ <li><strong><?php esc_html_e( 'Collection', 'sociallane-elements' ); ?></strong> — <?php esc_html_e( 'Check “Add to collection” on the widgets you want, then copy one combined install command from the sidebar.', 'sociallane-elements' ); ?></li>
189
205
  <li><strong><?php esc_html_e( 'Copy Name', 'sociallane-elements' ); ?></strong> — <?php esc_html_e( 'Copies the widget slug (e.g. hero-split) for use in widgets.json or docs.', 'sociallane-elements' ); ?></li>
190
206
  </ul>
191
207
  </div>
@@ -49,56 +49,72 @@ cd wp-content/plugins/sociallane-elements && npm install && npm run build
49
49
 
50
50
  ---
51
51
 
52
- ## Option 3: Install from npm (automated)
52
+ ## Option 3: Install from npm / npx (automated)
53
53
 
54
- **Cherry-pick workflow (recommended):** install the plugin with no widgets, then add only the widgets you want:
54
+ ### A) Install everything (core + all widget components)
55
55
 
56
56
  ```bash
57
57
  # From your WordPress root (directory that contains wp-content)
58
- npx @sociallane/elements --base
58
+ npx @sociallane/elements
59
59
  ```
60
60
 
61
- Then add widgets by slug (no manual `widgets.json` editing):
61
+ This installs `sociallane-elements` to `wp-content/plugins/sociallane-elements`, installs dependencies, syncs widgets, and builds assets.
62
+
63
+ ### B) Install only base plugin, then add selected components/widgets
64
+
65
+ Use this when you want to keep the plugin minimal and import widget components yourself.
62
66
 
63
67
  ```bash
68
+ # 1) Install base plugin only (no widget component folders imported)
69
+ npx @sociallane/elements --base
70
+
71
+ # 2) Add only the widgets you want
64
72
  npx @sociallane/elements add hero-split faq-stacked content-block widget-filter
65
73
  ```
66
74
 
67
- Each `add` updates `widgets.json` and runs the build. You can run `add` anytime to add more widgets.
75
+ Each `add` command updates `widgets.json`, copies only those widget component folders, and runs install/build.
76
+
77
+ ### C) Install a single widget package
68
78
 
69
- **Full install** (all widgets included):
79
+ Use per-widget packages when you want one command per widget:
70
80
 
71
81
  ```bash
72
- npx @sociallane/elements
82
+ # From your WordPress root or wp-content/plugins
83
+ npx @sociallane/widget-content-block
84
+ npx @sociallane/widget-faq-stacked
73
85
  ```
74
86
 
75
- This copies the full plugin to `wp-content/plugins/sociallane-elements`, runs `npm install` (syncs `widgets.json` and builds). Activate in WordPress → Plugins.
87
+ Each `@sociallane/widget-<slug>` package installs base plugin if needed, then adds that widget.
76
88
 
77
- **Custom path:**
89
+ ### D) Use custom target path (run from anywhere)
78
90
 
79
91
  ```bash
92
+ # Base install to explicit target
80
93
  npx @sociallane/elements --base path/to/wp-content/plugins/sociallane-elements
94
+
95
+ # Add widgets to explicit target
81
96
  npx @sociallane/elements add --target path/to/wp-content/plugins/sociallane-elements hero-split faq-stacked
82
97
  ```
83
98
 
84
- **Single widget (per-widget packages):**
85
-
86
- You can install one widget at a time via its own package. This installs the SocialLane Elements plugin if needed, then adds that widget and builds:
99
+ ### E) Useful helper commands
87
100
 
88
101
  ```bash
89
- # From your WordPress root or wp-content/plugins
90
- npx @sociallane/widget-content-block
91
- npx @sociallane/widget-faq-stacked
92
- ```
102
+ # List all available widget slugs
103
+ npx @sociallane/elements list
93
104
 
94
- Each package is published as `@sociallane/widget-<slug>`. Use this when you only need one or two widgets and want a single command per widget.
105
+ # Machine-readable list
106
+ npx @sociallane/elements list --json
107
+
108
+ # Validate environment + plugin install state
109
+ npx @sociallane/elements doctor --target path/to/wp-content/plugins/sociallane-elements
110
+ ```
95
111
 
96
112
  ---
97
113
 
98
114
  ## Post-install
99
115
 
100
116
  1. **Build:** Runs automatically after `npm install`. To run manually: `npm run build`.
101
- 2. **Widget selection:** Edit `widgets.json` to load only the widgets you need. If missing, `npm run setup` creates it from `widgets.json.minimal`.
117
+ 2. **Widget selection:** Use `npx @sociallane/elements add <slug...>` to add selected widgets, or edit `widgets.json` directly.
102
118
  3. **Production mode:** Add to `wp-config.php` if styles don't load:
103
119
  ```php
104
120
  define( 'SOCIALLANE_ELEMENTS_VITE_PRODUCTION', true );
@@ -0,0 +1,84 @@
1
+ <?php
2
+ /**
3
+ * Disable Elementor widgets except Container.
4
+ *
5
+ * @package SocialLane_Elements
6
+ */
7
+
8
+ namespace SocialLane\Elements;
9
+
10
+ use Elementor\Widgets_Manager;
11
+
12
+ if ( ! defined( 'ABSPATH' ) ) {
13
+ exit;
14
+ }
15
+
16
+ /**
17
+ * Class Disable_Elementor_Widgets
18
+ */
19
+ class Disable_Elementor_Widgets {
20
+
21
+ /**
22
+ * Hook into Elementor widget registration.
23
+ */
24
+ public static function init(): void {
25
+ add_action( 'elementor/widgets/register', [ __CLASS__, 'disable_non_sociallane_widgets' ], 1000 );
26
+ }
27
+
28
+ /**
29
+ * Disable non-container widgets after Elementor has registered all widgets.
30
+ *
31
+ * Keeps:
32
+ * - Container widget (name: container), if present
33
+ *
34
+ * Optional:
35
+ * - define( 'SOCIALLANE_KEEP_SOCIALLANE_WIDGETS', true );
36
+ * to keep SocialLane widgets as well.
37
+ *
38
+ * @param Widgets_Manager $widgets_manager Elementor widgets manager.
39
+ */
40
+ public static function disable_non_sociallane_widgets( Widgets_Manager $widgets_manager ): void {
41
+ // Allow opt-out for edge cases via wp-config.php:
42
+ // define( 'SOCIALLANE_DISABLE_ELEMENTOR_WIDGETS', false );
43
+ if ( defined( 'SOCIALLANE_DISABLE_ELEMENTOR_WIDGETS' ) && SOCIALLANE_DISABLE_ELEMENTOR_WIDGETS === false ) {
44
+ return;
45
+ }
46
+
47
+ if ( ! method_exists( $widgets_manager, 'get_widget_types' ) ) {
48
+ return;
49
+ }
50
+
51
+ $widget_types = $widgets_manager->get_widget_types();
52
+ if ( ! is_array( $widget_types ) ) {
53
+ return;
54
+ }
55
+
56
+ $keep_sociallane = defined( 'SOCIALLANE_KEEP_SOCIALLANE_WIDGETS' ) && SOCIALLANE_KEEP_SOCIALLANE_WIDGETS;
57
+
58
+ foreach ( $widget_types as $widget ) {
59
+ if ( ! is_object( $widget ) || ! method_exists( $widget, 'get_name' ) ) {
60
+ continue;
61
+ }
62
+
63
+ $widget_name = (string) $widget->get_name();
64
+ $widget_class = get_class( $widget );
65
+
66
+ $is_container = $widget_name === 'container';
67
+ $is_sociallane = $keep_sociallane && str_starts_with( $widget_class, __NAMESPACE__ . '\\' );
68
+
69
+ if ( $is_container || $is_sociallane ) {
70
+ continue;
71
+ }
72
+
73
+ if ( method_exists( $widgets_manager, 'unregister' ) ) {
74
+ $widgets_manager->unregister( $widget_name );
75
+ continue;
76
+ }
77
+
78
+ // Backward compatibility for older Elementor APIs.
79
+ if ( method_exists( $widgets_manager, 'unregister_widget_type' ) ) {
80
+ $widgets_manager->unregister_widget_type( $widget_name );
81
+ }
82
+ }
83
+ }
84
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sociallane/elements",
3
- "version": "1.0.13",
3
+ "version": "1.0.15",
4
4
  "description": "Elementor widgets and elements with Tailwind CSS for SocialLane. WordPress plugin.",
5
5
  "type": "module",
6
6
  "private": false,
@@ -30,8 +30,13 @@
30
30
  "postinstall": "node scripts/postinstall.js",
31
31
  "setup": "bash scripts/setup.sh",
32
32
  "sync-widgets": "node scripts/sync-widgets.js",
33
+ "manifest:widgets": "node scripts/generate-widget-manifest.js",
34
+ "generate:widget-table": "node scripts/generate-widget-table.js",
33
35
  "build:widget-packages": "node scripts/build-widget-packages.js",
34
36
  "publish:widgets": "node scripts/build-widget-packages.js && node scripts/publish-widget-packages.js",
37
+ "test:cli-smoke": "node scripts/test-cli-smoke.js",
38
+ "release:check": "node scripts/release-gate.js --strict",
39
+ "release:check:local": "node scripts/release-gate.js --strict --skip-registry",
35
40
  "reinstall": "rm -rf node_modules && npm install",
36
41
  "format": "prettier --write .",
37
42
  "format:check": "prettier --check ."
@@ -61,6 +61,7 @@ class Plugin {
61
61
 
62
62
  add_action( 'elementor/widgets/register', [ $this->widgets_loader, 'register_widgets' ] );
63
63
  add_action( 'elementor/elements/categories_registered', [ $this->widgets_loader, 'register_categories' ] );
64
+ Disable_Elementor_Widgets::init();
64
65
 
65
66
  // Disable Elementor and Hello theme reset CSS so Tailwind/base controls the document.
66
67
  Disable_Reset_Css::init();
@@ -0,0 +1,291 @@
1
+ {
2
+ "schema_version": 1,
3
+ "generated_at": "2026-02-10T09:16:15.290Z",
4
+ "source": "packages/widgets",
5
+ "widgets": [
6
+ {
7
+ "slug": "bento-grid",
8
+ "package": "@sociallane/widget-bento-grid"
9
+ },
10
+ {
11
+ "slug": "bento-grid-4",
12
+ "package": "@sociallane/widget-bento-grid-4"
13
+ },
14
+ {
15
+ "slug": "bento-grid-5",
16
+ "package": "@sociallane/widget-bento-grid-5"
17
+ },
18
+ {
19
+ "slug": "bento-grid-6",
20
+ "package": "@sociallane/widget-bento-grid-6"
21
+ },
22
+ {
23
+ "slug": "bento-portfolio",
24
+ "package": "@sociallane/widget-bento-portfolio"
25
+ },
26
+ {
27
+ "slug": "bento-portfolio-4",
28
+ "package": "@sociallane/widget-bento-portfolio-4"
29
+ },
30
+ {
31
+ "slug": "bento-portfolio-5",
32
+ "package": "@sociallane/widget-bento-portfolio-5"
33
+ },
34
+ {
35
+ "slug": "bento-portfolio-6",
36
+ "package": "@sociallane/widget-bento-portfolio-6"
37
+ },
38
+ {
39
+ "slug": "blog-grid",
40
+ "package": "@sociallane/widget-blog-grid"
41
+ },
42
+ {
43
+ "slug": "card-hover-reveal",
44
+ "package": "@sociallane/widget-card-hover-reveal"
45
+ },
46
+ {
47
+ "slug": "client-logos",
48
+ "package": "@sociallane/widget-client-logos"
49
+ },
50
+ {
51
+ "slug": "content-block",
52
+ "package": "@sociallane/widget-content-block"
53
+ },
54
+ {
55
+ "slug": "cta-banner",
56
+ "package": "@sociallane/widget-cta-banner"
57
+ },
58
+ {
59
+ "slug": "cta-notify",
60
+ "package": "@sociallane/widget-cta-notify"
61
+ },
62
+ {
63
+ "slug": "cta-split",
64
+ "package": "@sociallane/widget-cta-split"
65
+ },
66
+ {
67
+ "slug": "faq-centered",
68
+ "package": "@sociallane/widget-faq-centered"
69
+ },
70
+ {
71
+ "slug": "faq-split",
72
+ "package": "@sociallane/widget-faq-split"
73
+ },
74
+ {
75
+ "slug": "faq-stacked",
76
+ "package": "@sociallane/widget-faq-stacked"
77
+ },
78
+ {
79
+ "slug": "feature-grid",
80
+ "package": "@sociallane/widget-feature-grid"
81
+ },
82
+ {
83
+ "slug": "feature-grid-centered",
84
+ "package": "@sociallane/widget-feature-grid-centered"
85
+ },
86
+ {
87
+ "slug": "feature-list",
88
+ "package": "@sociallane/widget-feature-list"
89
+ },
90
+ {
91
+ "slug": "feature-list-cta",
92
+ "package": "@sociallane/widget-feature-list-cta"
93
+ },
94
+ {
95
+ "slug": "footer",
96
+ "package": "@sociallane/widget-footer"
97
+ },
98
+ {
99
+ "slug": "footer-brand",
100
+ "package": "@sociallane/widget-footer-brand"
101
+ },
102
+ {
103
+ "slug": "footer-links-contact",
104
+ "package": "@sociallane/widget-footer-links-contact"
105
+ },
106
+ {
107
+ "slug": "form-contact",
108
+ "package": "@sociallane/widget-form-contact"
109
+ },
110
+ {
111
+ "slug": "grid-case-studies",
112
+ "package": "@sociallane/widget-grid-case-studies"
113
+ },
114
+ {
115
+ "slug": "grid-components",
116
+ "package": "@sociallane/widget-grid-components"
117
+ },
118
+ {
119
+ "slug": "grid-team",
120
+ "package": "@sociallane/widget-grid-team"
121
+ },
122
+ {
123
+ "slug": "hero-announcement",
124
+ "package": "@sociallane/widget-hero-announcement"
125
+ },
126
+ {
127
+ "slug": "hero-centered-image",
128
+ "package": "@sociallane/widget-hero-centered-image"
129
+ },
130
+ {
131
+ "slug": "hero-collage",
132
+ "package": "@sociallane/widget-hero-collage"
133
+ },
134
+ {
135
+ "slug": "hero-overlay",
136
+ "package": "@sociallane/widget-hero-overlay"
137
+ },
138
+ {
139
+ "slug": "hero-overlay-single",
140
+ "package": "@sociallane/widget-hero-overlay-single"
141
+ },
142
+ {
143
+ "slug": "hero-overlay-slider",
144
+ "package": "@sociallane/widget-hero-overlay-slider"
145
+ },
146
+ {
147
+ "slug": "hero-saas-centered",
148
+ "package": "@sociallane/widget-hero-saas-centered"
149
+ },
150
+ {
151
+ "slug": "hero-saas-split",
152
+ "package": "@sociallane/widget-hero-saas-split"
153
+ },
154
+ {
155
+ "slug": "hero-saas-stacked",
156
+ "package": "@sociallane/widget-hero-saas-stacked"
157
+ },
158
+ {
159
+ "slug": "hero-split",
160
+ "package": "@sociallane/widget-hero-split"
161
+ },
162
+ {
163
+ "slug": "hero-stacked-image",
164
+ "package": "@sociallane/widget-hero-stacked-image"
165
+ },
166
+ {
167
+ "slug": "intro-pattern",
168
+ "package": "@sociallane/widget-intro-pattern"
169
+ },
170
+ {
171
+ "slug": "intro-text",
172
+ "package": "@sociallane/widget-intro-text"
173
+ },
174
+ {
175
+ "slug": "logo-grid-centered",
176
+ "package": "@sociallane/widget-logo-grid-centered"
177
+ },
178
+ {
179
+ "slug": "logo-grid-row",
180
+ "package": "@sociallane/widget-logo-grid-row"
181
+ },
182
+ {
183
+ "slug": "logo-grid-split",
184
+ "package": "@sociallane/widget-logo-grid-split"
185
+ },
186
+ {
187
+ "slug": "nav-centered",
188
+ "package": "@sociallane/widget-nav-centered"
189
+ },
190
+ {
191
+ "slug": "nav-compact",
192
+ "package": "@sociallane/widget-nav-compact"
193
+ },
194
+ {
195
+ "slug": "nav-default",
196
+ "package": "@sociallane/widget-nav-default"
197
+ },
198
+ {
199
+ "slug": "nav-floating",
200
+ "package": "@sociallane/widget-nav-floating"
201
+ },
202
+ {
203
+ "slug": "nav-minimal",
204
+ "package": "@sociallane/widget-nav-minimal"
205
+ },
206
+ {
207
+ "slug": "newsletter",
208
+ "package": "@sociallane/widget-newsletter"
209
+ },
210
+ {
211
+ "slug": "newsletter-card",
212
+ "package": "@sociallane/widget-newsletter-card"
213
+ },
214
+ {
215
+ "slug": "newsletter-section",
216
+ "package": "@sociallane/widget-newsletter-section"
217
+ },
218
+ {
219
+ "slug": "outreach-dashboard",
220
+ "package": "@sociallane/widget-outreach-dashboard"
221
+ },
222
+ {
223
+ "slug": "page-hero-center",
224
+ "package": "@sociallane/widget-page-hero-center"
225
+ },
226
+ {
227
+ "slug": "page-hero-left",
228
+ "package": "@sociallane/widget-page-hero-left"
229
+ },
230
+ {
231
+ "slug": "pipeline-dashboard",
232
+ "package": "@sociallane/widget-pipeline-dashboard"
233
+ },
234
+ {
235
+ "slug": "posts-grid",
236
+ "package": "@sociallane/widget-posts-grid"
237
+ },
238
+ {
239
+ "slug": "posts-grid-overlay",
240
+ "package": "@sociallane/widget-posts-grid-overlay"
241
+ },
242
+ {
243
+ "slug": "pricing-table",
244
+ "package": "@sociallane/widget-pricing-table"
245
+ },
246
+ {
247
+ "slug": "sales-dashboard",
248
+ "package": "@sociallane/widget-sales-dashboard"
249
+ },
250
+ {
251
+ "slug": "section-stats",
252
+ "package": "@sociallane/widget-section-stats"
253
+ },
254
+ {
255
+ "slug": "services",
256
+ "package": "@sociallane/widget-services"
257
+ },
258
+ {
259
+ "slug": "simple-page-hero",
260
+ "package": "@sociallane/widget-simple-page-hero"
261
+ },
262
+ {
263
+ "slug": "social-proof",
264
+ "package": "@sociallane/widget-social-proof"
265
+ },
266
+ {
267
+ "slug": "social-proof-trust",
268
+ "package": "@sociallane/widget-social-proof-trust"
269
+ },
270
+ {
271
+ "slug": "testimonial-quote",
272
+ "package": "@sociallane/widget-testimonial-quote"
273
+ },
274
+ {
275
+ "slug": "testimonials-bento",
276
+ "package": "@sociallane/widget-testimonials-bento"
277
+ },
278
+ {
279
+ "slug": "testimonials-grid",
280
+ "package": "@sociallane/widget-testimonials-grid"
281
+ },
282
+ {
283
+ "slug": "testimonials-masonry",
284
+ "package": "@sociallane/widget-testimonials-masonry"
285
+ },
286
+ {
287
+ "slug": "widget-filter",
288
+ "package": "@sociallane/widget-widget-filter"
289
+ }
290
+ ]
291
+ }