Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 68 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ Lightweight social sharing component for web applications. Zero dependencies, fr

- 🌐 Multiple platforms: WhatsApp, Facebook, X, LinkedIn, Telegram, Reddit, Email, Pinterest
- 🎯 Zero dependencies - pure vanilla JavaScript
- ⚛️ Framework support: React, Preact, Next.js, Vue, Angular, or plain HTML
- ⚛️ Framework support: React, Preact, Next.js, Vue, Angular, Rails, Django, Laravel, or plain HTML
- 🔄 Auto-detects current URL and page title
- 📱 Fully responsive and mobile-ready
- 🎨 Customizable themes (dark/light)
Expand Down Expand Up @@ -111,6 +111,73 @@ No matter which framework you use, integration always follows the same 3 steps:

> 💡 Pick your framework below for the full copy-paste snippet:

For server-rendered apps like **Rails**, **Django**, and **Laravel**, use the same CDN pattern in your base layout template: CSS in `<head>`, JS before `</body>`, then initialize `new SocialShareButton(...)`.

<details>
<summary><b>🖥️ Server-Rendered Frameworks (Rails / Django / Laravel)</b></summary>

### Ruby on Rails (`app/views/layouts/application.html.erb`)

```erb
<%# In <head> %>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/social-share-button/dist/social-share-button.css">

<%# Before </body> %>
<script src="https://cdn.jsdelivr.net/npm/social-share-button/dist/social-share-button.js"></script>
<div id="share-button"></div>
<script>
new SocialShareButton({
container: '#share-button',
url: window.location.href,
title: document.title,
theme: 'dark',
buttonText: 'Share'
});
</script>
```

### Django (`templates/base.html`)

```django
{# In <head> #}
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/social-share-button/dist/social-share-button.css">

{# Before </body> #}
<script src="https://cdn.jsdelivr.net/npm/social-share-button/dist/social-share-button.js"></script>
<div id="share-button"></div>
<script>
new SocialShareButton({
container: '#share-button',
url: window.location.href,
title: document.title,
theme: 'dark',
buttonText: 'Share'
});
</script>
```

### Laravel (`resources/views/layouts/app.blade.php`)

```blade
{{-- In <head> --}}
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/social-share-button/dist/social-share-button.css">

{{-- Before </body> --}}
<script src="https://cdn.jsdelivr.net/npm/social-share-button/dist/social-share-button.js"></script>
<div id="share-button"></div>
<script>
new SocialShareButton({
container: '#share-button',
url: window.location.href,
title: document.title,
theme: 'dark',
buttonText: 'Share'
});
</script>
```

</details>

<details>
<summary><b>📦 Create React App</b></summary>

Expand Down
119 changes: 97 additions & 22 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -474,6 +474,78 @@ <h2>⚛️ Preact Integration</h2>
</code>
</div>
</div>

<!-- Server-Rendered Frameworks Integration (Rails / Django / Laravel) -->
<div class="demo-section">
<h2>🖥️ Server-Rendered Frameworks (Rails / Django / Laravel)</h2>
<p>
Integration pattern is the same for all three: include CSS in <code>&lt;head&gt;</code>,
include JS before <code>&lt;/body&gt;</code>, add a container, then initialize with a
small script.
</p>

<h3 style="color: #fff; margin-top: 10px">
Ruby on Rails (app/views/layouts/application.html.erb)
</h3>
<div class="code-block">
<button type="button" class="copy-btn" aria-label="Copy code">Copy</button>
<span
class="copy-status"
aria-live="polite"
style="position: absolute; left: -9999px"
></span>
<code>
&lt;%# In &lt;head&gt; %&gt; &lt;link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/social-share-button/dist/social-share-button.css"&gt;
&lt;%# Before &lt;/body&gt; %&gt; &lt;script
src="https://cdn.jsdelivr.net/npm/social-share-button/dist/social-share-button.js"&gt;&lt;/script&gt;
&lt;div id="share-button"&gt;&lt;/div&gt; &lt;script&gt; new SocialShareButton({
container: '#share-button', url: window.location.href, title: document.title, theme:
'dark', buttonText: 'Share' }); &lt;/script&gt;
</code>
</div>

