Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
314 commits
Select commit Hold shift + click to select a range
e5ba843
XMLLiteral canonicalization is the RDFa editor's cm:canonical pass in…
namedgraph Aug 27, 2026
cf5baaa
Block DnD payload-typed: an app MIME marker replaces the mode-cache g…
namedgraph Aug 27, 2026
02b08c2
DataTransfer.types marshals to an XDM array under SaxonJS, so the pay…
namedgraph Aug 27, 2026
4916ed6
View pager becomes the three-zone ldh-pager (page-size selector, prev…
namedgraph Aug 28, 2026
5f792ce
Block drop lands per the HTML processing model: dragenter is canceled…
namedgraph Aug 28, 2026
5d07d02
The content-body DnD guards spell the child step as ./div - after 'an…
namedgraph Aug 28, 2026
90a8659
Facet filter and parallax step restart paging from the first page via…
namedgraph Aug 28, 2026
3ac6619
The View links drawer becomes reachable: a tb-links opener lands in t…
namedgraph Aug 28, 2026
47a49a8
The block drawer anchors to its card: .ldh-block goes position:relati…
namedgraph Aug 28, 2026
6a44f92
The hand cursor over XHTML blocks becomes an honest affordance: the p…
namedgraph Aug 28, 2026
16e2080
Legacy Bootstrap buttons move to the ldhc-btn intent/appearance/size …
namedgraph Aug 28, 2026
8a3c1d8
View table columns become sortable: xhtml:TableHeaderCell reverse-map…
namedgraph Aug 28, 2026
13f1b8b
The block links drawer retires in favour of two design-system placeme…
namedgraph Aug 28, 2026
36b006a
The copy-URI button reaches every block type through a context-free l…
namedgraph Aug 28, 2026
7bacb60
The Table chart fills the block width like its SVG siblings: ac:draw-…
namedgraph Aug 28, 2026
ec1a434
View event handlers resolve their client-side cache through a single …
namedgraph Aug 28, 2026
ff29c5c
Content-column alignment survives classic scrollbars: the address bar…
namedgraph Aug 29, 2026
d05fe16
The facet pill's predicate label sheds the pred class: app.css styles…
namedgraph Aug 29, 2026
c0bac68
Read-mode property lists become name-value groups: bs2:PropertyListId…
namedgraph Aug 29, 2026
8b644a0
View table sortable columns read at rest and the property-list hover …
namedgraph Aug 29, 2026
27ebce8
View table rows highlight on hover: tbody tr:hover paints its cells a…
namedgraph Aug 29, 2026
982e672
View sort's numeric keys yield empty sequence instead of NaN for non-…
namedgraph Aug 29, 2026
25730b7
The view's client-side sort keys off each column's XSD datatype, thro…
namedgraph Aug 29, 2026
a03c0f0
The map marker info window becomes the card itself: .ol-overlay-conta…
namedgraph Aug 29, 2026
162316a
The info window's block head aligns with the property list below it: …
namedgraph Aug 29, 2026
0187c8f
The XSD datatype enumeration behind the view sort moves into ldh:data…
namedgraph Aug 29, 2026
c4a27b8
Timestamp handling gets one ldh:date-time(), retiring the date-or-dat…
namedgraph Aug 29, 2026
d9f10a7
The DataTable converters recognise the derived numeric and dateTime t…
namedgraph Aug 29, 2026
8f8ce7a
Image objects render at a height the surface picks rather than the on…
namedgraph Aug 29, 2026
3774429
The vendored typefaces gain their latin-ext subsets, so Latin Extende…
namedgraph Aug 29, 2026
e38f693
The edit pencil on a resource description appears only under acl:Writ…
namedgraph Aug 29, 2026
2bd87e6
One navigation leaves one history entry. After a document load, ldh:r…
namedgraph Aug 29, 2026
e2b902c
CSR failures render through the design system's block-states componen…
namedgraph Aug 29, 2026
431fb08
The busy cursor becomes a promise concern. Raising it was 53 copies o…
namedgraph Aug 29, 2026
c6836f3
Three legacy ixsl:schedule-action http-request callbacks become promi…
namedgraph Aug 29, 2026
1440438
Parallax chips stop being read off the loaded page and are discovered…
namedgraph Aug 29, 2026
ef14806
A quiet block no longer lifts under the cursor. The hover elevation w…
namedgraph Aug 29, 2026
0eda7e0
The rdf:type pill follows the type rather than the type list. Web-Cli…
namedgraph Aug 29, 2026
fe0b50e
A chart over an empty result set says so in the design system's empty…
namedgraph Aug 30, 2026
1d79c84
An empty block says so in its header as well as its body. The design …
namedgraph Aug 30, 2026
d986d4b
The two RDF/POST subject-control handlers move out of JavaScript into…
namedgraph Aug 30, 2026
e409c41
The DOMContentLoaded block retires: half of it was doing nothing, the…
namedgraph Aug 30, 2026
40b64c8
A press anywhere dismisses the drop-downs it is not inside, which clo…
namedgraph Aug 30, 2026
60ae436
The drop-down dismissal moves to where a modal is actually mounted, a…
namedgraph Aug 30, 2026
0320628
ac:uuid() generates through the platform, and the seven call sites th…
namedgraph Aug 30, 2026
b617807
The query block's Chart/View strip becomes the design system's tab co…
namedgraph Aug 30, 2026
437a16e
Charts and views are both creatable from a query block now, and both …
namedgraph Aug 30, 2026
25ced7e
The row form is inserted with xsl:result-document rather than the DOM…
namedgraph Aug 30, 2026
1912d21
Two faults in the block-creation merge, both found by driving the cas…
namedgraph Aug 30, 2026
ab472f2
Editing a query into a different form now retypes it, and a rejected …
namedgraph Aug 30, 2026
f970956
The violation renderer goes back to failing on an absent form, becaus…
namedgraph Aug 30, 2026
ef5125f
The map info window pans itself into view, so the view controls no lo…
namedgraph Aug 30, 2026
c1e7a28
The marker info window is fitted into the map viewport itself, replac…
namedgraph Aug 30, 2026
4995785
The parallax glyph sits on the same line as the first pivot chip. Bot…
namedgraph Aug 30, 2026
54243b3
Marker clicks pan the map again, and one info window replaces another…
namedgraph Aug 30, 2026
17a2990
The hang in the previous commit was a wrong type on the pixel read. o…
namedgraph Aug 30, 2026
53838b9
[maven-release-plugin] prepare for next development iteration
namedgraph Aug 30, 2026
919f7f4
Set the CLI version to 5.10.1-SNAPSHOT
namedgraph Aug 30, 2026
1b839b3
Post-release version bump
namedgraph Aug 30, 2026
8a4ba99
Stop release.sh publishing before it knows the git half can finish
namedgraph Aug 30, 2026
127358d
Declare package ontologies as owl:imports instead of grafting them
namedgraph Aug 30, 2026
a307b74
Cover package ontology composition in the imports characterization test
namedgraph Aug 31, 2026
0a36174
Keep the server's render on the initial load
namedgraph Aug 31, 2026
7a60dce
The row form opens on its first required control whatever kind of con…
namedgraph Aug 31, 2026
d6f7c3a
The metadata merge keys on the RDF term, not the lexical form, so a t…
namedgraph Aug 31, 2026
527850d
Property lists order their values by the reader's language instead of…
namedgraph Aug 31, 2026
9a2a76e
Drop the Bootstrap 2 class vocabulary that no stylesheet backs, and g…
namedgraph Aug 31, 2026
efe5be0
Responses advertise that they vary by Accept-Language, so a rendering…
namedgraph Aug 31, 2026
6899378
Revert "Responses advertise that they vary by Accept-Language, so a r…
namedgraph Aug 31, 2026
3f75858
Predicate labels come from the application ontology on the server ren…
namedgraph Aug 31, 2026
ab141f4
Property values declare their own language instead of inheriting the …
namedgraph Sep 1, 2026
e47ac2f
Complete the Spanish translations, so the bundle covers every UI stri…
namedgraph Sep 1, 2026
a81788e
Supported UI languages are derived from the translation bundle instea…
namedgraph Sep 1, 2026
e6f95e8
The page reports the language it is written in, and Content-Language …
namedgraph Sep 1, 2026
bb7c8b5
Predicate labels declare their negotiated language, so they survive t…
namedgraph Sep 1, 2026
1904891
Move the language negotiation out of Application into its own utility.
namedgraph Sep 1, 2026
a2b136f
The writer reads the language off the response instead of negotiating…
namedgraph Sep 1, 2026
1969fe4
The document's lang attribute derives from the Content-Language it is…
namedgraph Sep 1, 2026
fcde58c
Document responses pass the accepted languages, so their entity tags …
namedgraph Sep 1, 2026
910ad0b
Only label the language of representations whose rendering depends on…
namedgraph Sep 1, 2026
fda1dd4
The language sort key comes from Web-Client, so there is one of it ra…
namedgraph Sep 2, 2026
2e4f36f
Drop ldt:lang, which nothing declares, reads or writes.
namedgraph Sep 2, 2026
2900a33
Cover the response filter's hypermedia, not only the language it labe…
namedgraph Sep 2, 2026
7cb82e7
Assert the language rules over HTTP, where the header and the documen…
namedgraph Sep 2, 2026
cfeffca
Don't use getter in constructor
namedgraph Sep 2, 2026
49482fe
Publish the shortest language tag the bundle justifies, not the key i…
namedgraph Sep 2, 2026
76851a3
Read the browser's languages through ac:langs(), so client.xsl declar…
namedgraph Sep 2, 2026
b1c2cb0
Merge rf-design-system into develop
namedgraph Sep 2, 2026
eea26fd
CHANGELOG update
namedgraph Sep 2, 2026
ed99116
Chain versioning commits per branch, since the Contents API locks the…
namedgraph Sep 2, 2026
149bc9c
Wait on the commit listing, since GitHub indexes it behind the file i…
namedgraph Sep 2, 2026
3aeaee2
A table cell's values stack apart, divided the way a property's value…
namedgraph Sep 2, 2026
96ecf5d
The CLI reaches a document's Memento roles, the TimeGate included.
namedgraph Sep 2, 2026
b63cd1e
The tests stop narrating themselves.
namedgraph Sep 2, 2026
6ced7d2
CHANGELOG update
namedgraph Sep 2, 2026
20b66cb
Web-Client bump
namedgraph Sep 2, 2026
991d252
An error page drops the action bar, which had nothing left to hold.
namedgraph Sep 2, 2026
54f955f
A language tag reads the same wherever a value is laid out.
namedgraph Sep 2, 2026
103f289
An injected view block's subject keeps the hash that makes it a fragm…
namedgraph Sep 2, 2026
ffbc225
A view block derived from the ontology keeps its URI across reloads.
namedgraph Sep 2, 2026
6003541
Merge branch 'master' into develop
namedgraph Sep 2, 2026
fcd529f
Merge branch 'develop' of github.com:AtomGraph/LinkedDataHub into dev…
namedgraph Sep 2, 2026
8ab9533
Preformatted prose sits on the code surface the rest of the system uses.
namedgraph Sep 2, 2026
11fe1bd
The property-list grid keys on the wrapped dt/dd shape, leaving prose…
namedgraph Sep 2, 2026
c2d0947
A drop-down opens into the side that has room for it, on both axes.
namedgraph Sep 2, 2026
34430e5
Packages are reachable from the CLI, not only from the settings modal.
namedgraph Sep 3, 2026
79588ee
The next release is 6.0.0, and the changelog catches up with what has…
namedgraph Sep 3, 2026
4b4e2b9
An oversized literal no longer crashes the transform it is a grouping…
namedgraph Sep 3, 2026
482d6ec
Authored markup survives the canonical form, so a tab group round-trips.
namedgraph Sep 3, 2026
69edd9a
Clicking out of an editor that was not edited exits it instead of sav…
namedgraph Sep 3, 2026
44f777c
The client adopts the SaxonJS 3 result-document methods, retiring the…
namedgraph Sep 3, 2026
1b5191f
Signup renders on both products, and constructor instantiation become…
namedgraph Sep 3, 2026
ab57740
Clicking the canvas between blocks moves the caret instead of leaving…
namedgraph Sep 3, 2026
178d70a
Seed authorizations drop the retired /add and /generate endpoints.
namedgraph Sep 4, 2026
7326cd8
Constraint violations decorate the affected fields instead of stackin…
namedgraph Sep 4, 2026
c3bab82
The last inline Copy URI button delegates to the shared ldh:CopyUriBu…
namedgraph Sep 4, 2026
bfc6024
Edit forms adopt the design system's whole-form mode: single-label ce…
namedgraph Sep 4, 2026
5c23110
The remaining legacy modals ride the ldhc-backdrop chrome, and the st…
namedgraph Sep 4, 2026
bc3c95a
Read-mode property lists reinstate the dl/dt/dd carriers: a resource …
namedgraph Sep 4, 2026
030174f
The ldh commands regroup by verb: create, add and remove make the sin…
namedgraph Sep 4, 2026
25a0e8f
put and post take an optional FILE argument and recognize the RDF syn…
namedgraph Sep 5, 2026
d1d3895
Entering an editor always leaves focus inside it, so clicking out exits.
namedgraph Sep 5, 2026
2fb9883
A collection of resources renders as ul/li, so the rows and cards of …
namedgraph Sep 6, 2026
bcf4943
The result-count badge and the first-time hero ride the design system…
namedgraph Sep 6, 2026
0308844
Every remaining Bootstrap alert adopts the design system's InlineAler…
namedgraph Sep 6, 2026
ae8e9a2
Block-loading progress rides the design system's ProgressBar anatomy:…
namedgraph Sep 6, 2026
497dada
The last hand-rolled typeahead lists become bs2:Lookup comboboxes, an…
namedgraph Sep 6, 2026
0348239
The retired .progress rule was also the loading shutter: its height/o…
namedgraph Sep 6, 2026
6484cdf
The loading bar steps up to the pbar's sm track: xs is half the weigh…
namedgraph Sep 6, 2026
70f18aa
Every remaining Bootstrap form row adopts the design system's prop-gr…
namedgraph Sep 6, 2026
8ccd3d8
The add-data items move into the Actions drop-down: acl:Append author…
namedgraph Sep 6, 2026
0ed7683
The XHTML editor opts out of the whole-form chrome that fits compact …
namedgraph Sep 6, 2026
aadd791
Seeding a modal's lookup mirrors the committed chip's edit button in …
namedgraph Sep 6, 2026
3fccec3
The read-mode prop grid carries its RDFa on the .value cell instead o…
namedgraph Sep 6, 2026
0f9f7fb
The chart and query blocks adopt the design system's block contracts,…
namedgraph Sep 7, 2026
ba6d2da
The search modal becomes the design's flush dialog: an icon-and-eyebr…
namedgraph Sep 7, 2026
6b616dc
The facet cluster adopts the design's FacetDropdown contract, and a r…
namedgraph Sep 7, 2026
b130f26
The stack makes its clean break from bs2: against Web-Client 6.0.0-SN…
namedgraph Sep 7, 2026
2715e07
LinkedDataHub re-resolves Web-Client's label catalog against the shel…
namedgraph Sep 7, 2026
189fd2a
Three mangled lines from the design-system sync (a duplicated selecto…
namedgraph Sep 8, 2026
a6e88b2
A component is emitted by exactly one template, and the type pill is …
namedgraph Sep 8, 2026
015bb02
The app layer rides Web-Client's new form-chrome emitters and adds it…
namedgraph Sep 8, 2026
6e55cbf
The overlay and notice chrome converges on shared emitters: every han…
namedgraph Sep 8, 2026
4d39459
The modal dialog becomes one shell: ldh:Modal takes size, icon/eyebro…
namedgraph Sep 8, 2026
3094841
Two bridge comments still narrated the retired bs2: mode names (the b…
namedgraph Sep 8, 2026
a7dc2be
The stylesheets stop name-dropping the retired framework: the bridge …
namedgraph Sep 8, 2026
d97dbd5
The nearest-.block lookup gains the [@about] guard wherever the handl…
namedgraph Sep 8, 2026
63b7d74
The empty state leaves the block header and lives in the body alone: …
namedgraph Sep 8, 2026
f1f8e60
The copy-URI button stops copying the object it renders instead of th…
namedgraph Sep 8, 2026
d11c9c7
The design system's consolidation lands (HANDOFF 13-16): app.css re-s…
namedgraph Sep 8, 2026
18a70a2
The Bootstrap vocabulary leaves the DOM contract: the generic dropdow…
namedgraph Sep 8, 2026
3eee5d2
The view toolbar lands the design's consolidation (HANDOFF 15): the l…
namedgraph Sep 8, 2026
233f872
The transitional bridge stylesheet retires: ldh-bridge.css merges int…
namedgraph Sep 8, 2026
64e27bb
The design system's §17-§26 handoff lands. The generic dropdown becom…
namedgraph Sep 8, 2026
8676d7d
The six bare div name tests the drawer's tree-row wrapper introduced …
namedgraph Sep 8, 2026
e6e218e
The drawer opens the way it always has: the mouse reaching the screen…
namedgraph Sep 8, 2026
44e3750
The xsd-typed blank-node literal control joins the shared control wid…
namedgraph Sep 8, 2026
3618161
LDH follows Web-Client's xhtml: narrowing: the shadows and dispatches…
namedgraph Sep 8, 2026
b07edd7
The drawer search is a typable field again: §19's honest search butto…
namedgraph Sep 8, 2026
d0d8a58
The HTTP tests catch up with the clean break, and the package contrac…
namedgraph Sep 8, 2026
df6c024
The generic bare form-field rule retires, and the two mistakes it was…
namedgraph Sep 9, 2026
7aeae6e
The combobox cluster comes home, and the prefix rule that should have…
namedgraph Sep 9, 2026
531c60e
The search modal drops its SPARQL · full-text eyebrow: the mechanism …
namedgraph Sep 9, 2026
22af961
The name audit reaches the seven templates the component sweeps misse…
namedgraph Sep 9, 2026
6cf9fb0
The typeahead vocabulary leaves the combobox's own layer: the Combobo…
namedgraph Sep 9, 2026
0f54f11
Grid mode opts out of the view results scrollport: three rules conspi…
namedgraph Sep 9, 2026
5ee1b86
Charts, maps and 3D graphs render on load again, and the Root select-…
namedgraph Sep 9, 2026
aaaca8f
The PATCH 422 echoes only the violating resources: #308's move to who…
namedgraph Sep 9, 2026
25da317
The block system takes the design system's anatomy, root and branch. …
namedgraph Sep 9, 2026
f78b362
The view block earns its design-system chrome, and a latent correlati…
namedgraph Sep 9, 2026
537b8f4
One header serves every block, and the drag handle moves into it. ac:…
namedgraph Sep 9, 2026
2ebbba4
The shell takes its AppShell anatomy, and every remaining inline disp…
namedgraph Sep 9, 2026
a77c476
Forms shed their state lies, riding the Web-Client shell's new anatom…
namedgraph Sep 9, 2026
972ccb1
The import graph becomes a tree with one shared trunk, answering the …
namedgraph Sep 9, 2026
6b1f83e
merge-rdfxml.xsl comes out of client/ and joins the shared trunk: the…
namedgraph Sep 9, 2026
6b3c15e
Not one ixsl token remains in the server-side closure - not even the …
namedgraph Sep 9, 2026
4668bde
XHTML content blocks shed their header, and instance timestamps leave…
namedgraph Sep 9, 2026
2083fae
The system suite joins the http-tests run: 19 committed auth-boundary…
namedgraph Sep 9, 2026
77902ec
Eight machine-detectable defects from the codebase evaluation's Java …
namedgraph Sep 9, 2026
ed76263
The block identity gets one resolver: the BlockRow/Block split keeps …
namedgraph Sep 9, 2026
37e404d
The Object block sheds its double header, and the content slot gets i…
namedgraph Sep 9, 2026
1624287
SSRF-harden the CSV/RDF import path (validate ldh:file + spin:query) …
namedgraph Sep 9, 2026
07954ed
Downgrade Jersey components to match Jersey version in Core
namedgraph Sep 9, 2026
ff5c1c5
Merge branch 'develop' of github.com:AtomGraph/LinkedDataHub into dev…
namedgraph Sep 9, 2026
fb29897
Fix PATCHed ldh:import not joining the ontology closure (stale app mo…
namedgraph Sep 10, 2026
d7fc5d0
Fix import-internal-url-400: the SSRF import test never reached the s…
namedgraph Sep 10, 2026
1b85081
Enable and repair the system/ http-tests (instrument for diagnosis, f…
namedgraph Sep 10, 2026
f62cc3b
The last Bootstrap 2 tokens leave the platform, and the ones that wer…
namedgraph Sep 10, 2026
5b491be
The content slot's chrome splits along the polarity the block header …
namedgraph Sep 10, 2026
77ae481
The core kit's vocabulary takes the design system's current prefix: 1…
namedgraph Sep 11, 2026
c886124
Grid mode caps its card images again. The rule that made a resource's…
namedgraph Sep 11, 2026
02a5cae
The vendored app kit catches up, and LDH's divergences retire into it…
namedgraph Sep 11, 2026
6299ed6
DataTable gets its table layout back, and the roles that patched arou…
namedgraph Sep 11, 2026
5166b51
The SPARQL results table stops being a second table component. .ldh-r…
namedgraph Sep 11, 2026
a10add2
The view block stops flickering on every page flip, and the client XS…
namedgraph Sep 11, 2026
5225bbe
The view mode switcher stops keeping the mode it left behind. When th…
namedgraph Sep 11, 2026
78b9ad7
ldh:css-token stops calling a method on a map. ixsl:style() does not …
namedgraph Sep 11, 2026
665ed34
The view mode dropdown stops being clipped by the block it opens in. …
namedgraph Sep 11, 2026
cee626b
Facet filtering on a language-tagged value stops matching nothing, an…
namedgraph Sep 11, 2026
23ce1af
The dialog dismiss button starts closing dialogs again. f62cc3b1e str…
namedgraph Sep 11, 2026
0895fb5
The view grid stops offering an edit pin on its cards. The card emitt…
namedgraph Sep 11, 2026
d72b7af
The SPARQL editor fills the code field it mounts into. The design's C…
namedgraph Sep 11, 2026
3305741
An ontology-defined view renders as the block it is, and the row that…
namedgraph Sep 11, 2026
d12c0fc
ldh:timemap stops depending on its Link entry being the last one.
namedgraph Sep 11, 2026
ffc28c0
DRY audit of top-level XSL params and accessor functions (#382)
namedgraph Sep 12, 2026
7e925cf
A create command can say what the document is about. (#384)
namedgraph Sep 12, 2026
45517cb
Package stylesheets reach the client: compose and compile a SEF per i…
namedgraph Sep 12, 2026
ccdc1a0
Playwright UI suite: the harness (#381)
namedgraph Sep 12, 2026
aec09b6
Concept tree: a heading, and rows that link into ReadMode
namedgraph Sep 12, 2026
89206f7
ldh:tree-node-uri takes an empty href, and the spec says what a row l…
namedgraph Sep 12, 2026
28ee741
Drop-downs fit the side they open on, not just pick it
namedgraph Sep 12, 2026
5860114
The sign-up page's seed content leaves Bootstrap behind
namedgraph Sep 12, 2026
e19015b
The SEF compiler's response is not proxied content, and is not capped
namedgraph Sep 12, 2026
cf0f152
The drop marker draws inside the row, where the next block cannot cov…
namedgraph Sep 13, 2026
4c03ae6
The annotation dialog pins the statement and tabs the rest, and an ob…
namedgraph Sep 13, 2026
2d5cae3
An HTTP error tells the reader what the status means, and the error b…
namedgraph Sep 13, 2026
5ab5156
Static files say what encoding they are written in, and a suite keeps…
namedgraph Sep 13, 2026
c7757f8
A guard that cannot be evaluated is a guard that silently says no.
namedgraph Sep 13, 2026
1b0ad60
The preflight asks the page which stylesheet it runs, instead of chec…
namedgraph Sep 13, 2026
3a796df
The object switch answers the arrow keys its role promises.
namedgraph Sep 13, 2026
cf05cd5
A page is hydrated when Saxon-JS says so, not when the shell happens …
namedgraph Sep 13, 2026
688a975
A document's markup asserts the graph the same URL serves.
namedgraph Sep 13, 2026
285ff4f
A code field opens at the height a query gets written in, not the hei…
namedgraph Sep 13, 2026
aa5986d
A dialog hosting a view is the height that view fills.
namedgraph Sep 13, 2026
b26dc0d
An edit opened by mistake closes the way it opened.
namedgraph Sep 13, 2026
033ad7e
A press outside a block leaves an untouched form the way Cancel does.
namedgraph Sep 14, 2026
10eb9d3
An XMLLiteral is serialized once, together with the div it is stored in.
namedgraph Sep 14, 2026
92383eb
A package hides a row, not a statement, and a stylesheet may say what…
namedgraph Sep 14, 2026
8b9ff76
An assertion that matches the first line of a response stops racing t…
namedgraph Sep 14, 2026
424e135
The vendored editor is a copy again, and the integration is four para…
namedgraph Sep 14, 2026
cc3795b
A dialog's form actions stay where the eye expects them.
namedgraph Sep 14, 2026
f418486
A form's footer is the form's, and a card's foot belongs to a card.
namedgraph Sep 14, 2026
b7e96e6
A module says what it is made of before it says what it does.
namedgraph Sep 14, 2026
6726439
The bundled package is named for what it does, and its stylesheet for…
namedgraph Sep 14, 2026
45bfd06
Semantic markup carries the design system's dress on the element itself.
namedgraph Sep 14, 2026
db17da3
An alert in prose is separated from the prose around it.
namedgraph Sep 14, 2026
40141c7
The changelog records the long-form layer and the alert spacing fix.
namedgraph Sep 14, 2026
9e2e04f
A view's control header stops crowding the rows it describes.
namedgraph Sep 14, 2026
fc479e8
The design system lays out by the width it actually has.
namedgraph Sep 14, 2026
a84b1c3
A dragged RDF file lands where it is aimed, and the page says where t…
namedgraph Sep 14, 2026
00a7b05
The responsive spec asserts against components that are actually there.
namedgraph Sep 14, 2026
5d9225d
A facet answers, a pivot chip clears, and a chart axis reads as labels.
namedgraph Sep 15, 2026
a4b7c9a
A SPARQL result set is a document again, on both renderers.
namedgraph Sep 15, 2026
b2d46cb
A grid of results stays inside the block that frames it.
namedgraph Sep 15, 2026
7f4be59
A layout spec measures pixels, not permissions.
namedgraph Sep 15, 2026
6d93a96
The suite says what access it needs instead of inheriting it.
namedgraph Sep 15, 2026
a15ee9b
A tree told nothing about its children stops walking, and says nothing.
namedgraph Sep 15, 2026
4b17206
Two specs stop claiming they are about ownership.
namedgraph Sep 15, 2026
31980d6
Two more skips say why they skip, and the line between the suites is …
namedgraph Sep 15, 2026
fe219e8
A block move rewrites the sequence of the document it was dragged in,…
namedgraph Sep 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
96 changes: 96 additions & 0 deletions .github/workflows/ui-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
name: UI-tests

# Separate from HTTP-tests rather than a second job in it. The two share a ~3.5 minute
# prelude (image build, CLI, certificates) out of a run that is mostly suite, and they pay
# it in parallel, so folding them together would serialise ~19 minutes to save ~4 of runner
# time. It would also couple a suite that snapshots and restores the whole dataset to one
# that owns the instance and reseeds it, and leave one red X to say which of the two broke.

on: push

jobs:
ui-tests:
name: Build Docker image and run the browser UI suite against it
runs-on: ubuntu-latest
env:
# As http-tests/run.sh exports them, so both suites can be pointed at one instance
END_USER_BASE_URL: https://localhost:4443/
ADMIN_BASE_URL: https://admin.localhost:4443/
steps:
- name: Set up Java 21
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '21'
- name: Checkout code
uses: actions/checkout@v7
- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: '22'
cache: npm
cache-dependency-path: ui-tests/package-lock.json
- name: Add bin/ and its subdirectories to PATH
run: |
find "$GITHUB_WORKSPACE/bin" -type d >> "$GITHUB_PATH"
- name: Build the ldh CLI
run: mvn -B package # the suite builds its fixtures with ldh, the way http-tests does
working-directory: cli
- name: Add the ldh launcher to PATH
run: echo "$GITHUB_WORKSPACE/cli/bin" >> "$GITHUB_PATH"
- name: Generating server certificate
run: |
server-cert-gen.sh .env nginx ssl
working-directory: http-tests
- name: Writing secrets to files
# All three, not just the owner's: the base compose file declares each of them as a
# secret, and `up` fails outright on a missing source file.
run: |
mkdir -p ./secrets
printf "%s" "${{ secrets.HTTP_TEST_OWNER_CERT_PASSWORD }}" > ./secrets/owner_cert_password.txt
printf "%s" "${{ secrets.HTTP_TEST_SECRETARY_CERT_PASSWORD }}" > ./secrets/secretary_cert_password.txt
printf "%s" "${{ secrets.HTTP_TEST_SECRETARY_CERT_PASSWORD }}" > ./secrets/client_truststore_password.txt
shell: bash
- name: Build Docker image & Run Docker containers
# No service list: the sef-compiler container has to be up, because importing a
# package recomposes the client SEF and the suite's taxonomy fixture imports one.
run: docker compose -f docker-compose.yml -f ./http-tests/docker-compose.http-tests.yml --env-file ./http-tests/.env up --build -d
- name: Wait for the server to start...
run: while ! (status=$(curl -k -s -w "%{http_code}\n" https://localhost:4443 -o /dev/null) && echo "$status" && echo "$status" | grep "403") ; do sleep 1 ; done # wait for the webapp to start (returns 403 by default)
- name: Fix certificate permissions on the host
# The entrypoint generates the keystore inside the mounted volume as root, and
# Playwright reads it as the runner user.
run: |
sudo chmod 644 ./ssl/owner/keystore.p12
working-directory: http-tests
- name: Install the Playwright runner and its browser
run: npm ci && npx playwright install --with-deps chromium
working-directory: ui-tests
- name: Run the UI test suite
run: npx playwright test
working-directory: ui-tests
env:
# The keystore the http-tests stack generates, rather than the repository root
# copy the dev loop uses. OWNER_CERT_PWD keeps the password out of a file the
# suite would have to be told about separately.
OWNER_CERT_KEYSTORE: ${{ github.workspace }}/http-tests/ssl/owner/keystore.p12
OWNER_CERT_PWD: ${{ secrets.HTTP_TEST_OWNER_CERT_PASSWORD }}
- name: Upload the HTML report and traces
if: always() && hashFiles('ui-tests/out/**', 'ui-tests/test-results/**') != ''
uses: actions/upload-artifact@v4
with:
name: ui-test-results
path: |
ui-tests/out/
ui-tests/test-results/
if-no-files-found: ignore
- name: Dump container logs on failure
if: failure()
run: docker compose --env-file ./http-tests/.env logs --no-color
- name: Dump Tomcat logs from linkeddatahub container on failure
if: failure()
run: docker compose --env-file ./http-tests/.env exec -T linkeddatahub sh -c 'for f in /usr/local/tomcat/logs/*; do echo "=== $f ==="; cat "$f"; done' || true
- name: Stop Docker containers and remove volumes
run: docker compose --env-file ./http-tests/.env down -v
- name: Remove Docker containers
run: docker compose --env-file ./http-tests/.env rm -f
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
/target
/.env
/uploads
/sef
/nb-configuration.xml
/node
/node_modules
Expand All @@ -16,3 +17,6 @@
/fuseki
.claude/scheduled_tasks.lock
/cli/target
/ui-tests/node_modules
/ui-tests/out
/ui-tests/test-results
103 changes: 103 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,106 @@
## [6.0.0]
Bootstrap 2 is gone, and with it the class vocabulary application stylesheets were written against. An app's `ac:stylesheet` points at its own XSLT, which imports the platform's `xsl/bootstrap/2.3.2/layout.xsl` — that import path is unchanged, and the `bs2:` modes it defines are all still there. An override that emits Bootstrap 2 markup therefore still compiles and still runs; it just emits classes no stylesheet backs any more, and renders unstyled with no diagnostic. Hence the major version: the failure gives no signal of its own.

### Migration
- Legacy Bootstrap buttons (`btn`, `btn-primary`, `btn-large`, …) become the `ac-btn` intent/appearance/size vocabulary — `ac-btn in-primary ap-solid sz-md`
- `$ac:langs` and `$ac:lang` stylesheet parameters become the `ac:langs()` and `ac:langs()[1]` functions; an `xsl:with-param` left behind is silently ignored rather than reported
- `pull-left` and `pull-right` have no replacement — the design system lays out with flex and grid
- Overrides depending on `bootstrap.js`, jQuery, WYMEditor or the sprite icon layer need rewriting: dropdowns and modals are driven by IXSL templates, icons by the `msi` font, and `rdf:XMLLiteral` editing by the RDFa editor
- Stylesheets extending the removed vocabulary can be diffed against `ldh-bridge.css`, which carries the primitives LDH still emits

### Added
- Design system port: the app shell (header, sidebar, footer), content blocks, action bar, breadcrumbs, mode lists, type badges, property lists, pager, modals and forms all render the design system's class vocabulary
- Vendored design system stylesheets and typefaces, with latin-ext subsets so Latin Extended-A no longer falls back mid-word
- A long-form typography layer binds headings, `code`/`samp`/`kbd`, `pre`, `dl`, `blockquote`, `hr` and tables to the design system on the element itself, so `rdf:XMLLiteral` content is dressed under the XHTML block and under the documentation site alike
- `ldh-bridge.css` carries the primitives LDH still emits, replacing the Web-Client Bootstrap stylesheet link
- `ac:langs()` returns the reader's accepted languages, normalised to deduped primary subtags with an `en` floor — one function, an SSR body reading the writer-supplied parameter and a SaxonJS body reading `navigator.languages`
- `ac:lang-rank()` ranks a value's language against that list, so property values sort by the reader's preference
- `Content-Language` on HTML responses, negotiated against the languages the UI translation bundle actually ships
- `Vary: Accept-Language` and language-sensitive entity tags on language-negotiated representations, so a shared cache cannot serve one reader's rendering to another
- Every rendered literal declares its own language: lang-tagged values carry their tag, untagged values carry `lang=""`, typed non-string values inherit
- Predicate labels, object links and table cells declare the language their label was chosen in, which may differ from the document's
- `http-tests/language/`: six scripts covering `Content-Language` by reader and by media type, `Vary`, per-language entity tags, `<html lang>` agreement and per-literal marking
- `ResponseHeadersFilterTest` covers the response filter's hypermedia — snapshot read-only modes, proxy suppression, the RFC 7089 relations and `Link` folding — alongside the language labelling
- `BundleLanguagesTest` covers deriving the supported languages from the translation bundle and the RFC 4647 matching behind it
- Spanish translations completed, so the bundle covers every UI string it claims to
- View table columns are sortable, keyed off each column's XSD datatype through `ldh:sort-key()`
- Facet toolbar, three-zone pager, chart controls grid, design-system list and grid modes
- Block drag-and-drop is payload-typed with an app MIME marker, with a single moving drop marker
- Copy-URI button reaches every block type through a context-free `ldh:CopyUriButton` mode
- Empty blocks and empty chart result sets say so through the design system's block-state component
- `ldh:date-time()`, `ldh:datatype-family()`, `ldh:css-token()` and `ldh:view-cache()` replace logic that had been written out at every call site
- Package ontologies are declared as `owl:imports` instead of grafted, with an imports characterization test
- `ldh packages list`, `ldh packages add` and `ldh packages remove` give the CLI the package management the settings modal has: the catalog read through the Linked Data proxy with the imported packages marked, and the `ldh:import` declaration written through `PATCH /settings`
- `ldh get` reaches a versioned document's RFC 7089 Memento roles through mutually exclusive `--timemap`, `--version <sha>` and `--timegate` options, the last taking a `--datetime` in RFC 1123 or ISO 8601 and printing the negotiated version's URI as its only output
- `ldh put` and `ldh post` take an optional `FILE` argument and recognize the RDF syntax from its extension (`ldh put "$LDH_BASE" root.ttl`); `-t/--content-type` stays required when reading stdin, which carries no name to go by

### Changed
- **BREAKING**: the bundled package is named for what it does rather than for the vocabulary it speaks: `https://packages.linkeddatahub.com/skos/#this` becomes `https://packages.linkeddatahub.com/editor/taxonomy/#this`, opening an `editor/` namespace for the editors that follow, and its stylesheet becomes `skos.xsl` — the package is the taxonomy editor, that module is the SKOS-specific part of it. An `ldh:import` naming the old URI resolves to nothing and renders the application without the package: re-declare it with the new one
- **BREAKING**: `ldh` commands regroup by verb, dropping the `bin/` directory mirror: the hyphenated leaves split into `create`, `add` and `remove` groups (`ldh create item`, `ldh add view`, `ldh remove block`), the `imports`, `content`, `admin acl` and `admin ontologies` groups dissolve into them (`ldh import rdf`, `ldh add object-block`, `ldh admin create group`, `ldh admin add class`), `import` carries the composite workflows — `rdf`, `csv` and `admin import ontology` — apart from the atomic `add rdf-import`/`add csv-import`, and `admin acl add-agent-to-group` shortens to `ldh admin add agent`; the script → command table in `cli/README.md` maps every name
- `<html lang>` is taken from the `Content-Language` the response carries, so the header and the document agree by construction rather than by two computations staying in step
- The language a page reports is the first accepted language the UI bundle has, not the reader's top preference — asking for German no longer puts `lang="de"` on a page written entirely in English
- Published language tags are the shortest the bundle justifies (`en`, not `en-US`), keeping a region subtag only where the bundle distinguishes two variants of one language
- Supported UI languages are derived from `translations.rdf` rather than declared beside it in `web.xml`
- Property lists and table cells order their values by the reader's language instead of hiding the ones that do not match, so a reader whose language the data lacks still sees every value
- Language negotiation moved out of `Application` into `LanguageNegotiator`
- Object metadata merges on the RDF term rather than the lexical form, so a tagged literal is no longer collapsed into an untagged twin
- Document responses pass the accepted languages into entity tag computation, so tags stop colliding across languages
- Legacy Bootstrap buttons move to the `ac-btn` intent/appearance/size vocabulary
- Block link columns route through the `ldh-drawer`; backlinks and copy-URI split into two placements chosen by what a click does
- Charts draw with resolved design tokens; the HTML Table chart is skinned in CSS and fills the block width
- Client-side HTTP moves to promise chains, retiring the legacy `ixsl:schedule-action` `http-request` form
- The busy cursor becomes a promise concern rather than 53 copies of the same `ixsl:set-style`
- Dropdown dismissal moves into IXSL, and the `DOMContentLoaded` block retires into an `ldh:CloseDropdown` mode
- Subject-control change handlers move from JavaScript into `ixsl:onchange` templates
- `ac:uuid()` generates through the platform, and the seven call sites that went around it stop doing so
- One navigation leaves one history entry
- CSR failures render through the design system's block states instead of `div.alert.alert-block`
- The RDFa editor's XMLLiteral canonicalization runs as a single `cm:canonical` pass in `ldh:FormPreSubmit`
- RDFa editor template names and modes move into their module namespaces
- Document-level map and graph modes fill the space between action bar and footer
- The map marker info window is the card itself, fitted into the map viewport and panning the least it can to reveal itself
- Editing forms already open on the page reconcile with the constructor after a constructor save
- The edit pencil on a resource description appears only under `acl:Write`
- `http-tests` assertions read captured responses from a here-string instead of piping `curl` into `grep -q`
- Web-Client dependency bumped to 5.0.4

### Removed
- Bootstrap 2: the framework stylesheets, `bootstrap.js`, jQuery, WYMEditor, the sprite icon layer and the `pull-left`/`pull-right` tokens
- The Bootstrap 2 class vocabulary that no stylesheet backed
- `$ac:langs` and `$ac:lang` parameters, replaced by `ac:langs()` and `ac:langs()[1]` at 36 call sites
- `ldt:lang`, which nothing declared, read or wrote
- `DEBUG:` output from `http-tests`, with the diagnostic-only `gh api` and `curl` calls and the helper that fed them

### Fixed
- `curl ... | grep -q` was a race under `pipefail`: `grep -q` closes the pipe on its first match and `curl` dies with 141, failing the pipeline even though the assertion passed
- View sort's numeric keys yield an empty sequence rather than `NaN` for non-numeric values
- `DataTransfer.types` marshals to an XDM array under SaxonJS, so payload guards compare via `array:flatten`
- The content-body drag-and-drop guards spell the child step `./div`, since after `and` a bare `div` parses as the division operator
- Reading an `ixsl:call` result of two numbers as an XDM array hung the renderer with no diagnostic; it arrives as a sequence of doubles
- Nested cards no longer draw doubled borders, and `dl` column placement is corrected
- The DataTable converters recognise the derived numeric and dateTime types
- An alert an author writes inside an XHTML content block keeps its prose spacing, instead of inheriting the flush margins the block-failure alert needs
- The violation renderer fails on an absent form again, rather than falling back to the rejected rendering
- Concurrent writes to a versioned application silently lost commits: the commit chain was keyed by file path, while the GitHub Contents API takes its optimistic lock on the branch head — two documents committing at once conflicted and the loser was dropped with only a log line. Commits to one branch now share a single chain
- A conflicting write is retried with a re-read blob SHA (`MAX_CONFLICT_RETRIES`) instead of being abandoned, so a writer outside this JVM no longer costs a version
- A rate-limited commit retried with an empty request body: the builder had already been spent by the first attempt, and `JsonObjectBuilder` yields its object only once
- `release.sh` published to Maven Central before its `git checkout master`, so a failed checkout left 5.10.0 on Central with no tag: the switches are now proven possible first, and once published the trap prints recovery steps instead of deleting the tag that records what was published
- `release.sh`'s clean check could not see `skip-worktree`/`assume-unchanged` files — git reports them as matching the index whatever is on disk, while a branch switch refuses to overwrite them; they are now warned about at startup and checked precisely before publishing
- `release.sh` derived the release and snapshot commits positionally (`git log -2`), which breaks as soon as anything else commits in between; they are derived from an anchor taken before `release:prepare`
- A drop-down flips to whichever side of its trigger has room, on both axes, so the action bar's left-zone menu no longer opens off the viewport edge
- The language tag renders as a pill wherever a value is laid out rather than only inside a property list, so a table cell's tag stops running into the value it annotates
- A view block derived from the ontology keeps its URI across reloads: the fragment is hashed from the host resource and the view instead of drawn from `ac:uuid()`, and a fragment scroll waits for the injected blocks to hydrate
- An injected view block's subject keeps the hash that makes it a fragment
- A `pre` in an `ldh:XHTML` block takes the recessed code surface the inline chip and error listing already share, instead of running on the bare page background
- The property-list grid keys on the wrapped `dt`/`dd` shape, leaving prose `dl`s to their own layout
- An error page renders without the action bar, which had nothing left to act on

### Security
- CSV/RDF imports now validate the `ldh:file` source and `spin:query` URIs via `URLValidator` before fetching, closing a previously unguarded SSRF surface on the import path (same class as LNK-002; the import client carries delegation/client-cert). Loopback stays allowed; `ALLOW_INTERNAL_URLS` remains the escape hatch

### Known limitations
- The in-place editor edits tab-group content but cannot create tab groups: while a region is edited every tab panel is shown stacked and editable, and the markup round-trips intact, but there is no gesture that inserts a new tab group — that markup is authored via the HTTP API (e.g. `ldh put`) for now

## [5.10.0] - 2026-08-30
### Added
- `ldh` command line interface (`cli/`): a standalone picocli/Jena port of the `bin/` HTTP API scripts — one command per script with the same option names, `bin/` subdirectories as nested subcommand groups, PKCS12 WebID keystore authentication, env-var defaults and a shaded executable jar
Expand Down
Loading
Loading