solid-panes 4.2.5 → 4.4.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 (106) hide show
  1. package/README.md +42 -0
  2. package/dist/0314353e28ce6e5539af.svg +9 -0
  3. package/dist/04567ff683933c35c465.png +0 -0
  4. package/dist/10163fd9b5a0e00d63a0.png +0 -0
  5. package/dist/1234dcb2eec2e45f252b.png +0 -0
  6. package/dist/20899934157df4db56cb.png +0 -0
  7. package/dist/33760bf79f097f449da5.png +0 -0
  8. package/dist/4cceba29ab33b1ddd9bb.svg +6 -0
  9. package/dist/578d2b6ed32e7624164e.png +0 -0
  10. package/dist/5f62a5b2b7e99b9640c7.png +0 -0
  11. package/dist/6525766ecd288ec60129.png +0 -0
  12. package/dist/7800be6f6c4b5b0f4f20.png +0 -0
  13. package/dist/7b7538c6f6b317968009.svg +9 -0
  14. package/dist/92d03142abe6efc0b42d.svg +6 -0
  15. package/dist/976473cf5fe24d657d4b.png +0 -0
  16. package/dist/RDFXMLPane.js +1 -0
  17. package/dist/bda84f59e7216675a208.png +0 -0
  18. package/dist/cd68e8f3990ba8b2139e.png +0 -0
  19. package/dist/dashboard/basicPreferences.d.ts.map +1 -1
  20. package/dist/dashboard/basicPreferences.js +1 -0
  21. package/dist/dashboard/dashboardPane.d.ts.map +1 -1
  22. package/dist/dashboard/dashboardPane.js +9 -3
  23. package/dist/dashboard/homepage.d.ts +1 -1
  24. package/dist/dashboard/homepage.d.ts.map +1 -1
  25. package/dist/dashboard/homepage.js +5 -35
  26. package/dist/e7074a7e2cb69e51cfd3.png +0 -0
  27. package/dist/f3772696fb7ee53c23d8.png +0 -0
  28. package/dist/form/pane.js +1 -1
  29. package/dist/home/homePane.d.ts.map +1 -1
  30. package/dist/home/homePane.js +2 -0
  31. package/dist/humanReadablePane.js +34 -8
  32. package/dist/icons/clock.svg +7 -0
  33. package/dist/icons/comment.svg +6 -0
  34. package/dist/icons/dashboard.svg +9 -0
  35. package/dist/icons/downArrow.svg +6 -0
  36. package/dist/icons/folder.svg +6 -0
  37. package/dist/icons/friends.svg +9 -0
  38. package/dist/icons/help.svg +8 -0
  39. package/dist/icons/iconHelper.d.ts +2 -0
  40. package/dist/icons/iconHelper.d.ts.map +1 -0
  41. package/dist/icons/iconHelper.js +23 -0
  42. package/dist/icons/menu.svg +8 -0
  43. package/dist/icons/person.svg +6 -0
  44. package/dist/icons/personInCircle.svg +8 -0
  45. package/dist/icons/sharing.svg +10 -0
  46. package/dist/icons/signOut.svg +8 -0
  47. package/dist/icons/signup.png +0 -0
  48. package/dist/icons/star.svg +3 -0
  49. package/dist/index.d.ts +5 -4
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +19 -4
  52. package/dist/internal/internalPane.d.ts.map +1 -1
  53. package/dist/internal/internalPane.js +1 -0
  54. package/dist/mainPage/footer.d.ts +14 -2
  55. package/dist/mainPage/footer.d.ts.map +1 -1
  56. package/dist/mainPage/footer.js +21 -13
  57. package/dist/mainPage/header.d.ts +16 -1
  58. package/dist/mainPage/header.d.ts.map +1 -1
  59. package/dist/mainPage/header.js +179 -61
  60. package/dist/mainPage/index.d.ts +15 -1
  61. package/dist/mainPage/index.d.ts.map +1 -1
  62. package/dist/mainPage/index.js +38 -7
  63. package/dist/mainPage/menu.css +243 -0
  64. package/dist/mainPage/menu.d.ts +7 -0
  65. package/dist/mainPage/menu.d.ts.map +1 -0
  66. package/dist/mainPage/menu.js +409 -0
  67. package/dist/n3Pane.js +1 -0
  68. package/dist/outline/context.d.ts +2 -2
  69. package/dist/outline/context.d.ts.map +1 -1
  70. package/dist/outline/context.js +5 -2
  71. package/dist/outline/manager.css +12 -14
  72. package/dist/outline/manager.js +152 -81
  73. package/dist/outline/userInput.js +6 -3
  74. package/dist/pad/padPane.css +36 -0
  75. package/dist/pad/padPane.d.ts +1 -0
  76. package/dist/pad/padPane.d.ts.map +1 -1
  77. package/dist/pad/padPane.js +32 -21
  78. package/dist/playlist/playlistPane.js +2 -6
  79. package/dist/profileUtils/ownerProfile.d.ts +5 -0
  80. package/dist/profileUtils/ownerProfile.d.ts.map +1 -0
  81. package/dist/profileUtils/ownerProfile.js +84 -0
  82. package/dist/registerPanes.js +4 -4
  83. package/dist/slideshow/slideshowPane.js +1 -1
  84. package/dist/social/editProfileDetails.d.ts +19 -0
  85. package/dist/social/editProfileDetails.d.ts.map +1 -0
  86. package/dist/social/editProfileDetails.js +267 -0
  87. package/dist/social/icons.d.ts +5 -0
  88. package/dist/social/icons.d.ts.map +1 -0
  89. package/dist/social/icons.js +60 -0
  90. package/dist/social/socialPane.css +804 -0
  91. package/dist/social/socialPane.d.ts +30 -0
  92. package/dist/social/socialPane.d.ts.map +1 -0
  93. package/dist/social/socialPane.js +558 -0
  94. package/dist/social/socialSections.d.ts +66 -0
  95. package/dist/social/socialSections.d.ts.map +1 -0
  96. package/dist/social/socialSections.js +317 -0
  97. package/dist/solid-panes.js +28903 -13713
  98. package/dist/solid-panes.js.map +1 -1
  99. package/dist/solid-panes.min.js +2235 -247
  100. package/dist/solid-panes.min.js.map +1 -1
  101. package/dist/style/tabbedtab.css +0 -124
  102. package/dist/tabbed/tabbedPane.d.ts.map +1 -1
  103. package/dist/tabbed/tabbedPane.js +2 -0
  104. package/dist/versionInfo.js +7 -7
  105. package/package.json +15 -10
  106. package/dist/socialPane.js +0 -430
@@ -0,0 +1,243 @@
1
+ .menu-content {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: 0.5rem;
5
+ min-height: 0;
6
+ overflow-y: auto;
7
+ }
8
+
9
+ .app-nav.mobile-hidden .menu-content,
10
+ .app-nav.mobile-visible .menu-content {
11
+ padding-top: 0.75rem;
12
+ }
13
+
14
+ .menu-footer {
15
+ width: 100%;
16
+ padding: 1rem;
17
+ border-top: 1px solid var(--color-border, #d1d1d1);
18
+ font-size: 0.875rem;
19
+ color: var(--color-text-muted, #555);
20
+ line-height: 1.4;
21
+ background: inherit;
22
+ }
23
+
24
+ .app-nav.collapsed .menu-footer {
25
+ display: none;
26
+ text-align: center;
27
+ padding: 0.75rem 0;
28
+ }
29
+
30
+ .menu-item {
31
+ display: flex;
32
+ align-items: center;
33
+ gap: var(--spacing-2xs, 0.625rem);
34
+ border: 0;
35
+ border-radius: var(--border-radius-sm, 0.2rem);
36
+ padding: 0.5rem var(--spacing-xs, 0.75rem);
37
+ background: transparent;
38
+ color: var(--color-text-heading, #000000);
39
+ text-decoration: none;
40
+ width: 100%;
41
+ text-align: left;
42
+ cursor: pointer;
43
+ }
44
+
45
+ .menu-toggle-icon {
46
+ width: 30px;
47
+ height: 30px;
48
+ }
49
+
50
+ .menu-item-icon {
51
+ width: var(--icon-xxs, 1rem);
52
+ height: var(--icon-xxs, 1rem);
53
+ flex: 0 0 var(--icon-xxs, 1rem);
54
+ object-fit: contain;
55
+ }
56
+
57
+ .menu-item-label {
58
+ min-width: 0;
59
+ }
60
+
61
+ .menu-item:hover,
62
+ .menu-item:focus {
63
+ background: var(--color-header-menu-item-hover, #e6dcff);
64
+ }
65
+
66
+ .menu-item-active,
67
+ .menu-item-active:hover,
68
+ .menu-item-active:focus {
69
+ background: var(--color-header-menu-item-selected, #cbb9ff);
70
+ color: var(--color-header-menu-item-text-selected, #7c4cff);
71
+ }
72
+
73
+ .menu-toggle {
74
+ position: fixed;
75
+ top: 0.5rem;
76
+ left: 1rem;
77
+ z-index: 300;
78
+ display: inline-flex;
79
+ align-items: center;
80
+ justify-content: center;
81
+ gap: 0.375rem;
82
+ min-width: var(--icon-md, 2.5rem);
83
+ height: var(--icon-md, 2.5rem);
84
+ padding: 0 0.625rem;
85
+ border: 1px solid var(--color-border);
86
+ background: var(--color-menu-bg, #ffffff);
87
+ color: var(--color-text);
88
+ border-radius: var(--border-radius-sm, 0.2rem);
89
+ margin: 0;
90
+ }
91
+
92
+ .menu-toggle-label {
93
+ font-size: 1.2rem;
94
+ font-weight: 600;
95
+ white-space: nowrap;
96
+ overflow: hidden;
97
+ text-overflow: ellipsis;
98
+ max-width: 10rem;
99
+ }
100
+
101
+ .menu-overlay {
102
+ position: fixed;
103
+ inset: 0;
104
+ background: rgba(0, 0, 0, 0.35);
105
+ z-index: 100;
106
+ }
107
+
108
+ .app-nav {
109
+ position: fixed;
110
+ left: 0;
111
+ top: 0;
112
+ bottom: 0;
113
+ width: min(18rem, 320px);
114
+ display: grid;
115
+ grid-template-rows: 1fr auto;
116
+ overflow: hidden;
117
+ background: var(--color-menu-bg, #ffffff);
118
+ border-right: 1px solid var(--color-border);
119
+ z-index: 10;
120
+ }
121
+
122
+ .app-nav.mobile-hidden,
123
+ .app-nav.mobile-visible {
124
+ position: fixed;
125
+ left: 0;
126
+ top: 0;
127
+ bottom: 0;
128
+ width: min(80vw, 320px);
129
+ height: 100vh;
130
+ min-height: 100vh;
131
+ transform: translateX(-100%);
132
+ transition: transform 0.25s ease-in-out;
133
+ z-index: 999;
134
+ display: flex;
135
+ flex-direction: column;
136
+ background: var(--color-menu-bg, #ffffff);
137
+ border-right: none;
138
+ box-shadow: none;
139
+ overflow: hidden;
140
+ padding-top: 3.75rem;
141
+ }
142
+
143
+ .app-nav.mobile-hidden .menu-content,
144
+ .app-nav.mobile-visible .menu-content {
145
+ flex: 1;
146
+ min-height: 0;
147
+ }
148
+
149
+ .app-nav.mobile-visible {
150
+ transform: translateX(0);
151
+ visibility: visible;
152
+ background: var(--color-menu-bg, #ffffff);
153
+ }
154
+
155
+ .menu-header {
156
+ display: none;
157
+ position: absolute;
158
+ top: 0;
159
+ left: 0;
160
+ right: 0;
161
+ align-items: center;
162
+ justify-content: flex-start;
163
+ background-color: #42345a !important;
164
+ color: #ffffff;
165
+ font-weight: 600;
166
+ min-height: 3.75rem;
167
+ height: 3.75rem;
168
+ box-sizing: border-box;
169
+ width: 100%;
170
+ z-index: 1000;
171
+ border-right: none;
172
+ box-shadow: none;
173
+ }
174
+
175
+ .app-nav.mobile-hidden .menu-header,
176
+ .app-nav.mobile-visible .menu-header {
177
+ display: flex;
178
+ }
179
+
180
+ .menu-header-title {
181
+ font-size: 1.25rem;
182
+ color: #ffffff;
183
+ }
184
+
185
+ .menu-close {
186
+ border: none;
187
+ background: transparent;
188
+ color: #ffffff;
189
+ font-size: 1.25rem;
190
+ cursor: pointer;
191
+ padding-left: 1.25rem;
192
+ line-height: 1;
193
+ }
194
+
195
+ .menu-close:hover,
196
+ .menu-close:focus {
197
+ opacity: 0.85;
198
+ }
199
+
200
+ .app-nav.collapsed {
201
+ width: 4.5rem;
202
+ min-width: 4.5rem;
203
+ }
204
+
205
+ .app-nav.collapsed .menu-content {
206
+ gap: 0.25rem;
207
+ align-items: center;
208
+ }
209
+
210
+ .app-nav.collapsed .menu-item {
211
+ justify-content: center;
212
+ padding-left: 0.5rem;
213
+ padding-right: 0.5rem;
214
+ }
215
+
216
+ .app-nav.collapsed .menu-item-label {
217
+ display: none;
218
+ }
219
+
220
+ .menu-collapse {
221
+ position: fixed;
222
+ left: 3rem;
223
+ bottom: 8rem;
224
+ z-index: 320;
225
+ width: 1.25rem;
226
+ height: 1.25rem;
227
+ display: inline-flex;
228
+ align-items: center;
229
+ justify-content: center;
230
+ border: 1px solid var(--color-border);
231
+ border-radius: 999px;
232
+ color: var(--color-text);
233
+ font-size: 1.3rem;
234
+ line-height: 1;
235
+ cursor: pointer;
236
+ box-shadow: 0 1px 4px rgba(124,77,255,0.12);
237
+ }
238
+
239
+ @media (max-width: 768px) {
240
+ .menu-collapse {
241
+ display: none;
242
+ }
243
+ }
@@ -0,0 +1,7 @@
1
+ import './menu.css';
2
+ import { OutlineManager } from '../outline/manager';
3
+ import { NamedNode } from 'rdflib';
4
+ export declare const setActiveMenuPane: (paneName?: string) => void;
5
+ export declare const refreshMenu: (layout: "mobile" | "desktop") => void;
6
+ export declare const createLeftSideMenu: (subject: NamedNode, outliner: OutlineManager) => Promise<void>;
7
+ //# sourceMappingURL=menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/mainPage/menu.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,CAAA;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEnD,OAAO,EAAE,SAAS,EAAO,MAAM,QAAQ,CAAA;AAwPvC,eAAO,MAAM,iBAAiB,GAAI,WAAW,MAAM,KAAG,IAIrD,CAAA;AAeD,eAAO,MAAM,WAAW,GAAI,QAAQ,QAAQ,GAAG,SAAS,SAwCvD,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAU,SAAS,SAAS,EAAE,UAAU,cAAc,kBAsIpF,CAAA"}
@@ -0,0 +1,409 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.setActiveMenuPane = exports.refreshMenu = exports.createLeftSideMenu = void 0;
7
+ require("./menu.css");
8
+ var _solidLogic = require("solid-logic");
9
+ var _rdflib = require("rdflib");
10
+ var _ownerProfile = require("../profileUtils/ownerProfile");
11
+ var _menu2 = _interopRequireDefault(require("../icons/menu.svg?raw"));
12
+ var _iconHelper = require("../icons/iconHelper");
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
+ const MENU_ICON = (0, _iconHelper.createUiIcon)(_menu2.default, 'Menu Icon', '#ffffff');
15
+ const MENU_COLLAPSED_KEY = 'solid-panes-menu-collapsed';
16
+ let menuCollapsed = false;
17
+ const loadMenuCollapsedState = () => {
18
+ try {
19
+ return localStorage.getItem(MENU_COLLAPSED_KEY) === 'true';
20
+ } catch (error) {
21
+ return false;
22
+ }
23
+ };
24
+ const saveMenuCollapsedState = collapsed => {
25
+ try {
26
+ localStorage.setItem(MENU_COLLAPSED_KEY, String(collapsed));
27
+ } catch (error) {
28
+ // ignore storage errors
29
+ }
30
+ };
31
+ const updateMenuCollapseButton = () => {
32
+ const collapseBtn = document.getElementById('MenuCollapseBtn');
33
+ if (!collapseBtn) return;
34
+ collapseBtn.textContent = menuCollapsed ? '\u203A' : '\u2039';
35
+ collapseBtn.setAttribute('aria-label', menuCollapsed ? 'Expand navigation menu' : 'Collapse navigation menu');
36
+ };
37
+ const updateCollapseButtonPosition = (navMenu, collapseBtn) => {
38
+ if (!navMenu || !collapseBtn) return;
39
+ const navRect = navMenu.getBoundingClientRect();
40
+ const rootFontSize = parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;
41
+ const buttonWidth = parseFloat(getComputedStyle(collapseBtn).width) || 1.25 * rootFontSize;
42
+ const offsetRem = (navRect.width - buttonWidth / 2) / rootFontSize;
43
+ collapseBtn.style.setProperty('left', `${offsetRem.toFixed(3)}rem`, 'important');
44
+ };
45
+ const applyMenuCollapsedState = navMenu => {
46
+ if (!navMenu) return;
47
+ navMenu.classList.toggle('collapsed', menuCollapsed);
48
+ updateMenuCollapseButton();
49
+ const collapseBtn = document.getElementById('MenuCollapseBtn');
50
+ updateCollapseButtonPosition(navMenu, collapseBtn);
51
+ };
52
+ const isLoggedIn = () => Boolean(_solidLogic.authSession?.info?.isLoggedIn);
53
+ const ensureMenuSkeleton = () => {
54
+ menuCollapsed = loadMenuCollapsedState();
55
+ const root = document.querySelector('[role="main"]') || document.body;
56
+ let navMenu = document.getElementById('NavMenu');
57
+ if (!navMenu) {
58
+ navMenu = document.createElement('nav');
59
+ navMenu.id = 'NavMenu';
60
+ navMenu.className = 'app-nav';
61
+ navMenu.setAttribute('aria-label', 'App navigation');
62
+ navMenu.hidden = true;
63
+ navMenu.style.display = 'none';
64
+ const headerEl = document.createElement('div');
65
+ headerEl.className = 'menu-header';
66
+ const closeBtn = document.createElement('button');
67
+ closeBtn.id = 'MenuCloseBtn';
68
+ closeBtn.className = 'menu-close';
69
+ closeBtn.type = 'button';
70
+ closeBtn.setAttribute('aria-label', 'Close menu');
71
+ closeBtn.textContent = '✕';
72
+ headerEl.appendChild(closeBtn);
73
+ const title = document.createElement('span');
74
+ title.className = 'menu-header-title';
75
+ title.textContent = 'Menu';
76
+ headerEl.appendChild(title);
77
+ navMenu.appendChild(headerEl);
78
+ const authStateEl = document.createElement('div');
79
+ authStateEl.id = 'AuthState';
80
+ authStateEl.className = 'menu-auth-state';
81
+ navMenu.appendChild(authStateEl);
82
+ const contentEl = document.createElement('div');
83
+ contentEl.id = 'NavMenuContent';
84
+ contentEl.className = 'menu-content';
85
+ navMenu.appendChild(contentEl);
86
+ root.insertBefore(navMenu, root.firstChild);
87
+ } else if (!navMenu.querySelector('.menu-header')) {
88
+ const headerEl = document.createElement('div');
89
+ headerEl.className = 'menu-header';
90
+ const closeBtn = document.createElement('button');
91
+ closeBtn.id = 'MenuCloseBtn';
92
+ closeBtn.className = 'menu-close';
93
+ closeBtn.type = 'button';
94
+ closeBtn.setAttribute('aria-label', 'Close menu');
95
+ closeBtn.textContent = '✕';
96
+ headerEl.appendChild(closeBtn);
97
+ const title = document.createElement('span');
98
+ title.className = 'menu-header-title';
99
+ title.textContent = 'Menu';
100
+ headerEl.appendChild(title);
101
+ navMenu.insertBefore(headerEl, navMenu.firstChild);
102
+ }
103
+ let toggle = document.getElementById('MenuToggleBtn');
104
+ if (!toggle) {
105
+ toggle = document.createElement('button');
106
+ toggle.id = 'MenuToggleBtn';
107
+ toggle.className = 'menu-toggle';
108
+ toggle.type = 'button';
109
+ toggle.setAttribute('aria-label', 'Toggle navigation menu');
110
+ toggle.hidden = true;
111
+ const toggleImg = document.createElement('img');
112
+ toggleImg.src = MENU_ICON;
113
+ toggleImg.alt = '';
114
+ toggleImg.className = 'menu-toggle-icon';
115
+ toggleImg.setAttribute('aria-hidden', 'true');
116
+ toggle.appendChild(toggleImg);
117
+ const toggleLabel = document.createElement('span');
118
+ toggleLabel.id = 'MenuToggleLabel';
119
+ toggleLabel.className = 'menu-toggle-label';
120
+ toggle.appendChild(toggleLabel);
121
+ root.insertBefore(toggle, root.firstChild);
122
+ }
123
+ let overlay = document.getElementById('MenuOverlay');
124
+ if (!overlay) {
125
+ overlay = document.createElement('div');
126
+ overlay.id = 'MenuOverlay';
127
+ overlay.className = 'menu-overlay';
128
+ overlay.hidden = true;
129
+ document.body.appendChild(overlay);
130
+ }
131
+ let collapseBtn = document.getElementById('MenuCollapseBtn');
132
+ if (!collapseBtn) {
133
+ collapseBtn = document.createElement('button');
134
+ collapseBtn.id = 'MenuCollapseBtn';
135
+ collapseBtn.className = 'menu-collapse';
136
+ collapseBtn.type = 'button';
137
+ collapseBtn.setAttribute('aria-label', 'Collapse navigation menu');
138
+ collapseBtn.textContent = '\u2039';
139
+ collapseBtn.hidden = true;
140
+ document.body.appendChild(collapseBtn);
141
+ }
142
+ };
143
+ const getMenuItems = async (subject, outliner) => {
144
+ try {
145
+ const items = await outliner.getDashboardItems(subject);
146
+ return items.map(element => {
147
+ const targetSubject = element.subject || _solidLogic.authn.currentUser() || subject;
148
+ return {
149
+ icon: element.icon,
150
+ subject: targetSubject,
151
+ paneName: element.tabName || element.paneName,
152
+ label: element.label,
153
+ onclick: () => openDashboardPane(targetSubject, outliner, element.tabName || element.paneName)
154
+ };
155
+ });
156
+ } catch (error) {
157
+ console.error('Unable to load navigation menu items', error);
158
+ return [];
159
+ }
160
+ };
161
+ const createMenuButton = item => {
162
+ const button = document.createElement('button');
163
+ button.className = 'menu-item';
164
+ button.type = 'button';
165
+ if (item.paneName) {
166
+ button.dataset.paneName = item.paneName;
167
+ }
168
+ if (item.icon) {
169
+ const icon = document.createElement('img');
170
+ icon.className = 'menu-item-icon';
171
+ icon.src = item.icon;
172
+ icon.alt = '';
173
+ icon.setAttribute('aria-hidden', 'true');
174
+ button.appendChild(icon);
175
+ }
176
+ const label = document.createElement('span');
177
+ label.className = 'menu-item-label';
178
+ label.textContent = item.label;
179
+ button.appendChild(label);
180
+ if (item.id) {
181
+ button.id = item.id;
182
+ }
183
+ button.addEventListener('click', async () => {
184
+ await item.onclick();
185
+ });
186
+ return button;
187
+ };
188
+ const setActiveMenuItem = (container, paneName) => {
189
+ const menuItems = Array.from(container.querySelectorAll('.menu-item'));
190
+ let activeItem;
191
+ menuItems.forEach(item => {
192
+ const isActive = Boolean(paneName) && item.dataset.paneName === paneName;
193
+ item.classList.toggle('menu-item-active', isActive);
194
+ if (isActive) {
195
+ item.setAttribute('aria-current', 'page');
196
+ activeItem = item;
197
+ } else {
198
+ item.removeAttribute('aria-current');
199
+ }
200
+ });
201
+ if (paneName) {
202
+ if (!activeItem && menuItems[0]) {
203
+ // If an explicit pane name is provided but does not match any menu
204
+ // item, fall back to clearing selection rather than selecting the first item.
205
+ container.dataset.activePaneName = '';
206
+ } else {
207
+ container.dataset.activePaneName = paneName;
208
+ }
209
+ } else {
210
+ // If there is no active pane, do not auto-select the first menu item.
211
+ container.dataset.activePaneName = '';
212
+ }
213
+ updateToggleLabel(activeItem);
214
+ };
215
+ const setActiveMenuPane = paneName => {
216
+ const navMenuContent = document.getElementById('NavMenuContent');
217
+ if (!navMenuContent) return;
218
+ setActiveMenuItem(navMenuContent, paneName);
219
+ };
220
+ exports.setActiveMenuPane = setActiveMenuPane;
221
+ const updateToggleLabel = activeItem => {
222
+ const toggleLabel = document.getElementById('MenuToggleLabel');
223
+ if (!toggleLabel) return;
224
+ toggleLabel.textContent = activeItem?.querySelector('.menu-item-label')?.textContent || '';
225
+ };
226
+ const renderMenuItems = async (subject, outliner, container) => {
227
+ const menuItems = await getMenuItems(subject, outliner);
228
+ container.replaceChildren(...menuItems.map(createMenuButton));
229
+ setActiveMenuItem(container, container.dataset.activePaneName);
230
+ };
231
+ const refreshMenu = layout => {
232
+ const navMenu = document.getElementById('NavMenu');
233
+ const toggle = document.getElementById('MenuToggleBtn');
234
+ const collapseBtn = document.getElementById('MenuCollapseBtn');
235
+ const overlay = document.getElementById('MenuOverlay');
236
+ if (!navMenu || !toggle || !overlay || !collapseBtn) return;
237
+ const loggedIn = isLoggedIn();
238
+ if (!loggedIn) {
239
+ navMenu.hidden = true;
240
+ navMenu.style.display = 'none';
241
+ toggle.hidden = true;
242
+ toggle.style.display = 'none';
243
+ collapseBtn.hidden = true;
244
+ collapseBtn.style.display = 'none';
245
+ overlay.hidden = true;
246
+ overlay.style.display = 'none';
247
+ return;
248
+ }
249
+ if (layout === 'mobile') {
250
+ navMenu.classList.add('mobile-hidden');
251
+ navMenu.classList.remove('mobile-visible');
252
+ toggle.hidden = false;
253
+ collapseBtn.hidden = true;
254
+ overlay.hidden = true;
255
+ navMenu.hidden = false;
256
+ navMenu.classList.remove('collapsed');
257
+ toggle.setAttribute('aria-expanded', 'false');
258
+ } else {
259
+ navMenu.classList.remove('mobile-hidden', 'mobile-visible');
260
+ toggle.hidden = true;
261
+ collapseBtn.hidden = false;
262
+ overlay.hidden = true;
263
+ navMenu.hidden = false;
264
+ applyMenuCollapsedState(navMenu);
265
+ updateCollapseButtonPosition(navMenu, collapseBtn);
266
+ toggle.setAttribute('aria-expanded', 'false');
267
+ }
268
+ };
269
+ exports.refreshMenu = refreshMenu;
270
+ const createLeftSideMenu = async (subject, outliner) => {
271
+ ensureMenuSkeleton();
272
+ const navMenu = document.getElementById('NavMenu');
273
+ const menuToggle = document.getElementById('MenuToggleBtn');
274
+ const menuOverlay = document.getElementById('MenuOverlay');
275
+ const navMenuContent = document.getElementById('NavMenuContent');
276
+ const closeMobileMenu = () => {
277
+ if (!navMenu || !menuToggle || !menuOverlay) return;
278
+ navMenu.classList.remove('mobile-visible');
279
+ navMenu.classList.add('mobile-hidden');
280
+ menuToggle.setAttribute('aria-expanded', 'false');
281
+ menuOverlay.hidden = true;
282
+ };
283
+ const openMobileMenu = () => {
284
+ if (!navMenu || !menuToggle || !menuOverlay) return;
285
+ navMenu.classList.remove('mobile-hidden');
286
+ navMenu.classList.add('mobile-visible');
287
+ menuToggle.setAttribute('aria-expanded', 'true');
288
+ menuOverlay.hidden = false;
289
+ };
290
+ const collapseBtn = document.getElementById('MenuCollapseBtn');
291
+ const expandDesktopMenu = () => {
292
+ if (!navMenu || !collapseBtn) return;
293
+ if (!menuCollapsed) return;
294
+ menuCollapsed = false;
295
+ saveMenuCollapsedState(menuCollapsed);
296
+ applyMenuCollapsedState(navMenu);
297
+ };
298
+ if (navMenu) {
299
+ navMenu.addEventListener('click', event => {
300
+ const isMobile = outliner.context?.environment?.layout === 'mobile';
301
+ const clickedCollapseButton = event.target.closest('#MenuCollapseBtn');
302
+ if (!isMobile && menuCollapsed && !clickedCollapseButton) {
303
+ expandDesktopMenu();
304
+ }
305
+ });
306
+ }
307
+ if (menuToggle) {
308
+ menuToggle.addEventListener('click', () => {
309
+ if (navMenu?.classList.contains('mobile-visible')) {
310
+ closeMobileMenu();
311
+ } else {
312
+ openMobileMenu();
313
+ }
314
+ });
315
+ }
316
+ if (collapseBtn) {
317
+ collapseBtn.addEventListener('click', () => {
318
+ menuCollapsed = !menuCollapsed;
319
+ saveMenuCollapsedState(menuCollapsed);
320
+ applyMenuCollapsedState(navMenu);
321
+ });
322
+ }
323
+ const updateMenuVisibility = () => {
324
+ const loggedIn = isLoggedIn();
325
+ if (navMenu) {
326
+ navMenu.hidden = !loggedIn;
327
+ navMenu.style.display = loggedIn ? '' : 'none';
328
+ }
329
+ if (menuToggle) {
330
+ menuToggle.hidden = !loggedIn;
331
+ menuToggle.style.display = loggedIn ? '' : 'none';
332
+ }
333
+ if (collapseBtn) {
334
+ collapseBtn.hidden = !loggedIn;
335
+ collapseBtn.style.display = loggedIn ? '' : 'none';
336
+ }
337
+ if (menuOverlay) {
338
+ menuOverlay.hidden = !loggedIn;
339
+ menuOverlay.style.display = loggedIn ? '' : 'none';
340
+ }
341
+ };
342
+ updateMenuVisibility();
343
+ if (menuOverlay) {
344
+ menuOverlay.addEventListener('click', closeMobileMenu);
345
+ }
346
+ const closeBtn = document.getElementById('MenuCloseBtn');
347
+ if (closeBtn) {
348
+ closeBtn.addEventListener('click', closeMobileMenu);
349
+ }
350
+ if (navMenuContent) {
351
+ updateMenuVisibility();
352
+ const loggedIn = isLoggedIn();
353
+ if (loggedIn) {
354
+ await renderMenuItems(subject, outliner, navMenuContent);
355
+ }
356
+ if (!navMenuContent.dataset.authEventsBound) {
357
+ const refreshMenuItems = async () => {
358
+ await renderMenuItems(subject, outliner, navMenuContent);
359
+ };
360
+ _solidLogic.authSession.events.on('login', () => {
361
+ updateMenuVisibility();
362
+ refreshMenu(outliner.context?.environment?.layout === 'mobile' ? 'mobile' : 'desktop');
363
+ refreshMenuItems();
364
+ });
365
+ _solidLogic.authSession.events.on('logout', () => {
366
+ updateMenuVisibility();
367
+ refreshMenu(outliner.context?.environment?.layout === 'mobile' ? 'mobile' : 'desktop');
368
+ refreshMenuItems();
369
+ });
370
+ _solidLogic.authSession.events.on('sessionRestore', () => {
371
+ updateMenuVisibility();
372
+ refreshMenu(outliner.context?.environment?.layout === 'mobile' ? 'mobile' : 'desktop');
373
+ refreshMenuItems();
374
+ });
375
+ navMenuContent.dataset.authEventsBound = 'true';
376
+ }
377
+ navMenuContent.addEventListener('click', event => {
378
+ const item = event.target.closest('.menu-item');
379
+ if (item instanceof HTMLButtonElement) {
380
+ setActiveMenuItem(navMenuContent, item.dataset.paneName);
381
+ }
382
+ const isMobile = outliner.context?.environment?.layout === 'mobile';
383
+ if (item && isMobile) {
384
+ closeMobileMenu();
385
+ }
386
+ });
387
+ }
388
+ refreshMenu(outliner.context?.environment?.layout === 'mobile' ? 'mobile' : 'desktop');
389
+ };
390
+ exports.createLeftSideMenu = createLeftSideMenu;
391
+ async function openDashboardPane(subject, outliner, pane) {
392
+ const me = _solidLogic.authn.currentUser();
393
+ if (!subject) {
394
+ if (me) {
395
+ subject = me;
396
+ } else {
397
+ const store = outliner?.context?.store || outliner?.context?.session?.store || outliner?.kb;
398
+ const fetcher = outliner?.context?.fetcher || store?.fetcher;
399
+ if (!store || !fetcher) {
400
+ throw new Error('Unable to load profile: missing RDF store or fetcher');
401
+ }
402
+ const fallbackUri = (0, _rdflib.sym)(window.location.href);
403
+ subject = await (0, _ownerProfile.loadProfileFromURI)(subject || fallbackUri, store, fetcher);
404
+ }
405
+ }
406
+ outliner.showDashboard(subject, {
407
+ pane
408
+ });
409
+ }
package/dist/n3Pane.js CHANGED
@@ -49,6 +49,7 @@ const n3Pane = exports.n3Pane = {
49
49
  sz.setBase(subject.uri);
50
50
  const str = sz.statementsToN3(sts);
51
51
  const pre = myDocument.createElement('PRE');
52
+ pre.setAttribute('style', 'overflow-x: auto; max-width: 100%; box-sizing: border-box;');
52
53
  pre.appendChild(myDocument.createTextNode(str));
53
54
  div.appendChild(pre);
54
55
  return div;
@@ -1,5 +1,5 @@
1
- import { DataBrowserContext, PaneRegistry } from 'pane-registry';
1
+ import { DataBrowserContext, PaneRegistry, RenderEnvironment } from 'pane-registry';
2
2
  import { SolidLogic } from 'solid-logic';
3
3
  import { LiveStore } from 'rdflib';
4
- export declare function createContext(dom: HTMLDocument, paneRegistry: PaneRegistry, store: LiveStore, logic: SolidLogic): DataBrowserContext;
4
+ export declare function createContext(dom: HTMLDocument, paneRegistry: PaneRegistry, store: LiveStore, logic: SolidLogic, environment?: RenderEnvironment): DataBrowserContext;
5
5
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/outline/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,wBAAgB,aAAa,CAC3B,GAAG,EAAE,YAAY,EACjB,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,UAAU,GAChB,kBAAkB,CAUpB"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/outline/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEnF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,wBAAgB,aAAa,CAC3B,GAAG,EAAE,YAAY,EACjB,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,UAAU,EACjB,WAAW,CAAC,EAAE,iBAAiB,GAC9B,kBAAkB,CAapB"}