* docs: add emoji support design spec (closes discussion on #78)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs: add edge cases and recoloring notes to emoji spec
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs: clarify comma-separated resolution in emoji spec
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs: add uniform resolution across all contexts to emoji spec
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs: add emoji support implementation plan (11 tasks)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add emoji resolution engine with CSS-first fallback
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add emoji service abstraction with fetch and caching
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add [emoji] tokens and rule to ANTLR grammar
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: extract emoji from parse tree into participant data
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: render emoji inline with participant name in HTML renderer
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: render emoji shortcode on participants in SVG renderer
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add emoji resolution to Comment class via resolveBracketContent
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: wire builtin emoji map to renderers for Unicode resolution
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add emoji font fallback stack for SVG rendering
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: resolve [shortcode] emoji in message labels and fragment conditions
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs: add Icon Registry service design spec
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: extract participant name correctly when emoji is present in from/to
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: add en-space between emoji and participant name in SVG
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add emoji-eval skill for rendering quality scoring
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: improve SVG emoji spacing with wider em-space
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: resolve emoji in SVG return message labels
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: account for emoji width in SVG participant box sizing
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: prepend emoji unicode glyphs to comment text so they render visibly
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: account for emoji width in participant layout calculations
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add tech/architecture emoji shortcodes (database, server, api, etc.)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs: add known grammar limitations to emoji spec
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: resolve emoji in divider labels for both HTML and SVG renderers
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add 10 emoji parity test cases to compare-cases.js
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: resolve emoji in diagram titles for both HTML and SVG renderers
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add 3 more emoji parity cases (simple-async, self-call, title)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: strip emoji prefix from async message To() and ReturnTo() lookups
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: strip emoji prefix from async message target in HTML renderer component
The Interaction-async.tsx component was calling to()?.getFormattedText()
which returned "[lock]B" instead of "B" when emoji was present on the
target participant. This caused Coordinates.getPosition() to fail with
"Participant [lock]B not found" and arrows to render in the wrong
direction.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add 10 more emoji parity test cases from e2e patterns
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: use regular space between emoji tspan and name in SVG participant
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: auto-detect local dev for Icon Registry service URL
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: vertically center emoji with text in SVG participant headers
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add emoji support to sync method names (A.[rocket]method())
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add emoji-method-name and emoji-condition-label compare cases
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add emoji in condition/catch labels + compare cases, fix spec
Emoji in fragment conditions (if, else if, while, catch) works via
rendering-layer resolution. Added 3 compare cases with 96-99% parity.
Corrected spec — this was listed as a known limitation but actually works.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add emoji-opt-critical, emoji-nested-mixed, emoji-all-features compare cases
All score 90%+ parity. Tests emoji in opt/critical fragments, nested
if/try with emoji conditions and method names, and a kitchen-sink case
combining all emoji features.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add emoji-chained-calls, emoji-assign-return, emoji-multi-async compare cases
Chained calls 95%, assign+return 89%, multi-async 69% (glyph-level diff).
Total 34 emoji compare cases.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add emoji-named-params, emoji-self-sync, emoji-fragments-return compare cases
All score 93%+. Named params with emoji 94%, self-sync with emoji 94%,
fragments with emoji return values 97%. Total 37 emoji compare cases.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: detect emoji-based participant icons in compare-case analyzer
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: SVG parity for emoji in return labels, fragment conditions, and catch sections
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs: add self-correcting dia-scoring design spec and implementation plan
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: render emoji-only participants as separate elements for SVG parity — 66.5% → 77.3% pixel match
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: center stereotype at participant center for emoji-only participants (54.7% → 72.8%)
* fix(svg): render emoji as separate text element in icon+emoji participants (77.2% → 77.6%)
* fix(svg): stereotype-width-aware participant centering + return height + emoji icon detection
* fix: icon+emoji participant label 4px left offset; fix analyzer icon measurement for icon+emoji participants
* fix: correct SVG group outline margin from 6px to 8px to match HTML renderer (emoji-group-case 77.3%→78.4%)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(svg): correct else-section vertical offset in alt fragments with emoji conditions
* fix(svg): expand fragment condition height from 20px to 36px for emoji conditions
* Revert "fix(svg): expand fragment condition height from 20px to 36px for emoji conditions"
This reverts commit a1bc00429abebca03febecc79543cf2c60a19a82.
* fix: improve SVG group outline parity — stroke-width 1.5px, CSS classes for correct colors, title bar covers stroke edges, bottom edge clipped by viewBox
* fix(ts): cast TitleContext to any for runtime prototype-patched content() method
* fix: align SVG group outline with HTML CSS outline — 86.4%→91.4% pixel match
* fix: critical fragment 2px header border + group outline 3px stroke matching HTML
* revert: undo critical fragment line and group stroke-width — both regressions
* feat: switch group border from CSS outline-dashed to SVG rect overlay for renderer parity
* Revert "feat: switch group border from CSS outline-dashed to SVG rect overlay for renderer parity"
This reverts commit abcc123aa06356c3e8bc86ea57f267d50bfe5725.
* feat(scoring): add critical fragment header color calibration to collect-data
* fix: returnOffset subpixel correction + group height K=13 (emoji-async-return 87.4%→97.0%, emoji-simple-async 89.5%→97.5%)
- buildStatementGeometry: returnOffset now uses height===0 sentinel for sync-block returns; the else branch (sync+height>0 or non-sync) uses 15.5, ensuring root-level --> arrows land at the correct subpixel Y
- buildParticipantGeometry: group height constant K=13 (was 14) reduces group bottom overshoot by 1px, improving group-related cases
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: emoji-async-return 87.4%→97% — return offset 16/15 → 16.5/15.5 for coord.height=0/other
* fix: floor return lineY to match HTML CSS pixel-snapping, emoji-simple-async 97.5%→99.4%
* fix: remove incorrect [emoji] syntax from catch() conditions in compare cases
* fix: extend returnOffset=16.5 to fragment-internal returns (emoji-fragments-return 91.6%→96.8%)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: use lineY-3 for return label Y to fix 0.5px offset on assignment returns (emoji-assign-return 98.04%→99.45%)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: resolve emoji shortcodes before measuring divider label width (emoji-divider-case 97.41%→99.12%)
* fix: align SVG group outline top by 0.5px (emoji-group-case 91.24%→91.25%)
* fix: match fill-only participant icon stroke in svg renderer
* test: add emoji visual coverage and agent skills
* fix: normalize residual scopes to frame space
* chore: change dev server port from 8080 to 4000
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* test: use relative URLs in interaction tests
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: add SVG group outline overlay in HTML renderer for parity with SVG
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* test: update visual snapshots for group outline changes
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: improve group outline parity by measuring actual participant DOM positions
Use ref-based DOM measurement to compute the group overlay position from
actual rendered participant boxes, instead of deriving from positioning
engine coordinates. This achieves 88.7% native pixel match (96% pos-only)
for repro-group-container, with remaining diff being antialiasing.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add ‹ › nav buttons and keyboard arrow navigation to compare-case page
* fix: correct RTL D4 sender offset for nested occurrences (nested-fragment 98.3%→99.7%)
* fix: remove spurious 0.5px X shift from HTML group container (emoji-group-case 83.2%→94.3%)
* fix: group label font, title position, outline margin and analyzer calibration (group-minimal 88.1%→89.6%)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: sync group stroke-width to 1 and adjust title/outline positions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: correct maxReturnBottom padding for zero-height returns (return 93.4%→99.6%)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: suppress no-misleading-character-class lint error for ZWJ in EMOJI_PATTERN
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* test: update HTML snapshots for group outline stroke-width 1.5→1 change
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: incorporate upstream changes from main rebase
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: update Playwright snapshots for Linux CI
Generated Linux-specific snapshots for chromium-linux platform.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* ci: trigger CI run with Linux snapshots
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: revert parser/index.js and renderToSvg.spec.ts to match main (fixes 9 unit test failures)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>