fix(blog-validation): show Le Monde standalone submission package

- Modified loadValidationArticles() to load standalone submissions (no blogPostId)
- Updated rendering to handle both blog posts and standalone packages
- Fixed API endpoint from /api/blog/posts/:id to /api/blog/admin/:id
- Standalone packages show with purple 'STANDALONE PACKAGE' badge
- Button text changes to 'View Package' for standalone submissions
- Cache version bumped to 0.1.1
This commit is contained in:
TheFlow 2025-10-24 09:50:42 +13:00
parent 782c90b2e7
commit 2dd138e71f
21 changed files with 220 additions and 184 deletions

View file

@ -43,8 +43,8 @@
"last_deliberation": null "last_deliberation": null
}, },
"FileEditHook": { "FileEditHook": {
"timestamp": "2025-10-23T20:40:13.114Z", "timestamp": "2025-10-23T20:50:22.509Z",
"file": "/home/theflow/projects/tractatus/scripts/deploy-full-project-SAFE.sh", "file": "/home/theflow/projects/tractatus/public/js/admin/blog-validation.js",
"result": "passed" "result": "passed"
}, },
"FileWriteHook": { "FileWriteHook": {
@ -58,25 +58,25 @@
"tokens": 30000 "tokens": 30000
}, },
"alerts": [], "alerts": [],
"last_updated": "2025-10-23T20:41:13.338Z", "last_updated": "2025-10-23T20:50:22.509Z",
"initialized": true, "initialized": true,
"framework_components": { "framework_components": {
"CrossReferenceValidator": { "CrossReferenceValidator": {
"message": 0, "message": 0,
"tokens": 0, "tokens": 0,
"timestamp": "2025-10-23T20:43:13.295Z", "timestamp": "2025-10-23T20:50:39.753Z",
"last_validation": "2025-10-23T20:43:13.294Z", "last_validation": "2025-10-23T20:50:39.752Z",
"validations_performed": 627 "validations_performed": 637
}, },
"BashCommandValidator": { "BashCommandValidator": {
"message": 0, "message": 0,
"tokens": 0, "tokens": 0,
"timestamp": null, "timestamp": null,
"last_validation": "2025-10-23T20:43:13.296Z", "last_validation": "2025-10-23T20:50:39.753Z",
"validations_performed": 301, "validations_performed": 305,
"blocks_issued": 37 "blocks_issued": 37
} }
}, },
"action_count": 301, "action_count": 305,
"auto_compact_events": [] "auto_compact_events": []
} }

View file

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>About | Tractatus AI Safety Framework</title> <title>About | Tractatus AI Safety Framework</title>
<meta name="description" content="Learn about the Tractatus Framework: our mission, values, team, and commitment to preserving human agency through structural AI safety."> <meta name="description" content="Learn about the Tractatus Framework: our mission, values, team, and commitment to preserving human agency through structural AI safety.">
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761252631849">
<style> <style>
/* Accessibility: Skip link */ /* Accessibility: Skip link */
.skip-link { position: absolute; left: -9999px; top: 0; } .skip-link { position: absolute; left: -9999px; top: 0; }
@ -28,7 +28,7 @@
<a href="#main-content" class="skip-link">Skip to main content</a> <a href="#main-content" class="skip-link">Skip to main content</a>
<!-- Navigation (injected by navbar.js) --> <!-- Navigation (injected by navbar.js) -->
<script src="/js/components/navbar.js?v=0.1.0.1761251931745"></script> <script src="/js/components/navbar.js?v=0.1.0.1761252631849"></script>
<!-- Breadcrumb Navigation --> <!-- Breadcrumb Navigation -->
<nav class="bg-gray-50 border-b border-gray-200 py-3" aria-label="Breadcrumb"> <nav class="bg-gray-50 border-b border-gray-200 py-3" aria-label="Breadcrumb">
@ -310,17 +310,17 @@
<!-- Footer with Te Tiriti Acknowledgment --> <!-- Footer with Te Tiriti Acknowledgment -->
<!-- Footer --> <!-- Footer -->
<!-- Internationalization --> <!-- Internationalization -->
<script src="/js/i18n-simple.js?v=0.1.0.1761251931745"></script> <script src="/js/i18n-simple.js?v=0.1.0.1761252631849"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761251931745"></script> <script src="/js/components/language-selector.js?v=0.1.0.1761252631849"></script>
<!-- Scroll Animations (Phase 3) --> <!-- Scroll Animations (Phase 3) -->
<script src="/js/scroll-animations.js?v=0.1.0.1761251931745"></script> <script src="/js/scroll-animations.js?v=0.1.0.1761252631849"></script>
<!-- Page Transitions (Phase 3) --> <!-- Page Transitions (Phase 3) -->
<script src="/js/page-transitions.js?v=0.1.0.1761251931745"></script> <script src="/js/page-transitions.js?v=0.1.0.1761252631849"></script>
<!-- Footer Component --> <!-- Footer Component -->
<script src="/js/components/footer.js?v=0.1.0.1761251931745"></script> <script src="/js/components/footer.js?v=0.1.0.1761252631849"></script>
</body> </body>
</html> </html>

View file

@ -4,9 +4,9 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>External Communications Manager | Tractatus Admin</title> <title>External Communications Manager | Tractatus Admin</title>
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761252631849">
<script defer src="/js/admin/auth-check.js?v=0.1.0.1761251931745"></script> <script defer src="/js/admin/auth-check.js?v=0.1.0.1761252631849"></script>
<style> <style>
.content-type-card input[type="radio"]:checked + div { .content-type-card input[type="radio"]:checked + div {
border-color: #3b82f6; border-color: #3b82f6;
@ -18,7 +18,7 @@
<!-- Navigation --> <!-- Navigation -->
<div id="admin-navbar" data-page-title="External Communications" data-page-icon="blog"></div> <div id="admin-navbar" data-page-title="External Communications" data-page-icon="blog"></div>
<script src="/js/components/navbar-admin.js?v=0.1.0.1761251931745"></script> <script src="/js/components/navbar-admin.js?v=0.1.0.1761252631849"></script>
<!-- Main Content --> <!-- Main Content -->
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8"> <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
@ -413,10 +413,10 @@
<!-- Modals --> <!-- Modals -->
<div id="modal-container"></div> <div id="modal-container"></div>
<script src="/js/admin/blog-curation.js?v=0.1.0.1761251931745"></script> <script src="/js/admin/blog-curation.js?v=0.1.0.1761252631849"></script>
<script src="/js/admin/blog-curation-enhanced.js?v=0.1.0.1761251931745"></script> <script src="/js/admin/blog-curation-enhanced.js?v=0.1.0.1761252631849"></script>
<script src="/js/admin/blog-validation.js?v=0.1.0.1761251931745"></script> <script src="/js/admin/blog-validation.js?v=0.1.0.1761252631849"></script>
<script src="/js/admin/submission-modal-enhanced.js?v=0.1.0.1761251931745"></script> <script src="/js/admin/submission-modal-enhanced.js?v=0.1.0.1761252631849"></script>
</body> </body>
</html> </html>

View file

@ -5,8 +5,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>API Reference | Tractatus Framework</title> <title>API Reference | Tractatus Framework</title>
<meta name="description" content="Complete API reference for Tractatus Framework - endpoints, authentication, request/response formats, and examples."> <meta name="description" content="Complete API reference for Tractatus Framework - endpoints, authentication, request/response formats, and examples.">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761252631849">
<style> <style>
.endpoint-badge { .endpoint-badge {
@apply inline-block px-2 py-1 rounded text-xs font-mono font-semibold; @apply inline-block px-2 py-1 rounded text-xs font-mono font-semibold;
@ -869,7 +869,7 @@
<!-- Footer --> <!-- Footer -->
<!-- Footer Component --> <!-- Footer Component -->
<script src="/js/components/footer.js?v=0.1.0.1761251931745"></script> <script src="/js/components/footer.js?v=0.1.0.1761252631849"></script>
</body> </body>
</html> </html>

View file

@ -31,8 +31,8 @@
<!-- RSS Feed --> <!-- RSS Feed -->
<link rel="alternate" type="application/rss+xml" title="Tractatus Blog RSS Feed" href="/api/blog/rss"> <link rel="alternate" type="application/rss+xml" title="Tractatus Blog RSS Feed" href="/api/blog/rss">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761252631849">
<style> <style>
/* Accessibility: Skip link */ /* Accessibility: Skip link */
.skip-link { position: absolute; left: -9999px; top: 0; } .skip-link { position: absolute; left: -9999px; top: 0; }
@ -118,7 +118,7 @@
<a href="#main-content" class="skip-link">Skip to main content</a> <a href="#main-content" class="skip-link">Skip to main content</a>
<!-- Navigation (injected by navbar.js) --> <!-- Navigation (injected by navbar.js) -->
<script src="/js/components/navbar.js?v=0.1.0.1761251931745"></script> <script src="/js/components/navbar.js?v=0.1.0.1761252631849"></script>
<!-- Breadcrumb --> <!-- Breadcrumb -->
<div class="bg-white border-b border-gray-200"> <div class="bg-white border-b border-gray-200">
@ -226,10 +226,10 @@
<!-- Footer --> <!-- Footer -->
<!-- Load Blog Post JavaScript --> <!-- Load Blog Post JavaScript -->
<script src="/js/blog-post.js?v=0.1.0.1761251931745"></script> <script src="/js/blog-post.js?v=0.1.0.1761252631849"></script>
<!-- Footer Component --> <!-- Footer Component -->
<script src="/js/components/footer.js?v=0.1.0.1761251931745"></script> <script src="/js/components/footer.js?v=0.1.0.1761252631849"></script>
</body> </body>
</html> </html>

View file

@ -28,8 +28,8 @@
<!-- RSS Feed --> <!-- RSS Feed -->
<link rel="alternate" type="application/rss+xml" title="Tractatus Blog RSS Feed" href="/api/blog/rss"> <link rel="alternate" type="application/rss+xml" title="Tractatus Blog RSS Feed" href="/api/blog/rss">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761252631849">
<style> <style>
/* Accessibility: Skip link */ /* Accessibility: Skip link */
.skip-link { position: absolute; left: -9999px; top: 0; } .skip-link { position: absolute; left: -9999px; top: 0; }
@ -50,7 +50,7 @@
<a href="#main-content" class="skip-link">Skip to main content</a> <a href="#main-content" class="skip-link">Skip to main content</a>
<!-- Navigation (injected by navbar.js) --> <!-- Navigation (injected by navbar.js) -->
<script src="/js/components/navbar.js?v=0.1.0.1761251931745"></script> <script src="/js/components/navbar.js?v=0.1.0.1761252631849"></script>
<!-- Hero Section --> <!-- Hero Section -->
<div class="bg-gradient-to-br from-indigo-50 to-blue-50 py-20"> <div class="bg-gradient-to-br from-indigo-50 to-blue-50 py-20">
@ -260,14 +260,14 @@
<!-- Footer --> <!-- Footer -->
<!-- Internationalization (must load first for footer translations) --> <!-- Internationalization (must load first for footer translations) -->
<script src="/js/i18n-simple.js?v=0.1.0.1761251931745"></script> <script src="/js/i18n-simple.js?v=0.1.0.1761252631849"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761251931745"></script> <script src="/js/components/language-selector.js?v=0.1.0.1761252631849"></script>
<!-- Load Blog JavaScript --> <!-- Load Blog JavaScript -->
<script src="/js/blog.js?v=0.1.0.1761251931745"></script> <script src="/js/blog.js?v=0.1.0.1761252631849"></script>
<!-- Footer Component --> <!-- Footer Component -->
<script src="/js/components/footer.js?v=0.1.0.1761251931745"></script> <script src="/js/components/footer.js?v=0.1.0.1761252631849"></script>
</body> </body>
</html> </html>

View file

@ -4,9 +4,9 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Submit Case Study | Tractatus AI Safety</title> <title>Submit Case Study | Tractatus AI Safety</title>
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761252631849">
<style> <style>
/* Accessibility: Skip link */ /* Accessibility: Skip link */
.skip-link { position: absolute; left: -9999px; top: 0; } .skip-link { position: absolute; left: -9999px; top: 0; }
@ -78,7 +78,7 @@
<a href="#main-content" class="skip-link">Skip to main content</a> <a href="#main-content" class="skip-link">Skip to main content</a>
<!-- Navigation (injected by navbar.js) --> <!-- Navigation (injected by navbar.js) -->
<script src="/js/components/navbar.js?v=0.1.0.1761251931745"></script> <script src="/js/components/navbar.js?v=0.1.0.1761252631849"></script>
<!-- Main Content --> <!-- Main Content -->
<main id="main-content" class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-12"> <main id="main-content" class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
@ -217,10 +217,10 @@
</main> </main>
<!-- Footer --> <!-- Footer -->
<script src="/js/case-submission.js?v=0.1.0.1761251931745"></script> <script src="/js/case-submission.js?v=0.1.0.1761252631849"></script>
<!-- Footer Component --> <!-- Footer Component -->
<script src="/js/components/footer.js?v=0.1.0.1761251931745"></script> <script src="/js/components/footer.js?v=0.1.0.1761252631849"></script>
</body> </body>
</html> </html>

View file

@ -40,6 +40,6 @@
</ol> </ol>
</div> </div>
<script src="/js/check-version.js?v=0.1.0.1761251931745"></script> <script src="/js/check-version.js?v=0.1.0.1761252631849"></script>
</body> </body>
</html> </html>

View file

@ -4,8 +4,8 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documentation - Tractatus Framework</title> <title>Documentation - Tractatus Framework</title>
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761252631849">
<style> <style>
/* Prose styling for document content */ /* Prose styling for document content */
.prose h1 { @apply text-3xl font-bold mt-8 mb-4 text-gray-900; } .prose h1 { @apply text-3xl font-bold mt-8 mb-4 text-gray-900; }
@ -66,12 +66,12 @@
</div> </div>
<!-- Scripts --> <!-- Scripts -->
<script src="/js/utils/api.js?v=0.1.0.1761251931745"></script> <script src="/js/utils/api.js?v=0.1.0.1761252631849"></script>
<script src="/js/utils/router.js?v=0.1.0.1761251931745"></script> <script src="/js/utils/router.js?v=0.1.0.1761252631849"></script>
<script src="/js/components/document-viewer.js?v=0.1.0.1761251931745"></script> <script src="/js/components/document-viewer.js?v=0.1.0.1761252631849"></script>
<script src="/js/components/code-copy-button.js?v=0.1.0.1761251931745"></script> <script src="/js/components/code-copy-button.js?v=0.1.0.1761252631849"></script>
<script src="/js/components/toc.js?v=0.1.0.1761251931745"></script> <script src="/js/components/toc.js?v=0.1.0.1761252631849"></script>
<script src="/js/docs-viewer-app.js?v=0.1.0.1761251931745"></script> <script src="/js/docs-viewer-app.js?v=0.1.0.1761252631849"></script>
</body> </body>
</html> </html>

View file

@ -24,9 +24,9 @@
<link rel="preload" href="/fonts/inter-400.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/fonts/inter-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/fonts/inter-700.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/fonts/inter-700.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761252631849">
<style> <style>
html { scroll-behavior: smooth; } html { scroll-behavior: smooth; }
@ -485,7 +485,7 @@
<a href="#main-content" class="skip-link">Skip to main content</a> <a href="#main-content" class="skip-link">Skip to main content</a>
<!-- Navigation (injected by navbar.js) --> <!-- Navigation (injected by navbar.js) -->
<script src="/js/components/navbar.js?v=0.1.0.1761251931745" defer></script> <script src="/js/components/navbar.js?v=0.1.0.1761252631849" defer></script>
<!-- Page Header --> <!-- Page Header -->
<div class="bg-white border-b border-gray-200"> <div class="bg-white border-b border-gray-200">
@ -866,15 +866,15 @@
</div> </div>
<!-- Version Management & PWA --> <!-- Version Management & PWA -->
<script src="/js/version-manager.js?v=0.1.0.1761251931745" defer></script> <script src="/js/version-manager.js?v=0.1.0.1761252631849" defer></script>
<script src="/js/components/document-cards.js?v=0.1.0.1761251931745" defer></script> <script src="/js/components/document-cards.js?v=0.1.0.1761252631849" defer></script>
<script src="/js/docs-app.js?v=0.1.0.1761251931745" defer></script> <script src="/js/docs-app.js?v=0.1.0.1761252631849" defer></script>
<script src="/js/docs-search-enhanced.js?v=0.1.0.1761251931745" defer></script> <script src="/js/docs-search-enhanced.js?v=0.1.0.1761252631849" defer></script>
<!-- Internationalization --> <!-- Internationalization -->
<script src="/js/i18n-simple.js?v=0.1.0.1761251931745" defer></script> <script src="/js/i18n-simple.js?v=0.1.0.1761252631849" defer></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761251931745" defer></script> <script src="/js/components/language-selector.js?v=0.1.0.1761252631849" defer></script>
</body> </body>
</html> </html>

View file

@ -18,21 +18,21 @@
<meta name="apple-mobile-web-app-title" content="Tractatus"> <meta name="apple-mobile-web-app-title" content="Tractatus">
<link rel="apple-touch-icon" href="/images/tractatus-icon-new.svg"> <link rel="apple-touch-icon" href="/images/tractatus-icon-new.svg">
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761252631849">
<!-- Syntax highlighting for code blocks --> <!-- Syntax highlighting for code blocks -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css?v=0.1.0.1761252631849">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js?v=0.1.0.1761251931745"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js?v=0.1.0.1761252631849"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/bash.min.js?v=0.1.0.1761251931745"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/bash.min.js?v=0.1.0.1761252631849"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/javascript.min.js?v=0.1.0.1761251931745"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/javascript.min.js?v=0.1.0.1761252631849"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/json.min.js?v=0.1.0.1761251931745"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/json.min.js?v=0.1.0.1761252631849"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/yaml.min.js?v=0.1.0.1761251931745"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/yaml.min.js?v=0.1.0.1761252631849"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/python.min.js?v=0.1.0.1761251931745"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/python.min.js?v=0.1.0.1761252631849"></script>
<!-- Markdown parser --> <!-- Markdown parser -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/11.0.0/marked.min.js?v=0.1.0.1761251931745"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/marked/11.0.0/marked.min.js?v=0.1.0.1761252631849"></script>
<style> <style>
/* Accessibility: Skip link */ /* Accessibility: Skip link */
@ -325,7 +325,7 @@
<a href="#main-content" class="skip-link">Skip to main content</a> <a href="#main-content" class="skip-link">Skip to main content</a>
<!-- Navigation --> <!-- Navigation -->
<script src="/js/components/navbar.js?v=0.1.0.1761251931745"></script> <script src="/js/components/navbar.js?v=0.1.0.1761252631849"></script>
<!-- Hero --> <!-- Hero -->
<div class="bg-gradient-to-br from-blue-50 to-indigo-50 py-16"> <div class="bg-gradient-to-br from-blue-50 to-indigo-50 py-16">
@ -630,16 +630,16 @@
</div> </div>
<!-- Internationalization --> <!-- Internationalization -->
<script src="/js/i18n-simple.js?v=0.1.0.1761251931745"></script> <script src="/js/i18n-simple.js?v=0.1.0.1761252631849"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761251931745"></script> <script src="/js/components/language-selector.js?v=0.1.0.1761252631849"></script>
<!-- Version Management & PWA --> <!-- Version Management & PWA -->
<script src="/js/version-manager.js?v=0.1.0.1761251931745"></script> <script src="/js/version-manager.js?v=0.1.0.1761252631849"></script>
<script src="/js/faq.js?v=0.1.0.1761251931745"></script> <script src="/js/faq.js?v=0.1.0.1761252631849"></script>
<!-- Footer Component --> <!-- Footer Component -->
<script src="/js/components/footer.js?v=0.1.0.1761251931745"></script> <script src="/js/components/footer.js?v=0.1.0.1761252631849"></script>
</body> </body>
</html> </html>

View file

@ -9,9 +9,9 @@
<link rel="manifest" href="/manifest.json"> <link rel="manifest" href="/manifest.json">
<meta name="theme-color" content="#3b82f6"> <meta name="theme-color" content="#3b82f6">
<link rel="icon" type="image/svg+xml" href="/favicon-new.svg"> <link rel="icon" type="image/svg+xml" href="/favicon-new.svg">
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761252631849">
<style> <style>
.skip-link { position: absolute; left: -9999px; top: 0; } .skip-link { position: absolute; left: -9999px; top: 0; }
.skip-link:focus { left: 0; z-index: 100; background: white; padding: 1rem; border: 2px solid #3b82f6; } .skip-link:focus { left: 0; z-index: 100; background: white; padding: 1rem; border: 2px solid #3b82f6; }
@ -45,7 +45,7 @@
<body class="bg-gray-50"> <body class="bg-gray-50">
<a href="#main-content" class="skip-link">Skip to main content</a> <a href="#main-content" class="skip-link">Skip to main content</a>
<script src="/js/components/navbar.js?v=0.1.0.1761251931745"></script> <script src="/js/components/navbar.js?v=0.1.0.1761252631849"></script>
<!-- Breadcrumb --> <!-- Breadcrumb -->
<nav class="bg-gray-50 border-b border-gray-200 py-3" aria-label="Breadcrumb"> <nav class="bg-gray-50 border-b border-gray-200 py-3" aria-label="Breadcrumb">
@ -638,12 +638,12 @@ npm start</code></pre>
</main> </main>
<!-- Footer --> <!-- Footer -->
<script src="/js/i18n-simple.js?v=0.1.0.1761251931745"></script> <script src="/js/i18n-simple.js?v=0.1.0.1761252631849"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761251931745"></script> <script src="/js/components/language-selector.js?v=0.1.0.1761252631849"></script>
<script src="/js/scroll-animations.js?v=0.1.0.1761251931745"></script> <script src="/js/scroll-animations.js?v=0.1.0.1761252631849"></script>
<script src="/js/page-transitions.js?v=0.1.0.1761251931745"></script> <script src="/js/page-transitions.js?v=0.1.0.1761252631849"></script>
<script src="/js/version-manager.js?v=0.1.0.1761251931745"></script> <script src="/js/version-manager.js?v=0.1.0.1761252631849"></script>
<script src="/js/components/footer.js?v=0.1.0.1761251931745"></script> <script src="/js/components/footer.js?v=0.1.0.1761252631849"></script>
</body> </body>
</html> </html>

View file

@ -20,10 +20,10 @@
<link rel="icon" type="image/svg+xml" href="/favicon-new.svg"> <link rel="icon" type="image/svg+xml" href="/favicon-new.svg">
<!-- Fonts --> <!-- Fonts -->
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761252631849">
<style> <style>
.gradient-text { background: linear-gradient(120deg, #3b82f6 0%, #8b5cf6 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; } .gradient-text { background: linear-gradient(120deg, #3b82f6 0%, #8b5cf6 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
.hover-lift { transition: transform 0.2s; } .hover-lift { transition: transform 0.2s; }
@ -47,7 +47,7 @@
<!-- Navigation (injected by navbar.js) --> <!-- Navigation (injected by navbar.js) -->
<div id="navbar-placeholder" class="min-h-16"></div> <div id="navbar-placeholder" class="min-h-16"></div>
<script src="/js/components/navbar.js?v=0.1.0.1761251931745"></script> <script src="/js/components/navbar.js?v=0.1.0.1761252631849"></script>
<!-- Hero Section --> <!-- Hero Section -->
<header role="banner"> <header role="banner">
@ -407,21 +407,21 @@ Additional case studies and research findings documented in technical papers
<!-- Footer --> <!-- Footer -->
<!-- Version Management & PWA --> <!-- Version Management & PWA -->
<script src="/js/version-manager.js?v=0.1.0.1761251931745"></script> <script src="/js/version-manager.js?v=0.1.0.1761252631849"></script>
<!-- Internationalization --> <!-- Internationalization -->
<script src="/js/i18n-simple.js?v=0.1.0.1761251931745"></script> <script src="/js/i18n-simple.js?v=0.1.0.1761252631849"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761251931745"></script> <script src="/js/components/language-selector.js?v=0.1.0.1761252631849"></script>
<!-- Scroll Animations (Phase 3) --> <!-- Scroll Animations (Phase 3) -->
<script src="/js/scroll-animations.js?v=0.1.0.1761251931745"></script> <script src="/js/scroll-animations.js?v=0.1.0.1761252631849"></script>
<!-- Page Transitions (Phase 3) --> <!-- Page Transitions (Phase 3) -->
<script src="/js/page-transitions.js?v=0.1.0.1761251931745"></script> <script src="/js/page-transitions.js?v=0.1.0.1761252631849"></script>
<!-- Footer Component --> <!-- Footer Component -->
<script src="/js/components/footer.js?v=0.1.0.1761251931745"></script> <script src="/js/components/footer.js?v=0.1.0.1761252631849"></script>
</body> </body>
</html> </html>

View file

@ -68,10 +68,10 @@ async function loadValidationArticles() {
const listDiv = document.getElementById('validation-list'); const listDiv = document.getElementById('validation-list');
if (!listDiv) return; if (!listDiv) return;
listDiv.innerHTML = '<div class="px-6 py-8 text-center text-gray-500">Loading articles...</div>'; listDiv.innerHTML = '<div class="px-6 py-8 text-center text-gray-500">Loading articles and submission packages...</div>';
try { try {
// Load articles // Load blog posts with status=pending_review
const articlesResponse = await apiCall('/api/blog/admin/posts?status=pending_review&limit=100'); const articlesResponse = await apiCall('/api/blog/admin/posts?status=pending_review&limit=100');
if (!articlesResponse.ok) { if (!articlesResponse.ok) {
@ -82,40 +82,72 @@ async function loadValidationArticles() {
const articles = articlesData.posts || []; const articles = articlesData.posts || [];
console.log('[Validation] Loaded articles:', articles.length); console.log('[Validation] Loaded articles:', articles.length);
if (articles.length > 0) {
console.log('[Validation] First article._id type:', typeof articles[0]._id, articles[0]._id); // ALSO load standalone submission packages (those without blogPostId)
const submissionsResponse = await apiCall('/api/submissions?limit=100');
const standaloneSubmissions = [];
if (submissionsResponse.ok) {
const submissionsData = await submissionsResponse.json();
const allSubmissions = submissionsData.data || [];
// Filter for standalone submissions (no blogPostId)
allSubmissions.forEach(sub => {
if (!sub.blogPostId) {
standaloneSubmissions.push({
_id: sub._id.toString(),
title: sub.title,
status: 'submission_package',
publicationName: sub.publicationName,
publicationId: sub.publicationId,
wordCount: sub.wordCount,
contentType: sub.contentType,
submissionStatus: sub.status,
isStandalone: true,
submissionData: sub
});
}
});
console.log('[Validation] Loaded standalone submissions:', standaloneSubmissions.length);
} }
if (articles.length === 0) { // Combine articles and standalone submissions
listDiv.innerHTML = '<div class="px-6 py-8 text-center text-gray-500">No articles pending review</div>'; const allItems = [...articles, ...standaloneSubmissions];
if (allItems.length === 0) {
listDiv.innerHTML = '<div class="px-6 py-8 text-center text-gray-500">No articles or packages pending review</div>';
return; return;
} }
// Load submission tracking for each article // Load submission tracking for each blog post article (not standalone submissions)
// Note: Submissions endpoint not yet implemented, gracefully handle 404
const submissionData = {}; const submissionData = {};
// TODO: Uncomment when /api/blog/:id/submissions endpoint is implemented
/*
for (const article of articles) { for (const article of articles) {
const articleId = toStringId(article._id); const articleId = toStringId(article._id);
try { try {
const subResponse = await apiCall(`/api/blog/${articleId}/submissions`); const subResponse = await apiCall(`/api/submissions/by-blog-post/${articleId}`);
if (subResponse.ok) { if (subResponse.ok) {
const subData = await subResponse.json(); const subData = await subResponse.json();
if (subData.submissions && subData.submissions.length > 0) { if (subData.data) {
submissionData[articleId] = subData.submissions[0]; // Get first active submission submissionData[articleId] = subData.data;
} }
} }
} catch (err) { } catch (err) {
// Silently ignore - endpoint not implemented yet // Silently ignore if no submission found
} }
} }
*/
listDiv.innerHTML = articles.map(article => { // Render all items (blog posts + standalone submissions)
const articleId = toStringId(article._id); listDiv.innerHTML = allItems.map(item => {
const wordCount = article.content ? article.content.split(/\s+/).length : 0; const itemId = toStringId(item._id);
const submission = submissionData[articleId]; const isStandalone = item.isStandalone;
// For standalone submissions, use submissionData directly
const submission = isStandalone ? item.submissionData : submissionData[itemId];
// Calculate word count
const wordCount = isStandalone
? (item.wordCount || 0)
: (item.content ? item.content.split(/\s+/).length : 0);
// Calculate checklist completion // Calculate checklist completion
let checklistItems = 0; let checklistItems = 0;
@ -145,18 +177,19 @@ async function loadValidationArticles() {
: 'text-yellow-600'; : 'text-yellow-600';
return ` return `
<div class="px-6 py-4 hover:bg-gray-50 border-l-4 ${submission ? 'border-l-blue-500' : 'border-l-gray-300'}" data-article-id="${articleId}"> <div class="px-6 py-4 hover:bg-gray-50 border-l-4 ${submission ? 'border-l-blue-500' : 'border-l-gray-300'}" data-article-id="${itemId}">
<div class="flex justify-between items-start"> <div class="flex justify-between items-start">
<div class="flex-1"> <div class="flex-1">
<div class="flex items-center gap-3 mb-2"> <div class="flex items-center gap-3 mb-2">
<h4 class="font-medium text-gray-900">${article.title}</h4> <h4 class="font-medium text-gray-900">${item.title}</h4>
${submission ? `<span class="px-2 py-1 bg-blue-100 text-blue-800 text-xs rounded font-medium">${submission.publicationName}</span>` : ''} ${isStandalone ? `<span class="px-2 py-1 bg-purple-100 text-purple-800 text-xs rounded font-medium">STANDALONE PACKAGE</span>` : ''}
${submission ? `<span class="px-2 py-1 bg-blue-100 text-blue-800 text-xs rounded font-medium">${item.publicationName || submission.publicationName}</span>` : ''}
</div> </div>
<div class="flex items-center gap-4 mt-2 text-xs text-gray-500"> <div class="flex items-center gap-4 mt-2 text-xs text-gray-500">
<span>Slug: ${article.slug}</span> ${!isStandalone ? `<span>Slug: ${item.slug}</span>` : ''}
<span>Words: ${wordCount}</span> <span>Words: ${wordCount}</span>
<span>Created: ${article.published_at ? new Date(article.published_at).toLocaleDateString() : 'N/A'}</span> ${!isStandalone && item.published_at ? `<span>Created: ${new Date(item.published_at).toLocaleDateString()}</span>` : ''}
${submission ? `<span class="font-medium">${submission.contentType.toUpperCase()}</span>` : ''} ${submission ? `<span class="font-medium">${(item.contentType || submission.contentType || 'article').toUpperCase()}</span>` : ''}
</div> </div>
${submission ? ` ${submission ? `
<div class="mt-2 flex items-center gap-2"> <div class="mt-2 flex items-center gap-2">
@ -167,27 +200,30 @@ async function loadValidationArticles() {
</div> </div>
` : '<div class="mt-2 text-xs text-orange-600">⚠️ No submission tracking - click "Manage Submission"</div>'} ` : '<div class="mt-2 text-xs text-orange-600">⚠️ No submission tracking - click "Manage Submission"</div>'}
<div class="mt-3 flex items-center gap-2"> <div class="mt-3 flex items-center gap-2">
<div class="validation-status-${articleId} inline-flex items-center gap-2"> <div class="validation-status-${itemId} inline-flex items-center gap-2">
<span class="px-2 py-1 bg-gray-100 text-gray-600 text-xs rounded"> ${isStandalone
Not validated yet ? `<span class="px-2 py-1 bg-green-100 text-green-600 text-xs rounded">✓ Submission Package Ready</span>`
</span> : `<span class="px-2 py-1 bg-gray-100 text-gray-600 text-xs rounded">Not validated yet</span>`
}
</div> </div>
</div> </div>
</div> </div>
<div class="ml-4 flex items-center gap-2 flex-wrap"> <div class="ml-4 flex items-center gap-2 flex-wrap">
<button class="manage-submission px-4 py-2 bg-green-600 text-white rounded-md text-sm hover:bg-green-700" <button class="manage-submission px-4 py-2 bg-green-600 text-white rounded-md text-sm hover:bg-green-700"
data-article-id="${articleId}" data-article-id="${itemId}"
data-submission-id="${submission ? submission._id : ''}"> data-submission-id="${submission ? submission._id : ''}">
Manage Submission ${isStandalone ? 'View Package' : 'Manage Submission'}
</button> </button>
${!isStandalone ? `
<button class="edit-article px-4 py-2 bg-gray-600 text-white rounded-md text-sm hover:bg-gray-700" <button class="edit-article px-4 py-2 bg-gray-600 text-white rounded-md text-sm hover:bg-gray-700"
data-article-id="${articleId}"> data-article-id="${itemId}">
Edit Edit
</button> </button>` : ''}
${!isStandalone ? `
<button class="validate-article px-4 py-2 bg-blue-600 text-white rounded-md text-sm hover:bg-blue-700" <button class="validate-article px-4 py-2 bg-blue-600 text-white rounded-md text-sm hover:bg-blue-700"
data-article-id="${articleId}" data-article-id="${itemId}"
data-article-title="${article.title.replace(/"/g, '&quot;')}"> data-article-title="${item.title.replace(/"/g, '&quot;')}">
Validate Validate` : ''}
</button> </button>
</div> </div>
</div> </div>

View file

@ -140,7 +140,7 @@ async function openManageSubmissionModal(articleId, submissionId) {
// Load article and submission data // Load article and submission data
try { try {
const response = await fetch(`/api/blog/posts/${articleId}`); const response = await fetch(`/api/blog/admin/${articleId}`);
if (!response.ok) throw new Error('Failed to load article'); if (!response.ok) throw new Error('Failed to load article');
currentArticle = await response.json(); currentArticle = await response.json();

View file

@ -5,8 +5,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Koha — Reciprocal Support | Tractatus AI Safety</title> <title>Koha — Reciprocal Support | Tractatus AI Safety</title>
<meta name="description" content="Join a relationship of mutual support for AI safety. Koha is reciprocal giving that maintains community bonds — your contribution sustains this work; our work serves you and the commons."> <meta name="description" content="Join a relationship of mutual support for AI safety. Koha is reciprocal giving that maintains community bonds — your contribution sustains this work; our work serves you and the commons.">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761252631849">
<style> <style>
.gradient-text { background: linear-gradient(120deg, #3b82f6 0%, #8b5cf6 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; } .gradient-text { background: linear-gradient(120deg, #3b82f6 0%, #8b5cf6 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
.skip-link { position: absolute; left: -9999px; } .skip-link { position: absolute; left: -9999px; }
@ -51,7 +51,7 @@
<a href="#main-content" class="skip-link">Skip to main content</a> <a href="#main-content" class="skip-link">Skip to main content</a>
<!-- Navigation (injected by navbar.js) --> <!-- Navigation (injected by navbar.js) -->
<script src="/js/components/navbar.js?v=0.1.0.1761251931745"></script> <script src="/js/components/navbar.js?v=0.1.0.1761252631849"></script>
<!-- Main Content --> <!-- Main Content -->
<main id="main-content" class="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-12"> <main id="main-content" class="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
@ -380,17 +380,17 @@
</main> </main>
<!-- Footer --> <!-- Footer -->
<script src="/js/components/footer.js?v=0.1.0.1761251931745"></script> <script src="/js/components/footer.js?v=0.1.0.1761252631849"></script>
<!-- Currency utilities and selector --> <!-- Currency utilities and selector -->
<script src="/js/utils/currency.js?v=0.1.0.1761251931745"></script> <script src="/js/utils/currency.js?v=0.1.0.1761252631849"></script>
<script src="/js/components/currency-selector.js?v=0.1.0.1761251931745"></script> <script src="/js/components/currency-selector.js?v=0.1.0.1761252631849"></script>
<!-- Donation form functionality --> <!-- Donation form functionality -->
<script src="/js/koha-donation.js?v=0.1.0.1761251931745"></script> <script src="/js/koha-donation.js?v=0.1.0.1761252631849"></script>
<!-- Internationalization --> <!-- Internationalization -->
<script src="/js/i18n-simple.js?v=0.1.0.1761251931745"></script> <script src="/js/i18n-simple.js?v=0.1.0.1761252631849"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761251931745"></script> <script src="/js/components/language-selector.js?v=0.1.0.1761252631849"></script>
</body> </body>
</html> </html>

View file

@ -17,9 +17,9 @@
<link rel="apple-touch-icon" href="/images/tractatus-icon-new.svg"> <link rel="apple-touch-icon" href="/images/tractatus-icon-new.svg">
<link rel="icon" type="image/svg+xml" href="/favicon-new.svg"> <link rel="icon" type="image/svg+xml" href="/favicon-new.svg">
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761252631849">
<style> <style>
.hover-lift { transition: all 0.3s ease; } .hover-lift { transition: all 0.3s ease; }
.hover-lift:hover { transform: translateY(-2px); } .hover-lift:hover { transform: translateY(-2px); }
@ -63,7 +63,7 @@
<a href="#main-content" class="skip-link">Skip to main content</a> <a href="#main-content" class="skip-link">Skip to main content</a>
<script src="/js/components/navbar.js?v=0.1.0.1761251931745"></script> <script src="/js/components/navbar.js?v=0.1.0.1761252631849"></script>
<!-- Breadcrumb Navigation --> <!-- Breadcrumb Navigation -->
<nav class="bg-gray-50 border-b border-gray-200 py-3" aria-label="Breadcrumb"> <nav class="bg-gray-50 border-b border-gray-200 py-3" aria-label="Breadcrumb">
@ -605,20 +605,20 @@
<!-- Footer --> <!-- Footer -->
<!-- Internationalization (must load first for footer translations) --> <!-- Internationalization (must load first for footer translations) -->
<script src="/js/i18n-simple.js?v=0.1.0.1761251931745"></script> <script src="/js/i18n-simple.js?v=0.1.0.1761252631849"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761251931745"></script> <script src="/js/components/language-selector.js?v=0.1.0.1761252631849"></script>
<!-- Scroll Animations (Phase 3) --> <!-- Scroll Animations (Phase 3) -->
<script src="/js/scroll-animations.js?v=0.1.0.1761251931745"></script> <script src="/js/scroll-animations.js?v=0.1.0.1761252631849"></script>
<!-- Page Transitions (Phase 3) --> <!-- Page Transitions (Phase 3) -->
<script src="/js/page-transitions.js?v=0.1.0.1761251931745"></script> <script src="/js/page-transitions.js?v=0.1.0.1761252631849"></script>
<!-- Version Management & PWA --> <!-- Version Management & PWA -->
<script src="/js/version-manager.js?v=0.1.0.1761251931745"></script> <script src="/js/version-manager.js?v=0.1.0.1761252631849"></script>
<script src="/js/leader-page.js?v=0.1.0.1761251931745"></script> <script src="/js/leader-page.js?v=0.1.0.1761252631849"></script>
<!-- Footer Component --> <!-- Footer Component -->
<script src="/js/components/footer.js?v=0.1.0.1761251931745"></script> <script src="/js/components/footer.js?v=0.1.0.1761252631849"></script>
</body> </body>
</html> </html>

View file

@ -4,9 +4,9 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Media Inquiry | Tractatus AI Safety</title> <title>Media Inquiry | Tractatus AI Safety</title>
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761252631849">
<style> <style>
.form-group { margin-bottom: 1.5rem; } .form-group { margin-bottom: 1.5rem; }
.form-label { .form-label {
@ -68,7 +68,7 @@
<a href="#main-content" class="skip-link">Skip to main content</a> <a href="#main-content" class="skip-link">Skip to main content</a>
<!-- Navigation (injected by navbar.js) --> <!-- Navigation (injected by navbar.js) -->
<script src="/js/components/navbar.js?v=0.1.0.1761251931745"></script> <script src="/js/components/navbar.js?v=0.1.0.1761252631849"></script>
<!-- Main Content --> <!-- Main Content -->
<main id="main-content" class="max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 py-12"> <main id="main-content" class="max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
@ -171,10 +171,10 @@
</main> </main>
<!-- Footer --> <!-- Footer -->
<script src="/js/media-inquiry.js?v=0.1.0.1761251931745"></script> <script src="/js/media-inquiry.js?v=0.1.0.1761252631849"></script>
<!-- Footer Component --> <!-- Footer Component -->
<script src="/js/components/footer.js?v=0.1.0.1761251931745"></script> <script src="/js/components/footer.js?v=0.1.0.1761252631849"></script>
</body> </body>
</html> </html>

View file

@ -5,8 +5,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title data-i18n="meta.title">Privacy Policy | Tractatus AI Safety Framework</title> <title data-i18n="meta.title">Privacy Policy | Tractatus AI Safety Framework</title>
<meta name="description" content="Privacy policy for the Tractatus AI Safety Framework. Learn how we collect, use, and protect your data." data-i18n="meta.description"> <meta name="description" content="Privacy policy for the Tractatus AI Safety Framework. Learn how we collect, use, and protect your data." data-i18n="meta.description">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761252631849">
<style> <style>
.skip-link { position: absolute; left: -9999px; } .skip-link { position: absolute; left: -9999px; }
.skip-link:focus { left: 0; z-index: 100; background: white; padding: 1rem; } .skip-link:focus { left: 0; z-index: 100; background: white; padding: 1rem; }
@ -26,11 +26,11 @@
<a href="#main-content" class="skip-link">Skip to main content</a> <a href="#main-content" class="skip-link">Skip to main content</a>
<!-- Navigation (injected by navbar.js) --> <!-- Navigation (injected by navbar.js) -->
<script src="/js/components/navbar.js?v=0.1.0.1761251931745"></script> <script src="/js/components/navbar.js?v=0.1.0.1761252631849"></script>
<!-- i18n Support --> <!-- i18n Support -->
<script src="/js/i18n-simple.js?v=0.1.0.1761251931745"></script> <script src="/js/i18n-simple.js?v=0.1.0.1761252631849"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761251931745"></script> <script src="/js/components/language-selector.js?v=0.1.0.1761252631849"></script>
<!-- Main Content --> <!-- Main Content -->
<main id="main-content" class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-12"> <main id="main-content" class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
@ -246,7 +246,7 @@
</main> </main>
<!-- Footer --> <!-- Footer -->
<script src="/js/components/footer.js?v=0.1.0.1761251931745"></script> <script src="/js/components/footer.js?v=0.1.0.1761252631849"></script>
</body> </body>
</html> </html>

View file

@ -17,9 +17,9 @@
<link rel="apple-touch-icon" href="/images/tractatus-icon-new.svg"> <link rel="apple-touch-icon" href="/images/tractatus-icon-new.svg">
<link rel="icon" type="image/svg+xml" href="/favicon-new.svg"> <link rel="icon" type="image/svg+xml" href="/favicon-new.svg">
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761252631849">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761251931745"> <link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761252631849">
<style> <style>
.skip-link { position: absolute; left: -9999px; } .skip-link { position: absolute; left: -9999px; }
.skip-link:focus { left: 0; z-index: 100; background: white; padding: 1rem; } .skip-link:focus { left: 0; z-index: 100; background: white; padding: 1rem; }
@ -69,7 +69,7 @@
</div> </div>
</noscript> </noscript>
<script src="/js/components/navbar.js?v=0.1.0.1761251931745"></script> <script src="/js/components/navbar.js?v=0.1.0.1761252631849"></script>
<!-- Breadcrumb Navigation --> <!-- Breadcrumb Navigation -->
<nav class="bg-gray-50 border-b border-gray-200 py-3" aria-label="Breadcrumb"> <nav class="bg-gray-50 border-b border-gray-200 py-3" aria-label="Breadcrumb">
@ -611,20 +611,20 @@
<!-- Footer --> <!-- Footer -->
<!-- Internationalization (must load first for footer translations) --> <!-- Internationalization (must load first for footer translations) -->
<script src="/js/i18n-simple.js?v=0.1.0.1761251931745"></script> <script src="/js/i18n-simple.js?v=0.1.0.1761252631849"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761251931745"></script> <script src="/js/components/language-selector.js?v=0.1.0.1761252631849"></script>
<!-- Scroll Animations (Phase 3) --> <!-- Scroll Animations (Phase 3) -->
<script src="/js/scroll-animations.js?v=0.1.0.1761251931745"></script> <script src="/js/scroll-animations.js?v=0.1.0.1761252631849"></script>
<!-- Page Transitions (Phase 3) --> <!-- Page Transitions (Phase 3) -->
<script src="/js/page-transitions.js?v=0.1.0.1761251931745"></script> <script src="/js/page-transitions.js?v=0.1.0.1761252631849"></script>
<!-- Version Management & PWA --> <!-- Version Management & PWA -->
<script src="/js/version-manager.js?v=0.1.0.1761251931745"></script> <script src="/js/version-manager.js?v=0.1.0.1761252631849"></script>
<script src="/js/researcher-page.js?v=0.1.0.1761251931745"></script> <script src="/js/researcher-page.js?v=0.1.0.1761252631849"></script>
<!-- Footer Component --> <!-- Footer Component -->
<script src="/js/components/footer.js?v=0.1.0.1761251931745"></script> <script src="/js/components/footer.js?v=0.1.0.1761252631849"></script>
</body> </body>
</html> </html>

View file

@ -1,6 +1,6 @@
{ {
"version": "0.1.1", "version": "0.1.1",
"buildDate": "2025-10-23T20:38:51.751Z", "buildDate": "2025-10-23T20:50:31.855Z",
"changelog": [ "changelog": [
"Blog Validation: ✨ ENHANCED! World-class submission modal with tabbed interface", "Blog Validation: ✨ ENHANCED! World-class submission modal with tabbed interface",
"Blog Validation: Overview tab with article preview and progress tracking", "Blog Validation: Overview tab with article preview and progress tracking",