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> </div>
<!-- Footer with Te Tiriti Acknowledgment --> <!-- 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="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> <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 mb-3">
Preserving human agency through architectural constraints, not aspirational goals.
</p>
<p class="text-sm"> <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> </p>
</div> </div>
<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 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>
<ul class="space-y-2 text-sm"> <ul class="space-y-2 text-sm">
<li><a href="/docs.html" class="hover:text-white transition">Documentation</a></li> <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="/demos/tractatus-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="/researcher.html" class="hover:text-white transition">For Researchers</a></li>
<li><a href="/about/values.html" class="hover:text-white transition">Values</a></li> <li><a href="/implementer.html" class="hover:text-white transition">For Implementers</a></li>
<li><a href="/media-inquiry.html" class="hover:text-white transition">Media Inquiries</a></li> <li><a href="/leader.html" class="hover:text-white transition">For Leaders</a></li>
<li><a href="/case-submission.html" class="hover:text-white transition">Submit Case Study</a></li> <li><a href="/about.html" class="hover:text-white transition">About & Values</a></li>
</ul> </ul>
</div> </div>
<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"> <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> </p>
</div> </div>
</div> </div>
<div class="mt-8 pt-8 border-t border-gray-800 text-center text-sm space-y-2"> <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 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>
</div> </div>
</footer> </footer>

View file

