@knowcode/doc-builder 1.9.0 → 1.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +2 -0
  2. package/html/README.html +34 -149
  3. package/html/css/notion-style.css +13 -394
  4. package/html/documentation-index.html +17 -127
  5. package/html/guides/authentication-default-change.html +8 -130
  6. package/html/guides/authentication-guide.html +20 -141
  7. package/html/guides/claude-workflow-guide.html +23 -137
  8. package/html/guides/documentation-standards.html +12 -133
  9. package/html/guides/image-modal-guide.html +381 -0
  10. package/html/guides/phosphor-icons-guide.html +28 -150
  11. package/html/guides/private-directory-authentication.html +8 -130
  12. package/html/guides/public-site-deployment.html +8 -130
  13. package/html/guides/search-engine-verification-guide.html +8 -130
  14. package/html/guides/seo-guide.html +8 -130
  15. package/html/guides/seo-optimization-guide.html +39 -159
  16. package/html/guides/troubleshooting-guide.html +20 -141
  17. package/html/guides/windows-setup-guide.html +39 -161
  18. package/html/image-modal-test.html +9 -125
  19. package/html/index.html +34 -149
  20. package/html/js/auth.js +39 -118
  21. package/html/js/main.js +25 -259
  22. package/html/private/cache-control-anti-pattern.html +13 -135
  23. package/html/private/launch/README.html +16 -144
  24. package/html/private/launch/auth-cleanup-summary.html +25 -153
  25. package/html/private/launch/bubble-plugin-specification.html +8 -136
  26. package/html/private/launch/go-to-market-strategy.html +10 -138
  27. package/html/private/launch/launch-announcements.html +24 -151
  28. package/html/private/launch/vercel-deployment-auth-setup.html +10 -138
  29. package/html/private/next-steps-walkthrough.html +15 -137
  30. package/html/private/supabase-auth-implementation-completed.html +22 -143
  31. package/html/private/supabase-auth-implementation-plan.html +15 -136
  32. package/html/private/supabase-auth-integration-plan.html +22 -142
  33. package/html/private/supabase-auth-setup-guide.html +17 -139
  34. package/html/private/test-private-doc.html +8 -130
  35. package/html/private/user-management-tooling.html +8 -130
  36. package/html/prompts/markdown-document-standards.html +13 -134
  37. package/html/vercel-cli-setup-guide.html +12 -128
  38. package/html/vercel-first-time-setup-guide.html +9 -125
  39. package/lib/emoji-mapper.js +12 -0
  40. package/package.json +1 -1
