/**
 * TamRank — gedeelde reveal-helper (count-up van getallen).
 *
 * Hoort bij assets/css/common/motion.css; richtlijnen in Branding.md
 * §Motion & Feedback. Alleen inzetten op piek-momenten (resultaat
 * verschijnt), nooit op permanente page-chrome. Gedeelde laag voor
 * FREE én het PRO-add-on.
 *
 * API:
 *   TamRankReveal.countUp(el)             — telt één element op naar zijn huidige waarde
 *   TamRankReveal.numbersIn(root, sel)    — countUp op alle matches binnen root
 *   TamRankReveal.reduced                 — true bij prefers-reduced-motion
 *
 * Elementen worden alleen geanimeerd als hun tekst een puur geheel getal is
 * (geformatteerde waardes zoals "12%" of "1.2k" blijven ongemoeid) — de
 * eindwaarde staat er dus altijd al vóór de animatie start.
 *
 * @package TamRank
 */
(function () {
    'use strict';

    var REDUCED = !!(window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches);

    function countUp(el, duration) {
        if (!el || REDUCED) {
            return;
        }
        var raw = (el.textContent || '').trim();
        if (!/^\d+$/.test(raw)) {
            return;
        }
        var target = parseInt(raw, 10);
        var dur = duration || 750;
        var t0 = performance.now();

        (function tick(t) {
            var p = Math.min(1, (t - t0) / dur);
            var eased = 1 - Math.pow(1 - p, 3);
            el.textContent = Math.round(target * eased);
            if (p < 1) {
                requestAnimationFrame(tick);
            }
        })(t0);
    }

    function numbersIn(root, selector) {
        if (!root || REDUCED) {
            return;
        }
        var nodes = root.querySelectorAll(selector);
        for (var i = 0; i < nodes.length; i++) {
            countUp(nodes[i]);
        }
    }

    window.TamRankReveal = {
        reduced: REDUCED,
        countUp: countUp,
        numbersIn: numbersIn
    };
})();
