Commit Graph
20 Commits
Author SHA1 Message Date
s0lrayandGitHub ba58014163 Merge pull request #571 from lockfale/feature/THE-87-search-reveal
Search: reveal node in tree instead of linking to URL (THE-87)
2026-03-25 15:39:00 -04:00
s0lrayandPaperclip e16fa431b6 fix(zoom): center node on visible viewport, not SVG viewBox midpoint (THE-87)
zoomToNode was using svgH/2 (y=400 in viewBox space) as the pan target.
Because the SVG sits below the header, the true viewport center is at
  (window.innerHeight/2 - rect.top) / svgScale
not svgH/2. The discrepancy equals roughly the header height, which is
why the zoomed node consistently appeared too low.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-25 15:26:09 -04:00
s0lrayandPaperclip 2cad91a63b Search: reveal node in tree instead of linking to URL (THE-87)
Clicking a search result now collapses the full tree, expands all
ancestor branches of the matched node, highlights the node with an
accent-colored circle and bold text, and pans the viewport to it.

A small ↗ icon remains in each result for users who want to open the
tool's website directly.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-25 14:34:59 -04:00
s0lrayandGitHub 648d34bd8e Merge pull request #570 from lockfale/feature/THE-79-pan-zoom
Fixing pan zoom weirdness
2026-03-25 14:30:21 -04:00
s0lrayandPaperclip c2e5a68662 fix(zoom): remove auto-pan on node click (THE-89)
zoomToNode(d) was called after every expand/collapse, causing jarring
viewport jumps as the tree layout reflows node positions. Removing it
lets users pan and zoom freely without unexpected repositioning.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-25 14:27:29 -04:00
s0lrayandGitHub c232cfdab3 Merge pull request #569 from lockfale/feature/THE-31-post-migration-cleanup
Remove vendored d3.v3.min.js (THE-31)
2026-03-25 14:13:03 -04:00
s0lrayandPaperclip 6a9195c762 chore(cleanup): remove vendored d3.v3.min.js (THE-31)
D3 migration to v7 is complete. The old vendored v3 file is no longer
referenced anywhere — index.html loads js/d3.min.js which is copied
from node_modules by the postinstall script. CI smoke test already
validates the correct filename.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-25 13:49:27 -04:00
s0lrayandPaperclip 118deee1be merge: resolve conflict with master — keep zoomToNode + search functions (THE-79)
Both zoomToNode() (pan/zoom, THE-79) and the search/badge additions from
master (THE-66, THE-73) are preserved. No logic changes to either side.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-25 00:00:56 -04:00
s0lrayandGitHub c59d584c06 Merge branch 'master' into feat/the-73-tool-status-badges 2026-03-24 23:54:10 -04:00
s0lrayandGitHub 811fc2e0ca Merge branch 'master' into feature/THE-66-client-side-search 2026-03-24 23:51:35 -04:00
s0lrayandPaperclip b5f349cf5e feat(ui): add pan/zoom to D3 tree visualization (THE-79)
- Apply d3.zoom() to SVG container for mouse wheel zoom and drag-to-pan
- Implement zoomToNode() that auto-centers viewport on clicked/expanded node
- Store svgEl reference separately from vis group for zoom target
- Add grab/grabbing cursor CSS on SVG to communicate interactivity
- Preserve compatibility with dark mode, viewBox/responsive SVG, null-child safety

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-24 23:50:54 -04:00
s0lrayandPaperclip b684b3cd88 feat(ui): replace text suffixes with color-coded SVG badges (THE-73)
Parse (T)/(D)/(R)/(M) suffixes from tool names and render them as
colored tspan elements in the SVG tree. Add matching badge pill styles
to the HTML legend so it visually matches the tree indicators.

- T (tool) → blue #4a9eda
- D (dork) → orange #e8944a
- R (registration) → amber #c8a030
- M (manual URL) → purple #9a7eda

