@matdata/yasgui-graph-plugin 1.4.1 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -13,9 +13,11 @@ A YASGUI plugin for visualizing SPARQL CONSTRUCT and DESCRIBE query results as i
13
13
  - 🟢 Light Green (#a6c8a6ff) = Literals
14
14
  - ⚪ Light Grey (#c5c5c5ff) = Blank nodes
15
15
  - 🟠 Orange (#e15b13ff) = rdf:type objects (classes)
16
+ - **🖼️ Node Icons & Images**: Render images or emoji/icons on nodes via `schema:image` / `schema:icon` properties (see [Node icons and images](#node-icons-and-images))
17
+ - **� Compact Mode**: Hide literal and class nodes; show rdf:type and datatype properties in enhanced tooltips instead
16
18
  - **🔍 Navigation**: Mouse wheel zoom, drag to pan, "Zoom to Fit" button
17
- - **✋ Drag & Drop**: Reorganize nodes by dragging them to new positions
18
- - **💬 Tooltips**: Hover for full URI/literal details (300ms delay)
19
+ - **✋ Drag & Drop**: Reorganize nodes by dragging them to new positions (nodes stay pinned after manual drag)
20
+ - **💬 Rich Tooltips**: Modern HTML tooltips with node type, value, namespace, and datatype information
19
21
  - **🌓 Theme Support**: Automatic light/dark mode detection and dynamic color switching
20
22
  - **⚡ Performance**: Handles up to 1,000 nodes with <2s render time
21
23
  - **♿ Accessible**: WCAG AA color contrast, keyboard navigation support
@@ -102,8 +104,8 @@ After running the query, click the **"Graph"** tab to see the visualization.
102
104
  - **Fit to View**: Click the "Zoom to Fit" button to center the entire graph
103
105
 
104
106
  ### Interaction
105
- - **Drag Nodes**: Click and drag any node to reposition it
106
- - **Tooltips**: Hover over nodes/edges for 300ms to see full details
107
+ - **Drag Nodes**: Click and drag any node to reposition it (nodes are automatically pinned in place after dragging)
108
+ - **Tooltips**: Hover over nodes/edges to see rich HTML tooltips with type, value, namespace, and datatype information
107
109
 
108
110
  ### Understanding Colors
109
111
 
@@ -116,23 +118,122 @@ After running the query, click the **"Graph"** tab to see the visualization.
116
118
 
117
119
  ## ⚙️ Configuration
118
120
 
119
- The plugin uses sensible defaults but can be customized by extending the `GraphPlugin` class:
121
+ The plugin ships with sensible defaults and stores every change in **`localStorage`** so settings survive page reloads.
122
+
123
+ ### Settings panel
124
+
125
+ Click the **⚙ Settings** button (top-right of the graph) to open the settings panel.
126
+
127
+ | Setting | Values | Default | Description |
128
+ |---------|--------|---------|-------------|
129
+ | **Compact mode** | on / off | off | Hide literal and class nodes; show rdf:type and datatype properties in tooltips instead |
130
+ | **Arrow style** | Curved / Straight | Curved | Toggle between smooth curved edges and straight lines between nodes |
131
+ | **Predicate display** | Label / Icon / Hidden | Icon | Show the full prefixed URI on edges, a compact symbol/icon, or nothing |
132
+ | **Show literals** | on / off | on | Include or exclude literal value nodes (strings, numbers, dates, …) |
133
+ | **Show classes** | on / off | on | Include or exclude nodes that are objects of `rdf:type` triples (class nodes) |
134
+ | **Show blank nodes** | on / off | on | Include or exclude blank nodes (`_:b0`, `_:b1`, …) |
135
+ | **Show node labels** | on / off | on | Render the prefixed URI / literal text inside each node |
136
+ | **Enable physics** | on / off | on | Keep the force-directed layout simulation running so nodes keep adjusting |
137
+ | **Node size** | Small / Medium / Large | Medium | Set the radius of all nodes |
138
+
139
+ ### Predicate icons
140
+
141
+ When *Predicate display* is set to **Icon**, each edge displays a compact symbol instead of the full label. Symbols are defined for the 20+ most common predicates:
142
+
143
+ | Predicate | Symbol |
144
+ |-----------|--------|
145
+ | `rdf:type` | `a` |
146
+ | `rdfs:label` | `lbl` |
147
+ | `rdfs:comment` | `cmt` |
148
+ | `rdfs:subClassOf` | `⊂` |
149
+ | `rdfs:subPropertyOf` | `⊆` |
150
+ | `rdfs:domain` | `dom` |
151
+ | `rdfs:range` | `rng` |
152
+ | `rdfs:seeAlso` | `see` |
153
+ | `rdfs:isDefinedBy` | `idb` |
154
+ | `owl:sameAs` | `≡` |
155
+ | `owl:equivalentClass` | `≅` |
156
+ | `owl:inverseOf` | `⇄` |
157
+ | `owl:disjointWith` | `≠` |
158
+ | `skos:prefLabel` | `★` |
159
+ | `skos:altLabel` | `☆` |
160
+ | `skos:definition` | `def` |
161
+ | `skos:broader` | `↑` |
162
+ | `skos:narrower` | `↓` |
163
+ | `skos:related` | `↔` |
164
+ | `skos:note` | `note` |
165
+ | `skos:exactMatch` | `≡` |
166
+ | `skos:closeMatch` | `≈` |
167
+ | `dcterms:title` | `ttl` |
168
+ | `dcterms:description` | `dsc` |
169
+ | `dcterms:created` | `crt` |
170
+ | `dcterms:modified` | `mod` |
171
+ | `dcterms:creator` | `by` |
172
+ | `dcterms:subject` | `sbj` |
173
+ | `foaf:name` | `nm` |
174
+ | `foaf:knows` | `⟷` |
175
+ | `foaf:member` | `mbr` |
176
+ | `schema:name` | `nm` |
177
+ | `schema:description` | `dsc` |
178
+
179
+ For predicates not in the table the full prefixed label is used as a fallback.
180
+
181
+ ## 🖼️ Node icons and images
182
+
183
+ Any URI node can display an image or an icon instead of (or in addition to) the default coloured dot by attaching `schema:image` or `schema:icon` as a property directly in the SPARQL result.
184
+
185
+ | Property | Object | Effect |
186
+ |----------|--------|--------|
187
+ | `schema:image` (`https://schema.org/image`) | URL literal or URI | Node is rendered as a circular image |
188
+ | `schema:icon` (`https://schema.org/icon`) | emoji / short string | The string is used as the node's label |
189
+
190
+ `schema:icon` takes priority over `schema:image`. The corresponding `schema:icon`/`schema:image` triples are **not** rendered as separate nodes or edges, but their values **are** shown in the node tooltip. Similarly, any `rdfs:label` triple is consumed to determine the node's displayed label and is never drawn as an edge, even when predicate display is enabled.
191
+
192
+ ### Example – inline image on a resource
193
+
194
+ ```sparql
195
+ CONSTRUCT {
196
+ ex:alice schema:image <https://example.com/alice.png> .
197
+ ex:alice ex:knows ex:bob .
198
+ }
199
+ WHERE {}
200
+ ```
201
+
202
+ `ex:alice` will be drawn as a circular photograph.
203
+
204
+ ### Example – icon/emoji on a class
205
+
206
+ ```sparql
207
+ CONSTRUCT {
208
+ ex:alice rdf:type ex:Person .
209
+ ex:Person schema:icon "👤" .
210
+ }
211
+ WHERE {}
212
+ ```
213
+
214
+ `ex:alice` remains a normal dot node in regular mode.
215
+ In **compact mode** the class node (`ex:Person`) is hidden and Alice's node inherits the `👤` emoji as its label.
216
+
217
+ ### Compact mode visual inheritance
218
+
219
+ When compact mode is enabled, class nodes are hidden and the plugin resolves the image/icon to show on the resource node using the following priority:
220
+
221
+ 1. `schema:image` / `schema:icon` directly on the **resource** (highest priority)
222
+ 2. `schema:image` / `schema:icon` on the **rdf:type class**
223
+ 3. `schema:image` / `schema:icon` on a **rdfs:subClassOf superclass** (one hop)
224
+
225
+ ### Programmatic configuration
226
+
227
+ You can also pass initial settings when extending the class:
120
228
 
121
229
  ```javascript
122
230
  class CustomGraphPlugin extends GraphPlugin {
123
231
  constructor(yasr) {
124
232
  super(yasr);
125
- }
126
-
127
- // Override network options
128
- getNetworkOptions() {
129
- return {
130
- ...super.getNetworkOptions(),
131
- physics: {
132
- enabled: true,
133
- stabilization: { iterations: 100 } // Faster but less optimal layout
134
- }
135
- };
233
+ // Override defaults
234
+ this.settings.edgeStyle = 'straight';
235
+ this.settings.predicateDisplay = 'label';
236
+ this.settings.nodeSize = 'large';
136
237
  }
137
238
  }
138
239
 
@@ -163,6 +264,7 @@ Output:
163
264
  ### Code Quality
164
265
 
165
266
  ```bash
267
+ npm test # Run Jest unit tests
166
268
  npm run lint # ESLint check
167
269
  npm run format # Prettier format
168
270
  ```
@@ -1,14 +1,21 @@
1
1
  /* styles/index.css */
2
2
  :root {
3
- --yasgui-graph-uri: #97C2FC;
3
+ --yasgui-graph-uri: #97c2fc;
4
4
  --yasgui-graph-literal: #a6c8a6ff;
5
5
  --yasgui-graph-blank-node: #c5c5c5ff;
6
6
  --yasgui-graph-type-object: #e15b13ff;
7
- --yasgui-graph-text: #000000;
8
- --yasgui-graph-edge: #cccccc;
9
- --yasgui-graph-edge-label: #666666;
10
- --yasgui-graph-edge-label-bg: rgba(255, 255, 255, 0.8);
11
- --yasgui-graph-background: #ffffff;
7
+ --yasgui-graph-text: var(--yasgui-text-primary, #000000);
8
+ --yasgui-graph-edge: var(--yasgui-border-color, #cccccc);
9
+ --yasgui-graph-edge-label: var(--yasgui-text-secondary, #666666);
10
+ --yasgui-graph-edge-label-bg: var(--yasgui-bg-primary, rgba(255, 255, 255, 0.8));
11
+ --yasgui-graph-background: var(--yasgui-bg-primary, #ffffff);
12
+ --yasgui-graph-canvas-bg: var(--yasgui-bg-primary, #ffffff);
13
+ --yasgui-graph-button-bg: var(--yasgui-accent-color, #4caf50);
14
+ --yasgui-graph-button-hover: var(--yasgui-link-hover, #45a049);
15
+ --yasgui-graph-button-text: var(--yasgui-button-text, #ffffff);
16
+ --yasgui-graph-empty-text: var(--yasgui-text-secondary, #666666);
17
+ --yasgui-graph-error-text: #f44336;
18
+ --yasgui-graph-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
12
19
  --color-blank-node: #ffff00;
13
20
  --color-literal: #808080;
14
21
  --color-rdf-type: #00ff00;
@@ -29,15 +36,17 @@
29
36
  }
30
37
  [data-theme=dark],
31
38
  .dark-theme {
32
- --yasgui-graph-uri: #97C2FC;
39
+ --yasgui-graph-uri: #97c2fc;
33
40
  --yasgui-graph-literal: #a6c8a6ff;
34
41
  --yasgui-graph-blank-node: #888888;
35
42
  --yasgui-graph-type-object: #e15b13ff;
36
- --yasgui-graph-text: #e0e0e0;
37
- --yasgui-graph-edge: #666666;
38
- --yasgui-graph-edge-label: #cccccc;
39
- --yasgui-graph-edge-label-bg: rgba(30, 30, 30, 0.8);
40
- --yasgui-graph-background: #1e1e1e;
43
+ --yasgui-graph-text: var(--yasgui-text-primary, #e0e0e0);
44
+ --yasgui-graph-edge: var(--yasgui-border-color, #666666);
45
+ --yasgui-graph-edge-label: var(--yasgui-text-secondary, #cccccc);
46
+ --yasgui-graph-edge-label-bg: var(--yasgui-bg-secondary, rgba(30, 30, 30, 0.8));
47
+ --yasgui-graph-background: var(--yasgui-bg-primary, #1e1e1e);
48
+ --yasgui-graph-canvas-bg: var(--yasgui-bg-primary, #1e1e1e);
49
+ --yasgui-graph-empty-text: var(--yasgui-text-secondary, #cccccc);
41
50
  }
42
51
  .yasgui-graph-plugin-container {
43
52
  width: 100%;
@@ -46,23 +55,16 @@
46
55
  overflow: hidden;
47
56
  }
48
57
  .yasgui-graph-plugin-container canvas {
49
- background-color: var(--yasgui-graph-canvas-bg, var(--bg-light));
50
- }
51
- .yasgui-graph-plugin-container[data-theme=dark] canvas,
52
- .dark-theme .yasgui-graph-plugin-container canvas {
53
- background-color: var(--yasgui-graph-canvas-bg, var(--bg-dark));
58
+ background-color: var(--yasgui-graph-canvas-bg);
54
59
  }
55
60
  .yasgui-graph-plugin-empty-state {
56
61
  padding: 20px;
57
62
  text-align: center;
58
- color: var(--text-light);
59
- }
60
- .dark-theme .yasgui-graph-plugin-empty-state {
61
- color: var(--text-dark);
63
+ color: var(--yasgui-graph-empty-text);
62
64
  }
63
65
  .yasgui-graph-plugin-error {
64
66
  padding: 20px;
65
- color: var(--text-error);
67
+ color: var(--yasgui-graph-error-text);
66
68
  }
67
69
  .yasgui-graph-controls {
68
70
  position: absolute;
@@ -75,21 +77,78 @@
75
77
  }
76
78
  .yasgui-graph-button {
77
79
  padding: 8px 12px;
78
- background: var(--button-primary-bg);
79
- color: var(--button-text);
80
+ background: var(--yasgui-graph-button-bg);
81
+ color: var(--yasgui-graph-button-text);
80
82
  border: none;
81
83
  border-radius: 4px;
82
84
  cursor: pointer;
83
85
  font-size: 14px;
84
- box-shadow: var(--box-shadow);
86
+ box-shadow: var(--yasgui-graph-shadow);
85
87
  transition: background 0.2s ease;
86
88
  }
87
89
  .yasgui-graph-button:hover {
88
- background: var(--button-primary-bg-hover);
90
+ background: var(--yasgui-graph-button-hover);
89
91
  }
90
92
  .yasgui-graph-button:active {
91
93
  transform: translateY(1px);
92
94
  }
95
+ .yasgui-graph-settings-panel {
96
+ position: absolute;
97
+ top: 50px;
98
+ right: 10px;
99
+ z-index: 10001;
100
+ background: var(--yasgui-graph-button-bg, #4caf50);
101
+ background: var(--yasgui-bg-primary, #ffffff);
102
+ color: var(--yasgui-graph-text, #333333);
103
+ border: 1px solid var(--yasgui-border-color, #cccccc);
104
+ border-radius: 6px;
105
+ padding: 12px 14px;
106
+ min-width: 240px;
107
+ box-shadow: var(--yasgui-graph-shadow, 0 2px 8px rgba(0,0,0,0.2));
108
+ font-size: 13px;
109
+ }
110
+ .yasgui-graph-settings-title {
111
+ font-weight: 600;
112
+ font-size: 14px;
113
+ margin-bottom: 10px;
114
+ padding-bottom: 6px;
115
+ border-bottom: 1px solid var(--yasgui-border-color, #cccccc);
116
+ }
117
+ .yasgui-graph-settings-section {
118
+ font-size: 11px;
119
+ font-weight: 700;
120
+ text-transform: uppercase;
121
+ letter-spacing: 0.5px;
122
+ color: var(--yasgui-text-secondary, #888888);
123
+ margin: 10px 0 4px;
124
+ }
125
+ .yasgui-graph-settings-row {
126
+ display: flex;
127
+ align-items: center;
128
+ justify-content: space-between;
129
+ gap: 8px;
130
+ padding: 3px 0;
131
+ cursor: pointer;
132
+ }
133
+ .yasgui-graph-settings-row input[type=checkbox] {
134
+ cursor: pointer;
135
+ accent-color: var(--yasgui-accent-color, #4caf50);
136
+ }
137
+ .yasgui-graph-settings-select {
138
+ font-size: 12px;
139
+ padding: 2px 4px;
140
+ border: 1px solid var(--yasgui-border-color, #cccccc);
141
+ border-radius: 3px;
142
+ background: var(--yasgui-bg-primary, #ffffff);
143
+ color: var(--yasgui-text-primary, #333333);
144
+ cursor: pointer;
145
+ max-width: 140px;
146
+ }
147
+ .yasgui-graph-settings-button {
148
+ display: inline-flex;
149
+ align-items: center;
150
+ gap: 5px;
151
+ }
93
152
  .yasgui-graph-icon {
94
153
  display: inline-flex;
95
154
  align-items: center;
@@ -100,4 +159,62 @@
100
159
  height: 16px;
101
160
  fill: currentColor;
102
161
  }
162
+ .yasgui-graph-plugin-container .vis-tooltip {
163
+ display: none !important;
164
+ }
165
+ .yasgui-graph-tooltip-container {
166
+ position: absolute;
167
+ background-color: rgba(28, 28, 32, 0.95);
168
+ color: #f0f0f0;
169
+ border: 1px solid rgba(255, 255, 255, 0.12);
170
+ border-radius: 6px;
171
+ padding: 8px 10px;
172
+ font-size: 11px;
173
+ font-family:
174
+ ui-monospace,
175
+ "SFMono-Regular",
176
+ "Menlo",
177
+ "Consolas",
178
+ monospace;
179
+ max-width: 340px;
180
+ white-space: normal;
181
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
182
+ pointer-events: auto;
183
+ z-index: 1000;
184
+ user-select: text;
185
+ cursor: text;
186
+ }
187
+ .yasgui-graph-tooltip {
188
+ display: flex;
189
+ flex-direction: column;
190
+ gap: 3px;
191
+ }
192
+ .yasgui-tooltip-type {
193
+ font-size: 9px;
194
+ font-weight: 700;
195
+ text-transform: uppercase;
196
+ letter-spacing: 0.6px;
197
+ color: rgba(255, 255, 255, 0.5);
198
+ padding-bottom: 5px;
199
+ border-bottom: 1px solid rgba(255, 255, 255, 0.12);
200
+ margin-bottom: 3px;
201
+ }
202
+ .yasgui-tooltip-row {
203
+ display: flex;
204
+ gap: 8px;
205
+ align-items: baseline;
206
+ line-height: 1.5;
207
+ }
208
+ .yasgui-tooltip-key {
209
+ font-size: 10px;
210
+ font-weight: 600;
211
+ color: rgba(255, 255, 255, 0.55);
212
+ min-width: 58px;
213
+ flex-shrink: 0;
214
+ }
215
+ .yasgui-tooltip-val {
216
+ font-size: 11px;
217
+ color: #e8e8e8;
218
+ word-break: break-all;
219
+ }
103
220
  /*# sourceMappingURL=yasgui-graph-plugin.cjs.css.map */
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../styles/index.css"],
4
- "sourcesContent": ["/* Color scheme variables */\r\n:root {\r\n /* Light theme colors (default) */\r\n --yasgui-graph-uri: #97C2FC;\r\n --yasgui-graph-literal: #a6c8a6ff;\r\n --yasgui-graph-blank-node: #c5c5c5ff;\r\n --yasgui-graph-type-object: #e15b13ff;\r\n --yasgui-graph-text: #000000;\r\n --yasgui-graph-edge: #cccccc;\r\n --yasgui-graph-edge-label: #666666;\r\n --yasgui-graph-edge-label-bg: rgba(255, 255, 255, 0.8);\r\n --yasgui-graph-background: #ffffff;\r\n \r\n /* Legacy variables for backward compatibility */\r\n --color-blank-node: #ffff00;\r\n --color-literal: #808080;\r\n --color-rdf-type: #00ff00;\r\n --color-uri: #0000ff;\r\n \r\n --color-blank-node-dark: #ffeb3b;\r\n --color-literal-dark: #9e9e9e;\r\n --color-rdf-type-dark: #4caf50;\r\n --color-uri-dark: #2196f3;\r\n \r\n --bg-light: #ffffff;\r\n --bg-dark: #1e1e1e;\r\n \r\n --text-light: #666666;\r\n --text-dark: #cccccc;\r\n --text-error: #f44336;\r\n \r\n --button-primary-bg: #4caf50;\r\n --button-primary-bg-hover: #45a049;\r\n --button-text: #ffffff;\r\n \r\n --box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\r\n}\r\n/* Dark theme colors */\r\n[data-theme='dark'],\r\n.dark-theme {\r\n --yasgui-graph-uri: #97C2FC;\r\n --yasgui-graph-literal: #a6c8a6ff;\r\n --yasgui-graph-blank-node: #888888;\r\n --yasgui-graph-type-object: #e15b13ff;\r\n --yasgui-graph-text: #e0e0e0;\r\n --yasgui-graph-edge: #666666;\r\n --yasgui-graph-edge-label: #cccccc;\r\n --yasgui-graph-edge-label-bg: rgba(30, 30, 30, 0.8);\r\n --yasgui-graph-background: #1e1e1e;\r\n}\r\n/* Graph plugin container */\r\n.yasgui-graph-plugin-container {\r\n width: 100%;\r\n height: 500px; /* Initial fixed height as workaround for viz-network bug */\r\n position: relative;\r\n overflow: hidden;\r\n}\r\n.yasgui-graph-plugin-container canvas {\r\n background-color: var(--yasgui-graph-canvas-bg, var(--bg-light));\r\n}\r\n.yasgui-graph-plugin-container[data-theme='dark'] canvas,\r\n.dark-theme .yasgui-graph-plugin-container canvas {\r\n background-color: var(--yasgui-graph-canvas-bg, var(--bg-dark));\r\n}\r\n.yasgui-graph-plugin-empty-state {\r\n padding: 20px;\r\n text-align: center;\r\n color: var(--text-light);\r\n}\r\n.dark-theme .yasgui-graph-plugin-empty-state {\r\n color: var(--text-dark);\r\n}\r\n.yasgui-graph-plugin-error {\r\n padding: 20px;\r\n color: var(--text-error);\r\n}\r\n/* Controls container */\r\n.yasgui-graph-controls {\r\n position: absolute;\r\n top: 10px;\r\n right: 10px;\r\n z-index: 10000;\r\n display: flex;\r\n gap: 10px;\r\n pointer-events: auto;\r\n}\r\n/* Button styles */\r\n.yasgui-graph-button {\r\n padding: 8px 12px;\r\n background: var(--button-primary-bg);\r\n color: var(--button-text);\r\n border: none;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 14px;\r\n box-shadow: var(--box-shadow);\r\n transition: background 0.2s ease;\r\n}\r\n.yasgui-graph-button:hover {\r\n background: var(--button-primary-bg-hover);\r\n}\r\n.yasgui-graph-button:active {\r\n transform: translateY(1px);\r\n}\r\n/* Icon styles */\r\n.yasgui-graph-icon {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n.yasgui-graph-icon svg {\r\n width: 16px;\r\n height: 16px;\r\n fill: currentColor;\r\n}\r\n/* Main entry point for all styles */\r\n/* This file will be imported by the TypeScript code */\r\n"],
5
- "mappings": ";AACA;AAEE,sBAAoB;AACpB,0BAAwB;AACxB,6BAA2B;AAC3B,8BAA4B;AAC5B,uBAAqB;AACrB,uBAAqB;AACrB,6BAA2B;AAC3B,gCAA8B,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AAClD,6BAA2B;AAG3B,sBAAoB;AACpB,mBAAiB;AACjB,oBAAkB;AAClB,eAAa;AAEb,2BAAyB;AACzB,wBAAsB;AACtB,yBAAuB;AACvB,oBAAkB;AAElB,cAAY;AACZ,aAAW;AAEX,gBAAc;AACd,eAAa;AACb,gBAAc;AAEd,uBAAqB;AACrB,6BAA2B;AAC3B,iBAAe;AAEf,gBAAc,EAAE,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACxC;AAEA,CAAC;AACD,CAAC;AACC,sBAAoB;AACpB,0BAAwB;AACxB,6BAA2B;AAC3B,8BAA4B;AAC5B,uBAAqB;AACrB,uBAAqB;AACrB,6BAA2B;AAC3B,gCAA8B,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AAC/C,6BAA2B;AAC7B;AAEA,CAAC;AACC,SAAO;AACP,UAAQ;AACR,YAAU;AACV,YAAU;AACZ;AACA,CANC,8BAM8B;AAC7B,oBAAkB,IAAI,wBAAwB,EAAE,IAAI;AACtD;AACA,CATC,6BAS6B,CAAC,iBAAmB;AAClD,CAtBC,WAsBW,CAVX,8BAU0C;AACzC,oBAAkB,IAAI,wBAAwB,EAAE,IAAI;AACtD;AACA,CAAC;AACC,WAAS;AACT,cAAY;AACZ,SAAO,IAAI;AACb;AACA,CA9BC,WA8BW,CALX;AAMC,SAAO,IAAI;AACb;AACA,CAAC;AACC,WAAS;AACT,SAAO,IAAI;AACb;AAEA,CAAC;AACC,YAAU;AACV,OAAK;AACL,SAAO;AACP,WAAS;AACT,WAAS;AACT,OAAK;AACL,kBAAgB;AAClB;AAEA,CAAC;AACC,WAAS,IAAI;AACb,cAAY,IAAI;AAChB,SAAO,IAAI;AACX,UAAQ;AACR,iBAAe;AACf,UAAQ;AACR,aAAW;AACX,cAAY,IAAI;AAChB,cAAY,WAAW,KAAK;AAC9B;AACA,CAXC,mBAWmB;AAClB,cAAY,IAAI;AAClB;AACA,CAdC,mBAcmB;AAClB,aAAW,WAAW;AACxB;AAEA,CAAC;AACC,WAAS;AACT,eAAa;AACb,mBAAiB;AACnB;AACA,CALC,kBAKkB;AACjB,SAAO;AACP,UAAQ;AACR,QAAM;AACR;",
4
+ "sourcesContent": ["/* Color scheme variables using YASGUI CSS custom properties with fallbacks */\r\n:root {\r\n /* Graph-specific node colors (custom to this plugin) */\r\n --yasgui-graph-uri: #97c2fc;\r\n --yasgui-graph-literal: #a6c8a6ff;\r\n --yasgui-graph-blank-node: #c5c5c5ff;\r\n --yasgui-graph-type-object: #e15b13ff;\r\n\r\n /* Graph text and edges - using YASGUI variables with fallbacks */\r\n --yasgui-graph-text: var(--yasgui-text-primary, #000000);\r\n --yasgui-graph-edge: var(--yasgui-border-color, #cccccc);\r\n --yasgui-graph-edge-label: var(--yasgui-text-secondary, #666666);\r\n --yasgui-graph-edge-label-bg: var(--yasgui-bg-primary, rgba(255, 255, 255, 0.8));\r\n --yasgui-graph-background: var(--yasgui-bg-primary, #ffffff);\r\n\r\n /* UI elements - using YASGUI variables with fallbacks */\r\n --yasgui-graph-canvas-bg: var(--yasgui-bg-primary, #ffffff);\r\n --yasgui-graph-button-bg: var(--yasgui-accent-color, #4caf50);\r\n --yasgui-graph-button-hover: var(--yasgui-link-hover, #45a049);\r\n --yasgui-graph-button-text: var(--yasgui-button-text, #ffffff);\r\n --yasgui-graph-empty-text: var(--yasgui-text-secondary, #666666);\r\n --yasgui-graph-error-text: #f44336;\r\n\r\n /* Shadow */\r\n --yasgui-graph-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\r\n\r\n /* Legacy variables for backward compatibility */\r\n --color-blank-node: #ffff00;\r\n --color-literal: #808080;\r\n --color-rdf-type: #00ff00;\r\n --color-uri: #0000ff;\r\n\r\n --color-blank-node-dark: #ffeb3b;\r\n --color-literal-dark: #9e9e9e;\r\n --color-rdf-type-dark: #4caf50;\r\n --color-uri-dark: #2196f3;\r\n\r\n --bg-light: #ffffff;\r\n --bg-dark: #1e1e1e;\r\n\r\n --text-light: #666666;\r\n --text-dark: #cccccc;\r\n --text-error: #f44336;\r\n\r\n --button-primary-bg: #4caf50;\r\n --button-primary-bg-hover: #45a049;\r\n --button-text: #ffffff;\r\n\r\n --box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\r\n}\r\n/* Dark theme colors */\r\n[data-theme='dark'],\r\n.dark-theme {\r\n /* Graph-specific node colors in dark mode */\r\n --yasgui-graph-uri: #97c2fc;\r\n --yasgui-graph-literal: #a6c8a6ff;\r\n --yasgui-graph-blank-node: #888888;\r\n --yasgui-graph-type-object: #e15b13ff;\r\n\r\n /* Override with YASGUI dark theme variables */\r\n --yasgui-graph-text: var(--yasgui-text-primary, #e0e0e0);\r\n --yasgui-graph-edge: var(--yasgui-border-color, #666666);\r\n --yasgui-graph-edge-label: var(--yasgui-text-secondary, #cccccc);\r\n --yasgui-graph-edge-label-bg: var(--yasgui-bg-secondary, rgba(30, 30, 30, 0.8));\r\n --yasgui-graph-background: var(--yasgui-bg-primary, #1e1e1e);\r\n --yasgui-graph-canvas-bg: var(--yasgui-bg-primary, #1e1e1e);\r\n --yasgui-graph-empty-text: var(--yasgui-text-secondary, #cccccc);\r\n}\r\n/* Graph plugin container */\r\n.yasgui-graph-plugin-container {\r\n width: 100%;\r\n height: 500px; /* Initial fixed height as workaround for viz-network bug */\r\n position: relative;\r\n overflow: hidden;\r\n}\r\n.yasgui-graph-plugin-container canvas {\r\n background-color: var(--yasgui-graph-canvas-bg);\r\n}\r\n.yasgui-graph-plugin-empty-state {\r\n padding: 20px;\r\n text-align: center;\r\n color: var(--yasgui-graph-empty-text);\r\n}\r\n.yasgui-graph-plugin-error {\r\n padding: 20px;\r\n color: var(--yasgui-graph-error-text);\r\n}\r\n/* Controls container */\r\n.yasgui-graph-controls {\r\n position: absolute;\r\n top: 10px;\r\n right: 10px;\r\n z-index: 10000;\r\n display: flex;\r\n gap: 10px;\r\n pointer-events: auto;\r\n}\r\n/* Button styles */\r\n.yasgui-graph-button {\r\n padding: 8px 12px;\r\n background: var(--yasgui-graph-button-bg);\r\n color: var(--yasgui-graph-button-text);\r\n border: none;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 14px;\r\n box-shadow: var(--yasgui-graph-shadow);\r\n transition: background 0.2s ease;\r\n}\r\n.yasgui-graph-button:hover {\r\n background: var(--yasgui-graph-button-hover);\r\n}\r\n.yasgui-graph-button:active {\r\n transform: translateY(1px);\r\n}\r\n/* Settings panel */\r\n.yasgui-graph-settings-panel {\r\n position: absolute;\r\n top: 50px;\r\n right: 10px;\r\n z-index: 10001;\r\n background: var(--yasgui-graph-button-bg, #4caf50);\r\n background: var(--yasgui-bg-primary, #ffffff);\r\n color: var(--yasgui-graph-text, #333333);\r\n border: 1px solid var(--yasgui-border-color, #cccccc);\r\n border-radius: 6px;\r\n padding: 12px 14px;\r\n min-width: 240px;\r\n box-shadow: var(--yasgui-graph-shadow, 0 2px 8px rgba(0,0,0,0.2));\r\n font-size: 13px;\r\n}\r\n.yasgui-graph-settings-title {\r\n font-weight: 600;\r\n font-size: 14px;\r\n margin-bottom: 10px;\r\n padding-bottom: 6px;\r\n border-bottom: 1px solid var(--yasgui-border-color, #cccccc);\r\n}\r\n.yasgui-graph-settings-section {\r\n font-size: 11px;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n color: var(--yasgui-text-secondary, #888888);\r\n margin: 10px 0 4px;\r\n}\r\n.yasgui-graph-settings-row {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 8px;\r\n padding: 3px 0;\r\n cursor: pointer;\r\n}\r\n.yasgui-graph-settings-row input[type='checkbox'] {\r\n cursor: pointer;\r\n accent-color: var(--yasgui-accent-color, #4caf50);\r\n}\r\n.yasgui-graph-settings-select {\r\n font-size: 12px;\r\n padding: 2px 4px;\r\n border: 1px solid var(--yasgui-border-color, #cccccc);\r\n border-radius: 3px;\r\n background: var(--yasgui-bg-primary, #ffffff);\r\n color: var(--yasgui-text-primary, #333333);\r\n cursor: pointer;\r\n max-width: 140px;\r\n}\r\n/* Settings button icon alignment */\r\n.yasgui-graph-settings-button {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 5px;\r\n}\r\n.yasgui-graph-icon {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n.yasgui-graph-icon svg {\r\n width: 16px;\r\n height: 16px;\r\n fill: currentColor;\r\n}\r\n/* Modern tooltip styles - override vis-network defaults */\r\n.yasgui-graph-plugin-container .vis-tooltip {\r\n display: none !important; /* Hide default vis-network tooltips */\r\n}\r\n/* Custom HTML tooltip container */\r\n.yasgui-graph-tooltip-container {\r\n position: absolute;\r\n background-color: rgba(28, 28, 32, 0.95);\r\n color: #f0f0f0;\r\n border: 1px solid rgba(255, 255, 255, 0.12);\r\n border-radius: 6px;\r\n padding: 8px 10px;\r\n font-size: 11px;\r\n font-family: ui-monospace, 'SFMono-Regular', 'Menlo', 'Consolas', monospace;\r\n max-width: 340px;\r\n white-space: normal;\r\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);\r\n pointer-events: auto;\r\n z-index: 1000;\r\n user-select: text;\r\n cursor: text;\r\n}\r\n.yasgui-graph-tooltip {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 3px;\r\n}\r\n.yasgui-tooltip-type {\r\n font-size: 9px;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n letter-spacing: 0.6px;\r\n color: rgba(255, 255, 255, 0.5);\r\n padding-bottom: 5px;\r\n border-bottom: 1px solid rgba(255, 255, 255, 0.12);\r\n margin-bottom: 3px;\r\n}\r\n.yasgui-tooltip-row {\r\n display: flex;\r\n gap: 8px;\r\n align-items: baseline;\r\n line-height: 1.5;\r\n}\r\n.yasgui-tooltip-key {\r\n font-size: 10px;\r\n font-weight: 600;\r\n color: rgba(255, 255, 255, 0.55);\r\n min-width: 58px;\r\n flex-shrink: 0;\r\n}\r\n.yasgui-tooltip-val {\r\n font-size: 11px;\r\n color: #e8e8e8;\r\n word-break: break-all;\r\n}\r\n/* Main entry point for all styles */\r\n/* This file will be imported by the TypeScript code */\r\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }