# PulseJT Codex Change Log

This is the working log for changes made in `gifpanel (13)\pulseJT` and then copied into the installed Adobe CEP folder:

`C:\Users\tyson.DESKTOP-GI9SJ3L\AppData\Roaming\Adobe\CEP\extensions\com.pulsejt.extension`

When we make changes worth keeping, add a new dated entry at the top of this file.

## 2026-07-06

### Resource Usage Pass

- Reduced video memory spikes by loading normal videos through browser object URLs instead of converting every MP4/WebM into a large base64 string before playback.
- Stopped large videos from decoding a frame just to create a thumbnail; PulseJT now uses a lightweight placeholder for bigger files.
- Removed duplicate thumbnail generation when saving history, so a single media add no longer performs the same thumbnail work twice.
- Kept history thumbnails lazy-loaded so opening Settings does not eagerly load every recent-media image at once.

## 2026-05-24

### Spotify Connect Prototype

- Added a Spotify tab with PKCE login through the user's browser, using a local `127.0.0.1` callback and no password handling inside PulseJT.
- Added a beginner-friendly Quick Setup panel with Open Dashboard, Copy Redirect, and Save & Connect actions.
- Added the public PulseJT Spotify Client ID as the default so normal users can connect with one button, while custom Client ID setup remains hidden under Advanced setup.
- Added a Use PulseJT App fallback in Advanced setup so users can clear a custom Spotify Client ID and return to the built-in safe default.
- Added Show on Preview for Spotify so album art, track title, artist, play state, and progress can appear inside the main media frame while Spotify plays through an active Spotify device.
- Added an Open Spotify shortcut for users who need to wake up the Spotify web player or choose an active playback device.
- Added extra Spotify artwork host allowlisting plus graceful cover fallbacks so playlist cards do not show broken image icons when Spotify uses alternate image CDNs.
- Improved Spotify playback errors so `403 Forbidden` explains the Premium/active-device requirement and opens the clicked song in Spotify when direct playback control is blocked.
- Added Spotify active-device guarding so PulseJT stops retrying doomed player commands when no Spotify device is available, opens Spotify as the fallback, and tells users to start any song once before refreshing devices.
- Added a Spotify Web Playback SDK path with a Play in PulseJT button so the panel can try to become a real Spotify playback device named PulseJT Panel Player and play Spotify audio through the panel itself.
- Added the required Spotify `streaming` permission, SDK loading, panel device persistence, and clear reconnect/Premium messaging for cases where Spotify or Adobe CEP blocks protected playback.
- Moved Play in PulseJT into its own compact player card so the Spotify setup controls no longer crowd the connection row or break the Settings tab layout.
- Rolled back the experimental Spotify Web Playback SDK UI/CSP/player device path after it destabilized the normal PulseJT interface; stable Spotify Connect controls, playlist browsing, artwork fallback, and Show on Preview remain.
- Added local-only Spotify token storage, refresh-token support, and a Disconnect action that clears saved Spotify tokens/device data.
- Added Spotify playlist browsing, track loading, active-device selection, now-playing display, and remote controls for play/pause, previous, next, and shuffle.
- Expanded the CEP Content Security Policy only for the Spotify OAuth/API/artwork hosts and the local callback URL required by the login flow.

### AE Safe Mode Pass

- Added an enabled-by-default AE Safe Mode setting that reduces expensive effects, quiets normal debug logging, skips waveform decoding, and pauses playback while the panel document is hidden.
- Added safe-mode CSS that removes backdrop blur and almost all decorative animation while preserving the normal UI layout.
- Added Settings health messaging so users can confirm PulseJT is running in the lighter AE-friendly mode.

### Main Panel Speed Control

- Added a dock speed button that cycles media playback speed through `0.25x`, `0.5x`, `0.75x`, `1x`, `1.5x`, and `2x`.
- Improved the speed button into an exact speed picker with highlighted choices and mouse-wheel speed nudging.
- Added smoother velocity-style playback-rate ramping so speed changes ease into the new rate instead of snapping harshly.
- Made wheel and keyboard speed nudges fine-grained, allowing in-between speeds like `1.05x`, `1.1x`, and `1.25x` instead of only preset jumps.
- Added keyboard speed nudging with `ArrowUp`/`=` to speed up and `ArrowDown`/`-` to slow down when shortcuts are enabled.
- Synced the dock speed button with the existing Playback tab speed selector and persisted speed through `gifPreview.playbackSpeed`.
- Applied saved speed immediately when a video element attaches so restored and playlist videos start at the chosen speed.

