real_page_flip 1.12.12 copy "real_page_flip: ^1.12.12" to clipboard
real_page_flip: ^1.12.12 copied to clipboard

A high-fidelity 3D-like page flip engine for Flutter. Features physics-based paper fold effects with realistic shadows, sound, and haptic feedback for ultra-smooth performance.

Changelog #

All notable changes to the real_page_flip package will be documented here. For the example application (Realbook app), see example/CHANGELOG.md.

1.12.12 - 2026-07-07 #

Changed #

  • Crease Shadow Refinement: Softened fold crease shadow opacity by 50% (light mode: 0.16 -> 0.08, dark mode: 0.06 -> 0.03) and narrowed gradient spread stop to 30% to prevent thick, dark lines.

Fixed #

  • Curved Page Edge Boundary: Corrected the reverse/previous-page flip's free edge boundary mask in buildFlapScreenClipPath to use a matching quadraticBezierTo curve instead of a straight line, aligning the clip edge to the curled page layout.

1.12.11 - 2026-07-06 #

Added #

  • Slip Burst & Settle Thud: Added native platform haptic playbacks on Android/iOS for page release slippage and heavy settle thuds.
  • Logarithmic Tactile Scaling: Implemented Weber-Fechner Law gamma correction for slow drags, magnifying subtle friction textures.

Changed #

  • Adaptive Settle Durations: Fold animation speed scales dynamically based on release gesture velocity (80ms to 450ms).
  • Neutral Color Temperature: Refined dark-mode highlights (0xFFE8E8F0) to eliminate glassy blue sheen on OLED screens.

Fixed #

  • Extreme Gesture Artifacts: Aligned all painter and clipper guards to a shared kFlipProgressEpsilon to prevent frame gaps, and raised minimum mesh width to 12px.
  • Dark Mode Shading: Replaced multiply-black with screen-white for fold creases on dark paper to ensure depth visibility.
  • Low Profile saveLayer Bypass: Suppressed translucency layers entirely on low performance profiles, saving 2-3ms per frame.

1.12.9 - 2026-07-05 #

Added #

  • High-DPI Support: Edge and fold masks automatically widen by 25% on high-DPI displays (โ‰ฅ 2.0) to prevent sub-pixel rendering artifacts and anti-aliasing bleeds.

Changed #

  • Texture Refining: Clamped thin paper visibility threshold from 0.2 down to 0.05, allowing lighter translucent pages for subtle effects without disappearing.

Fixed #

  • Gesture Reliability: Added rigorous checks for detached RenderBox instances during tap position mapping, preventing rare lifecycle crashes.
  • Config Hashing: Optimized PageFlipConfig equality checks to use Object.hashAll().

1.12.8 - 2026-07-05 #

Added #

  • clipSpreadPageHalf utility: Exported clipSpreadPageHalf helper function for host applications to align local layout calculations with double-spread page boundaries.

Fixed #

  • Stationary Page Shadow: Resolved extreme vertical drag misalignment in double-spread mode by replacing the axis-aligned clipRect with a fold-aligned, normal-projected clipPath for the stationary shadow.
  • Angle Clamping: Tightened the shared fold-angle limit conservatively across shadows, clipping paths, flap meshes, and double-spread layers to prevent edge-corner clipping on extreme aspect ratios.
  • Haptics: Resolved conflicts between sound fallback playbacks and native textured vibration composition.

1.12.7 - 2026-07-04 #

Fixed #

  • Paper-like haptic feedback: replace stick-slip THUD bursts with short TICK textures, debounce native vibration calls, and cancel residual motor output on drag end.
  • Reduce drag haptic frequency and intensity ranges to avoid springy, stuttering vibration on Android.

1.12.6 - 2026-07-04 #

Added #

  • Dynamic depth rendering: Switches from shadows to reflective highlights on dark background paper (isPaperDark == true) for superior visual contrast and depth.
  • Double-spread ambient depth: Strengthened stationary edge shadow and spine groove with automated srcOver blending fallback when drawing glowing highlights on dark paper.

Changed #

  • Flap Curvature Shading: Strengthened matte highlight sheen (~2x peak) and deepened fold crease darkening with a broader gradient stop (0.55) for a smoother 3D bend.
  • Revealed-Page Drop Shadow: Doubled peak alpha and widened drop shadow falloff (36px). Introduced a secondary soft ambient band (1.6x width) for high/medium performance profiles.

1.12.5 - 2026-07-03 #

Fixed #

  • Clamped offscreen drag positions before flip geometry reaches layer clippers and painters, keeping extreme vertical swipes on a stable viewport-bound fold angle.
  • Extended flap paper, mask, fade, and shadow paint bounds only on angled folds so the screen-space flap clip cannot expose gaps at the top or bottom of the viewport.
  • Kept zero-angle horizontal drag rendering visually unchanged while protecting angled drags from clipped shadows and layer seams.

Tests #

  • Added extreme vertical drag regression coverage for viewport seam overlap, angled flap paint bounds, viewport touch clamping, and host-app LTR/RTL text-direction scenarios across phone, tablet, desktop, and rotated aspect ratios.

1.12.4 - 2026-07-03 #

Performance #

  • Reduced hidden page-flip rendering work by using indexed flap meshes and skipping low-value double-spread mesh draws on low and medium performance profiles outside the settle phase.

Fixed #

  • Hardened PageFlipLayerView to require a finite viewport size, removing hidden zero-size and infinite-size paint fallback paths.
  • Removed unused flap destination mapping from the painter/render pipeline to avoid dead API surface and misleading test coverage.
  • Kept unsafe texture gating out of the layer view, so omitted sizing cannot silently suppress flap textures.

Tests #

  • Added regression coverage for skipEarlyMesh, settle-phase rendering, mesh edge cases, viewport size contracts, painter behavior, and visual goldens.

1.12.3 - 2026-07-02 #

Fixed #

  • Removed release/profile debugNeedsPaint calls from snapshot refresh paths to prevent LateInitializationError crashes during page flips.
  • Changed the revealed-page shadow from a straight rectangular band to a curved fold-aligned path, matching the paper edge curve instead of fighting it visually.
  • Reduced revealed and stationary shadow weight so the fold reads as thinner, softer paper instead of a heavy slab.

Tests #

  • Added curved fold shadow band regression coverage and updated single-page reveal goldens for the softer curved shadow.

1.12.2 - 2026-06-30 #

Performance #

  • Changed the default reader profile from high to medium to reduce mesh density and high-DPI snapshot cost while preserving the full page flip effect.
  • Changed the default flapBackStrength from 0.3 to 0.0; double-spread mirrored back text is now opt-in instead of a default GPU cost.
  • Skips double-spread back mesh generation entirely when flapBackStrength <= 0.005 instead of drawing it and covering it with paper.
  • Avoids redundant pageSnapshots clones in double-spread capture paths; spread snapshots remain available for front, settle, and revealed-page textures.
  • Aligns the example app with the new lightweight medium default profile and adds a profile-mode FrameTiming benchmark entrypoint for rapid page-turn measurement.

1.12.1 - 2026-06-30 #

