solid-panes 4.4.0 → 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 (75) hide show
  1. package/README.md +4 -2
  2. package/dist/RDFXMLPane.css +70 -0
  3. package/dist/RDFXMLPane.d.ts +13 -0
  4. package/dist/RDFXMLPane.d.ts.map +1 -0
  5. package/dist/RDFXMLPane.js +46 -5
  6. package/dist/dataContentPane.css +271 -0
  7. package/dist/dataContentPane.d.ts +14 -0
  8. package/dist/dataContentPane.d.ts.map +1 -0
  9. package/dist/dataContentPane.js +68 -101
  10. package/dist/defaultPane.css +97 -0
  11. package/dist/defaultPane.d.ts +14 -0
  12. package/dist/defaultPane.d.ts.map +1 -0
  13. package/dist/defaultPane.js +9 -2
  14. package/dist/form/formPane.css +120 -0
  15. package/dist/form/pane.d.ts +4 -0
  16. package/dist/form/pane.d.ts.map +1 -0
  17. package/dist/form/pane.js +120 -54
  18. package/dist/humanReadablePane.css +129 -0
  19. package/dist/humanReadablePane.d.ts +13 -0
  20. package/dist/humanReadablePane.d.ts.map +1 -0
  21. package/dist/humanReadablePane.js +29 -18
  22. package/dist/icons/signUp.svg +9 -0
  23. package/dist/imagePane.css +4 -0
  24. package/dist/imagePane.d.ts +12 -0
  25. package/dist/imagePane.d.ts.map +1 -0
  26. package/dist/imagePane.js +19 -21
  27. package/dist/internal/internalPane.css +14 -0
  28. package/dist/internal/internalPane.d.ts +1 -0
  29. package/dist/internal/internalPane.d.ts.map +1 -1
  30. package/dist/internal/internalPane.js +5 -6
  31. package/dist/mainPage/header.js +2 -2
  32. package/dist/mainPage/index.d.ts +2 -1
  33. package/dist/mainPage/index.d.ts.map +1 -1
  34. package/dist/mainPage/index.js +23 -0
  35. package/dist/mainPage/menu.d.ts.map +1 -1
  36. package/dist/mainPage/menu.js +29 -2
  37. package/dist/n3Pane.css +49 -0
  38. package/dist/n3Pane.d.ts +13 -0
  39. package/dist/n3Pane.d.ts.map +1 -0
  40. package/dist/n3Pane.js +36 -5
  41. package/dist/outline/manager.js +20 -1
  42. package/dist/pad/padPane.css +6 -2
  43. package/dist/pad/padPane.js +1 -1
  44. package/dist/registerPanes.js +8 -8
  45. package/dist/schedule/schedulePane.css +294 -0
  46. package/dist/schedule/schedulePane.d.ts +23 -0
  47. package/dist/schedule/schedulePane.d.ts.map +1 -0
  48. package/dist/schedule/schedulePane.js +161 -61
  49. package/dist/social/editProfileDetails.d.ts +3 -3
  50. package/dist/social/editProfileDetails.d.ts.map +1 -1
  51. package/dist/social/editProfileDetails.js +222 -127
  52. package/dist/social/icons.d.ts +2 -0
  53. package/dist/social/icons.d.ts.map +1 -1
  54. package/dist/social/icons.js +39 -4
  55. package/dist/social/socialPane.css +838 -178
  56. package/dist/social/socialPane.d.ts.map +1 -1
  57. package/dist/social/socialPane.js +136 -43
  58. package/dist/social/socialSections.d.ts +11 -0
  59. package/dist/social/socialSections.d.ts.map +1 -1
  60. package/dist/social/socialSections.js +138 -62
  61. package/dist/social/spinner.d.ts +3 -0
  62. package/dist/social/spinner.d.ts.map +1 -0
  63. package/dist/social/spinner.js +13 -0
  64. package/dist/social/triage.d.ts +17 -0
  65. package/dist/social/triage.d.ts.map +1 -0
  66. package/dist/social/triage.js +79 -0
  67. package/dist/solid-panes.js +25772 -9576
  68. package/dist/solid-panes.js.map +1 -1
  69. package/dist/solid-panes.min.js +2583 -927
  70. package/dist/solid-panes.min.js.map +1 -1
  71. package/dist/{style → styles}/tabbedtab.css +0 -157
  72. package/dist/styles/utilities.css +5 -0
  73. package/dist/versionInfo.js +13 -13
  74. package/package.json +27 -26
  75. package/dist/icons/signup.png +0 -0
