@kenjura/ursa 0.75.0 → 0.77.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 (36) hide show
  1. package/CHANGELOG.md +85 -0
  2. package/meta/default.css +149 -3
  3. package/meta/templates/default-template/default.css +1268 -0
  4. package/meta/{default-template.html → templates/default-template/index.html} +49 -2
  5. package/meta/{menu.js → templates/default-template/menu.js} +1 -1
  6. package/meta/templates/default-template/sectionify.js +46 -0
  7. package/meta/templates/default-template/widgets.js +701 -0
  8. package/package.json +1 -1
  9. package/src/dev.js +125 -34
  10. package/src/helper/assetBundler.js +471 -0
  11. package/src/helper/build/autoIndex.js +26 -23
  12. package/src/helper/build/cacheBust.js +79 -0
  13. package/src/helper/build/navCache.js +4 -0
  14. package/src/helper/build/templates.js +176 -19
  15. package/src/helper/build/watchCache.js +7 -0
  16. package/src/helper/customMenu.js +4 -2
  17. package/src/helper/dependencyTracker.js +269 -0
  18. package/src/helper/findScriptJs.js +29 -0
  19. package/src/helper/findStyleCss.js +29 -0
  20. package/src/helper/portUtils.js +132 -0
  21. package/src/jobs/generate.js +276 -59
  22. package/src/serve.js +446 -162
  23. package/meta/character-sheet.css +0 -50
  24. package/meta/widgets.js +0 -376
  25. /package/meta/{goudy_bookletter_1911-webfont.woff → shared/goudy_bookletter_1911-webfont.woff} +0 -0
  26. /package/meta/{character-sheet/css → templates/character-sheet-template}/character-sheet.css +0 -0
  27. /package/meta/{character-sheet/js → templates/character-sheet-template}/components.js +0 -0
  28. /package/meta/{cssui.bundle.min.css → templates/character-sheet-template/cssui.bundle.min.css} +0 -0
  29. /package/meta/{character-sheet-template.html → templates/character-sheet-template/index.html} +0 -0
  30. /package/meta/{character-sheet/js → templates/character-sheet-template}/main.js +0 -0
  31. /package/meta/{character-sheet/js → templates/character-sheet-template}/model.js +0 -0
  32. /package/meta/{search.js → templates/default-template/search.js} +0 -0
  33. /package/meta/{sticky.js → templates/default-template/sticky.js} +0 -0
  34. /package/meta/{toc-generator.js → templates/default-template/toc-generator.js} +0 -0
  35. /package/meta/{toc.js → templates/default-template/toc.js} +0 -0
  36. /package/meta/{template2.html → templates/template2/index.html} +0 -0
@@ -10,7 +10,20 @@
10
10
 
11
11
  <body data-template-id="default">
12
12
  <nav id="nav-global">
13
- <button class="menu-button" aria-label="Menu">☰</button>
13
+ <div class="nav-left-controls">
14
+ <button class="menu-button" aria-label="Menu">☰</button>
15
+ <div class="widget-bar widget-bar-left">
16
+ <button class="widget-button" data-widget="recent-activity" data-widget-side="left" aria-label="Recent Activity" title="Recent Activity">
17
+ <span class="widget-icon">🕒</span>
18
+ </button>
19
+ <button class="widget-button" data-widget="suggested" data-widget-side="left" aria-label="Suggested Content" title="Suggested Content">
20
+ <span class="widget-icon">⭐</span>
21
+ </button>
22
+ </div>
23
+ <div id="ursa-update-indicator" class="ursa-update-indicator" style="display:none;" title="Updating...">
24
+ <div class="ursa-spinner"></div>
25
+ </div>
26
+ </div>
14
27
 
15
28
  <div class="nav-center">
16
29
  <nav id="nav-main-top">
@@ -37,15 +50,49 @@
37
50
  </div>
38
51
  </nav>
39
52
 
40
- <!-- Widget dropdown panel (shared by all widgets) -->
53
+ <!-- Widget dropdown panel for LEFT-side widgets -->
54
+ <div id="widget-dropdown-left" class="widget-dropdown widget-dropdown-left hidden">
55
+ <div id="widget-content-recent-activity" class="widget-content" data-widget="recent-activity">
56
+ <div class="widget-header">
57
+ <span class="widget-header-title">Recent Activity</span>
58
+ <button class="widget-close-btn" aria-label="Close">✕</button>
59
+ </div>
60
+ <div class="recent-activity-list">
61
+ <!-- Populated by JavaScript -->
62
+ </div>
63
+ </div>
64
+ <div id="widget-content-suggested" class="widget-content" data-widget="suggested">
65
+ <div class="widget-header">
66
+ <span class="widget-header-title">Suggested</span>
67
+ <button class="widget-close-btn" aria-label="Close">✕</button>
68
+ </div>
69
+ <div class="suggested-content-list">
70
+ <!-- Populated by JavaScript -->
71
+ </div>
72
+ </div>
73
+ </div>
74
+
75
+ <!-- Widget dropdown panel for RIGHT-side widgets -->
41
76
  <div id="widget-dropdown" class="widget-dropdown hidden">
42
77
  <div id="widget-content-toc" class="widget-content" data-widget="toc">
78
+ <div class="widget-header">
79
+ <span class="widget-header-title">Table of Contents</span>
80
+ <button class="widget-close-btn" aria-label="Close">✕</button>
81
+ </div>
43
82
  <!-- TOC will be generated by JavaScript -->
44
83
  </div>
45
84
  <div id="widget-content-search" class="widget-content" data-widget="search">
85
+ <div class="widget-header">
86
+ <span class="widget-header-title">Search</span>
87
+ <button class="widget-close-btn" aria-label="Close">✕</button>
88
+ </div>
46
89
  <!-- Search input + results placed here by JS -->
47
90
  </div>
48
91
  <div id="widget-content-profile" class="widget-content" data-widget="profile">
92
+ <div class="widget-header">
93
+ <span class="widget-header-title">Profile</span>
94
+ <button class="widget-close-btn" aria-label="Close">✕</button>
95
+ </div>
49
96
  <div class="widget-profile-placeholder">
50
97
  <span class="widget-profile-avatar">👤</span>
51
98
  <p>Sign in to access your profile</p>
@@ -11,7 +11,7 @@ document.addEventListener('DOMContentLoaded', () => {
11
11
  const navMain = document.querySelector('nav#nav-main');
12
12
  const navMainTop = document.querySelector('nav#nav-main-top');
13
13
  const menuPosition = document.body.dataset.menuPosition || 'top';
14
-
14
+
15
15
  // If menu position is top (default), handle differently
16
16
  if (menuPosition === 'top') {
17
17
  initTopMenu();
@@ -0,0 +1,46 @@
1
+ document.addEventListener('DOMContentLoaded', () => {
2
+ const article = document.querySelector('article#main-content');
3
+ if (!article) return;
4
+
5
+ const children = Array.from(article.children);
6
+ let sections = [];
7
+ let currentSection = document.createElement('section');
8
+ currentSection.classList.add('sectionOuter');
9
+
10
+ for (let i = 0; i < children.length; i++) {
11
+ const el = children[i];
12
+ // Skip breadcrumb nav — it stays outside sections
13
+ if (el.classList && el.classList.contains('breadcrumbs')) continue;
14
+ if (el.tagName === 'H1' && currentSection.childNodes.length > 0) {
15
+ sections.push(currentSection);
16
+ currentSection = document.createElement('section');
17
+ currentSection.classList.add('sectionOuter');
18
+ }
19
+ currentSection.appendChild(el);
20
+ }
21
+ if (currentSection.childNodes.length > 0) {
22
+ sections.push(currentSection);
23
+ }
24
+
25
+ // Preserve breadcrumb nav before clearing
26
+ const breadcrumbs = article.querySelector('.breadcrumbs');
27
+
28
+ // Remove all existing children
29
+ while (article.firstChild) {
30
+ article.removeChild(article.firstChild);
31
+ }
32
+
33
+ // Re-insert breadcrumbs at the top, outside any section
34
+ if (breadcrumbs) {
35
+ article.appendChild(breadcrumbs);
36
+ }
37
+
38
+ // Append new sections
39
+ sections.forEach(section => article.appendChild(section));
40
+
41
+
42
+ // Optional: Add section numbers or other decorations
43
+ Array.from(article.querySelectorAll('section.sectionOuter')).forEach((section, index) => {
44
+ section.style.setProperty('--section-index', index + 1);
45
+ });
46
+ });