### QOL Polish Pack

- Added one-click Clear Cache in General settings to clear recent media, thumbnails, playlist cache, shuffle trail, and last-media restore data while preserving preferences.
- Added Preset Profiles for Editing, Reference, Tiny Panel, and Performance setups.
- Upgraded playlist shuffle into Smart Shuffle with a recent-item trail so shuffle avoids immediate repeats before cycling back.
- Added richer empty states for the main preview, Playlist, and History with direct actions to add media or reset filters.
- Added a tooltip normalization pass and subtle micro animations for buttons, playlist rows, history cards, theme cards, and setting rows.

### Website + In-App Changelog Pass

- Expanded the in-app `3.5.1` update log with user-facing release notes covering Playlist Queue, seamless playback, video/history handling, themes, settings, backdrop controls, Compact Mini Mode, persistence, and the YuhFramer identity.
- Added `WEBSITE-CHANGELOG-3.5.1.md` as a website-ready changelog that avoids internal debug wording and summarizes the full release.

### Theme Freshness Pass

- Strengthened generated theme color variables so each theme visibly changes panel surfaces, dock controls, glow, borders, sliders, and card backgrounds.
- Added a final theme skin layer that catches newer controls with hardcoded blue/gray styling, including Settings actions, segmented buttons, playlist rows, search, health badges, history badges, sliders, toggles, and dock buttons.
- Added accent RGB and wash/mid theme variables so future UI controls can inherit theme color without one-off hardcoded colors.

### Theme Selector Repair Pass

- Made the bundled theme system control the existing Settings theme grid instead of creating a second hidden selector.
- Unlocked every included theme for the current no-license build so premium theme cards no longer snap back to Blue.
- Synced theme card active states, the hidden select, saved storage value, badge text, app classes, and CSS variables from one theme apply path.

## 2026-05-21

### Compact Mini Mode Pass

- Added a saved Compact Mini Mode setting in General.
- Compact Mini Mode keeps the preview larger by shrinking panel padding, reducing the preview frame, and turning the dock into tiny hover controls.
- Hidden mode still works separately; Compact Mini Mode remains easy to exit through Settings and persists across AE reloads.

### Settings Disk Persistence Pass

- Added a disk-backed settings profile at `%APPDATA%\PulseJT\pulsejt-settings.json` so panel settings survive After Effects reloads even if CEP localStorage comes back missing keys.
- Restores the disk profile before applying default settings on startup.
- Mirrors setting changes, playlist state, last media state, backdrop settings, and History tab controls to the profile file as they change.

### Recent Media Scroll Repair Pass

- Added a History tab wheel bridge so mouse-wheel scrolling over Recent Media reliably scrolls the media list inside CEP.
- Gave the Recent Media list a stronger scrollable area in small panels.
- Hid nonessential History title text on very short panels so the recent media rows keep enough room to scroll.

### Duplicate Startup Restore Cleanup Pass

- Removed the old inline reload playback helper from `index.html` so startup media restore only runs through the modern restore pipeline.
- Stopped the legacy helper from trying to play a video before the restored source is ready, which caused misleading `Video autoplay prevented: The element has no supported sources` entries.
- Downgraded expected audio autoplay retry blocks from warnings to quiet log entries.

### Playlist Log Quieting Pass

- Stopped recording expected Playlist codec fallback messages during quiet playback.
- Removed normal video attach/detach lifecycle logs from the captured diagnostics buffer.
- Long Playlist sessions should no longer fill Problem Log exports with healthy MEDIA entries.

### Last Media Restore Pass

- Fixed startup restore so it loads the actual latest history item instead of only restoring entries with stored blobs.
- Path-backed videos now restore through the same media loading path used by History and Playlist.
- LocalStorage fallback now tries the saved path/name before falling back to a thumbnail-only preview.

### Playlist Reorder + Manage Pass

- Added drag-and-drop reordering for Playlist queue rows.
- Added Up and Down row controls as a small-panel fallback for reordering.
- Added Clear Watched and Remove Current playlist actions.
- Reworked playlist index updates so active playback stays attached to the correct queue item after reorder/remove actions.

### Playlist File URL Removal Pass

- Removed the `file://` video fallback from quiet Playlist playback so CEP no longer logs repeated `MEDIA_ERR_SRC_NOT_SUPPORTED` errors before recovering.
- Playlist path-backed videos now read straight into data URLs first, then use quiet FFmpeg conversion if that read fails.
- Quiet Playlist conversion no longer writes mock file objects back into recent media/history, removing the repeated `[STORAGE] File is not a Blob` warnings.
- Playlist codec/conversion failures stay diagnostic-only and do not show loader or converter popups during back-to-back playback.
- Added a final guard inside video loading so Playlist mode refuses stray `file://` sources from any caller before the video element receives them.
- Shortened expected Playlist fallback logs so the debug export no longer fills with repeated unsupported-source blocks.
- Added playlist request tokens so stale async reads/conversions cannot attach an older item after a newer playlist item starts.
- Made video attach one-shot per element and debounced ended-driven playlist advance to stop double-start races.

## 2026-05-20

### Playlist Path Playback Fallback Pass

- Playlist now reads small path-backed videos directly into data URLs instead of trying `file://` first.
- This avoids the repeated CEP `MEDIA_ERR_SRC_NOT_SUPPORTED` path failure before conversion on common small MP4 playlist items.
- Expected quiet playlist codec failures are now logged as normal fallback diagnostics instead of error entries.

### Loader Popup Compact + Playlist Suppression Pass

- Added a playlist-active guard inside `showLoader()` and `scheduleVideoLoader()` so loader/converter popups cannot render while Playlist playback is active.
- Kept manual media loads unchanged outside Playlist playback.
- Made the media loader popup smaller and responsive for narrow or short panels.
- Added an extra-short layout where the loader becomes a compact horizontal status chip.

### Playlist No-Loader Pass

- Made Playlist playback fully suppress the media loading overlay.
- Quiet playlist loads now pass through History, Video, metadata, and conversion fallback paths without scheduling `Preparing video`.
- Existing manual media/history loads still keep their normal loader behavior.

### Small Panel Update Log Fit Pass

- Added compact Update Log modal rules for narrow and short CEP panels.
- Made the update modal fill the panel area like Settings instead of keeping a desktop dialog size.
- Reduced header, artwork, heading, copy, and feature-card spacing in tight layouts.
- Hid the decorative artwork and subtext on extra-short panels so release notes stay readable.

### After Effects 2026 Name Cache Pass

- Confirmed the live Adobe CEP install is the shared extension folder used by After Effects 2026 (`After Effects\26.0` workspace entries reference the PulseJT CEP panel id).
- Bumped the CEP manifest identity to `3.5.1` so AE 2026 does not keep using cached `3.5.0` metadata.
- Changed the panel extension id from `com.pulsejt.panel` to `com.pulsejt.yuhframer.panel` so AE treats the renamed panel as a fresh YuhFramer tab.
- Updated `.debug`, `assets\.debug`, the Settings build label, and release logger version to match the 3.5.1 rename pass.

### Backup Location Cleanup Pass

- Stopped keeping PulseJT backups under Adobe `CEP/extensions` so After Effects does not scan stale copies.
- Moved the active deployment backup location into the working PulseJT folder under `cep-backups`.
- Cleaned old PulseJT backup folders from Adobe CEP backup locations after preserving a fresh main-folder backup.

### CEP Name Deployment Pass

- Added `ExtensionBundleName="pulseJT - YuhFramer"` to the active CEP manifest so After Effects has no old title fallback.
- Found old PulseJT backup manifests inside the scanned Adobe `CEP/extensions` folder, which can make AE show stale panel names.
- Moved PulseJT backup folders out of `CEP/extensions` into a separate backup location so AE only sees the active extension folder.
- Cleaned the nested archived assets manifest name as well so installed searches no longer show `GIF Preview Panel`.

### Small Panel Settings Fit Pass

