@knowcode/doc-builder 1.8.7 → 1.9.0

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 (45) hide show
  1. package/.claude/settings.local.json +2 -1
  2. package/CHANGELOG.md +27 -0
  3. package/assets/css/notion-style.css +141 -0
  4. package/assets/js/main.js +76 -0
  5. package/html/README.html +10 -3
  6. package/html/css/notion-style.css +141 -0
  7. package/html/documentation-index.html +10 -3
  8. package/html/guides/authentication-default-change.html +10 -3
  9. package/html/guides/authentication-guide.html +10 -3
  10. package/html/guides/claude-workflow-guide.html +10 -3
  11. package/html/guides/documentation-standards.html +10 -3
  12. package/html/guides/phosphor-icons-guide.html +10 -3
  13. package/html/guides/private-directory-authentication.html +10 -3
  14. package/html/guides/public-site-deployment.html +10 -3
  15. package/html/guides/search-engine-verification-guide.html +10 -3
  16. package/html/guides/seo-guide.html +10 -3
  17. package/html/guides/seo-optimization-guide.html +10 -3
  18. package/html/guides/troubleshooting-guide.html +10 -3
  19. package/html/guides/windows-setup-guide.html +10 -3
  20. package/html/image-modal-test.html +305 -0
  21. package/html/index.html +10 -3
  22. package/html/js/main.js +76 -0
  23. package/html/private/cache-control-anti-pattern.html +10 -3
  24. package/html/private/launch/README.html +10 -3
  25. package/html/private/launch/auth-cleanup-summary.html +10 -3
  26. package/html/private/launch/bubble-plugin-specification.html +10 -3
  27. package/html/private/launch/go-to-market-strategy.html +10 -3
  28. package/html/private/launch/launch-announcements.html +10 -3
  29. package/html/private/launch/vercel-deployment-auth-setup.html +10 -3
  30. package/html/private/next-steps-walkthrough.html +11 -4
  31. package/html/private/supabase-auth-implementation-completed.html +10 -3
  32. package/html/private/supabase-auth-implementation-plan.html +10 -3
  33. package/html/private/supabase-auth-integration-plan.html +10 -3
  34. package/html/private/supabase-auth-setup-guide.html +10 -3
  35. package/html/private/test-private-doc.html +10 -3
  36. package/html/private/user-management-tooling.html +10 -3
  37. package/html/prompts/markdown-document-standards.html +409 -0
  38. package/html/sitemap.xml +56 -44
  39. package/html/vercel-cli-setup-guide.html +10 -3
  40. package/html/vercel-first-time-setup-guide.html +10 -3
  41. package/lib/core-builder.js +1 -0
  42. package/lib/emoji-mapper.js +13 -0
  43. package/package/assets/css/notion-style.css +432 -135
  44. package/package/assets/js/main.js +259 -25
  45. package/package.json +1 -1
@@ -126,7 +126,7 @@
126
126
  --container-padding-mobile: 20px;
127
127
  --container-padding-desktop: 40px;
128
128
  --header-height: 40px;
129
- --breadcrumb-height: 0px;
129
+ --breadcrumb-height: 40px;
130
130
  --sidebar-width: 280px;
131
131
  }
132
132
 
@@ -158,6 +158,9 @@ h1 {
158
158
  font-size: var(--text-4xl);
159
159
  font-weight: var(--font-bold);
160
160
  margin-bottom: var(--space-6);
161
+ margin-left: calc(-1 * var(--space-8));
162
+ margin-right: calc(-1 * var(--space-8));
163
+ padding: 0 var(--space-8);
161
164
  }
162
165
 
163
166
  h2 {
@@ -286,7 +289,8 @@ pre code {
286
289
  }
287
290
  }
288
291
 