๐Ÿ”ง ๊ธฐํ•˜ํ•™ ๋ฐ ๋ Œ๋”๋ง ์—”์ง„ ๊ฐœ์„  (Geometry & Rendering Engine Enhancements) #

  • Angle Clamping & limits: ํ„ฐ์น˜ ์ž…๋ ฅ ๋ฒ”์œ„๋ฅผ ๋ทฐํฌํŠธ ๋‚ด๋กœ ํด๋žจํ•‘ํ•˜์—ฌ ๊ณผํšŒ์ „์„ ๋ฐฉ์ง€ํ•˜๊ณ , ๊ฐ๋„ ์ œํ•œ ๊ณต์‹์„ atan2์—์„œ asin ํˆฌ์˜๋ฒ•์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋” ์ •ํ™•ํ•œ ๋ฌผ๋ฆฌ ํ•œ๊ณ„ ๊ตฌํ˜„ | Clamped vertical touch inputs to viewport and updated the angle limit calculation to use asin projection, physically preventing flap corners from clipping outside.
  • Normal-aligned bleed: ๋‹จ์ˆœ ๊ฐ€๋กœ์ถ•(X) ์ด๋™ ๋Œ€์‹  ์ ‘ํž˜ ๋ฒ•์„  ๋ฒกํ„ฐ foldNormal ๋ฐฉํ–ฅ์œผ๋กœ ํด๋ฆฝ overlap bleed ๋ฐ ๊ทธ๋ฆผ์ž ์˜คํ”„์…‹์„ ์ ์šฉํ•˜์—ฌ, ํšŒ์ „๋œ ๊ฐ๋„์—์„œ๋„ ๊ทธ๋ฆผ์ž์™€ ํด๋ฆฝ๋ผ์ธ์ด ์™„์ „ํžˆ ์ผ์น˜ํ•˜๋„๋ก ์ •ํ•ฉ์„ฑ ๊ฐœ์„  | Shifted clip bleed and shadow offsets along the fold normal vector foldNormal instead of raw X-axis, keeping tilted shadow lines parallel.
  • Double-spread shadow fixes: ์–‘๋ฉด ์ด์ „์žฅ(Double-spread backward) ํ”Œ๋ฆฝ ์‹œ์˜ spine ๊ทธ๋ฆผ์ž ๋ฐฉํ–ฅ ๋ฐ stationary ๊ทธ๋ฆผ์ž ์ขŒํ‘œ๊ฐ€ ๋’ค์ง‘ํžˆ๋˜ ๋ฒ„๊ทธ ํ•ด๊ฒฐ | Fixed spine shadow directions and stationary shadow coordinate offsets during double-spread backward flips.

1.12.0 - 2026-06-30 #

โœจ ๋‹จ๋ฉด(Single-page) ๋ชจ๋“œ ๋Œ€ํญ ๊ฐœ์„  (Single-Page Flip Overhaul) #

  • Backward geometry: ๋‹จ๋ฉด ์ด์ „์žฅ ์ „ํ™˜์„ ์–‘๋ฉด(spine) ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ ๋Œ€์‹  ๋‹ค์Œ์žฅ๊ณผ ๋™์ผํ•œ ์ ‘ํž˜ ๋ฐฉํ–ฅ์˜ ์‹œ๊ฐ„ ์—ญ์žฌ์ƒ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋‹จ๋ฉด ๋ฆฌ๋”์— ๋งž๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ๋„˜๊น€ ์ œ๊ณต | Single-page backward flips now reuse the forward fold geometry (time-reversed) instead of double-spread spine geometry.
  • Adjacent reveal: ๋‹จ๋ฉด ๋ชจ๋“œ์—์„œ ๋„˜๊น€ ์ค‘ ๋‹ค์Œ/์ด์ „ ์žฅ ์ฝ˜ํ…์ธ ๊ฐ€ ์ ‘ํž˜ ๋’ค์—์„œ ์—ฐ์†์ ์œผ๋กœ ๋ณด์ด๋„๋ก bottom ๋ ˆ์ด์–ด ํŽ˜์ด๋“œ ์ œ๊ฑฐ | Bottom revealed page no longer fades in single-page mode, keeping the destination page visible throughout the flip.
  • Scroll carry-over: ๋“œ๋ž˜๊ทธ ์‹œ์ž‘ ์‹œ ์Šคํฌ๋กค ์˜คํ”„์…‹์„ ์Šค๋ƒ…์ƒท์— ๋ฐ˜์˜ํ•˜์—ฌ ์„ธ๋กœ ์Šคํฌ๋กค ํ›„ ๊ฐ€๋กœ ์Šค์™€์ดํ”„ ์‹œ ๊ฐ™์€ ์ฝ๊ธฐ ์œ„์น˜ ์œ ์ง€ | Scroll offset is captured into flip snapshots so horizontal swipes preserve vertical scroll depth.
  • Thin-paper bleed-through: PageFlipConfig.singlePageBackContentOpacity ์˜ต์…˜ ์ถ”๊ฐ€ (๊ธฐ๋ณธ 1.0). 1.0 ๋ฏธ๋งŒ์ด๋ฉด ์ ‘ํžˆ๋Š” ๋ฉด์˜ ๋’ท๊ธ€์”จ๊ฐ€ ์ข…์ด์ƒ‰ ์˜ค๋ฒ„๋ ˆ์ด๋กœ ํฌ๋ฏธํ•˜๊ฒŒ ๋น„์ณ ๋ณด์ด๋„๋ก ์ง€์› | New opt-in singlePageBackContentOpacity dims peeled back content for thin-paper bleed-through; default preserves existing crisp behaviour.
  • Settle flicker fix: ๋น„์นจ ์˜ค๋ฒ„๋ ˆ์ด๊ฐ€ ์ •์ฐฉ(settle) ๊ฒฝ๊ณ„์—์„œ ํ•œ ํ”„๋ ˆ์ž„์— ์‚ฌ๋ผ์ง€๋˜ ๊นœ๋ฐ•์ž„์„ singlePageBackDim ์—ฐ์† ๋ณด๊ฐ„์œผ๋กœ ์ˆ˜์ • | Bleed overlay now eases out continuously across the settle window instead of snapping off at isSettlePhase.

๐ŸŽจ ์‹œ๊ฐ ํ’ˆ์งˆ (Visual Quality) #

  • Shadow seam: ์ ‘ํž˜ ๋ ˆ์ด์–ด ๊ทธ๋ฆผ์ž ๋ฐด๋“œ ์‚ฌ์ด ๋ฐ์€ ์นผ๋‚ ํ˜• ํ‹ˆ์ƒˆ(blade gap) ์ œ๊ฑฐ | Eliminated bright blade-like gaps between shadow bands near the fold.
  • Edge masks: ๋‹คํฌ/๋ผ์ดํŠธ ์ข…์ด์— ๋งž์ถฐ edgeยทfold ๋งˆ์Šคํฌ ํญยท๋ถˆํˆฌ๋ช…๋„๋ฅผ ํ…Œ๋งˆ ์ธ์‹(isPaperDark)์œผ๋กœ ์กฐ์ • | Theme-aware edge and fold masks (narrower/softer on dark paper).
  • Highlight sheen: ๋‹คํฌ ์ข…์ด๋Š” ์€์€ํ•œ ์ฟจ ํ†ค, ๋ผ์ดํŠธ ์ข…์ด๋Š” ๋”ฐ๋œปํ•œ ๋งคํŠธ ํ•˜์ด๋ผ์ดํŠธ | Per-theme matte centre highlights (cool ambient on dark, warm on light paper).
  • Fold crease: ์ ‘ํž˜ ๋ ํ…Œ๋‘๋ฆฌ ์„  ๋‘๊ป˜ยท๊ฐ•๋„ ์™„ํ™”๋กœ ๋งŒํ™”์  ์•„์›ƒ๋ผ์ธ ์ œ๊ฑฐ | Reduced cartoonish fold-edge stroke weight.