- Added compact settings breakpoints for very small CEP panel sizes.
- Reduced Settings header, status strip, search, tabs, page padding, and footer height when the panel is narrow or short.
- Kept the status strip horizontal on small panels so it no longer eats most of the modal height.
- Switched tabs to icon-only in tight layouts while keeping all six sections reachable.
- Hid intro copy only on extra-short panels so actual controls stay visible sooner.

### Media Quality Pass

- Switched preview transforms to a higher-quality 2D path so videos and images look less softened in CEP.
- Snapped near-100% preview positioning to physical pixels to avoid fractional-transform blur.
- Removed forced contrast-style image rendering from the main preview so normal footage uses browser-native scaling.
- Marked images as eager/async decoded and kept videos explicitly preloaded for cleaner first-frame rendering.

### Video Loader Timing Pass

- Changed video loading to use a delayed, size-aware Preparing popup.
- Normal videos now get a short quiet window so they can appear instantly without flashing the loader.
- Bigger videos show Preparing sooner, while smaller videos only show it if loading is slow.
- Longer videos can show a Preparing message after metadata loads if they still are not ready.
- History video loads use the same delayed loader behavior.

### Panel Name Pass

- Updated the CEP panel menu/title text to `pulseJT - YuhFramer`.
- Changed the HTML document title to `pulseJT - YuhFramer`.
- Kept the casing compact so the panel title reads smaller in the After Effects tab.

### Playlist Seamless Advance Pass

- Playlist playback now loads queued media with a quiet transition path.
- Removed the full-screen loading overlay between playlist items.
- History clicks still use the normal loading overlay, while Playlist auto-next stays visually uninterrupted.

### Video History Storage Pass

- Added a smarter media storage policy for History.
- Large videos are now saved as path-backed history entries instead of being forced into IndexedDB blob storage.
- Supported path-backed videos now load from `file://` URLs when CEP exposes a file path, avoiding huge base64 `data:` URLs.
- History entries now track storage metadata:
  - `storageMode`
  - `storageReason`
  - `canReloadFromPath`
  - `largeMedia`
  - `supportedVideo`
- Full blob storage is still used for supported media within the blob size limit.
- Added History storage badges:
  - `Stored`
  - `Path`
  - `Large`
  - `Needs file`
- Improved missing-file handling for path-backed videos so a moved original file falls back to the thumbnail with a clearer warning.
- Fixed a stale `file` reference in video error logging.
- Added `docs/plans/2026-05-20-video-history-storage-plan.md`.

### Playlist Direct File Add Pass

- Added `Add Files` to Settings > Playlist.
- Users can now multi-select images, GIFs, and videos from their folders and add them directly to the playlist queue.
- Directly added files use generated thumbnails when possible.
- Playlist duplicate detection now checks path/name for direct file queue items, not only History IDs.
- Added a warning when CEP does not expose a selected file path, since those entries may not survive a panel restart.

### Playlist Queue Pass

- Added a new Settings > Playlist tab for a saved temporary queue.
- Added controls for Add Current, Previous, Play/Pause, Next, Shuffle, Repeat, Clear, and image/GIF duration.
- Added an Add From History picker so recent media can be queued without loading immediately.
- Playlist rows now show thumbnail, filename, media type, active state, play button, and remove button.
- Playlist advances automatically when videos end.
- Images and GIFs advance after the selected duration, with a Manual option.
- Shuffle picks a random next item while avoiding the current item when possible.
- Repeat loops the queue when it reaches the end.
- Added shared History media loading so playlist playback can load the next item without closing Settings.
- Added `docs/plans/2026-05-20-playlist-queue-plan.md`.

### Settings Intelligence Pass

- Added a settings search bar that finds controls across General, Playback, and Backdrop.
- Search results jump to the correct tab and highlight the matched setting row.
- Added `Modified` indicators to changed settings with one-click per-setting reset.
- Added a Settings Health panel in the Info tab for confusing or risky states:
  - image backdrop selected without an image
  - heavy dim/blur
  - muted playing video
  - performance mode enabled
  - restore media disabled
  - shortcuts disabled
  - small history limit
- Added a compact health badge beside the search bar.
- Added `docs/plans/2026-05-20-settings-intelligence-plan.md`.

## 2026-05-19

### Backdrop Slider Final Override

