From cfc42401efaf9cdf5a0d4a479124716b6a151baf Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Fri, 13 Mar 2026 07:25:42 +1100 Subject: [PATCH 01/30] created dataContentPane css --- dev/loader.ts | 48 ++++++++++++++++++++++++----------- src/dataContentPane.js | 1 + src/style/dataContentPane.css | 0 3 files changed, 34 insertions(+), 15 deletions(-) create mode 100644 src/style/dataContentPane.css diff --git a/dev/loader.ts b/dev/loader.ts index 207e35db..037eb5cd 100644 --- a/dev/loader.ts +++ b/dev/loader.ts @@ -3,7 +3,7 @@ import * as paneRegistry from 'pane-registry' import * as $rdf from 'rdflib' import { solidLogicSingleton, store, authSession } from 'solid-logic' import { getOutliner } from '../src' -import Pane from 'profile-pane' +import { dataContentPane as Pane } from '../src/dataContentPane.js' import './dev-mash.css' // Add custom properties to the Window interface for TypeScript @@ -23,10 +23,22 @@ async function renderPane (uri: string) { } const subject = $rdf.sym(uri) const doc = subject.doc() + const paneSubject = Pane.name === 'dataContents' ? doc : subject + + const target = document.getElementById('render') + + try { + await new Promise((resolve, reject) => { + store.fetcher.load(doc).then(resolve, reject) + }) + } catch (error) { + console.error('Failed to load document for pane rendering', error) + if (target) { + target.innerHTML = `
Failed to load ${doc.uri}\n${String(error)}
` + } + return + } - await new Promise((resolve, reject) => { - store.fetcher.load(doc).then(resolve, reject) - }) const context = { // see https://github.com/solidos/solid-panes/blob/005f90295d83e499fd626bd84aeb3df10135d5c1/src/index.ts#L30-L34 dom: document, @@ -39,16 +51,21 @@ async function renderPane (uri: string) { } console.log(subject, context) - const icon = createIconElement(Pane) - const paneDiv = Pane.render(subject, context) - - const target = document.getElementById('render') - if (target) { - target.innerHTML = '' - target.appendChild(icon) - target.appendChild(paneDiv) - } else { - console.error("Element with id 'render' not found.") + try { + const icon = createIconElement(Pane) + const paneDiv = Pane.render(paneSubject, context) + if (target) { + target.innerHTML = '' + target.appendChild(icon) + target.appendChild(paneDiv) + } else { + console.error("Element with id 'render' not found.") + } + } catch (error) { + console.error('Pane render failed', error) + if (target) { + target.innerHTML = `
Pane render failed\n${String(error)}
` + } } } @@ -63,6 +80,7 @@ function createIconElement (Pane: { icon: string }) { window.onload = async () => { console.log('document ready') // registerPanes((cjsOrEsModule: any) => paneRegistry.register(cjsOrEsModule.default || cjsOrEsModule)) + paneRegistry.register(Pane) paneRegistry.register(require('contacts-pane')) await authSession.handleIncomingRedirect({ restorePreviousSession: true @@ -82,7 +100,7 @@ window.onload = async () => { loginBanner.innerHTML = `Logged in as ${session.info.webId} `; } } - renderPane('https://testingsolidos.solidcommunity.net/profile/card#me') + renderPane('https://testingsolidos.solidcommunity.net/profile/card') } window.logout = () => { authSession.logout() diff --git a/src/dataContentPane.js b/src/dataContentPane.js index 749ebc75..c17e917b 100644 --- a/src/dataContentPane.js +++ b/src/dataContentPane.js @@ -11,6 +11,7 @@ import * as UI from 'solid-ui' import * as $rdf from 'rdflib' +import './style/dataContentPane.css ' const ns = UI.ns diff --git a/src/style/dataContentPane.css b/src/style/dataContentPane.css new file mode 100644 index 00000000..e69de29b From 45dc0a5ce03d757cfe59555c3846ac3f87869fc9 Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Fri, 13 Mar 2026 07:33:44 +1100 Subject: [PATCH 02/30] change style to styles like other repos --- src/{style => styles}/dataContentPane.css | 0 src/{style => styles}/tabbedtab.css | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/{style => styles}/dataContentPane.css (100%) rename src/{style => styles}/tabbedtab.css (100%) diff --git a/src/style/dataContentPane.css b/src/styles/dataContentPane.css similarity index 100% rename from src/style/dataContentPane.css rename to src/styles/dataContentPane.css diff --git a/src/style/tabbedtab.css b/src/styles/tabbedtab.css similarity index 100% rename from src/style/tabbedtab.css rename to src/styles/tabbedtab.css From 65505cb0eeae009a03566e686600afaa56897e0d Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Fri, 13 Mar 2026 07:47:29 +1100 Subject: [PATCH 03/30] completed dataContentPane style move --- src/dataContentPane.js | 24 +++++++++++------------- src/styles/dataContentPane.css | 23 +++++++++++++++++++++++ 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src/dataContentPane.js b/src/dataContentPane.js index c17e917b..36ab3949 100644 --- a/src/dataContentPane.js +++ b/src/dataContentPane.js @@ -11,7 +11,7 @@ import * as UI from 'solid-ui' import * as $rdf from 'rdflib' -import './style/dataContentPane.css ' +import './styles/dataContentPane.css' const ns = UI.ns @@ -75,6 +75,7 @@ export const dataContentPane = { for (let i = 0; i < sts.length; i++) { const st = sts[i] const tr = myDocument.createElement('tr') + tr.classList.add('dataContentPaneTopAlignedRow') if (st.predicate.uri !== lastPred) { if (lastPred && same > 1) { predicateTD.setAttribute('rowspan', '' + same) @@ -126,7 +127,7 @@ export const dataContentPane = { case 'Literal': if (!obj.datatype || !obj.datatype.uri) { res = myDocument.createElement('div') - res.setAttribute('style', 'white-space: pre-wrap;') + res.classList.add('contentPaneLiteral') res.textContent = obj.value return res } else if ( @@ -134,7 +135,7 @@ export const dataContentPane = { 'http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral' ) { res = myDocument.createElement('div') - res.setAttribute('class', 'embeddedXHTML') + res.classList.add('embeddedXHTML') res.innerHTML = obj.value // Try that @@@ beware embedded dangerous code return res } @@ -153,14 +154,11 @@ export const dataContentPane = { doneBnodes[obj.toNT()] = true // Flag to prevent infinite recursion in propertyTree const newTable = propertyTree(obj) doneBnodes[obj.toNT()] = newTable // Track where we mentioned it first - if ( - UI.utils.ancestor(newTable, 'TABLE') && - UI.utils.ancestor(newTable, 'TABLE').style.backgroundColor === - 'white' - ) { - newTable.style.backgroundColor = '#eee' + const parentTable = UI.utils.ancestor(newTable, 'TABLE') + if (parentTable && parentTable.classList.contains('dataContentPaneNestedLight')) { + newTable.classList.add('dataContentPaneNestedDark') } else { - newTable.style.backgroundColor = 'white' + newTable.classList.add('dataContentPaneNestedLight') } return newTable } @@ -201,7 +199,7 @@ export const dataContentPane = { } for (let i = 0; i < roots.length; i++) { const tr = myDocument.createElement('tr') - tr.setAttribute('style', `background-color: ${i % 2 === 0 ? '#f0f0f0' : 'white'};`) + tr.classList.add(i % 2 === 0 ? 'dataContentPaneRowEven' : 'dataContentPaneRowOdd') rep.appendChild(tr) const subjectTD = myDocument.createElement('td') tr.appendChild(subjectTD) @@ -249,9 +247,9 @@ export const dataContentPane = { return div } for (let i = 0; i < roots.length; i++) { - const tr = myDocument.createElement('TR') + const tr = myDocument.createElement('tr') + tr.classList.add('dataContentPaneTopAlignedRow') const root = roots[i] - tr.style.verticalAlign = 'top' const td = outliner.outlineObjectTD(root, undefined, tr) tr.appendChild(td) div.appendChild(tr) diff --git a/src/styles/dataContentPane.css b/src/styles/dataContentPane.css index e69de29b..9401fec9 100644 --- a/src/styles/dataContentPane.css +++ b/src/styles/dataContentPane.css @@ -0,0 +1,23 @@ +.contentPaneLiteral { + white-space: pre-wrap; +} + +.dataContentPaneRowEven { + background-color: #f0f0f0; +} + +.dataContentPaneRowOdd { + background-color: white; +} + +.dataContentPaneTopAlignedRow { + vertical-align: top; +} + +.dataContentPaneNestedLight { + background-color: white; +} + +.dataContentPaneNestedDark { + background-color: #eee; +} \ No newline at end of file From 93923fb91188c064b6121e794f304cfa1cffd18b Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Fri, 13 Mar 2026 10:24:25 +1100 Subject: [PATCH 04/30] humanReadablePane sytles --- dev/loader.ts | 2 +- src/humanReadablePane.js | 20 ++++++++++++-------- src/styles/humanReadablePane.css | 8 ++++++++ 3 files changed, 21 insertions(+), 9 deletions(-) create mode 100644 src/styles/humanReadablePane.css diff --git a/dev/loader.ts b/dev/loader.ts index 037eb5cd..1bfb9f6f 100644 --- a/dev/loader.ts +++ b/dev/loader.ts @@ -3,7 +3,7 @@ import * as paneRegistry from 'pane-registry' import * as $rdf from 'rdflib' import { solidLogicSingleton, store, authSession } from 'solid-logic' import { getOutliner } from '../src' -import { dataContentPane as Pane } from '../src/dataContentPane.js' +import Pane from '../src/humanReadablePane.js' import './dev-mash.css' // Add custom properties to the Window interface for TypeScript diff --git a/src/humanReadablePane.js b/src/humanReadablePane.js index f054c9bb..d764fc14 100644 --- a/src/humanReadablePane.js +++ b/src/humanReadablePane.js @@ -7,6 +7,7 @@ import { icons, ns } from 'solid-ui' import { Util } from 'rdflib' import { marked } from 'marked' import DOMPurify from 'dompurify' +import './styles/humanReadablePane.css' // Helper function to check if a URI has a markdown file extension const isMarkdownFile = (uri) => { @@ -176,6 +177,11 @@ const humanReadablePane = { // @@ When we can, use CSP to turn off scripts within the iframe div.setAttribute('class', 'docView') + const setFrameDisplayStyles = function (frame, lines) { + frame.classList.add('doc', 'humanReadableFrame') + frame.style.setProperty('--human-readable-height', `${lines}em`) + } + // render markdown to html in a DIV element const renderMarkdownContent = function (frame) { kb.fetcher.webOperation('GET', subject.uri).then(response => { @@ -184,8 +190,7 @@ const humanReadablePane = { const res = marked.parse(markdownText) const clean = DOMPurify.sanitize(res) frame.innerHTML = clean - frame.setAttribute('class', 'doc') - frame.setAttribute('style', `border: 1px solid; padding: 1em; height: ${lines}em; width: 800px; resize: both; overflow: auto;`) + setFrameDisplayStyles(frame, lines) }).catch(error => { console.error('Error fetching markdown content:', error) frame.innerHTML = '

Error loading content

' @@ -194,20 +199,19 @@ const humanReadablePane = { const setIframeAttributes = (frame, lines) => { frame.setAttribute('src', subject.uri) - frame.setAttribute('class', 'doc') - frame.setAttribute('style', `border: 1px solid; padding: 1em; height: ${lines}em; width: 800px; resize: both; overflow: auto;`) + setFrameDisplayStyles(frame, lines) } if (isMarkdown) { // For markdown, use a DIV element and render the content - const frame = myDocument.createElement('DIV') + const frame = myDocument.createElement('div') renderMarkdownContent(frame) - const tr = myDocument.createElement('TR') + const tr = myDocument.createElement('tr') tr.appendChild(frame) div.appendChild(tr) } else { // For other content types, use IFRAME - const frame = myDocument.createElement('IFRAME') + const frame = myDocument.createElement('iframe') // Apply sandbox for HTML/XHTML if (ct === 'text/html' || ct === 'application/xhtml+xml') { @@ -232,7 +236,7 @@ const humanReadablePane = { setIframeAttributes(frame, 30) }) - const tr = myDocument.createElement('TR') + const tr = myDocument.createElement('tr') tr.appendChild(frame) div.appendChild(tr) } diff --git a/src/styles/humanReadablePane.css b/src/styles/humanReadablePane.css new file mode 100644 index 00000000..d7f55b32 --- /dev/null +++ b/src/styles/humanReadablePane.css @@ -0,0 +1,8 @@ +.humanReadableFrame { + border: 1px solid; + padding: 1em; + height: var(--human-readable-height, 30em); + width: 800px; + resize: both; + overflow: auto; +} From c7f07e53b2fd82a71bef971d905f3b5e9d97b81d Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Fri, 13 Mar 2026 14:08:19 +1100 Subject: [PATCH 05/30] moved padPane styles --- src/pad/padPane.ts | 15 ++++++--------- src/styles/padPane.css | 13 +++++++++++++ 2 files changed, 19 insertions(+), 9 deletions(-) create mode 100644 src/styles/padPane.css diff --git a/src/pad/padPane.ts b/src/pad/padPane.ts index 7003d960..029fdf23 100644 --- a/src/pad/padPane.ts +++ b/src/pad/padPane.ts @@ -2,6 +2,7 @@ import { icons, ns, pad, widgets, login } from 'solid-ui' import { authn, AppDetails } from 'solid-logic' import { graph, log, NamedNode, Namespace, sym, serialize, Store } from 'rdflib' import { PaneDefinition } from 'pane-registry' +import '../styles/padPane.css' /* pad Pane ** */ @@ -390,7 +391,7 @@ const paneDef: PaneDefinition = { // give the user links to the new app const p = div.appendChild(dom.createElement('p')) - p.setAttribute('style', 'font-size: 140%;') + p.classList.add('padPaneSuccess') p.innerHTML = 'Your Date: Fri, 13 Mar 2026 14:29:56 +1100 Subject: [PATCH 06/30] moved internalPane styles --- src/internal/internalPane.ts | 13 +++++-------- src/styles/internalPane.css | 12 ++++++++++++ 2 files changed, 17 insertions(+), 8 deletions(-) create mode 100644 src/styles/internalPane.css diff --git a/src/internal/internalPane.ts b/src/internal/internalPane.ts index b041634a..b38d5dec 100644 --- a/src/internal/internalPane.ts +++ b/src/internal/internalPane.ts @@ -8,6 +8,7 @@ import { icons, ns, widgets } from 'solid-ui' import { BlankNode, IndexedFormula, literal, NamedNode, st, sym, Variable, Store } from 'rdflib' import { PaneDefinition } from 'pane-registry' +import '../styles/internalPane.css' const pane: PaneDefinition = { icon: icons.originalIconBase + 'tango/22-emblem-system.png', @@ -35,11 +36,7 @@ const pane: PaneDefinition = { } const div = dom.createElement('div') - div.setAttribute('class', 'internalPane') - div.setAttribute( - 'style', - 'background-color: #ddddff; padding: 0.5em; border-radius: 1em;' - ) + div.classList.add('internalPane', 'internalPaneContent') function deleteRecursive (kb: IndexedFormula, folder: NamedNode) { const fetcher = (kb as any).fetcher @@ -85,8 +82,7 @@ const pane: PaneDefinition = { const isDocument = subject.uri && !subject.uri.includes('#') if (isDocument) { const controls = div.appendChild(dom.createElement('table')) - controls.style.width = '100%' - controls.style.margin = '1em' + controls.classList.add('internalPaneControls') const controlRow = controls.appendChild(dom.createElement('tr')) const deleteCell = controlRow.appendChild(dom.createElement('td')) @@ -127,8 +123,9 @@ const pane: PaneDefinition = { }) } ) - deleteButton.style = 'height: 2em;' + deleteButton.class = '' // Remove hover hide + deleteButton.classList.add('internalPaneDeleteButton') deleteCell.appendChild(deleteButton) } diff --git a/src/styles/internalPane.css b/src/styles/internalPane.css new file mode 100644 index 00000000..abc5b285 --- /dev/null +++ b/src/styles/internalPane.css @@ -0,0 +1,12 @@ +.internalPaneContent { + background-color: #ddddff; + padding: var(--spacing-xs, 0.5em); + border-radius: 1em; +} +.internalPaneControls { + width: 100%; + margin: var(--spacing-sm, 1em); +} +.internalPaneDeleteButton { + height: 2em; +} \ No newline at end of file From ee1898fa61ca112859f7af60b4349a642dbaff8d Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Fri, 13 Mar 2026 15:02:56 +1100 Subject: [PATCH 07/30] resolved issue with schedulepane not displaying --- src/schedule/schedulePane.js | 52 +++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/src/schedule/schedulePane.js b/src/schedule/schedulePane.js index 46fe40a6..f9dee359 100644 --- a/src/schedule/schedulePane.js +++ b/src/schedule/schedulePane.js @@ -557,9 +557,53 @@ export const schedulePane = { const showForms = function () { clearElement(naviCenter) // Remove refresh button if nec const div = naviMain + + // form2 depends on sched:allDay; seed a local default for new polls + if (!kb.any(subject, ns.sched('allDay'))) { + kb.add( + subject, + ns.sched('allDay'), + $rdf.literal( + 'true', + undefined, + $rdf.sym('http://www.w3.org/2001/XMLSchema#boolean') + ), + detailsDoc + ) + } + const wizard = true let currentSlide = 0 let gotDoneButton = false + + const hasFormControls = function (container) { + return !!container.querySelector('input, select, textarea, button') + } + + const asBoolean = function (term, fallback) { + if (!term) return fallback + const value = (term.value || '').toLowerCase() + if (value === 'true' || value === '1') return true + if (value === 'false' || value === '0') return false + return fallback + } + + const renderTimeProposalFallback = function (slide) { + const allDayValue = asBoolean(kb.any(subject, ns.sched('allDay')), true) + const fallbackForm = kb.sym( + formsURI + (allDayValue ? '#AllDayForm2' : '#NotAllDayForm2') + ) + UI.widgets.appendForm( + document, + slide, + {}, + subject, + fallbackForm, + detailsDoc, + complainIfBad + ) + } + if (wizard) { const forms = [form1, form2, form3] const slides = [] @@ -575,6 +619,12 @@ export const schedulePane = { detailsDoc, complainIfBad ) + + // Some stores end up with form2's ui:Options unresolved; force a usable input form. + if (f === 1 && !hasFormControls(slide)) { + renderTimeProposalFallback(slide) + } + slides.push(slide) } @@ -882,7 +932,7 @@ export const schedulePane = { // Read or create empty results file function getResults () { - fetcher.nowOrWhenFetched(resultsDoc.uri, (ok, body, response) => { + fetcher.nowOrWhenFetched(resultsDoc.uri, undefined, (ok, body, response) => { if (!ok) { if (response.status === 404) { // / Check explicitly for 404 error From 26486475870d011c82540fd37a3910bc8f87b0c9 Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Fri, 13 Mar 2026 15:03:56 +1100 Subject: [PATCH 08/30] linting errors --- src/internal/internalPane.ts | 2 +- src/pad/padPane.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/internal/internalPane.ts b/src/internal/internalPane.ts index b38d5dec..b1224f5d 100644 --- a/src/internal/internalPane.ts +++ b/src/internal/internalPane.ts @@ -123,7 +123,7 @@ const pane: PaneDefinition = { }) } ) - + deleteButton.class = '' // Remove hover hide deleteButton.classList.add('internalPaneDeleteButton') deleteCell.appendChild(deleteButton) diff --git a/src/pad/padPane.ts b/src/pad/padPane.ts index 029fdf23..d6b029a5 100644 --- a/src/pad/padPane.ts +++ b/src/pad/padPane.ts @@ -517,7 +517,7 @@ const paneDef: PaneDefinition = { // Build the DOM const structure = div.appendChild(dom.createElement('table')) // @@ make responsive style structure.classList.add('padPaneTable') - + const naviLoginoutTR = structure.appendChild(dom.createElement('tr')) naviLoginoutTR.appendChild(dom.createElement('td')) // naviLoginout1 naviLoginoutTR.appendChild(dom.createElement('td')) From 09d84c986f1346b81fb3701a6fa440e46e9cc711 Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Fri, 13 Mar 2026 15:48:20 +1100 Subject: [PATCH 09/30] dev loader --- dev/loader.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dev/loader.ts b/dev/loader.ts index 1bfb9f6f..54019e92 100644 --- a/dev/loader.ts +++ b/dev/loader.ts @@ -3,7 +3,7 @@ import * as paneRegistry from 'pane-registry' import * as $rdf from 'rdflib' import { solidLogicSingleton, store, authSession } from 'solid-logic' import { getOutliner } from '../src' -import Pane from '../src/humanReadablePane.js' +import { schedulePane as Pane } from '../src/schedule/schedulePane' import './dev-mash.css' // Add custom properties to the Window interface for TypeScript @@ -53,7 +53,7 @@ async function renderPane (uri: string) { console.log(subject, context) try { const icon = createIconElement(Pane) - const paneDiv = Pane.render(paneSubject, context) + const paneDiv = Pane.render(paneSubject, context, {}) if (target) { target.innerHTML = '' target.appendChild(icon) @@ -100,7 +100,7 @@ window.onload = async () => { loginBanner.innerHTML = `Logged in as ${session.info.webId} `; } } - renderPane('https://testingsolidos.solidcommunity.net/profile/card') + renderPane('https://sstratsianis.solidcommunity.net/ScheduleEventTest/details.ttl#this') } window.logout = () => { authSession.logout() From 80a2082a9fd911d67f574193333472f03b3ed2f3 Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Fri, 13 Mar 2026 18:56:13 +1100 Subject: [PATCH 10/30] moved SchedulePane styles --- src/schedule/schedulePane.js | 42 ++++++++++++++---------------------- src/styles/schedulePane.css | 27 +++++++++++++++++++++++ 2 files changed, 43 insertions(+), 26 deletions(-) create mode 100644 src/styles/schedulePane.css diff --git a/src/schedule/schedulePane.js b/src/schedule/schedulePane.js index f9dee359..fa9f7e66 100644 --- a/src/schedule/schedulePane.js +++ b/src/schedule/schedulePane.js @@ -8,6 +8,7 @@ import * as UI from 'solid-ui' import { authn } from 'solid-logic' import * as $rdf from 'rdflib' import formText from './formsForSchedule.ttl' +import '../styles/schedulePane.css' const ns = UI.ns @@ -347,10 +348,6 @@ export const schedulePane = { $rdf.parse(formText, kb, formsURI, 'text/turtle') // Load forms directly - const inputStyle = - 'background-color: #eef; padding: 0.5em; border: .5em solid white; font-size: 100%' // font-size: 120% - const buttonIconStyle = 'width: 1.8em; height: 1.8em;' - // Utility functions const complainIfBad = function (ok, message) { @@ -369,9 +366,10 @@ export const schedulePane = { const refreshCellColor = function (cell, value) { const bg = kb.any(value, UI.ns.ui('backgroundColor')) if (bg) { + cell.classList.add('schedulePaneCell') cell.setAttribute( 'style', - 'padding: 0.3em; text-align: center; background-color: ' + bg + ';' + 'background-color: ' + bg + ';' ) } } @@ -402,7 +400,7 @@ export const schedulePane = { { noun: 'scheduler' }, initializeNewInstanceInWorkspace ) - b.firstChild.setAttribute('style', inputStyle) + b.firstChild.classList.add('schedulePaneButton') return b } // newInstanceButton @@ -539,7 +537,7 @@ export const schedulePane = { div.appendChild(dom.createElement('br')) // @@ const button = div.appendChild(dom.createElement('button')) - button.setAttribute('style', inputStyle) + button.classList.add('schedulePaneButton') button.textContent = 'Start new poll at this URI' button.addEventListener('click', function (_e) { let newBase = baseField.value @@ -649,7 +647,7 @@ export const schedulePane = { } } const b1 = clearElement(naviLeft).appendChild(dom.createElement('button')) - b1.setAttribute('style', inputStyle) + b1.classList.add('schedulePaneButton') b1.textContent = '<- go back' b1.addEventListener( 'click', @@ -665,7 +663,7 @@ export const schedulePane = { const b2 = clearElement(naviRight).appendChild( dom.createElement('button') ) - b2.setAttribute('style', inputStyle) + b2.classList.add('schedulePaneButton') b2.textContent = 'continue ->' b2.addEventListener( 'click', @@ -730,7 +728,7 @@ export const schedulePane = { $rdf.st(subject, ns.sched('results'), resultsDoc, detailsDoc) ) // @@ also link in results - doneButton.setAttribute('style', inputStyle) + doneButton.classList.add('schedulePaneButton') doneButton.textContent = 'Go to poll' doneButton.addEventListener( 'click', @@ -759,10 +757,10 @@ export const schedulePane = { ) const emailButton = dom.createElement('button') - emailButton.setAttribute('style', inputStyle) + emailButton.classList.add('schedulePaneButton') const emailIcon = emailButton.appendChild(dom.createElement('img')) emailIcon.setAttribute('src', UI.icons.iconBase + 'noun_480183.svg') // noun_480183.svg - emailIcon.setAttribute('style', buttonIconStyle) + emailIcon.classList.add('schedulePaneButtonIcon') // emailButton.textContent = 'email invitations' emailButton.addEventListener( 'click', @@ -1047,11 +1045,11 @@ export const schedulePane = { matrix.setAttribute('class', 'matrix') const refreshButton = dom.createElement('button') - refreshButton.setAttribute('style', inputStyle) + refreshButton.classList.add('schedulePaneButton') // refreshButton.textContent = 'refresh' // noun_479395.svg const refreshIcon = dom.createElement('img') refreshIcon.setAttribute('src', UI.icons.iconBase + 'noun_479395.svg') - refreshIcon.setAttribute('style', buttonIconStyle) + refreshIcon.classList.add('schedulePaneButtonIcon') refreshButton.appendChild(refreshIcon) refreshButton.addEventListener( 'click', @@ -1180,11 +1178,11 @@ export const schedulePane = { const instanceCreator = kb.any(subject, ns.foaf('maker')) // owner? if (!instanceCreator || instanceCreator.sameTerm(me)) { const editButton = dom.createElement('button') - editButton.setAttribute('style', inputStyle) + editButton.classList.add('schedulePaneButton') // editButton.textContent = '(Modify the poll)' // noun_344563.svg const editIcon = dom.createElement('img') editIcon.setAttribute('src', UI.icons.iconBase + 'noun_344563.svg') - editIcon.setAttribute('style', buttonIconStyle) + editIcon.classList.add('schedulePaneButtonIcon') editButton.appendChild(editIcon) editButton.addEventListener( 'click', @@ -1206,10 +1204,7 @@ export const schedulePane = { const div = dom.createElement('div') const structure = div.appendChild(dom.createElement('table')) // @@ make responsive style - structure.setAttribute( - 'style', - 'background-color: white; min-width: 40em; min-height: 13em;' - ) + structure.classList.add('schedulePaneTable') const naviLoginoutTR = structure.appendChild(dom.createElement('tr')) naviLoginoutTR.appendChild(dom.createElement('td')) @@ -1230,12 +1225,7 @@ export const schedulePane = { naviMain.setAttribute('colspan', '3') const naviMenu = structure.appendChild(dom.createElement('tr')) - naviMenu.setAttribute('class', 'naviMenu') - naviMenu.setAttribute( - 'style', - ' text-align: middle; vertical-align: middle; padding-top: 4em; ' - ) - // naviMenu.setAttribute('style', 'margin-top: 3em;') + naviMenu.classList.add('naviMenu', 'schedulePaneNaviMenu') const naviLeft = naviMenu.appendChild(dom.createElement('td')) const naviCenter = naviMenu.appendChild(dom.createElement('td')) const naviRight = naviMenu.appendChild(dom.createElement('td')) diff --git a/src/styles/schedulePane.css b/src/styles/schedulePane.css new file mode 100644 index 00000000..7a3538c9 --- /dev/null +++ b/src/styles/schedulePane.css @@ -0,0 +1,27 @@ +.schedulePaneTable { + border-collapse: collapse; + background-color: white; + min-width: 40em; + min-height: 13em; +} + +.schedulePaneButton { + background-color: #eef; + padding: var(--spacing-xs, 0.5em); + border: .5em solid white; + font-size: 100% +} + +.schedulePaneButtonIcon { + width: 1.8em; + height: 1.8em; +} +.schedulePaneNaviMenu { + text-align: center; + vertical-align: middle; + padding-top: 4em; +} +.schedulePaneCell { + padding: 0.3em; + text-align: center; +} \ No newline at end of file From db6638648543323451e845afe6cc676a574b67c1 Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Fri, 13 Mar 2026 19:03:41 +1100 Subject: [PATCH 11/30] moved imagePane styles --- src/imagePane.js | 10 ++++------ src/styles/imagePane.css | 4 ++++ 2 files changed, 8 insertions(+), 6 deletions(-) create mode 100644 src/styles/imagePane.css diff --git a/src/imagePane.js b/src/imagePane.js index a8b3f819..e213c5d0 100644 --- a/src/imagePane.js +++ b/src/imagePane.js @@ -3,6 +3,7 @@ ** This outline pane contains the document contents for an Image document */ import * as UI from 'solid-ui' +import './styles/imagePane.css' export const imagePane = { icon: UI.icons.originalIconBase + 'tango/22-image-x-generic.png', @@ -50,7 +51,7 @@ export const imagePane = { const store = context.session.store const div = myDocument.createElement('div') div.setAttribute('class', 'imageView') - const img = myDocument.createElement('IMG') + const img = myDocument.createElement('img') // get image with authenticated fetch store.fetcher._fetch(subject.uri) @@ -61,11 +62,8 @@ export const imagePane = { const objectURL = URL.createObjectURL(myBlob) img.setAttribute('src', objectURL) // w640 h480 // }) - - img.setAttribute('style', 'max-width: 100%; max-height: 100%;') - // div.style['max-width'] = '640' - // div.style['max-height'] = '480' - const tr = myDocument.createElement('TR') // why need tr? + img.classList.add('imagePaneViewImage') + const tr = myDocument.createElement('tr') // why need tr? tr.appendChild(img) div.appendChild(tr) return div diff --git a/src/styles/imagePane.css b/src/styles/imagePane.css new file mode 100644 index 00000000..a049633f --- /dev/null +++ b/src/styles/imagePane.css @@ -0,0 +1,4 @@ +.imagePaneViewImage { + max-width: 100%; + max-height: 100%; +} From b95a32f2e71a303fc53bbd9cf9e57d4945a23518 Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Fri, 13 Mar 2026 20:19:05 +1100 Subject: [PATCH 12/30] moved formPane styles --- src/form/pane.js | 13 ++++++++----- src/styles/formPane.css | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 src/styles/formPane.css diff --git a/src/form/pane.js b/src/form/pane.js index 373b1b7c..d6e3f784 100644 --- a/src/form/pane.js +++ b/src/form/pane.js @@ -6,6 +6,8 @@ import * as UI from 'solid-ui' import { authn } from 'solid-logic' import * as $rdf from 'rdflib' +import '../styles/formPane.css' + const ns = UI.ns export const formPane = { @@ -27,15 +29,16 @@ export const formPane = { const kb = context.session.store const dom = context.dom - const mention = function complain (message, style) { + const mention = function mention (message, className) { const pre = dom.createElement('p') - pre.setAttribute('style', style || 'color: grey; background-color: white') + pre.classList.add('formPaneMessage') + pre.classList.add(className || 'formPaneMessageInfo') box.appendChild(pre).textContent = message return pre } - const complain = function complain (message, style) { - mention(message, 'style', style || 'color: grey; background-color: #fdd;') + const complain = function complain (message) { + mention(message, 'formPaneMessageError') } const complainIfBad = function (ok, body) { @@ -103,7 +106,7 @@ export const formPane = { complainIfBad ) ) - e.setAttribute('style', 'float: right;') + e.classList.add('formPaneEditButton') } } const anchor = dom.createElement('a') diff --git a/src/styles/formPane.css b/src/styles/formPane.css new file mode 100644 index 00000000..b99f1128 --- /dev/null +++ b/src/styles/formPane.css @@ -0,0 +1,19 @@ +.formPaneMessage { + color: #666; + margin: var(--spacing-xs, 0.5em) 0; + padding: var(--spacing-xs, 0.35em) var(--spacing-xs, 0.5em); +} + +.formPaneMessageInfo { + background-color: var(--color-main-block-bg, #eee); +} + +.formPaneMessageError { + background-color: var(--color-log-error-bg, #fee); +} +.formPaneEditButton { + padding: var(--spacing-xs, 0.5em); + border: .5em solid white; + font-size: 100%; + float: right; +} From 25a313441b762575342a849a40596edb5cb28c2e Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Fri, 13 Mar 2026 20:21:45 +1100 Subject: [PATCH 13/30] imagePane lint errors --- src/imagePane.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/imagePane.js b/src/imagePane.js index e213c5d0..6a04d8bb 100644 --- a/src/imagePane.js +++ b/src/imagePane.js @@ -62,7 +62,7 @@ export const imagePane = { const objectURL = URL.createObjectURL(myBlob) img.setAttribute('src', objectURL) // w640 h480 // }) - img.classList.add('imagePaneViewImage') + img.classList.add('imagePaneViewImage') const tr = myDocument.createElement('tr') // why need tr? tr.appendChild(img) div.appendChild(tr) From a43959e65bc7ac0846ea535f2853947189b8efeb Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Sun, 15 Mar 2026 17:28:51 +1100 Subject: [PATCH 14/30] dev loader --- dev/loader.ts | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/dev/loader.ts b/dev/loader.ts index 54019e92..c3f82f34 100644 --- a/dev/loader.ts +++ b/dev/loader.ts @@ -3,9 +3,30 @@ import * as paneRegistry from 'pane-registry' import * as $rdf from 'rdflib' import { solidLogicSingleton, store, authSession } from 'solid-logic' import { getOutliner } from '../src' -import { schedulePane as Pane } from '../src/schedule/schedulePane' +import { formPane as Pane } from '../src/form/pane' import './dev-mash.css' +function registerPaneModule (moduleOrPane: any) { + const pane = moduleOrPane?.default || moduleOrPane + paneRegistry.register(pane) +} + +async function preloadFormOntologies () { + const ontologyDocs = [ + 'https://www.w3.org/ns/ui.ttl' + ] + + await Promise.all( + ontologyDocs.map(async uri => { + try { + await store.fetcher.load($rdf.sym(uri)) + } catch (error) { + console.warn('Could not preload ontology:', uri, error) + } + }) + ) +} + // Add custom properties to the Window interface for TypeScript declare global { interface Window { @@ -80,8 +101,9 @@ function createIconElement (Pane: { icon: string }) { window.onload = async () => { console.log('document ready') // registerPanes((cjsOrEsModule: any) => paneRegistry.register(cjsOrEsModule.default || cjsOrEsModule)) - paneRegistry.register(Pane) - paneRegistry.register(require('contacts-pane')) + registerPaneModule(Pane) + registerPaneModule(require('contacts-pane')) + await preloadFormOntologies() await authSession.handleIncomingRedirect({ restorePreviousSession: true }) @@ -100,7 +122,7 @@ window.onload = async () => { loginBanner.innerHTML = `Logged in as ${session.info.webId} `; } } - renderPane('https://sstratsianis.solidcommunity.net/ScheduleEventTest/details.ttl#this') + renderPane('https://sstratsianis.solidcommunity.net/formtest.ttl#this') } window.logout = () => { authSession.logout() From 686c7789744b6e4e6f78ce56afa2af2159863d48 Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Mon, 16 Mar 2026 12:21:51 +1100 Subject: [PATCH 15/30] schedpane styles vars --- src/schedule/schedulePane.js | 1 + src/styles/schedulePane.css | 9 +++++---- src/styles/utilities.css | 3 +++ 3 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 src/styles/utilities.css diff --git a/src/schedule/schedulePane.js b/src/schedule/schedulePane.js index fa9f7e66..461b1d59 100644 --- a/src/schedule/schedulePane.js +++ b/src/schedule/schedulePane.js @@ -9,6 +9,7 @@ import { authn } from 'solid-logic' import * as $rdf from 'rdflib' import formText from './formsForSchedule.ttl' import '../styles/schedulePane.css' +import '../styles/utilities.css' const ns = UI.ns diff --git a/src/styles/schedulePane.css b/src/styles/schedulePane.css index 7a3538c9..3f5d4724 100644 --- a/src/styles/schedulePane.css +++ b/src/styles/schedulePane.css @@ -13,15 +13,16 @@ } .schedulePaneButtonIcon { - width: 1.8em; - height: 1.8em; + width: var(--icon-sm, 1.8em); + height: var(--icon-sm, 1.8em); } + .schedulePaneNaviMenu { text-align: center; vertical-align: middle; padding-top: 4em; } .schedulePaneCell { - padding: 0.3em; + padding: var(--spacing-xs, 0.3em); text-align: center; -} \ No newline at end of file +} diff --git a/src/styles/utilities.css b/src/styles/utilities.css new file mode 100644 index 00000000..6eb5b1fc --- /dev/null +++ b/src/styles/utilities.css @@ -0,0 +1,3 @@ +:root { + --icon-sm: 1.8em; +} \ No newline at end of file From 81a678805517f43dbf130dc1b24d9bf47dd5598c Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Mon, 16 Mar 2026 12:38:52 +1100 Subject: [PATCH 16/30] data content pane style vars --- src/styles/dataContentPane.css | 4 ++-- src/styles/utilities.css | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/styles/dataContentPane.css b/src/styles/dataContentPane.css index 9401fec9..586d8136 100644 --- a/src/styles/dataContentPane.css +++ b/src/styles/dataContentPane.css @@ -7,7 +7,7 @@ } .dataContentPaneRowOdd { - background-color: white; + background-color: var(--color-background, white); } .dataContentPaneTopAlignedRow { @@ -15,7 +15,7 @@ } .dataContentPaneNestedLight { - background-color: white; + background-color: var(--color-background, white); } .dataContentPaneNestedDark { diff --git a/src/styles/utilities.css b/src/styles/utilities.css index 6eb5b1fc..47e14e3d 100644 --- a/src/styles/utilities.css +++ b/src/styles/utilities.css @@ -1,3 +1,5 @@ :root { --icon-sm: 1.8em; + --color-background-row-default: white; + --color-background-row-alternate: #f0f0f0; } \ No newline at end of file From b989b6e09fe714c5b42af18dd21c7006baf2581b Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Mon, 16 Mar 2026 12:44:45 +1100 Subject: [PATCH 17/30] humanreadable style vars --- src/styles/humanReadablePane.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styles/humanReadablePane.css b/src/styles/humanReadablePane.css index d7f55b32..42a23545 100644 --- a/src/styles/humanReadablePane.css +++ b/src/styles/humanReadablePane.css @@ -1,6 +1,6 @@ .humanReadableFrame { border: 1px solid; - padding: 1em; + padding: var(--spacing-md, 1em); height: var(--human-readable-height, 30em); width: 800px; resize: both; From 6c3a752086ce0708e5596e0997af47e82deb70ae Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Mon, 16 Mar 2026 12:47:33 +1100 Subject: [PATCH 18/30] internalPane use icon var --- src/styles/internalPane.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styles/internalPane.css b/src/styles/internalPane.css index abc5b285..eac9bcff 100644 --- a/src/styles/internalPane.css +++ b/src/styles/internalPane.css @@ -8,5 +8,5 @@ margin: var(--spacing-sm, 1em); } .internalPaneDeleteButton { - height: 2em; + height: var(--icon-base, 2em); } \ No newline at end of file From 4b92880b1bb701c81e736a325ef0d80c21934d61 Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Thu, 19 Mar 2026 12:33:55 +1100 Subject: [PATCH 19/30] light and dark assignment - data content pane --- README.md | 7 +++++++ src/dataContentPane.js | 36 +++++++++++++++++++++++++----------- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index ef5f4287..ee4c3afd 100644 --- a/README.md +++ b/README.md @@ -78,3 +78,10 @@ contacts (A VCARD Address Book, Group, Individual, Organization) can be handled pane. Any other pane which wants to deal with contacts can just use the pane within its own user interface. ![Mapping many classes on the L to panes on the R](https://solidos.github.io/solid-panes/doc/images/panes-for-classes.svg) + +## Genertive AI usage +The SolidOS team is using GitHub Copilot integrated in Visual Studio Code. +We have added comments in the code to make it explicit which parts are 100% written by AI. +Example: +* Some code was generated by the GPT-5.3-Codex model in GitHub Copilot based on the following prompt: +* This is the comment I got from copilot, but suggested fix remove the dark class as well The nested table shading logic checks UI.utils.ancestor(newTable, 'TABLE') immediately after creating newTable, but at that moment newTable typically has no parent in the DOM yet. This makes parentTable null and will always apply dataContentPaneNestedLight, preventing the intended alternating light/dark nested backgrounds. Consider assigning the class after appending newTable into its parent table, or pass the parent table (or current nesting depth) into objectTree() so the decision can be made reliably. can you help me fix this without removing the dark altering diff --git a/src/dataContentPane.js b/src/dataContentPane.js index 36ab3949..0ad6c2fb 100644 --- a/src/dataContentPane.js +++ b/src/dataContentPane.js @@ -43,6 +43,21 @@ export const dataContentPane = { return store.whether(subject, UI.ns.rdf('type'), UI.ns.link('RDFDocument')) }, */ + /* This code was generated by Generative AI (GPT-5.3-Codex in GitHub Copilot) based on the following prompt: + Only the class assignments of dataContentPaneNestedLight and dataContentPaneNestedDark + are the only things added by AI. + + This is the comment I got from copilot, but suggested fix remove the dark + class as well The nested table shading logic checks + UI.utils.ancestor(newTable, 'TABLE') immediately after + creating newTable, but at that moment newTable typically has no + parent in the DOM yet. This makes parentTable null and will + always apply dataContentPaneNestedLight, preventing the + intended alternating light/dark nested backgrounds. + Consider assigning the class after appending newTable into + its parent table, or pass the parent table (or current nesting + depth) into objectTree() so the decision can be made reliably. + can you help me fix this without removing the dark altering */ statementsAsTables: function statementsAsTables (sts, context, initialRoots) { const myDocument = context.dom // const outliner = context.getOutliner(myDocument) @@ -59,7 +74,7 @@ export const dataContentPane = { const referencedBnodes = {} // Bnodes which need to be named alas // The property tree for a single subject or anonymous node - function propertyTree (subject) { + function propertyTree (subject, nestingLevel = 0) { // print('Proprty tree for '+subject) const rep = myDocument.createElement('table') let lastPred = null @@ -101,7 +116,7 @@ export const dataContentPane = { } same++ const objectTD = myDocument.createElement('td') - objectTD.appendChild(objectTree(st.object)) + objectTD.appendChild(objectTree(st.object, nestingLevel + 1)) tr.appendChild(objectTD) rep.appendChild(tr) } @@ -110,7 +125,7 @@ export const dataContentPane = { } // Convert a set of statements into a nested tree of tables - function objectTree (obj) { + function objectTree (obj, nestingLevel = 0) { let res, anchor switch (obj.termType) { case 'NamedNode': @@ -152,13 +167,12 @@ export const dataContentPane = { return anchor } doneBnodes[obj.toNT()] = true // Flag to prevent infinite recursion in propertyTree - const newTable = propertyTree(obj) + const newTable = propertyTree(obj, nestingLevel) doneBnodes[obj.toNT()] = newTable // Track where we mentioned it first - const parentTable = UI.utils.ancestor(newTable, 'TABLE') - if (parentTable && parentTable.classList.contains('dataContentPaneNestedLight')) { - newTable.classList.add('dataContentPaneNestedDark') - } else { + if (nestingLevel % 2 === 1) { newTable.classList.add('dataContentPaneNestedLight') + } else { + newTable.classList.add('dataContentPaneNestedDark') } return newTable } @@ -168,7 +182,7 @@ export const dataContentPane = { for (let i = 0; i < obj.elements.length; i++) { const tr = myDocument.createElement('tr') res.appendChild(tr) - tr.appendChild(objectTree(obj.elements[i])) + tr.appendChild(objectTree(obj.elements[i], nestingLevel + 1)) } return res case 'Graph': @@ -209,9 +223,9 @@ export const dataContentPane = { if (root.termType === 'BlankNode') { subjectTD.appendChild(myDocument.createTextNode(UI.utils.label(root))) // Don't recurse! } else { - subjectTD.appendChild(objectTree(root)) // won't have tree + subjectTD.appendChild(objectTree(root, 0)) // won't have tree } - TDTree.appendChild(propertyTree(root)) + TDTree.appendChild(propertyTree(root, 0)) } for (const bNT in referencedBnodes) { // Add number to refer to From 3c6dd494c35417a29da70b6fb3b12e35296c96d6 Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Thu, 19 Mar 2026 12:36:27 +1100 Subject: [PATCH 20/30] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 35c87b1a..58839dd1 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "build": "npm run clean && npm run build-version && npm run typecheck && npm run build-dist && npm run build-js && npm run postbuild-js", "build-version": "bash timestamp.sh > src/versionInfo.ts && ./node_modules/.bin/eslint 'src/versionInfo.ts' --fix", "build-dist": "webpack --progress", - "build-js": "babel src --out-dir dist --extensions '.js, .ts' && tsc --emitDeclarationOnly", + "build-js": "babel src --out-dir dist --extensions '.js,.ts' && tsc --emitDeclarationOnly", "postbuild-js": "rm -f dist/versionInfo.d.ts dist/versionInfo.d.ts.map", "lint": "eslint", "lint-fix": "eslint --fix", From 3ee7d27fdabb992e8a9415b9385b743e855d935a Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Thu, 19 Mar 2026 12:39:01 +1100 Subject: [PATCH 21/30] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/outline/manager.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/outline/manager.js b/src/outline/manager.js index dee01991..a4829ece 100644 --- a/src/outline/manager.js +++ b/src/outline/manager.js @@ -173,10 +173,6 @@ export default function (context) { const td = dom.createElement('td') td.classList.add('obj') td.setAttribute('notSelectable', 'false') - td.style.margin = '0.2em' - td.style.border = 'none' - td.style.padding = '0' - td.style.verticalAlign = 'top' const theClass = 'obj' // set about and put 'expand' icon From 9f49cc66000a9014a03b63a71937e8159bd5f5c9 Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Thu, 19 Mar 2026 12:50:44 +1100 Subject: [PATCH 22/30] fixed npm 11 error --- package-lock.json | 337 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 337 insertions(+) diff --git a/package-lock.json b/package-lock.json index 9ddeaaa2..3bc9cd5d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2055,6 +2055,40 @@ "node": ">=14.17.0" } }, + "node_modules/@emnapi/core": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.0.tgz", + "integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz", + "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@emotion/is-prop-valid": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.7.3.tgz", @@ -3281,6 +3315,19 @@ "dev": true, "license": "MIT" }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, "node_modules/@nicolo-ribaudo/chokidar-2": { "version": "2.1.8-no-fsevents.3", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", @@ -3620,6 +3667,17 @@ "dev": true, "license": "MIT" }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", @@ -4513,6 +4571,48 @@ "dev": true, "license": "ISC" }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, "node_modules/@unrs/resolver-binding-darwin-x64": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", @@ -4527,6 +4627,243 @@ "darwin" ] }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", From 3659ea1f4f7c870393674833925f7f08ee295793 Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Thu, 19 Mar 2026 12:56:31 +1100 Subject: [PATCH 23/30] lint fix --- src/dataContentPane.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/dataContentPane.js b/src/dataContentPane.js index 0ad6c2fb..269af8a8 100644 --- a/src/dataContentPane.js +++ b/src/dataContentPane.js @@ -44,19 +44,19 @@ export const dataContentPane = { }, */ /* This code was generated by Generative AI (GPT-5.3-Codex in GitHub Copilot) based on the following prompt: - Only the class assignments of dataContentPaneNestedLight and dataContentPaneNestedDark + Only the class assignments of dataContentPaneNestedLight and dataContentPaneNestedDark are the only things added by AI. - - This is the comment I got from copilot, but suggested fix remove the dark - class as well The nested table shading logic checks - UI.utils.ancestor(newTable, 'TABLE') immediately after - creating newTable, but at that moment newTable typically has no - parent in the DOM yet. This makes parentTable null and will - always apply dataContentPaneNestedLight, preventing the - intended alternating light/dark nested backgrounds. - Consider assigning the class after appending newTable into - its parent table, or pass the parent table (or current nesting - depth) into objectTree() so the decision can be made reliably. + + This is the comment I got from copilot, but suggested fix remove the dark + class as well The nested table shading logic checks + UI.utils.ancestor(newTable, 'TABLE') immediately after + creating newTable, but at that moment newTable typically has no + parent in the DOM yet. This makes parentTable null and will + always apply dataContentPaneNestedLight, preventing the + intended alternating light/dark nested backgrounds. + Consider assigning the class after appending newTable into + its parent table, or pass the parent table (or current nesting + depth) into objectTree() so the decision can be made reliably. can you help me fix this without removing the dark altering */ statementsAsTables: function statementsAsTables (sts, context, initialRoots) { const myDocument = context.dom From 0a556db19c846fac3fd945aabdf9e6879b3e55d6 Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Thu, 19 Mar 2026 13:02:10 +1100 Subject: [PATCH 24/30] manager test no more inline styles --- test/unit/outline/manager.test.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/unit/outline/manager.test.ts b/test/unit/outline/manager.test.ts index 33f471c1..2453ec41 100644 --- a/test/unit/outline/manager.test.ts +++ b/test/unit/outline/manager.test.ts @@ -40,8 +40,8 @@ describe('manager', () => { it('is selectable', () => { expect(result).toHaveAttribute('notselectable', 'false') }) - it('has style', () => { - expect(result).toHaveStyle('margin: 0.2em; border: none; padding: 0; vertical-align: top;') + it('uses stylesheet layout (no inline style)', () => { + expect(result).not.toHaveAttribute('style') }) it('shows an expand icon', () => { const img = result.firstChild @@ -94,8 +94,8 @@ describe('manager', () => { it('is selectable', () => { expect(result).toHaveAttribute('notselectable', 'false') }) - it('has style', () => { - expect(result).toHaveStyle('margin: 0.2em; border: none; padding: 0; vertical-align: top;') + it('uses stylesheet layout (no inline style)', () => { + expect(result).not.toHaveAttribute('style') }) it('shows an expand icon', () => { const img = result.firstChild @@ -141,8 +141,8 @@ describe('manager', () => { it('is selectable', () => { expect(result).toHaveAttribute('notselectable', 'false') }) - it('has style', () => { - expect(result).toHaveStyle('margin: 0.2em; border: none; padding: 0; vertical-align: top;') + it('uses stylesheet layout (no inline style)', () => { + expect(result).not.toHaveAttribute('style') }) it('shows the literal text', () => { expect(result).toHaveTextContent('some text') @@ -171,8 +171,8 @@ describe('manager', () => { it('is selectable', () => { expect(result).toHaveAttribute('notselectable', 'false') }) - it('has style', () => { - expect(result).toHaveStyle('margin: 0.2em; border: none; padding: 0; vertical-align: top;') + it('uses stylesheet layout (no inline style)', () => { + expect(result).not.toHaveAttribute('style') }) it('shows 3 dots', () => { expect(result).toHaveTextContent('...') From ef5e6f7f3d0ea24dee77c95a8a081fc3d97962a0 Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Wed, 25 Mar 2026 18:32:57 +1100 Subject: [PATCH 25/30] remove class internalPane --- src/internal/internalPane.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/internal/internalPane.ts b/src/internal/internalPane.ts index b1224f5d..61151fb6 100644 --- a/src/internal/internalPane.ts +++ b/src/internal/internalPane.ts @@ -124,7 +124,7 @@ const pane: PaneDefinition = { } ) - deleteButton.class = '' // Remove hover hide + deleteButton.removeAttribute('class') // Remove hover hide deleteButton.classList.add('internalPaneDeleteButton') deleteCell.appendChild(deleteButton) } From 5df1d0db75d7333d66b9cce366f1b5cf1bb35c0a Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Wed, 25 Mar 2026 18:35:47 +1100 Subject: [PATCH 26/30] fix tr not connected to table humanPane --- src/humanReadablePane.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/humanReadablePane.js b/src/humanReadablePane.js index d764fc14..3d007b56 100644 --- a/src/humanReadablePane.js +++ b/src/humanReadablePane.js @@ -236,9 +236,7 @@ const humanReadablePane = { setIframeAttributes(frame, 30) }) - const tr = myDocument.createElement('tr') - tr.appendChild(frame) - div.appendChild(tr) + div.appendChild(frame) } return div From 40bc677f2a5d51b9b891827f0fbbd8e714391524 Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Wed, 25 Mar 2026 18:38:17 +1100 Subject: [PATCH 27/30] fixed imagePane tr --- src/imagePane.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/imagePane.js b/src/imagePane.js index 6a04d8bb..d26cbf4c 100644 --- a/src/imagePane.js +++ b/src/imagePane.js @@ -63,9 +63,7 @@ export const imagePane = { img.setAttribute('src', objectURL) // w640 h480 // }) img.classList.add('imagePaneViewImage') - const tr = myDocument.createElement('tr') // why need tr? - tr.appendChild(img) - div.appendChild(tr) + div.appendChild(img) return div } } From a11c3fbb0c22f3e09e7b1c6d16a60cacce16df4f Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Wed, 25 Mar 2026 18:42:05 +1100 Subject: [PATCH 28/30] revert back dev loader --- dev/loader.ts | 71 ++++++++++++--------------------------------------- 1 file changed, 16 insertions(+), 55 deletions(-) diff --git a/dev/loader.ts b/dev/loader.ts index c3f82f34..78e66aa3 100644 --- a/dev/loader.ts +++ b/dev/loader.ts @@ -3,30 +3,9 @@ import * as paneRegistry from 'pane-registry' import * as $rdf from 'rdflib' import { solidLogicSingleton, store, authSession } from 'solid-logic' import { getOutliner } from '../src' -import { formPane as Pane } from '../src/form/pane' +import Pane from 'profile-pane' import './dev-mash.css' -function registerPaneModule (moduleOrPane: any) { - const pane = moduleOrPane?.default || moduleOrPane - paneRegistry.register(pane) -} - -async function preloadFormOntologies () { - const ontologyDocs = [ - 'https://www.w3.org/ns/ui.ttl' - ] - - await Promise.all( - ontologyDocs.map(async uri => { - try { - await store.fetcher.load($rdf.sym(uri)) - } catch (error) { - console.warn('Could not preload ontology:', uri, error) - } - }) - ) -} - // Add custom properties to the Window interface for TypeScript declare global { interface Window { @@ -44,21 +23,10 @@ async function renderPane (uri: string) { } const subject = $rdf.sym(uri) const doc = subject.doc() - const paneSubject = Pane.name === 'dataContents' ? doc : subject - - const target = document.getElementById('render') - try { - await new Promise((resolve, reject) => { - store.fetcher.load(doc).then(resolve, reject) - }) - } catch (error) { - console.error('Failed to load document for pane rendering', error) - if (target) { - target.innerHTML = `
Failed to load ${doc.uri}\n${String(error)}
` - } - return - } + await new Promise((resolve, reject) => { + store.fetcher.load(doc).then(resolve, reject) + }) const context = { // see https://github.com/solidos/solid-panes/blob/005f90295d83e499fd626bd84aeb3df10135d5c1/src/index.ts#L30-L34 @@ -72,21 +40,16 @@ async function renderPane (uri: string) { } console.log(subject, context) - try { - const icon = createIconElement(Pane) - const paneDiv = Pane.render(paneSubject, context, {}) - if (target) { - target.innerHTML = '' - target.appendChild(icon) - target.appendChild(paneDiv) - } else { - console.error("Element with id 'render' not found.") - } - } catch (error) { - console.error('Pane render failed', error) - if (target) { - target.innerHTML = `
Pane render failed\n${String(error)}
` - } + const icon = createIconElement(Pane) + const paneDiv = Pane.render(subject, context) + + const target = document.getElementById('render') + if (target) { + target.innerHTML = '' + target.appendChild(icon) + target.appendChild(paneDiv) + } else { + console.error("Element with id 'render' not found.") } } @@ -101,9 +64,7 @@ function createIconElement (Pane: { icon: string }) { window.onload = async () => { console.log('document ready') // registerPanes((cjsOrEsModule: any) => paneRegistry.register(cjsOrEsModule.default || cjsOrEsModule)) - registerPaneModule(Pane) - registerPaneModule(require('contacts-pane')) - await preloadFormOntologies() + paneRegistry.register(require('contacts-pane')) await authSession.handleIncomingRedirect({ restorePreviousSession: true }) @@ -122,7 +83,7 @@ window.onload = async () => { loginBanner.innerHTML = `Logged in as ${session.info.webId} `; } } - renderPane('https://sstratsianis.solidcommunity.net/formtest.ttl#this') + renderPane('https://testingsolidos.solidcommunity.net/profile/card#me') } window.logout = () => { authSession.logout() From 0ce7491ef956e26f1c7546123a3516e23d0a3da7 Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Wed, 25 Mar 2026 18:44:23 +1100 Subject: [PATCH 29/30] Update src/styles/schedulePane.css Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/styles/schedulePane.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styles/schedulePane.css b/src/styles/schedulePane.css index 3f5d4724..cb3fd671 100644 --- a/src/styles/schedulePane.css +++ b/src/styles/schedulePane.css @@ -9,7 +9,7 @@ background-color: #eef; padding: var(--spacing-xs, 0.5em); border: .5em solid white; - font-size: 100% + font-size: 100%; } .schedulePaneButtonIcon { From fbe104c461c5ca9e39457daa0d4b34e1612f58f8 Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Wed, 25 Mar 2026 18:45:52 +1100 Subject: [PATCH 30/30] Update README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ee4c3afd..c61c78e4 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ pane. Any other pane which wants to deal with contacts can just use the pane wit ![Mapping many classes on the L to panes on the R](https://solidos.github.io/solid-panes/doc/images/panes-for-classes.svg) -## Genertive AI usage +## Generative AI usage The SolidOS team is using GitHub Copilot integrated in Visual Studio Code. We have added comments in the code to make it explicit which parts are 100% written by AI. Example: