Develop - #373
Draft
namedgraph wants to merge 224 commits into
Draft
Conversation
Blocks now carry the classes ui_kits/app/app.css targets, replacing the Bootstrap grid ones: row-fluid block -> block ldh-block main span7 -> main ldh-block-body well -> ldh-block-head 'block' and 'main' stay alongside the new names: 62 and 11 CSR handler patterns anchor on those tokens, so dropping them would unhook drag-drop, inline editing and the block toolbars. The header gains the two flex children app.css expects - a titles group (type list as badge, h2.ttl, description as span.sub instead of a <p>) and an .actions group holding the timestamp and actions. bs2:Left and bs2:Right emitted reserved grid columns for backlinks, related resources and parallax navigation. The design system has no columns; that content belongs to a block-scoped drawer, so they now render inside div.ldh-drawer. They stay unconditional because CSR fills them later. Two CSR call sites had to follow the markup: - view.xsl took the nav placeholders with a child step, which the drawer wrapper broke - faceted search would have lost its facets and parallax its controls, silently, since an empty for-each is not an error. - chart.xsl and query.xsl lift the header out before replacing block content via ./div/div[@Class = 'well'], declared as="element()", so the rename would have been a runtime type error rather than a silent miss. Still to port: bs2:Left/bs2:Right internals to the drawer's own structure, the drawer's open/close behaviour, bs2:Actions buttons to .tb, the YouTube header's inner markup, and dropping app.css itself in - without which this renders unstyled. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
colors_and_type.css (tokens), app.css (components), retro.css (m3 skin) copied from the design system export; fonts.css @font-faces the vendored woff2s - Geist, Geist Mono, Instrument Serif (latin subsets) and the Material Symbols Rounded variable icon font - so no external font requests. The root element takes data-retro="m3" data-theme="light", which the skin keys on. Linked after the Bootstrap stylesheets so the design system wins where both target the same elements; the Bootstrap links come out at the end of the port. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
bs2:NavBar becomes the ldh-header grid (wordmark | address | actions), replacing the Bootstrap fixed-top collapse structure; NavBarLeft/Main/ Right and their span columns go. The brand takes the wordmark shape, the address bar the ldh-address skin (same form, 'navbar-form' token and input#uri kept for the CSR submit handler), and the right side becomes ldh-icon-btn buttons with Material Symbols glyphs - apps grid, settings gear, notification bell (admin) - plus an initials ldh-avatar for the agent. btn-group/dropdown-toggle tokens stay: the CSR handler toggles .open on them. ldh:LeftSidebar takes the ldh-sidebar skin: sb-search field, sb-section/ sb-heading groups, sb-tree rows with Material carets. The flyout mechanics are untouched - hidden by default, edge-hover shows, mouseout hides - and document-tree/class-list/btn-expand-tree/btn-geo/btn-latest anchors stay for the CSR handlers. ldh-bridge.css is the deliberate shim between CSR state tokens and the design system: dropdown .open menus, ul.nav strips, the tab bar, tree rows and the expand/collapse carets, styled with the system's tokens. Rules leave this file as components finish porting. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The generic bs2:Row got the drawer in the shell port, but two more block templates - the ldh:XHTML content block and the edit-form row - still applied bs2:Left/bs2:Right in-flow, so their backlinks headings rendered inside the block body. The drawer markup is extracted into the ldh:BlockLinksDrawer named template (dh title + close, db holding bs2:Left/bs2:Right) and all three block shapes call it; bs2:Left/Right defaults become drawer groups (left-nav/right-nav dgroup) and the backlinks well becomes a dgroup with its nav-header kept for the CSR load-on-click handler. The header actions gain the tb-links trigger for @Rdf:about resources; CSR handlers in block.xsl open the drawer (display flex) and close it from its dh button. bs2:Actions loses the Bootstrap button faces: btn-copy-uri and btn-edit become .tb toolbar icons (content_copy, edit) with their handler tokens kept. Verified in the browser: 14 drawers on the dev root document, all hidden; clicking tb-links opens the block's drawer with hydrated facet/backlinks content, its close button hides it again. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
bs2:ActionBar becomes the zoned ldh-actionbar grid (add | breadcrumb+ timestamp | actions), dropping its container/row/span wrappers. The Create/Add cluster sits in ldh-add-wrap, breadcrumbs take the classic ldh-bc skin on the same CSR-built ul, and doc-controls becomes the quiet mono ldh-ab-ts stamp (History link unchanged). The right-side document actions lose their sprite-logo faces: delete, save-as, access and edit are .tb icon buttons with Material glyphs and their identity tokens (btn-delete, btn-save-as, btn-acl btn-access-form, btn-edit) plus disabled state written explicitly. Export and the layout mode switcher stay dropdowns but with .tb trigger faces; mode glyphs come from the new $ldh:mode-icons map shared by the switcher button and the bs2:ModeListItem entries. bs2:TypeList becomes the badge strip (ldh-typelist), facet headers move from nav-header btn to the drawer's dh2 look, and the bridge styles the read-mode dl/dt/dd as design-system property rows and ul.pager - whose exact-class markup the CSR paging handlers match on - as prev/next buttons. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Modals: the CSR appends div.modal.fade.in and removes it on close, so the bridge styles those tokens as the ldh-modal card - centered fixed panel, radius/shadow, mhead-style header with close, scrolling body, footer bar shared with .form-actions. No modal.xsl template changes. Forms: control-group/control-label/controls stay (they are CSR anchors for constraint violations and constructor rows) and become a two-column property grid with explicit cell placement - RDF/POST hidden inputs and <hr> separators are also direct children of .control-group and were silently taking the first grid cell, pushing every label off its row. Inputs, textareas and selects get the field skin with the focus ring; type hints (.help-inline) read quiet and turn danger only inside .error groups; submit buttons take the accent skin. Verified in the browser: the document edit modal renders the two-column statement layout with working focus states and footer actions. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
static/css/bootstrap.css and bootstrap-responsive.css are no longer linked. ldh-bridge.css replaces the primitives LDH still emits - .btn faces, carets, badges, alerts, progress bars, tables, typeahead menus - at :where() zero specificity so design-system component classes always win. The two remaining bootstrap.css links are app-specific rule files (Web-Client's and LDH's own) that keep the historical name only. Bootstrap-only vocabulary dies per the census of what the CSR actually anchors on: - purged outright (no anchors): span2-span10, offset*, well/well-small, sidebar-nav, nav-list, input-*, form-search, input-append, btn-small, btn-large, inline, table-striped/bordered, progress-striped, pull-* trimmed where flex replaced floats - renamed on both sides, emission and contains-token anchors together: span12 -> row-main, row-fluid -> block-row, form-horizontal -> ldh-prop-form, alert alert-error -> ldhc-alert va-danger, container-fluid folded into content-body - kept, still meaningful as CSR anchors: block, main, control-group/ control-label/controls, progress/bar/active, dropdown/btn-group/open, modal family, navbar/navbar-form, breadcrumb, pager/previous/next, tab-pane/tab-content, nav-header, search-form/search-query - btn-danger remove buttons become ldhc-btn in-negative, keeping their remove-action/link-remove handler tokens The footer takes the design system's cols/ftitle shape, and the content body gets its stacking rhythm and max-width from the bridge now that Bootstrap's row margins are gone. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A dt followed by several dds dropped the extra dds into the term column under grid auto-placement; dt/dd now take explicit columns. .btn-primary picks up a link-colored text rule somewhere upstream, which vanishes on the accent fill - one real-specificity color rule pins it to --fg-on-accent. Content column takes a 1280px measure and the block cards get their stacking margins back (Bootstrap's row margins are gone). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…, WYMEditor static/css/bootstrap.css and bootstrap.min.css (the 2.3.2 framework files) are deleted - nothing links them since the framework drop. The script chain loses static/js/bootstrap.js and jquery.min.js: dropdowns, modals and tabs have been IXSL-driven for years, and the only jQuery left in LDH code was the RDF/POST subject-type/value glue. js/jquery.js becomes js/functions.js with the IXSL contract intact - fetchDispatchXML, onSubjectTypeChange, onSubjectValueChange and ixslTemplateListener keep their names and behaviour (the two subject handlers rewritten from jQuery to plain DOM). The Bootstrap-layout pieces of its ready block die with the markup they served (btn-navbar collapse, $().dropdown fallback); outside-click dropdown close and the typeahead autocomplete-off live on as vanilla listeners. The WYMEditor bundle (2.2MB, jQuery-based) goes too - replaced by the RDFa editor in 5.7.0, nothing references it. Verified in the browser: no jQuery-undefined errors, Export dropdown opens via IXSL and closes on outside click, the edit modal renders. The one remaining console 404 is the dev dataset's own broken test object (?uri=https://example.org/aaa), not a regression. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
com/atomgraph/linkeddatahub/css/bootstrap.css never was the framework - it holds LDH's own application rules that accumulated under the historical name. It becomes ldh.css, minus the ten rules whose selector tokens no longer occur in any LDH or Web-Client markup (old breadcrumb logos, action-bar span layout, btn-ban/btn-context, dead sidebar list skins). Web-Client's bootstrap.css stays linked: it styles Web-Client-emitted markup and lives in that repo. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two things made the page read as a wall of anonymous white cards rather than the design: - The SaxonJS bs2:Row wrapper carried the ldh-block card skin AND passed it to its next-match inner block, so every CSR-wrapped block rendered card-in-card - visible as sliver borders around alerts and empty- looking bars. The wrapper keeps only the 'block' anchor token now; the inner block is the card. - ldh:XHTML content blocks are prose, and the design renders prose as quiet blocks (no surface, part of the page flow). Their class default becomes 'block ldh-block is-quiet', which app.css already styles. The [Language: en] chip in the reported screenshot does not reproduce in a fresh Chromium or Firefox - it is the stale-SEF browser cache (/static/ is served immutable); a hard reload clears it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The legacy .action-bar rule pins it at --action-bar-top with a 51px fallback - the old Bootstrap navbar height - while the new ldh-header is 56px tall and was not sticky at all, so on scroll the header left the viewport and content showed through a 51px gap above the stuck action bar. The header is now sticky at top 0 and --action-bar-top is defined as the header height, so the two form one pinned chrome stack; #tab-bar's legacy 51px offset follows the same variable. The action bar trades the legacy gray fill for the surface color with a bottom hairline. Verified scrolled 1200px down: header spans 0-56, action bar starts at exactly 56, content scrolls beneath both. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The breadcrumb items were still li > sprite-classed anchor + divider. bs2:BreadCrumbListItem now emits the design's crumb anatomy - a.crumb (is-current on the leaf) holding a Material glyph chosen by document type (folder for Root/Container, description for Item, link otherwise) plus the label, with span.sep between crumbs - inside the same ul both render paths share; the CSR-created ul takes the ldh-breadcrumb classes. The crumb builds its own <a> with the imports/default.xsl href recipe rather than overriding the generic xhtml:Anchor mode, which would have re-defaulted every anchor's href away from ldh:href(). The action-bar port had also silently reversed the document buttons: the old markup floated each one right, so DOM order delete->edit read on screen as edit->delete, and the flex container preserved DOM order instead. The DOM now matches the screen order the floats produced: edit, access, save-as, delete, then export and the mode switcher. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…alert blocks The container block's double bottom border had three contributors, found by DOM forensics rather than guesswork: - CSR hydration re-renders a row as a full ldh-block card inside the SSR wrapper card, stacking two borders 13px apart. One card layer only now: a nested .ldh-block flattens (no border/shadow/radius/surface). - The token rename swept the XSLT but not ldh.css, orphaning its row-fluid/span12/form-horizontal/input-append selectors - drag-handle hiding, block clipping, drag-over and diff borders, the progress-bar sizing that kept the loading skeleton invisible after errors, and the search-field flex. All follow the rename (block/block-row/row-main/ ldh-prop-form); the dead action-bar span rule is deleted. - A block whose content collapsed to a single error alert kept its card chrome, framing the alert with white lips. Such blocks go quiet via :has() - the alert brings its own surface - and alerts lose their stray margins inside blocks. The m3 skin's resting M3-elevation shadow, which reads as a hard line under every card, rests flat per the design's card preview (border instead; hover unchanged), and the bridge table rule no longer draws a separator under the last row. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The bar's controls were still Bootstrap skeletons (btn-group + ul.dropdown-menu) under bridge CSS. They now emit the design system's own structures, as divs per house style: - Create: ldh-add-wrap > ldh-btn (add glyph + label + caret) + ldh-add-menu with .it entries; bs2:ConstructorListItem renders the design item shape (ico/body/lbl, folder for Container, description for Item) while keeping the add-constructor/data-for-class/ data-create-graph contract. Both end-user and admin variants. - Add: ldh-of-wrap > ghost ldh-btn + ldh-of-menu, generate-containers / import-ontology tokens kept. - Document actions collapse into the design's single Actions menu (bolt + label + caret): Edit / Access / Save as, a divider, the three RDF export links (target=_blank keeps them outside CSR interception), a divider, and a danger-styled Delete - handler tokens and disabled states preserved. bs2:MediaTypeList dies with its dead export-rdf interception exemption; its links live in the menu now. - Mode switcher: ldh-mode > label-row trigger (glyph + active-mode label + caret) + modes-pop with .mi entries as anchors, mode-class and active tokens kept alongside is-active. - Breadcrumbs switch to the pills variant: bc-pill chips with chevron separators in a div container on both render paths. - The timestamp gains the schedule glyph; the address bar shows the document URI on SSR and always mirrors it on navigation (previously blanked for local documents - the design's Header shows the URL). All design menus open through the existing CSR btn-group 'open' toggle; the bridge maps that state onto ldh-add-menu/ldh-of-menu/modes-pop visibility and exempts the address field from the form-field skin. Verified in the browser before the stack was stopped externally: Create pill, Actions menu with dividers and danger Delete, pill breadcrumb, labeled Content switcher all render and open; the address-bar change compiles but its browser check is pending the stack's return. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The XHTML/Object create-block buttons were the last old-school controls: Bootstrap primary pills with sprite faces. They are ghost ldh-btns now, with Material glyphs (notes / data_object) and their create-action / add-constructor / data-for-class contract intact. The sprite system itself goes: all 73 background-image rules pointing at the icons/ directory are deleted from ldh.css and the directory itself is removed - every ported control renders Material Symbols instead. The ldh:logo templates stay purely as class-token carriers for the CSR handlers that anchor on them; with the sprite CSS gone they paint nothing. The one non-CSS consumer, the signup-complete <img>, becomes a check_circle glyph. Verified in the browser: the create-block buttons render as quiet design pills, and the address bar now shows the document URI (the CSR change from the previous commit, unverifiable then while the stack was down). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The bridge's Bootstrap-replacement .caret was a 0x0 border triangle, which collided with the ported markup's <span class="msi caret"> expand_more</span>: the triangle painted inside the button while the glyph text overflowed the zero-size box as a stray chevron below it. .caret is now a Material glyph in both generations - ported spans render their own expand_more, and legacy empty <span class="caret"/> spans (login dropdown, sort toggle, the drawer's backlinks heading) get the same glyph via ::before, with caret-reversed flipping to expand_less. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…les only Of the empty <span class="caret"/> leftovers, five were static dropdown carets - they now ship the expand_more glyph directly, like the rest of the ported markup. The two caret-reversed collapse indicators stay empty by design: the CSR handlers flip the caret-reversed class on them, and only ::before content can follow a class change on a ligature-font glyph. The bridge comment records that distinction. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The sticky action bar (z-index 999 from the legacy rules) painted over modal dialogs, hiding their header - the bridge had given modals z-index 110. Modals sit at 1050 now, above the whole chrome stack, with a non-interactive dim behind them via body:has(); typeahead suggestion menus move above the modal plane so in-form typeaheads keep working. Design menus (Create/Actions/modes) also stayed open after picking an item. The outside-click closer now also closes on menu-item picks, deferred a tick so it settles after the IXSL btn-group toggle that handles the same click - otherwise the two could race and re-open the menu. Verified in the browser: Create > Container opens the modal above the chrome with the page dimmed behind it, and the Create menu is closed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The m3 skin paints every .ldh-header descendant with the inverse near- white text color for the dark bar - correct for the bar itself, but the light dropdown panels inside it (Applications, Settings, agent) rendered white-on-white and read as empty. Panel content takes the regular ink back at higher specificity, section headers keep the hint color, and the avatar's initials stay dark in its hover/open state where the fill goes light. Settings had no pull-right token, so its menu left-aligned and clipped off the viewport; header menus now hug the right edge regardless. Menu picks also close these header menus via the same deferred closer as the action-bar menus. Verified in the browser: all three menus open readable and right- aligned - System apps list, Application/Administration/Namespace ontology, and the agent entry. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Census: zero CSR anchors on pull-*, and floats are inert inside flex containers and on absolutely positioned elements - so every pull token whose parent already became flex chrome (header action strips, block head actions, alerts, dropdown toggles) or that rode an absolute menu was doing nothing. Those 14 are gone; the Actions wrapper layout keys on its position in .actions instead of the token. What stays, deliberately: pull-right on ul.dropdown-menu as the alignment signal for the not-yet-ported menus, and the still-active floats in interior form markup (btn-remove-property/btn-add rows, typeahead metadata, the hover-overlay edit buttons) - those go when their components get ported, and the bridge documents exactly that. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The legacy modal markup puts button.close FIRST and titles the dialog with a <legend>; the bridge's flex header laid children out in DOM order - close at the left, the title squeezed into a wrapping column, the description eating the rest. The header is a two-column grid now: the title column (legend/h2/h3 styled as the design's mhead title, any <p> as a muted subtitle under it) and the close button pinned top-right, regardless of source order. Verified on the Request access modal: title left, description under it, close at the right - matching the design's mhead anatomy. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Both bs2:Chart forms (the RDF and SPARQL-results variants, which the CSR re-render also compiles in) swap their fieldset block-row for the design system's chart-controls three-column grid with .field cells - mono uppercase overline labels, full-width selects, the series multi-select as a listbox. Select classes/ids (chart-type / chart-category / chart-series, name=ou|ol) are untouched, so the onchange handlers and the RDF/POST encoding are unaffected. Fieldsets and legends lose their Bootstrap-era box look globally: borderless sections with overline legends, which also fixes the old-school group boxes in the access modal. Multi-selects inside the controls grid keep their natural height. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Full-DOM audit (Playwright crawl of every menu, modal, form and mode against the design-system contracts) surfaced the components that lost their faces when the sprite CSS died, plus one real regression risk: - The constructor modal had an empty <legend> - it is titled with the class label now (ac:object-label in xsl:try; the bare call throws and killed the whole modal render, which the first fix attempt proved the hard way. The catch falls back to the URI local name.) - Remove-statement and remove-resource buttons were empty invisible boxes in every editing form: .tb buttons with the close glyph now, in all three emitters (constructor.xsl - with the xsl:attribute reordered before the glyph span, imports/default.xsl, resource.xsl), handler tokens kept - The search modal's submit button was invisible: search glyph - Add-statement button swaps the HTML entity cross for the add glyph - Graph HUD buttons gain fit_screen / fullscreen glyphs per OtherModes - Dead tokens purged: wymupdate, dl-horizontal, the sprite-era class injection on block-title anchors Verified in the browser: Create > Container opens titled with glyphed remove buttons (4/4); the per-block edit button opens the inline editing form with glyphed controls and footer actions. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A faceless-button DOM sweep (every button with no text, glyph or image, across edit mode, the create modal and the inline block edit form) caught the emitters whose only face was a sprite class injected via the ldh:logo mode: the subject-edit toggle in form legends (edit glyph), the add-value button on property controls (add glyph) and the rdf:type control group's remove button in imports/rdf.xsl, which now matches the canonical tb btn-remove-property + close-glyph shape. Dead sprite background-position rules and the border-triangle caret-reversed rule (the double-arrow bug's last holdout) leave ldh.css. Re-swept after deploying: no faceless buttons remain. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…glish go with it The facets answer to 'where did the filters go': out of the links drawer, into a ldh-view-toolbar at the top of every view block, per the ViewBlocks contract. Left zone: filter_alt lead + one dropdown pill per facetable property - the pill is the old nav-header (button-shaped, same hidden subject/predicate/object inputs), so the lazy value-load onclick and the checkbox filter onchange run unchanged; the hydrated ul.nav now doubles as the facet-pop popover card. Right zone: the inline-create button, Total results, the order-by select + direction button, and the mode dropdown (with a visible active-mode glyph from ldh:mode-icons). The drawer group the facets vacated hides when empty; parallax stays in the drawer. Verified in the browser: pill opens, values load with counts, checking a value filters the results. The last pull-left/pull-right tokens are purged along the way - header menus right-align via a header-scoped rule, the form legend is restructured (label first, subject controls in a right-hugging .actions cluster, remove button last), remove/add groups trail their form rows via flex order, the language badge follows its value, and the typeahead metadata span is .meta. The bridge float shims are deleted. Branch-introduced English strings move to translations.rdf (add-stmt, remove-resource, remove-link, get-started, learn-more, footer titles and links, export format names); the facet lead reuses filter-title. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The three serialization links (RDF/XML, Turtle, JSON-LD) move out of the Actions menu into a new bs2:ExportList mode that bs2:ActionBarRight renders after the mode switcher: an icon-only ghost button (download glyph, titled from the existing export translation entry) opening the same target=_blank links. Same signed-in guard and HTTP-error suppression as before, same ldh-of-wrap anatomy, so the open-toggle and close-on-pick wiring covers it unchanged. The Actions menu keeps edit / access / save-as / delete, minus the now-stray second divider. Verified in the browser: the button renders right of Content, its menu lists the three formats with the correct accept hrefs, and the Actions menu no longer carries them. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The edge-hover flyout stopped appearing: the port stamped the sidebar with the design's ldh-sidebar class, whose resting state is translateX(-100%) waiting for an is-open toggle - but the CSR handlers carry show/hide as inline display (mouse at x=0 sets block, mouseout sets none). The handler fired, display flipped, and the panel stayed 288px off-screen. The bridge now neutralizes the slide transform so display alone controls visibility, and starts the panel below the sticky header instead of the design's full-height top:0. Verified in the browser: mouse at the left edge slides out the panel (search, document tree, class pills, other views) at x:0 under the header; mousing out hides it again. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ith it Every form footer (modal and inline) now follows the design's footer anatomy: secondaries (Cancel/Reset/Close) are ghost ldh-btns, the primary (Save/Compare/Allow/Annotate) is a filled ldh-btn with a glyph, and it sits last so the ghost buttons lead into it. Handler tokens (btn-save, btn-cancel, btn-reset, btn-close, btn-save-chart, spo-action, cancel-action) ride along unchanged, as do the two $button-class param defaults that feed the ldh:logo class injection. The Bootstrap-era form-actions class itself is gone: the design system has no such band (its ldh-form-actions-* names mean the per-form actions dropdown), so the footers take the design's ldh-block-foot token - all emitters, the one CSR matcher that anchored on it, and the bridge rules renamed together. modal-footer stays as the sticky-scroll token, its hardcoded white swapped for the surface token. Also fixed en route: a stray quote in ldh:Form's save button class, and the access form's hardcoded Allow label now comes from a new translations entry. Verified in the browser: the create modal footer renders ghost Reset + filled glyphed Save on the ldh-block-foot band. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…column The rdf:RDF form shell gains a show-close-button param (default false, so the SSR EditMode page keeps its plain footer) emitting a ghost Close button ahead of Reset; the generic modal.xsl close handler already matches any button.btn-close inside a modal, so no new wiring. All six modal flows through the shell opt in: document create, document edit, add-instance, app settings, and both constraint-violation re-render paths. The three modal footers that already had a Close (import ontology, generate containers, request access) join the new convention: ghost Close and Reset leading into the ldh-btn primary. Also swept up: form-actions-class param values that still said 'form-actions' (the class-literal rename missed them), and modal.xsl's button-class defaults move off btn btn-primary. Modals now span the content column - width matches .content-body's inner width (max 1280px minus side padding) instead of the 880px cap. Verified in the browser: create modal footer reads Close / Reset / Save, inline form reads Cancel / Reset / Save, and the modal box is pixel-identical in x and width to the content blocks. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…izes POSTing into a collection, so the bs2:AddData templates gate on the Root document and containers and render their menu items inside the menu instead of a standalone Add button group. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…rows but not a full editing surface: rows hosting the editor drop the statement hover band (the grey slab repainted the entire content on hover), and the block's edit form suppresses the fieldset legend that echoed the URI fragment as a CONTENT header. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…the other direction: ldh:typeahead-resource-response replace-elements the whole combobox with the intact ldhc-cb-committed span (unwrapping it into the box stripped the scope element the edit handler anchors on, throwing a cardinality error on the pencil click), forwards data-for-class from the box so re-picking keeps the class scope, and the resource-not-found branch lands its raw-URI lookup in the document instead of discarding it. ldh:LoadTypeaheads callers pass the combobox roots. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…f the dd: an RDFa literal is its element's text content, and on the dd the layout whitespace around the cells polluted every literal and crashed the chart block's category extraction with a three-whitespace-string cardinality error; the text() consumers in chart.xsl and view.xsl gain [normalize-space()] so pretty-printed markup can never crash them again. Block progress functions stop reaching into nested blocks: hide/display target the nearest active row's first pbar only and only when that row belongs to the container's own block, and the object/query width loops take the block's first fill - an ontology-injected view nested in an ldh:Object embed carries chrome of its own, which drove the exactly-one ixsl:set-style cardinality crash. That nested chrome then retires altogether: ontology-injected views adopt the design system's nested-block well (div.block.ldh-nblock with data-depth from the enclosing block count) - the head shows the type and ac:label title, the body keeps the block-row[@typeof] > .main > bs2:PropertyList contract the view hydration matches on, and the drag handle, row edit button and per-block pbar disappear (inert, broken on the synthetic @about, and redundant under the host's joined bar, respectively). ldh:refresh-view goes shape-agnostic, the body h2 yields to the nblock head, and ldh-bridge.css admits .ldh-nblock into the facet-popover elevation and error-ring rules. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019qit5fTgfBTZpzhNEyaD8T
… and the vendored app.css catches up with the upstream .tb refactor. The chart shell drops its form/fieldset chrome: nothing in it ever submitted, so the controls, the canvas and the save foot become direct block-body children as ChartBlock draws them, the controls step down to sz-sm, the handlers re-anchor on the .chart-controls/.chart-canvas anatomy, and the results-driven re-render replace-elements the controls grid in place; the srx header's hidden categoryVarName input had no readers and retires with the form. The query block takes the QueryBlock anatomy: YASQE mounts inside the dark .ldh-sparql-pane (the bridge maps CodeMirror's .cm-* tokens onto the pane's .t-* palette), the bar carries the service combobox in the dns meta slot with Open and Save demoted to neutral outline beside the one primary Run, and the editor folds behind a tb-query toggle in the block head - the block runs its stored query on render, results first, through the ldh:RunQuery mode factored out of the submit handler because ixsl:event() is only in scope while an event is being handled (the chart tab's programmatic re-submit was quietly leaning on the click event; the reveal also has to yasqe.refresh(), since CodeMirror measured a hidden host). The stale select.input-query-service selectors - markup gone since the typeahead switch - are re-anchored where live (Open's endpoint silently always fell back to local) and dropped where dead. Both block heads follow the design's typed-block head: no TypeList badge, the kind rides the .sub slot when the block carries no description of its own, and .ttl anchors inherit the head's ink so a dereferenceable title stops reading as a raw link. app.css syncs to the design system's new unscoped .tb base, which retires the bridge's zero-specificity stand-in - its remove-button danger rules were already dead, those buttons having moved to ldhc-iconbtn. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019qit5fTgfBTZpzhNEyaD8T
…ow head, the query input as the full-bleed .ldh-search-field band (type=search with the native cancel decorations suppressed, which otherwise doubled the clear control), a btn-clear-query that empties both the input and the results it produced, and keyboard hints in the .mhint strip in place of a footer Close. The results region hosts the real view block - search results ARE a view, faceted, mode-switched and paged like any other - so .ldhc-modal-body.is-flush declares itself a flex column: its pinned and scrolling children were written with flex properties that are inert in a block container, and the whole body scrolled as one piece. The view toolbar's result count takes the ViewToolbar contract (span.count with the number in b, replacing the strong-plus-badge composite and the p.result-count carrier), and the remaining table.table consumers - version diff, the access lists, packages - move onto .ldh-results-table, the bridge's native-layout results sheet: per-row grid tracks cannot share intrinsic sizes across a variable column count, so it keeps table layout and takes the design's stated treatment instead (horizontal rules only, mono uppercase eyebrow head on the recessed surface, the same sheet chrome .ldh-mini-table carries so a view nested in a well reads as its own surface). .map-canvas returns to flow for OpenLayers - the design's absolute-fill is a picture of a map, and out of flow it left its parent zero-high and covered the viewport at document level - and the aurora skin clears its shadow from .ldh-block.is-quiet, so the no-chrome variant stops floating. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019qit5fTgfBTZpzhNEyaD8T
…endered type becomes the design's Tag wherever it lands. The facets stop needing a container of their own: the pills sit straight in the toolbar's .left cluster and the re-render guard becomes the presence of a pill rather than an id lookup, so the sub-container that only existed to be dissolved with display: contents goes away with its bridge rule. .faceted-nav and .nav-header retire in favour of .facet and .facet-pill (the parallax chips are already facet-pills but hang off a span, so no handler selector reaches them), the pill gains the .pred/.val anatomy with a selection summary - Any, the value's own label, or a count - and carries the selection as is-active and the open state as is-open, which is how the design signals it; the caret flip goes with that, and since facets were the only users of the empty-span caret-reversed convention its two ::before rules leave the bridge too. The popover becomes div.facet-pop > .head (.pname + Clear) + .facet-values > button.opt: the selection moves off input:checked onto the option's own is-on, so the value's type and datatype ride data attributes and ldh:FilterFacet reads them into the same array ldh:ViewFilter already took - string() of an absent @data-datatype yields the empty string exactly as the absent hidden input did. Clearing a facet is the same rebuild as unchecking its last value, so both reach ldh:FilterFacet, and picking a value does not dismiss the popover, since several values of one predicate are meant to be picked in one pass. Five ul.facet-pop/label.checkbox rules leave the bridge and app.css's own facet-pop block - head, pname, clear, opt, check, nm, cnt, facet-values with its overflow cap, facet-empty - drives it instead; the one rule kept is the loading state, which the design has no component for because React only renders the popover once values exist. Type values stop being dressed by position. bs2:TypeList wrapped the header's types in the design's Tag, which left every other rendering - the view's Type column above all - falling through to a bare anchor once the .btn-type pill and the :where(.btn) legacy fallback were deleted. The Tag moves onto rdf:type/@Rdf:resource itself, so one template covers every site. Web-Client's span.btn.btn-type survives inside it: xsl:import gives an importing stylesheet precedence, not replacement, so that rule stays in the xsl:next-match ordering and the wrapper cannot be overridden away - measured identical either way now that no .btn or .btn-type rules remain to paint it. The override declares no parameters on purpose: both import paths pull imports/rdf.xsl after imports/default.xsl, so it outranks the @Rdf:resource rule that proxies external URIs, and forwarding an $href would override that rule's computed default and send external types straight out instead of through the ?uri= proxy. ldh:ListRowType is unaffected - it renders ac:object-label() as a string into the design's .type cell and never enters the default-mode chain. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011j6GapYTmxZXEq3YK2Z53D
…APSHOT. The vendor CSS syncs to the design system's consolidation revision (core gains surfaces.css with Card/DataTable/Avatar/Drawer/Stepper; .tb/.rb icon buttons, the bespoke tables and the media header are gone upstream), the four .tb sites become core IconButtons with aria-pressed toggles, whole-form text controls ride ldhc-field shells, the resource header adopts .ldh-res-head with .ldh-type-chip links consuming rdf:type out of the titleline, the fixed-column tables (access matrix, version history, packages) move to core .ldhc-table with captions and th scope while the dynamic-column results tables keep native layout, and the small control fixes land (.ldh-check, .ldhc-select, error callout, file-sel chrome, dead Bootstrap tokens dropped). On top of that the template modes take the design system's component names: shared modes bind Web-Client's ac: contract (bs2:Header→ac:BlockHeader, bs2:PropertyList→ac:PropertyEditor, bs2:Form→ac:ResourceForm, bs2:FormControlTypeLabel→ac:ValueAnnotations, bs2:NavBar→ac:Header, ...) and the 35 LDH-only squatters move home to ldh: (bs2:Row→ldh:BlockRow, bs2:DataspaceNavList→ldh:DataspaceTabs, bs2:SearchBar→ldh:SearchField, ...). The xsl/bootstrap/2.3.2 directory flattens into xsl/ with every path literal, entry stylesheet, Java constant and Docker default updated; the generic field-shell, textarea, violation-alert and error-header shadows delete now that Web-Client emits the same core-kit markup (rdfs:comment and dct:description textareas sink upstream, emptying imports/rdfs.xsl); the @xml:lang control thins to a class override riding Web-Client's emitter; and the client dependency pins 6.0.0-SNAPSHOT. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…l origin: the ac:translations() override rides the same-origin URL that the same-site server resolver and the browser both dereference, replacing Web-Client's location-mapped canonical URI which neither can reach here. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…r re-opening its own rule) left app.css with unclosed braces at .ldh-step-hint, .ldh-map-col and .ldh-run-row > .msi, and the first one swallowed every rule from line 2999 to the end of the file - the form subjbar alignment, the annotation hover-reveal, the violation decoration and the form bar all parsed away, which is exactly the set of breakages the whole-form mode was reported to have lost. The selectors deduplicate and a brace-balance scan across both repos' stylesheets comes back clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…the proof case: the clean break had left three ways to render an rdf:type value - the value rule's Tag that only tables reached, a self-contained chip builder in ac:ResourceTypes, and a hand-rolled copy of that chip in the nested-block head. The wrapper rule in imports/rdf.xsl retires because Web-Client's rdf:type/@Rdf:resource rule now emits the design's Tag itself (sitting below the proxying @Rdf:resource rule, so external types still ride the ?uri= href it forwards), ac:ResourceTypes splits into the .ldh-types wrapper and a single chip template that the nblock head applies on its own rdf:type attribute (dropping the synchronous class-document fetch the TO-DO complained about), and the icon-from-type and latest-of-created/modified derivations become the ldh:class-icon and ldh:latest-date-time functions instead of eight and two inline copies. The @Rdf:about/@Rdf:nodeID twin templates for the depiction, the list row and the grid card merge into one each - the wrapper element and its href are the only thing the URI decides. The duplicated translations entry that rendered the facet Clear button as ClearClear splits into clear (the ontology action) and clear-facet (the facet popover). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…s own: ac:AnnotationTag gains a one-rule skin that wraps every chip in the .ldh-annot slot the whole-form mode hover-reveals, so the an-term modifiers, the expected-class chips and the datatype curies across default.xsl, the vocab imports, signup and the modals stop retyping the wrapper; the twin 35-line expected-class resolution blocks collapse into ldh:class-label(), which handles rdfs:Resource via the app catalog and otherwise delegates to the ac:object-label machinery over a synthesized object node, since $forClass travels as atomic URIs the node-based mode cannot dispatch on. All fifteen ldhc-select wrappers route through ac:SelectShell (the pager select keeps its own .ldh-pager-select component - the design specifies it separately), the dateTime pair's field shells ride ac:FieldShell, and the prop-group's single-label cell becomes ldh:PropertyLabel - predicate label, required marker, description toggletip in one place - consumed by the canonical ac:FormControl emitter, the seven modal copies, the RDFa annotation form (whose hardcoded English labels move into translations.rdf) and signup's password row. The reset/dismiss/save footer becomes ldh:FormFooter with the placement class as a parameter (.ldh-form-bar, .ldh-block-foot, .ldhc-modal-foot), routing the document form, the row form's cancel variant, the add-data and access-request modals and the three close-only navigation modals; composite footers (generate-containers, memento compare, the RDFa toolbar, ACL allow) keep bespoke content inside the design's placement wrappers. ldh-bridge.css admits .fb-end into block-foot placements, and ldh:translations() mirrors ac:translations() for the app catalog. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…d-rolled ldhc-alert routes through Web-Client's new ac:Alert - the conflict exception, both ac:Violation renderers, the version notice and diff legend, the request-access header (h2 and button riding the $body slot), the Control-mode warning, the add-data notice, the signup confirmation and the service-load failure - and ldh:error-alert delegates to the same rule, so the headline anatomy stops varying between h2s and spans and between title/text orders. The hardcoded English moves into translations.rdf (warning, control-mode-warning, signup-created, signup-email-sent, add-data-notice, rdf-imports). The fixed-column tables share ldh:DataTable - column widths, hidden caption, header row and body as slots - across packages, version history and the two access matrices. And the spelled-out label-catalog lookup collapses into ldh:translations() at its 174 call sites, with imports/cert.xsl gaining the ldh namespace it never needed before. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…w/title/sub head slots, a flush flag, body and foot, wires aria-labelledby to the title id it generates, and emits the close button once - fourteen hand-rolled ldhc-modal shells across the modals, navigation, memento and the view route through it (the constructor-template modal keeps its own, since its form element wraps head and body, and the re-render function that replaces a dialog's children keeps its inline head). The hover-controls overlay and the progress bar get the same treatment: ldh:RowBlockControls holds the pulled-down overlay geometry once with the contents as a slot, ldh:ProgressBar the track/fill anatomy, routing the four navigation copies, both resource.xsl variants and the facet loading bar. Also fixes the previous commit's ldh:translations() sweep, which had rewritten the function's own body into a call to itself - an infinite tail recursion that pinned the server on the first label lookup of any render. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…lock-head inset rule and the parallax row) - they now name ldh:BlockRow, ac:BlockHeader and ldh:ParallaxNav - and ldh.css's tab-content rule stops claiming to override a Bootstrap stylesheet that is no longer linked. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…header and its section banners describe the legacy state classes and replacement rules on their own terms, the modal-legend and tab-contract notes lose their attributions, the tab-content overflow rule and the editor's quote-bar convention keep only the content-bearing halves of their comments, and the design tokens' lineage line names the platform's legacy palette instead. The same one-line reword lands in the vendored colors_and_type.css here, in Web-Client and in the design-system source, so the copies stay mirrors. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…er requires the block's subject: the header edit button of a sub-resource rendered by Web-Client's default template sits inside a bare div.block wrapper, so ancestor::div[.block][1] found the about-less wrapper and the required $about param crashed the click with an empty-sequence cardinality error. The btn-edit onclick, the PATCH row-form submit and the create-view/create-chart buttons now anchor on the nearest addressable block - the same element their match patterns already guarantee - so editing a sub-resource opens the enclosing block's form instead of throwing. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…the is-empty status marker disappears from ac:BlockHeader along with its bridge reveal machinery and the block-state-empty catalog entry, and the design system's decision note narrows the header marker to the failure and loading states (the is-empty chip rule leaves the spec and its vendored copy). The body side gains what the design always drew: ldh:BlockBlank is the single empty-body emitter - inbox glyph, "No results." and the explanation sub-line - which the chart's inline copy routes through and the three view containers now render instead of an empty list/grid/table and a pager for zero rows, keying on the total count with the page count as fallback. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…e block it sits in: an ldh:Object block replaces its own row with the fetched description of its rdf:value, and that description is itself a .block[@about] carrying the object's URI - ldh:ChildrenView for a select-children view - so the handler's nearest-.block fallback, the branch the view toolbar takes since it renders no block-head title anchor, copied the ontology term rather than the document's #select-children. The injected wrapper now carries .ldh-obj-value to mark the subtree as the host block's object rendering, the new ldh:host-block() resolves from the innermost such wrapper so injected blocks are skipped, and the clipboard handler's third branch goes through it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011j6GapYTmxZXEq3YK2Z53D
…yncs wholesale - bringing the compact .ldh-mode.sz-sm mode switcher, the .dpivot drawer rail, the .ldh-pivot-bar row, the sort-pop/sort-dir controls and the layout-only list-row .type cell - with this session's two decisions re-applied on top, since the update was cut from a state that predated them (the empty state stays out of block headers, and the token lineage note keeps naming the platform's legacy palette). The list row then closes the type-pill split for real: ldh:ListRowType applies templates into the single rdf:type value rule with the tunneled linkless switch, so the row's type renders as the same core Tag as property values and table cells, wrapped in the now layout-only .type cell. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…n machinery becomes .ldh-drop-wrap / .drop-toggle / .ldh-drop-menu with the single is-open state (the dual open token and its mirroring comment retire), menu section headers become .drop-header, the header link list and the sidebar doc-tree lists become .ldh-nav, and the sidebar section headings .ldh-section-heading. The dataspace strip adopts the design's naming - ul.ldh-tabs with is-active items over .ldh-panes > .ldh-pane.is-active, ids unchanged - and the add-data modal's paned widget takes the core anatomy (.ldhc-tabs > .ldhc-tablist with is-active items over .ldh-panes). Typeahead result lists stop carrying dropdown-menu alongside ldhc-cb-panel - the combobox panel class is the contract, and the handlers that accepted either now match it alone. All ixsl handler XPaths, the SSR emitters, ldh.css and the bridge rename together; the bridge also drops its rule for the retired fieldset button group. The loading state's progress/active pair and the sidebar tree's active highlight keep their names for now - they are state tokens of surfaces the design system does not yet respecify. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…ayout-mode switcher becomes the same labelled ldh-mode component as the document-level one in the compact sz-sm variant, dropping its per-mode trigger classes. The parallax row adopts the PivotBar anatomy - ldh-pivot-bar with the neutral lead glyph and ldh-pivot-pill buttons (arrow leading the label, forward pills grouped before backward, absolute predicate URIs in the titles) - and the bridge keeps only the empty-hide rule and the quieter incoming-pill tint over the design's own rules. The sort select and direction button become the two-control design: a facet-pill key dropdown whose pre-rendered sort-pop rides the generic facet open/close machinery (a dedicated trigger handler shadows the facet one, which would otherwise read value-loading inputs the sort pill does not carry) with menuitemradio single-selection and a trailing tick, and a facet-pill.sort-dir that names the current direction in text and the pending action in its accessible name. ldh:SortControlsState keeps trigger, popover and direction slot in agreement whichever control drove the change - key pick, direction toggle or column-header sort - replacing the select/button sync, with the direction pill re-rendered whole from ldh:SortDirectionPill. The sort, sorted-asc-toggle and sorted-desc-toggle labels join the catalog. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…o ldh.css as LDH's one app layer over the design kits, loaded after them so it wins the ties it is written to win (its rules deliberately override app.css, and the old before-the-kits slot let the kits silently beat the local rules it hosted). The merge drops the rules that were dead Bootstrap residue - .control-group, form .btn-primary, .faceted-nav, the outset fieldset box, the 979px responsive block whose display toggle the flyout rule already outvoted, and the add-constructor hover that painted Create menu items legacy blue over the .it anatomy - and folds the sidebar's height into the flyout rule since app.css owns the rest of its box. The last borrowed Bootstrap chrome goes with it: the OL map info window and the RDFa annotation overlay adopt the design system's .ldhc-modal-head/.ldhc-modal-x/.ldhc-modal-body anatomy (the overlay's close glyph button becomes the standard iconbtn, keeping cancel-action as the handler hook, and its hardcoded English title moves to the rdfa-annotation catalog entry), so the close-first grid workaround and the .close styling die; the CSR breadcrumb sheds the .breadcrumb component class and rides .ldh-bc alone; the search inputs shed BS2's .search-query, addressed by name="q" as the handlers already do. Verified in the browser: purge, site and merge suites green (link order, renamed anatomies, sticky chrome, flyout box, no legacy tokens in the DOM). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…es the core Menu (§17a): every wrap is a .ldhc-menu-anchor whose panel is div.ldhc-menu with .ldhc-menu-item rows, .ldhc-menu-header groups and .ldhc-menu-sep rules (the app-kit Add/overflow/mode wraps adopt the anchor class so one toggle handler serves both), the handler stamps the measured al-* placement the way the component's autoFlip does and syncs aria-expanded, and the role=menu keyboard model arrives with it (§20): focus moves into the menu on open, Arrow/Home/End rove the items, Escape dismisses and restores the trigger. The document tab strip takes the corrected DataspaceTabs contract (§17b/§24): a.ldh-tab anchors with aria-current on li.is-active, the close affordance a styled sibling <button> instead of the nested span, and the strip anatomy leaves ldh.css for the vendored app.css - which also retires the stale li.active underline rule that never matched the handlers' is-active. The language tag is the core Tag at the new inline xs size (§17c), the loading pair collapses to one state (§17d: row-main is-loading + aria-busy, stripped together at 100%), and the sidebar tree's current item takes the kit's is-active. The left sidebar becomes the dataspace drawer (§19-§23): sb-head with an honest search *button* (⌘K as the visible hint, Ctrl/Cmd+K and the button both open the search dialog), one sb-scroll for the tree/classes/other sections, tree rows as li > .tree-row > sibling-disclosure IconButton + a.tree-link with the depth custom property ramp and a lazy tree-loading row, class rows on the same .tree-link vocabulary with dot and count Tag, and Geo/Latest with the dialog-opening glyph; the hover-edge flyout dies for the drawer contract - toggle pill while closed, backdrop button and Escape to dismiss, inert (plus the visibility fallback) while closed so the subtree leaveses the tab order. NavigationUpdate descends through sb-scroll and the link interceptor's app-list branch follows the menu's ul-to-div change - caught live when the apps menu navigated natively instead of opening the second dataspace as a tab. Re-vendored core/controls/app css (§13 brace scan, §18 --sp-7 fix, §25 audit state); the §18 no-fallback sweep run over LDH's own layer found --thumb-sm/md/lg used but defined nowhere since a re-vendor clobbered them - every image cap silently void - so they are pinned with the LDH tokens in ldh.css. Verified live: 19/19 drawer/menu/tab checks (second dataspace opened from the apps menu as a closable tab), purge 6/6, site 15/15, merge 10/10, clean console. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…take the ./div form: a path step starting with the keyword div parses as the operator to Saxon's tokenizer, and the compiler flags every one. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…'s left edge slides it in, and the pointer leaving it slides it back out - the floating Show-navigation pill and the click backdrop go. The edge/mouseout handlers return on the drawer state model rather than the old inline display toggling, so is-open still drives the slide and inert still takes the closed subtree out of the tab order; the close button and Escape stay for keyboard users, and the show-navigation catalog entry retires with the pill. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…th: LDH's widened shadow of Web-Client's bnode-literal template (the one that turns a bnode carrying only an xsd:* type into a text input) still called xhtml:Input bare, so every constructor-instantiated empty literal row - the Alternative label and Definition rows on a fresh concept - rendered an unshelled input at its UA-intrinsic 187px beside the 340px fields. That is exactly the design system's diagnostic for a lost --prop-control-w: the token was never lost here, the control had just escaped the .ldhc-field shell the cap rides on (the same widened-shadow family whose type-label half was fixed earlier). Routed through ac:FieldShell; the lt datatype input stays hidden outside the shell. Measured on the UNESCO concept form: every type-into control - seven fields, the dateTime pair, the combobox - now sits at 340px on one right edge, committed pills stay content-sized per the system's exception, and the reshelled input still takes focus and text. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
… of the structural modes take the component names (ac:AppShell, ac:Head, ac:Stylesheets, the ac:ResultsTable family, ac:PropertyListValue for the read-mode value cells), and the last composite hiding in an element mode comes out - the dateTime value+timezone pair moves from an xhtml:Input override into its own ldh:DateTimePair component mode, dispatched by the ac:FormControl layer, with the hidden variant falling back to the plain xhtml:Input primitive the way every other childless control does. CLAUDE.md gains the namespace rule (element identity in xhtml:, structure in component namespaces under design-system names, the unnamed mode as the value leaf). Verified live: SSR renders through the renamed shell/head/stylesheet slots, the view's table mode fills through the ResultsTable family, the dateTime pair keeps its 340px shell, and the site, chrome and edit suites stay green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…n went straight to the dialog on click, so the field-shaped control could not take focus or text. The sb-head hosts the dataspace-scoped search form once more - a real type=search input with the ⌘K hint kept in the field - and the modal-opening template returns to matching the form's submit and reading the typed value, so Enter opens the search dialog pre-populated and runs the search immediately (the pre-population and immediate-load machinery had stayed in the template, fed an empty string by the button handler). The Ctrl/Cmd+K shortcut submits the same form instead of clicking the retired button, so it too pre-fills the dialog from the drawer. app.css stays a pristine vendor mirror; five ldh.css rules adapt its button-shaped shell to host the input - the focus ring moves to :focus-within since the button's :focus-visible no longer fires, the input inside stays bare, and its :focus reset carries the form qualifier to match the generic form-focus ring's specificity and outrank it by order. Verified live headless against the recompiled demo SEF: 13/13 flow checks - clicking the input focuses it without opening the modal, typed text stays put, Enter opens the dialog pre-filled and focused with the SPARQL search firing and the results view rendering, Escape closes it, Ctrl+K reopens it pre-filled - with a clean console. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
…t gets a branch: the language test counts the lang pill by its core Tag classes (ldhc-tag em-quiet co-accent sz-xs) now that chip-inline is gone, cors-static reads its responses from here-strings so grep -q's early exit cannot SIGPIPE the echo under pipefail (the race the package-import test already documents, made likely by ldh.css absorbing the bridge stylesheet), and the bundled skos package.ttl points its ac:stylesheet at the Apps repo's develop branch - master keeps serving the bs2-era stylesheet that released 5.10.0 imports, so each LDH branch reads the Apps branch that matches its mode contract, and the URL flips back to master at release. The ns.ttl URL stays on master: the classpath mapping intercepts it by that exact key. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.