- Moved Backdrop slider styling to a final high-specificity override so later `.volume-slider` rules cannot hide the track.
- Forced Dim, Blur, and Image Opacity sliders to render visible tracks and thumbs inside Settings.

### Backdrop Slider Visibility Fix

- Added dedicated track/thumb styling for Backdrop range controls.
- Fixed Dim, Blur, and Image Opacity sliders appearing missing because they reused transparent volume slider styling without a backing track element.

### Fullscreen Button Hidden-State Correction

- Hid the fullscreen button after users enter hidden UI mode so it does not block the preview.
- Kept preview click and Esc as the restore paths while preserving the shared UI-hidden state helper.
- Updated the hidden-mode toast to tell users to click the preview or press Esc.

### Fullscreen Button Behavior Pass

- Changed the fullscreen/hide button into a true toggle: Hide UI when controls are visible, Show UI when hidden.
- Kept the fullscreen button visible in hidden UI mode so users have an obvious way back.
- Added dynamic title, ARIA label, and hover label text for Hide UI vs Show UI states.
- Increased the fullscreen button hit area and improved its hover/focus styling.
- Synced Escape, preview click, dock indicator, and Home reset paths through the same UI-hidden state helper.

### Dock Audio Button Usability Pass

- Made the dock audio cluster a larger clickable target instead of only relying on the small mute icon.
- Kept the volume slider open after audio interactions so it is easier to grab.
- Added focus and click handling to open the audio slider without requiring precise hover movement.
- Increased the slider track and thumb sizes for easier dragging inside the CEP panel.
- Widened the dock max width so the expanded audio slider does not squeeze nearby buttons.

### Main Panel Button Behavior Pass

- Removed the Fit button badge/classes from the previous pass so Fit is back to a normal icon button.
- Made Add Media clear the file input before opening, allowing the same file to be selected again.
- Added confirmation feedback classes for successful dock button actions.
- Made Recenter detect the already-centered state and avoid stacking repeated reset animations.
- Added an idle state for Recenter when pan/zoom is already reset.
- Wired the dock indicator to restore the UI when controls are hidden.

### Main Panel Button Controls Pass

- Added hover labels and ARIA labels for the main dock buttons.
- Added a visible Fit mode badge that updates between Fill, Contain, and Stretch.
- Added active/attention states for Settings and Recenter so buttons communicate current state.
- Made Add Media the primary dock action with stronger styling.
- Added muted/low/loud state classes to the dock audio control.
- Added feedback to Recenter and Hide UI button actions.

### Main Panel UI Refinement Pass

- Softened the main preview frame by reducing border weight, glow, and visual noise.
- Made corner guides smaller and subtler so they do not cover loaded media.
- Hid the unused global corner overlays outside the preview surface.
- Refined the bottom dock with tighter spacing, calmer glass styling, and cleaner hover states.
- Cleaned up broken dock glyphs with CSS-rendered Home, Settings, and Hide UI icons.
- Tightened the unified video timeline styling to match the revised main panel controls.

### Backdrop Controls Completion Pass

- Added a live Backdrop status row showing the active type plus dim/blur values.
- Added quick dim and blur presets so users do not have to rely only on sliders.
- Added solid-color swatches and made swatch clicks switch directly into Color mode.
- Added a custom backdrop image preview, missing-image warning, and saved image filename.
- Added Contain image fit mode and fixed non-tiled image backgrounds so they no longer repeat.

### Other Settings Tabs Controls Pass

- Added Playback volume presets, Restart Current Video, and Reset Playback controls.
- Added Backdrop presets for Clean, Checker, Theme Glow, and Dark backgrounds.
- Selecting Image backdrop now opens the image picker when no backdrop image is saved.
- Added History Refresh and Reset controls for quickly clearing search/filter/sort state.
- Added Info-tab buttons for copying problem-only logs and system/current-state snapshots.

### General Tab Settings Pass

- Added a Corner Style selector for Soft, Round, and Wide preview corners.
- Added a Glass Surface toggle backed by the existing bevel surface classes.
- Added Restore Last Media so users can choose whether PulseJT reopens the previous media on startup.
- Added Default Fit Mode controls for Fill, Contain, and Stretch directly inside General.
- Added History Size control for 12, 25, or 50 recent items.
- Added Reset General for restoring just General tab behavior without touching playback, backdrop, history, or debug logs.
- Reset View now respects the selected Default Fit Mode instead of always forcing Fill.