Badge colors are theme-invariant; they work on both dark and light
backgrounds without separate light-mode overrides.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-24 18:51:15 -04:00
s0lrayandPaperclip b52bfbcbe2 feat(ui): responsive SVG viewport, Inter typography, expanded CSS tokens (THE-72)
- Replace fixed SVG width/height attrs with viewBox + preserveAspectRatio so the
  tree scales naturally across screen sizes
- Switch font-family to Inter/system-font stack via --font-family token
- Add spacing tokens (--space-1 through --space-6, 4px scale)
- Add border-radius tokens (--radius-sm, --radius-md)
- Add shadow tokens (--shadow-sm, --shadow-md) with light-mode overrides
- Add --color-accent and --color-border for future theming use
- Add font-size tokens (--font-size-sm/base/lg/xl)
- Wire up new tokens throughout existing CSS rules

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-24 18:46:05 -04:00
s0lrayandPaperclip ab65f65a5f feat(ui): add client-side search for tools (THE-66)
Adds a debounced text search input above the D3 tree that filters all
~1,000+ tool nodes by name and description. Results appear as a flat
list with breadcrumb paths; clearing the input hides the panel.

- No build step required: vanilla JS, no new dependencies
- Sanitizes HTML output (escapeHtml/escapeAttr) and validates URLs (http/https only)
- Dark and light mode compatible via existing CSS variables
- Results capped at 50 to keep rendering fast

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-24 17:56:24 -04:00
s0lrayandPaperclip 05c15eaf47 feat(ui): implement dark mode as default with CSS variables and theme persistence
Closes THE-34, THE-35, THE-36.

- Replaces all hardcoded colors in arf.css with CSS custom properties
- Dark palette defined on :root (default); light palette on body.light-mode
- Removes old .dark-Mode class; D3 inline styles now read CSS vars at render time
- goDark() toggles light-mode class and persists preference to localStorage
- Flash-prevention inline script in body applies stored theme before first paint
- Toggle button label reflects current theme state

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-24 07:27:28 -04:00
0e83fdc121 Fix D3 tree not rendering: remove null entry in arf.json
d3.hierarchy() in D3 v7 does not tolerate null entries in children
arrays (v3 was lenient). A null element at Username.children[1] caused
the entire tree to fail silently.

- Remove the null entry from arf.json
- Add a defensive children filter in d3.hierarchy() call so future
  null entries degrade gracefully instead of breaking the tree

Co-Authored-By: Paperclip <noreply@paperclip.ing>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 18:21:53 -04:00
s0lrayandPaperclip 82a9c32850 Migrate D3 v3 to v7: update arf.js, index.html, and CI
- Replace d3.layout.tree() with d3.tree()
- Replace d3.svg.diagonal() with d3.linkHorizontal() (x/y accessors swap coords)
- Replace d3.json(url, cb) with d3.json(url).then(cb)
- Replace d3.hierarchy() for root node; use .descendants() and .links()
- Strip svg: namespace prefixes from append/insert calls
- Update xlink:href to href on anchor elements
- Update data accessors to use d.data.name, d.data.url, etc.
- Fix .style("fill") call (was malformed in v3 code)
- Update event handler signature to (event, d) for D3 v7
- Use node.merge(nodeEnter) and link.merge(linkEnter) for v5+ update pattern
- Add public/js/d3.min.js (v7.9.0) copied from node_modules
- Update index.html to load d3.min.js instead of d3.v3.min.js
- Update CI smoke test to check for d3.min.js
- Keep d3.v3.min.js in place until visual parity confirmed

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-23 17:28:56 -04:00
Kyle Matthews 9c5e4caaea Added Dark Mode/Fixed file placement problem 2024-10-02 19:22:42 -04:00
s0lray 4a32c697ba site updates
site updates
2017-01-19 21:35:47 -05:00
treefort f7a6d43aee moved dist files into /public
…updating relative paths commensurately
2016-08-19 00:08:00 -04:00