๐Ÿงช ํ…Œ์ŠคํŠธ (Tests) #

  • ๋‹จ๋ฉด backward ์—ญ์žฌ์ƒ, ๋น„์นจ ์˜ค๋ฒ„๋ ˆ์ด, ๋‹คํฌ ๋งˆ์Šคํฌ, ํ•˜์ด๋ผ์ดํŠธ ํ…Œ๋งˆ, ์ •์ฐฉ ๊นœ๋ฐ•์ž„ ํšŒ๊ท€ ๋“ฑ 904๊ฐœ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ | Added regression tests for single backward, bleed-through, theme masks, settle flicker; full suite green.

1.11.9 - 2026-07-01 #

โœจ ๋ฐ๋ชจ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์„ธ๊ทธ๋จผํŠธ ์ตœ์ ํ™” (Demo Animation Segment) #

  • Highlight Focus: README ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์˜์ƒ์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํƒ€์ž„๋ผ์ธ์„ 6์ดˆ~14์ดˆ ๊ตฌ๊ฐ„์œผ๋กœ ์ง‘์ค‘ ์กฐ์ •ํ•˜์—ฌ ํŽ˜์ด์ง€ ํ”Œ๋ฆฝ์˜ ํ•ต์‹ฌ ๋ฌผ๋ฆฌ ์—”์ง„ ํšจ๊ณผ๋ฅผ ๋” ์„ ๋ช…ํ•˜๊ฒŒ ๊ฐ•์กฐ | Refined the demo animation segment to showcase the 6s-14s highlight section for better preview.

1.11.8 - 2026-06-30 #

โœจ ๋ฐ๋ชจ ๋ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ๊ฐํ™” ์—…๋ฐ์ดํŠธ (Demo & Visualization) #

  • Preview Update: README ๋‚ด ๋ฐ๋ชจ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์‹ค์ œ ์ ์šฉ๋œ ํ–…ํ‹ฑ ๋ฐ˜์‘๊ณผ ๋ฌผ๋ฆฌ ์—”์ง„์˜ ํƒ€์ด๋ฐ์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋ฐ˜์˜ | Updated preview animations to better reflect natural haptic and physics timing visually in README.

1.11.7 - 2026-06-29 #

๐Ÿ› ๋ฐ๋ชจ ์ž๋™์žฌ์ƒ ๋ฒ„๊ทธ ๋ฐ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ™˜๊ฒฝ ์ตœ์ ํ™” (Demo Autoplay & Simulation Fix) #

  • Autoplay Bug Fix: ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์˜ ๋“œ๋ž˜๊ทธ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ํ„ฐ์น˜ ์ œ์Šค์ฒ˜๋กœ ์˜ค์ธ๋˜์–ด ์˜คํ† ํ”Œ๋ ˆ์ด๋ฅผ ์ค‘๋‹จ์‹œํ‚ค๋˜ ๋ฒ„๊ทธ ์™„๋ฒฝ ํ•ด๊ฒฐ | Fixed a bug where programmatic drag animations were misinterpreted as touch gestures, incorrectly halting the autoplay sequence.
  • Aspect Ratio Restoration: 1๋‹จ ๋ ˆ์ด์•„์›ƒ์€ ์Šค๋งˆํŠธํฐ ์„ธ๋กœ ๋น„์œจ(420x800)๋กœ, 2๋‹จ ๋ ˆ์ด์•„์›ƒ์€ ํƒœ๋ธ”๋ฆฟ ๊ฐ€๋กœ ๋น„์œจ(1000x650)๋กœ ๊ณ ์ •ํ•˜์—ฌ ์‹ค์ œ ๊ธฐ๊ธฐ ์‚ฌ์šฉ ํ™˜๊ฒฝ์„ ์™„๋ฒฝํžˆ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ | Enforced device-centric aspect ratios for the demo viewport, accurately simulating portrait phones for 1-column and landscape tablets for 2-column views.
  • Fast Startup: ์•ฑ ๋กœ๋”ฉ ์งํ›„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฉˆ์ถฐ์žˆ๋˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„(3์ดˆ)์„ 0.5์ดˆ๋กœ ์ œ๊ฑฐํ•˜๊ณ  ๋‹คํฌ ๋ชจ๋“œ ๋ฐฐ๊ฒฝ์„ ์ผ์น˜์‹œ์ผœ ๋นˆ ํฐ ํ™”๋ฉด์„ ์—†์•ฐ | Eliminated unnecessary white-screen idle time by reducing initial startup delay and matching the index.html background color to the app theme.

1.11.6 - 2026-06-29 #

โœจ ๋ฐ๋ชจ ์—…๋ฐ์ดํŠธ ๋ฐ UX ๊ฐœ์„  (Demo & UX Improvements) #

  • Demo Update: ์›น ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐ๋ชจ๊ฐ€ AnimationController๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ๋ชฐ์ž…๊ฐ ๋„˜์น˜๋Š” ์ธ๊ฐ„์ ์ธ ๋“œ๋ž˜๊ทธ ๋ฌผ๋ฆฌ ํšจ๊ณผ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋„๋ก ๊ฐœ์„  | The web preview demo now simulates fluid human-like page drag physics using an AnimationController, delivering a much more natural and immersive feel.
  • UX Improvement: ๋Œ€ํ™”ํ˜• ์›น ๋ฏธ๋ฆฌ๋ณด๊ธฐ์—์„œ ๊ธฐ๊ธฐ ํ”„๋ ˆ์ž„, ํ…Œ๋‘๋ฆฌ, ๊ทธ๋ผ๋ฐ์ด์…˜ ๋ฐฐ๊ฒฝ์„ ์ œ๊ฑฐํ•˜์—ฌ ๊น”๋”ํ•œ ํ’€์Šคํฌ๋ฆฐ ๋ทฐ ํ™˜๊ฒฝ ์ œ๊ณต | Removed device frames, borders, and gradient backgrounds from the Interactive Web Preview for a clean, fullscreen viewing experience.
  • Doc Optimization: README ๋ฐ๋ชจ ์„น์…˜์„ ๊ฐ„์†Œํ™”ํ•˜์—ฌ 1๋‹จ ๋ฐ 2๋‹จ ๋ ˆ์ด์•„์›ƒ ๋ชจ๋‘๋ฅผ ์œ„ํ•œ ํ†ตํ•ฉ Interactive Web Preview ์ œ๊ณต | Simplified README demo sections to provide a unified Interactive Web Preview for both 1-column and 2-column layouts.

1.11.5 - 2026-06-29 #

โœจ ๋ฐ๋ชจ ๋ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ตœ์ ํ™” (Demo & Animation Optimization) #

  • ํŒจํ‚ค์ง€ ์˜ˆ์‹œ ์˜์ƒ(page_flip_demo.webp)์ด 1-Column ๋ฐ 2-Column ํŽ˜์ด์ง€ ํ”Œ๋ฆฝ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‹ค์ œ๋กœ ๋ณด์—ฌ์ฃผ๋„๋ก ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ต์ฒด | Replaced the package demo video (page_flip_demo.webp) to properly show the actual 1-Column and 2-Column page flip animations.
  • ์˜ˆ์ œ ์•ฑ ์‹œ์ž‘ ์‹œ์˜ autoplay ์‹œํ€€์Šค ์†๋„๋ฅผ 2๋ฐฐ๋กœ ๋น ๋ฅด๊ฒŒ ์กฐ์ •ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ํšจ๊ณผ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„  | Shortened and accelerated the example app autoplay sequence so developers can observe the page flip transitions much faster on launch.

1.11.4 - 2026-06-29 #

๐Ÿ”ง ๋นŒ๋“œ/๋ฐฐํฌ #

  • Gradle standalone ๋นŒ๋“œ ํ˜ธํ™˜์„ฑ ๊ฐœ์„  ๋ฐ Dart analyzer ๊ฒฝ๊ณ  ํ•ด๊ฒฐ | Improved Gradle standalone build compatibility and resolved Dart analyzer warnings

๐Ÿงช ํ…Œ์ŠคํŠธ #

  • ํด๋ฆฝ ์ •๋ ฌ, ํ”Œ๋žฉ ํ”„๋ก ํŠธ ํ…์Šค์ฒ˜, ํ”Œ๋ฆฝ ์ปค๋ธŒ ํ…Œ์ŠคํŠธ์˜ ๋ฆฐํŠธ ๊ฒฝ๊ณ (๋ถˆํ•„์š”ํ•œ ์ ‘๊ทผ/ํ˜•๋ณ€ํ™˜/๊ด„ํ˜ธ) ์ˆ˜์ • | Fixed lint warnings in clip alignment, flap front texture, and flip curve tests

1.11.3 - 2026-06-28 #

โœจ ์˜ˆ์ œ ๋ ˆ์ด์•„์›ƒ ๊ฐœ์„  ๋ฐ ์ง๊ด€์ ์ธ ๋ฐ๋ชจ ์—์…‹ ์ œ๊ณต (Example App & Demo Assets Overhaul) #

  • ๋ณต์žกํ•œ ๋Œ€์‹œ๋ณด๋“œ ๋Œ€์‹  ํŽ˜์ด์ง€ํ”Œ๋ฆฝ ํšจ๊ณผ(1๋‹จ ๋‹จ๋ฉด ๋ฐ 2๋‹จ ์–‘๋ฉด)๊ฐ€ ํ•œ๋ˆˆ์— ๋ณด์ด๋„๋ก ๊ธฐ๋ณธ ํ™”๋ฉด์„ ํ’€์Šคํฌ๋ฆฐ ์ฑ… ๋ทฐ์–ด๋กœ ๊ฐœ์„  | Redesigned the example app to show a clean, fullscreen book view by default so developers can focus directly on the page flip effects.
  • ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ˆจ๊น€/ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ํ† ๊ธ€ ์˜ต์…˜์„ ์ƒ๋‹จ ํˆด๋ฐ”์— ์ œ๊ณต | Added a layout toolbar at the top allowing developers to switch between 1-Column and 2-Column views and toggle the advanced Tuning Deck overlay.
  • ์‹œ์ž‘ ์‹œ ์ž๋™์œผ๋กœ 1๋‹จ ๋ฐ 2๋‹จ ๋„˜๊น€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์—ฐ์† ์‹คํ–‰ํ•ด ์ฃผ๋Š” autoplay/presentation ๋ชจ๋“œ ๋„์ž… | Implemented a startup autoplay demonstration sequence that showcases single-page and double-spread animations smoothly.
  • ์ƒˆ๋กœ์šด ๋ ˆ์ด์•„์›ƒ ๊ธฐ์ค€์˜ ๊ณ ํ™”์งˆ ๋ฐ๋ชจ ์˜์ƒ ๋ฐ ์Šคํฌ๋ฆฐ์ƒท ์—์…‹์„ README์™€ ํŒจํ‚ค์ง€์— ํ†ตํ•ฉ ๋ฐฐํฌ | Generated and packaged clean, dashboard-free animation WebP videos and layout screenshots.

1.11.2 - 2026-06-28 #

โœจ ๋ฌธ์„œํ™” ๋ฐ ๋ฐ๋ชจ ์—์…‹ ์ตœ์ ํ™” (Documentation & Demo Assets) #

  • ๋Œ€ํ™”ํ˜• Web ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ๋ชจ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ๋…นํ™”ํ•œ ์‹ ๊ทœ ํŽ˜์ด์ง€ ๋„˜๊น€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋น„๋””์˜ค(page_flip_demo.webp)๋ฅผ ํฌํ•จํ•œ ์ตœ์‹  WebP ํฌ๋งท ๋ฏธ๋””์–ด ์—์…‹ ์ œ๊ณต | Added a high-fidelity interaction demo video (page_flip_demo.webp) showcasing full-cycle page flip animations and the Control Deck live.
  • ์–‘๋ฉด ๋ณด๊ธฐ(Double-Spread) ๋ชจ๋“œ ์™„๋ฒฝ ์ง€์› ์•ˆ๋‚ด ๋ฐ ์‹ ๊ทœ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ฐ๋ชจ ๋ฏธ๋””์–ด๋ฅผ README.md ๋ฌธ์„œ์— ํ†ตํ•ฉ ๋ฐ˜์˜ | Integrated double-spread support notices and the new web interactive preview into the root README.md.

1.11.1 - 2026-06-28 #

โœจ ์˜ˆ์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ์„  (Example Application) #

  • ๋‹คํฌ ๋ชจ๋“œ, ๋„ค์˜จ ์ปฌ๋Ÿฌ ๊ทธ๋ผ๋ฐ์ด์…˜, Glassmorphic ํŒจ๋„์„ ๋„์ž…ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ธ ํ”„๋ฆฌ๋ฏธ์—„ ํ†ค์•ค๋งค๋„ˆ๋กœ ์˜ˆ์ œ ์•ฑ ๋””์ž์ธ์„ ์ „๋ฉด ๊ฐœํŽธ | Completely redesigned the example app with a premium developer-focused look using dark theme, glassmorphic panels, and neon gradients.
  • ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง ์ƒํƒœ๋ฐ”(ํŽ˜์ด์ง€์ˆ˜, ์—”์ง„ ์ƒํƒœ ๋“ฑ) ๋ฐ PageFlipConfig ํŒŒ๋ผ๋ฏธํ„ฐ(๋ฏผ๊ฐ๋„, ๋ถˆํˆฌ๋ช…๋„, AMO ์„ฑ๋Šฅ ๋ ˆ๋ฒจ ๋“ฑ)๋ฅผ ์ฆ‰์„์—์„œ ํŠœ๋‹ํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ™”ํ˜• Control Deck ํƒ‘์žฌ | Implemented an interactive Control Deck with sliders, segmented selectors, and toggles to dynamically test and profile page flip settings live.

1.11.0 - 2026-06-28 #

โœจ ์„ฑ๋Šฅ ์ตœ์ ํ™” (Performance) #

  • ์ €์‚ฌ์–‘ ๊ธฐ๊ธฐ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ PerformanceProfile ๋„์ž… ๋ฐ ๋งค์‰ฌ ๋ Œ๋”๋ง ๋™์  ๊ฑด๋„ˆ๋›ฐ๊ธฐ ์ตœ์ ํ™” | Introduced PerformanceProfile and dynamic mesh-rendering skip to optimize GPU performance for low-end devices.
  • PerformanceProfile.low ๋ชจ๋“œ์ผ ๋•Œ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณ€ํ™”๊ฐ€ ์ ์€ ๊ตฌ๊ฐ„(๋“œ๋ž˜๊ทธ ์ดˆ๊ธฐ๋‚˜ ๋„˜๊น€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ดˆ์ค‘๋ฐ˜)์—์„œ ๋ณต์žกํ•œ Mesh ์—ฐ์‚ฐ์„ ์™„์ „ํžˆ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋‹จ์ˆœ ํ…์Šค์ฒ˜๋กœ ๋Œ€์ฒดํ•˜์—ฌ ๋ Œ๋”๋ง ๋ฆฌ์†Œ์Šค๋ฅผ ์ ˆ๊ฐ | Added skipEarlyMesh to bypass complex Mesh rendering during the invisible initial/middle phases of animations on low-profile devices.
  • ๋ผ์ด๋ธŒ ํŽ˜์ด์ง€ ํด๋ฐฑ(Live page fallback)์ด Double-spread ๋ชจ๋“œ์—๋„ ์ œ๊ฑฐ๋˜๋„๋ก ํ•˜์—ฌ, ๋ฌด๊ฑฐ์šด ์œ„์ ฏ ํŠธ๋ฆฌ๊ฐ€ ์ค‘๋ณต ๋ Œ๋”๋ง๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” GlobalKey ์ถฉ๋Œ ๋ฐ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„ ๋ฐฉ์ง€ | Fixed duplicate GlobalKey crashes by removing live page fallback from double-spread OffscreenPreRenderer.

๐Ÿงช ํ…Œ์ŠคํŠธ (Tests) #

  • ์ตœ์ ํ™”๋œ ๋ Œ๋”๋ง ๋ถ„๊ธฐ์— ๋งž์ถ”์–ด ๋ ˆ์ด์–ด ๋ทฐ ํ…Œ์ŠคํŠธ๋“ค์ด ๋ผ์ด๋ธŒ ํŽ˜์ด์ง€ ๋Œ€์‹  Opaque Paper Fallback์„ ๊ฒ€์ฆํ•˜๋„๋ก ๊ฐœ์„  | Updated layer view tests to assert Opaque Paper fallback correctly, reflecting the removed live page fallback optimization.

1.10.0 - 2026-06-28 #

๐Ÿงช ํ…Œ์ŠคํŠธ ๋ฐ ์•ˆ์ •์„ฑ ๊ฒ€์ฆ (Test & Stability) #

  • ๋‹จ๋ฉด ๋ชจ๋“œ(Single Backward) ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ ์—ฃ์ง€ ์ผ€์ด์Šค ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ ๋ฐ ๊ตฌ๋ฒ„์ „ ํ…Œ์ŠคํŠธ ๋กœ์ง ์ตœ์‹ ํ™” | Added geometry edge case tests and updated outdated test expectations for single backward flips.
  • PageFlipClipper์™€ PageFlipOpenClipper ๊ฐ„์˜ ํด๋ฆฌํ•‘ ํŒจ์Šค ๊ต์ฐจ์  ์ •ํ•ฉ์„ฑ ๋ฐ ํ™”๋ฉด ๋น„์œจ๋ณ„ ์˜ค์ฐจ ์—†๋Š” ์™„์ „ํ•œ ์ผ์น˜ ๊ฒ€์ฆ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ | Added rigorous clip path alignment tests across multiple aspect ratios to ensure perfect boundary intersections.
  • ์—ฐ์†์ ์ธ ๋“œ๋ž˜๊ทธ ๋ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ทจ์†Œ ์‹œ ๋ฐœ์ƒํ•˜๋Š” Race Condition ๋ฐฉ์ง€ ์œ„์ ฏ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ | Added widget integration tests to verify robust handling of rapid, continuous drag and cancellation race conditions.

1.9.9 - 2026-06-28 #

๐Ÿ› ์ˆ˜์ • #

  • ๋’ค์ง‘ํžˆ๋Š” ํŽ˜์ด์ง€์˜ ๊ทธ๋ฆผ์ž ์˜์—ญ(Revealed Page Shadow)์ด ์ง์„  clipRect ๋Œ€์‹  ์‹ค์ œ ๊ณก์„  ํด๋“œ ๊ฒฝ๋กœ(clipPath)๋ฅผ ๋”ฐ๋ผ ์ž˜๋ฆฌ๋„๋ก ๊ฐœ์„ ํ•˜์—ฌ ๋ชจ๋“  ํ™”๋ฉด ๋น„์œจ์—์„œ ๋‘ ๋ฒˆ์งธ ๋ ˆ์ด์–ด์˜ ๊ณก์„  ๊ฒฝ๊ณ„์„ ๊ณผ ๊ทธ๋ฆผ์ž๊ฐ€ ์™„์ „ํžˆ ์ผ์น˜ํ•˜๋„๋ก ์ˆ˜์ • | Replaced straight clipRect with curved clipPath for Revealed Page Shadow, ensuring perfect alignment between the curved fold line boundary and the shadow on all screen aspect ratios

1.9.8 - 2026-06-28 #

๐Ÿ› ์ˆ˜์ • #

  • ๋‹จ๋ฉด ๋ชจ๋“œ ์ด์ „์žฅ(Backward) ์ „ํ™˜ ์‹œ ์ ‘ํžˆ๋Š” ์ข…์ด์˜ ์ž˜๋ฆฌ๋Š” ๋ฉด์ ๊ณผ ๊ทธ๋ฆผ์ž ๋ฐฉํ–ฅ์ด ๊ผฌ์ด๋˜ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ ๊ณ„์‚ฐ ์˜ค๋ฅ˜ ์ˆ˜์ • | Fixed Single Backward flip geometry where flap direction and material width calculations were inverted
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ธ์ ‘ ํŽ˜์ด์ง€๋“ค์ด Offstage ์„ค์ •์œผ๋กœ ์ธํ•ด ํ”Œ๋Ÿฌํ„ฐ ์—”์ง„์—์„œ ํŽ˜์ธํŒ…์ด ์ƒ๋žต๋˜์–ด ์Šค๋ƒ…์ƒท(toImage) ์บก์ฒ˜์— ์˜๊ตฌ ์‹คํŒจํ•˜๋˜ ๋ฌธ์ œ ์ˆ˜์ • | Fixed background adjacent page snapshots failing to capture due to Offstage omitting painting
  • ํ™”๋ฉด ๋ฐ– ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ Œ๋”๋ง ์˜์—ญ์˜ ์Šคํฌ๋ฆฐ ๋ฆฌ๋”(Semantics), ํฌ์ปค์Šค(Focus Scope), ๋งˆ์šฐ์Šค/ํ„ฐ์น˜ ์ž…๋ ฅ(IgnorePointer) ๋ˆ„์ˆ˜๋ฅผ ์›์ฒœ ์ฐจ๋‹จํ•˜๋Š” OffscreenPreRenderer ๋„์ž… | Introduced OffscreenPreRenderer to prevent focus, semantics, and pointer interaction leaks from off-screen pre-rendered pages

1.9.7 - 2026-06-28 #

๐Ÿ› ์ˆ˜์ • #

  • onMethodCall() ์ „์ฒด try-catch ์ ์šฉ์œผ๋กœ SecurityException ๋“ฑ ๋ชจ๋“  ์˜ˆ์™ธ๊ฐ€ result.error()๋กœ ์ „๋‹ฌ๋˜์–ด Dart HapticFeedback fallback์ด ์•ˆ์ •์ ์œผ๋กœ ๋ฐœ๋™ | Wrapped onMethodCall() in try-catch so all exceptions (including SecurityException) propagate as result.error(), ensuring reliable Dart HapticFeedback fallback
  • playFallback()์˜ vibrator?.vibrate() ํ˜ธ์ถœ ์˜ˆ์™ธ๊ฐ€ ์ƒ์œ„๋กœ ์ „ํŒŒ๋˜๋˜ ๋ฌธ์ œ ์ˆ˜์ • | Guarded vibrator?.vibrate() in playFallback() so exceptions don't bubble up unhandled

1.9.6 - 2026-06-28 #

โ™ป๏ธ ๋ฆฌํŒฉํ† ๋ง #

  • PageFlipGeometry์˜ ๋ชจ๋“  late final ํ•„๋“œ๋ฅผ final + factory constructor๋กœ ์ „ํ™˜ํ•˜์—ฌ LateInitializationError ์œ„ํ—˜ ์ œ๊ฑฐ | Converted 22 late final fields to plain final via factory constructor, eliminating LateInitializationError risk

