|
{% extends "base.html" %}
|
|
{% block footer %}{% endblock %}
|
|
{% block extra_head %}
|
|
<link rel="stylesheet" href="{{ static_url('/static/css/landing.css') }}">
|
|
<link rel="stylesheet" href="{{ static_url('/static/css/news.css') }}">
|
|
{% endblock %}
|
|
{% block content %}
|
|
<div class="landing">
|
|
{% if user %}
|
|
<div class="dashboard">
|
|
<div class="dashboard-top">
|
|
<div class="dashboard-actions">
|
|
<div class="dashboard-welcome">
|
|
{% set _user = user %}{% set _size = 48 %}{% set _size_class = "md" %}{% include "_avatar_link.html" %}
|
|
<span class="dashboard-greeting">Welcome back, <strong>{{ user['username'] }}</strong></span>
|
|
</div>
|
|
<div class="dashboard-buttons">
|
|
<a href="/feed" class="dashboard-btn dashboard-btn-primary">New Post</a>
|
|
<a href="/game" class="dashboard-btn">Code Farm</a>
|
|
<a href="/projects" class="dashboard-btn">Projects</a>
|
|
<a href="/gists" class="dashboard-btn">Gists</a>
|
|
</div>
|
|
</div>
|
|
<div class="dashboard-stats">
|
|
<div class="dashboard-stat">
|
|
<span class="dashboard-stat-value">{{ user_post_count }}</span>
|
|
<span class="dashboard-stat-label">Posts</span>
|
|
</div>
|
|
<div class="dashboard-stat">
|
|
<span class="dashboard-stat-value">{{ user_stars }}</span>
|
|
<span class="dashboard-stat-label">Stars</span>
|
|
</div>
|
|
<div class="dashboard-stat dashboard-stat-level">
|
|
<span class="dashboard-stat-value">Lv {{ user_level }}</span>
|
|
<span class="dashboard-stat-label">Level</span>
|
|
<div class="dashboard-xp-bar" role="progressbar" aria-valuenow="{{ xp_progress_pct }}" aria-valuemin="0" aria-valuemax="100" aria-label="XP progress to next level">
|
|
<div class="dashboard-xp-fill" style="width:{{ xp_progress_pct }}%"></div>
|
|
</div>
|
|
<span class="dashboard-xp-label">{{ xp_progress_pct }}% to Lv {{ user_level + 1 }}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="dashboard-main">
|
|
<div class="dashboard-feed">
|
|
{% if landing_posts %}
|
|
<div class="dashboard-feed-header">
|
|
<h2>Latest Posts</h2>
|
|
<a href="/feed" class="dashboard-feed-link">Browse all →</a>
|
|
</div>
|
|
<div class="dashboard-posts-grid">
|
|
{% for item in landing_posts %}
|
|
<article class="dashboard-post-card card-link-host">
|
|
{% set _href = "/posts/" ~ item.slug %}
|
|
{% set _label = item.post.get('title') or 'View post' %}
|
|
{% include "_card_link.html" %}
|
|
<div class="dashboard-post-header">
|
|
{% set _user = item.author %}
|
|
{% set _size = 28 %}
|
|
{% set _size_class = "sm" %}
|
|
{% include "_avatar_link.html" %}
|
|
<div class="dashboard-post-author-wrap">
|
|
{% set _user = item.author %}{% set _class = "dashboard-post-author" %}{% include "_user_link.html" %}
|
|
<span class="dashboard-post-time">{{ dt_ago(item.created_at) if item.created_at else item.time_ago }}</span>
|
|
</div>
|
|
<span class="badge badge-{{ item.post['topic'] }}">{{ item.post['topic'] }}</span>
|
|
</div>
|
|
{% if item.post.get('title') %}
|
|
<h3 class="dashboard-post-title">
|
|
<a href="/posts/{{ item.slug }}">{{ render_title(item.post['title'], author_is_admin=is_admin(item.author)) }}</a>
|
|
</h3>
|
|
{% endif %}
|
|
<div class="dashboard-post-content rendered-content">{{ render_content(item.post['content'][:200] ~ ('...' if item.post['content']|length > 200 else ''), author_is_admin=is_admin(item.author)) }}</div>
|
|
<div class="dashboard-post-footer">
|
|
<span class="dashboard-post-stat">+{{ item.stars }}</span>
|
|
<span class="dashboard-post-stat">💬 {{ item.comment_count }}</span>
|
|
<a href="/posts/{{ item.slug }}" class="dashboard-post-open">Open →</a>
|
|
</div>
|
|
</article>
|
|
{% endfor %}
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
<aside class="dashboard-sidebar">
|
|
{% if top_contributors %}
|
|
<div class="dashboard-sidebar-card">
|
|
<h3 class="dashboard-sidebar-heading">Top Contributors</h3>
|
|
<ul class="dashboard-contributor-list">
|
|
{% for author in top_contributors %}
|
|
<li class="dashboard-contributor">
|
|
{% set _user = author %}{% set _size = 28 %}{% set _size_class = "sm" %}{% include "_avatar_link.html" %}
|
|
<div class="dashboard-contributor-meta">
|
|
{% set _user = author %}{% set _class = "dashboard-contributor-name" %}{% include "_user_link.html" %}
|
|
<span class="dashboard-contributor-stars">{{ author.get('stars', 0) }} stars</span>
|
|
</div>
|
|
</li>
|
|
{% endfor %}
|
|
</ul>
|
|
<a href="/leaderboard" class="dashboard-sidebar-link">View leaderboard →</a>
|
|
</div>
|
|
{% endif %}
|
|
{% if trending_topics %}
|
|
<div class="dashboard-sidebar-card">
|
|
<h3 class="dashboard-sidebar-heading">Trending Topics</h3>
|
|
<div class="dashboard-tag-cloud">
|
|
{% for item in trending_topics %}
|
|
<a href="/feed?topic={{ item.topic }}" class="dashboard-tag">
|
|
<span class="badge badge-{{ item.topic }}">{{ item.topic }}</span>
|
|
<span class="dashboard-tag-count">{{ item.count }}</span>
|
|
</a>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
</aside>
|
|
</div>
|
|
</div>
|
|
{% else %}
|
|
<section class="landing-hero">
|
|
<h1>Devplace.net - The Developer <span>Social Network</span></h1>
|
|
<p>Track industry shifts. Discover bold releases. Share what you're building in an open, uncensored environment.</p>
|
|
<a href="/auth/signup" class="landing-cta"><span class="icon">✨</span> Join DevPlace Free</a>
|
|
|
|
<div class="landing-features">
|
|
<div class="landing-feature">
|
|
<div class="landing-feature-icon">🔑</div>
|
|
<h3>100% Free Forever</h3>
|
|
</div>
|
|
<div class="landing-feature">
|
|
<div class="landing-feature-icon">🚫</div>
|
|
<h3>Zero Ads</h3>
|
|
</div>
|
|
<div class="landing-feature">
|
|
<div class="landing-feature-icon">💭</div>
|
|
<h3>No Censorship</h3>
|
|
</div>
|
|
<div class="landing-feature">
|
|
<div class="landing-feature-icon">💳</div>
|
|
<h3>No Payments</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="landing-auth-link">
|
|
Already have an account? <a href="/auth/login">Log In</a>
|
|
</div>
|
|
</section>
|
|
{% endif %}
|
|
|
|
<section class="landing-game" aria-labelledby="landing-game-heading">
|
|
<div class="landing-game-glow"></div>
|
|
<div class="landing-game-body">
|
|
<span class="landing-game-eyebrow">New on DevPlace</span>
|
|
<h2 id="landing-game-heading" class="landing-game-title">
|
|
Code Farm <span>- grow software, not vegetables</span>
|
|
</h2>
|
|
<p class="landing-game-tagline">
|
|
Plant projects that build in real time, harvest coins and XP, upgrade your CI pipeline,
|
|
and unlock the prestige grind. Then water your friends' builds - or raid the ones who left
|
|
a harvest sitting too long.
|
|
</p>
|
|
<div class="landing-game-crops" aria-hidden="true">
|
|
<span title="Shell Script">🐚</span>
|
|
<span title="Python Script">🐍</span>
|
|
<span title="Web App">📜</span>
|
|
<span title="Go Service">🐹</span>
|
|
<span title="Rust Engine">🦀</span>
|
|
<span title="Compiler">λ</span>
|
|
<span title="Kernel">⚙️</span>
|
|
</div>
|
|
<ul class="landing-game-points">
|
|
<li>7 project tiers, from 30-second scripts to 2-hour kernels</li>
|
|
<li>CI upgrades, a four-branch perk tree, and stacking prestige boosts</li>
|
|
<li>Co-op watering, PvP raids, daily streaks, quests, and a global leaderboard</li>
|
|
</ul>
|
|
{% if user %}
|
|
<a href="/game" class="landing-game-cta"><span class="icon">🌾</span> Play Code Farm →</a>
|
|
{% else %}
|
|
<a href="/auth/signup" class="landing-game-cta"><span class="icon">🌾</span> Join free to play →</a>
|
|
{% endif %}
|
|
</div>
|
|
</section>
|
|
|
|
{% if landing_posts and not user %}
|
|
<section class="landing-section" aria-labelledby="landing-posts-heading">
|
|
<div class="landing-section-header">
|
|
<h2 id="landing-posts-heading">Latest Posts</h2>
|
|
<a href="/feed" class="landing-section-link">Browse all posts →</a>
|
|
</div>
|
|
<div class="landing-posts-grid">
|
|
{% for item in landing_posts %}
|
|
<article class="landing-post-card card-link-host">
|
|
{% set _href = "/posts/" ~ item.slug %}
|
|
{% set _label = item.post.get('title') or 'View post' %}
|
|
{% include "_card_link.html" %}
|
|
<div class="landing-post-header">
|
|
{% set _user = item.author %}
|
|
{% set _size = 28 %}
|
|
{% set _size_class = "sm" %}
|
|
{% include "_avatar_link.html" %}
|
|
<div class="landing-post-author-wrap">
|
|
{% set _user = item.author %}{% set _class = "landing-post-author" %}{% include "_user_link.html" %}
|
|
<span class="landing-post-time">{{ dt_ago(item.created_at) if item.created_at else item.time_ago }}</span>
|
|
</div>
|
|
<span class="badge badge-{{ item.post['topic'] }}">{{ item.post['topic'] }}</span>
|
|
</div>
|
|
{% if item.post.get('title') %}
|
|
<h3 class="landing-post-title">
|
|
<a href="/posts/{{ item.slug }}">{{ render_title(item.post['title'], author_is_admin=is_admin(item.author)) }}</a>
|
|
</h3>
|
|
{% endif %}
|
|
<div class="landing-post-content rendered-content">{{ render_content(item.post['content'][:200] ~ ('...' if item.post['content']|length > 200 else ''), author_is_admin=is_admin(item.author)) }}</div>
|
|
<div class="landing-post-footer">
|
|
<span class="landing-post-stat">+{{ item.stars }}</span>
|
|
<span class="landing-post-stat">💬 {{ item.comment_count }}</span>
|
|
<a href="/posts/{{ item.slug }}" class="landing-post-open">Open →</a>
|
|
</div>
|
|
</article>
|
|
{% endfor %}
|
|
</div>
|
|
</section>
|
|
{% endif %}
|
|
|
|
{% if landing_articles %}
|
|
<section class="landing-section" aria-labelledby="landing-news-heading">
|
|
<div class="landing-section-header">
|
|
<h2 id="landing-news-heading">Developer News</h2>
|
|
<a href="/news" class="landing-section-link">View all news →</a>
|
|
</div>
|
|
<div class="news-grid">
|
|
{% for item in landing_articles %}
|
|
<article class="news-card card-link-host">
|
|
{% set _href = "/news/" ~ (item.slug or item.uid) %}
|
|
{% set _label = item.title %}
|
|
{% include "_card_link.html" %}
|
|
{% if item.image_url %}
|
|
<div class="news-card-image">
|
|
<img src="{{ item.image_url }}" alt="{{ item.title }}" loading="lazy" class="image-fallback">
|
|
</div>
|
|
{% endif %}
|
|
<div class="news-card-body">
|
|
<div class="news-card-meta">
|
|
<span class="news-source">{{ item.source_name }}</span>
|
|
{% if is_admin(user) %}
|
|
{% if item.featured %}
|
|
<span class="news-featured-badge">★ Featured</span>
|
|
{% endif %}
|
|
{% if item.grade >= 9 %}
|
|
<span class="news-grade news-grade-top">Grade {{ item.grade }}</span>
|
|
{% elif item.grade >= 7 %}
|
|
<span class="news-grade news-grade-high">Grade {{ item.grade }}</span>
|
|
{% else %}
|
|
<span class="news-grade">Grade {{ item.grade }}</span>
|
|
{% endif %}
|
|
{% endif %}
|
|
<span class="news-time">{{ dt_ago(item.synced_at) if item.synced_at else item.time_ago }}</span>
|
|
</div>
|
|
<h3 class="news-card-title">
|
|
<a href="/news/{{ item.slug or item.uid }}">{{ render_title(item.title) }}</a>
|
|
</h3>
|
|
{% if item.description %}
|
|
<div class="news-card-desc rendered-content">{{ render_content(item.description[:250]) }}</div>
|
|
{% endif %}
|
|
<a href="{{ item.url }}" target="_blank" rel="noopener" class="news-read-link">
|
|
Read on {{ item.source_name }} ↗
|
|
</a>
|
|
</div>
|
|
</article>
|
|
{% endfor %}
|
|
</div>
|
|
</section>
|
|
{% endif %}
|
|
|
|
<section class="landing-section landing-help" aria-labelledby="landing-help-heading">
|
|
<div class="landing-section-header">
|
|
<h2 id="landing-help-heading">Build With Us</h2>
|
|
<a href="/docs/index.html" class="landing-section-link">Browse the docs →</a>
|
|
</div>
|
|
<p class="landing-help-intro">DevPlace is built in the open and made to be extended. Read the docs, explore the API, file an issue, or let Devii - our in-platform AI developer - do the work with you. Everything you need to start contributing is one click away.</p>
|
|
<div class="landing-help-grid">
|
|
<div class="landing-help-card">
|
|
<div class="landing-help-icon">📚</div>
|
|
<h3>Documentation</h3>
|
|
<p>Guides, the design system, component references, and deep internals - tiered for newcomers and operators alike.</p>
|
|
<a href="/docs/index.html" class="landing-help-link">Read the docs →</a>
|
|
</div>
|
|
<div class="landing-help-card">
|
|
<div class="landing-help-icon">🧩</div>
|
|
<h3>API Reference</h3>
|
|
<p>A complete REST API with live OpenAPI schema. Build integrations, bots, and tools on top of every endpoint.</p>
|
|
<div class="landing-help-links">
|
|
<a href="/swagger">Swagger UI</a>
|
|
<a href="/openapi.json">OpenAPI JSON</a>
|
|
</div>
|
|
</div>
|
|
<div class="landing-help-card">
|
|
<div class="landing-help-icon">🐛</div>
|
|
<h3>Contribute & Report</h3>
|
|
<p>Found a bug or have an idea? Open an issue and follow it through to resolution in the integrated tracker.</p>
|
|
<a href="/issues" class="landing-help-link">Open the issue tracker →</a>
|
|
</div>
|
|
<div class="landing-help-card landing-help-card-lead">
|
|
<div class="landing-help-icon">🤖</div>
|
|
<h3>Meet Devii</h3>
|
|
<p>Devii is your AI developer built into the platform. Ask it to write posts, manage projects, run containers, edit files, and guide you live on the page.</p>
|
|
<button type="button" class="landing-help-cta" data-devii-open>Launch Devii</button>
|
|
<a href="/devii/" class="landing-help-link">Open the full terminal →</a>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<footer class="landing-footer">
|
|
{% include "_footer_links.html" %}
|
|
</footer>
|
|
</div>
|
|
{% endblock %}
|