package/html/js/main.js CHANGED
@@ -79,6 +79,9 @@ function initializeMermaidFullScreen() {
79
79
  const toolbar = document.createElement('div');
80
80
  toolbar.className = 'mermaid-toolbar';
81
81
 
82
+ const title = document.createElement('div');
83
+ title.textContent = 'Mermaid Diagram';
84
+
82
85
  const actions = document.createElement('div');
83
86
  actions.className = 'mermaid-actions';
84
87
 
@@ -88,8 +91,23 @@ function initializeMermaidFullScreen() {
88
91
  fullScreenBtn.innerHTML = '<i class="fas fa-expand"></i> Full Screen';
89
92
  fullScreenBtn.addEventListener('click', () => openMermaidFullScreen(mermaidDiv, index));
90
93
 
94
+ // Copy SVG button
95
+ const copyBtn = document.createElement('button');
96
+ copyBtn.className = 'mermaid-btn';
97
+ copyBtn.innerHTML = '<i class="fas fa-copy"></i> Copy SVG';
98
+ copyBtn.addEventListener('click', () => copyMermaidSVG(mermaidDiv));
99
+
100
+ // Copy Mermaid source button
101
+ const copyMermaidBtn = document.createElement('button');
102
+ copyMermaidBtn.className = 'mermaid-btn';
103
+ copyMermaidBtn.innerHTML = '<i class="fas fa-code"></i> Copy Mermaid';
104
+ copyMermaidBtn.addEventListener('click', () => copyMermaidSource(mermaidDiv));
105
+
91
106
  actions.appendChild(fullScreenBtn);
107
+ actions.appendChild(copyBtn);
108
+ actions.appendChild(copyMermaidBtn);
92
109
 
110
+ toolbar.appendChild(title);
93
111
  toolbar.appendChild(actions);
94
112
 
95
113
  // Create wrapper for the diagram
@@ -494,147 +512,12 @@ function updateThemeIcon(theme) {
494
512
  const menuToggle = document.getElementById('menu-toggle');
495
513
  const sidebar = document.querySelector('.sidebar');
496
514
 
497
- // Set initial menu state based on configuration
498
- const menuDefaultOpen = window.docBuilderConfig?.features?.menuDefaultOpen !== false;
499
- if (sidebar && window.innerWidth > 768) {
500
- if (!menuDefaultOpen) {
501
- sidebar.classList.add('closed');
502
- // Add class to body to show menu toggle on desktop when menu starts closed
503
- document.body.classList.add('menu-starts-closed');
504
- }
505
- }
506
-
507
- // Create overlay element for mobile
508
- let overlay = document.querySelector('.sidebar-overlay');
509
- if (!overlay && window.innerWidth <= 768) {
510
- overlay = document.createElement('div');
511
- overlay.className = 'sidebar-overlay';
512
- document.body.appendChild(overlay);
513
- }
514
-
515
515
  if (menuToggle) {
516
516
  menuToggle.addEventListener('click', () => {
517
- if (window.innerWidth <= 768) {
518
- // Mobile: toggle 'open' class
519
- sidebar.classList.toggle('open');
520
- } else {
521
- // Desktop: toggle 'closed' class
522
- sidebar.classList.toggle('closed');
523
- // Update visibility of menu toggle based on sidebar state
524
- updateMenuToggleVisibility();
525
- }
526
- if (overlay) {
527
- overlay.classList.toggle('active');
528
- }
529
- });
530
- }
531
-
532
- // Function to update menu toggle visibility
533
- function updateMenuToggleVisibility() {
534
- if (window.innerWidth > 768) {
535
- if (!menuDefaultOpen || sidebar.classList.contains('closed')) {
536
- document.body.classList.add('show-menu-toggle');
537
- } else {
538
- document.body.classList.remove('show-menu-toggle');
539
- }
540
- }
541
- }
542
-
543
- // Initial check
544
- updateMenuToggleVisibility();
545
-
546
- // Update on window resize
547
- window.addEventListener('resize', updateMenuToggleVisibility);
548
-
549
- // Close menu when clicking overlay
550
- if (overlay) {
551
- overlay.addEventListener('click', () => {
552
- sidebar.classList.remove('open');
553
- overlay.classList.remove('active');
554
- });
555
- }
556
-
557
- // Floating Menu Button for Mobile
558
- function initFloatingMenuButton() {
559
- // Only initialize on mobile
560
- if (window.innerWidth > 768) return;
561
-
562
- // Check if button already exists
563
- if (document.getElementById('floating-menu-toggle')) return;
564
-
565
- // Create floating button
566
- const floatingButton = document.createElement('button');
567
- floatingButton.id = 'floating-menu-toggle';
568
- floatingButton.className = 'floating-menu-toggle';
569
- floatingButton.setAttribute('aria-label', 'Toggle menu');
570
- floatingButton.innerHTML = '<i class="fas fa-bars"></i>';
571
- floatingButton.style.display = 'flex'; // Always visible on mobile
572
- floatingButton.classList.add('visible'); // Start visible
573
-
574
- // Add to body
575
- document.body.appendChild(floatingButton);
576
-
577
- // Toggle sidebar on click
578
- floatingButton.addEventListener('click', () => {
579
517
  sidebar.classList.toggle('open');
580
-
581
- // Handle overlay
582
- let overlay = document.querySelector('.sidebar-overlay');
583
- if (!overlay) {
584
- overlay = document.createElement('div');
585
- overlay.className = 'sidebar-overlay';
586
- document.body.appendChild(overlay);
587
-
588
- // Add overlay click handler
589
- overlay.addEventListener('click', () => {
590
- sidebar.classList.remove('open');
591
- overlay.classList.remove('active');
592
- floatingButton.querySelector('i').className = 'fas fa-bars';
593
- });
594
- }
595
-
596
- if (overlay) {
597
- overlay.classList.toggle('active');
598
- }
599
-
600
- // Update icon based on state
601
- const icon = floatingButton.querySelector('i');
602
- if (sidebar.classList.contains('open')) {
603
- icon.className = 'fas fa-times';
604
- } else {
605
- icon.className = 'fas fa-bars';
606
- }
607
- });
608
-
609
- // Remove scroll-based visibility - button is always visible on mobile
610
-
611
- // Update icon when sidebar state changes from other sources
612
- const observer = new MutationObserver(() => {
613
- const icon = floatingButton.querySelector('i');
614
- if (sidebar.classList.contains('open')) {
615
- icon.className = 'fas fa-times';
616
- } else {
617
- icon.className = 'fas fa-bars';
618
- }
619
- });
620
-
621
- observer.observe(sidebar, {
622
- attributes: true,
623
- attributeFilter: ['class']
624
518
  });
625
519
  }
626
520
 
627
- // Initialize floating button on load and resize
628
- document.addEventListener('DOMContentLoaded', initFloatingMenuButton);
629
- window.addEventListener('resize', () => {
630
- const existingButton = document.getElementById('floating-menu-toggle');
631
- if (window.innerWidth > 768 && existingButton) {
632
- existingButton.remove();
633
- } else if (window.innerWidth <= 768 && !existingButton) {
634
- initFloatingMenuButton();
635
- }
636
- });
637
-
638
521
  // Prevent sidebar from closing when clicking nav items
639
522
  // Only close when clicking outside the sidebar or the close button
640
523
  document.addEventListener('click', (e) => {
@@ -642,21 +525,11 @@ document.addEventListener('click', (e) => {
642
525
  if (window.innerWidth <= 768) {
643
526
  const isClickInsideSidebar = sidebar && sidebar.contains(e.target);
644
527
  const isMenuToggle = e.target.closest('#menu-toggle');
645
- const isFloatingButton = e.target.closest('#floating-menu-toggle');
646
528
  const isNavItem = e.target.closest('.nav-item, .nav-title');
647
- const overlay = document.querySelector('.sidebar-overlay');
648
529
 
649
530
  // Close sidebar only if clicking outside AND not on menu toggle AND not on nav items
650
- if (!isClickInsideSidebar && !isMenuToggle && !isFloatingButton && !isNavItem && sidebar?.classList.contains('open')) {
531
+ if (!isClickInsideSidebar && !isMenuToggle && !isNavItem && sidebar?.classList.contains('open')) {
651
532
  sidebar.classList.remove('open');
652
- if (overlay) {
653
- overlay.classList.remove('active');
654
- }
655
- // Update floating button icon if it exists
656
- const floatingBtn = document.getElementById('floating-menu-toggle');
657
- if (floatingBtn) {
658
- floatingBtn.querySelector('i').className = 'fas fa-bars';
659
- }
660
533
  }
661
534
  }
662
535
  });
@@ -665,16 +538,12 @@ document.addEventListener('click', (e) => {
665
538
  document.querySelectorAll('a[href^="#"]').forEach(anchor => {
666
539
  anchor.addEventListener('click', function (e) {
667
540
  e.preventDefault();
668
- const href = this.getAttribute('href');
669
- // Skip if href is just '#' (prevents querySelector error)
670
- if (href && href !== '#') {
671
- const target = document.querySelector(href);
672
- if (target) {
673
- target.scrollIntoView({
674
- behavior: 'smooth',
675
- block: 'start'
676
- });
677
- }
541
+ const target = document.querySelector(this.getAttribute('href'));
542
+ if (target) {
543
+ target.scrollIntoView({
544
+ behavior: 'smooth',
545
+ block: 'start'
546
+ });
678
547
  }
679
548
  });
680
549
  });
@@ -1317,10 +1186,6 @@ function exportToPDF() {
1317
1186
 
1318
1187
  // Add PDF export button functionality
1319
1188
  function addPDFExportButton() {
1320
- // Check configuration - default to true if not set
1321
- const showPdfDownload = window.docBuilderConfig?.features?.showPdfDownload !== false;
1322
- if (!showPdfDownload) return;
1323
-
1324
1189
  const headerActions = document.querySelector('.header-actions');
1325
1190
  if (headerActions) {
1326
1191
  const pdfButton = document.createElement('button');
@@ -1453,106 +1318,8 @@ function initTooltips() {
1453
1318
  });
1454
1319
  }
1455
1320
 
1456
- // Handle .md link redirects
1457
- function initMarkdownLinkRedirects() {
1458
- // Check if current URL ends with .md and redirect
1459
- if (window.location.pathname.endsWith('.md')) {
1460
- const htmlPath = window.location.pathname.replace(/\.md$/, '.html');
1461
- console.log(`Redirecting from .md to .html: ${htmlPath}`);
1462
- window.location.replace(htmlPath);
1463
- return; // Stop execution as we're redirecting
1464
- }
1465
-
1466
- // Intercept clicks on .md links
1467
- document.addEventListener('click', function(e) {
1468
- const link = e.target.closest('a');
1469
- if (link && link.href && link.href.endsWith('.md')) {
1470
- e.preventDefault();
1471
- const htmlUrl = link.href.replace(/\.md$/, '.html');
1472
- console.log(`Converting .md link to .html: ${htmlUrl}`);
1473
- window.location.href = htmlUrl;
1474
- }
1475
- });
1476
- }
1477
-
1478
- // Image Modal System
1479
- function initImageModal() {
1480
- // Create modal HTML structure
1481
- const modalHTML = `
1482
- <div class="image-modal" id="imageModal">
1483
- <div class="image-modal-content">
1484
- <div class="image-modal-close" id="imageModalClose">&times;</div>
1485
- <img class="image-modal-img" id="imageModalImg" src="" alt="">
1486
- <div class="image-modal-caption" id="imageModalCaption"></div>
1487
- </div>
1488
- </div>
1489
- `;
1490
-
1491
- // Add modal to document body
1492
- document.body.insertAdjacentHTML('beforeend', modalHTML);
1493
-
1494
- const modal = document.getElementById('imageModal');
1495
- const modalImg = document.getElementById('imageModalImg');
1496
- const modalCaption = document.getElementById('imageModalCaption');
1497
- const closeBtn = document.getElementById('imageModalClose');
1498
-
1499
- // Add click handlers to all content images
1500
- const contentImages = document.querySelectorAll('.content img');
1501
- contentImages.forEach(img => {
1502
- img.addEventListener('click', function() {
1503
- modal.classList.add('active');
1504
- modalImg.src = this.src;
1505
- modalImg.alt = this.alt;
1506
- modalCaption.textContent = this.alt;
1507
-
1508
- // Hide caption if no alt text
1509
- if (!this.alt) {
1510
- modalCaption.style.display = 'none';
1511
- } else {
1512
- modalCaption.style.display = 'block';
1513
- }
1514
-
1515
- // Prevent body scrolling
1516
- document.body.style.overflow = 'hidden';
1517
- });
1518
- });
1519
-
1520
- // Close modal functions
1521
- function closeModal() {
1522
- modal.classList.remove('active');
1523
- document.body.style.overflow = '';
1524
- }
1525
-
1526
- // Close on X button click
1527
- closeBtn.addEventListener('click', closeModal);
1528
-
1529
- // Close on overlay click (but not on image click)
1530
- modal.addEventListener('click', function(e) {
1531
- if (e.target === modal) {
1532
- closeModal();
1533
- }
1534
- });
1535
-
1536
- // Close on Escape key
1537
- document.addEventListener('keydown', function(e) {
1538
- if (e.key === 'Escape' && modal.classList.contains('active')) {
1539
- closeModal();
1540
- }
1541
- });
1542
-
1543
- // Prevent modal content from closing modal when clicked
1544
- modalImg.addEventListener('click', function(e) {
1545
- e.stopPropagation();
1546
- });
1547
-
1548
- document.querySelector('.image-modal-content').addEventListener('click', function(e) {
1549
- e.stopPropagation();
1550
- });
1551
- }
1552
-
1553
1321
  // Initialize on DOM Load
1554
1322
  document.addEventListener('DOMContentLoaded', () => {
1555
- initMarkdownLinkRedirects();
1556
1323
  highlightNavigation();
1557
1324
  generateTableOfContents();
1558
1325
  initSidebarResize();
@@ -1560,6 +1327,5 @@ document.addEventListener('DOMContentLoaded', () => {
1560
1327
  initNavigationFilter();
1561
1328
  addPDFExportButton();
1562
1329
  generateBreadcrumbs();
1563
- initImageModal();
1564
1330
  initTooltips();
1565
1331
  });
@@ -3,41 +3,14 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <meta name="description" content="This guide documents how to implement aggressive cache-busting headers in doc-builder, but we strongly recommend against using this approach. This...">
7
- <title>Cache Control Anti-Pattern: Why Aggressive Cach...</title>
8
-
9
- <meta name="author" content="Lindsay Smith">
10
- <meta name="keywords" content="documentation, markdown, static site generator, vercel, notion-style, cache, caching">
11
- <meta name="robots" content="index, follow">
12
- <link rel="canonical" href="https://doc-builder-delta.vercel.app/private/cache-control-anti-pattern.html">
13
-
14
- <!-- Open Graph / Facebook -->
15
- <meta property="og:type" content="article">
16
- <meta property="og:url" content="https://doc-builder-delta.vercel.app/private/cache-control-anti-pattern.html">
17
- <meta property="og:title" content="Cache Control Anti-Pattern: Why Aggressive Cach...">
18
- <meta property="og:description" content="This guide documents how to implement aggressive cache-busting headers in doc-builder, but we strongly recommend against using this approach. This...">
19
- <meta property="og:image" content="https://doc-builder-delta.vercel.app/og-default.png">
20
- <meta property="og:site_name" content="@knowcode/doc-builder">
21
- <meta property="og:locale" content="en_US">
22
-
23
- <!-- Twitter Card -->
24
- <meta name="twitter:card" content="summary_large_image">
25
- <meta name="twitter:site" content="@planbbackups">
26
- <meta name="twitter:creator" content="@planbbackups">
27
- <meta name="twitter:title" content="Cache Control Anti-Pattern: Why Aggressive Cach...">
28
- <meta name="twitter:description" content="This guide documents how to implement aggressive cache-busting headers in doc-builder, but we strongly recommend against using this approach. This...">
29
- <meta name="twitter:image" content="https://doc-builder-delta.vercel.app/og-default.png">
30
-
31
- <!-- Custom Meta Tags -->
32
- <meta name="google-site-verification" content="FtzcDTf5BQ9K5EfnGazQkgU2U4FiN3ITzM7gHwqUAqQ">
33
- <meta name="msvalidate.01" content="B2D8C4C12C530D47AA962B24CAA09630">
6
+ <meta name="description" content="Beautiful documentation with the least effort possible">
7
+ <title>Cache Control Anti-Pattern: Why Aggressive Cache-Busting is Bad for Documentation Sites - @knowcode/doc-builder</title>
34
8
 
35
9
  <!-- Fonts -->
36
10
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
37
11
 
38
12
  <!-- Icons -->
39
13
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
40
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.1/src/regular/style.css">
41
14
 
42
15
  <!-- Mermaid -->
43
16
  <script src="https://cdn.jsdelivr.net/npm/mermaid@10.6.1/dist/mermaid.min.js"></script>
@@ -45,90 +18,8 @@
45
18
  <!-- Styles -->
46
19
  <link rel="stylesheet" href="/css/notion-style.css">
47
20
 
48
-
49
- <!-- Hide content until auth check -->
50
- <style>
51
- body {
52
- visibility: hidden;
53
- opacity: 0;
54
- transition: opacity 0.3s ease;
55
- }
56
- body.authenticated {
57
- visibility: visible;
58
- opacity: 1;
59
- }
60
- /* Show login/logout pages immediately */
61
- body.auth-page {
62
- visibility: visible;
63
- opacity: 1;
64
- }
65
- /* Style auth button consistently */
66
- .auth-btn {
67
- background: none;
68
- border: none;
69
- color: var(--text-secondary);
70
- cursor: pointer;
71
- padding: 0.5rem;
72
- border-radius: 0.5rem;
73
- transition: all 0.2s;
74
- font-size: 1.1rem;
75
- }
76
- .auth-btn:hover {
77
- background: var(--bg-secondary);
78
- color: var(--text-primary);
79
- }
80
- </style>
81
-
82
-
83
21
  <!-- Favicon -->
84
- <link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>✨</text></svg>">
85
-
86
- <script type="application/ld+json">
87
- {
88
- "@context": "https://schema.org",
89
- "@type": "TechArticle",
90
- "headline": "Cache Control Anti-Pattern: Why Aggressive Cache-Busting is Bad for Documentation Sites",
91
- "description": "This guide documents how to implement aggressive cache-busting headers in doc-builder, but we strongly recommend against using this approach. This...",
92
- "author": {
93
- "@type": "Person",
94
- "name": "Lindsay Smith"
95
- },
96
- "publisher": {
97
- "@type": "Organization",
98
- "name": "Knowcode Ltd",
99
- "url": "https://knowcode.tech"
100
- },
101
- "datePublished": "2025-07-27T08:30:10.806Z",
102
- "dateModified": "2025-07-27T08:30:10.806Z",
103
- "mainEntityOfPage": {
104
- "@type": "WebPage",
105
- "@id": "https://doc-builder-delta.vercel.app/private/cache-control-anti-pattern.html"
106
- },
107
- "breadcrumb": {
108
- "@type": "BreadcrumbList",
109
- "itemListElement": [
110
- {
111
- "@type": "ListItem",
112
- "position": 1,
113
- "name": "@knowcode/doc-builder",
114
- "item": "https://doc-builder-delta.vercel.app"
115
- },
116
- {
117
- "@type": "ListItem",
118
- "position": 2,
119
- "name": "Private",
120
- "item": "https://doc-builder-delta.vercel.app/private/"
121
- },
122
- {
123
- "@type": "ListItem",
124
- "position": 3,
125
- "name": "Cache Control Anti Pattern",
126
- "item": "https://doc-builder-delta.vercel.app/private/cache-control-anti-pattern.html"
127
- }
128
- ]
129
- }
130
- }
131
- </script>
22
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>📚</text></svg>">
132
23
  </head>
133
24
  <body>
134
25
  <!-- Header -->
@@ -138,14 +29,10 @@
138
29
 
139
30
  <div class="header-actions">
140
31
  <div class="deployment-info">
141
- <span class="deployment-date" title="Built with doc-builder v1.9.0">Last updated: Jul 27, 2025, 08:30 AM UTC</span>
32
+ <span class="deployment-date" title="Built with doc-builder v1.4.21">Last updated: Jul 27, 2025, 08:32 AM UTC</span>
142
33
  </div>
143
34
 
144
35
 
145
- <a href="../../login.html" class="auth-btn" title="Login/Logout">
146
- <i class="fas fa-sign-in-alt"></i>
147
- </a>
148
-
149
36
 
150
37
  <button id="theme-toggle" class="theme-toggle" aria-label="Toggle theme">
151
38
  <i class="fas fa-moon"></i>
@@ -205,6 +92,7 @@
205
92
  <a href="/guides/authentication-guide.html" class="nav-item" data-tooltip="@knowcode/doc-builder supports enterprise-grade authentication through Supabase - a secure, scalable authentication platform."><i class="fas fa-file-alt"></i> Authentication Guide</a>
206
93
  <a href="/guides/claude-workflow-guide.html" class="nav-item" data-tooltip="This guide demonstrates an efficient workflow for using Claude Code with a refined CLAUDE.md file to create high-quality documentation and deploy it..."><i class="fas fa-file-alt"></i> Claude Workflow Guide</a>
207
94
  <a href="/guides/documentation-standards.html" class="nav-item" data-tooltip="This document defines the documentation standards and conventions for the @knowcode/doc-builder project."><i class="fas fa-file-alt"></i> Documentation Standards</a>
95
+ <a href="/guides/image-modal-guide.html" class="nav-item" data-tooltip="When users click on any image in your generated documentation, it opens in a professional modal overlay with: Full-screen viewing experience Smooth..."><i class="fas fa-file-alt"></i> Image Modal Guide</a>
208
96
  <a href="/guides/phosphor-icons-guide.html" class="nav-item" data-tooltip="@knowcode/doc-builder automatically converts Unicode emojis in your markdown files to beautiful Phosphor icons in the generated HTML."><i class="fas fa-file-alt"></i> Phosphor Icons Guide</a>
209
97
  <a href="/guides/private-directory-authentication.html" class="nav-item" data-tooltip="The @knowcode/doc-builder provides flexible authentication options to protect your documentation."><i class="fas fa-file-alt"></i> Private Directory Authentication</a>
210
98
  <a href="/guides/public-site-deployment.html" class="nav-item" data-tooltip="The @knowcode/doc-builder now supports deploying public documentation sites without authentication."><i class="fas fa-file-alt"></i> Public Site Deployment</a>
@@ -213,7 +101,7 @@
213
101
  <a href="/guides/seo-optimization-guide.html" class="nav-item" data-tooltip="@knowcode/doc-builder includes comprehensive SEO (Search Engine Optimization) features that automatically optimize your documentation for search..."><i class="fas fa-file-alt"></i> Seo Optimization Guide</a>
214
102
  <a href="/guides/troubleshooting-guide.html" class="nav-item" data-tooltip="This guide helps you resolve common issues when using @knowcode/doc-builder."><i class="fas fa-file-alt"></i> Troubleshooting Guide</a>
215
103
  <a href="/guides/windows-setup-guide.html" class="nav-item" data-tooltip="This guide helps Windows users set up the complete AI-powered documentation workflow using Claude Code, @knowcode/doc-builder, and Vercel."><i class="fas fa-file-alt"></i> Windows Setup Guide</a></div></div>
216
- <div class="nav-section private-nav" data-level="1">
104
+ <div class="nav-section" data-level="1">
217
105
  <a class="nav-title collapsible expanded" href="#" data-target="nav-private-1" >
218
106
  <i class="fas fa-chevron-right collapse-icon"></i><i class="fas fa-folder"></i> Private
219
107
  </a>
@@ -226,7 +114,7 @@
226
114
  <a href="/private/supabase-auth-setup-guide.html" class="nav-item" data-tooltip="@knowcode/doc-builder supports enterprise-grade authentication through Supabase."><i class="fas fa-file-alt"></i> Supabase Auth Setup Guide</a>
227
115
  <a href="/private/test-private-doc.html" class="nav-item" data-tooltip="Test Private Document."><i class="fas fa-file-alt"></i> Test Private Doc</a>
228
116
  <a href="/private/user-management-tooling.html" class="nav-item" data-tooltip="The user management system is a set of tools designed to manage user access to Supabase-authenticated documentation sites built with."><i class="fas fa-file-alt"></i> User Management Tooling</a></div></div>
229
- <div class="nav-section private-nav" data-level="2">
117
+ <div class="nav-section" data-level="2">
230
118
  <a class="nav-title collapsible" href="/private/launch/README.html" data-target="nav-private-launch-2" >
231
119
  <i class="fas fa-chevron-right collapse-icon"></i><i class="fas fa-folder"></i> Launch
232
120
  </a>
@@ -251,7 +139,7 @@
251
139
  <main class="content">
252
140
  <div class="content-inner">
253
141
  <h1>Cache Control Anti-Pattern: Why Aggressive Cache-Busting is Bad for Documentation Sites</h1>
254
- <h2><i class="ph ph-warning-circle" aria-label="warning"></i> Important Notice</h2>
142
+ <h2>⚠️ Important Notice</h2>
255
143
  <p>This guide documents how to implement aggressive cache-busting headers in doc-builder, but <strong>we strongly recommend against using this approach</strong>. This documentation exists for educational purposes and to explain why this is considered an anti-pattern for static documentation sites.</p>
256
144
  <h2>Why Cache-Busting is a Bad Idea for Documentation</h2>
257
145
  <h3>1. Performance Degradation</h3>
@@ -382,10 +270,10 @@ module.exports = {
382
270
  <h2>Conclusion</h2>
383
271
  <p>Aggressive cache-busting is an anti-pattern for documentation sites. The performance and user experience costs far outweigh any benefits. Instead:</p>
384
272
  <ol>
385
- <li><i class="ph ph-check-circle" aria-label="checked"></i> Use intelligent caching strategies</li>
386
- <li><i class="ph ph-check-circle" aria-label="checked"></i> Implement version-based cache busting for assets</li>
387
- <li><i class="ph ph-check-circle" aria-label="checked"></i> Trust browsers to handle HTML caching appropriately</li>
388
- <li><i class="ph ph-x-circle" aria-label="error"></i> Don&#39;t disable caching entirely</li>
273
+ <li>✅ Use intelligent caching strategies</li>
274
+ <li>✅ Implement version-based cache busting for assets</li>
275
+ <li>✅ Trust browsers to handle HTML caching appropriately</li>
276
+ <li>❌ Don&#39;t disable caching entirely</li>
389
277
  </ol>
390
278
  <p>Remember: Documentation sites are meant to be fast, reliable, and accessible. Proper caching is essential to achieving these goals.</p>
391
279
  <h2>See Also</h2>
@@ -400,17 +288,7 @@ module.exports = {
400
288
  </div>
401
289
 
402
290
  <!-- Scripts -->
403
- <script>
404
- // Pass configuration to frontend
405
- window.docBuilderConfig = {
406
- features: {
407
- showPdfDownload: true,
408
- menuDefaultOpen: false
409
- }
410
- };
411
- </script>
412
291
  <script src="/js/main.js"></script>
413
- <script src="https://unpkg.com/@supabase/supabase-js@2"></script>
414
- <script src="/js/auth.js"></script>
292
+
415
293
  </body>
416
294
  </html>