289
- .logout-btn {
292
+ .logout-btn,
293
+ .auth-btn {
290
294
  background: none;
291
295
  border: none;
292
296
  font-size: var(--text-lg);
@@ -309,40 +313,41 @@ pre code {
309
313
  transform: translateY(-1px);
310
314
  }
311
315
 
316
+ .auth-btn:hover {
317
+ background: var(--color-bg-tertiary);
318
+ opacity: 1;
319
+ color: var(--color-text-primary);
320
+ transform: translateY(-1px);
321
+ }
322
+
312
323
  /* Sidebar */
313
324
  .sidebar {
314
- position: fixed;
315
- left: 0;
316
- top: calc(var(--header-height) + var(--breadcrumb-height));
317
- bottom: 0;
325
+ position: relative;
318
326
  width: var(--sidebar-width);
319
327
  background: var(--color-bg-secondary);
320
328
  border-right: 1px solid var(--color-border-default);
321
329
  overflow: hidden;
322
- transition: transform var(--duration-normal), top var(--duration-normal);
330
+ transition: width var(--duration-normal), transform 0.3s ease, margin-left 0.3s ease;
323
331
  min-width: 200px;
324
332
  max-width: 500px;
325
333
  user-select: none;
326
334
  display: flex;
327
335
  flex-direction: column;
328
336
  z-index: 100;
337
+ flex-shrink: 0;
338
+ height: 100%;
329
339
  }
330
340
 
331
- /* Adjust sidebar when banner is visible */
332
- .sidebar.banner-visible {
333
- top: calc(var(--header-height) + var(--breadcrumb-height) + 3.5rem);
341
+ /* Desktop sidebar closed state */
342
+ @media (min-width: 769px) {
343
+ .sidebar.closed {
344
+ transform: translateX(-100%);
345
+ margin-left: calc(var(--sidebar-width) * -1);
346
+ }
334
347
  }
335
348
 
336
- .sidebar-header {
337
- padding: var(--space-4);
338
- border-bottom: 1px solid var(--color-border-default);
339
- margin-bottom: var(--space-4);
340
- }
349
+ /* Banner adjustment no longer needed with relative positioning */
341
350
 
342
- /* Sidebar Breadcrumbs */
343
- .sidebar-breadcrumbs {
344
- margin-bottom: var(--space-3);
345
- }
346
351
 
347
352
  .sidebar-home-link {
348
353
  display: inline-flex;
@@ -454,26 +459,7 @@ pre code {
454
459
  color: var(--color-text-primary);
455
460
  }
456
461
 
457
- /* Breadcrumbs */
458
- .breadcrumbs {
459
- background: var(--color-bg-default);
460
- border-bottom: 1px solid var(--color-border-default);
461
- padding: var(--space-2) 0;
462
- position: fixed;
463
- top: calc(var(--header-height) + 3.5rem);
464
- left: 0;
465
- right: 0;
466
- z-index: 900;
467
- transition: top var(--duration-normal);
468
- }
469
-
470
- .breadcrumbs.banner-visible {
471
- top: calc(var(--header-height) + 3.5rem);
472
- }
473
-
474
- .breadcrumbs:not(.banner-visible) {
475
- top: var(--header-height);
476
- }
462
+ /* Breadcrumbs - definition moved to line 888 to avoid duplication */
477
463
 
478
464
  .breadcrumb-item {
479
465
  display: inline-flex;
@@ -516,56 +502,12 @@ pre code {
516
502
  margin-top: calc(var(--header-height) + var(--breadcrumb-height) + 3.5rem);
517
503
  }
518
504
 
519
- /* Sidebar */
520
- .sidebar {
521
- width: var(--sidebar-width);
522
- background: var(--color-bg-secondary);
523
- border-right: 1px solid var(--color-border-default);
524
- display: flex;
525
- flex-direction: column;
526
- position: relative;
527
- }
528
-
529
505
  .sidebar-header {
530
506
  padding: var(--space-3);
531
507
  border-bottom: 1px solid var(--color-border-default);
532
- margin-bottom: var(--space-4);
533
- }
534
-
535
- /* Already defined above, but ensure consistency */
536
- .sidebar-breadcrumbs {
537
- margin-bottom: var(--space-3);
538
- }
539
-
540
- .filter-box {
541
- position: relative;
542
- display: flex;
543
- align-items: center;
544
- }
545
-
546
- .filter-input {
547
- width: 100%;
548
- padding: var(--space-2) var(--space-8) var(--space-2) var(--space-3);
549
- border: 1px solid var(--color-border-default);
550
- border-radius: var(--radius-md);
551
- background: var(--color-bg-default);
552
- color: var(--color-text-primary);
553
- font-size: var(--text-sm);
554
- transition: all var(--duration-fast);
555
- }
556
-
557
- .filter-input:focus {
558
- outline: none;
559
- border-color: var(--color-border-focus);
560
- box-shadow: 0 0 0 2px var(--color-accent-blue-bg);
508
+ margin-bottom: 0;
561
509
  }
562
510
 
563
- .filter-icon {
564
- position: absolute;
565
- right: var(--space-3);
566
- color: var(--color-text-tertiary);
567
- pointer-events: none;
568
- }
569
511
 
570
512
  /* Navigation */
571
513
  .navigation {
@@ -725,18 +667,6 @@ pre code {
725
667
  }
726
668
 
727
669
  /* Main Content */
728
- .main-wrapper {
729
- display: flex;
730
- padding-top: calc(var(--header-height) + var(--breadcrumb-height));
731
- min-height: 100vh;
732
- transition: padding-top var(--duration-normal);
733
- }
734
-
735
- /* Adjust layout when banner is visible */
736
- .main-wrapper.banner-visible {
737
- padding-top: calc(var(--header-height) + var(--breadcrumb-height) + 3.5rem);
738
- }
739
-
740
670
  .content {
741
671
  flex: 1;
742
672
  padding: 40px var(--space-8);
@@ -768,12 +698,65 @@ th {
768
698
  background: var(--color-bg-secondary);
769
699
  border-bottom: 1px solid var(--color-border-default);
770
700
  color: var(--color-text-primary);
701
+ vertical-align: top !important;
771
702
  }
772
703
 
773
704
  td {
774
705
  padding: var(--space-3) var(--space-4);
775
706
  border-bottom: 1px solid var(--color-border-default);
776
707
  color: var(--color-text-primary);
708
+ vertical-align: top !important;
709
+ }
710
+
711
+ /* Ensure all table cell content is top-aligned */
712
+ table th,
713
+ table td {
714
+ vertical-align: top !important;
715
+ }
716
+
717
+ /* Ensure nested elements in table cells don't affect alignment */
718
+ table td > *,
719
+ table th > * {
720
+ vertical-align: top;
721
+ }
722
+
723
+ /* Remove top margin from first element in table cells */
724
+ td > *:first-child,
725
+ th > *:first-child {
726
+ margin-top: 0 !important;
727
+ }
728
+
729
+ /* Remove bottom margin from last element in table cells */
730
+ td > *:last-child,
731
+ th > *:last-child {
732
+ margin-bottom: 0 !important;
733
+ }
734
+
735
+ /* Specifically target common block elements that might be first in cells */
736
+ td > h1:first-child,
737
+ td > h2:first-child,
738
+ td > h3:first-child,
739
+ td > h4:first-child,
740
+ td > h5:first-child,
741
+ td > h6:first-child,
742
+ td > p:first-child,
743
+ td > ul:first-child,
744
+ td > ol:first-child,
745
+ td > blockquote:first-child,
746
+ td > pre:first-child,
747
+ th > h1:first-child,
748
+ th > h2:first-child,
749
+ th > h3:first-child,
750
+ th > h4:first-child,
751
+ th > h5:first-child,
752
+ th > h6:first-child,
753
+ th > p:first-child,
754
+ th > ul:first-child,
755
+ th > ol:first-child,
756
+ th > blockquote:first-child,
757
+ th > pre:first-child {
758
+ margin-top: 0 !important;
759
+ padding-top: 0 !important;
777
760
  }
778
761
 
779
762
  tr:last-child td {
@@ -966,10 +949,18 @@ tr:hover {
966
949
  right: 0;
967
950
  height: var(--breadcrumb-height);
968
951
  z-index: 900;
969
- transition: background-color var(--duration-normal);
952
+ transition: top var(--duration-normal), background-color var(--duration-normal);
970
953
  gap: var(--space-2);
971
954
  }
972
955
 
956
+ .breadcrumbs.banner-visible {
957
+ top: calc(var(--header-height) + 3.5rem);
958
+ }
959
+
960
+ .breadcrumbs:not(.banner-visible) {
961
+ top: var(--header-height);
962
+ }
963
+
973
964
  .breadcrumb-item {
974
965
  display: flex;
975
966
  align-items: center;
@@ -1009,10 +1000,7 @@ tr:hover {
1009
1000
  opacity: 1;
1010
1001
  }
1011
1002
 
1012
- /* Adjust breadcrumbs when banner is visible */
1013
- .breadcrumbs.banner-visible {
1014
- top: calc(var(--header-height) + 3.5rem);
1015
- }
1003
+ /* Banner visibility handled in main breadcrumbs definition */
1016
1004
 
1017
1005
  /* Menu Toggle (Mobile) */
1018
1006
  .menu-toggle {
@@ -1023,26 +1011,73 @@ tr:hover {
1023
1011
  cursor: pointer;
1024
1012
  color: var(--color-text-primary);
1025
1013
  padding: var(--space-2);
1014
+ border-radius: var(--radius-small);
1015
+ transition: all var(--duration-fast) var(--easing-out);
1016
+ }
1017
+
1018
+ .menu-toggle:hover {
1019
+ background: var(--color-bg-secondary);
1020
+ color: var(--color-text-primary);
1021
+ }
1022
+
1023
+ /* Show menu toggle on desktop when menu starts closed or is closed */
1024
+ @media (min-width: 769px) {
1025
+ body.menu-starts-closed .menu-toggle {
1026
+ display: block;
1027
+ }
1026
1028
  }
1027
1029
 
1028
1030
  /* Responsive Design */
1029
- @media (max-width: 1024px) {
1031
+ /* Keep sidebar visible on tablets, hide only on mobile */
1032
+
1033
+ @media (max-width: 768px) {
1034
+ .header-content {
1035
+ padding: 0 var(--space-4);
1036
+ }
1037
+
1038
+ /* Hide sidebar on mobile */
1030
1039
  .sidebar {
1040
+ position: fixed;
1041
+ top: calc(var(--header-height) + var(--breadcrumb-height));
1042
+ left: 0;
1043
+ height: calc(100vh - var(--header-height) - var(--breadcrumb-height));
1044
+ z-index: 1002; /* Above header and floating button */
1031
1045
  transform: translateX(-100%);
1032
1046
  transition: transform var(--duration-normal) var(--easing-out);
1047
+ box-shadow: 2px 0 8px rgba(0, 0, 0, 0.15); /* Add shadow for depth */
1033
1048
  }
1034
1049
 
1035
1050
  .sidebar.open {
1036
1051
  transform: translateX(0);
1037
1052
  }
1038
1053
 
1054
+ /* Mobile menu overlay */
1055
+ .sidebar-overlay {
1056
+ display: none;
1057
+ position: fixed;
1058
+ top: 0;
1059
+ left: 0;
1060
+ right: 0;
1061
+ bottom: 0;
1062
+ background: rgba(0, 0, 0, 0.5);
1063
+ z-index: 1001; /* Below sidebar but above content */
1064
+ opacity: 0;
1065
+ transition: opacity var(--duration-normal);
1066
+ }
1067
+
1068
+ .sidebar-overlay.active {
1069
+ display: block;
1070
+ opacity: 1;
1071
+ }
1072
+
1039
1073
  .main-wrapper {
1040
1074
  margin-left: 0;
1075
+ margin-top: var(--header-height); /* Only account for fixed header on mobile */
1041
1076
  }
1042
1077
 
1043
1078
  .content {
1044
1079
  margin-left: 0;
1045
- padding: var(--space-6) var(--space-4);
1080
+ padding: var(--space-3) var(--space-4); /* Reduced top/bottom padding on mobile */
1046
1081
  }
1047
1082
 
1048
1083
  .menu-toggle {
@@ -1050,34 +1085,19 @@ tr:hover {
1050
1085
  }
1051
1086
  }
1052
1087
 
1053
- @media (max-width: 768px) {
1054
- .header-content {
1055
- padding: 0 var(--space-4);
1056
- }
1057
-
1058
- /* Adjust mobile layout when banner is visible */
1059
- .main-wrapper.banner-visible {
1060
- padding-top: calc(var(--header-height) + var(--breadcrumb-height) + 4rem);
1061
- }
1062
-
1063
- .sidebar.banner-visible {
1064
- top: calc(var(--header-height) + var(--breadcrumb-height) + 4rem);
1065
- }
1066
- }
1067
-
1068
1088
  /* Mermaid Diagrams */
1069
1089
  .mermaid {
1070
1090
  background: var(--color-bg-secondary);
1071
1091
  padding: var(--space-4);
1072
1092
  border-radius: var(--radius-lg);
1073
1093
  overflow-x: auto;
1074
- margin: var(--space-4) 0;
1094
+ margin: var(--space-2) 0;
1075
1095
  }
1076
1096
 
1077
1097
  /* Mermaid Full Screen Viewer */
1078
1098
  .mermaid-container {
1079
1099
  position: relative;
1080
- margin: var(--space-6) 0;
1100
+ margin: var(--space-3) 0;
1081
1101
  border: 1px solid var(--color-border-default);
1082
1102
  border-radius: var(--radius-lg);
1083
1103
  overflow: hidden;
@@ -1139,7 +1159,7 @@ tr:hover {
1139
1159
  }
1140
1160
 
1141
1161
  .mermaid-wrapper {
1142
- padding: var(--space-6);
1162
+ padding: var(--space-3);
1143
1163
  overflow: auto;
1144
1164
  max-height: 600px;
1145
1165
  }
@@ -1661,6 +1681,62 @@ tr:hover {
1661
1681
 
1662
1682
  /* Remove custom positioning variables - tooltips always go right */
1663
1683
 
1684
+ /* Floating Menu Button */
1685
+ .floating-menu-toggle {
1686
+ position: fixed;
1687
+ bottom: var(--space-6);
1688
+ right: var(--space-6);
1689
+ width: 56px;
1690
+ height: 56px;
1691
+ border-radius: 50%;
1692
+ background: var(--color-accent-blue);
1693
+ color: white;
1694
+ border: none;
1695
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15), 0 2px 4px rgba(0, 0, 0, 0.1);
1696
+ display: flex;
1697
+ align-items: center;
1698
+ justify-content: center;
1699
+ font-size: 1.25rem;
1700
+ cursor: pointer;
1701
+ z-index: 1001; /* Above sidebar */
1702
+ opacity: 0;
1703
+ transform: scale(0.8) translateY(20px);
1704
+ transition: all var(--duration-normal) var(--easing-out);
1705
+ -webkit-tap-highlight-color: transparent;
1706
+ }
1707
+
1708
+ .floating-menu-toggle.visible {
1709
+ opacity: 1;
1710
+ transform: scale(1) translateY(0);
1711
+ }
1712
+
1713
+ .floating-menu-toggle:hover {
1714
+ transform: scale(1.1) translateY(0);
1715
+ box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2), 0 3px 6px rgba(0, 0, 0, 0.15);
1716
+ }
1717
+
1718
+ .floating-menu-toggle:active {
1719
+ transform: scale(0.95) translateY(0);
1720
+ }
1721
+
1722
+ .floating-menu-toggle i {
1723
+ transition: transform var(--duration-fast) var(--easing-out);
1724
+ }
1725
+
1726
+ .floating-menu-toggle:hover i {
1727
+ transform: rotate(90deg);
1728
+ }
1729
+
1730
+ /* Dark mode styles for floating button */
1731
+ .dark-mode .floating-menu-toggle {
1732
+ background: var(--color-accent-blue);
1733
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
1734
+ }
1735
+
1736
+ .dark-mode .floating-menu-toggle:hover {
1737
+ box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.3);
1738
+ }
1739
+
1664
1740
  /* Mobile adjustments */
1665
1741
  @media (max-width: 768px) {
1666
1742
  /* Disable tooltips on mobile to prevent overlap issues */
@@ -1673,32 +1749,28 @@ tr:hover {
1673
1749
  flex-direction: column;
1674
1750
  height: auto;
1675
1751
  min-height: calc(100vh - var(--header-height) - var(--breadcrumb-height));
1752
+ margin-top: calc(var(--header-height) + var(--breadcrumb-height)); /* Account for both fixed elements */
1676
1753
  }
1677
1754
 
1678
- .sidebar {
1679
- width: 100%;
1680
- max-height: 250px;
1681
- border-right: none;
1682
- border-bottom: 1px solid var(--color-border-default);
1683
- }
1755
+ /* Sidebar positioning handled in earlier media query */
1684
1756
 
1685
1757
  .content {
1686
- padding: var(--space-4);
1758
+ padding: var(--space-3) var(--space-4); /* Consistent reduced padding on mobile */
1687
1759
  }
1688
1760
 
1689
1761
  .content-inner {
1690
1762
  max-width: none;
1691
1763
  }
1692
1764
 
1693
- .preview-banner {
1694
- position: relative;
1695
- top: 0;
1765
+ h1 {
1766
+ margin-left: calc(-1 * var(--space-4));
1767
+ margin-right: calc(-1 * var(--space-4));
1768
+ padding: 0 var(--space-4);
1696
1769
  }
1697
1770
 
1698
- .breadcrumbs {
1699
- position: relative;
1700
- top: 0;
1701
- }
1771
+ /* Keep preview banner fixed on mobile */
1772
+
1773
+ /* Keep breadcrumbs fixed on mobile to prevent double spacing */
1702
1774
  }
1703
1775
 
1704
1776
  /* Navigation Sections */
@@ -1911,4 +1983,229 @@ tr:hover {
1911
1983
  background: #451a1a;
1912
1984
  border-color: #7f1d1d;
1913
1985
  color: #fca5a5;
1986
+ }
1987
+
1988
+ /* Phosphor Icons Alignment */
1989
+ .ph {
1990
+ display: inline-block;
1991
+ vertical-align: middle;
1992
+ line-height: 1;
1993
+ position: relative;
1994
+ top: -0.05em; /* Slight upward adjustment for better baseline alignment */
1995
+ }
1996
+
1997
+ /* Ensure icons in headings are properly aligned */
1998
+ h1 .ph, h2 .ph, h3 .ph, h4 .ph, h5 .ph, h6 .ph {
1999
+ font-size: 0.85em; /* Slightly smaller in headings */
2000
+ line-height: 1;
2001
+ top: -0.05em;
2002
+ }
2003
+
2004
+ /* Icons in lists need special handling */
2005
+ li .ph {
2006
+ margin-right: 0.3em;
2007
+ font-size: 1.1em;
2008
+ line-height: 1;
2009
+ vertical-align: middle;
2010
+ top: -0.05em;
2011
+ }
2012
+
2013
+ /* Icons in tables */
2014
+ td .ph, th .ph {
2015
+ line-height: 1;
2016
+ vertical-align: middle;
2017
+ top: -0.05em;
2018
+ }
2019
+
2020
+ /* Icons in navigation */
2021
+ .nav-item .ph,
2022
+ .nav-title .ph {
2023
+ vertical-align: middle;
2024
+ line-height: 1;
2025
+ top: 0; /* Navigation items are flex, so no adjustment needed */
2026
+ }
2027
+
2028
+ /* Icon size adjustments for better visual balance */
2029
+ .content p .ph {
2030
+ font-size: 1.1em; /* Slightly larger than text for visual balance */
2031
+ }
2032
+
2033
+ /* Special handling for inline code with icons */
2034
+ code .ph {
2035
+ font-size: 0.9em;
2036
+ vertical-align: middle;
2037
+ line-height: 1;
2038
+ top: 0;
2039
+ }
2040
+
2041
+ /* Additional fine-tuning for specific contexts */
2042
+ .content-inner .ph {
2043
+ /* Remove the transform as we're now using consistent vertical-align: middle */
2044
+ }
2045
+
2046
+ /* ============================================================================
2047
+ Private Navigation Visibility
2048
+ ============================================================================ */
2049
+
2050
+ /* Hide private navigation sections by default */
2051
+ .private-nav {
2052
+ display: none;
2053
+ }
2054
+
2055
+ /* Show private navigation when user is authenticated */
2056
+ body.authenticated .private-nav {
2057
+ display: block;
2058
+ }
2059
+
2060
+ /* Smooth transition for authentication state changes */
2061
+ .nav-section {
2062
+ transition: opacity 0.2s ease-in-out;
2063
+ }
2064
+
2065
+ /* Optional: Add a lock icon to private sections */
2066
+ .private-nav .nav-title::after {
2067
+ content: ' 🔒';
2068
+ font-size: 0.8em;
2069
+ }
2070
+
2071
+ /* ============================================================================
2072
+ Image Modal System
2073
+ ============================================================================ */
2074
+
2075
+ /* Style all content images to be clickable */
2076
+ .content img {
2077
+ cursor: pointer;
2078
+ transition: all var(--duration-normal) var(--easing-out);
2079
+ border-radius: var(--radius-md);
2080
+ max-width: 100%;
2081
+ height: auto;
2082
+ }
2083
+
2084
+ .content img:hover {
2085
+ opacity: 0.9;
2086
+ transform: scale(1.02);
2087
+ box-shadow: var(--shadow-lg);
2088
+ }
2089
+
2090
+ /* Modal overlay - hidden by default */
2091
+ .image-modal {
2092
+ display: none;
2093
+ position: fixed;
2094
+ top: 0;
2095
+ left: 0;
2096
+ width: 100%;
2097
+ height: 100%;
2098
+ background: rgba(0, 0, 0, 0.9);
2099
+ z-index: 10000;
2100
+ cursor: pointer;
2101
+ opacity: 0;
2102
+ transition: opacity var(--duration-normal) var(--easing-out);
2103
+ }
2104
+
2105
+ /* Show modal when active */
2106
+ .image-modal.active {
2107
+ display: flex;
2108
+ align-items: center;
2109
+ justify-content: center;
2110
+ opacity: 1;
2111
+ }
2112
+
2113
+ /* Modal content container */
2114
+ .image-modal-content {
2115
+ position: relative;
2116
+ max-width: 95%;
2117
+ max-height: 95%;
2118
+ margin: auto;
2119
+ cursor: default;
2120
+ }
2121
+
2122
+ /* Modal image */
2123
+ .image-modal-img {
2124
+ width: auto;
2125
+ height: auto;
2126
+ max-width: 100%;
2127
+ max-height: 100vh;
2128
+ border-radius: var(--radius-lg);
2129
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
2130
+ cursor: default;
2131
+ }
2132
+
2133
+ /* Close button */
2134
+ .image-modal-close {
2135
+ position: absolute;
2136
+ top: -50px;
2137
+ right: 0;
2138
+ background: rgba(255, 255, 255, 0.1);
2139
+ border: 2px solid rgba(255, 255, 255, 0.3);
2140
+ color: white;
2141
+ width: 40px;
2142
+ height: 40px;
2143
+ border-radius: 50%;
2144
+ cursor: pointer;
2145
+ display: flex;
2146
+ align-items: center;
2147
+ justify-content: center;
2148
+ font-size: 20px;
2149
+ font-weight: bold;
2150
+ transition: all var(--duration-fast) var(--easing-out);
2151
+ backdrop-filter: blur(10px);
2152
+ }
2153
+
2154
+ .image-modal-close:hover {
2155
+ background: rgba(255, 255, 255, 0.2);
2156
+ border-color: rgba(255, 255, 255, 0.5);
2157
+ transform: scale(1.1);
2158
+ }
2159
+
2160
+ /* Image caption in modal */
2161
+ .image-modal-caption {
2162
+ position: absolute;
2163
+ bottom: -50px;
2164
+ left: 0;
2165
+ right: 0;
2166
+ background: rgba(0, 0, 0, 0.7);
2167
+ color: white;
2168
+ padding: var(--space-3) var(--space-4);
2169
+ border-radius: var(--radius-md);
2170
+ font-size: var(--text-sm);
2171
+ text-align: center;
2172
+ backdrop-filter: blur(10px);
2173
+ }
2174
+
2175
+ /* Dark theme adjustments */
2176
+ [data-theme="dark"] .image-modal {
2177
+ background: rgba(0, 0, 0, 0.95);
2178
+ }
2179
+
2180
+ [data-theme="dark"] .image-modal-close {
2181
+ background: rgba(255, 255, 255, 0.15);
2182
+ border-color: rgba(255, 255, 255, 0.4);
2183
+ }
2184
+
2185
+ [data-theme="dark"] .image-modal-close:hover {
2186
+ background: rgba(255, 255, 255, 0.25);
2187
+ border-color: rgba(255, 255, 255, 0.6);
2188
+ }
2189
+
2190
+ /* Mobile responsive adjustments */
2191
+ @media (max-width: 768px) {
2192
+ .image-modal-content {
2193
+ max-width: 98%;
2194
+ max-height: 98%;
2195
+ }
2196
+
2197
+ .image-modal-close {
2198
+ top: -40px;
2199
+ width: 35px;
2200
+ height: 35px;
2201
+ font-size: 18px;
2202
+ }
2203
+
2204
+ .image-modal-caption {
2205
+ bottom: -40px;
2206
+ font-size: var(--text-xs);
2207
+ padding: var(--space-2) var(--space-3);
2208
+ }
2209
+ }
2210
+ opacity: 0.6;
1914
2211
  }