solid-panes 4.2.6 → 4.4.1-test.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 (143) hide show
  1. package/README.md +45 -1
  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.css +70 -0
  17. package/dist/RDFXMLPane.d.ts +13 -0
  18. package/dist/RDFXMLPane.d.ts.map +1 -0
  19. package/dist/RDFXMLPane.js +46 -4
  20. package/dist/bda84f59e7216675a208.png +0 -0
  21. package/dist/cd68e8f3990ba8b2139e.png +0 -0
  22. package/dist/dashboard/basicPreferences.d.ts.map +1 -1
  23. package/dist/dashboard/basicPreferences.js +1 -0
  24. package/dist/dashboard/dashboardPane.d.ts.map +1 -1
  25. package/dist/dashboard/dashboardPane.js +9 -3
  26. package/dist/dashboard/homepage.d.ts +1 -1
  27. package/dist/dashboard/homepage.d.ts.map +1 -1
  28. package/dist/dashboard/homepage.js +5 -35
  29. package/dist/dataContentPane.css +271 -0
  30. package/dist/dataContentPane.d.ts +14 -0
  31. package/dist/dataContentPane.d.ts.map +1 -0
  32. package/dist/dataContentPane.js +68 -101
  33. package/dist/defaultPane.css +97 -0
  34. package/dist/defaultPane.d.ts +14 -0
  35. package/dist/defaultPane.d.ts.map +1 -0
  36. package/dist/defaultPane.js +9 -2
  37. package/dist/e7074a7e2cb69e51cfd3.png +0 -0
  38. package/dist/f3772696fb7ee53c23d8.png +0 -0
  39. package/dist/form/formPane.css +120 -0
  40. package/dist/form/pane.d.ts +4 -0
  41. package/dist/form/pane.d.ts.map +1 -0
  42. package/dist/form/pane.js +120 -54
  43. package/dist/home/homePane.d.ts.map +1 -1
  44. package/dist/home/homePane.js +2 -0
  45. package/dist/humanReadablePane.css +129 -0
  46. package/dist/humanReadablePane.d.ts +13 -0
  47. package/dist/humanReadablePane.d.ts.map +1 -0
  48. package/dist/humanReadablePane.js +53 -16
  49. package/dist/icons/clock.svg +7 -0
  50. package/dist/icons/comment.svg +6 -0
  51. package/dist/icons/dashboard.svg +9 -0
  52. package/dist/icons/downArrow.svg +6 -0
  53. package/dist/icons/folder.svg +6 -0
  54. package/dist/icons/friends.svg +9 -0
  55. package/dist/icons/help.svg +8 -0
  56. package/dist/icons/iconHelper.d.ts +2 -0
  57. package/dist/icons/iconHelper.d.ts.map +1 -0
  58. package/dist/icons/iconHelper.js +23 -0
  59. package/dist/icons/menu.svg +8 -0
  60. package/dist/icons/person.svg +6 -0
  61. package/dist/icons/personInCircle.svg +8 -0
  62. package/dist/icons/sharing.svg +10 -0
  63. package/dist/icons/signOut.svg +8 -0
  64. package/dist/icons/signUp.svg +9 -0
  65. package/dist/icons/star.svg +3 -0
  66. package/dist/imagePane.css +4 -0
  67. package/dist/imagePane.d.ts +12 -0
  68. package/dist/imagePane.d.ts.map +1 -0
  69. package/dist/imagePane.js +19 -21
  70. package/dist/index.d.ts +5 -4
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +19 -4
  73. package/dist/internal/internalPane.css +14 -0
  74. package/dist/internal/internalPane.d.ts +1 -0
  75. package/dist/internal/internalPane.d.ts.map +1 -1
  76. package/dist/internal/internalPane.js +6 -6
  77. package/dist/mainPage/footer.d.ts +14 -2
  78. package/dist/mainPage/footer.d.ts.map +1 -1
  79. package/dist/mainPage/footer.js +21 -13
  80. package/dist/mainPage/header.d.ts +16 -1
  81. package/dist/mainPage/header.d.ts.map +1 -1
  82. package/dist/mainPage/header.js +179 -61
  83. package/dist/mainPage/index.d.ts +16 -1
  84. package/dist/mainPage/index.d.ts.map +1 -1
  85. package/dist/mainPage/index.js +61 -7
  86. package/dist/mainPage/menu.css +243 -0
  87. package/dist/mainPage/menu.d.ts +7 -0
  88. package/dist/mainPage/menu.d.ts.map +1 -0
  89. package/dist/mainPage/menu.js +436 -0
  90. package/dist/n3Pane.css +49 -0
  91. package/dist/n3Pane.d.ts +13 -0
  92. package/dist/n3Pane.d.ts.map +1 -0
  93. package/dist/n3Pane.js +36 -4
  94. package/dist/outline/context.d.ts +2 -2
  95. package/dist/outline/context.d.ts.map +1 -1
  96. package/dist/outline/context.js +5 -2
  97. package/dist/outline/manager.css +12 -14
  98. package/dist/outline/manager.js +172 -82
  99. package/dist/outline/userInput.js +6 -3
  100. package/dist/pad/padPane.css +40 -0
  101. package/dist/pad/padPane.d.ts +1 -0
  102. package/dist/pad/padPane.d.ts.map +1 -1
  103. package/dist/pad/padPane.js +33 -22
  104. package/dist/playlist/playlistPane.js +2 -6
  105. package/dist/profileUtils/ownerProfile.d.ts +5 -0
  106. package/dist/profileUtils/ownerProfile.d.ts.map +1 -0
  107. package/dist/profileUtils/ownerProfile.js +84 -0
  108. package/dist/registerPanes.js +12 -12
  109. package/dist/schedule/schedulePane.css +294 -0
  110. package/dist/schedule/schedulePane.d.ts +23 -0
  111. package/dist/schedule/schedulePane.d.ts.map +1 -0
  112. package/dist/schedule/schedulePane.js +161 -61
  113. package/dist/slideshow/slideshowPane.js +1 -1
  114. package/dist/social/editProfileDetails.d.ts +19 -0
  115. package/dist/social/editProfileDetails.d.ts.map +1 -0
  116. package/dist/social/editProfileDetails.js +362 -0
  117. package/dist/social/icons.d.ts +7 -0
  118. package/dist/social/icons.d.ts.map +1 -0
  119. package/dist/social/icons.js +95 -0
  120. package/dist/social/socialPane.css +1464 -0
  121. package/dist/social/socialPane.d.ts +30 -0
  122. package/dist/social/socialPane.d.ts.map +1 -0
  123. package/dist/social/socialPane.js +651 -0
  124. package/dist/social/socialSections.d.ts +77 -0
  125. package/dist/social/socialSections.d.ts.map +1 -0
  126. package/dist/social/socialSections.js +393 -0
  127. package/dist/social/spinner.d.ts +3 -0
  128. package/dist/social/spinner.d.ts.map +1 -0
  129. package/dist/social/spinner.js +13 -0
  130. package/dist/social/triage.d.ts +17 -0
  131. package/dist/social/triage.d.ts.map +1 -0
  132. package/dist/social/triage.js +79 -0
  133. package/dist/solid-panes.js +49544 -18164
  134. package/dist/solid-panes.js.map +1 -1
  135. package/dist/solid-panes.min.js +3884 -240
  136. package/dist/solid-panes.min.js.map +1 -1
  137. package/dist/{style → styles}/tabbedtab.css +0 -281
  138. package/dist/styles/utilities.css +5 -0
  139. package/dist/tabbed/tabbedPane.d.ts.map +1 -1
  140. package/dist/tabbed/tabbedPane.js +2 -0
  141. package/dist/versionInfo.js +14 -14
  142. package/package.json +37 -31
  143. package/dist/socialPane.js +0 -430
