61 changed files with 1051 additions and 269 deletions
@ -0,0 +1,115 @@
@@ -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 @@
@@ -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 @@
@@ -1,4 +1,9 @@
|
||||
<a {% if path('magazine-category', { 'slug' : slug }) in app.request.uri %}class="active"{% endif %} |
||||
href="{{ path('magazine-category', { 'slug' : slug }) }}"> |
||||
{% if mag is defined and mag and 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 }} |
||||
</a> |
||||
|
||||
@ -1,24 +1,103 @@
@@ -1,24 +1,103 @@
|
||||
{% extends 'base.html.twig' %} |
||||
{% extends 'layout-full.html.twig' %} |
||||
|
||||
{% block nav %} |
||||
{% endblock %} |
||||
{% block title %}Decent Newsroom — A decentralized platform for collaborative publishing{% endblock %} |
||||
|
||||
{% 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" /> |
||||
|
||||
<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> |
||||
{% endblock %} |
||||
</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> |
||||
|
||||
{% block aside %} |
||||
<h6>Magazines</h6> |
||||
<twig:Organisms:ZineList /> |
||||
<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 %} |
||||
|
||||
@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
|
||||
{% extends 'base.html.twig' %} |
||||
|
||||
{% block layout %} |
||||
{% block body %}{% endblock %} |
||||
{% endblock %} |
||||
@ -0,0 +1,41 @@
@@ -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 @@
@@ -0,0 +1,5 @@
|
||||
{% extends 'layout.html.twig' %} |
||||
|
||||
{% block body %} |
||||
<twig:Organisms:CardList :list="latest" /> |
||||
{% endblock %} |
||||
@ -0,0 +1,14 @@
@@ -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 @@
@@ -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 @@
@@ -1,8 +1,14 @@
|
||||
{% extends 'base.html.twig' %} |
||||
{% extends 'layout.html.twig' %} |
||||
|
||||
{% block nav %} |
||||
{% endblock %} |
||||
|
||||
{% 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 /> |
||||
{% endblock %} |
||||
|
||||
@ -1,36 +1,43 @@
@@ -1,36 +1,43 @@
|
||||
{% extends 'base.html.twig' %} |
||||
|
||||
{% block nav %} |
||||
{% endblock %} |
||||
{% extends 'layout-full.html.twig' %} |
||||
|
||||
{% block body %} |
||||
<main class="d-flex gap-3 static"> |
||||
<h1>About Decent Newsroom</h1> |
||||
<section> |
||||
<h2>Rebuilding Trust in Journalism</h2> |
||||
|
||||
<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, |
||||
buried under waves of misinformation, clickbait, and AI-generated noise. Worse, sorting truth from falsehood now costs more than spreading lies.</p> |
||||
|
||||
<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> |
||||
</section> |
||||
|
||||
<h2>How It Works</h2> |
||||
<dl> |
||||
<dt><strong>Curated Excellence</strong></dt> |
||||
<dd>We showcase a selection of featured articles.</dd> |
||||
|
||||
<dt><strong>Indexed & Searchable</strong></dt> |
||||
<dd>Every article in Decent Newsroom is easily discoverable, improving access for readers and exposure for authors.</dd> |
||||
<dd>Simple search is available to logged-in users.</dd> |
||||
<dd>Semantic search is in development.</dd> |
||||
|
||||
<dt><strong>Open to Writers & Publishers</strong> <span class="badge">Soon</span></dt> |
||||
<dd>Content creators can request indexing for their work, making it searchable and eligible for inclusion.</dd> |
||||
<dd>Publishers can create and manage their own magazines.</dd> |
||||
</dl> |
||||
|
||||
<section> |
||||
<h2>Why It Matters</h2> |
||||
<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> |
||||
</section> |
||||
|
||||
<br> |
||||
<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> |
||||
<br> |
||||
<p class="measure">For more info reach out to |
||||
<twig:Molecules:UserFromNpub ident="{{ project_npub }}" /> or |
||||
<twig:Molecules:UserFromNpub ident="{{ dev_npub }}" />. |
||||
</p> |
||||
</section> |
||||
</main> |
||||
|
||||
<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> |
||||
|
||||
{% endblock %} |
||||
|
||||
@ -0,0 +1,103 @@
@@ -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 @@
@@ -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