# Driftframe 1.0

A free original jQuery image slider with gentle zoom-in/out effects and a local editor. The complete package is free under LICENSE.txt; there is no checkout or account.

## Install
Unzip, preserve app/, vendor/ and samples/, then open app/index.html in a modern browser. All scripts and artwork are local; no build, API or service account is needed. If your browser restricts local files, serve the extracted directory with your normal static server, for example `python3 -m http.server 8793 --bind 127.0.0.1 --directory /ABSOLUTE/EXTRACTED`, then open http://127.0.0.1:8793/app/index.html . Do not expose your development directory to a LAN/public server unless you deliberately choose to publish it.

## Make a slider
Use Previous/Next, numbered images or focus the slider and press Left/Right, Home/End. Horizontal pointer/touch swipe navigates; vertical movement scrolls. Space toggles playback. The component uses Pointer Events for mouse/touch; actual physical devices and other browser engines are not certified by local viewport tests.

Add images appends PNG/JPEG/WebP files in chooser order: up to12images,4MiB per image,24million pixels per image and32MiB embedded project. Select an image, edit its caption/accessible description/optional absolute HTTP(S) link, then Apply settings. Choose zoom in, zoom out or alternating motion; aspect16:9/4:3/1:1; interval2–20seconds. Move earlier/later reorders the selected image; Remove keeps at least one. Load example replaces the current work with the filled original Studio Views series, so keep a downloaded project before replacing a custom slider.

Autoplay defaults off. Play/Pause controls slide rotation; hover/focus pauses rotation and zoom while interacting, and a hidden browser document pauses rotation. The selected image's zoom effect plays once during its interval; it does not repeat forever. Reduced motion suppresses zoom animation and initial autoplay. A user may deliberately start slide rotation with Play afterward. Captions and optional links remain accessible. A single-image slider does not auto-rotate.

Save project downloads all embedded images/captions/links/settings/position. Open project restores that JSON; Ctrl/Cmd+S downloads a backup. Browser draft storage is convenience only. A quota/unavailable-storage notice tells you to download your work. Export standalone HTML embeds the current complete slider, jQuery, runtime and CSS; the output has no external script, style, image or telemetry dependency. Only a user click on an optional caption link navigates externally.

## Embed the jQuery component
Include vendor/jquery-3.7.1.min.js, app/driftframe.css and app/driftframe.js. Initialize a host:

```js
jQuery('#hero').driftframe({title:'Studio views',index:0,effect:'alternate',interval:5,aspect:'16:9',autoplay:false,slides:[
 {image:'morning.jpg',title:'Morning light',alt:'Sunlit studio',href:''},
 {image:'evening.jpg',title:'Evening tones',alt:'Warm studio at dusk',href:'https://example.com/collection'}
]});
jQuery('#hero').driftframe('next');
jQuery('#hero').driftframe('goTo',1); // zero-based and wraps
const state=jQuery('#hero').driftframe('getState');
jQuery('#hero').driftframe('play');
jQuery('#hero').driftframe('pause');
jQuery('#hero').driftframe('destroy');
```

Methods next/previous/goTo/play/pause/destroy are chainable; getState returns a copy with index,slideCount,playing,running,reducedMotion. Events driftframe:ready, driftframe:change and driftframe:playback pass state; driftframe:error passes a failed-image-load message. Destroy restores exact original nodes/attributes and cancels timers/listeners. See samples/integration.html for two independent components and destroy/reinitialize. Direct integration can use your own local/site-hosted URLs; portable editor projects deliberately require embedded raster images. Provide valid image resources and safe links.

## Rights and support
LICENSE.txt is the approved Nishvault Free Product Use Terms, allowing personal/commercial project use and sharing/selling finished outputs, including embedded viewer runtime. It does not allow redistribution/resale of the full product/source/package or a competing rebrand. Uploaded art remains with its rights holders. Original synthetic examples are demonstration content. jQuery MIT license is preserved separately. No paid checkout, recurring charge, guaranteed support, SLA or update schedule. Optional custom integration requires a separate agreed scope; see OFFER.md. No payment/deploy has been performed by this delivery.

## Verification and development
Functional Node/jsdom tests verify portable-data validation, order/delete, export escaping, responsive runtime, playback/timers/privacy, isolated instances and lifecycle. These tests are not real UI acceptance. Current CUA screenshots, actual downloads/chooser roundtrip, actual exported-file use and extracted ZIP checks are kept outside the customer ZIP in evidence/qa. Local producer verification now passes49functional tests and7real CUA browser cases on the actual source-equal20-fileZIP:chooserimage/order/swipe/keyboard/playback/independent lifecycle,invalid-input complete-data preservation,actualJSONdownload/chooser/fullfieldroundtrip,actualdownloadedHTML and1440x900/390x844JPEG review. Current source/evidence/report remain hash-bound. This is local delivery validation;independent QC,publication/liveanalytics and physicaldevice/otherengine or sales results are separate.

Development workspace: `npm ci --ignore-scripts`, `node --test tests/project.test.cjs tests/plugin.test.cjs tests/metrics.test.cjs`, `node scripts/build_sample.cjs`, `python3 scripts/package.py`. Customer ZIP excludes test/dev sources, hosted-only adapter and aggregate QA reports. No runtime build dependency.
