Merge branch 'dev'
CI/CD / deploy (push) Failing after 2m14s
Details
CI/CD / deploy (push) Failing after 2m14s
Details
This commit is contained in:
commit
9d3b3aa4a4
|
|
@ -1,30 +1,22 @@
|
|||
/**
|
||||
* rCal landing page — relational calendar.
|
||||
* Ported from rcal-online Next.js page.tsx (318 lines).
|
||||
*/
|
||||
export function renderLanding(): string {
|
||||
return `
|
||||
<!-- Hero -->
|
||||
<div class="rl-hero">
|
||||
<span class="rl-tagline" style="color:#60a5fa;background:rgba(96,165,250,0.1);border-color:rgba(96,165,250,0.2)">
|
||||
Relational Calendar
|
||||
</span>
|
||||
<h1 class="rl-heading" style="background:linear-gradient(to right,#60a5fa,#818cf8,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text">
|
||||
Time is shared. Your calendar should be too.
|
||||
</h1>
|
||||
<span class="rl-tagline">rCal</span>
|
||||
<h1 class="rl-heading">Time is shared. Your calendar should be too.</h1>
|
||||
<p class="rl-subtitle">
|
||||
A collaborative calendar for communities, cooperatives, and coordinated groups.
|
||||
</p>
|
||||
<p class="rl-subtext">
|
||||
rCal rethinks the calendar as a <span style="color:#60a5fa;font-weight:600">shared, spatial, and cyclical</span> tool.
|
||||
rCal rethinks the calendar as a shared, spatial, and cyclical tool.
|
||||
See events across time and place, overlay lunar cycles, zoom from a single hour to a whole decade,
|
||||
and keep everyone on the same page — without the back-and-forth.
|
||||
</p>
|
||||
<div class="rl-cta-row">
|
||||
<a href="https://demo.rspace.online/rcal" class="rl-cta-primary" id="ml-primary"
|
||||
style="background:linear-gradient(to right,#60a5fa,#6366f1);color:#0b1120">
|
||||
Try the Demo
|
||||
</a>
|
||||
<a href="https://demo.rspace.online/rcal" class="rl-cta-primary" id="ml-primary">Try the Demo</a>
|
||||
<a href="#features" class="rl-cta-secondary">Learn More</a>
|
||||
</div>
|
||||
<p style="font-size:0.82rem;margin-top:0.5rem">
|
||||
|
|
@ -38,31 +30,23 @@ export function renderLanding(): string {
|
|||
<section class="rl-section" style="border-top:none">
|
||||
<div class="rl-container">
|
||||
<div class="rl-grid-4">
|
||||
<div class="rl-card rl-card--center" style="padding:2rem">
|
||||
<div class="rl-icon-box" style="background:rgba(96,165,250,0.12);font-size:1.5rem">
|
||||
<span style="font-size:1.5rem">🤝</span>
|
||||
</div>
|
||||
<div class="rl-card rl-card--center">
|
||||
<div class="rl-icon-box">🤝</div>
|
||||
<h3>Shared by Default</h3>
|
||||
<p>One calendar for the whole group. Everyone sees the same context — no more fragmented schedules.</p>
|
||||
</div>
|
||||
<div class="rl-card rl-card--center" style="padding:2rem">
|
||||
<div class="rl-icon-box" style="background:rgba(129,140,248,0.12);font-size:1.5rem">
|
||||
<span style="font-size:1.5rem">🗺</span>
|
||||
</div>
|
||||
<div class="rl-card rl-card--center">
|
||||
<div class="rl-icon-box">🗺</div>
|
||||
<h3>Spatiotemporal</h3>
|
||||
<p>Events have a where, not just a when. See your schedule on a map and a timeline simultaneously.</p>
|
||||
</div>
|
||||
<div class="rl-card rl-card--center" style="padding:2rem">
|
||||
<div class="rl-icon-box" style="background:rgba(167,139,250,0.12);font-size:1.5rem">
|
||||
<span style="font-size:1.5rem">🌙</span>
|
||||
</div>
|
||||
<div class="rl-card rl-card--center">
|
||||
<div class="rl-icon-box">🌙</div>
|
||||
<h3>Natural Cycles</h3>
|
||||
<p>Lunar phases, eclipses, and solstices built in. Reconnect your planning to the rhythms of the natural world.</p>
|
||||
</div>
|
||||
<div class="rl-card rl-card--center" style="padding:2rem">
|
||||
<div class="rl-icon-box" style="background:rgba(52,211,153,0.12);font-size:1.5rem">
|
||||
<span style="font-size:1.5rem">🔭</span>
|
||||
</div>
|
||||
<div class="rl-card rl-card--center">
|
||||
<div class="rl-icon-box">🔭</div>
|
||||
<h3>Multi-Scale Zoom</h3>
|
||||
<p>Ten levels of time — from a 30-second moment to a cosmic era. See today or plan a decade ahead.</p>
|
||||
</div>
|
||||
|
|
@ -73,44 +57,40 @@ export function renderLanding(): string {
|
|||
<!-- Why rCal -->
|
||||
<section id="features" class="rl-section rl-section--alt">
|
||||
<div class="rl-container">
|
||||
<span class="rl-tagline" style="color:#60a5fa;background:rgba(96,165,250,0.1);border-color:rgba(96,165,250,0.2)">
|
||||
Why rCal?
|
||||
</span>
|
||||
<h2 class="rl-heading" style="background:linear-gradient(135deg,#60a5fa,#818cf8);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text">
|
||||
Calendars were never meant to be personal silos
|
||||
</h2>
|
||||
<span class="rl-tagline">Why rCal?</span>
|
||||
<h2 class="rl-heading">Calendars were never meant to be personal silos</h2>
|
||||
<p class="rl-subtext" style="margin-bottom:2.5rem">
|
||||
Mainstream calendars treat time as private property. rCal treats it as a <span style="color:#60a5fa;font-weight:600">commons</span> —
|
||||
Mainstream calendars treat time as private property. rCal treats it as a commons —
|
||||
something groups navigate together. Here’s what makes it different.
|
||||
</p>
|
||||
<div class="rl-grid-2">
|
||||
<div class="rl-card" style="border-color:rgba(96,165,250,0.12)">
|
||||
<div style="font-size:1.75rem;margin-bottom:1rem">📍</div>
|
||||
<div class="rl-card">
|
||||
<div class="rl-icon-box">📍</div>
|
||||
<h3>Where + When, Together</h3>
|
||||
<p>Every event lives on both a timeline and a map. rCal’s split view lets you see where everyone is meeting and when — with nine spatial zoom levels from planet to street address.</p>
|
||||
</div>
|
||||
<div class="rl-card" style="border-color:rgba(96,165,250,0.12)">
|
||||
<div style="font-size:1.75rem;margin-bottom:1rem">🔗</div>
|
||||
<div class="rl-card">
|
||||
<div class="rl-icon-box">🔗</div>
|
||||
<h3>Coupled Zoom</h3>
|
||||
<p>Lock temporal and spatial zoom together: zoom out in time and the map zooms out to match. Planning a week? See the city. Planning a decade? See the continent.</p>
|
||||
</div>
|
||||
<div class="rl-card" style="border-color:rgba(96,165,250,0.12)">
|
||||
<div style="font-size:1.75rem;margin-bottom:1rem">📡</div>
|
||||
<div class="rl-card">
|
||||
<div class="rl-icon-box">📡</div>
|
||||
<h3>Multi-Source Sync</h3>
|
||||
<p>Import from Google, Outlook, Apple, CalDAV, ICS feeds, and Obsidian. Layer multiple sources with per-source color coding and visibility controls.</p>
|
||||
</div>
|
||||
<div class="rl-card" style="border-color:rgba(96,165,250,0.12)">
|
||||
<div style="font-size:1.75rem;margin-bottom:1rem">🌑</div>
|
||||
<div class="rl-card">
|
||||
<div class="rl-icon-box">🌑</div>
|
||||
<h3>Lunar Overlay</h3>
|
||||
<p>Eight moon phases rendered on every calendar view with illumination percentages and eclipse detection. Plan gatherings, gardens, and ceremonies around natural cycles.</p>
|
||||
</div>
|
||||
<div class="rl-card" style="border-color:rgba(96,165,250,0.12)">
|
||||
<div style="font-size:1.75rem;margin-bottom:1rem">🧩</div>
|
||||
<div class="rl-card">
|
||||
<div class="rl-icon-box">🧩</div>
|
||||
<h3>r* Ecosystem Embeds</h3>
|
||||
<p>rTrips, rMaps, rNetwork, rCart, and rNotes can all embed a calendar view through the context API. One calendar, surfaced everywhere it’s needed.</p>
|
||||
</div>
|
||||
<div class="rl-card" style="border-color:rgba(96,165,250,0.12)">
|
||||
<div style="font-size:1.75rem;margin-bottom:1rem">🏠</div>
|
||||
<div class="rl-card">
|
||||
<div class="rl-icon-box">🏠</div>
|
||||
<h3>Self-Hosted & Sovereign</h3>
|
||||
<p>Open source and Dockerized. Your events live on your infrastructure — not in a corporate cloud. Full data sovereignty with rIDs authentication.</p>
|
||||
</div>
|
||||
|
|
@ -121,12 +101,8 @@ export function renderLanding(): string {
|
|||
<!-- Temporal Zoom Levels -->
|
||||
<section class="rl-section">
|
||||
<div class="rl-container">
|
||||
<span class="rl-tagline" style="color:#818cf8;background:rgba(129,140,248,0.1);border-color:rgba(129,140,248,0.2)">
|
||||
Temporal Navigation
|
||||
</span>
|
||||
<h2 class="rl-heading" style="background:linear-gradient(135deg,#818cf8,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text">
|
||||
Ten levels of time
|
||||
</h2>
|
||||
<span class="rl-tagline">Temporal Navigation</span>
|
||||
<h2 class="rl-heading">Ten levels of time</h2>
|
||||
<p class="rl-subtext">
|
||||
Most calendars show you a month. rCal lets you zoom from a single moment to a cosmic era —
|
||||
each level revealing a different kind of pattern.
|
||||
|
|
@ -211,12 +187,8 @@ export function renderLanding(): string {
|
|||
<!-- Calendar Views -->
|
||||
<section class="rl-section rl-section--alt">
|
||||
<div class="rl-container">
|
||||
<span class="rl-tagline" style="color:#a78bfa;background:rgba(167,139,250,0.1);border-color:rgba(167,139,250,0.2)">
|
||||
Four Views
|
||||
</span>
|
||||
<h2 class="rl-heading" style="background:linear-gradient(135deg,#a78bfa,#c084fc);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text">
|
||||
One calendar, four perspectives
|
||||
</h2>
|
||||
<span class="rl-tagline">Four Views</span>
|
||||
<h2 class="rl-heading">One calendar, four perspectives</h2>
|
||||
<p class="rl-subtext">
|
||||
Switch between views with keyboard shortcuts (1–4) to see your events from the angle that matters most right now.
|
||||
</p>
|
||||
|
|
@ -276,52 +248,48 @@ export function renderLanding(): string {
|
|||
<!-- Ecosystem Integration -->
|
||||
<section class="rl-section">
|
||||
<div class="rl-container">
|
||||
<span class="rl-tagline" style="color:#34d399;background:rgba(52,211,153,0.1);border-color:rgba(52,211,153,0.2)">
|
||||
Ecosystem
|
||||
</span>
|
||||
<h2 class="rl-heading" style="background:linear-gradient(135deg,#34d399,#22d3ee);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text">
|
||||
Part of the r* stack
|
||||
</h2>
|
||||
<span class="rl-tagline">Ecosystem</span>
|
||||
<h2 class="rl-heading">Part of the r* stack</h2>
|
||||
<p class="rl-subtext">
|
||||
rCal connects to the full suite of community tools. Any r* app can display or create calendar events through the shared context API.
|
||||
</p>
|
||||
<div class="rl-grid-3" style="margin-top:2rem">
|
||||
<div class="rl-integration" style="border-color:rgba(52,211,153,0.15)">
|
||||
<div class="rl-integration">
|
||||
<div class="rl-icon-box" style="flex-shrink:0"><span style="font-size:1.25rem">🗺</span></div>
|
||||
<div>
|
||||
<h3>rTrips</h3>
|
||||
<p>Trip itineraries auto-populate with calendar events for departure, accommodation, and activities.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="rl-integration" style="border-color:rgba(52,211,153,0.15)">
|
||||
<div class="rl-integration">
|
||||
<div class="rl-icon-box" style="flex-shrink:0"><span style="font-size:1.25rem">📍</span></div>
|
||||
<div>
|
||||
<h3>rMaps</h3>
|
||||
<p>Location-tagged events appear on shared community maps with time-filtered layers.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="rl-integration" style="border-color:rgba(52,211,153,0.15)">
|
||||
<div class="rl-integration">
|
||||
<div class="rl-icon-box" style="flex-shrink:0"><span style="font-size:1.25rem">👥</span></div>
|
||||
<div>
|
||||
<h3>rNetwork</h3>
|
||||
<p>See when your community members are available and schedule group meetings.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="rl-integration" style="border-color:rgba(52,211,153,0.15)">
|
||||
<div class="rl-integration">
|
||||
<div class="rl-icon-box" style="flex-shrink:0"><span style="font-size:1.25rem">🛒</span></div>
|
||||
<div>
|
||||
<h3>rCart</h3>
|
||||
<p>Product launches, market days, and delivery windows sync to your calendar.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="rl-integration" style="border-color:rgba(52,211,153,0.15)">
|
||||
<div class="rl-integration">
|
||||
<div class="rl-icon-box" style="flex-shrink:0"><span style="font-size:1.25rem">📝</span></div>
|
||||
<div>
|
||||
<h3>rNotes</h3>
|
||||
<p>Meeting notes link back to calendar events. Transcriptions attach to the moment they happened.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="rl-integration" style="border-color:rgba(52,211,153,0.15)">
|
||||
<div class="rl-integration">
|
||||
<div class="rl-icon-box" style="flex-shrink:0"><span style="font-size:1.25rem">🌐</span></div>
|
||||
<div>
|
||||
<h3>rSpace</h3>
|
||||
|
|
@ -335,19 +303,14 @@ export function renderLanding(): string {
|
|||
<!-- CTA -->
|
||||
<section class="rl-section rl-section--alt">
|
||||
<div class="rl-container" style="text-align:center">
|
||||
<h2 class="rl-heading" style="background:linear-gradient(to right,#60a5fa,#818cf8,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text">
|
||||
See time differently
|
||||
</h2>
|
||||
<h2 class="rl-heading">See time differently</h2>
|
||||
<p class="rl-subtext">
|
||||
Try the spatiotemporal calendar with lunar overlays, multi-source sync, and community sharing.
|
||||
No account needed for the demo.
|
||||
</p>
|
||||
<div class="rl-cta-row">
|
||||
<a href="https://demo.rspace.online/rcal" class="rl-cta-primary"
|
||||
style="background:linear-gradient(to right,#60a5fa,#6366f1);color:#0b1120">
|
||||
Open the Demo
|
||||
</a>
|
||||
<a href="https://rstack.online" class="rl-cta-secondary">Explore rStack</a>
|
||||
<a href="https://demo.rspace.online/rcal" class="rl-cta-primary">Open the Demo</a>
|
||||
<a href="/create-space" class="rl-cta-secondary">Create a Space</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
|
|||
|
|
@ -1086,7 +1086,7 @@ export const calModule: RSpaceModule = {
|
|||
scoping: { defaultScope: 'global', userConfigurable: true },
|
||||
docSchemas: [{ pattern: '{space}:cal:events', description: 'Calendar events and sources', init: calendarSchema.init }],
|
||||
routes,
|
||||
standaloneDomain: "rcal.online",
|
||||
standaloneDomain: "rspace.online",
|
||||
landingPage: renderLanding,
|
||||
seedTemplate: seedDemoIfEmpty,
|
||||
async onInit(ctx) {
|
||||
|
|
|
|||
|
|
@ -227,7 +227,7 @@ export function renderLanding(): string {
|
|||
<span style="font-size:0.7rem;font-weight:700;color:#14b8a6">3</span>
|
||||
</div>
|
||||
<p style="font-size:0.75rem;color:#94a3b8;line-height:1.5">
|
||||
Order is placed with the nearest print shop via <a href="https://rcart.online" style="color:#14b8a6;text-decoration:none">rCart</a>
|
||||
Order is placed with the nearest print shop via <a href="https://demo.rspace.online/rcart" style="color:#14b8a6;text-decoration:none">rCart</a>
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
|
|
@ -443,7 +443,7 @@ export function renderLanding(): string {
|
|||
<a href="https://demo.rspace.online/rpubs" style="display:inline-block;padding:0.5rem 1rem;border-radius:0.5rem;border:1px solid rgba(255,255,255,0.15);color:#94a3b8;font-size:0.875rem;font-weight:500;text-decoration:none">
|
||||
Fund a Title
|
||||
</a>
|
||||
<a href="https://rcart.online" style="display:inline-flex;align-items:center;gap:0.4rem;padding:0.5rem 1rem;border-radius:0.5rem;border:1px solid rgba(255,255,255,0.15);color:#94a3b8;font-size:0.875rem;font-weight:500;text-decoration:none">
|
||||
<a href="https://demo.rspace.online/rcart" style="display:inline-flex;align-items:center;gap:0.4rem;padding:0.5rem 1rem;border-radius:0.5rem;border:1px solid rgba(255,255,255,0.15);color:#94a3b8;font-size:0.875rem;font-weight:500;text-decoration:none">
|
||||
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="9" cy="21" r="1"/><circle cx="20" cy="21" r="1"/><path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6"/></svg>
|
||||
Browse on rCart
|
||||
</a>
|
||||
|
|
|
|||
|
|
@ -359,6 +359,7 @@ export function renderShell(opts: ShellOptions): string {
|
|||
navigator.serviceWorker.register("/sw.js?v=5").then((reg) => {
|
||||
function showUpdateBanner() {
|
||||
if (!isStandalone) return; // Only show update prompt in installed PWA
|
||||
if (sessionStorage.getItem('rspace_update_dismissed')) return; // dismissed this session
|
||||
const b = document.getElementById('pwa-update-banner');
|
||||
if (!b || b.style.display !== 'none') return;
|
||||
// Hide install banner first if somehow both would show
|
||||
|
|
@ -422,6 +423,7 @@ export function renderShell(opts: ShellOptions): string {
|
|||
document.getElementById('pwa-update-close')?.addEventListener('click', () => {
|
||||
document.getElementById('pwa-update-banner').style.display = 'none';
|
||||
document.body.classList.remove('rspace-banner-visible');
|
||||
sessionStorage.setItem('rspace_update_dismissed', '1'); // don't re-show until next session
|
||||
});
|
||||
// ── Header minimize toggle ──
|
||||
if (localStorage.getItem('rspace_headers_minimized') === '1') {
|
||||
|
|
@ -515,19 +517,18 @@ export function renderShell(opts: ShellOptions): string {
|
|||
});
|
||||
if (infoClose) infoClose.addEventListener('click', hideInfoPanel);
|
||||
|
||||
// Auto-show on first visit per rApp (checks localStorage, shows once then never again)
|
||||
// Auto-show info panel ONCE globally (first rApp visit ever), then only via info button
|
||||
function autoShowIfFirstVisit(mid) {
|
||||
if (!mid || mid === 'rspace') return; // skip canvas
|
||||
try {
|
||||
var key = 'rapp_info_seen_' + mid;
|
||||
if (localStorage.getItem(key)) return; // already seen
|
||||
if (localStorage.getItem('rapp_info_auto_shown')) return; // already shown once
|
||||
if (!localStorage.getItem('encryptid_session')) return; // not logged in
|
||||
localStorage.setItem(key, '1');
|
||||
localStorage.setItem('rapp_info_auto_shown', '1');
|
||||
setTimeout(function() { showInfoPanel(mid); }, 800);
|
||||
} catch(e) {}
|
||||
}
|
||||
|
||||
// Reset when switching tabs — auto-show for newly visited rApps
|
||||
// Hide info panel when switching tabs (but don't auto-show for new tabs)
|
||||
document.addEventListener('layer-view-mode', hideInfoPanel);
|
||||
const tb = document.querySelector('rstack-tab-bar');
|
||||
if (tb) {
|
||||
|
|
@ -535,13 +536,10 @@ export function renderShell(opts: ShellOptions): string {
|
|||
hideInfoPanel();
|
||||
// Reset cached module so next open loads fresh content for new tab
|
||||
infoPanel.dataset.loadedModule = '';
|
||||
// Auto-show info panel if this is the user's first visit to this rApp
|
||||
var switchedModuleId = e.detail && e.detail.moduleId;
|
||||
if (switchedModuleId) autoShowIfFirstVisit(switchedModuleId);
|
||||
});
|
||||
}
|
||||
|
||||
// Auto-show on initial page load
|
||||
// Auto-show on initial page load (only fires once globally)
|
||||
autoShowIfFirstVisit('${escapeAttr(moduleId)}');
|
||||
|
||||
// Expose for tour integration
|
||||
|
|
|
|||
Loading…
Reference in New Issue