### Debug Health Check Tuning

- History DOM health now passes when the History tab is not active, avoiding a false warning from Info-tab exports.
- Backdrop image mode now automatically falls back to Default when no backdrop image is saved.
- Uploading a backdrop image now switches the backdrop type to Image, and clearing it switches back to Default.

### Debug Export Refinement Pass

- Added explicit Health Checks with pass/warn/fail statuses for runtime, error log, IndexedDB, History DOM, video element, and backdrop configuration.
- Improved CEP runtime detection using AdobeCEP user agent, `CSInterface`, `__adobe_cep__`, and `cep.util`.
- Fixed log-entry active media context so hidden placeholder/restored images are not reported as active media.
- Added diagnostic hints for image backdrop mode with no saved backdrop image.
- Masked sensitive localStorage previews such as hardware/license-style keys while keeping key sizes visible.

### Detailed Debug Export Pass

- Expanded debug exports with session id, browser feature support, timezone, URL/protocol, and richer localStorage diagnostics.
- Added DOM, settings, active media element, playback state, and History render state snapshots.
- Added diagnostic summaries for log levels, categories, and repeated messages.
- Added troubleshooting hints for common issues such as unsupported video codecs, IndexedDB failures, hidden media, and transformed views.
- Added per-log context showing active media, settings visibility, and active settings tab at the time of each entry.
- Improved video load error logging with file name/type/size, source type, source length, readyState, networkState, and conversion status.

### History Debug Log Cleanup

- Removed the old inline settings media loader that force-loaded History thumbnails on every settings open.
- Suppressed Chromium's benign `ResizeObserver loop limit exceeded` layout warning from the exported error log.
- Encoded file URLs when loading items from History so paths with spaces and special characters are safer in CEP.

### History Behavior Pass

- History now refreshes each time the History tab is opened so the list does not go stale.
- Duplicate detection now prefers exact file paths and only falls back to filenames when no path exists.
- Added History search, media type filters, favorites filter, and sort options.
- Added per-item remove buttons so one bad entry can be deleted without clearing the full list.
- History rows now show type, file size, and viewed/added date details.
- Favorites update the filtered view correctly when using the Favorites filter.

### Settings Behavior Pass

- Added General tab quick actions:
  - Reset View restores pan, zoom, fit mode, and hidden UI state.
  - Reset Settings restores panel preferences while keeping history and debug logs.
- Added a Backdrop tab reset action that clears background type, image, dim, blur, color, checker, and opacity settings.
- Expanded the shortcut reference and wired the Keyboard Shortcuts toggle so it disables non-essential shortcuts.
- Added a Home shortcut to recenter the preview.
- Added clearer feedback to settings toggles through short status toasts.
- Improved custom backdrop hex color handling with live cleanup, uppercase formatting, and invalid input styling.

### Settings Modal Pass 1

- Improved settings tab behavior in `src\settings.js`.
- Settings now remembers the last active tab with `gifPreview.lastSettingsTab`.
- Added ARIA tab states and keyboard navigation:
  - Arrow Left / Arrow Right
  - Home / End
- Centralized settings open/close behavior in the settings module.
- Added a compact status strip at the top of the settings modal:
  - Build `3.5.0`
  - License `Unlocked`
  - Mode `CEP`
- Added final CSS overrides for the settings modal so it is more stable and readable:
  - constrained modal width/height
  - fixed status strip layout
  - improved tab focus states
  - tighter setting row spacing

### Settings Tabs Pass

- Added `aria-controls`, `aria-labelledby`, and stable IDs for each settings tab/page pair.
- Added a moving active tab marker in `src\settings.js`.
- Active tab now scrolls into view when selected.
- Tab marker updates on tab changes, tab strip scroll, and window resize.
- Restyled the tab strip as a scrollable segmented control:
  - no hover jump
  - no stretched/squeezed tabs
  - horizontal scrolling for narrow CEP panels
  - icon-only compact tabs below 420px wide

### Settings Panel Fit Pass