@ -214,30 +214,49 @@
</div> </div>
<!-- Footer --> <!-- 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="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> <div>
<h3 class="text-white font-semibold mb-4">Tractatus Framework</h3> <h3 class="text-white font-semibold mb-4">Tractatus Framework</h3>
<p class="text-sm"> <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> </p>
</div> </div>
<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"> <ul class="space-y-2 text-sm">
<li><a href="/docs.html" class="hover:text-white transition">Documentation</a></li> <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="/demos/tractatus-demo.html" class="hover:text-white transition">Interactive Demos</a></li>
<li><a href="/about/values.html" class="hover:text-white transition">Values</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> </ul>
</div> </div>
<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"> <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="/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="/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> </ul>
</div> </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>
<div class="mt-8 pt-8 border-t border-gray-800 text-center text-sm space-y-2"> <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 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:not(:focus-visible) { outline: none; }
a:focus-visible { outline: 3px solid #3b82f6; outline-offset: 2px; } 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-item { transition: all 0.2s ease; }
.faq-question { cursor: pointer; user-select: none; } .faq-question { cursor: pointer; user-select: none; }
.faq-answer { .faq-answer {
@ -56,6 +56,85 @@
} }
.faq-item.open .faq-arrow { transform: rotate(180deg); } .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 */ /* Search highlighting */
.highlight { background-color: #fef08a; padding: 0 2px; } .highlight { background-color: #fef08a; padding: 0 2px; }
@ -186,6 +265,31 @@
list-style: none; list-style: none;
margin-left: -1.75em; 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> </style>
</head> </head>
<body class="bg-gray-50"> <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="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center"> <div class="text-center">
<h1 class="text-5xl font-bold text-gray-900 mb-4">Frequently Asked Questions</h1> <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 Common questions about Tractatus framework implementation, performance, and architecture
</p> </p>
</div> <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">
</div> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
</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">
<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"/> <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> </svg>
</div> <span>Search FAQ</span>
</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
</button> </button>
</div> </div>
<!-- Results count -->
<div id="results-count" class="mt-4 text-sm text-gray-600"></div>
</div> </div>
</div> </div>
<!-- FAQ Content --> <!-- FAQ 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">
<!-- Quick Actions --> <!-- Browse by Audience (Interactive Filters) -->
<div class="bg-blue-50 rounded-lg p-6 mb-8"> <div class="bg-white rounded-lg shadow-sm p-6 mb-8">
<h2 class="text-lg font-bold text-gray-900 mb-3">Quick Actions</h2> <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"> <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"> <button
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"> 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"
<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"/> 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> </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>
</div> </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> </div>
<!-- FAQ Sections --> <!-- Most Common Questions (Inline, Expandable) -->
<div id="faq-container"> <div class="bg-white rounded-lg shadow-sm p-8 mb-8">
<!-- Section will be populated by JavaScript --> <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>
<div class="mt-6 text-center">
<!-- No results message --> <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">
<div id="no-results" class="hidden text-center py-12"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<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="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/>
<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> </svg>
<h3 class="mt-2 text-lg font-medium text-gray-900">No questions found</h3> <span>View All Questions & Search</span>
<p class="mt-1 text-sm text-gray-500">Try adjusting your search or filter</p> </button>
</div>
</div> </div>
<!-- Still have questions? --> <!-- Still have questions? -->
@ -297,60 +411,251 @@
Can't find what you're looking for? We're here to help. Can't find what you're looking for? We're here to help.
</p> </p>
<div class="flex flex-wrap justify-center gap-4"> <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"> <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">
Contact Us <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>
<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 GitHub Discussions
</a> </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>
</div> </div>
</main> </main>
<!-- Footer --> <!-- 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="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> <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">Safety Through Structure, Not Aspiration</p> <p class="text-sm">
Reference implementation of architectural AI safety constraints—structural governance validated in single-project deployment.
</p>
</div> </div>
<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 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>
<ul class="space-y-2 text-sm"> <ul class="space-y-2 text-sm">
<li><a href="/docs.html" class="hover:text-white transition">Documentation</a></li> <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="/demos/tractatus-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="/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> </ul>
</div> </div>
<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"> <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="/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="/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> </ul>
</div> </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>
<div class="mt-8 pt-8 border-t border-gray-800 text-center text-sm space-y-2"> <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> <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>
</div> </div>
</footer> </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 --> <!-- Version Management & PWA -->
<script src="/js/version-manager.js"></script> <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> </body>
</html> </html>

View file

@ -727,38 +727,49 @@ if (pressure.level === 'CRITICAL') {
</div> </div>
<!-- Footer --> <!-- 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="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> <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"> <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> </p>
</div> </div>
<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"> <ul class="space-y-2 text-sm">
<li><a href="/researcher.html" class="hover:text-white">Researchers</a></li> <li><a href="/docs.html" class="hover:text-white transition">Documentation</a></li>
<li><a href="/implementer.html" class="hover:text-white">Implementers</a></li> <li><a href="/demos/tractatus-demo.html" class="hover:text-white transition">Interactive Demos</a></li>
<li><a href="/leader.html" class="hover:text-white">Leaders</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> </ul>
</div> </div>
<div> <div>
<h3 class="text-white font-bold mb-4">Resources</h3> <h3 class="text-white font-semibold mb-4">Community</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>
<ul class="space-y-2 text-sm"> <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="/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="/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> </ul>
</div> </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>
<div class="mt-8 pt-8 border-t border-gray-800 text-center text-sm space-y-2"> <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 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 currentFilter = 'all';
let currentSearchQuery = ''; 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 // Initialize on page load
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
// Configure marked.js for better rendering // 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(); setupSearchListener();
setupFilterListeners(); setupFilterListeners();
setupCategoryButtons();
setupViewAllButton();
}); });
/** /**
* Render FAQ items based on current filter and search * Render FAQ items based on current filter and search
*/ */
function renderFAQs() { function renderFAQs() {
const container = document.getElementById('faq-container'); const container = document.getElementById('faq-container-modal');
const noResults = document.getElementById('no-results'); const noResults = document.getElementById('no-results-modal');
const resultsCount = document.getElementById('results-count'); const resultsCount = document.getElementById('search-results-count');
// Filter by audience // Filter by audience
let filtered = FAQ_DATA; let filtered = FAQ_DATA;
@ -2833,7 +3093,7 @@ function renderFAQs() {
if (filtered.length === 0) { if (filtered.length === 0) {
container.classList.add('hidden'); container.classList.add('hidden');
noResults.classList.remove('hidden'); noResults.classList.remove('hidden');
resultsCount.textContent = ''; resultsCount.textContent = 'No questions found';
return; return;
} }
@ -2844,22 +3104,72 @@ function renderFAQs() {
const filterText = currentFilter === 'all' ? 'all questions' : `${currentFilter} questions`; const filterText = currentFilter === 'all' ? 'all questions' : `${currentFilter} questions`;
resultsCount.textContent = `Showing ${filtered.length} of ${FAQ_DATA.length} ${filterText}`; 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(''); container.innerHTML = filtered.map(faq => createFAQItemHTML(faq)).join('');
// Add click listeners for expand/collapse // Use event delegation for better performance (single listener instead of 31)
document.querySelectorAll('.faq-question').forEach(question => { container.removeEventListener('click', handleFAQClick); // Remove old listener if exists
question.addEventListener('click', () => { container.addEventListener('click', handleFAQClick);
const item = question.closest('.faq-item');
item.classList.toggle('open'); // 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);
}
}); });
// Apply syntax highlighting to code blocks index += batchSize;
if (typeof hljs !== 'undefined') {
document.querySelectorAll('.faq-answer-content pre code').forEach((block) => { if (index < blocks.length) {
hljs.highlightElement(block); // Schedule next batch
}); requestAnimationFrame(processBatch);
}
}
if (blocks.length > 0) {
processBatch();
} }
} }
@ -2872,7 +3182,17 @@ function createFAQItemHTML(faq) {
// Parse markdown to HTML // Parse markdown to HTML
let answerHTML = faq.answer; let answerHTML = faq.answer;
if (typeof marked !== 'undefined') { if (typeof marked !== 'undefined') {
try {
answerHTML = marked.parse(faq.answer); 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) // Highlight search query in rendered HTML (if searching)
@ -2952,20 +3272,15 @@ function setupSearchListener() {
} }
/** /**
* Setup filter pill listeners * Setup filter dropdown listener
*/ */
function setupFilterListeners() { function setupFilterListeners() {
const pills = document.querySelectorAll('.filter-pill'); const audienceFilter = document.getElementById('filter-audience');
pills.forEach(pill => { if (audienceFilter) {
pill.addEventListener('click', (e) => { audienceFilter.addEventListener('change', (e) => {
// Update active state currentFilter = e.target.value;
pills.forEach(p => p.classList.remove('active'));
e.target.classList.add('active');
// Update filter
currentFilter = e.target.dataset.filter;
renderFAQs(); renderFAQs();
}); });
}); }
} }

View file

@ -562,33 +562,53 @@
</div> </div>
<!-- Footer --> <!-- 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="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> <div>
<h3 class="text-gray-200 font-semibold mb-3">Tractatus Framework</h3> <h3 class="text-white font-semibold mb-4">Tractatus Framework</h3>
<p class="text-gray-500"> <p class="text-sm">
Research framework for structural AI governance. Apache 2.0 licence. Reference implementation of architectural AI safety constraints—structural governance validated in single-project deployment.
</p> </p>
</div> </div>
<div> <div>
<h3 class="text-gray-200 font-semibold mb-3">Documentation</h3> <h3 class="text-white font-semibold mb-4">Resources</h3>
<ul class="space-y-2"> <ul class="space-y-2 text-sm">
<li><a href="/docs.html" class="hover:text-amber-400">Technical Specifications</a></li> <li><a href="/docs.html" class="hover:text-white transition">Documentation</a></li>
<li><a href="/implementer.html" class="hover:text-amber-400">Implementation</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-amber-400">Research</a></li> <li><a href="/researcher.html" class="hover:text-white transition">For Researchers</a></li>
<li><a href="/about.html" class="hover:text-amber-400">About</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> </ul>
</div> </div>
<div> <div>
<h3 class="text-gray-200 font-semibold mb-3">Status</h3> <h3 class="text-white font-semibold mb-4">Community</h3>
<p class="text-gray-500"> <ul class="space-y-2 text-sm">
Early development, research validation phase. Open for organisational pilots and independent evaluation. <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> </p>
</div> </div>
</div> </div>
<div class="border-t border-gray-800 mt-8 pt-8 text-center text-xs text-gray-600"> <div class="mt-8 pt-8 border-t border-gray-800 text-center text-sm space-y-2">
<p>Tractatus AI Safety Framework — Research Project</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>
</div> </div>
</footer> </footer>

View file

@ -168,30 +168,49 @@
</main> </main>
<!-- Footer --> <!-- 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="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> <div>
<h3 class="text-white font-semibold mb-4">Tractatus Framework</h3> <h3 class="text-white font-semibold mb-4">Tractatus Framework</h3>
<p class="text-sm"> <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> </p>
</div> </div>
<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"> <ul class="space-y-2 text-sm">
<li><a href="/docs.html" class="hover:text-white transition">Documentation</a></li> <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="/demos/tractatus-demo.html" class="hover:text-white transition">Interactive Demos</a></li>
<li><a href="/about/values.html" class="hover:text-white transition">Values</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> </ul>
</div> </div>
<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"> <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="/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="/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> </ul>
</div> </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>
<div class="mt-8 pt-8 border-t border-gray-800 text-center text-sm space-y-2"> <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 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> </div>
<!-- Footer --> <!-- 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="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> <div>
<h3 class="text-gray-200 font-semibold mb-3">Tractatus Framework</h3> <h3 class="text-white font-semibold mb-4">Tractatus Framework</h3>
<p class="text-gray-500"> <p class="text-sm">
Research framework exploring architectural approaches to AI governance. Apache 2.0 licence. Reference implementation of architectural AI safety constraints—structural governance validated in single-project deployment.
</p> </p>
</div> </div>
<div> <div>
<h3 class="text-gray-200 font-semibold mb-3">Documentation</h3> <h3 class="text-white font-semibold mb-4">Resources</h3>
<ul class="space-y-2"> <ul class="space-y-2 text-sm">
<li><a href="/docs.html" class="hover:text-amber-400">Technical Specifications</a></li> <li><a href="/docs.html" class="hover:text-white transition">Documentation</a></li>
<li><a href="/implementer.html" class="hover:text-amber-400">Implementation</a></li> <li><a href="/demos/tractatus-demo.html" class="hover:text-white transition">Interactive Demos</a></li>
<li><a href="/leader.html" class="hover:text-amber-400">For Leaders</a></li> <li><a href="/researcher.html" class="hover:text-white transition">For Researchers</a></li>
<li><a href="/about.html" class="hover:text-amber-400">About</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> </ul>
</div> </div>
<div> <div>
<h3 class="text-gray-200 font-semibold mb-3">Research Status</h3> <h3 class="text-white font-semibold mb-4">Community</h3>
<p class="text-gray-500"> <ul class="space-y-2 text-sm">
Early-stage exploratory research. Observations from single-project context. Independent validation needed. <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> </p>
</div> </div>
</div> </div>
<div class="border-t border-gray-800 mt-8 pt-8 text-center text-xs text-gray-600"> <div class="mt-8 pt-8 border-t border-gray-800 text-center text-sm space-y-2">
<p>Tractatus AI Safety Framework — Research Project</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>
</div> </div>
</footer> </footer>

View file

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

View file

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