Commit Graph
1611 Commits
Author SHA1 Message Date
jason5ng32 40929b7581 Improvements 2026-08-21 21:35:50 +08:00
jason5ng32 6c70d47941 Improvements 2026-08-21 21:27:50 +08:00
jason5ng32 41b635483d Improvements 2026-08-21 09:20:59 +08:00
jason5ng32andClaude Fable 5 e4ae72cae7 Fix(shortcuts): Register reactively instead of racing configs on a 2s timer
Shortcuts now register on mount (base keys work from first paint) and the
map rebuilds when /api/configs lands, so config-gated keys (i/D/P/p) no
longer vanish when the fetch loses the old 2-second race.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 09:18:19 +08:00
jason5ng32andClaude Fable 5 d711b7be82 Feat(pulse): Two-tier gating — outage feed no longer needs the pulse beacon backend
The Earth Online entry and panel now show on any deployment whose backend
has CLOUDFLARE_API_KEY (runtime cloudFlare configs flag); the social
sections (composer / feed / visitor map / beacon) stay gated on the pulse
beacon backend. VITE_PULSE_URL is renamed to VITE_PULSE_BEACON_URL, no
legacy fallback.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 09:04:34 +08:00
jason5ng32 80c0d880d3 Improvements 2026-08-21 08:21:16 +08:00
jason5ng32andClaude Fable 5 b5b60a0406 Refactor(ui): Move ToolLoadingSkeleton into components/ui
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 00:39:45 +08:00
jason5ng32andClaude Fable 5 0f0160da99 Feat(ui): Skeleton for tool chunk loading, in-context spinners for tool data
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 00:33:25 +08:00
jason5ng32andClaude Fable 5 d50befc22d Feat(ui): Show a spinner while a lazy tool component loads
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 23:44:55 +08:00
jason5ng32andClaude Fable 5 df3771292d Fix(connectivity): Sanitize the stored target set on load
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 23:39:53 +08:00
jason5ng32andClaude Fable 5 c85e370ece Feat(connectivity): Add the Brazil Essentials import list
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 22:38:51 +08:00
0e8db72855 Fix(ui): Move focus into the drawer on open
vaul-vue swallows open-auto-focus, so the trigger stayed focused inside
#mainpart while it was aria-hidden — Chrome blocked that, and Tab then
walked the hidden page. Also drop the leftover Bootstrap scrollspy
tabindex wrapping the homepage.

Co-Authored-By: Cursor Grok 4.6 <noreply@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-20 22:24:59 +08:00
jason5ng32 3f9feb1143 Improvements 2026-08-20 22:03:21 +08:00
jason5ng32andClaude Fable 5 95401e3100 Fix(connectivity): Scope writes to the current run and verdicts to the pass's own targets
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 21:37:34 +08:00
jason5ng32 8d94aaa14d Improvements 2026-08-20 21:29:28 +08:00
jason5ng32andClaude Fable 5 cc2442fbea Fix(connectivity): Settle-time aggregate over surviving targets, fail fast on unknown default ids
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 21:22:44 +08:00
jason5ng32andClaude Fable 5 e2c0d8d1ca Feat(connectivity): User-managed target set with removable presets, plus multi-round latency bars
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 21:15:38 +08:00
jason5ng32 e757c619ea Improvements 2026-08-20 16:53:54 +08:00
jason5ng32 1776107065 Improvements 2026-08-20 16:38:33 +08:00
jason5ng32 2eddb7287e Improvements 2026-08-20 11:35:55 +08:00
jason5ng32 a703442ba8 Improvements 2026-08-20 11:34:47 +08:00
jason5ng32 89c4327969 Improvements 2026-08-20 11:33:32 +08:00
jason5ng32andClaude Fable 5 ccac693c48 Fix(ui): Drop shortcut actions queued when an overlay opens
The dispatcher checked the overlay state on keydown, but actions run
from the 10ms key-pool timer — an overlay opening inside that window
still had the queued action fire behind it. The callback now rechecks
before running and clears the pool either way.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 11:23:29 +08:00
jason5ng32andClaude Fable 5 e548b6e1e9 Fix(ui): Anchor ASN graph gesture zoom on the SVG rect
The focal-point math measured from the scroll container's edge, so the
px-4 padding and the m-auto centering offset made the graph drift away
from the pinch midpoint. Anchoring on the SVG's own rect and correcting
against a post-render re-measure keeps the point under the fingers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 11:23:29 +08:00
jason5ng32andClaude Fable 5 0cc7efc3d2 Fix(ui): Show IP History addresses in the clear
The panel is opt-in and easily closed, so the global info mask only
hurt readability there — masking targets the main page a screenshot
would capture, not a panel the visitor chose to open.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 11:23:16 +08:00
jason5ng32 802507ee6f Improvements 2026-08-20 11:05:33 +08:00
jason5ng32andClaude Opus 5 f5d2601589 Fix(ui): Suspend keyboard shortcuts while an overlay is open
Every shortcut in the map is a home-page action, so firing one from
behind a Dialog, Sheet or Drawer acted out of sight — and the
network-heavy ones (speed test, connectivity, DNS leak) spent the
visitor's bandwidth on a result they could not see. Pressing "?" inside
the Advanced Tools drawer also stacked the Help dialog on top of it.

