uml-viewer 0.1.1 → 0.1.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +1 -0
- data/lib/uml/viewer/version.rb +1 -1
- data/lib/uml/viewer/web/app.js +8 -2
- data/lib/uml/viewer/web/index.html +6 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e7c7897682b4ff95facdeb4b758f0f4bc2a5d32cc93d2680d7d5316458854c10
|
|
4
|
+
data.tar.gz: c5be93253d3f1d591f95cb6af0c26f6cef401e118c9d7127bcb1f7de6395ebd0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 977912ea2f8c411831cc3ea2a4cfe9837c06755f378adb3587662b6bc2fb05868ab45bbfb5336cde85fa86ad792f99eda35b28eb2e45f51a9b4646acc5315dc2
|
|
7
|
+
data.tar.gz: 1b1c0ea3db83f1571134c5649b1df80c0a58999f3737e74978b39e8cf0ad0f41c5f8d75eac3a39fb03bbdd937e69e24e2a028f1e3d7209fac6bc7954ab84cd3b
|
data/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,14 @@ All notable changes are documented here. The format is based on [Keep a Changelo
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.1.2] - 2026-10-23
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
- A box and a member name that open on a double-click show the hand cursor.
|
|
11
|
+
- A hovered box gets a border in the text color, and a hovered member name gets a light background behind its line, as in the original tool.
|
|
12
|
+
- A double-click beside a member name, on its line, also opens it.
|
|
13
|
+
- A click on empty space closes the source panel and the class card.
|
|
14
|
+
|
|
7
15
|
## [0.1.1] - 2026-10-23
|
|
8
16
|
|
|
9
17
|
### Changed
|
data/README.md
CHANGED
|
@@ -18,6 +18,7 @@ uml-viewer path/to/project
|
|
|
18
18
|
|
|
19
19
|
- Double-click a box to open it. Press `Esc` to go back.
|
|
20
20
|
- Double-click a class to open its card. Click an operation to see its source.
|
|
21
|
+
- Press `Esc` or click empty space to close the source panel and the class card.
|
|
21
22
|
- Hover an arrow to see the class pairs behind it.
|
|
22
23
|
- Right-click a box or a class to send **Explain** or **Omit** to Claude.
|
|
23
24
|
|
data/lib/uml/viewer/version.rb
CHANGED
data/lib/uml/viewer/web/app.js
CHANGED
|
@@ -157,6 +157,7 @@
|
|
|
157
157
|
lines.forEach((line, index) => {
|
|
158
158
|
const attrs = { x: 14, y: 36 + LINE * index, class: line.more ? "more" : "member" };
|
|
159
159
|
if (!line.more) Object.assign(attrs, { "data-id": line.id, "data-kind": line.kind });
|
|
160
|
+
if (!line.more) el("rect", { class: "wash", x: 6, y: attrs.y - 12, width: placed.width - 12, height: LINE, "data-id": line.id, "data-kind": line.kind }, group);
|
|
160
161
|
el("text", attrs, group).textContent = line.text;
|
|
161
162
|
});
|
|
162
163
|
};
|
|
@@ -441,7 +442,7 @@
|
|
|
441
442
|
}
|
|
442
443
|
|
|
443
444
|
function onDoubleClick(event) {
|
|
444
|
-
const member = event.target.closest("text.member");
|
|
445
|
+
const member = event.target.closest("text.member, rect.wash");
|
|
445
446
|
const box = event.target.closest("g.box");
|
|
446
447
|
if (member && BOXES.includes(member.dataset.kind)) return openView(member.dataset.id);
|
|
447
448
|
if (!member && box && BOXES.includes(box.dataset.type)) return openView(box.dataset.id);
|
|
@@ -458,7 +459,7 @@
|
|
|
458
459
|
addEventListener("scroll", saveSession);
|
|
459
460
|
|
|
460
461
|
svg.addEventListener("contextmenu", (event) => {
|
|
461
|
-
const member = event.target.closest("text.member");
|
|
462
|
+
const member = event.target.closest("text.member, rect.wash");
|
|
462
463
|
const box = event.target.closest("g.box");
|
|
463
464
|
if (!member && (!box || box.dataset.type === "foreign")) return;
|
|
464
465
|
event.preventDefault();
|
|
@@ -500,6 +501,11 @@
|
|
|
500
501
|
declutterButton.addEventListener("click", cycleDeclutter);
|
|
501
502
|
|
|
502
503
|
document.addEventListener("click", (event) => { if (!menu.contains(event.target)) menu.classList.remove("open"); });
|
|
504
|
+
svg.addEventListener("click", (event) => {
|
|
505
|
+
if (event.target !== svg) return;
|
|
506
|
+
document.getElementById("source").hidden = true;
|
|
507
|
+
document.getElementById("card").hidden = true;
|
|
508
|
+
});
|
|
503
509
|
|
|
504
510
|
const restore = (session) => {
|
|
505
511
|
if (Array.isArray(session.drill) && session.drill.length) drill = session.drill;
|
|
@@ -16,10 +16,15 @@
|
|
|
16
16
|
#banner { color: var(--red); }
|
|
17
17
|
#banner:empty { display: none; }
|
|
18
18
|
svg { position: absolute; top: 36px; left: 0; }
|
|
19
|
-
g.box rect, g.box ellipse { fill: var(--box); stroke: var(--line); }
|
|
19
|
+
g.box rect:not(.wash), g.box ellipse { fill: var(--box); stroke: var(--line); }
|
|
20
20
|
g.box.foreign ellipse { stroke-dasharray: 4 3; }
|
|
21
21
|
g.box.folder text.title { font-style: italic; }
|
|
22
22
|
g.box.component rect { stroke-width: 2; }
|
|
23
|
+
g.box:not(.foreign) { cursor: pointer; }
|
|
24
|
+
g.box:not(.foreign):hover > rect:not(.wash) { stroke: var(--fg); }
|
|
25
|
+
rect.wash { fill: transparent; }
|
|
26
|
+
rect.wash:hover { fill: var(--hl); }
|
|
27
|
+
text.member { pointer-events: none; }
|
|
23
28
|
text { fill: var(--fg); }
|
|
24
29
|
text.level, text.more { fill: var(--muted); }
|
|
25
30
|
path.arrow { fill: none; stroke: var(--line); stroke-width: 1.2; marker-end: url(#head); }
|