From 9c729608639d5721bcaae6613b9963174910fc65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20Jusevi=C4=8Dius?= Date: Mon, 7 Sep 2026 21:26:15 +0200 Subject: [PATCH 01/41] =?UTF-8?q?The=20bs2:=20namespace=20retires:=20the?= =?UTF-8?q?=20component=20modes=20take=20their=20names=20from=20the=20desi?= =?UTF-8?q?gn=20system's=20component=20vocabulary=20in=20the=20ac:=20names?= =?UTF-8?q?pace=20(bs2:Header=E2=86=92ac:BlockHeader,=20bs2:PropertyList?= =?UTF-8?q?=E2=86=92ac:PropertyEditor,=20bs2:Form=E2=86=92ac:ResourceForm,?= =?UTF-8?q?=20bs2:FormControlTypeLabel=E2=86=92ac:ValueAnnotations,=20bs2:?= =?UTF-8?q?NavBar=E2=86=92ac:Header,=20bs2:QueryForm=E2=86=92ac:SPARQLPane?= =?UTF-8?q?,=20...),=20the=20bootstrap/2.3.2=20skin=20directory=20flattens?= =?UTF-8?q?=20into=20the=20xsl=20root=20with=20its=20imports=20merged=20in?= =?UTF-8?q?to=20the=20base=20vocabulary=20files=20(the=20ac:lang-tag=20bas?= =?UTF-8?q?e/skin=20dual=20collapses=20into=20one=20definition),=20the=20d?= =?UTF-8?q?ead=20bs2:EditForm=20dispatch=20repoints=20at=20the=20edit=20fo?= =?UTF-8?q?rm,=20and=20the=20form-control=20system=20adopts=20the=20design?= =?UTF-8?q?=20system's=20core-kit=20anatomy:=20field=20shells=20(ldhc-fiel?= =?UTF-8?q?d/ldhc-field-box)=20around=20bare=20inputs,=20ldhc-tag=20term?= =?UTF-8?q?=20annotations,=20ldhc-iconbtn=20statement=20actions,=20with=20?= =?UTF-8?q?UI=20strings=20served=20from=20Web-Client's=20own=20translation?= =?UTF-8?q?s.rdf=20catalog.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU --- .../xsl/bootstrap/2.3.2/imports/default.xsl | 380 ----------------- .../xsl/bootstrap/2.3.2/imports/foaf.xsl | 73 ---- .../client/xsl/bootstrap/2.3.2/imports/sp.xsl | 48 --- .../xsl/{bootstrap/2.3.2 => }/container.xsl | 29 +- .../xsl/{bootstrap/2.3.2 => }/document.xsl | 19 +- .../{bootstrap/2.3.2 => }/external-layout.xsl | 33 +- .../atomgraph/client/xsl/imports/default.xsl | 403 +++++++++++++++++- .../xsl/{bootstrap/2.3.2 => }/imports/dh.xsl | 5 +- .../com/atomgraph/client/xsl/imports/foaf.xsl | 53 +++ .../com/atomgraph/client/xsl/imports/sp.xsl | 24 ++ .../{bootstrap/2.3.2 => }/internal-layout.xsl | 31 +- .../xsl/{bootstrap/2.3.2 => }/layout.xsl | 83 ++-- .../xsl/{bootstrap/2.3.2 => }/resource.xsl | 51 ++- .../xsl/{bootstrap/2.3.2 => }/sparql.xsl | 19 +- .../com/atomgraph/client/xsl/translations.rdf | 52 +++ 15 files changed, 656 insertions(+), 647 deletions(-) delete mode 100644 src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/imports/default.xsl delete mode 100644 src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/imports/foaf.xsl delete mode 100644 src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/imports/sp.xsl rename src/main/webapp/static/com/atomgraph/client/xsl/{bootstrap/2.3.2 => }/container.xsl (92%) rename src/main/webapp/static/com/atomgraph/client/xsl/{bootstrap/2.3.2 => }/document.xsl (88%) rename src/main/webapp/static/com/atomgraph/client/xsl/{bootstrap/2.3.2 => }/external-layout.xsl (66%) rename src/main/webapp/static/com/atomgraph/client/xsl/{bootstrap/2.3.2 => }/imports/dh.xsl (89%) rename src/main/webapp/static/com/atomgraph/client/xsl/{bootstrap/2.3.2 => }/internal-layout.xsl (68%) rename src/main/webapp/static/com/atomgraph/client/xsl/{bootstrap/2.3.2 => }/layout.xsl (88%) rename src/main/webapp/static/com/atomgraph/client/xsl/{bootstrap/2.3.2 => }/resource.xsl (90%) rename src/main/webapp/static/com/atomgraph/client/xsl/{bootstrap/2.3.2 => }/sparql.xsl (93%) create mode 100644 src/main/webapp/static/com/atomgraph/client/xsl/translations.rdf diff --git a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/imports/default.xsl b/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/imports/default.xsl deleted file mode 100644 index 9bc51da0..00000000 --- a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/imports/default.xsl +++ /dev/null @@ -1,380 +0,0 @@ - - - - - - - - - - - - -]> - - - - - - - -
- - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - -
- -
-
- -
- -
- -
-
- - -
- -
- -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Literal - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Literal - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Resource - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Language - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Datatype - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Resource - - - -
\ No newline at end of file diff --git a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/imports/foaf.xsl b/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/imports/foaf.xsl deleted file mode 100644 index 0bbf415c..00000000 --- a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/imports/foaf.xsl +++ /dev/null @@ -1,73 +0,0 @@ - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/imports/sp.xsl b/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/imports/sp.xsl deleted file mode 100644 index 38d8510c..00000000 --- a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/imports/sp.xsl +++ /dev/null @@ -1,48 +0,0 @@ - - - - -]> - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/container.xsl b/src/main/webapp/static/com/atomgraph/client/xsl/container.xsl similarity index 92% rename from src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/container.xsl rename to src/main/webapp/static/com/atomgraph/client/xsl/container.xsl index 2db48231..82ac9bb0 100644 --- a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/container.xsl +++ b/src/main/webapp/static/com/atomgraph/client/xsl/container.xsl @@ -29,17 +29,16 @@ xmlns:ac="∾" xmlns:rdf="&rdf;" xmlns:ldt="&ldt;" xmlns:geo="&geo;" -xmlns:bs2="http://graphity.org/xsl/bootstrap/2.3.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" exclude-result-prefixes="#all"> - + - + @@ -51,9 +50,9 @@ exclude-result-prefixes="#all"> - + - +

@@ -63,17 +62,17 @@ exclude-result-prefixes="#all">

- + - + - + @@ -94,7 +93,7 @@ exclude-result-prefixes="#all"> - + @@ -108,10 +107,10 @@ exclude-result-prefixes="#all">
- +
- +

@@ -124,7 +123,7 @@ exclude-result-prefixes="#all"> - + @@ -205,7 +204,7 @@ exclude-result-prefixes="#all"> - +
@@ -243,7 +242,7 @@ exclude-result-prefixes="#all"> - - + \ No newline at end of file diff --git a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/document.xsl b/src/main/webapp/static/com/atomgraph/client/xsl/document.xsl similarity index 88% rename from src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/document.xsl rename to src/main/webapp/static/com/atomgraph/client/xsl/document.xsl index 0468e36c..77a5f163 100644 --- a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/document.xsl +++ b/src/main/webapp/static/com/atomgraph/client/xsl/document.xsl @@ -32,23 +32,22 @@ xmlns:rdf="&rdf;" xmlns:ldt="&ldt;" xmlns:geo="&geo;" xmlns:foaf="&foaf;" -xmlns:bs2="http://graphity.org/xsl/bootstrap/2.3.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" exclude-result-prefixes="#all"> - + - + - + @@ -66,7 +65,7 @@ exclude-result-prefixes="#all"> - + @@ -95,7 +94,7 @@ exclude-result-prefixes="#all"> - + @@ -108,7 +107,7 @@ exclude-result-prefixes="#all"> - + @@ -116,13 +115,13 @@ exclude-result-prefixes="#all"> - + - +
diff --git a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/external-layout.xsl b/src/main/webapp/static/com/atomgraph/client/xsl/external-layout.xsl similarity index 66% rename from src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/external-layout.xsl rename to src/main/webapp/static/com/atomgraph/client/xsl/external-layout.xsl index 613fd249..1b2b680e 100644 --- a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/external-layout.xsl +++ b/src/main/webapp/static/com/atomgraph/client/xsl/external-layout.xsl @@ -36,27 +36,24 @@ xmlns:sparql="&sparql;" xmlns:xhtml="http://www.w3.org/1999/xhtml" exclude-result-prefixes="#all"> - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/src/main/webapp/static/com/atomgraph/client/xsl/imports/default.xsl b/src/main/webapp/static/com/atomgraph/client/xsl/imports/default.xsl index e12e576a..9570f2c7 100644 --- a/src/main/webapp/static/com/atomgraph/client/xsl/imports/default.xsl +++ b/src/main/webapp/static/com/atomgraph/client/xsl/imports/default.xsl @@ -133,9 +133,12 @@ exclude-result-prefixes="#all"> - - + + + + + + @@ -422,7 +425,7 @@ exclude-result-prefixes="#all"> - + @@ -443,7 +446,7 @@ exclude-result-prefixes="#all"> - + @@ -516,7 +519,7 @@ exclude-result-prefixes="#all"> - + @@ -774,4 +777,392 @@ exclude-result-prefixes="#all"> + + + +
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + +
+ +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
+
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + +
+ + + + + + + + + + +
+
+ + + + + + + +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
+
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/imports/dh.xsl b/src/main/webapp/static/com/atomgraph/client/xsl/imports/dh.xsl similarity index 89% rename from src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/imports/dh.xsl rename to src/main/webapp/static/com/atomgraph/client/xsl/imports/dh.xsl index 8bf8abc2..22e4ee4d 100644 --- a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/imports/dh.xsl +++ b/src/main/webapp/static/com/atomgraph/client/xsl/imports/dh.xsl @@ -15,6 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> ]> @@ -22,12 +23,12 @@ limitations under the License. xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" +xmlns:ac="∾" xmlns:rdf="&rdf;" xmlns:dh="&dh;" -xmlns:bs2="http://graphity.org/xsl/bootstrap/2.3.2" exclude-result-prefixes="#all"> - + diff --git a/src/main/webapp/static/com/atomgraph/client/xsl/imports/foaf.xsl b/src/main/webapp/static/com/atomgraph/client/xsl/imports/foaf.xsl index 1924d8cb..2545e8cb 100644 --- a/src/main/webapp/static/com/atomgraph/client/xsl/imports/foaf.xsl +++ b/src/main/webapp/static/com/atomgraph/client/xsl/imports/foaf.xsl @@ -26,6 +26,7 @@ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ac="∾" xmlns:rdf="&rdf;" xmlns:foaf="&foaf;" +xmlns:xhtml="http://www.w3.org/1999/xhtml" exclude-result-prefixes="#all"> @@ -108,4 +109,56 @@ exclude-result-prefixes="#all"> + + + + + + + + +
+
+ + + + + + + +
+
+ + + + + + +
+ + + + + + + +
+
+ + + + + + + +
+
+ + + + + + +
+ \ No newline at end of file diff --git a/src/main/webapp/static/com/atomgraph/client/xsl/imports/sp.xsl b/src/main/webapp/static/com/atomgraph/client/xsl/imports/sp.xsl index 5eebab10..97ba62fa 100644 --- a/src/main/webapp/static/com/atomgraph/client/xsl/imports/sp.xsl +++ b/src/main/webapp/static/com/atomgraph/client/xsl/imports/sp.xsl @@ -34,4 +34,28 @@ exclude-result-prefixes="#all">
+ + + + + +
+
+ +
+
+ + + + +
+ + + + + + + \ No newline at end of file diff --git a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/internal-layout.xsl b/src/main/webapp/static/com/atomgraph/client/xsl/internal-layout.xsl similarity index 68% rename from src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/internal-layout.xsl rename to src/main/webapp/static/com/atomgraph/client/xsl/internal-layout.xsl index 5ac28fae..e9af4292 100644 --- a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/internal-layout.xsl +++ b/src/main/webapp/static/com/atomgraph/client/xsl/internal-layout.xsl @@ -36,26 +36,23 @@ xmlns:sparql="&sparql;" xmlns:xhtml="http://www.w3.org/1999/xhtml" exclude-result-prefixes="#all"> - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/layout.xsl b/src/main/webapp/static/com/atomgraph/client/xsl/layout.xsl similarity index 88% rename from src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/layout.xsl rename to src/main/webapp/static/com/atomgraph/client/xsl/layout.xsl index 4f829737..7922e454 100644 --- a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/layout.xsl +++ b/src/main/webapp/static/com/atomgraph/client/xsl/layout.xsl @@ -50,7 +50,6 @@ xmlns:sioc="&sioc;" xmlns:sp="&sp;" xmlns:spin="&spin;" xmlns:xhv="&xhv;" -xmlns:bs2="http://graphity.org/xsl/bootstrap/2.3.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" exclude-result-prefixes="#all"> @@ -147,21 +146,21 @@ exclude-result-prefixes="#all"> - +
- + - +
- +
- + - + @@ -224,17 +223,17 @@ exclude-result-prefixes="#all">
- + - + - +
- + @@ -246,11 +245,11 @@ exclude-result-prefixes="#all">
- + - + @@ -262,21 +261,21 @@ exclude-result-prefixes="#all"> - + - + - + - + - + - + - + - + @@ -366,13 +365,13 @@ exclude-result-prefixes="#all"> - + - + - + @@ -386,7 +385,7 @@ exclude-result-prefixes="#all"> - +
- + - + @@ -463,11 +462,11 @@ exclude-result-prefixes="#all"> - + - + @@ -489,7 +488,7 @@ exclude-result-prefixes="#all"> - +
- + - + - + @@ -525,9 +524,9 @@ exclude-result-prefixes="#all"> - + - + diff --git a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/resource.xsl b/src/main/webapp/static/com/atomgraph/client/xsl/resource.xsl similarity index 90% rename from src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/resource.xsl rename to src/main/webapp/static/com/atomgraph/client/xsl/resource.xsl index 13ee2e25..face53cb 100644 --- a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/resource.xsl +++ b/src/main/webapp/static/com/atomgraph/client/xsl/resource.xsl @@ -34,13 +34,12 @@ xmlns:ldt="&ldt;" xmlns:geo="&geo;" xmlns:foaf="&foaf;" xmlns:sioc="&sioc;" -xmlns:bs2="http://graphity.org/xsl/bootstrap/2.3.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" exclude-result-prefixes="#all"> - + @@ -82,9 +81,9 @@ exclude-result-prefixes="#all"> - + - + @@ -115,7 +114,7 @@ exclude-result-prefixes="#all"> - + @@ -127,9 +126,9 @@ exclude-result-prefixes="#all"> - + - +

@@ -139,7 +138,7 @@ exclude-result-prefixes="#all">

- + @@ -159,7 +158,7 @@ exclude-result-prefixes="#all"> - +
- + - + @@ -201,7 +200,7 @@ exclude-result-prefixes="#all"> - + @@ -214,7 +213,7 @@ exclude-result-prefixes="#all"> - +
    @@ -226,11 +225,11 @@ exclude-result-prefixes="#all">
- + - +
@@ -242,28 +241,28 @@ exclude-result-prefixes="#all"> - + - + - + - - + + - + @@ -280,7 +279,7 @@ exclude-result-prefixes="#all"> - + @@ -297,7 +296,7 @@ exclude-result-prefixes="#all"> - + @@ -316,13 +315,13 @@ exclude-result-prefixes="#all"> - + - + - +
diff --git a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/sparql.xsl b/src/main/webapp/static/com/atomgraph/client/xsl/sparql.xsl similarity index 93% rename from src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/sparql.xsl rename to src/main/webapp/static/com/atomgraph/client/xsl/sparql.xsl index 8daa5e98..dec8b792 100644 --- a/src/main/webapp/static/com/atomgraph/client/xsl/bootstrap/2.3.2/sparql.xsl +++ b/src/main/webapp/static/com/atomgraph/client/xsl/sparql.xsl @@ -43,7 +43,6 @@ xmlns:sd="&sd;" xmlns:ldt="&ldt;" xmlns:spl="&spl;" xmlns:void="&void;" -xmlns:bs2="http://graphity.org/xsl/bootstrap/2.3.2" exclude-result-prefixes="#all"> SELECT DISTINCT * @@ -58,7 +57,7 @@ WHERE } LIMIT 100 - + @@ -70,7 +69,7 @@ LIMIT 100 - + @@ -84,7 +83,7 @@ LIMIT 100
- + @@ -92,7 +91,7 @@ LIMIT 100
- + @@ -167,12 +166,12 @@ LIMIT 100 - + - + @@ -182,17 +181,17 @@ LIMIT 100
- + - + - + diff --git a/src/main/webapp/static/com/atomgraph/client/xsl/translations.rdf b/src/main/webapp/static/com/atomgraph/client/xsl/translations.rdf new file mode 100644 index 00000000..d9b54a0a --- /dev/null +++ b/src/main/webapp/static/com/atomgraph/client/xsl/translations.rdf @@ -0,0 +1,52 @@ + + + + + Literal + Literal + + + Resource + Recurso + + + Language tag + Etiqueta de idioma + + + Datatype + Tipo de dato + + + Add another statement + Añadir otra sentencia + + + Remove this statement + Eliminar esta sentencia + + + Save + Guardar + + + Edit + Editar + + + Delete + Eliminar + + + Export + Exportar + + + Query + Consultar + + From b491d8acf375b4bdea67ef2c93caa10d09199c52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20Jusevi=C4=8Dius?= Date: Mon, 7 Sep 2026 21:36:55 +0200 Subject: [PATCH 02/41] The browser chrome sheds Bootstrap 2 for the design system: the page shell (header with URI field, action bar zones, details-based mode/export menus, footer), resource blocks, ul/li collections (the grid drops its span-chunked rows for a CSS grid), the results table (native table layout with a visually-hidden caption and th scope), forms and the SPARQL pane all compose core-kit primitives (ldhc-btn, ldhc-iconbtn, ldhc-field/-box, ldhc-tag, ldhc-alert, ldhc-card) under Web-Client's own client.css chrome. The output is XHTML5, the vendored Bootstrap CSS/JS, jQuery, UUID.js and glyphicons retire in favour of a dependency-free client.js (crypto.randomUUID, delegated statement add/remove, data-confirm'd deletes), the design system's tokens and core kit are vendored beside client.css, hardcoded English moves into translations.rdf, and the version becomes 6.0.0-SNAPSHOT. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01Wbug2gnhHvbcCzzDXpSoZU --- pom.xml | 2 +- src/main/webapp/WEB-INF/web.xml | 2 +- .../com/atomgraph/client/css/bootstrap.css | 19 - .../com/atomgraph/client/css/client.css | 126 + .../atomgraph/client/css/colors_and_type.css | 437 ++ .../com/atomgraph/client/css/controls.css | 371 + .../static/com/atomgraph/client/css/core.css | 699 ++ .../com/atomgraph/client/css/overlays.css | 178 + .../com/atomgraph/client/css/surfaces.css | 201 + .../static/com/atomgraph/client/js/UUID.js | 8 - .../static/com/atomgraph/client/js/client.js | 49 + .../com/atomgraph/client/js/google-maps.js | 13 - .../static/com/atomgraph/client/js/jquery.js | 52 - .../com/atomgraph/client/xsl/container.xsl | 66 +- .../com/atomgraph/client/xsl/document.xsl | 13 +- .../atomgraph/client/xsl/imports/default.xsl | 8 +- .../com/atomgraph/client/xsl/layout.xsl | 223 +- .../com/atomgraph/client/xsl/resource.xsl | 77 +- .../com/atomgraph/client/xsl/sparql.xsl | 31 +- .../com/atomgraph/client/xsl/translations.rdf | 24 + .../static/css/bootstrap-responsive.css | 1109 --- .../static/css/bootstrap-responsive.min.css | 9 - src/main/webapp/static/css/bootstrap.css | 6167 ----------------- src/main/webapp/static/css/bootstrap.min.css | 9 - .../static/img/glyphicons-halflings-white.png | Bin 8777 -> 0 bytes .../static/img/glyphicons-halflings.png | Bin 12799 -> 0 bytes src/main/webapp/static/js/bootstrap.js | 2280 ------ src/main/webapp/static/js/bootstrap.min.js | 6 - src/main/webapp/static/js/jquery.min.js | 4 - 29 files changed, 2304 insertions(+), 9879 deletions(-) delete mode 100644 src/main/webapp/static/com/atomgraph/client/css/bootstrap.css create mode 100644 src/main/webapp/static/com/atomgraph/client/css/client.css create mode 100644 src/main/webapp/static/com/atomgraph/client/css/colors_and_type.css create mode 100644 src/main/webapp/static/com/atomgraph/client/css/controls.css create mode 100644 src/main/webapp/static/com/atomgraph/client/css/core.css create mode 100644 src/main/webapp/static/com/atomgraph/client/css/overlays.css create mode 100644 src/main/webapp/static/com/atomgraph/client/css/surfaces.css delete mode 100644 src/main/webapp/static/com/atomgraph/client/js/UUID.js create mode 100644 src/main/webapp/static/com/atomgraph/client/js/client.js delete mode 100644 src/main/webapp/static/com/atomgraph/client/js/google-maps.js delete mode 100644 src/main/webapp/static/com/atomgraph/client/js/jquery.js delete mode 100644 src/main/webapp/static/css/bootstrap-responsive.css delete mode 100644 src/main/webapp/static/css/bootstrap-responsive.min.css delete mode 100644 src/main/webapp/static/css/bootstrap.css delete mode 100644 src/main/webapp/static/css/bootstrap.min.css delete mode 100644 src/main/webapp/static/img/glyphicons-halflings-white.png delete mode 100644 src/main/webapp/static/img/glyphicons-halflings.png delete mode 100644 src/main/webapp/static/js/bootstrap.js delete mode 100644 src/main/webapp/static/js/bootstrap.min.js delete mode 100644 src/main/webapp/static/js/jquery.min.js diff --git a/pom.xml b/pom.xml index e9087a8b..a28b0b99 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.atomgraph client - 5.0.5-SNAPSHOT + 6.0.0-SNAPSHOT ${packaging.type} AtomGraph Web-Client diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 2c41f952..d67471fd 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -8,7 +8,7 @@ Generic Linked Data client https://w3id.org/atomgraph/client#stylesheet - static/com/atomgraph/client/xsl/bootstrap/2.3.2/external-layout.xsl + static/com/atomgraph/client/xsl/external-layout.xsl https://w3id.org/atomgraph/core#resultLimit diff --git a/src/main/webapp/static/com/atomgraph/client/css/bootstrap.css b/src/main/webapp/static/com/atomgraph/client/css/bootstrap.css deleted file mode 100644 index cfc30ec1..00000000 --- a/src/main/webapp/static/com/atomgraph/client/css/bootstrap.css +++ /dev/null @@ -1,19 +0,0 @@ -body { padding-top: 120px; padding-bottom: 40px; } -.brand img { height: 0.8em; width: auto; } -form.form-inline { margin: 0; } -ul.inline { margin-left: 0; max-height: 7em; overflow-y: auto; } -.inline li { display: inline; } -.btn-type.btn-primary { font-weight: bold; background: inherit; } -.well-small { background-color: #FAFAFA; } -.well-small dl { max-height: 60em; overflow-y: auto; } -textarea#query-string { font-family: monospace; } -.thumbnail img { display: block; margin: auto; } -.thumbnail { min-height: 15em; } -#map-canvas { height: 35em; width: 100%; } -ul.typeahead { max-height: 20em; overflow: auto; } -label.typeahead input { display: block; max-width: 160px; } -label.typeahead { float: left; width: 160px; } - -/* SVG */ - -g.subject:hover circle { stroke-width: 2; } \ No newline at end of file diff --git a/src/main/webapp/static/com/atomgraph/client/css/client.css b/src/main/webapp/static/com/atomgraph/client/css/client.css new file mode 100644 index 00000000..c21f9c57 --- /dev/null +++ b/src/main/webapp/static/com/atomgraph/client/css/client.css @@ -0,0 +1,126 @@ +/* ========================================================================= + Web-Client browser chrome — composition styles for the stylesheets' own + markup: page shell, resource blocks, collections, results table, form rows. + Tokens come from colors_and_type.css and the primitives from the core kit; + this file never redefines either. + ========================================================================= */ + +@import url('https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap'); + +* { box-sizing: border-box; } +html, body { margin: 0; padding: 0; } +body { background: var(--surface-1); color: var(--fg-1); font-family: var(--font-sans); font-size: var(--fs-base); line-height: var(--lh-base); } +a { color: var(--fg-link); text-decoration: none; } +a:hover { text-decoration: underline; } +img { max-width: 100%; } +pre { background: var(--surface-2); border: 1px solid var(--border-default); border-radius: var(--r-sm); padding: var(--sp-3); overflow-x: auto; font-family: var(--font-mono); font-size: var(--fs-sm); } + +/* ---------- page shell ---------- */ +.header { display: flex; align-items: center; gap: var(--sp-4); padding: var(--sp-3) var(--sp-6); background: var(--surface-0); border-bottom: 1px solid var(--border-default); flex-wrap: wrap; } +.header .brand { display: inline-flex; align-items: center; flex-shrink: 0; } +.header .brand img { display: block; max-height: 36px; } +.header .uri-form { display: flex; align-items: center; gap: var(--sp-2); flex: 1 1 24rem; min-width: 0; margin: 0; } +.header .uri-form .ldhc-field { flex: 1 1 auto; min-width: 0; } +.header .nav { display: flex; align-items: center; gap: var(--sp-4); list-style: none; margin: 0 0 0 auto; padding: 0; } + +.action-bar { display: flex; align-items: center; gap: var(--sp-4); padding: var(--sp-2) var(--sp-6); background: var(--surface-0); border-bottom: 1px solid var(--border-default); flex-wrap: wrap; } +.ab-left { flex: 0 0 auto; } +.ab-main { display: flex; align-items: center; gap: var(--sp-3); flex: 1 1 auto; min-width: 0; } +.ab-main .breadcrumb { flex: 1 1 auto; } +.ab-main .actions { display: flex; align-items: center; gap: var(--sp-2); } +.ab-main .actions form { margin: 0; } + +.breadcrumb { display: flex; align-items: center; gap: 4px; list-style: none; margin: 0; padding: 0; min-width: 0; overflow: hidden; } +.breadcrumb li { display: flex; align-items: center; gap: 4px; min-width: 0; } +.breadcrumb li a { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.breadcrumb .msi { color: var(--fg-hint); flex-shrink: 0; } + +.content { display: flex; align-items: flex-start; gap: var(--sp-5); width: 100%; max-width: 1400px; margin: 0 auto; padding: var(--sp-5) var(--sp-6); } +.main { flex: 1 1 auto; min-width: 0; } +.aside { flex: 0 0 320px; min-width: 0; } + +.footer { padding: var(--sp-5) var(--sp-6); border-top: 1px solid var(--border-default); color: var(--fg-muted); font-size: var(--fs-sm); text-align: center; } +.footer p { margin: 0; } + +/* ---------- menus:
-based dropdowns, no script ---------- */ +.menu { position: relative; display: inline-block; } +.menu > summary { list-style: none; cursor: pointer; } +.menu > summary::-webkit-details-marker { display: none; } +.menu > .menu-list { position: absolute; right: 0; top: calc(100% + 6px); z-index: 10; min-width: 180px; margin: 0; padding: var(--sp-1); list-style: none; background: var(--surface-0); border: 1px solid var(--border-default); border-radius: var(--r-md); box-shadow: var(--shadow-md); } +.menu-list li a { display: block; padding: var(--sp-2) var(--sp-3); border-radius: var(--r-sm); color: var(--fg-1); white-space: nowrap; } +.menu-list li a:hover { background: var(--bg-hover); text-decoration: none; } +.menu-list li.is-active a { background: var(--bg-selected); color: var(--fg-selected); } + +/* ---------- resource blocks ---------- */ +.block { background: var(--bg-card); border: 1px solid var(--border-default); border-radius: var(--r-lg); padding: var(--sp-5); margin-bottom: var(--sp-4); min-width: 0; } +.block-header { position: relative; } +.block-header > .actions { position: absolute; top: 0; right: 0; display: flex; gap: var(--sp-2); } +.block-header > .actions form { margin: 0; } +.block-header h2 { margin: 0 0 var(--sp-1); font-size: var(--fs-xl); font-weight: var(--fw-semibold); letter-spacing: var(--tracking-snug); overflow-wrap: break-word; } +.block-header .description { margin: 0 0 var(--sp-2); color: var(--fg-2); max-width: 78ch; } +.depiction { display: block; margin-bottom: var(--sp-3); } +.depiction img { display: block; max-height: 200px; border-radius: var(--r-md); } + +.types { display: flex; flex-wrap: wrap; gap: var(--sp-2); list-style: none; margin: 0; padding: 0; font-size: var(--fs-sm); } +.types li { display: inline-flex; min-width: 0; } + +/* ---------- read-mode property list ---------- */ +.properties { display: grid; grid-template-columns: minmax(140px, 220px) 1fr; column-gap: var(--sp-4); row-gap: var(--sp-1); margin: var(--sp-4) 0 0; } +.properties dt { font-weight: var(--fw-medium); color: var(--fg-2); min-width: 0; overflow-wrap: break-word; } +.properties dd { margin: 0; min-width: 0; overflow-wrap: break-word; } +.properties dd .ldhc-tag { margin-right: var(--sp-1); } + +/* ---------- collections ---------- */ +.resource-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--sp-4); } +.resource-list > li { position: relative; background: var(--bg-card); border: 1px solid var(--border-default); border-radius: var(--r-lg); padding: var(--sp-5); min-width: 0; } +.resource-list > li > .actions { position: absolute; top: var(--sp-4); right: var(--sp-4); display: flex; gap: var(--sp-2); } +.resource-list > li > .actions form { margin: 0; } +.resource-list h2 { margin: 0 0 var(--sp-1); font-size: var(--fs-lg); font-weight: var(--fw-semibold); } + +.resource-grid { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: var(--sp-4); } +.resource-grid > li { min-width: 0; display: flex; } +.resource-grid .ldhc-card { flex: 1; min-width: 0; } +.resource-grid .depiction { margin: 0; } +.resource-grid .depiction img { width: 100%; max-height: 180px; object-fit: cover; border-radius: var(--r-md) var(--r-md) 0 0; } +.resource-grid h2 { margin: 0 0 var(--sp-1); font-size: var(--fs-base); font-weight: var(--fw-medium); } +.resource-grid .ldhc-card-body { position: relative; } +.resource-grid .ldhc-card-body > .actions { display: flex; gap: var(--sp-2); margin-bottom: var(--sp-2); } +.resource-grid .ldhc-card-body > .actions form { margin: 0; } + +/* ---------- results table: native table layout, the column count is data-driven ---------- */ +.results-table { width: 100%; border-collapse: collapse; font-size: var(--fs-sm); background: var(--surface-0); border: 1px solid var(--border-default); border-radius: var(--r-sm); } +.results-table th, .results-table td { padding: var(--sp-2) var(--sp-3); border-bottom: 1px solid var(--border-default); text-align: left; vertical-align: middle; } +.results-table tr:last-child > td { border-bottom: 0; } +.results-table thead th { font-family: var(--font-mono); font-size: 10px; letter-spacing: var(--tracking-wide); text-transform: uppercase; font-weight: var(--fw-regular); color: var(--fg-hint); background: var(--surface-2); } +.results-table tbody tr:hover > td { background: var(--surface-1); } +.results-table td > .values { max-height: 12em; overflow-y: auto; min-width: 0; overflow-wrap: break-word; } +.results-table td img { max-height: 60px; border-radius: var(--r-xs); vertical-align: middle; } + +/* ---------- forms ---------- */ +fieldset { border: 0; padding: 0; margin: 0 0 var(--sp-5); min-inline-size: 0; } +legend { padding: 0; margin: 0 0 var(--sp-3); font-size: var(--fs-lg); font-weight: var(--fw-semibold); color: var(--fg-1); } +fieldset .description { margin: 0 0 var(--sp-4); color: var(--fg-2); } + +/* one statement row: predicate label · value controls · term annotations */ +.statement { display: grid; grid-template-columns: minmax(140px, 220px) 1fr; column-gap: var(--sp-4); align-items: start; padding: var(--sp-2) 0; border-bottom: 1px solid var(--border-default); } +.statement:last-of-type { border-bottom: 0; } +.statement > .ldhc-label { padding-top: 6px; overflow-wrap: break-word; min-width: 0; } +.statement > .values { grid-column: 2; display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2); min-width: 0; } +.statement > .ldhc-label ~ .values { grid-column: auto; } +.statement > .annotations { grid-column: 2; display: flex; align-items: center; gap: var(--sp-2); margin-top: var(--sp-1); } +.statement .ldhc-field { flex: 0 1 340px; min-width: 0; } +.statement .ldhc-field:has(textarea) { flex: 1 1 100%; } +.statement.is-invalid .ldhc-field-box { border-color: var(--danger-500); } +.annotations .ldhc-field { width: 12ch; flex: 0 0 auto; } + +.form-actions { display: flex; justify-content: flex-end; gap: var(--sp-2); padding: var(--sp-4) 0 0; } + +/* ---------- SPARQL editor ---------- */ +.query-form .ldhc-label { display: block; margin-bottom: var(--sp-1); } +.query-form .ldhc-field { margin-bottom: var(--sp-3); } + +/* ---------- map ---------- */ +.map-canvas { width: 100%; height: 480px; border-radius: var(--r-md); background: var(--surface-2); } + +/* ---------- alerts fill their column ---------- */ +.main > .ldhc-alert { margin-bottom: var(--sp-4); } diff --git a/src/main/webapp/static/com/atomgraph/client/css/colors_and_type.css b/src/main/webapp/static/com/atomgraph/client/css/colors_and_type.css new file mode 100644 index 00000000..d27bd320 --- /dev/null +++ b/src/main/webapp/static/com/atomgraph/client/css/colors_and_type.css @@ -0,0 +1,437 @@ +/* ========================================================================= + LinkedDataHub Design System — Tokens + Base palette + typography for the LinkedDataHub Knowledge Graph platform. + Remix of the legacy Bootstrap 2 / Material UI with Base44-style whitespace, + pastel gradients and modern variable-font typography. + ========================================================================= */ + +/* Fonts loaded via Google Fonts — substitutions noted in README. */ +@import url('https://fonts.googleapis.com/css2?family=Geist:wght@300..800&family=Geist+Mono:wght@400..700&family=Instrument+Serif:ital@0;1&display=swap'); + +:root { + /* ---------- Color: Brand / Primary ---------- */ + /* Pulled from the live product. The blue is the action color, the violet the + "structured / semantic" accent (used historically on RDF-typed labels). */ + --ldh-blue-50: #eef5ff; + --ldh-blue-100: #dbeafe; + --ldh-blue-200: #b8d3fd; + --ldh-blue-300: #8bb7fb; + --ldh-blue-400: #4d94f8; + --ldh-blue-500: #0f82f5; /* Brand primary — matches legacy product */ + --ldh-blue-600: #086ad6; + --ldh-blue-700: #0a55a8; + --ldh-blue-800: #0d4382; + --ldh-blue-900: #0a2d57; + + --ldh-violet-50: #faf5ff; + --ldh-violet-100: #f1e6fb; + --ldh-violet-200: #e1cdf6; + --ldh-violet-300: #c9a6ed; + --ldh-violet-400: #ad7adf; + --ldh-violet-500: #9954bb; /* Brand accent — historical RDF tag color */ + --ldh-violet-600: #803fa1; + --ldh-violet-700: #63307c; + --ldh-violet-800: #482358; + --ldh-violet-900: #2e1638; + + /* ---------- Color: Pastel surface palette ---------- */ + /* These wash backgrounds for hero / landing / category surfaces. Always paired + with --ink-1 text. Use as `background: var(--surf-lavender)` or composed in + a mesh gradient (see Visual Foundations in README). */ + --surf-lavender: #efeaff; + --surf-mint: #e6f6ee; + --surf-peach: #ffece1; + --surf-sky: #e3f1ff; + --surf-blush: #ffe6ee; + --surf-sand: #fcf5e7; + + /* Pre-built gradients — used on hero / featured cards. */ + --grad-aurora: linear-gradient(135deg, #efeaff 0%, #e3f1ff 50%, #e6f6ee 100%); /* @kind color */ + --grad-dawn: linear-gradient(135deg, #ffece1 0%, #ffe6ee 60%, #efeaff 100%); /* @kind color */ + --grad-noon: linear-gradient(135deg, #e3f1ff 0%, #ffffff 50%, #efeaff 100%); /* @kind color */ + --grad-deep: linear-gradient(135deg, #0a2d57 0%, #482358 100%); /* @kind color */ + --grad-radial-spot: radial-gradient(60% 60% at 30% 20%, #efeaff 0%, transparent 60%), + radial-gradient(50% 50% at 80% 70%, #e3f1ff 0%, transparent 65%), + #ffffff; /* @kind color */ + + /* ---------- Color: Neutrals ---------- */ + /* Warm-white surfaces, near-black ink. NOT pure greys — slight blue undertone + to harmonise with the brand blue. */ + --ink-1: #0b0e14; /* primary text, headings */ + --ink-2: #2b3245; /* body text */ + --ink-3: #545b6e; /* secondary text, meta */ + --ink-4: #8a91a3; /* tertiary / hint */ + --ink-5: #b6bccc; /* disabled */ + + --surface-0: #ffffff; /* card / dialog */ + --surface-1: #fafbfd; /* page */ + --surface-2: #f3f5f9; /* recessed wells, table stripes */ + --surface-3: #e8ebf2; /* dividers, subtle borders */ + --line-1: #e2e6ee; /* default border */ + --line-2: #cdd3df; /* stronger border, focus ring outer */ + + /* ---------- Color: Semantic ---------- */ + --success-500: #14a06a; + --success-50: #e6f6ee; + --warning-500: #d48a08; + --warning-50: #fff4dc; + --danger-500: #d63a3a; + --danger-600: #b62f2f; + --danger-50: #ffe6e6; + /* Ink for text/icons sitting ON a --danger-500 fill. A token, not a literal: + skins whose danger is a light tint need dark ink here instead of white. */ + --fg-on-danger: #ffffff; + --info-500: var(--ldh-blue-500); + --info-50: var(--ldh-blue-50); + + /* ---------- RDF semantic colors ---------- + Used to colour-code RDF node types in graph / list / table views. + Pulled from the live product (force-graph palette). */ + --rdf-class: #9954bb; /* purple — owl:Class instances */ + --rdf-resource: #4d94f8; /* blue — generic resources */ + --rdf-literal: #14a06a; /* green — literals / values */ + --rdf-blank: #d48a08; /* amber — blank nodes */ + --rdf-named: #ad7adf; /* light violet — named graphs */ + + /* =========================================================================== + PALETTE GOVERNANCE — how to choose among the many hues without drift. + --------------------------------------------------------------------------- + 1. BLUE is the only interaction color. Buttons, links, focus, selected + state — all blue. Nothing else means "clickable". + 2. VIOLET is decoration ONLY where it overlaps RDF: note that --ldh-violet-500 + and --rdf-class are the SAME purple by design. Use the violet ramp for + chrome accents *sparingly* (it reads as "structured/semantic"); use the + --rdf-* tokens whenever the color is ENCODING a node type in data/viz. + Never use violet as a second action color — that competes with blue. + 3. RDF-* tokens are DATA ENCODING, not decoration. Only use them where the + hue carries meaning (graph nodes, type pills, legends). + 4. SEMANTIC (success/warning/danger) = status only, never decoration. + 5. PASTEL surfaces + GRADIENTS are HERO-ONLY: document intros, landing / + category wash, empty-state art. Never behind body content or as a + default card background — that's the fastest route to "gradient slop". + =========================================================================== */ + + /* ---------- Typography: Families ---------- */ + --font-sans: 'Geist', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; + --font-mono: 'Geist Mono', 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace; + --font-display: 'Instrument Serif', Georgia, 'Times New Roman', serif; + + /* ---------- Typography: Scale ---------- */ + /* Modular scale ~1.25 (major third). Tuned for dense info-dense UI plus the + big-headline pastel hero moments. + ROLE MAP (the low end is tight on purpose — assign by role, don't eyeball): + --fs-xs 12 mono meta: IRIs, counts, timestamps, eyebrows, tags + --fs-sm 13 secondary UI: labels, table cells, buttons, captions + --fs-base 15 DEFAULT body & UI text ← start here + --fs-md 17 lead paragraphs / emphasised body only + --fs-lg+ 20+ headings (use the .ldh-h* classes, not raw sizes) + Rule: body/UI is base; drop to sm only for genuinely secondary text; xs is + mono-meta only. If you reach for md on plain UI, you probably want base. */ + --fs-xs: 12px; + --fs-sm: 13px; + --fs-base: 15px; + --fs-md: 17px; + --fs-lg: 20px; + --fs-xl: 24px; + --fs-2xl: 30px; + --fs-3xl: 38px; + --fs-4xl: 48px; + --fs-5xl: 64px; + --fs-6xl: 88px; + + /* ---------- Typography: Weights ---------- */ + --fw-regular: 400; /* @kind font */ + --fw-medium: 500; /* @kind font */ + --fw-semibold: 600; /* @kind font */ + --fw-bold: 700; /* @kind font */ + + /* ---------- Typography: Line heights ---------- */ + --lh-tight: 1.1; /* @kind font */ + --lh-snug: 1.25; /* @kind font */ + --lh-base: 1.55; /* @kind font */ + --lh-relaxed: 1.7; /* @kind font */ + + /* ---------- Typography: Letter spacing ---------- */ + --tracking-tight: -0.03em; /* display */ + --tracking-snug: -0.015em; /* headings */ + --tracking-normal: 0; + --tracking-wide: 0.04em; /* eyebrows, all-caps labels */ + --tracking-widest: 0.18em; /* big over-line labels */ + + /* ---------- Radius ---------- */ + --r-xs: 4px; + --r-sm: 6px; + --r-md: 10px; + --r-lg: 16px; + --r-xl: 20px; + --r-2xl: 28px; + --r-pill: 999px; + + /* ---------- Spacing scale (4px base) ---------- */ + --sp-1: 4px; + --sp-2: 8px; + --sp-3: 12px; + --sp-4: 16px; + --sp-5: 20px; + --sp-6: 24px; + --sp-8: 32px; + --sp-10: 40px; + --sp-12: 48px; + --sp-16: 64px; + --sp-20: 80px; + --sp-24: 96px; + --sp-32: 128px; + + /* ---------- Elevation (shadows) ---------- */ + /* Soft, low-contrast shadows — Base44 / glass vibe, not Material's harder cast. */ + --shadow-xs: 0 1px 2px rgba(15, 23, 42, 0.04); + --shadow-sm: 0 2px 8px rgba(15, 23, 42, 0.05), 0 1px 2px rgba(15, 23, 42, 0.04); + --shadow-md: 0 8px 24px -8px rgba(15, 23, 42, 0.10), 0 2px 4px rgba(15, 23, 42, 0.04); + --shadow-lg: 0 24px 48px -16px rgba(15, 23, 42, 0.18), 0 4px 12px rgba(15, 23, 42, 0.05); + --shadow-xl: 0 40px 80px -24px rgba(15, 23, 42, 0.22), 0 8px 16px rgba(15, 23, 42, 0.06); + --shadow-glow-blue: 0 0 0 4px rgba(15, 130, 245, 0.18); + --shadow-glow-violet: 0 0 0 4px rgba(153, 84, 187, 0.16); + + /* Hairline inset highlight for cards on dark backgrounds */ + --inset-hairline: inset 0 1px 0 rgba(255,255,255,0.6); + + /* ---------- Motion ---------- */ + --ease-out-soft: cubic-bezier(0.22, 1, 0.36, 1); /* @kind other */ + --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1); /* @kind other */ + --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); /* @kind other */ + --dur-fast: 120ms; /* @kind other */ + --dur-base: 200ms; /* @kind other */ + --dur-slow: 360ms; /* @kind other */ + --dur-xslow: 640ms; /* @kind other */ + + /* ---------- Layout ---------- */ + --container-sm: 720px; + --container-md: 960px; + --container-lg: 1200px; + --container-xl: 1440px; + + /* ---------- Semantic: Foreground tokens (consume these in components) ---------- */ + --fg-1: var(--ink-1); + --fg-2: var(--ink-2); + --fg-muted: var(--ink-3); + /* Hint text: deliberately NOT ink-4 — ink-4 (#8a91a3) is ~3:1 on white and + fails WCAG AA for text. ink-4 is reserved for non-text use (icons that pair + with a label, hairline borders, disabled glyphs). For actual hint *text* + use this AA-safe value (~5.7:1 on the page surface). */ + --fg-hint: #5f6677; + --fg-on-accent: #ffffff; + --fg-link: var(--ldh-blue-600); + + --bg-page: var(--surface-1); + --bg-card: var(--surface-0); + --bg-recess: var(--surface-2); + /* Action color for text-bearing fills (filled buttons). blue-500 (#0f82f5) + is only ~3.3:1 against white text — it FAILS AA. blue-600 (#086ad6) clears + it at ~4.6:1, so the accent fill is pinned to 600, not 500. blue-500 stays + available as a primitive for non-text accents (dots, focus glints). */ + --bg-accent: var(--ldh-blue-600); + --bg-accent-hover: var(--ldh-blue-700); + --bg-accent-quiet: var(--ldh-blue-50); + + /* Inverse ground — a FIXED white, identical in every theme, for controls that + sit on a dark bar or over imagery where the surrounding theme cannot be + relied on. Deliberately not --surface-0, which flips with the theme. */ + --bg-inverse: #ffffff; /* @kind color */ + --bg-inverse-hover: rgba(255,255,255,0.88); /* @kind color */ + + /* ---------- Semantic: Interactive states ---------- + First-class state tokens so components stop hand-rolling `surface-2` for + every hover. Use these for any hoverable/selectable surface. */ + --bg-hover: var(--surface-2); /* neutral hover (rows, ghost buttons, tabs) */ + --bg-active: var(--surface-3); /* pressed / held */ + --bg-selected: var(--bg-accent-quiet); /* current / on / selected surface */ + --fg-selected: var(--ldh-blue-700); /* text/icon on a selected surface */ + + --border-default: var(--line-1); + --border-strong: var(--line-2); + --focus-ring: var(--shadow-glow-blue); +} + +/* ========================================================================= + DARK THEME — set [data-theme="dark"] on . + The light theme funnels nearly everything through the neutral primitives + (ink-*, surface-*, line-*) and a small set of accent tints, so dark mode is + mostly a re-mapping of those primitives — the semantic layer and components + inherit it automatically. Accent *text* tints (blue/violet 600/700) flip + light; accent *fills* are pinned to literals so filled buttons keep AA. + ========================================================================= */ +:root[data-theme="dark"] { + /* Neutrals — cool dark slate, mirroring the light theme's blue undertone. */ + --ink-1: #f3f6fc; + --ink-2: #cfd6e3; + --ink-3: #9aa3b5; + --ink-4: #717a8d; + --ink-5: #4c5365; + + --surface-0: #171b24; /* card / dialog */ + --surface-1: #0f131a; /* page */ + --surface-2: #1e2430; /* recessed wells, hover */ + --surface-3: #2b323f; /* pressed, dividers */ + --line-1: #272e3a; + --line-2: #39414f; + + /* Accent TEXT tints flip light so they stay legible on dark surfaces. */ + --ldh-blue-50: #11243d; + --ldh-blue-100: #173558; + --ldh-blue-200: #1f4d7a; + --ldh-blue-600: #6aa6f7; + --ldh-blue-700: #93bdfb; + --ldh-violet-50: #241836; + --ldh-violet-100: #33214d; + --ldh-violet-700: #c9a6ed; + --success-500: #3ecb8f; --success-50: #102619; + --warning-500: #e6a52a; --warning-50: #2c2410; + --danger-500: #f06a6a; --danger-600: #d94f4f; --danger-50: #2e1414; + --fg-on-danger: #2e0f0f; + + /* Accent FILL stays a literal saturated blue so white button text keeps + AA (≈4.6:1) — independent of the now-light blue-600 text primitive. */ + --bg-accent: #086ad6; + --bg-accent-hover: #0a55a8; + + --fg-hint: #8a92a4; /* ~4.8:1 on the dark page */ + + /* Shadows need more weight to read on dark surfaces. */ + --shadow-xs: 0 1px 2px rgba(0,0,0,0.40); + --shadow-sm: 0 2px 8px rgba(0,0,0,0.45), 0 1px 2px rgba(0,0,0,0.40); + --shadow-md: 0 8px 24px -8px rgba(0,0,0,0.55), 0 2px 4px rgba(0,0,0,0.40); + --shadow-lg: 0 24px 48px -16px rgba(0,0,0,0.60), 0 4px 12px rgba(0,0,0,0.45); + --shadow-xl: 0 40px 80px -24px rgba(0,0,0,0.66), 0 8px 16px rgba(0,0,0,0.45); + --inset-hairline: inset 0 1px 0 rgba(255,255,255,0.06); +} + +/* ========================================================================= + Semantic typography classes — apply directly, or use as a reference for + component-level styles. + ========================================================================= */ + +.ldh-display { + font-family: var(--font-display); + font-weight: 400; + font-size: var(--fs-6xl); + line-height: var(--lh-tight); + letter-spacing: var(--tracking-tight); + color: var(--fg-1); + font-style: italic; +} + +.ldh-h1 { + font-family: var(--font-sans); + font-weight: var(--fw-semibold); + font-size: var(--fs-4xl); + line-height: var(--lh-tight); + letter-spacing: var(--tracking-tight); + color: var(--fg-1); +} + +.ldh-h2 { + font-family: var(--font-sans); + font-weight: var(--fw-semibold); + font-size: var(--fs-3xl); + line-height: var(--lh-snug); + letter-spacing: var(--tracking-snug); + color: var(--fg-1); +} + +.ldh-h3 { + font-family: var(--font-sans); + font-weight: var(--fw-semibold); + font-size: var(--fs-2xl); + line-height: var(--lh-snug); + letter-spacing: var(--tracking-snug); + color: var(--fg-1); +} + +.ldh-h4 { + font-family: var(--font-sans); + font-weight: var(--fw-semibold); + font-size: var(--fs-xl); + line-height: var(--lh-snug); + color: var(--fg-1); +} + +.ldh-h5 { + font-family: var(--font-sans); + font-weight: var(--fw-medium); + font-size: var(--fs-lg); + line-height: var(--lh-snug); + color: var(--fg-1); +} + +.ldh-body { + font-family: var(--font-sans); + font-weight: var(--fw-regular); + font-size: var(--fs-base); + line-height: var(--lh-base); + color: var(--fg-2); +} + +.ldh-body-lg { + font-family: var(--font-sans); + font-weight: var(--fw-regular); + font-size: var(--fs-md); + line-height: var(--lh-base); + color: var(--fg-2); +} + +.ldh-small { + font-family: var(--font-sans); + font-weight: var(--fw-regular); + font-size: var(--fs-sm); + line-height: var(--lh-base); + color: var(--fg-muted); +} + +.ldh-meta { + font-family: var(--font-sans); + font-weight: var(--fw-medium); + font-size: var(--fs-xs); + line-height: var(--lh-snug); + letter-spacing: var(--tracking-wide); + text-transform: uppercase; + color: var(--fg-muted); +} + +.ldh-eyebrow { + font-family: var(--font-mono); + font-weight: var(--fw-medium); + font-size: var(--fs-xs); + line-height: var(--lh-snug); + letter-spacing: var(--tracking-widest); + text-transform: uppercase; + color: var(--ldh-blue-600); +} + +.ldh-code { + font-family: var(--font-mono); + font-weight: var(--fw-regular); + font-size: 0.92em; + line-height: var(--lh-base); + color: var(--ink-2); + background: var(--surface-2); + padding: 1px 6px; + border-radius: var(--r-xs); +} + +/* Inline IRI / URI styling — a recurring element across LDH. */ +.ldh-iri { + font-family: var(--font-mono); + font-size: 0.94em; + color: var(--ldh-blue-700); + word-break: break-all; +} + +/* Reset-ish baseline for design previews */ +html, body { background: var(--bg-page); color: var(--fg-1); } +body { + font-family: var(--font-sans); + font-size: var(--fs-base); + line-height: var(--lh-base); + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; +} diff --git a/src/main/webapp/static/com/atomgraph/client/css/controls.css b/src/main/webapp/static/com/atomgraph/client/css/controls.css new file mode 100644 index 00000000..5074c528 --- /dev/null +++ b/src/main/webapp/static/com/atomgraph/client/css/controls.css @@ -0,0 +1,371 @@ +/* ========================================================================= + ui_kits/core/controls.css — form-control primitives + Select · Combobox · IconButton · FileInput · CodeField + + Every control here carries the full core contract: default / hover / active / + focus-visible / disabled, plus loading and invalid where relevant. Metrics + match .ldhc-field-box exactly (sm 32 / md 40 / lg 48) so a select, a combobox + and a text field line up in the same row. + + ONE FOCUS RING. Everything below uses --focus-ring. No control defines its + own; the transitional bridge's separate ring is retired. + ========================================================================= */ + +/* ========================================================================= + Select — the design-system replacement for a native

markup with grid-per-row layout, so the table layout algorithm + is switched off and the column tracks come from a --ldhc-cols custom property + the caller sets. That single variable is what collapsed four bespoke tables + into one: they differed by tracks, not by structure. + Explicit role attributes stay in the JSX — display:grid on a can drop + the implicit table roles. + ========================================================================= */ +.ldhc-table { + display: block; width: 100%; + border-collapse: collapse; border-spacing: 0; text-indent: 0; + background: var(--surface-0); + border: 1px solid var(--border-default); + border-radius: var(--r-md); + overflow: hidden; +} +.ldhc-table.ap-plain { border: 0; border-radius: 0; background: transparent; } +/* Dropdowns inside cells (the column-mapping table) need to escape the box. */ +.ldhc-table.is-overflowing { overflow: visible; } +.ldhc-table > thead, .ldhc-table > tbody { display: block; } +.ldhc-table > thead.ldhc-vh { display: none; } +.ldhc-table caption { caption-side: top; } +/* Declared here so the column-track input is a registered token with a sane + default, rather than a variable that only ever exists as an inline style. */ +:root { + --ldhc-cols: 1fr; /* @kind other */ +} +.ldhc-table tr { + display: grid; + grid-template-columns: var(--ldhc-cols, 1fr); + align-items: center; gap: var(--sp-3); + padding: var(--sp-2) var(--sp-3); +} +.ldhc-table.dn-comfy tr { padding: var(--sp-3); } +.ldhc-table.dn-tight tr { padding: 5px var(--sp-3); } +.ldhc-table th, .ldhc-table td { + padding: 0; vertical-align: inherit; + font-weight: inherit; text-align: left; + min-width: 0; +} +.ldhc-table thead tr { + background: var(--surface-2); + border-bottom: 1px solid var(--border-default); + font-family: var(--font-mono); font-size: 10px; + letter-spacing: var(--tracking-wide); text-transform: uppercase; + color: var(--fg-hint); +} +.ldhc-table tbody tr { + border-bottom: 1px solid var(--border-default); + font-size: var(--fs-sm); color: var(--fg-2); +} +.ldhc-table tbody tr:last-child { border-bottom: 0; } +.ldhc-table.is-hoverable tbody tr:hover { background: var(--surface-1); } +/* Cell decorations, shared by every table rather than redefined per variant. */ +.ldhc-table .num { text-align: right; font-variant-numeric: tabular-nums; } +.ldhc-table th.num { text-align: right; } +.ldhc-table .muted { color: var(--fg-muted); } +.ldhc-table .mono { font-family: var(--font-mono); font-size: var(--fs-xs); } +.ldhc-table .iri { + font-family: var(--font-mono); font-size: var(--fs-xs); + color: var(--ldh-blue-700); text-decoration: none; +} +.ldhc-table .iri:hover { text-decoration: underline; } +/* A SPARQL variable name in a result-set header. */ +.ldhc-table .var { + font-family: var(--font-mono); font-size: var(--fs-xs); + color: var(--ldh-violet-700); font-weight: var(--fw-medium); +} + +/* ========================================================================= + Avatar — initials, image or fallback glyph. + A solid accent disc: it sits on the header bar, which is dark under m3 and + light under base44, and --bg-accent / --fg-on-accent is the one pair legible + on both without a per-skin patch. + ========================================================================= */ +.ldhc-avatar { + display: inline-flex; align-items: center; justify-content: center; + flex-shrink: 0; padding: 0; overflow: hidden; + border: 0; border-radius: 50%; + background: var(--bg-accent); color: var(--fg-on-accent); + font-family: var(--font-sans); font-weight: var(--fw-semibold); + letter-spacing: 0.02em; line-height: 1; +} +.ldhc-avatar.sz-xs { width: 22px; height: 22px; font-size: 9px; } +.ldhc-avatar.sz-sm { width: 26px; height: 26px; font-size: 10px; } +.ldhc-avatar.sz-md { width: 32px; height: 32px; font-size: var(--fs-xs); } +.ldhc-avatar.sz-lg { width: 44px; height: 44px; font-size: var(--fs-base); } +.ldhc-avatar.sz-xl { width: 64px; height: 64px; font-size: var(--fs-lg); } +.ldhc-avatar > img { width: 100%; height: 100%; object-fit: cover; } +.ldhc-avatar.is-button { cursor: pointer; transition: filter var(--dur-fast) var(--ease-out-soft), box-shadow var(--dur-fast) var(--ease-out-soft); } +.ldhc-avatar.is-button:hover { filter: brightness(1.08); } +.ldhc-avatar.is-button:focus-visible { outline: 0; box-shadow: var(--focus-ring); } +.ldhc-avatar.is-open { box-shadow: 0 0 0 2px var(--surface-0), 0 0 0 4px var(--bg-accent); } + +/* ========================================================================= + Drawer — an edge-anchored panel. Square, hairline-bordered, quiet: it is + anchored to the viewport edge, not floating, so it takes no radius. + ========================================================================= */ +.ldhc-drawer { + position: fixed; top: 0; bottom: 0; z-index: 45; + display: flex; flex-direction: column; + width: min(360px, 92vw); + background: var(--surface-0); color: var(--fg-1); + box-shadow: -8px 0 24px -22px rgba(15, 23, 42, 0.16); + overflow: hidden; +} +.ldhc-drawer.sd-right { right: 0; border-left: 1px solid var(--border-default); animation: ldhc-drawer-r var(--dur-base) var(--ease-out-soft); } +.ldhc-drawer.sd-left { left: 0; border-right: 1px solid var(--border-default); animation: ldhc-drawer-l var(--dur-base) var(--ease-out-soft); } +@keyframes ldhc-drawer-r { from { transform: translateX(12px); opacity: 0; } } +@keyframes ldhc-drawer-l { from { transform: translateX(-12px); opacity: 0; } } +.ldhc-drawer.sz-sm { width: min(280px, 92vw); } +.ldhc-drawer.sz-lg { width: min(480px, 96vw); } +.ldhc-drawer-head { + display: flex; align-items: center; gap: var(--sp-2); flex-shrink: 0; + padding: var(--sp-3) var(--sp-4); + border-bottom: 1px solid var(--border-default); +} +.ldhc-drawer-title { flex: 1; min-width: 0; font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--fg-1); } +.ldhc-drawer-body { flex: 1; min-height: 0; overflow-y: auto; padding: var(--sp-3); } +.ldhc-drawer-foot { + flex-shrink: 0; padding: var(--sp-3) var(--sp-4); + border-top: 1px solid var(--border-default); +} + +/* ========================================================================= + Stepper — numbered steps for a multi-part flow. + ========================================================================= */ +.ldhc-stepper { display: flex; flex-direction: column; gap: var(--sp-5); } +.ldhc-step-head { display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap; margin-bottom: var(--sp-4); } +.ldhc-step-n { + width: 24px; height: 24px; flex-shrink: 0; + display: inline-flex; align-items: center; justify-content: center; + border-radius: var(--r-pill); + background: var(--bg-accent); color: var(--fg-on-accent); + font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: var(--fw-bold); +} +.ldhc-step-n.is-done { background: var(--success-500); color: #fff; } +.ldhc-step-n.is-todo { background: var(--surface-3); color: var(--fg-muted); } +.ldhc-step-n.is-error { background: var(--danger-500); color: #fff; } +.ldhc-step-title { margin: 0; font-size: var(--fs-md); font-weight: var(--fw-semibold); color: var(--fg-1); } +.ldhc-step-hint { font-size: var(--fs-sm); color: var(--fg-muted); } diff --git a/src/main/webapp/static/com/atomgraph/client/js/UUID.js b/src/main/webapp/static/com/atomgraph/client/js/UUID.js deleted file mode 100644 index 49e2bd69..00000000 --- a/src/main/webapp/static/com/atomgraph/client/js/UUID.js +++ /dev/null @@ -1,8 +0,0 @@ -function generateUUID() -{ - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) - { - var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); - return v.toString(16); - }); -} \ No newline at end of file diff --git a/src/main/webapp/static/com/atomgraph/client/js/client.js b/src/main/webapp/static/com/atomgraph/client/js/client.js new file mode 100644 index 00000000..ac6b4d12 --- /dev/null +++ b/src/main/webapp/static/com/atomgraph/client/js/client.js @@ -0,0 +1,49 @@ +/* Browser glue for the stylesheets' markup: statement add/remove in edit forms, + delete confirmation, and URI-form normalization. Dependency-free. */ + +document.addEventListener("submit", function(event) +{ + var form = event.target.closest(".uri-form"); + if (form === null) return; + + // a URI pasted into a label-typeahead field navigates directly instead of searching + var labelInput = form.querySelector("input[name=label]"); + if (labelInput !== null && /^https?:\/\//.test(labelInput.value)) + { + form.setAttribute("action", ""); + labelInput.setAttribute("name", "uri"); + } +}); + +document.addEventListener("click", function(event) +{ + var deleteBtn = event.target.closest(".btn-delete"); + if (deleteBtn !== null) + { + if (!confirm(deleteBtn.dataset.confirm || "Are you sure?")) event.preventDefault(); + return; + } + + var removeBtn = event.target.closest(".btn-remove-property"); + if (removeBtn !== null) + { + removeBtn.closest(".statement").remove(); + return; + } + + var addBtn = event.target.closest(".btn-add"); + if (addBtn !== null) + { + var statement = addBtn.closest(".statement"); + var clone = statement.cloneNode(true); + var uuid = "uuid" + crypto.randomUUID(); + clone.querySelectorAll("input[name=ou], input[name=ob], input[name=ol]").forEach(function(input) + { + input.id = uuid; + input.value = ""; + }); + var label = clone.querySelector("label"); + if (label !== null) label.setAttribute("for", uuid); + statement.after(clone); + } +}); diff --git a/src/main/webapp/static/com/atomgraph/client/js/google-maps.js b/src/main/webapp/static/com/atomgraph/client/js/google-maps.js deleted file mode 100644 index c4128872..00000000 --- a/src/main/webapp/static/com/atomgraph/client/js/google-maps.js +++ /dev/null @@ -1,13 +0,0 @@ -var map; // global variable; needs to be accessible later - -function initialize() -{ - var mapOptions = - { - center: new google.maps.LatLng(0, 0), - zoom: 1 - }; - map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions); -} - -google.maps.event.addDomListener(window, 'load', initialize); \ No newline at end of file diff --git a/src/main/webapp/static/com/atomgraph/client/js/jquery.js b/src/main/webapp/static/com/atomgraph/client/js/jquery.js deleted file mode 100644 index 88672953..00000000 --- a/src/main/webapp/static/com/atomgraph/client/js/jquery.js +++ /dev/null @@ -1,52 +0,0 @@ -var onRemoveButtonClick = function() -{ - return $(this).parent().parent().parent().remove(); -}; - -var onDropdownClick = function() -{ - $(this).toggleClass("open"); - - return true; -}; - -$(document).ready(function() -{ - - $(".navbar-form").on("submit", function() - { - var labelInput = $(this).find("input[name=label]"); - if (labelInput.length) // check whether label input exists - { - var uriOrLabel = labelInput.val(); - if (uriOrLabel.indexOf("http://") === 0 || uriOrLabel.indexOf("https://") === 0) - { - $(this).attr("action", ""); - $(this).find("input[name=label]").attr("name", "uri"); - } - } - - return true; - }); - - $(".btn-delete").on("click", function() // prompt on DELETE - { - return confirm('Are you sure?'); - }); - - $(".btn-remove-property").on("click", onRemoveButtonClick); - - $(".btn-group:has(.btn.dropdown-toggle)").on("click", onDropdownClick); - - $(".btn-add").on("click", function() - { - var clone = $(this).parent().parent().clone(true, true); - var uuid = "uuid" + generateUUID(); - var input = clone.find("input[name='ou'],input[name='ob'],input[name='ol']"); - input.attr("id", uuid); - input.val(""); - clone.find("label").attr("for", uuid); - return $(this).parent().parent().after(clone); - }); - -}); \ No newline at end of file diff --git a/src/main/webapp/static/com/atomgraph/client/xsl/container.xsl b/src/main/webapp/static/com/atomgraph/client/xsl/container.xsl index 82ac9bb0..9728bd5b 100644 --- a/src/main/webapp/static/com/atomgraph/client/xsl/container.xsl +++ b/src/main/webapp/static/com/atomgraph/client/xsl/container.xsl @@ -35,14 +35,16 @@ exclude-result-prefixes="#all"> - +
    + +
- + -
+
  • @@ -51,52 +53,43 @@ exclude-result-prefixes="#all"> - +

    -

    - -

    + +

    + +

    +
    -
  • +
    - + + - - +
      - - - - - -
      -
        - -
      -
      -
      +
    - + - - +
  • @@ -106,18 +99,20 @@ exclude-result-prefixes="#all"> -
    +
    -
    +

    -

    - -

    + +

    + +

    +
  • @@ -129,7 +124,7 @@ exclude-result-prefixes="#all"> - + @@ -146,15 +141,18 @@ exclude-result-prefixes="#all"> +
    - - + @@ -207,7 +205,7 @@ exclude-result-prefixes="#all"> -
    +
    diff --git a/src/main/webapp/static/com/atomgraph/client/xsl/document.xsl b/src/main/webapp/static/com/atomgraph/client/xsl/document.xsl index 77a5f163..14da2fd4 100644 --- a/src/main/webapp/static/com/atomgraph/client/xsl/document.xsl +++ b/src/main/webapp/static/com/atomgraph/client/xsl/document.xsl @@ -69,8 +69,8 @@ exclude-result-prefixes="#all"> - - + + @@ -122,10 +122,13 @@ exclude-result-prefixes="#all"> - - + +
    - +
    diff --git a/src/main/webapp/static/com/atomgraph/client/xsl/imports/default.xsl b/src/main/webapp/static/com/atomgraph/client/xsl/imports/default.xsl index 9570f2c7..27a30c11 100644 --- a/src/main/webapp/static/com/atomgraph/client/xsl/imports/default.xsl +++ b/src/main/webapp/static/com/atomgraph/client/xsl/imports/default.xsl @@ -466,7 +466,7 @@ exclude-result-prefixes="#all"> -
    @@ -532,6 +532,10 @@ exclude-result-prefixes="#all"> + +
    + +
    + Resource
    +
    + +
    @@ -545,7 +549,7 @@ exclude-result-prefixes="#all">
    - + diff --git a/src/main/webapp/static/com/atomgraph/client/xsl/layout.xsl b/src/main/webapp/static/com/atomgraph/client/xsl/layout.xsl index 7922e454..e05c7846 100644 --- a/src/main/webapp/static/com/atomgraph/client/xsl/layout.xsl +++ b/src/main/webapp/static/com/atomgraph/client/xsl/layout.xsl @@ -55,7 +55,7 @@ exclude-result-prefixes="#all"> - + @@ -148,70 +148,63 @@ exclude-result-prefixes="#all"> -
    -
    - +
    + - -
    +
    - + - + -