Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
e207e14
feat(styling): add bubble-set padding and corridor-width controls
Mnikley Jul 21, 2026
3ab23d8
fix(graph): rework bubble-set geometry for node-size-aware, guarantee…
Mnikley Jul 21, 2026
4b4186f
feat(styling): add bubble-set avoidance control and retune defaults
Mnikley Jul 21, 2026
b8132ab
chore(scripts): fix ruff findings in LaTeX submission packager
Mnikley Jul 21, 2026
2910934
feat(graph): smooth bubble curves, honest guarantees, hole fallback
Mnikley Jul 22, 2026
59978a4
feat(styling): make bubble avoidance a switch and retune defaults
Mnikley Jul 22, 2026
f0dc01e
fix(styling): trade avoidance for smoothness — default off, tighter k…
Mnikley Jul 22, 2026
b5465fd
feat(graph): true-minimum bubble knobs via geometric reconstruction
Mnikley Jul 22, 2026
764f4e6
feat(data-editor): merge-import Excel files into the loaded graph
Mnikley Jul 22, 2026
a9153cf
chore(scripts): fix ruff findings in LaTeX submission packager
Mnikley Jul 21, 2026
0e8012d
feat(graph): organic arced corridors and hug-tight proportional padding
Mnikley Jul 22, 2026
6d0fd73
feat(styling): default bubble knobs to padding 0.1, corridor 0.25, av…
Mnikley Jul 22, 2026
61f4618
chore(release): 1.16.0 — smooth, node-size-aware bubble groups
Mnikley Jul 22, 2026
412a431
Merge branch 'worktree-feat-excel-merge-import' (data-editor Excel me…
Mnikley Jul 22, 2026
68d8591
docs(changelog): add merge-import to the 1.16.0 entry
Mnikley Jul 22, 2026
1e29535
fix(io): normalize rich Excel cell values to primitives
Mnikley Jul 22, 2026
14ccfd3
feat(data-editor): join-mode choice in the Excel import preview
Mnikley Jul 22, 2026
f93a11d
docs(changelog): add join modes and rich-cell fix to the 1.16.0 entry
Mnikley Jul 22, 2026
42bc32a
test(data-editor): cover the import flow end to end
Mnikley Jul 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,25 @@
# Changelog

## 1.16.0 — 2026-07-22

Saved graph files load unchanged. Stored bubble-set knob values keep applying, with two semantic shifts: padding and corridor width now scale with your configured node size (a value of 1 ≈ one node radius of margin) instead of absolute pixels, and any saved avoidance value above 0 now simply means "on".

### Features

* **Merge-import Excel files into the loaded graph.** A new ⤒ Import button in the data editor header loads a workbook *into* the current graph instead of replacing it. A preview modal shows what the merge will do before anything is applied — new/updated node and edge counts, new property columns, unchanged and skipped rows. Existing workspaces, positions, filters and styles are preserved; a single nodes or edges sheet suffices, and new edges can attach to nodes already in the graph. X/Y coordinates in the file seed positions for new nodes only.
* **Choose how an import joins the graph.** The import preview offers two modes: **Extend & add** (default) updates matching nodes/edges and adds new ones from the file, while **Extend existing only** updates matches and ignores file rows without a match — including edges onto skipped new nodes, so no dangling edges. The preview counts update live as you switch.
* **Bubble-set geometry controls.** The Bubble Sets styling card gains **Padding** (how far the body extends past its members) and **Corridor Width** (thickness of the arms reaching outlying members) sliders, range 0.01–3, plus an **Avoid Other Nodes** switch that steers the hull around non-members and carves holes for fully enclosed ones. Defaults: padding 0.1, corridor 0.25, avoidance on.
* **Smooth, organic bubble outlines at every zoom.** Hulls render as continuous curves instead of polylines — no more faceted or jagged outlines when zooming in — and the PNG and SVG exports paint the exact same curves as the live canvas.
* **Node-size-aware hulls.** The influence field scales with the group's mean member radius, so bubbles look proportional whatever node size you configure. At minimum padding the hull hugs each node at a fixed fraction of *its own* radius, and minimum-width corridors render as thin, gently arced tubes.
* **A member is never lost.** Every member circle is guaranteed inside its group's outline (measured against the curve actually painted); groups whose members drift beyond the field's reach stay connected as one shape via corridor links.

### Fixes

* **Bubble hulls no longer clip their own members.** Avoid-node pressure could squeeze the outline through a member's body while its center stayed inside; grazed members now get repaired with proper clearance.
* **Enclosed non-members are no longer silently swallowed.** With avoidance on, a non-member inside the hull gets a visible carve whenever one is geometrically possible — and one impossible hole no longer discards all the others.
* **Bubble outlines no longer wobble around dense non-member fields**, and corridors no longer reroute into phantom lobes when widening them.
* **Re-saved Excel workbooks import cleanly.** Rich cell values (formatted text, hyperlinks, formulas) are normalized to plain values on import, so matched rows no longer all report as "updated" and the filter panel no longer crashes after such an import.

## 1.15.5 — 2026-07-10

Saved graph files load unchanged; older files (and files saved by earlier versions) default the new opacity to fully opaque, so their appearance is identical.
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "graph-lens-lite",
"version": "1.15.5",
"version": "1.16.0",
"main": "src/package/electron_app.js",
"description": "Visualise and explore property graphs in a lightweight desktop app.",
"homepage": "https://github.com/Delta4AI/GraphLensLite",
Expand Down
9 changes: 4 additions & 5 deletions scripts/package_latex_submission.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,13 +135,12 @@ def clean_build_artifacts(work_dir: Path) -> None:

def main() -> None:
venue = pick_venue()
venue_dir = MANUSCRIPT / venue
print(f"Packaging '{venue}' submission …\n")

files = collect_files(venue)
missing = [src for src, _ in files if not src.exists()]
if missing:
die(f"Missing files:\n " + "\n ".join(str(p) for p in missing))
die("Missing files:\n " + "\n ".join(str(p) for p in missing))

# 1. Create temp directory and copy files
tmp = Path(tempfile.mkdtemp(prefix="gll-submission-"))
Expand All @@ -152,10 +151,10 @@ def main() -> None:

# 2. Flatten paths in main.tex
flatten_main_tex(tmp / "main.tex")
print(f"\n Flattened paths in main.tex")
print("\n Flattened paths in main.tex")

# 3. Compile test PDF
print(f"\n Compiling test PDF …")
print("\n Compiling test PDF …")
pdf = compile_pdf(tmp)
print(f" OK — {pdf.stat().st_size / 1024:.0f} KB\n")

Expand All @@ -181,7 +180,7 @@ def main() -> None:
shutil.rmtree(tmp)

print(f"\n Created {final_zip.relative_to(REPO_ROOT)} ({size_mb:.1f} MB)")
print(f" Temp directory removed.")
print(" Temp directory removed.")


if __name__ == "__main__":
Expand Down
14 changes: 13 additions & 1 deletion src/config.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/**
* Defaults for the graph, layouts and UI
*/
const VERSION = "1.15.5";
const VERSION = "1.16.0";

const DEFAULTS = {
NODE: {
Expand Down Expand Up @@ -202,6 +202,9 @@ const DEFAULTS = {
stroke: '#C33D35',
strokeOpacity: 1,
virtualEdges: true,
padding: 0.1,
corridor: 0.25,
avoidance: 1,
label: true,
labelText: 'group one',
labelFill: '#fff',
Expand All @@ -222,6 +225,9 @@ const DEFAULTS = {
stroke: '#403c53',
strokeOpacity: 1,
virtualEdges: true,
padding: 0.1,
corridor: 0.25,
avoidance: 1,
label: true,
labelText: 'group two',
labelFill: '#fff',
Expand All @@ -242,6 +248,9 @@ const DEFAULTS = {
stroke: '#8CA6D9',
strokeOpacity: 1,
virtualEdges: true,
padding: 0.1,
corridor: 0.25,
avoidance: 1,
label: true,
labelText: 'group three',
labelFill: '#fff',
Expand All @@ -262,6 +271,9 @@ const DEFAULTS = {
stroke: '#EFB0AA',
strokeOpacity: 1,
virtualEdges: true,
padding: 0.1,
corridor: 0.25,
avoidance: 1,
label: true,
labelText: 'group four',
labelFill: '#fff',
Expand Down
Loading
Loading