- Reworked the settings modal so it fits the CEP panel instead of behaving like a centered desktop dialog.
- Reduced modal padding and made the settings card fill the available panel area.
- Tightened settings header, close button, status strip, and tab strip height.
- Made Info rows more compact and full-width.
- Hid license transfer/deactivate buttons in the no-license build.
- Fixed visible Info version text from `3.4` to `3.5`.

### Settings Tabs Fit Pass

- Changed the settings tab strip from horizontal scrolling to a five-column grid.
- Tabs now fit inside the settings panel width.
- Removed active-tab `scrollIntoView` behavior because the tab strip no longer scrolls.
- Tab labels now ellipsize instead of overflowing.
- Narrow panels still collapse tabs to icon-only.

### Settings Tab Info Pass

- Added compact intro copy to every settings tab:
  - Interface
  - Playback
  - Backdrop
  - History
  - Info
- Improved setting help text so each control explains what it affects.
- Updated History text to explain click-to-reopen behavior.
- Updated Info tab language for the no-license `3.5` build.
- Renamed visible License Status section to Access Status.
- Rewrote quick tips to match the current drag, zoom, and no-glide behavior.

## 2026-05-18

### Source Folder

- Switched active development to `C:\Users\tyson.DESKTOP-GI9SJ3L\OneDrive\Desktop\gifpanel (13)\pulseJT`.
- Confirmed this is the clean source tree for PulseJT `3.5.0`, not the obfuscated CEP copy.
- Rebuilt with `npm run build`, which outputs `JS\bundle.js`.

### Build / Manifest

- Fixed `build.js` so esbuild uses absolute paths from the script directory.
- Updated `CSXS\manifest.xml` extension version to `3.5.0`.
- Restored the CEP runtime requirement to CSXS `9.0` for safer After Effects compatibility.
- Updated `index.html` script path from `js/bundle.js` to `JS/bundle.js`.

### License / Activation

- Converted the build to no-license mode with `LICENSE_REQUIRED = false`.
- App now starts directly without showing the license modal.
- License modal starts hidden in `index.html`.
- Settings now reports `Unlocked` and `License key not required`.
- License watchdog, storage protection, runtime license checks, deactivate controls, and transfer controls return early when licenses are not required.
- No `ADMIN112` bypass key is present in source or bundle.

### Startup Responsiveness

- Added an IndexedDB startup timeout in `src\storage.js`.
- If IndexedDB stalls in CEP, the app falls back after 2.5 seconds and continues initializing.

### CEP Unresponsive Fix

- Fixed DOM bindings in `src\store.js`.
- The rebuilt source expected old IDs: `dropZone`, `preview`, `fileInput`.
- The actual CEP HTML uses: `drop`, `gif`, `file`.
- Added fallbacks so both old and current IDs work.

### Drag / Drop / Pan Feel

- Batched pan transforms with `requestAnimationFrame`.
- Stopped writing pan and zoom values to localStorage on every wheel event; values save after the gesture settles.
- Added drag-depth tracking so dragover highlight does not flicker over child elements.
- Added CSS overrides for smoother pan rendering:
  - `touch-action: none` on `.drop`
  - GPU-friendly transform hints on media
  - disabled transform transitions during panning
- Removed release momentum/glide so dragged media stops exactly where the user lets go.

### Installed CEP Updates

- Rebuilt and copied changes into:
  `C:\Users\tyson.DESKTOP-GI9SJ3L\AppData\Roaming\Adobe\CEP\extensions\com.pulsejt.extension`
- Used `robocopy` for CEP updates and backups because the folder contains a Windows-reserved `nul` file that breaks `Copy-Item`.
- Latest backup created during this round:
  `com.pulsejt.extension.backup-20260518-234521`

### Verification Run

- `npm run build` passed.
- Installed `JS\bundle.js` passed `node --check`.
- Installed `CSXS\manifest.xml` parsed as XML.
- Installed bundle contains:
  - `LICENSE_REQUIRED = false`
  - IndexedDB startup timeout
  - corrected DOM IDs for `drop`, `gif`, and `file`
  - no pan momentum function

### Notes For Next Round

- After copying into CEP, restart After Effects.
- If AE keeps an old bundle alive, close AE and kill lingering `CEPHtmlEngine` processes before retesting.
- Keep appending here whenever we make changes that should survive into future builds.

