Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
184 commits
Select commit Hold shift + click to select a range
b3d5dd0
Port the content block to the design system's class vocabulary
namedgraph Aug 26, 2026
6b17fc9
Vendor the design system's CSS and fonts, link them after Bootstrap
namedgraph Aug 26, 2026
f732ebf
Port the app shell to the design system Header and Sidebar
namedgraph Aug 26, 2026
5269631
Route all block link columns through the ldh-drawer
namedgraph Aug 26, 2026
1a4f227
Port the action bar, mode lists, type badges, property lists and pager
namedgraph Aug 26, 2026
ffe76ea
Skin modals and RDF/POST forms with the design system via the bridge
namedgraph Aug 26, 2026
5bd46da
Drop the Bootstrap 2 framework stylesheets; purge its markup vocabulary
namedgraph Aug 26, 2026
818b181
Fix dl column placement, button-on-accent color, block stacking rhythm
namedgraph Aug 26, 2026
f3bae2f
Delete the Bootstrap 2 artifacts: framework CSS, bootstrap.js, jQuery…
namedgraph Aug 26, 2026
f7ef8f9
Rename LDH's app stylesheet out of its Bootstrap identity
namedgraph Aug 26, 2026
6127582
Quiet XHTML prose blocks; stop double-carding the CSR block wrapper
namedgraph Aug 26, 2026
2cf656f
Stick the action bar directly under the sticky header
namedgraph Aug 26, 2026
9833ada
Design-system breadcrumbs; restore the document action button order
namedgraph Aug 26, 2026
cd32a3b
Fix the doubled card borders: nested cards, orphaned ldh.css tokens, …
namedgraph Aug 26, 2026
47e3586
Replace the action-bar chrome with the design system's markup
namedgraph Aug 26, 2026
8ad8292
Retire the sprite-icon layer; design create-block buttons
namedgraph Aug 26, 2026
6be7dd9
One caret per dropdown: glyph-native carets replace the border triangle
namedgraph Aug 26, 2026
00861ca
Static carets become glyph spans; the ::before shim serves state togg…
namedgraph Aug 26, 2026
330d2c9
Float modals above the sticky chrome; close menus on pick
namedgraph Aug 26, 2026
e26ed81
Header dropdowns: readable ink, right alignment, avatar state
namedgraph Aug 26, 2026
512cc1c
Purge the dead pull-left/pull-right tokens
namedgraph Aug 26, 2026
54a9e05
Modal header: grid layout immune to the legacy child order
namedgraph Aug 26, 2026
67eee7a
Chart controls take the design's chart-controls grid
namedgraph Aug 26, 2026
fadb668
Audit P1: restore sprite-era button faces, title the constructor modal
namedgraph Aug 26, 2026
f1b3e9d
Reglyph the ldh:logo-faced buttons the sprite purge left blank
namedgraph Aug 26, 2026
50d40a1
Views grow the design's facet toolbar; the pull-* floats and stray En…
namedgraph Aug 26, 2026
05a08a5
RDF exports leave the Actions menu for their own icon dropdown
namedgraph Aug 26, 2026
f5741a4
Un-park the document tree flyout the ldh-sidebar class drove off-canvas
namedgraph Aug 26, 2026
a1dc3fa
Form footers shed their Bootstrap look - and the form-actions token w…
namedgraph Aug 26, 2026
9c39057
Every modal form closes from its footer, and modals span the content …
namedgraph Aug 26, 2026
41e958e
Footer takes the AppShell anatomy: brand column, bare links, legal strip
namedgraph Aug 26, 2026
c5ba77f
cors-static test follows bootstrap.css to its successor
namedgraph Aug 26, 2026
5a21afa
Document-level creation floats in a bottom-right dock, unified as + p…
namedgraph Aug 26, 2026
6fc687c
Give bare .tb buttons the quiet toolbar treatment
namedgraph Aug 26, 2026
f9795bf
Create dock parks above the footer; short pages pin the footer to the…
namedgraph Aug 27, 2026
2a7ebc4
Idiom/DRY sweep across the ported XSL, IXSL, CSS and JS
namedgraph Aug 27, 2026
7c90613
Content column stays full-width inside the pane flex stack
namedgraph Aug 27, 2026
c18bc55
Create bar right-aligns with the content blocks
namedgraph Aug 27, 2026
8dcff7e
Drop the Web-Client bootstrap.css link; ldh-bridge.css carries the pr…
namedgraph Aug 27, 2026
d38d17e
Breadcrumb zone and address bar left-align with the content column
namedgraph Aug 27, 2026
7ed2113
Tab switches show panes as flex, keeping the create bar parked above …
namedgraph Aug 27, 2026
a3ab072
Toolbar host inner div gets the content-body class its mount selector…
namedgraph Aug 27, 2026
ac63804
Editor toolbar follows the active tab; editor chrome hides on tabs wi…
namedgraph Aug 27, 2026
371f19b
Editor toolbar restyled on design tokens; its inner content-body left…
namedgraph Aug 27, 2026
31dd873
Sidebar class list renders as design rows; search input stops paintin…
namedgraph Aug 27, 2026
3945175
List view rows follow the design's ldh-list-block grid: icon chip, ti…
namedgraph Aug 27, 2026
a1c5acd
Charts draw with resolved design tokens via ldh:css-token(); the HTML…
namedgraph Aug 27, 2026
18b65cc
Primary and negative ldhc-btn buttons carry the ap-solid appearance c…
namedgraph Aug 27, 2026
bc990b8
Document edit modal renders its form in a block shell, sharing the in…
namedgraph Aug 27, 2026
1c946ce
Document-level graph mode fills the space between action bar and foot…
namedgraph Aug 27, 2026
2bf6577
Action bar height becomes a token so the editor bar's sticky offset s…
namedgraph Aug 27, 2026
163a927
Block head nested in the block body drops its side padding, aligning …
namedgraph Aug 27, 2026
6332f03
Read-mode property rows light up on hover as one continuous band, lik…
namedgraph Aug 27, 2026
3dfc587
View mode clicks read the mode class off the clicked item itself, sin…
namedgraph Aug 27, 2026
1200af0
Blocks stop clipping their dropdown menus: results scroll inside the …
namedgraph Aug 27, 2026
3155e37
Grid mode renders design-system cards: pastel media area, title and d…
namedgraph Aug 27, 2026
7d5bbf0
Map canvas stays in flow so the view toolbar survives map mode; absol…
namedgraph Aug 27, 2026
4294489
RDFa extractor entry becomes a named template only, so it stops inter…
namedgraph Aug 27, 2026
49e0fee
RDFa editor template names and modes move into the module namespaces:…
namedgraph Aug 27, 2026
aa7ed4d
Create dock yields the bottom strip to the RDFa editor's breadcrumb b…
namedgraph Aug 27, 2026
14b0650
Document-level map mode fills the space between action bar and footer…
namedgraph Aug 27, 2026
6d1d69a
Every view mode branch tunnels show-edit-button=false, so item templa…
namedgraph Aug 27, 2026
5129e1c
Facet popover states, anonymous RDF export, mock map retired, chart f…
namedgraph Aug 27, 2026
e28bf54
RDFa editor Source shows the region's children (the ol payload), the …
namedgraph Aug 27, 2026
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
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 CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,99 @@
## [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 `ldhc-btn` intent/appearance/size vocabulary — `ldhc-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
- `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

### Changed
- **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 `ldhc-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
- 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

### 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
20 changes: 14 additions & 6 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -148,15 +148,16 @@ The SPARQL endpoint forwarding chain ensures ContentMode blocks (charts, maps) q
## CLI Tools

`ldh` (in `cli/`) is the command line interface for the HTTP API — one command per `bin/` script,
same option names, `bin/` subdirectories as nested subcommand groups. Built with Maven on Java 21
same option names, grouped by verb (`create`, `add`, `remove`, `import`) plus the `packages`
family and the `admin` scope. Built with Maven on Java 21
into a shaded `cli/target/ldh.jar` that `cli/bin/ldh` launches. See `cli/README.md` for the full
script → command table and the behavioral differences from the scripts.

```bash
cd cli && mvn package && export PATH="$PWD/bin:$PATH"

ldh create-container --parent "$LDH_BASE" --title "Some" --slug some
ldh admin acl add-agent-to-group --agent "$AGENT_URI" "${ADMIN_BASE}acl/groups/writers/"
ldh create container --parent "$LDH_BASE" --title "Some" --slug some
ldh admin add agent --agent "$AGENT_URI" "${ADMIN_BASE}acl/groups/writers/"
```

`cli/` is not a module of the platform reactor (the root pom is the webapp artifact, so it cannot
Expand All @@ -165,11 +166,18 @@ around both release bumps, and `make cli-version` re-aligns it if it drifts.

`LDH_CERT_FILE`, `LDH_CERT_PASSWORD`, `LDH_BASE` and `LDH_PROXY` supply defaults for `-f`, `-p`,
`-b` and `--proxy`. Commands that create or append to a document print its URL as the only line on
stdout (diagnostics go to stderr), so `item=$(ldh create-item ...)` works; exit codes are `0`
stdout (diagnostics go to stderr), so `item=$(ldh create item ...)` works; exit codes are `0`
success, `1` HTTP or runtime failure, `2` usage error.

Packages have no command — an application imports one with a single `<app> ldh:import <package>`
triple, so `ldh patch` on the application's `settings` document is the whole interface.
Packages are declarative: an application imports one with a single `<app> ldh:import <package>`
triple in its settings, and `ldh packages list`, `ldh packages add` and
`ldh packages remove` write that triple through `PATCH /settings`. `packages list` reads the
registry catalog through the Linked Data proxy, marking the imported ones.

`ldh get` also addresses the RFC 7089 Memento roles of a versioned document, as mutually exclusive
options: `--timemap` (version history), `--version <sha>` (a historical version) and `--timegate`
with an optional `--datetime` (RFC 1123 or ISO 8601), which prints the selected version's URI as the
only line on stdout so it pipes into another `ldh get`.

The `bin/` HTTP API scripts are **deprecated** — `ldh` replaces them, and http-tests build their
fixtures with it. Authentication moves from the `.pem` the scripts feed `curl -E` to the PKCS12
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -297,11 +297,11 @@ export LDH_CERT_FILE=./ssl/owner/keystore.p12
export LDH_CERT_PASSWORD=$(cat secrets/owner_cert_password.txt)
export LDH_BASE=https://localhost:4443/

ldh create-container --parent "$LDH_BASE" --title "Concepts" --slug concepts
ldh create-item --container "${LDH_BASE}concepts/" --title "Example" --slug example
ldh create container --parent "$LDH_BASE" --title "Concepts" --slug concepts
ldh create item --container "${LDH_BASE}concepts/" --title "Example" --slug example
```

Commands that create or append to a document print its URL as the only line on stdout, so they compose in shell pipelines: `item=$(ldh create-item ...)`. The `bin/` subdirectories became nested subcommand groups — `ldh admin acl create-group`, `ldh content add-xhtml-block`, `ldh imports import-csv`. See [`cli/README.md`](https://github.com/AtomGraph/LinkedDataHub/blob/master/cli/README.md) for the full command table and the differences from the scripts.
Commands that create or append to a document print its URL as the only line on stdout, so they compose in shell pipelines: `item=$(ldh create item ...)`. Commands group by verb — `ldh create container`, `ldh add xhtml-block`, `ldh import csv`, `ldh admin create group` — with `import` holding the workflows that compose the atomic commands. See [`cli/README.md`](https://github.com/AtomGraph/LinkedDataHub/blob/master/cli/README.md) for the full command table and the differences from the scripts.

_:warning: The `bin/` HTTP API scripts that `ldh` replaces are **deprecated**. The certificate and WebID tooling (`webid-keygen.sh`, `webid-keygen-pem.sh`, `webid-uri.sh`, `webid-modulus.sh`, `server-cert-gen.sh`) talks to no API and stays in `bin/`._

Expand Down
Loading
Loading