+ {{title}} +
+{{ truncate(content, 150) }}
+diff --git a/logo.png b/logo.png
new file mode 100644
index 0000000..8c280be
Binary files /dev/null and b/logo.png differ
diff --git a/themes/modern-card-ui/card-template.html b/themes/modern-card-ui/card-template.html
new file mode 100644
index 0000000..2121975
--- /dev/null
+++ b/themes/modern-card-ui/card-template.html
@@ -0,0 +1,59 @@
+
+
+ {{ truncate(content, 150) }}
+ {{title}}
+
+ Comments ({{replies}})
+ {{comments_section|safe}}
+
{{ posts|length }} posts
+{{ renderMarkdown(content)|safe }}
+{% endif %} +``` + +### Looping Tags: +``` +{% for tag in tags if tag %} + {{ tag }} +{% endfor %} +``` + +### Styling by Depth (comments): +``` +{{ renderMarkdown(content)|safe }}
{% endif %} +{{renderMarkdown(content)|safe}}
+{{ posts|length }} posts
+')
+ .replace(/\n/g, '
')
+ .replace(/\*\*(.*?)\*\*/g, '$1')
+ .replace(/\*(.*?)\*/g, '$1')
+ .replace(/\[(.*?)\]\((.*?)\)/g, '$1');
+ }
+}
+
+// Export for use
+export default VanillaRenderer;
diff --git a/themes/vanilla-js/styles.css b/themes/vanilla-js/styles.css
new file mode 100644
index 0000000..2235ac4
--- /dev/null
+++ b/themes/vanilla-js/styles.css
@@ -0,0 +1,336 @@
+/* Vanilla JS Theme Styles */
+
+:root {
+ --bg-primary: #ffffff;
+ --bg-secondary: #f6f7f8;
+ --bg-hover: #f0f1f2;
+ --text-primary: #1c1c1c;
+ --text-secondary: #7c7c7c;
+ --border-color: #e0e0e0;
+ --accent-reddit: #ff4500;
+ --accent-hn: #ff6600;
+ --accent-lobsters: #990000;
+ --accent-se: #0077cc;
+}
+
+/* Card Template Styles */
+.post-card {
+ background: var(--bg-primary);
+ border: 1px solid var(--border-color);
+ border-radius: 8px;
+ padding: 16px;
+ margin-bottom: 16px;
+ transition: box-shadow 0.2s, transform 0.2s;
+}
+
+.post-card:hover {
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+ transform: translateY(-2px);
+}
+
+.post-header {
+ margin-bottom: 12px;
+}
+
+.post-meta {
+ display: flex;
+ gap: 8px;
+ margin-bottom: 8px;
+}
+
+.platform-badge {
+ display: inline-block;
+ padding: 4px 8px;
+ border-radius: 4px;
+ font-size: 12px;
+ font-weight: 600;
+ text-transform: uppercase;
+}
+
+.platform-reddit { background: var(--accent-reddit); color: white; }
+.platform-hackernews { background: var(--accent-hn); color: white; }
+.platform-lobsters { background: var(--accent-lobsters); color: white; }
+.platform-stackexchange { background: var(--accent-se); color: white; }
+
+.post-source {
+ color: var(--text-secondary);
+ font-size: 14px;
+}
+
+.post-title {
+ margin: 0 0 12px 0;
+ font-size: 18px;
+ line-height: 1.4;
+}
+
+.post-title a {
+ color: var(--text-primary);
+ text-decoration: none;
+}
+
+.post-title a:hover {
+ text-decoration: underline;
+}
+
+.post-info {
+ display: flex;
+ gap: 12px;
+ margin-bottom: 12px;
+ font-size: 14px;
+ color: var(--text-secondary);
+}
+
+.post-content {
+ margin-bottom: 12px;
+}
+
+.post-excerpt {
+ color: var(--text-secondary);
+ line-height: 1.6;
+}
+
+.post-footer {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.post-stats {
+ display: flex;
+ gap: 16px;
+ font-size: 14px;
+}
+
+.stat-score,
+.stat-replies {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ color: var(--text-secondary);
+}
+
+.post-tags {
+ display: flex;
+ gap: 8px;
+ flex-wrap: wrap;
+}
+
+.tag {
+ background: var(--bg-secondary);
+ padding: 4px 8px;
+ border-radius: 4px;
+ font-size: 12px;
+ color: var(--text-secondary);
+}
+
+/* List Template Styles */
+.post-list-item {
+ display: flex;
+ gap: 12px;
+ padding: 12px;
+ border-bottom: 1px solid var(--border-color);
+ transition: background 0.2s;
+}
+
+.post-list-item:hover {
+ background: var(--bg-hover);
+}
+
+.post-vote {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ min-width: 40px;
+}
+
+.vote-score {
+ font-weight: 600;
+ font-size: 14px;
+ color: var(--text-secondary);
+}
+
+.post-main {
+ flex: 1;
+}
+
+.post-list-item .post-title {
+ margin: 0 0 8px 0;
+ font-size: 16px;
+}
+
+.post-metadata {
+ display: flex;
+ gap: 8px;
+ font-size: 12px;
+ color: var(--text-secondary);
+ flex-wrap: wrap;
+}
+
+/* Detail Template Styles */
+.post-detail {
+ max-width: 800px;
+ margin: 0 auto;
+ padding: 24px;
+}
+
+.breadcrumb {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 16px;
+ font-size: 14px;
+}
+
+.separator {
+ color: var(--text-secondary);
+}
+
+.detail-title {
+ font-size: 32px;
+ line-height: 1.3;
+ margin: 0 0 16px 0;
+}
+
+.detail-meta {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 16px 0;
+ border-top: 1px solid var(--border-color);
+ border-bottom: 1px solid var(--border-color);
+ margin-bottom: 24px;
+}
+
+.author-info {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+}
+
+.author-name {
+ font-weight: 600;
+ font-size: 16px;
+}
+
+.detail-content {
+ line-height: 1.8;
+ margin-bottom: 24px;
+}
+
+.detail-content p {
+ margin-bottom: 16px;
+}
+
+.detail-tags {
+ display: flex;
+ gap: 8px;
+ margin-bottom: 24px;
+ flex-wrap: wrap;
+}
+
+.detail-footer {
+ padding-top: 24px;
+ border-top: 1px solid var(--border-color);
+}
+
+.source-link-btn {
+ display: inline-block;
+ padding: 12px 24px;
+ background: var(--accent-reddit);
+ color: white;
+ text-decoration: none;
+ border-radius: 6px;
+ font-weight: 600;
+ transition: opacity 0.2s;
+}
+
+.source-link-btn:hover {
+ opacity: 0.9;
+}
+
+/* Comment Styles */
+.comments-section {
+ margin-top: 32px;
+ padding-top: 24px;
+ border-top: 2px solid var(--border-color);
+}
+
+.comment {
+ background: var(--bg-primary);
+ border-left: 2px solid var(--border-color);
+ padding: 12px;
+ margin-bottom: 8px;
+ transition: background 0.2s;
+}
+
+.comment:hover {
+ background: var(--bg-hover);
+}
+
+.comment-header {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ margin-bottom: 8px;
+ font-size: 14px;
+}
+
+.comment-author {
+ font-weight: 600;
+ color: var(--text-primary);
+}
+
+.comment-time {
+ color: var(--text-secondary);
+ font-size: 12px;
+}
+
+.comment-score {
+ color: var(--text-secondary);
+ font-size: 12px;
+ margin-left: auto;
+}
+
+.comment-body {
+ margin-bottom: 8px;
+}
+
+.comment-content {
+ margin: 0;
+ line-height: 1.6;
+ color: var(--text-primary);
+}
+
+.comment-content p {
+ margin: 0 0 8px 0;
+}
+
+.comment-footer {
+ font-size: 12px;
+ color: var(--text-secondary);
+}
+
+.comment-depth-indicator {
+ opacity: 0.6;
+}
+
+.comment-children {
+ margin-top: 8px;
+}
+
+/* Depth-based styling */
+.comment[data-depth="0"] {
+ border-left-color: var(--accent-reddit);
+}
+
+.comment[data-depth="1"] {
+ border-left-color: var(--accent-hn);
+}
+
+.comment[data-depth="2"] {
+ border-left-color: var(--accent-lobsters);
+}
+
+.comment[data-depth="3"] {
+ border-left-color: var(--accent-se);
+}
diff --git a/themes/vanilla-js/theme.json b/themes/vanilla-js/theme.json
new file mode 100644
index 0000000..f1f5ddc
--- /dev/null
+++ b/themes/vanilla-js/theme.json
@@ -0,0 +1,56 @@
+{
+ "template_id": "vanilla-js-theme",
+ "template_path": "./themes/vanilla-js",
+ "template_type": "card",
+ "data_schema": "../../schemas/post_schema.json",
+ "required_fields": [
+ "platform",
+ "id",
+ "title",
+ "author",
+ "timestamp",
+ "score",
+ "replies",
+ "url"
+ ],
+ "optional_fields": [
+ "content",
+ "source",
+ "tags",
+ "meta"
+ ],
+ "css_dependencies": [
+ "./themes/vanilla-js/styles.css"
+ ],
+ "js_dependencies": [
+ "./themes/vanilla-js/renderer.js"
+ ],
+ "templates": {
+ "card": "./themes/vanilla-js/card-template.html",
+ "list": "./themes/vanilla-js/list-template.html",
+ "detail": "./themes/vanilla-js/detail-template.html",
+ "comment": "./themes/vanilla-js/comment-template.html"
+ },
+ "render_options": {
+ "container_selector": "#posts-container",
+ "batch_size": 50,
+ "lazy_load": true,
+ "animate": true
+ },
+ "filters": {
+ "platform": true,
+ "date_range": true,
+ "score_threshold": true,
+ "source": true
+ },
+ "sorting": {
+ "default_field": "timestamp",
+ "default_order": "desc",
+ "available_fields": [
+ "timestamp",
+ "score",
+ "replies",
+ "title"
+ ]
+ }
+}