42 Commits
Author SHA1 Message Date
devandClaude Opus 4.8 e44bf2b3c9 style(ui): make docked dialog look more like a Torn panel (full-width, accent border)
Previously the .tat-root.tat-anchored rule centered the dialog with a
720px max-width and no extra border, which made it look like a floating
widget squeezed into the page rather than an embedded panel. The
Torn gym page reference is a full-width panel with a thin dark border
and a red top accent line.

Changes:
- margin: 0 0 12px 0 (full-width, no centering)
- max-width: none (span the content area)
- border-radius: 0 (Torn panels are flat, not rounded)
- border: 1px solid #444 with border-top: 2px solid #c00 (red accent)
- padding: 16px 20px (more breathing room, matching Torn panels)
- .tat-root.tat-anchored .tat-header { cursor: default } (drag is
  disabled in anchored mode, so the move cursor was misleading)

Free-floating mode is unchanged: the .tat-root base rule keeps its
rounded shadowed look and .tat-header keeps cursor: move.

Mirrored into the embedded TAT_STYLE in the bundle to keep the source
and bundle in lockstep.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-07 14:02:11 -05:00
devandClaude Opus 4.8 b626fb7d41 fix(bundle): stop pre-escaping gym name in embedded dom.js (apostrophe fix)
The embedded currentAttribute() in the bundle was returning gym:
tatEsc(gym), but the render template in Dialog.render also escapes with
tatEsc(s.gym). The double-escape turned 'George's' into 'George&amp;#39;s',
which the browser decoded to the visible text 'George&#39;s'.

The src/dom.js source does NOT pre-escape (returns the raw gym string and
lets the render template handle escaping once). This commit restores the
mirror in the embedded dom.js so the bundle matches the source.

No changes to src/dom.js (it was already correct).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-07 14:00:40 -05:00
dev c6de810417 feat(bundle): mirror source changes in embedded userscript 2026-06-07 12:17:29 -05:00
dev ca83996c6e feat(main): anchor dialog by inserting before gymContentWrapper (dock in page flow) 2026-06-07 12:15:09 -05:00
dev a1e79ac801 feat(ui): add tat-anchored CSS class and rework setMode to dock the dialog in the page flow 2026-06-07 12:14:05 -05:00
dev 7fddd84b6a fix(bundle): mirror source fixes in embedded userscript 2026-06-07 09:00:40 -05:00
dev 2ed25c14de fix(main): pass rect to setMode and remove redundant _positionAnchored call (anchor crash fix) 2026-06-07 09:00:04 -05:00
dev 95c655c24c fix(gitignore): add rendered gym.php source to ignore list 2026-06-07 08:49:41 -05:00
dev 8d89e40b91 fix(bundle): mirror source fixes in embedded userscript 2026-06-05 08:43:22 -05:00
dev 540416949b fix(interceptor): parse "gained" message for reliable per-train delta 2026-06-05 08:39:16 -05:00
dev 6dd5d2e3f2 fix(dom): rewrite scraper to use Torn's CSS module structure (li class prefix, propertyValue span) 2026-06-05 08:38:39 -05:00
dev 578736a492 fix(test): adjust comment formatting for clarity in computeEstimate tests 2026-06-01 21:42:39 -05:00
dev ef90a6b779 Add design document for Torn Attribute Training Tracker
- Introduced a new userscript for torn.com to assist players in planning attribute training.
- Document outlines the purpose, scope, architecture, dialog content, placement modes, error handling, testing, and file layout.
- Details on data handling, UI interactions, and user preferences included.
2026-06-01 18:16:02 -05:00
dev ecea14b051 test(build): extend behavioral drift checks to all four pure functions 2026-06-01 17:59:36 -05:00
dev e21582b7c4 fix(bundle): strict 30-day boundary in pruneHistory to match src/pure.js 2026-06-01 17:59:06 -05:00
dev adc8a5dec9 docs: README with install, usage, and self-test instructions 2026-06-01 17:40:18 -05:00
dev a5f402132e test(build): catch behavioral drift in bundle summary via eval-extracted comparison 2026-06-01 17:37:46 -05:00
dev 62fe86a71f test(build): verify userscript bundle embeds pure functions and self-test 2026-06-01 17:31:24 -05:00
dev 75f10126d2 fix(bundle): floor perDay in summary and hoist self alias in render 2026-06-01 17:28:41 -05:00
dev 7c2533d188 feat: bundle torn-attribute-tracker.user.js (Tat-style Tampermonkey script) 2026-06-01 17:16:54 -05:00
dev 36a6b4c52d fix(main): keep prefs.mode in sync and rAF-coalesce mutation observer 2026-06-01 17:09:38 -05:00
dev 12fc79022f feat(main): wire Store + Dialog + DataLayer on /gym.php 2026-06-01 17:03:03 -05:00
dev 8502c53663 fix(ui): escape user strings, lazy drag listeners, drop dead warn field 2026-06-01 16:58:12 -05:00
dev 3053a6d713 feat(ui): Dialog with render, drag, mode toggle, milestone dropdown 2026-06-01 16:52:25 -05:00
dev cd6fb7cf91 fix(interceptor): guard XHR double-wrap and thread currentAttr into regex fallback 2026-06-01 16:47:39 -05:00
dev 491d3201f8 feat(interceptor): XHR/fetch wrap to detect Train responses 2026-06-01 16:41:01 -05:00
dev aec9c40835 fix(dom): scope value search near attribute, whole-word matching, panel-scoped gym name 2026-06-01 16:38:22 -05:00
dev e647fbf545 feat(dom): currentAttribute scraper for gym page (manual verify) 2026-06-01 16:32:44 -05:00
dev 3d000c70ff test(store): cover recordTrain validation and getSummary on unknown attr 2026-06-01 16:29:25 -05:00
dev 07215e5617 feat(store): recordTrain with pruning and getSummary 2026-06-01 16:22:18 -05:00
dev e39758c1af feat(store): _saveDisabled latch and stronger corruption-wipe coverage 2026-06-01 16:16:21 -05:00
dev 231890a9e0 feat(store): load/save and target accessors with validation 2026-06-01 16:08:42 -05:00
dev 48e51054ca docs(pure): note that summary.perDay is integer-rounded 2026-06-01 16:03:27 -05:00
dev 5fd0f5e548 feat(pure): summary with today/week counts and per-day rate 2026-06-01 15:54:43 -05:00
dev a2e23341ac refactor(pure): share MS_PER_DAY with tests and document pruneHistory 2026-06-01 15:48:52 -05:00
dev ca753bf196 feat(pure): pruneHistory with strict 30-day window 2026-06-01 15:42:37 -05:00
dev 757139624f refactor(pure): extract MS_PER_DAY constant and document computeEstimate precondition 2026-06-01 15:36:56 -05:00
dev faae7702aa feat(pure): computeEstimate with safe division and target-reached handling 2026-06-01 15:30:07 -05:00
dev 545cf65beb refactor(pure): remove duplicate regex and dead empty-string guard 2026-06-01 15:24:55 -05:00
dev e0540468c3 feat(pure): parseTarget with comma and magnitude suffix support 2026-06-01 15:16:12 -05:00
dev 07ef131d65 chore: broaden .gitignore for logs and OS junk 2026-06-01 15:07:26 -05:00
dev b1ab57596d chore: initialize project 2026-06-01 15:01:31 -05:00