3.6 KiB
3.6 KiB
| paths | ||||
|---|---|---|---|---|
|
Coordinate Rules (รายละเอียด: docs/PLAN.md §2)
- ทิศทางแปลง: px → % =
÷size×100, % → px =×size÷100— ครบทั้ง point/rect/path strokeWidthเก็บเป็น % ของความกว้างหน้า;yOffsetเก็บเป็น % ของความสูงหน้า (0–100)mergeRectsByLine(rects): จัดกลุ่ม rects ที่ y/height ใกล้กัน (บรรทัดเดียวกัน) → union แกน x → คืน 1 rect ต่อบรรทัด — เรียกทุกครั้งก่อนบันทึก HIGHLIGHT ลง DB- InkLayer: SVG ห้ามมี
viewBox(ความหนาเส้นจะบิดเบี้ยวเมื่อ scale แกน x/y ไม่เท่ากัน) — render ระบบ px จริง แปลง % → px ด้วยขนาดจากResizeObserverแล้ว re-render เมื่อ resize/zoom - พิกัดจาก event ใช้
getBoundingClientRect()ของ page element เป็นฐานเสมอ และ clamp ค่า % ให้อยู่ 0–100 utils/geometry.ts(PLAN-FEAT.md F1) — pure functions บนพิกัด %:annotationBBox/translateAnnotationData/scaleAnnotationData/hitTestPath— ก่อนส่ง data ที่แปลงแล้วเข้าupdateAnnotationต้อง clamp offset/scale ให้ bbox ทั้งกลุ่มอยู่ใน 0–100 เพราะ validator ปฏิเสธค่าติดลบ — ยกเว้น STAMP เอียง (มีrotation):positionเป็นมุมกรอบก่อนหมุน ซึ่งไม่ถูกครอบโดยกรอบจริงบนจอ — เกณฑ์ความถูกต้อง (ทั้ง clamp ฝั่ง client และ validator) ใช้ AABB ของกรอบหมุน (stampRect/rotatedRectAABB) ตัวเดียวกันทั้งสองฝั่ง ไม่ใช่ position ตรง ๆ — ใช้คนละเกณฑ์แล้วลากถึงขอบหน้าแล้ว commit โดนปฏิเสธ เด้งกลับ (code review 2026-09-28) · ตอนตั้งมุมใหม่ (patch/ลากหมุน) และตอน patch ที่เปลี่ยนขนาดกรอบของตรายางเอียง (stampScale/labelเมื่อ rotation ≠ 0) ต้องเรียกclampStampIntoPageเลื่อน position กลับเข้าหน้าทันที (code review 2026-09-29) · validator ฝั่ง server ยึดstampLayoutEstimateขณะ client clamp ยึด measure จริงของ browser — สองตัววัดนี้คลาดกันตามฟอนต์ของเครื่อง validator จึงผ่อน tolerance ให้ AABB ติดลบได้ไม่เกิน 2% ของหน้า ไม่ใช่ปฏิเสธทันที (code review 2026-09-29)- AnnotationSelectionLayer: container
pointer-events: noneเสมอ เฉพาะ handle มุม/ขอบกรอบ/แถบเครื่องมือที่auto— ห้ามให้กรอบ selection บัง textLayer