import { useState } from 'react' import { motion, AnimatePresence } from 'framer-motion' const SHEETS = [ { label: 'Lượng giác', formulas: [ { label: 'sin(A±B)', text: 'sin(A±B) = sinA·cosB ± cosA·sinB' }, { label: 'cos(A±B)', text: 'cos(A±B) = cosA·cosB ∓ sinA·sinB' }, { label: 'Hạ bậc sin²', text: 'sin²x = (1 − cos2x) / 2' }, { label: 'Hạ bậc cos²', text: 'cos²x = (1 + cos2x) / 2' }, { label: 'sin²+cos²', text: 'sin²x + cos²x = 1' }, ], }, { label: 'Logarit', formulas: [ { label: 'Đổi cơ số', text: 'logₐb = ln b / ln a' }, { label: 'logₐ(mn)', text: 'logₐ(mn) = logₐm + logₐn' }, { label: 'logₐ(m/n)', text: 'logₐ(m/n) = logₐm − logₐn' }, { label: 'logₐ(mⁿ)', text: 'logₐ(mⁿ) = n · logₐm' }, ], }, { label: 'Hình học', formulas: [ { label: 'Diện tích tam giác', text: 'S = (1/2) · a · h' }, { label: 'Định lý cosin', text: 'a² = b² + c² − 2bc·cosA' }, { label: 'Diện tích hình tròn', text: 'S = πr²' }, { label: 'Chu vi hình tròn', text: 'C = 2πr' }, ], }, { label: 'Đại số', formulas: [ { label: '(a+b)²', text: '(a+b)² = a² + 2ab + b²' }, { label: '(a−b)²', text: '(a−b)² = a² − 2ab + b²' }, { label: 'a²−b²', text: 'a² − b² = (a+b)(a−b)' }, { label: 'Nghiệm bậc 2', text: 'x = (−b ± √(b²−4ac)) / 2a' }, ], }, { label: 'Giải tích', formulas: [ { label: "(xⁿ)'", text: "(xⁿ)' = n·xⁿ⁻¹" }, { label: "(√x)'", text: "(√x)' = 1 / (2√x)" }, { label: "(eˣ)'", text: "(eˣ)' = eˣ" }, { label: "(ln x)'", text: "(ln x)' = 1/x" }, { label: "(sin x)'", text: "(sin x)' = cos x" }, { label: "(cos x)'", text: "(cos x)' = −sin x" }, { label: "∫xⁿ dx", text: "∫xⁿ dx = xⁿ⁺¹/(n+1) + C" }, ], }, { label: 'Tổ hợp', formulas: [ { label: 'Hoán vị', text: 'Pₙ = n!' }, { label: 'Chỉnh hợp', text: 'Aₙᵏ = n! / (n−k)!' }, { label: 'Tổ hợp', text: 'Cₙᵏ = n! / (k!·(n−k)!)' }, { label: 'Xác suất', text: 'P(A) = m / n' }, { label: 'Nhị thức', text: '(a+b)ⁿ = Σ Cₙᵏ·aⁿ⁻ᵏ·bᵏ' }, ], }, { label: 'Dãy số', formulas: [ { label: 'CSC — uₙ', text: 'uₙ = u₁ + (n−1)·d' }, { label: 'CSC — Sₙ', text: 'Sₙ = n·(u₁ + uₙ) / 2' }, { label: 'CSN — uₙ', text: 'uₙ = u₁·qⁿ⁻¹' }, { label: 'CSN — Sₙ', text: 'Sₙ = u₁·(qⁿ − 1) / (q − 1)' }, { label: 'Tổng ∞ CSN', text: 'S∞ = u₁ / (1 − q), |q| < 1' }, ], }, ] /** * Bottom-sheet drawer with Vietnamese math formula reference sheets. * Toggle button + spring-animated slide-up panel, drag-to-dismiss. * * @example * */ export function FormulaDrawer() { const [open, setOpen] = useState(false) const [activeTab, setActiveTab] = useState(0) return ( <> setOpen(v => !v)} className="flex items-center gap-1.5 px-3 py-1.5 rounded-lg font-sans text-xs text-dim border border-border hover:text-muted hover:border-border-subtle transition" > 📋 Công thức {open && ( <> setOpen(false)} /> { if (info.offset.y > 80) setOpen(false) }} > Bảng công thức setOpen(false)} className="text-faint hover:text-muted text-lg leading-none">✕ {SHEETS.map((s, i) => ( setActiveTab(i)} className="flex-shrink-0 px-3 py-1.5 rounded-lg font-sans text-xs font-medium transition" style={activeTab === i ? { background: 'var(--primary)', color: 'var(--primary-fg)' } : { color: '#64748B' }} > {s.label} ))} {SHEETS[activeTab].formulas.map((f, i) => ( {f.label} {f.text} ))} > )} > ) }