Commit Graph

29 Commits

Author SHA1 Message Date
Ruslan Bakiev
0a470d3922 feat(calendar): show contact avatars on event cards 2026-02-26 12:18:14 +07:00
Ruslan Bakiev
e5ad3809e0 feat(calendar): flying label animation from card title to toolbar on zoom
The label (month name, week number, day label) now animates from its
position above the source card to the toolbar center on zoom-in, and
flies back from toolbar to the target card title on zoom-out. The
fly-rect rectangle no longer contains text — only skeleton placeholder
lines. Sibling card titles and week numbers also fade during zoom.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 15:03:16 +07:00
Ruslan Bakiev
00e036946c feat(calendar): move labels outside card borders for visual continuity
- Month names moved above month cards in year view (outside article border)
  Hidden in non-year views; toolbar shows context label instead
- Day labels (Mon 24, Tue 25) moved above day columns in week view
- Each card/column wrapped in flex container: title above, card below
- New .calendar-card-title CSS: 11px, 55% opacity, subtle label above card
- No duplicate headers: toolbar is the single source of current context

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 14:42:09 +07:00
Ruslan Bakiev
9505cecab2 feat(calendar): header continuity with week numbers + skeleton content in fly-rect
- Add ISO week numbers to the left of week rows in month view (8, 9, 10...)
  with spacer alignment on day-of-week headers
- Inject label + skeleton placeholder lines into fly-rect during zoom animations:
  zoom-in shows source label (month name / "Week N" / day name) + pulsing bars
  zoom-out shows target context label + skeleton
- Skeleton CSS uses pulse animation (0.8s alternate) for loading hint
- Non-scoped style block for dynamically injected innerHTML elements
- isoWeekNumber helper for ISO 8601 week calculation
- Extended MonthRow type with weekNumber property

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 14:28:31 +07:00
Ruslan Bakiev
77141978c5 feat(calendar): seamless zoom animation with clone-and-swap + full-area coverage
Zoom-in: fade siblings → fade source content → clone source style to fly-rect →
hide source → animate fly-rect to viewport → switch view → fade in new content.

Zoom-out: fade scene → show fly-rect at viewport → switch view → clone target
style → animate fly-rect to target → fade in scene.

Full-area: all views (month/week/day) now fill 100% of container height.
Month grid rows stretch equally, day cells fill row height, depth layers flex.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 11:56:42 +07:00
Ruslan Bakiev
227030b9ae feat(calendar): replace CSS-transform zoom with GSAP flying-rect animation and scope data to year
- Add CalendarDateRange input to GraphQL schema; server resolver now accepts from/to params
- Frontend query sends year-scoped date range variables reactively
- Rewrite zoom-in/zoom-out animations using GSAP flying-rect overlay (650ms vs 2400ms)
- Add flying-rect element to CrmCalendarPanel with proper CSS
- Remove old calendarSceneTransformStyle CSS-transition approach
- Add calendarKillTweens cleanup in onBeforeUnmount

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 11:41:35 +07:00
Ruslan Bakiev
638652b4d8 fix(calendar-lab): enable hover on grid cells by removing pointer-events block
Content overlay layer was intercepting mouse events (pointer-events: auto
with z-index: 5), preventing :hover from reaching the grid cells underneath.
Removed pointer-events: auto from .canvas-content-visible since the content
layer is purely visual and needs no click handling.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 11:16:20 +07:00
Ruslan Bakiev
5657da13c1 feat(calendar-lab): add hover-targeted zoom with progressive tension and zoom slider
- Zoom animation now targets the hovered cell (not a fixed demo block)
- Progressive "pull" tension: cell scales 5%→10% over 2 scroll ticks
  before the full flying-rect animation triggers (400ms decay timeout)
- Added zoom slider in top-right toolbar matching production design
  (range 0-3 with dot markers, drives step-by-step zoom animations)