๐Ÿ› ์ˆ˜์ • #

  • ์ •์  Shader ์บ์‹œ(static Map<String, Shader>)๊ฐ€ ์ ˆ๋Œ€ dispose๋˜์ง€ ์•Š์•„ GPU ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‹จ์กฐ ์ฆ๊ฐ€ํ•˜๋˜ ๋ˆ„์ˆ˜ ์ˆ˜์ •. ์ธ๋ผ์ธ createShader๋กœ ๋Œ€์ฒด | Fixed unbounded GPU memory leak from static Shader cache โ€” inlined simple gradient creation instead
  • build() ๋‚ด addPostFrameCallback์ด LayoutBuilder ์žฌํ˜ธ์ถœ ์‹œ ์ค‘๋ณต ๋“ฑ๋ก๋˜์–ด updateCachedWidth/captureSnapshots๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰๋˜๋˜ ๋ฒ„๊ทธ ์ˆ˜์ • | Fixed stacked post-frame callbacks in build() causing redundant updateCachedWidth/captureSnapshots
  • snapshot ๋ถ€์žฌ ์‹œ Offstage์˜ child๊ฐ€ ๋‹จ์ƒ‰ paper๋กœ ๊ต์ฒด๋˜์–ด capture pipeline์ด ์˜๊ตฌ ์†์ƒ๋˜๋˜ ๋ฌธ์ œ ์ˆ˜์ • (liveFallbackIndices ์ œ๊ฑฐ) | Fixed snapshot pipeline corruption where missing snapshots caused Offstage to render paper instead of live pages (removed liveFallbackIndices)
  • _scheduleCaptureRetry์˜ ๋‹จ์ผ ์Šค์นผ๋ผ ํ•„๋“œ๊ฐ€ ๋ฎ์–ด์จ์ ธ ์ž˜๋ชป๋œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ retry๋˜๋˜ ๋ฒ„๊ทธ ์ˆ˜์ • | Fixed capture retry parameter overwrite bug in _scheduleCaptureRetry
  • ๋“œ๋ž˜๊ทธ ์ˆ˜์šฉ ํ›„ ์ˆ˜์ง ์ œ์Šค์ฒ˜๋ฅผ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์—†์–ด Scrollable/SelectableText๊ฐ€ block๋˜๋˜ ๋ฌธ์ œ ์ˆ˜์ • | Fixed post-accept vertical gesture rejection so Scrollable/SelectableText can receive scrolls

1.9.5 - 2026-06-28 #

๐Ÿ› ์ˆ˜์ • #

  • ์œ„์ ฏ ์†Œ๋ฉธ ๋ฐ ์ œ์Šค์ฒ˜ ๋ ˆ์ด์–ด ์–ธ๋งˆ์šดํŠธ ์‹œ์ ์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” Null check ๋ฐ lifecycle ํฌ๋ž˜์‹œ ๋ฐฉ์ง€ | Guarded against null safety/lifecycle crashes during unmounting and disposal
  • ํ™”๋ฉด ํฌ๊ธฐ ๋ณ€๊ฒฝ ์‹œ ์บ์‹œ ๋ฌดํšจํ™” ๋ฐ ๋ ˆ์ด์•„์›ƒ ์žฌ๊ณ„์‚ฐ ์ฒ˜๋ฆฌ ์ถ”๊ฐ€ | Added cache invalidation and layout recalculation on size changes
  • endRevealStrength ๊ธฐ๋ณธ๊ฐ’์„ 0.0์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , settling ๋‹จ๊ณ„์—์„œ์˜ ๋ฏธ์„ธ ๋น„์ฃผ์–ผ ์ž”์ƒ ๊ฐœ์„ ์„ ์œ„ํ•ด ์ค‘๊ฐ„ ๋ ˆ์ด์–ด fade transition ์ถ”๊ฐ€ | Changed endRevealStrength default to 0.0 and added middle layer fade transition to eliminate settled artifacts
  • flapContentRevealStart/End ๋ถ„๋ชจ 0 ์–ต์ œ ์ฒ˜๋ฆฌ | Handled potential division by zero in flapContentRevealStart/End divisor

1.9.4 - 2026-06-28 #

โœจ ๊ธฐ๋Šฅ #

  • PageFlipConfig.copyWith() 26๊ฐœ ํ•„๋“œ ์ „์ˆ˜ ์ง€์› ๋ฐ clear-flag๋กœ nullable ํ•„๋“œ ์ดˆ๊ธฐํ™” | Added full copyWith() for all 26 fields with clear-flags for nullable fields

๐Ÿ› ์ˆ˜์ • #

  • PageFlipConfig.== ์—ฐ์‚ฐ์ž์— semanticBuilder ํ•„๋“œ ๋ˆ„๋ฝ๋˜์–ด ์ž˜๋ชป๋œ ๋™๋“ฑ์„ฑ ๋น„๊ต | Fixed == operator missing semanticBuilder field causing incorrect equality
  • PageFlipStateController.dispose()๊ฐ€ AnimationController.dispose()๋ฅผ ์ค‘๋ณต ํ˜ธ์ถœํ•˜๋˜ ๋ฒ„๊ทธ (๋น„๋ฉฑ๋“ฑ์„ฑ ๋ณดํ˜ธ) | Fixed dispose() calling AnimationController.dispose() twice (idempotency guard)

๐Ÿงช ํ…Œ์ŠคํŠธ #

  • Phase I-VI ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ๋Œ€๊ทœ๋ชจ ์ถ”๊ฐ€: ์„ค์ • ์ •ํ™•์„ฑ, ์ƒํƒœ ์ปจํŠธ๋กค๋Ÿฌ ๋ถ„๊ธฐ, ๋ฌผ๋ฆฌ ์†์„ฑ๊ธฐ๋ฐ˜ 60+๊ฐœ, ์œ„์ ฏ ์ œ์Šค์ฒ˜, ์–‘๋ฉด๋ชจ๋“œยท๋ฉ€ํ‹ฐํ„ฐ์น˜, ๊ธฐํ•˜ ๋ถˆ๋ณ€์†์„ฑ, ๋ฉ”๋ชจ๋ฆฌ ์ƒ๋ช…์ฃผ๊ธฐ, ํ”Œ๋žซํผ ์ฑ„๋„, ์ ‘๊ทผ์„ฑ, ๋Œ€์šฉ๋Ÿ‰ ์•„์ดํ…œ, ์ŠคํŠธ๋ ˆ์Šค | Added comprehensive Phase I-VI tests: 60+ physics property-based, gesture/edge/widget, double-spread/multitouch integration, geometry invariants, memory lifecycle, platform channels, accessibility, large itemCount, stress
  • PageFlipConfig ์„œ๋ช…, ๋ณต์‚ฌ, ์Šคํ”„๋ ˆ๋“œ๋ชจ๋“œ 3๊ฐœ ํŒŒ์ผ 55๊ฐœ ํ…Œ์ŠคํŠธ | Config copyWith, equality, spread mode tests
  • ์ปจํŠธ๋กค๋Ÿฌ ์—ฃ์ง€์ผ€์ด์Šค 30๊ฐœ ๋ฐ ํ”„๋กœ๊ทธ๋žจ API ๊ฒ€์ฆ | Controller edge case and programmatic API tests
  • ์œ„์ ฏ ์ œ์Šค์ฒ˜ยท์ฝœ๋ฐฑยท์—ฃ์ง€ํƒญ ํ†ตํ•ฉ 30๊ฐœ ํ…Œ์ŠคํŠธ + 5๊ฐœ ๊ธฐ์กด ํŒŒ์ผ ๊ฐœ์„  | Widget gesture/callback/edge tap tests with 5 existing file enhancements

