// share/Share.jsx — Share tab screens. // ShareList — root: active links + subscription URL + revoked // ShareCreate — large sheet: scope picker + expiry + detail toggle // ShareDetail — per-link inspector: stats + revoke // ShareSubscription — personal token-based .ics // ShareEmpty — no links yet function ShareList({ dark = false }) { return ( 3 active · 12 views today} trailing={<>}/> {/* Personal subscription card */}
Your subscription URL
Lukas · all feeds
Subscribe from any device · token-based .ics
Always-on
https://portal.lukas.dev/i/a8c5…2f9.ics
Copy · Show QR · Rotate token
{/* Stats */}
Active
3
Views · 7d
128
Subscribers
5
{/* Active links */}
Work · this week
1 feed · Mar 10 – 16 · times hidden
Active
portal.lukas.dev/s/aB7r2dHj…
42 views · expires Mar 23
Manage
University · semester
2 feeds · Jan 8 – Jun 7 · full details
Active
portal.lukas.dev/s/9p3qLm…
74 views · expires Jun 7
Manage
Family · shared with Maya
3 feeds · never expires · full details
Active
portal.lukas.dev/s/k7Bm…
12 views · no expiry
Manage
{/* Revoked */}
Recruiter screen · single day
Revoked Mar 14 · was Feb 28
Revoked
Travel agent · expired
Expired Mar 6 · was Mar 1 – 6
Expired
); } window.ShareList = ShareList; // ─────────────────────────────────────────────────────────── // CREATE SHARE LINK — large sheet // ─────────────────────────────────────────────────────────── function ShareCreate({ dark = false }) { const feeds = ['work', 'uni', 'personal', 'gym', 'society', 'family']; const selected = ['work', 'uni']; return (
Cancel New share link Create
{/* Name */}
Work · this week
Visible to anyone with the link. Choose a name only you'll recognise.
{/* Feeds (multi-select) */}
Calendars to share
{feeds.map(f => ( {FEEDS[f].name} {selected.includes(f) && } ))}
{/* Date range */}
Starts
Mon, Mar 10
Ends
Sun, Mar 16
{/* Expiry — segmented */}
Link expiry
{/* Visibility */}
Show event details
Title, location, notes. Off shows only "Busy".
Require passcode
4-digit code shared separately.
); } window.ShareCreate = ShareCreate; // ─────────────────────────────────────────────────────────── // SHARE DETAIL — per-link inspector // ─────────────────────────────────────────────────────────── function ShareDetail({ dark = false }) { return (
Share link
Work · this week
Mar 10 – Mar 16 · times hidden as Busy
https://portal.lukas.dev/s/aB7r2dHjK3pX9q…
Copy · Show QR · Share via…
{/* Stats */}
Views
42
Subscribers
3
Created
Mar 10
Work
142 events
Date range
Mar 10 – Mar 16
Detail visibility
Times only (Busy)
Expires
Mar 23 · in 7 days
{[ { d: 'Today · 9:14 AM', s: 'Subscribed by 92.40.xxx — Outlook' }, { d: 'Today · 8:02 AM', s: 'Viewed by 81.20.xxx — Safari' }, { d: 'Yesterday · 7:45 PM', s: 'Viewed by 92.40.xxx — Outlook' }, { d: 'Yesterday · 11:20 AM', s: 'Subscribed by 51.6.xxx — iOS Calendar' }, ].map((r, i, a) => (
0 ? '0.5px solid var(--io-separator)' : 'none' }}>
{r.d}
{r.s}
))}
); } window.ShareDetail = ShareDetail; // ─────────────────────────────────────────────────────────── // SUBSCRIPTION URL · detail // ─────────────────────────────────────────────────────────── function ShareSubscription({ dark = false }) { return (
Personal subscription
One URL · all your feeds.
Subscribe from your watch, your laptop, or someone else's phone. Read-only. Token rotates only if you tap rotate.
{/* big QR (placeholder block) */}
{/* placeholder QR — diagonal stripes + finder squares */}
{[{l:8,t:8},{r:8,t:8},{l:8,b:8}].map((p, i) => (
))}
Scan in Apple Calendar → Add subscription
https://portal.lukas.dev/i/a8c5e2f9b4d61aa97f3c2.ics
Copy · Open in Calendar
Include feeds
All 7
Generated bedtime events
Token rotated
Feb 10 · 35 days ago
Rotating invalidates every device subscribed to this URL. You'll need to re-subscribe everywhere.
); } window.ShareSubscription = ShareSubscription; // ─────────────────────────────────────────────────────────── // EMPTY // ─────────────────────────────────────────────────────────── function ShareEmpty({ dark = false }) { return ( No active links
} trailing={<>}/> {/* Subscription card still shows */}
Your subscription URL
Lukas · all feeds
Available since you signed in.
No share links yet.
Create a link to share one feed or a date range. Revoke any time. Detail visibility is up to you.
); } window.ShareEmpty = ShareEmpty;