- Slider handles mid-drag target updates via sliderTarget variable

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:36:22 +07:00
Ruslan Bakiev
3e711a5533 fix(calendar-lab): rewrite zoom as GSAP flying-rect with proper async sequencing
- Replace panzoom + timeline approach with clean async/await GSAP tweens
- Flying rect morphs from cell position to full viewport (aspect ratio change)
- Fix zoomOut race condition: nested gsap.to inside tl.call fired outside timeline
- Fix opacity conflict: GSAP controls all opacity, CSS class only for pointer-events
- Fix gridLayerRef losing reference on :key remount during resize
- Make viewport dimensions reactive via ResizeObserver (vpWidth/vpHeight refs)
- Wait for fade-in completion before unlocking isAnimating

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-24 09:47:45 +07:00
Ruslan Bakiev
b316b024be feat(calendar-lab): replace tldraw with two-layer panzoom canvas
Drop tldraw/React dependency in favor of @panzoom/panzoom with a
two-layer architecture: outline rectangles (borders only) are zoomed
via CSS transforms while HTML content renders at native 1:1 scale
as a fade-in overlay — eliminating blur at any zoom level.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-24 01:09:46 +07:00
Ruslan Bakiev
1db8e58da1 fix(calendar-lab): rewrite tldraw zoom as LOD — render only current level shapes
Previous implementation created all ~589 shapes (year + months + weeks + days)
at once, causing visual chaos on load and broken zoom. New approach dynamically
creates/destroys shapes per level: year shows 12 months, month shows 6 weeks,
week shows 7 days, day shows time slots. Wheel prime pattern (2 ticks) prevents
accidental zooms. Double-click resets to year view.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-24 00:52:58 +07:00
Ruslan Bakiev
6cce211c0b fix(calendar-lab): use local tldraw runtime to avoid react/cdn instance mismatch 2026-02-23 19:47:57 +07:00
Ruslan Bakiev
ed78532260 feat(calendar-lab): use tldraw canvas engine with nested zoom rectangles 2026-02-23 19:29:52 +07:00
Ruslan Bakiev
bb628a7c0d feat(calendar-lab): switch demo route to tldraw canvas preview 2026-02-23 18:48:34 +07:00
Ruslan Bakiev
0ed2a6b353 fix(calendar-lab): stabilize center fit and wheel direction 2026-02-23 18:26:07 +07:00
Ruslan Bakiev
179cc39d53 fix(calendar-lab): center panzoom fit on selected target 2026-02-23 18:19:09 +07:00
Ruslan Bakiev
6ab3b374a2 feat(calendar-lab): switch zoom scene to panzoom engine 2026-02-23 18:12:05 +07:00
Ruslan Bakiev
49c4757490 feat(calendar-lab): switch to hierarchical grid zoom mechanics 2026-02-23 18:03:27 +07:00
Ruslan Bakiev
67a186e916 feat(calendar-lab): render content only after zoom settle 2026-02-23 17:47:58 +07:00
Ruslan Bakiev
6d5402dcc1 feat(calendar-lab): amplify nested board zoom depth 2026-02-23 17:42:19 +07:00
Ruslan Bakiev
2eb2f3109c feat(calendar): add nested zoom lab page with four persistent levels 2026-02-23 15:57:12 +07:00
Ruslan Bakiev
cb2d12819c fix(calendar): stretch year months grid to full viewport height 2026-02-23 15:39:09 +07:00
Ruslan Bakiev
0bbeef5594 fix(calendar): scope zoom selectors by layer and stretch week days to full height 2026-02-23 15:32:52 +07:00
Ruslan Bakiev
7c019a6300 fix(calendar): keep depth layers mounted in one card without display swap 2026-02-23 14:58:52 +07:00
Ruslan Bakiev
f6b738352b fix(calendar): use full available calendar viewport height on desktop 2026-02-23 14:40:59 +07:00
Ruslan Bakiev
db49c4a830 fix(calendar): make nested block zoom smooth in both directions 2026-02-23 14:33:24 +07:00
Ruslan Bakiev
894210cd42 fix(calendar): remove overlay swap and keep in-place zoom flow 2026-02-23 12:50:11 +07:00
Ruslan Bakiev
aa465f65bd feat(workspace): add hidden contacts filter and remove calendar scene swap 2026-02-23 12:38:30 +07:00
Ruslan Bakiev
82bc5dd04e refactor(frontend): extract calendar scene into workspace component 2026-02-23 11:35:57 +07:00