๐Ÿ› ์ˆ˜์ • #

  • ํ–…ํ‹ฑ ๋ฌผ๋ฆฌ ๊ณ„์‚ฐ์ด ํ•ญ์ƒ 400px๋กœ ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ๊ธฐ๊ธฐ ํฌ๊ธฐ์— ๋”ฐ๋ผ ์ง„๋™ ๊ฐ•๋„๊ฐ€ ๋‹ฌ๋ผ์ง€๋˜ ๋ฒ„๊ทธ ์ˆ˜์ • (์‹ค์ œ ๋ทฐํฌํŠธ ํญ ์‚ฌ์šฉ)
  • ํŽ˜์ด์ง€๋ฅผ ๋งŽ์ด ๋„˜๊ธธ์ˆ˜๋ก ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ˆ„์ ๋˜๋˜ PaperPhysicsEngine ๋งต ๋ฌดํ•œ ์„ฑ์žฅ ๋ฒ„๊ทธ ์ˆ˜์ •
  • goToPage()๊ฐ€ ๋“œ๋ž˜๊ทธ/์• ๋‹ˆ๋ฉ”์ด์…˜ ์ค‘ ํ˜ธ์ถœ๋˜๋ฉด ๋‚ด๋ถ€ ์ƒํƒœ ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•˜๋˜ ๋ฌธ์ œ ์ˆ˜์ • (guard ์ถ”๊ฐ€)
  • ํ–…ํ‹ฑ ํ…์Šค์ฒ˜ ๋…ธ์ด์ฆˆ์˜ .abs()๋กœ ์ธํ•œ ๋ถˆ์—ฐ์† ๋„ํ•จ์ˆ˜๋กœ ์ง„๋™ ์ถœ๋ ฅ์— "๋”ธ๊น" ๋А๋‚Œ์ด ๋ฐœ์ƒํ•˜๋˜ ๋ฌธ์ œ ์ˆ˜์ •

โšก ์„ฑ๋Šฅ #

  • ํŽ˜์ด์ง€ํ”Œ๋ฆฝ ๋ ˆ์ด์–ด ์Šค๋ƒ…์ƒท ๋ Œ๋”๋ง์—์„œ ๋ถˆํ•„์š”ํ•œ RepaintBoundary ์ œ๊ฑฐ๋กœ GPU compositing layer ์˜ค๋ฒ„ํ—ค๋“œ ๊ฐ์†Œ

โ™ป๏ธ ๋ฆฌํŒฉํ† ๋ง #

  • onHandleEffect์˜ ๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜ enum ๋งค์นญ(name.contains('Haptic'))์„ ์•ˆ์ „ํ•œ switch ๋ฌธ์œผ๋กœ ๋ณ€๊ฒฝ
  • PageFlipGestureRecognizer์— @Deprecated ๋งˆํ‚น (PageFlipGestureLayer๋กœ ๋Œ€์ฒด๋จ)
  • PageFlipEffectHandler ์ธํ„ฐํŽ˜์ด์Šค์— viewportWidth setter ์ถ”๊ฐ€
  • shouldRepaint์— ๋ˆ„๋ฝ๋œ performanceProfile ํ•„๋“œ ๊ฒ€์‚ฌ ์ถ”๊ฐ€

1.9.0 - 2026-06-26 #

โœจ ๊ธฐ๋Šฅ #

  • ์™ธ๋ถ€ vibration ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๊ณ ์„ฑ๋Šฅ ํ”Œ๋žซํผ ์ฑ„๋„ ๊ธฐ๋ฐ˜ AdvancedHapticEngine ์‹ ๊ทœ ๊ตฌ์ถ•
  • Android (Core Haptics Composition APIs - Click/Tick/Thud) ๋ฐ iOS (CoreHaptics - CHHapticEngine) ๋งž์ถคํ˜• ๋„ค์ดํ‹ฐ๋ธŒ ์ง„๋™ ์—ฐ๋™
  • ๋“œ๋ž˜๊ทธ ์†๋„์— ๋น„๋ก€ํ•˜๋Š” ๋™์  ์ฃผ๊ธฐ ์Šค๋กœํ‹€๋ง(Dynamic Throttling) ๋ฐ ๋งˆ์ฐฐ/๊ฐ•์„ฑ์— ๋”ฐ๋ฅธ ๋ฐ˜์‘์„ฑ ์ตœ์ ํ™”

1.8.1 - 2026-06-25 #

๐Ÿ› ์ˆ˜์ • #

  • 2๋‹จ๋ณด๊ธฐ ํŽ˜์ด์ง€ํ”Œ๋ฆฝ settle ๋‹จ๊ณ„(progress 0.85-0.95)์—์„œ ๋ชฉ์ ์ง€ ๋Œ€์‹  ํ˜„์žฌ ํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ ๊ฐ€ ํ‘œ์‹œ๋˜๋˜ ๋ฒ„๊ทธ ์ˆ˜์ •
  • EPUB TOC ํŽ˜์ด์ง€(epub:type="toc")๊ฐ€ ์ผ๋ฐ˜ ์ฑ•ํ„ฐ๋กœ ๋ถ„ํ• ๋˜์–ด ํŽ˜์ด์ง€๊ฐ€ ํฉ์–ด์ง€๋˜ ๋ฌธ์ œ ์ˆ˜์ •

1.8.0 - 2026-06-25 #

โœจ ๊ธฐ๋Šฅ #

  • PaperTexturePreset ๋ชจ๋ธ ์ถ”๊ฐ€ (smooth/standard/textured/kraft)
  • PageFlipConfig์— hapticTexturePreset ์„ค์ • ์—ฐ๋™

โšก ์„ฑ๋Šฅ #

  • TXT ํŒŒ์ผ ์ธ์ฝ”๋”ฉ ํƒ์ง€ ๊ฐœ์„  (UTF-8 BOM โ†’ UTF-8 โ†’ latin1 fallback)

1.7.2 - 2026-06-24 #

Changed #

  • Extracted PageFlipPainter and PageFlipClippers into separate part files for cleaner code organization.
  • Haptic engine enhancements:
    • iOS/Android platform-specific texture haptic paths with speed-adaptive throttling.
    • Weber-Fechner non-linear amplitude curve (pow 1.3-1.4) for slip-release and micro-slip events.
    • Independent iOS/Android texture tick throttle tracking.

1.7.1 - 2026-06-24 #

Changed #

  • Haptic engine redesigned with event-specific vibration signatures:
    • startHaptic: single 45ms pulse at amplitude 180
    • impulseHaptic: crisp double-tap pattern for tap-flip confirmation
    • slipRelease: intensity-based double-tap pattern (pages slipping feel)
    • microSlip: intensity-based single pulse (acceleration bursts)
    • sound: 28ms pulse synchronized with audio
    • texturedHaptic: duration reduced to 10-30ms for cleaner throttle separation
  • Added _vibratePattern() using Vibration.vibrate(pattern:, intensities:) for multi-pulse haptic sequences on amplitude-control-capable devices
  • Added _iosHaptic() / _cancelHaptic() primitives
  • Removed _triggerImpact() / HapticImpactType in favour of event-specific handlers
  • Stick-slip events now use their intensity field (0.0-1.0) to dynamically scale vibration duration and amplitude instead of hardcoded light/medium presets

1.7.0 - 2026-06-23 #

Added #

  • DefaultPageFlipEffectHandler is now exported from the public API (package:real_page_flip/real_page_flip.dart)

