-
${section.readingTime} min read
-
${levelIcon} ${levelLabel}
+
${titleWithHyphens}
+
${section.excerpt}
+
+ ${section.readingTime} min read
+ ${levelIcon} ${levelLabel}
`;
@@ -257,6 +321,28 @@ class DocumentCards {
}
});
}
+
+ // Attach color legend toggle listener
+ const legendButton = document.getElementById('color-legend-button');
+ const legendPopup = document.getElementById('color-legend-popup');
+ if (legendButton && legendPopup) {
+ legendButton.addEventListener('click', (e) => {
+ e.preventDefault();
+ e.stopPropagation();
+ legendPopup.classList.toggle('hidden');
+ this.legendVisible = !this.legendVisible;
+ });
+
+ // Close legend when clicking outside
+ document.addEventListener('click', (e) => {
+ if (this.legendVisible &&
+ !legendButton.contains(e.target) &&
+ !legendPopup.contains(e.target)) {
+ legendPopup.classList.add('hidden');
+ this.legendVisible = false;
+ }
+ });
+ }
}
}
diff --git a/public/js/docs-app.js b/public/js/docs-app.js
index b4ccfa2d..e260e0f4 100644
--- a/public/js/docs-app.js
+++ b/public/js/docs-app.js
@@ -348,16 +348,16 @@ function categorizeDocument(doc) {
}
// Use category from database
- const category = doc.category || 'downloads-resources';
+ const category = doc.category || 'resources';
// Validate category exists in CATEGORIES constant
if (CATEGORIES[category]) {
return category;
}
- // Fallback to downloads-resources for uncategorized
- console.warn(`Document "${doc.title}" has invalid category "${category}", using fallback`);
- return 'downloads-resources';
+ // Fallback to resources for uncategorized
+ console.warn(`Document "${doc.title}" has invalid category "${category}", using fallback to resources`);
+ return 'resources';
}
// Group documents by category
diff --git a/scripts/move-guides-to-resources.js b/scripts/move-guides-to-resources.js
new file mode 100644
index 00000000..5a6d24bd
--- /dev/null
+++ b/scripts/move-guides-to-resources.js
@@ -0,0 +1,75 @@
+const { MongoClient } = require('mongodb');
+
+const MONGO_URI = 'mongodb://localhost:27017';
+const DB_NAME = 'tractatus_dev';
+
+async function moveGuidesToResources() {
+ const client = new MongoClient(MONGO_URI);
+
+ try {
+ await client.connect();
+ console.log('✓ Connected to MongoDB');
+
+ const db = client.db(DB_NAME);
+ const collection = db.collection('documents');
+
+ // Find implementation guides currently in getting-started
+ const guides = await collection.find({
+ category: 'getting-started',
+ $or: [
+ { slug: { $regex: /implementation-guide/ } },
+ { title: { $regex: /Implementation Guide/i } }
+ ]
+ }).toArray();
+
+ console.log(`\nFound ${guides.length} implementation guide(s):`);
+ guides.forEach(doc => {
+ console.log(` - ${doc.title} (${doc.slug})`);
+ });
+
+ if (guides.length === 0) {
+ console.log('\n⚠ No guides to move (already in resources?)');
+ return;
+ }
+
+ // Update all implementation guides to resources category
+ const result = await collection.updateMany(
+ {
+ category: 'getting-started',
+ $or: [
+ { slug: { $regex: /implementation-guide/ } },
+ { title: { $regex: /Implementation Guide/i } }
+ ]
+ },
+ {
+ $set: { category: 'resources' }
+ }
+ );
+
+ console.log(`\n✅ Updated ${result.modifiedCount} document(s)`);
+ console.log(' Category changed: getting-started → resources');
+
+ // Verify the change
+ const verifyGuides = await collection.find({
+ category: 'resources',
+ $or: [
+ { slug: { $regex: /implementation-guide/ } },
+ { title: { $regex: /Implementation Guide/i } }
+ ]
+ }).toArray();
+
+ console.log(`\n✓ Verification: ${verifyGuides.length} guide(s) now in Resources:`);
+ verifyGuides.forEach(doc => {
+ console.log(` - ${doc.title}`);
+ });
+
+ } catch (error) {
+ console.error('❌ Error:', error.message);
+ process.exit(1);
+ } finally {
+ await client.close();
+ console.log('\n✓ Database connection closed');
+ }
+}
+
+moveGuidesToResources();