The dispatcher now ignores keystrokes while any overlay is open. The
rule keys off the component's form rather than its purpose: the ui/
roots register themselves through use-overlay-shortcuts.js, so anything
built on them inherits it and overlays nest. Esc and the native
scrolling keys are untouched.

Drops the "f" fullscreen shortcut, which only ever acted on an open
drawer; the drawer header keeps its button.

Also fixes two long-standing dispatcher bugs the same code touches:
registration appended to a module-level map, so re-mounting Home (route
away and back) stacked a second copy of every action and left the first
pointing at unmounted refs; and the typing guard covered INPUT but not
TEXTAREA or contenteditable.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 10:47:31 +08:00
Jason Ng d6fb27deac Merge pull request #376 from Jasonhiddle512/dev
Fix the scrolling issue
2026-08-20 09:54:52 +08:00
jason5ng32 93d867d206 Improvements 2026-08-20 09:53:42 +08:00
Jason Hiddle fd3403a9af Fix the scrolling bug 2026-08-20 09:30:00 +08:00
Jason Hiddle cd621c1a1f Try to fix scrolling bug 2026-08-20 09:29:08 +08:00
jason5ng32 f2460db67e Improvements 2026-08-19 17:20:24 +08:00
jason5ng32andClaude Opus 5 123f17fc5e Improvements
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 15:38:51 +08:00
jason5ng32andClaude Opus 5 8c78e37a39 Fix(ui): Skip geo lookup when a source returns a non-public IP
DNS hijacking, captive portals and LAN echoes hand back reserved
addresses. The card sent them straight to /api/*, where requirePublicIP
rejected them with a 400 the visitor saw as a failed source.

fetchIP now gates on isUsablePublicIP — the shared definition the guard
itself uses — so the address is still shown and the card settles, only
the detail request is skipped. selectIPGeoSource's refetch filter moves
to the same predicate; isValidIP accepted reserved space and re-sent the
400 on every database switch.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 15:24:48 +08:00
jason5ng32andClaude Opus 5 30a3250faf Fix(api): Tolerate missing optional fields from ipinfo.io
Upstream answers 200 with `loc` / `org` / `country` absent for anycast,
bogon and degraded responses. Splitting them unguarded threw, and
geo-handler turned that into a 500 the visitor's card surfaced as a
failed source.

Missing coordinates now degrade to null instead of Number('') === 0,
which would have placed those IPs at the origin of the coordinate
system; a missing org yields empty asn / org; an unknown ISO code falls
back to the label that was already written but unreachable.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 15:24:48 +08:00
jason5ng32 3bb49db80e Improvements 2026-08-19 14:22:48 +08:00
jason5ng32 69e75a70cd Improvements 2026-08-19 13:56:41 +08:00
jason5ng32 26f744b463 Improvements 2026-08-19 12:01:07 +08:00
jason5ng32 ac06336979 Improvements 2026-08-19 11:53:28 +08:00
jason5ng32 020053ee56 Improvements 2026-08-19 11:33:39 +08:00
jason5ng32 337d03fb8a Improvements 2026-08-19 11:09:48 +08:00
jason5ng32 8d55118a78 Add shortcut to persona check 2026-08-19 10:37:18 +08:00
jason5ng32andClaude Fable 5 918f667420 Feat(report): Include Persona Check in shareable reports
The tool now emits persona:finished, and the report carries the grade
against the declared country plus each check's verdict. Verdict-only by
design: the live results' detail objects hold what the visitor supplied
(issuing bank, the country a shared position resolved to), and a report
link is readable by anyone who has it, so the builder drops them.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 10:31:51 +08:00
jason5ng32 d377f1912e Improvements 2026-08-19 10:23:50 +08:00
jason5ng32 f6c8556c0d Docs(privacy): Disclose what Persona Check sends
The one tool whose measurements leave the browser gets its own section:
what travels with a run, that nothing is stored, and the two opt-in
inputs — a coarsened position and a card issuer prefix checked against a
third-party database.
2026-08-19 10:22:29 +08:00
jason5ng32andClaude Fable 5 7becf39074 Feat(tools): Add Persona Check
New sign-in-gated advanced tool: declare a target country, run the
browser-side probes, and get a graded report of how closely the persona
sites can see matches the one you expect — with four-locale copy and
Node-runner coverage for every non-visual piece.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 10:12:15 +08:00
jason5ng32andClaude Fable 5 87d0f82e7d Feat(api): Add persona evaluate proxy
POST /api/persona/evaluate — thin proxy to the private evaluator, with
smoke tests and the AGENTS note on its header handling.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 10:12:05 +08:00
jason5ng32andClaude Fable 5 9d653651ed Feat(widgets): Add CountryPicker
Searchable, virtualized country selector over the full ISO 3166-1 set,
localized via Intl.DisplayNames.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 10:11:57 +08:00
jason5ng32andClaude Fable 5 0ff2615bab Chore: Add vue-input-otp dependency
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 10:11:57 +08:00
jason5ng32 228755d691 Adv Tools can be unstandalone 2026-08-19 00:46:24 +08:00