@@ -1,4 +1,5 @@
1
1
  import { PaneDefinition } from 'pane-registry';
2
+ import './internalPane.css';
2
3
  declare const pane: PaneDefinition;
3
4
  export default pane;
4
5
  //# sourceMappingURL=internalPane.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"internalPane.d.ts","sourceRoot":"","sources":["../../src/internal/internalPane.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,QAAA,MAAM,IAAI,EAAE,cAyOX,CAAA;AAiBD,eAAe,IAAI,CAAA"}
1
+ {"version":3,"file":"internalPane.d.ts","sourceRoot":"","sources":["../../src/internal/internalPane.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,oBAAoB,CAAA;AAE3B,QAAA,MAAM,IAAI,EAAE,cAqOX,CAAA;AAiBD,eAAe,IAAI,CAAA"}
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  var _solidUi = require("solid-ui");
8
8
  var _rdflib = require("rdflib");
9
+ require("./internalPane.css");
9
10
  /* Internal Pane
10
11
  **
11
12
  ** This outline pane contains the properties which are
@@ -31,8 +32,7 @@ const pane = {
31
32
  return view && view.predicates && !!(typeof view.predicates[pred.uri] !== 'undefined');
32
33
  }
33
34
  const div = dom.createElement('div');
34
- div.setAttribute('class', 'internalPane');
35
- div.setAttribute('style', 'background-color: #ddddff; padding: 0.5em; border-radius: 1em;');
35
+ div.classList.add('internalPane', 'internalPaneContent');
36
36
  function deleteRecursive(kb, folder) {
37
37
  const fetcher = kb.fetcher;
38
38
  if (!fetcher) {
@@ -70,8 +70,7 @@ const pane = {
70
70
  const isDocument = subject.uri && !subject.uri.includes('#');
71
71
  if (isDocument) {
72
72
  const controls = div.appendChild(dom.createElement('table'));
73
- controls.style.width = '100%';
74
- controls.style.margin = '1em';
73
+ controls.classList.add('internalPaneControls');
75
74
  const controlRow = controls.appendChild(dom.createElement('tr'));
76
75
  const deleteCell = controlRow.appendChild(dom.createElement('td'));
77
76
  const isFolder = subject.uri && subject.uri.endsWith('/') || store.holds(subject, _solidUi.ns.rdf('type'), _solidUi.ns.ldp('Container'));
@@ -96,8 +95,8 @@ const pane = {
96
95
  alert(str);
97
96
  });
98
97
  });
99
- deleteButton.style = 'height: 2em;';
100
- deleteButton.class = ''; // Remove hover hide
98
+ deleteButton.removeAttribute('class'); // Remove hover hide
99
+ deleteButton.classList.add('internalPaneDeleteButton');
101
100
  deleteCell.appendChild(deleteButton);
102
101
  }
103
102
  const refreshCell = controlRow.appendChild(dom.createElement('td'));
@@ -14,7 +14,7 @@ var _person = _interopRequireDefault(require("../icons/person.svg?raw"));
14
14
  var _signOut = _interopRequireDefault(require("../icons/signOut.svg?raw"));
15
15
  var _personInCircle = _interopRequireDefault(require("../icons/personInCircle.svg?raw"));
16
16
  var _downArrow = _interopRequireDefault(require("../icons/downArrow.svg?raw"));
17
- var _signup = _interopRequireDefault(require("../icons/signup.png"));
17
+ var _signUp = _interopRequireDefault(require("../icons/signUp.svg?raw"));
18
18
  var _iconHelper = require("../icons/iconHelper");
19
19
  var _menu = require("./menu");
20
20
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -23,7 +23,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
23
23
  */
24
24
  const HELP_MENU_ICON = (0, _iconHelper.createUiIcon)(_help.default, 'Help Icon', '#ffffff');
25
25
  const LOGIN_ICON = (0, _iconHelper.createUiIcon)(_person.default, 'LogIn Icon', '#ffffff');
26
- const SIGNUP_ICON = _signup.default;
26
+ const SIGNUP_ICON = (0, _iconHelper.createUiIcon)(_signUp.default, 'SignUp Icon', '#ffffff');
27
27
  const LOGOUT_ICON = (0, _iconHelper.createUiIcon)(_signOut.default, 'LogOut Icon', '#000000');
28
28
  const DEFAULT_AVATAR_ICON = (0, _iconHelper.createUiIcon)(_personInCircle.default, 'Default Avatar Icon', '#6A7282');
29
29
  const DOWN_ARROW_ICON = (0, _iconHelper.createUiIcon)(_downArrow.default, 'Down Arrow Icon', '#ffffff');
@@ -1,8 +1,9 @@
1
1
  import { LiveStore, NamedNode } from 'rdflib';
2
+ import type { RenderEnvironment } from 'pane-registry';
2
3
  import { OutlineManager } from '../index';
3
4
  export { refreshMenu as updateMenuLayout } from './menu';
4
5
  export { refreshHeader } from './header';
5
- export declare function initMainPage(store: LiveStore, uri?: string | NamedNode | null, environment?: any): Promise<[import("solid-ui/components/header").Header & {
6
+ export declare function initMainPage(store: LiveStore, uri?: string | NamedNode | null, environment?: RenderEnvironment): Promise<[import("solid-ui/components/header").Header & {
6
7
  __solidPanesListenersAttached?: boolean;
7
8
  __solidPanesOutliner?: OutlineManager;
8
9
  }, void, HTMLElement & {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mainPage/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAe,cAAc,EAAE,MAAM,UAAU,CAAA;AAKtD,OAAO,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAexC,wBAAsB,YAAY,CAChC,KAAK,EAAE,SAAS,EAChB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAC/B,WAAW,CAAC,EAAE,GAAG;;;;;;;;;;IAYlB;AAED,wBAAsB,SAAS,CAAE,QAAQ,EAAE,cAAc,iBAGxD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mainPage/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAe,cAAc,EAAE,MAAM,UAAU,CAAA;AActD,OAAO,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAexC,wBAAsB,YAAY,CAChC,KAAK,EAAE,SAAS,EAChB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAC/B,WAAW,CAAC,EAAE,iBAAiB;;;;;;;;;;IAahC;AAED,wBAAsB,SAAS,CAAE,QAAQ,EAAE,cAAc,iBAoBxD"}
@@ -26,6 +26,13 @@ var _menu = require("./menu");
26
26
  ** This code is called in mashlib and renders the header and footer of the Databrowser.
27
27
  */
28
28
 
29
+ // Symbol used to stash the last render-relevant env snapshot on the outliner
30
+ // so refreshUI can skip a full GotoSubject re-render when nothing changed.
31
+ const LAST_RENDER_ENV_KEY = '__lastRenderEnvSignature';
32
+ function renderEnvSignature(env) {
33
+ if (!env) return '';
34
+ return [env.layout, env.theme, env.inputMode].join('|');
35
+ }
29
36
  function ensureMainContent() {
30
37
  let main = document.getElementById('MainContent');
31
38
  if (!main) {
@@ -41,6 +48,7 @@ function ensureMainContent() {
41
48
  async function initMainPage(store, uri, environment) {
42
49
  ensureMainContent();
43
50
  const outliner = (0, _index.getOutliner)(document, environment);
51
+ outliner[LAST_RENDER_ENV_KEY] = renderEnvSignature(environment);
44
52
  uri = uri || window.location.href;
45
53
  const subject = typeof uri === 'string' ? store.sym(uri) : uri;
46
54
  outliner.GotoSubject(subject, true, undefined, true, undefined);
@@ -50,6 +58,21 @@ async function initMainPage(store, uri, environment) {
50
58
  return Promise.all([header, menu, footer]);
51
59
  }
52
60
  async function refreshUI(outliner) {
61
+ const store = outliner?.context?.session?.store;
62
+ const paneRegistry = outliner?.context?.session?.paneRegistry;
63
+ const subjectUri = window.document.location.href;
64
+ const paneName = window.history.state?.paneName;
65
+ const pane = paneName ? paneRegistry?.byName?.(paneName) : undefined;
66
+
67
+ // Only re-run GotoSubject (full pane re-render) when render-relevant
68
+ // environment fields actually changed since the last render.
69
+ const currentSignature = renderEnvSignature(outliner?.context?.environment);
70
+ const previousSignature = outliner?.[LAST_RENDER_ENV_KEY] ?? '';
71
+ const envChanged = currentSignature !== previousSignature;
72
+ if (envChanged && store && typeof outliner?.GotoSubject === 'function') {
73
+ outliner.GotoSubject(store.sym(subjectUri), true, pane, true, undefined);
74
+ outliner[LAST_RENDER_ENV_KEY] = currentSignature;
75
+ }
53
76
  await (0, _header.refreshHeader)(outliner);
54
77
  (0, _menu.refreshMenu)(outliner.context.environment?.layout === 'mobile' ? 'mobile' : 'desktop');
55
78
  }
@@ -1 +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"}
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"}
@@ -50,6 +50,15 @@ const applyMenuCollapsedState = navMenu => {
50
50
  updateCollapseButtonPosition(navMenu, collapseBtn);
51
51
  };
52
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
+ };
53
62
  const ensureMenuSkeleton = () => {
54
63
  menuCollapsed = loadMenuCollapsedState();
55
64
  const root = document.querySelector('[role="main"]') || document.body;
@@ -60,7 +69,6 @@ const ensureMenuSkeleton = () => {
60
69
  navMenu.className = 'app-nav';
61
70
  navMenu.setAttribute('aria-label', 'App navigation');
62
71
  navMenu.hidden = true;
63
- navMenu.style.display = 'none';
64
72
  const headerEl = document.createElement('div');
65
73
  headerEl.className = 'menu-header';
66
74
  const closeBtn = document.createElement('button');
@@ -226,7 +234,11 @@ const updateToggleLabel = activeItem => {
226
234
  const renderMenuItems = async (subject, outliner, container) => {
227
235
  const menuItems = await getMenuItems(subject, outliner);
228
236
  container.replaceChildren(...menuItems.map(createMenuButton));
229
- setActiveMenuItem(container, container.dataset.activePaneName);
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);
230
242
  };
231
243
  const refreshMenu = layout => {
232
244
  const navMenu = document.getElementById('NavMenu');
@@ -244,23 +256,33 @@ const refreshMenu = layout => {
244
256
  collapseBtn.style.display = 'none';
245
257
  overlay.hidden = true;
246
258
  overlay.style.display = 'none';
259
+ setFooterVisibility(false);
247
260
  return;
248
261
  }
262
+ setFooterVisibility(true);
249
263
  if (layout === 'mobile') {
250
264
  navMenu.classList.add('mobile-hidden');
251
265
  navMenu.classList.remove('mobile-visible');
252
266
  toggle.hidden = false;
267
+ toggle.style.display = '';
253
268
  collapseBtn.hidden = true;
269
+ collapseBtn.style.display = 'none';
254
270
  overlay.hidden = true;
271
+ overlay.style.display = 'none';
255
272
  navMenu.hidden = false;
273
+ navMenu.style.display = '';
256
274
  navMenu.classList.remove('collapsed');
257
275
  toggle.setAttribute('aria-expanded', 'false');
258
276
  } else {
259
277
  navMenu.classList.remove('mobile-hidden', 'mobile-visible');
260
278
  toggle.hidden = true;
279
+ toggle.style.display = 'none';
261
280
  collapseBtn.hidden = false;
281
+ collapseBtn.style.display = '';
262
282
  overlay.hidden = true;
283
+ overlay.style.display = 'none';
263
284
  navMenu.hidden = false;
285
+ navMenu.style.display = '';
264
286
  applyMenuCollapsedState(navMenu);
265
287
  updateCollapseButtonPosition(navMenu, collapseBtn);
266
288
  toggle.setAttribute('aria-expanded', 'false');
@@ -277,15 +299,19 @@ const createLeftSideMenu = async (subject, outliner) => {
277
299
  if (!navMenu || !menuToggle || !menuOverlay) return;
278
300
  navMenu.classList.remove('mobile-visible');
279
301
  navMenu.classList.add('mobile-hidden');
302
+ navMenu.style.display = '';
280
303
  menuToggle.setAttribute('aria-expanded', 'false');
281
304
  menuOverlay.hidden = true;
305
+ menuOverlay.style.display = 'none';
282
306
  };
283
307
  const openMobileMenu = () => {
284
308
  if (!navMenu || !menuToggle || !menuOverlay) return;
285
309
  navMenu.classList.remove('mobile-hidden');
286
310
  navMenu.classList.add('mobile-visible');
311
+ navMenu.style.display = '';
287
312
  menuToggle.setAttribute('aria-expanded', 'true');
288
313
  menuOverlay.hidden = false;
314
+ menuOverlay.style.display = '';
289
315
  };
290
316
  const collapseBtn = document.getElementById('MenuCollapseBtn');
291
317
  const expandDesktopMenu = () => {
@@ -338,6 +364,7 @@ const createLeftSideMenu = async (subject, outliner) => {
338
364
  menuOverlay.hidden = !loggedIn;
339
365
  menuOverlay.style.display = loggedIn ? '' : 'none';
340
366
  }
367
+ setFooterVisibility(loggedIn);
341
368
  };
342
369
  updateMenuVisibility();
343
370
  if (menuOverlay) {
@@ -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,10 +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.setAttribute('style', 'overflow-x: auto; max-width: 100%; box-sizing: border-box;');
53
- pre.appendChild(myDocument.createTextNode(str));
54
- 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);
55
86
  return div;
56
87
  }
57
88
  };
@@ -1819,12 +1819,31 @@ function _default(context) {
1819
1819
  }
1820
1820
  if (subject.uri && !immediate && !UI.widgets.isAudio(subject) && !UI.widgets.isVideo(subject)) {
1821
1821
  const docUri = subject.doc() && subject.doc().uri ? subject.doc().uri : '' + subject.doc();
1822
+ /* handle auth errors more gracefully. For now just display a friendlier message
1823
+ perhaps we can have a different page that gets shown in the future */
1824
+ const outlineAuthMessage = function (statusCode) {
1825
+ const isRootResource = !!(subject && subject.uri && subject.site && subject.site().uri === subject.uri);
1826
+ if (statusCode === 403) {
1827
+ return isRootResource ? 'This root resource is not accessible with your current permissions. Try logging in with an authorized account or opening a public profile document.' : 'This resource is not accessible with your current permissions.';
1828
+ }
1829
+ return isRootResource ? 'This root resource is not publicly readable. Try logging in or opening a profile document.' : 'This resource is not publicly readable. Try logging in or opening a different public resource.';
1830
+ };
1831
+ const authErrorStatus = function (detail, errObj) {
1832
+ const detailText = typeof detail === 'string' ? detail : String(detail || '');
1833
+ const statusCode = errObj?.status || errObj?.response?.status;
1834
+ if (statusCode === 401 || statusCode === 403) return statusCode;
1835
+ if (detailText.includes('status: 403') || detailText.includes('status 403')) return 403;
1836
+ if (detailText.includes('status: 401') || detailText.includes('status 401')) return 401;
1837
+ return null;
1838
+ };
1822
1839
  const appendOutlineError = function (detail, errObj) {
1823
1840
  if (p.querySelector && docUri) {
1824
1841
  const existing = p.querySelector('[data-outline-error-for="' + docUri + '"]');
1825
1842
  if (existing) return;
1826
1843
  }
1827
- const message = UI.widgets.errorMessageBlock(dom, detail, '#fee', errObj instanceof Error ? errObj : undefined);
1844
+ const statusCode = authErrorStatus(detail, errObj);
1845
+ const friendlyDetail = statusCode ? outlineAuthMessage(statusCode) : detail;
1846
+ const message = UI.widgets.errorMessageBlock(dom, friendlyDetail, '#fee', errObj instanceof Error ? errObj : undefined);
1828
1847
  if (docUri) message.setAttribute('data-outline-error-for', docUri);
1829
1848
  p.appendChild(message);
1830
1849
  };
@@ -3,7 +3,7 @@
3
3
  min-width: 94%;
4
4
  margin-right: 3%;
5
5
  margin-left: 3%;
6
- min-height: 13em;
6
+ min-height: 13rem;
7
7
  display: flex;
8
8
  flex-direction: column;
9
9
  box-sizing: border-box;
@@ -21,7 +21,7 @@
21
21
  }
22
22
 
23
23
  .pad-controls {
24
- gap: 0.5em;
24
+ gap: 0.5rem;
25
25
  align-items: center;
26
26
  }
27
27
 
@@ -29,6 +29,10 @@
29
29
  flex: 1 1 auto;
30
30
  }
31
31
 
32
+ .pad-new-instance-message {
33
+ font-size: 140%;
34
+ }
35
+
32
36
  @media (max-width: 600px) {
33
37
  .pad-controls .pad-cell {
34
38
  flex: 1 1 100%;
@@ -299,7 +299,7 @@ const paneDef = {
299
299
  // give the user links to the new app
300
300
 
301
301
  const p = div.appendChild(dom.createElement('p'));
302
- p.setAttribute('style', 'font-size: 140%;');
302
+ p.classList.add('pad-new-instance-message');
303
303
  p.innerHTML = 'Your <a href=\'' + newIndexDoc.uri + '\'><b>new notepad</b></a> is ready. ' + '<br/><br/><a href=\'' + newIndexDoc.uri + '\'>Go to new pad</a>';
304
304
  });
305
305
  agenda.shift()();
@@ -17,9 +17,9 @@ var _period = _interopRequireDefault(require("./transaction/period.js"));
17
17
  var _meetingPane = _interopRequireDefault(require("meeting-pane"));
18
18
  var _tabbedPane = _interopRequireDefault(require("./tabbed/tabbedPane"));
19
19
  var _chatPane = require("chat-pane");
20
- var _schedulePane = require("./schedule/schedulePane.js");
20
+ var _schedulePane = require("./schedule/schedulePane");
21
21
  var _tripPane = _interopRequireDefault(require("./trip/tripPane.js"));
22
- var _imagePane = require("./imagePane.js");
22
+ var _imagePane = require("./imagePane");
23
23
  var _playlistPane = _interopRequireDefault(require("./playlist/playlistPane.js"));
24
24
  var _videoPane = _interopRequireDefault(require("./video/videoPane.js"));
25
25
  var _audioPane = _interopRequireDefault(require("./audio/audioPane.js"));
@@ -28,14 +28,14 @@ var _folderPane = _interopRequireDefault(require("folder-pane"));
28
28
  var _classInstancePane = require("./classInstancePane.js");
29
29
  var _slideshowPane = require("./slideshow/slideshowPane.js");
30
30
  var _socialPane = require("./social/socialPane");
31
- var _humanReadablePane = _interopRequireDefault(require("./humanReadablePane.js"));
32
- var _dataContentPane = require("./dataContentPane.js");
31
+ var _humanReadablePane = _interopRequireDefault(require("./humanReadablePane"));
32
+ var _dataContentPane = require("./dataContentPane");
33
33
  var _sourcePane = _interopRequireDefault(require("source-pane"));
34
- var _n3Pane = require("./n3Pane.js");
35
- var _RDFXMLPane = require("./RDFXMLPane.js");
36
- var _pane2 = require("./form/pane.js");
34
+ var _n3Pane = require("./n3Pane");
35
+ var _RDFXMLPane = require("./RDFXMLPane");
36
+ var _pane2 = require("./form/pane");
37
37
  var _tableViewPane = require("./tableViewPane.js");
38
- var _defaultPane = require("./defaultPane.js");
38
+ var _defaultPane = require("./defaultPane");
39
39
  var _pane3 = _interopRequireDefault(require("./ui/pane.js"));
40
40
  var _sharingPane = _interopRequireDefault(require("./sharing/sharingPane"));
41
41
  var _internalPane = _interopRequireDefault(require("./internal/internalPane"));