diff --git a/modules/rinbox/components/folk-inbox-client.ts b/modules/rinbox/components/folk-inbox-client.ts
index 139ccf6..1e88d94 100644
--- a/modules/rinbox/components/folk-inbox-client.ts
+++ b/modules/rinbox/components/folk-inbox-client.ts
@@ -17,6 +17,7 @@ class FolkInboxClient extends HTMLElement {
private filter: "all" | "open" | "snoozed" | "closed" = "all";
private helpOpen = false;
private composeOpen = false;
+ private showingSampleData = false;
private demoApprovals: any[] = [
{
id: "a1", subject: "Re: Q1 Budget approval for rSpace infrastructure", status: "PENDING",
@@ -92,11 +93,17 @@ class FolkInboxClient extends HTMLElement {
this.mailboxes = data.mailboxes || [];
}
} catch { /* ignore */ }
+
+ if (this.mailboxes.length === 0) {
+ this.showingSampleData = true;
+ this.loadDemoData();
+ return;
+ }
this.render();
}
private async loadThreads(slug: string) {
- if (this.space === "demo") {
+ if (this.space === "demo" || this.showingSampleData) {
this.threads = this.demoThreads[slug] || [];
if (this.filter !== "all") this.threads = this.threads.filter(t => t.status === this.filter);
this.render();
@@ -115,7 +122,7 @@ class FolkInboxClient extends HTMLElement {
}
private async loadThread(id: string) {
- if (this.space === "demo") {
+ if (this.space === "demo" || this.showingSampleData) {
const all = [...(this.demoThreads.team || []), ...(this.demoThreads.support || [])];
this.currentThread = all.find(t => t.id === id) || null;
if (this.currentThread) {
@@ -135,7 +142,7 @@ class FolkInboxClient extends HTMLElement {
}
private async loadApprovals() {
- if (this.space === "demo") { this.approvals = this.demoApprovals; this.render(); return; }
+ if (this.space === "demo" || this.showingSampleData) { this.approvals = this.demoApprovals; this.render(); return; }
try {
const base = window.location.pathname.replace(/\/$/, "");
const q = this.currentMailbox ? `?mailbox=${this.currentMailbox.slug}` : "";
@@ -306,6 +313,8 @@ class FolkInboxClient extends HTMLElement {
.help-step-text { font-size: 0.8rem; color: #cbd5e1; line-height: 1.5; }
.help-cta { display: inline-block; padding: 0.6rem 1.5rem; background: linear-gradient(135deg, #6366f1, #0891b2); color: white; border-radius: 8px; text-decoration: none; font-size: 0.85rem; font-weight: 600; }
+ .sample-banner { padding: 8px 16px; background: rgba(99,102,241,0.12); border: 1px solid rgba(99,102,241,0.25); border-radius: 8px; color: #a5b4fc; font-size: 13px; text-align: center; margin-bottom: 12px; }
+
@media (max-width: 600px) {
.mailbox-grid { grid-template-columns: 1fr; }
.thread-from { max-width: 100px; }
@@ -315,6 +324,7 @@ class FolkInboxClient extends HTMLElement {
${this.renderNav()}
+ ${this.showingSampleData ? '
Showing sample data — create a mailbox to get started
' : ''}
${this.renderView()}
${this.helpOpen ? this.renderHelp() : ""}
@@ -699,7 +709,7 @@ class FolkInboxClient extends HTMLElement {
const submitCompose = this.shadow.querySelector("[data-action='submit-compose']");
if (submitCompose) {
submitCompose.addEventListener("click", async () => {
- if (this.space === "demo") {
+ if (this.space === "demo" || this.showingSampleData) {
alert("Compose is disabled in demo mode. In a live space, this would submit the email for team approval.");
return;
}
@@ -724,7 +734,7 @@ class FolkInboxClient extends HTMLElement {
// Approval actions
this.shadow.querySelectorAll("[data-approve]").forEach((btn) => {
btn.addEventListener("click", async () => {
- if (this.space === "demo") { alert("Approvals are disabled in demo mode."); return; }
+ if (this.space === "demo" || this.showingSampleData) { alert("Approvals are disabled in demo mode."); return; }
const id = (btn as HTMLElement).dataset.approve!;
const base = window.location.pathname.replace(/\/$/, "");
await fetch(`${base}/api/approvals/${id}/sign`, {
@@ -737,7 +747,7 @@ class FolkInboxClient extends HTMLElement {
});
this.shadow.querySelectorAll("[data-reject]").forEach((btn) => {
btn.addEventListener("click", async () => {
- if (this.space === "demo") { alert("Approvals are disabled in demo mode."); return; }
+ if (this.space === "demo" || this.showingSampleData) { alert("Approvals are disabled in demo mode."); return; }
const id = (btn as HTMLElement).dataset.reject!;
const base = window.location.pathname.replace(/\/$/, "");
await fetch(`${base}/api/approvals/${id}/sign`, {
diff --git a/modules/rphotos/components/folk-photo-gallery.ts b/modules/rphotos/components/folk-photo-gallery.ts
index 04bdc66..16d43f9 100644
--- a/modules/rphotos/components/folk-photo-gallery.ts
+++ b/modules/rphotos/components/folk-photo-gallery.ts
@@ -43,6 +43,7 @@ class FolkPhotoGallery extends HTMLElement {
private lightboxAsset: Asset | null = null;
private loading = false;
private error = "";
+ private showingSampleData = false;
constructor() {
super();
@@ -108,7 +109,7 @@ class FolkPhotoGallery extends HTMLElement {
}
private isDemo(): boolean {
- return this.space === "demo";
+ return this.space === "demo" || this.showingSampleData;
}
private getApiBase(): string {
@@ -136,7 +137,14 @@ class FolkPhotoGallery extends HTMLElement {
this.albums = albumsData.albums || [];
this.assets = assetsData.assets || [];
} catch {
- this.error = "Could not connect to photo service. Make sure Immich is running.";
+ // Fall through to empty check below
+ }
+
+ if (this.albums.length === 0 && this.assets.length === 0) {
+ this.showingSampleData = true;
+ this.loading = false;
+ this.loadDemoData();
+ return;
}
this.loading = false;
@@ -330,6 +338,8 @@ class FolkPhotoGallery extends HTMLElement {
text-shadow: 0 2px 6px rgba(0,0,0,0.5);
}
+ .sample-banner { padding: 8px 16px; background: rgba(99,102,241,0.12); border: 1px solid rgba(99,102,241,0.25); border-radius: 8px; color: #a5b4fc; font-size: 13px; text-align: center; margin-bottom: 12px; }
+
@media (max-width: 480px) {
.albums-grid { grid-template-columns: 1fr; }
.photo-grid { grid-template-columns: repeat(2, 1fr); }
@@ -363,6 +373,8 @@ class FolkPhotoGallery extends HTMLElement {
+ ${this.showingSampleData ? 'Showing sample data — connect Immich to see your photos
' : ''}
+
${!hasContent ? `