Learning: In highly dynamic JavaScript applications like this (vanilla JS with instant search/filtering), performing string operations (toLowerCase(), string concatenation) and date formatting (new Date(), .toLocaleDateString()) inside the render loop (renderPDFs() and createPDFCard()) is a significant performance bottleneck. The frequent renderPDFs calls triggered by the search input debounce created an O(N) overhead of expensive operations.
Action: Always aim to calculate derived properties (search indices, formatting, boolean flags like isNew) during the initial data load or fetch phase (prepareSearchIndex()), attaching them as runtime properties to the objects. This flattens the complexity in the hot path down to simple memory lookups, reducing CPU overhead massively.