Fixed #

  • _triggerImpact() now fires Vibration.vibrate() after HapticFeedback, ensuring haptic vibration is actually felt on Android devices where HapticFeedback is too subtle or imperceptible. Impact events (startHaptic, impulseHaptic) now produce real motor vibration.
  • Non-amplitude-control Android devices now use Vibration.vibrate(duration:) instead of HapticFeedback.selectionClick() during paper-texture haptics (texturedHaptic), providing noticeably stronger feedback.
  • Duration clamp raised from 5-20ms to 8-35ms so paper-texture vibration pulses are long enough to feel.

1.6.2 - 2026-06-23 #

Changed #

  • Minor style and formatting lint fixes to pass strict quality gate standards.

1.6.1 - 2026-06-23 #

Fixed #

  • Single backward page flip: unified foldX and flapMaterialWidth formulas with forward direction. Now single backward foldX moves right-to-left (same as forward) and flap grows with progress, eliminating directional inconsistency.

1.6.0 - 2026-06-22 #

Added #

  • DevicePerformanceProfile enum (high/medium/low) for adaptive rendering quality.
  • performanceProfile field on PageFlipConfig and PageFlipLayerView.
  • DefaultPageFlipEffectHandler now accepts an optional performanceProfile to throttle haptic feedback on low-end devices.

Fixed #

  • Single-page backward flip: corrected flapRightOfFold to false for single-page mode so the flap extends left from foldX (consistent with forward direction).
  • flapSnapshotSpreadIndex now returns currentIndex - 1 for single backward (previously returned currentIndex), ensuring the correct snap page is displayed as the flap texture.

1.5.1 - 2026-06-21 #

Changed #

  • Split page flip engine library into part files (page_flip_geometry.dart, page_flip_gesture.dart) for cleaner code organization.
  • Fixed 12 dart compiler/linter warnings in page flip engine and widgets.

1.5.0 - 2026-06-21 #

Added #

  • flapRightOfFold field on PageFlipGeometry unifying four-mode flap-direction logic.
  • Single-page backward: spine-anchored fold with flap following finger direction.
  • Direction-aware highlight, fold-darkening, edge-fade, and fold-fade gradients.

Changed #

  • Single-page forward: foldX anchored at left spine (x=0), flap extends rightward, shrinking toward spine as page turns.
  • Double-spread backward: flap extends RIGHT of foldX (previously left).
  • buildFlapScreenClipPath supports flap-right-of-fold paths with corrected bleed.
  • Angle limits simplified for single-page mode.

Fixed #

  • Backward single-page flap now shows page content during flip.
  • Backward flap curvature direction corrected.
  • Clip bleed direction corrected for backward double-spread.
  • Single-page fold line no longer moves to opposite edge (eliminated tearing look).

1.4.2 - 2026-06-04 #

Added #

  • Updated documentation to clarify that the engine is optimized for vertical mobile devices and does not support horizontal two-page view.

1.4.1 - 2026-06-04 #

Changed #

  • Relicensed the package under the MIT License.

1.4.0 - 2026-05-14 #

Added #

  • Direction-aware flip thresholds: cutoffForward and cutoffPrevious independently control drag-release completion.
  • 12 new test files covering geometry, physics, controllers, and widgets.
  • Named geometry constants extracted from inline magic numbers.

Changed #

  • PageFlipStateController accepts configurable thresholds from PageFlipConfig.
  • PageFlipPainter constructor is now const.
  • cutoffForward default: 0.8 โ†’ 0.4, cutoffPrevious default: 0.1 โ†’ 0.4.

Fixed #

  • PageFlipConfig, PaperPhysicsConfig, PaperPhysicsFrame equality/hashCode.

1.3.0 - 2026-05-09 #

Added #

  • Dark Mode Support: PageFlipConfig.backgroundColor now defaults to null and reads Theme.of(context).scaffoldBackgroundColor at render time.
  • Adaptive shadow intensity for dark backgrounds.

Changed #

  • PageFlipConfig.backgroundColor type: Color โ†’ Color?.

1.2.4 - 2026-05-02 #

Fixed #

  • Fixed 404 error on legacy interaction demo video URL.

1.2.3 - 2026-05-02 #

Fixed #

  • Replaced WebP tags with raw markdown video links for pub.dev compatibility.

1.2.2 - 2026-05-02 #

Fixed #

  • Fixed broken video tags on pub.dev.

1.2.1 - 2026-05-02 #

Added #

  • High-fidelity extended interaction recording.
  • Legacy Interaction Demo section.

1.2.0 - 2026-05-02 #

Added #

  • Production-quality demo assets.
  • Optimized README for pub.dev.

1.1.3 - 2026-05-02 #

Added #

  • High-fidelity interaction recording of the actual engine.

1.1.2 - 2026-05-02 #

Added #

  • Snappy demo video with immediate interaction start.
  • Absolute asset URLs for pub.dev compatibility.

1.1.1 - 2026-05-02 #

Added #

  • Professional teaser video, GPU optimization guides, Opus audio assets.
  • Example app with unique content and stress tests.

1.9.3 - 2026-06-27 #

๐Ÿ› ์ˆ˜์ • #

  • ์‚ฌ์šด๋“œ ์žฌ์ƒ์„ stop()+seek()+resume() ํŒจํ„ด์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๊ฐ„ํ—์  ์žฌ์ƒ ์‹คํŒจ ํ•ด๊ฒฐ (play()์˜ setSource() asset I/O ์ œ๊ฑฐ)
  • Android VIBRATE ํผ๋ฏธ์…˜ ๋ˆ„๋ฝ์œผ๋กœ ํ–…ํ‹ฑ์ด ์ „ํ˜€ ์ž‘๋™ํ•˜์ง€ ์•Š๋˜ ๋ฒ„๊ทธ ์ˆ˜์ • (AndroidManifest์— ๊ถŒํ•œ ์ถ”๊ฐ€)
  • ๋„ค์ดํ‹ฐ๋ธŒ ํ”Œ๋Ÿฌ๊ทธ์ธ vibrator ๋ฏธ์‚ฌ์šฉ ์‹œ error ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ • (Dart fallback ํ™œ์„ฑํ™”)

1.9.2 - 2026-06-27 #

๐Ÿ› ์ˆ˜์ • #

  • _playSound์—์„œ resume() ๋Œ€์‹  play()๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ • (audioplayers 6.x: stop() ํ›„ resume()์€ no-op)
  • AdvancedHapticEngine.playTransient() ๋ฐ playThud()์— HapticFeedback ํด๋ฐฑ ์ถ”๊ฐ€ (MethodChannel ์‹คํŒจ ์‹œ ๊ธฐ๋ณธ ์ง„๋™ ๋ณด์žฅ)

1.1.0 - 2026-05-01 #

Added #

  • Physics-based paper friction interaction logic.
  • Dynamic geometry rendering with hardware-accelerated clipping.
  • Integrated haptic feedback and sound effect system.
  • Semantics support for accessibility.

Changed #

  • Refactored PageFlipWidget to use PageFlipStateController.
  • Improved snapshot capturing in PreRenderManager.

Fixed #

  • Layout boundary issues in Stack configurations.
  • Memory leak in PreRenderManager snapshots.
6
likes
0
points
1.41k
downloads

Publisher

verified publishersharebible.org

Weekly Downloads

A high-fidelity 3D-like page flip engine for Flutter. Features physics-based paper fold effects with realistic shadows, sound, and haptic feedback for ultra-smooth performance.

Homepage
Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

audioplayers, flutter

More

Packages that depend on real_page_flip

Packages that implement real_page_flip