@@ -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;AAkQvC,eAAO,MAAM,iBAAiB,GAAI,WAAW,MAAM,KAAG,IAIrD,CAAA;AAqBD,eAAO,MAAM,WAAW,GAAI,QAAQ,QAAQ,GAAG,SAAS,SAmDvD,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAU,SAAS,SAAS,EAAE,UAAU,cAAc,kBA2IpF,CAAA"}
@@ -0,0 +1,436 @@
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 setFooterVisibility = loggedIn => {
54
+ const footer = document.querySelector('solid-ui-footer');
55
+ if (!footer) return;
56
+ footer.style.display = loggedIn ? 'none' : '';
57
+ };
58
+ const isViewingOwnProfile = subject => {
59
+ const currentUser = _solidLogic.authn.currentUser();
60
+ return Boolean(currentUser && subject && currentUser.sameTerm(subject));
61
+ };
62
+ const ensureMenuSkeleton = () => {
63
+ menuCollapsed = loadMenuCollapsedState();
64
+ const root = document.querySelector('[role="main"]') || document.body;
65
+ let navMenu = document.getElementById('NavMenu');
66
+ if (!navMenu) {
67
+ navMenu = document.createElement('nav');
68
+ navMenu.id = 'NavMenu';
69
+ navMenu.className = 'app-nav';
70
+ navMenu.setAttribute('aria-label', 'App navigation');
71
+ navMenu.hidden = true;
72
+ const headerEl = document.createElement('div');
73
+ headerEl.className = 'menu-header';
74
+ const closeBtn = document.createElement('button');
75
+ closeBtn.id = 'MenuCloseBtn';
76
+ closeBtn.className = 'menu-close';
77
+ closeBtn.type = 'button';
78
+ closeBtn.setAttribute('aria-label', 'Close menu');
79
+ closeBtn.textContent = '✕';
80
+ headerEl.appendChild(closeBtn);
81
+ const title = document.createElement('span');
82
+ title.className = 'menu-header-title';
83
+ title.textContent = 'Menu';
84
+ headerEl.appendChild(title);
85
+ navMenu.appendChild(headerEl);
86
+ const authStateEl = document.createElement('div');
87
+ authStateEl.id = 'AuthState';
88
+ authStateEl.className = 'menu-auth-state';
89
+ navMenu.appendChild(authStateEl);
90
+ const contentEl = document.createElement('div');
91
+ contentEl.id = 'NavMenuContent';
92
+ contentEl.className = 'menu-content';
93
+ navMenu.appendChild(contentEl);
94
+ root.insertBefore(navMenu, root.firstChild);
95
+ } else if (!navMenu.querySelector('.menu-header')) {
96
+ const headerEl = document.createElement('div');
97
+ headerEl.className = 'menu-header';
98
+ const closeBtn = document.createElement('button');
99
+ closeBtn.id = 'MenuCloseBtn';
100
+ closeBtn.className = 'menu-close';
101
+ closeBtn.type = 'button';
102
+ closeBtn.setAttribute('aria-label', 'Close menu');
103
+ closeBtn.textContent = '✕';
104
+ headerEl.appendChild(closeBtn);
105
+ const title = document.createElement('span');
106
+ title.className = 'menu-header-title';
107
+ title.textContent = 'Menu';
108
+ headerEl.appendChild(title);
109
+ navMenu.insertBefore(headerEl, navMenu.firstChild);
110
+ }
111
+ let toggle = document.getElementById('MenuToggleBtn');
112
+ if (!toggle) {
113
+ toggle = document.createElement('button');
114
+ toggle.id = 'MenuToggleBtn';
115
+ toggle.className = 'menu-toggle';
116
+ toggle.type = 'button';
117
+ toggle.setAttribute('aria-label', 'Toggle navigation menu');
118
+ toggle.hidden = true;
119
+ const toggleImg = document.createElement('img');
120
+ toggleImg.src = MENU_ICON;
121
+ toggleImg.alt = '';
122
+ toggleImg.className = 'menu-toggle-icon';
123
+ toggleImg.setAttribute('aria-hidden', 'true');
124
+ toggle.appendChild(toggleImg);
125
+ const toggleLabel = document.createElement('span');
126
+ toggleLabel.id = 'MenuToggleLabel';
127
+ toggleLabel.className = 'menu-toggle-label';
128
+ toggle.appendChild(toggleLabel);
129
+ root.insertBefore(toggle, root.firstChild);
130
+ }
131
+ let overlay = document.getElementById('MenuOverlay');
132
+ if (!overlay) {
133
+ overlay = document.createElement('div');
134
+ overlay.id = 'MenuOverlay';
135
+ overlay.className = 'menu-overlay';
136
+ overlay.hidden = true;
137
+ document.body.appendChild(overlay);
138
+ }
139
+ let collapseBtn = document.getElementById('MenuCollapseBtn');
140
+ if (!collapseBtn) {
141
+ collapseBtn = document.createElement('button');
142
+ collapseBtn.id = 'MenuCollapseBtn';
143
+ collapseBtn.className = 'menu-collapse';
144
+ collapseBtn.type = 'button';
145
+ collapseBtn.setAttribute('aria-label', 'Collapse navigation menu');
146
+ collapseBtn.textContent = '\u2039';
147
+ collapseBtn.hidden = true;
148
+ document.body.appendChild(collapseBtn);
149
+ }
150
+ };
151
+ const getMenuItems = async (subject, outliner) => {
152
+ try {
153
+ const items = await outliner.getDashboardItems(subject);
154
+ return items.map(element => {
155
+ const targetSubject = element.subject || _solidLogic.authn.currentUser() || subject;
156
+ return {
157
+ icon: element.icon,
158
+ subject: targetSubject,
159
+ paneName: element.tabName || element.paneName,
160
+ label: element.label,
161
+ onclick: () => openDashboardPane(targetSubject, outliner, element.tabName || element.paneName)
162
+ };
163
+ });
164
+ } catch (error) {
165
+ console.error('Unable to load navigation menu items', error);
166
+ return [];
167
+ }
168
+ };
169
+ const createMenuButton = item => {
170
+ const button = document.createElement('button');
171
+ button.className = 'menu-item';
172
+ button.type = 'button';
173
+ if (item.paneName) {
174
+ button.dataset.paneName = item.paneName;
175
+ }
176
+ if (item.icon) {
177
+ const icon = document.createElement('img');
178
+ icon.className = 'menu-item-icon';
179
+ icon.src = item.icon;
180
+ icon.alt = '';
181
+ icon.setAttribute('aria-hidden', 'true');
182
+ button.appendChild(icon);
183
+ }
184
+ const label = document.createElement('span');
185
+ label.className = 'menu-item-label';
186
+ label.textContent = item.label;
187
+ button.appendChild(label);
188
+ if (item.id) {
189
+ button.id = item.id;
190
+ }
191
+ button.addEventListener('click', async () => {
192
+ await item.onclick();
193
+ });
194
+ return button;
195
+ };
196
+ const setActiveMenuItem = (container, paneName) => {
197
+ const menuItems = Array.from(container.querySelectorAll('.menu-item'));
198
+ let activeItem;
199
+ menuItems.forEach(item => {
200
+ const isActive = Boolean(paneName) && item.dataset.paneName === paneName;
201
+ item.classList.toggle('menu-item-active', isActive);
202
+ if (isActive) {
203
+ item.setAttribute('aria-current', 'page');
204
+ activeItem = item;
205
+ } else {
206
+ item.removeAttribute('aria-current');
207
+ }
208
+ });
209
+ if (paneName) {
210
+ if (!activeItem && menuItems[0]) {
211
+ // If an explicit pane name is provided but does not match any menu
212
+ // item, fall back to clearing selection rather than selecting the first item.
213
+ container.dataset.activePaneName = '';
214
+ } else {
215
+ container.dataset.activePaneName = paneName;
216
+ }
217
+ } else {
218
+ // If there is no active pane, do not auto-select the first menu item.
219
+ container.dataset.activePaneName = '';
220
+ }
221
+ updateToggleLabel(activeItem);
222
+ };
223
+ const setActiveMenuPane = paneName => {
224
+ const navMenuContent = document.getElementById('NavMenuContent');
225
+ if (!navMenuContent) return;
226
+ setActiveMenuItem(navMenuContent, paneName);
227
+ };
228
+ exports.setActiveMenuPane = setActiveMenuPane;
229
+ const updateToggleLabel = activeItem => {
230
+ const toggleLabel = document.getElementById('MenuToggleLabel');
231
+ if (!toggleLabel) return;
232
+ toggleLabel.textContent = activeItem?.querySelector('.menu-item-label')?.textContent || '';
233
+ };
234
+ const renderMenuItems = async (subject, outliner, container) => {
235
+ const menuItems = await getMenuItems(subject, outliner);
236
+ container.replaceChildren(...menuItems.map(createMenuButton));
237
+ // If the user is logged in and viewing their own profile, select "Your profile"
238
+ // by default. This also surfaces "Your profile" at the top of the mobile view
239
+ // via the menu toggle label, which mirrors the active menu item.
240
+ const activePane = isViewingOwnProfile(subject) ? 'profile' : container.dataset.activePaneName;
241
+ setActiveMenuItem(container, activePane);
242
+ };
243
+ const refreshMenu = layout => {
244
+ const navMenu = document.getElementById('NavMenu');
245
+ const toggle = document.getElementById('MenuToggleBtn');
246
+ const collapseBtn = document.getElementById('MenuCollapseBtn');
247
+ const overlay = document.getElementById('MenuOverlay');
248
+ if (!navMenu || !toggle || !overlay || !collapseBtn) return;
249
+ const loggedIn = isLoggedIn();
250
+ if (!loggedIn) {
251
+ navMenu.hidden = true;
252
+ navMenu.style.display = 'none';
253
+ toggle.hidden = true;
254
+ toggle.style.display = 'none';
255
+ collapseBtn.hidden = true;
256
+ collapseBtn.style.display = 'none';
257
+ overlay.hidden = true;
258
+ overlay.style.display = 'none';
259
+ setFooterVisibility(false);
260
+ return;
261
+ }
262
+ setFooterVisibility(true);
263
+ if (layout === 'mobile') {
264
+ navMenu.classList.add('mobile-hidden');
265
+ navMenu.classList.remove('mobile-visible');
266
+ toggle.hidden = false;
267
+ toggle.style.display = '';
268
+ collapseBtn.hidden = true;
269
+ collapseBtn.style.display = 'none';
270
+ overlay.hidden = true;
271
+ overlay.style.display = 'none';
272
+ navMenu.hidden = false;
273
+ navMenu.style.display = '';
274
+ navMenu.classList.remove('collapsed');
275
+ toggle.setAttribute('aria-expanded', 'false');
276
+ } else {
277
+ navMenu.classList.remove('mobile-hidden', 'mobile-visible');
278
+ toggle.hidden = true;
279
+ toggle.style.display = 'none';
280
+ collapseBtn.hidden = false;
281
+ collapseBtn.style.display = '';
282
+ overlay.hidden = true;
283
+ overlay.style.display = 'none';
284
+ navMenu.hidden = false;
285
+ navMenu.style.display = '';
286
+ applyMenuCollapsedState(navMenu);
287
+ updateCollapseButtonPosition(navMenu, collapseBtn);
288
+ toggle.setAttribute('aria-expanded', 'false');
289
+ }
290
+ };
291
+ exports.refreshMenu = refreshMenu;
292
+ const createLeftSideMenu = async (subject, outliner) => {
293
+ ensureMenuSkeleton();
294
+ const navMenu = document.getElementById('NavMenu');
295
+ const menuToggle = document.getElementById('MenuToggleBtn');
296
+ const menuOverlay = document.getElementById('MenuOverlay');
297
+ const navMenuContent = document.getElementById('NavMenuContent');
298
+ const closeMobileMenu = () => {
299
+ if (!navMenu || !menuToggle || !menuOverlay) return;
300
+ navMenu.classList.remove('mobile-visible');
301
+ navMenu.classList.add('mobile-hidden');
302
+ navMenu.style.display = '';
303
+ menuToggle.setAttribute('aria-expanded', 'false');
304
+ menuOverlay.hidden = true;
305
+ menuOverlay.style.display = 'none';
306
+ };
307
+ const openMobileMenu = () => {
308
+ if (!navMenu || !menuToggle || !menuOverlay) return;
309
+ navMenu.classList.remove('mobile-hidden');
310
+ navMenu.classList.add('mobile-visible');
311
+ navMenu.style.display = '';
312
+ menuToggle.setAttribute('aria-expanded', 'true');
313
+ menuOverlay.hidden = false;
314
+ menuOverlay.style.display = '';
315
+ };
316
+ const collapseBtn = document.getElementById('MenuCollapseBtn');
317
+ const expandDesktopMenu = () => {
318
+ if (!navMenu || !collapseBtn) return;
319
+ if (!menuCollapsed) return;
320
+ menuCollapsed = false;
321
+ saveMenuCollapsedState(menuCollapsed);
322
+ applyMenuCollapsedState(navMenu);
323
+ };
324
+ if (navMenu) {
325
+ navMenu.addEventListener('click', event => {
326
+ const isMobile = outliner.context?.environment?.layout === 'mobile';
327
+ const clickedCollapseButton = event.target.closest('#MenuCollapseBtn');
328
+ if (!isMobile && menuCollapsed && !clickedCollapseButton) {
329
+ expandDesktopMenu();
330
+ }
331
+ });
332
+ }
333
+ if (menuToggle) {
334
+ menuToggle.addEventListener('click', () => {
335
+ if (navMenu?.classList.contains('mobile-visible')) {
336
+ closeMobileMenu();
337
+ } else {
338
+ openMobileMenu();
339
+ }
340
+ });
341
+ }
342
+ if (collapseBtn) {
343
+ collapseBtn.addEventListener('click', () => {
344
+ menuCollapsed = !menuCollapsed;
345
+ saveMenuCollapsedState(menuCollapsed);
346
+ applyMenuCollapsedState(navMenu);
347
+ });
348
+ }
349
+ const updateMenuVisibility = () => {
350
+ const loggedIn = isLoggedIn();
351
+ if (navMenu) {
352
+ navMenu.hidden = !loggedIn;
353
+ navMenu.style.display = loggedIn ? '' : 'none';
354
+ }
355
+ if (menuToggle) {
356
+ menuToggle.hidden = !loggedIn;
357
+ menuToggle.style.display = loggedIn ? '' : 'none';
358
+ }
359
+ if (collapseBtn) {
360
+ collapseBtn.hidden = !loggedIn;
361
+ collapseBtn.style.display = loggedIn ? '' : 'none';
362
+ }
363
+ if (menuOverlay) {
364
+ menuOverlay.hidden = !loggedIn;
365
+ menuOverlay.style.display = loggedIn ? '' : 'none';
366
+ }
367
+ setFooterVisibility(loggedIn);
368
+ };
369
+ updateMenuVisibility();
370
+ if (menuOverlay) {
371
+ menuOverlay.addEventListener('click', closeMobileMenu);
372
+ }
373
+ const closeBtn = document.getElementById('MenuCloseBtn');
374
+ if (closeBtn) {
375
+ closeBtn.addEventListener('click', closeMobileMenu);
376
+ }
377
+ if (navMenuContent) {
378
+ updateMenuVisibility();
379
+ const loggedIn = isLoggedIn();
380
+ if (loggedIn) {
381
+ await renderMenuItems(subject, outliner, navMenuContent);
382
+ }
383
+ if (!navMenuContent.dataset.authEventsBound) {
384
+ const refreshMenuItems = async () => {
385
+ await renderMenuItems(subject, outliner, navMenuContent);
386
+ };
387
+ _solidLogic.authSession.events.on('login', () => {
388
+ updateMenuVisibility();
389
+ refreshMenu(outliner.context?.environment?.layout === 'mobile' ? 'mobile' : 'desktop');
390
+ refreshMenuItems();
391
+ });
392
+ _solidLogic.authSession.events.on('logout', () => {
393
+ updateMenuVisibility();
394
+ refreshMenu(outliner.context?.environment?.layout === 'mobile' ? 'mobile' : 'desktop');
395
+ refreshMenuItems();
396
+ });
397
+ _solidLogic.authSession.events.on('sessionRestore', () => {
398
+ updateMenuVisibility();
399
+ refreshMenu(outliner.context?.environment?.layout === 'mobile' ? 'mobile' : 'desktop');
400
+ refreshMenuItems();
401
+ });
402
+ navMenuContent.dataset.authEventsBound = 'true';
403
+ }
404
+ navMenuContent.addEventListener('click', event => {
405
+ const item = event.target.closest('.menu-item');
406
+ if (item instanceof HTMLButtonElement) {
407
+ setActiveMenuItem(navMenuContent, item.dataset.paneName);
408
+ }
409
+ const isMobile = outliner.context?.environment?.layout === 'mobile';
410
+ if (item && isMobile) {
411
+ closeMobileMenu();
412
+ }
413
+ });
414
+ }
415
+ refreshMenu(outliner.context?.environment?.layout === 'mobile' ? 'mobile' : 'desktop');
416
+ };
417
+ exports.createLeftSideMenu = createLeftSideMenu;
418
+ async function openDashboardPane(subject, outliner, pane) {
419
+ const me = _solidLogic.authn.currentUser();
420
+ if (!subject) {
421
+ if (me) {
422
+ subject = me;
423
+ } else {
424
+ const store = outliner?.context?.store || outliner?.context?.session?.store || outliner?.kb;
425
+ const fetcher = outliner?.context?.fetcher || store?.fetcher;
426
+ if (!store || !fetcher) {
427
+ throw new Error('Unable to load profile: missing RDF store or fetcher');
428
+ }
429
+ const fallbackUri = (0, _rdflib.sym)(window.location.href);
430
+ subject = await (0, _ownerProfile.loadProfileFromURI)(subject || fallbackUri, store, fetcher);
431
+ }
432
+ }
433
+ outliner.showDashboard(subject, {
434
+ pane
435
+ });
436
+ }
@@ -0,0 +1,49 @@
1
+ .n3-pane {
2
+ padding: 1rem;
3
+ border-top: solid 1px var(--color-data-pane-border-top, black);
4
+ border-left: solid 1px var(--color-data-pane-border-top, black);
5
+ border-bottom: solid 1px var(--color-data-pane-border-side, #777);
6
+ border-right: solid 1px var(--color-data-pane-border-side, #777);
7
+ color: var(--color-text-blue, #004);
8
+ box-sizing: border-box;
9
+ }
10
+
11
+ .n3-pane__source {
12
+ overflow-x: auto;
13
+ max-width: 100%;
14
+ box-sizing: border-box;
15
+ font-family: monospace;
16
+ font-size: 120%;
17
+ margin: 0;
18
+ white-space: pre;
19
+ }
20
+
21
+ .n3-pane__line {
22
+ white-space: pre;
23
+ }
24
+
25
+ .n3-pane[data-layout='mobile'] .n3-pane__source {
26
+ overflow-wrap: anywhere;
27
+ word-break: break-word;
28
+ white-space: normal;
29
+ }
30
+
31
+ .n3-pane[data-layout='mobile'] .n3-pane__line {
32
+ white-space: pre-wrap;
33
+ padding-left: var(--n3-indent, 0);
34
+ text-indent: calc(-1 * var(--n3-indent, 0));
35
+ }
36
+
37
+ @media (max-width: 576px) {
38
+ .n3-pane__source {
39
+ overflow-wrap: anywhere;
40
+ word-break: break-word;
41
+ white-space: normal;
42
+ }
43
+
44
+ .n3-pane__line {
45
+ white-space: pre-wrap;
46
+ padding-left: var(--n3-indent, 0);
47
+ text-indent: calc(-1 * var(--n3-indent, 0));
48
+ }
49
+ }
@@ -0,0 +1,13 @@
1
+ import type { DataBrowserContext } from 'pane-registry';
2
+ import type { NamedNode } from 'rdflib';
3
+ import './n3Pane.css';
4
+ type N3PaneLike = {
5
+ icon: string;
6
+ name: string;
7
+ audience: NamedNode[];
8
+ label: (subject: NamedNode, context: DataBrowserContext) => string | null;
9
+ render: (subject: NamedNode, context: DataBrowserContext) => HTMLDivElement;
10
+ };
11
+ export declare const n3Pane: N3PaneLike;
12
+ export {};
13
+ //# sourceMappingURL=n3Pane.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"n3Pane.d.ts","sourceRoot":"","sources":["../src/n3Pane.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAqB,MAAM,eAAe,CAAA;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,QAAQ,CAAA;AAClD,OAAO,cAAc,CAAA;AAIrB,KAAK,UAAU,GAAG;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,SAAS,EAAE,CAAA;IACrB,KAAK,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,KAAK,MAAM,GAAG,IAAI,CAAA;IACzE,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,KAAK,cAAc,CAAA;CAC5E,CAAA;AAsBD,eAAO,MAAM,MAAM,EAAE,UAuEpB,CAAA"}
package/dist/n3Pane.js CHANGED
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.n3Pane = void 0;
7
7
  var UI = _interopRequireWildcard(require("solid-ui"));
8
8
  var $rdf = _interopRequireWildcard(require("rdflib"));
9
+ require("./n3Pane.css");
9
10
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
10
11
  /* Notation3 content Pane
11
12
  **
@@ -15,6 +16,24 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
15
16
  */
16
17
 
17
18
  const ns = UI.ns;
19
+ function leadingIndentWidth(line) {
20
+ if (line.trim().length === 0) {
21
+ return 0;
22
+ }
23
+ let width = 0;
24
+ for (const character of line) {
25
+ if (character === ' ') {
26
+ width += 1;
27
+ continue;
28
+ }
29
+ if (character === '\t') {
30
+ width += 2;
31
+ continue;
32
+ }
33
+ break;
34
+ }
35
+ return Math.max(width, 2);
36
+ }
18
37
  const n3Pane = exports.n3Pane = {
19
38
  icon: UI.icons.originalIconBase + 'w3c/n3_smaller.png',
20
39
  name: 'n3',
@@ -31,8 +50,13 @@ const n3Pane = exports.n3Pane = {
31
50
  render: function (subject, context) {
32
51
  const myDocument = context.dom;
33
52
  const kb = context.session.store;
53
+ function applyEnvironmentAttributes(element) {
54
+ const environment = context.environment ?? {};
55
+ element.dataset.layout = environment.layout ?? 'desktop';
56
+ }
34
57
  const div = myDocument.createElement('div');
35
- div.setAttribute('class', 'n3Pane');
58
+ div.setAttribute('class', 'n3-pane');
59
+ applyEnvironmentAttributes(div);
36
60
  // Because of smushing etc, this will not be a copy of the original source
37
61
  // We could instead either fetch and re-parse the source,
38
62
  // or we could keep all the pre-smushed triples.
@@ -48,9 +72,17 @@ const n3Pane = exports.n3Pane = {
48
72
  sz.suggestNamespaces(kb.namespaces);
49
73
  sz.setBase(subject.uri);
50
74
  const str = sz.statementsToN3(sts);
51
- const pre = myDocument.createElement('PRE');
52
- pre.appendChild(myDocument.createTextNode(str));
53
- div.appendChild(pre);
75
+ const source = myDocument.createElement('div');
76
+ source.classList.add('n3-pane__source');
77
+ str.split('\n').forEach(line => {
78
+ const lineElement = myDocument.createElement('div');
79
+ const indentWidth = leadingIndentWidth(line);
80
+ lineElement.classList.add('n3-pane__line');
81
+ lineElement.style.setProperty('--n3-indent', `${indentWidth}ch`);
82
+ lineElement.textContent = line.length > 0 ? line : ' ';
83
+ source.appendChild(lineElement);
84
+ });
85
+ div.appendChild(source);
54
86
  return div;
55
87
  }
56
88
  };
@@ -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"}
@@ -5,14 +5,17 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.createContext = createContext;
7
7
  var _index = require("../index");
8
- function createContext(dom, paneRegistry, store, logic) {
8
+ function createContext(dom, paneRegistry, store, logic, environment) {
9
9
  return {
10
10
  dom,
11
11
  getOutliner: _index.getOutliner,
12
12
  session: {
13
13
  paneRegistry,
14
+ // @ts-ignore
14
15
  store,
16
+ // @ts-ignore
15
17
  logic
16
- }
18
+ },
19
+ environment
17
20
  };
18
21
  }
@@ -31,21 +31,18 @@
31
31
 
32
32
  .paneShown {
33
33
  width: 24px;
34
- border-radius: 0.5em;
35
- border-top: solid #222 1px;
36
- border-left: solid #222 0.1em;
37
- border-bottom: solid #eee 0.1em;
38
- border-right: solid #eee 0.1em;
39
- margin-left: 1em;
40
- padding: 3px;
41
- background-color: #ffd;
34
+ border: none !important;
35
+ border-radius: var(--border-radius-md, 0.5rem);
36
+ margin-left: var(--spacing-small, 0.1rem);
37
+ padding: 0.188rem; /* 3px */
38
+ background-color: var(--header-menu-item-hover, #e6dcff) !important;
42
39
  }
43
40
 
44
41
  .paneHidden {
45
42
  width: 24px;
46
- border-radius: 0.5em;
47
- margin-left: 1em;
48
- padding: 3px;
43
+ border-radius: var(--border-radius-md, 0.5rem);
44
+ margin-left: var(--spacing-small, 0.1rem);
45
+ padding: 0.188rem; /* 3px */
49
46
  }
50
47
 
51
48
  .header {
@@ -57,12 +54,13 @@
57
54
 
58
55
  .strongHeader {
59
56
  font-size: 150%;
60
- margin: 0 0.6em 0 0;
61
- padding: 0.1em 0.4em;
57
+ margin: 0 0.6rem 0 0;
58
+ padding: 0.1rem 0.4rem;
62
59
  }
63
60
 
64
61
  .tableFullWidth {
65
62
  width: 100%;
63
+ background: var(--color-background, #F8F9FB) !important;
66
64
  }
67
65
 
68
66
  .placeholderTable {
@@ -70,7 +68,7 @@
70
68
  }
71
69
 
72
70
  .tdFlex {
73
- margin: 0.2em;
71
+ margin: var(--spacing-xxxs, 0.2rem);
74
72
  border: none;
75
73
  padding: 0;
76
74
  vertical-align: top;