61 changed files with 1051 additions and 269 deletions
@ -0,0 +1,115 @@ |
|||||||
|
import { Controller } from '@hotwired/stimulus'; |
||||||
|
|
||||||
|
/* |
||||||
|
* Sidebar toggle controller |
||||||
|
* Controls showing/hiding nav (#leftNav) and aside (#rightNav) on mobile viewports. |
||||||
|
* Uses aria-controls attribute of clicked toggle buttons. |
||||||
|
*/ |
||||||
|
export default class extends Controller { |
||||||
|
static targets = [ ]; |
||||||
|
|
||||||
|
connect() { |
||||||
|
this.mediaQuery = window.matchMedia('(min-width: 769px)'); |
||||||
|
this.resizeListener = () => this.handleResize(); |
||||||
|
this.keyListener = (e) => this.handleKeydown(e); |
||||||
|
this.clickOutsideListener = (e) => this.handleDocumentClick(e); |
||||||
|
this.mediaQuery.addEventListener('change', this.resizeListener); |
||||||
|
document.addEventListener('keydown', this.keyListener); |
||||||
|
document.addEventListener('click', this.clickOutsideListener); |
||||||
|
this.handleResize(); |
||||||
|
} |
||||||
|
|
||||||
|
disconnect() { |
||||||
|
this.mediaQuery.removeEventListener('change', this.resizeListener); |
||||||
|
document.removeEventListener('keydown', this.keyListener); |
||||||
|
document.removeEventListener('click', this.clickOutsideListener); |
||||||
|
} |
||||||
|
|
||||||
|
toggle(event) { |
||||||
|
const controlId = event.currentTarget.getAttribute('aria-controls'); |
||||||
|
const el = document.getElementById(controlId); |
||||||
|
if (!el) return; |
||||||
|
if (el.classList.contains('is-open')) { |
||||||
|
this.closeElement(el); |
||||||
|
} else { |
||||||
|
this.openElement(el); |
||||||
|
} |
||||||
|
this.syncAria(controlId); |
||||||
|
} |
||||||
|
|
||||||
|
close(event) { |
||||||
|
// Close button inside a sidebar
|
||||||
|
const container = event.currentTarget.closest('nav, aside'); |
||||||
|
if (container) { |
||||||
|
this.closeElement(container); |
||||||
|
this.syncAria(container.id); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
openElement(el) { |
||||||
|
// Only apply overlay behavior on mobile
|
||||||
|
if (this.isDesktop()) return; // grid already shows them
|
||||||
|
el.classList.add('is-open'); |
||||||
|
document.body.classList.add('no-scroll'); |
||||||
|
} |
||||||
|
|
||||||
|
closeElement(el) { |
||||||
|
el.classList.remove('is-open'); |
||||||
|
if (!this.anyOpen()) { |
||||||
|
document.body.classList.remove('no-scroll'); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
anyOpen() { |
||||||
|
return !!document.querySelector('nav.is-open, aside.is-open'); |
||||||
|
} |
||||||
|
|
||||||
|
syncAria(id) { |
||||||
|
// Update any toggle buttons that control this id
|
||||||
|
const expanded = document.getElementById(id)?.classList.contains('is-open') || false; |
||||||
|
document.querySelectorAll(`[aria-controls="${id}"]`).forEach(btn => { |
||||||
|
btn.setAttribute('aria-expanded', expanded.toString()); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
handleResize() { |
||||||
|
if (this.isDesktop()) { |
||||||
|
// Ensure both sidebars are visible in desktop layout
|
||||||
|
['leftNav', 'rightNav'].forEach(id => { |
||||||
|
const el = document.getElementById(id); |
||||||
|
if (el) el.classList.remove('is-open'); |
||||||
|
this.syncAria(id); |
||||||
|
}); |
||||||
|
document.body.classList.remove('no-scroll'); |
||||||
|
} else { |
||||||
|
// On mobile ensure aria-expanded is false unless explicitly opened
|
||||||
|
['leftNav', 'rightNav'].forEach(id => this.syncAria(id)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
handleKeydown(e) { |
||||||
|
if (e.key === 'Escape') { |
||||||
|
const open = document.querySelectorAll('nav.is-open, aside.is-open'); |
||||||
|
if (open.length) { |
||||||
|
open.forEach(el => this.closeElement(el)); |
||||||
|
['leftNav', 'rightNav'].forEach(id => this.syncAria(id)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
handleDocumentClick(e) { |
||||||
|
if (this.isDesktop()) return; // only needed mobile
|
||||||
|
const open = document.querySelectorAll('nav.is-open, aside.is-open'); |
||||||
|
if (!open.length) return; |
||||||
|
const inside = e.target.closest('nav, aside, .mobile-toggles'); |
||||||
|
if (!inside) { |
||||||
|
open.forEach(el => this.closeElement(el)); |
||||||
|
['leftNav', 'rightNav'].forEach(id => this.syncAria(id)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
isDesktop() { |
||||||
|
return this.mediaQuery.matches; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
@ -0,0 +1,72 @@ |
|||||||
|
|
||||||
|
.center{ text-align: center; } |
||||||
|
|
||||||
|
/* Eyebrow + lede */ |
||||||
|
.eyebrow{ |
||||||
|
text-transform: uppercase; |
||||||
|
letter-spacing: .12em; |
||||||
|
font-size: .8rem; |
||||||
|
color: var(--color-text-mid); |
||||||
|
margin: 0 0 1rem; |
||||||
|
} |
||||||
|
|
||||||
|
/* Hero split */ |
||||||
|
.ln-hero{ |
||||||
|
margin-top: 100px; |
||||||
|
background: var(--color-bg); |
||||||
|
color: var(--color-text); |
||||||
|
} |
||||||
|
.ln-hero__copy{ } |
||||||
|
.ln-hero__frame{ display:flex; justify-content:center; } |
||||||
|
.frame{ |
||||||
|
width: min(560px, 40vw); |
||||||
|
border-radius: 14px; |
||||||
|
border: var(--border-hair); |
||||||
|
background: linear-gradient(180deg, color-mix(in oklab, var(--color-bg-light) 80%, var(--color-bg)), var(--color-bg)); |
||||||
|
overflow: hidden; |
||||||
|
} |
||||||
|
|
||||||
|
/* Generic section shell */ |
||||||
|
.ln-section{ position: relative; padding: 3.2rem 0; } |
||||||
|
|
||||||
|
/* Split layout for features */ |
||||||
|
.ln-split{ |
||||||
|
display: grid; gap: var(--gutter); |
||||||
|
grid-template-columns: 280px 1fr; |
||||||
|
align-items: start; |
||||||
|
} |
||||||
|
.ln-split__aside{ position: sticky; top: 24px; align-self: start; } |
||||||
|
.ln-split__body .measure{ max-width: 70ch; } |
||||||
|
.cta-row{ margin-top: .6rem; } |
||||||
|
|
||||||
|
/* Section palettes (alternating) */ |
||||||
|
.ln-section--search{ |
||||||
|
background: var(--color-accent-300); |
||||||
|
} |
||||||
|
|
||||||
|
.ln-section--newsstand{ |
||||||
|
background: color-mix(in oklab, var(--color-primary) 18%, var(--color-bg)); |
||||||
|
} |
||||||
|
|
||||||
|
.ln-section--reader{ |
||||||
|
background: var(--color-bg-light); |
||||||
|
} |
||||||
|
.ln-section--editor{ |
||||||
|
background: var(--color-teal-400); |
||||||
|
} |
||||||
|
.ln-section--newsroom{ |
||||||
|
background: color-mix(in oklab, var(--color-bg-light) 82%, var(--color-bg)); |
||||||
|
} |
||||||
|
.ln-section--marketplace{ |
||||||
|
background: color-mix(in oklab, var(--color-primary) 18%, var(--color-bg)); |
||||||
|
} |
||||||
|
.ln-section--unfold{ |
||||||
|
background: color-mix(in oklab, var(--color-accent-warm) 60%, var(--color-bg)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Motion */ |
||||||
|
@media (prefers-reduced-motion: reduce){ |
||||||
|
*{ transition: none !important; animation: none !important; } |
||||||
|
} |
||||||
@ -1,4 +1,9 @@ |
|||||||
<a {% if path('magazine-category', { 'slug' : slug }) in app.request.uri %}class="active"{% endif %} |
{% if mag is defined and mag and slug %} |
||||||
href="{{ path('magazine-category', { 'slug' : slug }) }}"> |
{% set catPath = path('magazine-category', { 'mag': mag, 'slug': slug }) %} |
||||||
|
{% else %} |
||||||
|
{% set catPath = '#' %} |
||||||
|
{% endif %} |
||||||
|
<a {% if catPath in app.request.uri %}class="active"{% endif %} |
||||||
|
href="{{ catPath }}"> |
||||||
{{ title }} |
{{ title }} |
||||||
</a> |
</a> |
||||||
|
|||||||
@ -1,24 +1,103 @@ |
|||||||
{% extends 'base.html.twig' %} |
{% extends 'layout-full.html.twig' %} |
||||||
|
|
||||||
{% block nav %} |
{% block title %}Decent Newsroom — A decentralized platform for collaborative publishing{% endblock %} |
||||||
{% endblock %} |
|
||||||
|
|
||||||
{% block body %} |
{% block body %} |
||||||
<div |
|
||||||
data-controller="search-visibility" |
|
||||||
data-action="search:changed@window->search-visibility#toggle" |
|
||||||
> |
|
||||||
<twig:SearchComponent :currentRoute="app.current_route" /> |
|
||||||
<div data-search-visibility-target="list"> |
|
||||||
<twig:Organisms:CardList :list="latest" /> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
{% endblock %} |
|
||||||
|
|
||||||
{% block aside %} |
<section class="ln-hero d-flex gap-3 center"> |
||||||
<h6>Magazines</h6> |
<h1 class="brand">Decent Newsroom</h1> |
||||||
<twig:Organisms:ZineList /> |
<p class="eyebrow">Collaborative publishing on Nostr</p> |
||||||
|
<p class="lede mb-5">Explore, publish articles, and create magazines.</p> |
||||||
|
</section> |
||||||
|
|
||||||
|
<section class="d-flex gap-3 center ln-section--newsstand"> |
||||||
|
<div class="container mt-5"> |
||||||
|
<h1>Newsstand</h1> |
||||||
|
<p class="eyebrow">for the digital age</p> |
||||||
|
</div> |
||||||
|
<div class="mb-5"> |
||||||
|
<p class="measure">Flip through a world of magazines in one place. Build your lineup, catch fresh releases, anywhere.</p> |
||||||
|
<div class="cta-row"> |
||||||
|
<a class="btn btn--primary" href="{{ path('newsstand') }}">Explore the rack</a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
<section class="d-flex gap-3 center ln-section--search"> |
||||||
|
<div class="container mt-5"> |
||||||
|
<h1>Discover</h1> |
||||||
|
<p class="eyebrow">hidden gems</p> |
||||||
|
</div> |
||||||
|
<div class="mb-5"> |
||||||
|
<p class="measure">Our search is specialized for long-form Nostr content.</p> |
||||||
|
<div class="cta-row"> |
||||||
|
<a class="btn btn--primary" href="{{ path('app_search_index') }}">Find what you like</a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
<section class="d-flex gap-3 center ln-section--lists"> |
||||||
|
<div class="container mt-5"> |
||||||
|
<h1>Reading Lists</h1> |
||||||
|
<p class="eyebrow">for collections, curations, courses and more</p> |
||||||
|
</div> |
||||||
|
<div class="mb-5"> |
||||||
|
<p class="measure">Create ordered reading lists. Add more articles, reorder, republish.</p> |
||||||
|
<div class="cta-row"> |
||||||
|
<a class="btn btn--primary" href="{{ path('reading_list_index') }}">Start a list</a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
<section class="d-flex gap-3 center ln-section--editor"> |
||||||
|
<div class="container mt-5"> |
||||||
|
<h1>Article Editor</h1> |
||||||
|
<p class="eyebrow">for anyone</p> |
||||||
|
</div> |
||||||
|
<div class="mb-5"> |
||||||
|
<p class="measure">Write, revise, and preview with ease. Save drafts, keep notes, and publish.</p> |
||||||
|
<div class="cta-row"> |
||||||
|
<a class="btn btn--primary" href="{{ path('editor-create') }}">Write an article</a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
<section class="d-flex gap-3 center ln-section--newsroom"> |
||||||
|
<div class="container mt-5"> |
||||||
|
<h1>Newsroom</h1> |
||||||
|
<p class="eyebrow">like no other</p> |
||||||
|
</div> |
||||||
|
<div class="mb-5"> |
||||||
|
<p class="measure">Create your own magazine, define categories, manage submissions, and collaborate with editors and contributors.</p> |
||||||
|
<div class="cta-row"> |
||||||
|
<a class="btn btn--primary" href="{{ path('mag_wizard_setup') }}">Create a magazine</a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
<section class="d-flex gap-3 center ln-section--unfold"> |
||||||
|
<div class="container mt-5"> |
||||||
|
<h1>Unfold</h1> |
||||||
|
<p class="eyebrow">your magazine</p> |
||||||
|
</div> |
||||||
|
<div class="mb-5"> |
||||||
|
<p class="measure">Unfold is a companion web app. Any magazine created on Decent Newsroom can be plugged in, |
||||||
|
styled and deployed to a custom domain.</p> |
||||||
|
<div class="cta-row"> |
||||||
|
<a class="btn btn--primary" href="{{ path('unfold') }}">Learn more</a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
|
||||||
|
<section class="d-flex gap-3 center ln-section--marketplace"> |
||||||
|
<div class="container mt-5"> |
||||||
|
<h1>Media Marketplace</h1> |
||||||
|
<p class="eyebrow">Coming soon</p> |
||||||
|
</div> |
||||||
|
<div class="mb-5"> |
||||||
|
<p class="measure">Commission custom visuals, discover stock you can actually use, and keep media and text in one creative flow.</p> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
<h6>Lists</h6> |
|
||||||
<twig:Organisms:ReadingListList /> |
|
||||||
{% endblock %} |
{% endblock %} |
||||||
|
|||||||
@ -0,0 +1,5 @@ |
|||||||
|
{% extends 'base.html.twig' %} |
||||||
|
|
||||||
|
{% block layout %} |
||||||
|
{% block body %}{% endblock %} |
||||||
|
{% endblock %} |
||||||
@ -0,0 +1,41 @@ |
|||||||
|
{% extends 'base.html.twig' %} |
||||||
|
|
||||||
|
{% block layout %} |
||||||
|
<div class="layout" data-controller="sidebar-toggle"> |
||||||
|
<div> |
||||||
|
<nav id="leftNav"> |
||||||
|
<header> |
||||||
|
<button class="close" data-action="click->sidebar-toggle#close" aria-label="Close left sidebar">✕</button> |
||||||
|
</header> |
||||||
|
<ul class="user-nav"> |
||||||
|
<li> |
||||||
|
<a href="{{ path('newsstand') }}">Newsstand</a> |
||||||
|
</li> |
||||||
|
<li> |
||||||
|
<a href="{{ path('lists') }}">Lists</a> |
||||||
|
</li> |
||||||
|
<li> |
||||||
|
<a href="{{ path('app_search_index') }}">{{ 'heading.search'|trans }}</a> |
||||||
|
</li> |
||||||
|
</ul> |
||||||
|
<twig:UserMenu /> |
||||||
|
{% block nav %}{% endblock %} |
||||||
|
</nav> |
||||||
|
</div> |
||||||
|
<main> |
||||||
|
<div class="mobile-toggles"> |
||||||
|
<button class="toggle" aria-controls="leftNav" aria-expanded="false" data-action="click->sidebar-toggle#toggle">☰ Left</button> |
||||||
|
<button class="toggle" aria-controls="rightNav" aria-expanded="false" data-action="click->sidebar-toggle#toggle">Right ☰</button> |
||||||
|
</div> |
||||||
|
{% block body %}{% endblock %} |
||||||
|
</main> |
||||||
|
<div> |
||||||
|
<aside id="rightNav"> |
||||||
|
<header> |
||||||
|
<button class="close" data-action="click->sidebar-toggle#close" aria-label="Close right sidebar">✕</button> |
||||||
|
</header> |
||||||
|
{% block aside %}{% endblock %} |
||||||
|
</aside> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endblock %} |
||||||
@ -0,0 +1,5 @@ |
|||||||
|
{% extends 'layout.html.twig' %} |
||||||
|
|
||||||
|
{% block body %} |
||||||
|
<twig:Organisms:CardList :list="latest" /> |
||||||
|
{% endblock %} |
||||||
@ -0,0 +1,14 @@ |
|||||||
|
{% extends 'layout.html.twig' %} |
||||||
|
|
||||||
|
{% block body %} |
||||||
|
<section class="d-flex gap-3 center ln-section--newsstand"> |
||||||
|
<div class="container mt-5 mb-5"> |
||||||
|
<h1>Reading Lists</h1> |
||||||
|
<p class="eyebrow">for collections, curations, courses and more</p> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
<section class="mb-5"> |
||||||
|
<twig:Organisms:ReadingListList /> |
||||||
|
</section> |
||||||
|
{% endblock %} |
||||||
|
|
||||||
@ -0,0 +1,18 @@ |
|||||||
|
{% extends 'layout.html.twig' %} |
||||||
|
|
||||||
|
{% block body %} |
||||||
|
<section class="d-flex gap-3 center ln-section--newsstand"> |
||||||
|
<div class="container mt-5 mb-5"> |
||||||
|
<h1>Newsstand</h1> |
||||||
|
<p class="eyebrow">for the digital age</p> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
<section class="mb-5"> |
||||||
|
<twig:Organisms:ZineList /> |
||||||
|
</section> |
||||||
|
{% endblock %} |
||||||
|
|
||||||
|
{% block aside %} |
||||||
|
<h6>Lists</h6> |
||||||
|
<twig:Organisms:ReadingListList /> |
||||||
|
{% endblock %} |
||||||
@ -1,8 +1,14 @@ |
|||||||
{% extends 'base.html.twig' %} |
{% extends 'layout.html.twig' %} |
||||||
|
|
||||||
{% block nav %} |
{% block nav %} |
||||||
{% endblock %} |
{% endblock %} |
||||||
|
|
||||||
{% block body %} |
{% block body %} |
||||||
|
<section class="d-flex gap-3 center ln-section--newsstand mb-5"> |
||||||
|
<div class="container mb-5 mt-5"> |
||||||
|
<h1>Discover</h1> |
||||||
|
<p class="eyebrow">hidden gems</p> |
||||||
|
</div> |
||||||
|
</section> |
||||||
<twig:SearchComponent /> |
<twig:SearchComponent /> |
||||||
{% endblock %} |
{% endblock %} |
||||||
|
|||||||
@ -1,36 +1,43 @@ |
|||||||
{% extends 'base.html.twig' %} |
{% extends 'layout-full.html.twig' %} |
||||||
|
|
||||||
{% block nav %} |
|
||||||
{% endblock %} |
|
||||||
|
|
||||||
{% block body %} |
{% block body %} |
||||||
<h1>About Decent Newsroom</h1> |
<main class="d-flex gap-3 static"> |
||||||
<h2>Rebuilding Trust in Journalism</h2> |
<h1>About Decent Newsroom</h1> |
||||||
|
<section> |
||||||
<p>The internet, and especially social media, made news instant and abundant, but also cheap and unreliable. The value of simply reporting what happened and where has dropped to zero, |
<h2>Rebuilding Trust in Journalism</h2> |
||||||
buried under waves of misinformation, clickbait, and AI-generated noise. Worse, sorting truth from falsehood now costs more than spreading lies.</p> |
|
||||||
|
<p>The internet, and especially social media, made news instant and abundant, but also cheap and unreliable. The value of simply reporting what happened and where has dropped to zero, |
||||||
<p>Decent Newsroom is our answer to this crisis. We are building a curated, decentralized magazine featuring high-quality, long-form journalism published on Nostr.</p> |
buried under waves of misinformation, clickbait, and AI-generated noise. Worse, sorting truth from falsehood now costs more than spreading lies.</p> |
||||||
|
|
||||||
<h2>How It Works</h2> |
<p>Decent Newsroom is our answer to this crisis. We are building a curated, decentralized magazine featuring high-quality, long-form journalism published on Nostr.</p> |
||||||
<dl> |
</section> |
||||||
<dt><strong>Curated Excellence</strong></dt> |
|
||||||
<dd>We showcase a selection of featured articles.</dd> |
<section> |
||||||
|
<h2>Why It Matters</h2> |
||||||
<dt><strong>Indexed & Searchable</strong></dt> |
<p>The age of the newsroom isn’t over—it’s just evolving. We believe in bringing back editorial standards, collaboration, and high-value reporting in a decentralized way. Decent Newsroom is here to cut through the noise and rebuild trust in digital journalism.</p> |
||||||
<dd>Every article in Decent Newsroom is easily discoverable, improving access for readers and exposure for authors.</dd> |
</section> |
||||||
<dd>Simple search is available to logged-in users.</dd> |
|
||||||
<dd>Semantic search is in development.</dd> |
<section class="mb-5"> |
||||||
|
<p>To support us and get early access to the future of publishing, visit our crowdfunding page <a href="https://geyser.fund/project/newsroom" target="_blank">Geyser fund - Newsroom</a>.</p> |
||||||
<dt><strong>Open to Writers & Publishers</strong> <span class="badge">Soon</span></dt> |
<br> |
||||||
<dd>Content creators can request indexing for their work, making it searchable and eligible for inclusion.</dd> |
<p class="measure">For more info reach out to |
||||||
<dd>Publishers can create and manage their own magazines.</dd> |
<twig:Molecules:UserFromNpub ident="{{ project_npub }}" /> or |
||||||
</dl> |
<twig:Molecules:UserFromNpub ident="{{ dev_npub }}" />. |
||||||
|
</p> |
||||||
<h2>Why It Matters</h2> |
</section> |
||||||
<p>The age of the newsroom isn’t over—it’s just evolving. We believe in bringing back editorial standards, collaboration, and high-value reporting in a decentralized way. Decent Newsroom is here to cut through the noise and rebuild trust in digital journalism.</p> |
</main> |
||||||
|
|
||||||
<br> |
<section class="d-flex gap-3 center ln-section--newsstand"> |
||||||
<p>To support us and get early access to the future of publishing, visit our crowdfunding page <a href="https://geyser.fund/project/newsroom" target="_blank">Geyser fund - Newsroom</a>.</p> |
<div class="container mt-5"> |
||||||
|
<h1>Newsstand</h1> |
||||||
|
<p class="eyebrow">for the digital age</p> |
||||||
|
</div> |
||||||
|
<div class="mb-5"> |
||||||
|
<p class="measure">Flip through a world of magazines in one place. Build your lineup, catch fresh releases, anywhere.</p> |
||||||
|
<div class="cta-row"> |
||||||
|
<a class="btn btn--primary" href="{{ path('newsstand') }}">Explore the rack</a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
{% endblock %} |
{% endblock %} |
||||||
|
|||||||
@ -0,0 +1,103 @@ |
|||||||
|
{% extends 'layout-full.html.twig' %} |
||||||
|
|
||||||
|
{% block title %}Decent Newsroom — A decentralized platform for collaborative publishing{% endblock %} |
||||||
|
|
||||||
|
{% block body %} |
||||||
|
|
||||||
|
<section class="ln-hero d-flex gap-3 center"> |
||||||
|
<h1 class="brand">Decent Newsroom</h1> |
||||||
|
<p class="eyebrow">Collaborative publishing on Nostr</p> |
||||||
|
<p class="lede mb-5">Explore, publish articles, and create magazines.</p> |
||||||
|
</section> |
||||||
|
|
||||||
|
<section class="d-flex gap-3 center ln-section--newsstand"> |
||||||
|
<div class="container mt-5"> |
||||||
|
<h1>Newsstand</h1> |
||||||
|
<p class="eyebrow">for the digital age</p> |
||||||
|
</div> |
||||||
|
<div class="mb-5"> |
||||||
|
<p class="measure">Flip through a world of magazines in one place. Build your lineup, catch fresh releases, anywhere.</p> |
||||||
|
<div class="cta-row"> |
||||||
|
<a class="btn btn--primary" href="{{ path('newsstand') }}">Explore the rack</a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
<section class="d-flex gap-3 center ln-section--search"> |
||||||
|
<div class="container mt-5"> |
||||||
|
<h1>Discover</h1> |
||||||
|
<p class="eyebrow">hidden gems</p> |
||||||
|
</div> |
||||||
|
<div class="mb-5"> |
||||||
|
<p class="measure">Our search is specialized for long-form Nostr content.</p> |
||||||
|
<div class="cta-row"> |
||||||
|
<a class="btn btn--primary" href="{{ path('app_search_index') }}">Find what you like</a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
<section class="d-flex gap-3 center ln-section--lists"> |
||||||
|
<div class="container mt-5"> |
||||||
|
<h1>Reading Lists</h1> |
||||||
|
<p class="eyebrow">for collections, curations, courses and more</p> |
||||||
|
</div> |
||||||
|
<div class="mb-5"> |
||||||
|
<p class="measure">Create ordered reading lists. Add more articles, reorder, republish.</p> |
||||||
|
<div class="cta-row"> |
||||||
|
<a class="btn btn--primary" href="{{ path('reading_list_index') }}">Browse</a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
<section class="d-flex gap-3 center ln-section--editor"> |
||||||
|
<div class="container mt-5"> |
||||||
|
<h1>Article Editor</h1> |
||||||
|
<p class="eyebrow">for anyone</p> |
||||||
|
</div> |
||||||
|
<div class="mb-5"> |
||||||
|
<p class="measure">Write, revise, and preview with ease. Save drafts, keep notes, and publish.</p> |
||||||
|
<div class="cta-row"> |
||||||
|
<a class="btn btn--primary" href="{{ path('editor-create') }}">Write an article</a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
<section class="d-flex gap-3 center ln-section--newsroom"> |
||||||
|
<div class="container mt-5"> |
||||||
|
<h1>Newsroom</h1> |
||||||
|
<p class="eyebrow">like no other</p> |
||||||
|
</div> |
||||||
|
<div class="mb-5"> |
||||||
|
<p class="measure">Create your own magazine, define categories, manage submissions, and collaborate with editors and contributors.</p> |
||||||
|
<div class="cta-row"> |
||||||
|
<a class="btn btn--primary" href="{{ path('mag_wizard_setup') }}">Create a magazine</a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
<section class="d-flex gap-3 center ln-section--unfold"> |
||||||
|
<div class="container mt-5"> |
||||||
|
<h1>Unfold</h1> |
||||||
|
<p class="eyebrow">your magazine</p> |
||||||
|
</div> |
||||||
|
<div class="mb-5"> |
||||||
|
<p class="measure">Unfold is a companion web app. Any magazine created on Decent Newsroom can be plugged in, |
||||||
|
styled and deployed to a custom domain.</p> |
||||||
|
<div class="cta-row"> |
||||||
|
<a class="btn btn--primary" href="{{ path('unfold') }}">Learn more</a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
|
||||||
|
<section class="d-flex gap-3 center ln-section--marketplace"> |
||||||
|
<div class="container mt-5"> |
||||||
|
<h1>Media Marketplace</h1> |
||||||
|
<p class="eyebrow">Coming soon</p> |
||||||
|
</div> |
||||||
|
<div class="mb-5"> |
||||||
|
<p class="measure">Commission custom visuals, discover stock you can actually use, and keep media and text in one creative flow.</p> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
{% endblock %} |
||||||
@ -0,0 +1,45 @@ |
|||||||
|
{% extends 'layout-full.html.twig' %} |
||||||
|
|
||||||
|
{% block title %}Decent Newsroom — A decentralized platform for collaborative publishing{% endblock %} |
||||||
|
|
||||||
|
{% block body %} |
||||||
|
|
||||||
|
<section class="ln-hero d-flex gap-3 center"> |
||||||
|
<h1 class="brand">Unfold</h1> |
||||||
|
<p class="eyebrow">by Decent Newsroom</p> |
||||||
|
<p class="lede mb-5">Your magazine, your way.</p> |
||||||
|
</section> |
||||||
|
|
||||||
|
<section class="d-flex gap-3 center ln-section--unfold"> |
||||||
|
<div class="container mt-5"> |
||||||
|
<h2>Unfold is a skin for your magazine</h2> |
||||||
|
</div> |
||||||
|
<div class="mb-5"> |
||||||
|
<p class="measure">Any magazine created on Decent Newsroom can be plugged in, |
||||||
|
styled according to your wishes and deployed to a custom domain.</p> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
<section class="d-flex gap-3 center ln-section--newsroom"> |
||||||
|
<div class="container mt-5"> |
||||||
|
<h2>Unfold Lite</h2> |
||||||
|
</div> |
||||||
|
<div class="mb-5"> |
||||||
|
<p class="measure">We also offer subdomains, if rolling out your own website feels daunting.</p> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
<section class="d-flex gap-3 center ln-section--marketplace"> |
||||||
|
<div class="container mt-5"> |
||||||
|
<h2>Interested?</h2> |
||||||
|
</div> |
||||||
|
<div class="mb-5"> |
||||||
|
<p class="measure">Reach out to |
||||||
|
<twig:Molecules:UserFromNpub ident="{{ project_npub }}" /> or |
||||||
|
<twig:Molecules:UserFromNpub ident="{{ dev_npub }}" />. |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
|
||||||
|
|
||||||
|
{% endblock %} |
||||||
Loading…
Reference in new issue