Skip to content

Backlog

Future enhancements and feature ideas for Image Cloud.


Pre-Release

Items to address before releasing v1.0. See prerelease-review.md for the full list.


Active Issues

  • [ ] Fix: "applies rotation transforms" test fails in layout.spec.ts:38 — radial layout images may not be receiving rotation transforms
  • [ ] Radial layout has some extra border on the edges that we could take out.
  • [ ] Investigate: Grid jitter appears to produce more offset than expected - even small jitter values seem to have an outsized visual impact.
  • [ ] Fix: After an image returns from focused state, hover styles are not re-applied if the cursor is already over the image — requires the user to move the mouse off and back on to trigger hover.

Planned

~~Simplify Initialization Process~~ ✅ v0.10.0

  • imageCloud() factory function for single-expression initialization
  • Actionable error messages for missing container, no loaders, and missing data-config

Future Major Version (v2.0)

Loader Config Simplification (Breaking Change)

Key idea: Flatten the nested { type: 'X', X: { config } } loader structure into a clean discriminated union { type: 'X', ...config }. Array notation replaces the explicit composite type.

Before:

loader: { type: 'static', static: { urls: ['url1', 'url2'] } }
loader: { type: 'googleDrive', googleDrive: { apiKey: 'KEY', sources: [...] } }
loader: { type: 'composite', composite: { loaders: [...] } }

After:

loader: { type: 'static', urls: ['url1', 'url2'] }
loader: { type: 'googleDrive', apiKey: 'KEY', sources: [...] }
loader: [{ type: 'static', urls: [...] }, { type: 'googleDrive', apiKey: 'KEY', sources: [...] }]

Optional top-level shorthand: new ImageCloud({ container: 'id', urls: [...] }) — no loader config at all.

Benefit: Eliminates redundant type-name-as-key nesting, enables proper TypeScript discriminated union narrowing (no more config.static! non-null assertions), cleans up defaults to only carry config for the active loader type.

Files affected: src/config/types.ts, src/config/defaults.ts, src/ImageCloud.ts, src/loaders/StaticImageLoader.ts, src/loaders/GoogleDriveLoader.ts, src/index.ts, docs/LOADERS.md, docs/parameters.md, examples/*.html, configurator/index.html, test/fixtures/*.html.

Note: Deliberately deferred — clean break with no backward compatibility shim, targeting a v2.0 release. Full spec preserved in git history (docs/plans/loader-redesign.md).


Ideas

Future feature ideas to explore

  • Enhance styling.hover and styling.focused with additional style options:
  • Note: opacity already works via ImageStyleState.opacity and filter.opacity
  • transform - scale, rotate, translateX/Y for hover lift/grow effects
  • transition - duration, timing, delay for per-state transition control
  • mixBlendMode - multiply, screen, overlay for interesting overlap effects
  • zIndex - bring hovered/focused images to front
  • backdropFilter - frosted glass effects behind images
  • transformOrigin - control where scale/rotate originates
  • Auth/credential hooks for static loader fetch options (e.g., custom headers, bearer tokens for authenticated image endpoints — applies to JSON source and URL validation)
  • Additional layout algorithms (physics-based)
  • Lightbox mode
  • Consider scaleDecay for cluster layout - larger images at cluster centers, smaller at edges to create focal points within each group.
  • Custom entry easing — allow user-supplied cubic-bezier curves for entry animations, beyond the current preset path types (linear, bounce, elastic, wave)
  • Radial layout: if a radial expects 10 images but only gets 7, spread images further along the outer radial to fill the ring and look like a complete external radius.
  • Add border-image support to functionality and configurator.
  • Consider using SVG for clip path in order to support borders.
  • Loader-level config inheritance - Move shared loader properties (validateUrls, validationTimeout, validationMethod, allowedExtensions, debugLogging) to the top-level loader config so they cascade down to individual loaders. Individual loaders can override. Especially useful with CompositeLoader to avoid repeating settings across multiple child loaders. Note: validate* properties only apply to StaticImageLoader today and would be no-ops for other loaders. Decide merge semantics for allowedExtensions (replace vs merge).

Completed

  • [x] Publish docs to GitHub Pages with MkDocs — Material theme, full nav, configurator/examples published alongside, CI pipeline verified (v0.10.1)
  • [x] Swipe gestures: Testing in test/fixtures/interactions.html in mobile mode, sometimes swipes get images out of order, centering becomes a problem
  • [x] Swipe gestures: Swipes inside an iframe don't work consistently
  • [x] Consolidate debug parameters under config.debug namespace — unified config.debug.enabled, config.debug.centers, config.debug.loaders. Old paths (debug, layout.debugCenters, config.loaders.debugLogging) removed (breaking change). Per-loader debugLogging retained as override. debugRadials removed entirely.
  • [x] Swipe gesture navigation - Left/right swipe gestures on touch devices navigate between focused images (SwipeEngine with drag feedback, threshold detection, horizontal angle filtering).
  • [x] Fix "Loading images..." text still visible after gallery loads (fbn-ic-hidden class not hiding element properly) — resolved by auto-creating loading elements inside the container (v0.3.3)
  • [x] Fix: Hitting Esc while an image is already animating out causes a secondary animation.
  • [x] Review skipped test: "spinner is visible during slow image loading" (test/e2e/loading-spinner.spec.ts:41) — Confirmed: test remains skipped due to timing unreliability. Other spinner tests provide adequate coverage; loading-spinner-slow.html available for manual testing.
  • [x] Security: Set up Dependabot for dependency vulnerability scanning
  • [x] Security: Set up CodeQL for code security analysis
  • [x] Packaging & Distribution Strategy - CDN deployment (unpkg/jsdelivr), simplified README examples, separate auto-init bundle.
  • [x] Fix image centering - images now correctly center on their layout positions (using pixel-based translate transforms).
  • [x] Replace random image placement with a more organized layout.
  • [x] Reorganize images on window resize to ensure they stay within the visible screen area.
  • [x] Render images progressively as they load instead of waiting for all to complete.
  • [x] Create an image queue loader: fetch images, add to queue, and process queue every 250ms to float images in one by one.
  • [x] Ensure initial image placement keeps (x + width) and (y + height) within screen bounds.
  • [x] Animate images floating into position from a nearby border upon loading.
  • [x] Ensure focused image is perfectly centered in the screen.
  • [x] Dynamically adjust default image height based on window width for better mobile/small screen display.
  • [x] Dynamically adjust default image height based on window height for better mobile/small screen display. Consider for