<h3 style="color: #fff; margin-top: 10px">Django (templates/base.html)</h3>
<div class="code-block">
<button type="button" class="copy-btn" aria-label="Copy code">Copy</button>
<span
class="copy-status"
aria-live="polite"
style="position: absolute; left: -9999px"
></span>
<code>
{# In &lt;head&gt; #} &lt;link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/social-share-button/dist/social-share-button.css"&gt;
{# Before &lt;/body&gt; #} &lt;script
src="https://cdn.jsdelivr.net/npm/social-share-button/dist/social-share-button.js"&gt;&lt;/script&gt;
&lt;div id="share-button"&gt;&lt;/div&gt; &lt;script&gt; new SocialShareButton({
container: '#share-button', url: window.location.href, title: document.title, theme:
'dark', buttonText: 'Share' }); &lt;/script&gt;
</code>
</div>

<h3 style="color: #fff; margin-top: 10px">
Laravel (resources/views/layouts/app.blade.php)
</h3>
<div class="code-block">
<button type="button" class="copy-btn" aria-label="Copy code">Copy</button>
<span
class="copy-status"
aria-live="polite"
style="position: absolute; left: -9999px"
></span>
<code>
{{-- In &lt;head&gt; --}} &lt;link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/social-share-button/dist/social-share-button.css"&gt;
{{-- Before &lt;/body&gt; --}} &lt;script
src="https://cdn.jsdelivr.net/npm/social-share-button/dist/social-share-button.js"&gt;&lt;/script&gt;
&lt;div id="share-button"&gt;&lt;/div&gt; &lt;script&gt; new SocialShareButton({
container: '#share-button', url: window.location.href, title: document.title, theme:
'dark', buttonText: 'Share' }); &lt;/script&gt;
</code>
</div>
</div>

<!-- CTA Section -->
<div class="cta-section">
<h2 style="color: #fff; margin-bottom: 20px">Ready to Get Started?</h2>
Expand Down Expand Up @@ -676,37 +748,40 @@ <h2 style="color: #fff; margin-bottom: 20px">Ready to Get Started?</h2>
clearTimeout(button.copyResetTimer);
}

navigator.clipboard.writeText(text).then(() => {
if (statusSpan && statusSpan.classList.contains("copy-status")) {
statusSpan.textContent = "Code copied to clipboard";
}

button.textContent = "Copied!";

button.copyResetTimer = setTimeout(() => {
button.textContent = originalText;

navigator.clipboard
.writeText(text)
.then(() => {
if (statusSpan && statusSpan.classList.contains("copy-status")) {
statusSpan.textContent = "";
statusSpan.textContent = "Code copied to clipboard";
}
}, 2000);
}).catch((error) => {
console.error("Failed to copy to clipboard", error);

button.textContent = originalText;
button.textContent = "Copied!";

button.copyResetTimer = setTimeout(() => {
button.textContent = originalText;

if (statusSpan && statusSpan.classList.contains("copy-status")) {
statusSpan.textContent = "Failed to copy to clipboard";
}
if (statusSpan && statusSpan.classList.contains("copy-status")) {
statusSpan.textContent = "";
}
}, 2000);
})
.catch((error) => {
console.error("Failed to copy to clipboard", error);

button.copyResetTimer = setTimeout(() => {
button.textContent = originalText;

if (statusSpan && statusSpan.classList.contains("copy-status")) {
statusSpan.textContent = "";
statusSpan.textContent = "Failed to copy to clipboard";
}
}, 2000);
});

button.copyResetTimer = setTimeout(() => {
button.textContent = originalText;

if (statusSpan && statusSpan.classList.contains("copy-status")) {
statusSpan.textContent = "";
}
}, 2000);
});
});
});
});
Expand Down
2 changes: 2 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading