fix: FAQ modal scrolling and standardize footers

## FAQ Modal Fixes
- Fix modal scrolling: changed max-h-[85vh] to h-[85vh] with min-h-0
- Added flex-shrink-0 to modal header for proper flex behavior
- Users can now scroll through all 30 FAQ questions (was stuck at 8)
- Enhanced markdown parsing with error handling and fallback

## UI Improvements
- Removed Quick Actions section from FAQ page per user request
- Standardized footer across 7 user-facing pages
- Added Newsletter link under Community section in all footers

## Pages Updated
- faq.html, researcher.html, implementer.html, leader.html
- about.html, media-inquiry.html, case-submission.html

## Version
- Bumped to 1.0.4 with force update enabled
- Service worker cache updated

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
TheFlow 2025-10-14 12:46:23 +13:00
parent 98d2caa989
commit a54eb6cffd
10 changed files with 935 additions and 217 deletions

View file

@ -228,47 +228,54 @@
</div>
<!-- Footer with Te Tiriti Acknowledgment -->
<footer class="bg-gray-900 text-gray-400 py-12">
<!-- Footer -->
<footer class="bg-gray-900 text-gray-400 py-12 mt-16" role="contentinfo">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 md:grid-cols-4 gap-8">
<div class="grid grid-cols-1 md:grid-cols-5 gap-8">
<div>
<h3 class="text-white font-bold mb-4">Tractatus Framework</h3>
<p class="text-sm mb-3">
Preserving human agency through architectural constraints, not aspirational goals.
</p>
<h3 class="text-white font-semibold mb-4">Tractatus Framework</h3>
<p class="text-sm">
<a href="mailto:research@agenticgovernance.digital" class="text-blue-400 hover:text-blue-300 transition">research@agenticgovernance.digital</a>
Reference implementation of architectural AI safety constraints—structural governance validated in single-project deployment.
</p>
</div>
<div>
<h3 class="text-white font-bold mb-4">Audience Paths</h3>
<ul class="space-y-2 text-sm">
<li><a href="/researcher.html" class="hover:text-white transition">Researchers</a></li>
<li><a href="/implementer.html" class="hover:text-white transition">Implementers</a></li>
<li><a href="/leader.html" class="hover:text-white transition">Leaders</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-bold mb-4">Resources</h3>
<h3 class="text-white font-semibold mb-4">Resources</h3>
<ul class="space-y-2 text-sm">
<li><a href="/docs.html" class="hover:text-white transition">Documentation</a></li>
<li><a href="/demos/classification-demo.html" class="hover:text-white transition">Interactive Demos</a></li>
<li><a href="/about.html" class="hover:text-white transition">About</a></li>
<li><a href="/about/values.html" class="hover:text-white transition">Values</a></li>
<li><a href="/media-inquiry.html" class="hover:text-white transition">Media Inquiries</a></li>
<li><a href="/case-submission.html" class="hover:text-white transition">Submit Case Study</a></li>
<li><a href="/demos/tractatus-demo.html" class="hover:text-white transition">Interactive Demos</a></li>
<li><a href="/researcher.html" class="hover:text-white transition">For Researchers</a></li>
<li><a href="/implementer.html" class="hover:text-white transition">For Implementers</a></li>
<li><a href="/leader.html" class="hover:text-white transition">For Leaders</a></li>
<li><a href="/about.html" class="hover:text-white transition">About & Values</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-bold mb-4">Te Tiriti o Waitangi</h3>
<h3 class="text-white font-semibold mb-4">Community</h3>
<ul class="space-y-2 text-sm">
<li><a href="/media-inquiry.html" class="hover:text-white transition">Media Inquiries</a></li>
<li><a href="/case-submission.html" class="hover:text-white transition">Submit Case Study</a></li>
<li><a href="/blog.html" class="hover:text-white transition">Blog</a></li>
<li><a href="/#newsletter" class="hover:text-white transition">Newsletter</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-semibold mb-4">Support This Work</h3>
<ul class="space-y-2 text-sm">
<li><a href="/koha.html" class="hover:text-white transition">Make a Donation</a></li>
<li><a href="/koha/transparency.html" class="hover:text-white transition">Transparency Dashboard</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-semibold mb-4">Acknowledgment</h3>
<p class="text-sm">
This framework is developed in Aotearoa New Zealand. We acknowledge <a href="/about/values.html#te-tiriti" class="text-blue-400 hover:text-blue-300 transition">Te Tiriti o Waitangi</a> and indigenous data sovereignty principles.
This framework acknowledges Te Tiriti o Waitangi and indigenous leadership in digital sovereignty.
Built with respect for CARE Principles and Māori data sovereignty.
</p>
</div>
</div>
<div class="mt-8 pt-8 border-t border-gray-800 text-center text-sm space-y-2">
<p class="text-gray-300">Safety Through Structure, Not Aspiration | Built with <a href="https://claude.ai/claude-code" class="text-blue-400 hover:text-blue-300 transition" target="_blank" rel="noopener">Claude Code</a></p>
<p>© 2025 Tractatus AI Safety Framework. Licensed under <a href="https://www.apache.org/licenses/LICENSE-2.0" class="text-blue-400 hover:text-blue-300 transition" target="_blank" rel="noopener">Apache License 2.0</a>. <a href="/about/values.html" class="text-blue-400 hover:text-blue-300 transition">Read our values</a>.</p>
<p>© 2025 Tractatus AI Safety Framework. Licensed under <a href="https://www.apache.org/licenses/LICENSE-2.0" class="text-blue-400 hover:text-blue-300 transition" target="_blank" rel="noopener">Apache License 2.0</a>.</p>
</div>
</div>
</footer>

View file

@ -214,30 +214,49 @@
</div>
<!-- Footer -->
<footer class="bg-gray-900 text-gray-300 mt-16 py-12">
<footer class="bg-gray-900 text-gray-400 py-12 mt-16" role="contentinfo">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<div class="grid grid-cols-1 md:grid-cols-5 gap-8">
<div>
<h3 class="text-white font-semibold mb-4">Tractatus Framework</h3>
<p class="text-sm">
AI safety through architectural constraints and human agency preservation.
Reference implementation of architectural AI safety constraints—structural governance validated in single-project deployment.
</p>
</div>
<div>
<h3 class="text-white font-semibold mb-4">Quick Links</h3>
<h3 class="text-white font-semibold mb-4">Resources</h3>
<ul class="space-y-2 text-sm">
<li><a href="/docs.html" class="hover:text-white transition">Documentation</a></li>
<li><a href="/about.html" class="hover:text-white transition">About</a></li>
<li><a href="/about/values.html" class="hover:text-white transition">Values</a></li>
<li><a href="/demos/tractatus-demo.html" class="hover:text-white transition">Interactive Demos</a></li>
<li><a href="/researcher.html" class="hover:text-white transition">For Researchers</a></li>
<li><a href="/implementer.html" class="hover:text-white transition">For Implementers</a></li>
<li><a href="/leader.html" class="hover:text-white transition">For Leaders</a></li>
<li><a href="/about.html" class="hover:text-white transition">About & Values</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-semibold mb-4">Contact</h3>
<h3 class="text-white font-semibold mb-4">Community</h3>
<ul class="space-y-2 text-sm">
<li><a href="/media-inquiry.html" class="hover:text-white transition">Media Inquiries</a></li>
<li><a href="/case-submission.html" class="hover:text-white transition">Submit Case Study</a></li>
<li><a href="/blog.html" class="hover:text-white transition">Blog</a></li>
<li><a href="/#newsletter" class="hover:text-white transition">Newsletter</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-semibold mb-4">Support This Work</h3>
<ul class="space-y-2 text-sm">
<li><a href="/koha.html" class="hover:text-white transition">Make a Donation</a></li>
<li><a href="/koha/transparency.html" class="hover:text-white transition">Transparency Dashboard</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-semibold mb-4">Acknowledgment</h3>
<p class="text-sm">
This framework acknowledges Te Tiriti o Waitangi and indigenous leadership in digital sovereignty.
Built with respect for CARE Principles and Māori data sovereignty.
</p>
</div>
</div>
<div class="mt-8 pt-8 border-t border-gray-800 text-center text-sm space-y-2">
<p class="text-gray-300">Safety Through Structure, Not Aspiration | Built with <a href="https://claude.ai/claude-code" class="text-blue-400 hover:text-blue-300 transition" target="_blank" rel="noopener">Claude Code</a></p>

View file

@ -41,7 +41,7 @@
a:focus:not(:focus-visible) { outline: none; }
a:focus-visible { outline: 3px solid #3b82f6; outline-offset: 2px; }
/* FAQ expandable sections */
/* FAQ expandable sections (modal) */
.faq-item { transition: all 0.2s ease; }
.faq-question { cursor: pointer; user-select: none; }
.faq-answer {
@ -56,6 +56,85 @@
}
.faq-item.open .faq-arrow { transform: rotate(180deg); }
/* Inline FAQ expandable sections (main page) */
.inline-faq-item { transition: all 0.2s ease; }
.inline-faq-question { cursor: pointer; user-select: none; }
.inline-faq-answer {
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease-out;
}
.inline-faq-item.open .inline-faq-answer { max-height: none; }
.inline-faq-item.open .faq-arrow { transform: rotate(180deg); }
/* Inline FAQ Answer Prose Styling */
.inline-faq-answer-content {
line-height: 1.75;
color: #374151;
}
.inline-faq-answer-content h1, .inline-faq-answer-content h2, .inline-faq-answer-content h3 {
font-weight: 700;
color: #111827;
margin-top: 2em;
margin-bottom: 1em;
line-height: 1.3;
}
.inline-faq-answer-content h1 { font-size: 1.875rem; }
.inline-faq-answer-content h2 { font-size: 1.5rem; }
.inline-faq-answer-content h3 { font-size: 1.25rem; }
.inline-faq-answer-content p { margin-bottom: 1.25em; }
.inline-faq-answer-content strong { font-weight: 700; color: #111827; }
.inline-faq-answer-content ul, .inline-faq-answer-content ol {
margin: 1.25em 0;
padding-left: 1.75em;
list-style-position: outside;
}
.inline-faq-answer-content ul { list-style-type: disc; }
.inline-faq-answer-content ol { list-style-type: decimal; }
.inline-faq-answer-content li { margin-bottom: 0.5em; padding-left: 0.375em; }
.inline-faq-answer-content li::marker { color: #3b82f6; font-weight: 600; }
.inline-faq-answer-content a {
color: #2563eb;
text-decoration: underline;
font-weight: 500;
transition: color 0.2s;
}
.inline-faq-answer-content a:hover { color: #1d4ed8; }
.inline-faq-answer-content code {
background-color: #f3f4f6;
padding: 0.125rem 0.375rem;
border-radius: 0.25rem;
font-size: 0.875em;
font-family: 'Monaco', 'Courier New', monospace;
color: #dc2626;
font-weight: 600;
}
.inline-faq-answer-content pre {
background-color: #1e293b;
border-radius: 0.5rem;
padding: 1.25rem;
margin: 1.5em 0;
overflow-x: auto;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
}
.inline-faq-answer-content pre code {
background: none;
padding: 0;
border-radius: 0;
color: #e2e8f0;
font-size: 0.875rem;
font-weight: normal;
line-height: 1.6;
display: block;
}
.inline-faq-answer-content blockquote {
border-left: 4px solid #3b82f6;
padding-left: 1rem;
margin: 1.5em 0;
font-style: italic;
color: #6b7280;
}
/* Search highlighting */
.highlight { background-color: #fef08a; padding: 0 2px; }
@ -186,6 +265,31 @@
list-style: none;
margin-left: -1.75em;
}
/* Modal styles */
#search-modal, #search-tips-modal {
display: none;
}
#search-modal.show, #search-tips-modal.show {
display: flex !important;
}
/* Smooth modal animations */
#search-modal > div, #search-tips-modal > div {
animation: slideUp 0.3s ease-out;
}
@keyframes slideUp {
from {
transform: translateY(20px);
opacity: 0;
}
to {
transform: translateY(0);
opacity: 1;
}
}
</style>
</head>
<body class="bg-gray-50">
@ -201,93 +305,103 @@
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center">
<h1 class="text-5xl font-bold text-gray-900 mb-4">Frequently Asked Questions</h1>
<p class="text-xl text-gray-600 max-w-3xl mx-auto">
<p class="text-xl text-gray-600 max-w-3xl mx-auto mb-8">
Common questions about Tractatus framework implementation, performance, and architecture
</p>
</div>
</div>
</div>
<!-- Search & Filters -->
<div class="bg-white border-b border-gray-200 sticky top-0 z-10 shadow-sm">
<div class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-6">
<!-- Search -->
<div class="mb-4">
<div class="relative">
<input
type="text"
id="faq-search"
placeholder="Search questions..."
class="w-full px-4 py-3 pl-11 pr-4 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition"
aria-label="Search FAQ"
/>
<svg class="absolute left-3 top-3.5 h-5 w-5 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<button type="button" id="open-search-modal-btn" class="px-6 py-3 bg-blue-600 text-white rounded-lg font-semibold hover:bg-blue-700 transition inline-flex items-center gap-2 shadow-lg" aria-label="Open search">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/>
</svg>
</div>
</div>
<!-- Audience Filters -->
<div class="flex flex-wrap gap-2">
<button class="filter-pill active px-4 py-2 rounded-full text-sm font-medium bg-gray-100 text-gray-700 hover:bg-gray-200 transition" data-filter="all">
All Questions
</button>
<button class="filter-pill px-4 py-2 rounded-full text-sm font-medium bg-gray-100 text-gray-700 hover:bg-gray-200 transition" data-filter="researcher">
For Researchers
</button>
<button class="filter-pill px-4 py-2 rounded-full text-sm font-medium bg-gray-100 text-gray-700 hover:bg-gray-200 transition" data-filter="implementer">
For Implementers
</button>
<button class="filter-pill px-4 py-2 rounded-full text-sm font-medium bg-gray-100 text-gray-700 hover:bg-gray-200 transition" data-filter="leader">
For Leaders
<span>Search FAQ</span>
</button>
</div>
<!-- Results count -->
<div id="results-count" class="mt-4 text-sm text-gray-600"></div>
</div>
</div>
<!-- FAQ Content -->
<main id="main-content" class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
<!-- Quick Actions -->
<div class="bg-blue-50 rounded-lg p-6 mb-8">
<h2 class="text-lg font-bold text-gray-900 mb-3">Quick Actions</h2>
<!-- Browse by Audience (Interactive Filters) -->
<div class="bg-white rounded-lg shadow-sm p-6 mb-8">
<h2 class="text-xl font-bold text-gray-900 mb-4">Browse by Audience</h2>
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<a href="/downloads/tractatus-quickstart.tar.gz" class="flex items-center gap-2 text-blue-700 hover:text-blue-900 font-medium">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/>
</svg>
Deployment Quickstart
</a>
<a href="/docs.html" class="flex items-center gap-2 text-blue-700 hover:text-blue-900 font-medium">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/>
</svg>
Full Documentation
</a>
<a href="/demos/classification-demo.html" class="flex items-center gap-2 text-blue-700 hover:text-blue-900 font-medium">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 10l-2 1m0 0l-2-1m2 1v2.5M20 7l-2 1m2-1l-2-1m2 1v2.5M14 4l-2-1-2 1M4 7l2-1M4 7l2 1M4 7v2.5M12 21l-2-1m2 1l2-1m-2 1v-2.5M6 18l-2-1v-2.5M18 18l2-1v-2.5"/>
</svg>
Interactive Demos
</a>
<button
class="category-filter-btn text-left p-4 border-2 border-purple-200 rounded-lg hover:border-purple-400 hover:bg-purple-50 transition group"
data-audience="researcher"
>
<div class="flex items-start gap-3">
<div class="w-10 h-10 bg-purple-100 rounded-lg flex items-center justify-center flex-shrink-0 group-hover:bg-purple-200 transition">
<svg class="w-5 h-5 text-purple-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/>
</svg>
</div>
<div class="flex-1 min-w-0">
<h3 class="font-semibold text-gray-900 group-hover:text-purple-900 transition">Researchers</h3>
<p class="text-sm text-gray-600 mt-1">Theory, validation, academic research</p>
</div>
<svg class="w-5 h-5 text-gray-400 group-hover:text-purple-600 transition flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/>
</svg>
</div>
</button>
<button
class="category-filter-btn text-left p-4 border-2 border-blue-200 rounded-lg hover:border-blue-400 hover:bg-blue-50 transition group"
data-audience="implementer"
>
<div class="flex items-start gap-3">
<div class="w-10 h-10 bg-blue-100 rounded-lg flex items-center justify-center flex-shrink-0 group-hover:bg-blue-200 transition">
<svg class="w-5 h-5 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"/>
</svg>
</div>
<div class="flex-1 min-w-0">
<h3 class="font-semibold text-gray-900 group-hover:text-blue-900 transition">Implementers</h3>
<p class="text-sm text-gray-600 mt-1">Implementation, integration, deployment</p>
</div>
<svg class="w-5 h-5 text-gray-400 group-hover:text-blue-600 transition flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/>
</svg>
</div>
</button>
<button
class="category-filter-btn text-left p-4 border-2 border-green-200 rounded-lg hover:border-green-400 hover:bg-green-50 transition group"
data-audience="leader"
>
<div class="flex items-start gap-3">
<div class="w-10 h-10 bg-green-100 rounded-lg flex items-center justify-center flex-shrink-0 group-hover:bg-green-200 transition">
<svg class="w-5 h-5 text-green-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 13.255A23.931 23.931 0 0112 15c-3.183 0-6.22-.62-9-1.745M16 6V4a2 2 0 00-2-2h-4a2 2 0 00-2 2v2m4 6h.01M5 20h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"/>
</svg>
</div>
<div class="flex-1 min-w-0">
<h3 class="font-semibold text-gray-900 group-hover:text-green-900 transition">Leaders</h3>
<p class="text-sm text-gray-600 mt-1">Strategic business, organizational leadership</p>
</div>
<svg class="w-5 h-5 text-gray-400 group-hover:text-green-600 transition flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/>
</svg>
</div>
</button>
</div>
<p class="text-sm text-gray-500 mt-4 text-center">Click any category to see filtered questions in advanced search</p>
</div>
<!-- FAQ Sections -->
<div id="faq-container">
<!-- Section will be populated by JavaScript -->
</div>
<!-- No results message -->
<div id="no-results" class="hidden text-center py-12">
<svg class="mx-auto h-12 w-12 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.172 16.172a4 4 0 015.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
</svg>
<h3 class="mt-2 text-lg font-medium text-gray-900">No questions found</h3>
<p class="mt-1 text-sm text-gray-500">Try adjusting your search or filter</p>
<!-- Most Common Questions (Inline, Expandable) -->
<div class="bg-white rounded-lg shadow-sm p-8 mb-8">
<h2 class="text-2xl font-bold text-gray-900 mb-6">Most Common Questions</h2>
<div id="inline-faq-container" class="space-y-4">
<!-- Will be populated by JavaScript -->
</div>
<div class="mt-6 text-center">
<button id="view-all-questions-btn" class="px-6 py-3 bg-blue-600 text-white rounded-lg font-semibold hover:bg-blue-700 transition inline-flex items-center gap-2 shadow-md">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/>
</svg>
<span>View All Questions & Search</span>
</button>
</div>
</div>
<!-- Still have questions? -->
@ -297,60 +411,251 @@
Can't find what you're looking for? We're here to help.
</p>
<div class="flex flex-wrap justify-center gap-4">
<a href="/media-inquiry.html" class="bg-white text-blue-600 px-6 py-3 rounded-lg font-semibold hover:bg-gray-100 transition">
Contact Us
<a href="/case-submission.html" class="bg-white text-blue-600 px-6 py-3 rounded-lg font-semibold hover:bg-gray-100 transition inline-flex items-center gap-2">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/>
</svg>
Submit a Case Study
</a>
<a href="https://github.com/AgenticGovernance/tractatus-framework/issues" target="_blank" rel="noopener noreferrer" class="bg-blue-700 text-white px-6 py-3 rounded-lg font-semibold hover:bg-blue-800 transition border-2 border-white">
<a href="https://github.com/AgenticGovernance/tractatus-framework/issues" target="_blank" rel="noopener noreferrer" class="bg-blue-700 text-white px-6 py-3 rounded-lg font-semibold hover:bg-blue-800 transition border-2 border-white inline-flex items-center gap-2">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.430.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
</svg>
GitHub Discussions
</a>
<a href="/media-inquiry.html" class="bg-blue-500 text-white px-6 py-3 rounded-lg font-semibold hover:bg-blue-600 transition border-2 border-blue-300 inline-flex items-center gap-2">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"/>
</svg>
Media Inquiry
</a>
</div>
</div>
</main>
<!-- Footer -->
<footer class="bg-gray-900 text-gray-400 py-12 mt-16">
<footer class="bg-gray-900 text-gray-400 py-12 mt-16" role="contentinfo">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 md:grid-cols-4 gap-8">
<div class="grid grid-cols-1 md:grid-cols-5 gap-8">
<div>
<h3 class="text-white font-bold mb-4">Tractatus Framework</h3>
<p class="text-sm">Safety Through Structure, Not Aspiration</p>
<h3 class="text-white font-semibold mb-4">Tractatus Framework</h3>
<p class="text-sm">
Reference implementation of architectural AI safety constraints—structural governance validated in single-project deployment.
</p>
</div>
<div>
<h3 class="text-white font-bold mb-4">Audience Paths</h3>
<ul class="space-y-2 text-sm">
<li><a href="/researcher.html" class="hover:text-white transition">Researchers</a></li>
<li><a href="/implementer.html" class="hover:text-white transition">Implementers</a></li>
<li><a href="/leader.html" class="hover:text-white transition">Leaders</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-bold mb-4">Resources</h3>
<h3 class="text-white font-semibold mb-4">Resources</h3>
<ul class="space-y-2 text-sm">
<li><a href="/docs.html" class="hover:text-white transition">Documentation</a></li>
<li><a href="/demos/classification-demo.html" class="hover:text-white transition">Interactive Demos</a></li>
<li><a href="/faq.html" class="hover:text-white transition">FAQ</a></li>
<li><a href="/demos/tractatus-demo.html" class="hover:text-white transition">Interactive Demos</a></li>
<li><a href="/researcher.html" class="hover:text-white transition">For Researchers</a></li>
<li><a href="/implementer.html" class="hover:text-white transition">For Implementers</a></li>
<li><a href="/leader.html" class="hover:text-white transition">For Leaders</a></li>
<li><a href="/about.html" class="hover:text-white transition">About & Values</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-bold mb-4">Community</h3>
<h3 class="text-white font-semibold mb-4">Community</h3>
<ul class="space-y-2 text-sm">
<li><a href="/media-inquiry.html" class="hover:text-white transition">Media Inquiries</a></li>
<li><a href="/case-submission.html" class="hover:text-white transition">Submit Case Study</a></li>
<li><a href="/blog.html" class="hover:text-white transition">Blog</a></li>
<li><a href="/#newsletter" class="hover:text-white transition">Newsletter</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-semibold mb-4">Support This Work</h3>
<ul class="space-y-2 text-sm">
<li><a href="/koha.html" class="hover:text-white transition">Make a Donation</a></li>
<li><a href="/koha/transparency.html" class="hover:text-white transition">Transparency Dashboard</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-semibold mb-4">Acknowledgment</h3>
<p class="text-sm">
This framework acknowledges Te Tiriti o Waitangi and indigenous leadership in digital sovereignty.
Built with respect for CARE Principles and Māori data sovereignty.
</p>
</div>
</div>
<div class="mt-8 pt-8 border-t border-gray-800 text-center text-sm space-y-2">
<p class="text-gray-300">Built with <a href="https://claude.ai/claude-code" class="text-blue-400 hover:text-blue-300 transition" target="_blank" rel="noopener">Claude Code</a></p>
<p class="text-gray-300">Safety Through Structure, Not Aspiration | Built with <a href="https://claude.ai/claude-code" class="text-blue-400 hover:text-blue-300 transition" target="_blank" rel="noopener">Claude Code</a></p>
<p>© 2025 Tractatus AI Safety Framework. Licensed under <a href="https://www.apache.org/licenses/LICENSE-2.0" class="text-blue-400 hover:text-blue-300 transition" target="_blank" rel="noopener">Apache License 2.0</a>.</p>
</div>
</div>
</footer>
<!-- Search Modal -->
<div id="search-modal" class="fixed inset-0 bg-black bg-opacity-50 z-50 hidden items-center justify-center p-4">
<div class="bg-white rounded-lg shadow-2xl max-w-4xl w-full h-[85vh] flex flex-col overflow-hidden">
<!-- Modal Header -->
<div class="flex items-center justify-between p-6 border-b border-gray-200 flex-shrink-0">
<h2 class="text-2xl font-bold text-gray-900">Search FAQ</h2>
<button id="search-modal-close-btn"
class="p-2 text-gray-400 hover:text-gray-600 hover:bg-gray-100 rounded transition"
aria-label="Close search">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
</svg>
</button>
</div>
<!-- Modal Content -->
<div id="search-modal-content" class="flex-1 overflow-y-auto p-6 min-h-0">
<!-- Search Input -->
<div class="mb-4">
<div class="relative">
<input
type="text"
id="faq-search"
placeholder="Search FAQ..."
class="w-full px-4 py-3 pl-11 pr-4 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition"
aria-label="Search FAQ"
/>
<svg class="absolute left-3 top-3.5 h-5 w-5 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/>
</svg>
</div>
</div>
<!-- Filters Row -->
<div class="flex flex-wrap items-center gap-3 mb-4">
<!-- Audience Filter -->
<div class="flex-1 min-w-[200px]">
<label for="filter-audience" class="sr-only">Filter by Audience</label>
<select id="filter-audience" class="w-full px-3 py-2 border border-gray-300 rounded-lg bg-white focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition">
<option value="all">All Audiences</option>
<option value="researcher">Researcher</option>
<option value="implementer">Implementer</option>
<option value="leader">Leader</option>
</select>
</div>
<!-- Clear Filters Button -->
<button id="clear-filters-btn" class="px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 transition">
Clear Filters
</button>
<!-- Search Tips Button -->
<button id="search-tips-btn" class="p-2 text-gray-600 hover:text-blue-600 hover:bg-white rounded-lg transition" title="Search Tips" aria-label="Show search tips">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
</svg>
</button>
</div>
<!-- Search Results Summary -->
<div id="search-results-summary" class="mb-4 text-sm text-gray-600">
<span id="search-results-count"></span>
</div>
<!-- Search Results in Modal -->
<div id="search-results-modal" class="mt-6">
<div id="faq-container-modal" class="space-y-4">
<!-- Results will be populated here by JavaScript -->
</div>
</div>
<!-- No results message -->
<div id="no-results-modal" class="hidden text-center py-12">
<svg class="mx-auto h-12 w-12 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.172 16.172a4 4 0 015.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
</svg>
<h3 class="mt-2 text-lg font-medium text-gray-900">No questions found</h3>
<p class="mt-1 text-sm text-gray-500">Try adjusting your search or filter</p>
</div>
</div>
</div>
</div>
<!-- Search Tips Modal -->
<div id="search-tips-modal" class="fixed inset-0 bg-black bg-opacity-50 z-50 hidden items-center justify-center p-4">
<div class="bg-white rounded-lg shadow-2xl max-w-2xl w-full max-h-[80vh] flex flex-col">
<!-- Modal Header -->
<div class="flex items-center justify-between p-6 border-b border-gray-200">
<h2 class="text-2xl font-bold text-gray-900">Search Tips</h2>
<button id="search-tips-close-btn" class="p-2 text-gray-400 hover:text-gray-600 hover:bg-gray-100 rounded transition" aria-label="Close search tips">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
</svg>
</button>
</div>
<!-- Modal Content -->
<div class="flex-1 overflow-y-auto p-6">
<div class="space-y-6">
<!-- Basic Search -->
<div>
<h3 class="text-lg font-semibold text-gray-900 mb-2">Basic Search</h3>
<p class="text-gray-600 mb-3">Type keywords in the search box to find relevant questions. The search looks through both questions and answers.</p>
<div class="bg-gray-50 p-3 rounded border border-gray-200">
<code class="text-sm text-gray-800">Example: "deployment" or "performance overhead"</code>
</div>
</div>
<!-- Filters -->
<div>
<h3 class="text-lg font-semibold text-gray-900 mb-2">Audience Filter</h3>
<p class="text-gray-600 mb-3">Filter questions by intended audience:</p>
<ul class="space-y-2 text-gray-600">
<li class="flex items-start">
<span class="font-medium text-blue-600 mr-2"></span>
<span><strong>Researcher:</strong> Academic questions about theory and validation</span>
</li>
<li class="flex items-start">
<span class="font-medium text-blue-600 mr-2"></span>
<span><strong>Implementer:</strong> Technical implementation and integration questions</span>
</li>
<li class="flex items-start">
<span class="font-medium text-blue-600 mr-2"></span>
<span><strong>Leader:</strong> Strategic business and organizational questions</span>
</li>
</ul>
</div>
<!-- Search Tips -->
<div>
<h3 class="text-lg font-semibold text-gray-900 mb-2">Search Tips</h3>
<ul class="space-y-2 text-gray-600">
<li class="flex items-start">
<span class="font-medium text-green-600 mr-2"></span>
<span>Use specific terms for better results</span>
</li>
<li class="flex items-start">
<span class="font-medium text-green-600 mr-2"></span>
<span>Filter by audience to narrow results</span>
</li>
<li class="flex items-start">
<span class="font-medium text-green-600 mr-2"></span>
<span>Questions are searchable by keywords</span>
</li>
<li class="flex items-start">
<span class="font-medium text-green-600 mr-2"></span>
<span>Click any question to expand the full answer</span>
</li>
</ul>
</div>
<!-- Keyboard Shortcuts -->
<div>
<h3 class="text-lg font-semibold text-gray-900 mb-2">Keyboard Shortcuts</h3>
<div class="space-y-2">
<div class="flex items-center justify-between bg-gray-50 p-2 rounded">
<span class="text-gray-600">Close search</span>
<kbd class="px-2 py-1 bg-white border border-gray-300 rounded text-sm font-mono">Esc</kbd>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Version Management & PWA -->
<script src="/js/version-manager.js"></script>
<script src="/js/faq.js?v=0.1.0.1760254958072"></script>
<script src="/js/faq.js?v=1760427000"></script>
</body>
</html>

View file

@ -727,38 +727,49 @@ if (pressure.level === 'CRITICAL') {
</div>
<!-- Footer -->
<footer class="bg-gray-900 text-gray-400 py-12">
<footer class="bg-gray-900 text-gray-400 py-12 mt-16" role="contentinfo">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 md:grid-cols-4 gap-8">
<div class="grid grid-cols-1 md:grid-cols-5 gap-8">
<div>
<h3 class="text-white font-bold mb-4">Tractatus Framework</h3>
<h3 class="text-white font-semibold mb-4">Tractatus Framework</h3>
<p class="text-sm">
Preserving human agency through architectural constraints, not aspirational goals.
Reference implementation of architectural AI safety constraints—structural governance validated in single-project deployment.
</p>
</div>
<div>
<h3 class="text-white font-bold mb-4">Audience Paths</h3>
<h3 class="text-white font-semibold mb-4">Resources</h3>
<ul class="space-y-2 text-sm">
<li><a href="/researcher.html" class="hover:text-white">Researchers</a></li>
<li><a href="/implementer.html" class="hover:text-white">Implementers</a></li>
<li><a href="/leader.html" class="hover:text-white">Leaders</a></li>
<li><a href="/docs.html" class="hover:text-white transition">Documentation</a></li>
<li><a href="/demos/tractatus-demo.html" class="hover:text-white transition">Interactive Demos</a></li>
<li><a href="/researcher.html" class="hover:text-white transition">For Researchers</a></li>
<li><a href="/implementer.html" class="hover:text-white transition">For Implementers</a></li>
<li><a href="/leader.html" class="hover:text-white transition">For Leaders</a></li>
<li><a href="/about.html" class="hover:text-white transition">About & Values</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-bold mb-4">Resources</h3>
<ul class="space-y-2 text-sm">
<li><a href="/docs.html" class="hover:text-white">Documentation</a></li>
<li><a href="/demos/classification-demo.html" class="hover:text-white">Interactive Demos</a></li>
<li><a href="/" class="hover:text-white">Home</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-bold mb-4">Community</h3>
<h3 class="text-white font-semibold mb-4">Community</h3>
<ul class="space-y-2 text-sm">
<li><a href="/media-inquiry.html" class="hover:text-white transition">Media Inquiries</a></li>
<li><a href="/case-submission.html" class="hover:text-white transition">Submit Case Study</a></li>
<li><a href="/blog.html" class="hover:text-white transition">Blog</a></li>
<li><a href="/#newsletter" class="hover:text-white transition">Newsletter</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-semibold mb-4">Support This Work</h3>
<ul class="space-y-2 text-sm">
<li><a href="/koha.html" class="hover:text-white transition">Make a Donation</a></li>
<li><a href="/koha/transparency.html" class="hover:text-white transition">Transparency Dashboard</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-semibold mb-4">Acknowledgment</h3>
<p class="text-sm">
This framework acknowledges Te Tiriti o Waitangi and indigenous leadership in digital sovereignty.
Built with respect for CARE Principles and Māori data sovereignty.
</p>
</div>
</div>
<div class="mt-8 pt-8 border-t border-gray-800 text-center text-sm space-y-2">
<p class="text-gray-300">Safety Through Structure, Not Aspiration | Built with <a href="https://claude.ai/claude-code" class="text-blue-400 hover:text-blue-300 transition" target="_blank" rel="noopener">Claude Code</a></p>

View file

@ -2785,6 +2785,260 @@ See [Audit Guide](/downloads/implementation-guide.pdf) Section 9: "Regulatory Co
let currentFilter = 'all';
let currentSearchQuery = '';
/**
* Open the search modal
*/
function openSearchModal() {
const modal = document.getElementById('search-modal');
const searchInput = document.getElementById('faq-search');
modal.classList.add('show');
// Focus on search input
setTimeout(() => {
searchInput.focus();
}, 100);
// Render initial results
renderFAQs();
}
/**
* Close the search modal
*/
function closeSearchModal() {
const modal = document.getElementById('search-modal');
modal.classList.remove('show');
}
/**
* Open search tips modal
*/
function openSearchTipsModal() {
const modal = document.getElementById('search-tips-modal');
modal.classList.add('show');
}
/**
* Close search tips modal
*/
function closeSearchTipsModal() {
const modal = document.getElementById('search-tips-modal');
modal.classList.remove('show');
}
/**
* Setup modal event listeners
*/
function setupModalListeners() {
// Open search modal button
const openBtn = document.getElementById('open-search-modal-btn');
if (openBtn) {
openBtn.addEventListener('click', openSearchModal);
}
// Featured question buttons
const featuredBtns = document.querySelectorAll('.featured-question-btn');
featuredBtns.forEach(btn => {
btn.addEventListener('click', () => {
const searchQuery = btn.dataset.search;
openSearchModal();
// Set search value after modal opens
setTimeout(() => {
const searchInput = document.getElementById('faq-search');
if (searchInput) {
searchInput.value = searchQuery;
searchInput.dispatchEvent(new Event('input'));
}
}, 100);
});
});
// Close search modal button
const closeBtn = document.getElementById('search-modal-close-btn');
if (closeBtn) {
closeBtn.addEventListener('click', closeSearchModal);
}
// Search tips button
const tipsBtn = document.getElementById('search-tips-btn');
if (tipsBtn) {
tipsBtn.addEventListener('click', openSearchTipsModal);
}
// Close search tips button
const tipCloseBtn = document.getElementById('search-tips-close-btn');
if (tipCloseBtn) {
tipCloseBtn.addEventListener('click', closeSearchTipsModal);
}
// Clear filters button
const clearBtn = document.getElementById('clear-filters-btn');
if (clearBtn) {
clearBtn.addEventListener('click', () => {
currentFilter = 'all';
currentSearchQuery = '';
document.getElementById('faq-search').value = '';
document.getElementById('filter-audience').value = 'all';
renderFAQs();
});
}
// Close modal on backdrop click
const searchModal = document.getElementById('search-modal');
if (searchModal) {
searchModal.addEventListener('click', (e) => {
if (e.target === searchModal) {
closeSearchModal();
}
});
}
const tipsModal = document.getElementById('search-tips-modal');
if (tipsModal) {
tipsModal.addEventListener('click', (e) => {
if (e.target === tipsModal) {
closeSearchTipsModal();
}
});
}
// Keyboard shortcuts
document.addEventListener('keydown', (e) => {
// Escape key closes modals
if (e.key === 'Escape') {
closeSearchModal();
closeSearchTipsModal();
}
});
}
/**
* Render top FAQs inline on the main page (expandable)
*/
function renderInlineFAQs() {
const container = document.getElementById('inline-faq-container');
if (!container) return;
// Get top 6 most important FAQs (mix of all audiences)
const topFAQs = FAQ_DATA.filter(faq => [19, 12, 27, 13, 1, 2].includes(faq.id));
// Sort by ID to maintain order
const sorted = topFAQs.sort((a, b) => a.id - b.id);
// Render as expandable items
container.innerHTML = sorted.map(faq => createInlineFAQItemHTML(faq)).join('');
// Add click listeners for expand/collapse
document.querySelectorAll('.inline-faq-question').forEach(question => {
question.addEventListener('click', () => {
const item = question.closest('.inline-faq-item');
const wasOpen = item.classList.contains('open');
// Close all other items
document.querySelectorAll('.inline-faq-item').forEach(other => {
other.classList.remove('open');
});
// Toggle this item (only if it wasn't already open)
if (!wasOpen) {
item.classList.add('open');
}
});
});
// Apply syntax highlighting to code blocks
if (typeof hljs !== 'undefined') {
document.querySelectorAll('.inline-faq-answer-content pre code').forEach((block) => {
hljs.highlightElement(block);
});
}
// Enable markdown links
document.querySelectorAll('.inline-faq-answer-content a').forEach(link => {
link.setAttribute('target', '_blank');
link.setAttribute('rel', 'noopener noreferrer');
});
}
/**
* Create HTML for inline FAQ item (expandable on main page)
*/
function createInlineFAQItemHTML(faq) {
const audienceColors = {
'researcher': 'border-purple-200 hover:border-purple-300',
'implementer': 'border-blue-200 hover:border-blue-300',
'leader': 'border-green-200 hover:border-green-300'
};
const primaryAudience = faq.audience[0];
const colorClass = audienceColors[primaryAudience] || 'border-gray-200 hover:border-gray-300';
// Parse markdown answer
let answerHtml = faq.answer;
if (typeof marked !== 'undefined') {
answerHtml = marked.parse(faq.answer);
}
return `
<div class="inline-faq-item border-2 ${colorClass} rounded-lg transition">
<div class="inline-faq-question p-4 flex items-start justify-between cursor-pointer group">
<h3 class="text-lg font-semibold text-gray-900 group-hover:text-blue-600 transition flex-1 pr-4">${escapeHtml(faq.question)}</h3>
<svg class="faq-arrow w-6 h-6 text-gray-400 group-hover:text-blue-600 transition flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
</svg>
</div>
<div class="inline-faq-answer">
<div class="inline-faq-answer-content p-6 pt-0">
${answerHtml}
</div>
</div>
</div>
`;
}
/**
* Setup category filter button listeners
*/
function setupCategoryButtons() {
const categoryBtns = document.querySelectorAll('.category-filter-btn');
categoryBtns.forEach(btn => {
btn.addEventListener('click', () => {
const audience = btn.dataset.audience;
// Set filter and clear search
currentFilter = audience;
currentSearchQuery = '';
// Open modal (this will call renderFAQs automatically)
openSearchModal();
// Update the filter dropdown to match (UI sync only)
setTimeout(() => {
const filterSelect = document.getElementById('filter-audience');
if (filterSelect) {
filterSelect.value = audience;
}
}, 50);
});
});
}
/**
* Setup "View All Questions" button listener
*/
function setupViewAllButton() {
const viewAllBtn = document.getElementById('view-all-questions-btn');
if (viewAllBtn) {
viewAllBtn.addEventListener('click', () => {
currentFilter = 'all';
currentSearchQuery = '';
openSearchModal();
});
}
}
// Initialize on page load
document.addEventListener('DOMContentLoaded', () => {
// Configure marked.js for better rendering
@ -2796,18 +3050,24 @@ document.addEventListener('DOMContentLoaded', () => {
});
}
renderFAQs();
// Render top 6 FAQs inline on page load
renderInlineFAQs();
// Setup all event listeners
setupModalListeners();
setupSearchListener();
setupFilterListeners();
setupCategoryButtons();
setupViewAllButton();
});
/**
* Render FAQ items based on current filter and search
*/
function renderFAQs() {
const container = document.getElementById('faq-container');
const noResults = document.getElementById('no-results');
const resultsCount = document.getElementById('results-count');
const container = document.getElementById('faq-container-modal');
const noResults = document.getElementById('no-results-modal');
const resultsCount = document.getElementById('search-results-count');
// Filter by audience
let filtered = FAQ_DATA;
@ -2833,7 +3093,7 @@ function renderFAQs() {
if (filtered.length === 0) {
container.classList.add('hidden');
noResults.classList.remove('hidden');
resultsCount.textContent = '';
resultsCount.textContent = 'No questions found';
return;
}
@ -2844,22 +3104,72 @@ function renderFAQs() {
const filterText = currentFilter === 'all' ? 'all questions' : `${currentFilter} questions`;
resultsCount.textContent = `Showing ${filtered.length} of ${FAQ_DATA.length} ${filterText}`;
// Render FAQ items
console.log(`[FAQ] Rendering ${filtered.length} FAQs in modal (marked available: ${typeof marked !== 'undefined'})`);
// Render FAQ items (fast, no blocking)
container.innerHTML = filtered.map(faq => createFAQItemHTML(faq)).join('');
// Add click listeners for expand/collapse
document.querySelectorAll('.faq-question').forEach(question => {
question.addEventListener('click', () => {
const item = question.closest('.faq-item');
item.classList.toggle('open');
});
});
// Use event delegation for better performance (single listener instead of 31)
container.removeEventListener('click', handleFAQClick); // Remove old listener if exists
container.addEventListener('click', handleFAQClick);
// Apply syntax highlighting to code blocks
if (typeof hljs !== 'undefined') {
document.querySelectorAll('.faq-answer-content pre code').forEach((block) => {
hljs.highlightElement(block);
// Defer expensive syntax highlighting to avoid blocking UI
requestAnimationFrame(() => {
if (typeof hljs !== 'undefined') {
const codeBlocks = container.querySelectorAll('.faq-answer-content pre code');
// Highlight in small batches to avoid freezing
highlightCodeBlocksInBatches(codeBlocks);
}
});
}
/**
* Event delegation handler for FAQ clicks (single listener for all FAQs)
*/
function handleFAQClick(event) {
const question = event.target.closest('.faq-question');
if (!question) return;
const item = question.closest('.faq-item');
if (item) {
item.classList.toggle('open');
// Lazy-load syntax highlighting only when FAQ is opened for first time
if (item.classList.contains('open') && !item.dataset.highlighted) {
const codeBlocks = item.querySelectorAll('.faq-answer-content pre code');
if (codeBlocks.length > 0 && typeof hljs !== 'undefined') {
codeBlocks.forEach(block => hljs.highlightElement(block));
item.dataset.highlighted = 'true';
}
}
}
}
/**
* Highlight code blocks in batches to avoid UI freeze
*/
function highlightCodeBlocksInBatches(codeBlocks, batchSize = 5) {
const blocks = Array.from(codeBlocks);
let index = 0;
function processBatch() {
const batch = blocks.slice(index, index + batchSize);
batch.forEach(block => {
if (typeof hljs !== 'undefined') {
hljs.highlightElement(block);
}
});
index += batchSize;
if (index < blocks.length) {
// Schedule next batch
requestAnimationFrame(processBatch);
}
}
if (blocks.length > 0) {
processBatch();
}
}
@ -2872,7 +3182,17 @@ function createFAQItemHTML(faq) {
// Parse markdown to HTML
let answerHTML = faq.answer;
if (typeof marked !== 'undefined') {
answerHTML = marked.parse(faq.answer);
try {
answerHTML = marked.parse(faq.answer);
} catch (error) {
console.error('[FAQ] Markdown parsing failed for FAQ', faq.id, error);
// Fallback to plain text with line breaks
answerHTML = `<p>${faq.answer.replace(/\n\n/g, '</p><p>').replace(/\n/g, '<br>')}</p>`;
}
} else {
console.warn('[FAQ] marked.js not loaded - using plain text');
// Fallback to plain text with line breaks
answerHTML = `<p>${faq.answer.replace(/\n\n/g, '</p><p>').replace(/\n/g, '<br>')}</p>`;
}
// Highlight search query in rendered HTML (if searching)
@ -2952,20 +3272,15 @@ function setupSearchListener() {
}
/**
* Setup filter pill listeners
* Setup filter dropdown listener
*/
function setupFilterListeners() {
const pills = document.querySelectorAll('.filter-pill');
const audienceFilter = document.getElementById('filter-audience');
pills.forEach(pill => {
pill.addEventListener('click', (e) => {
// Update active state
pills.forEach(p => p.classList.remove('active'));
e.target.classList.add('active');
// Update filter
currentFilter = e.target.dataset.filter;
if (audienceFilter) {
audienceFilter.addEventListener('change', (e) => {
currentFilter = e.target.value;
renderFAQs();
});
});
}
}

View file

@ -562,33 +562,53 @@
</div>
<!-- Footer -->
<footer class="bg-gray-900 text-gray-400 py-12 mt-16">
<footer class="bg-gray-900 text-gray-400 py-12 mt-16" role="contentinfo">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 md:grid-cols-3 gap-8 text-sm">
<div class="grid grid-cols-1 md:grid-cols-5 gap-8">
<div>
<h3 class="text-gray-200 font-semibold mb-3">Tractatus Framework</h3>
<p class="text-gray-500">
Research framework for structural AI governance. Apache 2.0 licence.
<h3 class="text-white font-semibold mb-4">Tractatus Framework</h3>
<p class="text-sm">
Reference implementation of architectural AI safety constraints—structural governance validated in single-project deployment.
</p>
</div>
<div>
<h3 class="text-gray-200 font-semibold mb-3">Documentation</h3>
<ul class="space-y-2">
<li><a href="/docs.html" class="hover:text-amber-400">Technical Specifications</a></li>
<li><a href="/implementer.html" class="hover:text-amber-400">Implementation</a></li>
<li><a href="/researcher.html" class="hover:text-amber-400">Research</a></li>
<li><a href="/about.html" class="hover:text-amber-400">About</a></li>
<h3 class="text-white font-semibold mb-4">Resources</h3>
<ul class="space-y-2 text-sm">
<li><a href="/docs.html" class="hover:text-white transition">Documentation</a></li>
<li><a href="/demos/tractatus-demo.html" class="hover:text-white transition">Interactive Demos</a></li>
<li><a href="/researcher.html" class="hover:text-white transition">For Researchers</a></li>
<li><a href="/implementer.html" class="hover:text-white transition">For Implementers</a></li>
<li><a href="/leader.html" class="hover:text-white transition">For Leaders</a></li>
<li><a href="/about.html" class="hover:text-white transition">About & Values</a></li>
</ul>
</div>
<div>
<h3 class="text-gray-200 font-semibold mb-3">Status</h3>
<p class="text-gray-500">
Early development, research validation phase. Open for organisational pilots and independent evaluation.
<h3 class="text-white font-semibold mb-4">Community</h3>
<ul class="space-y-2 text-sm">
<li><a href="/media-inquiry.html" class="hover:text-white transition">Media Inquiries</a></li>
<li><a href="/case-submission.html" class="hover:text-white transition">Submit Case Study</a></li>
<li><a href="/blog.html" class="hover:text-white transition">Blog</a></li>
<li><a href="/#newsletter" class="hover:text-white transition">Newsletter</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-semibold mb-4">Support This Work</h3>
<ul class="space-y-2 text-sm">
<li><a href="/koha.html" class="hover:text-white transition">Make a Donation</a></li>
<li><a href="/koha/transparency.html" class="hover:text-white transition">Transparency Dashboard</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-semibold mb-4">Acknowledgment</h3>
<p class="text-sm">
This framework acknowledges Te Tiriti o Waitangi and indigenous leadership in digital sovereignty.
Built with respect for CARE Principles and Māori data sovereignty.
</p>
</div>
</div>
<div class="border-t border-gray-800 mt-8 pt-8 text-center text-xs text-gray-600">
<p>Tractatus AI Safety Framework — Research Project</p>
<div class="mt-8 pt-8 border-t border-gray-800 text-center text-sm space-y-2">
<p class="text-gray-300">Safety Through Structure, Not Aspiration | Built with <a href="https://claude.ai/claude-code" class="text-blue-400 hover:text-blue-300 transition" target="_blank" rel="noopener">Claude Code</a></p>
<p>© 2025 Tractatus AI Safety Framework. Licensed under <a href="https://www.apache.org/licenses/LICENSE-2.0" class="text-blue-400 hover:text-blue-300 transition" target="_blank" rel="noopener">Apache License 2.0</a>.</p>
</div>
</div>
</footer>

View file

@ -168,30 +168,49 @@
</main>
<!-- Footer -->
<footer class="bg-gray-900 text-gray-300 mt-16 py-12">
<footer class="bg-gray-900 text-gray-400 py-12 mt-16" role="contentinfo">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<div class="grid grid-cols-1 md:grid-cols-5 gap-8">
<div>
<h3 class="text-white font-semibold mb-4">Tractatus Framework</h3>
<p class="text-sm">
AI safety through architectural constraints and human agency preservation.
Reference implementation of architectural AI safety constraints—structural governance validated in single-project deployment.
</p>
</div>
<div>
<h3 class="text-white font-semibold mb-4">Quick Links</h3>
<h3 class="text-white font-semibold mb-4">Resources</h3>
<ul class="space-y-2 text-sm">
<li><a href="/docs.html" class="hover:text-white transition">Documentation</a></li>
<li><a href="/about.html" class="hover:text-white transition">About</a></li>
<li><a href="/about/values.html" class="hover:text-white transition">Values</a></li>
<li><a href="/demos/tractatus-demo.html" class="hover:text-white transition">Interactive Demos</a></li>
<li><a href="/researcher.html" class="hover:text-white transition">For Researchers</a></li>
<li><a href="/implementer.html" class="hover:text-white transition">For Implementers</a></li>
<li><a href="/leader.html" class="hover:text-white transition">For Leaders</a></li>
<li><a href="/about.html" class="hover:text-white transition">About & Values</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-semibold mb-4">Contact</h3>
<h3 class="text-white font-semibold mb-4">Community</h3>
<ul class="space-y-2 text-sm">
<li><a href="/media-inquiry.html" class="hover:text-white transition">Media Inquiries</a></li>
<li><a href="/case-submission.html" class="hover:text-white transition">Submit Case Study</a></li>
<li><a href="/blog.html" class="hover:text-white transition">Blog</a></li>
<li><a href="/#newsletter" class="hover:text-white transition">Newsletter</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-semibold mb-4">Support This Work</h3>
<ul class="space-y-2 text-sm">
<li><a href="/koha.html" class="hover:text-white transition">Make a Donation</a></li>
<li><a href="/koha/transparency.html" class="hover:text-white transition">Transparency Dashboard</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-semibold mb-4">Acknowledgment</h3>
<p class="text-sm">
This framework acknowledges Te Tiriti o Waitangi and indigenous leadership in digital sovereignty.
Built with respect for CARE Principles and Māori data sovereignty.
</p>
</div>
</div>
<div class="mt-8 pt-8 border-t border-gray-800 text-center text-sm space-y-2">
<p class="text-gray-300">Safety Through Structure, Not Aspiration | Built with <a href="https://claude.ai/claude-code" class="text-blue-400 hover:text-blue-300 transition" target="_blank" rel="noopener">Claude Code</a></p>

View file

@ -465,33 +465,54 @@
</div>
<!-- Footer -->
<footer class="bg-gray-900 text-gray-400 py-12 mt-16">
<!-- Footer -->
<footer class="bg-gray-900 text-gray-400 py-12 mt-16" role="contentinfo">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 md:grid-cols-3 gap-8 text-sm">
<div class="grid grid-cols-1 md:grid-cols-5 gap-8">
<div>
<h3 class="text-gray-200 font-semibold mb-3">Tractatus Framework</h3>
<p class="text-gray-500">
Research framework exploring architectural approaches to AI governance. Apache 2.0 licence.
<h3 class="text-white font-semibold mb-4">Tractatus Framework</h3>
<p class="text-sm">
Reference implementation of architectural AI safety constraints—structural governance validated in single-project deployment.
</p>
</div>
<div>
<h3 class="text-gray-200 font-semibold mb-3">Documentation</h3>
<ul class="space-y-2">
<li><a href="/docs.html" class="hover:text-amber-400">Technical Specifications</a></li>
<li><a href="/implementer.html" class="hover:text-amber-400">Implementation</a></li>
<li><a href="/leader.html" class="hover:text-amber-400">For Leaders</a></li>
<li><a href="/about.html" class="hover:text-amber-400">About</a></li>
<h3 class="text-white font-semibold mb-4">Resources</h3>
<ul class="space-y-2 text-sm">
<li><a href="/docs.html" class="hover:text-white transition">Documentation</a></li>
<li><a href="/demos/tractatus-demo.html" class="hover:text-white transition">Interactive Demos</a></li>
<li><a href="/researcher.html" class="hover:text-white transition">For Researchers</a></li>
<li><a href="/implementer.html" class="hover:text-white transition">For Implementers</a></li>
<li><a href="/leader.html" class="hover:text-white transition">For Leaders</a></li>
<li><a href="/about.html" class="hover:text-white transition">About & Values</a></li>
</ul>
</div>
<div>
<h3 class="text-gray-200 font-semibold mb-3">Research Status</h3>
<p class="text-gray-500">
Early-stage exploratory research. Observations from single-project context. Independent validation needed.
<h3 class="text-white font-semibold mb-4">Community</h3>
<ul class="space-y-2 text-sm">
<li><a href="/media-inquiry.html" class="hover:text-white transition">Media Inquiries</a></li>
<li><a href="/case-submission.html" class="hover:text-white transition">Submit Case Study</a></li>
<li><a href="/blog.html" class="hover:text-white transition">Blog</a></li>
<li><a href="/#newsletter" class="hover:text-white transition">Newsletter</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-semibold mb-4">Support This Work</h3>
<ul class="space-y-2 text-sm">
<li><a href="/koha.html" class="hover:text-white transition">Make a Donation</a></li>
<li><a href="/koha/transparency.html" class="hover:text-white transition">Transparency Dashboard</a></li>
</ul>
</div>
<div>
<h3 class="text-white font-semibold mb-4">Acknowledgment</h3>
<p class="text-sm">
This framework acknowledges Te Tiriti o Waitangi and indigenous leadership in digital sovereignty.
Built with respect for CARE Principles and Māori data sovereignty.
</p>
</div>
</div>
<div class="border-t border-gray-800 mt-8 pt-8 text-center text-xs text-gray-600">
<p>Tractatus AI Safety Framework — Research Project</p>
<div class="mt-8 pt-8 border-t border-gray-800 text-center text-sm space-y-2">
<p class="text-gray-300">Safety Through Structure, Not Aspiration | Built with <a href="https://claude.ai/claude-code" class="text-blue-400 hover:text-blue-300 transition" target="_blank" rel="noopener">Claude Code</a></p>
<p>© 2025 Tractatus AI Safety Framework. Licensed under <a href="https://www.apache.org/licenses/LICENSE-2.0" class="text-blue-400 hover:text-blue-300 transition" target="_blank" rel="noopener">Apache License 2.0</a>.</p>
</div>
</div>
</footer>

View file

@ -5,7 +5,7 @@
* - PWA functionality
*/
const CACHE_VERSION = '1.0.0';
const CACHE_VERSION = '1.0.4';
const CACHE_NAME = `tractatus-v${CACHE_VERSION}`;
const VERSION_CHECK_INTERVAL = 3600000; // 1 hour in milliseconds

View file

@ -1,11 +1,12 @@
{
"version": "1.0.0",
"buildDate": "2025-10-14T10:30:00Z",
"version": "1.0.4",
"buildDate": "2025-10-14T13:00:00Z",
"changelog": [
"Landing page accuracy improvements",
"FAQ enhanced for Leader audience",
"Removed overstated claims"
"Fixed modal scrolling - changed to h-[85vh] with min-h-0 for proper flex scroll",
"Removed Quick Actions section from FAQ page",
"Standardized footer across all pages with newsletter link",
"Enhanced markdown parsing with error handling"
],
"forceUpdate": false,
"minVersion": "1.0.0"
"forceUpdate": true,
"minVersion": "1.0.4"
}